From baa0dc5a963a79843b37888bcfe1d2dfe833ade9 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Tue, 13 Mar 2018 13:07:16 +0100 Subject: Organize the engine/ directory This is an informed attempt at reorganizing the engine/ directory by creating categorized subdirectories, in order to make it easier to navigate and find things. The directories created are as follows: * engine/game: Contains all "minigames", things like the unown puzzle and slot machine. * engine/gfx: Contains all handling of graphics. From loading palettes to playing animations. * engine/link: Contains all multiplayer functionality. * engine/menu: Contains all generic/misc. menus and menu code. Other, more specialized menus are in their own subdirectories (pokedex, pokegear, party menu, etc). * engine/overworld: Contains all handling of the overworld. From loading and connecting maps to wild encounters and the scripting engine. * engine/pokegear: In the same vein as engine/pokedex, except it could use some more splitting up. * engine/pokemon: Contains everything related to manipulating pokemon data. From the pokemon storage system to evolution and mail. * engine/printer: Contains everything related to printing things as well as the printer communication. * engine/title: Contains intro sequences, title screens and credits. --- Makefile | 4 +- engine/billspc.asm | 2618 ------------------------- engine/billspctop.asm | 387 ---- engine/breeding.asm | 994 ---------- engine/buy_sell_toss.asm | 235 --- engine/card_flip.asm | 1692 ---------------- engine/caught_data.asm | 247 --- engine/cgb_layouts.asm | 1033 ---------- engine/clock_reset.asm | 254 --- engine/color.asm | 1356 ------------- engine/credits.asm | 621 ------ engine/crystal_intro.asm | 2199 --------------------- engine/crystal_layouts.asm | 325 ---- engine/decorations.asm | 1303 ------------- engine/delete_save_change_clock.asm | 296 --- engine/diploma.asm | 93 - engine/dummy_game.asm | 612 ------ engine/european_mail.asm | 129 -- engine/events.asm | 1111 ----------- engine/events/diploma.asm | 93 + engine/events_2.asm | 650 ------- engine/evolution_animation.asm | 368 ---- engine/evolve.asm | 676 ------- engine/experience.asm | 162 -- engine/game/card_flip.asm | 1692 ++++++++++++++++ engine/game/dummy_game.asm | 612 ++++++ engine/game/slot_machine.asm | 2352 ++++++++++++++++++++++ engine/game/unown_puzzle.asm | 877 +++++++++ engine/gbc_only.asm | 149 -- engine/gfx/cgb_layouts.asm | 1033 ++++++++++ engine/gfx/color.asm | 1356 +++++++++++++ engine/gfx/crystal_layouts.asm | 325 ++++ engine/gfx/evolution_animation.asm | 368 ++++ engine/gfx/gbc_only.asm | 149 ++ engine/gfx/load_font.asm | 156 ++ engine/gfx/load_pics.asm | 491 +++++ engine/gfx/map_palettes.asm | 86 + engine/gfx/mapgroup_roofs.asm | 20 + engine/gfx/mon_icons.asm | 471 +++++ engine/gfx/pic_animation.asm | 1141 +++++++++++ engine/gfx/player_gfx.asm | 224 +++ engine/gfx/sgb_layouts.asm | 605 ++++++ engine/gfx/sprite_anims.asm | 889 +++++++++ engine/gfx/sprites.asm | 677 +++++++ engine/gfx/tileset_anims.asm | 1060 ++++++++++ engine/gfx/tileset_palettes.asm | 151 ++ engine/gfx/timeofdaypals.asm | 415 ++++ engine/gfx/trade_animation.asm | 1646 ++++++++++++++++ engine/health.asm | 110 -- engine/init_hof_credits.asm | 79 - engine/init_map.asm | 103 - engine/landmarks.asm | 87 - engine/learn.asm | 256 --- engine/link.asm | 2589 ------------------------- engine/link/link.asm | 2589 +++++++++++++++++++++++++ engine/link/link_2.asm | 95 + engine/link/link_trade.asm | 363 ++++ engine/link/mystery_gift.asm | 1735 +++++++++++++++++ engine/link/mystery_gift_2.asm | 152 ++ engine/link/time_capsule.asm | 147 ++ engine/link/time_capsule_2.asm | 39 + engine/link_2.asm | 95 - engine/link_trade.asm | 363 ---- engine/load_font.asm | 156 -- engine/load_pics.asm | 491 ----- engine/mail.asm | 587 ------ engine/mail_2.asm | 949 --------- engine/main_menu.asm | 361 ---- engine/map_object_action.asm | 313 --- engine/map_objects.asm | 3123 ------------------------------ engine/map_objects_2.asm | 70 - engine/map_palettes.asm | 86 - engine/map_setup.asm | 260 --- engine/mapgroup_roofs.asm | 20 - engine/mart.asm | 970 ---------- engine/math.asm | 196 -- engine/menu.asm | 841 -------- engine/menu/buy_sell_toss.asm | 235 +++ engine/menu/clock_reset.asm | 254 +++ engine/menu/delete_save_change_clock.asm | 296 +++ engine/menu/main_menu.asm | 361 ++++ engine/menu/mart.asm | 970 ++++++++++ engine/menu/menu.asm | 841 ++++++++ engine/menu/menu_2.asm | 253 +++ engine/menu/mon_menu.asm | 304 +++ engine/menu/naming_screen.asm | 1467 ++++++++++++++ engine/menu/options_menu.asm | 583 ++++++ engine/menu/pack.asm | 1711 ++++++++++++++++ engine/menu/scrolling_menu.asm | 543 ++++++ engine/menu/start_menu.asm | 1993 +++++++++++++++++++ engine/menu/switch_items.asm | 274 +++ engine/menu/timeset.asm | 773 ++++++++ engine/menu/tmhm.asm | 49 + engine/menu/trainer_card.asm | 623 ++++++ engine/menu_2.asm | 253 --- engine/mon_icons.asm | 471 ----- engine/mon_menu.asm | 304 --- engine/mon_stats.asm | 485 ----- engine/move_mon.asm | 1845 ------------------ engine/move_mon_wo_mail.asm | 133 -- engine/movement.asm | 864 --------- engine/mystery_gift.asm | 1735 ----------------- engine/mystery_gift_2.asm | 152 -- engine/naming_screen.asm | 1467 -------------- engine/npc_movement.asm | 573 ------ engine/options_menu.asm | 583 ------ engine/overworld.asm | 715 ------- engine/overworld/decorations.asm | 1303 +++++++++++++ engine/overworld/events.asm | 1111 +++++++++++ engine/overworld/events_2.asm | 650 +++++++ engine/overworld/init_map.asm | 103 + engine/overworld/landmarks.asm | 87 + engine/overworld/map_object_action.asm | 313 +++ engine/overworld/map_objects.asm | 3123 ++++++++++++++++++++++++++++++ engine/overworld/map_objects_2.asm | 70 + engine/overworld/map_setup.asm | 260 +++ engine/overworld/movement.asm | 864 +++++++++ engine/overworld/npc_movement.asm | 573 ++++++ engine/overworld/overworld.asm | 715 +++++++ engine/overworld/player_movement.asm | 851 ++++++++ engine/overworld/player_object.asm | 856 ++++++++ engine/overworld/player_step.asm | 270 +++ engine/overworld/scripting.asm | 2857 +++++++++++++++++++++++++++ engine/overworld/select_menu.asm | 191 ++ engine/overworld/spawn_points.asm | 62 + engine/overworld/tile_events.asm | 110 ++ engine/overworld/time.asm | 465 +++++ engine/overworld/variables.asm | 151 ++ engine/overworld/warp_connection.asm | 439 +++++ engine/overworld/wildmons.asm | 1000 ++++++++++ engine/pack.asm | 1711 ---------------- engine/party_menu.asm | 932 --------- engine/pic_animation.asm | 1141 ----------- engine/player_gfx.asm | 224 --- engine/player_movement.asm | 851 -------- engine/player_object.asm | 856 -------- engine/player_step.asm | 270 --- engine/pokegear.asm | 3097 ----------------------------- engine/pokegear/pokegear.asm | 3097 +++++++++++++++++++++++++++++ engine/pokegear/radio.asm | 1932 ++++++++++++++++++ engine/pokemon/billspc.asm | 2618 +++++++++++++++++++++++++ engine/pokemon/billspctop.asm | 387 ++++ engine/pokemon/breeding.asm | 994 ++++++++++ engine/pokemon/caught_data.asm | 247 +++ engine/pokemon/european_mail.asm | 129 ++ engine/pokemon/evolve.asm | 676 +++++++ engine/pokemon/experience.asm | 162 ++ engine/pokemon/health.asm | 110 ++ engine/pokemon/learn.asm | 256 +++ engine/pokemon/mail.asm | 587 ++++++ engine/pokemon/mail_2.asm | 949 +++++++++ engine/pokemon/mon_stats.asm | 485 +++++ engine/pokemon/move_mon.asm | 1845 ++++++++++++++++++ engine/pokemon/move_mon_wo_mail.asm | 133 ++ engine/pokemon/party_menu.asm | 932 +++++++++ engine/pokemon/search.asm | 276 +++ engine/pokemon/search2.asm | 134 ++ engine/pokemon/stats_screen.asm | 1173 +++++++++++ engine/pokemon/tempmon.asm | 127 ++ engine/pokemon/tmhm.asm | 589 ++++++ engine/pokemon/types.asm | 99 + engine/print_party.asm | 364 ---- engine/printer.asm | 949 --------- engine/printer/print_party.asm | 364 ++++ engine/printer/printer.asm | 949 +++++++++ engine/printer/printer_serial.asm | 640 ++++++ engine/printer_serial.asm | 640 ------ engine/printnum.asm | 300 --- engine/radio.asm | 1932 ------------------ engine/routines/math.asm | 196 ++ engine/routines/printnum.asm | 300 +++ engine/scripting.asm | 2857 --------------------------- engine/scrolling_menu.asm | 543 ------ engine/search.asm | 276 --- engine/search2.asm | 134 -- engine/select_menu.asm | 191 -- engine/sgb_layouts.asm | 605 ------ engine/slot_machine.asm | 2352 ---------------------- engine/spawn_points.asm | 62 - engine/sprite_anims.asm | 889 --------- engine/sprites.asm | 677 ------- engine/start_menu.asm | 1993 ------------------- engine/stats_screen.asm | 1173 ----------- engine/switch_items.asm | 274 --- engine/tempmon.asm | 127 -- engine/tile_events.asm | 110 -- engine/tileset_anims.asm | 1060 ---------- engine/tileset_palettes.asm | 151 -- engine/time.asm | 465 ----- engine/time_capsule.asm | 147 -- engine/time_capsule_2.asm | 39 - engine/timeofdaypals.asm | 415 ---- engine/timeset.asm | 773 -------- engine/title.asm | 402 ---- engine/title/credits.asm | 621 ++++++ engine/title/crystal_intro.asm | 2199 +++++++++++++++++++++ engine/title/init_hof_credits.asm | 79 + engine/title/title.asm | 402 ++++ engine/title/unused_title.asm | 178 ++ engine/tmhm.asm | 49 - engine/tmhm2.asm | 589 ------ engine/trade_animation.asm | 1646 ---------------- engine/trainer_card.asm | 623 ------ engine/types.asm | 99 - engine/unown_puzzle.asm | 877 --------- engine/unused_title.asm | 178 -- engine/variables.asm | 151 -- engine/warp_connection.asm | 439 ----- engine/wildmons.asm | 1000 ---------- main.asm | 184 +- 210 files changed, 73922 insertions(+), 73922 deletions(-) delete mode 100755 engine/billspc.asm delete mode 100755 engine/billspctop.asm delete mode 100755 engine/breeding.asm delete mode 100755 engine/buy_sell_toss.asm delete mode 100755 engine/card_flip.asm delete mode 100644 engine/caught_data.asm delete mode 100644 engine/cgb_layouts.asm delete mode 100755 engine/clock_reset.asm delete mode 100644 engine/color.asm delete mode 100644 engine/credits.asm delete mode 100755 engine/crystal_intro.asm delete mode 100755 engine/crystal_layouts.asm delete mode 100755 engine/decorations.asm delete mode 100755 engine/delete_save_change_clock.asm delete mode 100644 engine/diploma.asm delete mode 100755 engine/dummy_game.asm delete mode 100644 engine/european_mail.asm delete mode 100644 engine/events.asm create mode 100644 engine/events/diploma.asm delete mode 100644 engine/events_2.asm delete mode 100755 engine/evolution_animation.asm delete mode 100755 engine/evolve.asm delete mode 100644 engine/experience.asm create mode 100755 engine/game/card_flip.asm create mode 100755 engine/game/dummy_game.asm create mode 100755 engine/game/slot_machine.asm create mode 100755 engine/game/unown_puzzle.asm delete mode 100644 engine/gbc_only.asm create mode 100644 engine/gfx/cgb_layouts.asm create mode 100644 engine/gfx/color.asm create mode 100755 engine/gfx/crystal_layouts.asm create mode 100755 engine/gfx/evolution_animation.asm create mode 100644 engine/gfx/gbc_only.asm create mode 100644 engine/gfx/load_font.asm create mode 100755 engine/gfx/load_pics.asm create mode 100644 engine/gfx/map_palettes.asm create mode 100644 engine/gfx/mapgroup_roofs.asm create mode 100755 engine/gfx/mon_icons.asm create mode 100644 engine/gfx/pic_animation.asm create mode 100644 engine/gfx/player_gfx.asm create mode 100644 engine/gfx/sgb_layouts.asm create mode 100755 engine/gfx/sprite_anims.asm create mode 100755 engine/gfx/sprites.asm create mode 100644 engine/gfx/tileset_anims.asm create mode 100644 engine/gfx/tileset_palettes.asm create mode 100644 engine/gfx/timeofdaypals.asm create mode 100755 engine/gfx/trade_animation.asm delete mode 100755 engine/health.asm delete mode 100644 engine/init_hof_credits.asm delete mode 100644 engine/init_map.asm delete mode 100644 engine/landmarks.asm delete mode 100755 engine/learn.asm delete mode 100755 engine/link.asm create mode 100755 engine/link/link.asm create mode 100644 engine/link/link_2.asm create mode 100755 engine/link/link_trade.asm create mode 100755 engine/link/mystery_gift.asm create mode 100755 engine/link/mystery_gift_2.asm create mode 100755 engine/link/time_capsule.asm create mode 100644 engine/link/time_capsule_2.asm delete mode 100644 engine/link_2.asm delete mode 100755 engine/link_trade.asm delete mode 100644 engine/load_font.asm delete mode 100755 engine/load_pics.asm delete mode 100755 engine/mail.asm delete mode 100755 engine/mail_2.asm delete mode 100755 engine/main_menu.asm delete mode 100755 engine/map_object_action.asm delete mode 100644 engine/map_objects.asm delete mode 100644 engine/map_objects_2.asm delete mode 100644 engine/map_palettes.asm delete mode 100644 engine/map_setup.asm delete mode 100644 engine/mapgroup_roofs.asm delete mode 100755 engine/mart.asm delete mode 100755 engine/math.asm delete mode 100755 engine/menu.asm create mode 100755 engine/menu/buy_sell_toss.asm create mode 100755 engine/menu/clock_reset.asm create mode 100755 engine/menu/delete_save_change_clock.asm create mode 100755 engine/menu/main_menu.asm create mode 100755 engine/menu/mart.asm create mode 100755 engine/menu/menu.asm create mode 100644 engine/menu/menu_2.asm create mode 100755 engine/menu/mon_menu.asm create mode 100755 engine/menu/naming_screen.asm create mode 100755 engine/menu/options_menu.asm create mode 100644 engine/menu/pack.asm create mode 100755 engine/menu/scrolling_menu.asm create mode 100755 engine/menu/start_menu.asm create mode 100755 engine/menu/switch_items.asm create mode 100755 engine/menu/timeset.asm create mode 100755 engine/menu/tmhm.asm create mode 100755 engine/menu/trainer_card.asm delete mode 100644 engine/menu_2.asm delete mode 100755 engine/mon_icons.asm delete mode 100755 engine/mon_menu.asm delete mode 100644 engine/mon_stats.asm delete mode 100755 engine/move_mon.asm delete mode 100755 engine/move_mon_wo_mail.asm delete mode 100644 engine/movement.asm delete mode 100755 engine/mystery_gift.asm delete mode 100755 engine/mystery_gift_2.asm delete mode 100755 engine/naming_screen.asm delete mode 100755 engine/npc_movement.asm delete mode 100755 engine/options_menu.asm delete mode 100755 engine/overworld.asm create mode 100755 engine/overworld/decorations.asm create mode 100644 engine/overworld/events.asm create mode 100644 engine/overworld/events_2.asm create mode 100644 engine/overworld/init_map.asm create mode 100644 engine/overworld/landmarks.asm create mode 100755 engine/overworld/map_object_action.asm create mode 100644 engine/overworld/map_objects.asm create mode 100644 engine/overworld/map_objects_2.asm create mode 100644 engine/overworld/map_setup.asm create mode 100644 engine/overworld/movement.asm create mode 100755 engine/overworld/npc_movement.asm create mode 100755 engine/overworld/overworld.asm create mode 100755 engine/overworld/player_movement.asm create mode 100755 engine/overworld/player_object.asm create mode 100755 engine/overworld/player_step.asm create mode 100644 engine/overworld/scripting.asm create mode 100755 engine/overworld/select_menu.asm create mode 100644 engine/overworld/spawn_points.asm create mode 100755 engine/overworld/tile_events.asm create mode 100755 engine/overworld/time.asm create mode 100755 engine/overworld/variables.asm create mode 100755 engine/overworld/warp_connection.asm create mode 100755 engine/overworld/wildmons.asm delete mode 100644 engine/pack.asm delete mode 100644 engine/party_menu.asm delete mode 100644 engine/pic_animation.asm delete mode 100644 engine/player_gfx.asm delete mode 100755 engine/player_movement.asm delete mode 100755 engine/player_object.asm delete mode 100755 engine/player_step.asm delete mode 100755 engine/pokegear.asm create mode 100755 engine/pokegear/pokegear.asm create mode 100644 engine/pokegear/radio.asm create mode 100755 engine/pokemon/billspc.asm create mode 100755 engine/pokemon/billspctop.asm create mode 100755 engine/pokemon/breeding.asm create mode 100644 engine/pokemon/caught_data.asm create mode 100644 engine/pokemon/european_mail.asm create mode 100755 engine/pokemon/evolve.asm create mode 100644 engine/pokemon/experience.asm create mode 100755 engine/pokemon/health.asm create mode 100755 engine/pokemon/learn.asm create mode 100755 engine/pokemon/mail.asm create mode 100755 engine/pokemon/mail_2.asm create mode 100644 engine/pokemon/mon_stats.asm create mode 100755 engine/pokemon/move_mon.asm create mode 100755 engine/pokemon/move_mon_wo_mail.asm create mode 100644 engine/pokemon/party_menu.asm create mode 100755 engine/pokemon/search.asm create mode 100755 engine/pokemon/search2.asm create mode 100755 engine/pokemon/stats_screen.asm create mode 100644 engine/pokemon/tempmon.asm create mode 100755 engine/pokemon/tmhm.asm create mode 100644 engine/pokemon/types.asm delete mode 100755 engine/print_party.asm delete mode 100755 engine/printer.asm create mode 100755 engine/printer/print_party.asm create mode 100755 engine/printer/printer.asm create mode 100755 engine/printer/printer_serial.asm delete mode 100755 engine/printer_serial.asm delete mode 100755 engine/printnum.asm delete mode 100644 engine/radio.asm create mode 100755 engine/routines/math.asm create mode 100755 engine/routines/printnum.asm delete mode 100644 engine/scripting.asm delete mode 100755 engine/scrolling_menu.asm delete mode 100755 engine/search.asm delete mode 100755 engine/search2.asm delete mode 100755 engine/select_menu.asm delete mode 100644 engine/sgb_layouts.asm delete mode 100755 engine/slot_machine.asm delete mode 100644 engine/spawn_points.asm delete mode 100755 engine/sprite_anims.asm delete mode 100755 engine/sprites.asm delete mode 100755 engine/start_menu.asm delete mode 100755 engine/stats_screen.asm delete mode 100755 engine/switch_items.asm delete mode 100644 engine/tempmon.asm delete mode 100755 engine/tile_events.asm delete mode 100644 engine/tileset_anims.asm delete mode 100644 engine/tileset_palettes.asm delete mode 100755 engine/time.asm delete mode 100755 engine/time_capsule.asm delete mode 100644 engine/time_capsule_2.asm delete mode 100644 engine/timeofdaypals.asm delete mode 100755 engine/timeset.asm delete mode 100644 engine/title.asm create mode 100644 engine/title/credits.asm create mode 100755 engine/title/crystal_intro.asm create mode 100644 engine/title/init_hof_credits.asm create mode 100644 engine/title/title.asm create mode 100644 engine/title/unused_title.asm delete mode 100755 engine/tmhm.asm delete mode 100755 engine/tmhm2.asm delete mode 100755 engine/trade_animation.asm delete mode 100755 engine/trainer_card.asm delete mode 100644 engine/types.asm delete mode 100755 engine/unown_puzzle.asm delete mode 100644 engine/unused_title.asm delete mode 100755 engine/variables.asm delete mode 100755 engine/warp_connection.asm delete mode 100755 engine/wildmons.asm diff --git a/Makefile b/Makefile index 4a63a9128..cb2c366d0 100644 --- a/Makefile +++ b/Makefile @@ -21,8 +21,8 @@ data/maps/map_data.o \ data/pokemon/dex_entries.o \ data/pokemon/egg_moves.o \ data/pokemon/evos_attacks.o \ -engine/credits.o \ -engine/events.o \ +engine/title/credits.o \ +engine/overworld/events.o \ gfx/pics.o \ gfx/sprites.o \ lib/mobile/main.o diff --git a/engine/billspc.asm b/engine/billspc.asm deleted file mode 100755 index 96d6ac310..000000000 --- a/engine/billspc.asm +++ /dev/null @@ -1,2618 +0,0 @@ -_DepositPKMN: ; e2391 (38:6391) - ld hl, wOptions - ld a, [hl] - push af - set 4, [hl] - ld a, [wVramState] - push af - xor a - ld [wVramState], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - xor a - ld [hMapAnims], a - call BillsPC_InitRAM - xor a - ld [wBillsPC_LoadedBox], a - call DelayFrame -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call .RunJumptable - call DelayFrame - jr .loop -.done - call ClearSprites - pop af - ld [hInMenu], a - pop af - ld [wVramState], a - pop af - ld [wOptions], a - ret - -.RunJumptable: ; e23d5 (38:63d5) - ld a, [wJumptableIndex] - ld hl, .Jumptable - call BillsPC_Jumptable - jp hl - -.Jumptable: ; e23df (38:63df) - dw .Init - dw .HandleJoypad - dw .WhatsUp - dw .Submenu - dw BillsPC_EndJumptableLoop - -.Init: ; e23e9 (38:63e9) - xor a - ld [hBGMapMode], a - call ClearSprites - call CopyBoxmonSpecies - call BillsPC_BoxName - ld de, PCString_ChooseaPKMN - call BillsPC_PlaceString - ld a, $5 - ld [wBillsPC_NumMonsOnScreen], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $ff - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - call WaitBGMap - call BillsPC_UpdateSelectionCursor - call BillsPC_IncrementJumptableIndex - ret - -.HandleJoypad: ; e241a (38:641a) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and A_BUTTON - jr nz, .a_button - call Withdraw_UpDown - and a - ret z - call BillsPC_UpdateSelectionCursor - xor a - ld [hBGMapMode], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $1 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - ret - -.a_button - call BillsPC_GetSelectedPokemonSpecies - and a - ret z - cp -1 - jr z, .b_button - ld a, $2 - ld [wJumptableIndex], a - ret -; e2452 (38:6452) - -.go_back - ld hl, wJumptableIndex - dec [hl] - ret - -.b_button - ld a, $4 - ld [wJumptableIndex], a - ret - -.WhatsUp: ; e245d (38:645d) - xor a - ld [hBGMapMode], a - call ClearSprites - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ld a, $1 - ld [wMenuCursorY], a - call BillsPC_IncrementJumptableIndex - ret - -.Submenu: ; e247d (38:647d) - ld hl, BillsPCDepositMenuHeader - call CopyMenuHeader - ld a, [wMenuCursorY] - call StoreTo_wMenuCursorBuffer - call VerticalMenu - jp c, BillsPCDepositFuncCancel - ld a, [wMenuCursorY] - dec a - and %11 - ld e, a - ld d, 0 - ld hl, BillsPCDepositJumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -BillsPCDepositJumptable: ; e24a1 (38:64a1) - dw BillsPCDepositFuncDeposit ; Deposit Pokemon - dw BillsPCDepositFuncStats ; Pokemon Stats - dw BillsPCDepositFuncRelease ; Release Pokemon - dw BillsPCDepositFuncCancel ; Cancel - - -BillsPCDepositFuncDeposit: ; e24a9 (38:64a9) - call BillsPC_CheckMail_PreventBlackout - jp c, BillsPCDepositFuncCancel - call DepositPokemon - jr c, .box_full - ld a, $0 - ld [wJumptableIndex], a - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ret - -.box_full - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ret - -BillsPCDepositFuncStats: ; e24c8 (38:64c8) - call LoadStandardMenuHeader - call BillsPC_StatsScreen - call ExitMenu - call PCMonInfo - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ret - -BillsPCDepositFuncRelease: ; e24e0 (38:64e0) - call BillsPC_CheckMail_PreventBlackout - jr c, BillsPCDepositFuncCancel - call BillsPC_IsMonAnEgg - jr c, BillsPCDepositFuncCancel - ld a, [wMenuCursorY] - push af - ld de, PCString_ReleasePKMN - call BillsPC_PlaceString - call LoadStandardMenuHeader - lb bc, 14, 11 - call PlaceYesNoBox - ld a, [wMenuCursorY] - dec a - call ExitMenu - and a - jr nz, .failed_release - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - call ReleasePKMN_ByePKMN - ld a, $0 - ld [wJumptableIndex], a - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - pop af - ret - -.failed_release - ld de, PCString_WhatsUp - call BillsPC_PlaceString - pop af - ld [wMenuCursorY], a - ret - -BillsPCDepositFuncCancel: ; e2537 (38:6537) - ld a, $0 - ld [wJumptableIndex], a - ret -; e253d (38:653d) - -BillsPCDepositMenuHeader: ; 0xe253d (38:653d) - db MENU_BACKUP_TILES ; flags - menu_coords 9, 4, SCREEN_WIDTH - 1, 13 - dw .MenuData - db 1 ; default option -; 0xe2545 - -.MenuData: ; 0xe2545 (38:6545) - db STATICMENU_CURSOR ; flags - db 4 ; items - db "DEPOSIT@" - db "STATS@" - db "RELEASE@" - db "CANCEL@" -; 0xe2564 (38:6564) - -Unreferenced_BillsPCClearThreeBoxes: ; e2564 - hlcoord 0, 0 - ld b, 4 - ld c, 8 - call ClearBox - hlcoord 0, 4 - ld b, 10 - ld c, 9 - call ClearBox - hlcoord 0, 14 - ld b, 2 - ld c, 8 - call ClearBox - ret -; e2583 - -_WithdrawPKMN: ; e2583 (38:6583) - ld hl, wOptions - ld a, [hl] - push af - set 4, [hl] - ld a, [wVramState] - push af - xor a - ld [wVramState], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - xor a - ld [hMapAnims], a - call BillsPC_InitRAM - ld a, NUM_BOXES + 1 - ld [wBillsPC_LoadedBox], a - call DelayFrame -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call .RunJumptable - call DelayFrame - jr .loop -.done - call ClearSprites - pop af - ld [hInMenu], a - pop af - ld [wVramState], a - pop af - ld [wOptions], a - ret - -.RunJumptable: ; e25c8 (38:65c8) - ld a, [wJumptableIndex] - ld hl, .Jumptable - call BillsPC_Jumptable - jp hl - -.Jumptable: ; e25d2 (38:65d2) - dw .Init - dw .Joypad - dw .PrepSubmenu - dw BillsPC_Withdraw - dw BillsPC_EndJumptableLoop - -.Init: ; e25dc (38:65dc) - ld a, NUM_BOXES + 1 - ld [wBillsPC_LoadedBox], a - xor a - ld [hBGMapMode], a - call ClearSprites - call CopyBoxmonSpecies - call BillsPC_BoxName - ld de, PCString_ChooseaPKMN - call BillsPC_PlaceString - ld a, $5 - ld [wBillsPC_NumMonsOnScreen], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $ff - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - call WaitBGMap - call BillsPC_UpdateSelectionCursor - call BillsPC_IncrementJumptableIndex - ret - -.Joypad: ; e2612 (38:6612) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and A_BUTTON - jr nz, .a_button - call Withdraw_UpDown - and a - ret z - call BillsPC_UpdateSelectionCursor - xor a - ld [hBGMapMode], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $1 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - ret -.a_button - call BillsPC_GetSelectedPokemonSpecies - and a - ret z - cp -1 - jr z, .b_button - ld a, $2 - ld [wJumptableIndex], a - ret ; e264a (38:664a) - -.unused - ld hl, wJumptableIndex - dec [hl] - ret - -.b_button - ld a, $4 - ld [wJumptableIndex], a - ret -; e2655 - -.PrepSubmenu: ; e2655 (38:6655) - xor a - ld [hBGMapMode], a - call ClearSprites - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ld a, $1 - ld [wMenuCursorY], a - call BillsPC_IncrementJumptableIndex - ret - -BillsPC_Withdraw: ; e2675 (38:6675) - ld hl, .MenuHeader - call CopyMenuHeader - ld a, [wMenuCursorY] - call StoreTo_wMenuCursorBuffer - call VerticalMenu - jp c, .cancel - ld a, [wMenuCursorY] - dec a - and %11 - ld e, a - ld d, 0 - ld hl, .dw - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.dw ; e2699 (38:6699) #mark - dw .withdraw ; Withdraw - dw .stats ; Stats - dw .release ; Release - dw .cancel ; Cancel - - -.withdraw ; e26a1 (38:66a1) - call BillsPC_CheckMail_PreventBlackout - jp c, .cancel - call TryWithdrawPokemon - jr c, .FailedWithdraw - ld a, $0 - ld [wJumptableIndex], a - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ret -.FailedWithdraw: - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ret - -.stats ; e26c0 (38:66c0) - call LoadStandardMenuHeader - call BillsPC_StatsScreen - call ExitMenu - call PCMonInfo - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ret - -.release ; e26d8 (38:66d8) - ld a, [wMenuCursorY] - push af - call BillsPC_IsMonAnEgg - jr c, .FailedRelease - ld de, PCString_ReleasePKMN - call BillsPC_PlaceString - call LoadStandardMenuHeader - lb bc, 14, 11 - call PlaceYesNoBox - ld a, [wMenuCursorY] - dec a - call ExitMenu - and a - jr nz, .FailedRelease - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - ld a, REMOVE_BOX - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - call ReleasePKMN_ByePKMN - ld a, $0 - ld [wJumptableIndex], a - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - pop af - ret -.FailedRelease: - ld de, PCString_WhatsUp - call BillsPC_PlaceString - pop af - ld [wMenuCursorY], a - ret - -.cancel ; e272b (38:672b) - ld a, $0 - ld [wJumptableIndex], a - ret -; e2731 (38:6731) - -.MenuHeader: ; 0xe2731 - db MENU_BACKUP_TILES ; flags - menu_coords 9, 4, SCREEN_WIDTH - 1, 13 - dw .MenuData - db 1 ; default option -; 0xe2739 - -.MenuData: ; 0xe2739 - db STATICMENU_CURSOR ; flags - db 4 ; items - db "WITHDRAW@" - db "STATS@" - db "RELEASE@" - db "CANCEL@" -; 0xe2759 - -_MovePKMNWithoutMail: ; e2759 - ld hl, wOptions - ld a, [hl] - push af - set 4, [hl] - ld a, [wVramState] - push af - xor a - ld [wVramState], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - xor a - ld [hMapAnims], a - call BillsPC_InitRAM - ld a, [wCurBox] - and $f - inc a - ld [wBillsPC_LoadedBox], a - call DelayFrame -.asm_e2781 - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .asm_e2793 - call .RunJumptable - call DelayFrame - jr .asm_e2781 - -.asm_e2793 - call ClearSprites - pop af - ld [hInMenu], a - pop af - ld [wVramState], a - pop af - ld [wOptions], a - ret -; e27a2 - -.RunJumptable: ; e27a2 - ld a, [wJumptableIndex] - ld hl, .Jumptable - call BillsPC_Jumptable - jp hl -; e27ac - -.Jumptable: ; e27ac - dw .Init - dw .Joypad - dw .PrepSubmenu - dw .MoveMonWOMailSubmenu - dw .PrepInsertCursor - dw .Joypad2 - dw BillsPC_EndJumptableLoop -; e27ba - -.Init: ; e27ba - xor a - ld [hBGMapMode], a - call ClearSprites - call CopyBoxmonSpecies - ld de, PCString_ChooseaPKMN - call BillsPC_PlaceString - ld a, 5 - ld [wBillsPC_NumMonsOnScreen], a - call BillsPC_RefreshTextboxes - call BillsPC_MoveMonWOMail_BoxNameAndArrows - call PCMonInfo - ld a, $ff - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - call WaitBGMap - call BillsPC_UpdateSelectionCursor - call BillsPC_IncrementJumptableIndex - ret -; e27eb - -.Joypad: ; e27eb - ld hl, hJoyPressed - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and A_BUTTON - jr nz, .a_button - call MoveMonWithoutMail_DPad - jr c, .d_pad - and a - ret z - call BillsPC_UpdateSelectionCursor - xor a - ld [hBGMapMode], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $1 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - ret - -.d_pad - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ld a, $0 - ld [wJumptableIndex], a - ret - -.a_button - call BillsPC_GetSelectedPokemonSpecies - and a - ret z - cp -1 - jr z, .b_button - ld a, $2 - ld [wJumptableIndex], a - ret - -.unused - ld hl, wJumptableIndex - dec [hl] - ret - -.b_button - ld a, $6 - ld [wJumptableIndex], a - ret -; e283d - -.PrepSubmenu: ; e283d - xor a - ld [hBGMapMode], a - call ClearSprites - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ld a, $1 - ld [wMenuCursorY], a - call BillsPC_IncrementJumptableIndex - ret -; e285d - -.MoveMonWOMailSubmenu: ; e285d - ld hl, .MenuHeader - call CopyMenuHeader - ld a, [wMenuCursorY] - call StoreTo_wMenuCursorBuffer - call VerticalMenu - jp c, .Cancel - ld a, [wMenuCursorY] - dec a - and %11 - ld e, a - ld d, 0 - ld hl, .Jumptable2 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e2881 - -.Jumptable2: ; e2881 - dw .Move - dw .Stats - dw .Cancel -; e2887 - -.Move: ; e2887 - call BillsPC_CheckMail_PreventBlackout - jp c, .Cancel - ld a, [wBillsPC_ScrollPosition] - ld [wBillsPC_BackupScrollPosition], a - ld a, [wBillsPC_CursorPosition] - ld [wBillsPC_BackupCursorPosition], a - ld a, [wBillsPC_LoadedBox] - ld [wBillsPC_BackupLoadedBox], a - ld a, $4 - ld [wJumptableIndex], a - ret -; e28a5 - -.Stats: ; e28a5 - call LoadStandardMenuHeader - call BillsPC_StatsScreen - call ExitMenu - call PCMonInfo - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ret -; e28bd - -.Cancel: ; e28bd - ld a, $0 - ld [wJumptableIndex], a - ret -; e28c3 - -.MenuHeader: ; 0xe28c3 - db MENU_BACKUP_TILES ; flags - menu_coords 9, 4, SCREEN_WIDTH - 1, 13 - dw .MenuData - db 1 ; default option -; 0xe28cb - -.MenuData: ; 0xe28cb - db STATICMENU_CURSOR ; flags - db 3 ; items - db "MOVE@" - db "STATS@" - db "CANCEL@" -; 0xe28df - -.PrepInsertCursor: ; e28df - xor a - ld [hBGMapMode], a - call CopyBoxmonSpecies - ld de, PCString_MoveToWhere - call BillsPC_PlaceString - ld a, $5 - ld [wBillsPC_NumMonsOnScreen], a - call BillsPC_RefreshTextboxes - call BillsPC_MoveMonWOMail_BoxNameAndArrows - call ClearSprites - call BillsPC_UpdateInsertCursor - call WaitBGMap - call BillsPC_IncrementJumptableIndex - ret -; e2903 - -.Joypad2: ; e2903 - ld hl, hJoyPressed - ld a, [hl] - and B_BUTTON - jr nz, .b_button_2 - ld a, [hl] - and A_BUTTON - jr nz, .a_button_2 - call MoveMonWithoutMail_DPad_2 - jr c, .dpad_2 - and a - ret z - call BillsPC_UpdateInsertCursor - xor a - ld [hBGMapMode], a - call BillsPC_RefreshTextboxes - ld a, $1 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - ret - -.dpad_2 - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ld a, $4 - ld [wJumptableIndex], a - ret - -.a_button_2 - call BillsPC_CheckSpaceInDestination - jr c, .no_space - call MovePKMNWitoutMail_InsertMon - ld a, $0 - ld [wJumptableIndex], a - ret - -.no_space - ld hl, wJumptableIndex - dec [hl] - ret - -.b_button_2 - ld a, [wBillsPC_BackupScrollPosition] - ld [wBillsPC_ScrollPosition], a - ld a, [wBillsPC_BackupCursorPosition] - ld [wBillsPC_CursorPosition], a - ld a, [wBillsPC_BackupLoadedBox] - ld [wBillsPC_LoadedBox], a - ld a, $0 - ld [wJumptableIndex], a - ret -; e2963 - -BillsPC_InitRAM: ; e2963 (38:6963) - call ClearBGPalettes - call ClearSprites - call ClearTileMap - call BillsPC_InitGFX - ld hl, wBillsPCPokemonList - ld bc, $338 - xor a - call ByteFill - xor a - ld [wJumptableIndex], a - ld [wcf64], a - ld [wcf65], a - ld [wcf66], a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ret - -BillsPC_IncrementJumptableIndex: ; e298d (38:698d) - ld hl, wJumptableIndex - inc [hl] - ret - -BillsPC_EndJumptableLoop: ; e2992 (38:6992) - ld hl, wJumptableIndex - set 7, [hl] - ret - -_StatsScreenDPad: ; e2998 (38:6998) - ld a, [wBillsPC_NumMonsOnScreen] - ld d, a - ld a, [wBillsPC_NumMonsInBox] - and a - jr z, .empty - dec a - cp $1 - jr z, .empty - ld e, a - ld a, [hl] - and D_UP - jr nz, BillsPC_PressUp - ld a, [hl] - and D_DOWN - jr nz, BillsPC_PressDown -.empty - jp BillsPC_JoypadDidNothing - -Withdraw_UpDown: ; e29b5 (38:69b5) - ld hl, hJoyLast - ld a, [wBillsPC_NumMonsOnScreen] - ld d, a - ld a, [wBillsPC_NumMonsInBox] - ld e, a - and a - jr z, .empty - ld a, [hl] - and D_UP - jr nz, BillsPC_PressUp - ld a, [hl] - and D_DOWN - jr nz, BillsPC_PressDown -.empty - jp BillsPC_JoypadDidNothing -; e29d0 (38:69d0) - -MoveMonWithoutMail_DPad: ; e29d0 - ld hl, hJoyLast - ld a, [wBillsPC_NumMonsOnScreen] - ld d, a - ld a, [wBillsPC_NumMonsInBox] - ld e, a - and a - jr z, .check_left_right - ld a, [hl] - and D_UP - jr nz, BillsPC_PressUp - ld a, [hl] - and D_DOWN - jr nz, BillsPC_PressDown - -.check_left_right - ld a, [hl] - and D_LEFT - jr nz, BillsPC_PressLeft - ld a, [hl] - and D_RIGHT - jr nz, BillsPC_PressRight - jr BillsPC_JoypadDidNothing - -MoveMonWithoutMail_DPad_2: ; e29f4 - ld hl, hJoyLast - ld a, [wBillsPC_NumMonsOnScreen] - ld d, a - ld a, [wBillsPC_NumMonsInBox] - ld e, a - and a - jr z, .check_left_right - - ld a, [hl] - and D_UP - jr nz, BillsPC_PressUp - ld a, [hl] - and D_DOWN - jr nz, BillsPC_PressDown - -.check_left_right - ld a, [hl] - and D_LEFT - jr nz, BillsPC_PressLeft - ld a, [hl] - and D_RIGHT - jr nz, BillsPC_PressRight - jr BillsPC_JoypadDidNothing - -BillsPC_PressUp: ; e2a18 (38:6a18) - ld hl, wBillsPC_CursorPosition - ld a, [hl] - and a - jr z, .top - dec [hl] - jr BillsPC_UpDownDidSomething - -.top - ld hl, wBillsPC_ScrollPosition - ld a, [hl] - and a - jr z, BillsPC_JoypadDidNothing - dec [hl] - jr BillsPC_UpDownDidSomething - -BillsPC_PressDown: ; e2a2c (38:6a2c) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - inc a - cp e - jr nc, BillsPC_JoypadDidNothing - - ld hl, wBillsPC_CursorPosition - ld a, [hl] - inc a - cp d - jr nc, .not_bottom - inc [hl] - jr BillsPC_UpDownDidSomething - -.not_bottom - ld hl, wBillsPC_ScrollPosition - inc [hl] - jr BillsPC_UpDownDidSomething -; e2a48 (38:6a48) - -BillsPC_PressLeft: ; e2a48 - ld hl, wBillsPC_LoadedBox - ld a, [hl] - and a - jr z, .wrap_around - dec [hl] - jr BillsPC_LeftRightDidSomething - -.wrap_around - ld [hl], NUM_BOXES - jr BillsPC_LeftRightDidSomething - -BillsPC_PressRight: ; e2a56 - ld hl, wBillsPC_LoadedBox - ld a, [hl] - cp NUM_BOXES - jr z, .wrap_around - inc [hl] - jr BillsPC_LeftRightDidSomething - -.wrap_around - ld [hl], 0 - jr BillsPC_LeftRightDidSomething - -BillsPC_JoypadDidNothing: ; e2a65 (38:6a65) - xor a - and a - ret - -BillsPC_UpDownDidSomething: ; e2a68 (38:6a68) - ld a, TRUE - and a - ret -; e2a6c (38:6a6c) - -BillsPC_LeftRightDidSomething: ; e2a6c - scf - ret -; e2a6e - -BillsPC_PlaceString: ; e2a6e (38:6a6e) - push de - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - pop de - hlcoord 1, 16 - call PlaceString - ret -; e2a80 (38:6a80) - -BillsPC_MoveMonWOMail_BoxNameAndArrows: ; e2a80 - call BillsPC_BoxName - hlcoord 8, 1 - ld [hl], $5f - hlcoord 19, 1 - ld [hl], $5e - ret -; e2a8e - -BillsPC_BoxName: ; e2a8e (38:6a8e) - hlcoord 8, 0 - lb bc, 1, 10 - call TextBox - - ld a, [wBillsPC_LoadedBox] - and a - jr z, .party - - cp NUM_BOXES + 1 - jr nz, .gotbox - - ld a, [wCurBox] - inc a -.gotbox - dec a - ld hl, wBoxNames - ld bc, BOX_NAME_LENGTH - call AddNTimes - ld e, l - ld d, h - jr .print - -.party - ld de, .PartyPKMN -.print - hlcoord 10, 1 - call PlaceString - ret -; e2abd (38:6abd) - -.PartyPKMN: - db "PARTY @" -; e2ac6 - -PCMonInfo: ; e2ac6 (38:6ac6) -; Display a monster's pic and -; attributes when highlighting -; it in a PC menu. - -; Includes the neat cascading -; effect when showing the pic. - -; Example: Species, level, gender, -; whether it's holding an item. - - hlcoord 0, 0 - lb bc, 15, 8 - call ClearBox - - hlcoord 8, 14 - lb bc, 1, 3 - call ClearBox - - call BillsPC_GetSelectedPokemonSpecies - and a - ret z - cp -1 - ret z - - ld [wd265], a - hlcoord 1, 4 - xor a - ld b, 7 -.row - ld c, 7 - push af - push hl -.col - ld [hli], a - add 7 - dec c - jr nz, .col - pop hl - ld de, SCREEN_WIDTH - add hl, de - pop af - inc a - dec b - jr nz, .row - - call BillsPC_LoadMonStats - ld a, [wd265] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - ld hl, wTempMonDVs - predef GetUnownLetter - call GetBaseData - ld de, vTiles2 tile $00 - predef GetMonFrontpic - xor a - ld [wBillsPC_MonHasMail], a - ld a, [wCurPartySpecies] - ld [wd265], a - cp EGG - ret z - - call GetBasePokemonName - hlcoord 1, 14 - call PlaceString - - hlcoord 1, 12 - call PrintLevel - - ld a, $3 - ld [wMonType], a - farcall GetGender - jr c, .skip_gender - ld a, "♂" - jr nz, .printgender - ld a, "♀" -.printgender - hlcoord 5, 12 - ld [hl], a -.skip_gender - - ld a, [wTempMonItem] - and a - ret z - - ld d, a - callfar ItemIsMail - jr c, .mail - ld a, $5d ; item icon - jr .printitem -.mail - ld a, $1 - ld [wBillsPC_MonHasMail], a - ld a, $5c ; mail icon -.printitem - hlcoord 7, 12 - ld [hl], a - ret - -BillsPC_LoadMonStats: ; e2b6d (38:6b6d) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld e, a - ld d, $0 - ld hl, wBillsPCPokemonList + 1 ; box number - add hl, de - add hl, de - add hl, de - ld a, [hl] - and a - jr z, .party - cp NUM_BOXES + 1 - jr z, .sBox - ld b, a - call GetBoxPointer - ld a, b - call GetSRAMBank - push hl - ld bc, sBoxMon1Level - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonLevel], a - pop hl - push hl - ld bc, sBoxMon1Item - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonItem], a - pop hl - ld bc, sBoxMon1DVs - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld de, wTempMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - call CloseSRAM - ret - -.party - ld hl, wPartyMon1Level - ld bc, PARTYMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonLevel], a - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonItem], a - ld hl, wPartyMon1DVs - ld bc, PARTYMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld de, wTempMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - ret - -.sBox - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxMon1Level - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonLevel], a - - ld hl, sBoxMon1Item - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonItem], a - - ld hl, sBoxMon1DVs - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld de, wTempMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - - call CloseSRAM - ret - -BillsPC_RefreshTextboxes: ; e2c2c (38:6c2c) - hlcoord 8, 2 - lb bc, 10, 10 - call TextBox - - hlcoord 8, 2 - ld [hl], "└" - hlcoord 19, 2 - ld [hl], "┘" - - ld a, [wBillsPC_ScrollPosition] - ld e, a - ld d, 0 - ld hl, wBillsPCPokemonList - add hl, de - add hl, de - add hl, de - ld e, l - ld d, h - hlcoord 9, 4 - ld a, [wBillsPC_NumMonsOnScreen] -.loop - push af - push de - push hl - call .PlaceNickname - pop hl - ld de, 2 * SCREEN_WIDTH - add hl, de - pop de - inc de - inc de - inc de - pop af - dec a - jr nz, .loop - ret -; e2c67 (38:6c67) - -.CancelString: - db "CANCEL@" -; e2c6e - -.PlaceNickname: ; e2c6e (38:6c6e) - ld a, [de] - and a - ret z - cp -1 - jr nz, .get_nickname - ld de, .CancelString - call PlaceString - ret - -.get_nickname - inc de - ld a, [de] - ld b, a - inc de - ld a, [de] - ld e, a - ld a, b - and a - jr z, .party - cp NUM_BOXES + 1 - jr z, .sBox - push hl - call GetBoxPointer - ld a, b - call GetSRAMBank - push hl - ld bc, sBoxMons - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - pop hl - and a - jr z, .boxfail - ld bc, sBoxMonNicknames - sBox - add hl, bc - ld bc, MON_NAME_LENGTH - ld a, e - call AddNTimes - ld de, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - call CloseSRAM - pop hl - ld de, wStringBuffer1 - call PlaceString - ret - -.boxfail - call CloseSRAM - pop hl - jr .placeholder_string - -.party - push hl - ld hl, wPartySpecies - ld d, $0 - add hl, de - ld a, [hl] - and a - jr z, .partyfail - ld hl, wPartyMonNicknames - ld bc, MON_NAME_LENGTH - ld a, e - call AddNTimes - ld de, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - pop hl - ld de, wStringBuffer1 - call PlaceString - ret - -.partyfail - pop hl - jr .placeholder_string - -.sBox - push hl - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxSpecies - ld d, $0 - add hl, de - ld a, [hl] - and a - jr z, .sBoxFail - ld hl, sBoxMonNicknames - ld bc, MON_NAME_LENGTH - ld a, e - call AddNTimes - ld de, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - call CloseSRAM - pop hl - ld de, wStringBuffer1 - call PlaceString - ret - -.sBoxFail - call CloseSRAM - pop hl -.placeholder_string - ld de, .Placeholder - call PlaceString - ret -; e2d2a (38:6d2a) - -.Placeholder: - db "-----@" -; e2d30 - -copy_box_data: MACRO -.loop\@ - ld a, [hl] - cp -1 - jr z, .done\@ - and a - jr z, .done\@ - ld [de], a - inc de - ld a, [wBillsPC_LoadedBox] - ld [de], a - inc de - ld a, [wd003] - ld [de], a - inc a - ld [wd003], a - inc de - inc hl - ld a, [wd004] - inc a - ld [wd004], a - jr .loop\@ - -.done\@ -if \1 - call CloseSRAM -endc - ld a, -1 - ld [de], a - ld a, [wd004] - inc a - ld [wBillsPC_NumMonsInBox], a -ENDM - -CopyBoxmonSpecies: ; e2d30 (38:6d30) - xor a - ld hl, wBillsPCPokemonList - ld bc, 3 * 30 - call ByteFill - ld de, wBillsPCPokemonList - xor a - ld [wd003], a - ld [wd004], a - ld a, [wBillsPC_LoadedBox] - and a - jr z, .party - cp NUM_BOXES + 1 - jr z, .sBox - ld b, a - call GetBoxPointer - ld a, b - call GetSRAMBank - inc hl - copy_box_data 1 - ret - -.party - ld hl, wPartySpecies - copy_box_data 0 - ret - -.sBox - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxSpecies - copy_box_data 1 - ret - -BillsPC_GetSelectedPokemonSpecies: ; e2def (38:6def) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld e, a - ld d, $0 - ld hl, wBillsPCPokemonList - add hl, de - add hl, de - add hl, de - ld a, [hl] - ret - -BillsPC_UpdateSelectionCursor: ; e2e01 (38:6e01) - ld a, [wBillsPC_NumMonsInBox] - and a - jr nz, .place_cursor - call ClearSprites - ret - -.place_cursor - ld hl, .OAM - ld de, wVirtualOAMSprite00 -.loop - ld a, [hl] - cp -1 - ret z - ld a, [wBillsPC_CursorPosition] - and $7 - swap a - add [hl] - inc hl - ld [de], a ; y - inc de -rept SPRITEOAMSTRUCT_LENGTH + -1 - ld a, [hli] - ld [de], a - inc de -endr - jr .loop -; e2e2b (38:6e2b) - -.OAM: ; e2e2b - dsprite 4, 6, 10, 0, $00, 0 - dsprite 4, 6, 11, 0, $00, 0 - dsprite 4, 6, 12, 0, $00, 0 - dsprite 4, 6, 13, 0, $00, 0 - dsprite 4, 6, 14, 0, $00, 0 - dsprite 4, 6, 15, 0, $00, 0 - dsprite 4, 6, 16, 0, $00, 0 - dsprite 4, 6, 17, 0, $00, 0 - dsprite 4, 6, 18, 0, $00, 0 - dsprite 4, 6, 18, 7, $00, 0 - dsprite 7, 1, 10, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 11, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 12, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 13, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 14, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 15, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 16, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 17, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 18, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 18, 7, $00, 0 | Y_FLIP - dsprite 5, 6, 9, 6, $01, 0 - dsprite 6, 1, 9, 6, $01, 0 | Y_FLIP - dsprite 5, 6, 19, 1, $01, 0 | X_FLIP - dsprite 6, 1, 19, 1, $01, 0 | X_FLIP | Y_FLIP - db -1 -; e2e8c - -BillsPC_UpdateInsertCursor: ; e2e8c - ld hl, .OAM - ld de, wVirtualOAMSprite00 -.loop - ld a, [hl] - cp -1 - ret z - ld a, [wBillsPC_CursorPosition] - and $7 - swap a - add [hl] - inc hl - ld [de], a ; y - inc de -rept SPRITEOAMSTRUCT_LENGTH + -1 - ld a, [hli] - ld [de], a - inc de -endr - jr .loop -; e2eac - -.OAM: ; e2eac - dsprite 4, 7, 10, 0, $06, 0 - dsprite 5, 3, 11, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 12, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 13, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 14, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 15, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 16, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 17, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 18, 0, $00, 0 | Y_FLIP - dsprite 4, 7, 19, 0, $07, 0 - db -1 -; e2ed5 - -Unreferenced_BillsPC_FillBox: ; e2ed5 -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret -; e2ee5 - -BillsPC_CheckSpaceInDestination: ; e2ee5 -; If moving within a box, no need to be here. - ld hl, wBillsPC_LoadedBox - ld a, [wBillsPC_BackupLoadedBox] - cp [hl] - jr z, .same_box - -; Exceeding box or party capacity is a big no-no. - ld a, [wBillsPC_LoadedBox] - and a - jr z, .party - ld e, MONS_PER_BOX + 1 - jr .compare - -.party - ld e, PARTY_LENGTH + 1 -.compare - ld a, [wBillsPC_NumMonsInBox] - cp e - jr nc, .no_room -.same_box - and a - ret - -.no_room - ld de, PCString_TheresNoRoom - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret -; e2f18 - -BillsPC_CheckMail_PreventBlackout: ; e2f18 (38:6f18) - ld a, [wBillsPC_LoadedBox] - and a - jr nz, .Okay - ld a, [wBillsPC_NumMonsInBox] - cp $3 - jr c, .ItsYourLastPokemon - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - farcall CheckCurPartyMonFainted - jr c, .AllOthersFainted - ld a, [wBillsPC_MonHasMail] - and a - jr nz, .HasMail -.Okay: - and a - ret - -.HasMail: - ld de, PCString_RemoveMail - jr .NotOkay - -.AllOthersFainted: - ld de, PCString_NoMoreUsablePKMN - jr .NotOkay - -.ItsYourLastPokemon: - ld de, PCString_ItsYourLastPKMN -.NotOkay: - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret - -BillsPC_IsMonAnEgg: ; e2f5f (38:6f5f) - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - and a - ret - -.egg - ld de, PCString_NoReleasingEGGS - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret - -BillsPC_StatsScreen: ; e2f7e (38:6f7e) - call LowVolume - call BillsPC_CopyMon - ld a, $3 - ld [wMonType], a - predef StatsScreenInit - call BillsPC_InitGFX - call MaxVolume - ret - -StatsScreenDPad: ; e2f95 (38:6f95) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and A_BUTTON | B_BUTTON | D_RIGHT | D_LEFT - ld [wMenuJoypad], a - jr nz, .pressed_a_b_right_left - ld a, [hl] - and D_DOWN | D_UP - ld [wMenuJoypad], a - jr nz, .pressed_down_up - jr .pressed_a_b_right_left - -.pressed_down_up - call _StatsScreenDPad - and a - jr z, .did_nothing - call BillsPC_GetSelectedPokemonSpecies - ld [wd265], a - call BillsPC_LoadMonStats - ld a, [wd265] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - ld hl, wTempMonDVs - predef GetUnownLetter - call GetBaseData - call BillsPC_CopyMon -.pressed_a_b_right_left - ret - -.did_nothing - xor a - ld [wMenuJoypad], a - ret - -BillsPC_CopyMon: ; e2fd6 (38:6fd6) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - ld a, [wBillsPC_LoadedBox] - and a - jr z, .party - cp NUM_BOXES + 1 - jr nz, .box - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxSpecies - call CopySpeciesToTemp - ld hl, sBoxMonNicknames - call CopyNicknameToTemp - ld hl, sBoxMonOT - call CopyOTNameToTemp - ld hl, sBoxMons - ld bc, BOXMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMon - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - call CloseSRAM - farcall CalcBufferMonStats - ret - -.party - ld hl, wPartySpecies - call CopySpeciesToTemp - ld hl, wPartyMonNicknames - call CopyNicknameToTemp - ld hl, wPartyMonOT - call CopyOTNameToTemp - ld hl, wPartyMon1 - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMon - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - ret - -.box - ld b, a - call GetBoxPointer - ld a, b - call GetSRAMBank - push hl - inc hl - call CopySpeciesToTemp - pop hl - push hl - ld bc, sBoxMonNicknames - sBox - add hl, bc - call CopyNicknameToTemp - pop hl - push hl - ld bc, sBoxMonOT - sBox - add hl, bc - call CopyOTNameToTemp - pop hl - ld bc, sBoxMons - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - call CopyMonToTemp - call CloseSRAM - farcall CalcBufferMonStats - ret - -DepositPokemon: ; e307c (38:707c) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - ld hl, wPartyMonNicknames - ld a, [wCurPartyMon] - call GetNick - ld a, PC_DEPOSIT - ld [wPokemonWithdrawDepositParameter], a - predef SendGetMonIntoFromBox - jr c, .asm_boxisfull - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ld a, [wCurPartySpecies] - call PlayMonCry - hlcoord 0, 0 - lb bc, 15, 8 - call ClearBox - hlcoord 8, 14 - lb bc, 1, 3 - call ClearBox - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - call WaitBGMap - hlcoord 1, 16 - ld de, PCString_Stored - call PlaceString - ld l, c - ld h, b - ld de, wStringBuffer1 - call PlaceString - ld a, "!" - ld [bc], a - ld c, 50 - call DelayFrames - and a - ret - -.asm_boxisfull - ld de, PCString_BoxFull - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret - -TryWithdrawPokemon: ; e30fa (38:70fa) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - ld a, BANK(sBoxMonNicknames) - call GetSRAMBank - ld a, [wCurPartyMon] - ld hl, sBoxMonNicknames - call GetNick - call CloseSRAM - xor a - ld [wPokemonWithdrawDepositParameter], a - predef SendGetMonIntoFromBox - jr c, .PartyFull - ld a, REMOVE_BOX - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ld a, [wCurPartySpecies] - call PlayMonCry - hlcoord 0, 0 - lb bc, 15, 8 - call ClearBox - hlcoord 8, 14 - lb bc, 1, 3 - call ClearBox - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - call WaitBGMap - hlcoord 1, 16 - ld de, PCString_Got - call PlaceString - ld l, c - ld h, b - ld de, wStringBuffer1 - call PlaceString - ld a, $e7 - ld [bc], a - ld c, 50 - call DelayFrames - and a - ret - -.PartyFull: - ld de, PCString_PartyFull - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret - - -ReleasePKMN_ByePKMN: ; e3180 (38:7180) - hlcoord 0, 0 - lb bc, 15, 8 - call ClearBox - hlcoord 8, 14 - lb bc, 1, 3 - call ClearBox - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - - call WaitBGMap - ld a, [wCurPartySpecies] - call GetCryIndex - jr c, .skip_cry - ld e, c - ld d, b - call PlayCry -.skip_cry - - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - hlcoord 1, 16 - ld de, PCString_ReleasedPKMN - call PlaceString - ld c, 80 - call DelayFrames - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - hlcoord 1, 16 - ld de, PCString_Bye - call PlaceString - ld l, c - ld h, b - inc hl - ld de, wStringBuffer1 - call PlaceString - ld l, c - ld h, b - ld [hl], $e7 - ld c, 50 - call DelayFrames - ret -; e31e7 (38:71e7) - -MovePKMNWitoutMail_InsertMon: ; e31e7 - push hl - push de - push bc - push af - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - hlcoord 1, 16 - ld de, .Saving_LeaveOn - call PlaceString - ld c, 20 - call DelayFrames - pop af - pop bc - pop de - pop hl - ld a, [wCurBox] - push af - ld bc, 0 - ld a, [wBillsPC_BackupLoadedBox] - and a - jr nz, .moving_from_box - set 0, c - -.moving_from_box - ld a, [wBillsPC_LoadedBox] - and a - jr nz, .moving_to_box - set 1, c - -.moving_to_box - ld hl, .Jumptable - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .dw_return - push de - jp hl -; e322a - -.dw_return ; e322a - pop af - ld e, a - farcall MoveMonWOMail_InsertMon_SaveGame - ret -; e3233 - -.Saving_LeaveOn: - db "Saving… Leave ON!@" -; e3245 - -.Jumptable: ; e3245 - dw .BoxToBox - dw .PartyToBox - dw .BoxToParty - dw .PartyToParty -; e324d - -.BoxToBox: ; e324d - ld hl, wBillsPC_BackupLoadedBox - ld a, [wBillsPC_LoadedBox] - cp [hl] - jr z, .same_box - call .CopyFromBox - call .CopyToBox - ret - -.same_box - call .CopyFromBox - call .CheckTrivialMove - call .CopyToBox - ret -; e3267 - -.PartyToBox: ; e3267 - call .CopyFromParty - ld a, $1 - ld [wGameLogicPaused], a - farcall SaveGameData - xor a - ld [wGameLogicPaused], a - call .CopyToBox - ret -; e327d - -.BoxToParty: ; e327d - call .CopyFromBox - call .CopyToParty - ret -; e3284 - -.PartyToParty: ; e3284 - call .CopyFromParty - call .CheckTrivialMove - call .CopyToParty - ret -; e328e - -.CheckTrivialMove: ; e328e - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld e, a - ld a, [wBillsPC_BackupCursorPosition] - ld hl, wBillsPC_BackupScrollPosition - add [hl] - cp e - ret nc - ld hl, wBillsPC_CursorPosition - ld a, [hl] - and a - jr z, .top_of_screen - dec [hl] - ret - -.top_of_screen - ld hl, wBillsPC_ScrollPosition - ld a, [hl] - and a - ret z - dec [hl] - ret -; e32b0 - -.CopyFromBox: ; e32b0 - ld a, [wBillsPC_BackupLoadedBox] - dec a - ld e, a - farcall MoveMonWOMail_SaveGame - ld a, [wBillsPC_BackupCursorPosition] - ld hl, wBillsPC_BackupScrollPosition - add [hl] - ld [wCurPartyMon], a - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxSpecies - call CopySpeciesToTemp - ld hl, sBoxMonNicknames - call CopyNicknameToTemp - ld hl, sBoxMonOT - call CopyOTNameToTemp - ld hl, sBoxMons - ld bc, BOXMON_STRUCT_LENGTH - call CopyMonToTemp - call CloseSRAM - farcall CalcBufferMonStats - ld a, REMOVE_BOX - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ret -; e32fa - -.CopyToBox: ; e32fa - ld a, [wBillsPC_LoadedBox] - dec a - ld e, a - farcall MoveMonWOMail_SaveGame - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - farcall InsertPokemonIntoBox - ret -; e3316 - -.CopyFromParty: ; e3316 - ld a, [wBillsPC_BackupCursorPosition] - ld hl, wBillsPC_BackupScrollPosition - add [hl] - ld [wCurPartyMon], a - ld hl, wPartySpecies - call CopySpeciesToTemp - ld hl, wPartyMonNicknames - call CopyNicknameToTemp - ld hl, wPartyMonOT - call CopyOTNameToTemp - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - call CopyMonToTemp - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ret -; e3346 - -.CopyToParty: ; e3346 - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - farcall InsertPokemonIntoParty - ret -; e3357 - -CopySpeciesToTemp: ; e3357 (38:7357) - ld a, [wCurPartyMon] - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - ld [wCurPartySpecies], a - ret - -CopyNicknameToTemp: ; e3363 (38:7363) - ld bc, MON_NAME_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMonNick - ld bc, MON_NAME_LENGTH - call CopyBytes - ret - -CopyOTNameToTemp: ; e3376 (38:7376) - ld bc, NAME_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMonOT - ld bc, NAME_LENGTH - call CopyBytes - ret - -CopyMonToTemp: ; e3389 (38:7389) - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMon - call CopyBytes - ret - -GetBoxPointer: ; e3396 (38:7396) - dec b - ld c, b - ld b, 0 - ld hl, .boxes - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - ld b, a - ld a, [hli] - ld h, [hl] - ld l, a - ret -; e33a6 (38:73a6) - -.boxes ; e33a6 - ; bank, address - dba sBox1 - dba sBox2 - dba sBox3 - dba sBox4 - dba sBox5 - dba sBox6 - dba sBox7 - dba sBox8 - dba sBox9 - dba sBox10 - dba sBox11 - dba sBox12 - dba sBox13 - dba sBox14 -; e33d0 - -BillsPC_ApplyPalettes: ; e33d0 (38:73d0) - ld b, a - call GetSGBLayout - ld a, %11100100 - call DmgToCgbBGPals - ld a, %11111100 - call DmgToCgbObjPal0 - ret - -BillsPC_Jumptable: ; e33df (38:73df) - ld e, a - ld d, $0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret - -BillsPC_InitGFX: ; e33e8 (38:73e8) - call DisableLCD - ld hl, vTiles2 tile $00 - ld bc, $31 tiles - xor a - call ByteFill - call LoadStandardFont - call LoadFontsBattleExtra - ld hl, PCMailGFX - ld de, vTiles2 tile $5c - ld bc, 4 tiles - call CopyBytes - ld hl, PCSelectLZ - ld de, vTiles0 tile $00 - call Decompress - ld a, 6 - call SkipMusic - call EnableLCD - ret -; e3419 (38:7419) - -PCSelectLZ: INCBIN "gfx/pc/pc.2bpp.lz" -PCMailGFX: INCBIN "gfx/pc/pc_mail.2bpp" -; e34dd - -PCString_ChooseaPKMN: db "Choose a .@" -PCString_WhatsUp: db "What's up?@" -PCString_ReleasePKMN: db "Release ?@" -PCString_MoveToWhere: db "Move to where?@" -PCString_ItsYourLastPKMN: db "It's your last !@" -PCString_TheresNoRoom: db "There's no room!@" -PCString_NoMoreUsablePKMN: db "No more usable !@" -PCString_RemoveMail: db "Remove MAIL.@" -PCString_ReleasedPKMN: db "Released .@" -PCString_Bye: db "Bye,@" -PCString_Stored: db "Stored @" -PCString_Got: db "Got @" -PCString_Non: db "Non.@" -PCString_BoxFull: db "The BOX is full.@" -PCString_PartyFull: db "The party's full!@" -PCString_NoReleasingEGGS: db "No releasing EGGS!@" -; e35aa - - -_ChangeBox: ; e35aa (38:75aa) - call LoadStandardMenuHeader - call BillsPC_ClearTilemap -.loop - xor a - ld [hBGMapMode], a - call BillsPC_PrintBoxName - call BillsPC_PlaceChooseABoxString - ld hl, _ChangeBox_MenuHeader - call CopyMenuHeader - xor a - ld [wMenuScrollPosition], a - hlcoord 0, 4 - lb bc, 8, 9 - call TextBox - call ScrollingMenu - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .done - call BillsPC_PlaceWhatsUpString - call BillsPC_ChangeBoxSubmenu - jr .loop -.done - call CloseWindow - ret - -BillsPC_ClearTilemap: ; e35e2 (38:75e2) - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, " " - call ByteFill - ret -; e35f1 (38:75f1) - -_ChangeBox_MenuHeader: ; 0xe35f1 - db MENU_BACKUP_TILES ; flags - menu_coords 1, 5, 9, 12 - dw .MenuData - db 1 ; default option -; 0xe35f9 - -.MenuData ; 0xe35f9 - db MENU_UNUSED_1 | MENU_UNUSED_3 ; flags - db 4, 0 - db 1 - dba .boxes - dba .boxnames - dba NULL - dba BillsPC_PrintBoxCountAndCapacity -; e3609 - -.boxes ; e3609 - db NUM_BOXES -x = 1 -rept NUM_BOXES - db x -x = x + 1 -endr - db -1 -; e3619 - -.boxnames ; e3619 - push de - ld a, [wMenuSelection] - dec a - call GetBoxName - pop hl - call PlaceString - ret -; e3626 - -GetBoxName: ; e3626 (38:7626) - ld bc, BOX_NAME_LENGTH - ld hl, wBoxNames - call AddNTimes - ld d, h - ld e, l - ret -; e3632 (38:7632) - -BillsPC_PrintBoxCountAndCapacity: ; e3632 - hlcoord 11, 7 - lb bc, 5, 7 - call TextBox - ld a, [wMenuSelection] - cp -1 - ret z - hlcoord 12, 9 - ld de, .Pokemon - call PlaceString - call GetBoxCount - ld [wd265], a - hlcoord 13, 11 - ld de, wd265 - lb bc, 1, 2 - call PrintNum - ld de, .out_of_20 - call PlaceString - ret -; e3663 - -.Pokemon: ; e3663 - db "#MON@" -; e3668 - -.out_of_20 ; e3668 - ; db "/20@" - db "/" - db "0" + MONS_PER_BOX / 10 ; "2" - db "0" + MONS_PER_BOX % 10 ; "0" - db "@" -; e366c - -GetBoxCount: ; e366c (38:766c) - ld a, [wCurBox] - ld c, a - ld a, [wMenuSelection] - dec a - cp c - jr z, .activebox - ld c, a - ld b, 0 - ld hl, .boxbanks - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - ld b, a - call GetSRAMBank - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [hl] - call CloseSRAM - ld c, a - ld a, [wSavedAtLeastOnce] - and a - jr z, .newfile - ld a, c - ret - -.newfile - xor a - ret - -.activebox - ld a, BANK(sBoxCount) - ld b, a - call GetSRAMBank - ld hl, sBoxCount - ld a, [hl] - call CloseSRAM - ret -; e36a5 (38:76a5) - -.boxbanks ; e36a5 - dba sBox1 - dba sBox2 - dba sBox3 - dba sBox4 - dba sBox5 - dba sBox6 - dba sBox7 - dba sBox8 - dba sBox9 - dba sBox10 - dba sBox11 - dba sBox12 - dba sBox13 - dba sBox14 -; e36cf - -BillsPC_PrintBoxName: ; e36cf (38:76cf) - hlcoord 0, 0 - ld b, 2 - ld c, 18 - call TextBox - hlcoord 1, 2 - ld de, .Current - call PlaceString - ld a, [wCurBox] - and $f - call GetBoxName - hlcoord 11, 2 - call PlaceString - ret -; e36f1 (38:76f1) - -.Current: ; e36f1 - db "CURRENT@" -; e36f9 - -BillsPC_ChangeBoxSubmenu: ; e36f9 (38:76f9) - ld hl, .MenuHeader - call LoadMenuHeader - call VerticalMenu - call ExitMenu - ret c - ld a, [wMenuCursorY] - cp $1 - jr z, .Switch - cp $2 - jr z, .Name - cp $3 - jr z, .Print - and a - ret - -.Print: - call GetBoxCount - and a - jr z, .EmptyBox - ld e, l - ld d, h - ld a, [wMenuSelection] - dec a - ld c, a - farcall PrintPCBox - call BillsPC_ClearTilemap - and a - ret - -.EmptyBox: - call BillsPC_PlaceEmptyBoxString_SFX - and a - ret - -.Switch: - ld a, [wMenuSelection] - dec a - ld e, a - ld a, [wCurBox] - cp e - ret z - farcall ChangeBoxSaveGame - ret - -.Name: - ld b, $4 ; box - ld de, wd002 - farcall NamingScreen - call ClearTileMap - call LoadStandardFont - call LoadFontsBattleExtra - ld a, [wMenuSelection] - dec a - call GetBoxName - ld e, l - ld d, h - ld hl, wd002 - ld c, BOX_NAME_LENGTH - 1 - call InitString - ld a, [wMenuSelection] - dec a - call GetBoxName - ld de, wd002 - call CopyName2 - ret -; e3778 (38:7778) - - hlcoord 11, 7 ; unused - -.MenuHeader: ; 0xe377b - db MENU_BACKUP_TILES ; flags - menu_coords 11, 4, SCREEN_WIDTH - 1, 13 - dw .MenuData - db 1 ; default option -; 0xe3783 - -.MenuData: ; 0xe3783 - db STATICMENU_CURSOR ; flags - db 4 ; items - db "SWITCH@" - db "NAME@" - db "PRINT@" - db "QUIT@" -; 0xe379c - -BillsPC_PlaceChooseABoxString: ; e379c (38:779c) - ld de, .ChooseABox - jr BillsPC_PlaceChangeBoxString -; e37a1 (38:77a1) - -.ChooseABox: ; e37a1 - db "Choose a BOX.@" -; e37af - -BillsPC_PlaceWhatsUpString: ; e37af (38:77af) - ld de, .WhatsUp - jr BillsPC_PlaceChangeBoxString -; e37b4 (38:77b4) - -.WhatsUp: ; e37b4 - db "What's up?@" -; e37be - -BillsPC_PlaceEmptyBoxString_SFX: ; e37be (38:77be) - ld de, .NoMonString - call BillsPC_PlaceChangeBoxString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - ret -; e37d3 (38:77d3) - -.NoMonString: ; e37d3 - db "There's no #MON.@" -; e37e3 - -BillsPC_PlaceChangeBoxString: ; e37e3 (38:77e3) - push de - hlcoord 0, 14 - lb bc, 2, 18 - call TextBox - pop de - hlcoord 1, 16 - call PlaceString - ld a, $1 - ld [hBGMapMode], a - ret diff --git a/engine/billspctop.asm b/engine/billspctop.asm deleted file mode 100755 index 1e808c02c..000000000 --- a/engine/billspctop.asm +++ /dev/null @@ -1,387 +0,0 @@ -_BillsPC: ; e3fd - call .CheckCanUsePC - ret c - call .LogIn - call .UseBillsPC - jp .LogOut - -.CheckCanUsePC: ; e40a (3:640a) - ld a, [wPartyCount] - and a - ret nz - ld hl, .Text_GottaHavePokemon - call MenuTextBoxBackup - scf - ret - -.Text_GottaHavePokemon: ; 0xe417 - ; You gotta have #MON to call! - text_jump UnknownText_0x1c1006 - db "@" - -.LogIn: ; e41c (3:641c) - xor a - ld [hBGMapMode], a - call LoadStandardMenuHeader - call ClearPCItemScreen - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - ld hl, .Text_What - call PrintText - pop af - ld [wOptions], a - call LoadFontsBattleExtra - ret - -.Text_What: ; 0xe43a - ; What? - text_jump UnknownText_0x1c1024 - db "@" - -.LogOut: ; e43f (3:643f) - call CloseSubmenu - ret - -.UseBillsPC: ; e443 (3:6443) - ld hl, .MenuHeader - call LoadMenuHeader - ld a, $1 -.loop - ld [wMenuCursorBuffer], a - call SetPalettes - xor a - ld [wWhichIndexSet], a - ld [hBGMapMode], a - call DoNthMenu - jr c, .cancel - ld a, [wMenuCursorBuffer] - push af - ld a, [wMenuSelection] - ld hl, .Jumptable - rst JumpTable - pop bc - ld a, b - jr nc, .loop -.cancel - call CloseWindow - ret - -.MenuHeader: ; 0xe46f - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default option - -.MenuData: ; 0xe477 - db STATICMENU_CURSOR ; flags - db 0 ; items - dw .items - dw PlaceMenuStrings - dw .strings - -.strings ; e47f - db "WITHDRAW @" - db "DEPOSIT @" - db "CHANGE BOX@" - db "MOVE W/O MAIL@" - db "SEE YA!@" - -.Jumptable: ; e4ba (3:64ba) - dw BillsPC_WithdrawMenu - dw BillsPC_DepositMenu - dw BillsPC_ChangeBoxMenu - dw BillsPC_MovePKMNMenu - dw BillsPC_SeeYa - -.items ; e4c4 - db 5 - db 0 ; WITHDRAW - db 1; DEPOSIT - db 2 ; CHANGE BOX - db 3 ; MOVE PKMN - db 4 ; SEE YA! - db -1 - -BillsPC_SeeYa: ; e4cb - scf - ret - -BillsPC_MovePKMNMenu: ; e4cd - call LoadStandardMenuHeader - farcall IsAnyMonHoldingMail - jr nc, .no_mail - ld hl, .Text_MonHoldingMail - call PrintText - jr .quit - -.no_mail - farcall StartMoveMonWOMail_SaveGame - jr c, .quit - farcall _MovePKMNWithoutMail - call ReturnToMapFromSubmenu - call ClearPCItemScreen - -.quit - call CloseWindow - and a - ret - -.Text_MonHoldingMail: ; 0xe4f9 - ; There is a #MON holding MAIL. Please remove the MAIL. - text_jump UnknownText_0x1c102b - db "@" - -BillsPC_DepositMenu: ; e4fe (3:64fe) - call LoadStandardMenuHeader - farcall _DepositPKMN - call ReturnToMapFromSubmenu - call ClearPCItemScreen - call CloseWindow - and a - ret - -Unreferenced_Functione512: - ld a, [wPartyCount] - and a - jr z, .no_mon - cp 2 - jr c, .only_one_mon - and a - ret - -.no_mon - ld hl, .Text_NoMon - call MenuTextBoxBackup - scf - ret - -.only_one_mon - ld hl, .Text_ItsYourLastMon - call MenuTextBoxBackup - scf - ret - -.Text_NoMon: ; 0xe52e - ; You don't have a single #MON! - text_jump UnknownText_0x1c1062 - db "@" - -.Text_ItsYourLastMon: ; 0xe533 - ; You can't deposit your last #MON! - text_jump UnknownText_0x1c1080 - db "@" - -CheckCurPartyMonFainted: ; e538 - ld hl, wPartyMon1HP - ld de, PARTYMON_STRUCT_LENGTH - ld b, $0 -.loop - ld a, [wCurPartyMon] - cp b - jr z, .skip - ld a, [hli] - or [hl] - jr nz, .notfainted - dec hl - -.skip - inc b - ld a, [wPartyCount] - cp b - jr z, .done - add hl, de - jr .loop - -.done - scf - ret - -.notfainted - and a - ret - -BillsPC_WithdrawMenu: ; e559 (3:6559) - call LoadStandardMenuHeader - farcall _WithdrawPKMN - call ReturnToMapFromSubmenu - call ClearPCItemScreen - call CloseWindow - and a - ret - -Unreferenced_Functione56d: - ld a, [wPartyCount] - cp PARTY_LENGTH - jr nc, .asm_e576 - and a - ret - -.asm_e576 - ld hl, UnknownText_0xe57e - call MenuTextBoxBackup - scf - ret - -UnknownText_0xe57e: ; 0xe57e - ; You can't take any more #MON. - text_jump UnknownText_0x1c10a2 - db "@" - -BillsPC_ChangeBoxMenu: ; e583 (3:6583) - farcall _ChangeBox - and a - ret - -ClearPCItemScreen: ; e58b - call DisableSpriteUpdates - xor a - ld [hBGMapMode], a - call ClearBGPalettes - call ClearSprites - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, " " - call ByteFill - hlcoord 0, 0 - lb bc, 10, 18 - call TextBox - hlcoord 0, 12 - lb bc, 4, 18 - call TextBox - call WaitBGMap2 - call SetPalettes ; load regular palettes? - ret - -CopyBoxmonToTempMon: ; e5bb - ld a, [wCurPartyMon] - ld hl, sBoxMon1Species - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld de, wTempMonSpecies - ld bc, BOXMON_STRUCT_LENGTH - ld a, BANK(sBoxMon1Species) - call GetSRAMBank - call CopyBytes - call CloseSRAM - ret - -Unreferenced_Functione5d9: - ld a, [wCurBox] - cp b - jr z, .same_box - ld a, b - ld hl, .BoxAddrs - ld bc, 3 - call AddNTimes - ld a, [hli] - push af - ld a, [hli] - ld h, [hl] - ld l, a - pop af - jr .okay - -.same_box - ld a, BANK(sBoxCount) - ld hl, sBoxCount - -.okay - call GetSRAMBank - ld a, [hl] - ld bc, 1 + MONS_PER_BOX + 1 - add hl, bc - ld b, a - ld c, $0 - ld de, wc608 - ld a, b - and a - jr z, .empty_box -.loop - push hl - push bc - ld a, c - ld bc, 0 - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld a, [hl] - ld [de], a - inc de - ld [wCurSpecies], a - call GetBaseData - pop bc - pop hl - - push hl - push bc - ld a, c - ld bc, MONS_PER_BOX * (BOXMON_STRUCT_LENGTH + NAME_LENGTH) - add hl, bc - call SkipNames - call CopyBytes - pop bc - pop hl - - push hl - push bc - ld a, c - ld bc, MON_LEVEL - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld a, [hl] - ld [de], a - inc de - pop bc - pop hl - - push hl - push bc - ld a, c - ld bc, MON_DVS - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld a, [hli] - and $f0 - ld b, a - ld a, [hl] - and $f0 - swap a - or b - ld b, a - ld a, [wBaseGender] - cp b - ld a, $1 - jr c, .okay2 - xor a -.okay2 - ld [de], a - inc de - pop bc - pop hl - - inc c - dec b - jr nz, .loop -.empty_box - call CloseSRAM - ret - -.BoxAddrs: ; e66e - dba sBox1 - dba sBox2 - dba sBox3 - dba sBox4 - dba sBox5 - dba sBox6 - dba sBox7 - dba sBox8 - dba sBox9 - dba sBox10 - dba sBox11 - dba sBox12 - dba sBox13 - dba sBox14 diff --git a/engine/breeding.asm b/engine/breeding.asm deleted file mode 100755 index 58b42953c..000000000 --- a/engine/breeding.asm +++ /dev/null @@ -1,994 +0,0 @@ -CheckBreedmonCompatibility: ; 16e1d - call .CheckBreedingGroupCompatibility - ld c, $0 - jp nc, .done - ld a, [wBreedMon1Species] - ld [wCurPartySpecies], a - ld a, [wBreedMon1DVs] - ld [wTempMonDVs], a - ld a, [wBreedMon1DVs + 1] - ld [wTempMonDVs + 1], a - ld a, TEMPMON - ld [wMonType], a - predef GetGender - jr c, .genderless - ld b, $1 - jr nz, .breedmon2 - inc b - -.breedmon2 - push bc - ld a, [wBreedMon2Species] - ld [wCurPartySpecies], a - ld a, [wBreedMon2DVs] - ld [wTempMonDVs], a - ld a, [wBreedMon2DVs + 1] - ld [wTempMonDVs + 1], a - ld a, $3 - ld [wMonType], a - predef GetGender - pop bc - jr c, .genderless - ld a, $1 - jr nz, .compare_gender - inc a - -.compare_gender - cp b - jr nz, .compute - -.genderless - ld c, $0 - ld a, [wBreedMon1Species] - cp DITTO - jr z, .ditto1 - ld a, [wBreedMon2Species] - cp DITTO - jr nz, .done - jr .compute - -.ditto1 - ld a, [wBreedMon2Species] - cp DITTO - jr z, .done - -.compute - call .CheckDVs - ld c, 255 - jp z, .done - ld a, [wBreedMon2Species] - ld b, a - ld a, [wBreedMon1Species] - cp b - ld c, 254 - jr z, .compare_ids - ld c, 128 -.compare_ids - ; Speed up - ld a, [wBreedMon1ID] - ld b, a - ld a, [wBreedMon2ID] - cp b - jr nz, .done - ld a, [wBreedMon1ID + 1] - ld b, a - ld a, [wBreedMon2ID + 1] - cp b - jr nz, .done - ld a, c - sub 77 - ld c, a - -.done - ld a, c - ld [wd265], a - ret -; 16ebc - - -.CheckDVs: ; 16ebc (5:6ebc) -; If Defense DVs match and the lower 3 bits of the Special DVs match, -; avoid breeding - ld a, [wBreedMon1DVs] - and %1111 - ld b, a - ld a, [wBreedMon2DVs] - and %1111 - cp b - ret nz - ld a, [wBreedMon1DVs + 1] - and %111 - ld b, a - ld a, [wBreedMon2DVs + 1] - and %111 - cp b - ret -; 16ed6 - -.CheckBreedingGroupCompatibility: ; 16ed6 -; If either mon is in the No Eggs group, -; they are not compatible. - ld a, [wBreedMon2Species] - ld [wCurSpecies], a - call GetBaseData - ld a, [wBaseEggGroups] - cp EGG_NONE * $11 - jr z, .Incompatible - - ld a, [wBreedMon1Species] - ld [wCurSpecies], a - call GetBaseData - ld a, [wBaseEggGroups] - cp EGG_NONE * $11 - jr z, .Incompatible - -; Ditto is automatically compatible with everything. -; If not Ditto, load the breeding groups into b/c and d/e. - ld a, [wBreedMon2Species] - cp DITTO - jr z, .Compatible - ld [wCurSpecies], a - call GetBaseData - ld a, [wBaseEggGroups] - push af - and $f - ld b, a - pop af - and $f0 - swap a - ld c, a - - ld a, [wBreedMon1Species] - cp DITTO - jr z, .Compatible - ld [wCurSpecies], a - push bc - call GetBaseData - pop bc - ld a, [wBaseEggGroups] - push af - and $f - ld d, a - pop af - and $f0 - swap a - ld e, a - - ld a, d - cp b - jr z, .Compatible - cp c - jr z, .Compatible - - ld a, e - cp b - jr z, .Compatible - cp c - jr z, .Compatible - -.Incompatible: - and a - ret - -.Compatible: - scf - ret -; 16f3e - -DoEggStep:: ; 16f3e - ld de, wPartySpecies - ld hl, wPartyMon1Happiness - ld c, 0 -.loop - ld a, [de] - inc de - cp -1 - ret z - cp EGG - jr nz, .next - dec [hl] - jr nz, .next - ld a, 1 - and a - ret - -.next - push de - ld de, PARTYMON_STRUCT_LENGTH - add hl, de - pop de - jr .loop -; 16f5e - -OverworldHatchEgg:: ; 16f5e - call RefreshScreen - call LoadStandardMenuHeader - call HatchEggs - call ExitAllMenus - call RestartMapMusic - jp CloseText -; 16f70 - -HatchEggs: ; 16f70 (5:6f70) - ld de, wPartySpecies - ld hl, wPartyMon1Happiness - xor a - ld [wCurPartyMon], a - -.loop ; 16f7a (5:6f7a) - ld a, [de] - inc de - cp -1 - jp z, .done - push de - push hl - cp EGG - jp nz, .next - ld a, [hl] - and a - jp nz, .next - ld [hl], $78 - - push de - - farcall SetEggMonCaughtData - farcall StubbedTrainerRankings_EggsHatched - ld a, [wCurPartyMon] - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld a, [hl] - ld [wCurPartySpecies], a - dec a - call SetSeenAndCaughtMon - - ld a, [wCurPartySpecies] - cp TOGEPI - jr nz, .nottogepi - ; set the event flag for hatching togepi - ld de, EVENT_TOGEPI_HATCHED - ld b, SET_FLAG - call EventFlagAction -.nottogepi - - pop de - - ld a, [wCurPartySpecies] - dec de - ld [de], a - ld [wd265], a - ld [wCurSpecies], a - call GetPokemonName - xor a - ld [wd26b], a - call GetBaseData - ld a, [wCurPartyMon] - ld hl, wPartyMon1 - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - push hl - ld bc, MON_MAXHP - add hl, bc - ld d, h - ld e, l - pop hl - push hl - ld bc, MON_LEVEL - add hl, bc - ld a, [hl] - ld [wCurPartyLevel], a - pop hl - push hl - ld bc, MON_STATUS - add hl, bc - xor a - ld [hli], a - ld [hl], a - pop hl - push hl - ld bc, MON_STAT_EXP - 1 - add hl, bc - ld b, FALSE - predef CalcMonStats - pop bc - ld hl, MON_MAXHP - add hl, bc - ld d, h - ld e, l - ld hl, MON_HP - add hl, bc - ld a, [de] - inc de - ld [hli], a - ld a, [de] - ld [hl], a - ld hl, MON_ID - add hl, bc - ld a, [wPlayerID] - ld [hli], a - ld a, [wPlayerID + 1] - ld [hl], a - ld a, [wCurPartyMon] - ld hl, wPartyMonOT - ld bc, NAME_LENGTH - call AddNTimes - ld d, h - ld e, l - ld hl, wPlayerName - call CopyBytes - ld hl, .Text_HatchEgg - call PrintText - ld a, [wCurPartyMon] - ld hl, wPartyMonNicknames - ld bc, MON_NAME_LENGTH - call AddNTimes - ld d, h - ld e, l - push de - ld hl, .Text_NicknameHatchling - call PrintText - call YesNoBox - pop de - jr c, .nonickname - - ld a, $1 - ld [wd26b], a - xor a - ld [wMonType], a - push de - ld b, $0 - farcall NamingScreen - pop hl - ld de, wStringBuffer1 - call InitName - jr .next - -.nonickname - ld hl, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - -.next ; 1707d (5:707d) - ld hl, wCurPartyMon - inc [hl] - pop hl - ld de, PARTYMON_STRUCT_LENGTH - add hl, de - pop de - jp .loop - -.done ; 1708a (5:708a) - ret -; 1708b (5:708b) - -.Text_HatchEgg: ; 0x1708b - ; Huh? @ @ - text_jump UnknownText_0x1c0db0 - start_asm - ld hl, wVramState - res 0, [hl] - push hl - push de - push bc - ld a, [wCurPartySpecies] - push af - call EggHatch_AnimationSequence - ld hl, .ClearTextbox - call PrintText - pop af - ld [wCurPartySpecies], a - pop bc - pop de - pop hl - ld hl, .CameOutOfItsEgg - ret -; 170b0 (5:70b0) - -.ClearTextbox: ; 0x170b0 - ; - text_jump UnknownText_0x1c0db8 - db "@" -; 0x170b5 - -.CameOutOfItsEgg: ; 0x170b5 - ; came out of its EGG!@ @ - text_jump UnknownText_0x1c0dba - db "@" -; 0x170ba - -.Text_NicknameHatchling: ; 0x170ba - ; Give a nickname to @ ? - text_jump UnknownText_0x1c0dd8 - db "@" -; 0x170bf - -InitEggMoves: ; 170bf - call GetHeritableMoves - ld d, h - ld e, l - ld b, NUM_MOVES -.loop - ld a, [de] - and a - jr z, .done - ld hl, wEggMonMoves - ld c, NUM_MOVES -.next - ld a, [de] - cp [hl] - jr z, .skip - inc hl - dec c - jr nz, .next - call GetEggMove - jr nc, .skip - call LoadEggMove - -.skip - inc de - dec b - jr nz, .loop - -.done - ret -; 170e4 - -GetEggMove: ; 170e4 - push bc - ld a, [wEggMonSpecies] - dec a - ld c, a - ld b, 0 - ld hl, EggMovePointers - add hl, bc - add hl, bc - ld a, BANK(EggMovePointers) - call GetFarHalfword -.loop - ld a, BANK(EggMoves) - call GetFarByte - cp -1 - jr z, .reached_end - ld b, a - ld a, [de] - cp b - jr z, .done_carry - inc hl - jr .loop - -.reached_end - call GetBreedmonMovePointer - ld b, NUM_MOVES -.loop2 - ld a, [de] - cp [hl] - jr z, .found_eggmove - inc hl - dec b - jr z, .inherit_tmhm - jr .loop2 - -.found_eggmove - ld a, [wEggMonSpecies] - dec a - ld c, a - ld b, 0 - ld hl, EvosAttacksPointers - add hl, bc - add hl, bc - ld a, BANK(EvosAttacksPointers) - call GetFarHalfword -.loop3 - ld a, BANK(EvosAttacks) - call GetFarByte - inc hl - and a - jr nz, .loop3 -.loop4 - ld a, BANK(EvosAttacks) - call GetFarByte - and a - jr z, .inherit_tmhm - inc hl - ld a, BANK(EvosAttacks) - call GetFarByte - ld b, a - ld a, [de] - cp b - jr z, .done_carry - inc hl - jr .loop4 - -.inherit_tmhm - ld hl, TMHMMoves -.loop5 - ld a, BANK(TMHMMoves) - call GetFarByte - inc hl - and a - jr z, .done - ld b, a - ld a, [de] - cp b - jr nz, .loop5 - ld [wPutativeTMHMMove], a - predef CanLearnTMHMMove - ld a, c - and a - jr z, .done - -.done_carry - pop bc - scf - ret - -.done - pop bc - and a - ret -; 17169 - -LoadEggMove: ; 17169 - push de - push bc - ld a, [de] - ld b, a - ld hl, wEggMonMoves - ld c, NUM_MOVES -.loop - ld a, [hli] - and a - jr z, .done - dec c - jr nz, .loop - ld de, wEggMonMoves - ld hl, wEggMonMoves + 1 - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - -.done - dec hl - ld [hl], b - ld hl, wEggMonMoves - ld de, wEggMonPP - predef FillPP - pop bc - pop de - ret -; 17197 - -GetHeritableMoves: ; 17197 - ld hl, wBreedMon2Moves - ld a, [wBreedMon1Species] - cp DITTO - jr z, .ditto1 - ld a, [wBreedMon2Species] - cp DITTO - jr z, .ditto2 - ld a, [wBreedMotherOrNonDitto] - and a - ret z - ld hl, wBreedMon1Moves - ret - -.ditto1 - ld a, [wCurPartySpecies] - push af - ld a, [wBreedMon2Species] - ld [wCurPartySpecies], a - ld a, [wBreedMon2DVs] - ld [wTempMonDVs], a - ld a, [wBreedMon2DVs + 1] - ld [wTempMonDVs + 1], a - ld a, TEMPMON - ld [wMonType], a - predef GetGender - jr c, .inherit_mon2_moves - jr nz, .inherit_mon2_moves - jr .inherit_mon1_moves - -.ditto2 - ld a, [wCurPartySpecies] - push af - ld a, [wBreedMon1Species] - ld [wCurPartySpecies], a - ld a, [wBreedMon1DVs] - ld [wTempMonDVs], a - ld a, [wBreedMon1DVs + 1] - ld [wTempMonDVs + 1], a - ld a, TEMPMON - ld [wMonType], a - predef GetGender - jr c, .inherit_mon1_moves - jr nz, .inherit_mon1_moves - -.inherit_mon2_moves - ld hl, wBreedMon2Moves - pop af - ld [wCurPartySpecies], a - ret - -.inherit_mon1_moves - ld hl, wBreedMon1Moves - pop af - ld [wCurPartySpecies], a - ret -; 1720b - -GetBreedmonMovePointer: ; 1720b - ld hl, wBreedMon1Moves - ld a, [wBreedMon1Species] - cp DITTO - ret z - ld a, [wBreedMon2Species] - cp DITTO - jr z, .ditto - ld a, [wBreedMotherOrNonDitto] - and a - ret z - -.ditto - ld hl, wBreedMon2Moves - ret -; 17224 - - -GetEggFrontpic: ; 17224 (5:7224) - push de - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call GetBaseData - ld hl, wBattleMonDVs - predef GetUnownLetter - pop de - predef_jump GetMonFrontpic - -GetHatchlingFrontpic: ; 1723c (5:723c) - push de - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call GetBaseData - ld hl, wBattleMonDVs - predef GetUnownLetter - pop de - predef_jump GetAnimatedFrontpic - -Hatch_UpdateFrontpicBGMapCenter: ; 17254 (5:7254) - push af - call WaitTop - push hl - push bc - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, " " - call ByteFill - pop bc - pop hl - ld a, b - ld [hBGMapAddress + 1], a - ld a, c - ld [hGraphicStartTile], a - lb bc, 7, 7 - predef PlaceGraphic - pop af - call Hatch_LoadFrontpicPal - call SetPalettes - jp WaitBGMap - -EggHatch_DoAnimFrame: ; 1727f (5:727f) - push hl - push de - push bc - callfar PlaySpriteAnimations - call DelayFrame - pop bc - pop de - pop hl - ret - -EggHatch_AnimationSequence: ; 1728f (5:728f) - ld a, [wd265] - ld [wJumptableIndex], a - ld a, [wCurSpecies] - push af - ld de, MUSIC_NONE - call PlayMusic - farcall BlankScreen - call DisableLCD - ld hl, EggHatchGFX - ld de, vTiles0 tile $00 - ld bc, 2 tiles - ld a, BANK(EggHatchGFX) - call FarCopyBytes - farcall ClearSpriteAnims - ld de, vTiles2 tile $00 - ld a, [wJumptableIndex] - call GetHatchlingFrontpic - ld de, vTiles2 tile $31 - ld a, EGG - call GetEggFrontpic - ld de, MUSIC_EVOLUTION - call PlayMusic - call EnableLCD - hlcoord 7, 4 - ld b, HIGH(vBGMap0) - ld c, $31 ; Egg tiles start here - ld a, EGG - call Hatch_UpdateFrontpicBGMapCenter - ld c, 80 - call DelayFrames - xor a - ld [wFrameCounter], a - ld a, [hSCX] - ld b, a -.outerloop - ld hl, wFrameCounter - ld a, [hl] - inc [hl] - cp 8 - jr nc, .done - ld e, [hl] -.loop -; wobble e times - ld a, 2 - ld [hSCX], a - ld a, -2 - ld [wGlobalAnimXOffset], a - call EggHatch_DoAnimFrame - ld c, 2 - call DelayFrames - ld a, -2 - ld [hSCX], a - ld a, 2 - ld [wGlobalAnimXOffset], a - call EggHatch_DoAnimFrame - ld c, 2 - call DelayFrames - dec e - jr nz, .loop - ld c, 16 - call DelayFrames - call EggHatch_CrackShell - jr .outerloop - -.done - ld de, SFX_EGG_HATCH - call PlaySFX - xor a - ld [hSCX], a - ld [wGlobalAnimXOffset], a - call ClearSprites - call Hatch_InitShellFragments - hlcoord 6, 3 - ld b, HIGH(vBGMap0) - ld c, $00 ; Hatchling tiles start here - ld a, [wJumptableIndex] - call Hatch_UpdateFrontpicBGMapCenter - call Hatch_ShellFragmentLoop - call WaitSFX - ld a, [wJumptableIndex] - ld [wCurPartySpecies], a - hlcoord 6, 3 - ld d, $0 - ld e, ANIM_MON_HATCH - predef AnimateFrontpic - pop af - ld [wCurSpecies], a - ret - -Hatch_LoadFrontpicPal: ; 17363 (5:7363) - ld [wPlayerHPPal], a - ld b, SCGB_EVOLUTION - ld c, $0 - jp GetSGBLayout - -EggHatch_CrackShell: ; 1736d (5:736d) - ld a, [wFrameCounter] - dec a - and $7 - cp $7 - ret z - srl a - ret nc - swap a - srl a - add 9 * 8 + 4 - ld d, a - ld e, 11 * 8 - ld a, SPRITE_ANIM_INDEX_EGG_CRACK - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_TILE_ID - add hl, bc - ld [hl], $0 - ld de, SFX_EGG_CRACK - jp PlaySFX -; 17393 (5:7393) - -EggHatchGFX: ; 17393 -INCBIN "gfx/evo/egg_hatch.2bpp" -; 173b3 - -Hatch_InitShellFragments: ; 173b3 (5:73b3) - farcall ClearSpriteAnims - ld hl, .SpriteData -.loop - ld a, [hli] - cp -1 - jr z, .done - ld e, a - ld a, [hli] - ld d, a - ld a, [hli] - ld c, a - ld a, [hli] - ld b, a - push hl - push bc - - ld a, SPRITE_ANIM_INDEX_EGG_HATCH - call _InitSpriteAnimStruct - - ld hl, SPRITEANIMSTRUCT_TILE_ID - add hl, bc - ld [hl], $0 - - pop de - ld a, e - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - add [hl] - ld [hl], a - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld [hl], d - - pop hl - jr .loop -.done - ld de, SFX_EGG_HATCH - call PlaySFX - call EggHatch_DoAnimFrame - ret -; 173ef (5:73ef) - -shell_fragment: MACRO -; y tile, y pxl, x tile, x pxl, frameset offset, ??? - db (\1 * 8) % $100 + \2, (\3 * 8) % $100 + \4, \5 - SPRITE_ANIM_FRAMESET_EGG_HATCH_1, \6 -ENDM - -.SpriteData: ; 173ef - shell_fragment 10, 4, 9, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $3c - shell_fragment 11, 4, 9, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $04 - shell_fragment 10, 4, 10, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $30 - shell_fragment 11, 4, 10, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $10 - shell_fragment 10, 4, 11, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_3, $24 - shell_fragment 11, 4, 11, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_4, $1c - shell_fragment 10, 0, 9, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $36 - shell_fragment 12, 0, 9, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $0a - shell_fragment 10, 0, 10, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_3, $2a - shell_fragment 12, 0, 10, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_4, $16 - db -1 -; 17418 - -Hatch_ShellFragmentLoop: ; 17418 (5:7418) - ld c, 129 -.loop - call EggHatch_DoAnimFrame - dec c - jr nz, .loop - ret - -DayCareMon1: ; 17421 - ld hl, DayCareMon1Text - call PrintText - ld a, [wBreedMon1Species] - call PlayMonCry - ld a, [wDayCareLady] - bit DAYCARELADY_HAS_MON_F, a - jr z, DayCareMonCursor - call ButtonSound - ld hl, wBreedMon2Nick - call DayCareMonCompatibilityText - jp PrintText - -DayCareMon2: ; 17440 - ld hl, DayCareMon2Text - call PrintText - ld a, [wBreedMon2Species] - call PlayMonCry - ld a, [wDayCareMan] - bit DAYCAREMAN_HAS_MON_F, a - jr z, DayCareMonCursor - call ButtonSound - ld hl, wBreedMon1Nick - call DayCareMonCompatibilityText - jp PrintText - -DayCareMonCursor: ; 1745f - jp WaitPressAorB_BlinkCursor -; 17462 - -DayCareMon2Text: ; 0x17462 - ; It's @ that was left with the DAY-CARE LADY. - text_jump UnknownText_0x1c0df3 - db "@" -; 0x17467 - -DayCareMon1Text: ; 0x17467 - ; It's @ that was left with the DAY-CARE MAN. - text_jump UnknownText_0x1c0e24 - db "@" -; 0x1746c - -DayCareMonCompatibilityText: ; 1746c - push bc - ld de, wStringBuffer1 - ld bc, NAME_LENGTH - call CopyBytes - call CheckBreedmonCompatibility - pop bc - ld a, [wd265] - ld hl, .AllAlone - cp -1 - jr z, .done - ld hl, .Incompatible - and a - jr z, .done - ld hl, .HighCompatibility - cp 230 - jr nc, .done - cp 70 - ld hl, .ModerateCompatibility - jr nc, .done - ld hl, .SlightCompatibility - -.done - ret -; 1749c - -.AllAlone: ; 0x1749c - ; It's brimming with energy. - text_jump UnknownText_0x1c0e54 - db "@" -; 0x174a1 - -.Incompatible: ; 0x174a1 - ; It has no interest in @ . - text_jump UnknownText_0x1c0e6f - db "@" -; 0x174a6 - -.HighCompatibility: ; 0x174a6 - ; It appears to care for @ . - text_jump UnknownText_0x1c0e8d - db "@" -; 0x174ab - -.ModerateCompatibility: ; 0x174ab - ; It's friendly with @ . - text_jump UnknownText_0x1c0eac - db "@" -; 0x174b0 - -.SlightCompatibility: ; 0x174b0 - ; It shows interest in @ . - text_jump UnknownText_0x1c0ec6 - db "@" -; 0x174b5 - -Unreferenced_DayCareMonPrintEmptyString: ; 174b5 - ld hl, .string - ret -; 174b9 - -.string ; 174b9 - db "@" -; 174ba - diff --git a/engine/buy_sell_toss.asm b/engine/buy_sell_toss.asm deleted file mode 100755 index 84481d030..000000000 --- a/engine/buy_sell_toss.asm +++ /dev/null @@ -1,235 +0,0 @@ -SelectQuantityToToss: ; 24fbf - ld hl, TossItem_MenuHeader - call LoadMenuHeader - call Toss_Sell_Loop - ret -; 24fc9 - -SelectQuantityToBuy: ; 24fc9 - farcall GetItemPrice -RooftopSale_SelectQuantityToBuy: ; 24fcf - ld a, d - ld [wBuffer1], a - ld a, e - ld [wBuffer2], a - ld hl, BuyItem_MenuHeader - call LoadMenuHeader - call Toss_Sell_Loop - ret -; 24fe1 - -SelectQuantityToSell: ; 24fe1 - farcall GetItemPrice - ld a, d - ld [wBuffer1], a - ld a, e - ld [wBuffer2], a - ld hl, SellItem_MenuHeader - call LoadMenuHeader - call Toss_Sell_Loop - ret -; 24ff9 - -Toss_Sell_Loop: ; 24ff9 - ld a, 1 - ld [wItemQuantityChangeBuffer], a -.loop - call BuySellToss_UpdateQuantityDisplay ; update display - call BuySellToss_InterpretJoypad ; joy action - jr nc, .loop - cp -1 - jr nz, .nope ; pressed B - scf - ret - -.nope - and a - ret -; 2500e - -BuySellToss_InterpretJoypad: ; 2500e - call JoyTextDelay_ForcehJoyDown ; get joypad - bit B_BUTTON_F, c - jr nz, .b - bit A_BUTTON_F, c - jr nz, .a - bit D_DOWN_F, c - jr nz, .down - bit D_UP_F, c - jr nz, .up - bit D_LEFT_F, c - jr nz, .left - bit D_RIGHT_F, c - jr nz, .right - and a - ret - -.b - ld a, -1 - scf - ret - -.a - ld a, 0 - scf - ret - -.down - ld hl, wItemQuantityChangeBuffer - dec [hl] - jr nz, .finish_down - ld a, [wItemQuantityBuffer] - ld [hl], a - -.finish_down - and a - ret - -.up - ld hl, wItemQuantityChangeBuffer - inc [hl] - ld a, [wItemQuantityBuffer] - cp [hl] - jr nc, .finish_up - ld [hl], 1 - -.finish_up - and a - ret - -.left - ld a, [wItemQuantityChangeBuffer] - sub 10 - jr c, .load_1 - jr z, .load_1 - jr .finish_left - -.load_1 - ld a, 1 - -.finish_left - ld [wItemQuantityChangeBuffer], a - and a - ret - -.right - ld a, [wItemQuantityChangeBuffer] - add 10 - ld b, a - ld a, [wItemQuantityBuffer] - cp b - jr nc, .finish_right - ld b, a - -.finish_right - ld a, b - ld [wItemQuantityChangeBuffer], a - and a - ret -; 25072 - -BuySellToss_UpdateQuantityDisplay: ; 25072 - call MenuBox - call MenuBoxCoord2Tile - ld de, SCREEN_WIDTH + 1 - add hl, de - ld [hl], "×" - inc hl - ld de, wItemQuantityChangeBuffer - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ld a, [wMenuDataPointer] - ld e, a - ld a, [wMenuDataPointer + 1] - ld d, a - ld a, [wMenuDataBank] - call FarCall_de - ret -; 25097 - -ret_25097: ; 25097 - ret -; 25098 - -DisplayPurchasePrice: ; 25098 - call BuySell_MultiplyPrice - call BuySell_DisplaySubtotal - ret -; 2509f - -DisplaySellingPrice: ; 2509f - call BuySell_MultiplyPrice - call Sell_HalvePrice - call BuySell_DisplaySubtotal - ret -; 250a9 - -BuySell_MultiplyPrice: ; 250a9 - xor a - ld [hMultiplicand + 0], a - ld a, [wBuffer1] - ld [hMultiplicand + 1], a - ld a, [wBuffer2] - ld [hMultiplicand + 2], a - ld a, [wItemQuantityChangeBuffer] - ld [hMultiplier], a - push hl - call Multiply - pop hl - ret -; 250c1 - -Sell_HalvePrice: ; 250c1 - push hl - ld hl, hProduct + 1 - ld a, [hl] - srl a - ld [hli], a - ld a, [hl] - rra - ld [hli], a - ld a, [hl] - rra - ld [hl], a - pop hl - ret -; 250d1 - -BuySell_DisplaySubtotal: ; 250d1 - push hl - ld hl, hMoneyTemp - ld a, [hProduct + 1] - ld [hli], a - ld a, [hProduct + 2] - ld [hli], a - ld a, [hProduct + 3] - ld [hl], a - pop hl - inc hl - ld de, hMoneyTemp - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - call WaitBGMap - ret -; 250ed - -TossItem_MenuHeader: ; 0x250ed - db MENU_BACKUP_TILES ; flags - menu_coords 15, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw ret_25097 - db 0 ; default option -; 0x250f5 - -BuyItem_MenuHeader: ; 0x250f5 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw DisplayPurchasePrice - db -1 ; default option -; 0x250fd - -SellItem_MenuHeader: ; 0x250fd - db MENU_BACKUP_TILES ; flags - menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw DisplaySellingPrice - db 0 ; default option -; 0x25105 diff --git a/engine/card_flip.asm b/engine/card_flip.asm deleted file mode 100755 index fbeb3e3b6..000000000 --- a/engine/card_flip.asm +++ /dev/null @@ -1,1692 +0,0 @@ -CARDFLIP_LIGHT_OFF EQU $ef -CARDFLIP_LIGHT_ON EQU $f5 - -CARDFLIP_DECK_SIZE EQU 4 * 6 - -; two labels below called from inside ./dummy_game.asm -Unknown_e00ed: ; e00ed (38:40ed) -; Graphics for an unused Game Corner -; game were meant to be here. -ret_e00ed: ; e00ed (38:40ed) - ret - -_CardFlip: ; e00ee (38:40ee) - ld hl, wOptions - set 4, [hl] - call ClearBGPalettes - call ClearTileMap - call ClearSprites - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - call DisableLCD - call LoadStandardFont - call LoadFontsExtra - - ld hl, CardFlipLZ01 - ld de, vTiles2 tile $00 - call Decompress - ld hl, CardFlipLZ02 - ld de, vTiles2 tile $3e - call Decompress - ld hl, CardFlipLZ03 - ld de, vTiles0 tile $00 - call Decompress - ld hl, CardFlipOffButtonGFX - ld de, vTiles0 tile CARDFLIP_LIGHT_OFF - ld bc, 1 tiles - call CopyBytes - ld hl, CardFlipOnButtonGFX - ld de, vTiles0 tile CARDFLIP_LIGHT_ON - ld bc, 1 tiles - call CopyBytes - - call CardFlip_ShiftDigitsLeftTwoPixels - call CardFlip_InitTilemap - call CardFlip_InitAttrPals - call EnableLCD - call WaitBGMap2 - ld a, $e4 - call DmgToCgbBGPals - ld de, $e4e4 - call DmgToCgbObjPals - call DelayFrame - xor a - ld [wJumptableIndex], a - ld a, $2 - ld [wCardFlipCursorY], a - ld [wCardFlipCursorX], a - ld de, MUSIC_GAME_CORNER - call PlayMusic -.MasterLoop: - ld a, [wJumptableIndex] - bit 7, a - jr nz, .leavethegame - call .CardFlip - jr .MasterLoop -.leavethegame - call WaitSFX - ld de, SFX_QUIT_SLOTS - call PlaySFX - call WaitSFX - call ClearBGPalettes - ld hl, wOptions - res 4, [hl] - ret - -.CardFlip: ; e0191 (38:4191) - 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 -; e01a0 (38:41a0) - -.Jumptable: ; e01a0 - dw .AskPlayWithThree - dw .DeductCoins - dw .ChooseACard - dw .PlaceYourBet - dw .CheckTheCard - dw .TabulateTheResult - dw .PlayAgain - dw .Quit -; e01b0 - -.Increment: ; e01b0 - ld hl, wJumptableIndex - inc [hl] - ret -; e01b5 - -.AskPlayWithThree: ; e01b5 - ld hl, .PlayWithThreeCoinsText - call CardFlip_UpdateCoinBalanceDisplay - call YesNoBox - jr c, .SaidNo - call CardFlip_ShuffleDeck - call .Increment - ret - -.SaidNo: - ld a, 7 - ld [wJumptableIndex], a - ret -; e01cd - -.PlayWithThreeCoinsText: ; 0xe01cd - ; Play with three coins? - text_jump UnknownText_0x1c5793 - db "@" -; 0xe01d2 - -.DeductCoins: ; e01d2 - ld a, [wCoins] - ld h, a - ld a, [wCoins + 1] - ld l, a - ld a, h - and a - jr nz, .deduct ; You have at least 256 coins. - ld a, l - cp 3 - jr nc, .deduct ; You have at least 3 coins. - ld hl, .NotEnoughCoinsText - call CardFlip_UpdateCoinBalanceDisplay - ld a, 7 - ld [wJumptableIndex], a - ret - -.deduct - ld de, -3 - add hl, de - ld a, h - ld [wCoins], a - ld a, l - ld [wCoins + 1], a - ld de, SFX_TRANSACTION - call PlaySFX - xor a - ld [hBGMapMode], a - call CardFlip_PrintCoinBalance - ld a, $1 - ld [hBGMapMode], a - call WaitSFX - call .Increment - ret -; e0212 - -.NotEnoughCoinsText: ; 0xe0212 - ; Not enough coins… - text_jump UnknownText_0x1c57ab - db "@" -; 0xe0217 - -.ChooseACard: ; e0217 - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - lb bc, 12, 9 - call CardFlip_FillGreenBox - hlcoord 9, 0 - ld bc, SCREEN_WIDTH - ld a, [wCardFlipNumCardsPlayed] - call AddNTimes - ld [hl], CARDFLIP_LIGHT_ON - ld a, $1 - ld [hBGMapMode], a - ld c, 20 - call DelayFrames - hlcoord 2, 0 - call PlaceCardFaceDown - ld a, $1 - ld [hBGMapMode], a - ld c, 20 - call DelayFrames - hlcoord 2, 6 - call PlaceCardFaceDown - call WaitBGMap - ld hl, .ChooseACardText - call CardFlip_UpdateCoinBalanceDisplay - xor a - ld [wCardFlipWhichCard], a -.loop - call JoyTextDelay - ld a, [hJoyLast] - and A_BUTTON - jr nz, .next - ld de, SFX_KINESIS - call PlaySFX - call PlaceOAMCardBorder - ld c, 4 - call DelayFrames - ld hl, wCardFlipWhichCard - ld a, [hl] - xor $1 - ld [hl], a - jr .loop - -.next - ld de, SFX_SLOT_MACHINE_START - call PlaySFX - ld a, $3 -.loop2 - push af - call PlaceOAMCardBorder - ld c, 4 - call DelayFrames - call ClearSprites - ld c, 4 - call DelayFrames - pop af - dec a - jr nz, .loop2 - ld hl, wCardFlipWhichCard - ld a, [hl] - push af - xor $1 - ld [hl], a - call GetCoordsOfChosenCard - lb bc, 6, 5 - call CardFlip_FillGreenBox - pop af - ld [wCardFlipWhichCard], a - call .Increment - ret -; e02b2 - -.ChooseACardText: ; 0xe02b2 - ; Choose a card. - text_jump UnknownText_0x1c57be - db "@" -; 0xe02b7 - -.PlaceYourBet: ; e02b7 - ld hl, .PlaceYourBetText - call CardFlip_UpdateCoinBalanceDisplay -.betloop - call JoyTextDelay - ld a, [hJoyLast] - and A_BUTTON - jr nz, .betdone - call ChooseCard_HandleJoypad - call CardFlip_UpdateCursorOAM - call DelayFrame - jr .betloop - -.betdone - call .Increment - ret -; e02d5 - -.PlaceYourBetText: ; 0xe02d5 - ; Place your bet. - text_jump UnknownText_0x1c57ce - db "@" -; 0xe02da - -.CheckTheCard: ; e02da - xor a - ld [hVBlankCounter], a - call CardFlip_UpdateCursorOAM - call WaitSFX - ld de, SFX_CHOOSE_A_CARD - call PlaySFX - call WaitSFX - ld a, [wCardFlipNumCardsPlayed] - ld e, a - ld d, 0 - ld hl, wDeck - add hl, de - add hl, de - ld a, [wCardFlipWhichCard] - ld e, a - add hl, de - ld a, [hl] - ld [wCardFlipFaceUpCard], a - ld e, a - ld hl, wDiscardPile - add hl, de - ld [hl], TRUE - call GetCoordsOfChosenCard - call CardFlip_DisplayCardFaceUp - call WaitBGMap2 - call .Increment - ret -; e0314 - -.TabulateTheResult: ; e0314 - call CardFlip_CheckWinCondition - call WaitPressAorB_BlinkCursor - call .Increment - ret -; e031e - -.PlayAgain: ; e031e - call ClearSprites - ld hl, .PlayAgainText - call CardFlip_UpdateCoinBalanceDisplay - call YesNoBox - jr nc, .Continue - call .Increment - ret - -.Continue: - ld a, [wCardFlipNumCardsPlayed] - inc a - ld [wCardFlipNumCardsPlayed], a - cp 12 - jr c, .KeepTheCurrentDeck - call CardFlip_InitTilemap - ld a, $1 - ld [hBGMapMode], a - call CardFlip_ShuffleDeck - ld hl, .CardsShuffledText - call PrintText - jr .LoopAround - -.KeepTheCurrentDeck: - call CardFlip_BlankDiscardedCardSlot - -.LoopAround: - ld a, 1 - ld [wJumptableIndex], a - ret -; e0356 - -.PlayAgainText: ; 0xe0356 - ; Want to play again? - text_jump UnknownText_0x1c57df - db "@" -; 0xe035b - -.CardsShuffledText: ; 0xe035b - ; The cards have been shuffled. - text_jump UnknownText_0x1c57f4 - db "@" -; 0xe0360 - -.Quit: ; e0360 - ld hl, wJumptableIndex - set 7, [hl] - ret -; e0366 - -CardFlip_ShuffleDeck: ; e0366 - ld hl, wDeck - ld bc, CARDFLIP_DECK_SIZE - xor a - call ByteFill - ld de, wDeck - ld c, CARDFLIP_DECK_SIZE - 1 -.loop - call Random - and $1f - cp CARDFLIP_DECK_SIZE - jr nc, .loop - ld l, a - ld h, $0 - add hl, de - ld a, [hl] - and a - jr nz, .loop - ld [hl], c - dec c - jr nz, .loop - xor a - ld [wCardFlipNumCardsPlayed], a - ld hl, wDiscardPile - ld bc, CARDFLIP_DECK_SIZE - call ByteFill - ret -; e0398 - -CollapseCursorPosition: ; e0398 - ld hl, 0 - ld bc, 6 - ld a, [wCardFlipCursorY] - call AddNTimes - ld b, $0 - ld a, [wCardFlipCursorX] - ld c, a - add hl, bc - ret -; e03ac - -GetCoordsOfChosenCard: ; e03ac - ld a, [wCardFlipWhichCard] - and a - jr nz, .BottomCard - hlcoord 2, 0 - bcpixel 2, 3 - jr .done - -.BottomCard: - hlcoord 2, 6 - bcpixel 8, 3 - -.done - ret -; e03c1 - -PlaceCardFaceDown: ; e03c1 - xor a - ld [hBGMapMode], a - ld de, .FaceDownCardTilemap - lb bc, 6, 5 - call CardFlip_CopyToBox - ret -; e03ce - -.FaceDownCardTilemap: ; e03ce - db $08, $09, $09, $09, $0a - db $0b, $28, $2b, $28, $0c - db $0b, $2c, $2d, $2e, $0c - db $0b, $2f, $30, $31, $0c - db $0b, $32, $33, $34, $0c - db $0d, $0e, $0e, $0e, $0f -; e03ec - -CardFlip_DisplayCardFaceUp: ; e03ec - xor a - ld [hBGMapMode], a - push hl - push hl - ; Flip the card face up. - ld de, .FaceUpCardTilemap - lb bc, 6, 5 - call CardFlip_CopyToBox - - ; Get the level and species of the upturned card. - ld a, [wCardFlipFaceUpCard] - ld e, a - ld d, 0 - ld hl, .Deck - add hl, de - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - - ; Place the level. - pop hl - ld bc, 3 + SCREEN_WIDTH - add hl, bc - ld [hl], e - - ; Place the Pokepic. - ld bc, SCREEN_HEIGHT - add hl, bc - ld a, d - ld de, SCREEN_WIDTH - ld b, 3 -.row - push hl - ld c, 3 -.col - ld [hli], a - inc a - dec c - jr nz, .col - pop hl - add hl, de - dec b - jr nz, .row - pop hl - - ; Pointless CGB check - ld a, [hCGB] - and a - ret z - - ; Set the attributes - ld de, wAttrMap - wTileMap - add hl, de - ld a, [wCardFlipFaceUpCard] - and 3 - inc a - lb bc, 6, 5 - call CardFlip_FillBox - ret -; e043b - -.FaceUpCardTilemap: ; e043b - db $18, $19, $19, $19, $1a - db $1b, $35, $7f, $7f, $1c - db $0b, $28, $28, $28, $0c - db $0b, $28, $28, $28, $0c - db $0b, $28, $28, $28, $0c - db $1d, $1e, $1e, $1e, $1f -; e0459 - -.Deck: ; e0459 - ; level, pic anchor (3x3) - db "1", $4e, "1", $57, "1", $69, "1", $60 - db "2", $4e, "2", $57, "2", $69, "2", $60 - db "3", $4e, "3", $57, "3", $69, "3", $60 - db "4", $4e, "4", $57, "4", $69, "4", $60 - db "5", $4e, "5", $57, "5", $69, "5", $60 - db "6", $4e, "6", $57, "6", $69, "6", $60 -; e0489 - -CardFlip_UpdateCoinBalanceDisplay: ; e0489 - push hl - hlcoord 0, 12 - ld b, 4 - ld c, SCREEN_WIDTH - 2 - call TextBox - pop hl - call PrintTextBoxText - call CardFlip_PrintCoinBalance - ret -; e049c - -CardFlip_PrintCoinBalance: ; e049c - hlcoord 9, 15 - ld b, 1 - ld c, 9 - call TextBox - hlcoord 10, 16 - ld de, .CoinStr - call PlaceString - hlcoord 15, 16 - ld de, wCoins - lb bc, PRINTNUM_LEADINGZEROS | 2, 4 - call PrintNum - ret -; e04bc - -.CoinStr: - db "COIN@" -; e04c1 - -CardFlip_InitTilemap: ; e04c1 (38:44c1) - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, $29 - call ByteFill - hlcoord 9, 0 - ld de, CardFlipTilemap - lb bc, 12, 11 - call CardFlip_CopyToBox - hlcoord 0, 12 - lb bc, 4, 18 - call TextBox - ret -; e04e5 (38:44e5) - -CardFlip_FillGreenBox: ; e04e5 - ld a, $29 - -CardFlip_FillBox: ; e04e7 (38:44e7) -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret - -CardFlip_CopyToBox: ; e04f7 (38:44f7) -.row - push bc - push hl -.col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret -; e0509 (38:4509) - -CardFlip_CopyOAM: ; e0509 - ld de, wVirtualOAMSprite00 - ld a, [hli] -.loop - push af - ld a, [hli] - add b - ld [de], a ; y - inc de - ld a, [hli] - add c - ld [de], a ; x - inc de - ld a, [hli] - ld [de], a ; tile id - inc de - ld a, [hli] - ld [de], a ; attributes - inc de - pop af - dec a - jr nz, .loop - ret -; e0521 - -CardFlip_ShiftDigitsLeftTwoPixels: ; e0521 (38:4521) - ld de, vTiles0 tile "0" - ld hl, vTiles0 tile "0" + 2 - ld bc, 10 tiles - 2 - call CopyBytes - ld hl, vTiles0 tile "9" + 1 tiles - 2 - xor a - ld [hli], a - ld [hl], a - ret -; e0534 (38:4534) - -CardFlip_BlankDiscardedCardSlot: ; e0534 - xor a - ld [hBGMapMode], a - ld a, [wCardFlipFaceUpCard] - ld e, a - ld d, 0 - - and 3 ; get mon - ld c, a - ld b, 0 - - ld a, e - and $1c ; get level - srl a - add LOW(.Jumptable) - ld l, a - ld a, 0 - adc HIGH(.Jumptable) - ld h, a - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e0553 - -.Jumptable: ; e0553 - dw .Level1 - dw .Level2 - dw .Level3 - dw .Level4 - dw .Level5 - dw .Level6 -; e055f - -.Level1: ; e055f - ld hl, wDiscardPile + 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded2 - hlcoord 13, 3 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $37 - ret - -.discarded2 - hlcoord 13, 3 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3d - ret -; e0583 - -.Level2: ; e0583 - ld hl, wDiscardPile - 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded1 - hlcoord 13, 4 - add hl, bc - add hl, bc - ld [hl], $3b - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret - -.discarded1 - hlcoord 13, 4 - add hl, bc - add hl, bc - ld [hl], $3d - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret -; e05a7 - -.Level3: ; e05a7 - ld hl, wDiscardPile + 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded4 - hlcoord 13, 6 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $38 - ret - -.discarded4 - hlcoord 13, 6 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3d - ret -; e05cb - -.Level4: ; e05cb - ld hl, wDiscardPile - 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded3 - hlcoord 13, 7 - add hl, bc - add hl, bc - ld [hl], $3c - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret - -.discarded3 - hlcoord 13, 7 - add hl, bc - add hl, bc - ld [hl], $3d - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret -; e05ef - -.Level5: ; e05ef - ld hl, wDiscardPile + 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded6 - hlcoord 13, 9 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $39 - ret - -.discarded6 - hlcoord 13, 9 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3d - ret -; e0613 - -.Level6: ; e0613 - ld hl, wDiscardPile - 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded5 - hlcoord 13, 10 - add hl, bc - add hl, bc - ld [hl], $3c - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret - -.discarded5 - hlcoord 13, 10 - add hl, bc - add hl, bc - ld [hl], $3d - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret -; e0637 - -CardFlip_CheckWinCondition: ; e0637 - call CollapseCursorPosition - add hl, hl - ld de, .Jumptable - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e0643 - -.Jumptable: ; e0643 - dw .Impossible - dw .Impossible - dw .PikaJiggly - dw .PikaJiggly - dw .PoliOddish - dw .PoliOddish - - dw .Impossible - dw .Impossible - dw .Pikachu - dw .Jigglypuff - dw .Poliwag - dw .Oddish - - dw .OneTwo - dw .One - dw .PikaOne - dw .JigglyOne - dw .PoliOne - dw .OddOne - - dw .OneTwo - dw .Two - dw .PikaTwo - dw .JigglyTwo - dw .PoliTwo - dw .OddTwo - - dw .ThreeFour - dw .Three - dw .PikaThree - dw .JigglyThree - dw .PoliThree - dw .OddThree - - dw .ThreeFour - dw .Four - dw .PikaFour - dw .JigglyFour - dw .PoliFour - dw .OddFour - - dw .FiveSix - dw .Five - dw .PikaFive - dw .JigglyFive - dw .PoliFive - dw .OddFive - - dw .FiveSix - dw .Six - dw .PikaSix - dw .JigglySix - dw .PoliSix - dw .OddSix -; e06a3 - -.Impossible: ; e06a3 - jp .Lose -; e06a6 - -.PikaJiggly: ; e06a6 - ld a, [wCardFlipFaceUpCard] - and $2 - jp nz, .Lose - jr .WinSix - -.PoliOddish: ; e06b0 - ld a, [wCardFlipFaceUpCard] - and $2 - jr nz, .WinSix - jp .Lose - -.WinSix: ; e06ba - ld c, $6 - ld de, SFX_2ND_PLACE - jp .Payout -; e06c2 - -.OneTwo: ; e06c2 - ld a, [wCardFlipFaceUpCard] - and $18 - jr z, .WinNine - jp .Lose - -.ThreeFour: ; e06cc - ld a, [wCardFlipFaceUpCard] - and $18 - cp $8 - jr z, .WinNine - jp .Lose - -.FiveSix: ; e06d8 - ld a, [wCardFlipFaceUpCard] - and $18 - cp $10 - jr z, .WinNine - jp .Lose - -.WinNine: ; e06e4 - ld c, $9 - ld de, SFX_2ND_PLACE - jp .Payout -; e06ec - -.Pikachu: ; e06ec - ld a, [wCardFlipFaceUpCard] - and $3 - jr z, .WinTwelve - jp .Lose - -.Jigglypuff: ; e06f6 - ld a, [wCardFlipFaceUpCard] - and $3 - cp $1 - jr z, .WinTwelve - jp .Lose - -.Poliwag: ; e0702 - ld a, [wCardFlipFaceUpCard] - and $3 - cp $2 - jr z, .WinTwelve - jp .Lose - -.Oddish: ; e070e - ld a, [wCardFlipFaceUpCard] - and $3 - cp $3 - jr z, .WinTwelve - jp .Lose - -.WinTwelve: ; e071a - ld c, $c - ld de, SFX_2ND_PLACE - jp .Payout -; e0722 - -.One: ; e0722 - ld a, [wCardFlipFaceUpCard] - and $1c - jr z, .WinEighteen - jp .Lose - -.Two: ; e072c - ld a, [wCardFlipFaceUpCard] - and $1c - cp $4 - jr z, .WinEighteen - jp .Lose - -.Three: ; e0738 - ld a, [wCardFlipFaceUpCard] - and $1c - cp $8 - jr z, .WinEighteen - jp .Lose - -.Four: ; e0744 - ld a, [wCardFlipFaceUpCard] - and $1c - cp $c - jr z, .WinEighteen - jp .Lose - -.Five: ; e0750 - ld a, [wCardFlipFaceUpCard] - and $1c - cp $10 - jr z, .WinEighteen - jp .Lose - -.Six: ; e075c - ld a, [wCardFlipFaceUpCard] - and $1c - cp $14 - jr z, .WinEighteen - jp .Lose - -.WinEighteen: ; e0768 - ld c, $12 - ld de, SFX_2ND_PLACE - jp .Payout -; e0770 - - -.PikaOne: ; e0770 - ld e, $0 - jr .CheckWin72 - -.JigglyOne: ; e0774 - ld e, $1 - jr .CheckWin72 - -.PoliOne: ; e0778 - ld e, $2 - jr .CheckWin72 - -.OddOne: ; e077c - ld e, $3 - jr .CheckWin72 - -.PikaTwo: ; e0780 - ld e, $4 - jr .CheckWin72 - -.JigglyTwo: ; e0784 - ld e, $5 - jr .CheckWin72 - -.PoliTwo: ; e0788 - ld e, $6 - jr .CheckWin72 - -.OddTwo: ; e078c - ld e, $7 - jr .CheckWin72 - -.PikaThree: ; e0790 - ld e, $8 - jr .CheckWin72 - -.JigglyThree: ; e0794 - ld e, $9 - jr .CheckWin72 - -.PoliThree: ; e0798 - ld e, $a - jr .CheckWin72 - -.OddThree: ; e079c - ld e, $b - jr .CheckWin72 - -.PikaFour: ; e07a0 - ld e, $c - jr .CheckWin72 - -.JigglyFour: ; e07a4 - ld e, $d - jr .CheckWin72 - -.PoliFour: ; e07a8 - ld e, $e - jr .CheckWin72 - -.OddFour: ; e07ac - ld e, $f - jr .CheckWin72 - -.PikaFive: ; e07b0 - ld e, $10 - jr .CheckWin72 - -.JigglyFive: ; e07b4 - ld e, $11 - jr .CheckWin72 - -.PoliFive: ; e07b8 - ld e, $12 - jr .CheckWin72 - -.OddFive: ; e07bc - ld e, $13 - jr .CheckWin72 - -.PikaSix: ; e07c0 - ld e, $14 - jr .CheckWin72 - -.JigglySix: ; e07c4 - ld e, $15 - jr .CheckWin72 - -.PoliSix: ; e07c8 - ld e, $16 - jr .CheckWin72 - -.OddSix: ; e07cc - ld e, $17 - -.CheckWin72: ; e07ce - ld a, [wCardFlipFaceUpCard] - cp e - jr nz, .Lose - ld c, 72 - ld de, SFX_2ND_PLACE - jr .Payout - -.Lose: ; e07db - ld de, SFX_WRONG - call PlaySFX - ld hl, .Text_Darn - call CardFlip_UpdateCoinBalanceDisplay - call WaitSFX - ret - -.Payout: ; e07eb - push bc - push de - ld hl, .Text_Yeah - call CardFlip_UpdateCoinBalanceDisplay - pop de - call PlaySFX - call WaitSFX - pop bc -.loop - push bc - call .IsCoinCaseFull - jr c, .full - call .AddCoinPlaySFX - -.full - call CardFlip_PrintCoinBalance - ld c, 2 - call DelayFrames - pop bc - dec c - jr nz, .loop - ret -; e0811 - -.Text_Yeah: ; 0xe0811 - ; Yeah! - text_jump UnknownText_0x1c5813 - db "@" -; 0xe0816 - -.Text_Darn: ; 0xe0816 - ; Darn… - text_jump UnknownText_0x1c581a - db "@" -; 0xe081b - -.AddCoinPlaySFX: ; e081b - ld a, [wCoins] - ld h, a - ld a, [wCoins + 1] - ld l, a - inc hl - ld a, h - ld [wCoins], a - ld a, l - ld [wCoins + 1], a - ld de, SFX_PAY_DAY - call PlaySFX - ret -; e0833 - -.IsCoinCaseFull: ; e0833 - ld a, [wCoins] - cp HIGH(MAX_COINS) - jr c, .less - jr z, .check_low - jr .more - -.check_low - ld a, [wCoins + 1] - cp LOW(MAX_COINS) - jr c, .less - -.more - scf - ret - -.less - and a - ret -; e0849 - -PlaceOAMCardBorder: ; e0849 - call GetCoordsOfChosenCard - ld hl, .SpriteData - call CardFlip_CopyOAM - ret -; e0853 - -.SpriteData: ; e0853 - db 18 - dsprite 0, 0, 0, 0, $04, 0 - dsprite 0, 0, 1, 0, $06, 0 - dsprite 0, 0, 2, 0, $06, 0 - dsprite 0, 0, 3, 0, $06, 0 - dsprite 0, 0, 4, 0, $04, 0 | X_FLIP - - dsprite 1, 0, 0, 0, $05, 0 - dsprite 1, 0, 4, 0, $05, 0 | X_FLIP - - dsprite 2, 0, 0, 0, $05, 0 - dsprite 2, 0, 4, 0, $05, 0 | X_FLIP - - dsprite 3, 0, 0, 0, $05, 0 - dsprite 3, 0, 4, 0, $05, 0 | X_FLIP - - dsprite 4, 0, 0, 0, $05, $00 - dsprite 4, 0, 4, 0, $05, 0 | X_FLIP - - dsprite 5, 0, 0, 0, $04, 0 | Y_FLIP - dsprite 5, 0, 1, 0, $06, 0 | Y_FLIP - dsprite 5, 0, 2, 0, $06, 0 | Y_FLIP - dsprite 5, 0, 3, 0, $06, 0 | Y_FLIP - dsprite 5, 0, 4, 0, $04, 0 | X_FLIP | Y_FLIP -; e089c - -ChooseCard_HandleJoypad: ; e089c - ld hl, hJoyLast - ld a, [hl] - and D_LEFT - jp nz, .d_left - ld a, [hl] - and D_RIGHT - jp nz, .d_right - ld a, [hl] - and D_UP - jp nz, .d_up - ld a, [hl] - and D_DOWN - jp nz, .d_down - ret -; e08b8 - -.d_left ; e08b8 - ld hl, wCardFlipCursorX - ld a, [wCardFlipCursorY] - and a - jr z, .mon_pair_left - cp $1 - jr z, .mon_group_left - ld a, [hl] - and a - ret z - dec [hl] - jp .play_sound - -.mon_group_left - ld a, [hl] - cp $3 - jr c, .left_to_number_gp - dec [hl] - jp .play_sound - -.mon_pair_left - ld a, [hl] - and $e - ld [hl], a - cp $3 - jr c, .left_to_number_gp - dec [hl] - dec [hl] - jp .play_sound - -.left_to_number_gp - ld a, $2 - ld [wCardFlipCursorY], a - ld a, $1 - ld [wCardFlipCursorX], a - jp .play_sound -; e08ef - -.d_right ; e08ef - ld hl, wCardFlipCursorX - ld a, [wCardFlipCursorY] - and a - jr z, .mon_pair_right - ld a, [hl] - cp $5 - ret nc - inc [hl] - jr .play_sound - -.mon_pair_right - ld a, [hl] - and $e - ld [hl], a - cp $4 - ret nc - inc [hl] - inc [hl] - jr .play_sound - -.d_up ; e090a - ld hl, wCardFlipCursorY - ld a, [wCardFlipCursorX] - and a - jr z, .num_pair_up - cp $1 - jr z, .num_gp_up - ld a, [hl] - and a - ret z - dec [hl] - jr .play_sound - -.num_gp_up - ld a, [hl] - cp $3 - jr c, .up_to_mon_group - dec [hl] - jr .play_sound - -.num_pair_up - ld a, [hl] - and $e - ld [hl], a - cp $3 - jr c, .up_to_mon_group - dec [hl] - dec [hl] - jr .play_sound - -.up_to_mon_group - ld a, $1 - ld [wCardFlipCursorY], a - ld a, $2 - ld [wCardFlipCursorX], a - jr .play_sound - -.d_down ; e093d - ld hl, wCardFlipCursorY - ld a, [wCardFlipCursorX] - and a - jr z, .num_pair_down - ld hl, wCardFlipCursorY - ld a, [hl] - cp $7 - ret nc - inc [hl] - jr .play_sound - -.num_pair_down - ld a, [hl] - and $e - ld [hl], a - cp $6 - ret nc - inc [hl] - inc [hl] - -.play_sound ; e0959 - ld de, SFX_POKEBALLS_PLACED_ON_TABLE - call PlaySFX - ret -; e0960 - -CardFlip_UpdateCursorOAM: ; e0960 - call ClearSprites - ld a, [hCGB] - and a - jr nz, .skip - ld a, [hVBlankCounter] - and $4 - ret nz - -.skip - call CollapseCursorPosition - add hl, hl - add hl, hl - ld de, .OAMData - add hl, de - ld a, [hli] - ld c, a - ld a, [hli] - ld b, a - ld a, [hli] - ld h, [hl] - ld l, a - call CardFlip_CopyOAM - ret -; e0981 - -.OAMData: ; e0981 -cardflip_cursor: MACRO -if _NARG >= 5 - dbpixel \1, \2, \3, \4 - dw \5 -else - dbpixel \1, \2 - dw \3 -endc -ENDM - - cardflip_cursor 11, 2, .Impossible - cardflip_cursor 12, 2, .Impossible - cardflip_cursor 13, 2, .PokeGroupPair - cardflip_cursor 13, 2, .PokeGroupPair - cardflip_cursor 17, 2, .PokeGroupPair - cardflip_cursor 17, 2, .PokeGroupPair - - cardflip_cursor 11, 3, .Impossible - cardflip_cursor 12, 3, .Impossible - cardflip_cursor 13, 3, .PokeGroup - cardflip_cursor 15, 3, .PokeGroup - cardflip_cursor 17, 3, .PokeGroup - cardflip_cursor 19, 3, .PokeGroup - - cardflip_cursor 11, 5, .NumGroupPair - cardflip_cursor 12, 5, .NumGroup - cardflip_cursor 13, 5, .SingleTile - cardflip_cursor 15, 5, .SingleTile - cardflip_cursor 17, 5, .SingleTile - cardflip_cursor 19, 5, .SingleTile - - cardflip_cursor 11, 5, .NumGroupPair - cardflip_cursor 12, 6, 0, 4, .NumGroup - cardflip_cursor 13, 6, 0, 4, .SingleTile - cardflip_cursor 15, 6, 0, 4, .SingleTile - cardflip_cursor 17, 6, 0, 4, .SingleTile - cardflip_cursor 19, 6, 0, 4, .SingleTile - - cardflip_cursor 11, 8, .NumGroupPair - cardflip_cursor 12, 8, .NumGroup - cardflip_cursor 13, 8, .SingleTile - cardflip_cursor 15, 8, .SingleTile - cardflip_cursor 17, 8, .SingleTile - cardflip_cursor 19, 8, .SingleTile - - cardflip_cursor 11, 8, .NumGroupPair - cardflip_cursor 12, 9, 0, 4, .NumGroup - cardflip_cursor 13, 9, 0, 4, .SingleTile - cardflip_cursor 15, 9, 0, 4, .SingleTile - cardflip_cursor 17, 9, 0, 4, .SingleTile - cardflip_cursor 19, 9, 0, 4, .SingleTile - - cardflip_cursor 11, 11, .NumGroupPair - cardflip_cursor 12, 11, .NumGroup - cardflip_cursor 13, 11, .SingleTile - cardflip_cursor 15, 11, .SingleTile - cardflip_cursor 17, 11, .SingleTile - cardflip_cursor 19, 11, .SingleTile - - cardflip_cursor 11, 11, .NumGroupPair - cardflip_cursor 12, 12, 0, 4, .NumGroup - cardflip_cursor 13, 12, 0, 4, .SingleTile - cardflip_cursor 15, 12, 0, 4, .SingleTile - cardflip_cursor 17, 12, 0, 4, .SingleTile - cardflip_cursor 19, 12, 0, 4, .SingleTile -; e0a41 - -.SingleTile: ; e0a41 - db 6 - dsprite 0, 0, -1, 7, $00, 0 | PRIORITY - dsprite 0, 0, 0, 0, $02, 0 | PRIORITY - dsprite 0, 0, 1, 0, $03, 0 | PRIORITY - dsprite 0, 5, -1, 7, $00, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 0, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 1, 0, $03, 0 | PRIORITY - -.PokeGroup: ; e0a5a - db 26 - dsprite 0, 0, -1, 7, $00, 0 | PRIORITY - dsprite 0, 0, 0, 0, $02, 0 | PRIORITY - dsprite 0, 0, 1, 0, $00, 0 | X_FLIP | PRIORITY - dsprite 1, 0, -1, 7, $01, 0 | PRIORITY - dsprite 1, 0, 1, 0, $01, 0 | X_FLIP | PRIORITY - dsprite 2, 0, -1, 7, $01, 0 | PRIORITY - dsprite 2, 0, 1, 0, $03, 0 | PRIORITY - dsprite 3, 0, -1, 7, $01, 0 | PRIORITY - dsprite 3, 0, 1, 0, $03, 0 | PRIORITY - dsprite 4, 0, -1, 7, $01, 0 | PRIORITY - dsprite 4, 0, 1, 0, $03, 0 | PRIORITY - dsprite 5, 0, -1, 7, $01, 0 | PRIORITY - dsprite 5, 0, 1, 0, $03, 0 | PRIORITY - dsprite 6, 0, -1, 7, $01, 0 | PRIORITY - dsprite 6, 0, 1, 0, $03, 0 | PRIORITY - dsprite 7, 0, -1, 7, $01, 0 | PRIORITY - dsprite 7, 0, 1, 0, $03, 0 | PRIORITY - dsprite 8, 0, -1, 7, $01, 0 | PRIORITY - dsprite 8, 0, 1, 0, $03, 0 | PRIORITY - dsprite 9, 0, -1, 7, $01, 0 | PRIORITY - dsprite 9, 0, 1, 0, $03, 0 | PRIORITY - dsprite 10, 0, -1, 7, $01, 0 | PRIORITY - dsprite 10, 0, 1, 0, $03, 0 | PRIORITY - dsprite 10, 1, -1, 7, $00, 0 | Y_FLIP | PRIORITY - dsprite 10, 1, 0, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 10, 1, 1, 0, $03, 0 | PRIORITY - -.NumGroup: ; e0ac3 - db 20 - dsprite 0, 0, -1, 7, $00, 0 | PRIORITY - dsprite 0, 0, 0, 0, $02, 0 | PRIORITY - dsprite 0, 0, 1, 0, $02, 0 | PRIORITY - dsprite 0, 0, 2, 0, $03, 0 | PRIORITY - dsprite 0, 0, 3, 0, $02, 0 | PRIORITY - dsprite 0, 0, 4, 0, $03, 0 | PRIORITY - dsprite 0, 0, 5, 0, $02, 0 | PRIORITY - dsprite 0, 0, 6, 0, $03, 0 | PRIORITY - dsprite 0, 0, 7, 0, $02, 0 | PRIORITY - dsprite 0, 0, 8, 0, $03, 0 | PRIORITY - dsprite 0, 5, -1, 7, $00, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 0, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 1, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 2, 0, $03, 0 | PRIORITY - dsprite 0, 5, 3, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 4, 0, $03, 0 | PRIORITY - dsprite 0, 5, 5, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 6, 0, $03, 0 | PRIORITY - dsprite 0, 5, 7, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 8, 0, $03, 0 | PRIORITY - -.NumGroupPair: ; e0b14 - db 30 - dsprite 0, 0, 0, 0, $00, 0 | PRIORITY - dsprite 0, 0, 1, 0, $02, 0 | PRIORITY - dsprite 0, 0, 2, 0, $02, 0 | PRIORITY - dsprite 0, 0, 3, 0, $03, 0 | PRIORITY - dsprite 0, 0, 4, 0, $02, 0 | PRIORITY - dsprite 0, 0, 5, 0, $03, 0 | PRIORITY - dsprite 0, 0, 6, 0, $02, 0 | PRIORITY - dsprite 0, 0, 7, 0, $03, 0 | PRIORITY - dsprite 0, 0, 8, 0, $02, 0 | PRIORITY - dsprite 0, 0, 9, 0, $03, 0 | PRIORITY - dsprite 1, 0, 0, 0, $01, 0 | PRIORITY - dsprite 1, 0, 3, 0, $03, 0 | PRIORITY - dsprite 1, 0, 5, 0, $03, 0 | PRIORITY - dsprite 1, 0, 7, 0, $03, 0 | PRIORITY - dsprite 1, 0, 9, 0, $03, 0 | PRIORITY - dsprite 2, 0, 0, 0, $01, 0 | PRIORITY - dsprite 2, 0, 3, 0, $03, 0 | PRIORITY - dsprite 2, 0, 5, 0, $03, 0 | PRIORITY - dsprite 2, 0, 7, 0, $03, 0 | PRIORITY - dsprite 2, 0, 9, 0, $03, 0 | PRIORITY - dsprite 2, 1, 0, 0, $00, 0 | Y_FLIP | PRIORITY - dsprite 2, 1, 1, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 2, 1, 2, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 2, 1, 3, 0, $03, 0 | PRIORITY - dsprite 2, 1, 4, 0, $03, 0 | PRIORITY - dsprite 2, 1, 5, 0, $03, 0 | PRIORITY - dsprite 2, 1, 6, 0, $03, 0 | PRIORITY - dsprite 2, 1, 7, 0, $03, 0 | PRIORITY - dsprite 2, 1, 8, 0, $03, 0 | PRIORITY - dsprite 2, 1, 9, 0, $03, 0 | PRIORITY - -.PokeGroupPair: ; e0b8d - db 38 - dsprite 0, 0, -1, 7, $00, 0 | PRIORITY - dsprite 0, 0, 3, 0, $00, 0 | X_FLIP | PRIORITY - dsprite 1, 0, -1, 7, $01, 0 | PRIORITY - dsprite 1, 0, 3, 0, $01, 0 | X_FLIP | PRIORITY - dsprite 2, 0, -1, 7, $01, 0 | PRIORITY - dsprite 2, 0, 3, 0, $01, 0 | X_FLIP | PRIORITY - dsprite 3, 0, -1, 7, $01, 0 | PRIORITY - dsprite 3, 0, 1, 0, $03, 0 | PRIORITY - dsprite 3, 0, 3, 0, $03, 0 | PRIORITY - dsprite 4, 0, -1, 7, $01, 0 | PRIORITY - dsprite 4, 0, 1, 0, $03, 0 | PRIORITY - dsprite 4, 0, 3, 0, $03, 0 | PRIORITY - dsprite 5, 0, -1, 7, $01, 0 | PRIORITY - dsprite 5, 0, 1, 0, $03, 0 | PRIORITY - dsprite 5, 0, 3, 0, $03, 0 | PRIORITY - dsprite 6, 0, -1, 7, $01, 0 | PRIORITY - dsprite 6, 0, 1, 0, $03, 0 | PRIORITY - dsprite 6, 0, 3, 0, $03, 0 | PRIORITY - dsprite 7, 0, -1, 7, $01, 0 | PRIORITY - dsprite 7, 0, 1, 0, $03, 0 | PRIORITY - dsprite 7, 0, 3, 0, $03, 0 | PRIORITY - dsprite 8, 0, -1, 7, $01, 0 | PRIORITY - dsprite 8, 0, 1, 0, $03, 0 | PRIORITY - dsprite 8, 0, 3, 0, $03, 0 | PRIORITY - dsprite 9, 0, -1, 7, $01, 0 | PRIORITY - dsprite 9, 0, 1, 0, $03, 0 | PRIORITY - dsprite 9, 0, 3, 0, $03, 0 | PRIORITY - dsprite 10, 0, -1, 7, $01, 0 | PRIORITY - dsprite 10, 0, 1, 0, $03, 0 | PRIORITY - dsprite 10, 0, 3, 0, $03, 0 | PRIORITY - dsprite 11, 0, -1, 7, $01, 0 | PRIORITY - dsprite 11, 0, 1, 0, $03, 0 | PRIORITY - dsprite 11, 0, 3, 0, $03, 0 | PRIORITY - dsprite 11, 1, -1, 7, $00, 0 | Y_FLIP | PRIORITY - dsprite 11, 1, 0, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 11, 1, 1, 0, $03, 0 | Y_FLIP | PRIORITY - dsprite 11, 1, 2, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 11, 1, 3, 0, $03, 0 | X_FLIP | Y_FLIP | PRIORITY - -.Impossible: ; e0c26 - db 4 - dsprite 0, 0, 0, 0, $00, 0 | PRIORITY - dsprite 0, 0, 1, 0, $00, 0 | X_FLIP | PRIORITY - dsprite 1, 0, 0, 0, $00, 0 | Y_FLIP | PRIORITY - dsprite 1, 0, 1, 0, $00, 0 | X_FLIP | Y_FLIP | PRIORITY -; e0c37 - -CardFlip_InitAttrPals: ; e0c37 (38:4c37) - ld a, [hCGB] - and a - ret z - - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - xor a - call ByteFill - - hlcoord 12, 1, wAttrMap - lb bc, 2, 2 - ld a, $1 - call CardFlip_FillBox - - hlcoord 14, 1, wAttrMap - lb bc, 2, 2 - ld a, $2 - call CardFlip_FillBox - - hlcoord 16, 1, wAttrMap - lb bc, 2, 2 - ld a, $3 - call CardFlip_FillBox - - hlcoord 18, 1, wAttrMap - lb bc, 2, 2 - ld a, $4 - call CardFlip_FillBox - - hlcoord 9, 0, wAttrMap - lb bc, 12, 1 - ld a, $1 - call CardFlip_FillBox - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, .palettes - ld de, wBGPals1 - ld bc, 9 palettes - call CopyBytes - pop af - ld [rSVBK], a - ret -; e0c93 (38:4c93) - -.palettes ; e0c93 -INCLUDE "gfx/card_flip/card_flip.pal" -; e0cdb - -CardFlipLZ03: ; e0cdb -INCBIN "gfx/card_flip/card_flip_3.2bpp.lz" - -CardFlipOffButtonGFX: ; e0cf6 -INCBIN "gfx/card_flip/off.2bpp" - -CardFlipOnButtonGFX: ; e0d06 -INCBIN "gfx/card_flip/on.2bpp" - -CardFlipLZ01: ; e0d16 -INCBIN "gfx/card_flip/card_flip_1.2bpp.lz" - -CardFlipLZ02: ; e0ea8 -INCBIN "gfx/card_flip/card_flip_2.2bpp.lz" - -CardFlipTilemap: ; e110c -INCBIN "gfx/card_flip/card_flip.tilemap" -; e1190 diff --git a/engine/caught_data.asm b/engine/caught_data.asm deleted file mode 100644 index 3bfacf539..000000000 --- a/engine/caught_data.asm +++ /dev/null @@ -1,247 +0,0 @@ -CheckPartyFullAfterContest: ; 4d9e5 - ld a, [wContestMon] - and a - jp z, .DidntCatchAnything - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call GetBaseData - ld hl, wPartyCount - ld a, [hl] - cp PARTY_LENGTH - jp nc, .TryAddToBox - inc a - ld [hl], a - ld c, a - ld b, 0 - add hl, bc - ld a, [wContestMon] - ld [hli], a - ld [wCurSpecies], a - ld a, -1 - ld [hl], a - ld hl, wPartyMon1Species - ld a, [wPartyCount] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - ld hl, wContestMon - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - ld a, [wPartyCount] - dec a - ld hl, wPartyMonOT - call SkipNames - ld d, h - ld e, l - ld hl, wPlayerName - call CopyBytes - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - ld hl, wStringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - call GiveANickname_YesNo - jr c, .Party_SkipNickname - ld a, [wPartyCount] - dec a - ld [wCurPartyMon], a - xor a - ld [wMonType], a - ld de, wMonOrItemNameBuffer - callfar InitNickname - -.Party_SkipNickname: - ld a, [wPartyCount] - dec a - ld hl, wPartyMonNicknames - call SkipNames - ld d, h - ld e, l - ld hl, wMonOrItemNameBuffer - call CopyBytes - ld a, [wPartyCount] - dec a - ld hl, wPartyMon1Level - call GetPartyLocation - ld a, [hl] - ld [wCurPartyLevel], a - call SetCaughtData - ld a, [wPartyCount] - dec a - ld hl, wPartyMon1CaughtLocation - call GetPartyLocation - ld a, [hl] - and CAUGHT_GENDER_MASK - ld b, NATIONAL_PARK - or b - ld [hl], a - xor a - ld [wContestMon], a - and a ; BUGCONTEST_CAUGHT_MON - ld [wScriptVar], a - ret - -.TryAddToBox: ; 4daa3 - ld a, BANK(sBoxCount) - call GetSRAMBank - ld hl, sBoxCount - ld a, [hl] - cp MONS_PER_BOX - call CloseSRAM - jr nc, .BoxFull - xor a - ld [wCurPartyMon], a - ld hl, wContestMon - ld de, wBufferMon - ld bc, BOXMON_STRUCT_LENGTH - call CopyBytes - ld hl, wPlayerName - ld de, wBufferMonOT - ld bc, NAME_LENGTH - call CopyBytes - callfar InsertPokemonIntoBox - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - call GiveANickname_YesNo - ld hl, wStringBuffer1 - jr c, .Box_SkipNickname - ld a, BOXMON - ld [wMonType], a - ld de, wMonOrItemNameBuffer - callfar InitNickname - ld hl, wMonOrItemNameBuffer - -.Box_SkipNickname: - ld a, BANK(sBoxMonNicknames) - call GetSRAMBank - ld de, sBoxMonNicknames - ld bc, MON_NAME_LENGTH - call CopyBytes - call CloseSRAM - -.BoxFull: - ld a, BANK(sBoxMon1Level) - call GetSRAMBank - ld a, [sBoxMon1Level] - ld [wCurPartyLevel], a - call CloseSRAM - call SetBoxMonCaughtData - ld a, BANK(sBoxMon1CaughtLocation) - call GetSRAMBank - ld hl, sBoxMon1CaughtLocation - ld a, [hl] - and CAUGHT_GENDER_MASK - ld b, NATIONAL_PARK - or b - ld [hl], a - call CloseSRAM - xor a - ld [wContestMon], a - ld a, BUGCONTEST_BOXED_MON - ld [wScriptVar], a - ret - -.DidntCatchAnything: ; 4db35 - ld a, BUGCONTEST_NO_CATCH - ld [wScriptVar], a - ret - -GiveANickname_YesNo: ; 4db3b - ld hl, TextJump_GiveANickname - call PrintText - jp YesNoBox - -TextJump_GiveANickname: ; 0x4db44 - ; Give a nickname to the @ you received? - text_jump UnknownText_0x1c12fc - db "@" - -SetCaughtData: ; 4db49 - ld a, [wPartyCount] - dec a - ld hl, wPartyMon1CaughtLevel - call GetPartyLocation -SetBoxmonOrEggmonCaughtData: ; 4db53 - ld a, [wTimeOfDay] - inc a - rrca - rrca - ld b, a - ld a, [wCurPartyLevel] - or b - ld [hli], a - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - cp MAP_POKECENTER_2F - jr nz, .NotPokecenter2F - ld a, b - cp GROUP_POKECENTER_2F - jr nz, .NotPokecenter2F - - ld a, [wBackupMapGroup] - ld b, a - ld a, [wBackupMapNumber] - ld c, a - -.NotPokecenter2F: - call GetWorldMapLocation - ld b, a - ld a, [wPlayerGender] - rrca ; shift bit 0 (PLAYERGENDER_FEMALE_F) to bit 7 (CAUGHT_GENDER_MASK) - or b - ld [hl], a - ret - -SetBoxMonCaughtData: ; 4db83 - ld a, BANK(sBoxMon1CaughtLevel) - call GetSRAMBank - ld hl, sBoxMon1CaughtLevel - call SetBoxmonOrEggmonCaughtData - call CloseSRAM - ret - -SetGiftBoxMonCaughtData: ; 4db92 - push bc - ld a, BANK(sBoxMon1CaughtLevel) - call GetSRAMBank - ld hl, sBoxMon1CaughtLevel - pop bc - call SetGiftMonCaughtData - call CloseSRAM - ret - -SetGiftPartyMonCaughtData: ; 4dba3 - ld a, [wPartyCount] - dec a - ld hl, wPartyMon1CaughtLevel - push bc - call GetPartyLocation - pop bc -SetGiftMonCaughtData: ; 4dbaf - xor a - ld [hli], a - ld a, GIFT_LOCATION - rrc b - or b - ld [hl], a - ret - -SetEggMonCaughtData: ; 4dbb8 (13:5bb8) - ld a, [wCurPartyMon] - ld hl, wPartyMon1CaughtLevel - call GetPartyLocation - ld a, [wCurPartyLevel] - push af - ld a, CAUGHT_EGG_LEVEL - ld [wCurPartyLevel], a - call SetBoxmonOrEggmonCaughtData - pop af - ld [wCurPartyLevel], a - ret diff --git a/engine/cgb_layouts.asm b/engine/cgb_layouts.asm deleted file mode 100644 index b36dceeb6..000000000 --- a/engine/cgb_layouts.asm +++ /dev/null @@ -1,1033 +0,0 @@ -; Replaces the functionality of sgb.asm to work with CGB hardware. - -CheckCGB: ; 8d55 - ld a, [hCGB] - and a - ret -; 8d59 - -LoadSGBLayoutCGB: ; 8d59 - ld a, b - cp SCGB_RAM - jr nz, .not_ram - ld a, [wSGBPredef] -.not_ram - cp SCGB_PARTY_MENU_HP_PALS - jp z, CGB_ApplyPartyMenuHPPals - call ResetBGPals - ld l, a - ld h, 0 - add hl, hl - ld de, .dw - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .ReturnFromJumpTable - push de - jp hl -; 8d79 - -.ReturnFromJumpTable: ; 8d79 - ret -; 8d7a - -.dw ; 8d7a - dw _CGB_BattleGrayscale - dw _CGB_BattleColors - dw _CGB_PokegearPals - dw _CGB_StatsScreenHPPals - dw _CGB_Pokedex - dw _CGB_SlotMachine - dw _CGB06 - dw _CGB_GSIntro - dw _CGB_Diploma - dw _CGB_MapPals - dw _CGB_PartyMenu - dw _CGB_Evolution - dw _CGB_GSTitleScreen - dw _CGB0d - dw _CGB_MoveList - dw _CGB0f - dw _CGB_PokedexSearchOption - dw _CGB11 - dw _CGB_Pokepic - dw _CGB13 - dw _CGB_PackPals - dw _CGB_TrainerCard - dw _CGB_PokedexUnownMode - dw _CGB_BillsPC - dw _CGB_UnownPuzzle - dw _CGB_GamefreakLogo - dw _CGB_PlayerOrMonFrontpicPals - dw _CGB_TradeTube - dw _CGB_TrainerOrMonFrontpicPals - dw _CGB_MysteryGift - dw _CGB1e -; 8db8 - -_CGB_BattleGrayscale: ; 8db8 - ld hl, PalPacket_BattleGrayscale + 1 - ld de, wBGPals1 - ld c, 4 - call CopyPalettes - ld hl, PalPacket_BattleGrayscale + 1 - ld de, wBGPals1 palette PAL_BATTLE_BG_EXP - ld c, 4 - call CopyPalettes - ld hl, PalPacket_BattleGrayscale + 1 - ld de, wOBPals1 - ld c, 2 - call CopyPalettes - jr _CGB_FinishBattleScreenLayout - -_CGB_BattleColors: ; 8ddb - ld de, wBGPals1 - call GetBattlemonBackpicPalettePointer - push hl - call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_PLAYER - call GetEnemyFrontpicPalettePointer - push hl - call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_ENEMY - ld a, [wEnemyHPPal] - ld l, a - ld h, $0 - add hl, hl - add hl, hl - ld bc, HPBarPals - add hl, bc - call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_ENEMY_HP - ld a, [wPlayerHPPal] - ld l, a - ld h, $0 - add hl, hl - add hl, hl - ld bc, HPBarPals - add hl, bc - call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_PLAYER_HP - ld hl, ExpBarPalette - call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_EXP - ld de, wOBPals1 - pop hl - call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_OB_ENEMY - pop hl - call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_OB_PLAYER - ld a, SCGB_BATTLE_COLORS - ld [wSGBPredef], a - call ApplyPals -_CGB_FinishBattleScreenLayout: ; 8e23 - call InitPartyMenuBGPal7 - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, PAL_BATTLE_BG_ENEMY_HP - call ByteFill - hlcoord 0, 4, wAttrMap - lb bc, 8, 10 - ld a, PAL_BATTLE_BG_PLAYER - call FillBoxCGB - hlcoord 10, 0, wAttrMap - lb bc, 7, 10 - ld a, PAL_BATTLE_BG_ENEMY - call FillBoxCGB - hlcoord 0, 0, wAttrMap - lb bc, 4, 10 - ld a, PAL_BATTLE_BG_ENEMY_HP - call FillBoxCGB - hlcoord 10, 7, wAttrMap - lb bc, 5, 10 - ld a, PAL_BATTLE_BG_PLAYER_HP - call FillBoxCGB - hlcoord 10, 11, wAttrMap - lb bc, 1, 9 - ld a, PAL_BATTLE_BG_EXP - call FillBoxCGB - hlcoord 0, 12, wAttrMap - ld bc, 6 * SCREEN_WIDTH - ld a, PAL_BATTLE_BG_TEXT - call ByteFill - ld hl, BattleObjectPals - ld de, wOBPals1 palette PAL_BATTLE_OB_GRAY - ld bc, 6 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - call ApplyAttrMap - ret -; 8e85 - - -InitPartyMenuBGPal7: ; 8e85 - farcall Function100dc0 -Mobile_InitPartyMenuBGPal7: ; 8e8b - ld hl, PartyMenuBGPalette - jr nc, .not_mobile - ld hl, PartyMenuBGMobilePalette -.not_mobile - ld de, wBGPals1 palette 7 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - ret -; 8e9f - -InitPartyMenuBGPal0: ; 8e9f - farcall Function100dc0 - ld hl, PartyMenuBGPalette - jr nc, .not_mobile - ld hl, PartyMenuBGMobilePalette -.not_mobile - ld de, wBGPals1 palette 0 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - ret -; 8eb9 - -_CGB_PokegearPals: ; 8eb9 - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .male - ld hl, FemalePokegearPals - jr .got_pals - -.male - ld hl, MalePokegearPals -.got_pals - ld de, wBGPals1 - ld bc, 6 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 8edb - -_CGB_StatsScreenHPPals: ; 8edb - ld de, wBGPals1 - ld a, [wCurHPPal] - ld l, a - ld h, $0 - add hl, hl - add hl, hl - ld bc, HPBarPals - add hl, bc - call LoadPalette_White_Col1_Col2_Black ; hp palette - ld a, [wCurPartySpecies] - ld bc, wTempMonDVs - call GetPlayerOrMonPalettePointer - call LoadPalette_White_Col1_Col2_Black ; mon palette - ld hl, ExpBarPalette - call LoadPalette_White_Col1_Col2_Black ; exp palette - ld hl, StatsScreenPagePals - ld de, wBGPals1 palette 3 - ld bc, 3 palettes ; pink, green, and blue page palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - call WipeAttrMap - - hlcoord 0, 0, wAttrMap - lb bc, 8, SCREEN_WIDTH - ld a, $1 ; mon palette - call FillBoxCGB - - hlcoord 10, 16, wAttrMap - ld bc, 10 - ld a, $2 ; exp palette - call ByteFill - - hlcoord 13, 5, wAttrMap - lb bc, 2, 2 - ld a, $3 ; pink page palette - call FillBoxCGB - - hlcoord 15, 5, wAttrMap - lb bc, 2, 2 - ld a, $4 ; green page palette - call FillBoxCGB - - hlcoord 17, 5, wAttrMap - lb bc, 2, 2 - ld a, $5 ; blue page palette - call FillBoxCGB - - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 8f52 - -StatsScreenPagePals: ; 8f52 -INCLUDE "gfx/stats/pages.pal" -; 8f6a - -StatsScreenPals: ; 8f6a -INCLUDE "gfx/stats/stats.pal" -; 8f70 - -_CGB_Pokedex: ; 8f70 - ld de, wBGPals1 - ld a, PREDEFPAL_POKEDEX - call GetPredefPal - call LoadHLPaletteIntoDE ; dex interface palette - ld a, [wCurPartySpecies] - cp $ff - jr nz, .is_pokemon - ld hl, .PokedexQuestionMarkPalette - call LoadHLPaletteIntoDE ; green question mark palette - jr .got_palette - -.is_pokemon - call GetMonPalettePointer_ - call LoadPalette_White_Col1_Col2_Black ; mon palette -.got_palette - call WipeAttrMap - hlcoord 1, 1, wAttrMap - lb bc, 7, 7 - ld a, $1 ; green question mark palette - call FillBoxCGB - call InitPartyMenuOBPals - ld hl, .PokedexCursorPalette - ld de, wOBPals1 palette 7 ; green cursor palette - ld bc, 1 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 8fba - -.PokedexQuestionMarkPalette: ; 8fba -INCLUDE "gfx/pokedex/question_mark.pal" -; 8fc2 - -.PokedexCursorPalette: ; 8fc2 -INCLUDE "gfx/pokedex/cursor.pal" -; 8fca - -_CGB_BillsPC: ; 8fca - ld de, wBGPals1 - ld a, PREDEFPAL_POKEDEX - call GetPredefPal - call LoadHLPaletteIntoDE - ld a, [wCurPartySpecies] - cp $ff - jr nz, .GetMonPalette - ld hl, .BillsPCOrangePalette - call LoadHLPaletteIntoDE - jr .Resume - -.GetMonPalette: - ld bc, wTempMonDVs - call GetPlayerOrMonPalettePointer - call LoadPalette_White_Col1_Col2_Black -.Resume: - call WipeAttrMap - hlcoord 1, 4, wAttrMap - lb bc, 7, 7 - ld a, $1 - call FillBoxCGB - call InitPartyMenuOBPals - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 9009 - -.Function9009: ; 9009 - ld hl, .BillsPCOrangePalette - call LoadHLPaletteIntoDE - jr .asm_901a - -.unused - ld bc, wTempMonDVs - call GetPlayerOrMonPalettePointer - call LoadPalette_White_Col1_Col2_Black -.asm_901a - call WipeAttrMap - hlcoord 1, 1, wAttrMap - lb bc, 7, 7 - ld a, $1 - call FillBoxCGB - call InitPartyMenuOBPals - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 9036 - -.BillsPCOrangePalette: ; 9036 -INCLUDE "gfx/pc/orange.pal" -; 903e - -_CGB_PokedexUnownMode: ; 903e - ld de, wBGPals1 - ld a, PREDEFPAL_POKEDEX - call GetPredefPal - call LoadHLPaletteIntoDE - ld a, [wCurPartySpecies] - call GetMonPalettePointer_ - call LoadPalette_White_Col1_Col2_Black - call WipeAttrMap - hlcoord 7, 5, wAttrMap - lb bc, 7, 7 - ld a, $1 - call FillBoxCGB - call InitPartyMenuOBPals - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 906e - -_CGB_SlotMachine: ; 906e - ld hl, SlotMachinePals - ld de, wBGPals1 - ld bc, 16 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - call WipeAttrMap - hlcoord 0, 2, wAttrMap - lb bc, 10, 3 - ld a, $2 - call FillBoxCGB - hlcoord 17, 2, wAttrMap - lb bc, 10, 3 - ld a, $2 - call FillBoxCGB - hlcoord 0, 4, wAttrMap - lb bc, 6, 3 - ld a, $3 - call FillBoxCGB - hlcoord 17, 4, wAttrMap - lb bc, 6, 3 - ld a, $3 - call FillBoxCGB - hlcoord 0, 6, wAttrMap - lb bc, 2, 3 - ld a, $4 - call FillBoxCGB - hlcoord 17, 6, wAttrMap - lb bc, 2, 3 - ld a, $4 - call FillBoxCGB - hlcoord 4, 2, wAttrMap - lb bc, 2, 12 - ld a, $1 - call FillBoxCGB - hlcoord 3, 2, wAttrMap - lb bc, 10, 1 - ld a, $1 - call FillBoxCGB - hlcoord 16, 2, wAttrMap - lb bc, 10, 1 - ld a, $1 - call FillBoxCGB - hlcoord 0, 12, wAttrMap - ld bc, $78 - ld a, $7 - call ByteFill - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 90f8 - -_CGB06: ; 90f8 - ld hl, PalPacket_SCGB_06 + 1 - call CopyFourPalettes - call WipeAttrMap - ld de, wOBPals1 - ld a, PREDEFPAL_PACK - call GetPredefPal - call LoadHLPaletteIntoDE - hlcoord 0, 6, wAttrMap - lb bc, 12, SCREEN_WIDTH - ld a, $1 - call FillBoxCGB - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 9122 - -_CGB_GSIntro: ; 9122 - ld b, 0 - ld hl, .Jumptable - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 912d - -.Jumptable: ; 912d - dw .ShellderLaprasScene - dw .JigglypuffPikachuScene - dw .StartersCharizardScene -; 9133 - -.ShellderLaprasScene: ; 9133 - ld hl, .ShellderLaprasBGPalette - ld de, wBGPals1 - call LoadHLPaletteIntoDE - ld hl, .ShellderLaprasOBPals - ld de, wOBPals1 - ld bc, 2 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - call WipeAttrMap - ret -; 914e - -.ShellderLaprasBGPalette: ; 914e - RGB 19, 31, 19 - RGB 18, 23, 31 - RGB 11, 21, 28 - RGB 04, 16, 24 - -.ShellderLaprasOBPals: ; 9156 - RGB 29, 29, 29 - RGB 20, 19, 20 - RGB 19, 06, 04 - RGB 03, 04, 06 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 00, 00 - RGB 03, 04, 06 -; 9166 - -.JigglypuffPikachuScene: ; 9166 - ld de, wBGPals1 - ld a, PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_BG - call GetPredefPal - call LoadHLPaletteIntoDE - - ld de, wOBPals1 - ld a, PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_OB - call GetPredefPal - call LoadHLPaletteIntoDE - call WipeAttrMap - ret -; 9180 - -.StartersCharizardScene: ; 9180 - ld hl, PalPacket_Pack + 1 - call CopyFourPalettes - ld de, wOBPals1 - ld a, PREDEFPAL_GS_INTRO_STARTERS_TRANSITION - call GetPredefPal - call LoadHLPaletteIntoDE - call WipeAttrMap - ret -; 9195 - -_CGB11: ; 9195 - ld hl, Palettes_SCGB_11 - ld de, wBGPals1 - ld bc, 5 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - call ApplyPals - call WipeAttrMap - call ApplyAttrMap - ret -; 91ad - -_CGB_Diploma: ; 91ad - ld hl, DiplomaPalettes - ld de, wBGPals1 - ld bc, 16 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - - ld hl, PalPacket_Diploma + 1 - call CopyFourPalettes - call WipeAttrMap - call ApplyAttrMap - ret -; 91c8 - -_CGB_MapPals: ; 91c8 - call LoadMapPals - ld a, SCGB_MAPPALS - ld [wSGBPredef], a - ret -; 91d1 - -_CGB_PartyMenu: ; 91d1 - ld hl, PalPacket_PartyMenu + 1 - call CopyFourPalettes - call InitPartyMenuBGPal0 - call InitPartyMenuBGPal7 - call InitPartyMenuOBPals - call ApplyAttrMap - ret -; 91e4 - -_CGB_Evolution: ; 91e4 - ld de, wBGPals1 - ld a, c - and a - jr z, .pokemon - ld a, PREDEFPAL_BLACKOUT - call GetPredefPal - call LoadHLPaletteIntoDE - jr .got_palette - -.pokemon - ld hl, wPartyMon1DVs - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld c, l - ld b, h - ld a, [wPlayerHPPal] - call GetPlayerOrMonPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld hl, BattleObjectPals - ld de, wOBPals1 palette PAL_BATTLE_OB_GRAY - ld bc, 6 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - -.got_palette - call WipeAttrMap - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 9228 - -_CGB_GSTitleScreen: ; 9228 - ld hl, UnusedGSTitleBGPals - ld de, wBGPals1 - ld bc, 5 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - ld hl, UnusedGSTitleOBPals - ld de, wOBPals1 - ld bc, 2 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - ld a, SCGB_DIPLOMA - ld [wSGBPredef], a - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 9251 - -_CGB0d: ; 9251 - ld hl, PalPacket_Diploma + 1 - call CopyFourPalettes - call WipeAttrMap - call ApplyAttrMap - ret -; 925e - -_CGB_UnownPuzzle: ; 925e - ld hl, PalPacket_UnownPuzzle + 1 - call CopyFourPalettes - ld de, wOBPals1 - ld a, PREDEFPAL_UNOWN_PUZZLE - call GetPredefPal - call LoadHLPaletteIntoDE - ld a, [rSVBK] - push af - ld a, BANK(wOBPals1) - ld [rSVBK], a - ld hl, wOBPals1 - ld a, LOW(palred 31 + palgreen 0 + palblue 0) - ld [hli], a - ld a, HIGH(palred 31 + palgreen 0 + palblue 0) - ld [hl], a - pop af - ld [rSVBK], a - call WipeAttrMap - call ApplyAttrMap - ret -; 9289 - -_CGB_TrainerCard: ; 9289 - ld de, wBGPals1 - xor a ; CHRIS - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, FALKNER ; KRIS - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, BUGSY - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, WHITNEY - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, MORTY - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, CHUCK - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, JASMINE - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, PRYCE - call GetTrainerPalettePointer - call LoadPalette_White_Col1_Col2_Black - ld a, PREDEFPAL_CGB_BADGE - call GetPredefPal - call LoadHLPaletteIntoDE - - ; fill screen with opposite-gender palette for the card border - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, [wPlayerGender] - and a - ld a, $1 ; kris - jr z, .got_gender - ld a, $0 ; chris -.got_gender - call ByteFill - ; fill trainer sprite area with same-gender palette - hlcoord 14, 1, wAttrMap - lb bc, 7, 5 - ld a, [wPlayerGender] - and a - ld a, $0 ; chris - jr z, .got_gender2 - ld a, $1 ; kris -.got_gender2 - call FillBoxCGB - ; top-right corner still uses the border's palette - hlcoord 18, 1, wAttrMap - ld [hl], $1 - hlcoord 2, 11, wAttrMap - lb bc, 2, 4 - ld a, $1 ; falkner - call FillBoxCGB - hlcoord 6, 11, wAttrMap - lb bc, 2, 4 - ld a, $2 ; bugsy - call FillBoxCGB - hlcoord 10, 11, wAttrMap - lb bc, 2, 4 - ld a, $3 ; whitney - call FillBoxCGB - hlcoord 14, 11, wAttrMap - lb bc, 2, 4 - ld a, $4 ; morty - call FillBoxCGB - hlcoord 2, 14, wAttrMap - lb bc, 2, 4 - ld a, $5 ; chuck - call FillBoxCGB - hlcoord 6, 14, wAttrMap - lb bc, 2, 4 - ld a, $6 ; jasmine - call FillBoxCGB - hlcoord 10, 14, wAttrMap - lb bc, 2, 4 - ld a, $7 ; pryce - call FillBoxCGB - ; clair uses kris's palette - ld a, [wPlayerGender] - and a - push af - jr z, .got_gender3 - hlcoord 14, 14, wAttrMap - lb bc, 2, 4 - ld a, $1 - call FillBoxCGB -.got_gender3 - pop af - ld c, $0 - jr nz, .got_gender4 - inc c -.got_gender4 - ld a, c - hlcoord 18, 1, wAttrMap - ld [hl], a - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 9373 - -_CGB_MoveList: ; 9373 - ld de, wBGPals1 - ld a, PREDEFPAL_GOLDENROD - call GetPredefPal - call LoadHLPaletteIntoDE - ld a, [wPlayerHPPal] - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld bc, HPBarPals - add hl, bc - call LoadPalette_White_Col1_Col2_Black - call WipeAttrMap - hlcoord 11, 1, wAttrMap - lb bc, 2, 9 - ld a, $1 - call FillBoxCGB - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 93a6 - -_CGB0f: ; 93a6 - ld hl, PalPacket_SCGB_0F + 1 - call CopyFourPalettes - call WipeAttrMap - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 93ba - -_CGB_PokedexSearchOption: ; 93ba - ld de, wBGPals1 - ld a, PREDEFPAL_POKEDEX - call GetPredefPal - call LoadHLPaletteIntoDE - call WipeAttrMap - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 93d3 - -_CGB_PackPals: ; 93d3 -; pack pals - ld a, [wBattleType] - cp BATTLETYPE_TUTORIAL - jr z, .tutorial_male - - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .tutorial_male - - ld hl, .KrisPackPals - jr .got_gender - -.tutorial_male - ld hl, .ChrisPackPals - -.got_gender - ld de, wBGPals1 - ld bc, 8 palettes ; 6 palettes? - ld a, BANK(wBGPals1) - call FarCopyWRAM - call WipeAttrMap - hlcoord 0, 0, wAttrMap - lb bc, 1, 10 - ld a, $1 - call FillBoxCGB - hlcoord 10, 0, wAttrMap - lb bc, 1, 10 - ld a, $2 - call FillBoxCGB - hlcoord 7, 2, wAttrMap - lb bc, 9, 1 - ld a, $3 - call FillBoxCGB - hlcoord 0, 7, wAttrMap - lb bc, 3, 5 - ld a, $4 - call FillBoxCGB - hlcoord 0, 3, wAttrMap - lb bc, 3, 5 - ld a, $5 - call FillBoxCGB - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 9439 - -.ChrisPackPals: ; 9439 -INCLUDE "gfx/pack/pack.pal" -; 9469 - -.KrisPackPals: ; 9469 -INCLUDE "gfx/pack/pack_f.pal" -; 9499 - -_CGB_Pokepic: ; 9499 - call _CGB_MapPals - ld de, SCREEN_WIDTH - hlcoord 0, 0, wAttrMap - ld a, [wMenuBorderTopCoord] -.loop - and a - jr z, .found_top - dec a - add hl, de - jr .loop - -.found_top - ld a, [wMenuBorderLeftCoord] - ld e, a - ld d, $0 - add hl, de - ld a, [wMenuBorderTopCoord] - ld b, a - ld a, [wMenuBorderBottomCoord] - inc a - sub b - ld b, a - ld a, [wMenuBorderLeftCoord] - ld c, a - ld a, [wMenuBorderRightCoord] - sub c - inc a - ld c, a - ld a, $0 - call FillBoxCGB - call ApplyAttrMap - ret -; 94d0 - -_CGB13: ; 94d0 - ld hl, PalPacket_SCGB_13 + 1 - call CopyFourPalettes - call WipeAttrMap - hlcoord 0, 4, wAttrMap - lb bc, 10, SCREEN_WIDTH - ld a, $2 - call FillBoxCGB - hlcoord 0, 6, wAttrMap - lb bc, 6, SCREEN_WIDTH - ld a, $1 - call FillBoxCGB - call ApplyAttrMap - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 94fa - -_CGB_GamefreakLogo: ; 94fa - ld de, wBGPals1 - ld a, PREDEFPAL_GAMEFREAK_LOGO - call GetPredefPal - call LoadHLPaletteIntoDE - ld hl, .Palette - ld de, wOBPals1 - call LoadHLPaletteIntoDE - ld hl, .Palette - ld de, wOBPals1 palette 1 - call LoadHLPaletteIntoDE - call WipeAttrMap - call ApplyAttrMap - call ApplyPals - ret -; 9521 - -.Palette: ; 9521 -INCLUDE "gfx/splash/logo.pal" -; 9529 - -_CGB_PlayerOrMonFrontpicPals: ; 9529 - ld de, wBGPals1 - ld a, [wCurPartySpecies] - ld bc, wTempMonDVs - call GetPlayerOrMonPalettePointer - call LoadPalette_White_Col1_Col2_Black - call WipeAttrMap - call ApplyAttrMap - call ApplyPals - ret -; 9542 - -_CGB1e: ; 9542 - ld de, wBGPals1 - ld a, [wCurPartySpecies] - call GetMonPalettePointer_ - call LoadPalette_White_Col1_Col2_Black - call WipeAttrMap - call ApplyAttrMap - ret -; 9555 - -_CGB_TradeTube: ; 9555 - ld hl, PalPacket_TradeTube + 1 - call CopyFourPalettes - ld hl, PartyMenuOBPals - ld de, wOBPals1 - ld bc, 1 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - ld de, wOBPals1 palette 7 - ld a, PREDEFPAL_TRADE_TUBE - call GetPredefPal - call LoadHLPaletteIntoDE - call WipeAttrMap - ret -; 9578 - -_CGB_TrainerOrMonFrontpicPals: ; 9578 - ld de, wBGPals1 - ld a, [wCurPartySpecies] - ld bc, wTempMonDVs - call GetFrontpicPalettePointer - call LoadPalette_White_Col1_Col2_Black - call WipeAttrMap - call ApplyAttrMap - call ApplyPals - ret -; 9591 - -_CGB_MysteryGift: ; 9591 - ld hl, .Palettes - ld de, wBGPals1 - ld bc, 2 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - call ApplyPals - call WipeAttrMap - hlcoord 3, 7, wAttrMap - lb bc, 8, 14 - ld a, $1 - call FillBoxCGB - hlcoord 1, 5, wAttrMap - lb bc, 1, 18 - ld a, $1 - call FillBoxCGB - hlcoord 1, 16, wAttrMap - lb bc, 1, 18 - ld a, $1 - call FillBoxCGB - hlcoord 0, 0, wAttrMap - lb bc, 17, 2 - ld a, $1 - call FillBoxCGB - hlcoord 18, 5, wAttrMap - lb bc, 12, 1 - ld a, $1 - call FillBoxCGB - call ApplyAttrMap - ret -; 95e0 - -.Palettes: ; 95e0 -INCLUDE "gfx/mystery_gift/mystery_gift.pal" -; 95f0 diff --git a/engine/clock_reset.asm b/engine/clock_reset.asm deleted file mode 100755 index c05129349..000000000 --- a/engine/clock_reset.asm +++ /dev/null @@ -1,254 +0,0 @@ - -ResetClock_GetWraparoundTime: ; 20000 (8:4000) - push hl - dec a - ld e, a - ld d, 0 - ld hl, .WrapAroundTimes -rept 4 - add hl, de -endr - ld e, [hl] - inc hl - ld d, [hl] - inc hl - ld b, [hl] - inc hl - ld c, [hl] - pop hl - ret -; 20015 (8:4015) - -.WrapAroundTimes: ; 20015 - dw wBuffer4 - db 7, 4 - - dw wBuffer5 - db 24, 12 - - dw wBuffer6 - db 60, 15 -; 20021 - -RestartClock: ; 20021 (8:4021) -; If we're here, we had an RTC overflow. - ld hl, .Text_ClockTimeMayBeWrong - call PrintText - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call LoadStandardMenuHeader - call ClearTileMap - ld hl, .Text_SetWithControlPad - call PrintText - call .SetClock - call ExitMenu - pop bc - ld hl, wOptions - ld [hl], b - ld c, a - ret -; 20047 (8:4047) - -.Text_ClockTimeMayBeWrong: ; 0x20047 - ; The clock's time may be wrong. Please reset the time. - text_jump UnknownText_0x1c40e6 - db "@" -; 0x2004c - -.Text_SetWithControlPad: ; 0x2004c - ; Set with the Control Pad. Confirm: A Button Cancel: B Button - text_jump UnknownText_0x1c411c - db "@" -; 0x20051 - -.SetClock: ; 20051 (8:4051) - ld a, 1 - ld [wBuffer1], a ; which digit - ld [wBuffer2], a - ld a, 8 - ld [wBuffer3], a - call UpdateTime - call GetWeekday - ld [wBuffer4], a - ld a, [hHours] - ld [wBuffer5], a - ld a, [hMinutes] - ld [wBuffer6], a - -.loop - call .joy_loop - jr nc, .loop - and a - ret nz - call .PrintTime - ld hl, .Text_IsThisOK - call PrintText - call YesNoBox - jr c, .cancel - ld a, [wBuffer4] - ld [wStringBuffer2], a - ld a, [wBuffer5] - ld [wStringBuffer2 + 1], a - ld a, [wBuffer6] - ld [wStringBuffer2 + 2], a - xor a - ld [wStringBuffer2 + 3], a - call InitTime - call .PrintTime - ld hl, .Text_ClockReset - call PrintText - call WaitPressAorB_BlinkCursor - xor a - ret - -.cancel - ld a, $1 - ret -; 200b0 (8:40b0) - -.Text_IsThisOK: ; 0x200b0 - ; Is this OK? - text_jump UnknownText_0x1c415b - db "@" -; 0x200b5 - -.Text_ClockReset: ; 0x200b5 - ; The clock has been reset. - text_jump UnknownText_0x1c4168 - db "@" -; 0x200ba - -.joy_loop - call JoyTextDelay_ForcehJoyDown - ld c, a - push af - call .PrintTime - pop af - bit 0, a - jr nz, .press_A - bit 1, a - jr nz, .press_B - bit 6, a - jr nz, .pressed_up - bit 7, a - jr nz, .pressed_down - bit 5, a - jr nz, .pressed_left - bit 4, a - jr nz, .pressed_right - jr .joy_loop - -.press_A - ld a, $0 - scf - ret - -.press_B - ld a, $1 - scf - ret - -.pressed_up - ld a, [wBuffer1] - call ResetClock_GetWraparoundTime - ld a, [de] - inc a - ld [de], a - cp b - jr c, .done_scroll - ld a, $0 - ld [de], a - jr .done_scroll - -.pressed_down - ld a, [wBuffer1] - call ResetClock_GetWraparoundTime - ld a, [de] - dec a - ld [de], a - cp -1 - jr nz, .done_scroll - ld a, b - dec a - ld [de], a - jr .done_scroll - -.pressed_left - ld hl, wBuffer1 - dec [hl] - jr nz, .done_scroll - ld [hl], $3 - jr .done_scroll - -.pressed_right - ld hl, wBuffer1 - inc [hl] - ld a, [hl] - cp $4 - jr c, .done_scroll - ld [hl], $1 - -.done_scroll - xor a - ret - -.PrintTime: ; 2011f (8:411f) - hlcoord 0, 5 - ld b, 5 - ld c, 18 - call TextBox - decoord 1, 8 - ld a, [wBuffer4] - ld b, a - farcall PrintDayOfWeek - ld a, [wBuffer5] - ld b, a - ld a, [wBuffer6] - ld c, a - decoord 11, 8 - farcall PrintHoursMins - ld a, [wBuffer2] - lb de, " ", " " - call .PlaceChars - ld a, [wBuffer1] - lb de, "▲", "▼" - call .PlaceChars - ld a, [wBuffer1] - ld [wBuffer2], a - ret -; 20160 (8:4160) - -.unreferenced ; 20160 -; unused - ld a, [wBuffer3] - ld b, a - call Coord2Tile - ret -; 20168 - -.PlaceChars: ; 20168 (8:4168) - push de - call ResetClock_GetWraparoundTime - ld a, [wBuffer3] - dec a - ld b, a - call Coord2Tile - pop de - ld [hl], d - ld bc, 2 * SCREEN_WIDTH - add hl, bc - ld [hl], e - ret -; 2017c (8:417c) - -UnreferencedString_HourJP: ; 2017c -; unused - db "じ@" ; HR -; 2017e - -UnreferencedString_MinuteJP: ; 2017e -; unused - db "ふん@" ; MIN -; 20181 diff --git a/engine/color.asm b/engine/color.asm deleted file mode 100644 index b0bc653b0..000000000 --- a/engine/color.asm +++ /dev/null @@ -1,1356 +0,0 @@ -INCLUDE "engine/sgb_layouts.asm" - -SHINY_ATK_BIT EQU 5 -SHINY_DEF_VAL EQU 10 -SHINY_SPD_VAL EQU 10 -SHINY_SPC_VAL EQU 10 - -CheckShininess: -; Check if a mon is shiny by DVs at bc. -; Return carry if shiny. - - ld l, c - ld h, b - -; Attack - ld a, [hl] - and 1 << SHINY_ATK_BIT - jr z, .NotShiny - -; Defense - ld a, [hli] - and $f - cp SHINY_DEF_VAL - jr nz, .NotShiny - -; Speed - ld a, [hl] - and $f0 - cp SHINY_SPD_VAL << 4 - jr nz, .NotShiny - -; Special - ld a, [hl] - and $f - cp SHINY_SPC_VAL - jr nz, .NotShiny - -.Shiny: - scf - ret - -.NotShiny: - and a - ret - -Unused_CheckContestMon: -; Check a mon's DVs at hl in the bug catching contest. -; Return carry if its DVs are good enough to place in the contest. - -; Attack - ld a, [hl] - cp 10 << 4 - jr c, .Bad - -; Defense - ld a, [hli] - and $f - cp 10 - jr c, .Bad - -; Speed - ld a, [hl] - cp 10 << 4 - jr c, .Bad - -; Special - ld a, [hl] - and $f - cp 10 - jr c, .Bad - -.Good: - scf - ret - -.Bad: - and a - ret - -Unreferenced_Function8aa4: - push de - push bc - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - pop bc - pop de - ld a, c - ld [wSGBPals + 3], a - ld a, b - ld [wSGBPals + 4], a - ld a, e - ld [wSGBPals + 5], a - ld a, d - ld [wSGBPals + 6], a - ld hl, wSGBPals - call PushSGBPals_ - ld hl, BlkPacket_9a86 - call PushSGBPals_ - ret - -InitPartyMenuPalettes: - ld hl, PalPacket_PartyMenu + 1 - call CopyFourPalettes - call InitPartyMenuOBPals - call WipeAttrMap - ret - -; SGB layout for SCGB_PARTY_MENU_HP_PALS -SGB_ApplyPartyMenuHPPals: ; 8ade - ld hl, wHPPals - ld a, [wSGBPals] - ld e, a - ld d, $0 - add hl, de - ld e, l - ld d, h - ld a, [de] - and a - ld e, $5 - jr z, .okay - dec a - ld e, $a - jr z, .okay - ld e, $f -.okay - push de - ld hl, wSGBPals + 10 - ld bc, $6 - ld a, [wSGBPals] - call AddNTimes - pop de - ld [hl], e - ret - -Unreferenced_Function8b07: - call CheckCGB - ret z -; CGB only - ld hl, .BGPal - ld de, wBGPals1 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - - ld hl, .OBPal - ld de, wOBPals1 - ld bc, 1 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - - call ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret - -.BGPal: - RGB 31, 31, 31 - RGB 18, 23, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - -.OBPal: - RGB 31, 31, 31 - RGB 31, 31, 12 - RGB 08, 16, 28 - RGB 00, 00, 00 - -Unreferenced_Function8b3f: - call CheckCGB - ret nz - ld a, [hSGB] - and a - ret z - ld hl, BlkPacket_9a86 - jp PushSGBPals_ - -Unreferenced_Function8b4d: - call CheckCGB - jr nz, .cgb - ld a, [hSGB] - and a - ret z - ld hl, PalPacket_Function8b4d - jp PushSGBPals_ - -.cgb - ld de, wOBPals1 - ld a, PREDEFPAL_3B - call GetPredefPal - jp LoadHLPaletteIntoDE - -Unreferenced_Function8b67: - call CheckCGB - jr nz, .cgb - ld a, [hSGB] - and a - ret z - ld hl, PalPacket_Pack - jp PushSGBPals_ - -.cgb - ld de, wOBPals1 - ld a, PREDEFPAL_PACK - call GetPredefPal - jp LoadHLPaletteIntoDE - -Unreferenced_Function8b81: - call CheckCGB - jr nz, .cgb - ld a, [hSGB] - and a - ret z - ld a, c - push af - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - pop af - call GetMonPalettePointer_ - ld a, [hli] - ld [wSGBPals + 3], a - ld a, [hli] - ld [wSGBPals + 4], a - ld a, [hli] - ld [wSGBPals + 5], a - ld a, [hl] - ld [wSGBPals + 6], a - ld hl, wSGBPals - jp PushSGBPals_ - -.cgb - ld de, wOBPals1 - ld a, c - call GetMonPalettePointer_ - call LoadPalette_White_Col1_Col2_Black - ret - -LoadTrainerClassPaletteAsNthBGPal: - ld a, [wTrainerClass] - call GetTrainerPalettePointer - ld a, e - jr got_palette_pointer_8bd7 - -LoadMonPaletteAsNthBGPal: - ld a, [wCurPartySpecies] - call GetMonPalettePointer - ld a, e - bit 7, a - jr z, got_palette_pointer_8bd7 - and $7f - inc hl - inc hl - inc hl - inc hl - -got_palette_pointer_8bd7 - push hl - ld hl, wBGPals1 - ld de, 1 palettes -.loop - and a - jr z, .got_addr - add hl, de - dec a - jr .loop - -.got_addr - ld e, l - ld d, h - pop hl - call LoadPalette_White_Col1_Col2_Black - ret - -Unreferenced_Function8bec: - ld a, [hCGB] - and a - jr nz, .cgb - ld hl, wPlayerLightScreenCount - jp PushSGBPals_ - -.cgb - ld a, [wEnemyLightScreenCount] ; col - ld c, a - ld a, [wEnemyReflectCount] ; row - hlcoord 0, 0, wAttrMap - ld de, SCREEN_WIDTH -.loop - and a - jr z, .done - add hl, de - dec a - jr .loop - -.done - ld b, $0 - add hl, bc - lb bc, 6, 4 - ld a, [wEnemySafeguardCount] ; value - and $3 - call FillBoxCGB - call CopyTilemapAtOnce - ret - -ApplyMonOrTrainerPals: - call CheckCGB - ret z - ld a, e - and a - jr z, .get_trainer - ld a, [wCurPartySpecies] - call GetMonPalettePointer_ - jr .load_palettes - -.get_trainer - ld a, [wTrainerClass] - call GetTrainerPalettePointer - -.load_palettes - ld de, wBGPals1 - call LoadPalette_White_Col1_Col2_Black - call WipeAttrMap - call ApplyAttrMap - call ApplyPals - ret - -ApplyHPBarPals: - ld a, [wWhichHPBar] - and a - jr z, .Enemy - cp $1 - jr z, .Player - cp $2 - jr z, .PartyMenu - ret - -.Enemy: - ld de, wBGPals2 palette PAL_BATTLE_BG_ENEMY_HP color 1 - jr .okay - -.Player: - ld de, wBGPals2 palette PAL_BATTLE_BG_PLAYER_HP color 1 - -.okay - ld l, c - ld h, $0 - add hl, hl - add hl, hl - ld bc, HPBarPals - add hl, bc - ld bc, 4 - ld a, BANK(wBGPals2) - call FarCopyWRAM - ld a, $1 - ld [hCGBPalUpdate], a - ret - -.PartyMenu: - ld e, c - inc e - hlcoord 11, 1, wAttrMap - ld bc, 2 * SCREEN_WIDTH - ld a, [wCurPartyMon] -.loop - and a - jr z, .done - add hl, bc - dec a - jr .loop - -.done - lb bc, 2, 8 - ld a, e - call FillBoxCGB - ret - -LoadStatsScreenPals: - call CheckCGB - ret z - ld hl, StatsScreenPals - ld b, 0 - dec c - add hl, bc - add hl, bc - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld a, [hli] - ld [wBGPals1 palette 0], a - ld [wBGPals1 palette 2], a - ld a, [hl] - ld [wBGPals1 palette 0 + 1], a - ld [wBGPals1 palette 2 + 1], a - pop af - ld [rSVBK], a - call ApplyPals - ld a, $1 - ret - -LoadMailPalettes: - ld l, e - ld h, 0 - add hl, hl - add hl, hl - add hl, hl - ld de, .MailPals - add hl, de - call CheckCGB - jr nz, .cgb - push hl - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - pop hl - inc hl - inc hl - ld a, [hli] - ld [wSGBPals + 3], a - ld a, [hli] - ld [wSGBPals + 4], a - ld a, [hli] - ld [wSGBPals + 5], a - ld a, [hli] - ld [wSGBPals + 6], a - ld hl, wSGBPals - call PushSGBPals_ - ld hl, BlkPacket_9a86 - call PushSGBPals_ - ret - -.cgb - ld de, wBGPals1 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - call ApplyPals - call WipeAttrMap - call ApplyAttrMap - ret - -.MailPals: -INCLUDE "gfx/mail/mail.pal" - -INCLUDE "engine/cgb_layouts.asm" - -Unreferenced_Function95f0: - ld hl, .Palette - ld de, wBGPals1 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - call ApplyPals - call WipeAttrMap - call ApplyAttrMap - ret - -.Palette: - RGB 31, 31, 31 - RGB 09, 31, 31 - RGB 10, 12, 31 - RGB 00, 03, 19 - -CopyFourPalettes: - ld de, wBGPals1 - ld c, 4 - -CopyPalettes: -.loop - push bc - ld a, [hli] - push hl - call GetPredefPal - call LoadHLPaletteIntoDE - pop hl - inc hl - pop bc - dec c - jr nz, .loop - ret - -GetPredefPal: - ld l, a - ld h, $0 - add hl, hl - add hl, hl - add hl, hl - ld bc, PredefPals - add hl, bc - ret - -LoadHLPaletteIntoDE: - ld a, [rSVBK] - push af - ld a, BANK(wOBPals1) - ld [rSVBK], a - ld c, 1 palettes -.loop - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop - pop af - ld [rSVBK], a - ret - -LoadPalette_White_Col1_Col2_Black: - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld a, LOW(PALRGB_WHITE) - ld [de], a - inc de - ld a, HIGH(PALRGB_WHITE) - ld [de], a - inc de - - ld c, 2 * PAL_COLOR_SIZE -.loop - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop - - xor a - ld [de], a - inc de - ld [de], a - inc de - - pop af - ld [rSVBK], a - ret - -FillBoxCGB: -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret - -ResetBGPals: - push af - push bc - push de - push hl - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld hl, wBGPals1 - ld c, 1 palettes -.loop - ld a, $ff - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - xor a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - dec c - jr nz, .loop - - pop af - ld [rSVBK], a - - pop hl - pop de - pop bc - pop af - ret - -WipeAttrMap: - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - ret - -ApplyPals: - ld hl, wBGPals1 - ld de, wBGPals2 - ld bc, 16 palettes - ld a, BANK(wGBCPalettes) - call FarCopyWRAM - ret - -ApplyAttrMap: - ld a, [rLCDC] - bit rLCDC_ENABLE, a - jr z, .UpdateVBank1 - ld a, [hBGMapMode] - push af - ld a, $2 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - call DelayFrame - call DelayFrame - pop af - ld [hBGMapMode], a - ret - -.UpdateVBank1: - hlcoord 0, 0, wAttrMap - debgcoord 0, 0 - ld b, SCREEN_HEIGHT - ld a, $1 - ld [rVBK], a -.row - ld c, SCREEN_WIDTH -.col - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .col - ld a, BG_MAP_WIDTH - SCREEN_WIDTH - add e - jr nc, .okay - inc d -.okay - ld e, a - dec b - jr nz, .row - ld a, $0 - ld [rVBK], a - ret - -; CGB layout for SCGB_PARTY_MENU_HP_PALS -CGB_ApplyPartyMenuHPPals: ; 96f3 - ld hl, wHPPals - ld a, [wSGBPals] - ld e, a - ld d, $0 - add hl, de - ld e, l - ld d, h - ld a, [de] - inc a - ld e, a - hlcoord 11, 2, wAttrMap - ld bc, 2 * SCREEN_WIDTH - ld a, [wSGBPals] -.loop - and a - jr z, .done - add hl, bc - dec a - jr .loop -.done - lb bc, 2, 8 - ld a, e - call FillBoxCGB - ret - -InitPartyMenuOBPals: - ld hl, PartyMenuOBPals - ld de, wOBPals1 - ld bc, 2 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - ret - -GetBattlemonBackpicPalettePointer: - push de - farcall GetPartyMonDVs - ld c, l - ld b, h - ld a, [wTempBattleMonSpecies] - call GetPlayerOrMonPalettePointer - pop de - ret - -GetEnemyFrontpicPalettePointer: - push de - farcall GetEnemyMonDVs - ld c, l - ld b, h - ld a, [wTempEnemyMonSpecies] - call GetFrontpicPalettePointer - pop de - ret - -GetPlayerOrMonPalettePointer: - and a - jp nz, GetMonNormalOrShinyPalettePointer - ld a, [wPlayerSpriteSetupFlags] - bit PLAYERSPRITESETUP_FEMALE_TO_MALE_F, a - jr nz, .male - ld a, [wPlayerGender] - and a - jr z, .male - ld hl, KrisPalette - ret - -.male - ld hl, PlayerPalette - ret - -GetFrontpicPalettePointer: - and a - jp nz, GetMonNormalOrShinyPalettePointer - ld a, [wTrainerClass] - -GetTrainerPalettePointer: - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld bc, TrainerPalettes - add hl, bc - ret - -GetMonPalettePointer_: - call GetMonPalettePointer - ret - -Unreferenced_Function9779: - ret - call CheckCGB - ret z - ld hl, BattleObjectPals - ld a, $90 - ld [rOBPI], a - ld c, 6 palettes -.loop - ld a, [hli] - ld [rOBPD], a - dec c - jr nz, .loop - ld hl, BattleObjectPals - ld de, wOBPals1 palette 2 - ld bc, 2 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - ret - -BattleObjectPals: -INCLUDE "gfx/battle_anims/battle_anims.pal" - -Unreferenced_Function97cc: - call CheckCGB - ret z - ld a, $90 - ld [rOBPI], a - ld a, PREDEFPAL_TRADE_TUBE - call GetPredefPal - call .PushPalette - ld a, PREDEFPAL_RB_GREENMON - call GetPredefPal - call .PushPalette - ret - -.PushPalette: - ld c, 1 palettes -.loop - ld a, [hli] - ld [rOBPD], a - dec c - jr nz, .loop - ret - -GetMonPalettePointer: - ld l, a - ld h, $0 - add hl, hl - add hl, hl - add hl, hl - ld bc, PokemonPalettes - add hl, bc - ret - -GetMonNormalOrShinyPalettePointer: - push bc - call GetMonPalettePointer - pop bc - push hl - call CheckShininess - pop hl - ret nc -rept 4 - inc hl -endr - ret - -PushSGBPals_: - ld a, [wcfbe] - push af - set 7, a - ld [wcfbe], a - call PushSGBPals - pop af - ld [wcfbe], a - ret - -PushSGBPals: - ld a, [hl] - and $7 - ret z - ld b, a -.loop - push bc - xor a - ld [rJOYP], a - ld a, $30 - ld [rJOYP], a - ld b, $10 -.loop2 - ld e, $8 - ld a, [hli] - ld d, a -.loop3 - bit 0, d - ld a, $10 - jr nz, .okay - ld a, $20 -.okay - ld [rJOYP], a - ld a, $30 - ld [rJOYP], a - rr d - dec e - jr nz, .loop3 - dec b - jr nz, .loop2 - ld a, $20 - ld [rJOYP], a - ld a, $30 - ld [rJOYP], a - call SGBDelayCycles - pop bc - dec b - jr nz, .loop - ret - -InitSGBBorder: - call CheckCGB - ret nz -; SGB/DMG only - di - ld a, [wcfbe] - push af - set 7, a - ld [wcfbe], a - xor a - ld [rJOYP], a - ld [hSGB], a - call PushSGBBorderPalsAndWait - jr nc, .skip - ld a, $1 - ld [hSGB], a - call _InitSGBBorderPals - call SGBBorder_PushBGPals - call SGBDelayCycles - call SGB_ClearVRAM - call PushSGBBorder - call SGBDelayCycles - call SGB_ClearVRAM - ld hl, MaskEnCancelPacket - call PushSGBPals - -.skip - pop af - ld [wcfbe], a - ei - ret - -InitCGBPals:: - call CheckCGB - ret z -; CGB only - ld a, BANK(vTiles3) - ld [rVBK], a - ld hl, vTiles3 - ld bc, $200 tiles - xor a - call ByteFill - ld a, BANK(vTiles0) - ld [rVBK], a - ld a, 1 << rBGPI_AUTO_INCREMENT - ld [rBGPI], a - ld c, 4 * 8 -.bgpals_loop - ld a, LOW(PALRGB_WHITE) - ld [rBGPD], a - ld a, HIGH(PALRGB_WHITE) - ld [rBGPD], a - dec c - jr nz, .bgpals_loop - ld a, 1 << rOBPI_AUTO_INCREMENT - ld [rOBPI], a - ld c, 4 * 8 -.obpals_loop - ld a, LOW(PALRGB_WHITE) - ld [rOBPD], a - ld a, HIGH(PALRGB_WHITE) - ld [rOBPD], a - dec c - jr nz, .obpals_loop - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, wBGPals1 - call .LoadWhitePals - ld hl, wBGPals2 - call .LoadWhitePals - pop af - ld [rSVBK], a - ret - -.LoadWhitePals: - ld c, 4 * 16 -.loop - ld a, LOW(PALRGB_WHITE) - ld [hli], a - ld a, HIGH(PALRGB_WHITE) - ld [hli], a - dec c - jr nz, .loop - ret - -_InitSGBBorderPals: - ld hl, .PacketPointerTable - ld c, 9 -.loop - push bc - ld a, [hli] - push hl - ld h, [hl] - ld l, a - call PushSGBPals - pop hl - inc hl - pop bc - dec c - jr nz, .loop - ret - -.PacketPointerTable: - dw MaskEnFreezePacket - dw DataSndPacket1 - dw DataSndPacket2 - dw DataSndPacket3 - dw DataSndPacket4 - dw DataSndPacket5 - dw DataSndPacket6 - dw DataSndPacket7 - dw DataSndPacket8 - -Unreferenced_Function9911: - di - xor a - ld [rJOYP], a - ld hl, MaskEnFreezePacket - call PushSGBPals - call PushSGBBorder - call SGBDelayCycles - call SGB_ClearVRAM - ld hl, MaskEnCancelPacket - call PushSGBPals - ei - ret - -PushSGBBorder: - call .LoadSGBBorderPointers - push de - call SGBBorder_YetMorePalPushing - pop hl - call SGBBorder_MorePalPushing - ret - -.LoadSGBBorderPointers: - ld hl, SGBBorder - ld de, SGBBorderMap - ret - -SGB_ClearVRAM: - ld hl, VRAM_Begin - ld bc, VRAM_End - VRAM_Begin - xor a - call ByteFill - ret - -PushSGBBorderPalsAndWait: - ld hl, MltReq2Packet - call PushSGBPals - call SGBDelayCycles - ld a, [rJOYP] - and $3 - cp $3 - jr nz, .carry - ld a, $20 - ld [rJOYP], a - ld a, [rJOYP] - ld a, [rJOYP] - call SGBDelayCycles - call SGBDelayCycles - ld a, $30 - ld [rJOYP], a - call SGBDelayCycles - call SGBDelayCycles - ld a, $10 - ld [rJOYP], a -rept 6 - ld a, [rJOYP] -endr - call SGBDelayCycles - call SGBDelayCycles - ld a, $30 - ld [rJOYP], a - ld a, [rJOYP] - ld a, [rJOYP] - ld a, [rJOYP] - call SGBDelayCycles - call SGBDelayCycles - ld a, [rJOYP] - and $3 - cp $3 - jr nz, .carry - call .FinalPush - and a - ret - -.carry - call .FinalPush - scf - ret - -.FinalPush: - ld hl, MltReq1Packet - call PushSGBPals - jp SGBDelayCycles - -SGBBorder_PushBGPals: - call DisableLCD - ld a, %11100100 - ld [rBGP], a - ld hl, PredefPals - ld de, vTiles1 - ld bc, $100 tiles - call CopyData - call DrawDefaultTiles - ld a, LCDC_DEFAULT - ld [rLCDC], a - ld hl, PalTrnPacket - call PushSGBPals - xor a - ld [rBGP], a - ret - -SGBBorder_MorePalPushing: - call DisableLCD - ld a, $e4 - ld [rBGP], a - ld de, vTiles1 - ld bc, 20 tiles - call CopyData - ld b, 18 -.loop - push bc - ld bc, $c - call CopyData - ld bc, $28 - call ClearBytes - ld bc, $c - call CopyData - pop bc - dec b - jr nz, .loop - ld bc, $140 - call CopyData - ld bc, Start - call ClearBytes - ld bc, 16 palettes - call CopyData - call DrawDefaultTiles - ld a, LCDC_DEFAULT - ld [rLCDC], a - ld hl, PctTrnPacket - call PushSGBPals - xor a - ld [rBGP], a - ret - -SGBBorder_YetMorePalPushing: - call DisableLCD - ld a, %11100100 - ld [rBGP], a - ld de, vTiles1 - ld b, $80 -.loop - push bc - ld bc, 1 tiles - call CopyData - ld bc, 1 tiles - call ClearBytes - pop bc - dec b - jr nz, .loop - call DrawDefaultTiles - ld a, LCDC_DEFAULT - ld [rLCDC], a - ld hl, ChrTrnPacket - call PushSGBPals - xor a - ld [rBGP], a - ret - -CopyData: ; 0x9a52 -; copy bc bytes of data from hl to de -.loop - ld a, [hli] - ld [de], a - inc de - dec bc - ld a, c - or b - jr nz, .loop - ret -; 0x9a5b - -ClearBytes: ; 0x9a5b -; clear bc bytes of data starting from de -.loop - xor a - ld [de], a - inc de - dec bc - ld a, c - or b - jr nz, .loop - ret -; 0x9a64 - -DrawDefaultTiles: ; 0x9a64 -; Draw 240 tiles (2/3 of the screen) from tiles in VRAM - hlbgcoord 0, 0 ; BG Map 0 - ld de, BG_MAP_WIDTH - SCREEN_WIDTH - ld a, $80 ; starting tile - ld c, 12 + 1 -.line - ld b, 20 -.tile - ld [hli], a - inc a - dec b - jr nz, .tile -; next line - add hl, de - dec c - jr nz, .line - ret -; 0x9a7a - -SGBDelayCycles: - ld de, 7000 -.wait - nop - nop - nop - dec de - ld a, d - or e - jr nz, .wait - ret - -INCLUDE "gfx/sgb/blk_packets.asm" -INCLUDE "gfx/sgb/pal_packets.asm" -INCLUDE "data/sgb_ctrl_packets.asm" - -PredefPals: -INCLUDE "gfx/sgb/predef.pal" - -SGBBorderMap: -; interleaved tile ids and palette ids -INCBIN "gfx/sgb/sgb_border.bin" - -SGBBorderPalettes: -INCLUDE "gfx/sgb/sgb_border.pal" - -SGBBorder: -INCBIN "gfx/sgb/sgb_border.2bpp" - -HPBarPals: -INCLUDE "gfx/battle/hp_bar.pal" - -ExpBarPalette: -INCLUDE "gfx/battle/exp_bar.pal" - -INCLUDE "data/pokemon/palettes.asm" - -INCLUDE "data/trainers/palettes.asm" - -LoadMapPals: - farcall LoadSpecialMapPalette - jr c, .got_pals - - ; Which palette group is based on whether we're outside or inside - ld a, [wEnvironment] - and 7 - ld e, a - ld d, 0 - ld hl, EnvironmentColorsPointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ; Futher refine by time of day - ld a, [wTimeOfDayPal] - maskbits NUM_DAYTIMES - add a - add a - add a - ld e, a - ld d, 0 - add hl, de - ld e, l - ld d, h - ; Switch to palettes WRAM bank - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, wBGPals1 - ld b, 8 -.outer_loop - ld a, [de] ; lookup index for TilesetBGPalette - push de - push hl - ld l, a - ld h, 0 - add hl, hl - add hl, hl - add hl, hl - ld de, TilesetBGPalette - add hl, de - ld e, l - ld d, h - pop hl - ld c, 1 palettes -.inner_loop - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .inner_loop - pop de - inc de - dec b - jr nz, .outer_loop - pop af - ld [rSVBK], a - -.got_pals - ld a, [wTimeOfDayPal] - maskbits NUM_DAYTIMES - ld bc, 8 palettes - ld hl, MapObjectPals - call AddNTimes - ld de, wOBPals1 - ld bc, 8 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - - ld a, [wEnvironment] - cp TOWN - jr z, .outside - cp ROUTE - ret nz -.outside - ld a, [wMapGroup] - ld l, a - ld h, 0 - add hl, hl - add hl, hl - add hl, hl - ld de, RoofPals - add hl, de - ld a, [wTimeOfDayPal] - maskbits NUM_DAYTIMES - cp NITE_F - jr c, .morn_day -rept 4 - inc hl -endr -.morn_day - ld de, wBGPals1 palette PAL_BG_ROOF color 1 - ld bc, 4 - ld a, BANK(wBGPals1) - call FarCopyWRAM - ret - -INCLUDE "data/maps/environment_colors.asm" - -PartyMenuBGMobilePalette: -INCLUDE "gfx/stats/party_menu_bg_mobile.pal" - -PartyMenuBGPalette: -INCLUDE "gfx/stats/party_menu_bg.pal" - -TilesetBGPalette: -INCLUDE "gfx/tilesets/bg_tiles.pal" - -MapObjectPals:: -INCLUDE "gfx/overworld/npc_sprites.pal" - -RoofPals: -INCLUDE "gfx/tilesets/roofs.pal" - -DiplomaPalettes: -INCLUDE "gfx/diploma/diploma.pal" - -PartyMenuOBPals: -INCLUDE "gfx/stats/party_menu_ob.pal" - -UnusedGSTitleBGPals: -INCLUDE "gfx/title/unused_gs_bg.pal" - -UnusedGSTitleOBPals: -INCLUDE "gfx/title/unused_gs_fg.pal" - -MalePokegearPals: -INCLUDE "gfx/pokegear/pokegear.pal" - -FemalePokegearPals: -INCLUDE "gfx/pokegear/pokegear_f.pal" - -Palettes_SCGB_11: -INCLUDE "gfx/unknown/b789.pal" - -SlotMachinePals: -INCLUDE "gfx/slots/slots.pal" diff --git a/engine/credits.asm b/engine/credits.asm deleted file mode 100644 index 1aaecf64a..000000000 --- a/engine/credits.asm +++ /dev/null @@ -1,621 +0,0 @@ -INCLUDE "constants.asm" - - -SECTION "Credits", ROMX - -Credits:: ; 109847 - bit 6, b ; Hall Of Fame - ld a, $0 - jr z, .okay - ld a, $40 -.okay - ld [wJumptableIndex], a - - ld a, [rSVBK] - push af - ld a, BANK(wGBCPalettes) - ld [rSVBK], a - - call ClearBGPalettes - call ClearTileMap - call ClearSprites - - ld hl, wCreditsFaux2bpp - ld c, $80 - ld de, $ff00 - -.load_loop - ld a, e - ld [hli], a - ld a, d - ld [hli], a - dec c - jr nz, .load_loop - - ld de, CreditsBorderGFX - ld hl, vTiles2 tile $20 - lb bc, BANK(CreditsBorderGFX), 9 - call Request2bpp - - ld de, CopyrightGFX - ld hl, vTiles2 tile $60 - lb bc, BANK(CopyrightGFX), 29 - call Request2bpp - - ld de, TheEndGFX - ld hl, vTiles2 tile $40 - lb bc, BANK(TheEndGFX), 16 - call Request2bpp - - ld a, $ff - ld [wCreditsBorderFrame], a - xor a - ld [wCreditsBorderMon], a - - call Credits_LoadBorderGFX - ld e, l - ld d, h - ld hl, vTiles2 - lb bc, BANK(CreditsMonsGFX), 16 - call Request2bpp - - call ConstructCreditsTilemap - xor a - ld [wCreditsLYOverride], a - - ld hl, wLYOverrides - ld bc, $100 - xor a - call ByteFill - - ld a, rSCX - $ff00 - ld [hLCDCPointer], a - - call GetCreditsPalette - call SetPalettes - ld a, [hVBlank] - push af - ld a, $5 - ld [hVBlank], a - ld a, $1 - ld [hInMenu], a - xor a - ld [hBGMapMode], a - ld [wCreditsPos], a - ld [wCreditsUnusedCD21], a - ld [wCreditsTimer], a - -.execution_loop - call Credits_HandleBButton - call Credits_HandleAButton - jr nz, .exit_credits - - call Credits_Jumptable - call DelayFrame - jr .execution_loop - -.exit_credits - call ClearBGPalettes - xor a - ld [hLCDCPointer], a - ld [hBGMapAddress], a - pop af - ld [hVBlank], a - pop af - ld [rSVBK], a - ret -; 1098fd - -Credits_HandleAButton: ; 1098fd - ld a, [hJoypadDown] - and A_BUTTON - ret z - ld a, [wJumptableIndex] - bit 7, a - ret -; 109908 - -Credits_HandleBButton: ; 109908 - ld a, [hJoypadDown] - and B_BUTTON - ret z - ld a, [wJumptableIndex] - bit 6, a - ret z - ld hl, wCreditsPos - ld a, [hli] - cp $d - jr nc, .okay - ld a, [hli] - and a - ret z -.okay - ld hl, wCreditsTimer - ld a, [hl] - and a - ret z - dec [hl] - ret -; 109926 - -Credits_Jumptable: ; 109926 - ld a, [wJumptableIndex] - and $f - 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 -; 109937 - -.Jumptable: ; 109937 (42:5937) - dw ParseCredits - dw Credits_Next - dw Credits_Next - dw Credits_PrepBGMapUpdate - dw Credits_UpdateGFXRequestPath - dw Credits_RequestGFX - dw Credits_LYOverride - dw Credits_Next - dw Credits_Next - dw Credits_Next - dw Credits_UpdateGFXRequestPath - dw Credits_RequestGFX - dw Credits_LoopBack - -Credits_Next: ; 109951 (42:5951) - ld hl, wJumptableIndex - inc [hl] - ret - -Credits_LoopBack: ; 109956 (42:5956) - ld hl, wJumptableIndex - ld a, [hl] - and $f0 - ld [hl], a - ret - -Credits_PrepBGMapUpdate: ; 10995e (42:595e) - xor a - ld [hBGMapMode], a - jp Credits_Next - -Credits_UpdateGFXRequestPath: ; 109964 (42:5964) - call Credits_LoadBorderGFX - ld a, l - ld [wRequested2bppSource], a - ld a, h - ld [wRequested2bppSource + 1], a - ld a, LOW(vTiles2) - ld [wRequested2bppDest], a - ld a, HIGH(vTiles2) - ld [wRequested2bppDest + 1], a - jr Credits_RequestGFX - -Credits_RequestGFX: ; 10997b (42:597b) - xor a - ld [hBGMapMode], a - ld a, $8 - ld [wRequested2bpp], a - jp Credits_Next - -Credits_LYOverride: ; 109986 (42:5986) - ld a, [rLY] - cp $30 - jr c, Credits_LYOverride - ld a, [wCreditsLYOverride] - dec a - dec a - ld [wCreditsLYOverride], a - ld hl, wLYOverrides + $1f - call .Fill - ld hl, wLYOverrides + $87 - call .Fill - jp Credits_Next - -.Fill: ; 1099a3 (42:59a3) - ld c, $8 -.loop - ld [hli], a - dec c - jr nz, .loop - ret -; 1099aa - - -ParseCredits: ; 1099aa - ld hl, wJumptableIndex - bit 7, [hl] - jp nz, .done - -; Wait until the timer has run out to parse the next command. - ld hl, wCreditsTimer - ld a, [hl] - and a - jr z, .parse - -; One tick has passed. - dec [hl] - jp .done - -.parse -; First, let's clear the current text display, -; starting from line 5. - xor a - ld [hBGMapMode], a - hlcoord 0, 5 - ld bc, 20 * 12 - ld a, " " - call ByteFill - -; Then read the script. - -.loop - call .get - -; Commands: - cp CREDITS_END - jp z, .end - cp CREDITS_WAIT - jr z, .wait - cp CREDITS_SCENE - jr z, .scene - cp CREDITS_CLEAR - jr z, .clear - cp CREDITS_MUSIC - jr z, .music - cp CREDITS_WAIT2 - jr z, .wait2 - cp CREDITS_THEEND - jr z, .theend - -; If it's not a command, it's a string identifier. - - push af - ld e, a - ld d, 0 - ld hl, CreditsStrings - add hl, de - add hl, de - ld a, [hli] - ld d, [hl] - ld e, a - pop af - -; Strings spanning multiple lines have special cases. - - cp COPYRIGHT - jr z, .copyright - - cp STAFF - jr c, .staff - -; The rest start from line 6. - - hlcoord 0, 6 - jr .print - -.copyright - hlcoord 2, 6 - jr .print - -.staff - hlcoord 0, 6 - -.print -; Print strings spaced every two lines. - call .get - ld bc, 20 * 2 - call AddNTimes - call PlaceString - jr .loop - -.theend -; Display "The End" graphic. - call Credits_TheEnd - jr .loop - -.scene -; Update the scene number and corresponding palette. - call .get - ld [wCreditsBorderMon], a ; scene - xor a - ld [wCreditsBorderFrame], a ; frame - call GetCreditsPalette - call SetPalettes ; update hw pal registers - jr .loop - -.clear -; Clear the banner. - ld a, $ff - ld [wCreditsBorderFrame], a ; frame - jr .loop - -.music -; Play the credits music. - ld de, MUSIC_CREDITS - push de - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - pop de - call PlayMusic - jp .loop - -.wait2 -; Wait for some amount of ticks. - call .get - ld [wCreditsTimer], a - jr .done - -.wait -; Wait for some amount of ticks, and do something else. - call .get - ld [wCreditsTimer], a - - xor a - ld [hBGMapThird], a - ld a, 1 - ld [hBGMapMode], a - -.done - jp Credits_Next - -.end -; Stop execution. - ld hl, wJumptableIndex - set 7, [hl] - ld a, 32 - ld [wMusicFade], a - ld a, LOW(MUSIC_POST_CREDITS) - ld [wMusicFadeID], a - ld a, HIGH(MUSIC_POST_CREDITS) - ld [wMusicFadeID + 1], a - ret - -.get -; Get byte wCreditsPos from CreditsScript - push hl - push de - ld a, [wCreditsPos] - ld e, a - ld a, [wCreditsPos+1] - ld d, a - ld hl, CreditsScript - add hl, de - - inc de - ld a, e - ld [wCreditsPos], a - ld a, d - ld [wCreditsPos+1], a - ld a, [hl] - pop de - pop hl - ret -; 109a95 - - -ConstructCreditsTilemap: ; 109a95 (42:5a95) - xor a - ld [hBGMapMode], a - ld a, $c - ld [hBGMapAddress], a - - ld a, $28 - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - call ByteFill - - ld a, $7f - hlcoord 0, 4 - ld bc, (SCREEN_HEIGHT - 4) * SCREEN_WIDTH - call ByteFill - - hlcoord 0, 4 - ld a, $24 - call DrawCreditsBorder - - hlcoord 0, 17 - ld a, $20 - call DrawCreditsBorder - - hlcoord 0, 0, wAttrMap - ld bc, 4 * SCREEN_WIDTH - xor a - call ByteFill - - hlcoord 0, 4, wAttrMap - ld bc, SCREEN_WIDTH - ld a, $1 - call ByteFill - - hlcoord 0, 5, wAttrMap - ld bc, 12 * SCREEN_WIDTH - ld a, $2 - call ByteFill - - hlcoord 0, 17, wAttrMap - ld bc, SCREEN_WIDTH - ld a, $1 - call ByteFill - - call WaitBGMap2 - xor a - ld [hBGMapMode], a - ld [hBGMapAddress], a - hlcoord 0, 0 - call .InitTopPortion - call WaitBGMap2 - ret - -.InitTopPortion: ; 109aff (42:5aff) - ld b, 5 -.outer_loop - push hl - ld de, SCREEN_WIDTH - 3 - ld c, 4 - xor a -.inner_loop -rept 3 - ld [hli], a - inc a -endr - ld [hl], a - inc a - add hl, de - dec c - jr nz, .inner_loop - pop hl -rept 4 - inc hl -endr - dec b - jr nz, .outer_loop - ret - -DrawCreditsBorder: ; 109b1d (42:5b1d) - ld c, SCREEN_WIDTH / 4 -.loop - push af -rept 3 - ld [hli], a - inc a -endr - ld [hli], a - pop af - dec c - jr nz, .loop - ret - -GetCreditsPalette: ; 109b2c - call .GetPalAddress - - push hl - ld a, 0 - call .UpdatePals - pop hl - ret - -.GetPalAddress: -; Each set of palette data is 24 bytes long. - ld a, [wCreditsBorderMon] ; scene - and %11 - add a - add a ; * 8 - add a - ld e, a - ld d, 0 - ld hl, CreditsPalettes - add hl, de - add hl, de ; * 3 - add hl, de - ret - -.UpdatePals: -; Update the first three colors in both palette buffers. - push af - push hl - add LOW(wBGPals1) - ld e, a - ld a, 0 - adc HIGH(wBGPals1) - ld d, a - ld bc, 24 - call CopyBytes - - pop hl - pop af - add LOW(wBGPals2) - ld e, a - ld a, 0 - adc HIGH(wBGPals2) - ld d, a - ld bc, 24 - call CopyBytes - ret - -CreditsPalettes: -INCLUDE "gfx/credits/credits.pal" -; 109bca - -Credits_LoadBorderGFX: ; 109bca (42:5bca) - ld hl, wCreditsBorderFrame - ld a, [hl] - cp $ff - jr z, .init - - and %11 - ld e, a - inc a - and %11 - ld [hl], a - ld a, [wCreditsBorderMon] - and %11 - add a - add a - add e - add a - ld e, a - ld d, 0 - ld hl, .Frames - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret - -.init - ld hl, wCreditsFaux2bpp - ret -; 109bf1 (42:5bf1) - -.Frames: ; 109bf1 - dw CreditsPichuGFX - dw CreditsPichuGFX + 16 tiles - dw CreditsPichuGFX + 32 tiles - dw CreditsPichuGFX + 48 tiles - dw CreditsSmoochumGFX - dw CreditsSmoochumGFX + 16 tiles - dw CreditsSmoochumGFX + 32 tiles - dw CreditsSmoochumGFX + 48 tiles - dw CreditsDittoGFX - dw CreditsDittoGFX + 16 tiles - dw CreditsDittoGFX + 32 tiles - dw CreditsDittoGFX + 48 tiles - dw CreditsIgglybuffGFX - dw CreditsIgglybuffGFX + 16 tiles - dw CreditsIgglybuffGFX + 32 tiles - dw CreditsIgglybuffGFX + 48 tiles -; 109c11 - -Credits_TheEnd: ; 109c11 (42:5c11) - ld a, $40 - hlcoord 6, 9 - call .Load - hlcoord 6, 10 -.Load: ; 109c1c (42:5c1c) - ld c, 8 -.loop - ld [hli], a - inc a - dec c - jr nz, .loop - ret -; 109c24 (42:5c24) - - -CreditsBorderGFX: INCBIN "gfx/credits/border.2bpp" - -CreditsMonsGFX: -CreditsPichuGFX: INCBIN "gfx/credits/pichu.2bpp" -CreditsSmoochumGFX: INCBIN "gfx/credits/smoochum.2bpp" -CreditsDittoGFX: INCBIN "gfx/credits/ditto.2bpp" -CreditsIgglybuffGFX: INCBIN "gfx/credits/igglybuff.2bpp" - -INCLUDE "data/credits_script.asm" -INCLUDE "data/credits_strings.asm" diff --git a/engine/crystal_intro.asm b/engine/crystal_intro.asm deleted file mode 100755 index 56bb02750..000000000 --- a/engine/crystal_intro.asm +++ /dev/null @@ -1,2199 +0,0 @@ -Copyright_GFPresents: ; e4579 - ld de, MUSIC_NONE - call PlayMusic - call ClearBGPalettes - call ClearTileMap - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - xor a ; LOW(vBGMap0) - ld [hBGMapAddress], a - ld [hJoyDown], a - ld [hSCX], a - ld [hSCY], a - ld a, $90 - ld [hWY], a - call WaitBGMap - ld b, SCGB_GAMEFREAK_LOGO - call GetSGBLayout - call SetPalettes - ld c, 10 - call DelayFrames - callfar Copyright - call WaitBGMap - ld c, 100 - call DelayFrames - call ClearTileMap - farcall GBCOnlyScreen - call .GetGFLogoGFX -.joy_loop - call JoyTextDelay - ld a, [hJoyLast] - and BUTTONS - jr nz, .pressed_button - ld a, [wJumptableIndex] - bit 7, a - jr nz, .finish - call PlaceGameFreakPresents - farcall PlaySpriteAnimations - call DelayFrame - jr .joy_loop - -.pressed_button - call .StopGamefreakAnim - scf - ret - -.finish - call .StopGamefreakAnim - and a - ret -; e45e8 - -.GetGFLogoGFX: ; e45e8 - ld de, GameFreakLogo - ld hl, vTiles2 - lb bc, BANK(GameFreakLogo), 28 - call Get1bpp - - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - ld hl, IntroLogoGFX - ld de, wDecompressScratch - ld a, BANK(IntroLogoGFX) - call FarDecompress - - ld hl, vTiles0 - ld de, wDecompressScratch - lb bc, 1, 8 tiles - call Request2bpp - - ld hl, vTiles1 - ld de, wDecompressScratch + $80 tiles - lb bc, 1, 8 tiles - call Request2bpp - - pop af - ld [rSVBK], a - - farcall ClearSpriteAnims - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_GAMEFREAK_LOGO - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], $a0 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $60 - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $30 - xor a - ld [wJumptableIndex], a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - ld [hSCX], a - ld [hSCY], a - ld a, $1 - ld [hBGMapMode], a - ld a, $90 - ld [hWY], a - lb de, %11100100, %11100100 - call DmgToCgbObjPals - ret -; e465e - -.StopGamefreakAnim: ; e465e - farcall ClearSpriteAnims - call ClearTileMap - call ClearSprites - ld c, 16 - call DelayFrames - ret -; e4670 - -PlaceGameFreakPresents: ; e4670 - ld a, [wJumptableIndex] - ld e, a - ld d, 0 - ld hl, .dw - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e467f - -.dw ; e467f - dw PlaceGameFreakPresents_0 - dw PlaceGameFreakPresents_1 - dw PlaceGameFreakPresents_2 - dw PlaceGameFreakPresents_3 -; e4687 - -PlaceGameFreakPresents_AdvanceIndex: ; e4687 - ld hl, wJumptableIndex - inc [hl] - ret -; e468c - -PlaceGameFreakPresents_0: ; e468c - ret -; e468d - -PlaceGameFreakPresents_1: ; e468d - ld hl, wIntroSceneTimer - ld a, [hl] - cp $20 - jr nc, .PlaceGameFreak - inc [hl] - ret - -.PlaceGameFreak: - ld [hl], 0 - ld hl, .GAME_FREAK - decoord 5, 10 - ld bc, .end - .GAME_FREAK - call CopyBytes - call PlaceGameFreakPresents_AdvanceIndex - ld de, SFX_GAME_FREAK_PRESENTS - call PlaySFX - ret -; e46af - -.GAME_FREAK: - ; G A M E _ F R E A K - db 0, 1, 2, 3, 13, 4, 5, 3, 1, 6 -.end - db "@" -; e46ba - -PlaceGameFreakPresents_2: ; e46ba - ld hl, wIntroSceneTimer - ld a, [hl] - cp $40 - jr nc, .place_presents - inc [hl] - ret - -.place_presents - ld [hl], 0 - ld hl, .presents - decoord 7, 11 - ld bc, .end - .presents - call CopyBytes - call PlaceGameFreakPresents_AdvanceIndex - ret -; e46d6 - -.presents - db 7, 8, 9, 10, 11, 12 -.end - db "@" -; e46dd - -PlaceGameFreakPresents_3: ; e46dd - ld hl, wIntroSceneTimer - ld a, [hl] - cp $80 - jr nc, .finish - inc [hl] - ret - -.finish - ld hl, wJumptableIndex - set 7, [hl] - ret -; e46ed - - -GameFreakLogoJumper: ; e46ed (39:46ed) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, GameFreakLogoScenes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -GameFreakLogoScenes: ; e46fd (39:46fd) - dw GameFreakLogoScene1 - dw GameFreakLogoScene2 - dw GameFreakLogoScene3 - dw GameFreakLogoScene4 - dw GameFreakLogoScene5 - -GameFreakLogoScene1: ; e4707 (39:4707) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ret - -GameFreakLogoScene2: ; e470d (39:470d) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .asm_e4747 - ld d, a - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - and %111111 - cp %100000 - jr nc, .asm_e4723 - add %100000 -.asm_e4723 - ld e, a - farcall BattleAnim_Sine_e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], e - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - dec [hl] - and $1f - ret nz - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - sub $30 - ld [hl], a - ld de, SFX_DITTO_BOUNCE - call PlaySFX - ret - -.asm_e4747 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $0 - ld de, SFX_DITTO_POP_UP - call PlaySFX - ret - -GameFreakLogoScene3: ; e4759 (39:4759) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $20 - jr nc, .asm_e4764 - inc [hl] - ret - -.asm_e4764 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $0 - ld de, SFX_DITTO_TRANSFORM - call PlaySFX - ret - -GameFreakLogoScene4: ; e4776 (39:4776) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $40 - jr z, .asm_e47a3 - inc [hl] - srl a - srl a - ld e, a - ld d, $0 - ld hl, GameFreakLogoPalettes - add hl, de - add hl, de - ld a, [rSVBK] - push af - ld a, BANK(wOBPals2) - ld [rSVBK], a - ld a, [hli] - ld [wOBPals2 + 12], a - ld a, [hli] - ld [wOBPals2 + 13], a - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret - -.asm_e47a3 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - call PlaceGameFreakPresents_AdvanceIndex -GameFreakLogoScene5: ; e47ab (39:47ab) - ret -; e47ac (39:47ac) - -GameFreakLogoPalettes: ; e47ac -INCLUDE "gfx/intro/gamefreak_logo.pal" -; e47cc - -GameFreakLogo: ; e47cc -INCBIN "gfx/splash/logo1.1bpp" -INCBIN "gfx/splash/logo2.1bpp" -; e48ac - -CrystalIntro: ; e48ac - ld a, [rSVBK] - push af - ld a, BANK(wGBCPalettes) - ld [rSVBK], a - ld a, [hInMenu] - push af - ld a, [hVBlank] - push af - call .InitRAMAddrs -.loop ; e48bc - call JoyTextDelay - ld a, [hJoyLast] - and BUTTONS - jr nz, .ShutOffMusic - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call IntroSceneJumper - farcall PlaySpriteAnimations - call DelayFrame - jp .loop - -.ShutOffMusic: - ld de, MUSIC_NONE - call PlayMusic - -.done - call ClearBGPalettes - call ClearSprites - call ClearTileMap - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - pop af - ld [hVBlank], a - pop af - ld [hInMenu], a - pop af - ld [rSVBK], a - ret -; e4901 - -.InitRAMAddrs: ; e4901 - xor a - ld [hVBlank], a - ld a, $1 - ld [hInMenu], a - xor a - ld [hMapAnims], a - ld [wJumptableIndex], a - ret -; e490f - -IntroSceneJumper: ; e490f - ld a, [wJumptableIndex] - ld e, a - ld d, 0 - ld hl, IntroScenes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e491e - -IntroScenes: ; e491e (39:491e) - dw IntroScene1 - dw IntroScene2 - dw IntroScene3 - dw IntroScene4 - dw IntroScene5 - dw IntroScene6 - dw IntroScene7 - dw IntroScene8 - dw IntroScene9 - dw IntroScene10 - dw IntroScene11 - dw IntroScene12 - dw IntroScene13 - dw IntroScene14 - dw IntroScene15 - dw IntroScene16 - dw IntroScene17 - dw IntroScene18 - dw IntroScene19 - dw IntroScene20 - dw IntroScene21 - dw IntroScene22 - dw IntroScene23 - dw IntroScene24 - dw IntroScene25 - dw IntroScene26 - dw IntroScene27 - dw IntroScene28 - -NextIntroScene: ; e4956 (39:4956) - ld hl, wJumptableIndex - inc [hl] - ret - -IntroScene1: ; e495b (39:495b) -; Setup the next scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap001 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroPulseGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap002 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette2 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette2 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene2: ; e49d6 (39:49d6) -; First Unown (A) fades in, pulses, then fades out. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .endscene - cp $60 - jr nz, .DontPlaySound - push af - depixel 11, 11 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_1 - call PlaySFX - pop af -.DontPlaySound: - ld [wIntroSceneTimer], a - xor a - call CrystalIntro_UnownFade - ret -.endscene - call NextIntroScene - ret - -IntroScene3: ; e49fd (39:49fd) -; More setup. Transition to the outdoor scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap003 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap004 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette1 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette1 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - call Intro_ResetLYOverrides - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene4: ; e4a69 (39:4a69) -; Scroll the outdoor panorama for a bit. - call Intro_PerspectiveScrollBG - ld hl, wIntroSceneFrameCounter - ld a, [hl] - cp $80 - jr z, .endscene - inc [hl] - ret - -.endscene - call NextIntroScene - ret - -IntroScene5: ; e4a7a (39:4a7a) -; Go back to the Unown. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld [hLCDCPointer], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap005 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroPulseGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap006 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette2 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette2 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene6: ; e4af7 (39:4af7) -; Two more Unown (I, H) fade in. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .endscene - cp $60 - jr z, .SecondUnown - cp $40 - jr nc, .StopUnown - cp $20 - jr z, .FirstUnown - jr .NoUnown - -.FirstUnown: - push af - depixel 7, 15 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_2 - call PlaySFX - pop af -.NoUnown: - ld [wIntroSceneTimer], a - xor a - call CrystalIntro_UnownFade - ret - -.SecondUnown: - push af - depixel 14, 6 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_1 - call PlaySFX - pop af -.StopUnown: - ld [wIntroSceneTimer], a - ld a, $1 - call CrystalIntro_UnownFade - ret - -.endscene - call NextIntroScene - ret - -IntroScene7: ; e4b3f (39:4b3f) -; Back to the outdoor scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap003 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - - ld hl, IntroPichuWooperGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneRunGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - - ld hl, IntroTilemap004 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld hl, IntroPalette1 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - - ld hl, IntroPalette1 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - - pop af - ld [rSVBK], a - - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - call Intro_ResetLYOverrides - farcall ClearSpriteAnims - depixel 13, 27, 4, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE - call _InitSpriteAnimStruct - ld a, $f0 - ld [wGlobalAnimXOffset], a - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene8: ; e4bd3 (39:4bd3) -; Scroll the scene, then show Suicune running across the screen. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $40 - jr z, .suicune_sound - jr nc, .animate_suicune - call Intro_PerspectiveScrollBG - ret - -.suicune_sound - ld de, SFX_INTRO_SUICUNE_3 - call PlaySFX -.animate_suicune - ld a, [wGlobalAnimXOffset] - and a - jr z, .finish - sub $8 - ld [wGlobalAnimXOffset], a - ret - -.finish - ld de, SFX_INTRO_SUICUNE_2 - call PlaySFX - farcall DeinitializeAllSprites - call NextIntroScene - ret - -IntroScene9: ; e4c04 (39:4c04) -; Set up the next scene (same bg). - xor a - ld [hLCDCPointer], a - call ClearSprites - hlcoord 0, 0, wAttrMap - ; first 12 rows have palette 1 - ld bc, 12 * SCREEN_WIDTH - ld a, $1 - call ByteFill - ; middle 3 rows have palette 2 - ld bc, 3 * SCREEN_WIDTH - ld a, $2 - call ByteFill - ; last three rows have palette 3 - ld bc, 3 * SCREEN_WIDTH - ld a, $3 - call ByteFill - ld a, $2 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - call DelayFrame - ld a, $c ; $980c - ld [hBGMapAddress], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ld [hBGMapMode], a - ld [hBGMapAddress], a - ld [wGlobalAnimXOffset], a - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene10: ; e4c4f (39:4c4f) -; Wooper and Pichu enter. - call Intro_RustleGrass - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $c0 - jr z, .done - cp $20 - jr z, .wooper - cp $40 - jr z, .pichu - ret - -.pichu - depixel 21, 16, 1, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_PICHU - call _InitSpriteAnimStruct - ld de, SFX_INTRO_PICHU - call PlaySFX - ret - -.wooper - depixel 22, 6 - ld a, SPRITE_ANIM_INDEX_INTRO_WOOPER - call _InitSpriteAnimStruct - ld de, SFX_INTRO_PICHU - call PlaySFX - ret -.done - call NextIntroScene - ret - -IntroScene11: ; e4c86 (39:4c86) -; Back to Unown again. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld [hLCDCPointer], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap007 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap008 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette2 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette2 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene12: ; e4cfa (39:4cfa) -; Even more Unown. - call .PlayUnownSound - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $c0 - jr nc, .done - cp $80 - jr nc, .second_half -; first half - ld c, a - and $1f - sla a - ld [wIntroSceneTimer], a - ld a, c - and $e0 - srl a - swap a - call CrystalIntro_UnownFade - ret - -.second_half -; double speed - ld c, a - and $f - sla a - sla a - ld [wIntroSceneTimer], a - ld a, c - and $70 - or $40 - swap a - call CrystalIntro_UnownFade - ret - -.done - call NextIntroScene - ret - -.PlayUnownSound: ; e4d36 (39:4d36) - ld a, [wIntroSceneFrameCounter] - ld c, a - ld hl, .UnownSounds -.loop - ld a, [hli] - cp -1 - ret z - cp c - jr z, .playsound - inc hl - inc hl - jr .loop -.playsound - ld a, [hli] - ld d, [hl] - ld e, a - push de - call SFXChannelsOff - pop de - call PlaySFX - ret -; e4d54 (39:4d54) - -.UnownSounds: ; e4d54 - dbw $00, SFX_INTRO_UNOWN_3 - dbw $20, SFX_INTRO_UNOWN_2 - dbw $40, SFX_INTRO_UNOWN_1 - dbw $60, SFX_INTRO_UNOWN_2 - dbw $80, SFX_INTRO_UNOWN_3 - dbw $90, SFX_INTRO_UNOWN_2 - dbw $a0, SFX_INTRO_UNOWN_1 - dbw $b0, SFX_INTRO_UNOWN_2 - db -1 ; e4d6d - -IntroScene13: ; e4d6d (39:4d6d) -; Switch scenes again. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap003 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneRunGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap004 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette1 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette1 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - depixel 13, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE - call _InitSpriteAnimStruct - ld de, MUSIC_CRYSTAL_OPENING - call PlayMusic - xor a - ld [wGlobalAnimXOffset], a - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene14: ; e4dfa (39:4dfa) -; Suicune runs then jumps. - ld a, [hSCX] - sub 10 - ld [hSCX], a - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr z, .done - cp $60 - jr z, .jump - jr nc, .asm_e4e1a - cp $40 - jr nc, .asm_e4e33 - ret - -.jump - ld de, SFX_INTRO_SUICUNE_4 - call PlaySFX - -.asm_e4e1a - ld a, $1 - ld [wIntroSceneTimer], a - ld a, [wGlobalAnimXOffset] - cp $88 - jr c, .asm_e4e2c - sub $8 - ld [wGlobalAnimXOffset], a - ret - -.asm_e4e2c - farcall DeinitializeAllSprites - ret - -.asm_e4e33 - ld a, [wGlobalAnimXOffset] - sub $2 - ld [wGlobalAnimXOffset], a - ret - -.done - call NextIntroScene - ret - -IntroScene15: ; e4e40 (39:4e40) -; Transition to a new scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap009 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneJumpGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownBackGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld de, IntroGrass4GFX - ld hl, vTiles1 tile $00 - lb bc, BANK(IntroGrass4GFX), 1 - call Request2bpp - ld hl, IntroTilemap010 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - call Intro_LoadTilemap - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette5 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette5 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld a, $90 - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - depixel 8, 5 - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN_F - call _InitSpriteAnimStruct - depixel 12, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY - call _InitSpriteAnimStruct - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene16: ; e4edc (39:4edc) -; Suicune shows its face. An Unown appears in front. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .done - call Intro_Scene16_AnimateSuicune - ld a, [hSCY] - and a - ret z - add 8 - ld [hSCY], a - ret -.done - call NextIntroScene - ret - -IntroScene17: ; e4ef5 (39:4ef5) -; ... - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap011 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneCloseGFX - ld de, vTiles1 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - ld hl, IntroTilemap012 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette4 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette4 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene18: ; e4f67 (39:4f67) -; Suicune close up. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $60 - jr nc, .done - ld a, [hSCX] - cp $60 - ret z - add 8 - ld [hSCX], a - ret -.done - call NextIntroScene - ret - -IntroScene19: ; e4f7e (39:4f7e) -; More setup. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap013 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneBackGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownsGFX - ld de, vTiles1 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld de, IntroGrass4GFX - ld hl, vTiles1 tile $7f - lb bc, BANK(IntroGrass4GFX), 1 - call Request2bpp - ld hl, IntroTilemap014 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - call Intro_LoadTilemap - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette5 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette5 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld a, $d8 - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - ld hl, wSpriteAnimDict - xor a - ld [hli], a - ld [hl], $7f - call Intro_SetCGBPalUpdate - depixel 12, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY - call _InitSpriteAnimStruct - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene20: ; e5019 (39:5019) -; Suicune running away. A bunch of Unown appear. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $98 - jr nc, .finished - cp $58 - ret nc - cp $40 - jr nc, .AppearUnown - cp $28 - ret nc - ld a, [hSCY] - inc a - ld [hSCY], a - ret - -.AppearUnown: - sub $18 - ld c, a - and $3 - cp $3 - ret nz - ld a, c - and $1c - srl a - srl a - ld [wIntroSceneTimer], a - xor a - call Intro_Scene20_AppearUnown - ret -; e5049 (39:5049) -; unused - ld a, c - and $1c - srl a - srl a - ld [wIntroSceneTimer], a - ld a, 1 - call Intro_Scene20_AppearUnown - ret - -.finished - call NextIntroScene - ret - -IntroScene21: ; e505d (39:505d) -; Suicune gets more distant and turns black. - call Intro_ColoredSuicuneFrameSwap - ld c, 3 - call DelayFrames - xor a - ld [hBGMapMode], a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene22: ; e5072 (39:5072) - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $8 - jr nc, .done - ret -.done - farcall DeinitializeAllSprites - call NextIntroScene - ret - -IntroScene23: ; e5086 (39:5086) - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene24: ; e508e (39:508e) -; Fade to white. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $20 - jr nc, .done - - ld c, a - and $3 - ret nz - - ld a, c - and $1c - sla a - call Intro_Scene24_ApplyPaletteFade - ret - -.done - ld a, $40 - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene25: ; e50ad (39:50ad) -; Wait around a bit. - ld a, [wIntroSceneFrameCounter] - dec a - jr z, .done - ld [wIntroSceneFrameCounter], a - ret - -.done - call NextIntroScene - ret - -IntroScene26: ; e50bb (39:50bb) -; Load the final scene. - call ClearBGPalettes - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap015 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroCrystalUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap017 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette3 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette3 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene27: ; e512d (39:512d) -; Spell out C R Y S T A L with Unown. - ld hl, wIntroSceneTimer - inc [hl] - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .done - - ld c, a - and $f - ld [wIntroSceneTimer], a - ld a, c - and $70 - swap a - call Intro_FadeUnownWordPals - ret - -.done - call NextIntroScene - ld a, $80 - ld [wIntroSceneFrameCounter], a - ret - -IntroScene28: ; e5152 (39:5152) -; Cut out when the music ends, and lead into the title screen. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - cp $18 - jr z, .clear - cp $8 - ret nz - - ld de, SFX_UNKNOWN_CB - call PlaySFX - ret - -.clear - call ClearBGPalettes - ret - -.done - ld hl, wJumptableIndex - set 7, [hl] - ret - -Intro_Scene24_ApplyPaletteFade: ; e5172 (39:5172) -; load the (a)th palette from .FadePals to all wBGPals2 - ld hl, .FadePals - add l - ld l, a - ld a, $0 - adc h - ld h, a - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - ld de, wBGPals2 - ld b, 8 ; number of BG pals -.loop1 - push hl - ld c, 1 palettes -.loop2 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop2 - pop hl - dec b - jr nz, .loop1 - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; e519c (39:519c) - -.FadePals: ; e519c -INCLUDE "gfx/intro/fade.pal" -; e51dc - -CrystalIntro_InitUnownAnim: ; e51dc (39:51dc) - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $8 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_4 - call ReinitSpriteAnimFrame - pop de - - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $18 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_3 - call ReinitSpriteAnimFrame - pop de - - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $28 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1 - call ReinitSpriteAnimFrame - pop de - - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $38 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_2 - call ReinitSpriteAnimFrame - ret - -CrystalIntro_UnownFade: ; e5223 (39:5223) - add a - add a - add a - ld e, a - ld d, $0 - ld hl, wBGPals2 - add hl, de - inc hl - inc hl - ld a, [wIntroSceneTimer] - and %111111 - cp %011111 - jr z, .okay - jr c, .okay - ld c, a - ld a, %111111 - sub c -.okay - - ld c, a - ld b, $0 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - - push hl - push bc - ld hl, wBGPals2 - ld bc, 8 palettes - xor a - call ByteFill - pop bc - pop hl - - push hl - ld hl, .BWFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .BlackLBlueFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .BlackBlueFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; e5288 (39:5288) - -.BWFade: ; e5288 -; Fade between black and white. -hue = 0 -rept 32 - RGB hue, hue, hue -hue = hue + 1 -endr -; e52c8 - -.BlackLBlueFade: ; e52c8 -; Fade between black and light blue. -hue = 0 -rept 32 - RGB 0, hue / 2, hue -hue = hue + 1 -endr -; e5308 - -.BlackBlueFade: ; e5308 -; Fade between black and blue. -hue = 0 -rept 32 - RGB 0, 0, hue -hue = hue + 1 -endr -; e5348 - -Intro_Scene20_AppearUnown: ; e5348 (39:5348) -; Spawn the palette for the nth Unown - and a - jr nz, .load_pal_2 - - ld hl, .pal1 - jr .got_pointer - -.load_pal_2 - ld hl, .pal2 - -.got_pointer - ld a, [wIntroSceneTimer] - and $7 - add a - add a - add a - ld c, a - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - - push bc - ld de, wBGPals2 - - ld a, c - add e - ld e, a - ld a, $0 - adc d - ld d, a - - ld bc, 1 palettes - call CopyBytes - pop bc - - ld de, wBGPals1 - ld a, c - add e - ld e, a - ld a, $0 - adc d - ld d, a - - ld bc, 1 palettes - call CopyBytes - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; e538d (39:538d) - -.pal1 ; e538d - RGB 24, 12, 09 - RGB 31, 31, 31 - RGB 12, 00, 31 - RGB 00, 00, 00 - -; e5395 - -.pal2 ; e5395 - RGB 24, 12, 09 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - -; e539d - -Intro_FadeUnownWordPals: ; e539d (39:539d) - add a - add a - add a - ld e, a - ld d, $0 - ld hl, wBGPals2 - add hl, de -rept 4 - inc hl -endr - ld a, [wIntroSceneTimer] - add a - ld c, a - ld b, $0 - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - - push hl - ld hl, .FastFadePalettes - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .SlowFadePalettes - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; e53db (39:53db) - -.FastFadePalettes: ; e53db -hue = 31 -rept 8 - RGB hue, hue, hue -hue = hue + -1 - RGB hue, hue, hue -hue = hue + -2 -endr -; e53fb - -.SlowFadePalettes: ; e53fb -hue = 31 -rept 16 - RGB hue, hue, hue -hue = hue + -1 -endr -; e541b - -Intro_LoadTilemap: ; e541b (39:541b) - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - ld hl, wDecompressScratch - decoord 0, 0 - ld b, SCREEN_HEIGHT -.row - ld c, SCREEN_WIDTH -.col - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .col - ld a, BG_MAP_WIDTH - SCREEN_WIDTH - add l - ld l, a - ld a, 0 - adc h - ld h, a - dec b - jr nz, .row - - pop af - ld [rSVBK], a - ret - -Intro_Scene16_AnimateSuicune: ; e5441 (39:5441) - ld a, [wIntroSceneFrameCounter] - and $3 - jr z, Intro_ColoredSuicuneFrameSwap - cp $3 - jr z, .PrepareForSuicuneSwap - ret - -.PrepareForSuicuneSwap: - xor a - ld [hBGMapMode], a - ret - -Intro_ColoredSuicuneFrameSwap: ; e5451 (39:5451) - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH -.loop - ld a, [hl] - and a - jr z, .skip - cp $80 - jr nc, .skip - xor $8 - ld [hl], a -.skip - inc hl - dec bc - ld a, c - or b - jr nz, .loop - ld a, $1 - ld [hBGMapMode], a - ret - -Intro_RustleGrass: ; e546d (39:546d) - ld a, [wIntroSceneFrameCounter] - cp 36 - ret nc - and $c - srl a - ld e, a - ld d, $0 - ld hl, .RustlingGrassPointers - add hl, de - ld a, [hli] - ld [wRequested2bppSource], a - ld a, [hli] - ld [wRequested2bppSource + 1], a - ld a, LOW(vTiles2 tile $09) - ld [wRequested2bppDest], a - ld a, HIGH(vTiles2 tile $09) - ld [wRequested2bppDest + 1], a - ld a, 4 - ld [wRequested2bppSize], a - ret -; e5496 (39:5496) - -.RustlingGrassPointers: ; e5496 - dw IntroGrass1GFX - dw IntroGrass2GFX - dw IntroGrass3GFX - dw IntroGrass2GFX -; e549e - -Intro_SetCGBPalUpdate: ; e549e (39:549e) - ld a, $1 - ld [hCGBPalUpdate], a - ret - -Intro_ClearBGPals: ; e54a3 (39:54a3) - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - - ld hl, wBGPals2 - ld bc, 16 palettes - xor a - call ByteFill - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - call DelayFrame - call DelayFrame - ret - -Intro_DecompressRequest2bpp_128Tiles: ; e54c2 (39:54c2) - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $80 - call Request2bpp - - pop af - ld [rSVBK], a - ret - -Intro_DecompressRequest2bpp_255Tiles: ; e54de (39:54de) - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $ff - call Request2bpp - - pop af - ld [rSVBK], a - ret - -Intro_DecompressRequest2bpp_64Tiles: ; e54fa (39:54fa) - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $40 - call Request2bpp - - pop af - ld [rSVBK], a - ret - -Intro_ResetLYOverrides: ; e5516 (39:5516) - ld a, [rSVBK] - push af - ld a, BANK(wLYOverrides) - ld [rSVBK], a - - ld hl, wLYOverrides - ld bc, wLYOverridesEnd - wLYOverrides - xor a - call ByteFill - - pop af - ld [rSVBK], a - ld a, rSCX - $ff00 - ld [hLCDCPointer], a - ret - -Intro_PerspectiveScrollBG: ; e552f (39:552f) - ld a, [rSVBK] - push af - ld a, BANK(wLYOverrides) - ld [rSVBK], a - ; Scroll the grass every frame. - ; Scroll the trees every other frame and at half speed. - ; This creates an illusion of perspective. - ld a, [wIntroSceneFrameCounter] - and $1 - jr z, .skip - ; trees in the back - ld hl, wLYOverrides - ld a, [hl] - inc a - ld bc, $5f - call ByteFill -.skip - ; grass in the front - ld hl, wLYOverrides + $5f - ld a, [hl] - inc a - inc a - ld bc, $31 - call ByteFill - ld a, [wLYOverrides + 0] - ld [hSCX], a - pop af - ld [rSVBK], a - ret - -IntroSuicuneRunGFX: ; e555d -INCBIN "gfx/intro/suicune_run.2bpp.lz" -; e592d - -IntroPichuWooperGFX: ; e592d -INCBIN "gfx/intro/pichu_wooper.2bpp.lz" -; e5c7d - -IntroBackgroundGFX: ; e5c7d -INCBIN "gfx/intro/background.2bpp.lz" -; e5e6d - -IntroTilemap004: ; e5e6d -INCBIN "gfx/intro/004.tilemap.lz" -; e5ecd - -IntroTilemap003: ; e5ecd -INCBIN "gfx/intro/003.tilemap.lz" -; e5edd - -IntroPalette1: ; e5edd -INCLUDE "gfx/intro/intro_1.pal" -; e5f5d - -IntroUnownsGFX: ; e5f5d -INCBIN "gfx/intro/unowns.2bpp.lz" -; e634d - -IntroPulseGFX: ; e634d -INCBIN "gfx/intro/pulse.2bpp.lz" -; e63dd - -IntroTilemap002: ; e63dd -INCBIN "gfx/intro/002.tilemap.lz" -; e641d - -IntroTilemap001: ; e641d -INCBIN "gfx/intro/001.tilemap.lz" -; e642d - -IntroTilemap006: ; e642d -INCBIN "gfx/intro/006.tilemap.lz" -; e647d - -IntroTilemap005: ; e647d -INCBIN "gfx/intro/005.tilemap.lz" -; e649d - -IntroTilemap008: ; e649d -INCBIN "gfx/intro/008.tilemap.lz" -; e655d - -IntroTilemap007: ; e655d -INCBIN "gfx/intro/007.tilemap.lz" -; e65ad - -IntroPalette2: ; e65ad -INCLUDE "gfx/intro/intro_2.pal" -; e662d - -IntroCrystalUnownsGFX: ; e662d -INCBIN "gfx/intro/crystal_unowns.2bpp.lz" -; e672d - -IntroTilemap017: ; e672d -INCBIN "gfx/intro/017.tilemap.lz" -; e676d - -IntroTilemap015: ; e676d -INCBIN "gfx/intro/015.tilemap.lz" -; e679d - -IntroPalette3: ; e679d -INCLUDE "gfx/intro/intro_3.pal" -; e681d - -IntroSuicuneCloseGFX: ; e681d -INCBIN "gfx/intro/suicune_close.2bpp.lz" -; e6c3d - -IntroTilemap012: ; e6c3d -INCBIN "gfx/intro/012.tilemap.lz" -; e6d0d - -IntroTilemap011: ; e6d0d -INCBIN "gfx/intro/011.tilemap.lz" -; e6d6d - -IntroPalette4: ; e6d6d -INCLUDE "gfx/intro/intro_4.pal" -; e6ded - -IntroSuicuneJumpGFX: ; e6ded -INCBIN "gfx/intro/suicune_jump.2bpp.lz" -; e72ad - -IntroSuicuneBackGFX: ; e72ad -INCBIN "gfx/intro/suicune_back.2bpp.lz" -; e764d - -IntroTilemap010: ; e764d -INCBIN "gfx/intro/010.tilemap.lz" -; e76ad - -IntroTilemap009: ; e76ad -INCBIN "gfx/intro/009.tilemap.lz" -; e76bd - -IntroTilemap014: ; e76bd -INCBIN "gfx/intro/014.tilemap.lz" -; e778d - -IntroTilemap013: ; e778d -INCBIN "gfx/intro/013.tilemap.lz" -; e77dd - -IntroPalette5: ; e77dd -INCLUDE "gfx/intro/intro_5.pal" - -IntroUnownBackGFX: ; e785d -INCBIN "gfx/intro/unown_back.2bpp.lz" -; e799d - -IntroGrass1GFX: ; e799d -INCBIN "gfx/intro/grass1.2bpp" -IntroGrass2GFX: ; e79dd -INCBIN "gfx/intro/grass2.2bpp" -IntroGrass3GFX: ; e7a1d -INCBIN "gfx/intro/grass3.2bpp" -IntroGrass4GFX: ; e7a5d -INCBIN "gfx/intro/grass4.2bpp" diff --git a/engine/crystal_layouts.asm b/engine/crystal_layouts.asm deleted file mode 100755 index d6b193e9d..000000000 --- a/engine/crystal_layouts.asm +++ /dev/null @@ -1,325 +0,0 @@ -GetMysteryGift_MobileAdapterLayout: ; 4930f (mobile) - ld a, b - cp SCGB_RAM - jr nz, .not_ram - ld a, [wSGBPredef] -.not_ram - push af - farcall ResetBGPals - pop af - ld l, a - ld h, 0 - add hl, hl - ld de, .dw - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .done - push de - jp hl -.done - ret -; 49330 (12:5330) - -.dw ; 49330 - dw MG_Mobile_Layout00 - dw MG_Mobile_Layout01 - dw MG_Mobile_Layout02 -; 49336 - -MG_Mobile_Layout_FillBox: ; 49336 -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret -; 49346 - -MG_Mobile_Layout_WipeAttrMap: ; 49346 (12:5346) - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - xor a - call ByteFill - ret - -MG_Mobile_Layout_LoadPals: ; 49351 (12:5351) - ld de, wBGPals1 - ld hl, Palette_MysteryGiftMobile - ld bc, 5 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - ld de, wBGPals1 palette PAL_BG_TEXT - ld hl, Palette_TextBG7 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - ret - -MG_Mobile_Layout00: ; 4936e (12:536e) - call MG_Mobile_Layout_LoadPals - call MG_Mobile_Layout_WipeAttrMap - call MG_Mobile_Layout_CreatePalBoxes - farcall ApplyAttrMap - farcall ApplyPals - ret - -MG_Mobile_Layout_CreatePalBoxes: ; 49384 (12:5384) - hlcoord 0, 0, wAttrMap - lb bc, 4, 1 - ld a, $1 - call MG_Mobile_Layout_FillBox - lb bc, 2, 1 - ld a, $2 - call MG_Mobile_Layout_FillBox - lb bc, 6, 1 - ld a, $3 - call MG_Mobile_Layout_FillBox - hlcoord 1, 0, wAttrMap - ld a, $1 - lb bc, 3, 18 - call MG_Mobile_Layout_FillBox - lb bc, 2, 18 - ld a, $2 - call MG_Mobile_Layout_FillBox - lb bc, 12, 18 - ld a, $3 - call MG_Mobile_Layout_FillBox - hlcoord 19, 0, wAttrMap - lb bc, 4, 1 - ld a, $1 - call MG_Mobile_Layout_FillBox - lb bc, 2, 1 - ld a, $2 - call MG_Mobile_Layout_FillBox - lb bc, 6, 1 - ld a, $3 - call MG_Mobile_Layout_FillBox - hlcoord 0, 12, wAttrMap - ld bc, 6 * SCREEN_WIDTH - ld a, $7 - call ByteFill - ret -; 493e1 (12:53e1) - -Palette_MysteryGiftMobile: ; 493e1 -INCLUDE "gfx/mystery_gift/mg_mobile.pal" -; 49409 - -LoadOW_BGPal7:: ; 49409 - ld hl, Palette_TextBG7 - ld de, wBGPals1 palette PAL_BG_TEXT - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - ret -; 49418 - -Palette_TextBG7: ; 49418 -INCLUDE "gfx/font/bg_text.pal" -; 49420 - -Function49420:: ; 49420 (12:5420) - ld hl, MansionPalette1 + 8 palettes - ld de, wBGPals1 palette PAL_BG_ROOF - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - ret -; 4942f (12:542f) - -MG_Mobile_Layout01: ; 4942f - call MG_Mobile_Layout_LoadPals - ld de, wBGPals1 palette PAL_BG_TEXT - ld hl, .Palette_49478 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - call MG_Mobile_Layout_WipeAttrMap - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - hlcoord 0, 14, wAttrMap - ld bc, 4 * SCREEN_WIDTH - ld a, $7 - call ByteFill - ld a, [wd002] - bit 6, a - jr z, .asm_49464 - call Function49480 - jr .asm_49467 - -.asm_49464 - call Function49496 - -.asm_49467 - farcall ApplyAttrMap - farcall ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 49478 - -.Palette_49478: ; 49478 - RGB 31, 31, 31 - RGB 26, 31, 00 - RGB 20, 16, 03 - RGB 00, 00, 00 -; 49480 - -Function49480: ; 49480 - hlcoord 0, 0, wAttrMap - lb bc, 4, SCREEN_WIDTH - ld a, $7 - call MG_Mobile_Layout_FillBox - hlcoord 0, 2, wAttrMap - ld a, $4 - ld [hl], a - hlcoord 19, 2, wAttrMap - ld [hl], a - ret -; 49496 - -Function49496: ; 49496 - hlcoord 0, 0, wAttrMap - lb bc, 2, SCREEN_WIDTH - ld a, $7 - call MG_Mobile_Layout_FillBox - hlcoord 0, 1, wAttrMap - ld a, $4 - ld [hl], a - hlcoord 19, 1, wAttrMap - ld [hl], a - ret -; 494ac - -INCLUDE "engine/tileset_palettes.asm" - -MG_Mobile_Layout02: ; 49706 - ld hl, .Palette_49732 - ld de, wBGPals1 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - farcall ApplyPals - call MG_Mobile_Layout_WipeAttrMap - farcall ApplyAttrMap - ld hl, .Palette_4973a - ld de, wOBPals1 - ld bc, 1 palettes - ld a, BANK(wOBPals1) - call FarCopyWRAM - ret -; 49732 - -.Palette_49732: ; 49732 - RGB 31, 31, 31 - RGB 23, 16, 07 - RGB 23, 07, 07 - RGB 03, 07, 20 -; 4973a - -.Palette_4973a: ; 4973a - RGB 00, 00, 00 - RGB 07, 05, 31 - RGB 14, 18, 31 - RGB 31, 31, 31 -; 49742 - -Function49742: ; 49742 - ld hl, .Palette_49757 - ld de, wBGPals1 - ld bc, 8 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - farcall ApplyPals - ret -; 49757 - -.Palette_49757: ; 49757 -INCLUDE "gfx/unknown/49757.pal" -; 49797 - -_InitMG_Mobile_LinkTradePalMap: ; 49797 - hlcoord 0, 0, wAttrMap - lb bc, 16, 2 - ld a, $4 - call MG_Mobile_Layout_FillBox - ld a, $3 - ldcoord_a 0, 1, wAttrMap - ldcoord_a 0, 14, wAttrMap - hlcoord 2, 0, wAttrMap - lb bc, 8, 18 - ld a, $5 - call MG_Mobile_Layout_FillBox - hlcoord 2, 8, wAttrMap - lb bc, 8, 18 - ld a, $6 - call MG_Mobile_Layout_FillBox - hlcoord 0, 16, wAttrMap - lb bc, 2, SCREEN_WIDTH - ld a, $4 - call MG_Mobile_Layout_FillBox - ld a, $3 - lb bc, 6, 1 - hlcoord 6, 1, wAttrMap - call MG_Mobile_Layout_FillBox - ld a, $3 - lb bc, 6, 1 - hlcoord 17, 1, wAttrMap - call MG_Mobile_Layout_FillBox - ld a, $3 - lb bc, 6, 1 - hlcoord 6, 9, wAttrMap - call MG_Mobile_Layout_FillBox - ld a, $3 - lb bc, 6, 1 - hlcoord 17, 9, wAttrMap - call MG_Mobile_Layout_FillBox - ld a, $2 - hlcoord 2, 16, wAttrMap - ld [hli], a - ld a, $7 - ld [hli], a - ld [hli], a - ld [hli], a - ld a, $2 - ld [hl], a - hlcoord 2, 17, wAttrMap - ld a, $3 - ld bc, 6 - call ByteFill - ret -; 49811 - -LoadTradeRoomBGPals: ; 49811 - ld hl, TradeRoomPalette - ld de, wBGPals1 palette PAL_BG_GREEN - ld bc, 6 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - farcall ApplyPals - ret -; 49826 - -TradeRoomPalette: ; 49826 -INCLUDE "gfx/trade/border.pal" -; 49856 - -InitMG_Mobile_LinkTradePalMap: ; 49856 - call _InitMG_Mobile_LinkTradePalMap - ret -; 4985a - -; unused -INCLUDE "gfx/unknown/4985a.asm" diff --git a/engine/decorations.asm b/engine/decorations.asm deleted file mode 100755 index 33d0ca0cd..000000000 --- a/engine/decorations.asm +++ /dev/null @@ -1,1303 +0,0 @@ -InitDecorations: ; 26751 (9:6751) - ld a, DECO_FEATHERY_BED - ld [wDecoBed], a - ld a, DECO_TOWN_MAP - ld [wDecoPoster], a - ret - -_PlayerDecorationMenu: ; 0x2675c - ld a, [wWhichIndexSet] - push af - ld hl, .MenuHeader - call LoadMenuHeader - xor a - ld [wBuffer5], a - ld a, $1 - ld [wBuffer6], a -.top_loop - ld a, [wBuffer6] - ld [wMenuCursorBuffer], a - call .FindCategoriesWithOwnedDecos - call DoNthMenu - ld a, [wMenuCursorY] - ld [wBuffer6], a - jr c, .exit_menu - ld a, [wMenuSelection] - ld hl, .pointers - call MenuJumptable - jr nc, .top_loop - -.exit_menu - call ExitMenu - pop af - ld [wWhichIndexSet], a - ld a, [wBuffer5] - ld c, a - ret -; 0x2679a - -.MenuHeader: ; 0x2679a - db MENU_BACKUP_TILES ; flags - menu_coords 5, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default option -; 0x267a2 - -.MenuData: ; 0x267a2 - db STATICMENU_CURSOR | STATICMENU_WRAP ; flags - db 0 ; items - dw wd002 - dw PlaceNthMenuStrings - dw .pointers -; 0x267aa - -.pointers ; 267aa - dw DecoBedMenu, .bed - dw DecoCarpetMenu, .carpet - dw DecoPlantMenu, .plant - dw DecoPosterMenu, .poster - dw DecoConsoleMenu, .game - dw DecoOrnamentMenu, .ornament - dw DecoBigDollMenu, .big_doll - dw DecoExitMenu, .exit - -.bed db "BED@" -.carpet db "CARPET@" -.plant db "PLANT@" -.poster db "POSTER@" -.game db "GAME CONSOLE@" -.ornament db "ORNAMENT@" -.big_doll db "BIG DOLL@" -.exit db "EXIT@" -; 26806 - -.FindCategoriesWithOwnedDecos: ; 26806 - xor a - ld [wWhichIndexSet], a - call .ClearStringBuffer2 - call .FindOwndDecos - ld a, 7 - call .AppendToStringBuffer2 - ld hl, wStringBuffer2 - ld de, wd002 - ld bc, ITEM_NAME_LENGTH - call CopyBytes - ret - -.ClearStringBuffer2: ; 26822 (9:6822) - ld hl, wStringBuffer2 - xor a - ld [hli], a - ld bc, ITEM_NAME_LENGTH - 1 - ld a, -1 - call ByteFill - ret - -.AppendToStringBuffer2: ; 26830 (9:6830) - ld hl, wStringBuffer2 - inc [hl] - ld e, [hl] - ld d, 0 - add hl, de - ld [hl], a - ret - -.FindOwndDecos: ; 2683a (9:683a) - ld hl, .dw -.loop - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - or e - jr z, .done - push hl - call _de_ - pop hl - jr nc, .next - ld a, [hl] - push hl - call .AppendToStringBuffer2 - pop hl -.next - inc hl - jr .loop -.done - ret -; 26855 (9:6855) - -.dw ; 26855 - dwb FindOwnedBeds, 0 ; bed - dwb FindOwnedCarpets, 1 ; carpet - dwb FindOwnedPlants, 2 ; plant - dwb FindOwnedPosters, 3 ; poster - dwb FindOwnedConsoles, 4 ; game console - dwb FindOwnedOrnaments, 5 ; ornament - dwb FindOwnedBigDolls, 6 ; big doll - dw 0 ; end -; 2686c - -Deco_FillTempWithMinusOne: ; 2686c - xor a - ld hl, wd002 - ld [hli], a - ld a, -1 - ld bc, $10 - call ByteFill - ret -; 2687a - -CheckAllDecorationFlags: ; 2687a -.loop - ld a, [hli] - cp -1 - jr z, .done - push hl - push af - ld b, CHECK_FLAG - call DecorationFlagAction - ld a, c - and a - pop bc - ld a, b - call nz, AppendDecoIndex - pop hl - jr .loop - -.done - ret -; 26891 - -AppendDecoIndex: ; 26891 - ld hl, wd002 - inc [hl] - ld e, [hl] - ld d, $0 - add hl, de - ld [hl], a - ret -; 2689b - -FindOwnedDecosInCategory: ; 2689b - push bc - push hl - call Deco_FillTempWithMinusOne - pop hl - call CheckAllDecorationFlags - pop bc - ld a, [wd002] - and a - ret z - - ld a, c - call AppendDecoIndex - ld a, 0 - call AppendDecoIndex - scf - ret -; 268b5 - -DecoBedMenu: ; 268b5 - call FindOwnedBeds - call PopulateDecoCategoryMenu - xor a - ret -; 268bd - -FindOwnedBeds: ; 268bd - ld hl, .beds - ld c, BEDS - jp FindOwnedDecosInCategory -; 268c5 - -.beds ; 268c5 - db DECO_FEATHERY_BED ; 2 - db DECO_PINK_BED ; 3 - db DECO_POLKADOT_BED ; 4 - db DECO_PIKACHU_BED ; 5 - db -1 -; 268ca - -DecoCarpetMenu: ; 268ca - call FindOwnedCarpets - call PopulateDecoCategoryMenu - xor a - ret -; 268d2 - -FindOwnedCarpets: ; 268d2 - ld hl, .carpets - ld c, CARPETS - jp FindOwnedDecosInCategory -; 268da - -.carpets ; 268da - db DECO_RED_CARPET ; 7 - db DECO_BLUE_CARPET ; 8 - db DECO_YELLOW_CARPET ; 9 - db DECO_GREEN_CARPET ; a - db -1 -; 268df - -DecoPlantMenu: ; 268df - call FindOwnedPlants - call PopulateDecoCategoryMenu - xor a - ret -; 268e7 - -FindOwnedPlants: ; 268e7 - ld hl, .plants - ld c, PLANTS - jp FindOwnedDecosInCategory -; 268ef - -.plants ; 268ef - db DECO_MAGNAPLANT ; c - db DECO_TROPICPLANT ; d - db DECO_JUMBOPLANT ; e - db -1 -; 268f3 - -DecoPosterMenu: ; 268f3 - call FindOwnedPosters - call PopulateDecoCategoryMenu - xor a - ret -; 268fb - -FindOwnedPosters: ; 268fb - ld hl, .posters - ld c, POSTERS - jp FindOwnedDecosInCategory -; 26903 - -.posters ; 26903 - db DECO_TOWN_MAP ; 10 - db DECO_PIKACHU_POSTER ; 11 - db DECO_CLEFAIRY_POSTER ; 12 - db DECO_JIGGLYPUFF_POSTER ; 13 - db -1 -; 26908 - -DecoConsoleMenu: ; 26908 - call FindOwnedConsoles - call PopulateDecoCategoryMenu - xor a - ret -; 26910 - -FindOwnedConsoles: ; 26910 - ld hl, .consoles - ld c, CONSOLES - jp FindOwnedDecosInCategory -; 26918 - -.consoles ; 26918 - db DECO_FAMICOM ; 15 - db DECO_SNES ; 16 - db DECO_N64 ; 17 - db DECO_VIRTUAL_BOY ; 18 - db -1 -; 2691d - -DecoOrnamentMenu: ; 2691d - call FindOwnedOrnaments - call PopulateDecoCategoryMenu - xor a - ret -; 26925 - -FindOwnedOrnaments: ; 26925 - ld hl, .ornaments - ld c, DOLLS - jp FindOwnedDecosInCategory -; 2692d - -.ornaments ; 2692d - db DECO_PIKACHU_DOLL ; 1e - db DECO_SURF_PIKACHU_DOLL ; 1f - db DECO_CLEFAIRY_DOLL ; 20 - db DECO_JIGGLYPUFF_DOLL ; 21 - db DECO_BULBASAUR_DOLL ; 22 - db DECO_CHARMANDER_DOLL ; 23 - db DECO_SQUIRTLE_DOLL ; 24 - db DECO_POLIWAG_DOLL ; 25 - db DECO_DIGLETT_DOLL ; 26 - db DECO_STARMIE_DOLL ; 27 - db DECO_MAGIKARP_DOLL ; 28 - db DECO_ODDISH_DOLL ; 29 - db DECO_GENGAR_DOLL ; 2a - db DECO_SHELLDER_DOLL ; 2b - db DECO_GRIMER_DOLL ; 2c - db DECO_VOLTORB_DOLL ; 2d - db DECO_WEEDLE_DOLL ; 2e - db DECO_UNOWN_DOLL ; 2f - db DECO_GEODUDE_DOLL ; 30 - db DECO_MACHOP_DOLL ; 31 - db DECO_TENTACOOL_DOLL ; 32 - db DECO_GOLD_TROPHY_DOLL ; 33 - db DECO_SILVER_TROPHY_DOLL ; 34 - db -1 -; 26945 - -DecoBigDollMenu: ; 26945 - call FindOwnedBigDolls - call PopulateDecoCategoryMenu - xor a - ret -; 2694d - -FindOwnedBigDolls: ; 2694d - ld hl, .big_dolls - ld c, BIG_DOLLS - jp FindOwnedDecosInCategory -; 26955 - -.big_dolls ; 26955 - db DECO_BIG_SNORLAX_DOLL ; 1a - db DECO_BIG_ONIX_DOLL ; 1b - db DECO_BIG_LAPRAS_DOLL ; 1c - db -1 -; 26959 - -DecoExitMenu: ; 26959 - scf - ret -; 2695b - -PopulateDecoCategoryMenu: ; 2695b - ld a, [wd002] - and a - jr z, .empty - cp 8 - jr nc, .beyond_eight - xor a - ld [wWhichIndexSet], a - ld hl, .NonscrollingMenuHeader - call LoadMenuHeader - call DoNthMenu - jr c, .no_action_1 - call DoDecorationAction2 - -.no_action_1 - call ExitMenu - ret - -.beyond_eight - ld hl, wd002 - ld e, [hl] - dec [hl] - ld d, 0 - add hl, de - ld [hl], -1 - call LoadStandardMenuHeader - ld hl, .ScrollingMenuHeader - call CopyMenuHeader - xor a - ld [hBGMapMode], a - call InitScrollingMenu - xor a - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuJoypad] - cp 2 - jr z, .no_action_2 - call DoDecorationAction2 - -.no_action_2 - call ExitMenu - ret - -.empty - ld hl, .Text_nothing_to_choose - call MenuTextBoxBackup - ret -; 269b0 - -.Text_nothing_to_choose: ; 0x269b0 - ; There's nothing to choose. - text_jump UnknownText_0x1bc471 - db "@" -; 0x269b5 - -.NonscrollingMenuHeader: ; 0x269b5 - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .NonscrollingMenuData - db 1 ; default option -; 0x269bd - -.NonscrollingMenuData: ; 0x269bd - db STATICMENU_CURSOR | STATICMENU_WRAP ; flags - db 0 ; items - dw wd002 - dw DecorationMenuFunction - dw DecorationAttributes -; 0x269c5 - -.ScrollingMenuHeader: ; 0x269c5 - db MENU_BACKUP_TILES ; flags - menu_coords 1, 1, SCREEN_WIDTH - 2, SCREEN_HEIGHT - 2 - dw .ScrollingMenuData - db 1 ; default option -; 0x269cd - -.ScrollingMenuData: ; 0x269cd - db SCROLLINGMENU_DISPLAY_ARROWS ; flags - db 8, 0 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wd002 ; text pointer - dba DecorationMenuFunction - dbw 0, 0 - dbw 0, 0 -; 269dd - - -GetDecorationData: ; 269dd - ld hl, DecorationAttributes - ld bc, 6 - call AddNTimes - ret -; 269e7 - -GetDecorationName: ; 269e7 - push hl - call GetDecorationData - call GetDecoName - pop hl - call CopyName2 - ret -; 269f3 - -DecorationMenuFunction: ; 269f3 - ld a, [wMenuSelection] - push de - call GetDecorationData - call GetDecoName - pop hl - call PlaceString - ret -; 26a02 - -DoDecorationAction2: ; 26a02 - ld a, [wMenuSelection] - call GetDecorationData - ld de, 2 ; function 2 - add hl, de - ld a, [hl] - ld hl, .DecoActions - rst JumpTable - ret -; 26a12 - -.DecoActions: ; 26a12 - dw DecoAction_nothing - dw DecoAction_setupbed - dw DecoAction_putawaybed - dw DecoAction_setupcarpet - dw DecoAction_putawaycarpet - dw DecoAction_setupplant - dw DecoAction_putawayplant - dw DecoAction_setupposter - dw DecoAction_putawayposter - dw DecoAction_setupconsole - dw DecoAction_putawayconsole - dw DecoAction_setupbigdoll - dw DecoAction_putawaybigdoll - dw DecoAction_setupornament - dw DecoAction_putawayornament -; 26a30 - - -GetDecorationFlag: ; 26a30 - call GetDecorationData - ld de, 3 ; event flag - add hl, de - ld a, [hli] - ld d, [hl] - ld e, a - ret -; 26a3b - -DecorationFlagAction: ; 26a3b - push bc - call GetDecorationFlag - pop bc - call EventFlagAction - ret -; 26a44 - -GetDecorationSprite: ; 26a44 - ld a, c - call GetDecorationData - ld de, 5 ; sprite - add hl, de - ld a, [hl] - ld c, a - ret -; 26a4f - -INCLUDE "data/decorations/attributes.asm" - -INCLUDE "data/decorations/names.asm" - -GetDecoName: ; 26c72 - ld a, [hli] - ld e, [hl] - ld bc, wStringBuffer2 - push bc - ld hl, .NameFunctions - rst JumpTable - pop de - ret -; 26c7e - -.NameFunctions: ; 26c7e - dw .invalid - dw .plant - dw .bed - dw .carpet - dw .poster - dw .doll - dw .bigdoll -; 26c8c - - -.invalid ; 26c8c - ret -; 26c8d - -.plant ; 26c8d - ld a, e - jr .getdeconame - -.bed ; 26c90 - call .plant - ld a, _BED - jr .getdeconame - -.carpet ; 26c97 - call .plant - ld a, _CARPET - jr .getdeconame - -.poster ; 26c9e - ld a, e - call .getpokename - ld a, _POSTER - jr .getdeconame - -.doll ; 26ca6 - ld a, e - call .getpokename - ld a, _DOLL - jr .getdeconame - -.bigdoll ; 26cae - push de - ld a, BIG_ - call .getdeconame - pop de - ld a, e - jr .getpokename - -.unused ; 26cb8 - push de - call .getdeconame - pop de - ld a, e - jr .getdeconame - -.getpokename ; 26cc0 - push bc - ld [wd265], a - call GetPokemonName - pop bc - jr .copy - -.getdeconame ; 26cca - call ._getdeconame - jr .copy - -._getdeconame ; 26ccf - push bc - ld hl, DecorationNames - call GetNthString - ld d, h - ld e, l - pop bc - ret - -.copy ; 26cda - ld h, b - ld l, c - call CopyName2 - dec hl - ld b, h - ld c, l - ret -; 26ce3 - -DecoAction_nothing: ; 26ce3 - scf - ret -; 26ce5 - -DecoAction_setupbed: ; 26ce5 - ld hl, wDecoBed - jp DecoAction_TrySetItUp -; 26ceb - -DecoAction_putawaybed: ; 26ceb - ld hl, wDecoBed - jp DecoAction_TryPutItAway -; 26cf1 - -DecoAction_setupcarpet: ; 26cf1 - ld hl, wDecoCarpet - jp DecoAction_TrySetItUp -; 26cf7 - -DecoAction_putawaycarpet: ; 26cf7 - ld hl, wDecoCarpet - jp DecoAction_TryPutItAway -; 26cfd - -DecoAction_setupplant: ; 26cfd - ld hl, wDecoPlant - jp DecoAction_TrySetItUp -; 26d03 - -DecoAction_putawayplant: ; 26d03 - ld hl, wDecoPlant - jp DecoAction_TryPutItAway -; 26d09 - -DecoAction_setupposter: ; 26d09 - ld hl, wDecoPoster - jp DecoAction_TrySetItUp -; 26d0f - -DecoAction_putawayposter: ; 26d0f - ld hl, wDecoPoster - jp DecoAction_TryPutItAway -; 26d15 - -DecoAction_setupconsole: ; 26d15 - ld hl, wDecoConsole - jp DecoAction_TrySetItUp -; 26d1b - -DecoAction_putawayconsole: ; 26d1b - ld hl, wDecoConsole - jp DecoAction_TryPutItAway -; 26d21 - -DecoAction_setupbigdoll: ; 26d21 - ld hl, wDecoBigDoll - jp DecoAction_TrySetItUp -; 26d27 - -DecoAction_putawaybigdoll: ; 26d27 - ld hl, wDecoBigDoll - jp DecoAction_TryPutItAway -; 26d2d - -DecoAction_TrySetItUp: ; 26d2d - ld a, [hl] - ld [wBuffer1], a - push hl - call DecoAction_SetItUp - jr c, .failed - ld a, 1 - ld [wBuffer5], a - pop hl - ld a, [wMenuSelection] - ld [hl], a - xor a - ret - -.failed - pop hl - xor a - ret -; 26d46 - -DecoAction_SetItUp: ; 26d46 -; See if there's anything of the same type already out - ld a, [wBuffer1] - and a - jr z, .nothingthere -; See if that item is already out - ld b, a - ld a, [wMenuSelection] - cp b - jr z, .alreadythere -; Put away the item that's already out, and set up the new one - ld a, [wMenuSelection] - ld hl, wStringBuffer4 - call GetDecorationName - ld a, [wBuffer1] - ld hl, wStringBuffer3 - call GetDecorationName - ld hl, DecoText_PutAwayAndSetUp - call MenuTextBoxBackup - xor a - ret - -.nothingthere - ld a, [wMenuSelection] - ld hl, wStringBuffer3 - call GetDecorationName - ld hl, DecoText_SetUpTheDeco - call MenuTextBoxBackup - xor a - ret - -.alreadythere - ld hl, DecoText_AlreadySetUp - call MenuTextBoxBackup - scf - ret -; 26d86 - -DecoAction_TryPutItAway: ; 26d86 -; If there is no item of that type already set, there is nothing to put away. - ld a, [hl] - ld [wBuffer1], a - xor a - ld [hl], a - ld a, [wBuffer1] - and a - jr z, .nothingthere -; Put it away. - ld a, $1 - ld [wBuffer5], a - ld a, [wBuffer1] - ld [wMenuSelection], a - ld hl, wStringBuffer3 - call GetDecorationName - ld hl, DecoText_PutAwayTheDeco - call MenuTextBoxBackup - xor a - ret - -.nothingthere - ld hl, DecoText_NothingToPutAway - call MenuTextBoxBackup - xor a - ret -; 26db3 - -DecoAction_setupornament: ; 26db3 - ld hl, UnknownText_0x26e41 - call DecoAction_AskWhichSide - jr c, .cancel - call DecoAction_SetItUp_Ornament - jr c, .cancel - ld a, $1 - ld [wBuffer5], a - jr DecoAction_FinishUp_Ornament - -.cancel - xor a - ret - -DecoAction_putawayornament: ; 26dc9 - ld hl, DecoText_WhichSide - call DecoAction_AskWhichSide - jr nc, .incave - xor a - ret - -.incave - call DecoAction_PutItAway_Ornament - -DecoAction_FinishUp_Ornament: ; 26dd6 - call QueryWhichSide - ld a, [wSelectedDecoration] - ld [hl], a - ld a, [wOtherDecoration] - ld [de], a - xor a - ret -; 26de3 - -DecoAction_SetItUp_Ornament: ; 26de3 - ld a, [wSelectedDecoration] - and a - jr z, .nothingthere - ld b, a - ld a, [wMenuSelection] - cp b - jr z, .failed - ld a, b - ld hl, wStringBuffer3 - call GetDecorationName - ld a, [wMenuSelection] - ld hl, wStringBuffer4 - call GetDecorationName - ld a, [wMenuSelection] - ld [wSelectedDecoration], a - call .getwhichside - ld hl, DecoText_PutAwayAndSetUp - call MenuTextBoxBackup - xor a - ret - -.nothingthere - ld a, [wMenuSelection] - ld [wSelectedDecoration], a - call .getwhichside - ld a, [wMenuSelection] - ld hl, wStringBuffer3 - call GetDecorationName - ld hl, DecoText_SetUpTheDeco - call MenuTextBoxBackup - xor a - ret - -.failed - ld hl, DecoText_AlreadySetUp - call MenuTextBoxBackup - scf - ret -; 26e33 - -.getwhichside ; 26e33 - ld a, [wMenuSelection] - ld b, a - ld a, [wOtherDecoration] - cp b - ret nz - xor a - ld [wOtherDecoration], a - ret -; 26e41 - -UnknownText_0x26e41: ; 0x26e41 - ; Which side do you want to put it on? - text_jump UnknownText_0x1bc48c - db "@" -; 0x26e46 - -DecoAction_PutItAway_Ornament: ; 26e46 - ld a, [wSelectedDecoration] - and a - jr z, .nothingthere - ld hl, wStringBuffer3 - call GetDecorationName - ld a, $1 - ld [wBuffer5], a - xor a - ld [wSelectedDecoration], a - ld hl, DecoText_PutAwayTheDeco - call MenuTextBoxBackup - xor a - ret - -.nothingthere - ld hl, DecoText_NothingToPutAway - call MenuTextBoxBackup - xor a - ret -; 26e6b - -DecoText_WhichSide: ; 0x26e6b - ; Which side do you want to put away? - text_jump UnknownText_0x1bc4b2 - db "@" -; 0x26e70 - -DecoAction_AskWhichSide: ; 26e70 - call MenuTextBox - ld hl, MenuHeader_0x26eab - call GetMenu2 - call ExitMenu - call CopyMenuData - jr c, .nope - ld a, [wMenuCursorY] - cp 3 - jr z, .nope - ld [wBuffer2], a - call QueryWhichSide - ld a, [hl] - ld [wSelectedDecoration], a - ld a, [de] - ld [wOtherDecoration], a - xor a - ret - -.nope - scf - ret -; 26e9a - -QueryWhichSide: ; 26e9a - ld hl, wDecoRightOrnament - ld de, wDecoLeftOrnament - ld a, [wBuffer2] - cp 1 - ret z - push hl - ld h, d - ld l, e - pop de - ret -; 26eab - -MenuHeader_0x26eab: ; 0x26eab - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, 13, 7 - dw MenuData_0x26eb3 - db 1 ; default option -; 0x26eb3 - -MenuData_0x26eb3: ; 0x26eb3 - db STATICMENU_CURSOR ; flags - db 3 ; items - db "RIGHT SIDE@" - db "LEFT SIDE@" - db "CANCEL@" -; 0x26ed1 - -DecoText_PutAwayTheDeco: ; 0x26ed1 - ; Put away the @ . - text_jump UnknownText_0x1bc4d7 - db "@" -; 0x26ed6 - -DecoText_NothingToPutAway: ; 0x26ed6 - ; There's nothing to put away. - text_jump UnknownText_0x1bc4ec - db "@" -; 0x26edb - -DecoText_SetUpTheDeco: ; 0x26edb - ; Set up the @ . - text_jump UnknownText_0x1bc509 - db "@" -; 0x26ee0 - -DecoText_PutAwayAndSetUp: ; 0x26ee0 - ; Put away the @ and set up the @ . - text_jump UnknownText_0x1bc51c - db "@" -; 0x26ee5 - -DecoText_AlreadySetUp: ; 0x26ee5 - ; That's already set up. - text_jump UnknownText_0x1bc546 - db "@" -; 0x26eea - -GetDecorationName_c_de: ; 26eea - ld a, c - ld h, d - ld l, e - call GetDecorationName - ret -; 26ef1 - -DecorationFlagAction_c: ; 26ef1 - ld a, c - jp DecorationFlagAction -; 26ef5 - - -GetDecorationName_c: ; 26ef5 (9:6ef5) - ld a, c - call GetDecorationID - ld hl, wStringBuffer1 - push hl - call GetDecorationName - pop de - ret - - -SetSpecificDecorationFlag: ; 26f02 - ld a, c - call GetDecorationID - ld b, SET_FLAG - call DecorationFlagAction - ret -; 26f0c - -GetDecorationID: ; 26f0c - push hl - push de - ld e, a - ld d, 0 - ld hl, DecorationIDs - add hl, de - ld a, [hl] - pop de - pop hl - ret -; 26f19 - -SetAllDecorationFlags: ; 26f19 - ld hl, DecorationIDs -.loop - ld a, [hli] - cp -1 - jr z, .done - push hl - ld b, SET_FLAG - call DecorationFlagAction - pop hl - jr .loop - -.done - ret -; 26f2b - -INCLUDE "data/decorations/decorations.asm" - -DescribeDecoration:: ; 26f59 - ld a, b - ld hl, .JumpTable - rst JumpTable - ret -; 26f5f - -.JumpTable: ; 26f5f -; entries correspond to DECODESC_* constants - dw DecorationDesc_Poster - dw DecorationDesc_LeftOrnament - dw DecorationDesc_RightOrnament - dw DecorationDesc_GiantOrnament - dw DecorationDesc_Console -; 26f69 - -DecorationDesc_Poster: ; 26f69 - ld a, [wDecoPoster] - ld hl, DecorationDesc_PosterPointers - ld de, 3 - call IsInArray - jr c, .nope - ld de, DecorationDesc_NullPoster - ld b, BANK(DecorationDesc_NullPoster) - ret - -.nope - ld b, BANK(DecorationDesc_TownMapPoster) - inc hl - ld a, [hli] - ld d, [hl] - ld e, a - ret -; 26f84 - -DecorationDesc_PosterPointers: ; 26f84 - dbw DECO_TOWN_MAP, DecorationDesc_TownMapPoster - dbw DECO_PIKACHU_POSTER, DecorationDesc_PikachuPoster - dbw DECO_CLEFAIRY_POSTER, DecorationDesc_ClefairyPoster - dbw DECO_JIGGLYPUFF_POSTER, DecorationDesc_JigglypuffPoster - db -1 -; 26f91 - -DecorationDesc_TownMapPoster: ; 0x26f91 - opentext - writetext .TownMapText - waitbutton - special OverworldTownMap - closetext - end -; 0x26f9b - -.TownMapText: ; 0x26f9b - ; It's the TOWN MAP. - text_jump UnknownText_0x1bc55d - db "@" -; 0x26fa0 - -DecorationDesc_PikachuPoster: ; 0x26fa0 - jumptext .PikaPosterText -; 0x26fa3 - -.PikaPosterText: ; 0x26fa3 - ; It's a poster of a cute PIKACHU. - text_jump UnknownText_0x1bc570 - db "@" -; 0x26fa8 - -DecorationDesc_ClefairyPoster: ; 0x26fa8 - jumptext .ClefairyPosterText -; 0x26fab - -.ClefairyPosterText: ; 0x26fab - ; It's a poster of a cute CLEFAIRY. - text_jump UnknownText_0x1bc591 - db "@" -; 0x26fb0 - -DecorationDesc_JigglypuffPoster: ; 0x26fb0 - jumptext .JigglypuffPosterText -; 0x26fb3 - -.JigglypuffPosterText: ; 0x26fb3 - ; It's a poster of a cute JIGGLYPUFF. - text_jump UnknownText_0x1bc5b3 - db "@" -; 0x26fb8 - -DecorationDesc_NullPoster: ; 26fb8 - end -; 26fb9 - -DecorationDesc_LeftOrnament: ; 26fb9 - ld a, [wDecoLeftOrnament] - jr DecorationDesc_OrnamentOrConsole - -DecorationDesc_RightOrnament: ; 26fbe - ld a, [wDecoRightOrnament] - jr DecorationDesc_OrnamentOrConsole - -DecorationDesc_Console: ; 26fc3 - ld a, [wDecoConsole] - jr DecorationDesc_OrnamentOrConsole - -DecorationDesc_OrnamentOrConsole: ; 26fc8 - ld c, a - ld de, wStringBuffer3 - call GetDecorationName_c_de - ld b, BANK(.OrnamentConsoleScript) - ld de, .OrnamentConsoleScript - ret -; 26fd5 - -.OrnamentConsoleScript: ; 26fd5 - jumptext .OrnamentConsoleText -; 26fd8 - -.OrnamentConsoleText: ; 0x26fd8 - ; It's an adorable @ . - text_jump UnknownText_0x1bc5d7 - db "@" -; 0x26fdd - -DecorationDesc_GiantOrnament: ; 26fdd - ld b, BANK(.BigDollScript) - ld de, .BigDollScript - ret -; 26fe3 - -.BigDollScript: ; 26fe3 - jumptext .BigDollText -; 26fe6 - -.BigDollText: ; 0x26fe6 - ; A giant doll! It's fluffy and cuddly. - text_jump UnknownText_0x1bc5ef - db "@" -; 0x26feb - -ToggleMaptileDecorations: ; 26feb - lb de, 0, 4 - ld a, [wDecoBed] - call SetDecorationTile - lb de, 7, 4 - ld a, [wDecoPlant] - call SetDecorationTile - lb de, 6, 0 - ld a, [wDecoPoster] - call SetDecorationTile - call SetPosterVisibility - lb de, 0, 0 - call PadCoords_de - ld a, [wDecoCarpet] - and a - ret z - call _GetDecorationSprite - ld [hl], a - push af - lb de, 0, 2 - call PadCoords_de - pop af - inc a - ld [hli], a - inc a - ld [hli], a - dec a - ld [hl], a - ret -; 27027 - -SetPosterVisibility: ; 27027 - ld b, SET_FLAG - ld a, [wDecoPoster] - and a - jr nz, .ok - ld b, RESET_FLAG - -.ok - ld de, EVENT_PLAYERS_ROOM_POSTER - jp EventFlagAction -; 27037 - -SetDecorationTile: ; 27037 - push af - call PadCoords_de - pop af - and a - ret z - call _GetDecorationSprite - ld [hl], a - ret -; 27043 - -ToggleDecorationsVisibility: ; 27043 - ld de, EVENT_PLAYERS_HOUSE_2F_CONSOLE - ld hl, wVariableSprites + SPRITE_CONSOLE - SPRITE_VARS - ld a, [wDecoConsole] - call ToggleDecorationVisibility - ld de, EVENT_PLAYERS_HOUSE_2F_DOLL_1 - ld hl, wVariableSprites + SPRITE_DOLL_1 - SPRITE_VARS - ld a, [wDecoLeftOrnament] - call ToggleDecorationVisibility - ld de, EVENT_PLAYERS_HOUSE_2F_DOLL_2 - ld hl, wVariableSprites + SPRITE_DOLL_2 - SPRITE_VARS - ld a, [wDecoRightOrnament] - call ToggleDecorationVisibility - ld de, EVENT_PLAYERS_HOUSE_2F_BIG_DOLL - ld hl, wVariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS - ld a, [wDecoBigDoll] - call ToggleDecorationVisibility - ret -; 27074 - -ToggleDecorationVisibility: ; 27074 - and a - jr z, .hide - call _GetDecorationSprite - ld [hl], a - ld b, RESET_FLAG - jp EventFlagAction - -.hide - ld b, SET_FLAG - jp EventFlagAction -; 27085 - -_GetDecorationSprite: ; 27085 - ld c, a - push de - push hl - farcall GetDecorationSprite - pop hl - pop de - ld a, c - ret -; 27092 - -PadCoords_de: ; 27092 - ld a, d - add 4 - ld d, a - ld a, e - add 4 - ld e, a - call GetBlockLocation - ret diff --git a/engine/delete_save_change_clock.asm b/engine/delete_save_change_clock.asm deleted file mode 100755 index 431dc6034..000000000 --- a/engine/delete_save_change_clock.asm +++ /dev/null @@ -1,296 +0,0 @@ -_ResetClock: ; 4d3b1 - farcall BlankScreen - ld b, SCGB_DIPLOMA - call GetSGBLayout - call LoadStandardFont - call LoadFontsExtra - ld de, MUSIC_MAIN_MENU - call PlayMusic - ld hl, .text_askreset - call PrintText - ld hl, .NoYes_MenuHeader - call CopyMenuHeader - call VerticalMenu - ret c - ld a, [wMenuCursorY] - cp $1 - ret z - call ClockResetPassword - jr c, .wrongpassword - ld a, BANK(sRTCStatusFlags) - call GetSRAMBank - ld a, $80 - ld [sRTCStatusFlags], a - call CloseSRAM - ld hl, .text_okay - call PrintText - ret - -.wrongpassword - ld hl, .text_wrong - call PrintText - ret - -.text_okay ; 0x4d3fe - ; Password OK. Select CONTINUE & reset settings. - text_jump UnknownText_0x1c55db - db "@" - -.text_wrong ; 0x4d403 - ; Wrong password! - text_jump UnknownText_0x1c560b - db "@" - -.text_askreset ; 0x4d408 - ; Reset the clock? - text_jump UnknownText_0x1c561c - db "@" - -.NoYes_MenuHeader: ; 0x4d40d - db 0 ; flags - menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .NoYes_MenuData - db 1 ; default option - -.NoYes_MenuData: ; 0x4d415 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "NO@" - db "YES@" - -ClockResetPassword: ; 4d41e - call .CalculatePassword - push de - ld hl, wStringBuffer2 - ld bc, 5 - xor a - call ByteFill - ld a, $4 - ld [wStringBuffer2 + 5], a - ld hl, .pleaseenterpasswordtext - call PrintText -.loop - call .updateIDdisplay -.loop2 - call JoyTextDelay - ld a, [hJoyLast] - ld b, a - and A_BUTTON - jr nz, .confirm - ld a, b - and D_PAD - jr z, .loop2 - call .dpadinput - ld c, 3 - call DelayFrames - jr .loop - -.confirm - call .ConvertDecIDToBytes - pop de - ld a, e - cp l - jr nz, .nope - ld a, d - cp h - jr nz, .nope - and a - ret - -.nope - scf - ret - -.pleaseenterpasswordtext ; 0x4d463 - ; Please enter the password. - text_jump UnknownText_0x1c562e - db "@" - -.updateIDdisplay ; 4d468 - hlcoord 14, 15 - ld de, wStringBuffer2 - ld c, 5 -.loop3 - ld a, [de] - add "0" - ld [hli], a - inc de - dec c - jr nz, .loop3 - hlcoord 14, 16 - ld bc, 5 - ld a, " " - call ByteFill - hlcoord 14, 16 - ld a, [wStringBuffer2 + 5] - ld e, a - ld d, $0 - add hl, de - ld [hl], "▲" - ret - -.dpadinput ; 4d490 - ld a, b - and D_LEFT - jr nz, .left - ld a, b - and D_RIGHT - jr nz, .right - ld a, b - and D_UP - jr nz, .up - ld a, b - and D_DOWN - jr nz, .down - ret - -.left - ld a, [wStringBuffer2 + 5] - and a - ret z - dec a - ld [wStringBuffer2 + 5], a - ret - -.right - ld a, [wStringBuffer2 + 5] - cp $4 - ret z - inc a - ld [wStringBuffer2 + 5], a - ret - -.up - call .getcurrentdigit - ld a, [hl] - cp 9 - jr z, .wraparound_up - inc a - ld [hl], a - ret - -.wraparound_up - ld [hl], $0 - ret - -.down - call .getcurrentdigit - ld a, [hl] - and a - jr z, .wraparound_down - dec a - ld [hl], a - ret - -.wraparound_down - ld [hl], 9 - ret - -.getcurrentdigit ; 4d4d5 - ld a, [wStringBuffer2 + 5] - ld e, a - ld d, $0 - ld hl, wStringBuffer2 - add hl, de - ret - -.ConvertDecIDToBytes: ; 4d4e0 - ld hl, 0 - ld de, wStringBuffer2 + 4 - ld bc, 1 - call .ConvertToBytes - ld bc, 10 - call .ConvertToBytes - ld bc, 100 - call .ConvertToBytes - ld bc, 1000 - call .ConvertToBytes - ld bc, 10000 -.ConvertToBytes: ; 4d501 - ld a, [de] - dec de - push hl - ld hl, 0 - call AddNTimes - ld c, l - ld b, h - pop hl - add hl, bc - ret - -.CalculatePassword: ; 4d50f - ld a, BANK(sPlayerData) - call GetSRAMBank - ld de, 0 - ld hl, sPlayerData + (wPlayerID - wPlayerData) - ld c, $2 - call .ComponentFromNumber - ld hl, sPlayerData + (wPlayerName - wPlayerData) - ld c, NAME_LENGTH_JAPANESE - 1 - call .ComponentFromString - ld hl, sPlayerData + (wMoney - wPlayerData) - ld c, $3 - call .ComponentFromNumber - call CloseSRAM - ret - -.ComponentFromNumber: ; 4d533 - ld a, [hli] - add e - ld e, a - ld a, $0 - adc d - ld d, a - dec c - jr nz, .ComponentFromNumber - ret - -.ComponentFromString: ; 4d53e - ld a, [hli] - cp "@" - ret z - add e - ld e, a - ld a, $0 - adc d - ld d, a - dec c - jr nz, .ComponentFromString - ret - -_DeleteSaveData: ; 4d54c - farcall BlankScreen - ld b, SCGB_DIPLOMA - call GetSGBLayout - call LoadStandardFont - call LoadFontsExtra - ld de, MUSIC_MAIN_MENU - call PlayMusic - ld hl, .Text_ClearAllSaveData - call PrintText - ld hl, .NoYesMenuHeader - call CopyMenuHeader - call VerticalMenu - ret c - ld a, [wMenuCursorY] - cp $1 - ret z - farcall EmptyAllSRAMBanks - ret - -.Text_ClearAllSaveData: ; 0x4d580 - ; Clear all save data? - text_jump UnknownText_0x1c564a - db "@" - -.NoYesMenuHeader: ; 0x4d585 - db 0 ; flags - menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option - -.MenuData: ; 0x4d58d - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "NO@" - db "YES@" diff --git a/engine/diploma.asm b/engine/diploma.asm deleted file mode 100644 index 5d0482cc4..000000000 --- a/engine/diploma.asm +++ /dev/null @@ -1,93 +0,0 @@ -_Diploma: ; 1dd702 - call PlaceDiplomaOnScreen - call WaitPressAorB_BlinkCursor - ret -; 1dd709 - -PlaceDiplomaOnScreen: ; 1dd709 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - ld hl, DiplomaGFX - ld de, vTiles2 - call Decompress - ld hl, DiplomaPage1Tilemap - decoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - call CopyBytes - ld de, .Player - hlcoord 2, 5 - call PlaceString - ld de, .EmptyString - hlcoord 15, 5 - call PlaceString - ld de, wPlayerName - hlcoord 9, 5 - call PlaceString - ld de, .Certification - hlcoord 2, 8 - call PlaceString - call EnableLCD - call WaitBGMap - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - call DelayFrame - ret -; 1dd760 - -.Player: - db "PLAYER@" - -.EmptyString: - db "@" - -.Certification: - db "This certifies" - next "that you have" - next "completed the" - next "new #DEX." - next "Congratulations!" - db "@" -; 1dd7ae - -PrintDiplomaPage2: ; 1dd7ae - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $7f - call ByteFill - ld hl, DiplomaPage2Tilemap - decoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - call CopyBytes - ld de, .GameFreak - hlcoord 8, 0 - call PlaceString - ld de, .PlayTime - hlcoord 3, 15 - call PlaceString - hlcoord 12, 15 - ld de, wGameTimeHours - lb bc, 2, 4 - call PrintNum - ld [hl], $67 ; colon - inc hl - ld de, wGameTimeMinutes - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ret -; 1dd7f0 - -.PlayTime: db "PLAY TIME@" -.GameFreak: db "GAME FREAK@" -; 1dd805 - -DiplomaGFX: ; 1dd805 -INCBIN "gfx/diploma/diploma.2bpp.lz" - -DiplomaPage1Tilemap: ; 1ddc4b -INCBIN "gfx/diploma/page1.tilemap" - -DiplomaPage2Tilemap: ; 1dddb3 -INCBIN "gfx/diploma/page2.tilemap" diff --git a/engine/dummy_game.asm b/engine/dummy_game.asm deleted file mode 100755 index 6d7e12196..000000000 --- a/engine/dummy_game.asm +++ /dev/null @@ -1,612 +0,0 @@ -_DummyGame: ; e1e5b (38:5e5b) - call .LoadGFXAndPals - call DelayFrame -.loop - call .JumptableLoop - jr nc, .loop - ret - -.LoadGFXAndPals: - call DisableLCD - ld b, SCGB_DIPLOMA - call GetSGBLayout - callfar ClearSpriteAnims - ld hl, LZ_e2221 - ld de, vTiles2 tile $00 - call Decompress - ld hl, Unknown_e00ed - ld de, vTiles0 tile $00 - ld bc, 4 tiles - ld a, BANK(Unknown_e00ed) - call FarCopyBytes - ld a, $8 - ld hl, wc300 - ld [hli], a - ld [hl], $0 - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - xor a - call ByteFill - xor a - ld [hSCY], a - ld [hSCX], a - ld [rWY], a - ld [wJumptableIndex], a - ld a, $1 - ld [hBGMapMode], a - ld a, LCDC_DEFAULT - ld [rLCDC], a - ld a, $e4 - call DmgToCgbBGPals - ld a, $e0 - call DmgToCgbObjPal0 - ret - -.JumptableLoop: - ld a, [wJumptableIndex] - bit 7, a - jr nz, .quit - call .ExecuteJumptable - callfar PlaySpriteAnimations - call DelayFrame - and a - ret - -.quit - scf - ret - -.ExecuteJumptable: - jumptable .Jumptable, wJumptableIndex - -.Jumptable: - dw .RestartGame - dw .ResetBoard - dw .InitBoardTilemapAndCursorObject - dw .CheckTriesRemaining - dw .PickCard1 - dw .PickCard2 - dw .DelayPickAgain - dw .RevealAll - dw .AskPlayAgain - -.RestartGame: - call DummyGame_InitStrings - ld hl, wJumptableIndex - inc [hl] - ret - -.ResetBoard: - call ret_e00ed - jr nc, .proceed - ld hl, wJumptableIndex - set 7, [hl] - ret - -.proceed - call DummyGame_InitBoard - ld hl, wJumptableIndex - inc [hl] - xor a - ld [wDummyGameCounter], a - ld hl, wDummyGameLastMatches -rept 4 - ld [hli], a -endr - ld [hl], a - ld [wDummyGameNumCardsMatched], a -.InitBoardTilemapAndCursorObject: - ld hl, wDummyGameCounter - ld a, [hl] - cp 45 - jr nc, .spawn_object - inc [hl] - call DummyGame_Card2Coord - xor a - ld [wDummyGameLastCardPicked], a - call DummyGame_PlaceCard - ret - -.spawn_object - depixel 6, 3, 4, 4 - ld a, SPRITE_ANIM_INDEX_DUMMY_GAME - call _InitSpriteAnimStruct - ld a, 5 - ld [wDummyGameNumberTriesRemaining], a - ld hl, wJumptableIndex - inc [hl] - ret - -.CheckTriesRemaining: - ld a, [wDummyGameNumberTriesRemaining] - hlcoord 17, 0 - add "0" - ld [hl], a - ld hl, wDummyGameNumberTriesRemaining - ld a, [hl] - and a - jr nz, .next_try - ld a, $7 - ld [wJumptableIndex], a - ret - -.next_try - dec [hl] - xor a - ld [wcf64], a - ld hl, wJumptableIndex - inc [hl] -.PickCard1: - ld a, [wcf64] - and a - ret z - dec a - ld e, a - ld d, 0 - ld hl, wDummyGameCards - add hl, de - ld a, [hl] - cp -1 - ret z - ld [wDummyGameLastCardPicked], a - ld [wDummyGameCard1], a - ld a, e - ld [wDummyGameCard1Location], a - call DummyGame_Card2Coord - call DummyGame_PlaceCard - xor a - ld [wcf64], a - ld hl, wJumptableIndex - inc [hl] - ret - -.PickCard2: - ld a, [wcf64] - and a - ret z - dec a - ld hl, wDummyGameCard1Location - cp [hl] - ret z - ld e, a - ld d, 0 - ld hl, wDummyGameCards - add hl, de - ld a, [hl] - cp -1 - ret z - ld [wDummyGameLastCardPicked], a - ld [wDummyGameCard2], a - ld a, e - ld [wDummyGameCard2Location], a - call DummyGame_Card2Coord - call DummyGame_PlaceCard - ld a, 64 - ld [wDummyGameCounter], a - ld hl, wJumptableIndex - inc [hl] -.DelayPickAgain: - ld hl, wDummyGameCounter - ld a, [hl] - and a - jr z, .PickAgain - dec [hl] - ret - -.PickAgain: - call DummyGame_CheckMatch - ld a, $3 - ld [wJumptableIndex], a - ret - -.RevealAll: - ld a, [hJoypadPressed] - and A_BUTTON - ret z - xor a - ld [wDummyGameCounter], a -.RevelationLoop: - ld hl, wDummyGameCounter - ld a, [hl] - cp 45 - jr nc, .finish_round - inc [hl] - push af - call DummyGame_Card2Coord - pop af - push hl - ld e, a - ld d, $0 - ld hl, wDummyGameCards - add hl, de - ld a, [hl] - pop hl - cp -1 - jr z, .RevelationLoop - ld [wDummyGameLastCardPicked], a - call DummyGame_PlaceCard - jr .RevelationLoop - -.finish_round - call WaitPressAorB_BlinkCursor - ld hl, wJumptableIndex - inc [hl] -.AskPlayAgain: - call ret_e00ed - jr nc, .restart - ld hl, wJumptableIndex - set 7, [hl] - ret - -.restart - xor a - ld [wJumptableIndex], a - ret - -; e2010 - -DummyGame_CheckMatch: ; e2010 - ld hl, wDummyGameCard1 - ld a, [hli] - cp [hl] - jr nz, .no_match - - ld a, [wDummyGameCard1Location] - call DummyGame_Card2Coord - call DummyGame_DeleteCard - - ld a, [wDummyGameCard2Location] - call DummyGame_Card2Coord - call DummyGame_DeleteCard - - ld a, [wDummyGameCard1Location] - ld e, a - ld d, $0 - ld hl, wDummyGameCards - add hl, de - ld [hl], -1 - - ld a, [wDummyGameCard2Location] - ld e, a - ld d, 0 - ld hl, wDummyGameCards - add hl, de - ld [hl], -1 - - ld hl, wDummyGameLastMatches -.find_empty_slot - ld a, [hli] - and a - jr nz, .find_empty_slot - dec hl - ld a, [wDummyGameCard1] - ld [hl], a - ld [wDummyGameLastCardPicked], a - ld hl, wDummyGameNumCardsMatched - ld e, [hl] - inc [hl] - inc [hl] - ld d, 0 - hlcoord 5, 0 - add hl, de - call DummyGame_PlaceCard - ld hl, .VictoryText - call PrintText - ret - -.no_match - xor a - ld [wDummyGameLastCardPicked], a - - ld a, [wDummyGameCard1Location] - call DummyGame_Card2Coord - call DummyGame_PlaceCard - - ld a, [wDummyGameCard2Location] - call DummyGame_Card2Coord - call DummyGame_PlaceCard - - ld hl, DummyGameText_Darn - call PrintText - ret - -.VictoryText: - start_asm - push bc - hlcoord 2, 13 - call DummyGame_PlaceCard - ld hl, DummyGameText_Yeah - pop bc - inc bc - inc bc - inc bc - ret - -; e2093 - -DummyGameText_Yeah: ; 0xe2093 - ; , yeah! - text_jump UnknownText_0x1c1a5b - db "@" -; 0xe2098 - -DummyGameText_Darn: ; 0xe2098 - ; Darn… - text_jump UnknownText_0x1c1a65 - db "@" -; 0xe209d - -DummyGame_InitBoard: ; e209d - ld hl, wDummyGameCards - ld bc, wDummyGameCardsEnd - wDummyGameCards - xor a - call ByteFill - call DummyGame_GetDistributionOfTiles - - ld c, 2 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 8 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 4 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 7 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 3 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 6 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 1 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 5 - ld hl, wDummyGameCards - ld b, wDummyGameCardsEnd - wDummyGameCards -.loop - ld a, [hl] - and a - jr nz, .no_load - ld [hl], c -.no_load - inc hl - dec b - jr nz, .loop - ret - -; e20e5 - -DummyGame_SampleTilePlacement: ; e20e5 - push hl - ld de, wDummyGameCards -.loop - call Random - and %00111111 - cp 45 - jr nc, .loop - ld l, a - ld h, 0 - add hl, de - ld a, [hl] - and a - jr nz, .loop - ld [hl], c - dec b - jr nz, .loop - pop hl - inc hl - ret - -; e2101 - -DummyGame_GetDistributionOfTiles: ; e2101 - ld a, [wMenuCursorY] - dec a - ld l, a - ld h, 0 - add hl, hl - add hl, hl - add hl, hl - ld de, .distributions - add hl, de - ret - -.distributions - db $02, $03, $06, $06, $06, $08, $08, $06 - db $02, $02, $04, $06, $06, $08, $08, $09 - db $02, $02, $02, $04, $07, $08, $08, $0c -; e2128 - -DummyGame_PlaceCard: ; e2128 - ld a, [wDummyGameLastCardPicked] - sla a - sla a - add 4 - ld [hli], a - inc a - ld [hld], a - inc a - ld bc, SCREEN_WIDTH - add hl, bc - ld [hli], a - inc a - ld [hl], a - ld c, 3 - call DelayFrames - ret - -; e2142 - -DummyGame_DeleteCard: ; e2142 - ld a, $1 - ld [hli], a - ld [hld], a - ld bc, SCREEN_WIDTH - add hl, bc - ld [hli], a - ld [hl], a - ld c, 3 - call DelayFrames - ret - -; e2152 - -DummyGame_InitStrings: ; e2152 - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $1 - call ByteFill - hlcoord 0, 0 - ld de, .japstr1 - call PlaceString - hlcoord 15, 0 - ld de, .japstr2 - call PlaceString - ld hl, .dummy_text - call PrintText - ret - -.dummy_text - db "@" -.japstr1 - db "とったもの@" -.japstr2 - db "あと かい@" -; e2183 - -DummyGame_Card2Coord: ; e2183 - ld d, 0 -.find_row - sub 9 - jr c, .found_row - inc d - jr .find_row - -.found_row - add 9 - ld e, a - hlcoord 1, 2 - ld bc, 2 * SCREEN_WIDTH -.loop2 - ld a, d - and a - jr z, .done - add hl, bc - dec d - jr .loop2 - -.done - sla e - add hl, de - ret - -; e21a1 - -DummyGame_InterpretJoypad_AnimateCursor: ; e21a1 (38:61a1) - ld a, [wJumptableIndex] - cp $7 - jr nc, .quit - call JoyTextDelay - ld hl, hJoypadPressed ; $ffa3 - ld a, [hl] - and A_BUTTON - jr nz, .pressed_a - ld a, [hl] - and D_LEFT - jr nz, .pressed_left - ld a, [hl] - and D_RIGHT - jr nz, .pressed_right - ld a, [hl] - and D_UP - jr nz, .pressed_up - ld a, [hl] - and D_DOWN - jr nz, .pressed_down - ret - -.quit - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -.pressed_a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - inc a - ld [wcf64], a - ret - -.pressed_left - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld a, [hl] - and a - ret z - sub 1 tiles - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - dec [hl] - ret - -.pressed_right - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld a, [hl] - cp (9 - 1) tiles - ret z - add 1 tiles - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - inc [hl] - ret - -.pressed_up - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld a, [hl] - and a - ret z - sub 1 tiles - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - sub 9 - ld [hl], a - ret - -.pressed_down - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld a, [hl] - cp (5 - 1) tiles - ret z - add 1 tiles - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - add 9 - ld [hl], a - ret - -; e2221 (38:6221) - -LZ_e2221: ; e2221 -INCBIN "gfx/dummy_game/dummy_game.2bpp.lz" diff --git a/engine/european_mail.asm b/engine/european_mail.asm deleted file mode 100644 index 8f037cc43..000000000 --- a/engine/european_mail.asm +++ /dev/null @@ -1,129 +0,0 @@ -IsMailEuropean: ; 1de5c8 -; return 1 if French -; return 2 if German -; return 3 if Italian -; return 4 if Spanish -; return 0 if none of the above - ld c, $0 - ld hl, sPartyMon1MailAuthorNationality - sPartyMon1Mail - add hl, de - ld a, [hli] - cp "E" - ret nz - ld a, [hli] - inc c - cp "F" - ret z - inc c - cp "G" - ret z - inc c - cp "I" - ret z - inc c - cp "S" - ret z - ld c, $0 - ret - -; The regular font. -StandardEnglishFont: ; 1de5e6 -INCBIN "gfx/font/english.1bpp" - -; An extended font. -FrenchGermanFont: ; 1de9e6 -INCBIN "gfx/font/french_german.1bpp" - -; An even more extended font. -SpanishItalianFont: ; 1dede6 -INCBIN "gfx/font/spanish_italian.1bpp" - -HandleFrenchGermanMail: ; 1df1e6 -; called if mail is french or german -; fix 's 't 'v - ld b, sPartyMon1MailAuthor - sPartyMon1Mail - ld h, d - ld l, e -.loop - ld a, [hl] - cp $dc ; 's in french/german font - jr nz, .check_intermediate_chars - ld a, "'s" - jr .replace - -.check_intermediate_chars - sub "'s" - jr c, .dont_replace - cp "'v" - "'s" + 1 - jr nc, .dont_replace - add $cd - -.replace - ld [hl], a - -.dont_replace - inc hl - dec b - jr nz, .loop - ret - -LireLeCourrierAnglais: -DeutenEnglischenPost: ; 1df203 -; Cette fonction convertit certains des caractères anglais pour -; leur équivalent dans le jeu de caractères français. -; Diese Funktion wandelt bestimmte englische Zeichen, um ihre -; Entsprechung in der Deutschen-Zeichensatz. - ld b, sPartyMon1MailAuthor - sPartyMon1Mail - ld h, d - ld l, e -.loop - ld a, [hl] - cp "'s" - jr nz, .check_intermediate_chars - ld a, $dc - jr .replace - -.check_intermediate_chars - sub $cd - jr c, .dont_replace - cp "'v" - "'s" + 1 - jr nc, .dont_replace - add "'s" - -.replace - ld [hl], a - -.dont_replace - inc hl - dec b - jr nz, .loop - ret - -HandleSpanishItalianMail: ; 1df220 -LeerCorreosIngleses: -LeggiPostaInglese: -; This function converts certain characters between -; the English and Spanish/Italian character sets. -; Esta función convierte ciertos caracteres entre -; el juego de caracteres Inglés y Español. -; Questa funzione converte alcuni caratteri tra -; l'inglese e il set di caratteri italiani. - ld b, sPartyMon1MailAuthor - sPartyMon1Mail - ld h, d - ld l, e -.loop - ld a, [hl] - and $f0 - cp $d0 - jr nz, .dont_replace - ld a, [hl] - add $8 - and $f - or $d0 - ld [hl], a - -.dont_replace - inc hl - dec b - jr nz, .loop - ret diff --git a/engine/events.asm b/engine/events.asm deleted file mode 100644 index 35a54138b..000000000 --- a/engine/events.asm +++ /dev/null @@ -1,1111 +0,0 @@ -INCLUDE "constants.asm" - - -SECTION "Events", ROMX - -OverworldLoop:: ; 966b0 - xor a - ld [wMapStatus], a -.loop - ld a, [wMapStatus] - ld hl, .jumps - rst JumpTable - ld a, [wMapStatus] - cp 3 ; done - jr nz, .loop -.done - ret - -.jumps - dw StartMap - dw EnterMap - dw HandleMap - dw .done -; 966cb - -DisableEvents: ; 966cb - xor a - ld [wScriptFlags3], a - ret -; 966d0 - -EnableEvents:: ; 966d0 - ld a, $ff - ld [wScriptFlags3], a - ret -; 966d6 - -CheckBit5_ScriptFlags3: ; 966d6 - ld hl, wScriptFlags3 - bit 5, [hl] - ret -; 966dc - -DisableWarpsConnxns: ; 966dc - ld hl, wScriptFlags3 - res 2, [hl] - ret -; 966e2 - -DisableCoordEvents: ; 966e2 - ld hl, wScriptFlags3 - res 1, [hl] - ret -; 966e8 - -DisableStepCount: ; 966e8 - ld hl, wScriptFlags3 - res 0, [hl] - ret -; 966ee - -DisableWildEncounters: ; 966ee - ld hl, wScriptFlags3 - res 4, [hl] - ret -; 966f4 - -EnableWarpsConnxns: ; 966f4 - ld hl, wScriptFlags3 - set 2, [hl] - ret -; 966fa - -EnableCoordEvents: ; 966fa - ld hl, wScriptFlags3 - set 1, [hl] - ret -; 96700 - -EnableStepCount: ; 96700 - ld hl, wScriptFlags3 - set 0, [hl] - ret -; 96706 - -EnableWildEncounters: ; 96706 - ld hl, wScriptFlags3 - set 4, [hl] - ret -; 9670c - -CheckWarpConnxnScriptFlag: ; 9670c - ld hl, wScriptFlags3 - bit 2, [hl] - ret -; 96712 - -CheckCoordEventScriptFlag: ; 96712 - ld hl, wScriptFlags3 - bit 1, [hl] - ret -; 96718 - -CheckStepCountScriptFlag: ; 96718 - ld hl, wScriptFlags3 - bit 0, [hl] - ret -; 9671e - -CheckWildEncountersScriptFlag: ; 9671e - ld hl, wScriptFlags3 - bit 4, [hl] - ret -; 96724 - -StartMap: ; 96724 - xor a - ld [wScriptVar], a - xor a - ld [wScriptRunning], a - ld hl, wMapStatus - ld bc, wMapStatusEnd - wMapStatus - call ByteFill - farcall InitCallReceiveDelay - call ClearJoypad -EnterMap: ; 9673e - xor a - ld [wXYComparePointer], a - ld [wXYComparePointer + 1], a - call SetUpFiveStepWildEncounterCooldown - farcall RunMapSetupScript - call DisableEvents - - ld a, [hMapEntryMethod] - cp MAPSETUP_CONNECTION - jr nz, .dont_enable - call EnableEvents -.dont_enable - - ld a, [hMapEntryMethod] - cp MAPSETUP_RELOADMAP - jr nz, .dontresetpoison - xor a - ld [wPoisonStepCount], a -.dontresetpoison - - xor a ; end map entry - ld [hMapEntryMethod], a - ld a, 2 ; HandleMap - ld [wMapStatus], a - ret -; 9676d - -UnusedWait30Frames: ; 9676d - ld c, 30 - call DelayFrames - ret -; 96773 - -HandleMap: ; 96773 - call ResetOverworldDelay - call HandleMapTimeAndJoypad - farcall HandleCmdQueue ; no need to farcall - call MapEvents - -; Not immediately entering a connected map will cause problems. - ld a, [wMapStatus] - cp 2 ; HandleMap - ret nz - - call HandleMapObjects - call NextOverworldFrame - call HandleMapBackground - call CheckPlayerState - ret -; 96795 - -MapEvents: ; 96795 - ld a, [wMapEventStatus] - ld hl, .jumps - rst JumpTable - ret - -.jumps - dw .events - dw .no_events -; 967a1 - -.events ; 967a1 - call PlayerEvents - call DisableEvents - farcall ScriptEvents - ret -; 967ae - -.no_events ; 967ae - ret -; 967af - -MaxOverworldDelay: ; 967af - db 2 -; 967b0 - -ResetOverworldDelay: ; 967b0 - ld a, [MaxOverworldDelay] - ld [wOverworldDelay], a - ret -; 967b7 - -NextOverworldFrame: ; 967b7 - ld a, [wOverworldDelay] - and a - ret z - ld c, a - call DelayFrames - ret -; 967c1 - -HandleMapTimeAndJoypad: ; 967c1 - ld a, [wMapEventStatus] - cp 1 ; no events - ret z - - call UpdateTime - call GetJoypad - call TimeOfDayPals - ret -; 967d1 - -HandleMapObjects: ; 967d1 - farcall HandleNPCStep ; engine/map_objects.asm - farcall _HandlePlayerStep - call _CheckObjectEnteringVisibleRange - ret -; 967e1 - -HandleMapBackground: ; 967e1 - farcall _UpdateSprites - farcall ScrollScreen - farcall PlaceMapNameSign - ret -; 967f4 - -CheckPlayerState: ; 967f4 - ld a, [wPlayerStepFlags] - bit 5, a ; in the middle of step - jr z, .events - bit 6, a ; stopping step - jr z, .noevents - bit 4, a ; in midair - jr nz, .noevents - call EnableEvents -.events - ld a, 0 ; events - ld [wMapEventStatus], a - ret - -.noevents - ld a, 1 ; no events - ld [wMapEventStatus], a - ret -; 96812 - -_CheckObjectEnteringVisibleRange: ; 96812 - ld hl, wPlayerStepFlags - bit 6, [hl] - ret z - farcall CheckObjectEnteringVisibleRange - ret -; 9681f - -PlayerEvents: ; 9681f - xor a -; If there's already a player event, don't interrupt it. - ld a, [wScriptRunning] - and a - ret nz - - call Dummy_CheckScriptFlags3Bit5 ; This is a waste of time - - call CheckTrainerBattle3 - jr c, .ok - - call CheckTileEvent - jr c, .ok - - call RunMemScript - jr c, .ok - - call RunSceneScript - jr c, .ok - - call CheckTimeEvents - jr c, .ok - - call OWPlayerInput - jr c, .ok - - xor a - ret - -.ok - push af - farcall EnableScriptMode - pop af - - ld [wScriptRunning], a - call DoPlayerEvent - ld a, [wScriptRunning] - cp PLAYEREVENT_CONNECTION - jr z, .ok2 - cp PLAYEREVENT_JOYCHANGEFACING - jr z, .ok2 - - xor a - ld [wLandmarkSignTimer], a - -.ok2 - scf - ret -; 96867 - -CheckTrainerBattle3: ; 96867 - nop - nop - call CheckTrainerBattle2 - jr nc, .nope - - ld a, PLAYEREVENT_SEENBYTRAINER - scf - ret - -.nope - xor a - ret -; 96874 - -CheckTileEvent: ; 96874 -; Check for warps, coord events, or wild battles. - - call CheckWarpConnxnScriptFlag - jr z, .connections_disabled - - farcall CheckMovingOffEdgeOfMap - jr c, .map_connection - - call CheckWarpTile - jr c, .warp_tile - -.connections_disabled - call CheckCoordEventScriptFlag - jr z, .coord_events_disabled - - call CheckCurrentMapCoordEvents - jr c, .coord_event - -.coord_events_disabled - call CheckStepCountScriptFlag - jr z, .step_count_disabled - - call CountStep - ret c - -.step_count_disabled - call CheckWildEncountersScriptFlag - jr z, .ok - - call RandomEncounter - ret c - jr .ok ; pointless - -.ok - xor a - ret - -.map_connection - ld a, PLAYEREVENT_CONNECTION - scf - ret - -.warp_tile - ld a, [wPlayerStandingTile] - call CheckPitTile - jr nz, .not_pit - ld a, PLAYEREVENT_FALL - scf - ret - -.not_pit - ld a, PLAYEREVENT_WARP - scf - ret - -.coord_event - ld hl, wCurCoordEventScriptAddr - ld a, [hli] - ld h, [hl] - ld l, a - call GetMapScriptsBank - call CallScript - ret -; 968c7 - -CheckWildEncounterCooldown:: ; 968c7 - ld hl, wWildEncounterCooldown - ld a, [hl] - and a - ret z - dec [hl] - ret z - scf - ret -; 968d1 - -SetUpFiveStepWildEncounterCooldown: ; 968d1 - ld a, 5 - ld [wWildEncounterCooldown], a - ret -; 968d7 - -ret_968d7: ; 968d7 - ret -;968d8 - -SetMinTwoStepWildEncounterCooldown: ; 968d8 - ld a, [wWildEncounterCooldown] - cp 2 - ret nc - ld a, 2 - ld [wWildEncounterCooldown], a - ret -; 968e4 - -Dummy_CheckScriptFlags3Bit5: ; 968e4 - call CheckBit5_ScriptFlags3 - ret z - call ret_2f3e - ret -; 968ec - -RunSceneScript: ; 968ec - ld a, [wCurrMapSceneScriptCount] - and a - jr z, .nope - - ld c, a - call CheckScenes - cp c - jr nc, .nope - - ld e, a - ld d, 0 - ld hl, wCurrMapSceneScriptsPointer - ld a, [hli] - ld h, [hl] - ld l, a -rept 4 - add hl, de -endr - - call GetMapScriptsBank - call GetFarHalfword - call GetMapScriptsBank - call CallScript - - ld hl, wScriptFlags - res 3, [hl] - - farcall EnableScriptMode - farcall ScriptEvents - - ld hl, wScriptFlags - bit 3, [hl] - jr z, .nope - - ld hl, wPriorityScriptAddr - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wPriorityScriptBank] - call CallScript - scf - ret - -.nope - xor a - ret -; 9693a - -CheckTimeEvents: ; 9693a - ld a, [wLinkMode] - and a - jr nz, .nothing - - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - jr z, .do_daily - - farcall CheckBugContestTimer - jr c, .end_bug_contest - xor a - ret - -.do_daily - farcall CheckDailyResetTimer - farcall CheckPokerusTick - farcall CheckPhoneCall - ret c - -.nothing - xor a - ret - -.end_bug_contest - ld a, BANK(BugCatchingContestOverScript) - ld hl, BugCatchingContestOverScript - call CallScript - scf - ret -; 96970 - -.unused ; 96970 - ld a, 8 - scf - ret -; 96974 - -OWPlayerInput: ; 96974 - - call PlayerMovement - ret c - and a - jr nz, .NoAction - -; Can't perform button actions while sliding on ice. - farcall CheckStandingOnIce - jr c, .NoAction - - call CheckAPressOW - jr c, .Action - - call CheckMenuOW - jr c, .Action - -.NoAction: - xor a - ret - -.Action: - push af - farcall StopPlayerForEvent - pop af - scf - ret -; 96999 - -CheckAPressOW: ; 96999 - ld a, [hJoyPressed] - and A_BUTTON - ret z - call TryObjectEvent - ret c - call TryBGEvent - ret c - call TryTileCollisionEvent - ret c - xor a - ret -; 969ac - -PlayTalkObject: ; 969ac - push de - ld de, SFX_READ_TEXT_2 - call PlaySFX - pop de - ret -; 969b5 - -TryObjectEvent: ; 969b5 - farcall CheckFacingObject - jr c, .IsObject - xor a - ret - -.IsObject: - call PlayTalkObject - ld a, [hObjectStructIndexBuffer] - call GetObjectStruct - ld hl, OBJECT_MAP_OBJECT_INDEX - add hl, bc - ld a, [hl] - ld [hLastTalked], a - - ld a, [hLastTalked] - call GetMapObject - ld hl, MAPOBJECT_COLOR - add hl, bc - ld a, [hl] - and %00001111 - -; Bug: If IsInArray returns nc, data at bc will be executed as code. - push bc - ld de, 3 - ld hl, .pointers - call IsInArray - jr nc, .nope_bugged - pop bc - - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.nope_bugged - ; pop bc - xor a - ret - -.pointers - dbw OBJECTTYPE_SCRIPT, .script - dbw OBJECTTYPE_ITEMBALL, .itemball - dbw OBJECTTYPE_TRAINER, .trainer - ; the remaining four are dummy events - dbw OBJECTTYPE_3, .three - dbw OBJECTTYPE_4, .four - dbw OBJECTTYPE_5, .five - dbw OBJECTTYPE_6, .six - db -1 -; 96a04 - -.script ; 96a04 - ld hl, MAPOBJECT_SCRIPT_POINTER - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - call GetMapScriptsBank - call CallScript - ret -; 96a12 - -.itemball ; 96a12 - ld hl, MAPOBJECT_SCRIPT_POINTER - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - call GetMapScriptsBank - ld de, wEngineBuffer1 - ld bc, 2 - call FarCopyBytes - ld a, PLAYEREVENT_ITEMBALL - scf - ret -; 96a29 - -.trainer ; 96a29 - call TalkToTrainer - ld a, PLAYEREVENT_TALKTOTRAINER - scf - ret -; 96a30 - -.three ; 96a30 - xor a - ret -; 96a32 - -.four ; 96a32 - xor a - ret -; 96a34 - -.five ; 96a34 - xor a - ret -; 96a36 - -.six ; 96a36 - xor a - ret -; 96a38 - -TryBGEvent: ; 96a38 - call CheckFacingBGEvent - jr c, .is_bg_event - xor a - ret - -.is_bg_event: - ld a, [wEngineBuffer3] - ld hl, .bg_events - rst JumpTable - ret - -.bg_events - dw .read - dw .up - dw .down - dw .right - dw .left - dw .ifset - dw .ifnotset - dw .itemifset - dw .copy -; 96a59 - -.up - ld b, OW_UP - jr .checkdir -.down - ld b, OW_DOWN - jr .checkdir -.right - ld b, OW_RIGHT - jr .checkdir -.left - ld b, OW_LEFT - jr .checkdir - -.checkdir - ld a, [wPlayerDirection] - and %1100 - cp b - jp nz, .dontread - -.read - call PlayTalkObject - ld hl, wEngineBuffer4 - ld a, [hli] - ld h, [hl] - ld l, a - call GetMapScriptsBank - call CallScript - scf - ret - -.itemifset - call CheckBGEventFlag - jp nz, .dontread - call PlayTalkObject - call GetMapScriptsBank - ld de, wEngineBuffer1 - ld bc, 3 - call FarCopyBytes - ld a, BANK(HiddenItemScript) - ld hl, HiddenItemScript - call CallScript - scf - ret - -.copy - call CheckBGEventFlag - jr nz, .dontread - call GetMapScriptsBank - ld de, wEngineBuffer1 - ld bc, 3 - call FarCopyBytes - jr .dontread - -.ifset - call CheckBGEventFlag - jr z, .dontread - jr .thenread - -.ifnotset - call CheckBGEventFlag - jr nz, .dontread - -.thenread - push hl - call PlayTalkObject - pop hl - inc hl - inc hl - call GetMapScriptsBank - call GetFarHalfword - call GetMapScriptsBank - call CallScript - scf - ret - -.dontread - xor a - ret -; 96ad8 - -CheckBGEventFlag: ; 96ad8 - ld hl, wEngineBuffer4 - ld a, [hli] - ld h, [hl] - ld l, a - push hl - call GetMapScriptsBank - call GetFarHalfword - ld e, l - ld d, h - ld b, CHECK_FLAG - call EventFlagAction - ld a, c - and a - pop hl - ret -; 96af0 - -PlayerMovement: ; 96af0 - farcall DoPlayerMovement - ld a, c - ld hl, .pointers - rst JumpTable - ld a, c - ret -; 96afd - -.pointers - dw .zero - dw .one - dw .two - dw .three - dw .four - dw .five - dw .six - dw .seven - -.zero -.four ; 96b0d - xor a - ld c, a - ret -; 96b10 - -.seven ; 96b10 - call ret_968d7 ; mobile - xor a - ld c, a - ret -; 96b16 - -.one ; 96b16 - ld a, 5 - ld c, a - scf - ret -; 96b1b - -.two ; 96b1b - ld a, 9 - ld c, a - scf - ret -; 96b20 - -.three ; 96b20 -; force the player to move in some direction - ld a, BANK(Script_ForcedMovement) - ld hl, Script_ForcedMovement - call CallScript -; ld a, -1 - ld c, a - scf - ret -; 96b2b - -.five -.six ; 96b2b - ld a, -1 - ld c, a - and a - ret -; 96b30 - -CheckMenuOW: ; 96b30 - xor a - ld [hMenuReturn], a - ld [hMenuReturn + 1], a - ld a, [hJoyPressed] - - bit SELECT_F, a - jr nz, .Select - - bit START_F, a - jr z, .NoMenu - - ld a, BANK(StartMenuScript) - ld hl, StartMenuScript - call CallScript - scf - ret - -.NoMenu: - xor a - ret - -.Select: - call PlayTalkObject - ld a, BANK(SelectMenuScript) - ld hl, SelectMenuScript - call CallScript - scf - ret -; 96b58 - -StartMenuScript: ; 96b58 - callasm StartMenu - jump StartMenuCallback -; 96b5f - -SelectMenuScript: ; 96b5f - callasm SelectMenu - jump SelectMenuCallback -; 96b66 - -StartMenuCallback: -SelectMenuCallback: ; 96b66 - copybytetovar hMenuReturn - ifequal HMENURETURN_SCRIPT, .Script - ifequal HMENURETURN_ASM, .Asm - end -; 96b72 - -.Script: ; 96b72 - ptjump wQueuedScriptBank -; 96b75 - -.Asm: ; 96b75 - ptcallasm wQueuedScriptBank - end -; 96b79 - -CountStep: ; 96b79 - ; Don't count steps in link communication rooms. - ld a, [wLinkMode] - and a - jr nz, .done - - ; If there is a special phone call, don't count the step. - farcall CheckSpecialPhoneCall - jr c, .doscript - - ; If Repel wore off, don't count the step. - call DoRepelStep - jr c, .doscript - - ; Count the step for poison and total steps - ld hl, wPoisonStepCount - inc [hl] - ld hl, wStepCount - inc [hl] - ; Every 256 steps, increase the happiness of all your Pokemon. - jr nz, .skip_happiness - - farcall StepHappiness - -.skip_happiness - ; Every 256 steps, offset from the happiness incrementor by 128 steps, - ; decrease the hatch counter of all your eggs until you reach the first - ; one that is ready to hatch. - ld a, [wStepCount] - cp $80 - jr nz, .skip_egg - - farcall DoEggStep - jr nz, .hatch - -.skip_egg - ; Increase the EXP of (both) DayCare Pokemon by 1. - farcall DayCareStep - - ; Every four steps, deal damage to all Poisoned Pokemon - ld hl, wPoisonStepCount - ld a, [hl] - cp 4 - jr c, .skip_poison - ld [hl], 0 - - farcall DoPoisonStep - jr c, .doscript - -.skip_poison - farcall DoBikeStep - -.done - xor a - ret - -.doscript - ld a, -1 - scf - ret - -.hatch - ld a, 8 - scf - ret -; 96bd3 - -; unused -.unreferenced ; 96bd3 - ld a, 7 - scf - ret -; 96bd7 - -DoRepelStep: ; 96bd7 - ld a, [wRepelEffect] - and a - ret z - - dec a - ld [wRepelEffect], a - ret nz - - ld a, BANK(RepelWoreOffScript) - ld hl, RepelWoreOffScript - call CallScript - scf - ret -; 96beb - -DoPlayerEvent: ; 96beb - ld a, [wScriptRunning] - and a - ret z - - cp PLAYEREVENT_MAPSCRIPT ; run script - ret z - - cp NUM_PLAYER_EVENTS - ret nc - - ld c, a - ld b, 0 - ld hl, PlayerEventScriptPointers - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - ld [wScriptBank], a - ld a, [hli] - ld [wScriptPos], a - ld a, [hl] - ld [wScriptPos + 1], a - ret -; 96c0c - -PlayerEventScriptPointers: ; 96c0c - dba Invalid_0x96c2d ; 0 - dba SeenByTrainerScript ; 1 - dba TalkToTrainerScript ; 2 - dba FindItemInBallScript ; 3 - dba EdgeWarpScript ; 4 - dba WarpToNewMapScript ; 5 - dba FallIntoMapScript ; 6 - dba Script_OverworldWhiteout ; 7 - dba HatchEggScript ; 8 - dba ChangeDirectionScript ; 9 - dba Invalid_0x96c2d ; 10 -; 96c2d - -Invalid_0x96c2d: ; 96c2d - end -; 96c2e - -; unused - end -; 96c2f - -HatchEggScript: ; 96c2f - callasm OverworldHatchEgg - end -; 96c34 - -WarpToNewMapScript: ; 96c34 - warpsound - newloadmap MAPSETUP_DOOR - end -; 96c38 - -FallIntoMapScript: ; 96c38 - newloadmap MAPSETUP_FALL - playsound SFX_KINESIS - applymovement PLAYER, MovementData_0x96c48 - playsound SFX_STRENGTH - scall LandAfterPitfallScript - end -; 96c48 - -MovementData_0x96c48: ; 96c48 - skyfall - step_end -; 96c4a - -LandAfterPitfallScript: ; 96c4a - earthquake 16 - end -; 96c4d - -EdgeWarpScript: ; 4 - reloadandreturn MAPSETUP_CONNECTION -; 96c4f - -ChangeDirectionScript: ; 9 - deactivatefacing 3 - callasm EnableWildEncounters - end -; 96c56 - -INCLUDE "engine/scripting.asm" - -INCLUDE "engine/events_2.asm" diff --git a/engine/events/diploma.asm b/engine/events/diploma.asm new file mode 100644 index 000000000..5d0482cc4 --- /dev/null +++ b/engine/events/diploma.asm @@ -0,0 +1,93 @@ +_Diploma: ; 1dd702 + call PlaceDiplomaOnScreen + call WaitPressAorB_BlinkCursor + ret +; 1dd709 + +PlaceDiplomaOnScreen: ; 1dd709 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + ld hl, DiplomaGFX + ld de, vTiles2 + call Decompress + ld hl, DiplomaPage1Tilemap + decoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + call CopyBytes + ld de, .Player + hlcoord 2, 5 + call PlaceString + ld de, .EmptyString + hlcoord 15, 5 + call PlaceString + ld de, wPlayerName + hlcoord 9, 5 + call PlaceString + ld de, .Certification + hlcoord 2, 8 + call PlaceString + call EnableLCD + call WaitBGMap + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + call DelayFrame + ret +; 1dd760 + +.Player: + db "PLAYER@" + +.EmptyString: + db "@" + +.Certification: + db "This certifies" + next "that you have" + next "completed the" + next "new #DEX." + next "Congratulations!" + db "@" +; 1dd7ae + +PrintDiplomaPage2: ; 1dd7ae + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $7f + call ByteFill + ld hl, DiplomaPage2Tilemap + decoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + call CopyBytes + ld de, .GameFreak + hlcoord 8, 0 + call PlaceString + ld de, .PlayTime + hlcoord 3, 15 + call PlaceString + hlcoord 12, 15 + ld de, wGameTimeHours + lb bc, 2, 4 + call PrintNum + ld [hl], $67 ; colon + inc hl + ld de, wGameTimeMinutes + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ret +; 1dd7f0 + +.PlayTime: db "PLAY TIME@" +.GameFreak: db "GAME FREAK@" +; 1dd805 + +DiplomaGFX: ; 1dd805 +INCBIN "gfx/diploma/diploma.2bpp.lz" + +DiplomaPage1Tilemap: ; 1ddc4b +INCBIN "gfx/diploma/page1.tilemap" + +DiplomaPage2Tilemap: ; 1dddb3 +INCBIN "gfx/diploma/page2.tilemap" diff --git a/engine/events_2.asm b/engine/events_2.asm deleted file mode 100644 index 6e106541a..000000000 --- a/engine/events_2.asm +++ /dev/null @@ -1,650 +0,0 @@ -; More overworld event handling. - - -WarpToSpawnPoint:: ; 97c28 - ld hl, wStatusFlags2 - res STATUSFLAGS2_SAFARI_GAME_F, [hl] - res STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - ret -; 97c30 - -RunMemScript:: ; 97c30 -; If there is no script here, we don't need to be here. - ld a, [wMapReentryScriptQueueFlag] - and a - ret z -; Execute the script at (wMapReentryScriptBank):(wMapReentryScriptAddress). - ld hl, wMapReentryScriptAddress - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wMapReentryScriptBank] - call CallScript - scf -; Clear the buffer for the next script. - push af - xor a - ld hl, wMapReentryScriptQueueFlag - ld bc, 8 - call ByteFill - pop af - ret -; 97c4f - -LoadScriptBDE:: ; 97c4f -; If there's already a script here, don't overwrite. - ld hl, wMapReentryScriptQueueFlag - ld a, [hl] - and a - ret nz -; Set the flag - ld [hl], 1 - inc hl -; Load the script pointer b:de into (wMapReentryScriptBank):(wMapReentryScriptAddress) - ld [hl], b - inc hl - ld [hl], e - inc hl - ld [hl], d - scf - ret -; 97c5f - -TryTileCollisionEvent:: ; 97c5f - call GetFacingTileCoord - ld [wEngineBuffer1], a - ld c, a - farcall CheckFacingTileForStdScript - jr c, .done - - call CheckCutTreeTile - jr nz, .whirlpool - farcall TryCutOW - jr .done - -.whirlpool - ld a, [wEngineBuffer1] - call CheckWhirlpoolTile - jr nz, .waterfall - farcall TryWhirlpoolOW - jr .done - -.waterfall - ld a, [wEngineBuffer1] - call CheckWaterfallTile - jr nz, .headbutt - farcall TryWaterfallOW - jr .done - -.headbutt - ld a, [wEngineBuffer1] - call CheckHeadbuttTreeTile - jr nz, .surf - farcall TryHeadbuttOW - jr c, .done - jr .noevent - -.surf - farcall TrySurfOW - jr nc, .noevent - jr .done - -.noevent - xor a - ret - -.done - call PlayClickSFX - ld a, $ff - scf - ret -; 97cc0 - - -RandomEncounter:: ; 97cc0 -; Random encounter - - call CheckWildEncounterCooldown - jr c, .nope - call CanUseSweetScent - jr nc, .nope - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - jr nz, .bug_contest - farcall TryWildEncounter - jr nz, .nope - jr .ok - -.bug_contest - call _TryWildEncounter_BugContest - jr nc, .nope - jr .ok_bug_contest - -.nope - ld a, 1 - and a - ret - -.ok - ld a, BANK(WildBattleScript) - ld hl, WildBattleScript - jr .done - -.ok_bug_contest - ld a, BANK(BugCatchingContestBattleScript) - ld hl, BugCatchingContestBattleScript - jr .done - -.done - call CallScript - scf - ret -; 97cf9 - -WildBattleScript: ; 97cf9 - randomwildmon - startbattle - reloadmapafterbattle - end -; 97cfd - -CanUseSweetScent:: ; 97cfd - ld hl, wStatusFlags - bit STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] - jr nz, .no - ld a, [wEnvironment] - cp CAVE - jr z, .ice_check - cp DUNGEON - jr z, .ice_check - farcall CheckGrassCollision - jr nc, .no - -.ice_check - ld a, [wPlayerStandingTile] - call CheckIceTile - jr z, .no - scf - ret - -.no - and a - ret -; 97d23 - -_TryWildEncounter_BugContest: ; 97d23 - call TryWildEncounter_BugContest - ret nc - call ChooseWildEncounter_BugContest - farcall CheckRepelEffect - ret -; 97d31 - -ChooseWildEncounter_BugContest:: ; 97d31 -; Pick a random mon out of ContestMons. - -.loop - call Random - cp 100 << 1 - jr nc, .loop - srl a - - ld hl, ContestMons - ld de, 4 -.CheckMon: - sub [hl] - jr c, .GotMon - add hl, de - jr .CheckMon - -.GotMon: - inc hl - -; Species - ld a, [hli] - ld [wTempWildMonSpecies], a - -; Min level - ld a, [hli] - ld d, a - -; Max level - ld a, [hl] - - sub d - jr nz, .RandomLevel - -; If min and max are the same. - ld a, d - jr .GotLevel - -.RandomLevel: -; Get a random level between the min and max. - ld c, a - inc c - call Random - ld a, [hRandomAdd] - call SimpleDivide - add d - -.GotLevel: - ld [wCurPartyLevel], a - - xor a - ret -; 97d64 - -TryWildEncounter_BugContest: ; 97d64 - ld a, [wPlayerStandingTile] - call CheckSuperTallGrassTile - ld b, 40 percent - jr z, .ok - ld b, 20 percent - -.ok - farcall ApplyMusicEffectOnEncounterRate - farcall ApplyCleanseTagEffectOnEncounterRate - call Random - ld a, [hRandomAdd] - cp b - ret c - ld a, 1 - and a - ret -; 97d87 - - -INCLUDE "data/wild/bug_contest_mons.asm" - - -DoBikeStep:: ; 97db3 - nop - nop - ; If the bike shop owner doesn't have our number, or - ; if we've already gotten the call, we don't have to - ; be here. - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl] - jr z, .NoCall - - ; If we're not on the bike, we don't have to be here. - ld a, [wPlayerState] - cp PLAYER_BIKE - jr nz, .NoCall - - ; If we're not in an area of phone service, we don't - ; have to be here. - call GetMapPhoneService - and a - jr nz, .NoCall - - ; Check the bike step count and check whether we've - ; taken 65536 of them yet. - ld hl, wBikeStep - ld a, [hli] - ld d, a - ld e, [hl] - cp 255 - jr nz, .increment - ld a, e - cp 255 - jr z, .dont_increment - -.increment - inc de - ld [hl], e - dec hl - ld [hl], d - -.dont_increment - ; If we've taken at least 1024 steps, have the bike - ; shop owner try to call us. - ld a, d - cp HIGH(1024) - jr c, .NoCall - - ; If a call has already been queued, don't overwrite - ; that call. - ld a, [wSpecialPhoneCallID] - and a - jr nz, .NoCall - - ; Queue the call. - ld a, SPECIALCALL_BIKESHOP - ld [wSpecialPhoneCallID], a - xor a - ld [wSpecialPhoneCallID + 1], a - ld hl, wStatusFlags2 - res STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl] - scf - ret - -.NoCall: - xor a - ret -; 97df9 - -ClearCmdQueue:: ; 97df9 - ld hl, wCmdQueue - ld de, 6 - ld c, 4 - xor a -.loop - ld [hl], a - add hl, de - dec c - jr nz, .loop - ret -; 97e08 - -HandleCmdQueue:: ; 97e08 - ld hl, wCmdQueue - xor a -.loop - ld [hMapObjectIndexBuffer], a - ld a, [hl] - and a - jr z, .skip - push hl - ld b, h - ld c, l - call HandleQueuedCommand - pop hl - -.skip - ld de, CMDQUEUE_ENTRY_SIZE - add hl, de - ld a, [hMapObjectIndexBuffer] - inc a - cp CMDQUEUE_CAPACITY - jr nz, .loop - ret -; 97e25 - -Unreferenced_GetNthCmdQueueEntry: ; 97e25 - ld hl, wCmdQueue - ld bc, CMDQUEUE_ENTRY_SIZE - call AddNTimes - ld b, h - ld c, l - ret -; 97e31 - -WriteCmdQueue:: ; 97e31 - push bc - push de - call .GetNextEmptyEntry - ld d, h - ld e, l - pop hl - pop bc - ret c - ld a, b - ld bc, CMDQUEUE_ENTRY_SIZE - 1 - call FarCopyBytes - xor a - ld [hl], a - ret -; 97e45 - -.GetNextEmptyEntry: ; 97e45 - ld hl, wCmdQueue - ld de, CMDQUEUE_ENTRY_SIZE - ld c, CMDQUEUE_CAPACITY -.loop - ld a, [hl] - and a - jr z, .done - add hl, de - dec c - jr nz, .loop - scf - ret - -.done - ld a, CMDQUEUE_CAPACITY - sub c - and a - ret -; 97e5c - -DelCmdQueue:: ; 97e5c - ld hl, wCmdQueue - ld de, CMDQUEUE_ENTRY_SIZE - ld c, CMDQUEUE_CAPACITY -.loop - ld a, [hl] - cp b - jr z, .done - add hl, de - dec c - jr nz, .loop - and a - ret - -.done - xor a - ld [hl], a - scf - ret -; 97e72 - -_DelCmdQueue: ; 97e72 - ld hl, CMDQUEUE_TYPE - add hl, bc - ld [hl], 0 - ret -; 97e79 - -HandleQueuedCommand: ; 97e79 - ld hl, CMDQUEUE_TYPE - add hl, bc - ld a, [hl] - cp 5 - jr c, .okay - xor a - -.okay - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - add hl, de - ld a, [hli] - push af - ld a, [hli] - ld h, [hl] - ld l, a - pop af - rst FarCall - ret -; 97e94 - -.Jumptable: ; 97e94 - dba CmdQueue_Null - dba CmdQueue_Null2 - dba CmdQueue_StoneTable - dba CmdQueue_Type3 - dba CmdQueue_Type4 -; 97ea3 - -CmdQueueAnonymousJumptable: ; 97ea3 - ld hl, CMDQUEUE_05 - add hl, bc - ld a, [hl] - pop hl - rst JumpTable - ret -; 97eab - -CmdQueueAnonJT_Increment: ; 97eab - ld hl, CMDQUEUE_05 - add hl, bc - inc [hl] - ret -; 97eb1 - -CmdQueueAnonJT_Decrement: ; 97eb1 - ld hl, CMDQUEUE_05 - add hl, bc - dec [hl] - ret -; 97eb7 - -CmdQueue_Null: ; 97eb7 - ret -; 97eb8 - -CmdQueue_Null2: ; 97eb8 - call ret_2f3e - ret -; 97ebc - -CmdQueue_Type4: ; 97ebc - call CmdQueueAnonymousJumptable - ; anonymous dw - dw .zero - dw .one -; 97ec3 - -.zero ; 97ec3 - ld a, [hSCY] - ld hl, 4 - add hl, bc - ld [hl], a - call CmdQueueAnonJT_Increment -.one ; 97ecd - ld hl, 1 - add hl, bc - ld a, [hl] - dec a - ld [hl], a - jr z, .finish - and $1 - jr z, .add - ld hl, 2 - add hl, bc - ld a, [hSCY] - sub [hl] - ld [hSCY], a - ret - -.add - ld hl, 2 - add hl, bc - ld a, [hSCY] - add [hl] - ld [hSCY], a - ret - -.finish - ld hl, 4 - add hl, bc - ld a, [hl] - ld [hSCY], a - call _DelCmdQueue - ret -; 97ef9 - -CmdQueue_Type3: ; 97ef9 - call CmdQueueAnonymousJumptable - ; anonymous dw - dw .zero - dw .one - dw .two -; 97f02 - -.zero ; 97f02 - call .IsPlayerFacingDown - jr z, .PlayerNotFacingDown - call CmdQueueAnonJT_Increment -.one ; 97f0a - call .IsPlayerFacingDown - jr z, .PlayerNotFacingDown - call CmdQueueAnonJT_Increment - - ld hl, 2 - add hl, bc - ld a, [hl] - ld [wd173], a - ret -; 97f1b - -.two ; 97f1b - call .IsPlayerFacingDown - jr z, .PlayerNotFacingDown - call CmdQueueAnonJT_Decrement - - ld hl, 3 - add hl, bc - ld a, [hl] - ld [wd173], a - ret -; 97f2c - -.PlayerNotFacingDown: ; 97f2c - ld a, $7f - ld [wd173], a - ld hl, 5 - add hl, bc - ld [hl], 0 - ret -; 97f38 - -.IsPlayerFacingDown: ; 97f38 - push bc - ld bc, wPlayerStruct - call GetSpriteDirection - and a - pop bc - ret -; 97f42 - -CmdQueue_StoneTable: ; 97f42 - ld de, wPlayerStruct - ld a, NUM_OBJECT_STRUCTS -.loop - push af - - ld hl, OBJECT_SPRITE - add hl, de - ld a, [hl] - and a - jr z, .next - - ld hl, OBJECT_MOVEMENTTYPE - add hl, de - ld a, [hl] - cp SPRITEMOVEDATA_STRENGTH_BOULDER - jr nz, .next - - ld hl, OBJECT_NEXT_TILE - add hl, de - ld a, [hl] - call CheckPitTile - jr nz, .next - - ld hl, OBJECT_DIRECTION_WALKING - add hl, de - ld a, [hl] - cp STANDING - jr nz, .next - call HandleStoneQueue - jr c, .fall_down_hole - -.next - ld hl, OBJECT_STRUCT_LENGTH - add hl, de - ld d, h - ld e, l - - pop af - dec a - jr nz, .loop - ret - -.fall_down_hole - pop af - ret -; 97f7e diff --git a/engine/evolution_animation.asm b/engine/evolution_animation.asm deleted file mode 100755 index 978f9e968..000000000 --- a/engine/evolution_animation.asm +++ /dev/null @@ -1,368 +0,0 @@ -EvolutionAnimation: ; 4e5e1 - push hl - push de - push bc - ld a, [wCurSpecies] - push af - ld a, [rOBP0] - push af - ld a, [wBaseDexNo] - push af - - call .EvolutionAnimation - - pop af - ld [wBaseDexNo], a - pop af - ld [rOBP0], a - pop af - ld [wCurSpecies], a - pop bc - pop de - pop hl - - ld a, [wEvolutionCanceled] - and a - ret z - - scf - ret -; 4e607 - -.EvolutionAnimation: ; 4e607 - ld a, %11100100 - ld [rOBP0], a - - ld de, MUSIC_NONE - call PlayMusic - - farcall ClearSpriteAnims - - ld de, .GFX - ld hl, vTiles0 - lb bc, BANK(.GFX), 8 - call Request2bpp - - xor a - ld [wLowHealthAlarm], a - call WaitBGMap - xor a - ld [hBGMapMode], a - ld a, [wEvolutionOldSpecies] - ld [wPlayerHPPal], a - - ld c, $0 - call .GetSGBLayout - ld a, [wEvolutionOldSpecies] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call .PlaceFrontpic - - ld de, vTiles2 - ld hl, vTiles2 tile $31 - ld bc, 7 * 7 - call Request2bpp - - ld a, 7 * 7 - ld [wEvolutionPicOffset], a - call .ReplaceFrontpic - ld a, [wEvolutionNewSpecies] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call .LoadFrontpic - ld a, [wEvolutionOldSpecies] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - - ld a, $1 - ld [hBGMapMode], a - call .check_statused - jr c, .skip_cry - - ld a, [wEvolutionOldSpecies] - call PlayMonCry - -.skip_cry - ld de, MUSIC_EVOLUTION - call PlayMusic - - ld c, 80 - call DelayFrames - - ld c, $1 - call .GetSGBLayout - call .AnimationSequence - jr c, .cancel_evo - - ld a, -7 * 7 - ld [wEvolutionPicOffset], a - call .ReplaceFrontpic - xor a - ld [wEvolutionCanceled], a - - ld a, [wEvolutionNewSpecies] - ld [wPlayerHPPal], a - - ld c, $0 - call .GetSGBLayout - call .PlayEvolvedSFX - farcall ClearSpriteAnims - call .check_statused - jr c, .no_anim - - ld a, [wBoxAlignment] - push af - ld a, $1 - ld [wBoxAlignment], a - ld a, [wCurPartySpecies] - push af - - ld a, [wPlayerHPPal] - ld [wCurPartySpecies], a - hlcoord 7, 2 - ld d, $0 - ld e, ANIM_MON_EVOLVE - predef AnimateFrontpic - - pop af - ld [wCurPartySpecies], a - pop af - ld [wBoxAlignment], a - ret - -.no_anim - ret - -.cancel_evo - ld a, $1 - ld [wEvolutionCanceled], a - - ld a, [wEvolutionOldSpecies] - ld [wPlayerHPPal], a - - ld c, $0 - call .GetSGBLayout - call .PlayEvolvedSFX - farcall ClearSpriteAnims - call .check_statused - ret c - - ld a, [wPlayerHPPal] - call PlayMonCry - ret -; 4e703 - -.GetSGBLayout: ; 4e703 - ld b, SCGB_EVOLUTION - jp GetSGBLayout -; 4e708 - -.PlaceFrontpic: ; 4e708 - call GetBaseData - hlcoord 7, 2 - jp PrepMonFrontpic -; 4e711 - -.LoadFrontpic: ; 4e711 - call GetBaseData - ld a, $1 - ld [wBoxAlignment], a - ld de, vTiles2 - predef GetAnimatedFrontpic - xor a - ld [wBoxAlignment], a - ret -; 4e726 - -.AnimationSequence: ; 4e726 - call ClearJoypad - lb bc, 1, 2 * 7 ; flash b times, wait c frames in between -.loop - push bc - call .WaitFrames_CheckPressedB - pop bc - jr c, .exit_sequence - push bc - call .Flash - pop bc - inc b - dec c - dec c - jr nz, .loop - and a - ret - -.exit_sequence - scf - ret -; 4e741 - -.Flash: ; 4e741 - ld a, -7 * 7 ; new stage - ld [wEvolutionPicOffset], a - call .ReplaceFrontpic - ld a, 7 * 7 ; previous stage - ld [wEvolutionPicOffset], a - call .ReplaceFrontpic - dec b - jr nz, .Flash - ret -; 4e755 - -.ReplaceFrontpic: ; 4e755 - push bc - xor a - ld [hBGMapMode], a - hlcoord 7, 2 - lb bc, 7, 7 - ld de, SCREEN_WIDTH - 7 -.loop1 - push bc -.loop2 - ld a, [wEvolutionPicOffset] - add [hl] - ld [hli], a - dec c - jr nz, .loop2 - pop bc - add hl, de - dec b - jr nz, .loop1 - ld a, $1 - ld [hBGMapMode], a - call WaitBGMap - pop bc - ret -; 4e779 - -.WaitFrames_CheckPressedB: ; 4e779 - call DelayFrame - push bc - call JoyTextDelay - ld a, [hJoyDown] - pop bc - and B_BUTTON - jr nz, .pressed_b -.loop3 - dec c - jr nz, .WaitFrames_CheckPressedB - and a - ret - -.pressed_b - ld a, [wForceEvolution] - and a - jr nz, .loop3 - scf - ret -; 4e794 - -.check_statused ; 4e794 - ld a, [wCurPartyMon] - ld hl, wPartyMon1Species - call GetPartyLocation - ld b, h - ld c, l - farcall CheckFaintedFrzSlp - ret -; 4e7a6 - -.PlayEvolvedSFX: ; 4e7a6 - ld a, [wEvolutionCanceled] - and a - ret nz - ld de, SFX_EVOLVED - call PlaySFX - ld hl, wJumptableIndex - ld a, [hl] - push af - ld [hl], $0 -.loop4 - call .balls_of_light - jr nc, .done - call .AnimateBallsOfLight - jr .loop4 - -.done - ld c, 32 -.loop5 - call .AnimateBallsOfLight - dec c - jr nz, .loop5 - pop af - ld [wJumptableIndex], a - ret -; 4e7cf - -.balls_of_light ; 4e7cf - ld hl, wJumptableIndex - ld a, [hl] - cp 32 - ret nc - ld d, a - inc [hl] - and $1 - jr nz, .done_balls - ld e, $0 - call .GenerateBallOfLight - ld e, $10 - call .GenerateBallOfLight - -.done_balls - scf - ret -; 4e7e8 - -.GenerateBallOfLight: ; 4e7e8 - push de - depixel 9, 11 - ld a, SPRITE_ANIM_INDEX_EVOLUTION_BALL_OF_LIGHT - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld a, [wJumptableIndex] - and %1110 - sla a - pop de - add e - ld [hl], a - ld hl, SPRITEANIMSTRUCT_TILE_ID - add hl, bc - ld [hl], $0 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $10 - ret -; 4e80c - -.AnimateBallsOfLight: ; 4e80c - push bc - callfar PlaySpriteAnimations - ; a = (([hVBlankCounter] + 4) / 2) % NUM_PALETTES - ld a, [hVBlankCounter] - and %1110 - srl a - inc a - inc a - and $7 - ld b, a - ld hl, wVirtualOAMSprite00Attributes - ld c, NUM_SPRITE_OAM_STRUCTS -.loop6 - ld a, [hl] - or b - ld [hli], a ; attributes -rept SPRITEOAMSTRUCT_LENGTH + -1 - inc hl -endr - dec c - jr nz, .loop6 - pop bc - call DelayFrame - ret -; 4e831 - - -.GFX: -INCBIN "gfx/evo/bubble_large.2bpp" -INCBIN "gfx/evo/bubble.2bpp" diff --git a/engine/evolve.asm b/engine/evolve.asm deleted file mode 100755 index 5a7e75dfa..000000000 --- a/engine/evolve.asm +++ /dev/null @@ -1,676 +0,0 @@ -EvolvePokemon: ; 421d8 - ld hl, wEvolvableFlags - xor a - ld [hl], a - ld a, [wCurPartyMon] - ld c, a - ld b, SET_FLAG - call EvoFlagAction -EvolveAfterBattle: ; 421e6 - xor a - ld [wMonTriedToEvolve], a - dec a - ld [wCurPartyMon], a - push hl - push bc - push de - ld hl, wPartyCount - - push hl - -EvolveAfterBattle_MasterLoop - ld hl, wCurPartyMon - inc [hl] - - pop hl - - inc hl - ld a, [hl] - cp $ff - jp z, .ReturnToMap - - ld [wEvolutionOldSpecies], a - - push hl - ld a, [wCurPartyMon] - ld c, a - ld hl, wEvolvableFlags - ld b, CHECK_FLAG - call EvoFlagAction - ld a, c - and a - jp z, EvolveAfterBattle_MasterLoop - - ld a, [wEvolutionOldSpecies] - dec a - ld b, 0 - ld c, a - ld hl, EvosAttacksPointers - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - - push hl - xor a - ld [wMonType], a - predef CopyMonToTempMon - pop hl - -.loop - ld a, [hli] - and a - jr z, EvolveAfterBattle_MasterLoop - - ld b, a - - cp EVOLVE_TRADE - jr z, .trade - - ld a, [wLinkMode] - and a - jp nz, .dont_evolve_2 - - ld a, b - cp EVOLVE_ITEM - jp z, .item - - ld a, [wForceEvolution] - and a - jp nz, .dont_evolve_2 - - ld a, b - cp EVOLVE_LEVEL - jp z, .level - - cp EVOLVE_HAPPINESS - jr z, .happiness - - -; EVOLVE_STAT - ld a, [wTempMonLevel] - cp [hl] - jp c, .dont_evolve_1 - - call IsMonHoldingEverstone - jp z, .dont_evolve_1 - - push hl - ld de, wTempMonAttack - ld hl, wTempMonDefense - ld c, 2 - call StringCmp - ld a, ATK_EQ_DEF - jr z, .got_tyrogue_evo - ld a, ATK_LT_DEF - jr c, .got_tyrogue_evo - ld a, ATK_GT_DEF -.got_tyrogue_evo - pop hl - - inc hl - cp [hl] - jp nz, .dont_evolve_2 - - inc hl - jr .proceed - - -.happiness - ld a, [wTempMonHappiness] - cp HAPPINESS_TO_EVOLVE - jp c, .dont_evolve_2 - - call IsMonHoldingEverstone - jp z, .dont_evolve_2 - - ld a, [hli] - cp TR_ANYTIME - jr z, .proceed - cp TR_MORNDAY - jr z, .happiness_daylight - -; TR_NITE - ld a, [wTimeOfDay] - cp NITE_F - jp nz, .dont_evolve_3 - jr .proceed - -.happiness_daylight - ld a, [wTimeOfDay] - cp NITE_F - jp z, .dont_evolve_3 - jr .proceed - - -.trade - ld a, [wLinkMode] - and a - jp z, .dont_evolve_2 - - call IsMonHoldingEverstone - jp z, .dont_evolve_2 - - ld a, [hli] - ld b, a - inc a - jr z, .proceed - - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jp z, .dont_evolve_3 - - ld a, [wTempMonItem] - cp b - jp nz, .dont_evolve_3 - - xor a - ld [wTempMonItem], a - jr .proceed - - -.item - ld a, [hli] - ld b, a - ld a, [wCurItem] - cp b - jp nz, .dont_evolve_3 - - ld a, [wForceEvolution] - and a - jp z, .dont_evolve_3 - ld a, [wLinkMode] - and a - jp nz, .dont_evolve_3 - jr .proceed - - -.level - ld a, [hli] - ld b, a - ld a, [wTempMonLevel] - cp b - jp c, .dont_evolve_3 - call IsMonHoldingEverstone - jp z, .dont_evolve_3 - -.proceed - ld a, [wTempMonLevel] - ld [wCurPartyLevel], a - ld a, $1 - ld [wMonTriedToEvolve], a - - push hl - - ld a, [hl] - ld [wEvolutionNewSpecies], a - ld a, [wCurPartyMon] - ld hl, wPartyMonNicknames - call GetNick - call CopyName1 - ld hl, Text_WhatEvolving - call PrintText - - ld c, 50 - call DelayFrames - - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - lb bc, 12, 20 - call ClearBox - - ld a, $1 - ld [hBGMapMode], a - call ClearSprites - - farcall EvolutionAnimation - - push af - call ClearSprites - pop af - jp c, CancelEvolution - - ld hl, Text_CongratulationsYourPokemon - call PrintText - - pop hl - - ld a, [hl] - ld [wCurSpecies], a - ld [wTempMonSpecies], a - ld [wEvolutionNewSpecies], a - ld [wd265], a - call GetPokemonName - - push hl - ld hl, Text_EvolvedIntoPKMN - call PrintTextBoxText - farcall StubbedTrainerRankings_MonsEvolved - - ld de, MUSIC_NONE - call PlayMusic - ld de, SFX_CAUGHT_MON - call PlaySFX - call WaitSFX - - ld c, 40 - call DelayFrames - - call ClearTileMap - call UpdateSpeciesNameIfNotNicknamed - call GetBaseData - - ld hl, wTempMonExp + 2 - ld de, wTempMonMaxHP - ld b, TRUE - predef CalcMonStats - - ld a, [wCurPartyMon] - ld hl, wPartyMons - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld e, l - ld d, h - ld bc, MON_MAXHP - add hl, bc - ld a, [hli] - ld b, a - ld c, [hl] - ld hl, wTempMonMaxHP + 1 - ld a, [hld] - sub c - ld c, a - ld a, [hl] - sbc b - ld b, a - ld hl, wTempMonHP + 1 - ld a, [hl] - add c - ld [hld], a - ld a, [hl] - adc b - ld [hl], a - - ld hl, wTempMonSpecies - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - - ld a, [wCurSpecies] - ld [wd265], a - xor a - ld [wMonType], a - call LearnLevelMoves - ld a, [wd265] - dec a - call SetSeenAndCaughtMon - - ld a, [wd265] - cp UNOWN - jr nz, .skip_unown - - ld hl, wTempMonDVs - predef GetUnownLetter - callfar UpdateUnownDex - -.skip_unown - pop de - pop hl - ld a, [wTempMonSpecies] - ld [hl], a - push hl - ld l, e - ld h, d - jp EvolveAfterBattle_MasterLoop -; 423f8 - -.dont_evolve_1 - inc hl -.dont_evolve_2 - inc hl -.dont_evolve_3 - inc hl - jp .loop - -; unused - pop hl -.ReturnToMap: - pop de - pop bc - pop hl - ld a, [wLinkMode] - and a - ret nz - ld a, [wBattleMode] - and a - ret nz - ld a, [wMonTriedToEvolve] - and a - call nz, RestartMapMusic - ret -; 42414 - -UpdateSpeciesNameIfNotNicknamed: ; 42414 - ld a, [wCurSpecies] - push af - ld a, [wBaseDexNo] - ld [wd265], a - call GetPokemonName - pop af - ld [wCurSpecies], a - ld hl, wStringBuffer1 - ld de, wStringBuffer2 -.loop - ld a, [de] - inc de - cp [hl] - inc hl - ret nz - cp "@" - jr nz, .loop - - ld a, [wCurPartyMon] - ld bc, MON_NAME_LENGTH - ld hl, wPartyMonNicknames - call AddNTimes - push hl - ld a, [wCurSpecies] - ld [wd265], a - call GetPokemonName - ld hl, wStringBuffer1 - pop de - ld bc, MON_NAME_LENGTH - jp CopyBytes -; 42454 - -CancelEvolution: ; 42454 - ld hl, Text_StoppedEvolving - call PrintText - call ClearTileMap - pop hl - jp EvolveAfterBattle_MasterLoop -; 42461 - -IsMonHoldingEverstone: ; 42461 - push hl - ld a, [wCurPartyMon] - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld a, [hl] - cp EVERSTONE - pop hl - ret -; 42473 - -Text_CongratulationsYourPokemon: ; 0x42473 - ; Congratulations! Your @ @ - text_jump UnknownText_0x1c4b92 - db "@" -; 0x42478 - -Text_EvolvedIntoPKMN: ; 0x42478 - ; evolved into @ ! - text_jump UnknownText_0x1c4baf - db "@" -; 0x4247d - -Text_StoppedEvolving: ; 0x4247d - ; Huh? @ stopped evolving! - text_jump UnknownText_0x1c4bc5 - db "@" -; 0x42482 - -Text_WhatEvolving: ; 0x42482 - ; What? @ is evolving! - text_jump UnknownText_0x1c4be3 - db "@" -; 0x42487 - - -LearnLevelMoves: ; 42487 - ld a, [wd265] - ld [wCurPartySpecies], a - dec a - ld b, 0 - ld c, a - ld hl, EvosAttacksPointers - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - -.skip_evos - ld a, [hli] - and a - jr nz, .skip_evos - -.find_move - ld a, [hli] - and a - jr z, .done - - ld b, a - ld a, [wCurPartyLevel] - cp b - ld a, [hli] - jr nz, .find_move - - push hl - ld d, a - ld hl, wPartyMon1Moves - ld a, [wCurPartyMon] - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - - ld b, NUM_MOVES -.check_move - ld a, [hli] - cp d - jr z, .has_move - dec b - jr nz, .check_move - jr .learn -.has_move - - pop hl - jr .find_move - -.learn - ld a, d - ld [wPutativeTMHMMove], a - ld [wd265], a - call GetMoveName - call CopyName1 - predef LearnMove - pop hl - jr .find_move - -.done - ld a, [wCurPartySpecies] - ld [wd265], a - ret -; 424e1 - - -FillMoves: ; 424e1 -; Fill in moves at de for wCurPartySpecies at wCurPartyLevel - - push hl - push de - push bc - ld hl, EvosAttacksPointers - ld b, 0 - ld a, [wCurPartySpecies] - dec a - add a - rl b - ld c, a - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a -.GoToAttacks: - ld a, [hli] - and a - jr nz, .GoToAttacks - jr .GetLevel - -.NextMove: - pop de -.GetMove: - inc hl -.GetLevel: - ld a, [hli] - and a - jp z, .done - ld b, a - ld a, [wCurPartyLevel] - cp b - jp c, .done - ld a, [wEvolutionOldSpecies] - and a - jr z, .CheckMove - ld a, [wd002] - cp b - jr nc, .GetMove - -.CheckMove: - push de - ld c, NUM_MOVES -.CheckRepeat: - ld a, [de] - inc de - cp [hl] - jr z, .NextMove - dec c - jr nz, .CheckRepeat - pop de - push de - ld c, NUM_MOVES -.CheckSlot: - ld a, [de] - and a - jr z, .LearnMove - inc de - dec c - jr nz, .CheckSlot - pop de - push de - push hl - ld h, d - ld l, e - call ShiftMoves - ld a, [wEvolutionOldSpecies] - and a - jr z, .ShiftedMove - push de - ld bc, wPartyMon1PP - (wPartyMon1Moves + NUM_MOVES - 1) - add hl, bc - ld d, h - ld e, l - call ShiftMoves - pop de - -.ShiftedMove: - pop hl - -.LearnMove: - ld a, [hl] - ld [de], a - ld a, [wEvolutionOldSpecies] - and a - jr z, .NextMove - push hl - ld a, [hl] - ld hl, MON_PP - MON_MOVES - add hl, de - push hl - dec a - ld hl, Moves + MOVE_PP - ld bc, MOVE_LENGTH - call AddNTimes - ld a, BANK(Moves) - call GetFarByte - pop hl - ld [hl], a - pop hl - jr .NextMove - -.done - pop bc - pop de - pop hl - ret -; 4256e - -ShiftMoves: ; 4256e - ld c, NUM_MOVES - 1 -.loop - inc de - ld a, [de] - ld [hli], a - dec c - jr nz, .loop - ret -; 42577 - - -EvoFlagAction: ; 42577 - push de - ld d, $0 - predef SmallFarFlagAction - pop de - ret -; 42581 - -GetPreEvolution: ; 42581 -; Find the first mon to evolve into wCurPartySpecies. - -; Return carry and the new species in wCurPartySpecies -; if a pre-evolution is found. - - ld c, 0 -.loop ; For each Pokemon... - ld hl, EvosAttacksPointers - ld b, 0 - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a -.loop2 ; For each evolution... - ld a, [hli] - and a - jr z, .no_evolve ; If we jump, this Pokemon does not evolve into wCurPartySpecies. - cp EVOLVE_STAT ; This evolution type has the extra parameter of stat comparison. - jr nz, .not_tyrogue - inc hl - -.not_tyrogue - inc hl - ld a, [wCurPartySpecies] - cp [hl] - jr z, .found_preevo - inc hl - ld a, [hl] - and a - jr nz, .loop2 - -.no_evolve - inc c - ld a, c - cp NUM_POKEMON - jr c, .loop - and a - ret - -.found_preevo - inc c - ld a, c - ld [wCurPartySpecies], a - scf - ret -; 425b1 diff --git a/engine/experience.asm b/engine/experience.asm deleted file mode 100644 index 6b94ed357..000000000 --- a/engine/experience.asm +++ /dev/null @@ -1,162 +0,0 @@ -CalcLevel: ; 50e1b - ld a, [wTempMonSpecies] - ld [wCurSpecies], a - call GetBaseData - ld d, 1 -.next_level - inc d - ld a, d - cp LOW(MAX_LEVEL + 1) - jr z, .got_level - call CalcExpAtLevel - push hl - ld hl, wTempMonExp + 2 - ld a, [hProduct + 3] - ld c, a - ld a, [hld] - sub c - ld a, [hProduct + 2] - ld c, a - ld a, [hld] - sbc c - ld a, [hProduct + 1] - ld c, a - ld a, [hl] - sbc c - pop hl - jr nc, .next_level - -.got_level - dec d - ret - -CalcExpAtLevel: ; 50e47 -; (a/b)*n**3 + c*n**2 + d*n - e - ld a, [wBaseGrowthRate] - add a - add a - ld c, a - ld b, 0 - ld hl, GrowthRates - add hl, bc -; Cube the level - call .LevelSquared - ld a, d - ld [hMultiplier], a - call Multiply - -; Multiply by a - ld a, [hl] - and $f0 - swap a - ld [hMultiplier], a - call Multiply -; Divide by b - ld a, [hli] - and $f - ld [hDivisor], a - ld b, 4 - call Divide -; Push the cubic term to the stack - ld a, [hQuotient + 0] - push af - ld a, [hQuotient + 1] - push af - ld a, [hQuotient + 2] - push af -; Square the level and multiply by the lower 7 bits of c - call .LevelSquared - ld a, [hl] - and $7f - ld [hMultiplier], a - call Multiply -; Push the absolute value of the quadratic term to the stack - ld a, [hProduct + 1] - push af - ld a, [hProduct + 2] - push af - ld a, [hProduct + 3] - push af - ld a, [hli] - push af -; Multiply the level by d - xor a - ld [hMultiplicand + 0], a - ld [hMultiplicand + 1], a - ld a, d - ld [hMultiplicand + 2], a - ld a, [hli] - ld [hMultiplier], a - call Multiply -; Subtract e - ld b, [hl] - ld a, [hProduct + 3] - sub b - ld [hMultiplicand + 2], a - ld b, $0 - ld a, [hProduct + 2] - sbc b - ld [hMultiplicand + 1], a - ld a, [hProduct + 1] - sbc b - ld [hMultiplicand], a -; If bit 7 of c is set, c is negative; otherwise, it's positive - pop af - and $80 - jr nz, .subtract -; Add c*n**2 to (d*n - e) - pop bc - ld a, [hProduct + 3] - add b - ld [hMultiplicand + 2], a - pop bc - ld a, [hProduct + 2] - adc b - ld [hMultiplicand + 1], a - pop bc - ld a, [hProduct + 1] - adc b - ld [hMultiplicand], a - jr .done_quadratic - -.subtract -; Subtract c*n**2 from (d*n - e) - pop bc - ld a, [hProduct + 3] - sub b - ld [hMultiplicand + 2], a - pop bc - ld a, [hProduct + 2] - sbc b - ld [hMultiplicand + 1], a - pop bc - ld a, [hProduct + 1] - sbc b - ld [hMultiplicand], a - -.done_quadratic -; Add (a/b)*n**3 to (d*n - e +/- c*n**2) - pop bc - ld a, [hProduct + 3] - add b - ld [hMultiplicand + 2], a - pop bc - ld a, [hProduct + 2] - adc b - ld [hMultiplicand + 1], a - pop bc - ld a, [hProduct + 1] - adc b - ld [hMultiplicand], a - ret - -.LevelSquared: ; 50eed - xor a - ld [hMultiplicand + 0], a - ld [hMultiplicand + 1], a - ld a, d - ld [hMultiplicand + 2], a - ld [hMultiplier], a - jp Multiply - -INCLUDE "data/growth_rates.asm" diff --git a/engine/game/card_flip.asm b/engine/game/card_flip.asm new file mode 100755 index 000000000..fbeb3e3b6 --- /dev/null +++ b/engine/game/card_flip.asm @@ -0,0 +1,1692 @@ +CARDFLIP_LIGHT_OFF EQU $ef +CARDFLIP_LIGHT_ON EQU $f5 + +CARDFLIP_DECK_SIZE EQU 4 * 6 + +; two labels below called from inside ./dummy_game.asm +Unknown_e00ed: ; e00ed (38:40ed) +; Graphics for an unused Game Corner +; game were meant to be here. +ret_e00ed: ; e00ed (38:40ed) + ret + +_CardFlip: ; e00ee (38:40ee) + ld hl, wOptions + set 4, [hl] + call ClearBGPalettes + call ClearTileMap + call ClearSprites + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + call DisableLCD + call LoadStandardFont + call LoadFontsExtra + + ld hl, CardFlipLZ01 + ld de, vTiles2 tile $00 + call Decompress + ld hl, CardFlipLZ02 + ld de, vTiles2 tile $3e + call Decompress + ld hl, CardFlipLZ03 + ld de, vTiles0 tile $00 + call Decompress + ld hl, CardFlipOffButtonGFX + ld de, vTiles0 tile CARDFLIP_LIGHT_OFF + ld bc, 1 tiles + call CopyBytes + ld hl, CardFlipOnButtonGFX + ld de, vTiles0 tile CARDFLIP_LIGHT_ON + ld bc, 1 tiles + call CopyBytes + + call CardFlip_ShiftDigitsLeftTwoPixels + call CardFlip_InitTilemap + call CardFlip_InitAttrPals + call EnableLCD + call WaitBGMap2 + ld a, $e4 + call DmgToCgbBGPals + ld de, $e4e4 + call DmgToCgbObjPals + call DelayFrame + xor a + ld [wJumptableIndex], a + ld a, $2 + ld [wCardFlipCursorY], a + ld [wCardFlipCursorX], a + ld de, MUSIC_GAME_CORNER + call PlayMusic +.MasterLoop: + ld a, [wJumptableIndex] + bit 7, a + jr nz, .leavethegame + call .CardFlip + jr .MasterLoop +.leavethegame + call WaitSFX + ld de, SFX_QUIT_SLOTS + call PlaySFX + call WaitSFX + call ClearBGPalettes + ld hl, wOptions + res 4, [hl] + ret + +.CardFlip: ; e0191 (38:4191) + 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 +; e01a0 (38:41a0) + +.Jumptable: ; e01a0 + dw .AskPlayWithThree + dw .DeductCoins + dw .ChooseACard + dw .PlaceYourBet + dw .CheckTheCard + dw .TabulateTheResult + dw .PlayAgain + dw .Quit +; e01b0 + +.Increment: ; e01b0 + ld hl, wJumptableIndex + inc [hl] + ret +; e01b5 + +.AskPlayWithThree: ; e01b5 + ld hl, .PlayWithThreeCoinsText + call CardFlip_UpdateCoinBalanceDisplay + call YesNoBox + jr c, .SaidNo + call CardFlip_ShuffleDeck + call .Increment + ret + +.SaidNo: + ld a, 7 + ld [wJumptableIndex], a + ret +; e01cd + +.PlayWithThreeCoinsText: ; 0xe01cd + ; Play with three coins? + text_jump UnknownText_0x1c5793 + db "@" +; 0xe01d2 + +.DeductCoins: ; e01d2 + ld a, [wCoins] + ld h, a + ld a, [wCoins + 1] + ld l, a + ld a, h + and a + jr nz, .deduct ; You have at least 256 coins. + ld a, l + cp 3 + jr nc, .deduct ; You have at least 3 coins. + ld hl, .NotEnoughCoinsText + call CardFlip_UpdateCoinBalanceDisplay + ld a, 7 + ld [wJumptableIndex], a + ret + +.deduct + ld de, -3 + add hl, de + ld a, h + ld [wCoins], a + ld a, l + ld [wCoins + 1], a + ld de, SFX_TRANSACTION + call PlaySFX + xor a + ld [hBGMapMode], a + call CardFlip_PrintCoinBalance + ld a, $1 + ld [hBGMapMode], a + call WaitSFX + call .Increment + ret +; e0212 + +.NotEnoughCoinsText: ; 0xe0212 + ; Not enough coins… + text_jump UnknownText_0x1c57ab + db "@" +; 0xe0217 + +.ChooseACard: ; e0217 + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + lb bc, 12, 9 + call CardFlip_FillGreenBox + hlcoord 9, 0 + ld bc, SCREEN_WIDTH + ld a, [wCardFlipNumCardsPlayed] + call AddNTimes + ld [hl], CARDFLIP_LIGHT_ON + ld a, $1 + ld [hBGMapMode], a + ld c, 20 + call DelayFrames + hlcoord 2, 0 + call PlaceCardFaceDown + ld a, $1 + ld [hBGMapMode], a + ld c, 20 + call DelayFrames + hlcoord 2, 6 + call PlaceCardFaceDown + call WaitBGMap + ld hl, .ChooseACardText + call CardFlip_UpdateCoinBalanceDisplay + xor a + ld [wCardFlipWhichCard], a +.loop + call JoyTextDelay + ld a, [hJoyLast] + and A_BUTTON + jr nz, .next + ld de, SFX_KINESIS + call PlaySFX + call PlaceOAMCardBorder + ld c, 4 + call DelayFrames + ld hl, wCardFlipWhichCard + ld a, [hl] + xor $1 + ld [hl], a + jr .loop + +.next + ld de, SFX_SLOT_MACHINE_START + call PlaySFX + ld a, $3 +.loop2 + push af + call PlaceOAMCardBorder + ld c, 4 + call DelayFrames + call ClearSprites + ld c, 4 + call DelayFrames + pop af + dec a + jr nz, .loop2 + ld hl, wCardFlipWhichCard + ld a, [hl] + push af + xor $1 + ld [hl], a + call GetCoordsOfChosenCard + lb bc, 6, 5 + call CardFlip_FillGreenBox + pop af + ld [wCardFlipWhichCard], a + call .Increment + ret +; e02b2 + +.ChooseACardText: ; 0xe02b2 + ; Choose a card. + text_jump UnknownText_0x1c57be + db "@" +; 0xe02b7 + +.PlaceYourBet: ; e02b7 + ld hl, .PlaceYourBetText + call CardFlip_UpdateCoinBalanceDisplay +.betloop + call JoyTextDelay + ld a, [hJoyLast] + and A_BUTTON + jr nz, .betdone + call ChooseCard_HandleJoypad + call CardFlip_UpdateCursorOAM + call DelayFrame + jr .betloop + +.betdone + call .Increment + ret +; e02d5 + +.PlaceYourBetText: ; 0xe02d5 + ; Place your bet. + text_jump UnknownText_0x1c57ce + db "@" +; 0xe02da + +.CheckTheCard: ; e02da + xor a + ld [hVBlankCounter], a + call CardFlip_UpdateCursorOAM + call WaitSFX + ld de, SFX_CHOOSE_A_CARD + call PlaySFX + call WaitSFX + ld a, [wCardFlipNumCardsPlayed] + ld e, a + ld d, 0 + ld hl, wDeck + add hl, de + add hl, de + ld a, [wCardFlipWhichCard] + ld e, a + add hl, de + ld a, [hl] + ld [wCardFlipFaceUpCard], a + ld e, a + ld hl, wDiscardPile + add hl, de + ld [hl], TRUE + call GetCoordsOfChosenCard + call CardFlip_DisplayCardFaceUp + call WaitBGMap2 + call .Increment + ret +; e0314 + +.TabulateTheResult: ; e0314 + call CardFlip_CheckWinCondition + call WaitPressAorB_BlinkCursor + call .Increment + ret +; e031e + +.PlayAgain: ; e031e + call ClearSprites + ld hl, .PlayAgainText + call CardFlip_UpdateCoinBalanceDisplay + call YesNoBox + jr nc, .Continue + call .Increment + ret + +.Continue: + ld a, [wCardFlipNumCardsPlayed] + inc a + ld [wCardFlipNumCardsPlayed], a + cp 12 + jr c, .KeepTheCurrentDeck + call CardFlip_InitTilemap + ld a, $1 + ld [hBGMapMode], a + call CardFlip_ShuffleDeck + ld hl, .CardsShuffledText + call PrintText + jr .LoopAround + +.KeepTheCurrentDeck: + call CardFlip_BlankDiscardedCardSlot + +.LoopAround: + ld a, 1 + ld [wJumptableIndex], a + ret +; e0356 + +.PlayAgainText: ; 0xe0356 + ; Want to play again? + text_jump UnknownText_0x1c57df + db "@" +; 0xe035b + +.CardsShuffledText: ; 0xe035b + ; The cards have been shuffled. + text_jump UnknownText_0x1c57f4 + db "@" +; 0xe0360 + +.Quit: ; e0360 + ld hl, wJumptableIndex + set 7, [hl] + ret +; e0366 + +CardFlip_ShuffleDeck: ; e0366 + ld hl, wDeck + ld bc, CARDFLIP_DECK_SIZE + xor a + call ByteFill + ld de, wDeck + ld c, CARDFLIP_DECK_SIZE - 1 +.loop + call Random + and $1f + cp CARDFLIP_DECK_SIZE + jr nc, .loop + ld l, a + ld h, $0 + add hl, de + ld a, [hl] + and a + jr nz, .loop + ld [hl], c + dec c + jr nz, .loop + xor a + ld [wCardFlipNumCardsPlayed], a + ld hl, wDiscardPile + ld bc, CARDFLIP_DECK_SIZE + call ByteFill + ret +; e0398 + +CollapseCursorPosition: ; e0398 + ld hl, 0 + ld bc, 6 + ld a, [wCardFlipCursorY] + call AddNTimes + ld b, $0 + ld a, [wCardFlipCursorX] + ld c, a + add hl, bc + ret +; e03ac + +GetCoordsOfChosenCard: ; e03ac + ld a, [wCardFlipWhichCard] + and a + jr nz, .BottomCard + hlcoord 2, 0 + bcpixel 2, 3 + jr .done + +.BottomCard: + hlcoord 2, 6 + bcpixel 8, 3 + +.done + ret +; e03c1 + +PlaceCardFaceDown: ; e03c1 + xor a + ld [hBGMapMode], a + ld de, .FaceDownCardTilemap + lb bc, 6, 5 + call CardFlip_CopyToBox + ret +; e03ce + +.FaceDownCardTilemap: ; e03ce + db $08, $09, $09, $09, $0a + db $0b, $28, $2b, $28, $0c + db $0b, $2c, $2d, $2e, $0c + db $0b, $2f, $30, $31, $0c + db $0b, $32, $33, $34, $0c + db $0d, $0e, $0e, $0e, $0f +; e03ec + +CardFlip_DisplayCardFaceUp: ; e03ec + xor a + ld [hBGMapMode], a + push hl + push hl + ; Flip the card face up. + ld de, .FaceUpCardTilemap + lb bc, 6, 5 + call CardFlip_CopyToBox + + ; Get the level and species of the upturned card. + ld a, [wCardFlipFaceUpCard] + ld e, a + ld d, 0 + ld hl, .Deck + add hl, de + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + + ; Place the level. + pop hl + ld bc, 3 + SCREEN_WIDTH + add hl, bc + ld [hl], e + + ; Place the Pokepic. + ld bc, SCREEN_HEIGHT + add hl, bc + ld a, d + ld de, SCREEN_WIDTH + ld b, 3 +.row + push hl + ld c, 3 +.col + ld [hli], a + inc a + dec c + jr nz, .col + pop hl + add hl, de + dec b + jr nz, .row + pop hl + + ; Pointless CGB check + ld a, [hCGB] + and a + ret z + + ; Set the attributes + ld de, wAttrMap - wTileMap + add hl, de + ld a, [wCardFlipFaceUpCard] + and 3 + inc a + lb bc, 6, 5 + call CardFlip_FillBox + ret +; e043b + +.FaceUpCardTilemap: ; e043b + db $18, $19, $19, $19, $1a + db $1b, $35, $7f, $7f, $1c + db $0b, $28, $28, $28, $0c + db $0b, $28, $28, $28, $0c + db $0b, $28, $28, $28, $0c + db $1d, $1e, $1e, $1e, $1f +; e0459 + +.Deck: ; e0459 + ; level, pic anchor (3x3) + db "1", $4e, "1", $57, "1", $69, "1", $60 + db "2", $4e, "2", $57, "2", $69, "2", $60 + db "3", $4e, "3", $57, "3", $69, "3", $60 + db "4", $4e, "4", $57, "4", $69, "4", $60 + db "5", $4e, "5", $57, "5", $69, "5", $60 + db "6", $4e, "6", $57, "6", $69, "6", $60 +; e0489 + +CardFlip_UpdateCoinBalanceDisplay: ; e0489 + push hl + hlcoord 0, 12 + ld b, 4 + ld c, SCREEN_WIDTH - 2 + call TextBox + pop hl + call PrintTextBoxText + call CardFlip_PrintCoinBalance + ret +; e049c + +CardFlip_PrintCoinBalance: ; e049c + hlcoord 9, 15 + ld b, 1 + ld c, 9 + call TextBox + hlcoord 10, 16 + ld de, .CoinStr + call PlaceString + hlcoord 15, 16 + ld de, wCoins + lb bc, PRINTNUM_LEADINGZEROS | 2, 4 + call PrintNum + ret +; e04bc + +.CoinStr: + db "COIN@" +; e04c1 + +CardFlip_InitTilemap: ; e04c1 (38:44c1) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, $29 + call ByteFill + hlcoord 9, 0 + ld de, CardFlipTilemap + lb bc, 12, 11 + call CardFlip_CopyToBox + hlcoord 0, 12 + lb bc, 4, 18 + call TextBox + ret +; e04e5 (38:44e5) + +CardFlip_FillGreenBox: ; e04e5 + ld a, $29 + +CardFlip_FillBox: ; e04e7 (38:44e7) +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret + +CardFlip_CopyToBox: ; e04f7 (38:44f7) +.row + push bc + push hl +.col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; e0509 (38:4509) + +CardFlip_CopyOAM: ; e0509 + ld de, wVirtualOAMSprite00 + ld a, [hli] +.loop + push af + ld a, [hli] + add b + ld [de], a ; y + inc de + ld a, [hli] + add c + ld [de], a ; x + inc de + ld a, [hli] + ld [de], a ; tile id + inc de + ld a, [hli] + ld [de], a ; attributes + inc de + pop af + dec a + jr nz, .loop + ret +; e0521 + +CardFlip_ShiftDigitsLeftTwoPixels: ; e0521 (38:4521) + ld de, vTiles0 tile "0" + ld hl, vTiles0 tile "0" + 2 + ld bc, 10 tiles - 2 + call CopyBytes + ld hl, vTiles0 tile "9" + 1 tiles - 2 + xor a + ld [hli], a + ld [hl], a + ret +; e0534 (38:4534) + +CardFlip_BlankDiscardedCardSlot: ; e0534 + xor a + ld [hBGMapMode], a + ld a, [wCardFlipFaceUpCard] + ld e, a + ld d, 0 + + and 3 ; get mon + ld c, a + ld b, 0 + + ld a, e + and $1c ; get level + srl a + add LOW(.Jumptable) + ld l, a + ld a, 0 + adc HIGH(.Jumptable) + ld h, a + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e0553 + +.Jumptable: ; e0553 + dw .Level1 + dw .Level2 + dw .Level3 + dw .Level4 + dw .Level5 + dw .Level6 +; e055f + +.Level1: ; e055f + ld hl, wDiscardPile + 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded2 + hlcoord 13, 3 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $37 + ret + +.discarded2 + hlcoord 13, 3 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3d + ret +; e0583 + +.Level2: ; e0583 + ld hl, wDiscardPile - 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded1 + hlcoord 13, 4 + add hl, bc + add hl, bc + ld [hl], $3b + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret + +.discarded1 + hlcoord 13, 4 + add hl, bc + add hl, bc + ld [hl], $3d + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret +; e05a7 + +.Level3: ; e05a7 + ld hl, wDiscardPile + 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded4 + hlcoord 13, 6 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $38 + ret + +.discarded4 + hlcoord 13, 6 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3d + ret +; e05cb + +.Level4: ; e05cb + ld hl, wDiscardPile - 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded3 + hlcoord 13, 7 + add hl, bc + add hl, bc + ld [hl], $3c + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret + +.discarded3 + hlcoord 13, 7 + add hl, bc + add hl, bc + ld [hl], $3d + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret +; e05ef + +.Level5: ; e05ef + ld hl, wDiscardPile + 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded6 + hlcoord 13, 9 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $39 + ret + +.discarded6 + hlcoord 13, 9 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3d + ret +; e0613 + +.Level6: ; e0613 + ld hl, wDiscardPile - 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded5 + hlcoord 13, 10 + add hl, bc + add hl, bc + ld [hl], $3c + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret + +.discarded5 + hlcoord 13, 10 + add hl, bc + add hl, bc + ld [hl], $3d + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret +; e0637 + +CardFlip_CheckWinCondition: ; e0637 + call CollapseCursorPosition + add hl, hl + ld de, .Jumptable + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e0643 + +.Jumptable: ; e0643 + dw .Impossible + dw .Impossible + dw .PikaJiggly + dw .PikaJiggly + dw .PoliOddish + dw .PoliOddish + + dw .Impossible + dw .Impossible + dw .Pikachu + dw .Jigglypuff + dw .Poliwag + dw .Oddish + + dw .OneTwo + dw .One + dw .PikaOne + dw .JigglyOne + dw .PoliOne + dw .OddOne + + dw .OneTwo + dw .Two + dw .PikaTwo + dw .JigglyTwo + dw .PoliTwo + dw .OddTwo + + dw .ThreeFour + dw .Three + dw .PikaThree + dw .JigglyThree + dw .PoliThree + dw .OddThree + + dw .ThreeFour + dw .Four + dw .PikaFour + dw .JigglyFour + dw .PoliFour + dw .OddFour + + dw .FiveSix + dw .Five + dw .PikaFive + dw .JigglyFive + dw .PoliFive + dw .OddFive + + dw .FiveSix + dw .Six + dw .PikaSix + dw .JigglySix + dw .PoliSix + dw .OddSix +; e06a3 + +.Impossible: ; e06a3 + jp .Lose +; e06a6 + +.PikaJiggly: ; e06a6 + ld a, [wCardFlipFaceUpCard] + and $2 + jp nz, .Lose + jr .WinSix + +.PoliOddish: ; e06b0 + ld a, [wCardFlipFaceUpCard] + and $2 + jr nz, .WinSix + jp .Lose + +.WinSix: ; e06ba + ld c, $6 + ld de, SFX_2ND_PLACE + jp .Payout +; e06c2 + +.OneTwo: ; e06c2 + ld a, [wCardFlipFaceUpCard] + and $18 + jr z, .WinNine + jp .Lose + +.ThreeFour: ; e06cc + ld a, [wCardFlipFaceUpCard] + and $18 + cp $8 + jr z, .WinNine + jp .Lose + +.FiveSix: ; e06d8 + ld a, [wCardFlipFaceUpCard] + and $18 + cp $10 + jr z, .WinNine + jp .Lose + +.WinNine: ; e06e4 + ld c, $9 + ld de, SFX_2ND_PLACE + jp .Payout +; e06ec + +.Pikachu: ; e06ec + ld a, [wCardFlipFaceUpCard] + and $3 + jr z, .WinTwelve + jp .Lose + +.Jigglypuff: ; e06f6 + ld a, [wCardFlipFaceUpCard] + and $3 + cp $1 + jr z, .WinTwelve + jp .Lose + +.Poliwag: ; e0702 + ld a, [wCardFlipFaceUpCard] + and $3 + cp $2 + jr z, .WinTwelve + jp .Lose + +.Oddish: ; e070e + ld a, [wCardFlipFaceUpCard] + and $3 + cp $3 + jr z, .WinTwelve + jp .Lose + +.WinTwelve: ; e071a + ld c, $c + ld de, SFX_2ND_PLACE + jp .Payout +; e0722 + +.One: ; e0722 + ld a, [wCardFlipFaceUpCard] + and $1c + jr z, .WinEighteen + jp .Lose + +.Two: ; e072c + ld a, [wCardFlipFaceUpCard] + and $1c + cp $4 + jr z, .WinEighteen + jp .Lose + +.Three: ; e0738 + ld a, [wCardFlipFaceUpCard] + and $1c + cp $8 + jr z, .WinEighteen + jp .Lose + +.Four: ; e0744 + ld a, [wCardFlipFaceUpCard] + and $1c + cp $c + jr z, .WinEighteen + jp .Lose + +.Five: ; e0750 + ld a, [wCardFlipFaceUpCard] + and $1c + cp $10 + jr z, .WinEighteen + jp .Lose + +.Six: ; e075c + ld a, [wCardFlipFaceUpCard] + and $1c + cp $14 + jr z, .WinEighteen + jp .Lose + +.WinEighteen: ; e0768 + ld c, $12 + ld de, SFX_2ND_PLACE + jp .Payout +; e0770 + + +.PikaOne: ; e0770 + ld e, $0 + jr .CheckWin72 + +.JigglyOne: ; e0774 + ld e, $1 + jr .CheckWin72 + +.PoliOne: ; e0778 + ld e, $2 + jr .CheckWin72 + +.OddOne: ; e077c + ld e, $3 + jr .CheckWin72 + +.PikaTwo: ; e0780 + ld e, $4 + jr .CheckWin72 + +.JigglyTwo: ; e0784 + ld e, $5 + jr .CheckWin72 + +.PoliTwo: ; e0788 + ld e, $6 + jr .CheckWin72 + +.OddTwo: ; e078c + ld e, $7 + jr .CheckWin72 + +.PikaThree: ; e0790 + ld e, $8 + jr .CheckWin72 + +.JigglyThree: ; e0794 + ld e, $9 + jr .CheckWin72 + +.PoliThree: ; e0798 + ld e, $a + jr .CheckWin72 + +.OddThree: ; e079c + ld e, $b + jr .CheckWin72 + +.PikaFour: ; e07a0 + ld e, $c + jr .CheckWin72 + +.JigglyFour: ; e07a4 + ld e, $d + jr .CheckWin72 + +.PoliFour: ; e07a8 + ld e, $e + jr .CheckWin72 + +.OddFour: ; e07ac + ld e, $f + jr .CheckWin72 + +.PikaFive: ; e07b0 + ld e, $10 + jr .CheckWin72 + +.JigglyFive: ; e07b4 + ld e, $11 + jr .CheckWin72 + +.PoliFive: ; e07b8 + ld e, $12 + jr .CheckWin72 + +.OddFive: ; e07bc + ld e, $13 + jr .CheckWin72 + +.PikaSix: ; e07c0 + ld e, $14 + jr .CheckWin72 + +.JigglySix: ; e07c4 + ld e, $15 + jr .CheckWin72 + +.PoliSix: ; e07c8 + ld e, $16 + jr .CheckWin72 + +.OddSix: ; e07cc + ld e, $17 + +.CheckWin72: ; e07ce + ld a, [wCardFlipFaceUpCard] + cp e + jr nz, .Lose + ld c, 72 + ld de, SFX_2ND_PLACE + jr .Payout + +.Lose: ; e07db + ld de, SFX_WRONG + call PlaySFX + ld hl, .Text_Darn + call CardFlip_UpdateCoinBalanceDisplay + call WaitSFX + ret + +.Payout: ; e07eb + push bc + push de + ld hl, .Text_Yeah + call CardFlip_UpdateCoinBalanceDisplay + pop de + call PlaySFX + call WaitSFX + pop bc +.loop + push bc + call .IsCoinCaseFull + jr c, .full + call .AddCoinPlaySFX + +.full + call CardFlip_PrintCoinBalance + ld c, 2 + call DelayFrames + pop bc + dec c + jr nz, .loop + ret +; e0811 + +.Text_Yeah: ; 0xe0811 + ; Yeah! + text_jump UnknownText_0x1c5813 + db "@" +; 0xe0816 + +.Text_Darn: ; 0xe0816 + ; Darn… + text_jump UnknownText_0x1c581a + db "@" +; 0xe081b + +.AddCoinPlaySFX: ; e081b + ld a, [wCoins] + ld h, a + ld a, [wCoins + 1] + ld l, a + inc hl + ld a, h + ld [wCoins], a + ld a, l + ld [wCoins + 1], a + ld de, SFX_PAY_DAY + call PlaySFX + ret +; e0833 + +.IsCoinCaseFull: ; e0833 + ld a, [wCoins] + cp HIGH(MAX_COINS) + jr c, .less + jr z, .check_low + jr .more + +.check_low + ld a, [wCoins + 1] + cp LOW(MAX_COINS) + jr c, .less + +.more + scf + ret + +.less + and a + ret +; e0849 + +PlaceOAMCardBorder: ; e0849 + call GetCoordsOfChosenCard + ld hl, .SpriteData + call CardFlip_CopyOAM + ret +; e0853 + +.SpriteData: ; e0853 + db 18 + dsprite 0, 0, 0, 0, $04, 0 + dsprite 0, 0, 1, 0, $06, 0 + dsprite 0, 0, 2, 0, $06, 0 + dsprite 0, 0, 3, 0, $06, 0 + dsprite 0, 0, 4, 0, $04, 0 | X_FLIP + + dsprite 1, 0, 0, 0, $05, 0 + dsprite 1, 0, 4, 0, $05, 0 | X_FLIP + + dsprite 2, 0, 0, 0, $05, 0 + dsprite 2, 0, 4, 0, $05, 0 | X_FLIP + + dsprite 3, 0, 0, 0, $05, 0 + dsprite 3, 0, 4, 0, $05, 0 | X_FLIP + + dsprite 4, 0, 0, 0, $05, $00 + dsprite 4, 0, 4, 0, $05, 0 | X_FLIP + + dsprite 5, 0, 0, 0, $04, 0 | Y_FLIP + dsprite 5, 0, 1, 0, $06, 0 | Y_FLIP + dsprite 5, 0, 2, 0, $06, 0 | Y_FLIP + dsprite 5, 0, 3, 0, $06, 0 | Y_FLIP + dsprite 5, 0, 4, 0, $04, 0 | X_FLIP | Y_FLIP +; e089c + +ChooseCard_HandleJoypad: ; e089c + ld hl, hJoyLast + ld a, [hl] + and D_LEFT + jp nz, .d_left + ld a, [hl] + and D_RIGHT + jp nz, .d_right + ld a, [hl] + and D_UP + jp nz, .d_up + ld a, [hl] + and D_DOWN + jp nz, .d_down + ret +; e08b8 + +.d_left ; e08b8 + ld hl, wCardFlipCursorX + ld a, [wCardFlipCursorY] + and a + jr z, .mon_pair_left + cp $1 + jr z, .mon_group_left + ld a, [hl] + and a + ret z + dec [hl] + jp .play_sound + +.mon_group_left + ld a, [hl] + cp $3 + jr c, .left_to_number_gp + dec [hl] + jp .play_sound + +.mon_pair_left + ld a, [hl] + and $e + ld [hl], a + cp $3 + jr c, .left_to_number_gp + dec [hl] + dec [hl] + jp .play_sound + +.left_to_number_gp + ld a, $2 + ld [wCardFlipCursorY], a + ld a, $1 + ld [wCardFlipCursorX], a + jp .play_sound +; e08ef + +.d_right ; e08ef + ld hl, wCardFlipCursorX + ld a, [wCardFlipCursorY] + and a + jr z, .mon_pair_right + ld a, [hl] + cp $5 + ret nc + inc [hl] + jr .play_sound + +.mon_pair_right + ld a, [hl] + and $e + ld [hl], a + cp $4 + ret nc + inc [hl] + inc [hl] + jr .play_sound + +.d_up ; e090a + ld hl, wCardFlipCursorY + ld a, [wCardFlipCursorX] + and a + jr z, .num_pair_up + cp $1 + jr z, .num_gp_up + ld a, [hl] + and a + ret z + dec [hl] + jr .play_sound + +.num_gp_up + ld a, [hl] + cp $3 + jr c, .up_to_mon_group + dec [hl] + jr .play_sound + +.num_pair_up + ld a, [hl] + and $e + ld [hl], a + cp $3 + jr c, .up_to_mon_group + dec [hl] + dec [hl] + jr .play_sound + +.up_to_mon_group + ld a, $1 + ld [wCardFlipCursorY], a + ld a, $2 + ld [wCardFlipCursorX], a + jr .play_sound + +.d_down ; e093d + ld hl, wCardFlipCursorY + ld a, [wCardFlipCursorX] + and a + jr z, .num_pair_down + ld hl, wCardFlipCursorY + ld a, [hl] + cp $7 + ret nc + inc [hl] + jr .play_sound + +.num_pair_down + ld a, [hl] + and $e + ld [hl], a + cp $6 + ret nc + inc [hl] + inc [hl] + +.play_sound ; e0959 + ld de, SFX_POKEBALLS_PLACED_ON_TABLE + call PlaySFX + ret +; e0960 + +CardFlip_UpdateCursorOAM: ; e0960 + call ClearSprites + ld a, [hCGB] + and a + jr nz, .skip + ld a, [hVBlankCounter] + and $4 + ret nz + +.skip + call CollapseCursorPosition + add hl, hl + add hl, hl + ld de, .OAMData + add hl, de + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a + call CardFlip_CopyOAM + ret +; e0981 + +.OAMData: ; e0981 +cardflip_cursor: MACRO +if _NARG >= 5 + dbpixel \1, \2, \3, \4 + dw \5 +else + dbpixel \1, \2 + dw \3 +endc +ENDM + + cardflip_cursor 11, 2, .Impossible + cardflip_cursor 12, 2, .Impossible + cardflip_cursor 13, 2, .PokeGroupPair + cardflip_cursor 13, 2, .PokeGroupPair + cardflip_cursor 17, 2, .PokeGroupPair + cardflip_cursor 17, 2, .PokeGroupPair + + cardflip_cursor 11, 3, .Impossible + cardflip_cursor 12, 3, .Impossible + cardflip_cursor 13, 3, .PokeGroup + cardflip_cursor 15, 3, .PokeGroup + cardflip_cursor 17, 3, .PokeGroup + cardflip_cursor 19, 3, .PokeGroup + + cardflip_cursor 11, 5, .NumGroupPair + cardflip_cursor 12, 5, .NumGroup + cardflip_cursor 13, 5, .SingleTile + cardflip_cursor 15, 5, .SingleTile + cardflip_cursor 17, 5, .SingleTile + cardflip_cursor 19, 5, .SingleTile + + cardflip_cursor 11, 5, .NumGroupPair + cardflip_cursor 12, 6, 0, 4, .NumGroup + cardflip_cursor 13, 6, 0, 4, .SingleTile + cardflip_cursor 15, 6, 0, 4, .SingleTile + cardflip_cursor 17, 6, 0, 4, .SingleTile + cardflip_cursor 19, 6, 0, 4, .SingleTile + + cardflip_cursor 11, 8, .NumGroupPair + cardflip_cursor 12, 8, .NumGroup + cardflip_cursor 13, 8, .SingleTile + cardflip_cursor 15, 8, .SingleTile + cardflip_cursor 17, 8, .SingleTile + cardflip_cursor 19, 8, .SingleTile + + cardflip_cursor 11, 8, .NumGroupPair + cardflip_cursor 12, 9, 0, 4, .NumGroup + cardflip_cursor 13, 9, 0, 4, .SingleTile + cardflip_cursor 15, 9, 0, 4, .SingleTile + cardflip_cursor 17, 9, 0, 4, .SingleTile + cardflip_cursor 19, 9, 0, 4, .SingleTile + + cardflip_cursor 11, 11, .NumGroupPair + cardflip_cursor 12, 11, .NumGroup + cardflip_cursor 13, 11, .SingleTile + cardflip_cursor 15, 11, .SingleTile + cardflip_cursor 17, 11, .SingleTile + cardflip_cursor 19, 11, .SingleTile + + cardflip_cursor 11, 11, .NumGroupPair + cardflip_cursor 12, 12, 0, 4, .NumGroup + cardflip_cursor 13, 12, 0, 4, .SingleTile + cardflip_cursor 15, 12, 0, 4, .SingleTile + cardflip_cursor 17, 12, 0, 4, .SingleTile + cardflip_cursor 19, 12, 0, 4, .SingleTile +; e0a41 + +.SingleTile: ; e0a41 + db 6 + dsprite 0, 0, -1, 7, $00, 0 | PRIORITY + dsprite 0, 0, 0, 0, $02, 0 | PRIORITY + dsprite 0, 0, 1, 0, $03, 0 | PRIORITY + dsprite 0, 5, -1, 7, $00, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 0, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 1, 0, $03, 0 | PRIORITY + +.PokeGroup: ; e0a5a + db 26 + dsprite 0, 0, -1, 7, $00, 0 | PRIORITY + dsprite 0, 0, 0, 0, $02, 0 | PRIORITY + dsprite 0, 0, 1, 0, $00, 0 | X_FLIP | PRIORITY + dsprite 1, 0, -1, 7, $01, 0 | PRIORITY + dsprite 1, 0, 1, 0, $01, 0 | X_FLIP | PRIORITY + dsprite 2, 0, -1, 7, $01, 0 | PRIORITY + dsprite 2, 0, 1, 0, $03, 0 | PRIORITY + dsprite 3, 0, -1, 7, $01, 0 | PRIORITY + dsprite 3, 0, 1, 0, $03, 0 | PRIORITY + dsprite 4, 0, -1, 7, $01, 0 | PRIORITY + dsprite 4, 0, 1, 0, $03, 0 | PRIORITY + dsprite 5, 0, -1, 7, $01, 0 | PRIORITY + dsprite 5, 0, 1, 0, $03, 0 | PRIORITY + dsprite 6, 0, -1, 7, $01, 0 | PRIORITY + dsprite 6, 0, 1, 0, $03, 0 | PRIORITY + dsprite 7, 0, -1, 7, $01, 0 | PRIORITY + dsprite 7, 0, 1, 0, $03, 0 | PRIORITY + dsprite 8, 0, -1, 7, $01, 0 | PRIORITY + dsprite 8, 0, 1, 0, $03, 0 | PRIORITY + dsprite 9, 0, -1, 7, $01, 0 | PRIORITY + dsprite 9, 0, 1, 0, $03, 0 | PRIORITY + dsprite 10, 0, -1, 7, $01, 0 | PRIORITY + dsprite 10, 0, 1, 0, $03, 0 | PRIORITY + dsprite 10, 1, -1, 7, $00, 0 | Y_FLIP | PRIORITY + dsprite 10, 1, 0, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 10, 1, 1, 0, $03, 0 | PRIORITY + +.NumGroup: ; e0ac3 + db 20 + dsprite 0, 0, -1, 7, $00, 0 | PRIORITY + dsprite 0, 0, 0, 0, $02, 0 | PRIORITY + dsprite 0, 0, 1, 0, $02, 0 | PRIORITY + dsprite 0, 0, 2, 0, $03, 0 | PRIORITY + dsprite 0, 0, 3, 0, $02, 0 | PRIORITY + dsprite 0, 0, 4, 0, $03, 0 | PRIORITY + dsprite 0, 0, 5, 0, $02, 0 | PRIORITY + dsprite 0, 0, 6, 0, $03, 0 | PRIORITY + dsprite 0, 0, 7, 0, $02, 0 | PRIORITY + dsprite 0, 0, 8, 0, $03, 0 | PRIORITY + dsprite 0, 5, -1, 7, $00, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 0, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 1, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 2, 0, $03, 0 | PRIORITY + dsprite 0, 5, 3, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 4, 0, $03, 0 | PRIORITY + dsprite 0, 5, 5, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 6, 0, $03, 0 | PRIORITY + dsprite 0, 5, 7, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 8, 0, $03, 0 | PRIORITY + +.NumGroupPair: ; e0b14 + db 30 + dsprite 0, 0, 0, 0, $00, 0 | PRIORITY + dsprite 0, 0, 1, 0, $02, 0 | PRIORITY + dsprite 0, 0, 2, 0, $02, 0 | PRIORITY + dsprite 0, 0, 3, 0, $03, 0 | PRIORITY + dsprite 0, 0, 4, 0, $02, 0 | PRIORITY + dsprite 0, 0, 5, 0, $03, 0 | PRIORITY + dsprite 0, 0, 6, 0, $02, 0 | PRIORITY + dsprite 0, 0, 7, 0, $03, 0 | PRIORITY + dsprite 0, 0, 8, 0, $02, 0 | PRIORITY + dsprite 0, 0, 9, 0, $03, 0 | PRIORITY + dsprite 1, 0, 0, 0, $01, 0 | PRIORITY + dsprite 1, 0, 3, 0, $03, 0 | PRIORITY + dsprite 1, 0, 5, 0, $03, 0 | PRIORITY + dsprite 1, 0, 7, 0, $03, 0 | PRIORITY + dsprite 1, 0, 9, 0, $03, 0 | PRIORITY + dsprite 2, 0, 0, 0, $01, 0 | PRIORITY + dsprite 2, 0, 3, 0, $03, 0 | PRIORITY + dsprite 2, 0, 5, 0, $03, 0 | PRIORITY + dsprite 2, 0, 7, 0, $03, 0 | PRIORITY + dsprite 2, 0, 9, 0, $03, 0 | PRIORITY + dsprite 2, 1, 0, 0, $00, 0 | Y_FLIP | PRIORITY + dsprite 2, 1, 1, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 2, 1, 2, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 2, 1, 3, 0, $03, 0 | PRIORITY + dsprite 2, 1, 4, 0, $03, 0 | PRIORITY + dsprite 2, 1, 5, 0, $03, 0 | PRIORITY + dsprite 2, 1, 6, 0, $03, 0 | PRIORITY + dsprite 2, 1, 7, 0, $03, 0 | PRIORITY + dsprite 2, 1, 8, 0, $03, 0 | PRIORITY + dsprite 2, 1, 9, 0, $03, 0 | PRIORITY + +.PokeGroupPair: ; e0b8d + db 38 + dsprite 0, 0, -1, 7, $00, 0 | PRIORITY + dsprite 0, 0, 3, 0, $00, 0 | X_FLIP | PRIORITY + dsprite 1, 0, -1, 7, $01, 0 | PRIORITY + dsprite 1, 0, 3, 0, $01, 0 | X_FLIP | PRIORITY + dsprite 2, 0, -1, 7, $01, 0 | PRIORITY + dsprite 2, 0, 3, 0, $01, 0 | X_FLIP | PRIORITY + dsprite 3, 0, -1, 7, $01, 0 | PRIORITY + dsprite 3, 0, 1, 0, $03, 0 | PRIORITY + dsprite 3, 0, 3, 0, $03, 0 | PRIORITY + dsprite 4, 0, -1, 7, $01, 0 | PRIORITY + dsprite 4, 0, 1, 0, $03, 0 | PRIORITY + dsprite 4, 0, 3, 0, $03, 0 | PRIORITY + dsprite 5, 0, -1, 7, $01, 0 | PRIORITY + dsprite 5, 0, 1, 0, $03, 0 | PRIORITY + dsprite 5, 0, 3, 0, $03, 0 | PRIORITY + dsprite 6, 0, -1, 7, $01, 0 | PRIORITY + dsprite 6, 0, 1, 0, $03, 0 | PRIORITY + dsprite 6, 0, 3, 0, $03, 0 | PRIORITY + dsprite 7, 0, -1, 7, $01, 0 | PRIORITY + dsprite 7, 0, 1, 0, $03, 0 | PRIORITY + dsprite 7, 0, 3, 0, $03, 0 | PRIORITY + dsprite 8, 0, -1, 7, $01, 0 | PRIORITY + dsprite 8, 0, 1, 0, $03, 0 | PRIORITY + dsprite 8, 0, 3, 0, $03, 0 | PRIORITY + dsprite 9, 0, -1, 7, $01, 0 | PRIORITY + dsprite 9, 0, 1, 0, $03, 0 | PRIORITY + dsprite 9, 0, 3, 0, $03, 0 | PRIORITY + dsprite 10, 0, -1, 7, $01, 0 | PRIORITY + dsprite 10, 0, 1, 0, $03, 0 | PRIORITY + dsprite 10, 0, 3, 0, $03, 0 | PRIORITY + dsprite 11, 0, -1, 7, $01, 0 | PRIORITY + dsprite 11, 0, 1, 0, $03, 0 | PRIORITY + dsprite 11, 0, 3, 0, $03, 0 | PRIORITY + dsprite 11, 1, -1, 7, $00, 0 | Y_FLIP | PRIORITY + dsprite 11, 1, 0, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 11, 1, 1, 0, $03, 0 | Y_FLIP | PRIORITY + dsprite 11, 1, 2, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 11, 1, 3, 0, $03, 0 | X_FLIP | Y_FLIP | PRIORITY + +.Impossible: ; e0c26 + db 4 + dsprite 0, 0, 0, 0, $00, 0 | PRIORITY + dsprite 0, 0, 1, 0, $00, 0 | X_FLIP | PRIORITY + dsprite 1, 0, 0, 0, $00, 0 | Y_FLIP | PRIORITY + dsprite 1, 0, 1, 0, $00, 0 | X_FLIP | Y_FLIP | PRIORITY +; e0c37 + +CardFlip_InitAttrPals: ; e0c37 (38:4c37) + ld a, [hCGB] + and a + ret z + + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + + hlcoord 12, 1, wAttrMap + lb bc, 2, 2 + ld a, $1 + call CardFlip_FillBox + + hlcoord 14, 1, wAttrMap + lb bc, 2, 2 + ld a, $2 + call CardFlip_FillBox + + hlcoord 16, 1, wAttrMap + lb bc, 2, 2 + ld a, $3 + call CardFlip_FillBox + + hlcoord 18, 1, wAttrMap + lb bc, 2, 2 + ld a, $4 + call CardFlip_FillBox + + hlcoord 9, 0, wAttrMap + lb bc, 12, 1 + ld a, $1 + call CardFlip_FillBox + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, .palettes + ld de, wBGPals1 + ld bc, 9 palettes + call CopyBytes + pop af + ld [rSVBK], a + ret +; e0c93 (38:4c93) + +.palettes ; e0c93 +INCLUDE "gfx/card_flip/card_flip.pal" +; e0cdb + +CardFlipLZ03: ; e0cdb +INCBIN "gfx/card_flip/card_flip_3.2bpp.lz" + +CardFlipOffButtonGFX: ; e0cf6 +INCBIN "gfx/card_flip/off.2bpp" + +CardFlipOnButtonGFX: ; e0d06 +INCBIN "gfx/card_flip/on.2bpp" + +CardFlipLZ01: ; e0d16 +INCBIN "gfx/card_flip/card_flip_1.2bpp.lz" + +CardFlipLZ02: ; e0ea8 +INCBIN "gfx/card_flip/card_flip_2.2bpp.lz" + +CardFlipTilemap: ; e110c +INCBIN "gfx/card_flip/card_flip.tilemap" +; e1190 diff --git a/engine/game/dummy_game.asm b/engine/game/dummy_game.asm new file mode 100755 index 000000000..6d7e12196 --- /dev/null +++ b/engine/game/dummy_game.asm @@ -0,0 +1,612 @@ +_DummyGame: ; e1e5b (38:5e5b) + call .LoadGFXAndPals + call DelayFrame +.loop + call .JumptableLoop + jr nc, .loop + ret + +.LoadGFXAndPals: + call DisableLCD + ld b, SCGB_DIPLOMA + call GetSGBLayout + callfar ClearSpriteAnims + ld hl, LZ_e2221 + ld de, vTiles2 tile $00 + call Decompress + ld hl, Unknown_e00ed + ld de, vTiles0 tile $00 + ld bc, 4 tiles + ld a, BANK(Unknown_e00ed) + call FarCopyBytes + ld a, $8 + ld hl, wc300 + ld [hli], a + ld [hl], $0 + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + xor a + ld [hSCY], a + ld [hSCX], a + ld [rWY], a + ld [wJumptableIndex], a + ld a, $1 + ld [hBGMapMode], a + ld a, LCDC_DEFAULT + ld [rLCDC], a + ld a, $e4 + call DmgToCgbBGPals + ld a, $e0 + call DmgToCgbObjPal0 + ret + +.JumptableLoop: + ld a, [wJumptableIndex] + bit 7, a + jr nz, .quit + call .ExecuteJumptable + callfar PlaySpriteAnimations + call DelayFrame + and a + ret + +.quit + scf + ret + +.ExecuteJumptable: + jumptable .Jumptable, wJumptableIndex + +.Jumptable: + dw .RestartGame + dw .ResetBoard + dw .InitBoardTilemapAndCursorObject + dw .CheckTriesRemaining + dw .PickCard1 + dw .PickCard2 + dw .DelayPickAgain + dw .RevealAll + dw .AskPlayAgain + +.RestartGame: + call DummyGame_InitStrings + ld hl, wJumptableIndex + inc [hl] + ret + +.ResetBoard: + call ret_e00ed + jr nc, .proceed + ld hl, wJumptableIndex + set 7, [hl] + ret + +.proceed + call DummyGame_InitBoard + ld hl, wJumptableIndex + inc [hl] + xor a + ld [wDummyGameCounter], a + ld hl, wDummyGameLastMatches +rept 4 + ld [hli], a +endr + ld [hl], a + ld [wDummyGameNumCardsMatched], a +.InitBoardTilemapAndCursorObject: + ld hl, wDummyGameCounter + ld a, [hl] + cp 45 + jr nc, .spawn_object + inc [hl] + call DummyGame_Card2Coord + xor a + ld [wDummyGameLastCardPicked], a + call DummyGame_PlaceCard + ret + +.spawn_object + depixel 6, 3, 4, 4 + ld a, SPRITE_ANIM_INDEX_DUMMY_GAME + call _InitSpriteAnimStruct + ld a, 5 + ld [wDummyGameNumberTriesRemaining], a + ld hl, wJumptableIndex + inc [hl] + ret + +.CheckTriesRemaining: + ld a, [wDummyGameNumberTriesRemaining] + hlcoord 17, 0 + add "0" + ld [hl], a + ld hl, wDummyGameNumberTriesRemaining + ld a, [hl] + and a + jr nz, .next_try + ld a, $7 + ld [wJumptableIndex], a + ret + +.next_try + dec [hl] + xor a + ld [wcf64], a + ld hl, wJumptableIndex + inc [hl] +.PickCard1: + ld a, [wcf64] + and a + ret z + dec a + ld e, a + ld d, 0 + ld hl, wDummyGameCards + add hl, de + ld a, [hl] + cp -1 + ret z + ld [wDummyGameLastCardPicked], a + ld [wDummyGameCard1], a + ld a, e + ld [wDummyGameCard1Location], a + call DummyGame_Card2Coord + call DummyGame_PlaceCard + xor a + ld [wcf64], a + ld hl, wJumptableIndex + inc [hl] + ret + +.PickCard2: + ld a, [wcf64] + and a + ret z + dec a + ld hl, wDummyGameCard1Location + cp [hl] + ret z + ld e, a + ld d, 0 + ld hl, wDummyGameCards + add hl, de + ld a, [hl] + cp -1 + ret z + ld [wDummyGameLastCardPicked], a + ld [wDummyGameCard2], a + ld a, e + ld [wDummyGameCard2Location], a + call DummyGame_Card2Coord + call DummyGame_PlaceCard + ld a, 64 + ld [wDummyGameCounter], a + ld hl, wJumptableIndex + inc [hl] +.DelayPickAgain: + ld hl, wDummyGameCounter + ld a, [hl] + and a + jr z, .PickAgain + dec [hl] + ret + +.PickAgain: + call DummyGame_CheckMatch + ld a, $3 + ld [wJumptableIndex], a + ret + +.RevealAll: + ld a, [hJoypadPressed] + and A_BUTTON + ret z + xor a + ld [wDummyGameCounter], a +.RevelationLoop: + ld hl, wDummyGameCounter + ld a, [hl] + cp 45 + jr nc, .finish_round + inc [hl] + push af + call DummyGame_Card2Coord + pop af + push hl + ld e, a + ld d, $0 + ld hl, wDummyGameCards + add hl, de + ld a, [hl] + pop hl + cp -1 + jr z, .RevelationLoop + ld [wDummyGameLastCardPicked], a + call DummyGame_PlaceCard + jr .RevelationLoop + +.finish_round + call WaitPressAorB_BlinkCursor + ld hl, wJumptableIndex + inc [hl] +.AskPlayAgain: + call ret_e00ed + jr nc, .restart + ld hl, wJumptableIndex + set 7, [hl] + ret + +.restart + xor a + ld [wJumptableIndex], a + ret + +; e2010 + +DummyGame_CheckMatch: ; e2010 + ld hl, wDummyGameCard1 + ld a, [hli] + cp [hl] + jr nz, .no_match + + ld a, [wDummyGameCard1Location] + call DummyGame_Card2Coord + call DummyGame_DeleteCard + + ld a, [wDummyGameCard2Location] + call DummyGame_Card2Coord + call DummyGame_DeleteCard + + ld a, [wDummyGameCard1Location] + ld e, a + ld d, $0 + ld hl, wDummyGameCards + add hl, de + ld [hl], -1 + + ld a, [wDummyGameCard2Location] + ld e, a + ld d, 0 + ld hl, wDummyGameCards + add hl, de + ld [hl], -1 + + ld hl, wDummyGameLastMatches +.find_empty_slot + ld a, [hli] + and a + jr nz, .find_empty_slot + dec hl + ld a, [wDummyGameCard1] + ld [hl], a + ld [wDummyGameLastCardPicked], a + ld hl, wDummyGameNumCardsMatched + ld e, [hl] + inc [hl] + inc [hl] + ld d, 0 + hlcoord 5, 0 + add hl, de + call DummyGame_PlaceCard + ld hl, .VictoryText + call PrintText + ret + +.no_match + xor a + ld [wDummyGameLastCardPicked], a + + ld a, [wDummyGameCard1Location] + call DummyGame_Card2Coord + call DummyGame_PlaceCard + + ld a, [wDummyGameCard2Location] + call DummyGame_Card2Coord + call DummyGame_PlaceCard + + ld hl, DummyGameText_Darn + call PrintText + ret + +.VictoryText: + start_asm + push bc + hlcoord 2, 13 + call DummyGame_PlaceCard + ld hl, DummyGameText_Yeah + pop bc + inc bc + inc bc + inc bc + ret + +; e2093 + +DummyGameText_Yeah: ; 0xe2093 + ; , yeah! + text_jump UnknownText_0x1c1a5b + db "@" +; 0xe2098 + +DummyGameText_Darn: ; 0xe2098 + ; Darn… + text_jump UnknownText_0x1c1a65 + db "@" +; 0xe209d + +DummyGame_InitBoard: ; e209d + ld hl, wDummyGameCards + ld bc, wDummyGameCardsEnd - wDummyGameCards + xor a + call ByteFill + call DummyGame_GetDistributionOfTiles + + ld c, 2 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 8 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 4 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 7 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 3 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 6 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 1 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 5 + ld hl, wDummyGameCards + ld b, wDummyGameCardsEnd - wDummyGameCards +.loop + ld a, [hl] + and a + jr nz, .no_load + ld [hl], c +.no_load + inc hl + dec b + jr nz, .loop + ret + +; e20e5 + +DummyGame_SampleTilePlacement: ; e20e5 + push hl + ld de, wDummyGameCards +.loop + call Random + and %00111111 + cp 45 + jr nc, .loop + ld l, a + ld h, 0 + add hl, de + ld a, [hl] + and a + jr nz, .loop + ld [hl], c + dec b + jr nz, .loop + pop hl + inc hl + ret + +; e2101 + +DummyGame_GetDistributionOfTiles: ; e2101 + ld a, [wMenuCursorY] + dec a + ld l, a + ld h, 0 + add hl, hl + add hl, hl + add hl, hl + ld de, .distributions + add hl, de + ret + +.distributions + db $02, $03, $06, $06, $06, $08, $08, $06 + db $02, $02, $04, $06, $06, $08, $08, $09 + db $02, $02, $02, $04, $07, $08, $08, $0c +; e2128 + +DummyGame_PlaceCard: ; e2128 + ld a, [wDummyGameLastCardPicked] + sla a + sla a + add 4 + ld [hli], a + inc a + ld [hld], a + inc a + ld bc, SCREEN_WIDTH + add hl, bc + ld [hli], a + inc a + ld [hl], a + ld c, 3 + call DelayFrames + ret + +; e2142 + +DummyGame_DeleteCard: ; e2142 + ld a, $1 + ld [hli], a + ld [hld], a + ld bc, SCREEN_WIDTH + add hl, bc + ld [hli], a + ld [hl], a + ld c, 3 + call DelayFrames + ret + +; e2152 + +DummyGame_InitStrings: ; e2152 + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $1 + call ByteFill + hlcoord 0, 0 + ld de, .japstr1 + call PlaceString + hlcoord 15, 0 + ld de, .japstr2 + call PlaceString + ld hl, .dummy_text + call PrintText + ret + +.dummy_text + db "@" +.japstr1 + db "とったもの@" +.japstr2 + db "あと かい@" +; e2183 + +DummyGame_Card2Coord: ; e2183 + ld d, 0 +.find_row + sub 9 + jr c, .found_row + inc d + jr .find_row + +.found_row + add 9 + ld e, a + hlcoord 1, 2 + ld bc, 2 * SCREEN_WIDTH +.loop2 + ld a, d + and a + jr z, .done + add hl, bc + dec d + jr .loop2 + +.done + sla e + add hl, de + ret + +; e21a1 + +DummyGame_InterpretJoypad_AnimateCursor: ; e21a1 (38:61a1) + ld a, [wJumptableIndex] + cp $7 + jr nc, .quit + call JoyTextDelay + ld hl, hJoypadPressed ; $ffa3 + ld a, [hl] + and A_BUTTON + jr nz, .pressed_a + ld a, [hl] + and D_LEFT + jr nz, .pressed_left + ld a, [hl] + and D_RIGHT + jr nz, .pressed_right + ld a, [hl] + and D_UP + jr nz, .pressed_up + ld a, [hl] + and D_DOWN + jr nz, .pressed_down + ret + +.quit + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +.pressed_a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc a + ld [wcf64], a + ret + +.pressed_left + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + and a + ret z + sub 1 tiles + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + dec [hl] + ret + +.pressed_right + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + cp (9 - 1) tiles + ret z + add 1 tiles + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + inc [hl] + ret + +.pressed_up + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + and a + ret z + sub 1 tiles + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + sub 9 + ld [hl], a + ret + +.pressed_down + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp (5 - 1) tiles + ret z + add 1 tiles + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add 9 + ld [hl], a + ret + +; e2221 (38:6221) + +LZ_e2221: ; e2221 +INCBIN "gfx/dummy_game/dummy_game.2bpp.lz" diff --git a/engine/game/slot_machine.asm b/engine/game/slot_machine.asm new file mode 100755 index 000000000..924c78924 --- /dev/null +++ b/engine/game/slot_machine.asm @@ -0,0 +1,2352 @@ +SLOTS_NO_BIAS EQU -1 +SLOTS_NO_MATCH EQU -1 + +SLOTS_SEVEN EQU $00 +SLOTS_POKEBALL EQU $04 +SLOTS_CHERRY EQU $08 +SLOTS_PIKACHU EQU $0c +SLOTS_SQUIRTLE EQU $10 +SLOTS_STARYU EQU $14 + +REEL_SIZE EQU 15 + +; Constants for slot_reel offsets (see macros/wram.asm) +REEL_ACTION EQUS "(wReel1ReelAction - wReel1)" +REEL_TILEMAP_ADDR EQUS "(wReel1TilemapAddr - wReel1)" +REEL_POSITION EQUS "(wReel1Position - wReel1)" +REEL_SPIN_DISTANCE EQUS "(wReel1SpinDistance - wReel1)" +REEL_SPIN_RATE EQUS "(wReel1SpinRate - wReel1)" +REEL_OAM_ADDR EQUS "(wReel1OAMAddr - wReel1)" +REEL_X_COORD EQUS "(wReel1XCoord - wReel1)" +REEL_MANIP_COUNTER EQUS "(wReel1ManipCounter - wReel1)" +REEL_MANIP_DELAY EQUS "(wReel1ManipDelay - wReel1)" +REEL_FIELD_0B EQUS "(wReel1Field0b - wReel1)" +REEL_STOP_DELAY EQUS "(wReel1StopDelay - wReel1)" + +; SlotsJumptable constants + const_def + const SLOTS_INIT + const SLOTS_BET_AND_START + const SLOTS_WAIT_START + const SLOTS_WAIT_REEL1 + const SLOTS_WAIT_STOP_REEL1 + const SLOTS_WAIT_REEL2 + const SLOTS_WAIT_STOP_REEL2 + const SLOTS_WAIT_REEL3 + const SLOTS_WAIT_STOP_REEL3 + const SLOTS_NEXT_09 + const SLOTS_NEXT_0A + const SLOTS_NEXT_0B + const SLOTS_FLASH_IF_WIN + const SLOTS_FLASH_SCREEN + const SLOTS_GIVE_EARNED_COINS + const SLOTS_PAYOUT_TEXT_AND_ANIM + const SLOTS_PAYOUT_ANIM + const SLOTS_RESTART_OF_QUIT + const SLOTS_QUIT +SLOTS_END_LOOP_F EQU 7 + +; ReelActionJumptable constants + const_def + const REEL_ACTION_DO_NOTHING + const REEL_ACTION_STOP_REEL_IGNORE_JOYPAD + const REEL_ACTION_QUADRUPLE_RATE + const REEL_ACTION_DOUBLE_RATE + const REEL_ACTION_NORMAL_RATE + const REEL_ACTION_HALF_RATE + const REEL_ACTION_QUARTER_RATE + const REEL_ACTION_STOP_REEL1 + const REEL_ACTION_STOP_REEL2 + const REEL_ACTION_STOP_REEL3 + const REEL_ACTION_SET_UP_REEL2_SKIP_TO_7 + const REEL_ACTION_WAIT_REEL2_SKIP_TO_7 + const REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S + const REEL_ACTION_UNUSED + const REEL_ACTION_CHECK_DROP_REEL + const REEL_ACTION_WAIT_DROP_REEL + const REEL_ACTION_START_SLOW_ADVANCE_REEL3 + const REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3 + const REEL_ACTION_INIT_GOLEM + const REEL_ACTION_WAIT_GOLEM + const REEL_ACTION_END_GOLEM + const REEL_ACTION_INIT_CHANSEY + const REEL_ACTION_WAIT_CHANSEY + const REEL_ACTION_WAIT_EGG + const REEL_ACTION_DROP_REEL + +_SlotMachine: + ld hl, wOptions + set NO_TEXT_SCROLL, [hl] + call .InitGFX + call DelayFrame +.loop + call SlotsLoop + jr nc, .loop + call WaitSFX + ld de, SFX_QUIT_SLOTS + call PlaySFX + call WaitSFX + call ClearBGPalettes + farcall StubbedTrainerRankings_EndSlotsWinStreak + ld hl, wOptions + res NO_TEXT_SCROLL, [hl] + ld hl, rLCDC + res rLCDC_SPRITE_SIZE, [hl] ; 8x8 + ret + +.InitGFX: ; 926f7 (24:66f7) + call ClearBGPalettes + call ClearTileMap + call ClearSprites + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + call DisableLCD + hlbgcoord 0, 0 + ld bc, vBGMap1 - vBGMap0 + ld a, " " + call ByteFill + ld b, SCGB_SLOT_MACHINE + call GetSGBLayout + callfar ClearSpriteAnims + ld hl, wSlots + ld bc, wSlotsDataEnd - wSlots + xor a + call ByteFill + + ld hl, Slots2LZ + ld de, vTiles0 tile $00 + call Decompress + + ld hl, Slots3LZ + ld de, vTiles0 tile $40 + call Decompress + + ld hl, Slots1LZ + ld de, vTiles2 tile $00 + call Decompress + + ld hl, Slots2LZ + ld de, vTiles2 tile $25 + call Decompress + + ld hl, SlotsTilemap + decoord 0, 0 + ld bc, SCREEN_WIDTH * 12 + call CopyBytes + + ld hl, rLCDC + set rLCDC_SPRITE_SIZE, [hl] ; 8x16 + call EnableLCD + ld hl, wSlots + ld bc, wSlotsEnd - wSlots + xor a + call ByteFill + call Slots_InitReelTiles + call Slots_GetPals + ld a, $7 + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], $40 + xor a ; SLOTS_INIT + ld [wJumptableIndex], a + ld a, SLOTS_NO_BIAS + ld [wSlotBias], a + ld de, MUSIC_GAME_CORNER + call PlayMusic + xor a + ld [wKeepSevenBiasChance], a ; 87.5% chance + call Random + and %00101010 + ret nz + ld a, 1 + ld [wKeepSevenBiasChance], a ; 12.5% chance + ret + +Slots_GetPals: ; 9279b (24:679b) + ld a, %11100100 + call DmgToCgbBGPals + lb de, %11100100, %11100100 + ld a, [hCGB] + and a + jr nz, .cgb + lb de, %11000000, %11100100 +.cgb + call DmgToCgbObjPals + ret + +SlotsLoop: ; 927af (24:67af) + ld a, [wJumptableIndex] + bit SLOTS_END_LOOP_F, a + jr nz, .stop + call SlotsJumptable + call Slots_SpinReels + xor a + ld [wCurrSpriteOAMAddr], a + callfar DoNextFrameForFirst16Sprites + call .PrintCoinsAndPayout + call .Stubbed_Function927d3 + call DelayFrame + and a + ret + +.stop + scf + ret + +.Stubbed_Function927d3: ; 927d3 (24:67d3) +; dummied out + ret + ld a, [wReel1ReelAction] + and a + ret nz + ld a, [wReel2ReelAction] + and a + ret nz + ld a, [wFirstTwoReelsMatchingSevens] + and a + jr nz, .matching_sevens + ld a, %11100100 + call DmgToCgbBGPals + ret + +.matching_sevens + ld a, [wTextDelayFrames] + and $7 + ret nz + ld a, [rBGP] + xor %00001100 + call DmgToCgbBGPals + ret + +; 927f8 + +.PrintCoinsAndPayout: ; 927f8 (24:67f8) + hlcoord 5, 1 + ld de, wCoins + lb bc, PRINTNUM_LEADINGZEROS | 2, 4 + call PrintNum + hlcoord 11, 1 + ld de, wPayout + lb bc, PRINTNUM_LEADINGZEROS | 2, 4 + call PrintNum + ret + +; 92811 (24:6811) + +Unreferenced_Function92811: ; 92811 +; debug function? + ld a, [wSlotBias] + add 0 + daa + ld e, a + and $f + add "0" + hlcoord 1, 0 + ld [hl], a + ld a, e + swap a + and $f + add "0" + hlcoord 0, 0 + ld [hl], a + ret + +; 9282c + +Unreferenced_Function9282c: ; 9282c +; animate OAM tiles? + ld hl, wcf66 + ld a, [hl] + inc [hl] + and $7 + ret nz + ld hl, wVirtualOAMSprite16TileID + ld c, NUM_SPRITE_OAM_STRUCTS - 16 +.loop + ld a, [hl] + xor %00100000 + ld [hli], a ; tile id +rept SPRITEOAMSTRUCT_LENGTH + -1 + inc hl +endr + dec c + jr nz, .loop + ret + +; 92844 + +SlotsJumptable: ; 92844 (24:6844) + jumptable .Jumptable, wJumptableIndex + +.Jumptable: + dw SlotsAction_Init ; 00 + dw SlotsAction_BetAndStart ; 01 + dw SlotsAction_WaitStart ; 02 + dw SlotsAction_WaitReel1 ; 03 + dw SlotsAction_WaitStopReel1 ; 04 + dw SlotsAction_WaitReel2 ; 05 + dw SlotsAction_WaitStopReel2 ; 06 + dw SlotsAction_WaitReel3 ; 07 + dw SlotsAction_WaitStopReel3 ; 08 + dw SlotsAction_Next ; 09 + dw SlotsAction_Next ; 0a + dw SlotsAction_Next ; 0b + dw SlotsAction_FlashIfWin ; 0c + dw SlotsAction_FlashScreen ; 0d + dw SlotsAction_GiveEarnedCoins ; 0e + dw SlotsAction_PayoutTextAndAnim ; 0f + dw SlotsAction_PayoutAnim ; 10 + dw SlotsAction_RestartOrQuit ; 11 + dw SlotsAction_Quit ; 12 + +SlotsAction_Next: ; 92879 (24:6879) + ld hl, wJumptableIndex + inc [hl] + ret + +SlotsAction_Init: ; 9287e (24:687e) + call SlotsAction_Next + xor a + ld [wFirstTwoReelsMatching], a + ld [wFirstTwoReelsMatchingSevens], a + ld a, SLOTS_NO_MATCH + ld [wSlotMatched], a + ret + +SlotsAction_BetAndStart: ; 9288e (24:688e) + call Slots_AskBet + jr nc, .proceed + ld a, SLOTS_QUIT + ld [wJumptableIndex], a + ret + +.proceed + call SlotsAction_Next + call Slots_IlluminateBetLights + call Slots_InitBias + ld a, 32 + ld [wSlotsDelay], a + ld a, REEL_ACTION_NORMAL_RATE + ld [wReel1ReelAction], a + ld [wReel2ReelAction], a + ld [wReel3ReelAction], a + ld a, 4 + ld [wReel1ManipCounter], a + ld [wReel2ManipCounter], a + ld [wReel3ManipCounter], a + call WaitSFX + ld a, SFX_SLOT_MACHINE_START + call Slots_PlaySFX + ret + +SlotsAction_WaitStart: ; 928c6 (24:68c6) + ld hl, wSlotsDelay + ld a, [hl] + and a + jr z, .proceed + dec [hl] + ret + +.proceed + call SlotsAction_Next + xor a + ld [hJoypadSum], a + ret + +SlotsAction_WaitReel1: ; 928d6 (24:68d6) + ld hl, hJoypadSum + ld a, [hl] + and A_BUTTON + ret z + call SlotsAction_Next + call Slots_StopReel1 + ld [wReel1ReelAction], a +SlotsAction_WaitStopReel1: ; 928e6 (24:68e6) + ld a, [wReel1ReelAction] + cp REEL_ACTION_DO_NOTHING + ret nz + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + ld bc, wReel1 + ld de, wReel1Stopped + call Slots_LoadReelState + call SlotsAction_Next + xor a + ld [hJoypadSum], a +SlotsAction_WaitReel2: ; 92900 (24:6900) + ld hl, hJoypadSum + ld a, [hl] + and A_BUTTON + ret z + call SlotsAction_Next + call Slots_StopReel2 + ld [wReel2ReelAction], a +SlotsAction_WaitStopReel2: ; 92910 (24:6910) + ld a, [wReel2ReelAction] + cp REEL_ACTION_DO_NOTHING + ret nz + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + ld bc, wReel2 + ld de, wReel2Stopped + call Slots_LoadReelState + call SlotsAction_Next + xor a + ld [hJoypadSum], a +SlotsAction_WaitReel3: ; 9292a (24:692a) + ld hl, hJoypadSum + ld a, [hl] + and A_BUTTON + ret z + call SlotsAction_Next + call Slots_StopReel3 + ld [wReel3ReelAction], a +SlotsAction_WaitStopReel3: ; 9293a (24:693a) + ld a, [wReel3ReelAction] + cp REEL_ACTION_DO_NOTHING + ret nz + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + ld bc, wReel3 + ld de, wReel3Stopped + call Slots_LoadReelState + call SlotsAction_Next + xor a + ld [hJoypadSum], a + ret + +SlotsAction_FlashIfWin: ; 92955 (24:6955) + ld a, [wSlotMatched] + cp SLOTS_NO_MATCH + jr nz, .GotIt + call SlotsAction_Next + call SlotsAction_Next + ret + +.GotIt: + call SlotsAction_Next + ld a, 16 + ld [wSlotsDelay], a +SlotsAction_FlashScreen: ; 9296b (24:696b) + ld hl, wSlotsDelay + ld a, [hl] + and a + jr z, .done + dec [hl] + srl a + ret z + + ld a, [rOBP0] + xor $ff + ld e, a + ld d, a + call DmgToCgbObjPals + ret + +.done + call Slots_GetPals + call SlotsAction_Next + ret + +SlotsAction_GiveEarnedCoins: ; 92987 (24:6987) + xor a + ld [wFirstTwoReelsMatching], a + ld [wFirstTwoReelsMatchingSevens], a + ld a, %11100100 + call DmgToCgbBGPals + call Slots_GetPayout + xor a + ld [wSlotsDelay], a + call SlotsAction_Next + ret + +SlotsAction_PayoutTextAndAnim: ; 9299e (24:699e) + call Slots_PayoutText + call SlotsAction_Next +SlotsAction_PayoutAnim: ; 929a4 (24:69a4) + ld hl, wSlotsDelay + ld a, [hl] + inc [hl] + and $1 + ret z + ld hl, wPayout + ld a, [hli] + ld d, a + or [hl] + jr z, .done + ld e, [hl] + dec de + ld [hl], e + dec hl + ld [hl], d + ld hl, wCoins + ld d, [hl] + inc hl + ld e, [hl] + call Slots_CheckCoinCaseFull + jr c, .okay + inc de +.okay + ld [hl], e + dec hl + ld [hl], d + ld a, [wSlotsDelay] + and $7 + ret z ; ret nz would be more appropriate + ld de, SFX_GET_COIN_FROM_SLOTS + call PlaySFX + ret + +.done + call SlotsAction_Next + ret + +SlotsAction_RestartOrQuit: ; 929d9 (24:69d9) + call Slots_DeilluminateBetLights + call WaitPressAorB_BlinkCursor + call Slots_AskPlayAgain + jr c, .exit_slots + ld a, SLOTS_INIT + ld [wJumptableIndex], a + ret + +.exit_slots + ld a, SLOTS_QUIT + ld [wJumptableIndex], a + ret + +SlotsAction_Quit: ; 929f0 (24:69f0) + ld hl, wJumptableIndex + set SLOTS_END_LOOP_F, [hl] + ret + +Slots_LoadReelState: ; 929f6 (24:69f6) + push de + call Slots_GetCurrentReelState + pop de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + ret + +Slots_CheckCoinCaseFull: ; 92a04 (24:6a04) + ld a, d + cp HIGH(MAX_COINS) + jr c, .not_full + ld a, e + cp LOW(MAX_COINS) + jr c, .not_full + scf + ret + +.not_full + and a + ret + +Slots_GetCurrentReelState: ; 92a12 (24:6a12) + ld hl, REEL_POSITION + add hl, bc + ld a, [hl] + and a + jr nz, .okay + ld a, $f +.okay + dec a + and $f + ld e, a + ld d, $0 + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ret + +Slots_StopReel1: ; 92a2b (24:6a2b) +; Always set the REEL_ACTION_STOP_REEL1 action. + ld a, REEL_ACTION_STOP_REEL1 + ret + +Slots_StopReel2: ; 92a2e (24:6a2e) +; As long as, the following three meet, there's a 31.25% chance +; to set action REEL_ACTION_SET_UP_REEL2_SKIP_TO_7: +; - Bet is >= 2 coins +; - There's a 7 symbol visible in reel #1 +; - Current spin isn't biased or is biased towards SEVEN +; In any other case, REEL_ACTION_STOP_REEL2 is set. + + ld a, [wSlotBet] + cp $2 + jr c, .dont_jump + ld a, [wSlotBias] + and a + jr z, .skip + cp SLOTS_NO_BIAS + jr nz, .dont_jump +.skip + call .CheckReel1ForASeven + jr nz, .dont_jump + call Random + cp $50 ; 32% + jr nc, .dont_jump + ld a, REEL_ACTION_SET_UP_REEL2_SKIP_TO_7 + ret + +.dont_jump + ld a, REEL_ACTION_STOP_REEL2 + ret + +.CheckReel1ForASeven: ; 92a51 (24:6a51) + ld a, [wReel1Stopped] + and a + ret z + ld a, [wReel1Stopped + 1] + and a + ret z + ld a, [wReel1Stopped + 2] + and a + ret + +Slots_StopReel3: ; 92a60 (24:6a60) +; If no matching SEVEN symbols in reels #1 and #2: +; - REEL_ACTION_STOP_REEL3, 100% + +; If matching SEVEN symbols and NO bias to SEVEN: +; - REEL_ACTION_STOP_REEL3, 37.5% +; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 31.3% +; - REEL_ACTION_INIT_GOLEM, 31.3% +; - REEL_ACTION_INIT_CHANSEY, 0% + +; If matching SEVEN symbols and bias to SEVEN: +; - REEL_ACTION_STOP_REEL3, 29.7% +; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 23.4% +; - REEL_ACTION_INIT_GOLEM, 23.4% +; - REEL_ACTION_INIT_CHANSEY, 23.4% + + ld a, [wFirstTwoReelsMatching] + and a + jr z, .stop + ld a, [wFirstTwoReelsMatchingSevens] + and a + jr z, .stop + ld a, [wSlotBias] + and a + jr nz, .biased + call Random + cp 180 + jr nc, .stop + cp 120 + jr nc, .slow_advance + cp 60 + jr nc, .golem + ld a, REEL_ACTION_INIT_CHANSEY + ret + +.biased + call Random + cp 160 + jr nc, .stop + cp 80 + jr nc, .slow_advance +.golem + ld a, REEL_ACTION_INIT_GOLEM + ret + +.slow_advance + ld a, REEL_ACTION_START_SLOW_ADVANCE_REEL3 + ret + +.stop + ld a, REEL_ACTION_STOP_REEL3 + ret + +Slots_InitReelTiles: ; 92a98 (24:6a98) + ld bc, wReel1 + ld hl, REEL_OAM_ADDR + add hl, bc + ld de, wVirtualOAMSprite16 + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld de, Reel1Tilemap + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_X_COORD + add hl, bc + ld [hl], 6 * 8 + call .OAM + + ld bc, wReel2 + ld hl, REEL_OAM_ADDR + add hl, bc + ld de, wVirtualOAMSprite24 + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld de, Reel2Tilemap + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_X_COORD + add hl, bc + ld [hl], 10 * 8 + call .OAM + + ld bc, wReel3 + ld hl, REEL_OAM_ADDR + add hl, bc + ld de, wVirtualOAMSprite32 + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld de, Reel3Tilemap + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_X_COORD + add hl, bc + ld [hl], 14 * 8 + call .OAM + ret + +.OAM: ; 92af9 (24:6af9) + ld hl, REEL_ACTION + add hl, bc + ld [hl], REEL_ACTION_DO_NOTHING + ld hl, REEL_POSITION + add hl, bc + ld [hl], REEL_SIZE - 1 + ld hl, REEL_SPIN_DISTANCE + add hl, bc + ld [hl], REEL_ACTION_DO_NOTHING + call Slots_UpdateReelPositionAndOAM + ret + +Slots_SpinReels: ; 92b0f (24:6b0f) + ld bc, wReel1 + call .SpinReel + ld bc, wReel2 + call .SpinReel + ld bc, wReel3 + call .SpinReel + ret + +.SpinReel: ; 92b22 (24:6b22) + ld hl, REEL_SPIN_DISTANCE + add hl, bc + ld a, [hl] + and $f + jr nz, .skip + call ReelActionJumptable +.skip + ld hl, REEL_SPIN_RATE + add hl, bc + ld a, [hl] + and a + ret z + ld d, a + ld hl, REEL_SPIN_DISTANCE + add hl, bc + add [hl] + ld [hl], a + and $f + jr z, Slots_UpdateReelPositionAndOAM + ld hl, REEL_OAM_ADDR + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld e, $8 +.loop + ld a, [hl] + add d + ld [hli], a + inc hl + inc hl + inc hl + dec e + jr nz, .loop + ret + +Slots_UpdateReelPositionAndOAM: ; 92b53 (24:6b53) + ld hl, REEL_X_COORD + add hl, bc + ld a, [hl] + ld [wCurrReelXCoord], a + ld a, 10 * 8 + ld [wCurrReelYCoord], a + ld hl, REEL_POSITION + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ld e, l + ld d, h + call .LoadOAM + ld hl, REEL_POSITION + add hl, bc + ld a, [hl] + inc a + and $f + cp REEL_SIZE + jr nz, .load + xor a +.load + ld [hl], a + ret + +.LoadOAM: ; 92b83 (24:6b83) + ld hl, REEL_OAM_ADDR + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a +.loop + ld a, [wCurrReelYCoord] + ld [hli], a ; y + ld a, [wCurrReelXCoord] + ld [hli], a ; x + ld a, [de] + ld [hli], a ; tile id + srl a + srl a + set OAM_PRIORITY, a + ld [hli], a ; attributes + + ld a, [wCurrReelYCoord] + ld [hli], a ; y + ld a, [wCurrReelXCoord] + add 1 * TILE_WIDTH + ld [hli], a ; x + ld a, [de] + inc a + inc a + ld [hli], a ; tile id + srl a + srl a + set OAM_PRIORITY, a + ld [hli], a ; attributes + inc de + ld a, [wCurrReelYCoord] + sub 2 * TILE_WIDTH + ld [wCurrReelYCoord], a + cp 2 * TILE_WIDTH + jr nz, .loop + ret + +; 92bbe (24:6bbe) + +Unreferenced_Function92bbe: ; 92bbe + push hl + srl a + srl a + add LOW(.Unknown_92bce) + ld l, a + ld a, 0 + adc HIGH(.Unknown_92bce) + ld h, a + ld a, [hl] + pop hl + ret + +; 92bce + +.Unknown_92bce: ; 92bce + db 0, 1, 2, 3, 4, 5 +; 92bd4 + +ReelActionJumptable: ; 92bd4 (24:6bd4) + ld hl, REEL_ACTION + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +; 92be4 (24:6be4) + +.Jumptable: ; 92be4 + dw ReelAction_DoNothing ; 00 + dw ReelAction_StopReelIgnoreJoypad ; 01 + dw ReelAction_QuadrupleRate ; 02 + dw ReelAction_DoubleRate ; 03 + dw ReelAction_NormalRate ; 04 + dw ReelAction_HalfRate ; 05 + dw ReelAction_QuarterRate ; 06 + dw ReelAction_StopReel1 ; 07 + dw ReelAction_StopReel2 ; 08 + dw ReelAction_StopReel3 ; 09 + dw ReelAction_SetUpReel2SkipTo7 ; 0a + dw ReelAction_WaitReel2SkipTo7 ; 0b + dw ReelAction_FastSpinReel2UntilLinedUp7s ; 0c + dw ReelAction_Unused ; 0d + dw ReelAction_CheckDropReel ; 0e + dw ReelAction_WaitDropReel ; 0f + dw ReelAction_StartSlowAdvanceReel3 ; 10 + dw ReelAction_WaitSlowAdvanceReel3 ; 11 + dw ReelAction_InitGolem ; 12 + dw ReelAction_WaitGolem ; 13 + dw ReelAction_EndGolem ; 14 + dw ReelAction_InitChansey ; 15 + dw ReelAction_WaitChansey ; 16 + dw ReelAction_WaitEgg ; 17 + dw ReelAction_DropReel ; 18 +; 92c16 + +ReelAction_DoNothing: ; 92c16 + ret + +; 92c17 + +ReelAction_QuadrupleRate: ; 92c17 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 16 + ret + +; 92c1e + +ReelAction_DoubleRate: ; 92c1e + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 8 + ret + +; 92c25 + +ReelAction_NormalRate: ; 92c25 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 4 + ret + +; 92c2c + +ReelAction_HalfRate: ; 92c2c + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 2 + ret + +; 92c33 + +ReelAction_QuarterRate: ; 92c33 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 1 + ret + +; 92c3a + +Slots_StopReel: ; 92c3a + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + ld hl, REEL_ACTION + add hl, bc + ld [hl], REEL_ACTION_STOP_REEL_IGNORE_JOYPAD + ld hl, REEL_STOP_DELAY + add hl, bc + ld [hl], 3 +ReelAction_StopReelIgnoreJoypad: ; 92c4c + ld hl, REEL_STOP_DELAY + add hl, bc + ld a, [hl] + and a + jr z, .EndReel + dec [hl] + ret + +.EndReel: + ld hl, REEL_ACTION + add hl, bc + ld a, REEL_ACTION_DO_NOTHING + ld [hl], a + ret + +; 92c5e + +ReelAction_StopReel1: ; 92c5e +; If no bias: don't manipulate reel. +; If bias: manipulate reel up to wReel1ManipCounter (i.e. 4) slots, +; stoping early if the biased symbol shows up anywhere in reel #1, +; even if the current bet won't allow lining it up. + + ld a, [wSlotBias] + cp SLOTS_NO_BIAS + jr z, .NoBias + ld hl, REEL_MANIP_COUNTER + add hl, bc + ld a, [hl] + and a + jr z, .NoBias + dec [hl] + call .CheckForBias + ret nz +.NoBias: + call Slots_StopReel + ret + +; 92c76 + +.CheckForBias: ; 92c76 + call Slots_GetCurrentReelState + ld a, [wSlotBias] + ld e, a + ld a, [hli] + cp e + ret z + ld a, [hli] + cp e + ret z + ld a, [hl] + cp e + ret + +; 92c86 + +ReelAction_StopReel2: ; 92c86 +; If no bias: don't manipulate reel. +; If bias: manipulate reel up to wReel2ManipCounter (i.e. 4) slots, +; stoping early if the biased symbol is lined up in the first two +; reels, according to the lines that the current bet allows. + + call Slots_CheckMatchedFirstTwoReels + jr nc, .nope + ld a, [wSlotBuildingMatch] + ld hl, wSlotBias + cp [hl] + jr z, .NoBias +.nope + ld a, [wSlotBias] + cp SLOTS_NO_BIAS + jr z, .NoBias + ld hl, REEL_MANIP_COUNTER + add hl, bc + ld a, [hl] + and a + jr z, .NoBias + dec [hl] + ret + +.NoBias: + call Slots_StopReel + ret + +; 92ca9 + +ReelAction_StopReel3: ; 92ca9 +; Manipulate the reel up to wReel3ManipCounter (i.e. 4) slots, +; stopping early if the bias symbol is lined up for a win. +; If not biased to any symbols, stop as soon as nothing is lined up. + + call Slots_CheckMatchedAllThreeReels + jr nc, .NoMatch + ld hl, wSlotBias + cp [hl] + jr z, .NoBias + ld hl, REEL_MANIP_COUNTER + add hl, bc + ld a, [hl] + and a + ret z + dec [hl] + ret + +.NoMatch: + ld a, [wSlotBias] + cp SLOTS_NO_BIAS + jr z, .NoBias + ld hl, REEL_MANIP_COUNTER + add hl, bc + ld a, [hl] + and a + jr z, .NoBias + dec [hl] + ret + +.NoBias: + call Slots_StopReel + ret + +; 92cd2 + +ReelAction_SetUpReel2SkipTo7: ; 92cd2 +; Unique reel 2 action (see Slots_StopReel2) +; Ensures that 7 symbols become lined up in the first two reels, +; but more often than not, this is only a way to get our hopes up, as +; it makes exciting reel #3 modes with no success hope more common. + + call Slots_CheckMatchedFirstTwoReels + jr nc, .no_match + ld a, [wFirstTwoReelsMatchingSevens] + and a + jr z, .no_match + call Slots_StopReel + ret + +.no_match + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_REEL2_SKIP_TO_7 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld [hl], 32 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + ret + +; 92cf8 + +ReelAction_WaitReel2SkipTo7: ; 92cf8 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld a, [hl] + and a + jr z, .asm_92d02 + dec [hl] + ret + +.asm_92d02 + ld a, SFX_THROW_BALL + call Slots_PlaySFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 8 + ret + +; 92d13 + +ReelAction_FastSpinReel2UntilLinedUp7s: ; 92d13 + call Slots_CheckMatchedFirstTwoReels + ret nc + ld a, [wFirstTwoReelsMatchingSevens] + and a + ret z + call Slots_StopReel + ret + +; 92d20 + +ReelAction_InitGolem: ; 92d20 +; Ensures SEVENs are lined up if there's bias to SEVEN. +; Ensures nothing is lined up if there's no bias symbols. +; No other bias symbols are compatible with this mode. + +; This is achieved by throwing Golem until the desired result +; is produced. The amount of Golem thrown can be anywhere from +; 1 to 14 for SEVEN bias, and 4-8 for no bias. + + call Slots_CheckMatchedAllThreeReels + ret c + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + call Slots_WaitSFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_GOLEM + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + call Slots_GetNumberOfGolems + push bc + push af + depixel 12, 13 + ld a, SPRITE_ANIM_INDEX_SLOTS_GOLEM + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + pop af + ld [hl], a + pop bc + xor a + ld [wSlotsDelay], a +ReelAction_WaitGolem: ; 92d4f + ld a, [wSlotsDelay] + cp 2 + jr z, .two + cp 1 + jr z, .one + ret + +.two + call Slots_CheckMatchedAllThreeReels + call Slots_StopReel + ret + +.one + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_END_GOLEM + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 8 + ret + +; 92d6e + +ReelAction_EndGolem: ; 92d6e + xor a + ld [wSlotsDelay], a + ld hl, REEL_ACTION + add hl, bc + dec [hl] ; REEL_ACTION_WAIT_GOLEM + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + ret + +; 92d7e + +ReelAction_InitChansey: ; 92d7e +; Ensures the lining up of SEVEN symbols, but this mode is only possible +; when there is bias to SEVEN symbols (and even then, it's still rare). +; Chansey releases and egg and reel #3 is made to advance 17 slots very +; quickly as many times as necessary for the match to SEVENs to show up. + + call Slots_CheckMatchedAllThreeReels + ret c + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + call Slots_WaitSFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_CHANSEY + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + push bc + depixel 12, 0 + ld a, SPRITE_ANIM_INDEX_SLOTS_CHANSEY + call _InitSpriteAnimStruct + pop bc + xor a + ld [wSlotsDelay], a + ret + +; 92da4 + +ReelAction_WaitChansey: ; 92da4 + ld a, [wSlotsDelay] + and a + ret z + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_EGG + ld a, 2 + ld [wSlotsDelay], a +ReelAction_WaitEgg: ; 92db3 + ld a, [wSlotsDelay] + cp $4 + ret c + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_DROP_REEL + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 16 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld [hl], 17 +ReelAction_DropReel: ; 92dca + ld hl, REEL_MANIP_DELAY + add hl, bc + ld a, [hl] + and a + jr z, .check_match + dec [hl] + ret + +.check_match + call Slots_CheckMatchedAllThreeReels + jr nc, .EggAgain + and a + jr nz, .EggAgain + ld a, 5 + ld [wSlotsDelay], a + call Slots_StopReel + ret + +.EggAgain: + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + ld hl, REEL_ACTION + add hl, bc + dec [hl] + dec [hl] ; REEL_ACTION_WAIT_CHANSEY + ld a, 1 + ld [wSlotsDelay], a + ret + +; 92df7 + +ReelAction_Unused: ; 92df7 + call Slots_CheckMatchedAllThreeReels + ret c + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + call Slots_WaitSFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_CHECK_DROP_REEL + call Slots_GetNumberOfGolems + ld hl, REEL_MANIP_DELAY + add hl, bc + ld [hl], a +ReelAction_CheckDropReel: ; 92e10 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld a, [hl] + and a + jr nz, .spin + call Slots_CheckMatchedAllThreeReels + call Slots_StopReel + ret + +.spin + dec [hl] + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_DROP_REEL + ld hl, REEL_FIELD_0B + add hl, bc + ld [hl], 32 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 +ReelAction_WaitDropReel: ; 92e31 + ld hl, REEL_FIELD_0B + add hl, bc + ld a, [hl] + and a + jr z, .DropReel + dec [hl] + ret + +.DropReel: + ld hl, REEL_ACTION + add hl, bc + dec [hl] + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 8 + ret + +; 92e47 + +ReelAction_StartSlowAdvanceReel3: ; 92e47 +; Ensures SEVENs are lined up if there's bias to SEVEN. +; Ensures nothing is lined up if there's no bias symbols. +; No other bias symbols are compatible with this mode. + +; This is achieved by slowly advancing the reel a full round, +; plus any necessary slot until the desired result is produced. + + call Slots_CheckMatchedAllThreeReels + ret c + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + call Slots_WaitSFX + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 1 + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld [hl], 16 +ReelAction_WaitSlowAdvanceReel3: ; 92e64 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld a, [hl] + and a + jr z, .check1 + dec [hl] +.play_sfx + ld a, SFX_GOT_SAFARI_BALLS + call Slots_PlaySFX + ret + +.check1 + ld a, [wSlotBias] + and a + jr nz, .check2 + call Slots_CheckMatchedAllThreeReels + jr nc, .play_sfx + and a + jr nz, .play_sfx + call Slots_StopReel + call WaitSFX + ret + +.check2 + call Slots_CheckMatchedAllThreeReels + jr c, .play_sfx + call Slots_StopReel + call WaitSFX + ret + +; 92e94 + +Slots_CheckMatchedFirstTwoReels: ; 92e94 + xor a + ld [wFirstTwoReelsMatching], a + ld [wFirstTwoReelsMatchingSevens], a + call Slots_GetCurrentReelState + call Slots_CopyReelState + ld a, [wSlotBet] + and 3 + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .return + push de + jp hl + +.return + ld a, [wFirstTwoReelsMatching] + and a + ret z + scf + ret + +; 92ebd + +.Jumptable: ; 92ebd + dw .zero + dw .one + dw .two + dw .three +; 92ec5 + +.three ; 92ec5 + call .CheckUpwardsDiag + call .CheckDownwardsDiag + +.two ; 92ecb + call .CheckBottomRow + call .CheckTopRow + +.one ; 92ed1 + call .CheckMiddleRow + +.zero ; 92ed4 + ret + +; 92ed5 + +.CheckBottomRow: ; 92ed5 + ld hl, wCurrReelStopped + ld a, [wReel1Stopped] + cp [hl] + call z, .StoreResult + ret + +; 92ee0 + +.CheckUpwardsDiag: ; 92ee0 + ld hl, wCurrReelStopped + 1 + ld a, [wReel1Stopped] + cp [hl] + call z, .StoreResult + ret + +; 92eeb + +.CheckMiddleRow: ; 92eeb + ld hl, wCurrReelStopped + 1 + ld a, [wReel1Stopped + 1] + cp [hl] + call z, .StoreResult + ret + +; 92ef6 + +.CheckDownwardsDiag: ; 92ef6 + ld hl, wCurrReelStopped + 1 + ld a, [wReel1Stopped + 2] + cp [hl] + call z, .StoreResult + ret + +; 92f01 + +.CheckTopRow: ; 92f01 + ld hl, wCurrReelStopped + 2 + ld a, [wReel1Stopped + 2] + cp [hl] + call z, .StoreResult + ret + +; 92f0c + +.StoreResult: ; 92f0c + ld [wSlotBuildingMatch], a + and a + jr nz, .matching_sevens + ld a, 1 + ld [wFirstTwoReelsMatchingSevens], a + +.matching_sevens + ld a, 1 + ld [wFirstTwoReelsMatching], a + ret + +; 92f1d + +Slots_CheckMatchedAllThreeReels: ; 92f1d + ld a, SLOTS_NO_MATCH + ld [wSlotMatched], a + call Slots_GetCurrentReelState + call Slots_CopyReelState + ld a, [wSlotBet] + and 3 + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .return + push de + jp hl + +.return + ld a, [wSlotMatched] + cp SLOTS_NO_MATCH + jr nz, .matched_nontrivial + and a + ret + +.matched_nontrivial + scf + ret + +; 92f48 + +.Jumptable: ; 92f48 + dw .zero + dw .one + dw .two + dw .three +; 92f50 + +.three ; 92f50 + call .CheckUpwardsDiag + call .CheckDownwardsDiag + +.two ; 92f56 + call .CheckBottomRow + call .CheckTopRow + +.one ; 92f5c + call .CheckMiddleRow + +.zero ; 92f5f + ret + +; 92f60 + +.CheckBottomRow: ; 92f60 + ld hl, wCurrReelStopped + ld a, [wReel1Stopped] + cp [hl] + ret nz + ld hl, wReel2Stopped + cp [hl] + call z, .StoreResult + ret + +; 92f70 + +.CheckUpwardsDiag: ; 92f70 + ld hl, wCurrReelStopped + 2 + ld a, [wReel1Stopped] + cp [hl] + ret nz + ld hl, wReel2Stopped + 1 + cp [hl] + call z, .StoreResult + ret + +; 92f80 + +.CheckMiddleRow: ; 92f80 + ld hl, wCurrReelStopped + 1 + ld a, [wReel1Stopped + 1] + cp [hl] + ret nz + ld hl, wReel2Stopped + 1 + cp [hl] + call z, .StoreResult + ret + +; 92f90 + +.CheckDownwardsDiag: ; 92f90 + ld hl, wCurrReelStopped + ld a, [wReel1Stopped + 2] + cp [hl] + ret nz + ld hl, wReel2Stopped + 1 + cp [hl] + call z, .StoreResult + ret + +; 92fa0 + +.CheckTopRow: ; 92fa0 + ld hl, wCurrReelStopped + 2 + ld a, [wReel1Stopped + 2] + cp [hl] + ret nz + ld hl, wReel2Stopped + 2 + cp [hl] + call z, .StoreResult + ret + +; 92fb0 + +.StoreResult: ; 92fb0 + ld [wSlotMatched], a + ret + +; 92fb4 + +Slots_CopyReelState: ; 92fb4 + ld de, wCurrReelStopped + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ret + +; 92fc0 + +Slots_GetNumberOfGolems: ; 92fc0 + ld hl, REEL_POSITION + add hl, bc + ld a, [hl] + push af + push hl + call .Check7Bias + pop hl + pop af + ld [hl], a + ld a, e + ret + +; 92fcf + +.Check7Bias: ; 92fcf + ld a, [wSlotBias] + and a + jr nz, .not_biased_to_seven + ld e, $0 +.loop1 + ld hl, REEL_POSITION + add hl, bc + inc [hl] + inc e + push de + call Slots_CheckMatchedAllThreeReels + pop de + jr nc, .loop1 + and a + jr nz, .loop1 + ret + +.not_biased_to_seven + call Random + and $7 + cp $4 ; ((50 percent) & 7) + 1 + jr c, .not_biased_to_seven + ld e, a +.loop2 + ld a, e + inc e + ld hl, REEL_POSITION + add hl, bc + add [hl] + ld [hl], a + push de + call Slots_CheckMatchedAllThreeReels + pop de + jr c, .loop2 + ret + +; 93002 + +Slots_InitBias: ; 93002 (24:7002) + ld a, [wSlotBias] + and a + ret z + ld hl, .Normal + ld a, [wScriptVar] + and a + jr z, .okay + ld hl, .Lucky +.okay + call Random + ld c, a +.loop + ld a, [hli] + cp c + jr nc, .done + inc hl + jr .loop + +.done + ld a, [hl] + ld [wSlotBias], a + ret + +; 93023 (24:7023) + +.Normal: ; 93023 + db $01, SLOTS_SEVEN ; 1/256 + db $03, SLOTS_POKEBALL ; 1/128 + db $0a, SLOTS_STARYU ; 7/256 + db $14, SLOTS_SQUIRTLE ; 5/128 + db $28, SLOTS_PIKACHU ; 5/64 + db $30, SLOTS_CHERRY ; 1/32 + db $ff, SLOTS_NO_BIAS ; everything else +; 93031 + +.Lucky: ; 93031 + db $02, SLOTS_SEVEN ; 1/128 + db $03, SLOTS_POKEBALL ; 1/256 + db $08, SLOTS_STARYU ; 5/256 + db $10, SLOTS_SQUIRTLE ; 1/32 + db $1e, SLOTS_PIKACHU ; 7/128 + db $50, SLOTS_CHERRY ; 25/128 + db $ff, SLOTS_NO_BIAS ; everything else +; 9303f + +Slots_IlluminateBetLights: ; 9303f (24:703f) + ld b, $14 ; turned on + ld a, [wSlotBet] + dec a + jr z, Slots_Lights1OnOff + dec a + jr z, Slots_Lights2OnOff + jr Slots_Lights3OnOff + +Slots_DeilluminateBetLights: ; 9304c (24:704c) + ld b, $23 ; turned off +Slots_Lights3OnOff: ; 9304e (24:704e) + hlcoord 3, 2 + call Slots_TurnLightsOnOrOff + hlcoord 3, 10 + call Slots_TurnLightsOnOrOff +Slots_Lights2OnOff: ; 9305a (24:705a) + hlcoord 3, 4 + call Slots_TurnLightsOnOrOff + hlcoord 3, 8 + call Slots_TurnLightsOnOrOff +Slots_Lights1OnOff: ; 93066 (24:7066) + hlcoord 3, 6 + +Slots_TurnLightsOnOrOff: ; 93069 (24:7069) + ld a, b + ld [hl], a + ld de, SCREEN_WIDTH / 2 + 3 + add hl, de + ld [hl], a + ld de, SCREEN_WIDTH / 2 - 3 + add hl, de + inc a + ld [hl], a + ld de, SCREEN_WIDTH / 2 + 3 + add hl, de + ld [hl], a + ret + +Slots_AskBet: ; 9307c (24:707c) +.loop + ld hl, .Text_BetHowManyCoins + call PrintText + ld hl, .MenuHeader + call LoadMenuHeader + call VerticalMenu + call CloseWindow + ret c + ld a, [wMenuCursorY] + ld b, a + ld a, 4 + sub b + ld [wSlotBet], a + ld hl, wCoins + ld c, a + ld a, [hli] + and a + jr nz, .Start + ld a, [hl] + cp c + jr nc, .Start + ld hl, .Text_NotEnoughCoins + call PrintText + jr .loop + +.Start: + ld hl, wCoins + 1 + ld a, [hl] + sub c + ld [hld], a + jr nc, .ok + dec [hl] +.ok + call WaitSFX + ld de, SFX_PAY_DAY + call PlaySFX + ld hl, .Text_Start + call PrintText + and a + ret + +; 930c7 (24:70c7) + +.Text_BetHowManyCoins: ; 0x930c7 + ; Bet how many coins? + text_jump UnknownText_0x1c5049 + db "@" +; 0x930cc + +.Text_Start: ; 0x930cc + ; Start! + text_jump UnknownText_0x1c505e + db "@" +; 0x930d1 + +.Text_NotEnoughCoins: ; 0x930d1 + ; Not enough coins. + text_jump UnknownText_0x1c5066 + db "@" +; 0x930d6 + +.MenuHeader: ; 0x930d6 + db MENU_BACKUP_TILES ; flags + menu_coords 14, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option +; 0x930de + +.MenuData: ; 0x930de + db STATICMENU_CURSOR ; flags + db 3 ; items + db " 3@" + db " 2@" + db " 1@" +; 0x930e9 + +Slots_AskPlayAgain: ; 930e9 (24:70e9) + ld hl, wCoins + ld a, [hli] + or [hl] + jr nz, .you_have_coins + ld hl, .Text_OutOfCoins + call PrintText + ld c, 60 + call DelayFrames + jr .exit_slots + +.you_have_coins + ld hl, .Text_PlayAgain + call PrintText + call LoadMenuTextBox + lb bc, 14, 12 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call CloseWindow + and a + jr nz, .exit_slots + and a + ret + +.exit_slots + scf + ret + +; 9311a (24:711a) + +.Text_OutOfCoins: ; 9311a + text_jump UnknownText_0x1c5079 + db "@" + +.Text_PlayAgain: ; 9311f + text_jump UnknownText_0x1c5092 + db "@" + +Slots_GetPayout: ; 93124 (24:7124) + ld a, [wSlotMatched] + cp SLOTS_NO_MATCH + jr z, .no_win + srl a + ld e, a + ld d, 0 + ld hl, .PayoutTable + add hl, de + ld a, [hli] + ld [wPayout + 1], a + ld e, a + ld a, [hl] + ld [wPayout], a + ld d, a + farcall StubbedTrainerRankings_AddToSlotsPayouts + ret + +.PayoutTable: + dw 300 + dw 50 + dw 6 + dw 8 + dw 10 + dw 15 + +.no_win + ld hl, wPayout + xor a + ld [hli], a + ld [hl], a + ret + +Slots_PayoutText: ; 93158 (24:7158) + ld a, [wSlotMatched] + cp SLOTS_NO_MATCH + jr nz, .MatchedSomething + ld hl, .Text_Darn + call PrintText + farcall StubbedTrainerRankings_EndSlotsWinStreak + ret + +.MatchedSomething: + srl a + ld e, a + ld d, 0 + ld hl, .PayoutStrings + add hl, de + add hl, de + add hl, de + ld de, wStringBuffer2 + ld bc, 4 + call CopyBytes + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .return + push de + jp hl + +.return + ld hl, .Text_PrintPayout + call PrintText + farcall StubbedTrainerRankings_AddToSlotsWinStreak + ret + +; 93195 (24:7195) + +.PayoutStrings: ; 93195 + dbw "300@", .LinedUpSevens + dbw "50@@", .LinedUpPokeballs + dbw "6@@@", .LinedUpMonOrCherry + dbw "8@@@", .LinedUpMonOrCherry + dbw "10@@", .LinedUpMonOrCherry + dbw "15@@", .LinedUpMonOrCherry +; 931b9 + +.Text_PrintPayout: ; 0x931b9 + start_asm + ld a, [wSlotMatched] + add $25 + ldcoord_a 2, 13 + inc a + ldcoord_a 2, 14 + inc a + ldcoord_a 3, 13 + inc a + ldcoord_a 3, 14 + hlcoord 18, 17 + ld [hl], "▼" + ld hl, .Text_LinedUpWonCoins +rept 4 + inc bc +endr + ret + +; 931db + +.Text_LinedUpWonCoins: ; 0x931db + ; lined up! Won @ coins! + text_jump UnknownText_0x1c509f + db "@" +; 0x931e0 + +.Text_Darn: ; 0x931e0 + ; Darn! + text_jump UnknownText_0x1c50bb + db "@" +; 0x931e5 + +.LinedUpSevens: ; 931e5 + ld a, SFX_2ND_PLACE + call Slots_PlaySFX + call WaitSFX + +; Oddly, the rarest mode (wKeepSevenBiasChance = 1) is the one with +; the worse odds to favor seven symbol streaks (12.5% vs 25%). +; it's possible that either the wKeepSevenBiasChance initialization +; or this code was intended to lead to flipped percentages. + ld a, [wKeepSevenBiasChance] + and a + jr nz, .lower_seven_streak_odds + call Random + and %0010100 + ret z ; 25% chance to stick with seven symbol bias + ld a, SLOTS_NO_BIAS + ld [wSlotBias], a + ret + +.lower_seven_streak_odds + call Random + and %0011100 + ret z ; 12.5% chance to stick with seven symbol bias + ld a, SLOTS_NO_BIAS + ld [wSlotBias], a + ret + +; 9320b + +.LinedUpPokeballs: ; 9320b + ld a, SFX_3RD_PLACE + call Slots_PlaySFX + call WaitSFX + ret + +; 93214 + +.LinedUpMonOrCherry: ; 93214 + ld a, SFX_PRESENT + call Slots_PlaySFX + call WaitSFX + ret + +; 9321d + +Slots_AnimateGolem: ; 9321d (24:721d) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: ; 9322d (24:722d) + dw .init + dw .fall + dw .roll + +.init ; 93233 (24:7233) + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hl] + and a + jr nz, .retain + ld a, 2 + ld [wSlotsDelay], a + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +.retain + dec [hl] + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], $0 + +.fall ; 93259 (24:7259) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $20 + jr c, .play_sound + dec [hl] + ld e, a + ld d, 14 * 8 + farcall BattleAnim_Sine_e + ld a, e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.play_sound + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $2 + ld a, 1 + ld [wSlotsDelay], a + ld a, SFX_PLACE_PUZZLE_PIECE_DOWN + call Slots_PlaySFX + ret + +.roll ; 93289 (24:7289) + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + cp 9 * 8 + jr nc, .restart + and $3 + ret nz + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + xor $ff + inc a + ld [hl], a + ld [hSCY], a + ret + +.restart + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + xor a + ld [hl], a + ld [hSCY], a + ret + +Slots_AnimateChansey: ; 932ac (24:72ac) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: ; 932bc (24:72bc) + dw .walk + dw .one + dw .two + +.walk ; 932c2 (24:72c2) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + inc [hl] + cp 13 * 8 + jr z, .limit + and $f + ret nz + ld de, SFX_JUMP_OVER_LEDGE + call PlaySFX + ret + +.limit + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld a, 1 + ld [wSlotsDelay], a + +.one ; 932e0 (24:72e0) + ld a, [wSlotsDelay] + cp $2 + jr z, .retain + cp $5 + ret nz + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +.retain + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $8 +.two ; 932fc (24:72fc) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .spawn_egg + dec [hl] + ret + +.spawn_egg + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + dec [hl] + push bc + depixel 12, 13, 0, 4 + ld a, SPRITE_ANIM_INDEX_SLOTS_EGG + call _InitSpriteAnimStruct + pop bc + ret + +; 93316 (24:7316) + +Slots_WaitSFX: ; 93316 + push bc + ld c, 16 + call DelayFrames + pop bc + ret + +; 9331e + +Slots_PlaySFX: ; 9331e (24:731e) + push de + ld e, a + ld d, 0 + call PlaySFX + pop de + ret + +; 93327 (24:7327) + +; The first three positions are repeated to +; avoid needing to check indices when copying. +Reel1Tilemap: ; 93327 + db SLOTS_SEVEN ; 0 + db SLOTS_CHERRY ; 1 + db SLOTS_STARYU ; 2 + db SLOTS_PIKACHU ; 3 + db SLOTS_SQUIRTLE ; 4 + db SLOTS_SEVEN ; 5 + db SLOTS_CHERRY ; 6 + db SLOTS_STARYU ; 7 + db SLOTS_PIKACHU ; 8 + db SLOTS_SQUIRTLE ; 9 + db SLOTS_POKEBALL ; 10 + db SLOTS_CHERRY ; 11 + db SLOTS_STARYU ; 12 + db SLOTS_PIKACHU ; 13 + db SLOTS_SQUIRTLE ; 14 + db SLOTS_SEVEN ; 0 + db SLOTS_CHERRY ; 1 + db SLOTS_STARYU ; 2 + +Reel2Tilemap: ; 93339 + db SLOTS_SEVEN ; 0 + db SLOTS_PIKACHU ; 1 + db SLOTS_CHERRY ; 2 + db SLOTS_SQUIRTLE ; 3 + db SLOTS_STARYU ; 4 + db SLOTS_POKEBALL ; 5 + db SLOTS_PIKACHU ; 6 + db SLOTS_CHERRY ; 7 + db SLOTS_SQUIRTLE ; 8 + db SLOTS_STARYU ; 9 + db SLOTS_POKEBALL ; 10 + db SLOTS_PIKACHU ; 11 + db SLOTS_CHERRY ; 12 + db SLOTS_SQUIRTLE ; 13 + db SLOTS_STARYU ; 14 + db SLOTS_SEVEN ; 0 + db SLOTS_PIKACHU ; 1 + db SLOTS_CHERRY ; 2 + +Reel3Tilemap: ; 9334b + db SLOTS_SEVEN ; 0 + db SLOTS_PIKACHU ; 1 + db SLOTS_CHERRY ; 2 + db SLOTS_SQUIRTLE ; 3 + db SLOTS_STARYU ; 4 + db SLOTS_PIKACHU ; 5 + db SLOTS_CHERRY ; 6 + db SLOTS_SQUIRTLE ; 7 + db SLOTS_STARYU ; 8 + db SLOTS_PIKACHU ; 9 + db SLOTS_POKEBALL ; 10 + db SLOTS_CHERRY ; 11 + db SLOTS_SQUIRTLE ; 12 + db SLOTS_STARYU ; 13 + db SLOTS_PIKACHU ; 14 + db SLOTS_SEVEN ; 0 + db SLOTS_PIKACHU ; 1 + db SLOTS_CHERRY ; 2 +; 9335d + +SlotsTilemap: ; 9335d +INCBIN "gfx/slots/slots.tilemap" +; 9344d + +Slots1LZ: ; 9344d +INCBIN "gfx/slots/slots_1.2bpp.lz" +; 935cd + +Slots2LZ: ; 935cd +INCBIN "gfx/slots/slots_2.2bpp.lz" +; 9382d + +Slots3LZ: ; 9382d +INCBIN "gfx/slots/slots_3.2bpp.lz" +; 93a3d diff --git a/engine/game/unown_puzzle.asm b/engine/game/unown_puzzle.asm new file mode 100755 index 000000000..83527ea69 --- /dev/null +++ b/engine/game/unown_puzzle.asm @@ -0,0 +1,877 @@ +PUZZLE_BORDER EQU $ee +PUZZLE_VOID EQU $ef + +puzcoord EQUS "* 6 +" + +_UnownPuzzle: ; e1190 + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + call ClearBGPalettes + call ClearTileMap + call ClearSprites + xor a + ld [hBGMapMode], a + call DisableLCD + ld hl, wMisc ; includes wPuzzlePieces + ld bc, wMiscEnd - wMisc + xor a + call ByteFill + ld hl, UnownPuzzleCursorGFX + ld de, vTiles1 tile $60 + ld bc, 4 tiles + call CopyBytes + ld hl, UnownPuzzleStartCancelLZ + ld de, vTiles1 tile $6d + call Decompress + call LoadUnownPuzzlePiecesGFX + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, PUZZLE_BORDER + call ByteFill + hlcoord 4, 3 + lb bc, 12, 12 + ld a, PUZZLE_VOID + call UnownPuzzle_FillBox + call InitUnownPuzzlePiecePositions + call UnownPuzzle_UpdateTilemap + call PlaceStartCancelBox + xor a + ld [hSCY], a + ld [hSCX], a + ld [rWY], a + ld [wJumptableIndex], a + ld [wHoldingUnownPuzzlePiece], a + ld [wUnownPuzzleCursorPosition], a + ld [wUnownPuzzleHeldPiece], a + ld a, %10010011 + ld [rLCDC], a + call WaitBGMap + ld b, SCGB_UNOWN_PUZZLE + call GetSGBLayout + ld a, $e4 + call DmgToCgbBGPals + ld a, $24 + call DmgToCgbObjPal0 + xor a + ld [wSolvedUnownPuzzle], a + call DelayFrame +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .quit + call UnownPuzzleJumptable + ld a, [wHoldingUnownPuzzlePiece] + and a + jr nz, .holding_piece + ld a, [hVBlankCounter] + and $10 + jr z, .clear +.holding_piece + call RedrawUnownPuzzlePieces + jr .next + +.clear + call ClearSprites +.next + call DelayFrame + jr .loop + +.quit + pop af + ld [hInMenu], a + call ClearBGPalettes + call ClearTileMap + call ClearSprites + ld a, LCDC_DEFAULT + ld [rLCDC], a + ret +; e124e + +InitUnownPuzzlePiecePositions: ; e124e + ld c, 1 + ld b, 16 +.load_loop + call Random + and $f + ld hl, .PuzzlePieceInitialPositions + ld e, a + ld d, $0 + add hl, de + ld e, [hl] + ld hl, wPuzzlePieces + add hl, de + ld a, [hl] + and a + jr nz, .load_loop + ld [hl], c + inc c + dec b + jr nz, .load_loop + ret +; e126d + +.PuzzlePieceInitialPositions: ; e126d +initpuzcoord: MACRO +rept _NARG / 2 + db \1 puzcoord \2 + shift + shift +endr +ENDM + initpuzcoord 0,0, 0,1, 0,2, 0,3, 0,4, 0,5 + initpuzcoord 1,0, 1,5 + initpuzcoord 2,0, 2,5 + initpuzcoord 3,0, 3,5 + initpuzcoord 4,0, 4,5 + initpuzcoord 5,0, 5,5 + ; START > CANCEL +; e127d + +PlaceStartCancelBox: ; e127d + call PlaceStartCancelBoxBorder + hlcoord 5, 16 + ld a, $f6 + ld c, 10 +.loop + ld [hli], a + inc a + dec c + jr nz, .loop + ret +; e128d + +PlaceStartCancelBoxBorder: ; e128d + hlcoord 4, 15 + ld a, $f0 + ld [hli], a + ld bc, 10 + ld a, $f1 + call ByteFill + hlcoord 15, 15 + ld a, $f2 + ld [hli], a + hlcoord 4, 16 + ld a, $f3 + ld [hli], a + ld bc, 10 + ld a, PUZZLE_VOID + call ByteFill + hlcoord 15, 16 + ld a, $f3 + ld [hli], a + hlcoord 4, 17 + ld a, $f4 + ld [hli], a + ld bc, 10 + ld a, $f1 + call ByteFill + hlcoord 15, 17 + ld a, $f5 + ld [hl], a + ret +; e12ca + +UnownPuzzleJumptable: ; e12ca + 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 +; e12d9 + +.Jumptable: ; e12d9 + dw .Function +; e12db + +.Function: ; e12db + ld a, [hJoyPressed] + and START + jp nz, UnownPuzzle_Quit + ld a, [hJoyPressed] + and A_BUTTON + jp nz, UnownPuzzle_A + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .d_up + ld a, [hl] + and D_DOWN + jr nz, .d_down + ld a, [hl] + and D_LEFT + jr nz, .d_left + ld a, [hl] + and D_RIGHT + jr nz, .d_right + ret + +.d_up + ld hl, wUnownPuzzleCursorPosition + ld a, [hl] + cp 1 puzcoord 0 + ret c + sub 6 + ld [hl], a + jr .done_joypad + +.d_down + ld hl, wUnownPuzzleCursorPosition + ld a, [hl] + cp 4 puzcoord 1 + ret z + cp 4 puzcoord 2 + ret z + cp 4 puzcoord 3 + ret z + cp 4 puzcoord 4 + ret z + cp 5 puzcoord 0 + ret nc + add 6 + ld [hl], a + jr .done_joypad + +.d_left + ld hl, wUnownPuzzleCursorPosition + ld a, [hl] + and a + ret z + cp 1 puzcoord 0 + ret z + cp 2 puzcoord 0 + ret z + cp 3 puzcoord 0 + ret z + cp 4 puzcoord 0 + ret z + cp 5 puzcoord 0 + ret z + cp 5 puzcoord 5 + jr z, .left_overflow + dec [hl] + jr .done_joypad + +.left_overflow + ld [hl], 5 puzcoord 0 + jr .done_joypad + +.d_right + ld hl, wUnownPuzzleCursorPosition + ld a, [hl] + cp 0 puzcoord 5 + ret z + cp 1 puzcoord 5 + ret z + cp 2 puzcoord 5 + ret z + cp 3 puzcoord 5 + ret z + cp 4 puzcoord 5 + ret z + cp 5 puzcoord 5 + ret z + cp 5 puzcoord 0 + jr z, .right_overflow + inc [hl] + jr .done_joypad + +.right_overflow + ld [hl], 5 puzcoord 5 + +.done_joypad + ld a, [wHoldingUnownPuzzlePiece] + and a + jr nz, .holding_piece + ld de, SFX_POUND + jr .play_sfx + +.holding_piece + ld de, SFX_MOVE_PUZZLE_PIECE + +.play_sfx + call PlaySFX + ret +; e1376 + +UnownPuzzle_A: ; e1376 + ld a, [wHoldingUnownPuzzlePiece] + and a + jr nz, .TryPlacePiece + call UnownPuzzle_CheckCurrentTileOccupancy + and a + jr z, UnownPuzzle_InvalidAction + ld de, SFX_MEGA_KICK + call PlaySFX + ld [hl], 0 + ld [wUnownPuzzleHeldPiece], a + call RedrawUnownPuzzlePieces + call FillUnoccupiedPuzzleSpace + call WaitBGMap + call WaitSFX + ld a, TRUE + ld [wHoldingUnownPuzzlePiece], a + ret + +.TryPlacePiece: + call UnownPuzzle_CheckCurrentTileOccupancy + and a + jr nz, UnownPuzzle_InvalidAction + ld de, SFX_PLACE_PUZZLE_PIECE_DOWN + call PlaySFX + ld a, [wUnownPuzzleHeldPiece] + ld [hl], a + call PlaceUnownPuzzlePieceGFX + call WaitBGMap + xor a + ld [wUnownPuzzleHeldPiece], a + call RedrawUnownPuzzlePieces + xor a + ld [wHoldingUnownPuzzlePiece], a + call WaitSFX + call CheckSolvedUnownPuzzle + ret nc + +; You solved the puzzle! + call PlaceStartCancelBoxBorder + call ClearSprites + ld de, SFX_1ST_PLACE + call PlaySFX + call WaitSFX + call SimpleWaitPressAorB + ld a, TRUE + ld [wSolvedUnownPuzzle], a +UnownPuzzle_Quit: ; e13de + ld hl, wJumptableIndex + set 7, [hl] + ret + +UnownPuzzle_InvalidAction: ; e13e4 + ld de, SFX_WRONG + call PlaySFX + call WaitSFX + ret +; e13ee + +UnownPuzzle_FillBox: ; e13ee + ld de, SCREEN_WIDTH +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + add hl, de + pop bc + dec b + jr nz, .row + ret +; e13fe + +UnownPuzzle_UpdateTilemap: ; e13fe + xor a + ld [wUnownPuzzleCursorPosition], a + ld c, 6 * 6 +.loop + push bc + call UnownPuzzle_CheckCurrentTileOccupancy + ld [wUnownPuzzleHeldPiece], a + and a + jr z, .not_holding_piece + call PlaceUnownPuzzlePieceGFX + jr .next + +.not_holding_piece + call FillUnoccupiedPuzzleSpace + +.next + ld hl, wUnownPuzzleCursorPosition + inc [hl] + pop bc + dec c + jr nz, .loop + ret +; e141f + +PlaceUnownPuzzlePieceGFX: ; e141f + ld a, $2 ; tilemap coords + call GetUnownPuzzleCoordData + ld a, [hli] + ld h, [hl] + ld l, a + push hl + call GetCurrentPuzzlePieceVTileCorner + pop hl + ld de, SCREEN_WIDTH + ld b, 3 +.row + ld c, 3 + push hl +.col + ld [hli], a + inc a + dec c + jr nz, .col + add 9 + pop hl + add hl, de + dec b + jr nz, .row + ret +; e1441 + +FillUnoccupiedPuzzleSpace: ; e1441 + ld a, 2 ; tilemap coords + call GetUnownPuzzleCoordData + ld a, [hli] + ld h, [hl] + ld l, a + push hl + ld a, 4 ; tile + call GetUnownPuzzleCoordData + ld a, [hl] + pop hl + ld de, SCREEN_WIDTH + ld b, 3 +.row + ld c, 3 + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + add hl, de + dec b + jr nz, .row + ret +; e1463 + +GetUnownPuzzleCoordData: ; e1463 + ld e, a + ld d, 0 + ld hl, UnownPuzzleCoordData + add hl, de + ld a, [wUnownPuzzleCursorPosition] + ld e, a +rept 6 + add hl, de +endr + ret +; e1475 + +UnownPuzzle_CheckCurrentTileOccupancy: ; e1475 + ld hl, wPuzzlePieces + ld a, [wUnownPuzzleCursorPosition] + ld e, a + ld d, $0 + add hl, de + ld a, [hl] + ret +; e1481 + +GetCurrentPuzzlePieceVTileCorner: ; e1481 + ld a, [wUnownPuzzleHeldPiece] + ld hl, .Corners + add l + ld l, a + ld a, $0 + adc h + ld h, a + ld a, [hl] + ret +; e148f + +.Corners: ; e148f +; 00, 01, 02 +; 0c, 0d, 0e +; 18, 19, 1a + db $e0 ; no piece selected + db $00, $03, $06, $09 + db $24, $27, $2a, $2d + db $48, $4b, $4e, $51 + db $6c, $6f, $72, $75 +; e14a0 + +CheckSolvedUnownPuzzle: ; e14a0 + ld hl, .SolvedPuzzleConfiguration + ld de, wPuzzlePieces + ld c, 6 * 6 +.loop + ld a, [de] + cp [hl] + jr nz, .not_solved + inc de + inc hl + dec c + jr nz, .loop + scf + ret + +.not_solved + and a + ret +; e14b5 + +.SolvedPuzzleConfiguration: ; e14b5 + db $00, $00, $00, $00, $00, $00 + db $00, $01, $02, $03, $04, $00 + db $00, $05, $06, $07, $08, $00 + db $00, $09, $0a, $0b, $0c, $00 + db $00, $0d, $0e, $0f, $10, $00 + db $00, $00, $00, $00, $00, $00 +; e14d9 + +RedrawUnownPuzzlePieces: ; e14d9 + call GetCurrentPuzzlePieceVTileCorner + ld [wd002], a + xor a + call GetUnownPuzzleCoordData ; get pixel positions + ld a, [hli] + ld b, [hl] + ld c, a + ld a, [wd002] + cp $e0 + jr z, .NoPiece + ld hl, .OAM_HoldingPiece + jr .load + +.NoPiece: + ld hl, .OAM_NotHoldingPiece + +.load + ld de, wVirtualOAMSprite00 +.loop + ld a, [hli] + cp -1 + ret z + add b + ld [de], a ; y + inc de + ld a, [hli] + add c + ld [de], a ; x + inc de + ld a, [wd002] + add [hl] + ld [de], a ; tile id + inc hl + inc de + ld a, [hli] + ld [de], a ; attributes + inc de + jr .loop +; e150f + +.OAM_HoldingPiece: ; e150f + dsprite -1, -4, -1, -4, $00, 0 + dsprite -1, -4, 0, -4, $01, 0 + dsprite -1, -4, 0, 4, $02, 0 + dsprite 0, -4, -1, -4, $0c, 0 + dsprite 0, -4, 0, -4, $0d, 0 + dsprite 0, -4, 0, 4, $0e, 0 + dsprite 0, 4, -1, -4, $18, 0 + dsprite 0, 4, 0, -4, $19, 0 + dsprite 0, 4, 0, 4, $1a, 0 + db -1 + +.OAM_NotHoldingPiece: ; e1534 + dsprite -1, -4, -1, -4, $00, 0 + dsprite -1, -4, 0, -4, $01, 0 + dsprite -1, -4, 0, 4, $00, 0 | X_FLIP + dsprite 0, -4, -1, -4, $02, 0 + dsprite 0, -4, 0, -4, $03, 0 + dsprite 0, -4, 0, 4, $02, 0 | X_FLIP + dsprite 0, 4, -1, -4, $00, 0 | Y_FLIP + dsprite 0, 4, 0, -4, $01, 0 | Y_FLIP + dsprite 0, 4, 0, 4, $00, 0 | X_FLIP | Y_FLIP + db -1 + +UnownPuzzleCoordData: ; e1559 + +puzzle_coords: MACRO + dbpixel \1, \2, \3, \4 + dwcoord \5, \6 + db \7, \8 +ENDM +; OAM coords, tilemap coords, vacant tile, filler + puzzle_coords 3, 3, 4, 4, 1, 0, PUZZLE_BORDER, 0 + puzzle_coords 6, 3, 4, 4, 4, 0, PUZZLE_BORDER, 0 + puzzle_coords 9, 3, 4, 4, 7, 0, PUZZLE_BORDER, 0 + puzzle_coords 12, 3, 4, 4, 10, 0, PUZZLE_BORDER, 0 + puzzle_coords 15, 3, 4, 4, 13, 0, PUZZLE_BORDER, 0 + puzzle_coords 18, 3, 4, 4, 16, 0, PUZZLE_BORDER, 0 + + puzzle_coords 3, 6, 4, 4, 1, 3, PUZZLE_BORDER, 0 + puzzle_coords 6, 6, 4, 4, 4, 3, PUZZLE_VOID, 0 + puzzle_coords 9, 6, 4, 4, 7, 3, PUZZLE_VOID, 0 + puzzle_coords 12, 6, 4, 4, 10, 3, PUZZLE_VOID, 0 + puzzle_coords 15, 6, 4, 4, 13, 3, PUZZLE_VOID, 0 + puzzle_coords 18, 6, 4, 4, 16, 3, PUZZLE_BORDER, 0 + + puzzle_coords 3, 9, 4, 4, 1, 6, PUZZLE_BORDER, 0 + puzzle_coords 6, 9, 4, 4, 4, 6, PUZZLE_VOID, 0 + puzzle_coords 9, 9, 4, 4, 7, 6, PUZZLE_VOID, 0 + puzzle_coords 12, 9, 4, 4, 10, 6, PUZZLE_VOID, 0 + puzzle_coords 15, 9, 4, 4, 13, 6, PUZZLE_VOID, 0 + puzzle_coords 18, 9, 4, 4, 16, 6, PUZZLE_BORDER, 0 + + puzzle_coords 3, 12, 4, 4, 1, 9, PUZZLE_BORDER, 0 + puzzle_coords 6, 12, 4, 4, 4, 9, PUZZLE_VOID, 0 + puzzle_coords 9, 12, 4, 4, 7, 9, PUZZLE_VOID, 0 + puzzle_coords 12, 12, 4, 4, 10, 9, PUZZLE_VOID, 0 + puzzle_coords 15, 12, 4, 4, 13, 9, PUZZLE_VOID, 0 + puzzle_coords 18, 12, 4, 4, 16, 9, PUZZLE_BORDER, 0 + + puzzle_coords 3, 15, 4, 4, 1, 12, PUZZLE_BORDER, 0 + puzzle_coords 6, 15, 4, 4, 4, 12, PUZZLE_VOID, 0 + puzzle_coords 9, 15, 4, 4, 7, 12, PUZZLE_VOID, 0 + puzzle_coords 12, 15, 4, 4, 10, 12, PUZZLE_VOID, 0 + puzzle_coords 15, 15, 4, 4, 13, 12, PUZZLE_VOID, 0 + puzzle_coords 18, 15, 4, 4, 16, 12, PUZZLE_BORDER, 0 + + puzzle_coords 3, 18, 4, 4, 1, 15, PUZZLE_BORDER, 0 + puzzle_coords 6, 18, 4, 4, 4, 15, PUZZLE_BORDER, 0 + puzzle_coords 9, 18, 4, 4, 7, 15, PUZZLE_BORDER, 0 + puzzle_coords 12, 18, 4, 4, 10, 15, PUZZLE_BORDER, 0 + puzzle_coords 15, 18, 4, 4, 13, 15, PUZZLE_BORDER, 0 + puzzle_coords 18, 18, 4, 4, 16, 15, PUZZLE_BORDER, 0 + +ConvertLoadedPuzzlePieces: ; e1631 + ld hl, vTiles2 + ld de, vTiles0 + ld b, 6 +.loop + push bc + push hl + push hl + call .EnlargePuzzlePieceTiles + pop hl + ld bc, 1 tiles / 2 + add hl, bc + call .EnlargePuzzlePieceTiles + pop hl + ld bc, 6 tiles + add hl, bc + pop bc + dec b + jr nz, .loop + call UnownPuzzle_AddPuzzlePieceBorders + ret +; e1654 + +.EnlargePuzzlePieceTiles: ; e1654 +; double size + ld c, 6 +.loop1 + push bc + push hl + push hl + ld c, 4 +.loop2 + push bc + ld a, [hli] + and $f0 + swap a + call .GetEnlargedTile + ld c, a + ld a, [hli] + and $f0 + swap a + call .GetEnlargedTile + ld b, a + ld a, c + ld [de], a + inc de + ld a, b + ld [de], a + inc de + ld a, c + ld [de], a + inc de + ld a, b + ld [de], a + inc de + pop bc + dec c + jr nz, .loop2 + pop hl + ld c, 4 +.loop3 + push bc + ld a, [hli] + and $f + call .GetEnlargedTile + ld c, a + ld a, [hli] + and $f + call .GetEnlargedTile + ld b, a + ld a, c + ld [de], a + inc de + ld a, b + ld [de], a + inc de + ld a, c + ld [de], a + inc de + ld a, b + ld [de], a + inc de + pop bc + dec c + jr nz, .loop3 + pop hl + ld bc, 1 tiles + add hl, bc + pop bc + dec c + jr nz, .loop1 + ret +; e16aa + +.GetEnlargedTile: ; e16aa + push hl + ld hl, .EnlargedTiles + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, [hl] + pop hl + ret +; e16b7 + +.EnlargedTiles: ; e16b7 + +x = 0 +rept 16 + db ((x & %1000) * %11000) + ((x & %0100) * %1100) + ((x & %0010) * %110) + ((x & %0001) * %11) +x = x + 1 +endr +; e16c7 + +UnownPuzzle_AddPuzzlePieceBorders: ; e16c7 + ld hl, PuzzlePieceBorderData + ld a, 8 +.loop + push af + push hl + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld h, [hl] + ld l, a + call .LoadGFX + pop hl +rept 4 + inc hl +endr + pop af + dec a + jr nz, .loop + ret +; e16e2 + +.LoadGFX: ; e16e2 + lb bc, 4, 4 +.loop1 + push bc + +.loop2 + push de + push hl + + ld b, 1 tiles +.loop3 + ld a, [de] + or [hl] + ld [hli], a + inc de + dec b + jr nz, .loop3 + + pop hl + ld de, 3 tiles + add hl, de + pop de + dec c + jr nz, .loop2 + + ld bc, 24 tiles + add hl, bc + pop bc + dec b + jr nz, .loop1 + ret +; e1703 + +PuzzlePieceBorderData: ; e1703 + dw .TileBordersGFX + 0 tiles, vTiles0 tile $00 + dw .TileBordersGFX + 1 tiles, vTiles0 tile $01 + dw .TileBordersGFX + 2 tiles, vTiles0 tile $02 + dw .TileBordersGFX + 3 tiles, vTiles0 tile $0c + dw .TileBordersGFX + 4 tiles, vTiles0 tile $0e + dw .TileBordersGFX + 5 tiles, vTiles0 tile $18 + dw .TileBordersGFX + 6 tiles, vTiles0 tile $19 + dw .TileBordersGFX + 7 tiles, vTiles0 tile $1a +; e1723 + +.TileBordersGFX: ; e1723 +INCBIN "gfx/unown_puzzle/tile_borders.2bpp" + +LoadUnownPuzzlePiecesGFX: ; e17a3 + ld a, [wScriptVar] + maskbits NUM_UNOWN_PUZZLES + ld e, a + ld d, 0 + ld hl, .LZPointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, vTiles2 + call Decompress + call ConvertLoadedPuzzlePieces + ret +; e17bd + +.LZPointers: ; e17bd +; entries correspond to UNOWNPUZZLE_* constants + dw KabutoPuzzleLZ + dw OmanytePuzzleLZ + dw AerodactylPuzzleLZ + dw HoOhPuzzleLZ +; e17c5 + +UnownPuzzleCursorGFX: ; e17c5 +INCBIN "gfx/unown_puzzle/cursor.2bpp" + +UnownPuzzleStartCancelLZ: ; e1805 +INCBIN "gfx/unown_puzzle/start_cancel.2bpp.lz" + +HoOhPuzzleLZ: ; e18ab +INCBIN "gfx/unown_puzzle/hooh.2bpp.lz" + +AerodactylPuzzleLZ: ; e19fb +INCBIN "gfx/unown_puzzle/aerodactyl.2bpp.lz" + +KabutoPuzzleLZ: ; e1bab +INCBIN "gfx/unown_puzzle/kabuto.2bpp.lz" + +OmanytePuzzleLZ: ; e1c9b +INCBIN "gfx/unown_puzzle/omanyte.2bpp.lz" diff --git a/engine/gbc_only.asm b/engine/gbc_only.asm deleted file mode 100644 index badd953aa..000000000 --- a/engine/gbc_only.asm +++ /dev/null @@ -1,149 +0,0 @@ -GBCOnlyScreen: ; 4ea82 - - ld a, [hCGB] - and a - ret nz - - ld de, MUSIC_NONE - call PlayMusic - - call ClearTileMap - - ld hl, GBCOnlyGFX - ld de, wGBCOnlyDecompressBuffer - ld a, [rSVBK] - push af - ld a, 0 ; this has the same effect as selecting bank 1 - ld [rSVBK], a - call Decompress - pop af - ld [rSVBK], a - - ld de, wGBCOnlyDecompressBuffer - ld hl, vTiles2 - lb bc, BANK(GBCOnlyGFX), 84 - call Get2bpp - - ld de, Font - ld hl, vTiles1 - lb bc, BANK(Font), $80 - call Get1bpp - - call DrawGBCOnlyScreen - - call WaitBGMap - -; better luck next time -.loop - call DelayFrame - jr .loop -; 4eac5 - - -DrawGBCOnlyScreen: ; 4eac5 - - call DrawGBCOnlyBorder - - ; Pokemon - hlcoord 3, 2 - ld b, 14 - ld c, 4 - ld a, $8 - call DrawGBCOnlyGraphic - - ; Crystal - hlcoord 5, 6 - ld b, 10 - ld c, 2 - ld a, $40 - call DrawGBCOnlyGraphic - - ld de, GBCOnlyString - hlcoord 1, 10 - call PlaceString - - ret -; 4eaea - - -DrawGBCOnlyBorder: ; 4eaea - - hlcoord 0, 0 - ld [hl], 0 ; top-left - - inc hl - ld a, 1 ; top - call .FillRow - - ld [hl], 2 ; top-right - - hlcoord 0, 1 - ld a, 3 ; left - call .FillColumn - - hlcoord 19, 1 - ld a, 4 ; right - call .FillColumn - - hlcoord 0, 17 - ld [hl], 5 ; bottom-left - - inc hl - ld a, 6 ; bottom - call .FillRow - - ld [hl], 7 ; bottom-right - ret -; 4eb15 - -.FillRow: ; 4eb15 - ld c, SCREEN_WIDTH - 2 -.next_column - ld [hli], a - dec c - jr nz, .next_column - ret -; 4eb1c - -.FillColumn: ; 4eb1c - ld de, SCREEN_WIDTH - ld c, SCREEN_HEIGHT - 2 -.next_row - ld [hl], a - add hl, de - dec c - jr nz, .next_row - ret -; 4eb27 - - -DrawGBCOnlyGraphic: ; 4eb27 - ld de, SCREEN_WIDTH -.y - push bc - push hl -.x - ld [hli], a - inc a - dec b - jr nz, .x - pop hl - add hl, de - pop bc - dec c - jr nz, .y - ret -; 4eb38 - - -GBCOnlyString: ; 4eb38 - db "This Game Pak is" - next "designed only for" - next "use on the" - next "Game Boy Color.@" -; 4eb76 - - -GBCOnlyGFX: ; 4eb76 -INCBIN "gfx/sgb/gbc_only.2bpp.lz" -; 4f0bc diff --git a/engine/gfx/cgb_layouts.asm b/engine/gfx/cgb_layouts.asm new file mode 100644 index 000000000..b36dceeb6 --- /dev/null +++ b/engine/gfx/cgb_layouts.asm @@ -0,0 +1,1033 @@ +; Replaces the functionality of sgb.asm to work with CGB hardware. + +CheckCGB: ; 8d55 + ld a, [hCGB] + and a + ret +; 8d59 + +LoadSGBLayoutCGB: ; 8d59 + ld a, b + cp SCGB_RAM + jr nz, .not_ram + ld a, [wSGBPredef] +.not_ram + cp SCGB_PARTY_MENU_HP_PALS + jp z, CGB_ApplyPartyMenuHPPals + call ResetBGPals + ld l, a + ld h, 0 + add hl, hl + ld de, .dw + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .ReturnFromJumpTable + push de + jp hl +; 8d79 + +.ReturnFromJumpTable: ; 8d79 + ret +; 8d7a + +.dw ; 8d7a + dw _CGB_BattleGrayscale + dw _CGB_BattleColors + dw _CGB_PokegearPals + dw _CGB_StatsScreenHPPals + dw _CGB_Pokedex + dw _CGB_SlotMachine + dw _CGB06 + dw _CGB_GSIntro + dw _CGB_Diploma + dw _CGB_MapPals + dw _CGB_PartyMenu + dw _CGB_Evolution + dw _CGB_GSTitleScreen + dw _CGB0d + dw _CGB_MoveList + dw _CGB0f + dw _CGB_PokedexSearchOption + dw _CGB11 + dw _CGB_Pokepic + dw _CGB13 + dw _CGB_PackPals + dw _CGB_TrainerCard + dw _CGB_PokedexUnownMode + dw _CGB_BillsPC + dw _CGB_UnownPuzzle + dw _CGB_GamefreakLogo + dw _CGB_PlayerOrMonFrontpicPals + dw _CGB_TradeTube + dw _CGB_TrainerOrMonFrontpicPals + dw _CGB_MysteryGift + dw _CGB1e +; 8db8 + +_CGB_BattleGrayscale: ; 8db8 + ld hl, PalPacket_BattleGrayscale + 1 + ld de, wBGPals1 + ld c, 4 + call CopyPalettes + ld hl, PalPacket_BattleGrayscale + 1 + ld de, wBGPals1 palette PAL_BATTLE_BG_EXP + ld c, 4 + call CopyPalettes + ld hl, PalPacket_BattleGrayscale + 1 + ld de, wOBPals1 + ld c, 2 + call CopyPalettes + jr _CGB_FinishBattleScreenLayout + +_CGB_BattleColors: ; 8ddb + ld de, wBGPals1 + call GetBattlemonBackpicPalettePointer + push hl + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_PLAYER + call GetEnemyFrontpicPalettePointer + push hl + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_ENEMY + ld a, [wEnemyHPPal] + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_ENEMY_HP + ld a, [wPlayerHPPal] + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_PLAYER_HP + ld hl, ExpBarPalette + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_EXP + ld de, wOBPals1 + pop hl + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_OB_ENEMY + pop hl + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_OB_PLAYER + ld a, SCGB_BATTLE_COLORS + ld [wSGBPredef], a + call ApplyPals +_CGB_FinishBattleScreenLayout: ; 8e23 + call InitPartyMenuBGPal7 + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, PAL_BATTLE_BG_ENEMY_HP + call ByteFill + hlcoord 0, 4, wAttrMap + lb bc, 8, 10 + ld a, PAL_BATTLE_BG_PLAYER + call FillBoxCGB + hlcoord 10, 0, wAttrMap + lb bc, 7, 10 + ld a, PAL_BATTLE_BG_ENEMY + call FillBoxCGB + hlcoord 0, 0, wAttrMap + lb bc, 4, 10 + ld a, PAL_BATTLE_BG_ENEMY_HP + call FillBoxCGB + hlcoord 10, 7, wAttrMap + lb bc, 5, 10 + ld a, PAL_BATTLE_BG_PLAYER_HP + call FillBoxCGB + hlcoord 10, 11, wAttrMap + lb bc, 1, 9 + ld a, PAL_BATTLE_BG_EXP + call FillBoxCGB + hlcoord 0, 12, wAttrMap + ld bc, 6 * SCREEN_WIDTH + ld a, PAL_BATTLE_BG_TEXT + call ByteFill + ld hl, BattleObjectPals + ld de, wOBPals1 palette PAL_BATTLE_OB_GRAY + ld bc, 6 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + call ApplyAttrMap + ret +; 8e85 + + +InitPartyMenuBGPal7: ; 8e85 + farcall Function100dc0 +Mobile_InitPartyMenuBGPal7: ; 8e8b + ld hl, PartyMenuBGPalette + jr nc, .not_mobile + ld hl, PartyMenuBGMobilePalette +.not_mobile + ld de, wBGPals1 palette 7 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + ret +; 8e9f + +InitPartyMenuBGPal0: ; 8e9f + farcall Function100dc0 + ld hl, PartyMenuBGPalette + jr nc, .not_mobile + ld hl, PartyMenuBGMobilePalette +.not_mobile + ld de, wBGPals1 palette 0 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + ret +; 8eb9 + +_CGB_PokegearPals: ; 8eb9 + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .male + ld hl, FemalePokegearPals + jr .got_pals + +.male + ld hl, MalePokegearPals +.got_pals + ld de, wBGPals1 + ld bc, 6 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 8edb + +_CGB_StatsScreenHPPals: ; 8edb + ld de, wBGPals1 + ld a, [wCurHPPal] + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + call LoadPalette_White_Col1_Col2_Black ; hp palette + ld a, [wCurPartySpecies] + ld bc, wTempMonDVs + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black ; mon palette + ld hl, ExpBarPalette + call LoadPalette_White_Col1_Col2_Black ; exp palette + ld hl, StatsScreenPagePals + ld de, wBGPals1 palette 3 + ld bc, 3 palettes ; pink, green, and blue page palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + call WipeAttrMap + + hlcoord 0, 0, wAttrMap + lb bc, 8, SCREEN_WIDTH + ld a, $1 ; mon palette + call FillBoxCGB + + hlcoord 10, 16, wAttrMap + ld bc, 10 + ld a, $2 ; exp palette + call ByteFill + + hlcoord 13, 5, wAttrMap + lb bc, 2, 2 + ld a, $3 ; pink page palette + call FillBoxCGB + + hlcoord 15, 5, wAttrMap + lb bc, 2, 2 + ld a, $4 ; green page palette + call FillBoxCGB + + hlcoord 17, 5, wAttrMap + lb bc, 2, 2 + ld a, $5 ; blue page palette + call FillBoxCGB + + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 8f52 + +StatsScreenPagePals: ; 8f52 +INCLUDE "gfx/stats/pages.pal" +; 8f6a + +StatsScreenPals: ; 8f6a +INCLUDE "gfx/stats/stats.pal" +; 8f70 + +_CGB_Pokedex: ; 8f70 + ld de, wBGPals1 + ld a, PREDEFPAL_POKEDEX + call GetPredefPal + call LoadHLPaletteIntoDE ; dex interface palette + ld a, [wCurPartySpecies] + cp $ff + jr nz, .is_pokemon + ld hl, .PokedexQuestionMarkPalette + call LoadHLPaletteIntoDE ; green question mark palette + jr .got_palette + +.is_pokemon + call GetMonPalettePointer_ + call LoadPalette_White_Col1_Col2_Black ; mon palette +.got_palette + call WipeAttrMap + hlcoord 1, 1, wAttrMap + lb bc, 7, 7 + ld a, $1 ; green question mark palette + call FillBoxCGB + call InitPartyMenuOBPals + ld hl, .PokedexCursorPalette + ld de, wOBPals1 palette 7 ; green cursor palette + ld bc, 1 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 8fba + +.PokedexQuestionMarkPalette: ; 8fba +INCLUDE "gfx/pokedex/question_mark.pal" +; 8fc2 + +.PokedexCursorPalette: ; 8fc2 +INCLUDE "gfx/pokedex/cursor.pal" +; 8fca + +_CGB_BillsPC: ; 8fca + ld de, wBGPals1 + ld a, PREDEFPAL_POKEDEX + call GetPredefPal + call LoadHLPaletteIntoDE + ld a, [wCurPartySpecies] + cp $ff + jr nz, .GetMonPalette + ld hl, .BillsPCOrangePalette + call LoadHLPaletteIntoDE + jr .Resume + +.GetMonPalette: + ld bc, wTempMonDVs + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black +.Resume: + call WipeAttrMap + hlcoord 1, 4, wAttrMap + lb bc, 7, 7 + ld a, $1 + call FillBoxCGB + call InitPartyMenuOBPals + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9009 + +.Function9009: ; 9009 + ld hl, .BillsPCOrangePalette + call LoadHLPaletteIntoDE + jr .asm_901a + +.unused + ld bc, wTempMonDVs + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black +.asm_901a + call WipeAttrMap + hlcoord 1, 1, wAttrMap + lb bc, 7, 7 + ld a, $1 + call FillBoxCGB + call InitPartyMenuOBPals + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9036 + +.BillsPCOrangePalette: ; 9036 +INCLUDE "gfx/pc/orange.pal" +; 903e + +_CGB_PokedexUnownMode: ; 903e + ld de, wBGPals1 + ld a, PREDEFPAL_POKEDEX + call GetPredefPal + call LoadHLPaletteIntoDE + ld a, [wCurPartySpecies] + call GetMonPalettePointer_ + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + hlcoord 7, 5, wAttrMap + lb bc, 7, 7 + ld a, $1 + call FillBoxCGB + call InitPartyMenuOBPals + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 906e + +_CGB_SlotMachine: ; 906e + ld hl, SlotMachinePals + ld de, wBGPals1 + ld bc, 16 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + call WipeAttrMap + hlcoord 0, 2, wAttrMap + lb bc, 10, 3 + ld a, $2 + call FillBoxCGB + hlcoord 17, 2, wAttrMap + lb bc, 10, 3 + ld a, $2 + call FillBoxCGB + hlcoord 0, 4, wAttrMap + lb bc, 6, 3 + ld a, $3 + call FillBoxCGB + hlcoord 17, 4, wAttrMap + lb bc, 6, 3 + ld a, $3 + call FillBoxCGB + hlcoord 0, 6, wAttrMap + lb bc, 2, 3 + ld a, $4 + call FillBoxCGB + hlcoord 17, 6, wAttrMap + lb bc, 2, 3 + ld a, $4 + call FillBoxCGB + hlcoord 4, 2, wAttrMap + lb bc, 2, 12 + ld a, $1 + call FillBoxCGB + hlcoord 3, 2, wAttrMap + lb bc, 10, 1 + ld a, $1 + call FillBoxCGB + hlcoord 16, 2, wAttrMap + lb bc, 10, 1 + ld a, $1 + call FillBoxCGB + hlcoord 0, 12, wAttrMap + ld bc, $78 + ld a, $7 + call ByteFill + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 90f8 + +_CGB06: ; 90f8 + ld hl, PalPacket_SCGB_06 + 1 + call CopyFourPalettes + call WipeAttrMap + ld de, wOBPals1 + ld a, PREDEFPAL_PACK + call GetPredefPal + call LoadHLPaletteIntoDE + hlcoord 0, 6, wAttrMap + lb bc, 12, SCREEN_WIDTH + ld a, $1 + call FillBoxCGB + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9122 + +_CGB_GSIntro: ; 9122 + ld b, 0 + ld hl, .Jumptable + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 912d + +.Jumptable: ; 912d + dw .ShellderLaprasScene + dw .JigglypuffPikachuScene + dw .StartersCharizardScene +; 9133 + +.ShellderLaprasScene: ; 9133 + ld hl, .ShellderLaprasBGPalette + ld de, wBGPals1 + call LoadHLPaletteIntoDE + ld hl, .ShellderLaprasOBPals + ld de, wOBPals1 + ld bc, 2 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + call WipeAttrMap + ret +; 914e + +.ShellderLaprasBGPalette: ; 914e + RGB 19, 31, 19 + RGB 18, 23, 31 + RGB 11, 21, 28 + RGB 04, 16, 24 + +.ShellderLaprasOBPals: ; 9156 + RGB 29, 29, 29 + RGB 20, 19, 20 + RGB 19, 06, 04 + RGB 03, 04, 06 + + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 00, 00 + RGB 03, 04, 06 +; 9166 + +.JigglypuffPikachuScene: ; 9166 + ld de, wBGPals1 + ld a, PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_BG + call GetPredefPal + call LoadHLPaletteIntoDE + + ld de, wOBPals1 + ld a, PREDEFPAL_GS_INTRO_JIGGLYPUFF_PIKACHU_OB + call GetPredefPal + call LoadHLPaletteIntoDE + call WipeAttrMap + ret +; 9180 + +.StartersCharizardScene: ; 9180 + ld hl, PalPacket_Pack + 1 + call CopyFourPalettes + ld de, wOBPals1 + ld a, PREDEFPAL_GS_INTRO_STARTERS_TRANSITION + call GetPredefPal + call LoadHLPaletteIntoDE + call WipeAttrMap + ret +; 9195 + +_CGB11: ; 9195 + ld hl, Palettes_SCGB_11 + ld de, wBGPals1 + ld bc, 5 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + call ApplyPals + call WipeAttrMap + call ApplyAttrMap + ret +; 91ad + +_CGB_Diploma: ; 91ad + ld hl, DiplomaPalettes + ld de, wBGPals1 + ld bc, 16 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + + ld hl, PalPacket_Diploma + 1 + call CopyFourPalettes + call WipeAttrMap + call ApplyAttrMap + ret +; 91c8 + +_CGB_MapPals: ; 91c8 + call LoadMapPals + ld a, SCGB_MAPPALS + ld [wSGBPredef], a + ret +; 91d1 + +_CGB_PartyMenu: ; 91d1 + ld hl, PalPacket_PartyMenu + 1 + call CopyFourPalettes + call InitPartyMenuBGPal0 + call InitPartyMenuBGPal7 + call InitPartyMenuOBPals + call ApplyAttrMap + ret +; 91e4 + +_CGB_Evolution: ; 91e4 + ld de, wBGPals1 + ld a, c + and a + jr z, .pokemon + ld a, PREDEFPAL_BLACKOUT + call GetPredefPal + call LoadHLPaletteIntoDE + jr .got_palette + +.pokemon + ld hl, wPartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld c, l + ld b, h + ld a, [wPlayerHPPal] + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld hl, BattleObjectPals + ld de, wOBPals1 palette PAL_BATTLE_OB_GRAY + ld bc, 6 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + +.got_palette + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9228 + +_CGB_GSTitleScreen: ; 9228 + ld hl, UnusedGSTitleBGPals + ld de, wBGPals1 + ld bc, 5 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + ld hl, UnusedGSTitleOBPals + ld de, wOBPals1 + ld bc, 2 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + ld a, SCGB_DIPLOMA + ld [wSGBPredef], a + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9251 + +_CGB0d: ; 9251 + ld hl, PalPacket_Diploma + 1 + call CopyFourPalettes + call WipeAttrMap + call ApplyAttrMap + ret +; 925e + +_CGB_UnownPuzzle: ; 925e + ld hl, PalPacket_UnownPuzzle + 1 + call CopyFourPalettes + ld de, wOBPals1 + ld a, PREDEFPAL_UNOWN_PUZZLE + call GetPredefPal + call LoadHLPaletteIntoDE + ld a, [rSVBK] + push af + ld a, BANK(wOBPals1) + ld [rSVBK], a + ld hl, wOBPals1 + ld a, LOW(palred 31 + palgreen 0 + palblue 0) + ld [hli], a + ld a, HIGH(palred 31 + palgreen 0 + palblue 0) + ld [hl], a + pop af + ld [rSVBK], a + call WipeAttrMap + call ApplyAttrMap + ret +; 9289 + +_CGB_TrainerCard: ; 9289 + ld de, wBGPals1 + xor a ; CHRIS + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, FALKNER ; KRIS + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, BUGSY + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, WHITNEY + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, MORTY + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, CHUCK + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, JASMINE + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, PRYCE + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, PREDEFPAL_CGB_BADGE + call GetPredefPal + call LoadHLPaletteIntoDE + + ; fill screen with opposite-gender palette for the card border + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, [wPlayerGender] + and a + ld a, $1 ; kris + jr z, .got_gender + ld a, $0 ; chris +.got_gender + call ByteFill + ; fill trainer sprite area with same-gender palette + hlcoord 14, 1, wAttrMap + lb bc, 7, 5 + ld a, [wPlayerGender] + and a + ld a, $0 ; chris + jr z, .got_gender2 + ld a, $1 ; kris +.got_gender2 + call FillBoxCGB + ; top-right corner still uses the border's palette + hlcoord 18, 1, wAttrMap + ld [hl], $1 + hlcoord 2, 11, wAttrMap + lb bc, 2, 4 + ld a, $1 ; falkner + call FillBoxCGB + hlcoord 6, 11, wAttrMap + lb bc, 2, 4 + ld a, $2 ; bugsy + call FillBoxCGB + hlcoord 10, 11, wAttrMap + lb bc, 2, 4 + ld a, $3 ; whitney + call FillBoxCGB + hlcoord 14, 11, wAttrMap + lb bc, 2, 4 + ld a, $4 ; morty + call FillBoxCGB + hlcoord 2, 14, wAttrMap + lb bc, 2, 4 + ld a, $5 ; chuck + call FillBoxCGB + hlcoord 6, 14, wAttrMap + lb bc, 2, 4 + ld a, $6 ; jasmine + call FillBoxCGB + hlcoord 10, 14, wAttrMap + lb bc, 2, 4 + ld a, $7 ; pryce + call FillBoxCGB + ; clair uses kris's palette + ld a, [wPlayerGender] + and a + push af + jr z, .got_gender3 + hlcoord 14, 14, wAttrMap + lb bc, 2, 4 + ld a, $1 + call FillBoxCGB +.got_gender3 + pop af + ld c, $0 + jr nz, .got_gender4 + inc c +.got_gender4 + ld a, c + hlcoord 18, 1, wAttrMap + ld [hl], a + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9373 + +_CGB_MoveList: ; 9373 + ld de, wBGPals1 + ld a, PREDEFPAL_GOLDENROD + call GetPredefPal + call LoadHLPaletteIntoDE + ld a, [wPlayerHPPal] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + hlcoord 11, 1, wAttrMap + lb bc, 2, 9 + ld a, $1 + call FillBoxCGB + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 93a6 + +_CGB0f: ; 93a6 + ld hl, PalPacket_SCGB_0F + 1 + call CopyFourPalettes + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 93ba + +_CGB_PokedexSearchOption: ; 93ba + ld de, wBGPals1 + ld a, PREDEFPAL_POKEDEX + call GetPredefPal + call LoadHLPaletteIntoDE + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 93d3 + +_CGB_PackPals: ; 93d3 +; pack pals + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jr z, .tutorial_male + + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .tutorial_male + + ld hl, .KrisPackPals + jr .got_gender + +.tutorial_male + ld hl, .ChrisPackPals + +.got_gender + ld de, wBGPals1 + ld bc, 8 palettes ; 6 palettes? + ld a, BANK(wBGPals1) + call FarCopyWRAM + call WipeAttrMap + hlcoord 0, 0, wAttrMap + lb bc, 1, 10 + ld a, $1 + call FillBoxCGB + hlcoord 10, 0, wAttrMap + lb bc, 1, 10 + ld a, $2 + call FillBoxCGB + hlcoord 7, 2, wAttrMap + lb bc, 9, 1 + ld a, $3 + call FillBoxCGB + hlcoord 0, 7, wAttrMap + lb bc, 3, 5 + ld a, $4 + call FillBoxCGB + hlcoord 0, 3, wAttrMap + lb bc, 3, 5 + ld a, $5 + call FillBoxCGB + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9439 + +.ChrisPackPals: ; 9439 +INCLUDE "gfx/pack/pack.pal" +; 9469 + +.KrisPackPals: ; 9469 +INCLUDE "gfx/pack/pack_f.pal" +; 9499 + +_CGB_Pokepic: ; 9499 + call _CGB_MapPals + ld de, SCREEN_WIDTH + hlcoord 0, 0, wAttrMap + ld a, [wMenuBorderTopCoord] +.loop + and a + jr z, .found_top + dec a + add hl, de + jr .loop + +.found_top + ld a, [wMenuBorderLeftCoord] + ld e, a + ld d, $0 + add hl, de + ld a, [wMenuBorderTopCoord] + ld b, a + ld a, [wMenuBorderBottomCoord] + inc a + sub b + ld b, a + ld a, [wMenuBorderLeftCoord] + ld c, a + ld a, [wMenuBorderRightCoord] + sub c + inc a + ld c, a + ld a, $0 + call FillBoxCGB + call ApplyAttrMap + ret +; 94d0 + +_CGB13: ; 94d0 + ld hl, PalPacket_SCGB_13 + 1 + call CopyFourPalettes + call WipeAttrMap + hlcoord 0, 4, wAttrMap + lb bc, 10, SCREEN_WIDTH + ld a, $2 + call FillBoxCGB + hlcoord 0, 6, wAttrMap + lb bc, 6, SCREEN_WIDTH + ld a, $1 + call FillBoxCGB + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 94fa + +_CGB_GamefreakLogo: ; 94fa + ld de, wBGPals1 + ld a, PREDEFPAL_GAMEFREAK_LOGO + call GetPredefPal + call LoadHLPaletteIntoDE + ld hl, .Palette + ld de, wOBPals1 + call LoadHLPaletteIntoDE + ld hl, .Palette + ld de, wOBPals1 palette 1 + call LoadHLPaletteIntoDE + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ret +; 9521 + +.Palette: ; 9521 +INCLUDE "gfx/splash/logo.pal" +; 9529 + +_CGB_PlayerOrMonFrontpicPals: ; 9529 + ld de, wBGPals1 + ld a, [wCurPartySpecies] + ld bc, wTempMonDVs + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ret +; 9542 + +_CGB1e: ; 9542 + ld de, wBGPals1 + ld a, [wCurPartySpecies] + call GetMonPalettePointer_ + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + call ApplyAttrMap + ret +; 9555 + +_CGB_TradeTube: ; 9555 + ld hl, PalPacket_TradeTube + 1 + call CopyFourPalettes + ld hl, PartyMenuOBPals + ld de, wOBPals1 + ld bc, 1 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + ld de, wOBPals1 palette 7 + ld a, PREDEFPAL_TRADE_TUBE + call GetPredefPal + call LoadHLPaletteIntoDE + call WipeAttrMap + ret +; 9578 + +_CGB_TrainerOrMonFrontpicPals: ; 9578 + ld de, wBGPals1 + ld a, [wCurPartySpecies] + ld bc, wTempMonDVs + call GetFrontpicPalettePointer + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ret +; 9591 + +_CGB_MysteryGift: ; 9591 + ld hl, .Palettes + ld de, wBGPals1 + ld bc, 2 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + call ApplyPals + call WipeAttrMap + hlcoord 3, 7, wAttrMap + lb bc, 8, 14 + ld a, $1 + call FillBoxCGB + hlcoord 1, 5, wAttrMap + lb bc, 1, 18 + ld a, $1 + call FillBoxCGB + hlcoord 1, 16, wAttrMap + lb bc, 1, 18 + ld a, $1 + call FillBoxCGB + hlcoord 0, 0, wAttrMap + lb bc, 17, 2 + ld a, $1 + call FillBoxCGB + hlcoord 18, 5, wAttrMap + lb bc, 12, 1 + ld a, $1 + call FillBoxCGB + call ApplyAttrMap + ret +; 95e0 + +.Palettes: ; 95e0 +INCLUDE "gfx/mystery_gift/mystery_gift.pal" +; 95f0 diff --git a/engine/gfx/color.asm b/engine/gfx/color.asm new file mode 100644 index 000000000..6cf896ff4 --- /dev/null +++ b/engine/gfx/color.asm @@ -0,0 +1,1356 @@ +INCLUDE "engine/gfx/sgb_layouts.asm" + +SHINY_ATK_BIT EQU 5 +SHINY_DEF_VAL EQU 10 +SHINY_SPD_VAL EQU 10 +SHINY_SPC_VAL EQU 10 + +CheckShininess: +; Check if a mon is shiny by DVs at bc. +; Return carry if shiny. + + ld l, c + ld h, b + +; Attack + ld a, [hl] + and 1 << SHINY_ATK_BIT + jr z, .NotShiny + +; Defense + ld a, [hli] + and $f + cp SHINY_DEF_VAL + jr nz, .NotShiny + +; Speed + ld a, [hl] + and $f0 + cp SHINY_SPD_VAL << 4 + jr nz, .NotShiny + +; Special + ld a, [hl] + and $f + cp SHINY_SPC_VAL + jr nz, .NotShiny + +.Shiny: + scf + ret + +.NotShiny: + and a + ret + +Unused_CheckContestMon: +; Check a mon's DVs at hl in the bug catching contest. +; Return carry if its DVs are good enough to place in the contest. + +; Attack + ld a, [hl] + cp 10 << 4 + jr c, .Bad + +; Defense + ld a, [hli] + and $f + cp 10 + jr c, .Bad + +; Speed + ld a, [hl] + cp 10 << 4 + jr c, .Bad + +; Special + ld a, [hl] + and $f + cp 10 + jr c, .Bad + +.Good: + scf + ret + +.Bad: + and a + ret + +Unreferenced_Function8aa4: + push de + push bc + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + pop bc + pop de + ld a, c + ld [wSGBPals + 3], a + ld a, b + ld [wSGBPals + 4], a + ld a, e + ld [wSGBPals + 5], a + ld a, d + ld [wSGBPals + 6], a + ld hl, wSGBPals + call PushSGBPals_ + ld hl, BlkPacket_9a86 + call PushSGBPals_ + ret + +InitPartyMenuPalettes: + ld hl, PalPacket_PartyMenu + 1 + call CopyFourPalettes + call InitPartyMenuOBPals + call WipeAttrMap + ret + +; SGB layout for SCGB_PARTY_MENU_HP_PALS +SGB_ApplyPartyMenuHPPals: ; 8ade + ld hl, wHPPals + ld a, [wSGBPals] + ld e, a + ld d, $0 + add hl, de + ld e, l + ld d, h + ld a, [de] + and a + ld e, $5 + jr z, .okay + dec a + ld e, $a + jr z, .okay + ld e, $f +.okay + push de + ld hl, wSGBPals + 10 + ld bc, $6 + ld a, [wSGBPals] + call AddNTimes + pop de + ld [hl], e + ret + +Unreferenced_Function8b07: + call CheckCGB + ret z +; CGB only + ld hl, .BGPal + ld de, wBGPals1 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + + ld hl, .OBPal + ld de, wOBPals1 + ld bc, 1 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret + +.BGPal: + RGB 31, 31, 31 + RGB 18, 23, 31 + RGB 15, 20, 31 + RGB 00, 00, 00 + +.OBPal: + RGB 31, 31, 31 + RGB 31, 31, 12 + RGB 08, 16, 28 + RGB 00, 00, 00 + +Unreferenced_Function8b3f: + call CheckCGB + ret nz + ld a, [hSGB] + and a + ret z + ld hl, BlkPacket_9a86 + jp PushSGBPals_ + +Unreferenced_Function8b4d: + call CheckCGB + jr nz, .cgb + ld a, [hSGB] + and a + ret z + ld hl, PalPacket_Function8b4d + jp PushSGBPals_ + +.cgb + ld de, wOBPals1 + ld a, PREDEFPAL_3B + call GetPredefPal + jp LoadHLPaletteIntoDE + +Unreferenced_Function8b67: + call CheckCGB + jr nz, .cgb + ld a, [hSGB] + and a + ret z + ld hl, PalPacket_Pack + jp PushSGBPals_ + +.cgb + ld de, wOBPals1 + ld a, PREDEFPAL_PACK + call GetPredefPal + jp LoadHLPaletteIntoDE + +Unreferenced_Function8b81: + call CheckCGB + jr nz, .cgb + ld a, [hSGB] + and a + ret z + ld a, c + push af + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + pop af + call GetMonPalettePointer_ + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld hl, wSGBPals + jp PushSGBPals_ + +.cgb + ld de, wOBPals1 + ld a, c + call GetMonPalettePointer_ + call LoadPalette_White_Col1_Col2_Black + ret + +LoadTrainerClassPaletteAsNthBGPal: + ld a, [wTrainerClass] + call GetTrainerPalettePointer + ld a, e + jr got_palette_pointer_8bd7 + +LoadMonPaletteAsNthBGPal: + ld a, [wCurPartySpecies] + call GetMonPalettePointer + ld a, e + bit 7, a + jr z, got_palette_pointer_8bd7 + and $7f + inc hl + inc hl + inc hl + inc hl + +got_palette_pointer_8bd7 + push hl + ld hl, wBGPals1 + ld de, 1 palettes +.loop + and a + jr z, .got_addr + add hl, de + dec a + jr .loop + +.got_addr + ld e, l + ld d, h + pop hl + call LoadPalette_White_Col1_Col2_Black + ret + +Unreferenced_Function8bec: + ld a, [hCGB] + and a + jr nz, .cgb + ld hl, wPlayerLightScreenCount + jp PushSGBPals_ + +.cgb + ld a, [wEnemyLightScreenCount] ; col + ld c, a + ld a, [wEnemyReflectCount] ; row + hlcoord 0, 0, wAttrMap + ld de, SCREEN_WIDTH +.loop + and a + jr z, .done + add hl, de + dec a + jr .loop + +.done + ld b, $0 + add hl, bc + lb bc, 6, 4 + ld a, [wEnemySafeguardCount] ; value + and $3 + call FillBoxCGB + call CopyTilemapAtOnce + ret + +ApplyMonOrTrainerPals: + call CheckCGB + ret z + ld a, e + and a + jr z, .get_trainer + ld a, [wCurPartySpecies] + call GetMonPalettePointer_ + jr .load_palettes + +.get_trainer + ld a, [wTrainerClass] + call GetTrainerPalettePointer + +.load_palettes + ld de, wBGPals1 + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ret + +ApplyHPBarPals: + ld a, [wWhichHPBar] + and a + jr z, .Enemy + cp $1 + jr z, .Player + cp $2 + jr z, .PartyMenu + ret + +.Enemy: + ld de, wBGPals2 palette PAL_BATTLE_BG_ENEMY_HP color 1 + jr .okay + +.Player: + ld de, wBGPals2 palette PAL_BATTLE_BG_PLAYER_HP color 1 + +.okay + ld l, c + ld h, $0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + ld bc, 4 + ld a, BANK(wBGPals2) + call FarCopyWRAM + ld a, $1 + ld [hCGBPalUpdate], a + ret + +.PartyMenu: + ld e, c + inc e + hlcoord 11, 1, wAttrMap + ld bc, 2 * SCREEN_WIDTH + ld a, [wCurPartyMon] +.loop + and a + jr z, .done + add hl, bc + dec a + jr .loop + +.done + lb bc, 2, 8 + ld a, e + call FillBoxCGB + ret + +LoadStatsScreenPals: + call CheckCGB + ret z + ld hl, StatsScreenPals + ld b, 0 + dec c + add hl, bc + add hl, bc + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld a, [hli] + ld [wBGPals1 palette 0], a + ld [wBGPals1 palette 2], a + ld a, [hl] + ld [wBGPals1 palette 0 + 1], a + ld [wBGPals1 palette 2 + 1], a + pop af + ld [rSVBK], a + call ApplyPals + ld a, $1 + ret + +LoadMailPalettes: + ld l, e + ld h, 0 + add hl, hl + add hl, hl + add hl, hl + ld de, .MailPals + add hl, de + call CheckCGB + jr nz, .cgb + push hl + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + pop hl + inc hl + inc hl + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hli] + ld [wSGBPals + 6], a + ld hl, wSGBPals + call PushSGBPals_ + ld hl, BlkPacket_9a86 + call PushSGBPals_ + ret + +.cgb + ld de, wBGPals1 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + call ApplyPals + call WipeAttrMap + call ApplyAttrMap + ret + +.MailPals: +INCLUDE "gfx/mail/mail.pal" + +INCLUDE "engine/gfx/cgb_layouts.asm" + +Unreferenced_Function95f0: + ld hl, .Palette + ld de, wBGPals1 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + call ApplyPals + call WipeAttrMap + call ApplyAttrMap + ret + +.Palette: + RGB 31, 31, 31 + RGB 09, 31, 31 + RGB 10, 12, 31 + RGB 00, 03, 19 + +CopyFourPalettes: + ld de, wBGPals1 + ld c, 4 + +CopyPalettes: +.loop + push bc + ld a, [hli] + push hl + call GetPredefPal + call LoadHLPaletteIntoDE + pop hl + inc hl + pop bc + dec c + jr nz, .loop + ret + +GetPredefPal: + ld l, a + ld h, $0 + add hl, hl + add hl, hl + add hl, hl + ld bc, PredefPals + add hl, bc + ret + +LoadHLPaletteIntoDE: + ld a, [rSVBK] + push af + ld a, BANK(wOBPals1) + ld [rSVBK], a + ld c, 1 palettes +.loop + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop + pop af + ld [rSVBK], a + ret + +LoadPalette_White_Col1_Col2_Black: + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld a, LOW(PALRGB_WHITE) + ld [de], a + inc de + ld a, HIGH(PALRGB_WHITE) + ld [de], a + inc de + + ld c, 2 * PAL_COLOR_SIZE +.loop + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop + + xor a + ld [de], a + inc de + ld [de], a + inc de + + pop af + ld [rSVBK], a + ret + +FillBoxCGB: +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret + +ResetBGPals: + push af + push bc + push de + push hl + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld hl, wBGPals1 + ld c, 1 palettes +.loop + ld a, $ff + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + xor a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + dec c + jr nz, .loop + + pop af + ld [rSVBK], a + + pop hl + pop de + pop bc + pop af + ret + +WipeAttrMap: + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + ret + +ApplyPals: + ld hl, wBGPals1 + ld de, wBGPals2 + ld bc, 16 palettes + ld a, BANK(wGBCPalettes) + call FarCopyWRAM + ret + +ApplyAttrMap: + ld a, [rLCDC] + bit rLCDC_ENABLE, a + jr z, .UpdateVBank1 + ld a, [hBGMapMode] + push af + ld a, $2 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + call DelayFrame + pop af + ld [hBGMapMode], a + ret + +.UpdateVBank1: + hlcoord 0, 0, wAttrMap + debgcoord 0, 0 + ld b, SCREEN_HEIGHT + ld a, $1 + ld [rVBK], a +.row + ld c, SCREEN_WIDTH +.col + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .col + ld a, BG_MAP_WIDTH - SCREEN_WIDTH + add e + jr nc, .okay + inc d +.okay + ld e, a + dec b + jr nz, .row + ld a, $0 + ld [rVBK], a + ret + +; CGB layout for SCGB_PARTY_MENU_HP_PALS +CGB_ApplyPartyMenuHPPals: ; 96f3 + ld hl, wHPPals + ld a, [wSGBPals] + ld e, a + ld d, $0 + add hl, de + ld e, l + ld d, h + ld a, [de] + inc a + ld e, a + hlcoord 11, 2, wAttrMap + ld bc, 2 * SCREEN_WIDTH + ld a, [wSGBPals] +.loop + and a + jr z, .done + add hl, bc + dec a + jr .loop +.done + lb bc, 2, 8 + ld a, e + call FillBoxCGB + ret + +InitPartyMenuOBPals: + ld hl, PartyMenuOBPals + ld de, wOBPals1 + ld bc, 2 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + ret + +GetBattlemonBackpicPalettePointer: + push de + farcall GetPartyMonDVs + ld c, l + ld b, h + ld a, [wTempBattleMonSpecies] + call GetPlayerOrMonPalettePointer + pop de + ret + +GetEnemyFrontpicPalettePointer: + push de + farcall GetEnemyMonDVs + ld c, l + ld b, h + ld a, [wTempEnemyMonSpecies] + call GetFrontpicPalettePointer + pop de + ret + +GetPlayerOrMonPalettePointer: + and a + jp nz, GetMonNormalOrShinyPalettePointer + ld a, [wPlayerSpriteSetupFlags] + bit PLAYERSPRITESETUP_FEMALE_TO_MALE_F, a + jr nz, .male + ld a, [wPlayerGender] + and a + jr z, .male + ld hl, KrisPalette + ret + +.male + ld hl, PlayerPalette + ret + +GetFrontpicPalettePointer: + and a + jp nz, GetMonNormalOrShinyPalettePointer + ld a, [wTrainerClass] + +GetTrainerPalettePointer: + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld bc, TrainerPalettes + add hl, bc + ret + +GetMonPalettePointer_: + call GetMonPalettePointer + ret + +Unreferenced_Function9779: + ret + call CheckCGB + ret z + ld hl, BattleObjectPals + ld a, $90 + ld [rOBPI], a + ld c, 6 palettes +.loop + ld a, [hli] + ld [rOBPD], a + dec c + jr nz, .loop + ld hl, BattleObjectPals + ld de, wOBPals1 palette 2 + ld bc, 2 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + ret + +BattleObjectPals: +INCLUDE "gfx/battle_anims/battle_anims.pal" + +Unreferenced_Function97cc: + call CheckCGB + ret z + ld a, $90 + ld [rOBPI], a + ld a, PREDEFPAL_TRADE_TUBE + call GetPredefPal + call .PushPalette + ld a, PREDEFPAL_RB_GREENMON + call GetPredefPal + call .PushPalette + ret + +.PushPalette: + ld c, 1 palettes +.loop + ld a, [hli] + ld [rOBPD], a + dec c + jr nz, .loop + ret + +GetMonPalettePointer: + ld l, a + ld h, $0 + add hl, hl + add hl, hl + add hl, hl + ld bc, PokemonPalettes + add hl, bc + ret + +GetMonNormalOrShinyPalettePointer: + push bc + call GetMonPalettePointer + pop bc + push hl + call CheckShininess + pop hl + ret nc +rept 4 + inc hl +endr + ret + +PushSGBPals_: + ld a, [wcfbe] + push af + set 7, a + ld [wcfbe], a + call PushSGBPals + pop af + ld [wcfbe], a + ret + +PushSGBPals: + ld a, [hl] + and $7 + ret z + ld b, a +.loop + push bc + xor a + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + ld b, $10 +.loop2 + ld e, $8 + ld a, [hli] + ld d, a +.loop3 + bit 0, d + ld a, $10 + jr nz, .okay + ld a, $20 +.okay + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + rr d + dec e + jr nz, .loop3 + dec b + jr nz, .loop2 + ld a, $20 + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + call SGBDelayCycles + pop bc + dec b + jr nz, .loop + ret + +InitSGBBorder: + call CheckCGB + ret nz +; SGB/DMG only + di + ld a, [wcfbe] + push af + set 7, a + ld [wcfbe], a + xor a + ld [rJOYP], a + ld [hSGB], a + call PushSGBBorderPalsAndWait + jr nc, .skip + ld a, $1 + ld [hSGB], a + call _InitSGBBorderPals + call SGBBorder_PushBGPals + call SGBDelayCycles + call SGB_ClearVRAM + call PushSGBBorder + call SGBDelayCycles + call SGB_ClearVRAM + ld hl, MaskEnCancelPacket + call PushSGBPals + +.skip + pop af + ld [wcfbe], a + ei + ret + +InitCGBPals:: + call CheckCGB + ret z +; CGB only + ld a, BANK(vTiles3) + ld [rVBK], a + ld hl, vTiles3 + ld bc, $200 tiles + xor a + call ByteFill + ld a, BANK(vTiles0) + ld [rVBK], a + ld a, 1 << rBGPI_AUTO_INCREMENT + ld [rBGPI], a + ld c, 4 * 8 +.bgpals_loop + ld a, LOW(PALRGB_WHITE) + ld [rBGPD], a + ld a, HIGH(PALRGB_WHITE) + ld [rBGPD], a + dec c + jr nz, .bgpals_loop + ld a, 1 << rOBPI_AUTO_INCREMENT + ld [rOBPI], a + ld c, 4 * 8 +.obpals_loop + ld a, LOW(PALRGB_WHITE) + ld [rOBPD], a + ld a, HIGH(PALRGB_WHITE) + ld [rOBPD], a + dec c + jr nz, .obpals_loop + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, wBGPals1 + call .LoadWhitePals + ld hl, wBGPals2 + call .LoadWhitePals + pop af + ld [rSVBK], a + ret + +.LoadWhitePals: + ld c, 4 * 16 +.loop + ld a, LOW(PALRGB_WHITE) + ld [hli], a + ld a, HIGH(PALRGB_WHITE) + ld [hli], a + dec c + jr nz, .loop + ret + +_InitSGBBorderPals: + ld hl, .PacketPointerTable + ld c, 9 +.loop + push bc + ld a, [hli] + push hl + ld h, [hl] + ld l, a + call PushSGBPals + pop hl + inc hl + pop bc + dec c + jr nz, .loop + ret + +.PacketPointerTable: + dw MaskEnFreezePacket + dw DataSndPacket1 + dw DataSndPacket2 + dw DataSndPacket3 + dw DataSndPacket4 + dw DataSndPacket5 + dw DataSndPacket6 + dw DataSndPacket7 + dw DataSndPacket8 + +Unreferenced_Function9911: + di + xor a + ld [rJOYP], a + ld hl, MaskEnFreezePacket + call PushSGBPals + call PushSGBBorder + call SGBDelayCycles + call SGB_ClearVRAM + ld hl, MaskEnCancelPacket + call PushSGBPals + ei + ret + +PushSGBBorder: + call .LoadSGBBorderPointers + push de + call SGBBorder_YetMorePalPushing + pop hl + call SGBBorder_MorePalPushing + ret + +.LoadSGBBorderPointers: + ld hl, SGBBorder + ld de, SGBBorderMap + ret + +SGB_ClearVRAM: + ld hl, VRAM_Begin + ld bc, VRAM_End - VRAM_Begin + xor a + call ByteFill + ret + +PushSGBBorderPalsAndWait: + ld hl, MltReq2Packet + call PushSGBPals + call SGBDelayCycles + ld a, [rJOYP] + and $3 + cp $3 + jr nz, .carry + ld a, $20 + ld [rJOYP], a + ld a, [rJOYP] + ld a, [rJOYP] + call SGBDelayCycles + call SGBDelayCycles + ld a, $30 + ld [rJOYP], a + call SGBDelayCycles + call SGBDelayCycles + ld a, $10 + ld [rJOYP], a +rept 6 + ld a, [rJOYP] +endr + call SGBDelayCycles + call SGBDelayCycles + ld a, $30 + ld [rJOYP], a + ld a, [rJOYP] + ld a, [rJOYP] + ld a, [rJOYP] + call SGBDelayCycles + call SGBDelayCycles + ld a, [rJOYP] + and $3 + cp $3 + jr nz, .carry + call .FinalPush + and a + ret + +.carry + call .FinalPush + scf + ret + +.FinalPush: + ld hl, MltReq1Packet + call PushSGBPals + jp SGBDelayCycles + +SGBBorder_PushBGPals: + call DisableLCD + ld a, %11100100 + ld [rBGP], a + ld hl, PredefPals + ld de, vTiles1 + ld bc, $100 tiles + call CopyData + call DrawDefaultTiles + ld a, LCDC_DEFAULT + ld [rLCDC], a + ld hl, PalTrnPacket + call PushSGBPals + xor a + ld [rBGP], a + ret + +SGBBorder_MorePalPushing: + call DisableLCD + ld a, $e4 + ld [rBGP], a + ld de, vTiles1 + ld bc, 20 tiles + call CopyData + ld b, 18 +.loop + push bc + ld bc, $c + call CopyData + ld bc, $28 + call ClearBytes + ld bc, $c + call CopyData + pop bc + dec b + jr nz, .loop + ld bc, $140 + call CopyData + ld bc, Start + call ClearBytes + ld bc, 16 palettes + call CopyData + call DrawDefaultTiles + ld a, LCDC_DEFAULT + ld [rLCDC], a + ld hl, PctTrnPacket + call PushSGBPals + xor a + ld [rBGP], a + ret + +SGBBorder_YetMorePalPushing: + call DisableLCD + ld a, %11100100 + ld [rBGP], a + ld de, vTiles1 + ld b, $80 +.loop + push bc + ld bc, 1 tiles + call CopyData + ld bc, 1 tiles + call ClearBytes + pop bc + dec b + jr nz, .loop + call DrawDefaultTiles + ld a, LCDC_DEFAULT + ld [rLCDC], a + ld hl, ChrTrnPacket + call PushSGBPals + xor a + ld [rBGP], a + ret + +CopyData: ; 0x9a52 +; copy bc bytes of data from hl to de +.loop + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, c + or b + jr nz, .loop + ret +; 0x9a5b + +ClearBytes: ; 0x9a5b +; clear bc bytes of data starting from de +.loop + xor a + ld [de], a + inc de + dec bc + ld a, c + or b + jr nz, .loop + ret +; 0x9a64 + +DrawDefaultTiles: ; 0x9a64 +; Draw 240 tiles (2/3 of the screen) from tiles in VRAM + hlbgcoord 0, 0 ; BG Map 0 + ld de, BG_MAP_WIDTH - SCREEN_WIDTH + ld a, $80 ; starting tile + ld c, 12 + 1 +.line + ld b, 20 +.tile + ld [hli], a + inc a + dec b + jr nz, .tile +; next line + add hl, de + dec c + jr nz, .line + ret +; 0x9a7a + +SGBDelayCycles: + ld de, 7000 +.wait + nop + nop + nop + dec de + ld a, d + or e + jr nz, .wait + ret + +INCLUDE "gfx/sgb/blk_packets.asm" +INCLUDE "gfx/sgb/pal_packets.asm" +INCLUDE "data/sgb_ctrl_packets.asm" + +PredefPals: +INCLUDE "gfx/sgb/predef.pal" + +SGBBorderMap: +; interleaved tile ids and palette ids +INCBIN "gfx/sgb/sgb_border.bin" + +SGBBorderPalettes: +INCLUDE "gfx/sgb/sgb_border.pal" + +SGBBorder: +INCBIN "gfx/sgb/sgb_border.2bpp" + +HPBarPals: +INCLUDE "gfx/battle/hp_bar.pal" + +ExpBarPalette: +INCLUDE "gfx/battle/exp_bar.pal" + +INCLUDE "data/pokemon/palettes.asm" + +INCLUDE "data/trainers/palettes.asm" + +LoadMapPals: + farcall LoadSpecialMapPalette + jr c, .got_pals + + ; Which palette group is based on whether we're outside or inside + ld a, [wEnvironment] + and 7 + ld e, a + ld d, 0 + ld hl, EnvironmentColorsPointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ; Futher refine by time of day + ld a, [wTimeOfDayPal] + maskbits NUM_DAYTIMES + add a + add a + add a + ld e, a + ld d, 0 + add hl, de + ld e, l + ld d, h + ; Switch to palettes WRAM bank + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, wBGPals1 + ld b, 8 +.outer_loop + ld a, [de] ; lookup index for TilesetBGPalette + push de + push hl + ld l, a + ld h, 0 + add hl, hl + add hl, hl + add hl, hl + ld de, TilesetBGPalette + add hl, de + ld e, l + ld d, h + pop hl + ld c, 1 palettes +.inner_loop + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .inner_loop + pop de + inc de + dec b + jr nz, .outer_loop + pop af + ld [rSVBK], a + +.got_pals + ld a, [wTimeOfDayPal] + maskbits NUM_DAYTIMES + ld bc, 8 palettes + ld hl, MapObjectPals + call AddNTimes + ld de, wOBPals1 + ld bc, 8 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + + ld a, [wEnvironment] + cp TOWN + jr z, .outside + cp ROUTE + ret nz +.outside + ld a, [wMapGroup] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + add hl, hl + ld de, RoofPals + add hl, de + ld a, [wTimeOfDayPal] + maskbits NUM_DAYTIMES + cp NITE_F + jr c, .morn_day +rept 4 + inc hl +endr +.morn_day + ld de, wBGPals1 palette PAL_BG_ROOF color 1 + ld bc, 4 + ld a, BANK(wBGPals1) + call FarCopyWRAM + ret + +INCLUDE "data/maps/environment_colors.asm" + +PartyMenuBGMobilePalette: +INCLUDE "gfx/stats/party_menu_bg_mobile.pal" + +PartyMenuBGPalette: +INCLUDE "gfx/stats/party_menu_bg.pal" + +TilesetBGPalette: +INCLUDE "gfx/tilesets/bg_tiles.pal" + +MapObjectPals:: +INCLUDE "gfx/overworld/npc_sprites.pal" + +RoofPals: +INCLUDE "gfx/tilesets/roofs.pal" + +DiplomaPalettes: +INCLUDE "gfx/diploma/diploma.pal" + +PartyMenuOBPals: +INCLUDE "gfx/stats/party_menu_ob.pal" + +UnusedGSTitleBGPals: +INCLUDE "gfx/title/unused_gs_bg.pal" + +UnusedGSTitleOBPals: +INCLUDE "gfx/title/unused_gs_fg.pal" + +MalePokegearPals: +INCLUDE "gfx/pokegear/pokegear.pal" + +FemalePokegearPals: +INCLUDE "gfx/pokegear/pokegear_f.pal" + +Palettes_SCGB_11: +INCLUDE "gfx/unknown/b789.pal" + +SlotMachinePals: +INCLUDE "gfx/slots/slots.pal" diff --git a/engine/gfx/crystal_layouts.asm b/engine/gfx/crystal_layouts.asm new file mode 100755 index 000000000..0133916e5 --- /dev/null +++ b/engine/gfx/crystal_layouts.asm @@ -0,0 +1,325 @@ +GetMysteryGift_MobileAdapterLayout: ; 4930f (mobile) + ld a, b + cp SCGB_RAM + jr nz, .not_ram + ld a, [wSGBPredef] +.not_ram + push af + farcall ResetBGPals + pop af + ld l, a + ld h, 0 + add hl, hl + ld de, .dw + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .done + push de + jp hl +.done + ret +; 49330 (12:5330) + +.dw ; 49330 + dw MG_Mobile_Layout00 + dw MG_Mobile_Layout01 + dw MG_Mobile_Layout02 +; 49336 + +MG_Mobile_Layout_FillBox: ; 49336 +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; 49346 + +MG_Mobile_Layout_WipeAttrMap: ; 49346 (12:5346) + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + ret + +MG_Mobile_Layout_LoadPals: ; 49351 (12:5351) + ld de, wBGPals1 + ld hl, Palette_MysteryGiftMobile + ld bc, 5 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + ld de, wBGPals1 palette PAL_BG_TEXT + ld hl, Palette_TextBG7 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + ret + +MG_Mobile_Layout00: ; 4936e (12:536e) + call MG_Mobile_Layout_LoadPals + call MG_Mobile_Layout_WipeAttrMap + call MG_Mobile_Layout_CreatePalBoxes + farcall ApplyAttrMap + farcall ApplyPals + ret + +MG_Mobile_Layout_CreatePalBoxes: ; 49384 (12:5384) + hlcoord 0, 0, wAttrMap + lb bc, 4, 1 + ld a, $1 + call MG_Mobile_Layout_FillBox + lb bc, 2, 1 + ld a, $2 + call MG_Mobile_Layout_FillBox + lb bc, 6, 1 + ld a, $3 + call MG_Mobile_Layout_FillBox + hlcoord 1, 0, wAttrMap + ld a, $1 + lb bc, 3, 18 + call MG_Mobile_Layout_FillBox + lb bc, 2, 18 + ld a, $2 + call MG_Mobile_Layout_FillBox + lb bc, 12, 18 + ld a, $3 + call MG_Mobile_Layout_FillBox + hlcoord 19, 0, wAttrMap + lb bc, 4, 1 + ld a, $1 + call MG_Mobile_Layout_FillBox + lb bc, 2, 1 + ld a, $2 + call MG_Mobile_Layout_FillBox + lb bc, 6, 1 + ld a, $3 + call MG_Mobile_Layout_FillBox + hlcoord 0, 12, wAttrMap + ld bc, 6 * SCREEN_WIDTH + ld a, $7 + call ByteFill + ret +; 493e1 (12:53e1) + +Palette_MysteryGiftMobile: ; 493e1 +INCLUDE "gfx/mystery_gift/mg_mobile.pal" +; 49409 + +LoadOW_BGPal7:: ; 49409 + ld hl, Palette_TextBG7 + ld de, wBGPals1 palette PAL_BG_TEXT + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + ret +; 49418 + +Palette_TextBG7: ; 49418 +INCLUDE "gfx/font/bg_text.pal" +; 49420 + +Function49420:: ; 49420 (12:5420) + ld hl, MansionPalette1 + 8 palettes + ld de, wBGPals1 palette PAL_BG_ROOF + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + ret +; 4942f (12:542f) + +MG_Mobile_Layout01: ; 4942f + call MG_Mobile_Layout_LoadPals + ld de, wBGPals1 palette PAL_BG_TEXT + ld hl, .Palette_49478 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + call MG_Mobile_Layout_WipeAttrMap + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + hlcoord 0, 14, wAttrMap + ld bc, 4 * SCREEN_WIDTH + ld a, $7 + call ByteFill + ld a, [wd002] + bit 6, a + jr z, .asm_49464 + call Function49480 + jr .asm_49467 + +.asm_49464 + call Function49496 + +.asm_49467 + farcall ApplyAttrMap + farcall ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 49478 + +.Palette_49478: ; 49478 + RGB 31, 31, 31 + RGB 26, 31, 00 + RGB 20, 16, 03 + RGB 00, 00, 00 +; 49480 + +Function49480: ; 49480 + hlcoord 0, 0, wAttrMap + lb bc, 4, SCREEN_WIDTH + ld a, $7 + call MG_Mobile_Layout_FillBox + hlcoord 0, 2, wAttrMap + ld a, $4 + ld [hl], a + hlcoord 19, 2, wAttrMap + ld [hl], a + ret +; 49496 + +Function49496: ; 49496 + hlcoord 0, 0, wAttrMap + lb bc, 2, SCREEN_WIDTH + ld a, $7 + call MG_Mobile_Layout_FillBox + hlcoord 0, 1, wAttrMap + ld a, $4 + ld [hl], a + hlcoord 19, 1, wAttrMap + ld [hl], a + ret +; 494ac + +INCLUDE "engine/gfx/tileset_palettes.asm" + +MG_Mobile_Layout02: ; 49706 + ld hl, .Palette_49732 + ld de, wBGPals1 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + farcall ApplyPals + call MG_Mobile_Layout_WipeAttrMap + farcall ApplyAttrMap + ld hl, .Palette_4973a + ld de, wOBPals1 + ld bc, 1 palettes + ld a, BANK(wOBPals1) + call FarCopyWRAM + ret +; 49732 + +.Palette_49732: ; 49732 + RGB 31, 31, 31 + RGB 23, 16, 07 + RGB 23, 07, 07 + RGB 03, 07, 20 +; 4973a + +.Palette_4973a: ; 4973a + RGB 00, 00, 00 + RGB 07, 05, 31 + RGB 14, 18, 31 + RGB 31, 31, 31 +; 49742 + +Function49742: ; 49742 + ld hl, .Palette_49757 + ld de, wBGPals1 + ld bc, 8 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + farcall ApplyPals + ret +; 49757 + +.Palette_49757: ; 49757 +INCLUDE "gfx/unknown/49757.pal" +; 49797 + +_InitMG_Mobile_LinkTradePalMap: ; 49797 + hlcoord 0, 0, wAttrMap + lb bc, 16, 2 + ld a, $4 + call MG_Mobile_Layout_FillBox + ld a, $3 + ldcoord_a 0, 1, wAttrMap + ldcoord_a 0, 14, wAttrMap + hlcoord 2, 0, wAttrMap + lb bc, 8, 18 + ld a, $5 + call MG_Mobile_Layout_FillBox + hlcoord 2, 8, wAttrMap + lb bc, 8, 18 + ld a, $6 + call MG_Mobile_Layout_FillBox + hlcoord 0, 16, wAttrMap + lb bc, 2, SCREEN_WIDTH + ld a, $4 + call MG_Mobile_Layout_FillBox + ld a, $3 + lb bc, 6, 1 + hlcoord 6, 1, wAttrMap + call MG_Mobile_Layout_FillBox + ld a, $3 + lb bc, 6, 1 + hlcoord 17, 1, wAttrMap + call MG_Mobile_Layout_FillBox + ld a, $3 + lb bc, 6, 1 + hlcoord 6, 9, wAttrMap + call MG_Mobile_Layout_FillBox + ld a, $3 + lb bc, 6, 1 + hlcoord 17, 9, wAttrMap + call MG_Mobile_Layout_FillBox + ld a, $2 + hlcoord 2, 16, wAttrMap + ld [hli], a + ld a, $7 + ld [hli], a + ld [hli], a + ld [hli], a + ld a, $2 + ld [hl], a + hlcoord 2, 17, wAttrMap + ld a, $3 + ld bc, 6 + call ByteFill + ret +; 49811 + +LoadTradeRoomBGPals: ; 49811 + ld hl, TradeRoomPalette + ld de, wBGPals1 palette PAL_BG_GREEN + ld bc, 6 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + farcall ApplyPals + ret +; 49826 + +TradeRoomPalette: ; 49826 +INCLUDE "gfx/trade/border.pal" +; 49856 + +InitMG_Mobile_LinkTradePalMap: ; 49856 + call _InitMG_Mobile_LinkTradePalMap + ret +; 4985a + +; unused +INCLUDE "gfx/unknown/4985a.asm" diff --git a/engine/gfx/evolution_animation.asm b/engine/gfx/evolution_animation.asm new file mode 100755 index 000000000..978f9e968 --- /dev/null +++ b/engine/gfx/evolution_animation.asm @@ -0,0 +1,368 @@ +EvolutionAnimation: ; 4e5e1 + push hl + push de + push bc + ld a, [wCurSpecies] + push af + ld a, [rOBP0] + push af + ld a, [wBaseDexNo] + push af + + call .EvolutionAnimation + + pop af + ld [wBaseDexNo], a + pop af + ld [rOBP0], a + pop af + ld [wCurSpecies], a + pop bc + pop de + pop hl + + ld a, [wEvolutionCanceled] + and a + ret z + + scf + ret +; 4e607 + +.EvolutionAnimation: ; 4e607 + ld a, %11100100 + ld [rOBP0], a + + ld de, MUSIC_NONE + call PlayMusic + + farcall ClearSpriteAnims + + ld de, .GFX + ld hl, vTiles0 + lb bc, BANK(.GFX), 8 + call Request2bpp + + xor a + ld [wLowHealthAlarm], a + call WaitBGMap + xor a + ld [hBGMapMode], a + ld a, [wEvolutionOldSpecies] + ld [wPlayerHPPal], a + + ld c, $0 + call .GetSGBLayout + ld a, [wEvolutionOldSpecies] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call .PlaceFrontpic + + ld de, vTiles2 + ld hl, vTiles2 tile $31 + ld bc, 7 * 7 + call Request2bpp + + ld a, 7 * 7 + ld [wEvolutionPicOffset], a + call .ReplaceFrontpic + ld a, [wEvolutionNewSpecies] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call .LoadFrontpic + ld a, [wEvolutionOldSpecies] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + + ld a, $1 + ld [hBGMapMode], a + call .check_statused + jr c, .skip_cry + + ld a, [wEvolutionOldSpecies] + call PlayMonCry + +.skip_cry + ld de, MUSIC_EVOLUTION + call PlayMusic + + ld c, 80 + call DelayFrames + + ld c, $1 + call .GetSGBLayout + call .AnimationSequence + jr c, .cancel_evo + + ld a, -7 * 7 + ld [wEvolutionPicOffset], a + call .ReplaceFrontpic + xor a + ld [wEvolutionCanceled], a + + ld a, [wEvolutionNewSpecies] + ld [wPlayerHPPal], a + + ld c, $0 + call .GetSGBLayout + call .PlayEvolvedSFX + farcall ClearSpriteAnims + call .check_statused + jr c, .no_anim + + ld a, [wBoxAlignment] + push af + ld a, $1 + ld [wBoxAlignment], a + ld a, [wCurPartySpecies] + push af + + ld a, [wPlayerHPPal] + ld [wCurPartySpecies], a + hlcoord 7, 2 + ld d, $0 + ld e, ANIM_MON_EVOLVE + predef AnimateFrontpic + + pop af + ld [wCurPartySpecies], a + pop af + ld [wBoxAlignment], a + ret + +.no_anim + ret + +.cancel_evo + ld a, $1 + ld [wEvolutionCanceled], a + + ld a, [wEvolutionOldSpecies] + ld [wPlayerHPPal], a + + ld c, $0 + call .GetSGBLayout + call .PlayEvolvedSFX + farcall ClearSpriteAnims + call .check_statused + ret c + + ld a, [wPlayerHPPal] + call PlayMonCry + ret +; 4e703 + +.GetSGBLayout: ; 4e703 + ld b, SCGB_EVOLUTION + jp GetSGBLayout +; 4e708 + +.PlaceFrontpic: ; 4e708 + call GetBaseData + hlcoord 7, 2 + jp PrepMonFrontpic +; 4e711 + +.LoadFrontpic: ; 4e711 + call GetBaseData + ld a, $1 + ld [wBoxAlignment], a + ld de, vTiles2 + predef GetAnimatedFrontpic + xor a + ld [wBoxAlignment], a + ret +; 4e726 + +.AnimationSequence: ; 4e726 + call ClearJoypad + lb bc, 1, 2 * 7 ; flash b times, wait c frames in between +.loop + push bc + call .WaitFrames_CheckPressedB + pop bc + jr c, .exit_sequence + push bc + call .Flash + pop bc + inc b + dec c + dec c + jr nz, .loop + and a + ret + +.exit_sequence + scf + ret +; 4e741 + +.Flash: ; 4e741 + ld a, -7 * 7 ; new stage + ld [wEvolutionPicOffset], a + call .ReplaceFrontpic + ld a, 7 * 7 ; previous stage + ld [wEvolutionPicOffset], a + call .ReplaceFrontpic + dec b + jr nz, .Flash + ret +; 4e755 + +.ReplaceFrontpic: ; 4e755 + push bc + xor a + ld [hBGMapMode], a + hlcoord 7, 2 + lb bc, 7, 7 + ld de, SCREEN_WIDTH - 7 +.loop1 + push bc +.loop2 + ld a, [wEvolutionPicOffset] + add [hl] + ld [hli], a + dec c + jr nz, .loop2 + pop bc + add hl, de + dec b + jr nz, .loop1 + ld a, $1 + ld [hBGMapMode], a + call WaitBGMap + pop bc + ret +; 4e779 + +.WaitFrames_CheckPressedB: ; 4e779 + call DelayFrame + push bc + call JoyTextDelay + ld a, [hJoyDown] + pop bc + and B_BUTTON + jr nz, .pressed_b +.loop3 + dec c + jr nz, .WaitFrames_CheckPressedB + and a + ret + +.pressed_b + ld a, [wForceEvolution] + and a + jr nz, .loop3 + scf + ret +; 4e794 + +.check_statused ; 4e794 + ld a, [wCurPartyMon] + ld hl, wPartyMon1Species + call GetPartyLocation + ld b, h + ld c, l + farcall CheckFaintedFrzSlp + ret +; 4e7a6 + +.PlayEvolvedSFX: ; 4e7a6 + ld a, [wEvolutionCanceled] + and a + ret nz + ld de, SFX_EVOLVED + call PlaySFX + ld hl, wJumptableIndex + ld a, [hl] + push af + ld [hl], $0 +.loop4 + call .balls_of_light + jr nc, .done + call .AnimateBallsOfLight + jr .loop4 + +.done + ld c, 32 +.loop5 + call .AnimateBallsOfLight + dec c + jr nz, .loop5 + pop af + ld [wJumptableIndex], a + ret +; 4e7cf + +.balls_of_light ; 4e7cf + ld hl, wJumptableIndex + ld a, [hl] + cp 32 + ret nc + ld d, a + inc [hl] + and $1 + jr nz, .done_balls + ld e, $0 + call .GenerateBallOfLight + ld e, $10 + call .GenerateBallOfLight + +.done_balls + scf + ret +; 4e7e8 + +.GenerateBallOfLight: ; 4e7e8 + push de + depixel 9, 11 + ld a, SPRITE_ANIM_INDEX_EVOLUTION_BALL_OF_LIGHT + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [wJumptableIndex] + and %1110 + sla a + pop de + add e + ld [hl], a + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], $0 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $10 + ret +; 4e80c + +.AnimateBallsOfLight: ; 4e80c + push bc + callfar PlaySpriteAnimations + ; a = (([hVBlankCounter] + 4) / 2) % NUM_PALETTES + ld a, [hVBlankCounter] + and %1110 + srl a + inc a + inc a + and $7 + ld b, a + ld hl, wVirtualOAMSprite00Attributes + ld c, NUM_SPRITE_OAM_STRUCTS +.loop6 + ld a, [hl] + or b + ld [hli], a ; attributes +rept SPRITEOAMSTRUCT_LENGTH + -1 + inc hl +endr + dec c + jr nz, .loop6 + pop bc + call DelayFrame + ret +; 4e831 + + +.GFX: +INCBIN "gfx/evo/bubble_large.2bpp" +INCBIN "gfx/evo/bubble.2bpp" diff --git a/engine/gfx/gbc_only.asm b/engine/gfx/gbc_only.asm new file mode 100644 index 000000000..badd953aa --- /dev/null +++ b/engine/gfx/gbc_only.asm @@ -0,0 +1,149 @@ +GBCOnlyScreen: ; 4ea82 + + ld a, [hCGB] + and a + ret nz + + ld de, MUSIC_NONE + call PlayMusic + + call ClearTileMap + + ld hl, GBCOnlyGFX + ld de, wGBCOnlyDecompressBuffer + ld a, [rSVBK] + push af + ld a, 0 ; this has the same effect as selecting bank 1 + ld [rSVBK], a + call Decompress + pop af + ld [rSVBK], a + + ld de, wGBCOnlyDecompressBuffer + ld hl, vTiles2 + lb bc, BANK(GBCOnlyGFX), 84 + call Get2bpp + + ld de, Font + ld hl, vTiles1 + lb bc, BANK(Font), $80 + call Get1bpp + + call DrawGBCOnlyScreen + + call WaitBGMap + +; better luck next time +.loop + call DelayFrame + jr .loop +; 4eac5 + + +DrawGBCOnlyScreen: ; 4eac5 + + call DrawGBCOnlyBorder + + ; Pokemon + hlcoord 3, 2 + ld b, 14 + ld c, 4 + ld a, $8 + call DrawGBCOnlyGraphic + + ; Crystal + hlcoord 5, 6 + ld b, 10 + ld c, 2 + ld a, $40 + call DrawGBCOnlyGraphic + + ld de, GBCOnlyString + hlcoord 1, 10 + call PlaceString + + ret +; 4eaea + + +DrawGBCOnlyBorder: ; 4eaea + + hlcoord 0, 0 + ld [hl], 0 ; top-left + + inc hl + ld a, 1 ; top + call .FillRow + + ld [hl], 2 ; top-right + + hlcoord 0, 1 + ld a, 3 ; left + call .FillColumn + + hlcoord 19, 1 + ld a, 4 ; right + call .FillColumn + + hlcoord 0, 17 + ld [hl], 5 ; bottom-left + + inc hl + ld a, 6 ; bottom + call .FillRow + + ld [hl], 7 ; bottom-right + ret +; 4eb15 + +.FillRow: ; 4eb15 + ld c, SCREEN_WIDTH - 2 +.next_column + ld [hli], a + dec c + jr nz, .next_column + ret +; 4eb1c + +.FillColumn: ; 4eb1c + ld de, SCREEN_WIDTH + ld c, SCREEN_HEIGHT - 2 +.next_row + ld [hl], a + add hl, de + dec c + jr nz, .next_row + ret +; 4eb27 + + +DrawGBCOnlyGraphic: ; 4eb27 + ld de, SCREEN_WIDTH +.y + push bc + push hl +.x + ld [hli], a + inc a + dec b + jr nz, .x + pop hl + add hl, de + pop bc + dec c + jr nz, .y + ret +; 4eb38 + + +GBCOnlyString: ; 4eb38 + db "This Game Pak is" + next "designed only for" + next "use on the" + next "Game Boy Color.@" +; 4eb76 + + +GBCOnlyGFX: ; 4eb76 +INCBIN "gfx/sgb/gbc_only.2bpp.lz" +; 4f0bc diff --git a/engine/gfx/load_font.asm b/engine/gfx/load_font.asm new file mode 100644 index 000000000..40dbb9c10 --- /dev/null +++ b/engine/gfx/load_font.asm @@ -0,0 +1,156 @@ +INCLUDE "gfx/font.asm" + +; This and the following two functions are unreferenced. +; Debug, perhaps? +Unreferenced_fb434: + db 0 + +Unreferenced_Functionfb435: ; 4b435 + ld a, [Unreferenced_fb434] + and a + jp nz, Get1bpp_2 + jp Get1bpp +; fb43f + +Unreferenced_Functionfb43f: ; fb43f + ld a, [Unreferenced_fb434] + and a + jp nz, Get2bpp_2 + jp Get2bpp +; End unreferenced block +; fb449 + +_LoadStandardFont:: ; fb449 + ld de, Font + ld hl, vTiles1 + lb bc, BANK(Font), 128 ; "A" to "9" + ld a, [rLCDC] + bit rLCDC_ENABLE, a + jp z, Copy1bpp + + ld de, Font + ld hl, vTiles1 + lb bc, BANK(Font), 32 ; "A" to "]" + call Get1bpp_2 + ld de, Font + 32 * LEN_1BPP_TILE + ld hl, vTiles1 tile $20 + lb bc, BANK(Font), 32 ; "a" to $bf + call Get1bpp_2 + ld de, Font + 64 * LEN_1BPP_TILE + ld hl, vTiles1 tile $40 + lb bc, BANK(Font), 32 ; "Ä" to "←" + call Get1bpp_2 + ld de, Font + 96 * LEN_1BPP_TILE + ld hl, vTiles1 tile $60 + lb bc, BANK(Font), 32 ; "'" to "9" + call Get1bpp_2 + ret +; fb48a + +_LoadFontsExtra1:: ; fb48a + ld de, FontsExtra_SolidBlackGFX + ld hl, vTiles2 tile "■" ; $60 + lb bc, BANK(FontsExtra_SolidBlackGFX), 1 + call Get1bpp_2 + ld de, PokegearPhoneIconGFX + ld hl, vTiles2 tile "☎" ; $62 + lb bc, BANK(PokegearPhoneIconGFX), 1 + call Get2bpp_2 + ld de, FontExtra + 3 tiles ; "" + ld hl, vTiles2 tile "" + lb bc, BANK(FontExtra), 22 ; "" to "ぉ" + call Get2bpp_2 + jr LoadFrame +; fb4b0 + +_LoadFontsExtra2:: ; fb4b0 + ld de, FontsExtra2_UpArrowGFX + ld hl, vTiles2 tile "▲" ; $61 + ld b, BANK(FontsExtra2_UpArrowGFX) + ld c, 1 + call Get2bpp_2 + ret +; fb4be + +_LoadFontsBattleExtra:: ; fb4be + ld de, FontBattleExtra + ld hl, vTiles2 tile $60 + lb bc, BANK(FontBattleExtra), 25 + call Get2bpp_2 + jr LoadFrame +; fb4cc + +LoadFrame: ; fb4cc + ld a, [wTextBoxFrame] + maskbits NUM_FRAMES + ld bc, 6 * LEN_1BPP_TILE + ld hl, Frames + call AddNTimes + ld d, h + ld e, l + ld hl, vTiles2 tile "┌" ; $79 + lb bc, BANK(Frames), 6 ; "┌" to "┘" + call Get1bpp_2 + ld hl, vTiles2 tile " " ; $7f + ld de, TextBoxSpaceGFX + lb bc, BANK(TextBoxSpaceGFX), 1 + call Get1bpp_2 + ret +; fb4f2 + +LoadBattleFontsHPBar: ; fb4f2 + ld de, FontBattleExtra + ld hl, vTiles2 tile $60 + lb bc, BANK(FontBattleExtra), 12 + call Get2bpp_2 + ld hl, vTiles2 tile $70 + ld de, FontBattleExtra + 16 tiles ; "" + lb bc, BANK(FontBattleExtra), 3 ; "" to "『" + call Get2bpp_2 + call LoadFrame + +LoadHPBar: ; fb50d + ld de, EnemyHPBarBorderGFX + ld hl, vTiles2 tile $6c + lb bc, BANK(EnemyHPBarBorderGFX), 4 + call Get1bpp_2 + ld de, HPExpBarBorderGFX + ld hl, vTiles2 tile $73 + lb bc, BANK(HPExpBarBorderGFX), 6 + call Get1bpp_2 + ld de, ExpBarGFX + ld hl, vTiles2 tile $55 + lb bc, BANK(ExpBarGFX), 9 + call Get2bpp_2 + ld de, MobilePhoneTilesGFX + 7 tiles ; mobile phone icon + ld hl, vTiles2 tile $5e + lb bc, BANK(MobilePhoneTilesGFX), 2 + call Get2bpp_2 + ret +; fb53e + +StatsScreen_LoadFont: ; fb53e + call _LoadFontsBattleExtra + ld de, EnemyHPBarBorderGFX + ld hl, vTiles2 tile $6c + lb bc, BANK(EnemyHPBarBorderGFX), 4 + call Get1bpp_2 + ld de, HPExpBarBorderGFX + ld hl, vTiles2 tile $78 + lb bc, BANK(HPExpBarBorderGFX), 1 + call Get1bpp_2 + ld de, HPExpBarBorderGFX + 3 * LEN_1BPP_TILE + ld hl, vTiles2 tile $76 + lb bc, BANK(HPExpBarBorderGFX), 2 + call Get1bpp_2 + ld de, ExpBarGFX + ld hl, vTiles2 tile $55 + lb bc, BANK(ExpBarGFX), 8 + call Get2bpp_2 +LoadStatsScreenPageTilesGFX: ; fb571 + ld de, StatsScreenPageTilesGFX + ld hl, vTiles2 tile $31 + lb bc, BANK(StatsScreenPageTilesGFX), 17 + call Get2bpp_2 + ret +; fb57e diff --git a/engine/gfx/load_pics.asm b/engine/gfx/load_pics.asm new file mode 100755 index 000000000..b533ee56b --- /dev/null +++ b/engine/gfx/load_pics.asm @@ -0,0 +1,491 @@ +GetUnownLetter: ; 51040 +; Return Unown letter in wUnownLetter based on DVs at hl + +; Take the middle 2 bits of each DV and place them in order: +; atk def spd spc +; .ww..xx. .yy..zz. + + ; atk + ld a, [hl] + and %01100000 + sla a + ld b, a + ; def + ld a, [hli] + and %00000110 + swap a + srl a + or b + ld b, a + + ; spd + ld a, [hl] + and %01100000 + swap a + sla a + or b + ld b, a + ; spc + ld a, [hl] + and %00000110 + srl a + or b + +; Divide by 10 to get 0-25 + ld [hDividend + 3], a + xor a + ld [hDividend], a + ld [hDividend + 1], a + ld [hDividend + 2], a + ld a, $ff / NUM_UNOWN + 1 + ld [hDivisor], a + ld b, 4 + call Divide + +; Increment to get 1-26 + ld a, [hQuotient + 2] + inc a + ld [wUnownLetter], a + ret + +GetMonFrontpic: ; 51077 + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call IsAPokemon + ret c + ld a, [rSVBK] + push af + call _GetFrontpic + pop af + ld [rSVBK], a + ret + +GetAnimatedFrontpic: ; 5108b + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call IsAPokemon + ret c + ld a, [rSVBK] + push af + xor a + ld [hBGMapMode], a + call _GetFrontpic + call GetAnimatedEnemyFrontpic + pop af + ld [rSVBK], a + ret + +_GetFrontpic: ; 510a5 + push de + call GetBaseData + ld a, [wBasePicSize] + and $f + ld b, a + push bc + call GetFrontpicPointer + ld a, BANK(wDecompressEnemyFrontpic) + ld [rSVBK], a + ld a, b + ld de, wDecompressEnemyFrontpic + call FarDecompress + pop bc + ld hl, wDecompressScratch + ld de, wDecompressEnemyFrontpic + call PadFrontpic + pop hl + push hl + ld de, wDecompressScratch + ld c, 7 * 7 + ld a, [hROMBank] + ld b, a + call Get2bpp + pop hl + ret + +GetFrontpicPointer: ; 510d7 + ld a, [wCurPartySpecies] + cp UNOWN + jr z, .unown + ld a, [wCurPartySpecies] + ld d, BANK(PokemonPicPointers) + jr .ok + +.unown + ld a, [wUnownLetter] + ld d, BANK(UnownPicPointers) + +.ok + ld hl, PokemonPicPointers ; UnownPicPointers + dec a + ld bc, 6 + call AddNTimes + ld a, d + call GetFarByte + call FixPicBank + push af + inc hl + ld a, d + call GetFarHalfword + pop bc + ret + +GetAnimatedEnemyFrontpic: ; 51103 + ld a, BANK(vTiles3) + ld [rVBK], a + push hl + ld de, wDecompressScratch + ld c, 7 * 7 + ld a, [hROMBank] + ld b, a + call Get2bpp + pop hl + ld de, 7 * 7 tiles + add hl, de + push hl + ld a, BANK(wBasePicSize) + ld hl, wBasePicSize + call GetFarWRAMByte + pop hl + and $f + ld de, wDecompressEnemyFrontpic + 5 * 5 tiles + ld c, 5 * 5 + cp 5 + jr z, .got_dims + ld de, wDecompressEnemyFrontpic + 6 * 6 tiles + ld c, 6 * 6 + cp 6 + jr z, .got_dims + ld de, wDecompressEnemyFrontpic + 7 * 7 tiles + ld c, 7 * 7 +.got_dims + + push hl + push bc + call LoadFrontpicTiles + pop bc + pop hl + ld de, wDecompressScratch + ld a, [hROMBank] + ld b, a + call Get2bpp + xor a + ld [rVBK], a + ret + +LoadFrontpicTiles: ; 5114f + ld hl, wDecompressScratch + swap c + ld a, c + and $f + ld b, a + ld a, c + and $f0 + ld c, a + push bc + call LoadOrientedFrontpic + pop bc +.loop + push bc + ld c, 0 + call LoadOrientedFrontpic + pop bc + dec b + jr nz, .loop + ret + +GetMonBackpic: ; 5116c + ld a, [wCurPartySpecies] + call IsAPokemon + ret c + + ld a, [wCurPartySpecies] + ld b, a + ld a, [wUnownLetter] + ld c, a + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + push de + + ; These are assumed to be at the same address in their respective banks. + ld hl, PokemonPicPointers ; UnownPicPointers + ld a, b + ld d, BANK(PokemonPicPointers) + cp UNOWN + jr nz, .ok + ld a, c + ld d, BANK(UnownPicPointers) +.ok + dec a + ld bc, 6 + call AddNTimes + ld bc, 3 + add hl, bc + ld a, d + call GetFarByte + call FixPicBank + push af + inc hl + ld a, d + call GetFarHalfword + ld de, wDecompressScratch + pop af + call FarDecompress + ld hl, wDecompressScratch + ld c, 6 * 6 + call FixBackpicAlignment + pop hl + ld de, wDecompressScratch + ld a, [hROMBank] + ld b, a + call Get2bpp + pop af + ld [rSVBK], a + ret + +FixPicBank: ; 511c5 +; This is a thing for some reason. + +PICS_FIX EQU $36 +GLOBAL PICS_FIX + + push hl + push bc + sub BANK(Pics_1) - PICS_FIX + ld c, a + ld b, 0 + ld hl, .PicsBanks + add hl, bc + ld a, [hl] + pop bc + pop hl + ret + +.PicsBanks: ; 511d4 + db BANK(Pics_1) + 0 + db BANK(Pics_1) + 1 + db BANK(Pics_1) + 2 + db BANK(Pics_1) + 3 + db BANK(Pics_1) + 4 + db BANK(Pics_1) + 5 + db BANK(Pics_1) + 6 + db BANK(Pics_1) + 7 + db BANK(Pics_1) + 8 + db BANK(Pics_1) + 9 + db BANK(Pics_1) + 10 + db BANK(Pics_1) + 11 + db BANK(Pics_1) + 12 + db BANK(Pics_1) + 13 + db BANK(Pics_1) + 14 + db BANK(Pics_1) + 15 + db BANK(Pics_1) + 16 + db BANK(Pics_1) + 17 + db BANK(Pics_1) + 18 + db BANK(Pics_1) + 19 + db BANK(Pics_1) + 20 + db BANK(Pics_1) + 21 + db BANK(Pics_1) + 22 + db BANK(Pics_1) + 23 + +Function511ec: ; 511ec + ld a, c + push de + ld hl, PokemonPicPointers + dec a + ld bc, 6 + call AddNTimes + ld a, BANK(PokemonPicPointers) + call GetFarByte + call FixPicBank + push af + inc hl + ld a, BANK(PokemonPicPointers) + call GetFarHalfword + pop af + pop de + call FarDecompress + ret + +GetTrainerPic: ; 5120d + ld a, [wTrainerClass] + and a + ret z + cp NUM_TRAINER_CLASSES + ret nc + call WaitBGMap + xor a + ld [hBGMapMode], a + ld hl, TrainerPicPointers + ld a, [wTrainerClass] + dec a + ld bc, 3 + call AddNTimes + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + push de + ld a, BANK(TrainerPicPointers) + call GetFarByte + call FixPicBank + push af + inc hl + ld a, BANK(TrainerPicPointers) + call GetFarHalfword + pop af + ld de, wDecompressScratch + call FarDecompress + pop hl + ld de, wDecompressScratch + ld c, 7 * 7 + ld a, [hROMBank] + ld b, a + call Get2bpp + pop af + ld [rSVBK], a + call WaitBGMap + ld a, $1 + ld [hBGMapMode], a + ret + +DecompressGet2bpp: ; 5125d +; Decompress lz data from b:hl to scratch space at 6:d000, then copy it to address de. + + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + push de + push bc + ld a, b + ld de, wDecompressScratch + call FarDecompress + pop bc + ld de, wDecompressScratch + pop hl + ld a, [hROMBank] + ld b, a + call Get2bpp + + pop af + ld [rSVBK], a + ret + +FixBackpicAlignment: ; 5127c + push de + push bc + ld a, [wBoxAlignment] + and a + jr z, .keep_dims + ld a, c + cp 7 * 7 + ld de, 7 * 7 tiles + jr z, .got_dims + cp 6 * 6 + ld de, 6 * 6 tiles + jr z, .got_dims + ld de, 5 * 5 tiles + +.got_dims + ld a, [hl] + ld b, 0 + ld c, 8 +.loop + rra + rl b + dec c + jr nz, .loop + ld a, b + ld [hli], a + dec de + ld a, e + or d + jr nz, .got_dims + +.keep_dims + pop bc + pop de + ret + +PadFrontpic: ; 512ab +; pads frontpic to fill 7x7 box + ld a, b + cp 6 + jr z, .six + cp 5 + jr z, .five + +.seven_loop + ld c, $70 + call LoadOrientedFrontpic + dec b + jr nz, .seven_loop + ret + +.six + ld c, $70 + xor a + call .Fill +.six_loop + ld c, $10 + xor a + call .Fill + ld c, $60 + call LoadOrientedFrontpic + dec b + jr nz, .six_loop + ret + +.five + ld c, $70 + xor a + call .Fill +.five_loop + ld c, $20 + xor a + call .Fill + ld c, $50 + call LoadOrientedFrontpic + dec b + jr nz, .five_loop + ld c, $70 + xor a + call .Fill + ret + +.Fill: + ld [hli], a + dec c + jr nz, .Fill + ret + +LoadOrientedFrontpic: ; 512f2 + ld a, [wBoxAlignment] + and a + jr nz, .x_flip +.left_loop + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .left_loop + ret + +.x_flip + push bc +.right_loop + ld a, [de] + inc de + ld b, a + xor a +rept 8 + rr b + rla +endr + ld [hli], a + dec c + jr nz, .right_loop + pop bc + ret diff --git a/engine/gfx/map_palettes.asm b/engine/gfx/map_palettes.asm new file mode 100644 index 000000000..a9d2b382f --- /dev/null +++ b/engine/gfx/map_palettes.asm @@ -0,0 +1,86 @@ +SwapTextboxPalettes:: ; 4c000 + hlcoord 0, 0 + decoord 0, 0, wAttrMap + ld b, SCREEN_HEIGHT +.loop + push bc + ld c, SCREEN_WIDTH +.innerloop + ld a, [hl] + push hl + srl a + jr c, .UpperNybble + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + and $f + jr .next + +.UpperNybble: + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + swap a + and $f + +.next + pop hl + ld [de], a + res 7, [hl] + inc hl + inc de + dec c + jr nz, .innerloop + pop bc + dec b + jr nz, .loop + ret + +ScrollBGMapPalettes:: ; 4c03f + ld hl, wBGMapBuffer + ld de, wBGMapPalBuffer +.loop + ld a, [hl] + push hl + srl a + jr c, .UpperNybble + +; .LowerNybble + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + and $f + jr .next + +.UpperNybble: + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + swap a + and $f + +.next + pop hl + ld [de], a + res 7, [hl] + inc hl + inc de + dec c + jr nz, .loop + ret diff --git a/engine/gfx/mapgroup_roofs.asm b/engine/gfx/mapgroup_roofs.asm new file mode 100644 index 000000000..58e5e7cfe --- /dev/null +++ b/engine/gfx/mapgroup_roofs.asm @@ -0,0 +1,20 @@ +LoadMapGroupRoof:: ; 1c000 + ld a, [wMapGroup] + ld e, a + ld d, 0 + ld hl, MapGroupRoofs + add hl, de + ld a, [hl] + cp -1 + ret z + ld hl, Roofs + ld bc, 9 tiles + call AddNTimes + ld de, vTiles2 tile $0a + ld bc, 9 tiles + call CopyBytes + ret +; 1c021 + + +INCLUDE "data/maps/roofs.asm" diff --git a/engine/gfx/mon_icons.asm b/engine/gfx/mon_icons.asm new file mode 100755 index 000000000..5a26d2d7c --- /dev/null +++ b/engine/gfx/mon_icons.asm @@ -0,0 +1,471 @@ +LoadOverworldMonIcon: ; 8e82b + ld a, e + call ReadMonMenuIcon + ld l, a + ld h, 0 + add hl, hl + ld de, IconPointers + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + ld b, BANK(Icons) + ld c, 8 + ret +; 8e83f + +LoadMenuMonIcon: ; 8e83f + push hl + push de + push bc + call .LoadIcon + pop bc + pop de + pop hl + ret +; 8e849 + +.LoadIcon: ; 8e849 + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 8e854 + + +.Jumptable: ; 8e854 (23:6854) + dw PartyMenu_InitAnimatedMonIcon ; party menu + dw NamingScreen_InitAnimatedMonIcon ; naming screen + dw MoveList_InitAnimatedMonIcon ; moves (?) + dw Trade_LoadMonIconGFX ; trade + dw Mobile_InitAnimatedMonIcon ; mobile + dw Mobile_InitPartyMenuBGPal71 ; mobile + dw .GetPartyMenuMonIcon ; unused + +.GetPartyMenuMonIcon: ; 8e862 (23:6862) + call InitPartyMenuIcon + call .GetPartyMonItemGFX + call SetPartyMonIconAnimSpeed + ret + +.GetPartyMonItemGFX: ; 8e86c (23:686c) + push bc + ld a, [hObjectStructIndexBuffer] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, [hl] + and a + jr z, .no_item + push hl + push bc + ld d, a + callfar ItemIsMail + pop bc + pop hl + jr c, .not_mail + ld a, $6 + jr .got_tile +.not_mail + ld a, $5 + ; jr .got_tile + +.no_item + ld a, $4 +.got_tile + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ret + +Mobile_InitAnimatedMonIcon: ; 8e898 (23:6898) + call PartyMenu_InitAnimatedMonIcon + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld a, SPRITE_ANIM_SEQ_NULL + ld [hl], a + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, 9 * 8 + ld [hl], a + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, 9 * 8 + ld [hl], a + ret + +Mobile_InitPartyMenuBGPal71: ; 8e8b1 (23:68b1) + call InitPartyMenuIcon + call SetPartyMonIconAnimSpeed + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld a, SPRITE_ANIM_SEQ_NULL + ld [hl], a + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, 3 * 8 + ld [hl], a + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, 12 * 8 + ld [hl], a + ld a, c + ld [wc608], a + ld a, b + ld [wc608 + 1], a + ret + +PartyMenu_InitAnimatedMonIcon: ; 8e8d5 (23:68d5) + call InitPartyMenuIcon + call .SpawnItemIcon + call SetPartyMonIconAnimSpeed + ret + +.SpawnItemIcon: ; 8e8df (23:68df) + push bc + ld a, [hObjectStructIndexBuffer] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, [hl] + and a + ret z + push hl + push bc + ld d, a + callfar ItemIsMail + pop bc + pop hl + jr c, .mail + ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_ITEM + jr .okay + +.mail + ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_MAIL +.okay + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ret + +InitPartyMenuIcon: ; 8e908 (23:6908) + ld a, [wCurIconTile] + push af + ld a, [hObjectStructIndexBuffer] + ld hl, wPartySpecies + ld e, a + ld d, $0 + add hl, de + ld a, [hl] + call ReadMonMenuIcon + ld [wCurIcon], a + call GetMemIconGFX + ld a, [hObjectStructIndexBuffer] +; y coord + add a + add a + add a + add a + add $1c + ld d, a +; x coord + ld e, $10 +; type is partymon icon + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call InitSpriteAnimStruct + pop af + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], a + ret + +SetPartyMonIconAnimSpeed: ; 8e936 (23:6936) + push bc + ld a, [hObjectStructIndexBuffer] + ld b, a + call .getspeed + ld a, b + pop bc + ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET + add hl, bc + ld [hl], a + rlca + rlca + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], a + ret + +.getspeed ; 8e94c (23:694c) + farcall PlacePartymonHPBar + call GetHPPal + ld e, d + ld d, 0 + ld hl, .speeds + add hl, de + ld b, [hl] + ret +; 8e95e (23:695e) + +.speeds ; 8e95e + db $00 ; HP_GREEN + db $40 ; HP_YELLOW + db $80 ; HP_RED +; 8e961 + +NamingScreen_InitAnimatedMonIcon: ; 8e961 (23:6961) + ld a, [wd265] + call ReadMonMenuIcon + ld [wCurIcon], a + xor a + call GetIconGFX + depixel 4, 4, 4, 0 + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_NULL + ret + +MoveList_InitAnimatedMonIcon: ; 8e97d (23:697d) + ld a, [wd265] + call ReadMonMenuIcon + ld [wCurIcon], a + xor a + call GetIconGFX + ld d, 3 * 8 + 2 ; depixel 3, 4, 2, 4 + ld e, 4 * 8 + 4 + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_NULL + ret + +Trade_LoadMonIconGFX: ; 8e99a (23:699a) + ld a, [wd265] + call ReadMonMenuIcon + ld [wCurIcon], a + ld a, $62 + ld [wCurIconTile], a + call GetMemIconGFX + ret + +GetSpeciesIcon: ; 8e9ac +; Load species icon into VRAM at tile a + push de + ld a, [wd265] + call ReadMonMenuIcon + ld [wCurIcon], a + pop de + ld a, e + call GetIconGFX + ret +; 8e9bc + + +FlyFunction_GetMonIcon: ; 8e9bc (23:69bc) + push de + ld a, [wd265] + call ReadMonMenuIcon + ld [wCurIcon], a + pop de + ld a, e + call GetIcon_a + ret +; 8e9cc (23:69cc) + +Unreferenced_GetMonIcon2: ; 8e9cc + push de + ld a, [wd265] + call ReadMonMenuIcon + ld [wCurIcon], a + pop de + call GetIcon_de + ret +; 8e9db + +GetMemIconGFX: ; 8e9db (23:69db) + ld a, [wCurIconTile] +GetIconGFX: ; 8e9de + call GetIcon_a + ld de, 8 tiles + add hl, de + ld de, HeldItemIcons + lb bc, BANK(HeldItemIcons), 2 + call GetGFXUnlessMobile + ld a, [wCurIconTile] + add 10 + ld [wCurIconTile], a + ret + +HeldItemIcons: +INCBIN "gfx/icons/mail.2bpp" +INCBIN "gfx/icons/item.2bpp" +; 8ea17 + +GetIcon_de: ; 8ea17 +; Load icon graphics into VRAM starting from tile de. + ld l, e + ld h, d + jr GetIcon + +GetIcon_a: ; 8ea1b +; Load icon graphics into VRAM starting from tile a. + ld l, a + ld h, 0 + +GetIcon: ; 8ea1e +; Load icon graphics into VRAM starting from tile hl. + +; One tile is 16 bytes long. +rept 4 + add hl, hl +endr + + ld de, vTiles0 + add hl, de + push hl + +; The icons are contiguous, in order and of the same +; size, so the pointer table is somewhat redundant. + ld a, [wCurIcon] + push hl + ld l, a + ld h, 0 + add hl, hl + ld de, IconPointers + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + + lb bc, BANK(Icons), 8 + call GetGFXUnlessMobile + + pop hl + ret +; 8ea3f + +GetGFXUnlessMobile: ; 8ea3f + ld a, [wLinkMode] + cp LINK_MOBILE + jp nz, Request2bpp + jp Get2bpp_2 +; 8ea4a + +FreezeMonIcons: ; 8ea4a + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH + ld a, [wMenuCursorY] + ld d, a +.loop + ld a, [hl] + and a + jr z, .next + cp d + jr z, .loadwithtwo + ld a, SPRITE_ANIM_SEQ_NULL + jr .ok + +.loadwithtwo + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH + +.ok + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], a + pop hl + +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret +; 8ea71 + +UnfreezeMonIcons: ; 8ea71 + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH +.loop + ld a, [hl] + and a + jr z, .next + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], SPRITE_ANIM_SEQ_PARTY_MON + pop hl +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret +; 8ea8c (23:6a8c) + +HoldSwitchmonIcon: ; 8ea8c + ld hl, wSpriteAnimationStructs + ld e, PARTY_LENGTH + ld a, [wSwitchMon] + ld d, a +.loop + ld a, [hl] + and a + jr z, .next + cp d + jr z, .is_switchmon + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SELECTED + jr .join_back + +.is_switchmon + ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH +.join_back + push hl + ld c, l + ld b, h + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], a + pop hl +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +ReadMonMenuIcon: ; 8eab3 + cp EGG + jr z, .egg + dec a + ld hl, MonMenuIcons + ld e, a + ld d, 0 + add hl, de + ld a, [hl] + ret +.egg + ld a, ICON_EGG + ret +; 8eac4 + + +INCLUDE "data/pokemon/menu_icons.asm" + +INCLUDE "data/icon_pointers.asm" + +INCLUDE "gfx/icons.asm" diff --git a/engine/gfx/pic_animation.asm b/engine/gfx/pic_animation.asm new file mode 100644 index 000000000..8781c2fd0 --- /dev/null +++ b/engine/gfx/pic_animation.asm @@ -0,0 +1,1141 @@ +; Pic animation arrangement. + +Unused_AnimateMon_Slow_Normal: ; d0000 + hlcoord 12, 0 + ld a, [wBattleMode] + cp WILD_BATTLE + jr z, .wild + ld e, ANIM_MON_SLOW + ld d, $0 + call AnimateFrontpic + ret + +.wild + ld e, ANIM_MON_NORMAL + ld d, $0 + call AnimateFrontpic + ret +; d001a + +AnimateMon_Menu: ; d001a + ld e, ANIM_MON_MENU + ld d, $0 + call AnimateFrontpic + ret +; d0022 + +AnimateMon_Trade: ; d0022 + ld e, ANIM_MON_TRADE + ld d, $0 + call AnimateFrontpic + ret +; d002a + +AnimateMon_Evolve: ; d002a + ld e, ANIM_MON_EVOLVE + ld d, $0 + call AnimateFrontpic + ret +; d0032 + +AnimateMon_Hatch: ; d0032 + ld e, ANIM_MON_HATCH + ld d, $0 + call AnimateFrontpic + ret +; d003a + +AnimateMon_Unused: ; d003a + ld e, ANIM_MON_UNUSED + ld d, $0 + call AnimateFrontpic + ret +; d0042 + +pokeanim: MACRO + rept _NARG +; Workaround for a bug where macro args can't come after the start of a symbol +if !DEF(\1_POKEANIM) +\1_POKEANIM EQUS "PokeAnim_\1_" +endc + db (\1_POKEANIM - PokeAnim_SetupCommands) / 2 + shift + endr + db (PokeAnim_Finish_ - PokeAnim_SetupCommands) / 2 +ENDM + +PokeAnims: ; d0042 + dw .Slow + dw .Normal + dw .Menu + dw .Trade + dw .Evolve + dw .Hatch + dw .Unused ; same as .Menu + dw .Egg1 + dw .Egg2 + +.Slow: pokeanim StereoCry, Setup2, Play +.Normal: pokeanim StereoCry, Setup, Play +.Menu: pokeanim CryNoWait, Setup, Play, SetWait, Wait, Idle, Play +.Trade: pokeanim Idle, Play2, Idle, Play, SetWait, Wait, Cry, Setup, Play +.Evolve: pokeanim Idle, Play, SetWait, Wait, CryNoWait, Setup, Play +.Hatch: pokeanim Idle, Play, CryNoWait, Setup, Play, SetWait, Wait, Idle, Play +.Unused: pokeanim CryNoWait, Setup, Play, SetWait, Wait, Idle, Play +.Egg1: pokeanim Setup, Play +.Egg2: pokeanim Idle, Play + + +AnimateFrontpic: ; d008e + call AnimateMon_CheckIfPokemon + ret c + call LoadMonAnimation +.loop + call SetUpPokeAnim + push af + farcall HDMATransferTileMapToWRAMBank3 + pop af + jr nc, .loop + ret +; d00a3 + +LoadMonAnimation: ; d00a3 + push hl + ld c, e + ld b, 0 + ld hl, PokeAnims + add hl, bc + add hl, bc + ld a, [hli] + ld b, [hl] + ld c, a + pop hl + call PokeAnim_InitPicAttributes + ret +; d00b4 + +SetUpPokeAnim: ; d00b4 + ld a, [rSVBK] + push af + ld a, BANK(wPokeAnimSceneIndex) + ld [rSVBK], a + ld a, [wPokeAnimSceneIndex] + ld c, a + ld b, 0 + ld hl, wPokeAnimPointer + ld a, [hli] + ld h, [hl] + ld l, a + add hl, bc + ld a, [hl] + ld hl, PokeAnim_SetupCommands + rst JumpTable + ld a, [wPokeAnimSceneIndex] + ld c, a + pop af + ld [rSVBK], a + ld a, c + and $80 + ret z + scf + ret +; d00da + +PokeAnim_SetupCommands: ; d00da +setup_command: MACRO +\1_: dw \1 +ENDM + setup_command PokeAnim_Finish + setup_command PokeAnim_BasePic + setup_command PokeAnim_SetWait + setup_command PokeAnim_Wait + setup_command PokeAnim_Setup + setup_command PokeAnim_Setup2 + setup_command PokeAnim_Idle + setup_command PokeAnim_Play + setup_command PokeAnim_Play2 + setup_command PokeAnim_Cry + setup_command PokeAnim_CryNoWait + setup_command PokeAnim_StereoCry +; d00f2 + +PokeAnim_SetWait: ; d00f2 + ld a, 18 + ld [wPokeAnimWaitCounter], a + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + +PokeAnim_Wait: ; d00fe + ld hl, wPokeAnimWaitCounter + dec [hl] + ret nz + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d010b + +PokeAnim_Setup: ; d010b + ld c, FALSE + ld b, 0 + call PokeAnim_InitAnim + call PokeAnim_SetVBank1 + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d011d + +PokeAnim_Setup2: ; d011d + ld c, FALSE + ld b, 4 + call PokeAnim_InitAnim + call PokeAnim_SetVBank1 + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d012f + +PokeAnim_Idle: ; d012f + ld c, TRUE + ld b, 0 + call PokeAnim_InitAnim + call PokeAnim_SetVBank1 + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d0141 + +PokeAnim_Play: ; d0141 + call PokeAnim_DoAnimScript + ld a, [wPokeAnimJumptableIndex] + bit 7, a + ret z + call PokeAnim_PlaceGraphic + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d0155 + +PokeAnim_Play2: ; d0155 + call PokeAnim_DoAnimScript + ld a, [wPokeAnimJumptableIndex] + bit 7, a + ret z + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d0166 + +PokeAnim_BasePic: ; d0166 + call PokeAnim_DeinitFrames + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d0171 + +PokeAnim_Finish: ; d0171 + call PokeAnim_DeinitFrames + ld hl, wPokeAnimSceneIndex + set 7, [hl] + ret +; d017a + +PokeAnim_Cry: ; d017a + ld a, [wPokeAnimSpecies] + call _PlayMonCry + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d0188 + +PokeAnim_CryNoWait: ; d0188 + ld a, [wPokeAnimSpecies] + call PlayMonCry2 + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d0196 + +PokeAnim_StereoCry: ; d0196 + ld a, $f + ld [wCryTracks], a + ld a, [wPokeAnimSpecies] + call PlayStereoCry2 + ld a, [wPokeAnimSceneIndex] + inc a + ld [wPokeAnimSceneIndex], a + ret +; d01a9 + +PokeAnim_DeinitFrames: ; d01a9 + ld a, [rSVBK] + push af + ld a, BANK(wPokeAnimCoord) + ld [rSVBK], a + call PokeAnim_PlaceGraphic + farcall HDMATransferTileMapToWRAMBank3 + call PokeAnim_SetVBank0 + farcall HDMATransferAttrMapToWRAMBank3 + pop af + ld [rSVBK], a + ret +; d01c6 + +AnimateMon_CheckIfPokemon: ; d01c6 + ld a, [wCurPartySpecies] + cp EGG + jr z, .fail + call IsAPokemon + jr c, .fail + and a + ret + +.fail + scf + ret +; d01d6 + +PokeAnim_InitPicAttributes: ; d01d6 + ld a, [rSVBK] + push af + ld a, BANK(wPokeAnimSceneIndex) + ld [rSVBK], a + + push bc + push de + push hl + ld hl, wPokeAnimSceneIndex + ld bc, wPokeAnimStructEnd - wPokeAnimSceneIndex + xor a + call ByteFill + pop hl + pop de + pop bc + +; bc contains anim pointer + ld a, c + ld [wPokeAnimPointer], a + ld a, b + ld [wPokeAnimPointer + 1], a +; hl contains tilemap coords + ld a, l + ld [wPokeAnimCoord], a + ld a, h + ld [wPokeAnimCoord + 1], a +; d = start tile + ld a, d + ld [wPokeAnimGraphicStartTile], a + + ld a, BANK(wCurPartySpecies) + ld hl, wCurPartySpecies + call GetFarWRAMByte + ld [wPokeAnimSpecies], a + + ld a, BANK(wUnownLetter) + ld hl, wUnownLetter + call GetFarWRAMByte + ld [wPokeAnimUnownLetter], a + + call PokeAnim_GetSpeciesOrUnown + ld [wPokeAnimSpeciesOrUnown], a + + call PokeAnim_GetFrontpicDims + ld a, c + ld [wPokeAnimFrontpicHeight], a + + pop af + ld [rSVBK], a + ret +; d0228 + +PokeAnim_InitAnim: ; d0228 + ld a, [rSVBK] + push af + ld a, BANK(wPokeAnimIdleFlag) + ld [rSVBK], a + push bc + ld hl, wPokeAnimIdleFlag + ld bc, wPokeAnimStructEnd - wPokeAnimIdleFlag + xor a + call ByteFill + pop bc + ld a, b + ld [wPokeAnimSpeed], a + ld a, c + ld [wPokeAnimIdleFlag], a + call GetMonAnimPointer + call GetMonFramesPointer + call GetMonBitmaskPointer + pop af + ld [rSVBK], a + ret +; d0250 + +PokeAnim_DoAnimScript: ; d0250 + xor a + ld [hBGMapMode], a +.loop + ld a, [wPokeAnimJumptableIndex] + and $7f + ld hl, .Jumptable + rst JumpTable + ret +; d025d + +.Jumptable: ; d025d + dw .RunAnim + dw .WaitAnim +; d0261 + +.RunAnim: ; d0261 + call PokeAnim_GetPointer + ld a, [wPokeAnimCommand] + cp -1 + jr z, PokeAnim_End + cp -2 + jr z, .SetRepeat + cp -3 + jr z, .DoRepeat + call PokeAnim_GetFrame + ld a, [wPokeAnimParameter] + call PokeAnim_GetDuration + ld [wPokeAnimWaitCounter], a + call PokeAnim_StartWaitAnim +.WaitAnim: ; d0282 + ld a, [wPokeAnimWaitCounter] + dec a + ld [wPokeAnimWaitCounter], a + ret nz + call PokeAnim_StopWaitAnim + ret +; d028e + +.SetRepeat: ; d028e + ld a, [wPokeAnimParameter] + ld [wPokeAnimRepeatTimer], a + jr .loop +; d0296 + +.DoRepeat: ; d0296 + ld a, [wPokeAnimRepeatTimer] + and a + ret z + dec a + ld [wPokeAnimRepeatTimer], a + ret z + ld a, [wPokeAnimParameter] + ld [wPokeAnimFrame], a + jr .loop +; d02a8 + +PokeAnim_End: ; d02a8 + ld hl, wPokeAnimJumptableIndex + set 7, [hl] + ret +; d02ae + +PokeAnim_GetDuration: ; d02ae +; a * (1 + [wPokeAnimSpeed] / 16) + ld c, a + ld b, $0 + ld hl, 0 + ld a, [wPokeAnimSpeed] + call AddNTimes + ld a, h + swap a + and $f0 + ld h, a + ld a, l + swap a + and $f + or h + add c + ret +; d02c8 + +PokeAnim_GetFrame: ; d02c8 + call PokeAnim_PlaceGraphic + ld a, [wPokeAnimCommand] + and a + ret z + call PokeAnim_GetBitmaskIndex + push hl + call PokeAnim_CopyBitmaskToBuffer + pop hl + call PokeAnim_ConvertAndApplyBitmask + ret +; d02dc + +PokeAnim_StartWaitAnim: ; d02dc + ld a, [wPokeAnimJumptableIndex] + inc a + ld [wPokeAnimJumptableIndex], a + ret +; d02e4 + +PokeAnim_StopWaitAnim: ; d02e4 + ld a, [wPokeAnimJumptableIndex] + dec a + ld [wPokeAnimJumptableIndex], a + ret +; d02ec + +PokeAnim_IsUnown: ; d02ec + ld a, [wPokeAnimSpecies] + cp UNOWN + ret +; d02f2 + +PokeAnim_IsEgg: ; d02f2 + ld a, [wPokeAnimSpecies] + cp EGG + ret +; d02f8 + +PokeAnim_GetPointer: ; d02f8 + push hl + ld a, [wPokeAnimFrame] + ld e, a + ld d, $0 + ld hl, wPokeAnimPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + add hl, de + ld a, [wPokeAnimPointerBank] + call GetFarHalfword + ld a, l + ld [wPokeAnimCommand], a + ld a, h + ld [wPokeAnimParameter], a + ld hl, wPokeAnimFrame + inc [hl] + pop hl + ret +; d031b + +PokeAnim_GetBitmaskIndex: ; d031b + ld a, [wPokeAnimCommand] + dec a + ld c, a + ld b, $0 + ld hl, wPokeAnimFramesAddr + ld a, [hli] + ld h, [hl] + ld l, a + add hl, bc + add hl, bc + ld a, [wPokeAnimFramesBank] + call GetFarHalfword + ld a, [wPokeAnimFramesBank] + call GetFarByte + ld [wPokeAnimCurBitmask], a + inc hl + ret +; d033b + +PokeAnim_CopyBitmaskToBuffer: ; d033b + call .GetSize + push bc + ld hl, wPokeAnimBitmaskAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wPokeAnimCurBitmask] + call AddNTimes + pop bc + ld de, wPokeAnimBitmaskBuffer + ld a, [wPokeAnimBitmaskBank] + call FarCopyBytes + ret +; d0356 + +.GetSize: ; d0356 + push hl + ld a, [wPokeAnimFrontpicHeight] + sub 5 ; to get a number 0, 1, or 2 + ld c, a + ld b, 0 + ld hl, .Sizes + add hl, bc + ld c, [hl] + ld b, 0 + pop hl + ret +; d0368 + +.Sizes: db 4, 5, 7 + +poke_anim_box: MACRO +y = 7 +rept \1 +x = 7 + -\1 +rept \1 + db x + y +x = x + 1 +endr +y = y + 7 +endr +ENDM + +PokeAnim_ConvertAndApplyBitmask: ; d036b + xor a + ld [wPokeAnimBitmaskCurBit], a + ld [wPokeAnimBitmaskCurRow], a + ld [wPokeAnimBitmaskCurCol], a +.loop + push hl + call .IsCurBitSet + pop hl + ld a, b + and a + jr z, .next + + ld a, [wPokeAnimFramesBank] + call GetFarByte + inc hl + push hl + call .ApplyFrame + pop hl + +.next + push hl + call .NextBit + pop hl + jr nc, .loop + ret +; d0392 + +.IsCurBitSet: ; d0392 +; which byte + ld a, [wPokeAnimBitmaskCurBit] + and $f8 + rrca + rrca + rrca + ld e, a + ld d, 0 + ld hl, wPokeAnimBitmaskBuffer + add hl, de + ld b, [hl] +; which bit + ld a, [wPokeAnimBitmaskCurBit] + and $7 + jr z, .skip + + ld c, a + ld a, b +.loop2 + rrca + dec c + jr nz, .loop2 + ld b, a + +.skip + xor a + bit 0, b + jr z, .finish + ld a, 1 + +.finish + ld b, a + ld hl, wPokeAnimBitmaskCurBit + inc [hl] + ret +; d03bd + +.ApplyFrame: ; d03bd + push af + call .GetCoord + pop af + push hl + call .GetTilemap + ld hl, wPokeAnimGraphicStartTile + add [hl] + pop hl + ld [hl], a + ret +; d03cd + +.GetCoord: ; d03cd + call .GetStartCoord + ld a, [wPokeAnimBitmaskCurRow] + ld bc, SCREEN_WIDTH + call AddNTimes + ld a, [wBoxAlignment] + and a + jr nz, .go + ld a, [wPokeAnimBitmaskCurCol] + ld e, a + ld d, 0 + add hl, de + jr .skip2 + +.go + ld a, [wPokeAnimBitmaskCurCol] + ld e, a + ld a, l + sub e + ld l, a + ld a, h + sbc 0 + ld h, a + +.skip2 + ret +; d03f4 + +; unused + db 6, 5, 4 + +.GetTilemap: ; d03f7 + push af + ld a, [wPokeAnimFrontpicHeight] + cp 5 + jr z, .check_add_24 + cp 6 + jr z, .check_add_13 + pop af + ret + +.check_add_24 + pop af + cp 5 * 5 + jr nc, .add_24 + push hl + push de + ld hl, ._5by5 + ld e, a + ld d, 0 + add hl, de + ld a, [hl] + pop de + pop hl + ret + +.add_24 + add 24 + ret + +.check_add_13 + pop af + cp 6 * 6 + jr nc, .add_13 + push hl + push de + ld hl, ._6by6 + ld e, a + ld d, 0 + add hl, de + ld a, [hl] + pop de + pop hl + ret + +.add_13 + add 13 + ret +; d042f + +._5by5: + poke_anim_box 5 + ; db 9, 10, 11, 12, 13 + ; db 16, 17, 18, 19, 20 + ; db 23, 24, 25, 26, 27 + ; db 30, 31, 32, 33, 34 + ; db 37, 38, 39, 40, 41 + +._6by6: + poke_anim_box 6 + ; db 8, 9, 10, 11, 12, 13 + ; db 15, 16, 17, 18, 19, 20 + ; db 22, 23, 24, 25, 26, 27 + ; db 29, 30, 31, 32, 33, 34 + ; db 36, 37, 38, 39, 40, 41 + ; db 43, 44, 45, 46, 47, 48 + + +.GetStartCoord: ; d046c + ld hl, wPokeAnimCoord + ld a, [hli] + ld h, [hl] + ld l, a + + ld a, [wPokeAnimFrontpicHeight] + ld de, 0 + ld bc, 6 + cp 7 + jr z, .okay + ld de, SCREEN_WIDTH + 1 + ld bc, SCREEN_WIDTH + 5 + cp 6 + jr z, .okay + ld de, 2 * SCREEN_WIDTH + 1 + ld bc, 2 * SCREEN_WIDTH + 5 +.okay + + ld a, [wBoxAlignment] + and a + jr nz, .add_bc + add hl, de + ret + +.add_bc + add hl, bc + ret +; d0499 + +.NextBit: ; d0499 + ld a, [wPokeAnimBitmaskCurRow] + inc a + ld [wPokeAnimBitmaskCurRow], a + ld c, a + ld a, [wPokeAnimFrontpicHeight] + cp c + jr nz, .no_carry + xor a + ld [wPokeAnimBitmaskCurRow], a + ld a, [wPokeAnimBitmaskCurCol] + inc a + ld [wPokeAnimBitmaskCurCol], a + ld c, a + ld a, [wPokeAnimFrontpicHeight] + cp c + jr nz, .no_carry + scf + ret + +.no_carry + xor a + ret +; d04bd + +PokeAnim_PlaceGraphic: ; d04bd + call .ClearBox + ld a, [wBoxAlignment] + and a + jr nz, .flipped + ld de, 1 + ld bc, 0 + jr .okay + +.flipped + ld de, -1 + ld bc, 6 + +.okay + ld hl, wPokeAnimCoord + ld a, [hli] + ld h, [hl] + ld l, a + add hl, bc + ld c, 7 + ld b, 7 + ld a, [wPokeAnimGraphicStartTile] +.loop + push bc + push hl + push de + ld de, SCREEN_WIDTH +.loop2 + ld [hl], a + inc a + add hl, de + dec b + jr nz, .loop2 + pop de + pop hl + add hl, de + pop bc + dec c + jr nz, .loop + ret +; d04f6 + +.ClearBox: ; d04f6 + ld hl, wPokeAnimCoord + ld a, [hli] + ld h, [hl] + ld l, a + ld b, 7 + ld c, 7 + call ClearBox + ret +; d0504 + +PokeAnim_SetVBank1: ; d0504 + ld a, [rSVBK] + push af + ld a, BANK(wPokeAnimCoord) + ld [rSVBK], a + xor a + ld [hBGMapMode], a + call .SetFlag + farcall HDMATransferAttrMapToWRAMBank3 + pop af + ld [rSVBK], a + ret +; d051b + +.SetFlag: ; d051b + call PokeAnim_GetAttrMapCoord + ld b, 7 + ld c, 7 + ld de, SCREEN_WIDTH +.row + push bc + push hl +.col + ld a, [hl] + or 8 + ld [hl], a + add hl, de + dec c + jr nz, .col + pop hl + inc hl + pop bc + dec b + jr nz, .row + ret +; d0536 + +PokeAnim_SetVBank0: ; d0536 + call PokeAnim_GetAttrMapCoord + ld b, 7 + ld c, 7 + ld de, SCREEN_WIDTH +.row + push bc + push hl +.col + ld a, [hl] + and $f7 + ld [hl], a + add hl, de + dec c + jr nz, .col + pop hl + inc hl + pop bc + dec b + jr nz, .row + ret +; d0551 + +PokeAnim_GetAttrMapCoord: ; d0551 + ld hl, wPokeAnimCoord + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wAttrMap - wTileMap + add hl, de + ret +; d055c + +GetMonAnimPointer: ; d055c + call PokeAnim_IsEgg + jr z, .egg + + ld c, BANK(UnownAnimations) + ld hl, UnownAnimationPointers + ld de, UnownAnimationIdlePointers + call PokeAnim_IsUnown + jr z, .unown + ld c, BANK(PicAnimations) + ld hl, AnimationPointers + ld de, AnimationIdlePointers +.unown + + ld a, [wPokeAnimIdleFlag] + and a + jr z, .idles + ld h, d + ld l, e +.idles + + ld a, [wPokeAnimSpeciesOrUnown] + dec a + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, c + ld [wPokeAnimPointerBank], a + call GetFarHalfword + ld a, l + ld [wPokeAnimPointerAddr], a + ld a, h + ld [wPokeAnimPointerAddr + 1], a + ret + +.egg + ld hl, EggAnimation + ld c, BANK(EggAnimation) + ld a, [wPokeAnimIdleFlag] + and a + jr z, .idles_egg + ld hl, EggAnimationIdle + ld c, BANK(EggAnimationIdle) +.idles_egg + + ld a, c + ld [wPokeAnimPointerBank], a + ld a, l + ld [wPokeAnimPointerAddr], a + ld a, h + ld [wPokeAnimPointerAddr + 1], a + ret +; d05b4 + +PokeAnim_GetFrontpicDims: ; d05b4 + ld a, [rSVBK] + push af + ld a, BANK(wCurPartySpecies) + ld [rSVBK], a + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call GetBaseData + ld a, [wBasePicSize] + and $f + ld c, a + pop af + ld [rSVBK], a + ret +; d05ce + +GetMonFramesPointer: ; d05ce + call PokeAnim_IsEgg + jr z, .egg + + call PokeAnim_IsUnown + ld b, BANK(UnownFramesPointers) + ld c, BANK(UnownsFrames) + ld hl, UnownFramesPointers + jr z, .got_frames + ld a, [wPokeAnimSpecies] + cp JOHTO_POKEMON + ld b, BANK(FramesPointers) + ld c, BANK(KantoFrames) + ld hl, FramesPointers + jr c, .got_frames + ld c, BANK(JohtoFrames) +.got_frames + ld a, c + ld [wPokeAnimFramesBank], a + + ld a, [wPokeAnimSpeciesOrUnown] + dec a + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, b + call GetFarHalfword + ld a, l + ld [wPokeAnimFramesAddr], a + ld a, h + ld [wPokeAnimFramesAddr + 1], a + ret + +.egg + ld hl, EggFrames + ld c, BANK(EggFrames) + ld a, c + ld [wPokeAnimFramesBank], a + ld a, l + ld [wPokeAnimFramesAddr], a + ld a, h + ld [wPokeAnimFramesAddr + 1], a + ret +; d061b + +GetMonBitmaskPointer: ; d061b + call PokeAnim_IsEgg + jr z, .egg + + call PokeAnim_IsUnown + ld a, BANK(UnownBitmasksPointers) + ld hl, UnownBitmasksPointers + jr z, .unown + ld a, BANK(BitmasksPointers) + ld hl, BitmasksPointers +.unown + ld [wPokeAnimBitmaskBank], a + + ld a, [wPokeAnimSpeciesOrUnown] + dec a + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [wPokeAnimBitmaskBank] + call GetFarHalfword + ld a, l + ld [wPokeAnimBitmaskAddr], a + ld a, h + ld [wPokeAnimBitmaskAddr + 1], a + ret + +.egg + ld c, BANK(EggBitmasks) + ld hl, EggBitmasks + ld a, c + ld [wPokeAnimBitmaskBank], a + ld a, l + ld [wPokeAnimBitmaskAddr], a + ld a, h + ld [wPokeAnimBitmaskAddr + 1], a + ret +; d065c + +PokeAnim_GetSpeciesOrUnown: ; d065c + call PokeAnim_IsUnown + jr z, .unown + ld a, [wPokeAnimSpecies] + ret + +.unown + ld a, [wPokeAnimUnownLetter] + ret +; d0669 + +Unused_HOF_AnimateAlignedFrontpic: ; d0669 + ld a, $1 + ld [wBoxAlignment], a + +HOF_AnimateFrontpic: ; d066e + call AnimateMon_CheckIfPokemon + jr c, .fail + ld h, d + ld l, e + push bc + push hl + ld de, vTiles2 + predef GetAnimatedFrontpic + pop hl + pop bc + ld d, 0 + ld e, c + call AnimateFrontpic + xor a + ld [wBoxAlignment], a + ret + +.fail + xor a + ld [wBoxAlignment], a + inc a + ld [wCurPartySpecies], a + ret +; d0695 diff --git a/engine/gfx/player_gfx.asm b/engine/gfx/player_gfx.asm new file mode 100644 index 000000000..deb16ad3a --- /dev/null +++ b/engine/gfx/player_gfx.asm @@ -0,0 +1,224 @@ +Unreferenced_Function88248: ; 88248 + ld c, CAL + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .okay + ld c, KAREN + +.okay + ld a, c + ld [wTrainerClass], a + ret + +MovePlayerPicRight: ; 88258 + hlcoord 6, 4 + ld de, 1 + jr MovePlayerPic + +MovePlayerPicLeft: ; 88260 + hlcoord 13, 4 + ld de, -1 + ; fallthrough + +MovePlayerPic: ; 88266 +; Move player pic at hl by de * 7 tiles. + ld c, $8 +.loop + push bc + push hl + push de + xor a + ld [hBGMapMode], a + lb bc, 7, 7 + predef PlaceGraphic + xor a + ld [hBGMapThird], a + call WaitBGMap + call DelayFrame + pop de + pop hl + add hl, de + pop bc + dec c + ret z + push hl + push bc + ld a, l + sub e + ld l, a + ld a, h + sbc d + ld h, a + lb bc, 7, 7 + call ClearBox + pop bc + pop hl + jr .loop + +ShowPlayerNamingChoices: ; 88297 + ld hl, ChrisNameMenuHeader + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .GotGender + ld hl, KrisNameMenuHeader +.GotGender: + call LoadMenuHeader + call VerticalMenu + ld a, [wMenuCursorY] + dec a + call CopyNameFromMenu + call CloseWindow + ret + +INCLUDE "data/player_names.asm" + +GetPlayerNameArray: ; 88318 This Function is never called + ld hl, wPlayerName + ld de, MalePlayerNameArray + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .done + ld de, FemalePlayerNameArray + +.done + call InitName + ret + +GetPlayerIcon: ; 8832c +; Get the player icon corresponding to gender + +; Male + ld de, ChrisSpriteGFX + ld b, BANK(ChrisSpriteGFX) + + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .done + +; Female + ld de, KrisSpriteGFX + ld b, BANK(KrisSpriteGFX) + +.done + ret + +GetCardPic: ; 8833e + ld hl, ChrisCardPic + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .GotClass + ld hl, KrisCardPic +.GotClass: + ld de, vTiles2 tile $00 + ld bc, $23 tiles + ld a, BANK(ChrisCardPic) ; BANK(KrisCardPic) + call FarCopyBytes + ld hl, CardGFX + ld de, vTiles2 tile $23 + ld bc, 6 tiles + ld a, BANK(CardGFX) + call FarCopyBytes + ret + +ChrisCardPic: ; 88365 +INCBIN "gfx/trainer_card/chris_card.2bpp" + +KrisCardPic: ; 88595 +INCBIN "gfx/trainer_card/kris_card.2bpp" + +CardGFX: ; 887c5 +INCBIN "gfx/trainer_card/trainer_card.2bpp" + +GetPlayerBackpic: ; 88825 + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, GetChrisBackpic + call GetKrisBackpic + ret + +GetChrisBackpic: ; 88830 + ld hl, ChrisBackpic + ld b, BANK(ChrisBackpic) + ld de, vTiles2 tile $31 + ld c, 7 * 7 + predef DecompressGet2bpp + ret + +HOF_LoadTrainerFrontpic: ; 88840 + call WaitBGMap + xor a + ld [hBGMapMode], a + ld e, 0 + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .GotClass + ld e, 1 + +.GotClass: + ld a, e + ld [wTrainerClass], a + ld de, ChrisPic + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .GotPic + ld de, KrisPic + +.GotPic: + ld hl, vTiles2 + ld b, BANK(ChrisPic) ; BANK(KrisPic) + ld c, 7 * 7 + call Get2bpp + call WaitBGMap + ld a, $1 + ld [hBGMapMode], a + ret + +DrawIntroPlayerPic: ; 88874 +; Draw the player pic at (6,4). + +; Get class + ld e, CHRIS + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .GotClass + ld e, KRIS +.GotClass: + ld a, e + ld [wTrainerClass], a + +; Load pic + ld de, ChrisPic + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .GotPic + ld de, KrisPic +.GotPic: + ld hl, vTiles2 + ld b, BANK(ChrisPic) ; BANK(KrisPic) + ld c, 7 * 7 ; dimensions + call Get2bpp + +; Draw + xor a + ld [hGraphicStartTile], a + hlcoord 6, 4 + lb bc, 7, 7 + predef PlaceGraphic + ret + +ChrisPic: ; 888a9 +INCBIN "gfx/player/chris.2bpp" + +KrisPic: ; 88bb9 +INCBIN "gfx/player/kris.2bpp" + +GetKrisBackpic: ; 88ec9 +; Kris's backpic is uncompressed. + ld de, KrisBackpic + ld hl, vTiles2 tile $31 + lb bc, BANK(KrisBackpic), 7 * 7 ; dimensions + call Get2bpp + ret + +KrisBackpic: ; 88ed6 +INCBIN "gfx/player/kris_back.2bpp" diff --git a/engine/gfx/sgb_layouts.asm b/engine/gfx/sgb_layouts.asm new file mode 100644 index 000000000..24bdc952e --- /dev/null +++ b/engine/gfx/sgb_layouts.asm @@ -0,0 +1,605 @@ +LoadSGBLayout: ; 864c + call CheckCGB + jp nz, LoadSGBLayoutCGB + + ld a, b + cp SCGB_RAM + jr nz, .not_ram + ld a, [wSGBPredef] +.not_ram + cp SCGB_PARTY_MENU_HP_PALS + jp z, SGB_ApplyPartyMenuHPPals + ld l, a + ld h, 0 + add hl, hl + ld de, .Jumptable + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, _LoadSGBLayout_ReturnFromJumpTable + push de + jp hl +; 866f + +.Jumptable: ; 866f + dw .SGB_BattleGrayscale + dw .SGB_BattleColors + dw .SGB_PokegearPals + dw .SGB_StatsScreenHPPals + dw .SGB_Pokedex + dw .SGB_SlotMachine + dw .SGB06 + dw .SGB_GSIntro + dw .SGB_Diploma + dw .SGB_MapPals + dw .SGB_PartyMenu + dw .SGB_Evolution + dw .SGB_GSTitleScreen + dw .SGB0d + dw .SGB_MoveList + dw .SGB0f + dw .SGB_PokedexSearchOption + dw .SGB11 + dw .SGB12 + dw .SGB13 + dw .SGB_PackPals + dw .SGB_TrainerCard + dw .SGB_PokedexUnownMode + dw .SGB_BillsPC + dw .SGB_UnownPuzzle + dw .SGB_GamefreakLogo + dw .SGB_PlayerOrMonFrontpicPals + dw .SGB_TradeTube + dw .SGB_TrainerOrMonFrontpicPals + dw .SGB_MysteryGift + dw .SGB1e +; 86ad + +.SGB_BattleGrayscale: ; 86ad + ld hl, PalPacket_BattleGrayscale + ld de, BlkPacket_Battle + ret +; 86b4 + +.SGB_BattleColors: ; 86b4 + ld hl, BlkPacket_Battle + call PushSGBPals_ + + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + + ld a, [wPlayerHPPal] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, HPBarPals + add hl, de + + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + + ld a, [wEnemyHPPal] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + + ld de, HPBarPals + add hl, de + ld a, [hli] + ld [wSGBPals + 9], a + ld a, [hli] + ld [wSGBPals + 10], a + ld a, [hli] + ld [wSGBPals + 11], a + ld a, [hl] + ld [wSGBPals + 12], a + + ld hl, PalPacket_9cf6 + ld de, wSGBPals + PALPACKET_LENGTH + ld bc, PALPACKET_LENGTH + call CopyBytes + + call GetBattlemonBackpicPalettePointer + + ld a, [hli] + ld [wSGBPals + 19], a + ld a, [hli] + ld [wSGBPals + 20], a + ld a, [hli] + ld [wSGBPals + 21], a + ld a, [hl] + ld [wSGBPals + 22], a + call GetEnemyFrontpicPalettePointer + ld a, [hli] + ld [wSGBPals + 25], a + ld a, [hli] + ld [wSGBPals + 26], a + ld a, [hli] + ld [wSGBPals + 27], a + ld a, [hl] + ld [wSGBPals + 28], a + + ld hl, wSGBPals + ld de, wSGBPals + PALPACKET_LENGTH + ld a, SCGB_BATTLE_COLORS + ld [wSGBPredef], a + ret +; 873c + +.SGB_MoveList: ; 873c + ld hl, PalPacket_9bd6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + + ld hl, wSGBPals + 1 + ld [hl], $10 + inc hl + inc hl + + ld a, [wPlayerHPPal] + add PREDEFPAL_HP_GREEN + ld [hl], a + ld hl, wSGBPals + ld de, BlkPacket_MoveList + ret +; 875c + +.SGB_PokegearPals: ; 875c + ld hl, PalPacket_Pokegear + ld de, BlkPacket_9a86 + ret +; 8763 + +.SGB_StatsScreenHPPals: ; 8763 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + ld a, [wCurHPPal] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, HPBarPals + add hl, de + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld a, [wCurPartySpecies] + ld bc, wTempMonDVs + call GetPlayerOrMonPalettePointer + ld a, [hli] + ld [wSGBPals + 9], a + ld a, [hli] + ld [wSGBPals + 10], a + ld a, [hli] + ld [wSGBPals + 11], a + ld a, [hl] + ld [wSGBPals + 12], a + ld hl, wSGBPals + ld de, BlkPacket_StatsScreen + ret +; 87ab + +.SGB_PartyMenu: ; 87ab + ld hl, PalPacket_PartyMenu + ld de, wSGBPals + 1 + ret +; 87b2 + +.SGB_Pokedex: ; 87b2 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + ld hl, wSGBPals + 3 + ld [hl], LOW(palred 31 + palgreen 20 + palblue 10) + inc hl + ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10) + inc hl + ld [hl], LOW(palred 26 + palgreen 10 + palblue 6) + inc hl + ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6) + ld a, [wCurPartySpecies] + call GetMonPalettePointer_ + ld a, [hli] + ld [wSGBPals + 9], a + ld a, [hli] + ld [wSGBPals + 10], a + ld a, [hli] + ld [wSGBPals + 11], a + ld a, [hl] + ld [wSGBPals + 12], a + ld hl, wSGBPals + ld de, BlkPacket_Pokedex_PC + ret +; 87e9 + +.SGB_BillsPC: ; 87e9 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + ld hl, wSGBPals + 3 + ld [hl], LOW(palred 31 + palgreen 20 + palblue 10) + inc hl + ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10) + inc hl + ld [hl], LOW(palred 26 + palgreen 10 + palblue 6) + inc hl + ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6) + ld a, [wCurPartySpecies] + ld bc, wTempMonDVs + call GetPlayerOrMonPalettePointer + ld a, [hli] + ld [wSGBPals + 9], a + ld a, [hli] + ld [wSGBPals + 10], a + ld a, [hli] + ld [wSGBPals + 11], a + ld a, [hl] + ld [wSGBPals + 12], a + ld hl, wSGBPals + ld de, BlkPacket_Pokedex_PC + ret +; 8823 + +.SGB_PokedexUnownMode: ; 8823 + call .SGB_Pokedex + ld de, BlkPacket_PokedexUnownMode + ret +; 882a + +.SGB_PokedexSearchOption: ; 882a + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + ld hl, wSGBPals + 3 + ld [hl], LOW(palred 31 + palgreen 20 + palblue 10) + inc hl + ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10) + inc hl + ld [hl], LOW(palred 26 + palgreen 10 + palblue 6) + inc hl + ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6) + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 884b + +.SGB_PackPals: ; 884b + ld hl, PalPacket_Pack + ld de, BlkPacket_9a86 + ret +; 8852 + +.SGB_SlotMachine: ; 8852 + ld hl, PalPacket_SlotMachine + ld de, BlkPacket_SlotMachine + ret +; 8859 + +.SGB06: ; 8859 + ld hl, PalPacket_SCGB_06 + ld de, BlkPacket_SCGB_06 + ret +; 8860 + +.SGB_Diploma: +.SGB_MysteryGift: ; 8860 + ld hl, PalPacket_Diploma + ld de, BlkPacket_9a86 + ret +; 8867 + +.SGB_GSIntro: ; 8867 + ld b, 0 + ld hl, .BlkPacketTable_GSIntro +rept 4 + add hl, bc +endr + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ret +; 8878 + +.BlkPacketTable_GSIntro: ; 8878 + dw BlkPacket_9a86, PalPacket_GSIntroShellderLapras + dw BlkPacket_GSIntroJigglypuffPikachu, PalPacket_GSIntroJigglypuffPikachu + dw BlkPacket_9a86, PalPacket_GSIntroStartersTransition +; 8884 + +.SGB_GSTitleScreen: ; 8884 + ld hl, PalPacket_GSTitleScreen + ld de, BlkPacket_GSTitleScreen + ld a, SCGB_DIPLOMA + ld [wSGBPredef], a + ret +; 8890 + +.SGB13: ; 8890 + ld hl, PalPacket_SCGB_13 + ld de, BlkPacket_SCGB_13 + ret +; 8897 + +.SGB0f: ; 8897 + ld hl, PalPacket_SCGB_0F + ld de, BlkPacket_9a86 + ret +; 889e + +.SGB11: ; 889e + ld hl, BlkPacket_9a86 + ld de, wPlayerLightScreenCount ; ??? + ld bc, PALPACKET_LENGTH + call CopyBytes + ld hl, PalPacket_SCGB_11 + ld de, BlkPacket_9a86 + ret +; 88b1 + +.SGB_MapPals: ; 88b1 + ld hl, PalPacket_9bd6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + call .GetMapPalsIndex + ld hl, wSGBPals + 1 + ld [hld], a + ld de, BlkPacket_9a86 + ld a, SCGB_MAPPALS + ld [wSGBPredef], a + ret +; 88cd + +.SGB_Evolution: ; 88cd + push bc + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + pop bc + ld a, c + and a + jr z, .partymon + ; Egg + ld hl, wSGBPals + 3 + ld [hl], LOW(palred 7 + palgreen 7 + palblue 7) + inc hl + ld [hl], HIGH(palred 7 + palgreen 7 + palblue 7) + inc hl + ld [hl], LOW(palred 2 + palgreen 3 + palblue 3) + inc hl + ld [hl], HIGH(palred 2 + palgreen 3 + palblue 3) + jr .done + +.partymon + ld hl, wPartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld c, l + ld b, h + ld a, [wPlayerHPPal] + call GetPlayerOrMonPalettePointer + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + +.done + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 891a + +.SGB0d: +.SGB_TrainerCard: ; 891a + ld hl, PalPacket_Diploma + ld de, BlkPacket_9a86 + ret +; 8921 + +.SGB_UnownPuzzle: ; 8921 + ld hl, PalPacket_UnownPuzzle + ld de, BlkPacket_9a86 + ret +; 8928 + +.SGB12: ; 8928 + ld hl, PalPacket_9bd6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + ld hl, BlkPacket_9a86 + ld de, wSGBPals + PALPACKET_LENGTH + ld bc, PALPACKET_LENGTH + call CopyBytes + call .GetMapPalsIndex + ld hl, wSGBPals + 1 + ld [hl], a + ld hl, wSGBPals + 3 + ld [hl], $2e + ld hl, wSGBPals + $13 + ld a, 5 + ld [hli], a + ld a, [wMenuBorderLeftCoord] + ld [hli], a + ld a, [wMenuBorderTopCoord] + ld [hli], a + ld a, [wMenuBorderRightCoord] + ld [hli], a + ld a, [wMenuBorderBottomCoord] + ld [hl], a + ld hl, wSGBPals + ld de, wSGBPals + PALPACKET_LENGTH + ret +; 8969 + +.SGB1e: ; 8969 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + ld a, [wCurPartySpecies] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + add hl, hl + ld de, PokemonPalettes + add hl, de + ld a, [wcf65] + and 3 + sla a + sla a + ld c, a + ld b, 0 + add hl, bc + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 89a6 + +.SGB_GamefreakLogo: ; 89a6 + ld hl, PalPacket_GamefreakLogo + ld de, BlkPacket_9a86 + ret +; 89ad + +.SGB_PlayerOrMonFrontpicPals: ; 89ad + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + ld a, [wCurPartySpecies] + ld bc, wTempMonDVs + call GetPlayerOrMonPalettePointer + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 89d9 + +.SGB_TradeTube: ; 89d9 + ld hl, PalPacket_TradeTube + ld de, BlkPacket_9a86 + ret +; 89e0 + +.SGB_TrainerOrMonFrontpicPals: ; 89e0 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, PALPACKET_LENGTH + call CopyBytes + ld a, [wCurPartySpecies] + ld bc, wTempMonDVs + call GetFrontpicPalettePointer + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 8a0c + +.GetMapPalsIndex: ; 8a0c + ld a, [wTimeOfDayPal] + cp NITE_F + jr c, .morn_day + ld a, PREDEFPAL_NITE + ret + +.morn_day + ld a, [wEnvironment] + cp ROUTE + jr z, .route + cp CAVE + jr z, .cave + cp DUNGEON + jr z, .cave + cp ENVIRONMENT_5 + jr z, .perm5 + cp GATE + jr z, .gate + ld a, [wMapGroup] + ld e, a + ld d, 0 + ld hl, MapGroupRoofSGBPalInds + add hl, de + ld a, [hl] + ret + +.route + ld a, PREDEFPAL_00 + ret + +.cave + ld a, PREDEFPAL_DUNGEONS + ret + +.perm5 + ld a, PREDEFPAL_VERMILION + ret + +.gate + ld a, PREDEFPAL_PEWTER + ret +; 8a45 + +INCLUDE "data/maps/sgb_roof_pal_inds.asm" + +_LoadSGBLayout_ReturnFromJumpTable: ; 8a60 + push de + call PushSGBPals_ + pop hl + jp PushSGBPals_ +; 8a68 diff --git a/engine/gfx/sprite_anims.asm b/engine/gfx/sprite_anims.asm new file mode 100755 index 000000000..9353b71c9 --- /dev/null +++ b/engine/gfx/sprite_anims.asm @@ -0,0 +1,889 @@ +DoAnimFrame: ; 8d24b + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 8d25b + +.Jumptable: ; 8d25b (23:525b) +; entries correspond to SPRITE_ANIM_SEQ_* constants + dw .Null + dw .PartyMon + dw .PartyMonSwitch + dw .PartyMonSelected + dw .GSTitleTrail + dw .NamingScreenCursor + dw .GameFreakLogo + dw .GSIntroStar + dw .GSIntroSparkle + dw .SlotsGolem + dw .SlotsChansey + dw .SlotsChanseyEgg + dw .MailCursor + dw .UnusedCursor + dw .DummyGameCursor + dw .PokegearArrow + dw .TradePokeBall + dw .TradeTubeBulge + dw .TrademonInTube + dw .RevealNewMon + dw .RadioTuningKnob + dw .CutLeaves + dw .FlyFrom + dw .FlyLeaf + dw .FlyTo + dw .GSIntroHoOh + dw .EZChatCursor + dw .MobileTradeSentPulse + dw .MobileTradeOTPulse + dw .IntroSuicune + dw .IntroPichuWooper + dw .Celebi + dw .IntroUnown + dw .IntroUnownF + dw .IntroSuicuneAway + +.Null: ; 8d2a1 (23:52a1) + ret + +.PartyMon ; 8d2a2 (23:52a2) + ld a, [wMenuCursorY] + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + cp [hl] + jr z, .PartyMonSwitch + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 2 + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $0 + ret + +.PartyMonSwitch ; 8d2b9 (23:52b9) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 3 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + ld d, a + inc [hl] + and $f + ret nz + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld e, [hl] + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, d + and $10 ; bit 4 + jr z, .load_zero + ld a, e + and a + jr z, .load_minus_two + cp $1 + jr z, .load_minus_one +.load_zero + xor a + ld [hl], a + ret + +.load_minus_one + ld a, -1 + ld [hl], a + ret + +.load_minus_two + ld a, -2 + ld [hl], a + ret + +.PartyMonSelected ; 8d2ea (23:52ea) + ld a, [wMenuCursorY] + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + cp [hl] + jr z, .three_offset_right + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 2 + ret + +.three_offset_right + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], 8 * 3 + ret + +.GSTitleTrail ; 8d302 (23:5302) + call .AnonymousJumptable + jp hl +; 8d306 (23:5306) + +; Anonymous dw (see .AnonymousJumptable) + dw .four_zero + dw .four_one +; 8d30a + +.four_zero ; 8d30a + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld a, [hl] + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + and $3 + ld [hl], a + inc [hl] + swap a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + +.four_one ; 8d321 + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $a4 + jr nc, .asm_8d356 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + add $4 + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + sla a + sla a + ld d, $2 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add $3 + ld [hl], a + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8d356 + call DeinitializeSprite + ret +; 8d35a + +.GSIntroHoOh ; 8d35a (23:535a) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc a + ld [hl], a + ld d, $2 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.NamingScreenCursor ; 8d36c (23:536c) + callfar NamingScreen_AnimateCursor + ret + +.MailCursor ; 8d373 (23:5373) + callfar ComposeMail_AnimateCursor + ret + +.GameFreakLogo: ; 8d37a (23:537a) + callfar GameFreakLogoJumper + ret + +.GSIntroStar ; 8d381 (23:5381) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d3ba + dec [hl] + dec [hl] + ld d, a + and $1f + jr nz, .asm_8d395 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + dec [hl] +.asm_8d395 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + add [hl] + ld [hl], a + ret + +.asm_8d3ba + ld a, $1 + ld [wcf64], a + call DeinitializeSprite + ret + +.GSIntroSparkle ; 8d3c3 (23:53c3) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hli] + or [hl] + jr z, .asm_8d41e + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld d, [hl] + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, -$10 + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + xor $20 + ld [hl], a + ret + +.asm_8d41e + call DeinitializeSprite + ret + +.SlotsGolem: ; 8d422 (23:5422) + callfar Slots_AnimateGolem + ret + +.SlotsChansey: ; 8d429 (23:5429) + callfar Slots_AnimateChansey + ld hl, wcf64 + ld a, [hl] + cp $2 + ret nz + ld [hl], $3 + ld a, SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY_2 + call _ReinitSpriteAnimFrame + ret + +.SlotsChanseyEgg: ; 8d43e (23:543e) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + dec [hl] + ld e, a + and $1 + jr z, .move_vertical + + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp 15 * 8 + jr c, .move_right + call DeinitializeSprite + ld a, $4 + ld [wcf64], a + ld de, SFX_PLACE_PUZZLE_PIECE_DOWN + call PlaySFX + ret + +.move_right + inc [hl] +.move_vertical + ld a, e + ld d, $20 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.UnusedCursor ; 8d46e (23:546e) + callfar ret_e00ed + ret + +.PokegearArrow ; 8d475 (23:5475) + callfar AnimatePokegearModeIndicatorArrow + ret + +.DummyGameCursor ; 8d47c (23:547c) + callfar DummyGame_InterpretJoypad_AnimateCursor + ret + +.TradePokeBall ; 8d483 (23:5483) + call .AnonymousJumptable + jp hl +; 8d487 (23:5487) + +; Anonymous dw (see .AnonymousJumptable) + dw .TradePokeBall_zero + dw .TradePokeBall_one + dw .TradePokeBall_two + dw .TradePokeBall_three + dw .TradePokeBall_four + dw .TradePokeBall_five +; 8d493 + +.TradePokeBall_zero ; 8d493 + ld a, SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL_WOBBLE + call _ReinitSpriteAnimFrame + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $2 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $20 + ret +; 8d4a5 + +.TradePokeBall_two ; 8d4a5 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d4af + dec [hl] + ret + +.asm_8d4af + call .IncrementJumptableIndex + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $40 + +.TradePokeBall_three ; 8d4b8 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $30 + jr c, .asm_8d4cd + dec [hl] + ld d, $28 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.asm_8d4cd + ld de, SFX_GOT_SAFARI_BALLS + call PlaySFX + jr .TradePokeBall_five +; 8d4d5 + +.TradePokeBall_one ; 8d4d5 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $4 + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $24 + ret +; 8d4e8 + +.TradePokeBall_four ; 8d4e8 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_8d51c + ld d, a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + call Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + inc [hl] + ld a, [hl] + and $3f + ret nz + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $20 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + sub $c + ld [hl], a + ld de, SFX_SWITCH_POKEMON + call PlaySFX + ret + +.asm_8d51c + xor a + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + call .IncrementJumptableIndex + ret + +.TradePokeBall_five ; 8d526 + call DeinitializeSprite + ret +; 8d52a + +.TradeTubeBulge ; 8d52a (23:552a) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + cp $b0 + jr nc, .delete + and $3 + ret nz + ld de, SFX_POKEBALLS_PLACED_ON_TABLE + call PlaySFX + ret + +.delete + call DeinitializeSprite + ret + +.TrademonInTube ; 8d543 (23:5543) + callfar TradeAnim_AnimateTrademonInTube + ret + +.RevealNewMon: ; 8d54a (23:554a) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $80 + jr nc, .finish_EggShell + ld d, a + add $8 + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [hl] + xor $20 + ld [hl], a + + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.finish_EggShell + call DeinitializeSprite + ret + +.RadioTuningKnob: ; 8d578 (23:5578) + callfar AnimateTuningKnob + ret + +.CutLeaves ; 8d57f (23:557f) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $80 + add hl, de + ld e, l + ld d, h + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], e + inc hl + ld [hl], d + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + inc [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.FlyFrom: ; 8d5b0 (23:55b0) + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + and a + ret z + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + inc [hl] + cp $40 + ret c + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + dec [hl] + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld a, [hl] + ld d, a + cp $40 + jr nc, .skip + add $8 + ld [hl], a +.skip + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.FlyLeaf: ; 8d5e2 (23:55e2) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp -9 * 8 + jr nc, .delete_leaf + inc [hl] + inc [hl] + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + dec [hl] + + ld d, $40 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.delete_leaf + call DeinitializeSprite + ret + +.FlyTo: ; 8d607 (23:5607) + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp 10 * 8 + 4 + ret z + + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + inc [hl] + inc [hl] + + ld hl, SPRITEANIMSTRUCT_0F + add hl, bc + ld a, [hl] + ld d, a + and a + jr z, .asm_8d621 + sub $2 + ld [hl], a +.asm_8d621 + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hl] + inc [hl] + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.MobileTradeSentPulse ; 8d630 (23:5630) + farcall Function108bc7 + ret + +.MobileTradeOTPulse ; 8d637 (23:5637) + farcall Function108be0 + ret + +.IntroSuicune ; 8d63e (23:563e) + ld a, [wcf65] + and a + jr nz, .asm_8d645 + ret +.asm_8d645 + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $0 + + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + add $2 + ld [hl], a + xor $ff + inc a + ld d, $20 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ld a, SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_2 + call _ReinitSpriteAnimFrame + ret + +.IntroPichuWooper ; 8d666 (23:5666) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $14 + jr nc, .asm_8d67f + add $2 + ld [hl], a + xor $ff + inc a + ld d, $20 + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a +.asm_8d67f + ret + +.IntroUnown ; 8d680 (23:5680) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld d, [hl] + inc [hl] + inc [hl] + inc [hl] + + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + push af + push de + call .Sprites_Sine + + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + pop de + pop af + call .Sprites_Cosine + + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +.IntroUnownF ; 8d6a2 (23:56a2) + ld a, [wcf64] + cp $40 + ret nz + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F_2 + call _ReinitSpriteAnimFrame + ret + +.IntroSuicuneAway ; 8d6ae (23:56ae) + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + add $10 + ld [hl], a + ret + +.EZChatCursor ; 8d6b7 (23:56b7) + farcall AnimateEZChatCursor + ret + +.Celebi ; 8d6be (23:56be) + farcall UpdateCelebiPosition + ret + +.AnonymousJumptable: ; 8d6c5 (23:56c5) + ld hl, sp+$0 + ld e, [hl] + inc hl + ld d, [hl] + inc de + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld l, [hl] + ld h, $0 + add hl, hl + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret +; 8d6d8 (23:56d8) + +.IncrementJumptableIndex: ; 8d6d8 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret +; 8d6de + +.Sprites_Sine: ; 8d6de (23:56de) + call Sprites_Sine + ret + +.Sprites_Cosine: ; 8d6e2 (23:56e2) + call Sprites_Cosine + ret +; 8d6e6 (23:56e6) diff --git a/engine/gfx/sprites.asm b/engine/gfx/sprites.asm new file mode 100755 index 000000000..63666c624 --- /dev/null +++ b/engine/gfx/sprites.asm @@ -0,0 +1,677 @@ +ClearSpriteAnims: ; 8cf53 + ld hl, wSpriteAnimDict + ld bc, wSpriteAnimsEnd - wSpriteAnimDict +.loop + ld [hl], $0 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + ret +; 8cf62 + +PlaySpriteAnimationsAndDelayFrame: ; 8cf62 + call PlaySpriteAnimations + call DelayFrame + ret +; 8cf69 + +PlaySpriteAnimations: ; 8cf69 + push hl + push de + push bc + push af + + ld a, LOW(wVirtualOAM) + ld [wCurrSpriteOAMAddr], a + call DoNextFrameForAllSprites + + pop af + pop bc + pop de + pop hl + ret +; 8cf7a + +DoNextFrameForAllSprites: ; 8cf7a + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS + +.loop + ld a, [hl] + and a + jr z, .next ; This struct is deinitialized. + ld c, l + ld b, h + push hl + push de + call DoAnimFrame ; Uses a massive dw + call UpdateAnimFrame + pop de + pop hl + jr c, .done + +.next + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + + ld a, [wCurrSpriteOAMAddr] + ld l, a + ld h, HIGH(wVirtualOAM) + +.loop2 ; Clear (wVirtualOAM + [wCurrSpriteOAMAddr] --> wVirtualOAMEnd) + ld a, l + cp LOW(wVirtualOAMEnd) + jr nc, .done + xor a + ld [hli], a + jr .loop2 + +.done + ret +; 8cfa8 + +DoNextFrameForFirst16Sprites: ; 8cfa8 (23:4fa8) + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS + +.loop + ld a, [hl] + and a + jr z, .next + ld c, l + ld b, h + push hl + push de + call DoAnimFrame ; Uses a massive dw + call UpdateAnimFrame + pop de + pop hl + jr c, .done + +.next + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + + ld a, [wCurrSpriteOAMAddr] + ld l, a + ld h, HIGH(wVirtualOAMSprite16) + +.loop2 ; Clear (wVirtualOAM + [wCurrSpriteOAMAddr] --> Sprites + $40) + ld a, l + cp LOW(wVirtualOAMSprite16) + jr nc, .done + xor a + ld [hli], a + jr .loop2 + +.done + ret + +InitSpriteAnimStruct:: ; 8cfd6 +; Initialize animation a at pixel x=e, y=d +; Find if there's any room in the wSpriteAnimationStructs array, which is 10x16 + push de + push af + ld hl, wSpriteAnimationStructs + ld e, NUM_SPRITE_ANIM_STRUCTS +.loop + ld a, [hl] + and a + jr z, .found + ld bc, SPRITEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop +; We've reached the end. There is no more room here. +; Return carry. + pop af + pop de + scf + ret + +.found +; Back up the structure address to bc. + ld c, l + ld b, h +; Value [wSpriteAnimCount] is initially set to -1. Set it to +; the number of objects loaded into this array. + ld hl, wSpriteAnimCount + inc [hl] + ld a, [hl] + and a + jr nz, .initialized + inc [hl] + +.initialized +; Get row a of SpriteAnimSeqData, copy the pointer into de + pop af + ld e, a + ld d, 0 + ld hl, SpriteAnimSeqData + add hl, de + add hl, de + add hl, de + ld e, l + ld d, h +; Set hl to the first field (field 0) in the current structure. + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc +; Load the index. + ld a, [wSpriteAnimCount] + ld [hli], a +; Copy the table entry to the next two fields. + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de +; Look up the third field from the table in the wSpriteAnimDict array (10x2). +; Take the value and load it in + ld a, [de] + call GetSpriteAnimVTile + ld [hli], a + pop de +; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here. + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc +; Load the original value of de into here. + ld a, e + ld [hli], a + ld a, d + ld [hli], a +; load 0 into the next four fields + xor a + ld [hli], a + ld [hli], a + xor a + ld [hli], a + ld [hli], a +; load -1 into the next field + dec a + ld [hli], a +; load 0 into the last five fields + xor a +rept 4 + ld [hli], a +endr + ld [hl], a +; back up the address of the first field to wSpriteAnimAddrBackup + ld a, c + ld [wSpriteAnimAddrBackup], a + ld a, b + ld [wSpriteAnimAddrBackup + 1], a + ret +; 8d036 + +DeinitializeSprite: ; 8d036 +; Clear the index field of the struct in bc. + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret +; 8d03d + + +DeinitializeAllSprites: ; 8d03d (23:503d) +; Clear the index field of every struct in the wSpriteAnimationStructs array. + ld hl, wSpriteAnimationStructs + ld bc, SPRITEANIMSTRUCT_LENGTH + ld e, NUM_SPRITE_ANIM_STRUCTS + xor a +.loop + ld [hl], a + add hl, bc + dec e + jr nz, .loop + ret + + +UpdateAnimFrame: ; 8d04c + call InitSpriteAnimBuffer ; init WRAM + call GetSpriteAnimFrame ; read from a memory array + cp -3 + jr z, .done + cp -4 + jr z, .delete + call GetFrameOAMPointer + ; add byte to [wCurrAnimVTile] + ld a, [wCurrAnimVTile] + add [hl] + ld [wCurrAnimVTile], a + inc hl + ; load pointer into hl + ld a, [hli] + ld h, [hl] + ld l, a + push bc + ld a, [wCurrSpriteOAMAddr] + ld e, a + ld d, HIGH(wVirtualOAM) + ld a, [hli] + ld c, a ; number of objects +.loop + ; first byte: y (px) + ; [de] = [wCurrAnimYCoord] + [wCurrAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl]) + ld a, [wCurrAnimYCoord] + ld b, a + ld a, [wCurrAnimYOffset] + add b + ld b, a + ld a, [wGlobalAnimYOffset] + add b + ld b, a + call AddOrSubtractY + add b + ld [de], a + inc hl + inc de + ; second byte: x (px) + ; [de] = [wCurrAnimXCoord] + [wCurrAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl]) + ld a, [wCurrAnimXCoord] + ld b, a + ld a, [wCurrAnimXOffset] + add b + ld b, a + ld a, [wGlobalAnimXOffset] + add b + ld b, a + call AddOrSubtractX + add b + ld [de], a + inc hl + inc de + ; third byte: vtile + ; [de] = [wCurrAnimVTile] + [hl] + ld a, [wCurrAnimVTile] + add [hl] + ld [de], a + inc hl + inc de + ; fourth byte: attributes + ; [de] = GetSpriteOAMAttr([hl]) + call GetSpriteOAMAttr + ld [de], a + inc hl + inc de + ld a, e + ld [wCurrSpriteOAMAddr], a + cp LOW(wVirtualOAMEnd) + jr nc, .reached_the_end + dec c + jr nz, .loop + pop bc + jr .done + +.delete + call DeinitializeSprite +.done + and a + ret + +.reached_the_end + pop bc + scf + ret +; 8d0be + +AddOrSubtractY: ; 8d0be + push hl + ld a, [hl] + ld hl, wCurrSpriteAddSubFlags + bit 6, [hl] + jr z, .ok + ; 8 - a + add $8 + xor $ff + inc a + +.ok + pop hl + ret +; 8d0ce + +AddOrSubtractX: ; 8d0ce + push hl + ld a, [hl] + ld hl, wCurrSpriteAddSubFlags + bit 5, [hl] ; x flip + jr z, .ok + ; 8 - a + add $8 + xor $ff + inc a + +.ok + pop hl + ret +; 8d0de + +GetSpriteOAMAttr: ; 8d0de + ld a, [wCurrSpriteAddSubFlags] + ld b, a + ld a, [hl] + xor b + and $e0 + ld b, a + ld a, [hl] + and $1f + or b + ret +; 8d0ec + +InitSpriteAnimBuffer: ; 8d0ec + xor a + ld [wCurrSpriteAddSubFlags], a + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld a, [hli] + ld [wCurrAnimVTile], a + ld a, [hli] + ld [wCurrAnimXCoord], a + ld a, [hli] + ld [wCurrAnimYCoord], a + ld a, [hli] + ld [wCurrAnimXOffset], a + ld a, [hli] + ld [wCurrAnimYOffset], a + ret +; 8d109 + +GetSpriteAnimVTile: ; 8d109 +; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else 0 +; vTiles offset + push hl + push bc + ld hl, wSpriteAnimDict + ld b, a + ld c, NUM_SPRITE_ANIM_STRUCTS +.loop + ld a, [hli] + cp b + jr z, .ok + inc hl + dec c + jr nz, .loop + xor a + jr .done + +.ok + ld a, [hl] + +.done + pop bc + pop hl + ret +; 8d120 + +_ReinitSpriteAnimFrame:: ; 8d120 + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], 0 + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld [hl], -1 + ret +; 8d132 + + +GetSpriteAnimFrame: ; 8d132 +.loop + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld a, [hl] + and a + jr z, .next_frame ; finished the current sequence + dec [hl] + call .GetPointer ; load pointer from SpriteAnimFrameData + ld a, [hli] + push af + jr .okay + +.next_frame + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + inc [hl] + call .GetPointer ; load pointer from SpriteAnimFrameData + ld a, [hli] + cp dorestart_command + jr z, .restart + cp endanim_command + jr z, .repeat_last + + push af + ld a, [hl] + push hl + and $3f + ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET + add hl, bc + add [hl] + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + pop hl +.okay + ld a, [hl] + and $c0 + srl a + ld [wCurrSpriteAddSubFlags], a + pop af + ret + +.repeat_last + xor a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + dec [hl] + dec [hl] + jr .loop + +.restart + xor a + ld hl, SPRITEANIMSTRUCT_DURATION + add hl, bc + ld [hl], a + + dec a + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld [hl], a + jr .loop +; 8d189 + +.GetPointer: ; 8d189 + ; Get the data for the current frame for the current animation sequence + + ; SpriteAnimFrameData[SpriteAnim[SPRITEANIMSTRUCT_FRAMESET_ID]][SpriteAnim[SPRITEANIMSTRUCT_FRAME]] + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, SpriteAnimFrameData + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc + ld l, [hl] + ld h, 0 + add hl, hl + add hl, de + ret +; 8d1a2 + +GetFrameOAMPointer: ; 8d1a2 +; Load OAM data pointer + ld e, a + ld d, 0 + ld hl, SpriteAnimOAMData + add hl, de + add hl, de + add hl, de + ret +; 8d1ac + +Unreferenced_BrokenGetStdGraphics: ; 8d1ac + push hl + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, BrokenStdGFXPointers ; broken 2bpp pointers + add hl, de + ld c, [hl] + inc hl + ld b, [hl] + inc hl + ld e, [hl] + inc hl + ld d, [hl] + pop hl + push bc + call Request2bpp + pop bc + ret +; 8d1c4 + + +INCLUDE "data/sprite_anims/sequences.asm" + +INCLUDE "engine/gfx/sprite_anims.asm" + +INCLUDE "data/sprite_anims/framesets.asm" + +INCLUDE "data/sprite_anims/oam.asm" + + +BrokenStdGFXPointers: + ; tile count, bank, pointer + ; (all pointers were dummied out to .deleted) + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 128, $01, .deleted + dbbw 16, $37, .deleted + dbbw 16, $11, .deleted + dbbw 16, $39, .deleted + dbbw 16, $24, .deleted + dbbw 16, $21, .deleted + +.deleted +; 8e72a (23:672a) + + +Sprites_Cosine: ; 8e72a +; a = d * cos(a * pi/32) + add %010000 ; cos(x) = sin(x + pi/2) + ; fallthrough +Sprites_Sine: ; 8e72c +; a = d * sin(a * pi/32) + calc_sine_wave + + +AnimateEndOfExpBar: ; 8e79d + ld a, [hSGB] + ld de, EndOfExpBarGFX + and a + jr z, .load + ld de, SGBEndOfExpBarGFX + +.load + ld hl, vTiles0 tile $00 + lb bc, BANK(EndOfExpBarGFX), 1 + call Request2bpp + ld c, 8 + ld d, 0 +.loop + push bc + call .AnimateFrame + call DelayFrame + pop bc + inc d + inc d + dec c + jr nz, .loop + call ClearSprites + ret +; 8e7c6 + +.AnimateFrame: ; 8e7c6 + ld hl, wVirtualOAMSprite00 + ld c, 8 ; number of animated circles +.anim_loop + ld a, c + and a + ret z + dec c + ld a, c +; multiply by 8 + sla a + sla a + sla a + push af + + push de + push hl + call Sprites_Sine + pop hl + pop de + add 13 * TILE_WIDTH + ld [hli], a ; y + + pop af + push de + push hl + call Sprites_Cosine + pop hl + pop de + add 10 * TILE_WIDTH + 4 + ld [hli], a ; x + + ld a, $0 + ld [hli], a ; tile id + ld a, PAL_BATTLE_OB_BLUE + ld [hli], a ; attributes + jr .anim_loop +; 8e7f4 + +EndOfExpBarGFX: ; 8e7f4 +INCBIN "gfx/battle/expbarend.2bpp" +SGBEndOfExpBarGFX: ; 8e804 +INCBIN "gfx/battle/expbarend_sgb.2bpp" + +ClearSpriteAnims2: ; 8e814 + push hl + push de + push bc + push af + ld hl, wSpriteAnimDict + ld bc, wSpriteAnimsEnd - wSpriteAnimDict +.loop + ld [hl], 0 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + pop af + pop bc + pop de + pop hl + ret +; 8e82b diff --git a/engine/gfx/tileset_anims.asm b/engine/gfx/tileset_anims.asm new file mode 100644 index 000000000..bf0037e65 --- /dev/null +++ b/engine/gfx/tileset_anims.asm @@ -0,0 +1,1060 @@ +_AnimateTileset:: ; fc000 +; Iterate over a given pointer array of +; animation functions (one per frame). + +; Typically in wra1, vra0 + + ld a, [wTilesetAnim] + ld e, a + ld a, [wTilesetAnim + 1] + ld d, a + + ld a, [hTileAnimFrame] + ld l, a + inc a + ld [hTileAnimFrame], a + + ld h, 0 + add hl, hl + add hl, hl + add hl, de + +; 2-byte parameter +; All functions take input de. + ld e, [hl] + inc hl + ld d, [hl] + inc hl + +; Function address + ld a, [hli] + ld h, [hl] + ld l, a + + jp hl +; fc01b + +Tileset0Anim: ; 0xfc01b +TilesetJohtoModernAnim: ; 0xfc01b +TilesetKantoAnim: ; 0xfc01b + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, TileAnimationPalette + dw NULL, WaitTileAnimation + dw NULL, AnimateFlowerTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc047 + +TilesetParkAnim: ; 0xfc047 + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, WaitTileAnimation + dw vTiles2 tile $5f, AnimateFountain + dw NULL, WaitTileAnimation + dw NULL, TileAnimationPalette + dw NULL, WaitTileAnimation + dw NULL, AnimateFlowerTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc073 + +TilesetForestAnim: ; 0xfc073 + dw NULL, ForestTreeLeftAnimation + dw NULL, ForestTreeRightAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, ForestTreeLeftAnimation2 + dw NULL, ForestTreeRightAnimation2 + dw NULL, AnimateFlowerTile + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, TileAnimationPalette + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc0a3 + +TilesetJohtoAnim: ; 0xfc0a3 + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, TileAnimationPalette + dw NULL, WaitTileAnimation + dw NULL, AnimateFlowerTile + dw WhirlpoolFrames1, AnimateWhirlpoolTile + dw WhirlpoolFrames2, AnimateWhirlpoolTile + dw WhirlpoolFrames3, AnimateWhirlpoolTile + dw WhirlpoolFrames4, AnimateWhirlpoolTile + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc0d7 + +UnusedTilesetAnim_fc0d7: ; 0xfc0d7 + dw vTiles2 tile $03, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $03, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, AnimateFlowerTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc103 + +UnusedTilesetAnim_fc103: ; 0xfc103 + dw vTiles2 tile $14, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $14, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc12f + +TilesetPortAnim: ; 0xfc12f + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, TileAnimationPalette + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc15f + +TilesetEliteFourRoomAnim: ; 0xfc15f + dw NULL, LavaBubbleAnim2 + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, LavaBubbleAnim1 + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc17f + +UnusedTilesetAnim_fc17f: ; 0xfc17f + dw vTiles2 tile $53, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileDown + dw wTileAnimBuffer, ScrollTileDown + dw vTiles2 tile $53, WriteTileFromBuffer + dw vTiles2 tile $03, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $03, WriteTileFromBuffer + dw vTiles2 tile $53, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileDown + dw wTileAnimBuffer, ScrollTileDown + dw vTiles2 tile $53, WriteTileFromBuffer + dw NULL, DoneTileAnimation +; 0xfc1af + +UnusedTilesetAnim_fc1af: ; 0xfc1af + dw vTiles2 tile $54, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileDown + dw wTileAnimBuffer, ScrollTileDown + dw vTiles2 tile $54, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw vTiles2 tile $03, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $03, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw vTiles2 tile $54, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileDown + dw wTileAnimBuffer, ScrollTileDown + dw vTiles2 tile $54, WriteTileFromBuffer + dw NULL, DoneTileAnimation +; 0xfc1e7 + +TilesetCaveAnim: ; 0xfc1e7 +TilesetDarkCaveAnim: ; 0xfc1e7 + dw vTiles2 tile $14, WriteTileToBuffer + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileRightLeft + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $14, WriteTileFromBuffer + dw NULL, FlickeringCaveEntrancePalette + dw NULL, TileAnimationPalette + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $40, WriteTileToBuffer + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $40, WriteTileFromBuffer + dw NULL, FlickeringCaveEntrancePalette + dw NULL, DoneTileAnimation +; 0xfc233 + +TilesetIcePathAnim: ; 0xfc233 + dw vTiles2 tile $35, WriteTileToBuffer + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileRightLeft + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $35, WriteTileFromBuffer + dw NULL, FlickeringCaveEntrancePalette + dw NULL, TileAnimationPalette + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $31, WriteTileToBuffer + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $31, WriteTileFromBuffer + dw NULL, FlickeringCaveEntrancePalette + dw NULL, DoneTileAnimation +; 0xfc27f + +TilesetTowerAnim: ; 0xfc27f + dw TowerPillarTilePointer9, AnimateTowerPillarTile + dw TowerPillarTilePointer10, AnimateTowerPillarTile + dw TowerPillarTilePointer7, AnimateTowerPillarTile + dw TowerPillarTilePointer8, AnimateTowerPillarTile + dw TowerPillarTilePointer5, AnimateTowerPillarTile + dw TowerPillarTilePointer6, AnimateTowerPillarTile + dw TowerPillarTilePointer3, AnimateTowerPillarTile + dw TowerPillarTilePointer4, AnimateTowerPillarTile + dw TowerPillarTilePointer1, AnimateTowerPillarTile + dw TowerPillarTilePointer2, AnimateTowerPillarTile + dw NULL, StandingTileFrame + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc2bf + +UnusedTilesetAnim_fc2bf: ; 0xfc2bf + dw vTiles2 tile $4f, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $4f, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc2e7 + +TilesetBattleTowerOutsideAnim: ; 0xfc2e7 +TilesetHouseAnim: ; 0xfc2e7 +TilesetPlayersHouseAnim: ; 0xfc2e7 +TilesetPokecenterAnim: ; 0xfc2e7 +TilesetGateAnim: ; 0xfc2e7 +TilesetLabAnim: ; 0xfc2e7 +TilesetFacilityAnim: ; 0xfc2e7 +TilesetMartAnim: ; 0xfc2e7 +TilesetMansionAnim: ; 0xfc2e7 +TilesetGameCornerAnim: ; 0xfc2e7 +TilesetTraditionalHouseAnim: ; 0xfc2e7 +TilesetTrainStationAnim: ; 0xfc2e7 +TilesetChampionsRoomAnim: ; 0xfc2e7 +TilesetLighthouseAnim: ; 0xfc2e7 +TilesetPlayersRoomAnim: ; 0xfc2e7 +TilesetPokeComCenterAnim: ; 0xfc2e7 +TilesetBattleTowerAnim: ; 0xfc2e7 +TilesetRuinsOfAlphAnim: ; 0xfc2e7 +TilesetRadioTowerAnim: ; 0xfc2e7 +TilesetUndergroundAnim: ; 0xfc2e7 +TilesetBetaWordRoomAnim: ; 0xfc2e7 +TilesetHoOhWordRoomAnim: ; 0xfc2e7 +TilesetKabutoWordRoomAnim: ; 0xfc2e7 +TilesetOmanyteWordRoomAnim: ; 0xfc2e7 +TilesetAerodactylWordRoomAnim: ; 0xfc2e7 + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc2fb + +DoneTileAnimation: ; fc2fb +; Reset the animation command loop. + xor a + ld [hTileAnimFrame], a + +WaitTileAnimation: ; fc2fe +; Do nothing this frame. + ret +; fc2ff + +StandingTileFrame8: ; fc2ff + ld a, [wTileAnimationTimer] + inc a + and %111 + ld [wTileAnimationTimer], a + ret +; fc309 + + +ScrollTileRightLeft: ; fc309 +; Scroll right for 4 ticks, then left for 4 ticks. + ld a, [wTileAnimationTimer] + inc a + and %111 + ld [wTileAnimationTimer], a + and %100 + jr nz, ScrollTileLeft + jr ScrollTileRight +; fc318 + +ScrollTileUpDown: ; fc318 +; Scroll up for 4 ticks, then down for 4 ticks. + ld a, [wTileAnimationTimer] + inc a + and %111 + ld [wTileAnimationTimer], a + and %100 + jr nz, ScrollTileDown + jr ScrollTileUp +; fc327 + +ScrollTileLeft: ; fc327 + ld h, d + ld l, e + ld c, 4 +.loop +rept 4 + ld a, [hl] + rlca + ld [hli], a +endr + dec c + jr nz, .loop + ret +; fc33b + +ScrollTileRight: ; fc33b + ld h, d + ld l, e + ld c, 4 +.loop +rept 4 + ld a, [hl] + rrca + ld [hli], a +endr + dec c + jr nz, .loop + ret +; fc34f + +ScrollTileUp: ; fc34f + ld h, d + ld l, e + ld d, [hl] + inc hl + ld e, [hl] + ld bc, TILE_WIDTH * 2 - 2 + add hl, bc + ld a, TILE_WIDTH / 2 +.loop + ld c, [hl] + ld [hl], e + dec hl + ld b, [hl] + ld [hl], d + dec hl + ld e, [hl] + ld [hl], c + dec hl + ld d, [hl] + ld [hl], b + dec hl + dec a + jr nz, .loop + ret +; fc36a + +ScrollTileDown: ; fc36a + ld h, d + ld l, e + ld de, TILE_WIDTH * 2 - 2 + push hl + add hl, de + ld d, [hl] + inc hl + ld e, [hl] + pop hl + ld a, TILE_WIDTH / 2 +.loop + ld b, [hl] + ld [hl], d + inc hl + ld c, [hl] + ld [hl], e + inc hl + ld d, [hl] + ld [hl], b + inc hl + ld e, [hl] + ld [hl], c + inc hl + dec a + jr nz, .loop + ret +; fc387 + + +AnimateFountain: ; fc387 + ld hl, sp+0 + ld b, h + ld c, l + ld hl, .frames + ld a, [wTileAnimationTimer] + and %111 + add a + add l + ld l, a + jr nc, .okay + inc h +.okay + ld a, [hli] + ld h, [hl] + ld l, a + ld sp, hl + ld l, e + ld h, d + jp WriteTile + +.frames + dw .frame1 + dw .frame2 + dw .frame3 + dw .frame4 + dw .frame3 + dw .frame4 + dw .frame5 + dw .frame1 + +.frame1 INCBIN "gfx/tilesets/fountain/1.2bpp" +.frame2 INCBIN "gfx/tilesets/fountain/2.2bpp" +.frame3 INCBIN "gfx/tilesets/fountain/3.2bpp" +.frame4 INCBIN "gfx/tilesets/fountain/4.2bpp" +.frame5 INCBIN "gfx/tilesets/fountain/5.2bpp" +; fc402 + + +AnimateWaterTile: ; fc402 +; Draw a water tile for the current frame in VRAM tile at de. + +; Save sp in bc (see WriteTile). + ld hl, sp+0 + ld b, h + ld c, l + + ld a, [wTileAnimationTimer] + +; 4 tile graphics, updated every other frame. + and %110 + +; 2 x 8 = 16 bytes per tile + add a + add a + add a + + add LOW(WaterTileFrames) + ld l, a + ld a, 0 + adc HIGH(WaterTileFrames) + ld h, a + +; The stack now points to the start of the tile for this frame. + ld sp, hl + + ld l, e + ld h, d + + jp WriteTile +; fc41c + +WaterTileFrames: ; fc41c + INCBIN "gfx/tilesets/water/water.2bpp" +; fc45c + + +ForestTreeLeftAnimation: ; fc45c + ld hl, sp+0 + ld b, h + ld c, l + +; Only during the Celebi event. + ld a, [wCelebiEvent] + bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a + jr nz, .asm_fc46c + ld hl, ForestTreeLeftFrames + jr .asm_fc47d + +.asm_fc46c + ld a, [wTileAnimationTimer] + call GetForestTreeFrame + add a + add a + add a + add LOW(ForestTreeLeftFrames) + ld l, a + ld a, 0 + adc HIGH(ForestTreeLeftFrames) + ld h, a + +.asm_fc47d + ld sp, hl + ld hl, vTiles2 tile $0c + jp WriteTile +; fc484 + + +ForestTreeLeftFrames: ; fc484 + INCBIN "gfx/tilesets/forest-tree/1.2bpp" + INCBIN "gfx/tilesets/forest-tree/2.2bpp" +; fc4a4 + +ForestTreeRightFrames: ; fc4a4 + INCBIN "gfx/tilesets/forest-tree/3.2bpp" + INCBIN "gfx/tilesets/forest-tree/4.2bpp" +; fc4c4 + + +ForestTreeRightAnimation: ; fc4c4 + ld hl, sp+0 + ld b, h + ld c, l + +; Only during the Celebi event. + ld a, [wCelebiEvent] + bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a + jr nz, .asm_fc4d4 + ld hl, ForestTreeRightFrames + jr .asm_fc4eb + +.asm_fc4d4 + ld a, [wTileAnimationTimer] + call GetForestTreeFrame + add a + add a + add a + add LOW(ForestTreeLeftFrames) + ld l, a + ld a, 0 + adc HIGH(ForestTreeLeftFrames) + ld h, a + push bc + ld bc, ForestTreeRightFrames - ForestTreeLeftFrames + add hl, bc + pop bc + +.asm_fc4eb + ld sp, hl + ld hl, vTiles2 tile $0f + jp WriteTile +; fc4f2 + + +ForestTreeLeftAnimation2: ; fc4f2 + ld hl, sp+0 + ld b, h + ld c, l + +; Only during the Celebi event. + ld a, [wCelebiEvent] + bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a + jr nz, .asm_fc502 + ld hl, ForestTreeLeftFrames + jr .asm_fc515 + +.asm_fc502 + ld a, [wTileAnimationTimer] + call GetForestTreeFrame + xor 2 + add a + add a + add a + add LOW(ForestTreeLeftFrames) + ld l, a + ld a, 0 + adc HIGH(ForestTreeLeftFrames) + ld h, a + +.asm_fc515 + ld sp, hl + ld hl, vTiles2 tile $0c + jp WriteTile +; fc51c + + +ForestTreeRightAnimation2: ; fc51c + ld hl, sp+0 + ld b, h + ld c, l + +; Only during the Celebi event. + ld a, [wCelebiEvent] + bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a + jr nz, .asm_fc52c + ld hl, ForestTreeRightFrames + jr .asm_fc545 + +.asm_fc52c + ld a, [wTileAnimationTimer] + call GetForestTreeFrame + xor 2 + add a + add a + add a + add LOW(ForestTreeLeftFrames) + ld l, a + ld a, 0 + adc HIGH(ForestTreeLeftFrames) + ld h, a + push bc + ld bc, ForestTreeRightFrames - ForestTreeLeftFrames + add hl, bc + pop bc + +.asm_fc545 + ld sp, hl + ld hl, vTiles2 tile $0f + jp WriteTile +; fc54c + + +GetForestTreeFrame: ; fc54c +; Return 0 if a is even, or 2 if odd. + and a + jr z, .even + cp 1 + jr z, .odd + cp 2 + jr z, .even + cp 3 + jr z, .odd + cp 4 + jr z, .even + cp 5 + jr z, .odd + cp 6 + jr z, .even +.odd + ld a, 2 + scf + ret +.even + xor a + ret +; fc56d + + +AnimateFlowerTile: ; fc56d +; No parameters. + +; Save sp in bc (see WriteTile). + ld hl, sp+0 + ld b, h + ld c, l + +; Alternate tile graphic every other frame + ld a, [wTileAnimationTimer] + and %10 + ld e, a + +; CGB has different color mappings for flowers. + ld a, [hCGB] + and 1 + + add e + swap a + ld e, a + ld d, 0 + ld hl, FlowerTileFrames + add hl, de + ld sp, hl + + ld hl, vTiles2 tile $03 + + jp WriteTile +; fc58c + +FlowerTileFrames: ; fc58c + INCBIN "gfx/tilesets/flower/dmg_1.2bpp" + INCBIN "gfx/tilesets/flower/cgb_1.2bpp" + INCBIN "gfx/tilesets/flower/dmg_2.2bpp" + INCBIN "gfx/tilesets/flower/cgb_2.2bpp" +; fc5cc + + +LavaBubbleAnim1: ; fc5cc +; Splash in the bottom-right corner of the fountain. + ld hl, sp+0 + ld b, h + ld c, l + ld a, [wTileAnimationTimer] + and %110 + srl a + inc a + inc a + and %011 + swap a + ld e, a + ld d, 0 + ld hl, LavaBubbleFrames + add hl, de + ld sp, hl + ld hl, vTiles2 tile $5b + jp WriteTile +; fc5eb + + +LavaBubbleAnim2: ; fc5eb +; Splash in the top-left corner of the fountain. + ld hl, sp+0 + ld b, h + ld c, l + ld a, [wTileAnimationTimer] + and %110 + add a + add a + add a + ld e, a + ld d, 0 + ld hl, LavaBubbleFrames + add hl, de + ld sp, hl + ld hl, vTiles2 tile $38 + jp WriteTile +; fc605 + + +LavaBubbleFrames: ; fc605 + INCBIN "gfx/tilesets/lava/1.2bpp" + INCBIN "gfx/tilesets/lava/2.2bpp" + INCBIN "gfx/tilesets/lava/3.2bpp" + INCBIN "gfx/tilesets/lava/4.2bpp" +; fc645 + + +AnimateTowerPillarTile: ; fc645 +; Read from struct at de: +; Destination (VRAM) +; Address of the first tile in the frame array + + ld hl, sp+0 + ld b, h + ld c, l + + ld a, [wTileAnimationTimer] + and %111 + +; Get frame index a + ld hl, .frames + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, [hl] + +; Destination + ld l, e + ld h, d + ld e, [hl] + inc hl + ld d, [hl] + inc hl + +; Add the frame index to the starting address + add [hl] + inc hl + ld h, [hl] + ld l, a + ld a, 0 + adc h + ld h, a + + ld sp, hl + ld l, e + ld h, d + jr WriteTile + +.frames + db $00, $10, $20, $30, $40, $30, $20, $10 +; fc673 + + +StandingTileFrame: ; fc673 + ld hl, wTileAnimationTimer + inc [hl] + ret +; fc678 + + +AnimateWhirlpoolTile: ; fc678 +; Update whirlpool tile using struct at de. + +; Struct: +; VRAM address +; Address of the first tile + +; Only does one of 4 tiles at a time. + +; Save sp in bc (see WriteTile). + ld hl, sp+0 + ld b, h + ld c, l + +; de = VRAM address + ld l, e + ld h, d + ld e, [hl] + inc hl + ld d, [hl] + inc hl +; Tile address is now at hl. + +; Get the tile for this frame. + ld a, [wTileAnimationTimer] + and %11 ; 4 frames x2 + swap a ; * 16 bytes per tile + + add [hl] + inc hl + ld h, [hl] + ld l, a + ld a, 0 + adc h + ld h, a + +; The stack now points to the desired frame. + ld sp, hl + + ld l, e + ld h, d + + jr WriteTile +; fc696 + + +WriteTileFromBuffer: ; fc696 +; Write tiledata at wTileAnimBuffer to de. +; wTileAnimBuffer is loaded to sp for WriteTile. + + ld hl, sp+0 + ld b, h + ld c, l + + ld hl, wTileAnimBuffer + ld sp, hl + + ld h, d + ld l, e + jr WriteTile +; fc6a2 + + +WriteTileToBuffer: ; fc6a2 +; Write tiledata de to wTileAnimBuffer. +; de is loaded to sp for WriteTile. + + ld hl, sp+0 + ld b, h + ld c, l + + ld h, d + ld l, e + ld sp, hl + + ld hl, wTileAnimBuffer + + ; fallthrough + +WriteTile: ; fc6ac +; Write one 8x8 tile ($10 bytes) from sp to hl. + +; Warning: sp is saved in bc so we can abuse pop. +; sp is restored to address bc. Save sp in bc before calling. + + pop de + ld [hl], e + inc hl + ld [hl], d + +rept 7 + pop de + inc hl + ld [hl], e + inc hl + ld [hl], d +endr + +; restore sp + ld h, b + ld l, c + ld sp, hl + ret +; fc6d7 + + +TileAnimationPalette: ; fc6d7 +; Transition between color values 0-2 for color 0 in palette 3. + +; No palette changes on DMG. + ld a, [hCGB] + and a + ret z + +; We don't want to mess with non-standard palettes. + ld a, [rBGP] ; BGP + cp %11100100 + ret nz + +; Only update on even frames. + ld a, [wTileAnimationTimer] + ld l, a + and 1 ; odd + ret nz + +; Ready for BGPD input... + + ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_WATER + ld [rBGPI], a + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + +; Update color 0 in order 0 1 2 1 + ld a, l + and %110 ; frames 0 2 4 6 + jr z, .color0 + cp %100 ; frame 4 + jr z, .color2 + +.color1 + ld hl, wBGPals1 palette PAL_BG_WATER color 1 + ld a, [hli] + ld [rBGPD], a + ld a, [hli] + ld [rBGPD], a + jr .end + +.color0 + ld hl, wBGPals1 palette PAL_BG_WATER color 0 + ld a, [hli] + ld [rBGPD], a + ld a, [hli] + ld [rBGPD], a + jr .end + +.color2 + ld hl, wBGPals1 palette PAL_BG_WATER color 2 + ld a, [hli] + ld [rBGPD], a + ld a, [hli] + ld [rBGPD], a + +.end + pop af + ld [rSVBK], a + ret +; fc71e + + +FlickeringCaveEntrancePalette: ; fc71e +; No palette changes on DMG. + ld a, [hCGB] + and a + ret z +; We don't want to mess with non-standard palettes. + ld a, [rBGP] + cp %11100100 + ret nz +; We only want to be here if we're in a dark cave. + ld a, [wTimeOfDayPalset] + cp %11111111 ; 3,3,3,3 + ret nz + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a +; Ready for BGPD input... + ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_YELLOW + ld [rBGPI], a + ld a, [hVBlankCounter] + and %10 + jr nz, .bit1set + ld hl, wBGPals1 palette PAL_BG_YELLOW + jr .okay + +.bit1set + ld hl, wBGPals1 palette PAL_BG_YELLOW color 1 + +.okay + ld a, [hli] + ld [rBGPD], a + ld a, [hli] + ld [rBGPD], a + + pop af + ld [rSVBK], a + ret +; fc750 + + +TowerPillarTilePointer1: dw vTiles2 tile $2d, TowerPillarTile1 +TowerPillarTilePointer2: dw vTiles2 tile $2f, TowerPillarTile2 +TowerPillarTilePointer3: dw vTiles2 tile $3d, TowerPillarTile3 +TowerPillarTilePointer4: dw vTiles2 tile $3f, TowerPillarTile4 +TowerPillarTilePointer5: dw vTiles2 tile $3c, TowerPillarTile5 +TowerPillarTilePointer6: dw vTiles2 tile $2c, TowerPillarTile6 +TowerPillarTilePointer7: dw vTiles2 tile $4d, TowerPillarTile7 +TowerPillarTilePointer8: dw vTiles2 tile $4f, TowerPillarTile8 +TowerPillarTilePointer9: dw vTiles2 tile $5d, TowerPillarTile9 +TowerPillarTilePointer10: dw vTiles2 tile $5f, TowerPillarTile10 + +TowerPillarTile1: INCBIN "gfx/tilesets/tower-pillar/1.2bpp" +TowerPillarTile2: INCBIN "gfx/tilesets/tower-pillar/2.2bpp" +TowerPillarTile3: INCBIN "gfx/tilesets/tower-pillar/3.2bpp" +TowerPillarTile4: INCBIN "gfx/tilesets/tower-pillar/4.2bpp" +TowerPillarTile5: INCBIN "gfx/tilesets/tower-pillar/5.2bpp" +TowerPillarTile6: INCBIN "gfx/tilesets/tower-pillar/6.2bpp" +TowerPillarTile7: INCBIN "gfx/tilesets/tower-pillar/7.2bpp" +TowerPillarTile8: INCBIN "gfx/tilesets/tower-pillar/8.2bpp" +TowerPillarTile9: INCBIN "gfx/tilesets/tower-pillar/9.2bpp" +TowerPillarTile10: INCBIN "gfx/tilesets/tower-pillar/10.2bpp" +; fca98 + + +WhirlpoolFrames1: dw vTiles2 tile $32, WhirlpoolTiles1 +WhirlpoolFrames2: dw vTiles2 tile $33, WhirlpoolTiles2 +WhirlpoolFrames3: dw vTiles2 tile $42, WhirlpoolTiles3 +WhirlpoolFrames4: dw vTiles2 tile $43, WhirlpoolTiles4 +; fcaa8 + +WhirlpoolTiles1: INCBIN "gfx/tilesets/whirlpool/1.2bpp" +WhirlpoolTiles2: INCBIN "gfx/tilesets/whirlpool/2.2bpp" +WhirlpoolTiles3: INCBIN "gfx/tilesets/whirlpool/3.2bpp" +WhirlpoolTiles4: INCBIN "gfx/tilesets/whirlpool/4.2bpp" +; fcba8 diff --git a/engine/gfx/tileset_palettes.asm b/engine/gfx/tileset_palettes.asm new file mode 100644 index 000000000..e2c39c0ab --- /dev/null +++ b/engine/gfx/tileset_palettes.asm @@ -0,0 +1,151 @@ +LoadSpecialMapPalette: ; 494ac + ld a, [wMapTileset] + cp TILESET_POKECOM_CENTER + jr z, .pokecom_2f + cp TILESET_BATTLE_TOWER + jr z, .battle_tower + cp TILESET_ICE_PATH + jr z, .ice_path + cp TILESET_HOUSE + jr z, .house + cp TILESET_RADIO_TOWER + jr z, .radio_tower + cp TILESET_MANSION + jr z, .mansion_mobile + jr .do_nothing + +.pokecom_2f + call LoadPokeComPalette + scf + ret + +.battle_tower + call LoadBattleTowerPalette + scf + ret + +.ice_path + ld a, [wEnvironment] + and $7 + cp INDOOR ; Hall of Fame + jr z, .do_nothing + call LoadIcePathPalette + scf + ret + +.house + call LoadHousePalette + scf + ret + +.radio_tower + call LoadRadioTowerPalette + scf + ret + +.mansion_mobile + call LoadMansionPalette + scf + ret + +.do_nothing + and a + ret +; 494f2 + +LoadPokeComPalette: ; 494f2 + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, PokeComPalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 49501 + +PokeComPalette: ; 49501 +INCLUDE "gfx/tilesets/pokecom_center.pal" +; 49541 + +LoadBattleTowerPalette: ; 49541 + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, BattleTowerPalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 49550 + +BattleTowerPalette: ; 49550 +INCLUDE "gfx/tilesets/battle_tower.pal" +; 49590 + +LoadIcePathPalette: ; 49590 + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, IcePathPalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 4959f + +IcePathPalette: ; 4959f +INCLUDE "gfx/tilesets/ice_path.pal" +; 495df + +LoadHousePalette: ; 495df + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, HousePalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 495ee + +HousePalette: ; 495ee +INCLUDE "gfx/tilesets/house.pal" +; 4962e + +LoadRadioTowerPalette: ; 4962e + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, RadioTowerPalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 4963d + +RadioTowerPalette: ; 4963d +INCLUDE "gfx/tilesets/radio_tower.pal" +; 4967d + +MansionPalette1: ; 4967d +INCLUDE "gfx/tilesets/mansion_1.pal" +; 496c5 + +LoadMansionPalette: ; 496c5 + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, MansionPalette1 + ld bc, 8 palettes + call FarCopyWRAM + ld a, BANK(wBGPals1) + ld de, wBGPals1 palette PAL_BG_YELLOW + ld hl, MansionPalette2 + ld bc, 1 palettes + call FarCopyWRAM + ld a, BANK(wBGPals1) + ld de, wBGPals1 palette PAL_BG_WATER + ld hl, MansionPalette1 + 6 palettes + ld bc, 1 palettes + call FarCopyWRAM + ld a, BANK(wBGPals1) + ld de, wBGPals1 palette PAL_BG_ROOF + ld hl, MansionPalette1 + 8 palettes + ld bc, 1 palettes + call FarCopyWRAM + ret +; 496fe + +MansionPalette2: ; 496fe +INCLUDE "gfx/tilesets/mansion_2.pal" +; 49706 diff --git a/engine/gfx/timeofdaypals.asm b/engine/gfx/timeofdaypals.asm new file mode 100644 index 000000000..b8d43d252 --- /dev/null +++ b/engine/gfx/timeofdaypals.asm @@ -0,0 +1,415 @@ +DummyPredef35: ; 8c000 +DummyPredef36: + ret + +UpdateTimeOfDayPal:: ; 8c001 + call UpdateTime + ld a, [wTimeOfDay] + ld [wCurTimeOfDay], a + call GetTimePalette + ld [wTimeOfDayPal], a + ret +; 8c011 + + +_TimeOfDayPals:: ; 8c011 +; return carry if pals are changed + +; forced pals? + ld hl, wTimeOfDayPalFlags + bit 7, [hl] + jr nz, .dontchange + +; do we need to bother updating? + ld a, [wTimeOfDay] + ld hl, wCurTimeOfDay + cp [hl] + jr z, .dontchange + +; if so, the time of day has changed + ld a, [wTimeOfDay] + ld [wCurTimeOfDay], a + +; get palette id + call GetTimePalette + +; same palette as before? + ld hl, wTimeOfDayPal + cp [hl] + jr z, .dontchange + +; update palette id + ld [wTimeOfDayPal], a + +; save bg palette 7 + ld hl, wBGPals1 palette PAL_BG_TEXT + +; save wram bank + ld a, [rSVBK] + ld b, a + + ld a, BANK(wBGPals1) + ld [rSVBK], a + +; push palette + ld c, NUM_PAL_COLORS +.push + ld d, [hl] + inc hl + ld e, [hl] + inc hl + push de + dec c + jr nz, .push + +; restore wram bank + ld a, b + ld [rSVBK], a + + +; update sgb pals + ld b, SCGB_MAPPALS + call GetSGBLayout + + +; restore bg palette 7 + ld hl, wOBPals1 - 1 ; last byte in wBGPals1 + +; save wram bank + ld a, [rSVBK] + ld d, a + + ld a, BANK(wOBPals1) + ld [rSVBK], a + +; pop palette + ld e, NUM_PAL_COLORS +.pop + pop bc + ld [hl], c + dec hl + ld [hl], b + dec hl + dec e + jr nz, .pop + +; restore wram bank + ld a, d + ld [rSVBK], a + +; update palettes + call _UpdateTimePals + call DelayFrame + +; successful change + scf + ret + +.dontchange +; no change occurred + and a + ret +; 8c070 + + +_UpdateTimePals:: ; 8c070 + ld c, $9 ; normal + call GetTimePalFade + call DmgToCgbTimePals + ret +; 8c079 + +FadeInPalettes:: ; 8c079 + ld c, $12 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsDecHL + ret +; 8c084 + +FadeOutPalettes:: ; 8c084 + call FillWhiteBGColor + ld c, $9 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsIncHL + ret +; 8c092 + +BattleTowerFade: ; 8c092 + call FillWhiteBGColor + ld c, $9 + call GetTimePalFade + ld b, $4 +.asm_8c09c + call DmgToCgbTimePals + inc hl + inc hl + inc hl + ld c, $7 + call DelayFrames + dec b + jr nz, .asm_8c09c + ret +; 8c0ab + +FadeInQuickly: ; 8c0ab + ld c, $0 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsIncHL + ret +; 8c0b6 + +FadeBlackQuickly: ; 8c0b6 + ld c, $9 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsDecHL + ret +; 8c0c1 + + +FillWhiteBGColor: ; 8c0c1 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld hl, wBGPals1 + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld hl, wBGPals1 + 1 palettes + ld c, 6 +.loop + ld a, e + ld [hli], a + ld a, d + ld [hli], a +rept 6 + inc hl +endr + dec c + jr nz, .loop + + pop af + ld [rSVBK], a + ret +; 8c0e5 + +ReplaceTimeOfDayPals: ; 8c0e5 + ld hl, .BrightnessLevels + ld a, [wMapTimeOfDay] + cp $4 ; Dark cave, needs Flash + jr z, .DarkCave + and $7 + add l + ld l, a + ld a, $0 + adc h + ld h, a + ld a, [hl] + ld [wTimeOfDayPalset], a + ret + +.DarkCave: + ld a, [wStatusFlags] + bit STATUSFLAGS_FLASH_F, a + jr nz, .UsedFlash + ld a, %11111111 ; 3, 3, 3, 3 + ld [wTimeOfDayPalset], a + ret + +.UsedFlash: + ld a, %10101010 ; 2, 2, 2, 2 + ld [wTimeOfDayPalset], a + ret +; 8c10f (23:410f) + +.BrightnessLevels: ; 8c10f + dc 3, 2, 1, 0 + dc 1, 1, 1, 1 + dc 2, 2, 2, 2 + dc 0, 0, 0, 0 + dc 3, 3, 3, 3 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 +; 8c117 + +GetTimePalette: ; 8c117 + ld a, [wTimeOfDay] + ld e, a + ld d, 0 + ld hl, .TimePalettes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 8c126 + +.TimePalettes: + dw .MorningPalette + dw .DayPalette + dw .NitePalette + dw .DarknessPalette + +.MorningPalette: + ld a, [wTimeOfDayPalset] + and %00000011 ; 0 + ret + +.DayPalette: + ld a, [wTimeOfDayPalset] + and %00001100 ; 1 + srl a + srl a + ret + +.NitePalette: + ld a, [wTimeOfDayPalset] + and %00110000 ; 2 + swap a + ret + +.DarknessPalette: + ld a, [wTimeOfDayPalset] + and %11000000 ; 3 + rlca + rlca + ret +; 8c14e + + +DmgToCgbTimePals: ; 8c14e + push hl + push de + ld a, [hli] + call DmgToCgbBGPals + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + call DmgToCgbObjPals + pop de + pop hl + ret +; 8c15e + +ConvertTimePalsIncHL: ; 8c15e +.loop + call DmgToCgbTimePals + inc hl + inc hl + inc hl + ld c, 2 + call DelayFrames + dec b + jr nz, .loop + ret +; 8c16d + +ConvertTimePalsDecHL: ; 8c16d +.loop + call DmgToCgbTimePals + dec hl + dec hl + dec hl + ld c, 2 + call DelayFrames + dec b + jr nz, .loop + ret +; 8c17c + + +GetTimePalFade: ; 8c17c +; check cgb + ld a, [hCGB] + and a + jr nz, .cgb + +; else: dmg + +; index + ld a, [wTimeOfDayPal] + and %11 + +; get fade table + push bc + ld c, a + ld b, $0 + ld hl, .dmgfades + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + pop bc + +; get place in fade table + ld b, $0 + add hl, bc + ret + +.cgb + ld hl, .cgbfade + ld b, $0 + add hl, bc + ret + +.dmgfades + dw .morn + dw .day + dw .nite + dw .darkness + +.morn + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11100100, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.day + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11100100, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.nite + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11101001, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.darkness + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111111 + db %11111110, %11100100, %11111111 + db %11111101, %11010000, %11111111 + db %11111101, %10000000, %11111111 + db %00000000, %01000000, %00000000 + db %00000000, %00000000, %00000000 + +.cgbfade + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11111001, %11111001 + db %11100100, %11100100, %11100100 + db %10010000, %10010000, %10010000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 +; 8c20f diff --git a/engine/gfx/trade_animation.asm b/engine/gfx/trade_animation.asm new file mode 100755 index 000000000..04c31df80 --- /dev/null +++ b/engine/gfx/trade_animation.asm @@ -0,0 +1,1646 @@ +TRADEANIM_RIGHT_ARROW EQU $ed +TRADEANIM_LEFT_ARROW EQU $ee + +; TradeAnim_TubeAnimJumptable.Jumptable indexes + const_def + const TRADEANIMSTATE_0 ; 0 + const TRADEANIMSTATE_1 ; 1 + const TRADEANIMSTATE_2 ; 2 + const TRADEANIMSTATE_3 ; 3 +TRADEANIMJUMPTABLE_LENGTH EQU const_value + +TradeAnimation: ; 28f24 + xor a + ld [wcf66], a + ld hl, wPlayerTrademonSenderName + ld de, wOTTrademonSenderName + call LinkTradeAnim_LoadTradePlayerNames + ld hl, wPlayerTrademonSpecies + ld de, wOTTrademonSpecies + call LinkTradeAnim_LoadTradeMonSpecies + ld de, .script + jr RunTradeAnimScript + +.script + tradeanim_setup_givemon_scroll + tradeanim_show_givemon_data + tradeanim_do_givemon_scroll + tradeanim_wait_80 + tradeanim_wait_96 + tradeanim_poof + tradeanim_rocking_ball + tradeanim_enter_link_tube + tradeanim_wait_anim + tradeanim_bulge_through_tube + tradeanim_wait_anim + tradeanim_textbox_scroll + tradeanim_give_trademon_sfx + tradeanim_tube_to_ot + tradeanim_sent_to_ot_text + tradeanim_scroll_out_right + + tradeanim_ot_sends_text_1 + tradeanim_ot_bids_farewell + tradeanim_wait_40 + tradeanim_scroll_out_right + tradeanim_get_trademon_sfx + tradeanim_tube_to_player + tradeanim_enter_link_tube + tradeanim_drop_ball + tradeanim_exit_link_tube + tradeanim_wait_anim + tradeanim_show_getmon_data + tradeanim_poof + tradeanim_wait_anim + tradeanim_frontpic_scroll + tradeanim_animate_frontpic + tradeanim_wait_80_if_ot_egg + tradeanim_textbox_scroll + tradeanim_take_care_of_text + tradeanim_scroll_out_right + tradeanim_end + +TradeAnimationPlayer2: ; 28f63 + xor a + ld [wcf66], a + ld hl, wOTTrademonSenderName + ld de, wPlayerTrademonSenderName + call LinkTradeAnim_LoadTradePlayerNames + ld hl, wOTTrademonSpecies + ld de, wPlayerTrademonSpecies + call LinkTradeAnim_LoadTradeMonSpecies + ld de, .script + jr RunTradeAnimScript + +.script + tradeanim_ot_sends_text_2 + tradeanim_ot_bids_farewell + tradeanim_wait_40 + tradeanim_scroll_out_right + tradeanim_get_trademon_sfx + tradeanim_tube_to_ot + tradeanim_enter_link_tube + tradeanim_drop_ball + tradeanim_exit_link_tube + tradeanim_wait_anim + tradeanim_show_getmon_data + tradeanim_poof + tradeanim_wait_anim + tradeanim_frontpic_scroll + tradeanim_animate_frontpic + tradeanim_wait_180_if_ot_egg + tradeanim_textbox_scroll + tradeanim_take_care_of_text + tradeanim_scroll_out_right + + tradeanim_setup_givemon_scroll + tradeanim_show_givemon_data + tradeanim_do_givemon_scroll + tradeanim_wait_40 + tradeanim_poof + tradeanim_rocking_ball + tradeanim_enter_link_tube + tradeanim_wait_anim + tradeanim_bulge_through_tube + tradeanim_wait_anim + tradeanim_textbox_scroll + tradeanim_give_trademon_sfx + tradeanim_tube_to_player + tradeanim_sent_to_ot_text + tradeanim_scroll_out_right + tradeanim_end + +RunTradeAnimScript: ; 28fa1 + ld hl, wTradeAnimAddress + ld [hl], e + inc hl + ld [hl], d + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a + ld hl, wVramState + ld a, [hl] + push af + res 0, [hl] + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + call .TradeAnimLayout + ld a, [wcf66] + and a + jr nz, .anim_loop + ld de, MUSIC_EVOLUTION + call PlayMusic2 +.anim_loop + call DoTradeAnimation + jr nc, .anim_loop + pop af + ld [wOptions], a + pop af + ld [wVramState], a + pop af + ld [hMapAnims], a + ret + +; 28fdb + +.TradeAnimLayout: ; 28fdb + xor a + ld [wJumptableIndex], a + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call DisableLCD + call LoadFontsBattleExtra + callfar ClearSpriteAnims + ld a, [hCGB] + and a + jr z, .NotCGB + ld a, $1 + ld [rVBK], a + ld hl, vTiles0 + ld bc, sScratch - vTiles0 + xor a + call ByteFill + ld a, $0 + ld [rVBK], a + +.NotCGB: + hlbgcoord 0, 0 + ld bc, sScratch - vBGMap0 + ld a, " " + call ByteFill + ld hl, TradeGameBoyLZ + ld de, vTiles2 tile $31 + call Decompress + ld hl, TradeArrowGFX + ld de, vTiles0 tile TRADEANIM_RIGHT_ARROW + ld bc, 1 tiles + ld a, BANK(TradeArrowGFX) + call FarCopyBytes + ld hl, TradeArrowGFX + 1 tiles + ld de, vTiles0 tile TRADEANIM_LEFT_ARROW + ld bc, 1 tiles + ld a, BANK(TradeArrowGFX) + call FarCopyBytes + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall GetTrademonFrontpic + call EnableLCD + call LoadTradeBallAndCableGFX + ld a, [wPlayerTrademonSpecies] + ld hl, wPlayerTrademonDVs + ld de, vTiles0 + call TradeAnim_GetFrontpic + ld a, [wOTTrademonSpecies] + ld hl, wOTTrademonDVs + ld de, vTiles0 tile $31 + call TradeAnim_GetFrontpic + ld a, [wPlayerTrademonSpecies] + ld de, wPlayerTrademonSpeciesName + call TradeAnim_GetNickname + ld a, [wOTTrademonSpecies] + ld de, wOTTrademonSpeciesName + call TradeAnim_GetNickname + call TradeAnim_NormalPals + ret + +; 29082 + +DoTradeAnimation: ; 29082 + ld a, [wJumptableIndex] + bit 7, a + jr nz, .finished + call .DoTradeAnimCommand + callfar PlaySpriteAnimations + ld hl, wcf65 + inc [hl] + call DelayFrame + and a + ret + +.finished + call LoadStandardFont + scf + ret + +; 290a0 + +.DoTradeAnimCommand: ; 290a0 + 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 +; 290af + +.JumpTable: ; 290af +; entries correspond to macros/scripts/trade_anims.asm enumeration + dw TradeAnim_AdvanceScriptPointer ; 00 + dw TradeAnim_ShowGivemonData ; 01 + dw TradeAnim_ShowGetmonData ; 02 + dw TradeAnim_EnterLinkTube1 ; 03 + dw TradeAnim_EnterLinkTube2 ; 04 + dw TradeAnim_ExitLinkTube ; 05 + dw TradeAnim_TubeToOT1 ; 06 + dw TradeAnim_TubeToOT2 ; 07 + dw TradeAnim_TubeToOT3 ; 08 + dw TradeAnim_TubeToOT4 ; 09 + dw TradeAnim_TubeToOT5 ; 0a + dw TradeAnim_TubeToOT6 ; 0b + dw TradeAnim_TubeToOT7 ; 0c + dw TradeAnim_TubeToOT8 ; 0d + dw TradeAnim_TubeToPlayer1 ; 0e + dw TradeAnim_TubeToPlayer2 ; 0f + dw TradeAnim_TubeToPlayer3 ; 10 + dw TradeAnim_TubeToPlayer4 ; 11 + dw TradeAnim_TubeToPlayer5 ; 12 + dw TradeAnim_TubeToPlayer6 ; 13 + dw TradeAnim_TubeToPlayer7 ; 14 + dw TradeAnim_TubeToPlayer8 ; 15 + dw TradeAnim_SentToOTText ; 16 + dw TradeAnim_OTBidsFarewell ; 17 + dw TradeAnim_TakeCareOfText ; 18 + dw TradeAnim_OTSendsText1 ; 19 + dw TradeAnim_OTSendsText2 ; 1a + dw TradeAnim_SetupGivemonScroll ; 1b + dw TradeAnim_DoGivemonScroll ; 1c + dw TradeAnim_FrontpicScrollStart ; 1d + dw TradeAnim_TextboxScrollStart ; 1e + dw TradeAnim_ScrollOutRight ; 1f + dw TradeAnim_ScrollOutRight2 ; 20 + dw TraideAnim_Wait80 ; 21 + dw TraideAnim_Wait40 ; 22 + dw TradeAnim_RockingBall ; 23 + dw TradeAnim_DropBall ; 24 + dw TradeAnim_WaitAnim ; 25 + dw TradeAnim_WaitAnim2 ; 26 + dw TradeAnim_Poof ; 27 + dw TradeAnim_BulgeThroughTube ; 28 + dw TradeAnim_GiveTrademonSFX ; 29 + dw TradeAnim_GetTrademonSFX ; 2a + dw TradeAnim_End ; 2b + dw TradeAnim_AnimateFrontpic ; 2c + dw TraideAnim_Wait96 ; 2d + dw TraideAnim_Wait80IfOTEgg ; 2e + dw TraideAnim_Wait180IfOTEgg ; 2f +; 2910f + +TradeAnim_IncrementJumptableIndex: ; 2910f + ld hl, wJumptableIndex + inc [hl] + ret + +; 29114 + +TradeAnim_AdvanceScriptPointer: ; 29114 + ld hl, wTradeAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + ld a, [de] + ld [wJumptableIndex], a + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +; 29123 + +TradeAnim_End: ; 29123 + ld hl, wJumptableIndex + set 7, [hl] + ret + +; 29129 + +TradeAnim_TubeToOT1: ; 29129 + ld a, TRADEANIM_RIGHT_ARROW + call TradeAnim_PlaceTrademonStatsOnTubeAnim + ld a, [wLinkTradeSendmonSpecies] + ld [wd265], a + xor a + depixel 5, 11, 4, 0 + ld b, $0 + jr TradeAnim_InitTubeAnim + +TradeAnim_TubeToPlayer1: ; 2913c + ld a, TRADEANIM_LEFT_ARROW + call TradeAnim_PlaceTrademonStatsOnTubeAnim + ld a, [wLinkTradeGetmonSpecies] + ld [wd265], a + ld a, TRADEANIMSTATE_2 + depixel 9, 18, 4, 4 + ld b, $4 +TradeAnim_InitTubeAnim: ; 2914e + push bc + push de + push bc + push de + + push af + call DisableLCD + callfar ClearSpriteAnims + hlbgcoord 20, 3 + ld bc, 12 + ld a, $60 + call ByteFill + pop af + + call TradeAnim_TubeAnimJumptable + + xor a + ld [hSCX], a + ld a, $7 + ld [hWX], a + ld a, $70 + ld [hWY], a + call EnableLCD + call LoadTradeBubbleGFX + + pop de + ld a, SPRITE_ANIM_INDEX_TRADEMON_ICON + call _InitSpriteAnimStruct + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + pop bc + ld [hl], b + + pop de + ld a, SPRITE_ANIM_INDEX_TRADEMON_BUBBLE + call _InitSpriteAnimStruct + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + pop bc + ld [hl], b + + call WaitBGMap + ld b, SCGB_TRADE_TUBE + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + ld a, %11010000 + call DmgToCgbObjPal0 + + call TradeAnim_IncrementJumptableIndex + ld a, 92 + ld [wFrameCounter], a + ret + +; 291af + +TradeAnim_TubeToOT2: ; 291af + call TradeAnim_FlashBGPals + ld a, [hSCX] + add $2 + ld [hSCX], a + cp $50 + ret nz + ld a, TRADEANIMSTATE_1 + call TradeAnim_TubeAnimJumptable + call TradeAnim_IncrementJumptableIndex + ret + +; 291c4 + +TradeAnim_TubeToOT3: ; 291c4 + call TradeAnim_FlashBGPals + ld a, [hSCX] + add $2 + ld [hSCX], a + cp $a0 + ret nz + ld a, TRADEANIMSTATE_2 + call TradeAnim_TubeAnimJumptable + call TradeAnim_IncrementJumptableIndex + ret + +; 291d9 + +TradeAnim_TubeToOT4: ; 291d9 + call TradeAnim_FlashBGPals + ld a, [hSCX] + add $2 + ld [hSCX], a + and a + ret nz + call TradeAnim_IncrementJumptableIndex + ret + +; 291e8 + +TradeAnim_TubeToPlayer3: ; 291e8 + call TradeAnim_FlashBGPals + ld a, [hSCX] + sub $2 + ld [hSCX], a + cp $b0 + ret nz + ld a, TRADEANIMSTATE_1 + call TradeAnim_TubeAnimJumptable + call TradeAnim_IncrementJumptableIndex + ret + +; 291fd + +TradeAnim_TubeToPlayer4: ; 291fd + call TradeAnim_FlashBGPals + ld a, [hSCX] + sub $2 + ld [hSCX], a + cp $60 + ret nz + xor a ; TRADEANIMSTATE_0 + call TradeAnim_TubeAnimJumptable + call TradeAnim_IncrementJumptableIndex + ret + +; 29211 + +TradeAnim_TubeToPlayer5: ; 29211 + call TradeAnim_FlashBGPals + ld a, [hSCX] + sub $2 + ld [hSCX], a + and a + ret nz + call TradeAnim_IncrementJumptableIndex + ret + +; 29220 + +TradeAnim_TubeToOT6: +TradeAnim_TubeToPlayer6: ; 29220 + ld a, 128 + ld [wFrameCounter], a + call TradeAnim_IncrementJumptableIndex + ret + +; 29229 + +TradeAnim_TubeToOT8: +TradeAnim_TubeToPlayer8: ; 29229 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + callfar ClearSpriteAnims + hlbgcoord 0, 0 + ld bc, sScratch - vBGMap0 + ld a, " " + call ByteFill + xor a + ld [hSCX], a + ld a, $90 + ld [hWY], a + call EnableLCD + call LoadTradeBallAndCableGFX + call WaitBGMap + call TradeAnim_NormalPals + call TradeAnim_AdvanceScriptPointer + ret + +; 2925d + +TradeAnim_TubeToOT5: +TradeAnim_TubeToOT7: +TradeAnim_TubeToPlayer2: +TradeAnim_TubeToPlayer7: ; 2925d + call TradeAnim_FlashBGPals + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + ret + +.done + call TradeAnim_IncrementJumptableIndex + ret + +; 2926d + +TradeAnim_GiveTrademonSFX: ; 2926d + call TradeAnim_AdvanceScriptPointer + ld de, SFX_GIVE_TRADEMON + call PlaySFX + ret + +; 29277 + +TradeAnim_GetTrademonSFX: ; 29277 + call TradeAnim_AdvanceScriptPointer + ld de, SFX_GET_TRADEMON + call PlaySFX + ret + +; 29281 + +TradeAnim_TubeAnimJumptable: ; 29281 + maskbits TRADEANIMJUMPTABLE_LENGTH + 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 +; 2928f + +.Jumptable: ; 2928f +; entries correspond to TRADEANIMSTATE_* constants + dw .Zero + dw .One + dw .Two + dw .Three +; 29297 + +.Zero: ; 29297 +.Three: ; 29297 + call TradeAnim_BlankTileMap + hlcoord 9, 3 + ld [hl], $5b + inc hl + ld bc, 10 + ld a, $60 + call ByteFill + hlcoord 3, 2 + call TradeAnim_CopyTradeGameBoyTilemap + ret + +; 292af + +.One: ; 292af + call TradeAnim_BlankTileMap + hlcoord 0, 3 + ld bc, SCREEN_WIDTH + ld a, $60 + call ByteFill + ret + +; 292be + +.Two: ; 292be + call TradeAnim_BlankTileMap + hlcoord 0, 3 + ld bc, $11 + ld a, $60 + call ByteFill + hlcoord 17, 3 + ld a, $5d + ld [hl], a + + ld a, $61 + ld de, SCREEN_WIDTH + ld c, $3 +.loop + add hl, de + ld [hl], a + dec c + jr nz, .loop + + add hl, de + ld a, $5f + ld [hld], a + ld a, $5b + ld [hl], a + hlcoord 10, 6 + call TradeAnim_CopyTradeGameBoyTilemap + ret + +; 292ec + +TradeAnim_CopyTradeGameBoyTilemap: ; 292ec + ld de, TradeGameBoyTilemap + lb bc, 8, 6 + call TradeAnim_CopyBoxFromDEtoHL + ret + +; 292f6 + +TradeAnim_PlaceTrademonStatsOnTubeAnim: ; 292f6 + push af + call ClearBGPalettes + call WaitTop + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + call ClearTileMap + hlcoord 0, 0 + ld bc, SCREEN_WIDTH + ld a, "─" + call ByteFill + hlcoord 0, 1 + ld de, wLinkPlayer1Name + call PlaceString + ld hl, wLinkPlayer2Name + ld de, 0 +.find_name_end_loop + ld a, [hli] + cp "@" + jr z, .done + dec de + jr .find_name_end_loop + +.done + hlcoord 0, 4 + add hl, de + ld de, wLinkPlayer2Name + call PlaceString + hlcoord 7, 2 + ld bc, 6 + pop af + call ByteFill + call WaitBGMap + call WaitTop + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + call ClearTileMap + ret + +; 29348 + +TradeAnim_EnterLinkTube1: ; 29348 + call ClearTileMap + call WaitTop + ld a, $a0 + ld [hSCX], a + call DelayFrame + hlcoord 8, 2 + ld de, TradeLinkTubeTilemap + lb bc, 3, 12 + call TradeAnim_CopyBoxFromDEtoHL + call WaitBGMap + ld b, SCGB_TRADE_TUBE + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + lb de, %11100100, %11100100 ; 3,2,1,0, 3,2,1,0 + call DmgToCgbObjPals + ld de, SFX_POTION + call PlaySFX + call TradeAnim_IncrementJumptableIndex + ret + +; 2937e + +TradeAnim_EnterLinkTube2: ; 2937e + ld a, [hSCX] + and a + jr z, .done + add $4 + ld [hSCX], a + ret + +.done + ld c, 80 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 29391 + +TradeAnim_ExitLinkTube: ; 29391 + ld a, [hSCX] + cp $a0 + jr z, .done + sub $4 + ld [hSCX], a + ret + +.done + call ClearTileMap + xor a + ld [hSCX], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293a6 + +TradeAnim_SetupGivemonScroll: ; 293a6 + ld a, $8f + ld [hWX], a + ld a, $88 + ld [hSCX], a + ld a, $50 + ld [hWY], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293b6 + +TradeAnim_DoGivemonScroll: ; 293b6 + ld a, [hWX] + cp $7 + jr z, .done + sub $4 + ld [hWX], a + ld a, [hSCX] + sub $4 + ld [hSCX], a + ret + +.done + ld a, $7 + ld [hWX], a + xor a + ld [hSCX], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293d2 + +TradeAnim_FrontpicScrollStart: ; 293d2 + ld a, $7 + ld [hWX], a + ld a, $50 + ld [hWY], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293de + +TradeAnim_TextboxScrollStart: ; 293de + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293ea + +TradeAnim_ScrollOutRight: ; 293ea + call WaitTop + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + call WaitBGMap + ld a, $7 + ld [hWX], a + xor a + ld [hWY], a + call DelayFrame + call WaitTop + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + call ClearTileMap + call TradeAnim_IncrementJumptableIndex + ret + +; 2940c + +TradeAnim_ScrollOutRight2: ; 2940c + ld a, [hWX] + cp $a1 + jr nc, .done + add $4 + ld [hWX], a + ret + +.done + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + call WaitBGMap + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + call TradeAnim_AdvanceScriptPointer + ret + +; 2942e + +TradeAnim_ShowGivemonData: ; 2942e + call ShowPlayerTrademonStats + ld a, [wPlayerTrademonSpecies] + ld [wCurPartySpecies], a + ld a, [wPlayerTrademonDVs] + ld [wTempMonDVs], a + ld a, [wPlayerTrademonDVs + 1] + ld [wTempMonDVs + 1], a + ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + call TradeAnim_ShowGivemonFrontpic + + ld a, [wPlayerTrademonSpecies] + call GetCryIndex + jr c, .skip_cry + ld e, c + ld d, b + call PlayCry +.skip_cry + + call TradeAnim_AdvanceScriptPointer + ret + +; 29461 + +TradeAnim_ShowGetmonData: ; 29461 + call ShowOTTrademonStats + ld a, [wOTTrademonSpecies] + ld [wCurPartySpecies], a + ld a, [wOTTrademonDVs] + ld [wTempMonDVs], a + ld a, [wOTTrademonDVs + 1] + ld [wTempMonDVs + 1], a + ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + call TradeAnim_ShowGetmonFrontpic + call TradeAnim_AdvanceScriptPointer + ret + +; 29487 + +TradeAnim_AnimateFrontpic: ; 29487 + farcall AnimateTrademonFrontpic + call TradeAnim_AdvanceScriptPointer + ret + +; 29491 + +TradeAnim_GetFrontpic: ; 29491 + push de + push af + predef GetUnownLetter + pop af + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + pop de + predef GetMonFrontpic + ret + +; 294a9 + +TradeAnim_GetNickname: ; 294a9 + push de + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 + pop de + ld bc, NAME_LENGTH + call CopyBytes + ret + +; 294bb + +TradeAnim_ShowGivemonFrontpic: ; 294bb + ld de, vTiles0 + jr TradeAnim_ShowFrontpic + +TradeAnim_ShowGetmonFrontpic: ; 294c0 + ld de, vTiles0 tile $31 +TradeAnim_ShowFrontpic: ; 294c3 + call DelayFrame + ld hl, vTiles2 + lb bc, 10, $31 + call Request2bpp + call WaitTop + call TradeAnim_BlankTileMap + hlcoord 7, 2 + xor a + ld [hGraphicStartTile], a + lb bc, 7, 7 + predef PlaceGraphic + call WaitBGMap + ret + +; 294e7 + +TraideAnim_Wait80: ; 294e7 + ld c, 80 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 294f0 + +TraideAnim_Wait40: ; 294f0 + ld c, 40 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 294f9 + +TraideAnim_Wait96: ; 294f9 + ld c, 96 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 29502 + +TraideAnim_Wait80IfOTEgg: ; 29502 + call IsOTTrademonEgg + ret nz + ld c, 80 + call DelayFrames + ret + +; 2950c + +TraideAnim_Wait180IfOTEgg: ; 2950c + call IsOTTrademonEgg + ret nz + ld c, 180 + call DelayFrames + ret + +; 29516 + +IsOTTrademonEgg: ; 29516 + call TradeAnim_AdvanceScriptPointer + ld a, [wOTTrademonSpecies] + cp EGG + ret + +; 2951f +ShowPlayerTrademonStats: ; 2951f + ld de, wPlayerTrademonSpecies + ld a, [de] + cp EGG + jr z, TrademonStats_Egg + call TrademonStats_MonTemplate + ld de, wPlayerTrademonSpecies + call TrademonStats_PrintSpeciesNumber + ld de, wPlayerTrademonSpeciesName + call TrademonStats_PrintSpeciesName + ld a, [wPlayerTrademonCaughtData] + ld de, wPlayerTrademonOTName + call TrademonStats_PrintOTName + ld de, wPlayerTrademonID + call TrademonStats_PrintTrademonID + call TrademonStats_WaitBGMap + ret + +; 29549 + +ShowOTTrademonStats: ; 29549 + ld de, wOTTrademonSpecies + ld a, [de] + cp EGG + jr z, TrademonStats_Egg + call TrademonStats_MonTemplate + ld de, wOTTrademonSpecies + call TrademonStats_PrintSpeciesNumber + ld de, wOTTrademonSpeciesName + call TrademonStats_PrintSpeciesName + ld a, [wOTTrademonCaughtData] + ld de, wOTTrademonOTName + call TrademonStats_PrintOTName + ld de, wOTTrademonID + call TrademonStats_PrintTrademonID + call TrademonStats_WaitBGMap + ret + +; 29573 + +TrademonStats_MonTemplate: ; 29573 + call WaitTop + call TradeAnim_BlankTileMap + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + hlcoord 3, 0 + ld b, $6 + ld c, $d + call TextBox + hlcoord 4, 0 + ld de, .OTMonData + call PlaceString + ret + +; 29591 + +.OTMonData: ; 29591 + db "─── №." + next "" + next "OT/" + next "№.@" +; 295a1 + +TrademonStats_Egg: ; 295a1 + call WaitTop + call TradeAnim_BlankTileMap + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + hlcoord 3, 0 + ld b, 6 + ld c, 13 + call TextBox + hlcoord 4, 2 + ld de, .EggData + call PlaceString + call TrademonStats_WaitBGMap + ret + +; 295c2 + +.EggData: ; 295c2 + db "EGG" + next "OT/?????" + next "№.?????@" +; 295d8 + +TrademonStats_WaitBGMap: ; 295d8 + call WaitBGMap + call WaitTop + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + ret + +; 295e3 + +TrademonStats_PrintSpeciesNumber: ; 295e3 + hlcoord 10, 0 + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + call PrintNum + ld [hl], " " + ret + +; 295ef + +TrademonStats_PrintSpeciesName: ; 295ef + hlcoord 4, 2 + call PlaceString + ret + +; 295f6 + +TrademonStats_PrintOTName: ; 295f6 + cp 3 + jr c, .caught_gender_okay + xor a +.caught_gender_okay + push af + hlcoord 7, 4 + call PlaceString + inc bc + pop af + ld hl, .Gender + ld d, 0 + ld e, a + add hl, de + ld a, [hl] + ld [bc], a + ret + +; 2960e + +.Gender: ; 2960e + db " ", "♂", "♀" +; 29611 + +TrademonStats_PrintTrademonID: ; 29611 + hlcoord 7, 6 + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + ret + +; 2961b + +TradeAnim_RockingBall: ; 2961b + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_TRADE_POKE_BALL + call _InitSpriteAnimStruct + call TradeAnim_AdvanceScriptPointer + ld a, 32 + ld [wFrameCounter], a + ret + +; 2962c + +TradeAnim_DropBall: ; 2962c + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_TRADE_POKE_BALL + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $1 + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $dc + call TradeAnim_AdvanceScriptPointer + ld a, 56 + ld [wFrameCounter], a + ret + +; 29649 + +TradeAnim_Poof: ; 29649 + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_TRADE_POOF + call _InitSpriteAnimStruct + call TradeAnim_AdvanceScriptPointer + ld a, 16 + ld [wFrameCounter], a + ld de, SFX_BALL_POOF + call PlaySFX + ret + +; 29660 + +TradeAnim_BulgeThroughTube: ; 29660 + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbObjPal0 + depixel 5, 11 + ld a, SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE + call _InitSpriteAnimStruct + call TradeAnim_AdvanceScriptPointer + ld a, 64 + ld [wFrameCounter], a + ret + +; 29676 + +TradeAnim_AnimateTrademonInTube: ; 29676 (a:5676) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 29686 + +.Jumptable: ; 29686 (a:5686) + dw .InitTimer + dw .WaitTimer1 + dw .MoveRight + dw .MoveDown + dw .MoveUp + dw .MoveLeft + dw .WaitTimer2 +; 2969a + +.JumptableNext: ; 29694 (a:5694) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +.InitTimer: ; 2969a (a:569a) + call .JumptableNext + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $80 + ret + +.WaitTimer1: ; 296a4 (a:56a4) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + dec [hl] + and a + ret nz + call .JumptableNext + +.MoveRight: ; 296af (a:56af) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $94 + jr nc, .done_move_right + inc [hl] + ret + +.done_move_right + call .JumptableNext + +.MoveDown: ; 296bd (a:56bd) + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $4c + jr nc, .done_move_down + inc [hl] + ret + +.done_move_down + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +.MoveUp: ; 296cf (a:56cf) + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $2c + jr z, .done_move_up + dec [hl] + ret + +.done_move_up + call .JumptableNext + +.MoveLeft: ; 296dd (a:56dd) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $58 + jr z, .done_move_left + dec [hl] + ret + +.done_move_left + call .JumptableNext + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $80 + ret + +.WaitTimer2: ; 296f2 (a:56f2) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + dec [hl] + and a + ret nz + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +; 29701 (a:5701) + +TradeAnim_SentToOTText: ; 29701 + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jr z, .time_capsule + ld hl, .Text_MonName + call PrintText + ld c, 189 + call DelayFrames + ld hl, .Text_WasSentTo + call PrintText + call TradeAnim_Wait80Frames + ld c, 128 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +.time_capsule + ld hl, .Text_WasSentTo + call PrintText + call TradeAnim_Wait80Frames + call TradeAnim_AdvanceScriptPointer + ret + +; 29732 + +.Text_WasSentTo: ; 0x29732 + ; was sent to @ . + text_jump UnknownText_0x1bc6e9 + db "@" +; 0x29737 + +.Text_MonName: ; 0x29737 + ; + text_jump UnknownText_0x1bc701 + db "@" +; 0x2973c + +TradeAnim_OTBidsFarewell: ; 2973c + ld hl, .Text_BidsFarewellToMon + call PrintText + call TradeAnim_Wait80Frames + ld hl, .Text_MonName + call PrintText + call TradeAnim_Wait80Frames + call TradeAnim_AdvanceScriptPointer + ret + +; 29752 + +.Text_BidsFarewellToMon: ; 0x29752 + ; bids farewell to + text_jump UnknownText_0x1bc703 + db "@" +; 0x29757 + +.Text_MonName: ; 0x29757 + ; . + text_jump UnknownText_0x1bc719 + db "@" +; 0x2975c + +TradeAnim_TakeCareOfText: ; 2975c + call WaitTop + hlcoord 0, 10 + ld bc, 8 * SCREEN_WIDTH + ld a, " " + call ByteFill + call WaitBGMap + ld hl, .Text_TakeGoodCareOfMon + call PrintText + call TradeAnim_Wait80Frames + call TradeAnim_AdvanceScriptPointer + ret + +; 2977a + +.Text_TakeGoodCareOfMon: ; 0x2977a + ; Take good care of @ . + text_jump UnknownText_0x1bc71f + db "@" +; 0x2977f + +TradeAnim_OTSendsText1: ; 2977f + ld hl, .Text_ForYourMon + call PrintText + call TradeAnim_Wait80Frames + ld hl, .Text_OTSends + call PrintText + call TradeAnim_Wait80Frames + ld c, 14 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 2979a + +.Text_ForYourMon: ; 0x2979a + ; For @ 's @ , + text_jump UnknownText_0x1bc739 + db "@" +; 0x2979f + +.Text_OTSends: ; 0x2979f + ; sends @ . + text_jump UnknownText_0x1bc74c + db "@" +; 0x297a4 + +TradeAnim_OTSendsText2: ; 297a4 + ld hl, .Text_WillTrade + call PrintText + call TradeAnim_Wait80Frames + ld hl, .Text_ForYourMon + call PrintText + call TradeAnim_Wait80Frames + ld c, 14 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 297bf + +.Text_WillTrade: ; 0x297bf + ; will trade @ @ + text_jump UnknownText_0x1bc75e + db "@" +; 0x297c4 + +.Text_ForYourMon: ; 0x297c4 + ; for @ 's @ . + text_jump UnknownText_0x1bc774 + db "@" +; 0x297c9 + +TradeAnim_Wait80Frames: ; 297c9 + ld c, 80 + call DelayFrames + ret + +; 297cf + +TradeAnim_BlankTileMap: ; 297cf + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill + ret + +; 297db + +TradeAnim_CopyBoxFromDEtoHL: ; 297db +.row + push bc + push hl +.col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret + +; 297ed + +TradeAnim_NormalPals: ; 297ed + ld a, [hSGB] + and a + ld a, %11100100 ; 3,2,1,0 + jr z, .not_sgb + ld a, $f0 + +.not_sgb + call DmgToCgbObjPal0 + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + ret + +; 297ff + +LinkTradeAnim_LoadTradePlayerNames: ; 297ff + push de + ld de, wLinkPlayer1Name + ld bc, NAME_LENGTH + call CopyBytes + pop hl + ld de, wLinkPlayer2Name + ld bc, NAME_LENGTH + call CopyBytes + ret + +; 29814 + +LinkTradeAnim_LoadTradeMonSpecies: ; 29814 + ld a, [hl] + ld [wLinkTradeSendmonSpecies], a + ld a, [de] + ld [wLinkTradeGetmonSpecies], a + ret + +; 2981d + +TradeAnim_FlashBGPals: ; 2981d + ld a, [wcf65] + and $7 + ret nz + ld a, [rBGP] + xor %00111100 + call DmgToCgbBGPals + ret + +; 2982b + +LoadTradeBallAndCableGFX: ; 2982b + call DelayFrame + ld de, TradeBallGFX + ld hl, vTiles0 tile $62 + lb bc, BANK(TradeBallGFX), 6 + call Request2bpp + ld de, TradePoofGFX + ld hl, vTiles0 tile $68 + lb bc, BANK(TradePoofGFX), 12 + call Request2bpp + ld de, TradeCableGFX + ld hl, vTiles0 tile $74 + lb bc, BANK(TradeCableGFX), 4 + call Request2bpp + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], $62 + ret + +; 2985a + +LoadTradeBubbleGFX: ; 2985a + call DelayFrame + ld e, $3 + callfar LoadMenuMonIcon + ld de, TradeBubbleGFX + ld hl, vTiles0 tile $72 + lb bc, BANK(TradeBubbleGFX), 4 + call Request2bpp + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], $62 + ret + +; 29879 + +TradeAnim_WaitAnim: ; 29879 + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + ret + +.done + call TradeAnim_AdvanceScriptPointer + ret + +; 29886 + +TradeAnim_WaitAnim2: ; 29886 + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + ret + +.done + call TradeAnim_AdvanceScriptPointer + ret + +; 29893 + + +Unreferenced_DebugTrade: ; 29893 +; This function is not referenced. +; It was meant for use in Japanese versions, so the +; constant used for copy length was changed by accident. + + ld hl, .DebugTradeData + + ld a, [hli] + ld [wPlayerTrademonSpecies], a + ld de, wPlayerTrademonSenderName + ld c, NAME_LENGTH + 2 ; JP: NAME_LENGTH_JAPANESE + 2 +.loop1 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop1 + + ld a, [hli] + ld [wOTTrademonSpecies], a + ld de, wOTTrademonSenderName + ld c, NAME_LENGTH + 2 ; JP: NAME_LENGTH_JAPANESE + 2 +.loop2 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop2 + ret + +; 298b5 + +debugtrade: MACRO +; species, ot name, ot id (?) + db \1, \2 + dw \3 +ENDM + +.DebugTradeData: ; 298b5 + debugtrade VENUSAUR, "ゲーフり@@", $0123 ; GAME FREAK + debugtrade CHARIZARD, "クりーチャ@", $0456 ; Creatures Inc. +; 298c7 + + +TradeGameBoyTilemap: ; 298c7 +; 6x8 + db $31, $32, $32, $32, $32, $33 + db $34, $35, $36, $36, $37, $38 + db $34, $39, $3a, $3a, $3b, $38 + db $3c, $3d, $3e, $3e, $3f, $40 + db $41, $42, $43, $43, $44, $45 + db $46, $47, $43, $48, $49, $4a + db $41, $43, $4b, $4c, $4d, $4e + db $4f, $50, $50, $50, $51, $52 +; 297f7 + +TradeLinkTubeTilemap: ; 297f7 +; 12x3 + db $43, $55, $56, $53, $53, $53, $53, $53, $53, $53, $53, $53 + db $43, $57, $58, $54, $54, $54, $54, $54, $54, $54, $54, $54 + db $43, $59, $5a, $43, $43, $43, $43, $43, $43, $43, $43, $43 +; 2991b + +TradeArrowGFX: INCBIN "gfx/trade/arrow.2bpp" +TradeCableGFX: INCBIN "gfx/trade/cable.2bpp" +TradeBubbleGFX: INCBIN "gfx/trade/bubble.2bpp" +TradeGameBoyLZ: INCBIN "gfx/trade/game_boy.2bpp.lz" +TradeBallGFX: INCBIN "gfx/trade/ball.2bpp" +TradePoofGFX: INCBIN "gfx/trade/poof.2bpp" diff --git a/engine/health.asm b/engine/health.asm deleted file mode 100755 index cc47e8252..000000000 --- a/engine/health.asm +++ /dev/null @@ -1,110 +0,0 @@ -HealParty: ; c658 - xor a - ld [wCurPartyMon], a - ld hl, wPartySpecies -.loop - ld a, [hli] - cp -1 - jr z, .done - cp EGG - jr z, .next - - push hl - call HealPartyMon - pop hl - -.next - ld a, [wCurPartyMon] - inc a - ld [wCurPartyMon], a - jr .loop - -.done - ret - -HealPartyMon: ; c677 - ld a, MON_SPECIES - call GetPartyParamLocation - ld d, h - ld e, l - - ld hl, MON_STATUS - add hl, de - xor a - ld [hli], a - ld [hl], a - - ld hl, MON_MAXHP - add hl, de - - ; bc = MON_HP - ld b, h - ld c, l - dec bc - dec bc - - ld a, [hli] - ld [bc], a - inc bc - ld a, [hl] - ld [bc], a - - farcall RestoreAllPP - ret - -ComputeHPBarPixels: ; c699 -; e = bc * (6 * 8) / de - ld a, b - or c - jr z, .zero - push hl - xor a - ld [hMultiplicand + 0], a - ld a, b - ld [hMultiplicand + 1], a - ld a, c - ld [hMultiplicand + 2], a - ld a, 6 * 8 - ld [hMultiplier], a - call Multiply - ; We need de to be under 256 because hDivisor is only 1 byte. - ld a, d - and a - jr z, .divide - ; divide de and hProduct by 4 - srl d - rr e - srl d - rr e - ld a, [hProduct + 2] - ld b, a - ld a, [hProduct + 3] - srl b - rr a - srl b - rr a - ld [hDividend + 3], a - ld a, b - ld [hDividend + 2], a -.divide - ld a, e - ld [hDivisor], a - ld b, 4 - call Divide - ld a, [hQuotient + 2] - ld e, a - pop hl - and a - ret nz - ld e, 1 - ret - -.zero - ld e, 0 - ret - -AnimateHPBar: ; c6e0 - call WaitBGMap - call _AnimateHPBar - call WaitBGMap - ret diff --git a/engine/init_hof_credits.asm b/engine/init_hof_credits.asm deleted file mode 100644 index e8e98a0e1..000000000 --- a/engine/init_hof_credits.asm +++ /dev/null @@ -1,79 +0,0 @@ -InitDisplayForHallOfFame: ; 4e881 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - call LoadStandardFont - call LoadFontsBattleExtra - hlbgcoord 0, 0 - ld bc, vBGMap1 - vBGMap0 - ld a, " " - call ByteFill - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - xor a - ld [hSCY], a - ld [hSCX], a - call EnableLCD - ld hl, .SavingRecordDontTurnOff - call PrintText - call WaitBGMap2 - call SetPalettes - ret - -.SavingRecordDontTurnOff: ; 0x4e8bd - ; SAVING RECORD… DON'T TURN OFF! - text_jump UnknownText_0x1bd39e - db "@" - -InitDisplayForRedCredits: ; 4e8c2 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - call LoadStandardFont - call LoadFontsBattleExtra - hlbgcoord 0, 0 - ld bc, vBGMap1 - vBGMap0 - ld a, " " - call ByteFill - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - ld hl, wBGPals1 - ld c, 4 tiles -.load_white_palettes - ld a, LOW(PALRGB_WHITE) - ld [hli], a - ld a, HIGH(PALRGB_WHITE) - ld [hli], a - dec c - jr nz, .load_white_palettes - xor a - ld [hSCY], a - ld [hSCX], a - call EnableLCD - call WaitBGMap2 - call SetPalettes - ret - -ResetDisplayBetweenHallOfFameMons: ; 4e906 - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - ld hl, wDecompressScratch - ld bc, wScratchAttrMap - wDecompressScratch - ld a, " " - call ByteFill - hlbgcoord 0, 0 - ld de, wDecompressScratch - ld b, 0 - ld c, 4 tiles - call Request2bpp - pop af - ld [rSVBK], a - ret diff --git a/engine/init_map.asm b/engine/init_map.asm deleted file mode 100644 index 2eb4998a6..000000000 --- a/engine/init_map.asm +++ /dev/null @@ -1,103 +0,0 @@ -ReanchorBGMap_NoOAMUpdate:: ; 6454 - call DelayFrame - ld a, [hOAMUpdate] - push af - - ld a, $1 - ld [hOAMUpdate], a - ld a, [hBGMapMode] - push af - xor a - ld [hBGMapMode], a - - call .ReanchorBGMap - - pop af - ld [hBGMapMode], a - pop af - ld [hOAMUpdate], a - ld hl, wVramState - set 6, [hl] - ret - -.ReanchorBGMap: - xor a - ld [hLCDCPointer], a - ld [hBGMapMode], a - ld a, $90 - ld [hWY], a - call OverworldTextModeSwitch - ld a, HIGH(vBGMap1) - call .LoadBGMapAddrIntoHRAM - call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap - farcall LoadOW_BGPal7 - farcall ApplyPals - ld a, $1 - ld [hCGBPalUpdate], a - xor a - ld [hBGMapMode], a - ld [hWY], a - farcall HDMATransfer_FillBGMap0WithBlack ; no need to farcall - ld a, HIGH(vBGMap0) - call .LoadBGMapAddrIntoHRAM - xor a ; LOW(vBGMap0) - ld [wBGMapAnchor], a - ld a, HIGH(vBGMap0) - ld [wBGMapAnchor + 1], a - xor a - ld [hSCX], a - ld [hSCY], a - call ApplyBGMapAnchorToObjects - ret - -.LoadBGMapAddrIntoHRAM: ; 64b9 - ld [hBGMapAddress + 1], a - xor a - ld [hBGMapAddress], a - ret - -LoadFonts_NoOAMUpdate:: ; 64bf - ld a, [hOAMUpdate] - push af - ld a, $1 - ld [hOAMUpdate], a - - call .LoadGFX - - pop af - ld [hOAMUpdate], a - ret - -.LoadGFX: - call LoadFontsExtra - ld a, $90 - ld [hWY], a - call SafeUpdateSprites - call LoadStandardFont - ret - -HDMATransfer_FillBGMap0WithBlack: ; 64db - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - ld a, "■" - ld hl, wDecompressScratch - ld bc, wScratchAttrMap - wDecompressScratch - call ByteFill - ld a, HIGH(wDecompressScratch) - ld [rHDMA1], a - ld a, LOW(wDecompressScratch) - ld [rHDMA2], a - ld a, HIGH(vBGMap0 % $8000) - ld [rHDMA3], a - ld a, LOW(vBGMap0 % $8000) - ld [rHDMA4], a - ld a, $3f - ld [hDMATransfer], a - call DelayFrame - - pop af - ld [rSVBK], a - ret diff --git a/engine/landmarks.asm b/engine/landmarks.asm deleted file mode 100644 index f16f48e67..000000000 --- a/engine/landmarks.asm +++ /dev/null @@ -1,87 +0,0 @@ -GetLandmarkCoords: ; 0x1ca896 -; Return coordinates (d, e) of landmark e. - push hl - ld l, e - ld h, 0 - add hl, hl - add hl, hl - ld de, Landmarks - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - pop hl - ret -; 0x1ca8a5 - - -GetLandmarkName:: ; 0x1ca8a5 -; Copy the name of landmark e to wStringBuffer1. - push hl - push de - push bc - - ld l, e - ld h, 0 - add hl, hl - add hl, hl - ld de, Landmarks + 2 - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - - ld de, wStringBuffer1 - ld c, 18 -.copy - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .copy - - pop bc - pop de - pop hl - ret -; 0x1ca8c3 - - -INCLUDE "data/maps/landmarks.asm" - - -RegionCheck: ; 0x1caea1 -; Checks if the player is in Kanto or Johto. -; If in Johto, returns 0 in e. -; If in Kanto, returns 1 in e. - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - call GetWorldMapLocation - cp FAST_SHIP ; S.S. Aqua - jr z, .johto - cp SPECIAL_MAP - jr nz, .checkagain - -; In a special map, get the backup map group / map id - ld a, [wBackupMapGroup] - ld b, a - ld a, [wBackupMapNumber] - ld c, a - call GetWorldMapLocation - -.checkagain - cp KANTO_LANDMARK - jr c, .johto - -; Victory Road area is considered to be Johto. - cp VICTORY_ROAD - jr c, .kanto - -.johto - ld e, JOHTO_REGION - ret -.kanto - ld e, KANTO_REGION - ret diff --git a/engine/learn.asm b/engine/learn.asm deleted file mode 100755 index fb62289a7..000000000 --- a/engine/learn.asm +++ /dev/null @@ -1,256 +0,0 @@ -LearnMove: ; 6508 - call LoadTileMapToTempTileMap - ld a, [wCurPartyMon] - ld hl, wPartyMonNicknames - call GetNick - ld hl, wStringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - -.loop - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld d, h - ld e, l - ld b, NUM_MOVES -; Get the first empty move slot. This routine also serves to -; determine whether the Pokemon learning the moves already has -; all four slots occupied, in which case one would need to be -; deleted. -.next - ld a, [hl] - and a - jr z, .learn - inc hl - dec b - jr nz, .next -; If we're here, we enter the routine for forgetting a move -; to make room for the new move we're trying to learn. - push de - call ForgetMove - pop de - jp c, .cancel - - push hl - push de - ld [wd265], a - - ld b, a - ld a, [wBattleMode] - and a - jr z, .not_disabled - ld a, [wDisabledMove] - cp b - jr nz, .not_disabled - xor a - ld [wDisabledMove], a - ld [wPlayerDisableCount], a -.not_disabled - - call GetMoveName - ld hl, Text_1_2_and_Poof ; 1, 2 and… - call PrintText - pop de - pop hl - -.learn - ld a, [wPutativeTMHMMove] - ld [hl], a - ld bc, MON_PP - MON_MOVES - add hl, bc - - push hl - push de - dec a - ld hl, Moves + MOVE_PP - ld bc, MOVE_LENGTH - call AddNTimes - ld a, BANK(Moves) - call GetFarByte - pop de - pop hl - - ld [hl], a - - ld a, [wBattleMode] - and a - jp z, .learned - - ld a, [wCurPartyMon] - ld b, a - ld a, [wCurBattleMon] - cp b - jp nz, .learned - - ld a, [wPlayerSubStatus5] - bit SUBSTATUS_TRANSFORMED, a - jp nz, .learned - - ld h, d - ld l, e - ld de, wBattleMonMoves - ld bc, NUM_MOVES - call CopyBytes - ld bc, wPartyMon1PP - (wPartyMon1Moves + NUM_MOVES) - add hl, bc - ld de, wBattleMonPP - ld bc, NUM_MOVES - call CopyBytes - jp .learned - -.cancel - ld hl, Text_StopLearning ; Stop learning ? - call PrintText - call YesNoBox - jp c, .loop - - ld hl, Text_DidNotLearn ; did not learn . - call PrintText - ld b, 0 - ret - -.learned - ld hl, Text_LearnedMove ; learned ! - call PrintText - ld b, 1 - ret -; 65d3 - -ForgetMove: ; 65d3 - push hl - ld hl, Text_TryingToLearn - call PrintText - call YesNoBox - pop hl - ret c - ld bc, -NUM_MOVES - add hl, bc - push hl - ld de, wListMoves_MoveIndicesBuffer - ld bc, NUM_MOVES - call CopyBytes - pop hl -.loop - push hl - ld hl, Text_ForgetWhich - call PrintText - hlcoord 5, 2 - ld b, NUM_MOVES * 2 - ld c, MOVE_NAME_LENGTH - call TextBox - hlcoord 5 + 2, 2 + 2 - ld a, SCREEN_WIDTH * 2 - ld [wBuffer1], a - predef ListMoves - ; w2DMenuData - ld a, $4 - ld [w2DMenuCursorInitY], a - ld a, $6 - ld [w2DMenuCursorInitX], a - ld a, [wNumMoves] - inc a - ld [w2DMenuNumRows], a - ld a, $1 - ld [w2DMenuNumCols], a - ld [wMenuCursorY], a - ld [wMenuCursorX], a - ld a, $3 - ld [wMenuJoypadFilter], a - ld a, $20 - ld [w2DMenuFlags1], a - xor a - ld [w2DMenuFlags2], a - ld a, $20 - ld [w2DMenuCursorOffsets], a - call StaticMenuJoypad - push af - call Call_LoadTempTileMapToTileMap - pop af - pop hl - bit 1, a - jr nz, .cancel - push hl - ld a, [wMenuCursorY] - dec a - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - push af - push bc - call IsHMMove - pop bc - pop de - ld a, d - jr c, .hmmove - pop hl - add hl, bc - and a - ret - -.hmmove - ld hl, Text_CantForgetHM - call PrintText - pop hl - jr .loop - -.cancel - scf - ret -; 666b - -Text_LearnedMove: ; 666b -; learned ! - text_jump UnknownText_0x1c5660 - db "@" -; 6670 - -Text_ForgetWhich: ; 6670 -; Which move should be forgotten? - text_jump UnknownText_0x1c5678 - db "@" -; 6675 - -Text_StopLearning: ; 6675 -; Stop learning ? - text_jump UnknownText_0x1c5699 - db "@" -; 667a - -Text_DidNotLearn: ; 667a -; did not learn . - text_jump UnknownText_0x1c56af - db "@" -; 667f - -Text_TryingToLearn: ; 667f -; is trying to learn . But can't learn more than -; four moves. Delete an older move to make room for ? - text_jump UnknownText_0x1c56c9 - db "@" -; 6684 - -Text_1_2_and_Poof: ; 6684 - text_jump UnknownText_0x1c5740 ; 1, 2 and… - start_asm - push de - ld de, SFX_SWITCH_POKEMON - call PlaySFX - pop de - ld hl, .PoofForgot - ret - -.PoofForgot: -; Poof! forgot . And… - text_jump UnknownText_0x1c574e - db "@" -; 669a - -Text_CantForgetHM: ; 669a -; HM moves can't be forgotten now. - text_jump UnknownText_0x1c5772 - db "@" -; 669f diff --git a/engine/link.asm b/engine/link.asm deleted file mode 100755 index c693e6919..000000000 --- a/engine/link.asm +++ /dev/null @@ -1,2589 +0,0 @@ -LinkCommunications: ; 28000 - call ClearBGPalettes - ld c, 80 - call DelayFrames - call ClearScreen - call ClearSprites - call UpdateSprites - xor a - ld [hSCX], a - ld [hSCY], a - ld c, 80 - call DelayFrames - call ClearScreen - call UpdateSprites - call LoadStandardFont - call LoadFontsBattleExtra - farcall LinkComms_LoadPleaseWaitTextboxBorderGFX - call WaitBGMap2 - hlcoord 3, 8 - ld b, 2 - ld c, 12 - ld d, h - ld e, l - farcall LinkTextbox2 - hlcoord 4, 10 - ld de, String_PleaseWait - call PlaceString - call SetTradeRoomBGPals - call WaitBGMap2 - ld hl, wcf5d - xor a ; LOW($5000) - ld [hli], a - ld [hl], HIGH($5000) - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jp nz, Gen2ToGen2LinkComms - -Gen2ToGen1LinkComms: ; 2805d - call ClearLinkData - call Link_PrepPartyData_Gen1 - call FixDataForLinkTransfer - xor a - ld [wPlayerLinkAction], a - call WaitLinkTransfer - ld a, [hSerialConnectionStatus] - cp USING_INTERNAL_CLOCK - jr nz, .player_1 - - ld c, 3 - call DelayFrames - xor a - ld [hSerialSend], a - ld a, (0 << rSC_ON) | 1 - ld [rSC], a - ld a, (1 << rSC_ON) | 1 - ld [rSC], a - - call DelayFrame - xor a - ld [hSerialSend], a - ld a, (0 << rSC_ON) | 1 - ld [rSC], a - ld a, (1 << rSC_ON) | 1 - ld [rSC], a - -.player_1 - ld de, MUSIC_NONE - call PlayMusic - ld c, 3 - call DelayFrames - xor a - ld [rIF], a - ld a, $8 - ld [rIE], a - ld hl, wd1f3 - ld de, wEnemyMonSpecies - ld bc, $11 - call Serial_ExchangeBytes - ld a, SERIAL_NO_DATA_BYTE - ld [de], a - ld hl, wLinkData - ld de, wOTPlayerName - ld bc, $1a8 - call Serial_ExchangeBytes - ld a, SERIAL_NO_DATA_BYTE - ld [de], a - ld hl, wMisc - ld de, wPlayerTrademonSpecies - ld bc, wPlayerTrademonSpecies - wMisc - call Serial_ExchangeBytes - xor a - ld [rIF], a - ld a, $1d - ld [rIE], a - call Link_CopyRandomNumbers - ld hl, wOTPlayerName - call Link_FindFirstNonControlCharacter_SkipZero - push hl - ld bc, NAME_LENGTH - add hl, bc - ld a, [hl] - pop hl - and a - jp z, Function28b22 - cp $7 - jp nc, Function28b22 - ld de, wLinkData - ld bc, $1a2 - call Link_CopyOTData - ld de, wPlayerTrademonSpecies - ld hl, wTimeCapsulePartyMon1Species - ld c, 2 -.loop - ld a, [de] - inc de - and a - jr z, .loop - cp SERIAL_PREAMBLE_BYTE - jr z, .loop - cp SERIAL_NO_DATA_BYTE - jr z, .loop - cp SERIAL_PATCH_LIST_PART_TERMINATOR - jr z, .next - push hl - push bc - ld b, 0 - dec a - ld c, a - add hl, bc - ld a, SERIAL_NO_DATA_BYTE - ld [hl], a - pop bc - pop hl - jr .loop - -.next - ld hl, wc90f - dec c - jr nz, .loop - ld hl, wLinkPlayerName - ld de, wOTPlayerName - ld bc, NAME_LENGTH - call CopyBytes - ld de, wOTPartyCount - ld a, [hli] - ld [de], a - inc de -.party_loop - ld a, [hli] - cp -1 - jr z, .done_party - ld [wd265], a - push hl - push de - callfar ConvertMon_1to2 - pop de - pop hl - ld a, [wd265] - ld [de], a - inc de - jr .party_loop - -.done_party - ld [de], a - ld hl, wTimeCapsulePartyMon1Species - call Function2868a - ld a, LOW(wOTPartyMonOT) - ld [wUnusedD102], a - ld a, HIGH(wOTPartyMonOT) - ld [wUnusedD102 + 1], a - ld de, MUSIC_NONE - call PlayMusic - ld a, [hSerialConnectionStatus] - cp USING_INTERNAL_CLOCK - ld c, 66 - call z, DelayFrames - ld de, MUSIC_ROUTE_30 - call PlayMusic - jp InitTradeMenuDisplay -; 28177 - -Gen2ToGen2LinkComms: ; 28177 - call ClearLinkData - call Link_PrepPartyData_Gen2 - call FixDataForLinkTransfer - call Function29dba - ld a, [wScriptVar] - and a - jp z, LinkTimeout - ld a, [hSerialConnectionStatus] - cp USING_INTERNAL_CLOCK - jr nz, .Player1 - - ld c, 3 - call DelayFrames - xor a - ld [hSerialSend], a - ld a, (0 << rSC_ON) | 1 - ld [rSC], a - ld a, (1 << rSC_ON) | 1 - ld [rSC], a - - call DelayFrame - xor a - ld [hSerialSend], a - ld a, (0 << rSC_ON) | 1 - ld [rSC], a - ld a, (1 << rSC_ON) | 1 - ld [rSC], a - -.Player1: - ld de, MUSIC_NONE - call PlayMusic - ld c, 3 - call DelayFrames - xor a - ld [rIF], a - ld a, $8 - ld [rIE], a - ld hl, wd1f3 - ld de, wEnemyMonSpecies - ld bc, $11 - call Serial_ExchangeBytes - ld a, SERIAL_NO_DATA_BYTE - ld [de], a - ld hl, wLinkData - ld de, wOTPlayerName - ld bc, $1c2 - call Serial_ExchangeBytes - ld a, SERIAL_NO_DATA_BYTE - ld [de], a - ld hl, wMisc - ld de, wPlayerTrademonSpecies - ld bc, $c8 - call Serial_ExchangeBytes - ld a, [wLinkMode] - cp LINK_TRADECENTER - jr nz, .not_trading - ld hl, wc9f4 - ld de, wcb84 - ld bc, $186 - call ExchangeBytes - -.not_trading - xor a - ld [rIF], a - ld a, $1d - ld [rIE], a - ld de, MUSIC_NONE - call PlayMusic - call Link_CopyRandomNumbers - ld hl, wOTPlayerName - call Link_FindFirstNonControlCharacter_SkipZero - ld de, wLinkData - ld bc, $1b9 - call Link_CopyOTData - ld de, wPlayerTrademonSpecies - ld hl, wLinkPlayerPartyMon1Species - ld c, 2 -.loop1 - ld a, [de] - inc de - and a - jr z, .loop1 - cp SERIAL_PREAMBLE_BYTE - jr z, .loop1 - cp SERIAL_NO_DATA_BYTE - jr z, .loop1 - cp SERIAL_PATCH_LIST_PART_TERMINATOR - jr z, .next1 - push hl - push bc - ld b, 0 - dec a - ld c, a - add hl, bc - ld a, SERIAL_NO_DATA_BYTE - ld [hl], a - pop bc - pop hl - jr .loop1 - -.next1 - ld hl, wc90f - dec c - jr nz, .loop1 - ld a, [wLinkMode] - cp LINK_TRADECENTER - jp nz, .skip_mail - ld hl, wcb84 -.loop2 - ld a, [hli] - cp MAIL_MSG_LENGTH - jr nz, .loop2 -.loop3 - ld a, [hli] - cp SERIAL_NO_DATA_BYTE - jr z, .loop3 - cp MAIL_MSG_LENGTH - jr z, .loop3 - dec hl - ld de, wcb84 - ld bc, $190 ; 400 - call CopyBytes - ld hl, wcb84 - ld bc, $c6 ; 198 -.loop4 - ld a, [hl] - cp MAIL_MSG_LENGTH + 1 - jr nz, .okay1 - ld [hl], SERIAL_NO_DATA_BYTE -.okay1 - inc hl - dec bc - ld a, b - or c - jr nz, .loop4 - ld de, wcc9e -.loop5 - ld a, [de] - inc de - cp SERIAL_PATCH_LIST_PART_TERMINATOR - jr z, .start_copying_mail - ld hl, wcc4a - dec a - ld b, $0 - ld c, a - add hl, bc - ld [hl], SERIAL_NO_DATA_BYTE - jr .loop5 - -.start_copying_mail - ld hl, wcb84 - ld de, wc9f4 - ld b, PARTY_LENGTH -.copy_mail_loop - push bc - ld bc, MAIL_MSG_LENGTH + 1 - call CopyBytes - ld a, LOW(MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) - add e - ld e, a - ld a, HIGH(MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) - adc d - ld d, a - pop bc - dec b - jr nz, .copy_mail_loop - ld de, wc9f4 - ld b, PARTY_LENGTH -.copy_author_loop - push bc - ld a, LOW(MAIL_MSG_LENGTH + 1) - add e - ld e, a - ld a, HIGH(MAIL_MSG_LENGTH + 1) - adc d - ld d, a - ld bc, MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1) - call CopyBytes - pop bc - dec b - jr nz, .copy_author_loop - ld b, PARTY_LENGTH - ld de, wc9f4 -.fix_mail_loop - push bc - push de - farcall IsMailEuropean - ld a, c - or a - jr z, .next - sub $3 - jr nc, .skip - farcall DeutenEnglischenPost - jr .next - -.skip - cp $2 - jr nc, .next - farcall HandleSpanishItalianMail - -.next - pop de - ld hl, MAIL_STRUCT_LENGTH - add hl, de - ld d, h - ld e, l - pop bc - dec b - jr nz, .fix_mail_loop - ld de, wcb0e - xor a - ld [de], a - -.skip_mail - ld hl, wLinkPlayerName - ld de, wOTPlayerName - ld bc, NAME_LENGTH - call CopyBytes - ld de, wOTPartyCount - ld bc, 1 + PARTY_LENGTH + 1 - call CopyBytes - ld de, wOTPlayerID - ld bc, 2 - call CopyBytes - ld de, wOTPartyMons - ld bc, wOTPartyDataEnd - wOTPartyMons - call CopyBytes - ld a, LOW(wOTPartyMonOT) - ld [wUnusedD102], a - ld a, HIGH(wOTPartyMonOT) - ld [wUnusedD102 + 1], a - ld de, MUSIC_NONE - call PlayMusic - ld a, [hSerialConnectionStatus] - cp USING_INTERNAL_CLOCK - ld c, 66 - call z, DelayFrames - ld a, [wLinkMode] - cp LINK_COLOSSEUM - jr nz, .ready_to_trade - ld a, CAL - ld [wOtherTrainerClass], a - call ClearScreen - farcall Link_WaitBGMap - ld hl, wOptions - ld a, [hl] - push af - and 1 << STEREO - or TEXT_DELAY_MED - ld [hl], a - ld hl, wOTPlayerName - ld de, wOTClassName - ld bc, NAME_LENGTH - call CopyBytes - call ReturnToMapFromSubmenu - - ; LET'S DO THIS - ld a, [wDisableTextAcceleration] - push af - ld a, 1 - ld [wDisableTextAcceleration], a - ld a, [rIE] - push af - ld a, [rIF] - push af - xor a - ld [rIF], a - ld a, [rIE] - set 1, a - ld [rIE], a - pop af - ld [rIF], a - - predef StartBattle - - ld a, [rIF] - ld h, a - xor a - ld [rIF], a - pop af - ld [rIE], a - ld a, h - ld [rIF], a - pop af - ld [wDisableTextAcceleration], a - pop af - ld [wOptions], a - farcall LoadPokemonData - jp Function28b22 - -.ready_to_trade - ld de, MUSIC_ROUTE_30 - call PlayMusic - jp InitTradeMenuDisplay -; 283b2 - -LinkTimeout: ; 283b2 - ld de, .TooMuchTimeHasElapsed - ld b, 10 -.loop - call DelayFrame - call LinkDataReceived - dec b - jr nz, .loop - xor a - ld [hld], a - ld [hl], a - ld [hVBlank], a - push de - hlcoord 0, 12 - ld b, 4 - ld c, 18 - push de - ld d, h - ld e, l - farcall LinkTextbox2 - pop de - pop hl - bccoord 1, 14 - call PlaceHLTextAtBC - call RotateThreePalettesRight - call ClearScreen - ld b, SCGB_DIPLOMA - call GetSGBLayout - call WaitBGMap2 - ret -; 283ed - -.TooMuchTimeHasElapsed: ; 0x283ed - ; Too much time has elapsed. Please try again. - text_jump UnknownText_0x1c4183 - db "@" -; 0x283f2 - -ExchangeBytes: ; 283f2 - ld a, TRUE - ld [hSerialIgnoringInitialData], a -.loop - ld a, [hl] - ld [hSerialSend], a - call Serial_ExchangeByte - push bc - ld b, a - inc hl - ld a, 48 -.delay_cycles - dec a - jr nz, .delay_cycles - ld a, [hSerialIgnoringInitialData] - and a - ld a, b - pop bc - jr z, .load - dec hl - xor a - ld [hSerialIgnoringInitialData], a - jr .loop - -.load - ld [de], a - inc de - dec bc - ld a, b - or c - jr nz, .loop - ret -; 28419 - -String_PleaseWait: ; 28419 - db "PLEASE WAIT!@" -; 28426 - -ClearLinkData: ; 28426 - ld hl, wLinkData - ld bc, wLinkDataEnd - wLinkData -.loop - xor a - ld [hli], a - dec bc - ld a, b - or c - jr nz, .loop - ret -; 28434 - -FixDataForLinkTransfer: ; 28434 - ld hl, wd1f3 - ld a, SERIAL_PREAMBLE_BYTE - ld b, wLinkBattleRNs - wd1f3 -.loop1 - ld [hli], a - dec b - jr nz, .loop1 - ld b, wTempEnemyMonSpecies - wLinkBattleRNs -.loop2 - call Random - cp SERIAL_PREAMBLE_BYTE - jr nc, .loop2 - ld [hli], a - dec b - jr nz, .loop2 - ld hl, wMisc - ld a, SERIAL_PREAMBLE_BYTE - ld [hli], a - ld [hli], a - ld [hli], a - ld b, $c8 - xor a -.loop3 - ld [hli], a - dec b - jr nz, .loop3 - ld hl, wTimeCapsulePartyMon1 - 1 + 6 - ld de, wc612 - lb bc, 0, 0 -.loop4 - inc c - ld a, c - cp SERIAL_PREAMBLE_BYTE - jr z, .next1 - ld a, b - dec a - jr nz, .next2 - push bc - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - ld b, $d - jr z, .got_value - ld b, $27 -.got_value - ld a, c - cp b - pop bc - jr z, .done -.next2 - inc hl - ld a, [hl] - cp SERIAL_NO_DATA_BYTE - jr nz, .loop4 - ld a, c - ld [de], a - inc de - ld [hl], SERIAL_PATCH_LIST_PART_TERMINATOR - jr .loop4 - -.next1 - ld a, SERIAL_PATCH_LIST_PART_TERMINATOR - ld [de], a - inc de - lb bc, 1, 0 - jr .loop4 - -.done - ld a, SERIAL_PATCH_LIST_PART_TERMINATOR - ld [de], a - ret -; 28499 - -Link_PrepPartyData_Gen1: ; 28499 - ld de, wLinkData - ld a, SERIAL_PREAMBLE_BYTE - ld b, PARTY_LENGTH -.loop1 - ld [de], a - inc de - dec b - jr nz, .loop1 - ld hl, wPlayerName - ld bc, NAME_LENGTH - call CopyBytes - push de - ld hl, wPartyCount - ld a, [hli] - ld [de], a - inc de -.loop2 - ld a, [hli] - cp -1 - jr z, .done_party - ld [wd265], a - push hl - push de - callfar ConvertMon_2to1 - pop de - pop hl - ld a, [wd265] - ld [de], a - inc de - jr .loop2 - -.done_party - ld [de], a - pop de - ld hl, 1 + PARTY_LENGTH + 1 - add hl, de - ld d, h - ld e, l - ld hl, wPartyMon1Species - ld c, PARTY_LENGTH -.mon_loop - push bc - call .ConvertPartyStruct2to1 - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop bc - dec c - jr nz, .mon_loop - ld hl, wPartyMonOT - call .copy_ot_nicks - ld hl, wPartyMonNicknames -.copy_ot_nicks - ld bc, PARTY_LENGTH * NAME_LENGTH - jp CopyBytes -; 284f6 - -.ConvertPartyStruct2to1: ; 284f6 - ld b, h - ld c, l - push de - push bc - ld a, [hl] - ld [wd265], a - callfar ConvertMon_2to1 - pop bc - pop de - ld a, [wd265] - ld [de], a - inc de - ld hl, MON_HP - add hl, bc - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - inc de - xor a - ld [de], a - inc de - ld hl, MON_STATUS - add hl, bc - ld a, [hl] - ld [de], a - inc de - ld a, [bc] - cp MAGNEMITE - jr z, .steel_type - cp MAGNETON - jr nz, .skip_steel - -.steel_type - ld a, ELECTRIC - ld [de], a - inc de - ld [de], a - inc de - jr .done_steel - -.skip_steel - push bc - dec a - ld hl, BaseData + BASE_TYPES - ld bc, BASE_DATA_SIZE - call AddNTimes - ld bc, BASE_CATCH_RATE - BASE_TYPES - ld a, BANK(BaseData) - call FarCopyBytes - pop bc - -.done_steel - push bc - ld hl, MON_ITEM - add hl, bc - ld bc, MON_HAPPINESS - MON_ITEM - call CopyBytes - pop bc - - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - ld [de], a - ld [wCurPartyLevel], a - inc de - - push bc - ld hl, MON_MAXHP - add hl, bc - ld bc, MON_SAT - MON_MAXHP - call CopyBytes - pop bc - - push de - push bc - - ld a, [bc] - dec a - push bc - ld b, 0 - ld c, a - ld hl, KantoMonSpecials - add hl, bc - ld a, BANK(KantoMonSpecials) - call GetFarByte - ld [wBaseSpecialAttack], a - pop bc - - ld hl, MON_STAT_EXP - 1 - add hl, bc - ld c, STAT_SATK - ld b, TRUE - predef CalcMonStatC - - pop bc - pop de - - ld a, [hQuotient + 1] - ld [de], a - inc de - ld a, [hQuotient + 2] - ld [de], a - inc de - ld h, b - ld l, c - ret -; 28595 - -Link_PrepPartyData_Gen2: ; 28595 - ld de, wLinkData - ld a, SERIAL_PREAMBLE_BYTE - ld b, PARTY_LENGTH -.loop1 - ld [de], a - inc de - dec b - jr nz, .loop1 - ld hl, wPlayerName - ld bc, NAME_LENGTH - call CopyBytes - ld hl, wPartyCount - ld bc, 1 + PARTY_LENGTH + 1 - call CopyBytes - ld hl, wPlayerID - ld bc, 2 - call CopyBytes - ld hl, wPartyMon1Species - ld bc, PARTY_LENGTH * PARTYMON_STRUCT_LENGTH - call CopyBytes - ld hl, wPartyMonOT - ld bc, PARTY_LENGTH * NAME_LENGTH - call CopyBytes - ld hl, wPartyMonNicknames - ld bc, PARTY_LENGTH * MON_NAME_LENGTH - call CopyBytes - -; Okay, we did all that. Now, are we in the trade center? - ld a, [wLinkMode] - cp LINK_TRADECENTER - ret nz - -; Fill 5 bytes at wc9f4 with $20 - ld de, wc9f4 - ld a, $20 - call Function28682 - -; Copy all the mail messages to wc9f9 - ld a, BANK(sPartyMail) - call GetSRAMBank - ld hl, sPartyMail - ld b, PARTY_LENGTH -.loop2 - push bc - ld bc, MAIL_MSG_LENGTH + 1 - call CopyBytes - ld bc, sPartyMon1MailEnd - sPartyMon1MailAuthor - add hl, bc - pop bc - dec b - jr nz, .loop2 -; Copy the mail data to wcabf - ld hl, sPartyMail - ld b, PARTY_LENGTH -.loop3 - push bc - ld bc, MAIL_MSG_LENGTH + 1 - add hl, bc - ld bc, sPartyMon1MailEnd - sPartyMon1MailAuthor - call CopyBytes - pop bc - dec b - jr nz, .loop3 - - ld b, PARTY_LENGTH - ld de, sPartyMail - ld hl, wc9f9 -.loop4 - push bc - push hl - push de - push hl - farcall IsMailEuropean - pop de - ld a, c - or a - jr z, .next - sub $3 - jr nc, .italian_spanish - farcall HandleFrenchGermanMail - jr .next - -.italian_spanish - cp $2 - jr nc, .next - farcall HandleSpanishItalianMail - -.next - pop de - ld hl, MAIL_STRUCT_LENGTH - add hl, de - ld d, h - ld e, l - pop hl - ld bc, sPartyMon1MailAuthor - sPartyMon1Mail - add hl, bc - pop bc - dec b - jr nz, .loop4 - call CloseSRAM - ld hl, wc9f9 - ld bc, PARTY_LENGTH * (sPartyMon1MailAuthor - sPartyMon1Mail) -.loop5 - ld a, [hl] - cp SERIAL_NO_DATA_BYTE - jr nz, .skip2 - ld [hl], sPartyMon1MailAuthor - sPartyMon1Mail - -.skip2 - inc hl - dec bc - ld a, b - or c - jr nz, .loop5 - ld hl, wcabf - ld de, wcb13 - ld b, PARTY_LENGTH * (sPartyMon1MailEnd - sPartyMon1MailAuthor) - ld c, $0 -.loop6 - inc c - ld a, [hl] - cp SERIAL_NO_DATA_BYTE - jr nz, .skip3 - ld [hl], SERIAL_PATCH_LIST_PART_TERMINATOR - ld a, c - ld [de], a - inc de - -.skip3 - inc hl - dec b - jr nz, .loop6 - ld a, SERIAL_PATCH_LIST_PART_TERMINATOR - ld [de], a - ret -; 28682 - -Function28682: ; 28682 - ld c, 5 -.loop - ld [de], a - inc de - dec c - jr nz, .loop - ret -; 2868a - -Function2868a: ; 2868a - push hl - ld d, h - ld e, l - ld bc, wLinkOTPartyMonTypes - ld hl, wcbe8 - ld a, c - ld [hli], a - ld [hl], b - ld hl, wOTPartyMon1Species - ld c, PARTY_LENGTH -.loop - push bc - call .ConvertToGen2 - pop bc - dec c - jr nz, .loop - pop hl - ld bc, PARTY_LENGTH * REDMON_STRUCT_LENGTH - add hl, bc - ld de, wOTPartyMonOT - ld bc, PARTY_LENGTH * NAME_LENGTH - call CopyBytes - ld de, wOTPartyMonNicknames - ld bc, PARTY_LENGTH * MON_NAME_LENGTH - jp CopyBytes -; 286ba - -.ConvertToGen2: ; 286ba - ld b, h - ld c, l - ld a, [de] - inc de - push bc - push de - ld [wd265], a - callfar ConvertMon_1to2 - pop de - pop bc - ld a, [wd265] - ld [bc], a - ld [wCurSpecies], a - ld hl, MON_HP - add hl, bc - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hl], a - inc de - ld hl, MON_STATUS - add hl, bc - ld a, [de] - inc de - ld [hl], a - ld hl, wcbe8 - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [de] - ld [hli], a - inc de - ld a, [de] - ld [hli], a - inc de - ld a, l - ld [wcbe8], a - ld a, h - ld [wcbe8 + 1], a - push bc - ld hl, MON_ITEM - add hl, bc - push hl - ld h, d - ld l, e - pop de - push bc - ld a, [hli] - ld b, a - call TimeCapsule_ReplaceTeruSama - ld a, b - ld [de], a - inc de - pop bc - ld bc, $19 - call CopyBytes - pop bc - ld d, h - ld e, l - ld hl, $1f - add hl, bc - ld a, [de] - inc de - ld [hl], a - ld [wCurPartyLevel], a - push bc - ld hl, $24 - add hl, bc - push hl - ld h, d - ld l, e - pop de - ld bc, 8 - call CopyBytes - pop bc - call GetBaseData - push de - push bc - ld d, h - ld e, l - ld hl, MON_STAT_EXP - 1 - add hl, bc - ld c, STAT_SATK - ld b, TRUE - predef CalcMonStatC - pop bc - pop hl - ld a, [hQuotient + 1] - ld [hli], a - ld a, [hQuotient + 2] - ld [hli], a - push hl - push bc - ld hl, MON_STAT_EXP - 1 - add hl, bc - ld c, STAT_SDEF - ld b, TRUE - predef CalcMonStatC - pop bc - pop hl - ld a, [hQuotient + 1] - ld [hli], a - ld a, [hQuotient + 2] - ld [hli], a - push hl - ld hl, $1b - add hl, bc - ld a, $46 - ld [hli], a - xor a - ld [hli], a - ld [hli], a - ld [hl], a - pop hl - inc de - inc de - ret -; 28771 - -TimeCapsule_ReplaceTeruSama: ; 28771 - ld a, b - and a - ret z - push hl - ld hl, TimeCapsule_CatchRateItems -.loop - ld a, [hli] - and a - jr z, .end - cp b - jr z, .found - inc hl - jr .loop - -.found - ld b, [hl] - -.end - pop hl - ret - - -INCLUDE "data/items/catch_rate_items.asm" - - -Link_CopyOTData: ; 2879e -.loop - ld a, [hli] - cp SERIAL_NO_DATA_BYTE - jr z, .loop - ld [de], a - inc de - dec bc - ld a, b - or c - jr nz, .loop - ret -; 287ab - -Link_CopyRandomNumbers: ; 287ab - ld a, [hSerialConnectionStatus] - cp USING_INTERNAL_CLOCK - ret z - ld hl, wEnemyMonSpecies - call Link_FindFirstNonControlCharacter_AllowZero - ld de, wLinkBattleRNs - ld c, 10 -.loop - ld a, [hli] - cp SERIAL_NO_DATA_BYTE - jr z, .loop - cp SERIAL_PREAMBLE_BYTE - jr z, .loop - ld [de], a - inc de - dec c - jr nz, .loop - ret -; 287ca - -Link_FindFirstNonControlCharacter_SkipZero: ; 287ca -.loop - ld a, [hli] - and a - jr z, .loop - cp SERIAL_PREAMBLE_BYTE - jr z, .loop - cp SERIAL_NO_DATA_BYTE - jr z, .loop - dec hl - ret -; 287d8 - -Link_FindFirstNonControlCharacter_AllowZero: ; 287d8 -.loop - ld a, [hli] - cp SERIAL_PREAMBLE_BYTE - jr z, .loop - cp SERIAL_NO_DATA_BYTE - jr z, .loop - dec hl - ret -; 287e3 - -InitTradeMenuDisplay: ; 287e3 - call ClearScreen - call LoadTradeScreenBorder - farcall InitTradeSpeciesList - xor a - ld hl, wOtherPlayerLinkMode - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld a, 1 - ld [wMenuCursorY], a - inc a - ld [wPlayerLinkAction], a - jp LinkTrade_PlayerPartyMenu -; 28803 - -LinkTrade_OTPartyMenu: ; 28803 - ld a, OTPARTYMON - ld [wMonType], a - ld a, A_BUTTON | D_UP | D_DOWN - ld [wMenuJoypadFilter], a - ld a, [wOTPartyCount] - ld [w2DMenuNumRows], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, 9 - ld [w2DMenuCursorInitY], a - ld a, 6 - ld [w2DMenuCursorInitX], a - ld a, 1 - ld [wMenuCursorX], a - ln a, 1, 0 - ld [w2DMenuCursorOffsets], a - ld a, MENU_UNUSED_3 - ld [w2DMenuFlags1], a - xor a - ld [w2DMenuFlags2], a - -LinkTradeOTPartymonMenuLoop: ; 28835 - farcall LinkTradeMenu - ld a, d - and a - jp z, LinkTradePartiesMenuMasterLoop - bit A_BUTTON_F, a - jr z, .not_a_button - ld a, INIT_ENEMYOT_LIST - ld [wInitListType], a - callfar InitList - ld hl, wOTPartyMon1Species - farcall LinkMonStatsScreen - jp LinkTradePartiesMenuMasterLoop - -.not_a_button - bit D_UP_F, a - jr z, .not_d_up - ld a, [wMenuCursorY] - ld b, a - ld a, [wOTPartyCount] - cp b - jp nz, LinkTradePartiesMenuMasterLoop - xor a - ld [wMonType], a - call HideCursor - push hl - push bc - ld bc, NAME_LENGTH - add hl, bc - ld [hl], " " - pop bc - pop hl - ld a, [wPartyCount] - ld [wMenuCursorY], a - jr LinkTrade_PlayerPartyMenu - -.not_d_up - bit D_DOWN_F, a - jp z, LinkTradePartiesMenuMasterLoop - jp Function28ac9 -; 2888b - -LinkTrade_PlayerPartyMenu: ; 2888b - farcall InitMG_Mobile_LinkTradePalMap - xor a - ld [wMonType], a - ld a, A_BUTTON | D_UP | D_DOWN - ld [wMenuJoypadFilter], a - ld a, [wPartyCount] - ld [w2DMenuNumRows], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, 1 - ld [w2DMenuCursorInitY], a - ld a, 6 - ld [w2DMenuCursorInitX], a - ld a, 1 - ld [wMenuCursorX], a - ln a, 1, 0 - ld [w2DMenuCursorOffsets], a - ld a, MENU_UNUSED_3 - ld [w2DMenuFlags1], a - xor a - ld [w2DMenuFlags2], a - call WaitBGMap2 - -LinkTradePartymonMenuLoop: ; 288c5 - farcall LinkTradeMenu - ld a, d - and a - jr nz, .check_joypad - jp LinkTradePartiesMenuMasterLoop - -.check_joypad - bit A_BUTTON_F, a - jr z, .not_a_button - jp Function28926 - -.not_a_button - bit D_DOWN_F, a - jr z, .not_d_down - ld a, [wMenuCursorY] - dec a - jp nz, LinkTradePartiesMenuMasterLoop - ld a, OTPARTYMON - ld [wMonType], a - call HideCursor - push hl - push bc - ld bc, NAME_LENGTH - add hl, bc - ld [hl], " " - pop bc - pop hl - ld a, 1 - ld [wMenuCursorY], a - jp LinkTrade_OTPartyMenu - -.not_d_down - bit D_UP_F, a - jr z, LinkTradePartiesMenuMasterLoop - ld a, [wMenuCursorY] - ld b, a - ld a, [wPartyCount] - cp b - jr nz, LinkTradePartiesMenuMasterLoop - call HideCursor - push hl - push bc - ld bc, NAME_LENGTH - add hl, bc - ld [hl], " " - pop bc - pop hl - jp Function28ade -; 2891c - -LinkTradePartiesMenuMasterLoop: ; 2891c - ld a, [wMonType] - and a - jp z, LinkTradePartymonMenuLoop ; PARTYMON - jp LinkTradeOTPartymonMenuLoop ; OTPARTYMON -; 28926 - -Function28926: ; 28926 - call LoadTileMapToTempTileMap - ld a, [wMenuCursorY] - push af - hlcoord 0, 15 - ld b, 1 - ld c, 18 - call LinkTextboxAtHL - hlcoord 2, 16 - ld de, .String_Stats_Trade - call PlaceString - farcall Link_WaitBGMap - -.joy_loop - ld a, " " - ldcoord_a 11, 16 - ld a, A_BUTTON | B_BUTTON | D_RIGHT - ld [wMenuJoypadFilter], a - ld a, 1 - ld [w2DMenuNumRows], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, 16 - ld [w2DMenuCursorInitY], a - ld a, 1 - ld [w2DMenuCursorInitX], a - ld a, 1 - ld [wMenuCursorY], a - ld [wMenuCursorX], a - ln a, 2, 0 - ld [w2DMenuCursorOffsets], a - xor a - ld [w2DMenuFlags1], a - ld [w2DMenuFlags2], a - call ScrollingMenuJoypad - bit D_RIGHT_F, a - jr nz, .d_right - bit B_BUTTON_F, a - jr z, .show_stats -.b_button - pop af - ld [wMenuCursorY], a - call Call_LoadTempTileMapToTileMap - jp LinkTrade_PlayerPartyMenu - -.d_right - ld a, " " - ldcoord_a 1, 16 - ld a, A_BUTTON | B_BUTTON | D_LEFT - ld [wMenuJoypadFilter], a - ld a, 1 - ld [w2DMenuNumRows], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, 16 - ld [w2DMenuCursorInitY], a - ld a, 11 - ld [w2DMenuCursorInitX], a - ld a, 1 - ld [wMenuCursorY], a - ld [wMenuCursorX], a - ln a, 2, 0 - ld [w2DMenuCursorOffsets], a - xor a - ld [w2DMenuFlags1], a - ld [w2DMenuFlags2], a - call ScrollingMenuJoypad - bit D_LEFT_F, a - jp nz, .joy_loop - bit B_BUTTON_F, a - jr nz, .b_button - jr .try_trade - -.show_stats - pop af - ld [wMenuCursorY], a - ld a, INIT_PLAYEROT_LIST - ld [wInitListType], a - callfar InitList - farcall LinkMonStatsScreen - call Call_LoadTempTileMapToTileMap - hlcoord 6, 1 - lb bc, 6, 1 - ld a, " " - call LinkEngine_FillBox - hlcoord 17, 1 - lb bc, 6, 1 - ld a, " " - call LinkEngine_FillBox - jp LinkTrade_PlayerPartyMenu - -.try_trade - call PlaceHollowCursor - pop af - ld [wMenuCursorY], a - dec a - ld [wd002], a - ld [wPlayerLinkAction], a - farcall Function16d6ce - ld a, [wOtherPlayerLinkMode] - cp $f - jp z, InitTradeMenuDisplay - ld [wd003], a - call Function28b68 - ld c, 100 - call DelayFrames - farcall ValidateOTTrademon - jr c, .abnormal - farcall Functionfb5dd - jp nc, LinkTrade - xor a - ld [wcf57], a - ld [wOtherPlayerLinkAction], a - hlcoord 0, 12 - ld b, 4 - ld c, 18 - call LinkTextboxAtHL - farcall Link_WaitBGMap - ld hl, .Text_CantTradeLastMon - bccoord 1, 14 - call PlaceHLTextAtBC - jr .cancel_trade - -.abnormal - xor a - ld [wcf57], a - ld [wOtherPlayerLinkAction], a - ld a, [wd003] - ld hl, wOTPartySpecies - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - ld [wd265], a - call GetPokemonName - hlcoord 0, 12 - ld b, 4 - ld c, 18 - call LinkTextboxAtHL - farcall Link_WaitBGMap - ld hl, .Text_Abnormal - bccoord 1, 14 - call PlaceHLTextAtBC - -.cancel_trade - hlcoord 0, 12 - ld b, 4 - ld c, 18 - call LinkTextboxAtHL - hlcoord 1, 14 - ld de, String_TooBadTheTradeWasCanceled - call PlaceString - ld a, $1 - ld [wPlayerLinkAction], a - farcall Function16d6ce - ld c, 100 - call DelayFrames - jp InitTradeMenuDisplay -; 28aaf - - -.Text_CantTradeLastMon: ; 0x28aaf - ; If you trade that #MON, you won't be able to battle. - text_jump UnknownText_0x1c41b1 - db "@" -; 0x28ab4 - -.String_Stats_Trade: ; 28ab4 - db "STATS TRADE@" - -.Text_Abnormal: ; 0x28ac4 - ; Your friend's @ appears to be abnormal! - text_jump UnknownText_0x1c41e6 - db "@" -; 0x28ac9 - - -Function28ac9: ; 28ac9 - ld a, [wMenuCursorY] - cp 1 - jp nz, LinkTradePartiesMenuMasterLoop - call HideCursor - push hl - push bc - ld bc, NAME_LENGTH - add hl, bc - ld [hl], " " - pop bc - pop hl -Function28ade: ; 28ade -.loop1 - ld a, "▶" - ldcoord_a 9, 17 -.loop2 - call JoyTextDelay - ld a, [hJoyLast] - and a - jr z, .loop2 - bit A_BUTTON_F, a - jr nz, .a_button - push af - ld a, " " - ldcoord_a 9, 17 - pop af - bit D_UP_F, a - jr z, .d_up - ld a, [wOTPartyCount] - ld [wMenuCursorY], a - jp LinkTrade_OTPartyMenu - -.d_up - ld a, $1 - ld [wMenuCursorY], a - jp LinkTrade_PlayerPartyMenu - -.a_button - ld a, "▷" - ldcoord_a 9, 17 - ld a, $f - ld [wPlayerLinkAction], a - farcall Function16d6ce - ld a, [wOtherPlayerLinkMode] - cp $f - jr nz, .loop1 -Function28b22: ; 28b22 - call RotateThreePalettesRight - call ClearScreen - ld b, SCGB_DIPLOMA - call GetSGBLayout - call WaitBGMap2 - xor a - ld [wcfbb], a - xor a - ld [rSB], a - ld [hSerialSend], a - ld a, (0 << rSC_ON) | 1 - ld [rSC], a - ld a, (1 << rSC_ON) | 1 - ld [rSC], a - ret -; 28b42 - -Unreferenced_Function28b42: ; 28b42 - hlcoord 0, 16 - ld a, "┘" - ld bc, 2 * SCREEN_WIDTH - call ByteFill - hlcoord 1, 16 - ld a, " " - ld bc, SCREEN_WIDTH - 2 - call ByteFill - hlcoord 2, 16 - ld de, .Cancel - jp PlaceString -; 28b61 - -.Cancel: ; 28b61 - db "CANCEL@" -; 28b68 - -Function28b68: ; 28b68 - ld a, [wOtherPlayerLinkMode] - hlcoord 6, 9 - ld bc, SCREEN_WIDTH - call AddNTimes - ld [hl], "▷" - ret -; 28b77 - -LinkEngine_FillBox: ; 28b77 -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret -; 28b87 - -LinkTrade: ; 28b87 - xor a - ld [wcf57], a - ld [wOtherPlayerLinkAction], a - hlcoord 0, 12 - ld b, 4 - ld c, 18 - call LinkTextboxAtHL - farcall Link_WaitBGMap - ld a, [wd002] - ld hl, wPartySpecies - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - ld [wd265], a - call GetPokemonName - ld hl, wStringBuffer1 - ld de, wd004 - ld bc, MON_NAME_LENGTH - call CopyBytes - ld a, [wd003] - ld hl, wOTPartySpecies - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - ld [wd265], a - call GetPokemonName - ld hl, UnknownText_0x28eb8 - bccoord 1, 14 - call PlaceHLTextAtBC - call LoadStandardMenuHeader - hlcoord 10, 7 - ld b, 3 - ld c, 7 - call LinkTextboxAtHL - ld de, String28eab - hlcoord 12, 8 - call PlaceString - ld a, 8 - ld [w2DMenuCursorInitY], a - ld a, 11 - ld [w2DMenuCursorInitX], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, 2 - ld [w2DMenuNumRows], a - xor a - ld [w2DMenuFlags1], a - ld [w2DMenuFlags2], a - ld a, $20 - ld [w2DMenuCursorOffsets], a - ld a, A_BUTTON | B_BUTTON - ld [wMenuJoypadFilter], a - ld a, 1 - ld [wMenuCursorY], a - ld [wMenuCursorX], a - farcall Link_WaitBGMap - call ScrollingMenuJoypad - push af - call Call_ExitMenu - call WaitBGMap2 - pop af - bit 1, a - jr nz, .asm_28c33 - ld a, [wMenuCursorY] - dec a - jr z, .asm_28c54 - -.asm_28c33 - ld a, $1 - ld [wPlayerLinkAction], a - hlcoord 0, 12 - ld b, 4 - ld c, 18 - call LinkTextboxAtHL - hlcoord 1, 14 - ld de, String_TooBadTheTradeWasCanceled - call PlaceString - farcall Function16d6ce - jp Function28ea3 - -.asm_28c54 - ld a, $2 - ld [wPlayerLinkAction], a - farcall Function16d6ce - ld a, [wOtherPlayerLinkMode] - dec a - jr nz, .asm_28c7b - hlcoord 0, 12 - ld b, 4 - ld c, 18 - call LinkTextboxAtHL - hlcoord 1, 14 - ld de, String_TooBadTheTradeWasCanceled - call PlaceString - jp Function28ea3 - -.asm_28c7b - ld hl, sPartyMail - ld a, [wd002] - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld a, BANK(sPartyMail) - call GetSRAMBank - ld d, h - ld e, l - ld bc, MAIL_STRUCT_LENGTH - add hl, bc - ld a, [wd002] - ld c, a -.asm_28c96 - inc c - ld a, c - cp PARTY_LENGTH - jr z, .asm_28ca6 - push bc - ld bc, MAIL_STRUCT_LENGTH - call CopyBytes - pop bc - jr .asm_28c96 - -.asm_28ca6 - ld hl, sPartyMail - ld a, [wPartyCount] - dec a - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - push hl - ld hl, wc9f4 - ld a, [wd003] - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - pop de - ld bc, MAIL_STRUCT_LENGTH - call CopyBytes - call CloseSRAM - ld hl, wPlayerName - ld de, wPlayerTrademonSenderName - ld bc, NAME_LENGTH - call CopyBytes - ld a, [wd002] - ld hl, wPartySpecies - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - ld [wPlayerTrademonSpecies], a - push af - ld a, [wd002] - ld hl, wPartyMonOT - call SkipNames - ld de, wPlayerTrademonOTName - ld bc, NAME_LENGTH - call CopyBytes - ld hl, wPartyMon1ID - ld a, [wd002] - call GetPartyLocation - ld a, [hli] - ld [wPlayerTrademonID], a - ld a, [hl] - ld [wPlayerTrademonID + 1], a - ld hl, wPartyMon1DVs - ld a, [wd002] - call GetPartyLocation - ld a, [hli] - ld [wPlayerTrademonDVs], a - ld a, [hl] - ld [wPlayerTrademonDVs + 1], a - ld a, [wd002] - ld hl, wPartyMon1Species - call GetPartyLocation - ld b, h - ld c, l - farcall GetCaughtGender - ld a, c - ld [wPlayerTrademonCaughtData], a - ld hl, wOTPlayerName - ld de, wOTTrademonSenderName - ld bc, NAME_LENGTH - call CopyBytes - ld a, [wd003] - ld hl, wOTPartySpecies - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - ld [wOTTrademonSpecies], a - ld a, [wd003] - ld hl, wOTPartyMonOT - call SkipNames - ld de, wOTTrademonOTName - ld bc, NAME_LENGTH - call CopyBytes - ld hl, wOTPartyMon1ID - ld a, [wd003] - call GetPartyLocation - ld a, [hli] - ld [wOTTrademonID], a - ld a, [hl] - ld [wOTTrademonID + 1], a - ld hl, wOTPartyMon1DVs - ld a, [wd003] - call GetPartyLocation - ld a, [hli] - ld [wOTTrademonDVs], a - ld a, [hl] - ld [wOTTrademonDVs + 1], a - ld a, [wd003] - ld hl, wOTPartyMon1Species - call GetPartyLocation - ld b, h - ld c, l - farcall GetCaughtGender - ld a, c - ld [wOTTrademonCaughtData], a - ld a, [wd002] - ld [wCurPartyMon], a - ld hl, wPartySpecies - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - ld [wd002], a - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - callfar RemoveMonFromPartyOrBox - ld a, [wPartyCount] - dec a - ld [wCurPartyMon], a - ld a, TRUE - ld [wForceEvolution], a - ld a, [wd003] - push af - ld hl, wOTPartySpecies - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - ld [wd003], a - ld c, 100 - call DelayFrames - call ClearTileMap - call LoadFontsBattleExtra - ld b, SCGB_DIPLOMA - call GetSGBLayout - ld a, [hSerialConnectionStatus] - cp USING_EXTERNAL_CLOCK - jr z, .player_2 - predef TradeAnimation - jr .done_animation - -.player_2 - predef TradeAnimationPlayer2 - -.done_animation - pop af - ld c, a - ld [wCurPartyMon], a - ld hl, wOTPartySpecies - ld d, 0 - ld e, a - add hl, de - ld a, [hl] - ld [wCurPartySpecies], a - ld hl, wOTPartyMon1Species - ld a, c - call GetPartyLocation - ld de, wTempMonSpecies - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - predef AddTempmonToParty - ld a, [wPartyCount] - dec a - ld [wCurPartyMon], a - callfar EvolvePokemon - call ClearScreen - call LoadTradeScreenBorder - call SetTradeRoomBGPals - farcall Link_WaitBGMap - ld b, $1 - pop af - ld c, a - cp MEW - jr z, .loop - ld a, [wCurPartySpecies] - cp MEW - jr z, .loop - ld b, $2 - ld a, c - cp CELEBI - jr z, .loop - ld a, [wCurPartySpecies] - cp CELEBI - jr z, .loop - ld b, $0 - -.loop - ld a, b - ld [wPlayerLinkAction], a - push bc - call Serial_PrintWaitingTextAndSyncAndExchangeNybble - pop bc - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jr z, .save - ld a, b - and a - jr z, .save - ld a, [wOtherPlayerLinkAction] - cp b - jr nz, .loop - -.save - farcall SaveAfterLinkTrade - farcall StubbedTrainerRankings_Trades - farcall BackupMobileEventIndex - ld c, 40 - call DelayFrames - hlcoord 0, 12 - ld b, 4 - ld c, 18 - call LinkTextboxAtHL - hlcoord 1, 14 - ld de, String28ebd - call PlaceString - farcall Link_WaitBGMap - ld c, 50 - call DelayFrames - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jp z, Gen2ToGen1LinkComms - jp Gen2ToGen2LinkComms -; 28ea3 - -Function28ea3: ; 28ea3 - ld c, 100 - call DelayFrames - jp InitTradeMenuDisplay -; 28eab - -String28eab: ; 28eab - db "TRADE" - next "CANCEL@" - -UnknownText_0x28eb8: ; 0x28eb8 - ; Trade @ for @ ? - text_jump UnknownText_0x1c4212 - db "@" -; 0x28ebd - -String28ebd: ; 28ebd - db "Trade completed!@" - -String_TooBadTheTradeWasCanceled: ; 28ece - db "Too bad! The trade" - next "was canceled!@" - - -LinkTextboxAtHL: ; 28eef - ld d, h - ld e, l - farcall LinkTextbox - ret -; 28ef8 - -LoadTradeScreenBorder: ; 28ef8 - farcall _LoadTradeScreenBorder - ret -; 28eff - -SetTradeRoomBGPals: ; 28eff - farcall LoadTradeRoomBGPals_ ; just a nested farcall; so wasteful - call SetPalettes - ret -; 28f09 - -Unreferenced_Function28f09: ; 28f09 - hlcoord 0, 0 - ld b, 6 - ld c, 18 - call LinkTextboxAtHL - hlcoord 0, 8 - ld b, 6 - ld c, 18 - call LinkTextboxAtHL - farcall PlaceTradePartnerNamesAndParty - ret -; 28f24 - -INCLUDE "engine/trade_animation.asm" - -CheckTimeCapsuleCompatibility: ; 29bfb -; Checks to see if your party is compatible with the Gen 1 games. -; Returns the following in wScriptVar: -; 0: Party is okay -; 1: At least one Pokémon was introduced in Gen 2 -; 2: At least one Pokémon has a move that was introduced in Gen 2 -; 3: At least one Pokémon is holding mail - -; If any party Pokémon was introduced in the Gen 2 games, don't let it in. - ld hl, wPartySpecies - ld b, PARTY_LENGTH -.loop - ld a, [hli] - cp -1 - jr z, .checkitem - cp JOHTO_POKEMON - jr nc, .mon_too_new - dec b - jr nz, .loop - -; If any party Pokémon is holding mail, don't let it in. -.checkitem - ld a, [wPartyCount] - ld b, a - ld hl, wPartyMon1Item -.itemloop - push hl - push bc - ld d, [hl] - farcall ItemIsMail - pop bc - pop hl - jr c, .mon_has_mail - ld de, PARTYMON_STRUCT_LENGTH - add hl, de - dec b - jr nz, .itemloop - -; If any party Pokémon has a move that was introduced in the Gen 2 games, don't let it in. - ld hl, wPartyMon1Moves - ld a, [wPartyCount] - ld b, a -.move_loop - ld c, NUM_MOVES -.move_next - ld a, [hli] - cp STRUGGLE + 1 - jr nc, .move_too_new - dec c - jr nz, .move_next - ld de, wPartyMon2 - (wPartyMon1 + NUM_MOVES) - add hl, de - dec b - jr nz, .move_loop - xor a - jr .done - -.mon_too_new - ld [wd265], a - call GetPokemonName - ld a, $1 - jr .done - -.move_too_new - push bc - ld [wd265], a - call GetMoveName - call CopyName1 - pop bc - call Function29c67 - ld a, $2 - jr .done - -.mon_has_mail - call Function29c67 - ld a, $3 - -.done - ld [wScriptVar], a - ret -; 29c67 - -Function29c67: ; 29c67 - ld a, [wPartyCount] - sub b - ld c, a - inc c - ld b, 0 - ld hl, wPartyCount - add hl, bc - ld a, [hl] - ld [wd265], a - call GetPokemonName - ret -; 29c7b - -EnterTimeCapsule: ; 29c7b - ld c, 10 - call DelayFrames - ld a, $4 - call Link_EnsureSync - ld c, 40 - call DelayFrames - xor a - ld [hVBlank], a - inc a - ld [wLinkMode], a - ret -; 29c92 - -WaitForOtherPlayerToExit: ; 29c92 - ld c, 3 - call DelayFrames - ld a, CONNECTION_NOT_ESTABLISHED - ld [hSerialConnectionStatus], a - xor a - ld [rSB], a - ld [hSerialReceive], a - ld a, (0 << rSC_ON) | 1 - ld [rSC], a - ld a, (1 << rSC_ON) | 1 - ld [rSC], a - ld c, 3 - call DelayFrames - xor a - ld [rSB], a - ld [hSerialReceive], a - ld a, (0 << rSC_ON) | 0 - ld [rSC], a - ld a, (1 << rSC_ON) | 0 - ld [rSC], a - ld c, 3 - call DelayFrames - xor a - ld [rSB], a - ld [hSerialReceive], a - ld [rSC], a - ld c, 3 - call DelayFrames - ld a, CONNECTION_NOT_ESTABLISHED - ld [hSerialConnectionStatus], a - ld a, [rIF] - push af - xor a - ld [rIF], a - ld a, $f - ld [rIE], a - pop af - ld [rIF], a - ld hl, wLinkTimeoutFrames - xor a - ld [hli], a - ld [hl], a - ld [hVBlank], a - ld [wLinkMode], a - ret -; 29ce8 - -SetBitsForLinkTradeRequest: ; 29ce8 - ld a, LINK_TRADECENTER - 1 - ld [wPlayerLinkAction], a - ld [wd265], a - ret -; 29cf1 - -SetBitsForBattleRequest: ; 29cf1 - ld a, LINK_COLOSSEUM - 1 - ld [wPlayerLinkAction], a - ld [wd265], a - ret -; 29cfa - -SetBitsForTimeCapsuleRequest: ; 29cfa - ld a, $2 - ld [rSB], a - xor a - ld [hSerialReceive], a - ld a, (0 << rSC_ON) | 0 - ld [rSC], a - ld a, (1 << rSC_ON) | 0 - ld [rSC], a - xor a ; LINK_TIMECAPSULE - 1 - ld [wPlayerLinkAction], a - ld [wd265], a - ret -; 29d11 - -WaitForLinkedFriend: ; 29d11 - ld a, [wPlayerLinkAction] - and a - jr z, .no_link_action - ld a, $2 - ld [rSB], a - xor a - ld [hSerialReceive], a - ld a, (0 << rSC_ON) | 0 - ld [rSC], a - ld a, (1 << rSC_ON) | 0 - ld [rSC], a - call DelayFrame - call DelayFrame - call DelayFrame - -.no_link_action - ld a, $2 - ld [wLinkTimeoutFrames + 1], a - ld a, $ff - ld [wLinkTimeoutFrames], a -.loop - ld a, [hSerialConnectionStatus] - cp USING_INTERNAL_CLOCK - jr z, .connected - cp USING_EXTERNAL_CLOCK - jr z, .connected - ld a, CONNECTION_NOT_ESTABLISHED - ld [hSerialConnectionStatus], a - ld a, $2 - ld [rSB], a - xor a - ld [hSerialReceive], a - ld a, (0 << rSC_ON) | 0 - ld [rSC], a - ld a, (1 << rSC_ON) | 0 - ld [rSC], a - ld a, [wLinkTimeoutFrames] - dec a - ld [wLinkTimeoutFrames], a - jr nz, .not_done - ld a, [wLinkTimeoutFrames + 1] - dec a - ld [wLinkTimeoutFrames + 1], a - jr z, .done - -.not_done - ld a, $1 - ld [rSB], a - ld a, (0 << rSC_ON) | 1 - ld [rSC], a - ld a, (1 << rSC_ON) | 1 - ld [rSC], a - call DelayFrame - jr .loop - -.connected - call LinkDataReceived - call DelayFrame - call LinkDataReceived - ld c, 50 - call DelayFrames - ld a, $1 - ld [wScriptVar], a - ret - -.done - xor a - ld [wScriptVar], a - ret -; 29d92 - -CheckLinkTimeout: ; 29d92 - ld a, $1 - ld [wPlayerLinkAction], a - ld hl, wLinkTimeoutFrames - ld a, $3 - ld [hli], a - xor a - ld [hl], a - call WaitBGMap - ld a, $2 - ld [hVBlank], a - call DelayFrame - call DelayFrame - call Link_CheckCommunicationError - xor a - ld [hVBlank], a - ld a, [wScriptVar] - and a - ret nz - jp Link_ResetSerialRegistersAfterLinkClosure -; 29dba - -Function29dba: ; 29dba - ld a, $5 - ld [wPlayerLinkAction], a - ld hl, wLinkTimeoutFrames - ld a, $3 - ld [hli], a - xor a - ld [hl], a - call WaitBGMap - ld a, $2 - ld [hVBlank], a - call DelayFrame - call DelayFrame - call Link_CheckCommunicationError - ld a, [wScriptVar] - and a - jr z, .vblank - ld bc, -1 -.wait - dec bc - ld a, b - or c - jr nz, .wait - ld a, [wOtherPlayerLinkMode] - cp $5 - jr nz, .script_var - ld a, $6 - ld [wPlayerLinkAction], a - ld hl, wLinkTimeoutFrames - ld a, $1 - ld [hli], a - ld [hl], $32 - call Link_CheckCommunicationError - ld a, [wOtherPlayerLinkMode] - cp $6 - jr z, .vblank - -.script_var - xor a - ld [wScriptVar], a - ret - -.vblank - xor a - ld [hVBlank], a - ret -; 29e0c - -Link_CheckCommunicationError: ; 29e0c - xor a - ld [hSerialReceivedNewData], a - ld a, [wLinkTimeoutFrames] - ld h, a - ld a, [wLinkTimeoutFrames + 1] - ld l, a - push hl - call .CheckConnected - pop hl - jr nz, .load_true - call .AcknowledgeSerial - call .ConvertDW - call .CheckConnected - jr nz, .load_true - call .AcknowledgeSerial - xor a - jr .load_scriptvar - -.load_true - ld a, $1 - -.load_scriptvar - ld [wScriptVar], a - ld hl, wLinkTimeoutFrames - xor a - ld [hli], a - ld [hl], a - ret -; 29e3b - -.CheckConnected: ; 29e3b - call WaitLinkTransfer - ld hl, wLinkTimeoutFrames - ld a, [hli] - inc a - ret nz - ld a, [hl] - inc a - ret -; 29e47 - -.AcknowledgeSerial: ; 29e47 - ld b, 10 -.loop - call DelayFrame - call LinkDataReceived - dec b - jr nz, .loop - ret -; 29e53 - -.ConvertDW: ; 29e53 - ; [wLinkTimeoutFrames] = ((hl - $100) / 4) + $100 - ; = (hl / 4) + $c0 - dec h - srl h - rr l - srl h - rr l - inc h - ld a, h - ld [wLinkTimeoutFrames], a - ld a, l - ld [wLinkTimeoutFrames + 1], a - ret -; 29e66 - -TryQuickSave: ; 29e66 - ld a, [wd265] - push af - farcall Link_SaveGame - ld a, TRUE - jr nc, .return_result - xor a ; FALSE -.return_result - ld [wScriptVar], a - ld c, 30 - call DelayFrames - pop af - ld [wd265], a - ret -; 29e82 - -CheckBothSelectedSameRoom: ; 29e82 - ld a, [wd265] - call Link_EnsureSync - push af - call LinkDataReceived - call DelayFrame - call LinkDataReceived - pop af - ld b, a - ld a, [wd265] - cp b - jr nz, .fail - ld a, [wd265] - inc a - ld [wLinkMode], a - xor a - ld [hVBlank], a - ld a, TRUE - ld [wScriptVar], a - ret - -.fail - xor a ; FALSE - ld [wScriptVar], a - ret -; 29eaf - -TimeCapsule: ; 29eaf - ld a, LINK_TIMECAPSULE - ld [wLinkMode], a - call DisableSpriteUpdates - callfar LinkCommunications - call EnableSpriteUpdates - xor a - ld [hVBlank], a - ret -; 29ec4 - -TradeCenter: ; 29ec4 - ld a, LINK_TRADECENTER - ld [wLinkMode], a - call DisableSpriteUpdates - callfar LinkCommunications - call EnableSpriteUpdates - xor a - ld [hVBlank], a - ret -; 29ed9 - -Colosseum: ; 29ed9 - ld a, LINK_COLOSSEUM - ld [wLinkMode], a - call DisableSpriteUpdates - callfar LinkCommunications - call EnableSpriteUpdates - xor a - ld [hVBlank], a - ret -; 29eee - -CloseLink: ; 29eee - xor a - ld [wLinkMode], a - ld c, 3 - call DelayFrames - jp Link_ResetSerialRegistersAfterLinkClosure -; 29efa - -FailedLinkToPast: ; 29efa - ld c, 40 - call DelayFrames - ld a, $e - jp Link_EnsureSync -; 29f04 - -Link_ResetSerialRegistersAfterLinkClosure: ; 29f04 - ld c, 3 - call DelayFrames - ld a, CONNECTION_NOT_ESTABLISHED - ld [hSerialConnectionStatus], a - ld a, $2 - ld [rSB], a - xor a - ld [hSerialReceive], a - ld [rSC], a - ret -; 29f17 - -Link_EnsureSync: ; 29f17 - add $d0 - ld [wPlayerLinkAction], a - ld [wcf57], a - ld a, $2 - ld [hVBlank], a - call DelayFrame - call DelayFrame -.receive_loop - call Serial_ExchangeLinkMenuSelection - ld a, [wOtherPlayerLinkMode] - ld b, a - and $f0 - cp $d0 - jr z, .done - ld a, [wOtherPlayerLinkAction] - ld b, a - and $f0 - cp $d0 - jr nz, .receive_loop - -.done - xor a - ld [hVBlank], a - ld a, b - and $f - ret -; 29f47 - -CableClubCheckWhichChris: ; 29f47 - ld a, [hSerialConnectionStatus] - cp USING_EXTERNAL_CLOCK - ld a, TRUE - jr z, .yes - dec a ; FALSE - -.yes - ld [wScriptVar], a - ret -; 29f54 - -Unreferenced_Gen1LinkCommsBorderGFX: ; 29f54 -INCBIN "gfx/trade/unused_gen_1_border_tiles.2bpp" -; 29fe4 - -Unreferenced_Function29fe4: - ld a, BANK(sPartyMail) - call GetSRAMBank - ld d, FALSE - ld b, CHECK_FLAG - predef SmallFarFlagAction - call CloseSRAM - ld a, c - and a - ret diff --git a/engine/link/link.asm b/engine/link/link.asm new file mode 100755 index 000000000..86af41c01 --- /dev/null +++ b/engine/link/link.asm @@ -0,0 +1,2589 @@ +LinkCommunications: ; 28000 + call ClearBGPalettes + ld c, 80 + call DelayFrames + call ClearScreen + call ClearSprites + call UpdateSprites + xor a + ld [hSCX], a + ld [hSCY], a + ld c, 80 + call DelayFrames + call ClearScreen + call UpdateSprites + call LoadStandardFont + call LoadFontsBattleExtra + farcall LinkComms_LoadPleaseWaitTextboxBorderGFX + call WaitBGMap2 + hlcoord 3, 8 + ld b, 2 + ld c, 12 + ld d, h + ld e, l + farcall LinkTextbox2 + hlcoord 4, 10 + ld de, String_PleaseWait + call PlaceString + call SetTradeRoomBGPals + call WaitBGMap2 + ld hl, wcf5d + xor a ; LOW($5000) + ld [hli], a + ld [hl], HIGH($5000) + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jp nz, Gen2ToGen2LinkComms + +Gen2ToGen1LinkComms: ; 2805d + call ClearLinkData + call Link_PrepPartyData_Gen1 + call FixDataForLinkTransfer + xor a + ld [wPlayerLinkAction], a + call WaitLinkTransfer + ld a, [hSerialConnectionStatus] + cp USING_INTERNAL_CLOCK + jr nz, .player_1 + + ld c, 3 + call DelayFrames + xor a + ld [hSerialSend], a + ld a, (0 << rSC_ON) | 1 + ld [rSC], a + ld a, (1 << rSC_ON) | 1 + ld [rSC], a + + call DelayFrame + xor a + ld [hSerialSend], a + ld a, (0 << rSC_ON) | 1 + ld [rSC], a + ld a, (1 << rSC_ON) | 1 + ld [rSC], a + +.player_1 + ld de, MUSIC_NONE + call PlayMusic + ld c, 3 + call DelayFrames + xor a + ld [rIF], a + ld a, $8 + ld [rIE], a + ld hl, wd1f3 + ld de, wEnemyMonSpecies + ld bc, $11 + call Serial_ExchangeBytes + ld a, SERIAL_NO_DATA_BYTE + ld [de], a + ld hl, wLinkData + ld de, wOTPlayerName + ld bc, $1a8 + call Serial_ExchangeBytes + ld a, SERIAL_NO_DATA_BYTE + ld [de], a + ld hl, wMisc + ld de, wPlayerTrademonSpecies + ld bc, wPlayerTrademonSpecies - wMisc + call Serial_ExchangeBytes + xor a + ld [rIF], a + ld a, $1d + ld [rIE], a + call Link_CopyRandomNumbers + ld hl, wOTPlayerName + call Link_FindFirstNonControlCharacter_SkipZero + push hl + ld bc, NAME_LENGTH + add hl, bc + ld a, [hl] + pop hl + and a + jp z, Function28b22 + cp $7 + jp nc, Function28b22 + ld de, wLinkData + ld bc, $1a2 + call Link_CopyOTData + ld de, wPlayerTrademonSpecies + ld hl, wTimeCapsulePartyMon1Species + ld c, 2 +.loop + ld a, [de] + inc de + and a + jr z, .loop + cp SERIAL_PREAMBLE_BYTE + jr z, .loop + cp SERIAL_NO_DATA_BYTE + jr z, .loop + cp SERIAL_PATCH_LIST_PART_TERMINATOR + jr z, .next + push hl + push bc + ld b, 0 + dec a + ld c, a + add hl, bc + ld a, SERIAL_NO_DATA_BYTE + ld [hl], a + pop bc + pop hl + jr .loop + +.next + ld hl, wc90f + dec c + jr nz, .loop + ld hl, wLinkPlayerName + ld de, wOTPlayerName + ld bc, NAME_LENGTH + call CopyBytes + ld de, wOTPartyCount + ld a, [hli] + ld [de], a + inc de +.party_loop + ld a, [hli] + cp -1 + jr z, .done_party + ld [wd265], a + push hl + push de + callfar ConvertMon_1to2 + pop de + pop hl + ld a, [wd265] + ld [de], a + inc de + jr .party_loop + +.done_party + ld [de], a + ld hl, wTimeCapsulePartyMon1Species + call Function2868a + ld a, LOW(wOTPartyMonOT) + ld [wUnusedD102], a + ld a, HIGH(wOTPartyMonOT) + ld [wUnusedD102 + 1], a + ld de, MUSIC_NONE + call PlayMusic + ld a, [hSerialConnectionStatus] + cp USING_INTERNAL_CLOCK + ld c, 66 + call z, DelayFrames + ld de, MUSIC_ROUTE_30 + call PlayMusic + jp InitTradeMenuDisplay +; 28177 + +Gen2ToGen2LinkComms: ; 28177 + call ClearLinkData + call Link_PrepPartyData_Gen2 + call FixDataForLinkTransfer + call Function29dba + ld a, [wScriptVar] + and a + jp z, LinkTimeout + ld a, [hSerialConnectionStatus] + cp USING_INTERNAL_CLOCK + jr nz, .Player1 + + ld c, 3 + call DelayFrames + xor a + ld [hSerialSend], a + ld a, (0 << rSC_ON) | 1 + ld [rSC], a + ld a, (1 << rSC_ON) | 1 + ld [rSC], a + + call DelayFrame + xor a + ld [hSerialSend], a + ld a, (0 << rSC_ON) | 1 + ld [rSC], a + ld a, (1 << rSC_ON) | 1 + ld [rSC], a + +.Player1: + ld de, MUSIC_NONE + call PlayMusic + ld c, 3 + call DelayFrames + xor a + ld [rIF], a + ld a, $8 + ld [rIE], a + ld hl, wd1f3 + ld de, wEnemyMonSpecies + ld bc, $11 + call Serial_ExchangeBytes + ld a, SERIAL_NO_DATA_BYTE + ld [de], a + ld hl, wLinkData + ld de, wOTPlayerName + ld bc, $1c2 + call Serial_ExchangeBytes + ld a, SERIAL_NO_DATA_BYTE + ld [de], a + ld hl, wMisc + ld de, wPlayerTrademonSpecies + ld bc, $c8 + call Serial_ExchangeBytes + ld a, [wLinkMode] + cp LINK_TRADECENTER + jr nz, .not_trading + ld hl, wc9f4 + ld de, wcb84 + ld bc, $186 + call ExchangeBytes + +.not_trading + xor a + ld [rIF], a + ld a, $1d + ld [rIE], a + ld de, MUSIC_NONE + call PlayMusic + call Link_CopyRandomNumbers + ld hl, wOTPlayerName + call Link_FindFirstNonControlCharacter_SkipZero + ld de, wLinkData + ld bc, $1b9 + call Link_CopyOTData + ld de, wPlayerTrademonSpecies + ld hl, wLinkPlayerPartyMon1Species + ld c, 2 +.loop1 + ld a, [de] + inc de + and a + jr z, .loop1 + cp SERIAL_PREAMBLE_BYTE + jr z, .loop1 + cp SERIAL_NO_DATA_BYTE + jr z, .loop1 + cp SERIAL_PATCH_LIST_PART_TERMINATOR + jr z, .next1 + push hl + push bc + ld b, 0 + dec a + ld c, a + add hl, bc + ld a, SERIAL_NO_DATA_BYTE + ld [hl], a + pop bc + pop hl + jr .loop1 + +.next1 + ld hl, wc90f + dec c + jr nz, .loop1 + ld a, [wLinkMode] + cp LINK_TRADECENTER + jp nz, .skip_mail + ld hl, wcb84 +.loop2 + ld a, [hli] + cp MAIL_MSG_LENGTH + jr nz, .loop2 +.loop3 + ld a, [hli] + cp SERIAL_NO_DATA_BYTE + jr z, .loop3 + cp MAIL_MSG_LENGTH + jr z, .loop3 + dec hl + ld de, wcb84 + ld bc, $190 ; 400 + call CopyBytes + ld hl, wcb84 + ld bc, $c6 ; 198 +.loop4 + ld a, [hl] + cp MAIL_MSG_LENGTH + 1 + jr nz, .okay1 + ld [hl], SERIAL_NO_DATA_BYTE +.okay1 + inc hl + dec bc + ld a, b + or c + jr nz, .loop4 + ld de, wcc9e +.loop5 + ld a, [de] + inc de + cp SERIAL_PATCH_LIST_PART_TERMINATOR + jr z, .start_copying_mail + ld hl, wcc4a + dec a + ld b, $0 + ld c, a + add hl, bc + ld [hl], SERIAL_NO_DATA_BYTE + jr .loop5 + +.start_copying_mail + ld hl, wcb84 + ld de, wc9f4 + ld b, PARTY_LENGTH +.copy_mail_loop + push bc + ld bc, MAIL_MSG_LENGTH + 1 + call CopyBytes + ld a, LOW(MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) + add e + ld e, a + ld a, HIGH(MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1)) + adc d + ld d, a + pop bc + dec b + jr nz, .copy_mail_loop + ld de, wc9f4 + ld b, PARTY_LENGTH +.copy_author_loop + push bc + ld a, LOW(MAIL_MSG_LENGTH + 1) + add e + ld e, a + ld a, HIGH(MAIL_MSG_LENGTH + 1) + adc d + ld d, a + ld bc, MAIL_STRUCT_LENGTH - (MAIL_MSG_LENGTH + 1) + call CopyBytes + pop bc + dec b + jr nz, .copy_author_loop + ld b, PARTY_LENGTH + ld de, wc9f4 +.fix_mail_loop + push bc + push de + farcall IsMailEuropean + ld a, c + or a + jr z, .next + sub $3 + jr nc, .skip + farcall DeutenEnglischenPost + jr .next + +.skip + cp $2 + jr nc, .next + farcall HandleSpanishItalianMail + +.next + pop de + ld hl, MAIL_STRUCT_LENGTH + add hl, de + ld d, h + ld e, l + pop bc + dec b + jr nz, .fix_mail_loop + ld de, wcb0e + xor a + ld [de], a + +.skip_mail + ld hl, wLinkPlayerName + ld de, wOTPlayerName + ld bc, NAME_LENGTH + call CopyBytes + ld de, wOTPartyCount + ld bc, 1 + PARTY_LENGTH + 1 + call CopyBytes + ld de, wOTPlayerID + ld bc, 2 + call CopyBytes + ld de, wOTPartyMons + ld bc, wOTPartyDataEnd - wOTPartyMons + call CopyBytes + ld a, LOW(wOTPartyMonOT) + ld [wUnusedD102], a + ld a, HIGH(wOTPartyMonOT) + ld [wUnusedD102 + 1], a + ld de, MUSIC_NONE + call PlayMusic + ld a, [hSerialConnectionStatus] + cp USING_INTERNAL_CLOCK + ld c, 66 + call z, DelayFrames + ld a, [wLinkMode] + cp LINK_COLOSSEUM + jr nz, .ready_to_trade + ld a, CAL + ld [wOtherTrainerClass], a + call ClearScreen + farcall Link_WaitBGMap + ld hl, wOptions + ld a, [hl] + push af + and 1 << STEREO + or TEXT_DELAY_MED + ld [hl], a + ld hl, wOTPlayerName + ld de, wOTClassName + ld bc, NAME_LENGTH + call CopyBytes + call ReturnToMapFromSubmenu + + ; LET'S DO THIS + ld a, [wDisableTextAcceleration] + push af + ld a, 1 + ld [wDisableTextAcceleration], a + ld a, [rIE] + push af + ld a, [rIF] + push af + xor a + ld [rIF], a + ld a, [rIE] + set 1, a + ld [rIE], a + pop af + ld [rIF], a + + predef StartBattle + + ld a, [rIF] + ld h, a + xor a + ld [rIF], a + pop af + ld [rIE], a + ld a, h + ld [rIF], a + pop af + ld [wDisableTextAcceleration], a + pop af + ld [wOptions], a + farcall LoadPokemonData + jp Function28b22 + +.ready_to_trade + ld de, MUSIC_ROUTE_30 + call PlayMusic + jp InitTradeMenuDisplay +; 283b2 + +LinkTimeout: ; 283b2 + ld de, .TooMuchTimeHasElapsed + ld b, 10 +.loop + call DelayFrame + call LinkDataReceived + dec b + jr nz, .loop + xor a + ld [hld], a + ld [hl], a + ld [hVBlank], a + push de + hlcoord 0, 12 + ld b, 4 + ld c, 18 + push de + ld d, h + ld e, l + farcall LinkTextbox2 + pop de + pop hl + bccoord 1, 14 + call PlaceHLTextAtBC + call RotateThreePalettesRight + call ClearScreen + ld b, SCGB_DIPLOMA + call GetSGBLayout + call WaitBGMap2 + ret +; 283ed + +.TooMuchTimeHasElapsed: ; 0x283ed + ; Too much time has elapsed. Please try again. + text_jump UnknownText_0x1c4183 + db "@" +; 0x283f2 + +ExchangeBytes: ; 283f2 + ld a, TRUE + ld [hSerialIgnoringInitialData], a +.loop + ld a, [hl] + ld [hSerialSend], a + call Serial_ExchangeByte + push bc + ld b, a + inc hl + ld a, 48 +.delay_cycles + dec a + jr nz, .delay_cycles + ld a, [hSerialIgnoringInitialData] + and a + ld a, b + pop bc + jr z, .load + dec hl + xor a + ld [hSerialIgnoringInitialData], a + jr .loop + +.load + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .loop + ret +; 28419 + +String_PleaseWait: ; 28419 + db "PLEASE WAIT!@" +; 28426 + +ClearLinkData: ; 28426 + ld hl, wLinkData + ld bc, wLinkDataEnd - wLinkData +.loop + xor a + ld [hli], a + dec bc + ld a, b + or c + jr nz, .loop + ret +; 28434 + +FixDataForLinkTransfer: ; 28434 + ld hl, wd1f3 + ld a, SERIAL_PREAMBLE_BYTE + ld b, wLinkBattleRNs - wd1f3 +.loop1 + ld [hli], a + dec b + jr nz, .loop1 + ld b, wTempEnemyMonSpecies - wLinkBattleRNs +.loop2 + call Random + cp SERIAL_PREAMBLE_BYTE + jr nc, .loop2 + ld [hli], a + dec b + jr nz, .loop2 + ld hl, wMisc + ld a, SERIAL_PREAMBLE_BYTE + ld [hli], a + ld [hli], a + ld [hli], a + ld b, $c8 + xor a +.loop3 + ld [hli], a + dec b + jr nz, .loop3 + ld hl, wTimeCapsulePartyMon1 - 1 + 6 + ld de, wc612 + lb bc, 0, 0 +.loop4 + inc c + ld a, c + cp SERIAL_PREAMBLE_BYTE + jr z, .next1 + ld a, b + dec a + jr nz, .next2 + push bc + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + ld b, $d + jr z, .got_value + ld b, $27 +.got_value + ld a, c + cp b + pop bc + jr z, .done +.next2 + inc hl + ld a, [hl] + cp SERIAL_NO_DATA_BYTE + jr nz, .loop4 + ld a, c + ld [de], a + inc de + ld [hl], SERIAL_PATCH_LIST_PART_TERMINATOR + jr .loop4 + +.next1 + ld a, SERIAL_PATCH_LIST_PART_TERMINATOR + ld [de], a + inc de + lb bc, 1, 0 + jr .loop4 + +.done + ld a, SERIAL_PATCH_LIST_PART_TERMINATOR + ld [de], a + ret +; 28499 + +Link_PrepPartyData_Gen1: ; 28499 + ld de, wLinkData + ld a, SERIAL_PREAMBLE_BYTE + ld b, PARTY_LENGTH +.loop1 + ld [de], a + inc de + dec b + jr nz, .loop1 + ld hl, wPlayerName + ld bc, NAME_LENGTH + call CopyBytes + push de + ld hl, wPartyCount + ld a, [hli] + ld [de], a + inc de +.loop2 + ld a, [hli] + cp -1 + jr z, .done_party + ld [wd265], a + push hl + push de + callfar ConvertMon_2to1 + pop de + pop hl + ld a, [wd265] + ld [de], a + inc de + jr .loop2 + +.done_party + ld [de], a + pop de + ld hl, 1 + PARTY_LENGTH + 1 + add hl, de + ld d, h + ld e, l + ld hl, wPartyMon1Species + ld c, PARTY_LENGTH +.mon_loop + push bc + call .ConvertPartyStruct2to1 + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop bc + dec c + jr nz, .mon_loop + ld hl, wPartyMonOT + call .copy_ot_nicks + ld hl, wPartyMonNicknames +.copy_ot_nicks + ld bc, PARTY_LENGTH * NAME_LENGTH + jp CopyBytes +; 284f6 + +.ConvertPartyStruct2to1: ; 284f6 + ld b, h + ld c, l + push de + push bc + ld a, [hl] + ld [wd265], a + callfar ConvertMon_2to1 + pop bc + pop de + ld a, [wd265] + ld [de], a + inc de + ld hl, MON_HP + add hl, bc + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + inc de + xor a + ld [de], a + inc de + ld hl, MON_STATUS + add hl, bc + ld a, [hl] + ld [de], a + inc de + ld a, [bc] + cp MAGNEMITE + jr z, .steel_type + cp MAGNETON + jr nz, .skip_steel + +.steel_type + ld a, ELECTRIC + ld [de], a + inc de + ld [de], a + inc de + jr .done_steel + +.skip_steel + push bc + dec a + ld hl, BaseData + BASE_TYPES + ld bc, BASE_DATA_SIZE + call AddNTimes + ld bc, BASE_CATCH_RATE - BASE_TYPES + ld a, BANK(BaseData) + call FarCopyBytes + pop bc + +.done_steel + push bc + ld hl, MON_ITEM + add hl, bc + ld bc, MON_HAPPINESS - MON_ITEM + call CopyBytes + pop bc + + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + ld [de], a + ld [wCurPartyLevel], a + inc de + + push bc + ld hl, MON_MAXHP + add hl, bc + ld bc, MON_SAT - MON_MAXHP + call CopyBytes + pop bc + + push de + push bc + + ld a, [bc] + dec a + push bc + ld b, 0 + ld c, a + ld hl, KantoMonSpecials + add hl, bc + ld a, BANK(KantoMonSpecials) + call GetFarByte + ld [wBaseSpecialAttack], a + pop bc + + ld hl, MON_STAT_EXP - 1 + add hl, bc + ld c, STAT_SATK + ld b, TRUE + predef CalcMonStatC + + pop bc + pop de + + ld a, [hQuotient + 1] + ld [de], a + inc de + ld a, [hQuotient + 2] + ld [de], a + inc de + ld h, b + ld l, c + ret +; 28595 + +Link_PrepPartyData_Gen2: ; 28595 + ld de, wLinkData + ld a, SERIAL_PREAMBLE_BYTE + ld b, PARTY_LENGTH +.loop1 + ld [de], a + inc de + dec b + jr nz, .loop1 + ld hl, wPlayerName + ld bc, NAME_LENGTH + call CopyBytes + ld hl, wPartyCount + ld bc, 1 + PARTY_LENGTH + 1 + call CopyBytes + ld hl, wPlayerID + ld bc, 2 + call CopyBytes + ld hl, wPartyMon1Species + ld bc, PARTY_LENGTH * PARTYMON_STRUCT_LENGTH + call CopyBytes + ld hl, wPartyMonOT + ld bc, PARTY_LENGTH * NAME_LENGTH + call CopyBytes + ld hl, wPartyMonNicknames + ld bc, PARTY_LENGTH * MON_NAME_LENGTH + call CopyBytes + +; Okay, we did all that. Now, are we in the trade center? + ld a, [wLinkMode] + cp LINK_TRADECENTER + ret nz + +; Fill 5 bytes at wc9f4 with $20 + ld de, wc9f4 + ld a, $20 + call Function28682 + +; Copy all the mail messages to wc9f9 + ld a, BANK(sPartyMail) + call GetSRAMBank + ld hl, sPartyMail + ld b, PARTY_LENGTH +.loop2 + push bc + ld bc, MAIL_MSG_LENGTH + 1 + call CopyBytes + ld bc, sPartyMon1MailEnd - sPartyMon1MailAuthor + add hl, bc + pop bc + dec b + jr nz, .loop2 +; Copy the mail data to wcabf + ld hl, sPartyMail + ld b, PARTY_LENGTH +.loop3 + push bc + ld bc, MAIL_MSG_LENGTH + 1 + add hl, bc + ld bc, sPartyMon1MailEnd - sPartyMon1MailAuthor + call CopyBytes + pop bc + dec b + jr nz, .loop3 + + ld b, PARTY_LENGTH + ld de, sPartyMail + ld hl, wc9f9 +.loop4 + push bc + push hl + push de + push hl + farcall IsMailEuropean + pop de + ld a, c + or a + jr z, .next + sub $3 + jr nc, .italian_spanish + farcall HandleFrenchGermanMail + jr .next + +.italian_spanish + cp $2 + jr nc, .next + farcall HandleSpanishItalianMail + +.next + pop de + ld hl, MAIL_STRUCT_LENGTH + add hl, de + ld d, h + ld e, l + pop hl + ld bc, sPartyMon1MailAuthor - sPartyMon1Mail + add hl, bc + pop bc + dec b + jr nz, .loop4 + call CloseSRAM + ld hl, wc9f9 + ld bc, PARTY_LENGTH * (sPartyMon1MailAuthor - sPartyMon1Mail) +.loop5 + ld a, [hl] + cp SERIAL_NO_DATA_BYTE + jr nz, .skip2 + ld [hl], sPartyMon1MailAuthor - sPartyMon1Mail + +.skip2 + inc hl + dec bc + ld a, b + or c + jr nz, .loop5 + ld hl, wcabf + ld de, wcb13 + ld b, PARTY_LENGTH * (sPartyMon1MailEnd - sPartyMon1MailAuthor) + ld c, $0 +.loop6 + inc c + ld a, [hl] + cp SERIAL_NO_DATA_BYTE + jr nz, .skip3 + ld [hl], SERIAL_PATCH_LIST_PART_TERMINATOR + ld a, c + ld [de], a + inc de + +.skip3 + inc hl + dec b + jr nz, .loop6 + ld a, SERIAL_PATCH_LIST_PART_TERMINATOR + ld [de], a + ret +; 28682 + +Function28682: ; 28682 + ld c, 5 +.loop + ld [de], a + inc de + dec c + jr nz, .loop + ret +; 2868a + +Function2868a: ; 2868a + push hl + ld d, h + ld e, l + ld bc, wLinkOTPartyMonTypes + ld hl, wcbe8 + ld a, c + ld [hli], a + ld [hl], b + ld hl, wOTPartyMon1Species + ld c, PARTY_LENGTH +.loop + push bc + call .ConvertToGen2 + pop bc + dec c + jr nz, .loop + pop hl + ld bc, PARTY_LENGTH * REDMON_STRUCT_LENGTH + add hl, bc + ld de, wOTPartyMonOT + ld bc, PARTY_LENGTH * NAME_LENGTH + call CopyBytes + ld de, wOTPartyMonNicknames + ld bc, PARTY_LENGTH * MON_NAME_LENGTH + jp CopyBytes +; 286ba + +.ConvertToGen2: ; 286ba + ld b, h + ld c, l + ld a, [de] + inc de + push bc + push de + ld [wd265], a + callfar ConvertMon_1to2 + pop de + pop bc + ld a, [wd265] + ld [bc], a + ld [wCurSpecies], a + ld hl, MON_HP + add hl, bc + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hl], a + inc de + ld hl, MON_STATUS + add hl, bc + ld a, [de] + inc de + ld [hl], a + ld hl, wcbe8 + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de + ld a, l + ld [wcbe8], a + ld a, h + ld [wcbe8 + 1], a + push bc + ld hl, MON_ITEM + add hl, bc + push hl + ld h, d + ld l, e + pop de + push bc + ld a, [hli] + ld b, a + call TimeCapsule_ReplaceTeruSama + ld a, b + ld [de], a + inc de + pop bc + ld bc, $19 + call CopyBytes + pop bc + ld d, h + ld e, l + ld hl, $1f + add hl, bc + ld a, [de] + inc de + ld [hl], a + ld [wCurPartyLevel], a + push bc + ld hl, $24 + add hl, bc + push hl + ld h, d + ld l, e + pop de + ld bc, 8 + call CopyBytes + pop bc + call GetBaseData + push de + push bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + ld c, STAT_SATK + ld b, TRUE + predef CalcMonStatC + pop bc + pop hl + ld a, [hQuotient + 1] + ld [hli], a + ld a, [hQuotient + 2] + ld [hli], a + push hl + push bc + ld hl, MON_STAT_EXP - 1 + add hl, bc + ld c, STAT_SDEF + ld b, TRUE + predef CalcMonStatC + pop bc + pop hl + ld a, [hQuotient + 1] + ld [hli], a + ld a, [hQuotient + 2] + ld [hli], a + push hl + ld hl, $1b + add hl, bc + ld a, $46 + ld [hli], a + xor a + ld [hli], a + ld [hli], a + ld [hl], a + pop hl + inc de + inc de + ret +; 28771 + +TimeCapsule_ReplaceTeruSama: ; 28771 + ld a, b + and a + ret z + push hl + ld hl, TimeCapsule_CatchRateItems +.loop + ld a, [hli] + and a + jr z, .end + cp b + jr z, .found + inc hl + jr .loop + +.found + ld b, [hl] + +.end + pop hl + ret + + +INCLUDE "data/items/catch_rate_items.asm" + + +Link_CopyOTData: ; 2879e +.loop + ld a, [hli] + cp SERIAL_NO_DATA_BYTE + jr z, .loop + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .loop + ret +; 287ab + +Link_CopyRandomNumbers: ; 287ab + ld a, [hSerialConnectionStatus] + cp USING_INTERNAL_CLOCK + ret z + ld hl, wEnemyMonSpecies + call Link_FindFirstNonControlCharacter_AllowZero + ld de, wLinkBattleRNs + ld c, 10 +.loop + ld a, [hli] + cp SERIAL_NO_DATA_BYTE + jr z, .loop + cp SERIAL_PREAMBLE_BYTE + jr z, .loop + ld [de], a + inc de + dec c + jr nz, .loop + ret +; 287ca + +Link_FindFirstNonControlCharacter_SkipZero: ; 287ca +.loop + ld a, [hli] + and a + jr z, .loop + cp SERIAL_PREAMBLE_BYTE + jr z, .loop + cp SERIAL_NO_DATA_BYTE + jr z, .loop + dec hl + ret +; 287d8 + +Link_FindFirstNonControlCharacter_AllowZero: ; 287d8 +.loop + ld a, [hli] + cp SERIAL_PREAMBLE_BYTE + jr z, .loop + cp SERIAL_NO_DATA_BYTE + jr z, .loop + dec hl + ret +; 287e3 + +InitTradeMenuDisplay: ; 287e3 + call ClearScreen + call LoadTradeScreenBorder + farcall InitTradeSpeciesList + xor a + ld hl, wOtherPlayerLinkMode + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld a, 1 + ld [wMenuCursorY], a + inc a + ld [wPlayerLinkAction], a + jp LinkTrade_PlayerPartyMenu +; 28803 + +LinkTrade_OTPartyMenu: ; 28803 + ld a, OTPARTYMON + ld [wMonType], a + ld a, A_BUTTON | D_UP | D_DOWN + ld [wMenuJoypadFilter], a + ld a, [wOTPartyCount] + ld [w2DMenuNumRows], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, 9 + ld [w2DMenuCursorInitY], a + ld a, 6 + ld [w2DMenuCursorInitX], a + ld a, 1 + ld [wMenuCursorX], a + ln a, 1, 0 + ld [w2DMenuCursorOffsets], a + ld a, MENU_UNUSED_3 + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + +LinkTradeOTPartymonMenuLoop: ; 28835 + farcall LinkTradeMenu + ld a, d + and a + jp z, LinkTradePartiesMenuMasterLoop + bit A_BUTTON_F, a + jr z, .not_a_button + ld a, INIT_ENEMYOT_LIST + ld [wInitListType], a + callfar InitList + ld hl, wOTPartyMon1Species + farcall LinkMonStatsScreen + jp LinkTradePartiesMenuMasterLoop + +.not_a_button + bit D_UP_F, a + jr z, .not_d_up + ld a, [wMenuCursorY] + ld b, a + ld a, [wOTPartyCount] + cp b + jp nz, LinkTradePartiesMenuMasterLoop + xor a + ld [wMonType], a + call HideCursor + push hl + push bc + ld bc, NAME_LENGTH + add hl, bc + ld [hl], " " + pop bc + pop hl + ld a, [wPartyCount] + ld [wMenuCursorY], a + jr LinkTrade_PlayerPartyMenu + +.not_d_up + bit D_DOWN_F, a + jp z, LinkTradePartiesMenuMasterLoop + jp Function28ac9 +; 2888b + +LinkTrade_PlayerPartyMenu: ; 2888b + farcall InitMG_Mobile_LinkTradePalMap + xor a + ld [wMonType], a + ld a, A_BUTTON | D_UP | D_DOWN + ld [wMenuJoypadFilter], a + ld a, [wPartyCount] + ld [w2DMenuNumRows], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, 1 + ld [w2DMenuCursorInitY], a + ld a, 6 + ld [w2DMenuCursorInitX], a + ld a, 1 + ld [wMenuCursorX], a + ln a, 1, 0 + ld [w2DMenuCursorOffsets], a + ld a, MENU_UNUSED_3 + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + call WaitBGMap2 + +LinkTradePartymonMenuLoop: ; 288c5 + farcall LinkTradeMenu + ld a, d + and a + jr nz, .check_joypad + jp LinkTradePartiesMenuMasterLoop + +.check_joypad + bit A_BUTTON_F, a + jr z, .not_a_button + jp Function28926 + +.not_a_button + bit D_DOWN_F, a + jr z, .not_d_down + ld a, [wMenuCursorY] + dec a + jp nz, LinkTradePartiesMenuMasterLoop + ld a, OTPARTYMON + ld [wMonType], a + call HideCursor + push hl + push bc + ld bc, NAME_LENGTH + add hl, bc + ld [hl], " " + pop bc + pop hl + ld a, 1 + ld [wMenuCursorY], a + jp LinkTrade_OTPartyMenu + +.not_d_down + bit D_UP_F, a + jr z, LinkTradePartiesMenuMasterLoop + ld a, [wMenuCursorY] + ld b, a + ld a, [wPartyCount] + cp b + jr nz, LinkTradePartiesMenuMasterLoop + call HideCursor + push hl + push bc + ld bc, NAME_LENGTH + add hl, bc + ld [hl], " " + pop bc + pop hl + jp Function28ade +; 2891c + +LinkTradePartiesMenuMasterLoop: ; 2891c + ld a, [wMonType] + and a + jp z, LinkTradePartymonMenuLoop ; PARTYMON + jp LinkTradeOTPartymonMenuLoop ; OTPARTYMON +; 28926 + +Function28926: ; 28926 + call LoadTileMapToTempTileMap + ld a, [wMenuCursorY] + push af + hlcoord 0, 15 + ld b, 1 + ld c, 18 + call LinkTextboxAtHL + hlcoord 2, 16 + ld de, .String_Stats_Trade + call PlaceString + farcall Link_WaitBGMap + +.joy_loop + ld a, " " + ldcoord_a 11, 16 + ld a, A_BUTTON | B_BUTTON | D_RIGHT + ld [wMenuJoypadFilter], a + ld a, 1 + ld [w2DMenuNumRows], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, 16 + ld [w2DMenuCursorInitY], a + ld a, 1 + ld [w2DMenuCursorInitX], a + ld a, 1 + ld [wMenuCursorY], a + ld [wMenuCursorX], a + ln a, 2, 0 + ld [w2DMenuCursorOffsets], a + xor a + ld [w2DMenuFlags1], a + ld [w2DMenuFlags2], a + call ScrollingMenuJoypad + bit D_RIGHT_F, a + jr nz, .d_right + bit B_BUTTON_F, a + jr z, .show_stats +.b_button + pop af + ld [wMenuCursorY], a + call Call_LoadTempTileMapToTileMap + jp LinkTrade_PlayerPartyMenu + +.d_right + ld a, " " + ldcoord_a 1, 16 + ld a, A_BUTTON | B_BUTTON | D_LEFT + ld [wMenuJoypadFilter], a + ld a, 1 + ld [w2DMenuNumRows], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, 16 + ld [w2DMenuCursorInitY], a + ld a, 11 + ld [w2DMenuCursorInitX], a + ld a, 1 + ld [wMenuCursorY], a + ld [wMenuCursorX], a + ln a, 2, 0 + ld [w2DMenuCursorOffsets], a + xor a + ld [w2DMenuFlags1], a + ld [w2DMenuFlags2], a + call ScrollingMenuJoypad + bit D_LEFT_F, a + jp nz, .joy_loop + bit B_BUTTON_F, a + jr nz, .b_button + jr .try_trade + +.show_stats + pop af + ld [wMenuCursorY], a + ld a, INIT_PLAYEROT_LIST + ld [wInitListType], a + callfar InitList + farcall LinkMonStatsScreen + call Call_LoadTempTileMapToTileMap + hlcoord 6, 1 + lb bc, 6, 1 + ld a, " " + call LinkEngine_FillBox + hlcoord 17, 1 + lb bc, 6, 1 + ld a, " " + call LinkEngine_FillBox + jp LinkTrade_PlayerPartyMenu + +.try_trade + call PlaceHollowCursor + pop af + ld [wMenuCursorY], a + dec a + ld [wd002], a + ld [wPlayerLinkAction], a + farcall Function16d6ce + ld a, [wOtherPlayerLinkMode] + cp $f + jp z, InitTradeMenuDisplay + ld [wd003], a + call Function28b68 + ld c, 100 + call DelayFrames + farcall ValidateOTTrademon + jr c, .abnormal + farcall Functionfb5dd + jp nc, LinkTrade + xor a + ld [wcf57], a + ld [wOtherPlayerLinkAction], a + hlcoord 0, 12 + ld b, 4 + ld c, 18 + call LinkTextboxAtHL + farcall Link_WaitBGMap + ld hl, .Text_CantTradeLastMon + bccoord 1, 14 + call PlaceHLTextAtBC + jr .cancel_trade + +.abnormal + xor a + ld [wcf57], a + ld [wOtherPlayerLinkAction], a + ld a, [wd003] + ld hl, wOTPartySpecies + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + ld [wd265], a + call GetPokemonName + hlcoord 0, 12 + ld b, 4 + ld c, 18 + call LinkTextboxAtHL + farcall Link_WaitBGMap + ld hl, .Text_Abnormal + bccoord 1, 14 + call PlaceHLTextAtBC + +.cancel_trade + hlcoord 0, 12 + ld b, 4 + ld c, 18 + call LinkTextboxAtHL + hlcoord 1, 14 + ld de, String_TooBadTheTradeWasCanceled + call PlaceString + ld a, $1 + ld [wPlayerLinkAction], a + farcall Function16d6ce + ld c, 100 + call DelayFrames + jp InitTradeMenuDisplay +; 28aaf + + +.Text_CantTradeLastMon: ; 0x28aaf + ; If you trade that #MON, you won't be able to battle. + text_jump UnknownText_0x1c41b1 + db "@" +; 0x28ab4 + +.String_Stats_Trade: ; 28ab4 + db "STATS TRADE@" + +.Text_Abnormal: ; 0x28ac4 + ; Your friend's @ appears to be abnormal! + text_jump UnknownText_0x1c41e6 + db "@" +; 0x28ac9 + + +Function28ac9: ; 28ac9 + ld a, [wMenuCursorY] + cp 1 + jp nz, LinkTradePartiesMenuMasterLoop + call HideCursor + push hl + push bc + ld bc, NAME_LENGTH + add hl, bc + ld [hl], " " + pop bc + pop hl +Function28ade: ; 28ade +.loop1 + ld a, "▶" + ldcoord_a 9, 17 +.loop2 + call JoyTextDelay + ld a, [hJoyLast] + and a + jr z, .loop2 + bit A_BUTTON_F, a + jr nz, .a_button + push af + ld a, " " + ldcoord_a 9, 17 + pop af + bit D_UP_F, a + jr z, .d_up + ld a, [wOTPartyCount] + ld [wMenuCursorY], a + jp LinkTrade_OTPartyMenu + +.d_up + ld a, $1 + ld [wMenuCursorY], a + jp LinkTrade_PlayerPartyMenu + +.a_button + ld a, "▷" + ldcoord_a 9, 17 + ld a, $f + ld [wPlayerLinkAction], a + farcall Function16d6ce + ld a, [wOtherPlayerLinkMode] + cp $f + jr nz, .loop1 +Function28b22: ; 28b22 + call RotateThreePalettesRight + call ClearScreen + ld b, SCGB_DIPLOMA + call GetSGBLayout + call WaitBGMap2 + xor a + ld [wcfbb], a + xor a + ld [rSB], a + ld [hSerialSend], a + ld a, (0 << rSC_ON) | 1 + ld [rSC], a + ld a, (1 << rSC_ON) | 1 + ld [rSC], a + ret +; 28b42 + +Unreferenced_Function28b42: ; 28b42 + hlcoord 0, 16 + ld a, "┘" + ld bc, 2 * SCREEN_WIDTH + call ByteFill + hlcoord 1, 16 + ld a, " " + ld bc, SCREEN_WIDTH - 2 + call ByteFill + hlcoord 2, 16 + ld de, .Cancel + jp PlaceString +; 28b61 + +.Cancel: ; 28b61 + db "CANCEL@" +; 28b68 + +Function28b68: ; 28b68 + ld a, [wOtherPlayerLinkMode] + hlcoord 6, 9 + ld bc, SCREEN_WIDTH + call AddNTimes + ld [hl], "▷" + ret +; 28b77 + +LinkEngine_FillBox: ; 28b77 +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; 28b87 + +LinkTrade: ; 28b87 + xor a + ld [wcf57], a + ld [wOtherPlayerLinkAction], a + hlcoord 0, 12 + ld b, 4 + ld c, 18 + call LinkTextboxAtHL + farcall Link_WaitBGMap + ld a, [wd002] + ld hl, wPartySpecies + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wd004 + ld bc, MON_NAME_LENGTH + call CopyBytes + ld a, [wd003] + ld hl, wOTPartySpecies + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + ld [wd265], a + call GetPokemonName + ld hl, UnknownText_0x28eb8 + bccoord 1, 14 + call PlaceHLTextAtBC + call LoadStandardMenuHeader + hlcoord 10, 7 + ld b, 3 + ld c, 7 + call LinkTextboxAtHL + ld de, String28eab + hlcoord 12, 8 + call PlaceString + ld a, 8 + ld [w2DMenuCursorInitY], a + ld a, 11 + ld [w2DMenuCursorInitX], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, 2 + ld [w2DMenuNumRows], a + xor a + ld [w2DMenuFlags1], a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuCursorOffsets], a + ld a, A_BUTTON | B_BUTTON + ld [wMenuJoypadFilter], a + ld a, 1 + ld [wMenuCursorY], a + ld [wMenuCursorX], a + farcall Link_WaitBGMap + call ScrollingMenuJoypad + push af + call Call_ExitMenu + call WaitBGMap2 + pop af + bit 1, a + jr nz, .asm_28c33 + ld a, [wMenuCursorY] + dec a + jr z, .asm_28c54 + +.asm_28c33 + ld a, $1 + ld [wPlayerLinkAction], a + hlcoord 0, 12 + ld b, 4 + ld c, 18 + call LinkTextboxAtHL + hlcoord 1, 14 + ld de, String_TooBadTheTradeWasCanceled + call PlaceString + farcall Function16d6ce + jp Function28ea3 + +.asm_28c54 + ld a, $2 + ld [wPlayerLinkAction], a + farcall Function16d6ce + ld a, [wOtherPlayerLinkMode] + dec a + jr nz, .asm_28c7b + hlcoord 0, 12 + ld b, 4 + ld c, 18 + call LinkTextboxAtHL + hlcoord 1, 14 + ld de, String_TooBadTheTradeWasCanceled + call PlaceString + jp Function28ea3 + +.asm_28c7b + ld hl, sPartyMail + ld a, [wd002] + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld a, BANK(sPartyMail) + call GetSRAMBank + ld d, h + ld e, l + ld bc, MAIL_STRUCT_LENGTH + add hl, bc + ld a, [wd002] + ld c, a +.asm_28c96 + inc c + ld a, c + cp PARTY_LENGTH + jr z, .asm_28ca6 + push bc + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop bc + jr .asm_28c96 + +.asm_28ca6 + ld hl, sPartyMail + ld a, [wPartyCount] + dec a + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + push hl + ld hl, wc9f4 + ld a, [wd003] + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + pop de + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + call CloseSRAM + ld hl, wPlayerName + ld de, wPlayerTrademonSenderName + ld bc, NAME_LENGTH + call CopyBytes + ld a, [wd002] + ld hl, wPartySpecies + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wPlayerTrademonSpecies], a + push af + ld a, [wd002] + ld hl, wPartyMonOT + call SkipNames + ld de, wPlayerTrademonOTName + ld bc, NAME_LENGTH + call CopyBytes + ld hl, wPartyMon1ID + ld a, [wd002] + call GetPartyLocation + ld a, [hli] + ld [wPlayerTrademonID], a + ld a, [hl] + ld [wPlayerTrademonID + 1], a + ld hl, wPartyMon1DVs + ld a, [wd002] + call GetPartyLocation + ld a, [hli] + ld [wPlayerTrademonDVs], a + ld a, [hl] + ld [wPlayerTrademonDVs + 1], a + ld a, [wd002] + ld hl, wPartyMon1Species + call GetPartyLocation + ld b, h + ld c, l + farcall GetCaughtGender + ld a, c + ld [wPlayerTrademonCaughtData], a + ld hl, wOTPlayerName + ld de, wOTTrademonSenderName + ld bc, NAME_LENGTH + call CopyBytes + ld a, [wd003] + ld hl, wOTPartySpecies + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wOTTrademonSpecies], a + ld a, [wd003] + ld hl, wOTPartyMonOT + call SkipNames + ld de, wOTTrademonOTName + ld bc, NAME_LENGTH + call CopyBytes + ld hl, wOTPartyMon1ID + ld a, [wd003] + call GetPartyLocation + ld a, [hli] + ld [wOTTrademonID], a + ld a, [hl] + ld [wOTTrademonID + 1], a + ld hl, wOTPartyMon1DVs + ld a, [wd003] + call GetPartyLocation + ld a, [hli] + ld [wOTTrademonDVs], a + ld a, [hl] + ld [wOTTrademonDVs + 1], a + ld a, [wd003] + ld hl, wOTPartyMon1Species + call GetPartyLocation + ld b, h + ld c, l + farcall GetCaughtGender + ld a, c + ld [wOTTrademonCaughtData], a + ld a, [wd002] + ld [wCurPartyMon], a + ld hl, wPartySpecies + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wd002], a + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + callfar RemoveMonFromPartyOrBox + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + ld a, TRUE + ld [wForceEvolution], a + ld a, [wd003] + push af + ld hl, wOTPartySpecies + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wd003], a + ld c, 100 + call DelayFrames + call ClearTileMap + call LoadFontsBattleExtra + ld b, SCGB_DIPLOMA + call GetSGBLayout + ld a, [hSerialConnectionStatus] + cp USING_EXTERNAL_CLOCK + jr z, .player_2 + predef TradeAnimation + jr .done_animation + +.player_2 + predef TradeAnimationPlayer2 + +.done_animation + pop af + ld c, a + ld [wCurPartyMon], a + ld hl, wOTPartySpecies + ld d, 0 + ld e, a + add hl, de + ld a, [hl] + ld [wCurPartySpecies], a + ld hl, wOTPartyMon1Species + ld a, c + call GetPartyLocation + ld de, wTempMonSpecies + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + predef AddTempmonToParty + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + callfar EvolvePokemon + call ClearScreen + call LoadTradeScreenBorder + call SetTradeRoomBGPals + farcall Link_WaitBGMap + ld b, $1 + pop af + ld c, a + cp MEW + jr z, .loop + ld a, [wCurPartySpecies] + cp MEW + jr z, .loop + ld b, $2 + ld a, c + cp CELEBI + jr z, .loop + ld a, [wCurPartySpecies] + cp CELEBI + jr z, .loop + ld b, $0 + +.loop + ld a, b + ld [wPlayerLinkAction], a + push bc + call Serial_PrintWaitingTextAndSyncAndExchangeNybble + pop bc + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jr z, .save + ld a, b + and a + jr z, .save + ld a, [wOtherPlayerLinkAction] + cp b + jr nz, .loop + +.save + farcall SaveAfterLinkTrade + farcall StubbedTrainerRankings_Trades + farcall BackupMobileEventIndex + ld c, 40 + call DelayFrames + hlcoord 0, 12 + ld b, 4 + ld c, 18 + call LinkTextboxAtHL + hlcoord 1, 14 + ld de, String28ebd + call PlaceString + farcall Link_WaitBGMap + ld c, 50 + call DelayFrames + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jp z, Gen2ToGen1LinkComms + jp Gen2ToGen2LinkComms +; 28ea3 + +Function28ea3: ; 28ea3 + ld c, 100 + call DelayFrames + jp InitTradeMenuDisplay +; 28eab + +String28eab: ; 28eab + db "TRADE" + next "CANCEL@" + +UnknownText_0x28eb8: ; 0x28eb8 + ; Trade @ for @ ? + text_jump UnknownText_0x1c4212 + db "@" +; 0x28ebd + +String28ebd: ; 28ebd + db "Trade completed!@" + +String_TooBadTheTradeWasCanceled: ; 28ece + db "Too bad! The trade" + next "was canceled!@" + + +LinkTextboxAtHL: ; 28eef + ld d, h + ld e, l + farcall LinkTextbox + ret +; 28ef8 + +LoadTradeScreenBorder: ; 28ef8 + farcall _LoadTradeScreenBorder + ret +; 28eff + +SetTradeRoomBGPals: ; 28eff + farcall LoadTradeRoomBGPals_ ; just a nested farcall; so wasteful + call SetPalettes + ret +; 28f09 + +Unreferenced_Function28f09: ; 28f09 + hlcoord 0, 0 + ld b, 6 + ld c, 18 + call LinkTextboxAtHL + hlcoord 0, 8 + ld b, 6 + ld c, 18 + call LinkTextboxAtHL + farcall PlaceTradePartnerNamesAndParty + ret +; 28f24 + +INCLUDE "engine/gfx/trade_animation.asm" + +CheckTimeCapsuleCompatibility: ; 29bfb +; Checks to see if your party is compatible with the Gen 1 games. +; Returns the following in wScriptVar: +; 0: Party is okay +; 1: At least one Pokémon was introduced in Gen 2 +; 2: At least one Pokémon has a move that was introduced in Gen 2 +; 3: At least one Pokémon is holding mail + +; If any party Pokémon was introduced in the Gen 2 games, don't let it in. + ld hl, wPartySpecies + ld b, PARTY_LENGTH +.loop + ld a, [hli] + cp -1 + jr z, .checkitem + cp JOHTO_POKEMON + jr nc, .mon_too_new + dec b + jr nz, .loop + +; If any party Pokémon is holding mail, don't let it in. +.checkitem + ld a, [wPartyCount] + ld b, a + ld hl, wPartyMon1Item +.itemloop + push hl + push bc + ld d, [hl] + farcall ItemIsMail + pop bc + pop hl + jr c, .mon_has_mail + ld de, PARTYMON_STRUCT_LENGTH + add hl, de + dec b + jr nz, .itemloop + +; If any party Pokémon has a move that was introduced in the Gen 2 games, don't let it in. + ld hl, wPartyMon1Moves + ld a, [wPartyCount] + ld b, a +.move_loop + ld c, NUM_MOVES +.move_next + ld a, [hli] + cp STRUGGLE + 1 + jr nc, .move_too_new + dec c + jr nz, .move_next + ld de, wPartyMon2 - (wPartyMon1 + NUM_MOVES) + add hl, de + dec b + jr nz, .move_loop + xor a + jr .done + +.mon_too_new + ld [wd265], a + call GetPokemonName + ld a, $1 + jr .done + +.move_too_new + push bc + ld [wd265], a + call GetMoveName + call CopyName1 + pop bc + call Function29c67 + ld a, $2 + jr .done + +.mon_has_mail + call Function29c67 + ld a, $3 + +.done + ld [wScriptVar], a + ret +; 29c67 + +Function29c67: ; 29c67 + ld a, [wPartyCount] + sub b + ld c, a + inc c + ld b, 0 + ld hl, wPartyCount + add hl, bc + ld a, [hl] + ld [wd265], a + call GetPokemonName + ret +; 29c7b + +EnterTimeCapsule: ; 29c7b + ld c, 10 + call DelayFrames + ld a, $4 + call Link_EnsureSync + ld c, 40 + call DelayFrames + xor a + ld [hVBlank], a + inc a + ld [wLinkMode], a + ret +; 29c92 + +WaitForOtherPlayerToExit: ; 29c92 + ld c, 3 + call DelayFrames + ld a, CONNECTION_NOT_ESTABLISHED + ld [hSerialConnectionStatus], a + xor a + ld [rSB], a + ld [hSerialReceive], a + ld a, (0 << rSC_ON) | 1 + ld [rSC], a + ld a, (1 << rSC_ON) | 1 + ld [rSC], a + ld c, 3 + call DelayFrames + xor a + ld [rSB], a + ld [hSerialReceive], a + ld a, (0 << rSC_ON) | 0 + ld [rSC], a + ld a, (1 << rSC_ON) | 0 + ld [rSC], a + ld c, 3 + call DelayFrames + xor a + ld [rSB], a + ld [hSerialReceive], a + ld [rSC], a + ld c, 3 + call DelayFrames + ld a, CONNECTION_NOT_ESTABLISHED + ld [hSerialConnectionStatus], a + ld a, [rIF] + push af + xor a + ld [rIF], a + ld a, $f + ld [rIE], a + pop af + ld [rIF], a + ld hl, wLinkTimeoutFrames + xor a + ld [hli], a + ld [hl], a + ld [hVBlank], a + ld [wLinkMode], a + ret +; 29ce8 + +SetBitsForLinkTradeRequest: ; 29ce8 + ld a, LINK_TRADECENTER - 1 + ld [wPlayerLinkAction], a + ld [wd265], a + ret +; 29cf1 + +SetBitsForBattleRequest: ; 29cf1 + ld a, LINK_COLOSSEUM - 1 + ld [wPlayerLinkAction], a + ld [wd265], a + ret +; 29cfa + +SetBitsForTimeCapsuleRequest: ; 29cfa + ld a, $2 + ld [rSB], a + xor a + ld [hSerialReceive], a + ld a, (0 << rSC_ON) | 0 + ld [rSC], a + ld a, (1 << rSC_ON) | 0 + ld [rSC], a + xor a ; LINK_TIMECAPSULE - 1 + ld [wPlayerLinkAction], a + ld [wd265], a + ret +; 29d11 + +WaitForLinkedFriend: ; 29d11 + ld a, [wPlayerLinkAction] + and a + jr z, .no_link_action + ld a, $2 + ld [rSB], a + xor a + ld [hSerialReceive], a + ld a, (0 << rSC_ON) | 0 + ld [rSC], a + ld a, (1 << rSC_ON) | 0 + ld [rSC], a + call DelayFrame + call DelayFrame + call DelayFrame + +.no_link_action + ld a, $2 + ld [wLinkTimeoutFrames + 1], a + ld a, $ff + ld [wLinkTimeoutFrames], a +.loop + ld a, [hSerialConnectionStatus] + cp USING_INTERNAL_CLOCK + jr z, .connected + cp USING_EXTERNAL_CLOCK + jr z, .connected + ld a, CONNECTION_NOT_ESTABLISHED + ld [hSerialConnectionStatus], a + ld a, $2 + ld [rSB], a + xor a + ld [hSerialReceive], a + ld a, (0 << rSC_ON) | 0 + ld [rSC], a + ld a, (1 << rSC_ON) | 0 + ld [rSC], a + ld a, [wLinkTimeoutFrames] + dec a + ld [wLinkTimeoutFrames], a + jr nz, .not_done + ld a, [wLinkTimeoutFrames + 1] + dec a + ld [wLinkTimeoutFrames + 1], a + jr z, .done + +.not_done + ld a, $1 + ld [rSB], a + ld a, (0 << rSC_ON) | 1 + ld [rSC], a + ld a, (1 << rSC_ON) | 1 + ld [rSC], a + call DelayFrame + jr .loop + +.connected + call LinkDataReceived + call DelayFrame + call LinkDataReceived + ld c, 50 + call DelayFrames + ld a, $1 + ld [wScriptVar], a + ret + +.done + xor a + ld [wScriptVar], a + ret +; 29d92 + +CheckLinkTimeout: ; 29d92 + ld a, $1 + ld [wPlayerLinkAction], a + ld hl, wLinkTimeoutFrames + ld a, $3 + ld [hli], a + xor a + ld [hl], a + call WaitBGMap + ld a, $2 + ld [hVBlank], a + call DelayFrame + call DelayFrame + call Link_CheckCommunicationError + xor a + ld [hVBlank], a + ld a, [wScriptVar] + and a + ret nz + jp Link_ResetSerialRegistersAfterLinkClosure +; 29dba + +Function29dba: ; 29dba + ld a, $5 + ld [wPlayerLinkAction], a + ld hl, wLinkTimeoutFrames + ld a, $3 + ld [hli], a + xor a + ld [hl], a + call WaitBGMap + ld a, $2 + ld [hVBlank], a + call DelayFrame + call DelayFrame + call Link_CheckCommunicationError + ld a, [wScriptVar] + and a + jr z, .vblank + ld bc, -1 +.wait + dec bc + ld a, b + or c + jr nz, .wait + ld a, [wOtherPlayerLinkMode] + cp $5 + jr nz, .script_var + ld a, $6 + ld [wPlayerLinkAction], a + ld hl, wLinkTimeoutFrames + ld a, $1 + ld [hli], a + ld [hl], $32 + call Link_CheckCommunicationError + ld a, [wOtherPlayerLinkMode] + cp $6 + jr z, .vblank + +.script_var + xor a + ld [wScriptVar], a + ret + +.vblank + xor a + ld [hVBlank], a + ret +; 29e0c + +Link_CheckCommunicationError: ; 29e0c + xor a + ld [hSerialReceivedNewData], a + ld a, [wLinkTimeoutFrames] + ld h, a + ld a, [wLinkTimeoutFrames + 1] + ld l, a + push hl + call .CheckConnected + pop hl + jr nz, .load_true + call .AcknowledgeSerial + call .ConvertDW + call .CheckConnected + jr nz, .load_true + call .AcknowledgeSerial + xor a + jr .load_scriptvar + +.load_true + ld a, $1 + +.load_scriptvar + ld [wScriptVar], a + ld hl, wLinkTimeoutFrames + xor a + ld [hli], a + ld [hl], a + ret +; 29e3b + +.CheckConnected: ; 29e3b + call WaitLinkTransfer + ld hl, wLinkTimeoutFrames + ld a, [hli] + inc a + ret nz + ld a, [hl] + inc a + ret +; 29e47 + +.AcknowledgeSerial: ; 29e47 + ld b, 10 +.loop + call DelayFrame + call LinkDataReceived + dec b + jr nz, .loop + ret +; 29e53 + +.ConvertDW: ; 29e53 + ; [wLinkTimeoutFrames] = ((hl - $100) / 4) + $100 + ; = (hl / 4) + $c0 + dec h + srl h + rr l + srl h + rr l + inc h + ld a, h + ld [wLinkTimeoutFrames], a + ld a, l + ld [wLinkTimeoutFrames + 1], a + ret +; 29e66 + +TryQuickSave: ; 29e66 + ld a, [wd265] + push af + farcall Link_SaveGame + ld a, TRUE + jr nc, .return_result + xor a ; FALSE +.return_result + ld [wScriptVar], a + ld c, 30 + call DelayFrames + pop af + ld [wd265], a + ret +; 29e82 + +CheckBothSelectedSameRoom: ; 29e82 + ld a, [wd265] + call Link_EnsureSync + push af + call LinkDataReceived + call DelayFrame + call LinkDataReceived + pop af + ld b, a + ld a, [wd265] + cp b + jr nz, .fail + ld a, [wd265] + inc a + ld [wLinkMode], a + xor a + ld [hVBlank], a + ld a, TRUE + ld [wScriptVar], a + ret + +.fail + xor a ; FALSE + ld [wScriptVar], a + ret +; 29eaf + +TimeCapsule: ; 29eaf + ld a, LINK_TIMECAPSULE + ld [wLinkMode], a + call DisableSpriteUpdates + callfar LinkCommunications + call EnableSpriteUpdates + xor a + ld [hVBlank], a + ret +; 29ec4 + +TradeCenter: ; 29ec4 + ld a, LINK_TRADECENTER + ld [wLinkMode], a + call DisableSpriteUpdates + callfar LinkCommunications + call EnableSpriteUpdates + xor a + ld [hVBlank], a + ret +; 29ed9 + +Colosseum: ; 29ed9 + ld a, LINK_COLOSSEUM + ld [wLinkMode], a + call DisableSpriteUpdates + callfar LinkCommunications + call EnableSpriteUpdates + xor a + ld [hVBlank], a + ret +; 29eee + +CloseLink: ; 29eee + xor a + ld [wLinkMode], a + ld c, 3 + call DelayFrames + jp Link_ResetSerialRegistersAfterLinkClosure +; 29efa + +FailedLinkToPast: ; 29efa + ld c, 40 + call DelayFrames + ld a, $e + jp Link_EnsureSync +; 29f04 + +Link_ResetSerialRegistersAfterLinkClosure: ; 29f04 + ld c, 3 + call DelayFrames + ld a, CONNECTION_NOT_ESTABLISHED + ld [hSerialConnectionStatus], a + ld a, $2 + ld [rSB], a + xor a + ld [hSerialReceive], a + ld [rSC], a + ret +; 29f17 + +Link_EnsureSync: ; 29f17 + add $d0 + ld [wPlayerLinkAction], a + ld [wcf57], a + ld a, $2 + ld [hVBlank], a + call DelayFrame + call DelayFrame +.receive_loop + call Serial_ExchangeLinkMenuSelection + ld a, [wOtherPlayerLinkMode] + ld b, a + and $f0 + cp $d0 + jr z, .done + ld a, [wOtherPlayerLinkAction] + ld b, a + and $f0 + cp $d0 + jr nz, .receive_loop + +.done + xor a + ld [hVBlank], a + ld a, b + and $f + ret +; 29f47 + +CableClubCheckWhichChris: ; 29f47 + ld a, [hSerialConnectionStatus] + cp USING_EXTERNAL_CLOCK + ld a, TRUE + jr z, .yes + dec a ; FALSE + +.yes + ld [wScriptVar], a + ret +; 29f54 + +Unreferenced_Gen1LinkCommsBorderGFX: ; 29f54 +INCBIN "gfx/trade/unused_gen_1_border_tiles.2bpp" +; 29fe4 + +Unreferenced_Function29fe4: + ld a, BANK(sPartyMail) + call GetSRAMBank + ld d, FALSE + ld b, CHECK_FLAG + predef SmallFarFlagAction + call CloseSRAM + ld a, c + and a + ret diff --git a/engine/link/link_2.asm b/engine/link/link_2.asm new file mode 100644 index 000000000..e2fe47dc5 --- /dev/null +++ b/engine/link/link_2.asm @@ -0,0 +1,95 @@ +LinkMonStatsScreen: ; 4d319 + ld a, [wMenuCursorY] + dec a + ld [wCurPartyMon], a + call LowVolume + predef StatsScreenInit + ld a, [wCurPartyMon] + inc a + ld [wMenuCursorY], a + call ClearScreen + call ClearBGPalettes + call MaxVolume + farcall LoadTradeScreenBorder + farcall Link_WaitBGMap + farcall InitTradeSpeciesList + farcall SetTradeRoomBGPals + call WaitBGMap2 + ret + +Link_WaitBGMap: ; 4d354 + call WaitBGMap + call WaitBGMap2 + ret + +LinkTextbox2: ; 4d35b + ld h, d + ld l, e + push bc + push hl + call .PlaceBorder + pop hl + pop bc + + ld de, wAttrMap - wTileMap + add hl, de + inc b + inc b + inc c + inc c + ld a, PAL_BG_TEXT +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld de, SCREEN_WIDTH + add hl, de + pop bc + dec b + jr nz, .row + ret +; 4d37e + +.PlaceBorder: ; 4d37e + push hl + ld a, $76 + ld [hli], a + inc a + call .PlaceRow + inc a + ld [hl], a + pop hl + ld de, SCREEN_WIDTH + add hl, de +.loop + push hl + ld a, "┌" + ld [hli], a + ld a, " " + call .PlaceRow + ld [hl], "─" + pop hl + ld de, SCREEN_WIDTH + add hl, de + dec b + jr nz, .loop + + ld a, "┐" + ld [hli], a + ld a, "│" + call .PlaceRow + ld [hl], "└" + ret +; 4d3ab + +.PlaceRow: ; 4d3ab + ld d, c +.row_loop + ld [hli], a + dec d + jr nz, .row_loop + ret diff --git a/engine/link/link_trade.asm b/engine/link/link_trade.asm new file mode 100755 index 000000000..4c2af0842 --- /dev/null +++ b/engine/link/link_trade.asm @@ -0,0 +1,363 @@ +LinkCommsBorderGFX: +INCBIN "gfx/trade/border_tiles.2bpp" +; 16d421 + +__LoadTradeScreenBorder: ; 16d421 + ld de, LinkCommsBorderGFX + ld hl, vTiles2 + lb bc, BANK(LinkCommsBorderGFX), 70 + call Get2bpp + ret +; 16d42e + +Function16d42e: ; 16d42e + ld hl, Tilemap_MobileTradeBorderFullscreen + decoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + call CopyBytes + ret +; 16d43b + +Function16d43b: ; 16d43b + call LoadStandardMenuHeader + call ClearBGPalettes + call ClearTileMap + call ClearSprites + farcall __LoadTradeScreenBorder ; useless to farcall + farcall Function16d42e ; useless to farcall + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + call WaitBGMap + call JoyWaitAorB + call Call_ExitMenu + ret +; 16d465 + +Tilemap_MobileTradeBorderFullscreen: +INCBIN "gfx/trade/border_mobile_fullscreen.tilemap" + +Tilemap_CableTradeBorderTop: +INCBIN "gfx/trade/border_cable_top.tilemap" + +Tilemap_CableTradeBorderBottom: +INCBIN "gfx/trade/border_cable_bottom.tilemap" + +_LinkTextbox: ; 16d61d + ld h, d + ld l, e + push bc + push hl + call .PlaceBorder + pop hl + pop bc + + ld de, wAttrMap - wTileMap + add hl, de + inc b + inc b + inc c + inc c + ld a, PAL_BG_TEXT +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld de, SCREEN_WIDTH + add hl, de + pop bc + dec b + jr nz, .row + ret +; 16d640 + +.PlaceBorder ; 16d640 + push hl + ld a, $30 + ld [hli], a + inc a + call .PlaceRow + inc a + ld [hl], a + pop hl + ld de, SCREEN_WIDTH + add hl, de +.loop + push hl + ld a, $33 + ld [hli], a + ld a, " " + call .PlaceRow + ld [hl], $34 + pop hl + ld de, SCREEN_WIDTH + add hl, de + dec b + jr nz, .loop + + ld a, $35 + ld [hli], a + ld a, $36 + call .PlaceRow + ld [hl], $37 + ret +; 16d66d + +.PlaceRow ; 16d66d + ld d, c +.row_loop + ld [hli], a + dec d + jr nz, .row_loop + ret +; 16d673 + +InitTradeSpeciesList: ; 16d673 + call _LoadTradeScreenBorder + call Function16d6ae + farcall InitMG_Mobile_LinkTradePalMap + farcall PlaceTradePartnerNamesAndParty + hlcoord 10, 17 + ld de, .CANCEL + call PlaceString + ret +; 16d68f + +.CANCEL: ; 16d68f + db "CANCEL@" +; 16d696 + +_LoadTradeScreenBorder: ; 16d696 + call __LoadTradeScreenBorder + ret +; 16d69a + + +LinkComms_LoadPleaseWaitTextboxBorderGFX: ; 16d69a + ld de, LinkCommsBorderGFX + $30 tiles + ld hl, vTiles2 tile $76 + lb bc, BANK(LinkCommsBorderGFX), 8 + call Get2bpp + ret +; 16d6a7 + +LoadTradeRoomBGPals_: ; 16d6a7 + farcall LoadTradeRoomBGPals + ret +; 16d6ae + +Function16d6ae: ; 16d6ae + call Function16d42e + ld hl, Tilemap_CableTradeBorderTop + decoord 0, 0 + ld bc, 2 * SCREEN_WIDTH + call CopyBytes + ld hl, Tilemap_CableTradeBorderBottom + decoord 0, 16 + ld bc, 2 * SCREEN_WIDTH + call CopyBytes + ret +; 16d6ca + +LinkTextbox: ; 16d6ca + call _LinkTextbox + ret +; 16d6ce + +Function16d6ce: ; 16d6ce + call LoadStandardMenuHeader + call Function16d6e1 + farcall WaitLinkTransfer + call Call_ExitMenu + call WaitBGMap2 + ret +; 16d6e1 + +Function16d6e1: ; 16d6e1 + hlcoord 4, 10 + ld b, 1 + ld c, 10 + predef LinkTextboxAtHL + hlcoord 5, 11 + ld de, .Waiting + call PlaceString + call WaitBGMap + call WaitBGMap2 + ld c, 50 + jp DelayFrames +; 16d701 + +.Waiting: ; 16d701 + db "WAITING..!@" +; 16d70c + +LinkTradeMenu: ; 16d70c + call .MenuAction + call .GetJoypad + ret +; 16d713 + +.GetJoypad: ; 16d713 + push bc + push af + ld a, [hJoyLast] + and D_PAD + ld b, a + ld a, [hJoyPressed] + and BUTTONS + or b + ld b, a + pop af + ld a, b + pop bc + ld d, a + ret +; 16d725 + +.MenuAction: ; 16d725 + ld hl, w2DMenuFlags2 + res 7, [hl] + ld a, [hBGMapMode] + push af + call .loop + pop af + ld [hBGMapMode], a + ret + +.loop + call .UpdateCursor + call .UpdateBGMapAndOAM + call .loop2 + jr nc, .done + farcall _2DMenuInterpretJoypad + jr c, .done + ld a, [w2DMenuFlags1] + bit 7, a + jr nz, .done + call .GetJoypad + ld b, a + ld a, [wMenuJoypadFilter] + and b + jr z, .loop + +.done + ret +; 16d759 + +.UpdateBGMapAndOAM: ; 16d759 + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + call WaitBGMap + pop af + ld [hOAMUpdate], a + xor a + ld [hBGMapMode], a + ret + +.loop2 + call RTC + call .TryAnims + ret c + ld a, [w2DMenuFlags1] + bit 7, a + jr z, .loop2 + and a + ret +; 16d77a + +.UpdateCursor: ; 16d77a + ld hl, wCursorCurrentTile + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hl] + cp $1f + jr nz, .not_currently_selected + ld a, [wCursorOffCharacter] + ld [hl], a + push hl + push bc + ld bc, MON_NAME_LENGTH + add hl, bc + ld [hl], a + pop bc + pop hl + +.not_currently_selected + ld a, [w2DMenuCursorInitY] + ld b, a + ld a, [w2DMenuCursorInitX] + ld c, a + call Coord2Tile + ld a, [w2DMenuCursorOffsets] + swap a + and $f + ld c, a + ld a, [wMenuCursorY] + ld b, a + xor a + dec b + jr z, .skip +.loop3 + add c + dec b + jr nz, .loop3 + +.skip + ld c, SCREEN_WIDTH + call AddNTimes + ld a, [w2DMenuCursorOffsets] + and $f + ld c, a + ld a, [wMenuCursorX] + ld b, a + xor a + dec b + jr z, .skip2 +.loop4 + add c + dec b + jr nz, .loop4 + +.skip2 + ld c, a + add hl, bc + ld a, [hl] + cp $1f + jr z, .cursor_already_there + ld [wCursorOffCharacter], a + ld [hl], $1f + push hl + push bc + ld bc, MON_NAME_LENGTH + add hl, bc + ld [hl], $1f + pop bc + pop hl +.cursor_already_there + ld a, l + ld [wCursorCurrentTile], a + ld a, h + ld [wCursorCurrentTile + 1], a + ret +; 16d7e7 + +.TryAnims: ; 16d7e7 + ld a, [w2DMenuFlags1] + bit 6, a + jr z, .skip_anims + farcall PlaySpriteAnimationsAndDelayFrame +.skip_anims + call JoyTextDelay + call .GetJoypad + and a + ret z + scf + ret +; 16d7fe diff --git a/engine/link/mystery_gift.asm b/engine/link/mystery_gift.asm new file mode 100755 index 000000000..c73e4246e --- /dev/null +++ b/engine/link/mystery_gift.asm @@ -0,0 +1,1735 @@ +DoMysteryGift: ; 1048ba (41:48ba) + call ClearTileMap + call ClearSprites + call WaitBGMap + call InitMysteryGiftLayout + hlcoord 3, 8 + ld de, .String_PressAToLink_BToCancel + call PlaceString + call WaitBGMap + farcall PrepMysteryGiftDataToSend + call MysteryGift_ClearTrainerData + ld a, $2 + ld [wca01], a + ld a, $14 + ld [wca02], a + ld a, [rIE] + push af + + call Function104a95 + + ld d, a + xor a + ld [rIF], a + pop af + ld [rIE], a + push de + call ClearTileMap + call EnableLCD + call WaitBGMap + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + pop de + hlcoord 2, 8 + ld a, d + ld de, .Text_LinkCanceled ; Link has been canceled + cp $10 + jp z, .LinkCanceled + cp $6c + jp nz, .CommunicationError + ld a, [wc900] + cp 3 + jr z, .skip_checks + call .CheckAlreadyGotFiveGiftsToday + ld hl, .Text_MaxFiveGifts ; Only 5 gifts a day + jp nc, .PrintTextAndExit + call .CheckAlreadyGotAGiftFromThatPerson + ld hl, .Text_MaxOneGiftPerPerson ; Only one gift a day per person + jp c, .PrintTextAndExit +.skip_checks + ld a, [wMysteryGiftPlayerBackupItem] + and a + jp nz, .GiftWaiting + ld a, [wMysteryGiftPartnerBackupItem] + and a + jp nz, .FriendNotReady + ld a, [wc900] + cp 3 + jr z, .skip_append_save + call .AddMysteryGiftPartnerID + ld a, [wc900] + cp 4 + jr z, .skip_append_save + call .SaveMysteryGiftTrainerName + farcall RestoreMobileEventIndex + farcall StubbedTrainerRankings_MysteryGift + farcall BackupMobileEventIndex +.skip_append_save + ld a, [wMysteryGiftPartnerSentDeco] + and a + jr z, .item + ld a, [wMysteryGiftPartnerWhichDeco] + ld c, a + farcall MysteryGiftGetDecoration + push bc + call MysteryGift_CheckAndSetDecorationAlreadyReceived + pop bc + jr nz, .item + callfar GetDecorationName_c + ld h, d + ld l, e + ld de, wStringBuffer1 + ld bc, ITEM_NAME_LENGTH + call CopyBytes + ld hl, .Text_SentToHome ; sent decoration to home + jr .PrintTextAndExit + +.item + call GetMysteryGiftBank + ld a, [wMysteryGiftPartnerWhichItem] + ld c, a + farcall MysteryGiftGetItemHeldEffect + ld a, c + ld [sBackupMysteryGiftItem], a + ld [wNamedObjectIndexBuffer], a + call CloseSRAM + call GetItemName + ld hl, .Text_Sent ; sent item + jr .PrintTextAndExit + +.LinkCanceled: ; 1049af (41:49af) + ld hl, .Text_LinkCanceled ; Link has been canceled + jr .PrintTextAndExit + +.CommunicationError: ; 1049b4 (41:49b4) + ld hl, .Text_CommunicationError ; Communication error + call PrintText + jp DoMysteryGift + +.GiftWaiting: ; 1049bd (41:49bd) + ld hl, .Text_ReceiveGiftAtCounter ; receive gift at counter + jr .PrintTextAndExit + +.FriendNotReady: ; 1049c2 (41:49c2) + ld hl, .Text_FriendNotReady ; friend not ready + +.PrintTextAndExit: ; 1049c5 (41:49c5) + call PrintText + ld a, LCDC_DEFAULT + ld [rLCDC], a + ret +; 1049cd (41:49cd) + +.String_PressAToLink_BToCancel: ; 1049cd + db "Press A to" + next "link IR-Device" + next "Press B to" + next "cancel it." + db "@" +; 1049fd + +.Text_LinkCanceled: ; 1049fd + text_jump UnknownText_0x1c0436 + db "@" +; 104a02 + +.Text_CommunicationError: ; 104a02 + text_jump UnknownText_0x1c0454 + db "@" +; 104a07 + +.Text_ReceiveGiftAtCounter: ; 104a07 + text_jump UnknownText_0x1c046a + db "@" +; 104a0c + +.Text_FriendNotReady: ; 104a0c + text_jump UnknownText_0x1c048e + db "@" +; 104a11 + +.Text_MaxFiveGifts: ; 104a11 + text_jump UnknownText_0x1c04a7 + db "@" +; 104a16 + +.Text_MaxOneGiftPerPerson: ; 104a16 + text_jump UnknownText_0x1c04c6 + db "@" +; 104a1b + +.Text_Sent: ; 104a1b + text_jump UnknownText_0x1c04e9 + db "@" +; 104a20 + +.Text_SentToHome: ; 104a20 + text_jump UnknownText_0x1c04fa + db "@" +; 104a25 + +.CheckAlreadyGotFiveGiftsToday: ; 104a25 (41:4a25) + call GetMysteryGiftBank + ld a, [sNumDailyMysteryGiftPartnerIDs] + cp $5 + jp CloseSRAM + +.CheckAlreadyGotAGiftFromThatPerson: ; 104a30 (41:4a30) + call GetMysteryGiftBank + ld a, [wMysteryGiftPartnerID] + ld b, a + ld a, [wMysteryGiftPartnerID + 1] + ld c, a + ld a, [sNumDailyMysteryGiftPartnerIDs] + ld d, a + ld hl, sDailyMysteryGiftPartnerIDs +.loop + ld a, d + and a + jr z, .No + ld a, [hli] + cp b + jr nz, .skip + ld a, [hl] + cp c + jr z, .Yes +.skip + inc hl + dec d + jr .loop +.Yes: + scf +.No: + jp CloseSRAM + +.AddMysteryGiftPartnerID: ; 104a56 (41:4a56) + call GetMysteryGiftBank + ld hl, sNumDailyMysteryGiftPartnerIDs + ld a, [hl] + inc [hl] + ld hl, sDailyMysteryGiftPartnerIDs ; inc hl + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [wMysteryGiftPartnerID] + ld [hli], a + ld a, [wMysteryGiftPartnerID + 1] + ld [hl], a + jp CloseSRAM + +.SaveMysteryGiftTrainerName: ; 104a71 (41:4a71) + call GetMysteryGiftBank + ld a, $1 + ld [sMysteryGiftTrainerHouseFlag], a + ld hl, wMysteryGiftPartnerName + ld de, sMysteryGiftPartnerName + ld bc, NAME_LENGTH + call CopyBytes + ld a, $1 + ld [de], a + inc de + ld hl, wMysteryGiftTrainerData + ld bc, (1 + 1 + NUM_MOVES) * PARTY_LENGTH + 2 + call CopyBytes + jp CloseSRAM + +Function104a95: ; 104a95 (41:4a95) + di + farcall ClearChannels + call Function104d5e + +.loop2 + call Function104d96 + call Function104ddd + ld a, [hMGStatusFlags] + cp $10 + jp z, Function104bd0 + cp $6c + jr nz, .loop2 + + ld a, [hPrintNum9] + cp $2 + jr z, Function104b22 + ld hl, hPrintNum1 + ld b, $1 + call Function104d56 + jr nz, .ly_loop + call Function104b49 + jp nz, Function104bd0 + jr Function104b0a + ; Delay frame +.ly_loop + ld a, [rLY] + cp LY_VBLANK + jr c, .ly_loop + ld c, LOW(rRP) + ld a, $c0 + ld [$ff00+c], a + ld b, 240 ; This might have been intended as a 4-second timeout buffer. + ; However, it is reset with each frame. +.loop3 + push bc + call MysteryGift_ReadJoypad + + ld b, $2 + ld c, LOW(rRP) + ; Delay frame +.ly_loop2 + ld a, [$ff00+c] + and b + ld b, a + ld a, [rLY] + cp LY_VBLANK + jr nc, .ly_loop2 +.ly_loop3 + ld a, [$ff00+c] + and b + ld b, a + ld a, [rLY] + cp LY_VBLANK + jr c, .ly_loop3 + + ld a, b + pop bc + dec b + jr z, .loop2 ; we never jump here + or a + jr nz, .loop2 + ; Check if we've pressed the B button + ld a, [hMGJoypadReleased] + bit B_BUTTON_F, a + jr z, .loop3 + ld a, $10 + ld [hMGStatusFlags], a + jp Function104bd0 + +Function104b04: ; 104b04 (41:4b04) + call Function104b40 + jp nz, Function104bd0 +Function104b0a: ; 104b0a (41:4b0a) + call Function104d38 + jp nz, Function104bd0 + call Function104b88 + jp nz, Function104bd0 + call Function104d43 + jp nz, Function104bd0 + call Function105033 + jp Function104bd0 + +Function104b22: ; 104b22 (41:4b22) + call Function104b88 + jp nz, Function104bd0 + call Function104d43 + jp nz, Function104bd0 + call Function104b40 + jp nz, Function104bd0 + call Function104d38 + jp nz, Function104bd0 + call Function10502e + jp Function104bd0 + +Function104b40: ; 104b40 (41:4b40) + ld hl, hPrintNum1 + ld b, $1 + call Function104d56 + ret nz + +Function104b49: ; 104b49 (41:4b49) + call Function105033 + ld a, [hMGStatusFlags] + cp $6c + ret nz + ld a, [hPrintNum1] + cp $96 + jp nz, Function104d32 + ld a, $90 + ld [hPrintNum1], a + call Function104d38 + ret nz + ld hl, hPrintNum1 + ld b, $1 + call Function104d4e + ret nz + call Function10502e + ld a, [hMGStatusFlags] + cp $6c + ret nz + call Function104d43 + ret nz + ld hl, wMysteryGiftTrainerData + ld a, [wca02] + ld b, a + call Function104d56 + ret nz + call Function105033 + ld a, [hMGStatusFlags] + cp $6c + ret + +Function104b88: ; 104b88 (41:4b88) + ld a, $96 + ld [hPrintNum1], a + ld hl, hPrintNum1 + ld b, $1 + call Function104d4e + ret nz + call Function10502e + ld a, [hMGStatusFlags] + cp $6c + ret nz + call Function104d43 + ret nz + ld hl, hPrintNum1 + ld b, $1 + call Function104d56 + ret nz + call Function105033 + ld a, [hMGStatusFlags] + cp $6c + ret nz + ld a, [hPrintNum1] + cp $90 + jp nz, Function104d32 + call Function104d38 + ret nz + ld hl, wOverworldMap + ld a, [wca02] + ld b, a + call Function104d4e + ret nz + call Function10502e + ld a, [hMGStatusFlags] + cp $6c + ret + +Function104bd0: ; 104bd0 (41:4bd0) + nop + ld a, [hMGStatusFlags] + cp $10 + jr z, .quit + cp $6c + jr nz, .quit + ld hl, wca01 + dec [hl] + jr z, .quit + ld hl, wMysteryGiftTrainerData + ld de, wMysteryGiftPartnerData + ld bc, wMysteryGiftPartnerDataEnd - wMysteryGiftPartnerData + call CopyBytes + ld a, [wMysteryGiftTrainerData] + cp $3 + jr nc, .quit + farcall StagePartyDataForMysteryGift + call MysteryGift_ClearTrainerData + ld a, $26 + ld [wca02], a + ld a, [hPrintNum9] + cp $2 + jr z, .asm_104c10 + call Function104d43 + jr nz, Function104bd0 + jp Function104b04 + +.asm_104c10 + call Function104d38 + jr nz, Function104bd0 + jp Function104b22 + +.quit + ld a, [hMGStatusFlags] + push af + call Function104da0 + xor a + ld [rIF], a + ld a, [rIE] + or $1 + ld [rIE], a + ei + call DelayFrame + pop af + ret + +Function104c2d: ; 104c2d (41:4c2d) + di + farcall ClearChannels + call Function104d5e +.asm_104c37 + call Function104d96 + call Function104ddd + ld a, [hMGStatusFlags] + cp $10 + jp z, Function104d1c + cp $6c + jr nz, .asm_104c37 + ld a, [hPrintNum9] + cp $2 + jr z, .asm_104c6c + call Function104c8a + jp nz, Function104d1c + call Function104d38 + jp nz, Function104d1c + call Function104cd2 + jp nz, Function104d1c + call Function104d43 + jp nz, Function104d1c + call Function105033 + jp Function104d1c +.asm_104c6c + call Function104cd2 + jp nz, Function104d1c + call Function104d43 + jp nz, Function104d1c + call Function104c8a + jp nz, Function104d1c + call Function104d38 + jp nz, Function104d1c + call Function10502e + jp Function104d1c + +Function104c8a: ; 104c8a (41:4c8a) + ld hl, hPrintNum1 + ld b, $1 + call Function104d56 + ret nz + call Function105033 + ld a, [hMGStatusFlags] + cp $6c + ret nz + ld a, [hPrintNum1] + cp $3c + jp nz, Function104d32 + swap a + ld [hPrintNum1], a + call Function104d38 + ret nz + ld hl, hPrintNum1 + ld b, $1 + call Function104d4e + ret nz + call Function10502e + ld a, [hMGStatusFlags] + cp $6c + ret nz + call Function104d43 + ret nz + ld hl, wMysteryGiftTrainerData + ld a, [wca02] + ld b, a + call Function104d56 + ret nz + call Function105033 + ld a, [hMGStatusFlags] + cp $6c + ret + +Function104cd2: ; 104cd2 (41:4cd2) + ld a, $3c + ld [hPrintNum1], a + ld hl, hPrintNum1 + ld b, $1 + call Function104d4e + ret nz + call Function10502e + ld a, [hMGStatusFlags] + cp $6c + ret nz + call Function104d43 + ret nz + ld hl, hPrintNum1 + ld b, $1 + call Function104d56 + ret nz + call Function105033 + ld a, [hMGStatusFlags] + cp $6c + ret nz + ld a, [hPrintNum1] + swap a + cp $3c + jp nz, Function104d32 + call Function104d38 + ret nz + ld hl, wOverworldMap + ld a, [wca02] + ld b, a + call Function104d4e + ret nz + call Function10502e + ld a, [hMGStatusFlags] + cp $6c + ret + +Function104d1c: ; 104d1c (41:4d1c) + nop + ld a, [hMGStatusFlags] + push af + call Function104da0 + xor a + ld [rIF], a + ld a, [rIE] + or $1 + ld [rIE], a + ei + call DelayFrame + pop af + ret + +Function104d32: ; 104d32 (41:4d32) + ld a, $80 + ld [hMGStatusFlags], a + and a + ret + +Function104d38: ; 104d38 (41:4d38) + call Function104d96 + call Function104e46 + ld a, [hMGStatusFlags] + cp $6c + ret + +Function104d43: ; 104d43 (41:4d43) + call Function104d96 + call Function104dfe + ld a, [hMGStatusFlags] + cp $6c + ret + +Function104d4e: ; 104d4e (41:4d4e) + call Function104e93 + ld a, [hMGStatusFlags] + cp $6c + ret + +Function104d56: ; 104d56 (41:4d56) + call Function104f57 + ld a, [hMGStatusFlags] + cp $6c + ret + +Function104d5e: ; 104d5e (41:4d5e) + call Function104d74 + ld a, $4 + ld [rIE], a + xor a + ld [rIF], a + call Function104d96 + xor a + ld b, a +.asm_104d6d + inc a + jr nz, .asm_104d6d + inc b + jr nz, .asm_104d6d + ret + +Function104d74: ; 104d74 (41:4d74) + xor a + ld [rTAC], a + ld a, $fe + ld [rTMA], a + ld [rTIMA], a + ld a, $2 + ld [rTAC], a + or $4 + ld [rTAC], a + ret + +Function104d86: ; 104d86 (41:4d86) + xor a + ld [rTAC], a + ld [rTMA], a + ld [rTIMA], a + ld a, $2 + ld [rTAC], a + or $4 + ld [rTAC], a + ret + +Function104d96: ; 104d96 (41:4d96) + ld a, $c0 + call Function104e8c + ld a, $1 + ld [hPrintNum9], a + ret + +Function104da0: ; 104da0 (41:4da0) + xor a + call Function104e8c + ld a, $2 + ld [rTAC], a + ret + +Function104da9: ; 104da9 (41:4da9) + inc d + ret z + xor a + ld [rIF], a + halt + ld a, [$ff00+c] + bit 1, a + jr z, Function104da9 + or a + ret + +Function104db7: ; 104db7 (41:4db7) + inc d + ret z + xor a + ld [rIF], a + halt + ld a, [$ff00+c] + bit 1, a + jr nz, Function104db7 + or a + ret + +Function104dc5: ; 104dc5 (41:4dc5) + ld a, $c1 + ld [$ff00+c], a +.wait + dec d + ret z + xor a + ld [rIF], a + halt + jr .wait + +Function104dd1: ; 104dd1 (41:4dd1) + ld a, $c0 + ld [$ff00+c], a +.wait + dec d + ret z + xor a + ld [rIF], a + halt + jr .wait + +Function104ddd: ; 104ddd (41:4ddd) + ld d, $0 + ld e, d + ld a, $1 + ld [hPrintNum9], a +.loop + call MysteryGift_ReadJoypad + ld b, $2 + ld c, LOW(rRP) + ld a, [hMGJoypadReleased] + bit B_BUTTON_F, a + jr z, .next + ld a, $10 + ld [hMGStatusFlags], a + ret + +.next + bit 0, a + jr nz, Function104e3a + ld a, [$ff00+c] + and b + jr nz, .loop + +Function104dfe: ; 104dfe (41:4dfe) + ld c, LOW(rRP) + ld d, $0 + ld e, d + call Function104db7 + jp z, Function104f42 + ld d, e + call Function104da9 + jp z, Function104f42 + call Function104db7 + jp z, Function104f42 + call Function104da9 + jp z, Function104f42 + ld a, $6c + ld [hMGStatusFlags], a + ld d, $3d + call Function104dd1 + ld d, $5 + call Function104dc5 + ld d, $15 + call Function104dd1 + ld d, $5 + call Function104dc5 + ld d, $5 + call Function104dd1 + ret + +Function104e3a: ; 104e3a (41:4e3a) + ; Wait a random amount of time + call Random + ld e, a + and $f + ld d, a +.loop + dec de + ld a, d + or e + jr nz, .loop +Function104e46: ; 104e46 (41:4e46) + ld a, $2 + ld [hPrintNum9], a + ld c, LOW(rRP) + ld d, $0 + ld e, d + ld d, $3d + call Function104dd1 + ld d, $5 + call Function104dc5 + ld d, $15 + call Function104dd1 + ld d, $5 + call Function104dc5 + ld d, $5 + call Function104dd1 + ld d, e + call Function104db7 + jp z, Function104f42 + ld d, e + call Function104da9 + jp z, Function104f42 + call Function104db7 + jp z, Function104f42 + call Function104da9 + jp z, Function104f42 + ld d, $3d + call Function104dd1 + ld a, $6c + ld [hMGStatusFlags], a + ret + +Function104e8c: ; 104e8c (41:4e8c) + ld [rRP], a + ld a, $ff + ld [hMGStatusFlags], a + ret + +Function104e93: ; 104e93 (41:4e93) + xor a + ld [hPrintNum5], a + ld [hPrintNum6], a + push hl + push bc + ld c, LOW(rRP) + ld d, $3d + call Function104dd1 + ld hl, hPrintNum2 + ld a, $5a + ld [hli], a + ld [hl], b + dec hl + ld b, $2 + call Function104ed6 + pop bc + pop hl + call Function104ed6 + ld a, [hPrintNum5] + ld [hPrintNum2], a + ld a, [hPrintNum6] + ld [hPrintNum3], a + push hl + ld hl, hPrintNum2 + ld b, $2 + call Function104ed6 + ld hl, hMGStatusFlags + ld b, $1 + call Function104faf + ld a, [hPrintNum2] + ld [hPrintNum5], a + ld a, [hPrintNum3] + ld [hPrintNum6], a + pop hl + ret + +Function104ed6: ; 104ed6 (41:4ed6) + ld c, LOW(rRP) + ld d, $5 + call Function104dd1 + ld d, $5 + call Function104dc5 + ld d, $15 + call Function104dd1 + ld a, b + cpl + ld b, a + ld a, $f4 + ld [rTMA], a +.asm_104eee + inc b + jr z, .asm_104f2e + ld a, $8 + ld [hPrintNum4], a + ld a, [hli] + ld e, a + ld a, [hPrintNum5] + add e + ld [hPrintNum5], a + ld a, [hPrintNum6] + adc 0 + ld [hPrintNum6], a +.asm_104f02 + xor a + ld [rIF], a + halt + ld a, $c1 + ld [rRP], a + ld d, $1 + ld a, e + rlca + ld e, a + jr nc, .asm_104f13 + inc d +.asm_104f13 + ld a, [rTIMA] + cp $f8 + jr c, .asm_104f13 + ld a, $c0 + ld [rRP], a + dec d + jr z, .asm_104f25 + xor a + ld [rIF], a + halt +.asm_104f25 + ld a, [hPrintNum4] + dec a + jr z, .asm_104eee + ld [hPrintNum4], a + jr .asm_104f02 +.asm_104f2e + ld a, $fe + ld [rTMA], a + xor a + ld [rIF], a + halt + ld d, $5 + call Function104dc5 + ld d, $11 + call Function104dd1 + ret + +Function104f42: ; 104f42 (41:4f42) + ld a, [hMGStatusFlags] + or $2 + ld [hMGStatusFlags], a + ret + +Function104f49: ; 104f49 (41:4f49) + ld a, [hMGStatusFlags] + or $1 + ld [hMGStatusFlags], a + ret + +Function104f50: ; 104f50 (41:4f50) + ld a, [hMGStatusFlags] + or $80 + ld [hMGStatusFlags], a + ret + +Function104f57: ; 104f57 (41:4f57) + xor a + ld [hPrintNum5], a + ld [hPrintNum6], a + push bc + push hl + ld hl, hPrintNum2 + ld b, $2 + call Function104faf + ld a, [hPrintNum3] + ld [hPrintNum8], a + ld b, a + pop hl + pop af + cp b + jp c, Function104f50 + ld a, [hPrintNum2] + cp $5a + jp nz, Function104f50 + call Function104faf + ld a, [hPrintNum5] + ld d, a + ld a, [hPrintNum6] + ld e, a + push hl + push de + ld hl, hPrintNum2 + ld b, $2 + call Function104faf + pop de + ld hl, hPrintNum2 + ld a, [hli] + xor d + ld b, a + ld a, [hl] + xor e + or b + call nz, Function104f49 + push de + ld d, $3d + call Function104dd1 + ld hl, hMGStatusFlags + ld b, $1 + call Function104ed6 + pop de + pop hl + ld a, d + ld [hPrintNum5], a + ld a, e + ld [hPrintNum6], a + ret + +Function104faf: ; 104faf (41:4faf) + ld c, LOW(rRP) + ld d, $0 + call Function104db7 + jp z, Function104f42 + ld d, $0 + call Function104da9 + jp z, Function104f42 + ld d, $0 + call Function104db7 + jp z, Function104f42 + ld a, b + cpl + ld b, a + xor a + ld [hMGJoypadPressed + 2], a + call Function104d86 +.asm_104fd2 + inc b + jr z, .asm_10501a + ld a, $8 + ld [hPrintNum4], a +.asm_104fd9 + ld d, $0 +.asm_104fdb + inc d + jr z, .asm_104fe5 + ld a, [$ff00+c] + bit 1, a + jr z, .asm_104fdb + ld d, $0 +.asm_104fe5 + inc d + jr z, .asm_104fed + ld a, [$ff00+c] + bit 1, a + jr nz, .asm_104fe5 +.asm_104fed + ld a, [hMGJoypadPressed + 2] + ld d, a + ld a, [rTIMA] + ld [hMGJoypadPressed + 2], a + sub d + cp $12 + jr c, .asm_104ffd + set 0, e + jr .asm_104fff +.asm_104ffd + res 0, e +.asm_104fff + ld a, [hPrintNum4] + dec a + ld [hPrintNum4], a + jr z, .asm_10500b + ld a, e + rlca + ld e, a + jr .asm_104fd9 +.asm_10500b + ld a, e + ld [hli], a + ld a, [hPrintNum5] + add e + ld [hPrintNum5], a + ld a, [hPrintNum6] + adc 0 + ld [hPrintNum6], a + jr .asm_104fd2 +.asm_10501a + call Function104d74 + xor a + ld [rIF], a + ld d, $0 + call Function104da9 + jp z, Function104f42 + ld d, $10 + call Function104dd1 + ret + +Function10502e: ; 10502e (41:502e) + ld b, $0 + jp Function104e93 + +Function105033: ; 105033 (41:5033) + ld b, $0 + jp Function104f57 + +MysteryGift_ReadJoypad: ; 105038 (41:5038) +; We can only get four inputs at a time. +; We take d-pad first for no particular reason. + ld a, R_DPAD + ld [rJOYP], a +; Read twice to give the request time to take. + ld a, [rJOYP] + ld a, [rJOYP] + +; The Joypad register output is in the lo nybble (inversed). +; We make the hi nybble of our new container d-pad input. + cpl + and $f + swap a + +; We'll keep this in b for now. + ld b, a + +; Buttons make 8 total inputs (A, B, Select, Start). +; We can fit this into one byte. + ld a, R_BUTTONS + ld [rJOYP], a +; Wait for input to stabilize. +rept 6 + ld a, [rJOYP] +endr +; Buttons take the lo nybble. + cpl + and $f + or b + ld c, a +; To get the delta we xor the last frame's input with the new one. + ld a, [hMGJoypadPressed] + xor c +; Released this frame: + and c + ld [hMGJoypadReleased], a +; Pressed this frame: + ld a, c + ld [hMGJoypadPressed], a + ld a, $30 +; Reset the joypad register since we're done with it. + ld [rJOYP], a + ret + +MysteryGift_CheckAndSetDecorationAlreadyReceived: ; 105069 (41:5069) + call GetMysteryGiftBank + ld d, $0 + ld b, CHECK_FLAG + ld hl, sMysteryGiftDecorationsReceived + predef_id SmallFarFlagAction + push hl + push bc + call Predef + call CloseSRAM + ld a, c + and a + pop bc + pop hl + ret nz + call GetMysteryGiftBank + ld b, SET_FLAG + predef SmallFarFlagAction + call CloseSRAM + xor a + ret + +MysteryGift_CopyReceivedDecosToPC: ; 105091 (41:5091) + call GetMysteryGiftBank + ld c, $0 +.loop + push bc + ld d, $0 + ld b, CHECK_FLAG + ld hl, sMysteryGiftDecorationsReceived + predef SmallFarFlagAction + ld a, c + and a + pop bc + jr z, .skip + push bc + callfar SetSpecificDecorationFlag + pop bc +.skip + inc c + ld a, c + cp TrophyIDs - DecorationIDs + jr c, .loop + jp CloseSRAM + +UnlockMysteryGift: ; 1050b9 + call GetMysteryGiftBank + ld hl, sMysteryGiftUnlocked + ld a, [hl] + inc a + jr nz, .ok + ld [hld], a + ld [hl], a +.ok + jp CloseSRAM +; 1050c8 + +Function1050c8: ; 1050c8 + call GetMysteryGiftBank + ld a, [sNumDailyMysteryGiftPartnerIDs] + cp $ff + jr z, .okay + xor a + ld [sNumDailyMysteryGiftPartnerIDs], a +.okay + jp CloseSRAM +; 1050d9 + + +BackupMysteryGift: ; 1050d9 + call GetMysteryGiftBank + ld hl, sMysteryGiftItem + ld de, sBackupMysteryGiftItem + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + jp CloseSRAM +; 1050ea + + +RestoreMysteryGift: ; 1050ea (41:50ea) + call GetMysteryGiftBank + ld hl, sBackupMysteryGiftItem + ld de, sMysteryGiftItem + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + jp CloseSRAM + +MysteryGift_ClearTrainerData: ; 1050fb (41:50fb) + ld hl, wMysteryGiftTrainerData + xor a + ld b, wMysteryGiftTrainerDataEnd - wMysteryGiftTrainerData +.loop + ld [hli], a + dec b + jr nz, .loop + ret + + +GetMysteryGiftBank: ; 105106 + ld a, BANK(sBackupMysteryGiftItem) + jp GetSRAMBank +; 10510b + + +StagePartyDataForMysteryGift: ; 10510b (41:510b) +; You will be sending this data to your mystery gift partner. +; Structure is the same as a trainer with species and moves +; defined. + ld a, BANK(sPokemonData) + call GetSRAMBank + ld de, wMysteryGiftStaging + ld bc, sPokemonData + wPartyMons - wPokemonData + ld hl, sPokemonData + wPartySpecies - wPokemonData +.loop + ld a, [hli] + cp -1 + jr z, .party_end + cp EGG + jr z, .next + push hl + ; copy level + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + ld [de], a + inc de + ; copy species + ld hl, MON_SPECIES + add hl, bc + ld a, [hl] + ld [de], a + inc de + ; copy moves + ld hl, MON_MOVES + add hl, bc + push bc + ld bc, NUM_MOVES + call CopyBytes + pop bc + pop hl +.next + push hl + ld hl, PARTYMON_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + pop hl + jr .loop +.party_end + ld a, -1 + ld [de], a + ld a, $26 + ld [wca00], a + jp CloseSRAM + +InitMysteryGiftLayout: ; 105153 (41:5153) + call ClearBGPalettes + call DisableLCD + ld hl, MysteryGiftGFX + ld de, vTiles2 tile $00 + ld a, BANK(MysteryGiftGFX) + ld bc, MysteryGiftGFX.End - MysteryGiftGFX + call FarCopyBytes + hlcoord 0, 0 + ld a, $42 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + call ByteFill + hlcoord 3, 7 + lb bc, 9, 15 + call ClearBox + hlcoord 0, 0 + ld a, $0 + ld [hli], a + inc a + ld [hl], a + hlcoord 0, 1 + inc a + ld [hli], a + inc a + ld [hl], a + hlcoord 7, 1 + ld a, $12 + call .Load5GFX + hlcoord 2, 2 + ld a, $17 + call .Load16GFX + hlcoord 2, 3 + ld a, $27 + call .Load16GFX + hlcoord 9, 4 + ld a, $37 + ld [hli], a + inc a + ld [hl], a + hlcoord 1, 2 + ld [hl], $4 + hlcoord 1, 3 + ld a, $5 + call .Load14Column + ld a, $9 + hlcoord 18, 5 + call .Load11Column + hlcoord 2, 5 + ld a, $b + call .Load16Row + hlcoord 2, 16 + ld a, $7 + call .Load16Row + hlcoord 2, 5 + ld a, $d + call .Load5GFX + hlcoord 7, 5 + ld [hl], $c + hlcoord 18, 5 + ld [hl], $a + hlcoord 18, 16 + ld [hl], $8 + hlcoord 1, 16 + ld [hl], $6 + hlcoord 2, 6 + ld a, $3a + call .Load16Row + hlcoord 2, 15 + ld a, $40 + call .Load16Row + hlcoord 2, 6 + ld a, $3c + call .Load9Column + hlcoord 17, 6 + ld a, $3e + call .Load9Column + hlcoord 2, 6 + ld [hl], $39 + hlcoord 17, 6 + ld [hl], $3b + hlcoord 2, 15 + ld [hl], $3f + hlcoord 17, 15 + ld [hl], $41 + call EnableLCD + call WaitBGMap + ld b, SCGB_MYSTERY_GIFT + call GetSGBLayout + call SetPalettes + ret + +.Load5GFX: ; 10522e (41:522e) + ld b, 5 + jr .gfx_loop +; 105232 (41:5232) + +.Unreferenced_Load6GFX: + ld b, 6 + jr .gfx_loop + +.Load16GFX: ; 105236 (41:5236) + ld b, 16 + +.gfx_loop ; 105238 (41:5238) + ld [hli], a + inc a + dec b + jr nz, .gfx_loop + ret + +.Load9Column: ; 10523e (41:523e) + ld b, 9 + jr .col_loop + +.Load11Column: ; 105242 (41:5242) + ld b, 11 + jr .col_loop + +.Load14Column: ; 105246 (41:5246) + ld b, 14 + +.col_loop ; 105248 (41:5248) + ld [hl], a + ld de, SCREEN_WIDTH + add hl, de + dec b + jr nz, .col_loop + ret + +.Load16Row: ; 105251 (41:5251) + ld b, 16 +.row_loop + ld [hli], a + dec b + jr nz, .row_loop + ret + +MysteryGiftGFX: ; 105258 +INCBIN "gfx/mystery_gift/mystery_gift.2bpp" +.End + +Function105688: ; 105688 (41:5688) + call ClearTileMap + call ClearSprites + call WaitBGMap + call Function1057d7 + hlcoord 3, 8 + ld de, String_PressAToLink_BToCancel_JP + call PlaceString + call WaitBGMap + call Function10578c + call MysteryGift_ClearTrainerData + ld a, $24 + ld [wca02], a + ld a, [rIE] + push af + call Function104c2d + ld d, a + xor a + ld [rIF], a + pop af + ld [rIE], a + ld a, d + cp $10 + jp z, Function105712 + cp $6c + jp nz, Function10571a + call Function1056eb + ld c, 60 + call DelayFrames + call Function105777 + ld hl, Text_ReceivedCard + call PrintText + ld de, wMysteryGiftTrainerData + farcall Function8ac70 + ld a, c + ld [wd265], a + ld hl, Text_CardNotRegistered + jr c, PrintTextAndExit_JP + ld hl, Text_ListedCardAsNumber + jr PrintTextAndExit_JP + +Function1056eb: ; 1056eb (41:56eb) + ld c, 16 +.loop + ld hl, wVirtualOAMSprite00YCoord + ld b, 8 +.dec_y_loop + dec [hl] +rept SPRITEOAMSTRUCT_LENGTH + inc hl +endr + dec b + jr nz, .dec_y_loop + ld hl, wVirtualOAMSprite08YCoord + ld b, 8 +.inc_y_loop + inc [hl] +rept SPRITEOAMSTRUCT_LENGTH + inc hl +endr + dec b + jr nz, .inc_y_loop + dec c + ret z + push bc + ld c, 4 + call DelayFrames + pop bc + jr .loop + +Function105712: ; 105712 (41:5712) + call Function105777 + ld hl, Text_MGLinkCanceled + jr PrintTextAndExit_JP + +Function10571a: ; 10571a (41:571a) + call Function105777 + ld hl, Text_MGCommError + call PrintText + jp Function105688 + +PrintTextAndExit_JP: ; 105726 (41:5726) + call PrintText + ld a, LCDC_DEFAULT + ld [rLCDC], a + ret +; 10572e (41:572e) + +String_PressAToLink_BToCancel_JP: ; 10572e + db "エーボタンおすと" + next "つうしんおこなわれるよ!" + next "ビーボタンおすと" + next "つうしんちゅうし します" + db "@" + +; 10575e + +Text_ReceivedCard: ; 10575e + text_jump UnknownText_0x1c051a + db "@" + +Text_ListedCardAsNumber: ; 105763 + text_jump UnknownText_0x1c0531 + db "@" + +Text_CardNotRegistered: ; 105768 + text_jump UnknownText_0x1c0555 + db "@" + +Text_MGLinkCanceled: ; 10576d + text_jump UnknownText_0x1c0573 + db "@" + +Text_MGCommError: ; 105772 + text_jump UnknownText_0x1c0591 + db "@" +; 105777 + +Function105777: ; 105777 (41:5777) + call ClearSprites + call ClearTileMap + call EnableLCD + call WaitBGMap + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + ret + +Function10578c: ; 10578c (41:578c) + ld de, wOverworldMap + ld a, BANK(sPlayerData) + call GetSRAMBank + ld hl, sPlayerData + wPlayerName - wPlayerData + ld bc, NAME_LENGTH + call CopyBytes + ld hl, sPlayerData + wPlayerID - wPlayerData + ld bc, 2 + call CopyBytes + ld hl, sPlayerData + wSecretID - wPlayerData + ld bc, 2 + call CopyBytes + call CloseSRAM + ld a, BANK(sCrystalData) + call GetSRAMBank + ld a, [sCrystalData + 0] + ld [de], a + inc de + ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + ld hl, $a603 ; address of MBC30 bank + ld bc, $8 + call CopyBytes + ld hl, $a007 ; address of MBC30 bank + ld bc, $c + call CopyBytes + call CloseSRAM + ret + +Function1057d7: ; 1057d7 (41:57d7) + call ClearBGPalettes + call DisableLCD + ld hl, MysteryGiftJP_GFX + ld de, vTiles2 tile $00 + ld a, BANK(MysteryGiftJP_GFX) + lb bc, 4, 0 + call FarCopyBytes + ld hl, MysteryGiftJP_GFX + $40 tiles + ld de, vTiles0 tile $00 + ld a, BANK(MysteryGiftJP_GFX) + ld bc, $80 + call FarCopyBytes + hlcoord 0, 0 + ld a, $3f + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + call ByteFill + hlcoord 3, 7 + lb bc, 9, 15 + call ClearBox + hlcoord 0, 0 + ld a, $0 + ld [hli], a + inc a + ld [hl], a + hlcoord 0, 1 + inc a + ld [hli], a + inc a + ld [hl], a + hlcoord 4, 2 + ld a, $13 + call .Load11Row + hlcoord 4, 3 + ld a, $1e + call .Load12Row + hlcoord 4, 4 + ld a, $2a + call .Load12Row + hlcoord 1, 2 + ld [hl], $4 + hlcoord 1, 3 + ld a, $5 + call .Load14Column + ld a, $9 + hlcoord 18, 5 + call .Load11Column + hlcoord 2, 5 + ld a, $b + call .Load16Row + hlcoord 2, 16 + ld a, $7 + call .Load16Row + hlcoord 2, 5 + ld a, $d + call .Load6Row + hlcoord 8, 5 + ld [hl], $c + hlcoord 18, 5 + ld [hl], $a + hlcoord 18, 16 + ld [hl], $8 + hlcoord 1, 16 + ld [hl], $6 + hlcoord 2, 6 + ld a, $37 + call .Load16Row + hlcoord 2, 15 + ld a, $3d + call .Load16Row + hlcoord 2, 6 + ld a, $39 + call .Load9Column + hlcoord 17, 6 + ld a, $3b + call .Load9Column + hlcoord 2, 6 + ld [hl], $36 + hlcoord 17, 6 + ld [hl], $38 + hlcoord 2, 15 + ld [hl], $3c + hlcoord 17, 15 + ld [hl], $3e + ld de, wVirtualOAMSprite00 + ld hl, .OAM_data + ld bc, 16 * SPRITEOAMSTRUCT_LENGTH + call CopyBytes + call EnableLCD + call WaitBGMap + ld b, $2 + farcall GetMysteryGift_MobileAdapterLayout + jp SetPalettes + +.Load6Row: ; 1058c6 (41:58c6) + ld b, 6 + jr .row_loop + +.Load11Row: ; 1058ca (41:58ca) + ld b, 11 + jr .row_loop + +.Load12Row: ; 1058ce (41:58ce) + ld b, 12 + +.row_loop ; 1058d0 (41:58d0) + ld [hli], a + inc a + dec b + jr nz, .row_loop + ret + +.Load9Column: ; 1058d6 (41:58d6) + ld b, 9 + jr .column_loop + +.Load11Column: ; 1058da (41:58da) + ld b, 11 + jr .column_loop + +.Load14Column: ; 1058de (41:58de) + ld b, 14 + +.column_loop ; 1058e0 (41:58e0) + ld [hl], a + ld de, SCREEN_WIDTH + add hl, de + dec b + jr nz, .column_loop + ret + +.Load16Row: ; 1058e9 (41:58e9) + ld b, 16 +.row_loop_no_inc + ld [hli], a + dec b + jr nz, .row_loop_no_inc + ret +; 1058f0 (41:58f0) + +.OAM_data: ; 1058f0 + dsprite 2, 1, 6, 4, $00, 0 + dsprite 2, 1, 7, 4, $01, 0 + dsprite 2, 1, 8, 4, $02, 0 + dsprite 2, 1, 9, 4, $03, 0 + dsprite 3, 1, 6, 4, $04, 0 + dsprite 3, 1, 7, 4, $05, 0 + dsprite 3, 1, 8, 4, $06, 0 + dsprite 3, 1, 9, 4, $07, 0 + dsprite 0, 1, 11, 4, $00, 0 + dsprite 0, 1, 12, 4, $01, 0 + dsprite 0, 1, 13, 4, $02, 0 + dsprite 0, 1, 14, 4, $03, 0 + dsprite 1, 1, 11, 4, $04, 0 + dsprite 1, 1, 12, 4, $05, 0 + dsprite 1, 1, 13, 4, $06, 0 + dsprite 1, 1, 14, 4, $07, 0 + +; japanese mystery gift gfx +MysteryGiftJP_GFX: ; 105930 +INCBIN "gfx/mystery_gift/mystery_gift_jp.2bpp" diff --git a/engine/link/mystery_gift_2.asm b/engine/link/mystery_gift_2.asm new file mode 100755 index 000000000..e0e2e88fd --- /dev/null +++ b/engine/link/mystery_gift_2.asm @@ -0,0 +1,152 @@ +PrepMysteryGiftDataToSend: ; 2c642 (b:4642) + ld de, wMysteryGiftStaging + ld a, $1 + ld [de], a + inc de ; wc801 + ld a, BANK(sGameData) + call GetSRAMBank + ld hl, sPlayerData + wPlayerID - wPlayerData + ld a, [hli] + ld [de], a + ld b, a + inc de ; wc802 + ld a, [hl] + ld [de], a + ld c, a + inc de ; wc803 + push bc + ld hl, sPlayerData + wPlayerName - wPlayerData + ld bc, NAME_LENGTH + call CopyBytes + push de ; wc80e + ld hl, sPokemonData + wPokedexCaught - wPokemonData + ld b, wEndPokedexCaught - wPokedexCaught + call CountSetBits + pop de + pop bc + ld a, [wd265] + ld [de], a + inc de ; wc80f + call CloseSRAM + call Random + and 1 + ld [de], a + inc de ; wc810 + call .RandomSample + ld [de], a + inc de ; wc811 + ld a, c + ld c, b + ld b, a + call .RandomSample + ld [de], a + inc de ; wc812 + ld a, BANK(sBackupMysteryGiftItem) + call GetSRAMBank + ld a, [sBackupMysteryGiftItem] + ld [de], a + inc de + ld a, [sBackupMysteryGiftItem + 1] + ld [de], a + ld a, $14 + ld [wca00], a + call CloseSRAM + ld hl, wMysteryGiftStaging + ld de, wMysteryGiftPlayerData + ld bc, wMysteryGiftPlayerDataEnd - wMysteryGiftPlayerData + jp CopyBytes + +.RandomSample: ; 2c6ac (b:46ac) + push de + call Random + cp 10 percent + jr c, .tenpercent + call Random + and %111 + ld d, a + rl d + ld e, $80 +.loop + rlc e + dec a + jr nz, .loop + ld a, e + and c + jr z, .skip + ld a, $1 +.skip + add d + jr .done + +.tenpercent + call Random + cp 20 percent - 1 + jr c, .twopercent + call Random + and %011 + ld d, a + rl d + ld e, $80 +.loop2 + rlc e + dec a + jr nz, .loop2 + ld a, e + and b + jr z, .skip2 + ld a, $1 +.skip2 + add d + add $10 + jr .done + +.twopercent + call Random + cp 20 percent - 1 + jr c, .pointfourpercent + ld a, b + swap a + and $7 + add $18 + jr .done + +.pointfourpercent + ld a, b + and $80 + ld a, $20 + jr z, .done + ld a, $21 + +.done + pop de + ret + +MysteryGiftGetItemHeldEffect: ; 2c708 (b:4708) + ld a, c + cp MysteryGiftItems.End - MysteryGiftItems + jr nc, MysteryGiftFallbackItem + ld hl, MysteryGiftItems + ld b, 0 + add hl, bc + ld c, [hl] + ret + +MysteryGiftGetDecoration: ; 2c715 (b:4715) + ld a, c + cp MysteryGiftDecos.End - MysteryGiftDecos + jr nc, MysteryGiftFallbackItem + ld hl, MysteryGiftDecos + ld b, 0 + add hl, bc + ld c, [hl] + ret + +MysteryGiftFallbackItem: ; 2c722 (b:4722) + ld c, DECO_POLKADOT_BED ; GREAT_BALL + ret +; 2c725 (b:4725) + + +INCLUDE "data/items/mystery_gift_items.asm" + +INCLUDE "data/decorations/mystery_gift_decos.asm" diff --git a/engine/link/time_capsule.asm b/engine/link/time_capsule.asm new file mode 100755 index 000000000..f90b7e249 --- /dev/null +++ b/engine/link/time_capsule.asm @@ -0,0 +1,147 @@ +; These functions seem to be related to backwards compatibility + +ValidateOTTrademon: ; fb57e + ld a, [wd003] + ld hl, wOTPartyMon1Species + call GetPartyLocation + push hl + ld a, [wd003] + inc a + ld c, a + ld b, 0 + ld hl, wOTPartyCount + add hl, bc + ld a, [hl] + pop hl + cp EGG + jr z, .matching_or_egg + cp [hl] + jr nz, .abnormal + +.matching_or_egg + ld b, h + ld c, l + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + cp MAX_LEVEL + 1 + jr nc, .abnormal + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jr nz, .normal + ld hl, wOTPartySpecies + ld a, [wd003] + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + + ; Magnemite and Magneton's types changed + ; from Electric to Electric/Steel. + cp MAGNEMITE + jr z, .normal + cp MAGNETON + jr z, .normal + + ld [wCurSpecies], a + call GetBaseData + ld hl, wLinkOTPartyMonTypes + add hl, bc + add hl, bc + ld a, [wBaseType1] + cp [hl] + jr nz, .abnormal + inc hl + ld a, [wBaseType2] + cp [hl] + jr nz, .abnormal + +.normal + and a + ret + +.abnormal + scf + ret +; fb5dd + +Functionfb5dd: ; fb5dd + ld a, [wd002] + ld d, a + ld a, [wPartyCount] + ld b, a + ld c, $0 +.loop + ld a, c + cp d + jr z, .next + push bc + ld a, c + ld hl, wPartyMon1HP + call GetPartyLocation + pop bc + ld a, [hli] + or [hl] + jr nz, .done + +.next + inc c + dec b + jr nz, .loop + ld a, [wd003] + ld hl, wOTPartyMon1HP + call GetPartyLocation + ld a, [hli] + or [hl] + jr nz, .done + scf + ret + +.done + and a + ret +; fb60d + +PlaceTradePartnerNamesAndParty: ; fb60d + hlcoord 4, 0 + ld de, wPlayerName + call PlaceString + ld a, $14 + ld [bc], a + hlcoord 4, 8 + ld de, wOTPlayerName + call PlaceString + ld a, $14 + ld [bc], a + hlcoord 7, 1 + ld de, wPartySpecies + call .PlaceSpeciesNames + hlcoord 7, 9 + ld de, wOTPartySpecies +.PlaceSpeciesNames: ; fb634 + ld c, $0 +.loop + ld a, [de] + cp -1 + ret z + ld [wd265], a + push bc + push hl + push de + push hl + ld a, c + ld [hProduct], a + call GetPokemonName + pop hl + call PlaceString + pop de + inc de + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + inc c + jr .loop +; fb656 + +INCLUDE "data/pokemon/gen1_base_special.asm" diff --git a/engine/link/time_capsule_2.asm b/engine/link/time_capsule_2.asm new file mode 100644 index 000000000..a56e51785 --- /dev/null +++ b/engine/link/time_capsule_2.asm @@ -0,0 +1,39 @@ +ConvertMon_2to1: ; fb8f1 +; Takes the Gen-2 Pokemon number stored in wd265, finds it in the Pokered_MonIndices table, and returns its index in wd265. + push bc + push hl + ld a, [wd265] + ld b, a + ld c, 0 + ld hl, Pokered_MonIndices +.loop + inc c + ld a, [hli] + cp b + jr nz, .loop + ld a, c + ld [wd265], a + pop hl + pop bc + ret +; fb908 + +ConvertMon_1to2: ; fb908 +; Takes the Gen-1 Pokemon number stored in wd265 and returns the corresponding value from Pokered_MonIndices in wd265. + push bc + push hl + ld a, [wd265] + dec a + ld hl, Pokered_MonIndices + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wd265], a + pop hl + pop bc + ret +; fb91c + + +INCLUDE "data/pokemon/gen1_order.asm" diff --git a/engine/link_2.asm b/engine/link_2.asm deleted file mode 100644 index e2fe47dc5..000000000 --- a/engine/link_2.asm +++ /dev/null @@ -1,95 +0,0 @@ -LinkMonStatsScreen: ; 4d319 - ld a, [wMenuCursorY] - dec a - ld [wCurPartyMon], a - call LowVolume - predef StatsScreenInit - ld a, [wCurPartyMon] - inc a - ld [wMenuCursorY], a - call ClearScreen - call ClearBGPalettes - call MaxVolume - farcall LoadTradeScreenBorder - farcall Link_WaitBGMap - farcall InitTradeSpeciesList - farcall SetTradeRoomBGPals - call WaitBGMap2 - ret - -Link_WaitBGMap: ; 4d354 - call WaitBGMap - call WaitBGMap2 - ret - -LinkTextbox2: ; 4d35b - ld h, d - ld l, e - push bc - push hl - call .PlaceBorder - pop hl - pop bc - - ld de, wAttrMap - wTileMap - add hl, de - inc b - inc b - inc c - inc c - ld a, PAL_BG_TEXT -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld de, SCREEN_WIDTH - add hl, de - pop bc - dec b - jr nz, .row - ret -; 4d37e - -.PlaceBorder: ; 4d37e - push hl - ld a, $76 - ld [hli], a - inc a - call .PlaceRow - inc a - ld [hl], a - pop hl - ld de, SCREEN_WIDTH - add hl, de -.loop - push hl - ld a, "┌" - ld [hli], a - ld a, " " - call .PlaceRow - ld [hl], "─" - pop hl - ld de, SCREEN_WIDTH - add hl, de - dec b - jr nz, .loop - - ld a, "┐" - ld [hli], a - ld a, "│" - call .PlaceRow - ld [hl], "└" - ret -; 4d3ab - -.PlaceRow: ; 4d3ab - ld d, c -.row_loop - ld [hli], a - dec d - jr nz, .row_loop - ret diff --git a/engine/link_trade.asm b/engine/link_trade.asm deleted file mode 100755 index 4c2af0842..000000000 --- a/engine/link_trade.asm +++ /dev/null @@ -1,363 +0,0 @@ -LinkCommsBorderGFX: -INCBIN "gfx/trade/border_tiles.2bpp" -; 16d421 - -__LoadTradeScreenBorder: ; 16d421 - ld de, LinkCommsBorderGFX - ld hl, vTiles2 - lb bc, BANK(LinkCommsBorderGFX), 70 - call Get2bpp - ret -; 16d42e - -Function16d42e: ; 16d42e - ld hl, Tilemap_MobileTradeBorderFullscreen - decoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - call CopyBytes - ret -; 16d43b - -Function16d43b: ; 16d43b - call LoadStandardMenuHeader - call ClearBGPalettes - call ClearTileMap - call ClearSprites - farcall __LoadTradeScreenBorder ; useless to farcall - farcall Function16d42e ; useless to farcall - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - call WaitBGMap - call JoyWaitAorB - call Call_ExitMenu - ret -; 16d465 - -Tilemap_MobileTradeBorderFullscreen: -INCBIN "gfx/trade/border_mobile_fullscreen.tilemap" - -Tilemap_CableTradeBorderTop: -INCBIN "gfx/trade/border_cable_top.tilemap" - -Tilemap_CableTradeBorderBottom: -INCBIN "gfx/trade/border_cable_bottom.tilemap" - -_LinkTextbox: ; 16d61d - ld h, d - ld l, e - push bc - push hl - call .PlaceBorder - pop hl - pop bc - - ld de, wAttrMap - wTileMap - add hl, de - inc b - inc b - inc c - inc c - ld a, PAL_BG_TEXT -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld de, SCREEN_WIDTH - add hl, de - pop bc - dec b - jr nz, .row - ret -; 16d640 - -.PlaceBorder ; 16d640 - push hl - ld a, $30 - ld [hli], a - inc a - call .PlaceRow - inc a - ld [hl], a - pop hl - ld de, SCREEN_WIDTH - add hl, de -.loop - push hl - ld a, $33 - ld [hli], a - ld a, " " - call .PlaceRow - ld [hl], $34 - pop hl - ld de, SCREEN_WIDTH - add hl, de - dec b - jr nz, .loop - - ld a, $35 - ld [hli], a - ld a, $36 - call .PlaceRow - ld [hl], $37 - ret -; 16d66d - -.PlaceRow ; 16d66d - ld d, c -.row_loop - ld [hli], a - dec d - jr nz, .row_loop - ret -; 16d673 - -InitTradeSpeciesList: ; 16d673 - call _LoadTradeScreenBorder - call Function16d6ae - farcall InitMG_Mobile_LinkTradePalMap - farcall PlaceTradePartnerNamesAndParty - hlcoord 10, 17 - ld de, .CANCEL - call PlaceString - ret -; 16d68f - -.CANCEL: ; 16d68f - db "CANCEL@" -; 16d696 - -_LoadTradeScreenBorder: ; 16d696 - call __LoadTradeScreenBorder - ret -; 16d69a - - -LinkComms_LoadPleaseWaitTextboxBorderGFX: ; 16d69a - ld de, LinkCommsBorderGFX + $30 tiles - ld hl, vTiles2 tile $76 - lb bc, BANK(LinkCommsBorderGFX), 8 - call Get2bpp - ret -; 16d6a7 - -LoadTradeRoomBGPals_: ; 16d6a7 - farcall LoadTradeRoomBGPals - ret -; 16d6ae - -Function16d6ae: ; 16d6ae - call Function16d42e - ld hl, Tilemap_CableTradeBorderTop - decoord 0, 0 - ld bc, 2 * SCREEN_WIDTH - call CopyBytes - ld hl, Tilemap_CableTradeBorderBottom - decoord 0, 16 - ld bc, 2 * SCREEN_WIDTH - call CopyBytes - ret -; 16d6ca - -LinkTextbox: ; 16d6ca - call _LinkTextbox - ret -; 16d6ce - -Function16d6ce: ; 16d6ce - call LoadStandardMenuHeader - call Function16d6e1 - farcall WaitLinkTransfer - call Call_ExitMenu - call WaitBGMap2 - ret -; 16d6e1 - -Function16d6e1: ; 16d6e1 - hlcoord 4, 10 - ld b, 1 - ld c, 10 - predef LinkTextboxAtHL - hlcoord 5, 11 - ld de, .Waiting - call PlaceString - call WaitBGMap - call WaitBGMap2 - ld c, 50 - jp DelayFrames -; 16d701 - -.Waiting: ; 16d701 - db "WAITING..!@" -; 16d70c - -LinkTradeMenu: ; 16d70c - call .MenuAction - call .GetJoypad - ret -; 16d713 - -.GetJoypad: ; 16d713 - push bc - push af - ld a, [hJoyLast] - and D_PAD - ld b, a - ld a, [hJoyPressed] - and BUTTONS - or b - ld b, a - pop af - ld a, b - pop bc - ld d, a - ret -; 16d725 - -.MenuAction: ; 16d725 - ld hl, w2DMenuFlags2 - res 7, [hl] - ld a, [hBGMapMode] - push af - call .loop - pop af - ld [hBGMapMode], a - ret - -.loop - call .UpdateCursor - call .UpdateBGMapAndOAM - call .loop2 - jr nc, .done - farcall _2DMenuInterpretJoypad - jr c, .done - ld a, [w2DMenuFlags1] - bit 7, a - jr nz, .done - call .GetJoypad - ld b, a - ld a, [wMenuJoypadFilter] - and b - jr z, .loop - -.done - ret -; 16d759 - -.UpdateBGMapAndOAM: ; 16d759 - ld a, [hOAMUpdate] - push af - ld a, $1 - ld [hOAMUpdate], a - call WaitBGMap - pop af - ld [hOAMUpdate], a - xor a - ld [hBGMapMode], a - ret - -.loop2 - call RTC - call .TryAnims - ret c - ld a, [w2DMenuFlags1] - bit 7, a - jr z, .loop2 - and a - ret -; 16d77a - -.UpdateCursor: ; 16d77a - ld hl, wCursorCurrentTile - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [hl] - cp $1f - jr nz, .not_currently_selected - ld a, [wCursorOffCharacter] - ld [hl], a - push hl - push bc - ld bc, MON_NAME_LENGTH - add hl, bc - ld [hl], a - pop bc - pop hl - -.not_currently_selected - ld a, [w2DMenuCursorInitY] - ld b, a - ld a, [w2DMenuCursorInitX] - ld c, a - call Coord2Tile - ld a, [w2DMenuCursorOffsets] - swap a - and $f - ld c, a - ld a, [wMenuCursorY] - ld b, a - xor a - dec b - jr z, .skip -.loop3 - add c - dec b - jr nz, .loop3 - -.skip - ld c, SCREEN_WIDTH - call AddNTimes - ld a, [w2DMenuCursorOffsets] - and $f - ld c, a - ld a, [wMenuCursorX] - ld b, a - xor a - dec b - jr z, .skip2 -.loop4 - add c - dec b - jr nz, .loop4 - -.skip2 - ld c, a - add hl, bc - ld a, [hl] - cp $1f - jr z, .cursor_already_there - ld [wCursorOffCharacter], a - ld [hl], $1f - push hl - push bc - ld bc, MON_NAME_LENGTH - add hl, bc - ld [hl], $1f - pop bc - pop hl -.cursor_already_there - ld a, l - ld [wCursorCurrentTile], a - ld a, h - ld [wCursorCurrentTile + 1], a - ret -; 16d7e7 - -.TryAnims: ; 16d7e7 - ld a, [w2DMenuFlags1] - bit 6, a - jr z, .skip_anims - farcall PlaySpriteAnimationsAndDelayFrame -.skip_anims - call JoyTextDelay - call .GetJoypad - and a - ret z - scf - ret -; 16d7fe diff --git a/engine/load_font.asm b/engine/load_font.asm deleted file mode 100644 index 40dbb9c10..000000000 --- a/engine/load_font.asm +++ /dev/null @@ -1,156 +0,0 @@ -INCLUDE "gfx/font.asm" - -; This and the following two functions are unreferenced. -; Debug, perhaps? -Unreferenced_fb434: - db 0 - -Unreferenced_Functionfb435: ; 4b435 - ld a, [Unreferenced_fb434] - and a - jp nz, Get1bpp_2 - jp Get1bpp -; fb43f - -Unreferenced_Functionfb43f: ; fb43f - ld a, [Unreferenced_fb434] - and a - jp nz, Get2bpp_2 - jp Get2bpp -; End unreferenced block -; fb449 - -_LoadStandardFont:: ; fb449 - ld de, Font - ld hl, vTiles1 - lb bc, BANK(Font), 128 ; "A" to "9" - ld a, [rLCDC] - bit rLCDC_ENABLE, a - jp z, Copy1bpp - - ld de, Font - ld hl, vTiles1 - lb bc, BANK(Font), 32 ; "A" to "]" - call Get1bpp_2 - ld de, Font + 32 * LEN_1BPP_TILE - ld hl, vTiles1 tile $20 - lb bc, BANK(Font), 32 ; "a" to $bf - call Get1bpp_2 - ld de, Font + 64 * LEN_1BPP_TILE - ld hl, vTiles1 tile $40 - lb bc, BANK(Font), 32 ; "Ä" to "←" - call Get1bpp_2 - ld de, Font + 96 * LEN_1BPP_TILE - ld hl, vTiles1 tile $60 - lb bc, BANK(Font), 32 ; "'" to "9" - call Get1bpp_2 - ret -; fb48a - -_LoadFontsExtra1:: ; fb48a - ld de, FontsExtra_SolidBlackGFX - ld hl, vTiles2 tile "■" ; $60 - lb bc, BANK(FontsExtra_SolidBlackGFX), 1 - call Get1bpp_2 - ld de, PokegearPhoneIconGFX - ld hl, vTiles2 tile "☎" ; $62 - lb bc, BANK(PokegearPhoneIconGFX), 1 - call Get2bpp_2 - ld de, FontExtra + 3 tiles ; "" - ld hl, vTiles2 tile "" - lb bc, BANK(FontExtra), 22 ; "" to "ぉ" - call Get2bpp_2 - jr LoadFrame -; fb4b0 - -_LoadFontsExtra2:: ; fb4b0 - ld de, FontsExtra2_UpArrowGFX - ld hl, vTiles2 tile "▲" ; $61 - ld b, BANK(FontsExtra2_UpArrowGFX) - ld c, 1 - call Get2bpp_2 - ret -; fb4be - -_LoadFontsBattleExtra:: ; fb4be - ld de, FontBattleExtra - ld hl, vTiles2 tile $60 - lb bc, BANK(FontBattleExtra), 25 - call Get2bpp_2 - jr LoadFrame -; fb4cc - -LoadFrame: ; fb4cc - ld a, [wTextBoxFrame] - maskbits NUM_FRAMES - ld bc, 6 * LEN_1BPP_TILE - ld hl, Frames - call AddNTimes - ld d, h - ld e, l - ld hl, vTiles2 tile "┌" ; $79 - lb bc, BANK(Frames), 6 ; "┌" to "┘" - call Get1bpp_2 - ld hl, vTiles2 tile " " ; $7f - ld de, TextBoxSpaceGFX - lb bc, BANK(TextBoxSpaceGFX), 1 - call Get1bpp_2 - ret -; fb4f2 - -LoadBattleFontsHPBar: ; fb4f2 - ld de, FontBattleExtra - ld hl, vTiles2 tile $60 - lb bc, BANK(FontBattleExtra), 12 - call Get2bpp_2 - ld hl, vTiles2 tile $70 - ld de, FontBattleExtra + 16 tiles ; "" - lb bc, BANK(FontBattleExtra), 3 ; "" to "『" - call Get2bpp_2 - call LoadFrame - -LoadHPBar: ; fb50d - ld de, EnemyHPBarBorderGFX - ld hl, vTiles2 tile $6c - lb bc, BANK(EnemyHPBarBorderGFX), 4 - call Get1bpp_2 - ld de, HPExpBarBorderGFX - ld hl, vTiles2 tile $73 - lb bc, BANK(HPExpBarBorderGFX), 6 - call Get1bpp_2 - ld de, ExpBarGFX - ld hl, vTiles2 tile $55 - lb bc, BANK(ExpBarGFX), 9 - call Get2bpp_2 - ld de, MobilePhoneTilesGFX + 7 tiles ; mobile phone icon - ld hl, vTiles2 tile $5e - lb bc, BANK(MobilePhoneTilesGFX), 2 - call Get2bpp_2 - ret -; fb53e - -StatsScreen_LoadFont: ; fb53e - call _LoadFontsBattleExtra - ld de, EnemyHPBarBorderGFX - ld hl, vTiles2 tile $6c - lb bc, BANK(EnemyHPBarBorderGFX), 4 - call Get1bpp_2 - ld de, HPExpBarBorderGFX - ld hl, vTiles2 tile $78 - lb bc, BANK(HPExpBarBorderGFX), 1 - call Get1bpp_2 - ld de, HPExpBarBorderGFX + 3 * LEN_1BPP_TILE - ld hl, vTiles2 tile $76 - lb bc, BANK(HPExpBarBorderGFX), 2 - call Get1bpp_2 - ld de, ExpBarGFX - ld hl, vTiles2 tile $55 - lb bc, BANK(ExpBarGFX), 8 - call Get2bpp_2 -LoadStatsScreenPageTilesGFX: ; fb571 - ld de, StatsScreenPageTilesGFX - ld hl, vTiles2 tile $31 - lb bc, BANK(StatsScreenPageTilesGFX), 17 - call Get2bpp_2 - ret -; fb57e diff --git a/engine/load_pics.asm b/engine/load_pics.asm deleted file mode 100755 index b533ee56b..000000000 --- a/engine/load_pics.asm +++ /dev/null @@ -1,491 +0,0 @@ -GetUnownLetter: ; 51040 -; Return Unown letter in wUnownLetter based on DVs at hl - -; Take the middle 2 bits of each DV and place them in order: -; atk def spd spc -; .ww..xx. .yy..zz. - - ; atk - ld a, [hl] - and %01100000 - sla a - ld b, a - ; def - ld a, [hli] - and %00000110 - swap a - srl a - or b - ld b, a - - ; spd - ld a, [hl] - and %01100000 - swap a - sla a - or b - ld b, a - ; spc - ld a, [hl] - and %00000110 - srl a - or b - -; Divide by 10 to get 0-25 - ld [hDividend + 3], a - xor a - ld [hDividend], a - ld [hDividend + 1], a - ld [hDividend + 2], a - ld a, $ff / NUM_UNOWN + 1 - ld [hDivisor], a - ld b, 4 - call Divide - -; Increment to get 1-26 - ld a, [hQuotient + 2] - inc a - ld [wUnownLetter], a - ret - -GetMonFrontpic: ; 51077 - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - call IsAPokemon - ret c - ld a, [rSVBK] - push af - call _GetFrontpic - pop af - ld [rSVBK], a - ret - -GetAnimatedFrontpic: ; 5108b - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - call IsAPokemon - ret c - ld a, [rSVBK] - push af - xor a - ld [hBGMapMode], a - call _GetFrontpic - call GetAnimatedEnemyFrontpic - pop af - ld [rSVBK], a - ret - -_GetFrontpic: ; 510a5 - push de - call GetBaseData - ld a, [wBasePicSize] - and $f - ld b, a - push bc - call GetFrontpicPointer - ld a, BANK(wDecompressEnemyFrontpic) - ld [rSVBK], a - ld a, b - ld de, wDecompressEnemyFrontpic - call FarDecompress - pop bc - ld hl, wDecompressScratch - ld de, wDecompressEnemyFrontpic - call PadFrontpic - pop hl - push hl - ld de, wDecompressScratch - ld c, 7 * 7 - ld a, [hROMBank] - ld b, a - call Get2bpp - pop hl - ret - -GetFrontpicPointer: ; 510d7 - ld a, [wCurPartySpecies] - cp UNOWN - jr z, .unown - ld a, [wCurPartySpecies] - ld d, BANK(PokemonPicPointers) - jr .ok - -.unown - ld a, [wUnownLetter] - ld d, BANK(UnownPicPointers) - -.ok - ld hl, PokemonPicPointers ; UnownPicPointers - dec a - ld bc, 6 - call AddNTimes - ld a, d - call GetFarByte - call FixPicBank - push af - inc hl - ld a, d - call GetFarHalfword - pop bc - ret - -GetAnimatedEnemyFrontpic: ; 51103 - ld a, BANK(vTiles3) - ld [rVBK], a - push hl - ld de, wDecompressScratch - ld c, 7 * 7 - ld a, [hROMBank] - ld b, a - call Get2bpp - pop hl - ld de, 7 * 7 tiles - add hl, de - push hl - ld a, BANK(wBasePicSize) - ld hl, wBasePicSize - call GetFarWRAMByte - pop hl - and $f - ld de, wDecompressEnemyFrontpic + 5 * 5 tiles - ld c, 5 * 5 - cp 5 - jr z, .got_dims - ld de, wDecompressEnemyFrontpic + 6 * 6 tiles - ld c, 6 * 6 - cp 6 - jr z, .got_dims - ld de, wDecompressEnemyFrontpic + 7 * 7 tiles - ld c, 7 * 7 -.got_dims - - push hl - push bc - call LoadFrontpicTiles - pop bc - pop hl - ld de, wDecompressScratch - ld a, [hROMBank] - ld b, a - call Get2bpp - xor a - ld [rVBK], a - ret - -LoadFrontpicTiles: ; 5114f - ld hl, wDecompressScratch - swap c - ld a, c - and $f - ld b, a - ld a, c - and $f0 - ld c, a - push bc - call LoadOrientedFrontpic - pop bc -.loop - push bc - ld c, 0 - call LoadOrientedFrontpic - pop bc - dec b - jr nz, .loop - ret - -GetMonBackpic: ; 5116c - ld a, [wCurPartySpecies] - call IsAPokemon - ret c - - ld a, [wCurPartySpecies] - ld b, a - ld a, [wUnownLetter] - ld c, a - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - push de - - ; These are assumed to be at the same address in their respective banks. - ld hl, PokemonPicPointers ; UnownPicPointers - ld a, b - ld d, BANK(PokemonPicPointers) - cp UNOWN - jr nz, .ok - ld a, c - ld d, BANK(UnownPicPointers) -.ok - dec a - ld bc, 6 - call AddNTimes - ld bc, 3 - add hl, bc - ld a, d - call GetFarByte - call FixPicBank - push af - inc hl - ld a, d - call GetFarHalfword - ld de, wDecompressScratch - pop af - call FarDecompress - ld hl, wDecompressScratch - ld c, 6 * 6 - call FixBackpicAlignment - pop hl - ld de, wDecompressScratch - ld a, [hROMBank] - ld b, a - call Get2bpp - pop af - ld [rSVBK], a - ret - -FixPicBank: ; 511c5 -; This is a thing for some reason. - -PICS_FIX EQU $36 -GLOBAL PICS_FIX - - push hl - push bc - sub BANK(Pics_1) - PICS_FIX - ld c, a - ld b, 0 - ld hl, .PicsBanks - add hl, bc - ld a, [hl] - pop bc - pop hl - ret - -.PicsBanks: ; 511d4 - db BANK(Pics_1) + 0 - db BANK(Pics_1) + 1 - db BANK(Pics_1) + 2 - db BANK(Pics_1) + 3 - db BANK(Pics_1) + 4 - db BANK(Pics_1) + 5 - db BANK(Pics_1) + 6 - db BANK(Pics_1) + 7 - db BANK(Pics_1) + 8 - db BANK(Pics_1) + 9 - db BANK(Pics_1) + 10 - db BANK(Pics_1) + 11 - db BANK(Pics_1) + 12 - db BANK(Pics_1) + 13 - db BANK(Pics_1) + 14 - db BANK(Pics_1) + 15 - db BANK(Pics_1) + 16 - db BANK(Pics_1) + 17 - db BANK(Pics_1) + 18 - db BANK(Pics_1) + 19 - db BANK(Pics_1) + 20 - db BANK(Pics_1) + 21 - db BANK(Pics_1) + 22 - db BANK(Pics_1) + 23 - -Function511ec: ; 511ec - ld a, c - push de - ld hl, PokemonPicPointers - dec a - ld bc, 6 - call AddNTimes - ld a, BANK(PokemonPicPointers) - call GetFarByte - call FixPicBank - push af - inc hl - ld a, BANK(PokemonPicPointers) - call GetFarHalfword - pop af - pop de - call FarDecompress - ret - -GetTrainerPic: ; 5120d - ld a, [wTrainerClass] - and a - ret z - cp NUM_TRAINER_CLASSES - ret nc - call WaitBGMap - xor a - ld [hBGMapMode], a - ld hl, TrainerPicPointers - ld a, [wTrainerClass] - dec a - ld bc, 3 - call AddNTimes - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - push de - ld a, BANK(TrainerPicPointers) - call GetFarByte - call FixPicBank - push af - inc hl - ld a, BANK(TrainerPicPointers) - call GetFarHalfword - pop af - ld de, wDecompressScratch - call FarDecompress - pop hl - ld de, wDecompressScratch - ld c, 7 * 7 - ld a, [hROMBank] - ld b, a - call Get2bpp - pop af - ld [rSVBK], a - call WaitBGMap - ld a, $1 - ld [hBGMapMode], a - ret - -DecompressGet2bpp: ; 5125d -; Decompress lz data from b:hl to scratch space at 6:d000, then copy it to address de. - - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - push de - push bc - ld a, b - ld de, wDecompressScratch - call FarDecompress - pop bc - ld de, wDecompressScratch - pop hl - ld a, [hROMBank] - ld b, a - call Get2bpp - - pop af - ld [rSVBK], a - ret - -FixBackpicAlignment: ; 5127c - push de - push bc - ld a, [wBoxAlignment] - and a - jr z, .keep_dims - ld a, c - cp 7 * 7 - ld de, 7 * 7 tiles - jr z, .got_dims - cp 6 * 6 - ld de, 6 * 6 tiles - jr z, .got_dims - ld de, 5 * 5 tiles - -.got_dims - ld a, [hl] - ld b, 0 - ld c, 8 -.loop - rra - rl b - dec c - jr nz, .loop - ld a, b - ld [hli], a - dec de - ld a, e - or d - jr nz, .got_dims - -.keep_dims - pop bc - pop de - ret - -PadFrontpic: ; 512ab -; pads frontpic to fill 7x7 box - ld a, b - cp 6 - jr z, .six - cp 5 - jr z, .five - -.seven_loop - ld c, $70 - call LoadOrientedFrontpic - dec b - jr nz, .seven_loop - ret - -.six - ld c, $70 - xor a - call .Fill -.six_loop - ld c, $10 - xor a - call .Fill - ld c, $60 - call LoadOrientedFrontpic - dec b - jr nz, .six_loop - ret - -.five - ld c, $70 - xor a - call .Fill -.five_loop - ld c, $20 - xor a - call .Fill - ld c, $50 - call LoadOrientedFrontpic - dec b - jr nz, .five_loop - ld c, $70 - xor a - call .Fill - ret - -.Fill: - ld [hli], a - dec c - jr nz, .Fill - ret - -LoadOrientedFrontpic: ; 512f2 - ld a, [wBoxAlignment] - and a - jr nz, .x_flip -.left_loop - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .left_loop - ret - -.x_flip - push bc -.right_loop - ld a, [de] - inc de - ld b, a - xor a -rept 8 - rr b - rla -endr - ld [hli], a - dec c - jr nz, .right_loop - pop bc - ret diff --git a/engine/mail.asm b/engine/mail.asm deleted file mode 100755 index b8685c0df..000000000 --- a/engine/mail.asm +++ /dev/null @@ -1,587 +0,0 @@ -SendMailToPC: ; 4456e - ld a, MON_ITEM - call GetPartyParamLocation - ld d, [hl] - farcall ItemIsMail - jr nc, .full - call GetMailboxCount - cp MAILBOX_CAPACITY - jr nc, .full - ld bc, MAIL_STRUCT_LENGTH - ld hl, sMailbox - call AddNTimes - ld d, h - ld e, l - ld a, [wCurPartyMon] - ld bc, MAIL_STRUCT_LENGTH - ld hl, sPartyMail - call AddNTimes - push hl - ld a, BANK(sMailboxCount) - call GetSRAMBank - ld bc, MAIL_STRUCT_LENGTH - call CopyBytes - pop hl - xor a - ld bc, MAIL_STRUCT_LENGTH - call ByteFill - ld a, MON_ITEM - call GetPartyParamLocation - ld [hl], 0 - ld hl, sMailboxCount - inc [hl] - call CloseSRAM - xor a - ret - -.full - scf - ret -; 445c0 - -DeleteMailFromPC: ; 445c0 (11:45c0) -; Shift all mail messages in the mailbox - ld a, BANK(sMailboxCount) - call GetSRAMBank - ld a, b - push bc - ld hl, sMailbox - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - push hl - add hl, bc - pop de - pop bc -.loop - ld a, b - cp MAILBOX_CAPACITY - 1 - jr z, .done - push bc - ld bc, MAIL_STRUCT_LENGTH - call CopyBytes - pop bc - inc b - jr .loop -.done - ld h, d - ld l, e - xor a - ld bc, MAIL_STRUCT_LENGTH - call ByteFill - ld hl, sMailboxCount - dec [hl] - jp CloseSRAM -; 445f4 (11:45f4) - -ReadMailMessage: ; 445f4 - ld a, b - ld hl, sMailbox - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - farcall ReadAnyMail - ret - -MoveMailFromPCToParty: ; 44607 - ld a, BANK(sMailboxCount) - call GetSRAMBank - push bc - ld a, b - ld bc, MAIL_STRUCT_LENGTH - ld hl, sMailbox - call AddNTimes - push hl - ld a, [wCurPartyMon] - ld bc, MAIL_STRUCT_LENGTH - ld hl, sPartyMail - call AddNTimes - ld d, h - ld e, l - pop hl - push hl - ld bc, MAIL_STRUCT_LENGTH - call CopyBytes - pop hl - ld de, PARTYMON_STRUCT_LENGTH - MON_MOVES - add hl, de - ld d, [hl] - ld a, [wCurPartyMon] - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld [hl], d - call CloseSRAM - pop bc - jp DeleteMailFromPC -; 44648 (11:4648) - -GetMailboxCount: ; 44648 - ld a, BANK(sMailboxCount) - call GetSRAMBank - ld a, [sMailboxCount] - ld c, a - jp CloseSRAM -; 44654 - -CheckPokeItem:: ; 44654 - push bc - push de - farcall SelectMonFromParty - ld a, POKEMAIL_REFUSED - jr c, .pop_return - - ld a, [wCurPartyMon] - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld d, [hl] - farcall ItemIsMail - ld a, POKEMAIL_NO_MAIL - jr nc, .pop_return - - ld a, BANK(sPartyMail) - call GetSRAMBank - ld a, [wCurPartyMon] - ld hl, sPartyMail - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - pop hl - pop bc - -; Compare the mail message, byte for byte, with the expected message. - ld a, MAIL_MSG_LENGTH - ld [wd265], a -.loop - ld a, [de] - ld c, a - ld a, b - call GetFarByte - cp "@" - jr z, .done - cp c - ld a, POKEMAIL_WRONG_MAIL - jr nz, .close_sram_return - inc hl - inc de - ld a, [wd265] - dec a - ld [wd265], a - jr nz, .loop - -.done - farcall CheckCurPartyMonFainted - ld a, POKEMAIL_LAST_MON - jr c, .close_sram_return - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ld a, POKEMAIL_CORRECT - -.close_sram_return - call CloseSRAM - jr .return - -.pop_return - pop de - pop bc - -.return - ld [wScriptVar], a - ret -; 446cc - - -GivePokeItem:: ; 446cc - ld a, [wPartyCount] - dec a - push af - push bc - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - pop bc - ld [hl], b - pop af - push bc - push af - ld hl, sPartyMail - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - ld hl, wd002 - ld bc, MAIL_MSG_LENGTH + 1 - ld a, BANK(sPartyMail) - call GetSRAMBank - call CopyBytes - pop af - push af - ld hl, wPartyMonOT - ld bc, NAME_LENGTH - call AddNTimes - ld bc, NAME_LENGTH - 1 - call CopyBytes - pop af - ld hl, wPartyMon1ID - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - inc de - ld a, [wCurPartySpecies] - ld [de], a - inc de - pop bc - ld a, b - ld [de], a - jp CloseSRAM -; 44725 - - -BackupPartyMonMail: ; 44725 - ld a, BANK(sPartyMail) - call GetSRAMBank - ld hl, sPartyMail - ld de, sPartyMailBackup - ld bc, 6 * MAIL_STRUCT_LENGTH - call CopyBytes - ld hl, sMailboxCount - ld de, sMailboxCountBackup - ld bc, 1 + 10 * MAIL_STRUCT_LENGTH - call CopyBytes - jp CloseSRAM -; 44745 - -RestorePartyMonMail: ; 44745 (11:4745) - ld a, BANK(sPartyMail) - call GetSRAMBank - ld hl, sPartyMailBackup - ld de, sPartyMail - ld bc, 6 * MAIL_STRUCT_LENGTH - call CopyBytes - ld hl, sMailboxCountBackup - ld de, sMailboxCount - ld bc, 1 + 10 * MAIL_STRUCT_LENGTH - call CopyBytes - jp CloseSRAM - -DeletePartyMonMail: ; 44765 (11:4765) - ld a, BANK(sPartyMail) - call GetSRAMBank - xor a - ld hl, sPartyMail - ld bc, 6 * MAIL_STRUCT_LENGTH - call ByteFill - xor a - ld hl, sMailboxCount - ld bc, 1 + 10 * MAIL_STRUCT_LENGTH - call ByteFill - jp CloseSRAM -; 44781 (11:4781) - - -IsAnyMonHoldingMail: ; 44781 - ld a, [wPartyCount] - and a - jr z, .no_mons - ld e, a - ld hl, wPartyMon1Item -.loop - ld d, [hl] - push hl - push de - farcall ItemIsMail - pop de - pop hl - ret c - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - dec e - jr nz, .loop - -.no_mons - and a - ret -; 447a0 - -_PlayerMailBoxMenu: ; 0x447a0 - call InitMail - jr z, .nomail - call LoadStandardMenuHeader - call MailboxPC - jp CloseWindow - -.nomail - ld hl, .EmptyMailboxText - jp MenuTextBoxBackup -; 0x447b4 - -.EmptyMailboxText: ; 0x447b4 - text_jump _EmptyMailboxText - db "@" - -InitMail: ; 0x447b9 -; initialize wMailboxCount and beyond with incrementing values, one per mail -; set z if no mail - ld a, BANK(sMailboxCount) - call GetSRAMBank - ld a, [sMailboxCount] - call CloseSRAM - ld hl, wMailboxCount - ld [hli], a - and a - - jr z, .done ; if no mail, we're done - - ; load values in memory with incrementing values starting at wMailboxCount - ld b, a - ld a, 1 -.loop - ld [hli], a - inc a - dec b - jr nz, .loop -.done - ld [hl], -1 ; terminate - - ld a, [wMailboxCount] - and a - ret -; 0x447da - -MailboxPC_GetMailAuthor: ; 0x447da - dec a - ld hl, sMailbox1Author - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld a, BANK(sMailboxCount) - call GetSRAMBank - ld de, wStringBuffer2 - push de - ld bc, NAME_LENGTH - 1 - call CopyBytes - ld a, "@" - ld [de], a - call CloseSRAM - pop de - ret -; 0x447fb - -MailboxPC_PrintMailAuthor: ; 0x447fb - push de - ld a, [wMenuSelection] - call MailboxPC_GetMailAuthor - pop hl - jp PlaceString -; 0x44806 - -MailboxPC: ; 0x44806 - xor a - ld [wCurMessageScrollPosition], a - ld a, 1 - ld [wCurMessageIndex], a -.loop - call InitMail - ld hl, .TopMenuHeader - call CopyMenuHeader - xor a - ld [hBGMapMode], a - call InitScrollingMenu - call UpdateSprites - - ld a, [wCurMessageIndex] - ld [wMenuCursorBuffer], a - ld a, [wCurMessageScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wCurMessageScrollPosition], a - ld a, [wMenuCursorY] - ld [wCurMessageIndex], a - - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .exit - call .Submenu - jr .loop - -.exit - xor a - ret -; 0x4484a - -.Submenu: ; 0x4484a - ld hl, .SubMenuHeader - call LoadMenuHeader - call VerticalMenu - call ExitMenu - jr c, .subexit - ld a, [wMenuCursorY] - dec a - ld hl, .JumpTable - rst JumpTable - -.subexit - ret -; 0x44861 - -.JumpTable: - dw .ReadMail - dw .PutInPack - dw .AttachMail - dw .Cancel - -.ReadMail: ; 0x44869 - call FadeToMenu - ld a, [wMenuSelection] - dec a - ld b, a - call ReadMailMessage - jp CloseSubmenu -; 0x44877 - -.PutInPack: ; 0x44877 - ld hl, .MessageLostText - call MenuTextBox - call YesNoBox - call ExitMenu - ret c - ld a, [wMenuSelection] - dec a - call .GetMailType - ld a, 1 - ld [wItemQuantityChangeBuffer], a - ld hl, wNumItems - call ReceiveItem - jr c, .put_in_bag - ld hl, .PackFullText - jp MenuTextBoxBackup - -.put_in_bag - ld a, [wMenuSelection] - dec a - ld b, a - call DeleteMailFromPC - ld hl, .PutAwayText - jp MenuTextBoxBackup -; 0x448ac - -.PutAwayText: ; 0x448ac - text_jump ClearedMailPutAwayText - db "@" - -.PackFullText: ; 0x448b1 - text_jump MailPackFullText - db "@" - -.MessageLostText: ; 0x448b6 - text_jump MailMessageLostText - db "@" - -.GetMailType: ; 0x448bb - push af - ld a, BANK(sMailboxCount) - call GetSRAMBank - pop af - ld hl, sMailbox1Type - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld a, [hl] - ld [wCurItem], a - jp CloseSRAM -; 0x448d2 - -.AttachMail: ; 0x448d2 - call FadeToMenu - xor a - ld [wPartyMenuActionText], a - call ClearBGPalettes -.try_again - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes - call DelayFrame - farcall PartyMenuSelect - jr c, .exit2 - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - ld a, MON_ITEM - call GetPartyParamLocation - ld a, [hl] - and a - jr z, .attach_mail - ld hl, .HoldingMailText - call PrintText - jr .try_again - -.egg - ld hl, .EggText - call PrintText - jr .try_again - -.attach_mail - ld a, [wMenuSelection] - dec a - ld b, a - call MoveMailFromPCToParty - ld hl, .MailMovedText - call PrintText - -.exit2 - jp CloseSubmenu -; 0x4493c - -.HoldingMailText: ; 0x4493c - text_jump MailAlreadyHoldingItemText - db "@" - -.EggText: ; 0x44941 - text_jump MailEggText - db "@" - -.MailMovedText: ; 0x44946 - text_jump MailMovedFromBoxText - db "@" - -.Cancel: - ret - -.TopMenuHeader: ; 0x4494c - db MENU_BACKUP_TILES ; flags - menu_coords 8, 1, SCREEN_WIDTH - 2, 10 - dw .TopMenuData - db 1 ; default option - -.TopMenuData: - db SCROLLINGMENU_DISPLAY_ARROWS ; flags - db 4, 0 ; rows/columns? - db 1 ; horizontal spacing? - dbw 0, wMailboxCount ; text pointer - dba MailboxPC_PrintMailAuthor - dba NULL - dba NULL - -.SubMenuHeader: ; 0x44964 - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, 13, 9 - dw .SubMenuData - db 1 ; default option - -.SubMenuData: - db STATICMENU_CURSOR ; flags - db 4 ; items - db "READ MAIL@" - db "PUT IN PACK@" - db "ATTACH MAIL@" - db "CANCEL@" diff --git a/engine/mail_2.asm b/engine/mail_2.asm deleted file mode 100755 index 6e326641b..000000000 --- a/engine/mail_2.asm +++ /dev/null @@ -1,949 +0,0 @@ -ReadPartyMonMail: ; b9229 - ld a, [wCurPartyMon] - ld hl, sPartyMail - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l -ReadAnyMail: ; b9237 - push de - call ClearBGPalettes - call ClearSprites - call ClearTileMap - call DisableLCD - call LoadFontsExtra - pop de - push de - ld a, BANK(sPartyMail) - call GetSRAMBank - farcall IsMailEuropean - call CloseSRAM - ld a, c - ld de, StandardEnglishFont - or a - jr z, .got_font - ld de, FrenchGermanFont - sub $3 - jr c, .got_font - ld de, SpanishItalianFont - -.got_font - ld hl, vTiles1 - lb bc, BANK(StandardEnglishFont), $80 - call Get1bpp - pop de - call .LoadGFX - call EnableLCD - call WaitBGMap - ld a, [wBuffer3] - ld e, a - farcall LoadMailPalettes - call SetPalettes - xor a - ld [hJoyPressed], a - call .loop - call ClearBGPalettes - call DisableLCD - call LoadStandardFont - jp EnableLCD - -.loop - call GetJoypad - ld a, [hJoyPressed] - and A_BUTTON | B_BUTTON | START - jr z, .loop - and START - jr nz, .pressed_start - ret - -.pressed_start - ld a, [wJumptableIndex] - push af - callfar PrintMail ; printer - pop af - ld [wJumptableIndex], a - jr .loop -; b92b8 - -.LoadGFX: ; b92b8 - ld h, d - ld l, e - push hl - ld a, BANK(sPartyMail) - call GetSRAMBank - ld de, sPartyMon1MailAuthorID - sPartyMon1Mail - add hl, de - ld a, [hli] - ld [wBuffer1], a - ld a, [hli] - ld [wBuffer2], a - ld a, [hli] - ld [wCurPartySpecies], a - ld b, [hl] - call CloseSRAM - ld hl, MailGFXPointers - ld c, 0 -.loop2 - ld a, [hli] - cp b - jr z, .got_pointer - cp -1 - jr z, .invalid - inc c - inc hl - inc hl - jr .loop2 - -.invalid - ld hl, MailGFXPointers - inc hl - -.got_pointer - ld a, c - ld [wBuffer3], a - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .done - pop bc - push de - jp hl -.done - ret -; b92f8 - -MailGFXPointers: ; b92f8 - dbw FLOWER_MAIL, LoadFlowerMailGFX - dbw SURF_MAIL, LoadSurfMailGFX - dbw LITEBLUEMAIL, LoadLiteBlueMailGFX - dbw PORTRAITMAIL, LoadPortraitMailGFX - dbw LOVELY_MAIL, LoadLovelyMailGFX - dbw EON_MAIL, LoadEonMailGFX - dbw MORPH_MAIL, LoadMorphMailGFX - dbw BLUESKY_MAIL, LoadBlueSkyMailGFX - dbw MUSIC_MAIL, LoadMusicMailGFX - dbw MIRAGE_MAIL, LoadMirageMailGFX - db -1 -; b9317 - -LoadSurfMailGFX: ; b9317 - push bc - ld hl, vTiles2 tile $31 - ld de, SurfMailBorderGFX - ld c, 8 * 8 - call LoadMailGFX_Color2 - ld de, MailLaprasGFX - ld c, 6 * 8 - call LoadMailGFX_Color3 - ld de, SurfMailWaveGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - jr FinishLoadingSurfLiteBlueMailGFX - -LoadLiteBlueMailGFX: ; b9335 - push bc - ld hl, vTiles2 tile $31 - ld de, LiteBlueMailBorderGFX - ld c, 8 * 8 - call LoadMailGFX_Color2 - ld de, MailDratiniGFX - ld c, 6 * 8 - call LoadMailGFX_Color3 - ld de, PortraitMailUnderlineGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - -FinishLoadingSurfLiteBlueMailGFX: ; b9351 - ld de, SurfLiteBlueMailSmallShapesGFX - ld c, 2 * 8 - call LoadMailGFX_Color2 - ld c, 2 * 8 - call LoadMailGFX_Color1 - ld de, SurfLiteBlueMailLargeShapesGFX - ld c, 8 * 8 - call LoadMailGFX_Color1 - ld c, 8 * 8 - call LoadMailGFX_Color2 - - call DrawMailBorder - hlcoord 2, 15 - ld a, $3f - call Mail_Draw16TileRow - ld a, $39 - hlcoord 15, 14 - call Mail_Draw3x2Graphic - ld a, $44 - hlcoord 2, 2 - call Mail_Draw2x2Graphic - hlcoord 15, 11 - call Mail_Draw2x2Graphic - ld a, $4c - hlcoord 3, 12 - call Mail_Draw2x2Graphic - hlcoord 15, 2 - call Mail_Draw2x2Graphic - ld a, $50 - hlcoord 6, 3 - call Mail_Draw2x2Graphic - ld a, $40 - hlcoord 13, 2 - ld [hli], a - hlcoord 6, 14 - ld [hl], a - ld a, $41 - hlcoord 4, 5 - ld [hli], a - hlcoord 17, 5 - ld [hli], a - hlcoord 13, 12 - ld [hl], a - ld a, $42 - hlcoord 9, 2 - ld [hli], a - hlcoord 14, 5 - ld [hli], a - hlcoord 3, 10 - ld [hl], a - ld a, $43 - hlcoord 6, 11 - ld [hli], a - pop hl - jp MailGFX_PlaceMessage -; b93d2 - -LoadEonMailGFX: ; b93d2 - push bc - ld hl, vTiles2 tile $31 - ld de, EonMailBorder1GFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, EonMailBorder2GFX - ld c, 1 * 8 - call LoadMailGFX_Color1 - ld de, EonMailBorder2GFX - ld c, 1 * 8 - call LoadMailGFX_Color1 - ld de, EonMailBorder1GFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, SurfMailBorderGFX + 6 * 8 - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, MailEeveeGFX - ld c, 6 * 8 - call LoadMailGFX_Color3 - ld hl, vTiles2 tile $3d - ld de, MailLargeCircleGFX - ld c, 4 * 8 - call LoadMailGFX_Color1 - ld de, EonMailBorder2GFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - - ld a, $31 - hlcoord 0, 0 - call Mail_Place18TileAlternatingRow - hlcoord 1, 17 - call Mail_Place18TileAlternatingRow - ld a, $33 - hlcoord 0, 1 - call Mail_Place16TileAlternatingColumn - hlcoord 19, 0 - call Mail_Place16TileAlternatingColumn - hlcoord 2, 15 - ld a, $35 - call Mail_Draw16TileRow - inc a - hlcoord 15, 14 - call Mail_Draw3x2Graphic - call LovelyEonMail_PlaceIcons - pop hl - jp MailGFX_PlaceMessage -; b944b - -LoadLovelyMailGFX: ; b944b - push bc - ld hl, vTiles2 tile $31 - ld de, LovelyMailBorderGFX - ld c, 5 * 8 - call LoadMailGFX_Color2 - ld de, MailPoliwagGFX - ld c, 6 * 8 - call LoadMailGFX_Color3 - ld de, LovelyMailUnderlineGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, LovelyMailLargeHeartGFX - ld c, 4 * 8 - call LoadMailGFX_Color2 - ld de, LovelyMailSmallHeartGFX - ld c, 1 * 8 - call LoadMailGFX_Color1 - - call DrawMailBorder2 - hlcoord 2, 15 - ld a, $3c - call Mail_Draw16TileRow - ld a, $36 - hlcoord 15, 14 - call Mail_Draw3x2Graphic - call LovelyEonMail_PlaceIcons - pop hl - jp MailGFX_PlaceMessage -; b9491 - -LovelyEonMail_PlaceIcons: ; b9491 - ld a, $3d - hlcoord 2, 2 - call Mail_Draw2x2Graphic - hlcoord 16, 2 - call Mail_Draw2x2Graphic - hlcoord 9, 4 - call Mail_Draw2x2Graphic - hlcoord 2, 11 - call Mail_Draw2x2Graphic - hlcoord 6, 12 - call Mail_Draw2x2Graphic - hlcoord 12, 11 - call Mail_Draw2x2Graphic - ld a, $41 - hlcoord 5, 4 - ld [hl], a - hlcoord 6, 2 - ld [hl], a - hlcoord 12, 4 - ld [hl], a - hlcoord 14, 2 - ld [hl], a - hlcoord 3, 13 - ld [hl], a - hlcoord 9, 11 - ld [hl], a - hlcoord 16, 12 - ld [hl], a - ret -; b94d6 - -LoadMorphMailGFX: ; b94d6 - push bc - ld hl, vTiles2 tile $31 - ld bc, 5 * 8 - call MailGFX_GenerateMonochromeTilesColor2 - ld de, MorphMailBorderCornerGFX + 3 * 8 - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, MorphMailBorderCornerGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, MorphMailBorderGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, EonMailBorder1GFX - ld c, 1 * 8 - call LoadMailGFX_Color1 - ld de, MorphMailDividerGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, MailDittoGFX - ld c, 6 * 8 - call LoadMailGFX_Color3 - call DrawMailBorder2 - ld a, $31 - hlcoord 1, 1 - call Mail_Draw2x2Graphic - hlcoord 17, 15 - call Mail_Draw2x2Graphic - hlcoord 1, 3 - ld [hl], a - hlcoord 3, 1 - ld [hl], a - hlcoord 16, 16 - ld [hl], a - hlcoord 18, 14 - ld [hl], a - ld a, $36 - hlcoord 1, 4 - ld [hl], a - hlcoord 2, 3 - ld [hl], a - hlcoord 3, 2 - ld [hl], a - hlcoord 4, 1 - ld [hl], a - inc a - hlcoord 15, 16 - ld [hl], a - hlcoord 16, 15 - ld [hl], a - hlcoord 17, 14 - ld [hl], a - hlcoord 18, 13 - ld [hl], a - inc a - hlcoord 2, 15 - ld b, $e - call Mail_DrawRowLoop - inc a - hlcoord 2, 11 - call Mail_Draw16TileRow - hlcoord 2, 5 - call Mail_Draw16TileRow - inc a - hlcoord 6, 1 - call Mail_Draw13TileRow - hlcoord 1, 16 - call Mail_Draw13TileRow - inc a - hlcoord 3, 13 - call Mail_Draw3x2Graphic - pop hl - jp MailGFX_PlaceMessage -; b9582 - -LoadBlueSkyMailGFX: ; b9582 - push bc - ld hl, vTiles2 tile $31 - ld de, EonMailBorder1GFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld a, $ff - ld bc, 1 tiles - call ByteFill - ld de, BlueSkyMailGrassGFX - ld c, 1 * 8 - call LoadMailGFX_Color3 - ld de, MailDragoniteGFX - ld c, 23 * 8 - call LoadMailGFX_Color3 - ld de, MailCloudGFX - ld c, 6 * 8 - call LoadMailGFX_Color1 - ld de, FlowerMailBorderGFX + 6 * 8 - ld c, 1 * 8 - call LoadMailGFX_Color1 - ld de, MailCloudGFX - ld c, 1 * 8 - call LoadMailGFX_Color1 - ld de, MailCloudGFX + 2 * 8 - ld c, 2 * 8 - call LoadMailGFX_Color1 - ld de, MailCloudGFX + 5 * 8 - ld c, 1 * 8 - call LoadMailGFX_Color1 - - ld a, $31 - hlcoord 0, 0 - call Mail_DrawFullWidthBorder - hlcoord 0, 1 - call Mail_DrawLeftRightBorder - hlcoord 19, 1 - call Mail_DrawLeftRightBorder - inc a - hlcoord 0, 17 - call Mail_DrawFullWidthBorder - inc a - hlcoord 0, 16 - call Mail_DrawFullWidthBorder - inc a - hlcoord 2, 2 - call Mail_Place6TileRow - hlcoord 3, 3 - call Mail_Place6TileRow - hlcoord 4, 4 - call Mail_Place6TileRow - dec hl - ld [hl], $7f - dec a - hlcoord 15, 14 - call Mail_Draw2x2Graphic - add $4 - hlcoord 15, 16 - ld [hli], a - inc a - ld [hl], a - inc a - push af - hlcoord 12, 1 - call Mail_Draw3x2Graphic - pop af - hlcoord 15, 4 - call Mail_Draw3x2Graphic - inc a - hlcoord 2, 11 - call Mail_Draw16TileRow - inc a - hlcoord 10, 3 - call Mail_Draw2x2Graphic - pop hl - jp MailGFX_PlaceMessage -; b9636 - -Mail_Place6TileRow: ; b9636 - ld b, $6 -.loop - ld [hli], a - inc a - dec b - jr nz, .loop - ret -; b963e - -LoadFlowerMailGFX: ; b963e - push bc - ld hl, vTiles2 tile $31 - ld de, FlowerMailBorderGFX - ld c, 8 * 8 - call LoadMailGFX_Color1 - ld de, MailOddishGFX - ld c, 4 * 8 - call LoadMailGFX_Color3 - ld de, FlowerMailBorderGFX + 6 * 8 - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, FlowerMailFlowerGFX - ld c, 4 * 8 - call LoadMailGFX_Color1 - ld c, 4 * 8 - call LoadMailGFX_Color2 - - call DrawMailBorder - hlcoord 2, 15 - ld a, $3d ; underline - call Mail_Draw16TileRow - ld a, $39 ; oddish - hlcoord 16, 13 - call Mail_Draw2x2Graphic - hlcoord 2, 13 - call Mail_Draw2x2Graphic - ld a, $3e - hlcoord 2, 2 - call Mail_Draw2x2Graphic - hlcoord 5, 3 - call Mail_Draw2x2Graphic - hlcoord 10, 2 - call Mail_Draw2x2Graphic - hlcoord 16, 3 - call Mail_Draw2x2Graphic - hlcoord 5, 11 - call Mail_Draw2x2Graphic - hlcoord 16, 10 - call Mail_Draw2x2Graphic - ld a, $42 - hlcoord 3, 4 - call Mail_Draw2x2Graphic - hlcoord 12, 3 - call Mail_Draw2x2Graphic - hlcoord 14, 2 - call Mail_Draw2x2Graphic - hlcoord 2, 10 - call Mail_Draw2x2Graphic - hlcoord 14, 11 - call Mail_Draw2x2Graphic - pop hl - jp MailGFX_PlaceMessage -; b96ca - -LoadPortraitMailGFX: ; b96ca - push bc - ld hl, vTiles2 tile $31 - ld de, PortraitMailBorderGFX - ld c, 5 * 8 - call LoadMailGFX_Color2 - ld de, PortraitMailUnderlineGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld hl, vTiles2 tile $3d - ld de, PortraitMailLargePokeballGFX - ld c, 4 * 8 - call LoadMailGFX_Color1 - ld de, PortraitMailSmallPokeballGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - - call DrawMailBorder2 - hlcoord 8, 15 - ld a, $36 - ld b, $a - call Mail_DrawRowLoop - call LovelyEonMail_PlaceIcons - ld a, $1 - ld [wUnownLetter], a - hlcoord 1, 10 - call PrepMonFrontpic - pop hl - jp MailGFX_PlaceMessage -; b9710 - -LoadMusicMailGFX: ; b9710 - push bc - ld hl, vTiles2 tile $31 - ld de, MusicMailBorderGFX - ld c, 4 * 8 - call LoadMailGFX_Color2 - ld de, MorphMailBorderGFX - ld c, 2 * 8 - call LoadMailGFX_Color2 - ld de, MailNatuGFX - ld c, 6 * 8 - call LoadMailGFX_Color3 - xor a - ld bc, 1 tiles - call ByteFill - ld de, MusicMailLargeNoteGFX - ld c, 3 * 8 - call LoadMailGFX_Color1 - ld de, MusicMailSmallNoteGFX - ld c, 1 * 8 - call LoadMailGFX_Color1 - - ld a, $31 - hlcoord 0, 0 - call Mail_Place18TileAlternatingRow - hlcoord 1, 17 - call Mail_Place18TileAlternatingRow - ld a, $33 - hlcoord 0, 1 - call Mail_Place16TileAlternatingColumn - hlcoord 19, 0 - call Mail_Place16TileAlternatingColumn - ld a, $35 - hlcoord 2, 15 - call Mail_Place14TileAlternatingRow - ld a, $37 - hlcoord 15, 14 - call Mail_Draw3x2Graphic - call LovelyEonMail_PlaceIcons - pop hl - jp MailGFX_PlaceMessage -; b9776 - -LoadMirageMailGFX: ; b9776 - push bc - ld hl, vTiles2 tile $31 - ld bc, 5 * 8 - call MailGFX_GenerateMonochromeTilesColor2 - ld de, BlueSkyMailGrassGFX - ld c, 1 * 8 - call LoadMailGFX_Color2 - ld de, MailMewGFX - ld c, 18 * 8 - call LoadMailGFX_Color2 - ld de, LiteBlueMailBorderGFX + 1 * 8 - ld c, 1 * 8 - call LoadMailGFX_Color1 - ld de, LiteBlueMailBorderGFX + 6 * 8 - ld c, 1 * 8 - call LoadMailGFX_Color1 - - call DrawMailBorder2 - ld a, $36 - hlcoord 1, 16 - call Mail_DrawTopBottomBorder - inc a - hlcoord 15, 14 - call Mail_Draw3x2Graphic - inc a - hlcoord 15, 16 - ld [hli], a - inc a - ld [hl], a - ld a, $3f - hlcoord 1, 1 - call Mail_Place18TileAlternatingRow - ld a, $41 - hlcoord 0, 2 - call Mail_Place14TileAlternatingColumn - ld a, $43 - hlcoord 19, 2 - call Mail_Place14TileAlternatingColumn - ld a, $45 - hlcoord 0, 1 - ld [hl], a - inc a - hlcoord 19, 1 - ld [hl], a - inc a - hlcoord 0, 16 - ld [hl], a - inc a - hlcoord 19, 16 - ld [hl], a - inc a - hlcoord 2, 5 - call Mail_Draw16TileRow - inc a - hlcoord 2, 11 - call Mail_Draw16TileRow - pop hl - jp MailGFX_PlaceMessage -; b97f8 - -MailGFX_GenerateMonochromeTilesColor2: ; b97f8 -.loop - xor a - ld [hli], a - ld a, $ff - ld [hli], a - dec bc - ld a, b - or c - jr nz, .loop - ret -; b9803 - -MailGFX_PlaceMessage: ; b9803 - ld bc, MAIL_STRUCT_LENGTH - ld de, wTempMail - ld a, BANK(sPartyMail) - call GetSRAMBank - call CopyBytes - call CloseSRAM - ld hl, wTempMailAuthor - ld de, wMonOrItemNameBuffer - ld bc, NAME_LENGTH - 1 - call CopyBytes - ld a, "@" - ld [wTempMailAuthor], a - ld [wMonOrItemNameBuffer + NAME_LENGTH - 1], a - ld de, wTempMailMessage - hlcoord 2, 7 - call PlaceString - ld de, wMonOrItemNameBuffer - ld a, [de] - and a - ret z - ld a, [wBuffer3] - hlcoord 8, 14 - cp $3 ; PORTRAITMAIL - jr z, .place_author - hlcoord 6, 14 - cp $6 ; MORPH_MAIL - jr z, .place_author - hlcoord 5, 14 - -.place_author - jp PlaceString -; b984e - -Unreferenced_Functionb984e: ; b984e -.loop - ld a, [hl] - xor $ff - ld [hli], a - dec bc - ld a, b - or c - jr nz, .loop - ret -; b9858 - -DrawMailBorder: ; b9858 - hlcoord 0, 0 - ld a, $31 - ld [hli], a - inc a - call Mail_DrawTopBottomBorder - inc a - ld [hli], a - inc a - call Mail_DrawLeftRightBorder - ld a, $36 - ld [hli], a - inc a - call Mail_DrawTopBottomBorder - hlcoord 19, 1 - ld a, $35 - call Mail_DrawLeftRightBorder - ld a, $38 - ld [hl], a - ret -; b987b - -DrawMailBorder2: ; b987b - hlcoord 0, 0 - ld a, $31 - ld [hli], a - inc a - call Mail_DrawTopBottomBorder - ld [hl], $31 - inc hl - inc a - call Mail_DrawLeftRightBorder - ld [hl], $31 - inc hl - inc a - call Mail_DrawTopBottomBorder - hlcoord 19, 1 - ld a, $35 - call Mail_DrawLeftRightBorder - ld [hl], $31 - ret -; b989e - -Mail_Place14TileAlternatingRow: ; b989e - push af - ld b, 14 / 2 - jr Mail_PlaceAlternatingRow - -Mail_Place16TileAlternatingRow: ; b98a3 - push af - ld b, 16 / 2 - jr Mail_PlaceAlternatingRow - -Mail_Place18TileAlternatingRow: ; b98a8 - push af - ld b, 18 / 2 - -Mail_PlaceAlternatingRow: ; b98ab -.loop - ld [hli], a - inc a - ld [hli], a - dec a - dec b - jr nz, .loop - ld [hl], a - pop af - ret -; b98b5 - -Mail_Place14TileAlternatingColumn: ; b98b5 - push af - ld b, 14 / 2 - jr Mail_PlaceAlternatingColumn - -Mail_Place16TileAlternatingColumn: ; b98ba - push af - ld b, 16 / 2 - -Mail_PlaceAlternatingColumn: ; b98bd -.loop - ld [hl], a - ld de, SCREEN_WIDTH - add hl, de - inc a - ld [hl], a - add hl, de - dec a - dec b - jr nz, .loop - ld [hl], a - pop af - ret -; b98cc - -Mail_Draw7TileRow: ; b98cc - ld b, $7 - jr Mail_DrawRowLoop - -Mail_Draw13TileRow: ; b98d0 - ld b, $d - jr Mail_DrawRowLoop - -Mail_Draw16TileRow: ; b98d4 - ld b, $10 - jr Mail_DrawRowLoop - -Mail_DrawTopBottomBorder: ; b98d8 - ld b, SCREEN_WIDTH - 2 - jr Mail_DrawRowLoop - -Mail_DrawFullWidthBorder: ; b98dc - ld b, SCREEN_WIDTH - -Mail_DrawRowLoop: ; b98de -.loop - ld [hli], a - dec b - jr nz, .loop - ret -; b98e3 - -Mail_DrawLeftRightBorder: ; b98e3 - ld b, SCREEN_HEIGHT - 2 - ld de, SCREEN_WIDTH -.loop - ld [hl], a - add hl, de - dec b - jr nz, .loop - ret -; b98ee - -Mail_Draw2x2Graphic: ; b98ee - push af - ld [hli], a - inc a - ld [hl], a - ld bc, SCREEN_WIDTH - 1 - add hl, bc - inc a - ld [hli], a - inc a - ld [hl], a - pop af - ret -; b98fc - -Mail_Draw3x2Graphic: ; b98fc - ld [hli], a - inc a - ld [hli], a - inc a - ld [hl], a - ld bc, SCREEN_WIDTH - 2 - add hl, bc - inc a - ld [hli], a - inc a - ld [hli], a - inc a - ld [hl], a - ret -; b990c - -LoadMailGFX_Color1: ; b990c -.loop - ld a, [de] - inc de - ld [hli], a - xor a - ld [hli], a - dec c - jr nz, .loop - ret -; b9915 - -LoadMailGFX_Color2: ; b9915 -.loop - xor a - ld [hli], a - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .loop - ret -; b991e - -LoadMailGFX_Color3: ; b991e -.loop - ld a, [de] - inc de - ld [hli], a - ld [hli], a - dec c - jr nz, .loop - ret -; b9926 - -INCLUDE "gfx/mail.asm" - -ItemIsMail: ; b9e76 - ld a, d - ld hl, MailItems - ld de, 1 - jp IsInArray -; b9e80 - -INCLUDE "data/items/mail_items.asm" diff --git a/engine/main_menu.asm b/engine/main_menu.asm deleted file mode 100755 index d83ce873b..000000000 --- a/engine/main_menu.asm +++ /dev/null @@ -1,361 +0,0 @@ -GFX_49c0c: ; 49c0c -INCBIN "gfx/unknown/049c0c.2bpp" -; 49cdc - -MainMenu: ; 49cdc - xor a - ld [wDisableTextAcceleration], a - call Function49ed0 - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - ld hl, wGameTimerPause - res GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] - call MainMenu_GetWhichMenu - ld [wWhichIndexSet], a - call MainMenu_PrintCurrentTimeAndDay - ld hl, .MenuHeader - call LoadMenuHeader - call MainMenuJoypadLoop - call CloseWindow - jr c, .quit - call ClearTileMap - ld a, [wMenuSelection] - ld hl, .Jumptable - rst JumpTable - jr MainMenu - -.quit - ret -; 49d14 - -.MenuHeader: ; 49d14 - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, 16, 7 - dw .MenuData - db 1 ; default option -; 49d1c - -.MenuData: ; 49d1c - db STATICMENU_CURSOR ; flags - db 0 ; items - dw MainMenuItems - dw PlaceMenuStrings - dw .Strings -; 49d20 - -.Strings: ; 49d24 - db "CONTINUE@" - db "NEW GAME@" - db "OPTION@" - db "MYSTERY GIFT@" - db "MOBILE@" - db "MOBILE STUDIUM@" - -.Jumptable: ; 0x49d60 - dw MainMenu_Continue - dw MainMenu_NewGame - dw MainMenu_Options - dw MainMenu_MysteryGift - dw MainMenu_Mobile - dw MainMenu_MobileStudium -; 0x49d6c - -CONTINUE EQU 0 -NEW_GAME EQU 1 -OPTION EQU 2 -MYSTERY_GIFT EQU 3 -MOBILE EQU 4 -MOBILE_STUDIUM EQU 5 - -MainMenuItems: - -NewGameMenu: ; 0x49d6c - db 2 - db NEW_GAME - db OPTION - db -1 - -ContinueMenu: ; 0x49d70 - db 3 - db CONTINUE - db NEW_GAME - db OPTION - db -1 - -MobileMysteryMenu: ; 0x49d75 - db 5 - db CONTINUE - db NEW_GAME - db OPTION - db MYSTERY_GIFT - db MOBILE - db -1 - -MobileMenu: ; 0x49d7c - db 4 - db CONTINUE - db NEW_GAME - db OPTION - db MOBILE - db -1 - -MobileStudiumMenu: ; 0x49d82 - db 5 - db CONTINUE - db NEW_GAME - db OPTION - db MOBILE - db MOBILE_STUDIUM - db -1 - -MysteryMobileStudiumMenu: ; 0x49d89 - db 6 - db CONTINUE - db NEW_GAME - db OPTION - db MYSTERY_GIFT - db MOBILE - db MOBILE_STUDIUM - db -1 - -MysteryMenu: ; 0x49d91 - db 4 - db CONTINUE - db NEW_GAME - db OPTION - db MYSTERY_GIFT - db -1 - -MysteryStudiumMenu: ; 0x49d97 - db 5 - db CONTINUE - db NEW_GAME - db OPTION - db MYSTERY_GIFT - db MOBILE_STUDIUM - db -1 - -StudiumMenu: ; 0x49d9e - db 4 - db CONTINUE - db NEW_GAME - db OPTION - db MOBILE_STUDIUM - db -1 - - -MainMenu_GetWhichMenu: ; 49da4 - nop - nop - nop - ld a, [wSaveFileExists] - and a - jr nz, .next - ld a, $0 ; New Game - ret - -.next - ld a, [hCGB] - cp $1 - ld a, $1 - ret nz - ld a, BANK(sNumDailyMysteryGiftPartnerIDs) - call GetSRAMBank - ld a, [sNumDailyMysteryGiftPartnerIDs] - cp -1 - call CloseSRAM - jr nz, .mystery_gift - ; This check makes no difference. - ld a, [wStatusFlags] - bit STATUSFLAGS_MAIN_MENU_MOBILE_CHOICES_F, a - ld a, $1 ; Continue - jr z, .ok - jr .ok - -.ok - jr .ok2 - -.ok2 - ld a, $1 ; Continue - ret - -.mystery_gift - ; This check makes no difference. - ld a, [wStatusFlags] - bit STATUSFLAGS_MAIN_MENU_MOBILE_CHOICES_F, a - jr z, .ok3 - jr .ok3 - -.ok3 - jr .ok4 - -.ok4 - ld a, $6 ; Mystery Gift - ret -; 49de4 - -MainMenuJoypadLoop: ; 49de4 - call SetUpMenu -.loop - call MainMenu_PrintCurrentTimeAndDay - ld a, [w2DMenuFlags1] - set 5, a - ld [w2DMenuFlags1], a - call GetScrollingMenuJoypad - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .b_button - cp A_BUTTON - jr z, .a_button - jr .loop - -.a_button - call PlayClickSFX - and a - ret - -.b_button - scf - ret -; 49e09 - -MainMenu_PrintCurrentTimeAndDay: ; 49e09 - ld a, [wSaveFileExists] - and a - ret z - xor a - ld [hBGMapMode], a - call .PlaceBox - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call .PlaceTime - pop af - ld [wOptions], a - ld a, $1 - ld [hBGMapMode], a - ret -; 49e27 - - -.PlaceBox: ; 49e27 - call CheckRTCStatus - and $80 - jr nz, .TimeFail - hlcoord 0, 14 - ld b, 2 - ld c, 18 - call TextBox - ret - -.TimeFail: - call SpeechTextBox - ret -; 49e3d - - -.PlaceTime: ; 49e3d - ld a, [wSaveFileExists] - and a - ret z - call CheckRTCStatus - and $80 - jp nz, .PrintTimeNotSet - call UpdateTime - call GetWeekday - ld b, a - decoord 1, 15 - call .PlaceCurrentDay - decoord 4, 16 - ld a, [hHours] - ld c, a - farcall PrintHour - ld [hl], ":" - inc hl - ld de, hMinutes - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ret - -.min -; unused - db "min.@" -; 49e75 - -.PrintTimeNotSet: ; 49e75 - hlcoord 1, 14 - ld de, .TimeNotSet - call PlaceString - ret -; 49e7f - -.TimeNotSet: ; 49e7f - db "TIME NOT SET@" -; 49e8c - -.UnusedText: ; 49e8c - ; Clock time unknown - text_jump UnknownText_0x1c5182 - db "@" -; 49e91 - -.PlaceCurrentDay: ; 49e91 - push de - ld hl, .Days - ld a, b - call GetNthString - ld d, h - ld e, l - pop hl - call PlaceString - ld h, b - ld l, c - ld de, .Day - call PlaceString - ret -; 49ea8 - -.Days: - db "SUN@" - db "MON@" - db "TUES@" - db "WEDNES@" - db "THURS@" - db "FRI@" - db "SATUR@" -.Day: - db "DAY@" -; 49ed0 - -Function49ed0: ; 49ed0 - xor a - ld [hMapAnims], a - call ClearTileMap - call LoadFontsExtra - call LoadStandardFont - call ClearWindowData - ret -; 49ee0 - - -MainMenu_NewGame: ; 49ee0 - farcall NewGame - ret -; 49ee7 - -MainMenu_Options: ; 49ee7 - farcall OptionsMenu - ret -; 49eee - -MainMenu_Continue: ; 49eee - farcall Continue - ret -; 49ef5 - -MainMenu_MysteryGift: ; 49ef5 - farcall MysteryGift - ret -; 49efc diff --git a/engine/map_object_action.asm b/engine/map_object_action.asm deleted file mode 100755 index c82cd80a2..000000000 --- a/engine/map_object_action.asm +++ /dev/null @@ -1,313 +0,0 @@ -ObjectActionPairPointers: ; 445f -; entries correspond to OBJECT_ACTION_* constants - dw SetFacingStanding, SetFacingStanding - dw SetFacingStandAction, SetFacingCurrent - dw SetFacingStepAction, SetFacingCurrent - dw SetFacingBumpAction, SetFacingCurrent - dw SetFacingCounterclockwiseSpin, SetFacingCurrent - dw SetFacingCounterclockwiseSpin2, SetFacingStanding - dw SetFacingFish, SetFacingFish - dw SetFacingShadow, SetFacingStanding - dw SetFacingEmote, SetFacingEmote - dw SetFacingBigDollSym, SetFacingBigDollSym - dw SetFacingBounce, SetFacingFreezeBounce - dw SetFacingWeirdTree, SetFacingCurrent - dw SetFacingBigDollAsym, SetFacingBigDollAsym - dw SetFacingBigDoll, SetFacingBigDoll - dw SetFacingBoulderDust, SetFacingStanding - dw SetFacingGrassShake, SetFacingStanding - dw SetFacingSkyfall, SetFacingCurrent -; 44a3 - -SetFacingStanding: ; 44a3 - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], STANDING - ret -; 44aa - -SetFacingCurrent: ; 44aa - call GetSpriteDirection - or FACING_STEP_DOWN_0 ; useless - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], a - ret -; 44b5 - -SetFacingStandAction: ; 44b5 - ld hl, OBJECT_FACING_STEP - add hl, bc - ld a, [hl] - and 1 - jr nz, SetFacingStepAction - jp SetFacingCurrent -; 44c1 - -SetFacingStepAction: ; 44c1 - ld hl, OBJECT_FLAGS1 - add hl, bc - bit SLIDING, [hl] - jp nz, SetFacingCurrent - - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld a, [hl] - inc a - and %00001111 - ld [hl], a - - rrca - rrca - and %00000011 - ld d, a - - call GetSpriteDirection - or FACING_STEP_DOWN_0 ; useless - or d - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], a - ret -; 44e4 - -SetFacingSkyfall: ; 44e4 - ld hl, OBJECT_FLAGS1 - add hl, bc - bit SLIDING, [hl] - jp nz, SetFacingCurrent - - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld a, [hl] - add 2 - and %00001111 - ld [hl], a - - rrca - rrca - and %00000011 - ld d, a - - call GetSpriteDirection - or FACING_STEP_DOWN_0 ; useless - or d - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], a - ret -; 4508 - -SetFacingBumpAction: ; 4508 - ld hl, OBJECT_FLAGS1 - add hl, bc - bit SLIDING, [hl] - jp nz, SetFacingCurrent - - ld hl, OBJECT_STEP_FRAME - add hl, bc - inc [hl] - - ld a, [hl] - rrca - rrca - rrca - and %00000011 - ld d, a - - call GetSpriteDirection - or FACING_STEP_DOWN_0 ; useless - or d - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], a - ret -; 4529 - -SetFacingCounterclockwiseSpin: ; 4529 - call CounterclockwiseSpinAction - ld hl, OBJECT_FACING - add hl, bc - ld a, [hl] - or FACING_STEP_DOWN_0 ; useless - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], a - ret -; 4539 - -SetFacingCounterclockwiseSpin2: ; 4539 - call CounterclockwiseSpinAction - jp SetFacingStanding -; 453f - -CounterclockwiseSpinAction: ; 453f -; Here, OBJECT_STEP_FRAME consists of two 2-bit components, -; using only bits 0,1 and 4,5. -; bits 0,1 is a timer (4 overworld frames) -; bits 4,5 determines the facing - the direction is counterclockwise. - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld a, [hl] - and %11110000 - ld e, a - - ld a, [hl] - inc a - and %00001111 - ld d, a - cp 4 - jr c, .ok - - ld d, 0 - ld a, e - add $10 - and %00110000 - ld e, a - -.ok - ld a, d - or e - ld [hl], a - - swap e - ld d, 0 - ld hl, .Directions - add hl, de - ld a, [hl] - ld hl, OBJECT_FACING - add hl, bc - ld [hl], a - ret -; 456a - -.Directions: ; 456a - db OW_DOWN, OW_RIGHT, OW_UP, OW_LEFT -; 456e - -SetFacingFish: ; 456e - call GetSpriteDirection - rrca - rrca - add FACING_FISH_DOWN - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], a - ret -; 457b - -SetFacingShadow: ; 457b - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], FACING_SHADOW - ret -; 4582 - -SetFacingEmote: ; 4582 emote - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], FACING_EMOTE - ret -; 4589 - -SetFacingBigDollSym: ; 4589 - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], FACING_BIG_DOLL_SYM - ret -; 4590 - -SetFacingBounce: ; 4590 - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld a, [hl] - inc a - and %00001111 - ld [hl], a - and %00001000 - jr z, SetFacingFreezeBounce - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], FACING_STEP_UP_0 - ret -; 45a4 - -SetFacingFreezeBounce: ; 45a4 - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], FACING_STEP_DOWN_0 - ret -; 45ab - -SetFacingWeirdTree: ; 45ab - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld a, [hl] - inc a - ld [hl], a - and %00001100 - rrca - rrca - add FACING_WEIRD_TREE_0 - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], a - ret -; 45be - -SetFacingBigDollAsym: ; 45be - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], FACING_BIG_DOLL_ASYM - ret -; 45c5 - -SetFacingBigDoll: ; 45c5 - ld a, [wVariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS] - ld d, FACING_BIG_DOLL_SYM ; symmetric - cp SPRITE_BIG_SNORLAX - jr z, .ok - cp SPRITE_BIG_LAPRAS - jr z, .ok - ld d, FACING_BIG_DOLL_ASYM ; asymmetric - -.ok - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], d - ret -; 45da - -SetFacingBoulderDust: ; 45da - ld hl, OBJECT_STEP_FRAME - add hl, bc - inc [hl] - ld a, [hl] - - ld hl, OBJECT_FACING_STEP - add hl, bc - and 2 - ld a, FACING_BOULDER_DUST_1 - jr z, .ok - inc a ; FACING_BOULDER_DUST_2 -.ok - ld [hl], a - ret -; 45ed - -SetFacingGrassShake: ; 45ed - ld hl, OBJECT_STEP_FRAME - add hl, bc - inc [hl] - ld a, [hl] - ld hl, OBJECT_FACING_STEP - add hl, bc - and 4 - ld a, FACING_GRASS_1 - jr z, .ok - inc a ; FACING_GRASS_2 - -.ok - ld [hl], a - ret -; 4600 diff --git a/engine/map_objects.asm b/engine/map_objects.asm deleted file mode 100644 index 78d9062ef..000000000 --- a/engine/map_objects.asm +++ /dev/null @@ -1,3123 +0,0 @@ -INCLUDE "data/sprites/facings.asm" - -INCLUDE "data/sprites/map_objects.asm" - - -; 4357 -DeleteMapObject:: ; 4357 - push bc - ld hl, OBJECT_MAP_OBJECT_INDEX - add hl, bc - ld a, [hl] - push af - ld h, b - ld l, c - ld bc, OBJECT_STRUCT_LENGTH - xor a - call ByteFill - pop af - cp -1 - jr z, .ok - bit 7, a - jr nz, .ok - call GetMapObject - ld hl, OBJECT_SPRITE - add hl, bc - ld [hl], -1 -.ok - pop bc - ret -; 437b - -Function437b: ; 437b - call .CheckObjectStillVisible - ret c - call .HandleStepType - call .HandleObjectAction - ret - -.CheckObjectStillVisible: - ld hl, OBJECT_FLAGS2 - add hl, bc - res 6, [hl] - ld a, [wXCoord] - ld e, a - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [hl] - add 1 - sub e - jr c, .ok - cp MAPOBJECT_SCREEN_WIDTH - jr nc, .ok - ld a, [wYCoord] - ld e, a - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld a, [hl] - add 1 - sub e - jr c, .ok - cp MAPOBJECT_SCREEN_HEIGHT - jr nc, .ok - jr .yes - -.ok - ld hl, OBJECT_FLAGS2 - add hl, bc - set 6, [hl] - ld a, [wXCoord] - ld e, a - ld hl, OBJECT_INIT_X - add hl, bc - ld a, [hl] - add 1 - sub e - jr c, .ok2 - cp MAPOBJECT_SCREEN_WIDTH - jr nc, .ok2 - ld a, [wYCoord] - ld e, a - ld hl, OBJECT_INIT_Y - add hl, bc - ld a, [hl] - add 1 - sub e - jr c, .ok2 - cp MAPOBJECT_SCREEN_HEIGHT - jr nc, .ok2 -.yes - and a - ret - -.ok2 - ld hl, OBJECT_FLAGS1 - add hl, bc - bit 1, [hl] - jr nz, .yes2 - call DeleteMapObject - scf - ret - -.yes2 - ld hl, OBJECT_FLAGS2 - add hl, bc - set 6, [hl] - and a - ret - -.HandleStepType: - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld a, [hl] - and a - jr z, .zero - ld hl, OBJECT_FLAGS2 - add hl, bc - bit 5, [hl] - jr nz, .bit5 - cp STEP_TYPE_SLEEP - jr z, .one - jr .ok3 - -.zero - call ObjectMovementReset - ld hl, OBJECT_FLAGS2 - add hl, bc - bit 5, [hl] - jr nz, .bit5 -.one - call MapObjectMovementPattern - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld a, [hl] - and a - ret z - cp STEP_TYPE_SLEEP - ret z -.ok3 - ld hl, StepTypesJumptable - rst JumpTable - ret - -.bit5 - ret - -.HandleObjectAction: - ld hl, OBJECT_FLAGS1 - add hl, bc - bit INVISIBLE, [hl] - jr nz, SetFacingStanding - ld hl, OBJECT_FLAGS2 - add hl, bc - bit 6, [hl] - jr nz, SetFacingStanding - bit 5, [hl] - jr nz, asm_4448 - ld de, ObjectActionPairPointers ; use first column - jr _HandleObjectAction -; 4440 - -Function4440: ; 4440 - ld hl, OBJECT_FLAGS1 - add hl, bc - bit INVISIBLE, [hl] - jr nz, SetFacingStanding -asm_4448 - ld de, ObjectActionPairPointers + 2 ; use second column - jr _HandleObjectAction -; 444d - -_HandleObjectAction -; call [4 * wObjectStructs[ObjInd, OBJECT_ACTION] + de] - ld hl, OBJECT_ACTION - add hl, bc - ld a, [hl] - ld l, a - ld h, 0 - add hl, hl - add hl, hl - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call _hl_ - ret -; 445f - -INCLUDE "engine/map_object_action.asm" - -CopyNextCoordsTileToStandingCoordsTile: ; 4600 - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [hl] - ld hl, OBJECT_MAP_X - add hl, bc - ld [hl], a - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld a, [hl] - ld hl, OBJECT_MAP_Y - add hl, bc - ld [hl], a - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - ld hl, OBJECT_STANDING_TILE - add hl, bc - ld [hl], a - call SetTallGrassFlags - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - call UselessAndA - ret -; 462a - -Function462a: ; 462a - ld hl, OBJECT_MAP_X - add hl, bc - ld a, [hl] - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld [hl], a - ld hl, OBJECT_MAP_Y - add hl, bc - ld a, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld [hl], a - ret -; 463f - -UpdateTallGrassFlags: ; 463f - ld hl, OBJECT_FLAGS2 - add hl, bc - bit OVERHEAD, [hl] - jr z, .ok - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - call SetTallGrassFlags -.ok - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - call UselessAndA - ret c ; never happens - ld hl, OBJECT_STANDING_TILE - add hl, bc - ld a, [hl] - call UselessAndA - ret -; 4661 - -SetTallGrassFlags: ; 4661 - call CheckSuperTallGrassTile - jr z, .set - call CheckGrassTile - jr c, .reset -.set - ld hl, OBJECT_FLAGS2 - add hl, bc - set OVERHEAD, [hl] - ret - -.reset - ld hl, OBJECT_FLAGS2 - add hl, bc - res OVERHEAD, [hl] - ret -; 4679 - -UselessAndA: ; 4679 - and a - ret -; 467b - -EndSpriteMovement: ; 467b - xor a - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], a - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a ; OBJECT_1E - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret -; 4690 - -InitStep: ; 4690 - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], a - ld hl, OBJECT_FLAGS1 - add hl, bc - bit FIXED_FACING, [hl] - jr nz, GetNextTile - add a - add a - and %00001100 - ld hl, OBJECT_FACING - add hl, bc - ld [hl], a -GetNextTile: ; 46a6 - call GetStepVector - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld a, d - call GetStepVectorSign - ld hl, OBJECT_MAP_X - add hl, bc - add [hl] - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld [hl], a - ld d, a - ld a, e - call GetStepVectorSign - ld hl, OBJECT_MAP_Y - add hl, bc - add [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld [hl], a - ld e, a - push bc - call GetCoordTile - pop bc - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld [hl], a - ret -; 46d7 - -AddStepVector: ; 46d7 - call GetStepVector - ld hl, OBJECT_SPRITE_X - add hl, bc - ld a, [hl] - add d - ld [hl], a - ld hl, OBJECT_SPRITE_Y - add hl, bc - ld a, [hl] - add e - ld [hl], a - ret -; 46e9 - -GetStepVector: ; 46e9 -; Return (x, y, duration, speed) in (d, e, a, h). - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld a, [hl] - and %00001111 - add a - add a - ld l, a - ld h, 0 - ld de, StepVectors - add hl, de - ld d, [hl] - inc hl - ld e, [hl] - inc hl - ld a, [hli] - ld h, [hl] - ret -; 4700 - -StepVectors: ; 4700 -; x, y, duration, speed - ; slow - db 0, 1, 16, 1 - db 0, -1, 16, 1 - db -1, 0, 16, 1 - db 1, 0, 16, 1 - ; normal - db 0, 2, 8, 2 - db 0, -2, 8, 2 - db -2, 0, 8, 2 - db 2, 0, 8, 2 - ; fast - db 0, 4, 4, 4 - db 0, -4, 4, 4 - db -4, 0, 4, 4 - db 4, 0, 4, 4 -; 4730 - -GetStepVectorSign: ; 4730 - add a - ret z ; 0 or 128 - ld a, 1 - ret nc ; 1 - 127 - ld a, -1 - ret ; 129 - 255 -; 4738 - -UpdatePlayerStep: ; 4738 - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld a, [hl] - and %00000011 - ld [wPlayerStepDirection], a - call AddStepVector - ld a, [wPlayerStepVectorX] - add d - ld [wPlayerStepVectorX], a - ld a, [wPlayerStepVectorY] - add e - ld [wPlayerStepVectorY], a - ld hl, wPlayerStepFlags - set 5, [hl] - ret -; 4759 - -Unreferenced_Function4759: ; 4759 - push bc - ld e, a - ld d, 0 - ld hl, OBJECT_MAP_OBJECT_INDEX - add hl, bc - ld a, [hl] - call GetMapObject - add hl, de - ld a, [hl] - pop bc - ret -; 4769 - -RestoreDefaultMovement: ; 4769 - ld hl, OBJECT_MAP_OBJECT_INDEX - add hl, bc - ld a, [hl] - cp -1 - jr z, .ok - push bc - call GetMapObject - ld hl, MAPOBJECT_MOVEMENT - add hl, bc - ld a, [hl] - pop bc - ret - -.ok - ld a, SPRITEMOVEFN_STANDING - ret -; 4780 - -ClearObjectMovementByteIndex: ; 4780 - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - ld [hl], 0 - ret -; 4787 - -IncrementObjectMovementByteIndex: ; 4787 - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - inc [hl] - ret -; 478d - -DecrementObjectMovementByteIndex: ; 478d - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - dec [hl] - ret -; 4793 - -MovementAnonymousJumptable: ; 4793 - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - ld a, [hl] - pop hl - rst JumpTable - ret -; 479b - -ClearObjectStructField1c: ; 479b - ld hl, OBJECT_1C - add hl, bc - ld [hl], 0 - ret -; 47a2 - -IncrementObjectStructField1c: ; 47a2 - ld hl, OBJECT_1C - add hl, bc - inc [hl] - ret -; 47a8 - -Field1cAnonymousJumptable: ; 47a8 - ld hl, OBJECT_1C - add hl, bc - ld a, [hl] - pop hl - rst JumpTable - ret -; 47b0 - -GetValueObjectStructField1c: ; 47b0 - ld hl, OBJECT_1C - add hl, bc - ld a, [hl] - ret -; 47b6 - -SetValueObjectStructField1c: ; 47b6 - ld hl, OBJECT_1C - add hl, bc - ld [hl], a - ret -; 47bc - -ObjectMovementReset: ; 47bc - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - push bc - call GetCoordTile - pop bc - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld [hl], a - call CopyNextCoordsTileToStandingCoordsTile - call EndSpriteMovement - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 47dd - -MapObjectMovementPattern: ; 47dd - call ClearObjectStructField1c - call GetSpriteMovementFunction - ld a, [hl] - ld hl, .Pointers - rst JumpTable - ret - -.Pointers: ; 47e9 -; entries correspond to SPRITEMOVEFN_* constants - dw .Null_00 ; 00 - dw .RandomWalkY ; 01 - dw .RandomWalkX ; 02 - dw .RandomWalkXY ; 03 - dw .RandomSpin1 ; 04 - dw .RandomSpin2 ; 05 - dw .Standing ; 06 - dw .ObeyDPad ; 07 - dw .Movement08 ; 08 - dw .Movement09 ; 09 - dw .Movement0a ; 0a - dw .Movement0b ; 0b - dw .Movement0c ; 0c - dw .Movement0d ; 0d - dw .Movement0e ; 0e - dw .Follow ; 0f - dw .Script ; 10 - dw .Strength ; 11 - dw .FollowNotExact ; 12 - dw .MovementShadow ; 13 - dw .MovementEmote ; 14 - dw .MovementBigStanding ; 15 - dw .MovementBouncing ; 16 - dw .MovementScreenShake ; 17 - dw .MovementSpinClockwise ; 18 - dw .MovementSpinCounterclockwise ; 19 - dw .MovementBoulderDust ; 1a - dw .MovementShakingGrass ; 1b - -.Null_00: - ret - -.RandomWalkY: - call Random - ld a, [hRandomAdd] - and %00000001 - jp .RandomWalkContinue - -.RandomWalkX: - call Random - ld a, [hRandomAdd] - and %00000001 - or %00000010 - jp .RandomWalkContinue - -.RandomWalkXY: - call Random - ld a, [hRandomAdd] - and %00000011 - jp .RandomWalkContinue - -.RandomSpin1: - call Random - ld a, [hRandomAdd] - and %00001100 - ld hl, OBJECT_FACING - add hl, bc - ld [hl], a - jp RandomStepDuration_Slow - -.RandomSpin2: - ld hl, OBJECT_FACING - add hl, bc - ld a, [hl] - and %00001100 - ld d, a - call Random - ld a, [hRandomAdd] - and %00001100 - cp d - jr nz, .keep - xor %00001100 -.keep - ld [hl], a - jp RandomStepDuration_Fast - -.Standing: - call Function462a - call EndSpriteMovement - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_05 - ret - -.ObeyDPad: - ld hl, Function5000 - jp HandleMovementData - -.Movement08: - ld hl, Function5015 - jp HandleMovementData - -.Movement09: - ld hl, Function5026 - jp HandleMovementData - -.Movement0a: - jp _GetMovementObject - -.Movement0b: - jp _GetMovementObject - -.Movement0c: - jp _GetMovementObject - -.Movement0d: - ld hl, Function5000 - jp HandleMovementData - -.Movement0e: - jp _GetMovementObject - -.Follow: - ld hl, GetFollowerNextMovementByte - jp HandleMovementData - -.Script: - ld hl, GetMovementByte - jp HandleMovementData - -.Strength: - call MovementAnonymousJumptable - dw .Strength_Start - dw .Strength_Stop - -.Strength_Start: - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - call CheckPitTile - jr z, .on_pit - ld hl, OBJECT_FLAGS2 - add hl, bc - bit 2, [hl] - res 2, [hl] - jr z, .ok - ld hl, OBJECT_RANGE - add hl, bc - ld a, [hl] - and %00000011 - or 0 - call InitStep - call Function6ec1 - jr c, .ok2 - ld de, SFX_STRENGTH - call PlaySFX - call SpawnStrengthBoulderDust - call UpdateTallGrassFlags - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_0F - ret - -.ok2 - call Function462a -.ok - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret - -.on_pit - call IncrementObjectMovementByteIndex -.Strength_Stop: - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret - -.FollowNotExact: - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - ld hl, OBJECT_RANGE - add hl, bc - ld a, [hl] - push bc - call GetObjectStruct - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld a, [hl] - cp STANDING - jr z, .standing - ld hl, OBJECT_MAP_X - add hl, bc - ld a, [hl] - cp d - jr z, .equal - jr c, .less - ld a, 3 - jr .done - -.less - ld a, 2 - jr .done - -.equal - ld hl, OBJECT_MAP_Y - add hl, bc - ld a, [hl] - cp e - jr z, .standing - jr c, .less2 - ld a, 0 - jr .done - -.less2 - ld a, 1 -.done - ld d, a - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld a, [hl] - and %00001100 - or d - pop bc - jp NormalStep - -.standing - pop bc - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - ret - -.MovementBigStanding: - call EndSpriteMovement - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_BIG_DOLL_SYM - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_04 - ret - -.MovementBouncing: - call EndSpriteMovement - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_BOUNCE - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_04 - ret - -.MovementSpinCounterclockwise: - call MovementAnonymousJumptable - dw .MovementSpinInit - dw .MovementSpinRepeat - dw .MovementSpinTurnLeft - -.MovementSpinClockwise: - call MovementAnonymousJumptable - dw .MovementSpinInit - dw .MovementSpinRepeat - dw .MovementSpinTurnRight - -.MovementSpinInit: - call EndSpriteMovement - call IncrementObjectMovementByteIndex -.MovementSpinRepeat: - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - ld hl, OBJECT_RANGE - add hl, bc - ld a, [hl] - ld a, $10 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_03 - call IncrementObjectMovementByteIndex - ret - -.MovementSpinTurnLeft: - ld de, .DirectionData_Counterclockwise - call .MovementSpinNextFacing - jr .MovementSpinCounterclockwise - -.DirectionData_Counterclockwise: ; 49c0 - db OW_RIGHT, OW_LEFT, OW_DOWN, OW_UP - -.MovementSpinTurnRight: - ld de, .DirectionData_Clockwise - call .MovementSpinNextFacing - jr .MovementSpinClockwise - -.DirectionData_Clockwise: ; 49cc - db OW_LEFT, OW_RIGHT, OW_UP, OW_DOWN - -.MovementSpinNextFacing: - ld hl, OBJECT_FACING - add hl, bc - ld a, [hl] - and %00001100 - rrca - rrca - push hl - ld l, a - ld h, 0 - add hl, de - ld a, [hl] - pop hl - ld [hl], a - call DecrementObjectMovementByteIndex - ret - -.MovementShadow: - call ._MovementShadow_Grass_Emote_BoulderDust - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_SHADOW - ld hl, OBJECT_STEP_DURATION - add hl, de - ld a, [hl] - inc a - add a - add 0 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld hl, OBJECT_DIRECTION_WALKING - add hl, de - ld a, [hl] - maskbits NUM_DIRECTIONS - ld d, 1 * 8 + 6 - cp DOWN - jr z, .ok_13 - cp UP - jr z, .ok_13 - ld d, 1 * 8 + 4 -.ok_13 - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], d - ld hl, OBJECT_SPRITE_X_OFFSET - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_TRACKING_OBJECT - ret - -.MovementEmote: - call EndSpriteMovement - call ._MovementShadow_Grass_Emote_BoulderDust - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_EMOTE - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 0 - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], -2 * 8 - ld hl, OBJECT_SPRITE_X_OFFSET - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_TRACKING_OBJECT - ret - -.MovementBoulderDust: - call EndSpriteMovement - call ._MovementShadow_Grass_Emote_BoulderDust - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_BOULDER_DUST - ld hl, OBJECT_STEP_DURATION - add hl, de - ld a, [hl] - inc a - add a - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld hl, OBJECT_DIRECTION_WALKING - add hl, de - ld a, [hl] - and %00000011 - ld e, a - ld d, 0 - ld hl, .data_4a81 - add hl, de - add hl, de - ld d, [hl] - inc hl - ld e, [hl] - ld hl, OBJECT_SPRITE_X_OFFSET - add hl, bc - ld [hl], d - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], e - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_TRACKING_OBJECT - ret - -.data_4a81 ; 4a81 - ; x, y - db 0, -4 - db 0, 8 - db 6, 2 - db -6, 2 - -.MovementShakingGrass: - call EndSpriteMovement - call ._MovementShadow_Grass_Emote_BoulderDust - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_GRASS_SHAKE - ld hl, OBJECT_STEP_DURATION - add hl, de - ld a, [hl] - add -1 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_TRACKING_OBJECT - ret - -._MovementShadow_Grass_Emote_BoulderDust: - ld hl, OBJECT_RANGE - add hl, bc - ld a, [hl] - push bc - call GetObjectStruct - ld d, b - ld e, c - pop bc - ld hl, OBJECT_1D - add hl, bc - ld [hl], e - inc hl - ld [hl], d - ret - -.MovementScreenShake: - call EndSpriteMovement - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_00 - ld hl, OBJECT_RANGE - add hl, bc - ld a, [hl] - call ._MovementScreenShake - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], e - ld hl, OBJECT_1E - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_15 - ret - -._MovementScreenShake: - ld d, a - and %00111111 - ld e, a - ld a, d - rlca - rlca - and %00000011 - ld d, a - inc d - ld a, 1 -.loop - dec d - ret z - add a - jr .loop - -.RandomWalkContinue: - call InitStep - call Function6ec1 ; check whether the object can move in that direction - jr c, .NewDuration - call UpdateTallGrassFlags - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STEP - ld hl, wCenteredObject - ld a, [hMapObjectIndexBuffer] - cp [hl] - jr z, .load_6 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_07 - ret - -.load_6 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_PLAYER_WALK - ret - -.NewDuration: - call EndSpriteMovement - call Function462a -RandomStepDuration_Slow: ; 4b1d - call Random - ld a, [hRandomAdd] - and %01111111 - jr SetRandomStepDuration -; 4b26 - -RandomStepDuration_Fast: ; 4b26 - call Random - ld a, [hRandomAdd] - and %00011111 -SetRandomStepDuration: ; 4b2d - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_03 - ret -; 4b45 - -StepTypesJumptable: ; 4b45 -; entries correspond to STEP_TYPE_* constants - dw ObjectMovementReset ; 00 - dw MapObjectMovementPattern ; 01 - dw NPCStep ; 02 - dw StepType03 ; 03 - dw StepType04 ; 04 - dw StepType05 ; 05 - dw PlayerStep ; 06 - dw StepType07 ; 07 - dw NPCJump ; 08 - dw PlayerJump ; 09 - dw PlayerOrNPCTurnStep ; 0a - dw StepTypeBump ; 0b - dw TeleportFrom ; 0c - dw TeleportTo ; 0d - dw Skyfall ; 0e - dw StepType0f ; 0f - dw GotBiteStep ; 10 - dw RockSmashStep ; 11 - dw ReturnDigStep ; 12 - dw StepTypeTrackingObject ; 13 - dw StepType14 ; 14 - dw StepType15 ; 15 - dw StepType16 ; 16 - dw StepType17 ; 17 - dw StepType18 ; 18 - dw SkyfallTop ; 19 -; 4b79 - -WaitStep_InPlace: ; 4b79 - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4b86 - -NPCJump: ; 4b86 - call Field1cAnonymousJumptable -; anonymous dw - dw .Jump - dw .Land - -.Jump: - call AddStepVector - call UpdateJumpPosition - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call CopyNextCoordsTileToStandingCoordsTile - call GetNextTile - ld hl, OBJECT_FLAGS2 - add hl, bc - res 3, [hl] - call IncrementObjectStructField1c - ret - -.Land: - call AddStepVector - call UpdateJumpPosition - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call CopyNextCoordsTileToStandingCoordsTile - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4bbf - -PlayerJump: ; 4bbf - call Field1cAnonymousJumptable -; anonymous dw - dw .initjump - dw .stepjump - dw .initland - dw .stepland - -.initjump - ld hl, wPlayerStepFlags - set 7, [hl] - call IncrementObjectStructField1c -.stepjump - call UpdateJumpPosition - call UpdatePlayerStep - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call CopyNextCoordsTileToStandingCoordsTile - ld hl, OBJECT_FLAGS2 - add hl, bc - res 3, [hl] - ld hl, wPlayerStepFlags - set 6, [hl] - set 4, [hl] - call IncrementObjectStructField1c - ret - -.initland - call GetNextTile - ld hl, wPlayerStepFlags - set 7, [hl] - call IncrementObjectStructField1c -.stepland - call UpdateJumpPosition - call UpdatePlayerStep - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, wPlayerStepFlags - set 6, [hl] - call CopyNextCoordsTileToStandingCoordsTile - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4c18 - -TeleportFrom: ; 4c18 - call Field1cAnonymousJumptable -; anonymous dw - dw .InitSpin - dw .DoSpin - dw .InitSpinRise - dw .DoSpinRise -; 4c23 - -.InitSpin: - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 16 - call IncrementObjectStructField1c -.DoSpin: - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_SPIN - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call IncrementObjectStructField1c - ret - -.InitSpinRise: - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], 0 - ld hl, OBJECT_1F - add hl, bc - ld [hl], $10 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 16 - ld hl, OBJECT_FLAGS2 - add hl, bc - res 3, [hl] - call IncrementObjectStructField1c -.DoSpinRise: - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_SPIN - ld hl, OBJECT_1F - add hl, bc - inc [hl] - ld a, [hl] - ld d, $60 - call Sine - ld a, h - sub $60 - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4c89 - -TeleportTo: ; 4c89 - call Field1cAnonymousJumptable -; anonymous dw - dw .InitWait - dw .DoWait - dw .InitDescent - dw .DoDescent - dw .InitFinalSpin - dw .DoFinalSpin - dw .FinishStep -; 4c9a - -.InitWait: - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_00 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 16 - call IncrementObjectStructField1c - ret -; 4caa - -.DoWait: - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call IncrementObjectStructField1c -.InitDescent: - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], 0 - ld hl, OBJECT_1F - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 16 - call IncrementObjectStructField1c - ret -; 4cc9 - -.DoDescent: - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_SPIN - ld hl, OBJECT_1F - add hl, bc - inc [hl] - ld a, [hl] - ld d, $60 - call Sine - ld a, h - sub $60 - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call IncrementObjectStructField1c -.InitFinalSpin: - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 16 - call IncrementObjectStructField1c - ret -; 4cf5 - -.DoFinalSpin: - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_SPIN - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz -.FinishStep: - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], 0 - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4d14 - -Skyfall: ; 4d14 - call Field1cAnonymousJumptable -; anonymous dw - dw .Init - dw .Step - dw .Fall - dw .Finish -; 4d1f - -.Init: - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_00 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 16 - call IncrementObjectStructField1c -.Step: - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STEP - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], 0 - ld hl, OBJECT_1F - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 16 - call IncrementObjectStructField1c -.Fall: - ld hl, OBJECT_1F - add hl, bc - inc [hl] - ld a, [hl] - ld d, $60 - call Sine - ld a, h - sub $60 - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call IncrementObjectStructField1c -.Finish: - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], 0 - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4d7e - -GotBiteStep: ; 4d7e - call Field1cAnonymousJumptable -; anonymous dw - dw .Init - dw .Run -; 4d85 - -.Init: - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 8 - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], 0 - call IncrementObjectStructField1c -.Run: - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld a, [hl] - xor 1 - ld [hl], a - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4daf - -RockSmashStep: ; 4daf - call .Step - jp WaitStep_InPlace -; 4db5 - -.Step: - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld a, [hl] - and %00000001 - ld a, OBJECT_ACTION_STAND - jr z, .yes - ld a, OBJECT_ACTION_00 -.yes - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], a - ret -; 4dc8 - -ReturnDigStep: ; 4dc8 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld a, [hl] - and %00000001 - ld a, OBJECT_ACTION_SPIN - jr z, .yes - ld a, OBJECT_ACTION_SPIN_FLICKER -.yes - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], a - jp WaitStep_InPlace -; 4ddd - -StepType03: ; 4ddd - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4df0 - -StepType18: ; 4df0 - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - jp DeleteMapObject -; 4dff - -StepTypeBump: ; 4dff - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4e0c - -StepType05: ; 4e0c - call Field1cAnonymousJumptable -; anonymous dw - dw .Reset - dw StepType04 - -.Reset: - call RestoreDefaultMovement - call GetInitialFacing - ld hl, OBJECT_FACING - add hl, bc - ld [hl], a - call IncrementObjectStructField1c -StepType04: ; 4e21 - call Stubbed_Function4fb2 - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret -; 4e2b - -NPCStep: ; 4e2b - call Stubbed_Function4fb2 - call AddStepVector - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call CopyNextCoordsTileToStandingCoordsTile - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4e47 - -StepType07: ; 4e47 - call AddStepVector - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call CopyNextCoordsTileToStandingCoordsTile - jp RandomStepDuration_Slow -; 4e56 - -PlayerStep: ; 4e56 -; AnimateStep? - call Field1cAnonymousJumptable -; anonymous dw - dw .init - dw .step - -.init - ld hl, wPlayerStepFlags - set 7, [hl] - call IncrementObjectStructField1c -.step - call UpdatePlayerStep - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, wPlayerStepFlags - set 6, [hl] - call CopyNextCoordsTileToStandingCoordsTile - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4e83 - -PlayerOrNPCTurnStep: ; 4e83 - call Field1cAnonymousJumptable -; anonymous dw - dw .init1 - dw .step1 - dw .init2 - dw .step2 - -.init1 - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld a, [hl] - ld [hl], 2 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 2 - call IncrementObjectStructField1c -.step1 - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - call IncrementObjectStructField1c -.init2 - ld hl, OBJECT_1D ; new facing - add hl, bc - ld a, [hl] - ld hl, OBJECT_FACING - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 2 - call IncrementObjectStructField1c -.step2 - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4ecd - -StepType0f: ; 4ecd - call AddStepVector - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - push bc - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - ld hl, OBJECT_MAP_OBJECT_INDEX - add hl, bc - ld a, [hl] - ld b, a - farcall CopyDECoordsToMapObject - pop bc - ld hl, OBJECT_FLAGS2 - add hl, bc - res 2, [hl] - call CopyNextCoordsTileToStandingCoordsTile - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4f04 - -StepTypeTrackingObject: ; 4f04 - ld hl, OBJECT_1D - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - ld hl, OBJECT_SPRITE - add hl, de - ld a, [hl] - and a - jr z, .nope - ld hl, OBJECT_SPRITE_X - add hl, de - ld a, [hl] - ld hl, OBJECT_SPRITE_X - add hl, bc - ld [hl], a - ld hl, OBJECT_SPRITE_Y - add hl, de - ld a, [hl] - ld hl, OBJECT_SPRITE_Y - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld a, [hl] - and a - ret z - dec [hl] - ret nz -.nope - jp DeleteMapObject -; 4f33 - -StepType14: ; 4f33 -StepType15: ; 4f33 - call Field1cAnonymousJumptable -; anonymous dw - dw .Init - dw .Run - -.Init: - xor a - ld hl, OBJECT_1D - add hl, bc - ld [hl], a - call IncrementObjectStructField1c -.Run: - ld hl, OBJECT_1D - add hl, bc - ld d, [hl] - ld a, [wPlayerStepVectorY] - sub d - ld [wPlayerStepVectorY], a - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - jr z, .ok - ld a, [hl] - call .GetSign - ld hl, OBJECT_1D - add hl, bc - ld [hl], a - ld d, a - ld a, [wPlayerStepVectorY] - add d - ld [wPlayerStepVectorY], a - ret - -.ok - call DeleteMapObject - ret - -.GetSign: - ld hl, OBJECT_1E - add hl, bc - and 1 - ld a, [hl] - ret z - cpl - inc a - ret -; 4f77 - -StepType16: ; 4f77 - call Field1cAnonymousJumptable ; ???? -; 4f7a -StepType17: ; 4f7a - call Field1cAnonymousJumptable -; anonymous dw - dw .null - dw .null - dw .null -.null -; 4f83 - -SkyfallTop: ; 4f83 - call Field1cAnonymousJumptable -; anonymous dw - dw .Init - dw .Run - -.Init: - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_SKYFALL - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], 16 - call IncrementObjectStructField1c - -.Run: - ld hl, OBJECT_STEP_DURATION - add hl, bc - dec [hl] - ret nz - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], $60 - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], 0 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 4fb2 - -Stubbed_Function4fb2: - ret - ld hl, OBJECT_1D - add hl, bc - inc [hl] - ld a, [hl] - srl a - srl a - and %00000111 - ld l, a - ld h, 0 - ld de, .y - add hl, de - ld a, [hl] - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], a - ret - -.y ; 4fcd - db 0, -1, -2, -3, -4, -3, -2, -1 -; 4fd5 -UpdateJumpPosition: ; 4fd5 - call GetStepVector - ld a, h - ld hl, OBJECT_1F - add hl, bc - ld e, [hl] - add e - ld [hl], a - nop - srl e - ld d, 0 - ld hl, .y - add hl, de - ld a, [hl] - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld [hl], a - ret - -.y ; 4ff0 - db -4, -6, -8, -10, -11, -12, -12, -12 - db -11, -10, -9, -8, -6, -4, 0, 0 -; 5000 -Function5000: ; unscripted? -; copy [wPlayerNextMovement] to [wPlayerMovement] - ld a, [wPlayerNextMovement] - ld hl, wPlayerMovement - ld [hl], a -; load [wPlayerNextMovement] with movement_step_sleep - ld a, movement_step_sleep - ld [wPlayerNextMovement], a -; recover the previous value of [wPlayerNextMovement] - ld a, [hl] - ret -; 500e - -GetMovementByte: - ld hl, wMovementDataPointer - call _GetMovementByte - ret -; 5015 - -Function5015: ; 5015 - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - ld e, [hl] - inc [hl] - ld d, 0 - ld hl, wc2e2 - ld a, [hli] - ld h, [hl] - ld l, a - add hl, de - ld a, [hl] - ret -; 5026 - -Function5026: ; 5026 - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - ld e, [hl] - inc [hl] - ld d, 0 - ld hl, wc2e6 - ld a, [hli] - ld h, [hl] - ld l, a - add hl, de - ld a, [hl] - ret -; 5037 - -_GetMovementObject: ; 5037 - ld hl, GetMovementObject - jp HandleMovementData -; 503d - -GetMovementObject: ; 503d - ld a, [wMovementObject] - ret -; 5041 - -HandleMovementData: ; 5041 - call .StorePointer -.loop - xor a - ld [wMovementByteWasControlSwitch], a - call JumpMovementPointer - call DoMovementFunction - ld a, [wMovementByteWasControlSwitch] - and a - jr nz, .loop - ret - -.StorePointer: - ld a, l - ld [wMovementPointer], a - ld a, h - ld [wMovementPointer + 1], a - ret -; 505e - -JumpMovementPointer: ; 505e - ld hl, wMovementPointer - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 5065 - -ContinueReadingMovement: ; 5065 - ld a, 1 - ld [wMovementByteWasControlSwitch], a - ret -; 506b - -DoMovementFunction: ; 506b - push af - call ApplyMovementToFollower - pop af - ld hl, MovementPointers - rst JumpTable - ret -; 5075 - -INCLUDE "engine/movement.asm" -; 54b8 - -ApplyMovementToFollower: ; 54b8 - ld e, a - ld a, [wObjectFollow_Follower] - cp -1 - ret z - ld a, [wObjectFollow_Leader] - ld d, a - ld a, [hMapObjectIndexBuffer] - cp d - ret nz - ld a, e - cp movement_step_sleep - ret z - cp movement_step_end - ret z - cp movement_step_4b - ret z - cp movement_step_bump - ret z - cp movement_slow_step - ret c - push af - ld hl, wFollowerMovementQueueLength - inc [hl] - ld e, [hl] - ld d, 0 - ld hl, wFollowMovementQueue - add hl, de - pop af - ld [hl], a - ret -; 54e6 - -GetFollowerNextMovementByte: ; 54e6 - ld hl, wFollowerMovementQueueLength - ld a, [hl] - and a - jr z, .done - cp -1 - jr z, .done - dec [hl] - ld e, a - ld d, 0 - ld hl, wFollowMovementQueue - add hl, de - inc e - ld a, -1 -.loop - ld d, [hl] - ld [hld], a - ld a, d - dec e - jr nz, .loop - ret - -.done - call .CancelFollowIfLeaderMissing - ret c - ld a, movement_step_sleep - ret - -.CancelFollowIfLeaderMissing: - ld a, [wObjectFollow_Leader] - cp -1 - jr z, .nope - push bc - call GetObjectStruct - ld hl, OBJECT_SPRITE - add hl, bc - ld a, [hl] - pop bc - and a - jr z, .nope - and a - ret - -.nope - ld a, -1 - ld [wObjectFollow_Follower], a - ld a, movement_step_end - scf - ret -; 5529 - -SpawnShadow: ; 5529 - push bc - ld de, .ShadowObject - call CopyTempObjectData - call InitTempObject - pop bc - ret - -.ShadowObject: - ; vtile, palette, movement - db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SHADOW -; 5538 - -SpawnStrengthBoulderDust: ; 5538 - push bc - ld de, .BoulderDustObject - call CopyTempObjectData - call InitTempObject - pop bc - ret - -.BoulderDustObject: - db $00, PAL_OW_SILVER, SPRITEMOVEDATA_BOULDERDUST -; 5547 - -SpawnEmote: ; 5547 - push bc - ld de, .EmoteObject - call CopyTempObjectData - call InitTempObject - pop bc - ret - -.EmoteObject: - db $00, PAL_OW_SILVER, SPRITEMOVEDATA_EMOTE -; 5556 - -ShakeGrass: ; 5556 - push bc - ld de, .data_5562 - call CopyTempObjectData - call InitTempObject - pop bc - ret - -.data_5562 - db $00, PAL_OW_TREE, SPRITEMOVEDATA_GRASS -; 5565 - -ShakeScreen: ; 5565 - push bc - push af - ld de, .ScreenShakeObject - call CopyTempObjectData - pop af - ld [wTempObjectCopyRange], a - call InitTempObject - pop bc - ret - -.ScreenShakeObject: - db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SCREENSHAKE -; 5579 -DespawnEmote: ; 5579 - push bc - ld a, [hMapObjectIndexBuffer] - ld c, a - call .DeleteEmote - pop bc - ret - -.DeleteEmote: - ld de, wObjectStructs - ld a, NUM_OBJECT_STRUCTS -.loop - push af - ld hl, OBJECT_FLAGS1 - add hl, de - bit EMOTE_OBJECT, [hl] - jr z, .next - ld hl, OBJECT_SPRITE - add hl, de - ld a, [hl] - and a - jr z, .next - push bc - xor a - ld bc, OBJECT_STRUCT_LENGTH - call ByteFill - pop bc -.next - ld hl, OBJECT_STRUCT_LENGTH - add hl, de - ld d, h - ld e, l - pop af - dec a - jr nz, .loop - ret -; 55ac - -InitTempObject: ; 55ac - call FindFirstEmptyObjectStruct - ret nc - ld d, h - ld e, l - farcall CopyTempObjectToObjectStruct - ret -; 55b9 - -CopyTempObjectData: ; 55b9 -; load into wTempObjectCopy: -; -1, -1, [de], [de + 1], [de + 2], [hMapObjectIndexBuffer], [NextMapX], [NextMapY], -1 -; This spawns the object at the same place as whichever object is loaded into bc. - ld hl, wTempObjectCopyMapObjectIndex - ld [hl], -1 - inc hl - ld [hl], -1 - inc hl - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - ld [hli], a - ld a, [hMapObjectIndexBuffer] - ld [hli], a - push hl - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - pop hl - ld [hl], d - inc hl - ld [hl], e - inc hl - ld [hl], -1 - ret -; 55e0 - -Function55e0:: ; 55e0 - ld a, [wVramState] - bit 0, a - ret z - ld bc, wObjectStructs - xor a -.loop - ld [hMapObjectIndexBuffer], a - call DoesObjectHaveASprite - jr z, .ok - call Function565c -.ok - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - ld a, [hMapObjectIndexBuffer] - inc a - cp NUM_OBJECT_STRUCTS - jr nz, .loop - ret -; 5602 - -Function5602: ; 5602, called at battle start - call Function5645 ; clear sprites - ld a, PLAYER - call Function5629 ; respawn player - ld a, [wBattleScriptFlags] - bit 7, a - jr z, .ok - ld a, [hLastTalked] - and a - jr z, .ok - call Function5629 ; respawn opponent -.ok - call _UpdateSprites - ret -; 561d - -Function561d: ; 561d - call Function5645 ; clear sprites - ld a, PLAYER - call Function5629 ; respawn player - call _UpdateSprites - ret -; 5629 - -Function5629: ; 5629 - cp NUM_OBJECTS - ret nc - call GetMapObject - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld a, [hl] - cp -1 - ret z - cp NUM_OBJECT_STRUCTS - ret nc - call GetObjectStruct - call DoesObjectHaveASprite - ret z - call Function5673 - ret -; 5645 - -Function5645: ; 5645 - xor a - ld bc, wObjectStructs -.loop - ld [hMapObjectIndexBuffer], a - call SetFacing_Standing - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - ld a, [hMapObjectIndexBuffer] - inc a - cp NUM_OBJECT_STRUCTS - jr nz, .loop - ret -; 565c - -Function565c: ; 565c - push bc - call Function56cd - pop bc - jr c, SetFacing_Standing - call Function56a3 - jr c, SetFacing_Standing - call Function5688 - farcall Function4440 - xor a - ret -; 5673 - -Function5673: ; 5673 - call Function56a3 - jr c, SetFacing_Standing - farcall Function4440 ; no need to farcall - xor a - ret -; 5680 - -SetFacing_Standing: ; 5680 - ld hl, OBJECT_FACING_STEP - add hl, bc - ld [hl], STANDING - scf - ret -; 5688 - -Function5688: ; 5688 - push bc - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - call GetCoordTile - pop bc - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld [hl], a - farcall UpdateTallGrassFlags ; no need to farcall - ret -; 56a3 - -Function56a3: ; 56a3 - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - inc d - inc e - ld a, [wXCoord] - cp d - jr z, .equal_x - jr nc, .nope - add MAPOBJECT_SCREEN_WIDTH - 1 - cp d - jr c, .nope -.equal_x - ld a, [wYCoord] - cp e - jr z, .equal_y - jr nc, .nope - add MAPOBJECT_SCREEN_HEIGHT - 1 - cp e - jr c, .nope -.equal_y - xor a - ret - -.nope - scf - ret -; 56cd - -Function56cd: ; 56cd - ld a, [wPlayerBGMapOffsetX] - ld d, a - ld hl, OBJECT_SPRITE_X_OFFSET - add hl, bc - ld a, [hl] - ld hl, OBJECT_SPRITE_X - add hl, bc - add [hl] - add d - cp $f0 - jr nc, .ok1 - cp $a0 - jp nc, .nope -.ok1 - and %00000111 - ld d, 2 - cp 4 - jr c, .ok2 - ld d, 3 -.ok2 - ld a, [hl] - srl a - srl a - srl a - cp SCREEN_WIDTH - jr c, .ok3 - sub BG_MAP_WIDTH -.ok3 - ld [hUsedSpriteIndex], a - ld a, [wPlayerBGMapOffsetY] - ld e, a - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - ld a, [hl] - ld hl, OBJECT_SPRITE_Y - add hl, bc - add [hl] - add e - cp $f0 - jr nc, .ok4 - cp $90 - jr nc, .nope -.ok4 - and %00000111 - ld e, 2 - cp 4 - jr c, .ok5 - ld e, 3 -.ok5 - ld a, [hl] - srl a - srl a - srl a - cp SCREEN_HEIGHT - jr c, .ok6 - sub BG_MAP_HEIGHT -.ok6 - ld [hUsedSpriteTile], a - ld hl, OBJECT_PALETTE - add hl, bc - bit 7, [hl] - jr z, .ok7 - ld a, d - add 2 - ld d, a - ld a, e - add 2 - ld e, a -.ok7 - ld a, d - ld [hFFBF], a -.loop - ld a, [hFFBF] - ld d, a - ld a, [hUsedSpriteTile] - add e - dec a - cp SCREEN_HEIGHT - jr nc, .ok9 - ld b, a -.next - ld a, [hUsedSpriteIndex] - add d - dec a - cp SCREEN_WIDTH - jr nc, .ok8 - ld c, a - push bc - call Coord2Tile - pop bc -; NPCs disappear if standing on tile $60-$7f (or $e0-$ff), -; since those IDs are for text characters and textbox frames. - ld a, [hl] - cp FIRST_REGULAR_TEXT_CHAR - jr nc, .nope -.ok8 - dec d - jr nz, .next -.ok9 - dec e - jr nz, .loop - and a - ret - -.nope - scf - ret -; 576a - -HandleNPCStep:: ; 576a - call .ResetStepVector - call .DoStepsForAllObjects - ret - -.ResetStepVector: - xor a - ld [wPlayerStepVectorX], a - ld [wPlayerStepVectorY], a - ld [wPlayerStepFlags], a - ld a, -1 - ld [wPlayerStepDirection], a - ret - -.DoStepsForAllObjects: - ld bc, wObjectStructs - xor a -.loop - ld [hMapObjectIndexBuffer], a - call DoesObjectHaveASprite - jr z, .next - call Function437b -.next - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - ld a, [hMapObjectIndexBuffer] - inc a - cp NUM_OBJECT_STRUCTS - jr nz, .loop - ret -; 579d - -RefreshPlayerSprite: ; 579d - ld a, movement_step_sleep - ld [wPlayerNextMovement], a - ld [wPlayerMovement], a - xor a - ld [wPlayerTurningDirection], a - ld [wPlayerObjectStepFrame], a - call .TryResetPlayerAction - farcall CheckWarpFacingDown - call c, SpawnInFacingDown - call .SpawnInCustomFacing - ret -; 57bc - -.TryResetPlayerAction: ; 57bc - ld hl, wPlayerSpriteSetupFlags - bit PLAYERSPRITESETUP_RESET_ACTION_F, [hl] - jr nz, .ok - ret - -.ok - ld a, OBJECT_ACTION_00 - ld [wPlayerAction], a - ret -; 57ca - -.SpawnInCustomFacing: ; 57ca - ld hl, wPlayerSpriteSetupFlags - bit PLAYERSPRITESETUP_CUSTOM_FACING_F, [hl] - ret z - ld a, [wPlayerSpriteSetupFlags] - and PLAYERSPRITESETUP_FACING_MASK - add a - add a - jr ContinueSpawnFacing -; 57d9 - -SpawnInFacingDown: ; 57d9 - ld a, 0 -ContinueSpawnFacing: ; 57db - ld bc, wPlayerStruct - call SetSpriteDirection - ret -; 57e2 - -_SetPlayerPalette: ; 57e2 - ld a, d - and %10000000 - ret z - ld bc, 0 ; debug? - ld hl, OBJECT_FACING - add hl, bc - ld a, [hl] - or d - ld [hl], a - ld a, d - swap a - and %00000111 - ld d, a - ld bc, wPlayerStruct - ld hl, OBJECT_PALETTE - add hl, bc - ld a, [hl] - and %11111000 - or d - ld [hl], a - ret -; 5803 - -StartFollow:: ; 5803 - push bc - ld a, b - call SetLeaderIfVisible - pop bc - ret c - ld a, c - call SetFollowerIfVisible - farcall QueueFollowerFirstStep - ret -; 5815 - -SetLeaderIfVisible: ; 5815 - call CheckObjectVisibility - ret c - ld a, [hObjectStructIndexBuffer] - ld [wObjectFollow_Leader], a - ret -; 581f - -StopFollow:: ; 581f - call ResetLeader - call ResetFollower - ret -; 5826 - -ResetLeader: ; 5826 - ld a, -1 - ld [wObjectFollow_Leader], a - ret -; 582c - -SetFollowerIfVisible: ; 582c - push af - call ResetFollower - pop af - call CheckObjectVisibility - ret c - ld hl, OBJECT_MOVEMENTTYPE - add hl, bc - ld [hl], SPRITEMOVEDATA_FOLLOWING - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_00 - ld a, [hObjectStructIndexBuffer] - ld [wObjectFollow_Follower], a - ret -; 5847 - -ResetFollower: ; 5847 - ld a, [wObjectFollow_Follower] - cp -1 - ret z - call GetObjectStruct - farcall Function58e3 ; no need to bankswitch - ld a, -1 - ld [wObjectFollow_Follower], a - ret -; 585c - -SetFlagsForMovement_1:: ; 585c - ld a, c - call CheckObjectVisibility - ret c - push bc - call Function587a - pop bc - ld hl, OBJECT_FLAGS2 - add hl, bc - res 5, [hl] - xor a - ret -; 586e - -Function586e: ; 586e - call CheckObjectVisibility - ret c - ld hl, OBJECT_FLAGS2 - add hl, bc - set 5, [hl] - xor a - ret -; 587a - -Function587a: ; 587a - ld bc, wObjectStructs - xor a -.loop - push af - call DoesObjectHaveASprite - jr z, .next - ld hl, OBJECT_FLAGS2 - add hl, bc - set 5, [hl] -.next - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - pop af - inc a - cp NUM_OBJECT_STRUCTS - jr nz, .loop - ret -; 5897 - -_SetFlagsForMovement_2:: ; 5897 - ld a, [wObjectFollow_Leader] - cp -1 - ret z - push bc - call GetObjectStruct - ld hl, OBJECT_MAP_OBJECT_INDEX - add hl, bc - ld a, [hl] - pop bc - cp c - ret nz - ld a, [wObjectFollow_Follower] - cp -1 - ret z - call GetObjectStruct - ld hl, OBJECT_FLAGS2 - add hl, bc - res 5, [hl] - ret -; 58b9 - -Function58b9:: ; 58b9 - push bc - ld bc, wObjectStructs - xor a -.loop - push af - call DoesObjectHaveASprite - jr z, .next - ld hl, OBJECT_FLAGS2 - add hl, bc - res 5, [hl] -.next - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - pop af - inc a - cp NUM_OBJECT_STRUCTS - jr nz, .loop - pop bc - ret -; 58d8 - -Function58d8: ; 58d8 - call CheckObjectVisibility - ret c - ld hl, OBJECT_FLAGS2 - add hl, bc - res 5, [hl] - ret -; 58e3 - -Function58e3: ; 58e3 - ld hl, OBJECT_MAP_OBJECT_INDEX - add hl, bc - ld a, [hl] - cp -1 - jp z, Function5903 ; a jr would have been appropriate here - push bc - call GetMapObject - ld hl, MAPOBJECT_MOVEMENT - add hl, bc - ld a, [hl] - pop bc - ld hl, OBJECT_MOVEMENTTYPE - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_00 - ret -; 5903 - -Function5903: ; 5903 - call GetSpriteDirection - rrca - rrca - ld e, a - ld d, 0 - ld hl, .standing_movefns - add hl, de - ld a, [hl] - ld hl, OBJECT_MOVEMENTTYPE - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_00 - ret - -.standing_movefns - db SPRITEMOVEDATA_STANDING_DOWN - db SPRITEMOVEDATA_STANDING_UP - db SPRITEMOVEDATA_STANDING_LEFT - db SPRITEMOVEDATA_STANDING_RIGHT -; 5920 - -_UpdateSprites:: ; 5920 - ld a, [wVramState] - bit 0, a - ret z - xor a - ld [hUsedSpriteIndex], a - ld a, [hOAMUpdate] - push af - ld a, 1 - ld [hOAMUpdate], a - call InitSprites - call .fill - pop af - ld [hOAMUpdate], a - ret - -.fill - ld a, [wVramState] - bit 1, a - ld b, LOW(wVirtualOAMEnd) - jr z, .ok - ld b, 28 * SPRITEOAMSTRUCT_LENGTH -.ok - ld a, [hUsedSpriteIndex] - cp b - ret nc - ld l, a - ld h, HIGH(wVirtualOAM) - ld de, SPRITEOAMSTRUCT_LENGTH - ld a, b - ld c, SCREEN_HEIGHT_PX + 2 * TILE_WIDTH -.loop - ld [hl], c ; y - add hl, de - cp l - jr nz, .loop - ret -; 5958 - -ApplyBGMapAnchorToObjects: ; 5958 - push hl - push de - push bc - ld a, [wPlayerBGMapOffsetX] - ld d, a - ld a, [wPlayerBGMapOffsetY] - ld e, a - ld bc, wObjectStructs - ld a, NUM_OBJECT_STRUCTS -.loop - push af - call DoesObjectHaveASprite - jr z, .skip - ld hl, OBJECT_SPRITE_X - add hl, bc - ld a, [hl] - add d - ld [hl], a - ld hl, OBJECT_SPRITE_Y - add hl, bc - ld a, [hl] - add e - ld [hl], a -.skip - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - pop af - dec a - jr nz, .loop - xor a - ld [wPlayerBGMapOffsetX], a - ld [wPlayerBGMapOffsetY], a - pop bc - pop de - pop hl - ret -; 5991 - - -PRIORITY_LOW EQU $10 -PRIORITY_NORM EQU $20 -PRIORITY_HIGH EQU $30 - -InitSprites: ; 5991 - call .DeterminePriorities - ld c, PRIORITY_HIGH - call .InitSpritesByPriority - ld c, PRIORITY_NORM - call .InitSpritesByPriority - ld c, PRIORITY_LOW - call .InitSpritesByPriority - ret - -.DeterminePriorities: - xor a - ld hl, wMovementPointer - ld bc, NUM_OBJECT_STRUCTS - call ByteFill - ld d, 0 - ld bc, wObjectStructs - ld hl, wMovementPointer -.loop - push hl - call DoesObjectHaveASprite - jr z, .skip - ld hl, OBJECT_FACING_STEP - add hl, bc - ld a, [hl] - cp STANDING - jr z, .skip -; Define the sprite priority. - ld e, PRIORITY_LOW - ld hl, OBJECT_FLAGS2 - add hl, bc - bit LOW_PRIORITY, [hl] - jr nz, .add - ld e, PRIORITY_NORM - bit HIGH_PRIORITY, [hl] - jr z, .add - ld e, PRIORITY_HIGH - jr .add - -.skip - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - pop hl - jr .next - -.add - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - pop hl - ld a, d - or e - ld [hli], a -.next - inc d - ld a, d - cp NUM_OBJECT_STRUCTS - jr nz, .loop - ret - -.InitSpritesByPriority: - ld hl, wMovementPointer -.next_sprite - ld a, [hli] - ld d, a - and $f0 - ret z - cp c - jr nz, .next_sprite - push bc - push hl - ld a, d - and $f - call .GetObjectStructPointer - call .InitSprite - pop hl - pop bc - jr .next_sprite - -.InitSprite: - ld hl, OBJECT_SPRITE_TILE - add hl, bc - ld a, [hl] - and %01111111 - ld [hFFC1], a - xor a - bit 7, [hl] - jr nz, .skip1 - or %00001000 -.skip1 - ld hl, OBJECT_FLAGS2 - add hl, bc - ld e, [hl] - bit 7, e - jr z, .skip2 - or %10000000 -.skip2 - bit 4, e - jr z, .skip3 - or %00010000 -.skip3 - ld hl, OBJECT_PALETTE - add hl, bc - ld d, a - ld a, [hl] - and %00000111 - or d - ld d, a - xor a - bit 3, e - jr z, .skip4 - or %10000000 -.skip4 - ld [hFFC2], a - ld hl, OBJECT_SPRITE_X - add hl, bc - ld a, [hl] - ld hl, OBJECT_SPRITE_X_OFFSET - add hl, bc - add [hl] - add 8 - ld e, a - ld a, [wPlayerBGMapOffsetX] - add e - ld [hFFBF], a - ld hl, OBJECT_SPRITE_Y - add hl, bc - ld a, [hl] - ld hl, OBJECT_SPRITE_Y_OFFSET - add hl, bc - add [hl] - add 12 - ld e, a - ld a, [wPlayerBGMapOffsetY] - add e - ld [hFFC0], a - ld hl, OBJECT_FACING_STEP - add hl, bc - ld a, [hl] - cp STANDING - jp z, .done - cp NUM_FACINGS - jp nc, .done - ld l, a - ld h, 0 - add hl, hl - ld bc, Facings - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [hUsedSpriteIndex] - ld c, a - ld b, HIGH(wVirtualOAM) - ld a, [hli] - ld [hUsedSpriteTile], a - add c - cp LOW(wVirtualOAMEnd) - jr nc, .full -.addsprite - ld a, [hFFC0] - add [hl] - inc hl - ld [bc], a ; y - inc c - ld a, [hFFBF] - add [hl] - inc hl - ld [bc], a ; x - inc c - ld e, [hl] - inc hl - ld a, [hFFC1] - bit 2, e - jr z, .nope1 - xor a -.nope1 - add [hl] - inc hl - ld [bc], a ; tile id - inc c - ld a, e - bit 1, a - jr z, .nope2 - ld a, [hFFC2] - or e -.nope2 - and OBP_NUM | X_FLIP | Y_FLIP | PRIORITY - or d - ld [bc], a ; attributes - inc c - ld a, [hUsedSpriteTile] - dec a - ld [hUsedSpriteTile], a - jr nz, .addsprite - ld a, c - ld [hUsedSpriteIndex], a -.done - xor a - ret - -.full - scf - ret - -.GetObjectStructPointer: - ld c, a - ld b, 0 - ld hl, .Addresses - add hl, bc - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - ret - -.Addresses: ; 5ace - dw wPlayerStruct - dw wObject1Struct - dw wObject2Struct - dw wObject3Struct - dw wObject4Struct - dw wObject5Struct - dw wObject6Struct - dw wObject7Struct - dw wObject8Struct - dw wObject9Struct - dw wObject10Struct - dw wObject11Struct - dw wObject12Struct -; 5ae8 diff --git a/engine/map_objects_2.asm b/engine/map_objects_2.asm deleted file mode 100644 index 038e2b49b..000000000 --- a/engine/map_objects_2.asm +++ /dev/null @@ -1,70 +0,0 @@ -LoadObjectMasks: ; 2454f - ld hl, wObjectMasks - xor a - ld bc, NUM_OBJECTS - call ByteFill - nop - ld bc, wMapObjects - ld de, wObjectMasks - xor a -.loop - push af - push bc - push de - call GetObjectTimeMask - jr c, .next - call CheckObjectFlag -.next - pop de - ld [de], a - inc de - pop bc - ld hl, OBJECT_LENGTH - add hl, bc - ld b, h - ld c, l - pop af - inc a - cp NUM_OBJECTS - jr nz, .loop - ret - -CheckObjectFlag: ; 2457d (9:457d) - ld hl, MAPOBJECT_SPRITE - add hl, bc - ld a, [hl] - and a - jr z, .masked - ld hl, MAPOBJECT_EVENT_FLAG - add hl, bc - ld a, [hli] - ld e, a - ld a, [hl] - ld d, a - cp -1 - jr nz, .check - ld a, e - cp -1 - jr z, .unmasked - jr .masked -.check - ld b, CHECK_FLAG - call EventFlagAction - ld a, c - and a - jr nz, .masked -.unmasked - xor a - ret - -.masked - ld a, -1 - scf - ret - -GetObjectTimeMask: ; 245a7 (9:45a7) - call CheckObjectTime - ld a, -1 - ret c - xor a - ret diff --git a/engine/map_palettes.asm b/engine/map_palettes.asm deleted file mode 100644 index a9d2b382f..000000000 --- a/engine/map_palettes.asm +++ /dev/null @@ -1,86 +0,0 @@ -SwapTextboxPalettes:: ; 4c000 - hlcoord 0, 0 - decoord 0, 0, wAttrMap - ld b, SCREEN_HEIGHT -.loop - push bc - ld c, SCREEN_WIDTH -.innerloop - ld a, [hl] - push hl - srl a - jr c, .UpperNybble - ld hl, wTilesetPalettes - add [hl] - ld l, a - ld a, [wTilesetPalettes + 1] - adc 0 - ld h, a - ld a, [hl] - and $f - jr .next - -.UpperNybble: - ld hl, wTilesetPalettes - add [hl] - ld l, a - ld a, [wTilesetPalettes + 1] - adc 0 - ld h, a - ld a, [hl] - swap a - and $f - -.next - pop hl - ld [de], a - res 7, [hl] - inc hl - inc de - dec c - jr nz, .innerloop - pop bc - dec b - jr nz, .loop - ret - -ScrollBGMapPalettes:: ; 4c03f - ld hl, wBGMapBuffer - ld de, wBGMapPalBuffer -.loop - ld a, [hl] - push hl - srl a - jr c, .UpperNybble - -; .LowerNybble - ld hl, wTilesetPalettes - add [hl] - ld l, a - ld a, [wTilesetPalettes + 1] - adc 0 - ld h, a - ld a, [hl] - and $f - jr .next - -.UpperNybble: - ld hl, wTilesetPalettes - add [hl] - ld l, a - ld a, [wTilesetPalettes + 1] - adc 0 - ld h, a - ld a, [hl] - swap a - and $f - -.next - pop hl - ld [de], a - res 7, [hl] - inc hl - inc de - dec c - jr nz, .loop - ret diff --git a/engine/map_setup.asm b/engine/map_setup.asm deleted file mode 100644 index 268574de0..000000000 --- a/engine/map_setup.asm +++ /dev/null @@ -1,260 +0,0 @@ -RunMapSetupScript:: ; 15363 - ld a, [hMapEntryMethod] - and $f - dec a - ld c, a - ld b, 0 - ld hl, MapSetupScripts - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - call ReadMapSetupScript - ret -; 15377 - -INCLUDE "data/maps/setup_scripts.asm" - -ReadMapSetupScript: ; 1541d -.loop - ld a, [hli] - cp -1 - ret z - - push hl - - ld c, a - ld b, 0 - ld hl, MapSetupCommands - add hl, bc - add hl, bc - add hl, bc - - ; bank - ld b, [hl] - inc hl - - ; address - ld a, [hli] - ld h, [hl] - ld l, a - - ; Bit 7 of the bank indicates a parameter. - ; This is left unused. - bit 7, b - jr z, .go - - pop de - ld a, [de] - ld c, a - inc de - push de - -.go - ld a, b - and $7f - rst FarCall - - pop hl - jr .loop -; 15440 - -MapSetupCommands: ; 15440 -; entries correspond to command indexes in constants/map_setup_constants.asm - dba EnableLCD ; 00 - dba DisableLCD ; 01 - dba MapSetup_Sound_Off ; 02 - dba PlayMapMusic ; 03 - dba RestartMapMusic ; 04 - dba FadeToMapMusic ; 05 - dba RotatePalettesRightMapAndMusic ; 06 - dba EnterMapMusic ; 07 - dba ForceMapMusic ; 08 - dba FadeInMusic ; 09 - dba LoadBlockData ; 0a (callback 1) - dba LoadNeighboringBlockData ; 0b - dba SaveScreen ; 0c - dba BufferScreen ; 0d - dba LoadGraphics ; 0e - dba LoadTileset ; 0f - dba LoadMapTimeOfDay ; 10 - dba LoadMapPalettes ; 11 - dba LoadWildMonData ; 12 - dba RefreshMapSprites ; 13 - dba HandleNewMap ; 14 - dba InitCommandQueue ; 15 - dba LoadObjectsRunCallback_02 ; 16 - dba LoadSpawnPoint ; 17 - dba EnterMapConnection ; 18 - dba LoadWarpData ; 19 - dba LoadMapAttributes ; 1a - dba LoadMapAttributes_SkipPeople ; 1b - dba ClearBGPalettes ; 1c - dba FadeOutPalettes ; 1d - dba FadeInPalettes ; 1e - dba GetCoordOfUpperLeftCorner ; 1f - dba RestoreFacingAfterWarp ; 20 - dba SpawnInFacingDown ; 21 - dba SpawnPlayer ; 22 - dba RefreshPlayerCoords ; 23 - dba DelayClearingOldSprites ; 24 - dba DelayLoadingNewSprites ; 25 - dba UpdateRoamMons ; 26 - dba JumpRoamMons ; 27 - dba FadeOldMapMusic ; 28 - dba ActivateMapAnims ; 29 - dba SuspendMapAnims ; 2a - dba RetainOldPalettes ; 2b - dba DontScrollText ; 2c - dba ReturnFromMapSetupScript ; 2d -; 154ca - - -DontScrollText: ; 154ca - xor a - ld [wDisableTextAcceleration], a - ret -; 154cf - -ActivateMapAnims: ; 154cf - ld a, $1 - ld [hMapAnims], a - ret -; 154d3 - -SuspendMapAnims: ; 154d3 - xor a - ld [hMapAnims], a - ret -; 154d7 - -LoadObjectsRunCallback_02: ; 154d7 - ld a, MAPCALLBACK_OBJECTS - call RunMapCallback - farcall LoadObjectMasks - farcall InitializeVisibleSprites - ret -; 154ea (5:54ea) - -; unused - ret -; 154eb - -DelayClearingOldSprites: ; 154eb - ld hl, wPlayerSpriteSetupFlags - set PLAYERSPRITESETUP_RESET_ACTION_F, [hl] - ret -; 154f1 - -DelayLoadingNewSprites: ; 154f1 - ld hl, wPlayerSpriteSetupFlags - set PLAYERSPRITESETUP_SKIP_RELOAD_GFX_F, [hl] - ret - -CheckReplaceKrisSprite: ; 154f7 - nop - call .CheckBiking - jr c, .ok - call .CheckSurfing - jr c, .ok - call .CheckSurfing2 - jr c, .ok - ret - -.ok - call ReplaceKrisSprite - ret - -.CheckBiking: ; 1550c (5:550c) - and a - ld hl, wBikeFlags - bit BIKEFLAGS_ALWAYS_ON_BIKE_F, [hl] - ret z - ld a, PLAYER_BIKE - ld [wPlayerState], a - scf - ret - -.CheckSurfing2: ; 1551a (5:551a) - ld a, [wPlayerState] - cp PLAYER_NORMAL - jr z, .nope - cp PLAYER_SKATE - jr z, .nope - cp PLAYER_SURF - jr z, .surfing - cp PLAYER_SURF_PIKA - jr z, .surfing - call GetMapEnvironment - cp INDOOR - jr z, .checkbiking - cp ENVIRONMENT_5 - jr z, .checkbiking - cp DUNGEON - jr z, .checkbiking - jr .nope -.checkbiking - ld a, [wPlayerState] - cp PLAYER_BIKE - jr nz, .nope -.surfing - ld a, PLAYER_NORMAL - ld [wPlayerState], a - scf - ret - -.nope - and a - ret - -.CheckSurfing: ; 1554e (5:554e) - call CheckOnWater - jr nz, .ret_nc - ld a, [wPlayerState] - cp PLAYER_SURF - jr z, ._surfing - cp PLAYER_SURF_PIKA - jr z, ._surfing - ld a, PLAYER_SURF - ld [wPlayerState], a -._surfing - scf - ret -.ret_nc - and a - ret -; 15567 - -FadeOldMapMusic: ; 15567 - ld a, 6 - call SkipMusic - ret -; 1556d - -RetainOldPalettes: ; 1556d - farcall _UpdateTimePals - ret - -RotatePalettesRightMapAndMusic: ; 15574 - ld e, 0 - ld a, [wMusicFadeID] - ld d, 0 - ld a, [wMusicFadeID + 1] - ld a, $4 - ld [wMusicFade], a - call RotateThreePalettesRight - ret -; 15587 - -ForceMapMusic: ; 15587 - ld a, [wPlayerState] - cp PLAYER_BIKE - jr nz, .notbiking - call VolumeOff - ld a, $88 - ld [wMusicFade], a -.notbiking - call TryRestartMapMusic - ret -; 1559a diff --git a/engine/mapgroup_roofs.asm b/engine/mapgroup_roofs.asm deleted file mode 100644 index 58e5e7cfe..000000000 --- a/engine/mapgroup_roofs.asm +++ /dev/null @@ -1,20 +0,0 @@ -LoadMapGroupRoof:: ; 1c000 - ld a, [wMapGroup] - ld e, a - ld d, 0 - ld hl, MapGroupRoofs - add hl, de - ld a, [hl] - cp -1 - ret z - ld hl, Roofs - ld bc, 9 tiles - call AddNTimes - ld de, vTiles2 tile $0a - ld bc, 9 tiles - call CopyBytes - ret -; 1c021 - - -INCLUDE "data/maps/roofs.asm" diff --git a/engine/mart.asm b/engine/mart.asm deleted file mode 100755 index 911251f65..000000000 --- a/engine/mart.asm +++ /dev/null @@ -1,970 +0,0 @@ - const_def - const MARTTEXT_HOW_MANY - const MARTTEXT_COSTS_THIS_MUCH - const MARTTEXT_NOT_ENOUGH_MONEY - const MARTTEXT_BAG_FULL - const MARTTEXT_HERE_YOU_GO - const MARTTEXT_SOLD_OUT - -OpenMartDialog:: ; 15a45 - call GetMart - ld a, c - ld [wEngineBuffer1], a - call LoadMartPointer - ld a, [wEngineBuffer1] - ld hl, .dialogs - rst JumpTable - ret -; 15a57 - -.dialogs - dw MartDialog - dw HerbShop - dw BargainShop - dw Pharmacist - dw RooftopSale -; 15a61 - -MartDialog: ; 15a61 - ld a, 0 - ld [wEngineBuffer1], a - xor a - ld [wEngineBuffer5], a - call StandardMart - ret -; 15a6e - -HerbShop: ; 15a6e - call FarReadMart - call LoadStandardMenuHeader - ld hl, Text_HerbShop_Intro - call MartTextBox - call BuyMenu - ld hl, Text_HerbShop_ComeAgain - call MartTextBox - ret -; 15a84 - -BargainShop: ; 15a84 - ld b, BANK(BargainShopData) - ld de, BargainShopData - call LoadMartPointer - call ReadMart - call LoadStandardMenuHeader - ld hl, Text_BargainShop_Intro - call MartTextBox - call BuyMenu - ld hl, wBargainShopFlags - ld a, [hli] - or [hl] - jr z, .skip_set - ld hl, wDailyFlags - set DAILYFLAGS_GOLDENROD_UNDERGROUND_BARGAIN_F, [hl] - -.skip_set - ld hl, Text_BargainShop_ComeAgain - call MartTextBox - ret -; 15aae - -Pharmacist: ; 15aae - call FarReadMart - call LoadStandardMenuHeader - ld hl, Text_Pharmacist_Intro - call MartTextBox - call BuyMenu - ld hl, Text_Pharmacist_ComeAgain - call MartTextBox - ret -; 15ac4 - -RooftopSale: ; 15ac4 - ld b, BANK(RooftopSaleMart1) - ld de, RooftopSaleMart1 - ld hl, wStatusFlags - bit STATUSFLAGS_HALL_OF_FAME_F, [hl] - jr z, .ok - ld b, BANK(RooftopSaleMart2) - ld de, RooftopSaleMart2 - -.ok - call LoadMartPointer - call ReadMart - call LoadStandardMenuHeader - ld hl, Text_Mart_HowMayIHelpYou - call MartTextBox - call BuyMenu - ld hl, Text_Mart_ComeAgain - call MartTextBox - ret -; 15aee - -INCLUDE "data/items/rooftop_sale.asm" - -LoadMartPointer: ; 15b10 - ld a, b - ld [wMartPointerBank], a - ld a, e - ld [wMartPointer], a - ld a, d - ld [wMartPointer + 1], a - ld hl, wCurMart - xor a - ld bc, 16 - call ByteFill - xor a - ld [wEngineBuffer5], a - ld [wBargainShopFlags], a - ld [wFacingDirection], a - ret -; 15b31 - -GetMart: ; 15b31 - ld a, e - cp (Marts.End - Marts) / 2 - jr c, .IsAMart - ld b, BANK(DefaultMart) - ld de, DefaultMart - ret - -.IsAMart: - ld hl, Marts - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld b, BANK(Marts) - ret -; 15b47 - -StandardMart: ; 15b47 -.loop - ld a, [wEngineBuffer5] - ld hl, .MartFunctions - rst JumpTable - ld [wEngineBuffer5], a - cp $ff - jr nz, .loop - ret - -.MartFunctions: - dw .HowMayIHelpYou - dw .TopMenu - dw .Buy - dw .Sell - dw .Quit - dw .AnythingElse -; 15b62 - -.HowMayIHelpYou: ; 15b62 - call LoadStandardMenuHeader - ld hl, Text_Mart_HowMayIHelpYou - call PrintText - ld a, $1 ; top menu - ret -; 15b6e - -.TopMenu: ; 15b6e - ld hl, MenuHeader_BuySell - call CopyMenuHeader - call VerticalMenu - jr c, .quit - ld a, [wMenuCursorY] - cp $1 - jr z, .buy - cp $2 - jr z, .sell -.quit - ld a, $4 ; Come again! - ret -.buy - ld a, $2 ; buy - ret -.sell - ld a, $3 ; sell - ret -; 15b8d - -.Buy: ; 15b8d - call ExitMenu - call FarReadMart - call BuyMenu - and a - ld a, $5 ; Anything else? - ret -; 15b9a - -.Sell: ; 15b9a - call ExitMenu - call SellMenu - ld a, $5 ; Anything else? - ret -; 15ba3 - -.Quit: ; 15ba3 - call ExitMenu - ld hl, Text_Mart_ComeAgain - call MartTextBox - ld a, $ff ; exit - ret -; 15baf - -.AnythingElse: ; 15baf - call LoadStandardMenuHeader - ld hl, Text_Mart_AnythingElse - call PrintText - ld a, $1 ; top menu - ret -; 15bbb - -FarReadMart: ; 15bbb - ld hl, wMartPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wCurMart -.CopyMart: - ld a, [wMartPointerBank] - call GetFarByte - ld [de], a - inc hl - inc de - cp -1 - jr nz, .CopyMart - ld hl, wMartItem1BCD - ld de, wCurMart + 1 -.ReadMartItem: - ld a, [de] - inc de - cp -1 - jr z, .done - push de - call GetMartItemPrice - pop de - jr .ReadMartItem - -.done - ret -; 15be5 - -GetMartItemPrice: ; 15be5 -; Return the price of item a in BCD at hl and in tiles at wStringBuffer1. - push hl - ld [wCurItem], a - farcall GetItemPrice - pop hl - -GetMartPrice: ; 15bf0 -; Return price de in BCD at hl and in tiles at wStringBuffer1. - push hl - ld a, d - ld [wStringBuffer2], a - ld a, e - ld [wStringBuffer2 + 1], a - ld hl, wStringBuffer1 - ld de, wStringBuffer2 - lb bc, PRINTNUM_LEADINGZEROS | 2, 6 ; 6 digits - call PrintNum - pop hl - - ld de, wStringBuffer1 - ld c, 6 / 2 ; 6 digits -.loop - call .CharToNybble - swap a - ld b, a - call .CharToNybble - or b - ld [hli], a - dec c - jr nz, .loop - ret -; 15c1a - -.CharToNybble: ; 15c1a - ld a, [de] - inc de - cp " " - jr nz, .not_space - ld a, "0" - -.not_space - sub "0" - ret -; 15c25 - -ReadMart: ; 15c25 -; Load the mart pointer. Mart data is local (no need for bank). - ld hl, wMartPointer - ld a, [hli] - ld h, [hl] - ld l, a - push hl -; set hl to the first item - inc hl - ld bc, wMartItem1BCD - ld de, wCurMart + 1 -.loop -; copy the item to wCurMart + (ItemIndex) - ld a, [hli] - ld [de], a - inc de -; -1 is the terminator - cp -1 - jr z, .done - - push de -; copy the price to de - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a -; convert the price to 3-byte BCD at [bc] - push hl - ld h, b - ld l, c - call GetMartPrice - ld b, h - ld c, l - pop hl - - pop de - jr .loop - -.done - pop hl - ld a, [hl] - ld [wCurMart], a - ret -; 15c51 - -INCLUDE "data/items/bargain_shop.asm" - - -BuyMenu: ; 15c62 - call FadeToMenu - farcall BlankScreen - xor a - ld [wMenuScrollPositionBackup], a - ld a, 1 - ld [wMenuCursorBufferBackup], a -.loop - call BuyMenuLoop ; menu loop - jr nc, .loop - call CloseSubmenu - ret -; 15c7d - -LoadBuyMenuText: ; 15c7d -; load text from a nested table -; which table is in wEngineBuffer1 -; which entry is in register a - push af - call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers - ld a, [hli] - ld h, [hl] - ld l, a - pop af - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call PrintText - ret -; 15c91 - -MartAskPurchaseQuantity: ; 15c91 - call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers - inc hl - inc hl - ld a, [hl] - and a - jp z, StandardMartAskPurchaseQuantity - cp 1 - jp z, BargainShopAskPurchaseQuantity - jp RooftopSaleAskPurchaseQuantity -; 15ca3 - -GetMartDialogGroup: ; 15ca3 - ld a, [wEngineBuffer1] - ld e, a - ld d, 0 - ld hl, .MartTextFunctionPointers - add hl, de - add hl, de - add hl, de - ret -; 15cb0 - -.MartTextFunctionPointers: ; 15cb0 - dwb .StandardMartPointers, 0 - dwb .HerbShopPointers, 0 - dwb .BargainShopPointers, 1 - dwb .PharmacyPointers, 0 - dwb .StandardMartPointers, 2 -; 15cbf - -.StandardMartPointers: ; 15cbf - dw Text_Mart_HowMany - dw Text_Mart_CostsThisMuch - dw Text_Mart_InsufficientFunds - dw Text_Mart_BagFull - dw Text_Mart_HereYouGo - dw BuyMenuLoop - -.HerbShopPointers: ; 15ccb - dw Text_HerbShop_HowMany - dw Text_HerbShop_CostsThisMuch - dw Text_HerbShop_InsufficientFunds - dw Text_HerbShop_BagFull - dw Text_HerbShop_HereYouGo - dw BuyMenuLoop - -.BargainShopPointers: ; 15cd7 - dw BuyMenuLoop - dw Text_BargainShop_CostsThisMuch - dw Text_BargainShop_InsufficientFunds - dw Text_BargainShop_BagFull - dw Text_BargainShop_HereYouGo - dw Text_BargainShop_SoldOut - -.PharmacyPointers: ; 15ce3 - dw Text_Pharmacy_HowMany - dw Text_Pharmacy_CostsThisMuch - dw Text_Pharmacy_InsufficientFunds - dw Text_Pharmacy_BagFull - dw Text_Pharmacy_HereYouGo - dw BuyMenuLoop -; 15cef - - -BuyMenuLoop: ; 15cef - farcall PlaceMoneyTopRight - call UpdateSprites - ld hl, MenuHeader_Buy - call CopyMenuHeader - ld a, [wMenuCursorBufferBackup] - ld [wMenuCursorBuffer], a - ld a, [wMenuScrollPositionBackup] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wMenuScrollPositionBackup], a - ld a, [wMenuCursorY] - ld [wMenuCursorBufferBackup], a - call SpeechTextBox - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .set_carry - cp A_BUTTON - jr z, .useless_pointer - -.useless_pointer - call MartAskPurchaseQuantity - jr c, .cancel - call MartConfirmPurchase - jr c, .cancel - ld de, wMoney - ld bc, hMoneyTemp - ld a, $3 ; useless load - call CompareMoney - jr c, .insufficient_funds - ld hl, wNumItems - call ReceiveItem - jr nc, .insufficient_bag_space - ld a, [wMartItemID] - ld e, a - ld d, $0 - ld b, SET_FLAG - ld hl, wBargainShopFlags - call FlagAction - call PlayTransactionSound - ld de, wMoney - ld bc, hMoneyTemp - call TakeMoney - ld a, MARTTEXT_HERE_YOU_GO - call LoadBuyMenuText - call JoyWaitAorB - -.cancel - call SpeechTextBox - and a - ret - -.set_carry - scf - ret - -.insufficient_bag_space - ld a, MARTTEXT_BAG_FULL - call LoadBuyMenuText - call JoyWaitAorB - and a - ret - -.insufficient_funds - ld a, MARTTEXT_NOT_ENOUGH_MONEY - call LoadBuyMenuText - call JoyWaitAorB - and a - ret -; 15d83 - -StandardMartAskPurchaseQuantity: - ld a, 99 - ld [wItemQuantityBuffer], a - ld a, MARTTEXT_HOW_MANY - call LoadBuyMenuText - farcall SelectQuantityToBuy - call ExitMenu - ret -; 15d97 - -MartConfirmPurchase: ; 15d97 - predef PartyMonItemName - ld a, MARTTEXT_COSTS_THIS_MUCH - call LoadBuyMenuText - call YesNoBox - ret -; 15da5 - -BargainShopAskPurchaseQuantity: - ld a, 1 - ld [wItemQuantityChangeBuffer], a - ld a, [wMartItemID] - ld e, a - ld d, $0 - ld b, CHECK_FLAG - ld hl, wBargainShopFlags - call FlagAction - ld a, c - and a - jr nz, .SoldOut - ld a, [wMartItemID] - ld e, a - ld d, $0 - ld hl, wMartPointer - ld a, [hli] - ld h, [hl] - ld l, a - inc hl - add hl, de - add hl, de - add hl, de - inc hl - ld a, [hli] - ld [hMoneyTemp + 2], a - ld a, [hl] - ld [hMoneyTemp + 1], a - xor a - ld [hMoneyTemp], a - and a - ret - -.SoldOut: - ld a, MARTTEXT_SOLD_OUT - call LoadBuyMenuText - call JoyWaitAorB - scf - ret -; 15de2 - -RooftopSaleAskPurchaseQuantity: - ld a, MARTTEXT_HOW_MANY - call LoadBuyMenuText - call .GetSalePrice - ld a, 99 - ld [wItemQuantityBuffer], a - farcall RooftopSale_SelectQuantityToBuy - call ExitMenu - ret -; 15df9 - -.GetSalePrice: ; 15df9 - ld a, [wMartItemID] - ld e, a - ld d, 0 - ld hl, wMartPointer - ld a, [hli] - ld h, [hl] - ld l, a - inc hl - add hl, de - add hl, de - add hl, de - inc hl - ld e, [hl] - inc hl - ld d, [hl] - ret -; 15e0e - - -Text_Mart_HowMany: ; 0x15e0e - ; How many? - text_jump UnknownText_0x1c4bfd - db "@" -; 0x15e13 - -Text_Mart_CostsThisMuch: ; 0x15e13 - ; @ (S) will be ¥@ . - text_jump UnknownText_0x1c4c08 - db "@" -; 0x15e18 - -MenuHeader_Buy: ; 0x15e18 - db MENU_BACKUP_TILES ; flags - menu_coords 1, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x15e20 - -.MenuData ; 0x15e20 - db SCROLLINGMENU_DISPLAY_ARROWS | SCROLLINGMENU_ENABLE_FUNCTION3 ; flags - db 4, 8 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wCurMart - dba PlaceMenuItemName - dba .PrintBCDPrices - dba UpdateItemDescription -; 15e30 - -.PrintBCDPrices: ; 15e30 - ld a, [wScrollingMenuCursorPosition] - ld c, a - ld b, 0 - ld hl, wMartItem1BCD - add hl, bc - add hl, bc - add hl, bc - push de - ld d, h - ld e, l - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - ld c, PRINTNUM_LEADINGZEROS | PRINTNUM_MONEY | 3 - call PrintBCDNumber - ret -; 15e4a (5:5e4a) - -Text_HerbShop_Intro: ; 0x15e4a - ; Hello, dear. I sell inexpensive herbal medicine. They're good, but a trifle bitter. Your #MON may not like them. Hehehehe… - text_jump UnknownText_0x1c4c28 - db "@" -; 0x15e4f - -Text_HerbShop_HowMany: ; 0x15e4f - ; How many? - text_jump UnknownText_0x1c4ca3 - db "@" -; 0x15e54 - -Text_HerbShop_CostsThisMuch: ; 0x15e54 - ; @ (S) will be ¥@ . - text_jump UnknownText_0x1c4cae - db "@" -; 0x15e59 - -Text_HerbShop_HereYouGo: ; 0x15e59 - ; Thank you, dear. Hehehehe… - text_jump UnknownText_0x1c4cce - db "@" -; 0x15e5e - -Text_HerbShop_BagFull: ; 0x15e5e - ; Oh? Your PACK is full, dear. - text_jump UnknownText_0x1c4cea - db "@" -; 0x15e63 - -Text_HerbShop_InsufficientFunds: ; 0x15e63 - ; Hehehe… You don't have the money. - text_jump UnknownText_0x1c4d08 - db "@" -; 0x15e68 - -Text_HerbShop_ComeAgain: ; 0x15e68 - ; Come again, dear. Hehehehe… - text_jump UnknownText_0x1c4d2a - db "@" -; 0x15e6d - -Text_BargainShop_Intro: ; 0x15e6d - ; Hiya! Care to see some bargains? I sell rare items that nobody else carries--but only one of each item. - text_jump UnknownText_0x1c4d47 - db "@" -; 0x15e72 - -Text_BargainShop_CostsThisMuch: ; 0x15e72 - ; costs ¥@ . Want it? - text_jump UnknownText_0x1c4db0 - db "@" -; 0x15e77 - -Text_BargainShop_HereYouGo: ; 0x15e77 - ; Thanks. - text_jump UnknownText_0x1c4dcd - db "@" -; 0x15e7c - -Text_BargainShop_BagFull: ; 0x15e7c - ; Uh-oh, your PACK is chock-full. - text_jump UnknownText_0x1c4dd6 - db "@" -; 0x15e81 - -Text_BargainShop_SoldOut: ; 0x15e81 - ; You bought that already. I'm all sold out of it. - text_jump UnknownText_0x1c4df7 - db "@" -; 0x15e86 - -Text_BargainShop_InsufficientFunds: ; 0x15e86 - ; Uh-oh, you're short on funds. - text_jump UnknownText_0x1c4e28 - db "@" -; 0x15e8b - -Text_BargainShop_ComeAgain: ; 0x15e8b - ; Come by again sometime. - text_jump UnknownText_0x1c4e46 - db "@" -; 0x15e90 - -Text_Pharmacist_Intro: ; 0x15e90 - ; What's up? Need some medicine? - text_jump UnknownText_0x1c4e5f - db "@" -; 0x15e95 - -Text_Pharmacy_HowMany: ; 0x15e95 - ; How many? - text_jump UnknownText_0x1c4e7e - db "@" -; 0x15e9a - -Text_Pharmacy_CostsThisMuch: ; 0x15e9a - ; @ (S) will cost ¥@ . - text_jump UnknownText_0x1c4e89 - db "@" -; 0x15e9f - -Text_Pharmacy_HereYouGo: ; 0x15e9f - ; Thanks much! - text_jump UnknownText_0x1c4eab - db "@" -; 0x15ea4 - -Text_Pharmacy_BagFull: ; 0x15ea4 - ; You don't have any more space. - text_jump UnknownText_0x1c4eb9 - db "@" -; 0x15ea9 - -Text_Pharmacy_InsufficientFunds: ; 0x15ea9 - ; Huh? That's not enough money. - text_jump UnknownText_0x1c4ed8 - db "@" -; 0x15eae - -Text_Pharmacist_ComeAgain: ; 0x15eae - ; All right. See you around. - text_jump UnknownText_0x1c4ef6 - db "@" -; 0x15eb3 - - -SellMenu: ; 15eb3 - call DisableSpriteUpdates - farcall DepositSellInitPackBuffers -.loop - farcall DepositSellPack - ld a, [wPackUsedItem] - and a - jp z, .quit - call .TryToSellItem - jr .loop - -.quit - call ReturnToMapWithSpeechTextbox - and a - ret -; 15ed3 - -.Unreferenced_NothingToSell: - ld hl, .NothingToSellText - call MenuTextBoxBackup - and a - ret -; 15edb - -.NothingToSellText: ; 0x15edb - ; You don't have anything to sell. - text_jump UnknownText_0x1c4f12 - db "@" -; 0x15ee0 - - -.TryToSellItem: ; 15ee0 - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - ld hl, .dw - rst JumpTable - ret -; 15eee - -.dw ; 15eee - dw .try_sell - dw .cant_buy - dw .cant_buy - dw .cant_buy - dw .try_sell - dw .try_sell - dw .try_sell -; 15efc - -.cant_buy ; 15efc - ret -; 15efd - - -.try_sell ; 15efd - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr z, .okay_to_sell - ld hl, TextMart_CantBuyFromYou - call PrintText - and a - ret - -.okay_to_sell - ld hl, Text_Mart_SellHowMany - call PrintText - farcall PlaceMoneyAtTopLeftOfTextbox - farcall SelectQuantityToSell - call ExitMenu - jr c, .declined - hlcoord 1, 14 - lb bc, 3, 18 - call ClearBox - ld hl, Text_Mart_ICanPayThisMuch - call PrintTextBoxText - call YesNoBox - jr c, .declined - ld de, wMoney - ld bc, hMoneyTemp - call GiveMoney - ld a, [wMartItemID] - ld hl, wNumItems - call TossItem - predef PartyMonItemName - hlcoord 1, 14 - lb bc, 3, 18 - call ClearBox - ld hl, Text_Mart_SoldForAmount - call PrintTextBoxText - call PlayTransactionSound - farcall PlaceMoneyBottomLeft - call JoyWaitAorB - -.declined - call ExitMenu - and a - ret -; 15f73 - -Text_Mart_SellHowMany: ; 0x15f73 - ; How many? - text_jump UnknownText_0x1c4f33 - db "@" -; 0x15f78 - -Text_Mart_ICanPayThisMuch: ; 0x15f78 - ; I can pay you ¥@ . Is that OK? - text_jump UnknownText_0x1c4f3e - db "@" -; 0x15f7d - -.UnusedString15f7d: ; 15f7d - db "!ダミー!@" - -Text_Mart_HowMayIHelpYou: ; 0x15f83 - ; Welcome! How may I help you? - text_jump UnknownText_0x1c4f62 - db "@" -; 0x15f88 - -MenuHeader_BuySell: ; 0x15f88 - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, 7, 8 - dw .MenuData - db 1 ; default option -; 0x15f90 - -.MenuData ; 0x15f90 - db STATICMENU_CURSOR ; strings - db 3 ; items - db "BUY@" - db "SELL@" - db "QUIT@" -; 0x15f96 - -Text_Mart_HereYouGo: ; 0x15fa0 - ; Here you are. Thank you! - text_jump UnknownText_0x1c4f80 - db "@" -; 0x15fa5 - -Text_Mart_InsufficientFunds: ; 0x15fa5 - ; You don't have enough money. - text_jump UnknownText_0x1c4f9a - db "@" -; 0x15faa - -Text_Mart_BagFull: ; 0x15faa - ; You can't carry any more items. - text_jump UnknownText_0x1c4fb7 - db "@" -; 0x15faf - -TextMart_CantBuyFromYou: ; 0x15faf - ; Sorry, I can't buy that from you. - text_jump UnknownText_0x1c4fd7 - db "@" -; 0x15fb4 - -Text_Mart_ComeAgain: ; 0x15fb4 - ; Please come again! - text_jump UnknownText_0x1c4ff9 - db "@" -; 0x15fb9 - -Text_Mart_AnythingElse: ; 0x15fb9 - text_jump UnknownText_0x1c500d - db "@" -; 0x15fbe - -Text_Mart_SoldForAmount: ; 0x15fbe - text_jump UnknownText_0x1c502e - db "@" -; 0x15fc3 - -PlayTransactionSound: ; 15fc3 - call WaitSFX - ld de, SFX_TRANSACTION - call PlaySFX - ret -; 15fcd - -MartTextBox: ; 15fcd - call MenuTextBox - call JoyWaitAorB - call ExitMenu - ret -; 15fd7 diff --git a/engine/math.asm b/engine/math.asm deleted file mode 100755 index 0cd6b0b47..000000000 --- a/engine/math.asm +++ /dev/null @@ -1,196 +0,0 @@ -_Multiply:: ; 66de - -; hMultiplier is one byte. - ld a, 8 - ld b, a - - xor a - ld [hProduct], a - ld [hMathBuffer + 1], a - ld [hMathBuffer + 2], a - ld [hMathBuffer + 3], a - ld [hMathBuffer + 4], a - - -.loop - ld a, [hMultiplier] - srl a - ld [hMultiplier], a - jr nc, .next - - ld a, [hMathBuffer + 4] - ld c, a - ld a, [hMultiplicand + 2] - add c - ld [hMathBuffer + 4], a - - ld a, [hMathBuffer + 3] - ld c, a - ld a, [hMultiplicand + 1] - adc c - ld [hMathBuffer + 3], a - - ld a, [hMathBuffer + 2] - ld c, a - ld a, [hMultiplicand + 0] - adc c - ld [hMathBuffer + 2], a - - ld a, [hMathBuffer + 1] - ld c, a - ld a, [hProduct] - adc c - ld [hMathBuffer + 1], a - -.next - dec b - jr z, .done - - -; hMultiplicand <<= 1 - - ld a, [hMultiplicand + 2] - add a - ld [hMultiplicand + 2], a - - ld a, [hMultiplicand + 1] - rla - ld [hMultiplicand + 1], a - - ld a, [hMultiplicand + 0] - rla - ld [hMultiplicand + 0], a - - ld a, [hProduct] - rla - ld [hProduct], a - - jr .loop - - -.done - ld a, [hMathBuffer + 4] - ld [hProduct + 3], a - - ld a, [hMathBuffer + 3] - ld [hProduct + 2], a - - ld a, [hMathBuffer + 2] - ld [hProduct + 1], a - - ld a, [hMathBuffer + 1] - ld [hProduct + 0], a - - ret -; 673e - - -_Divide:: ; 673e - xor a - ld [hMathBuffer + 0], a - ld [hMathBuffer + 1], a - ld [hMathBuffer + 2], a - ld [hMathBuffer + 3], a - ld [hMathBuffer + 4], a - - ld a, 9 - ld e, a - -.loop - ld a, [hMathBuffer + 0] - ld c, a - ld a, [hDividend + 1] - sub c - ld d, a - - ld a, [hDivisor] - ld c, a - ld a, [hDividend + 0] - sbc c - jr c, .next - - ld [hDividend + 0], a - - ld a, d - ld [hDividend + 1], a - - ld a, [hMathBuffer + 4] - inc a - ld [hMathBuffer + 4], a - - jr .loop - -.next - ld a, b - cp 1 - jr z, .done - - ld a, [hMathBuffer + 4] - add a - ld [hMathBuffer + 4], a - - ld a, [hMathBuffer + 3] - rla - ld [hMathBuffer + 3], a - - ld a, [hMathBuffer + 2] - rla - ld [hMathBuffer + 2], a - - ld a, [hMathBuffer + 1] - rla - ld [hMathBuffer + 1], a - - dec e - jr nz, .next2 - - ld e, 8 - ld a, [hMathBuffer + 0] - ld [hDivisor], a - xor a - ld [hMathBuffer + 0], a - - ld a, [hDividend + 1] - ld [hDividend + 0], a - - ld a, [hDividend + 2] - ld [hDividend + 1], a - - ld a, [hDividend + 3] - ld [hDividend + 2], a - -.next2 - ld a, e - cp 1 - jr nz, .okay - dec b - -.okay - ld a, [hDivisor] - srl a - ld [hDivisor], a - - ld a, [hMathBuffer + 0] - rr a - ld [hMathBuffer + 0], a - - jr .loop - -.done - ld a, [hDividend + 1] - ld [hDivisor], a - - ld a, [hMathBuffer + 4] - ld [hDividend + 3], a - - ld a, [hMathBuffer + 3] - ld [hDividend + 2], a - - ld a, [hMathBuffer + 2] - ld [hDividend + 1], a - - ld a, [hMathBuffer + 1] - ld [hDividend + 0], a - - ret -; 67c1 diff --git a/engine/menu.asm b/engine/menu.asm deleted file mode 100755 index 51de2e1a4..000000000 --- a/engine/menu.asm +++ /dev/null @@ -1,841 +0,0 @@ -_2DMenu_:: ; 2400e - ld hl, CopyMenuData - ld a, [wMenuData_2DMenuItemStringsBank] - rst FarCall - - call Draw2DMenu - call UpdateSprites - call ApplyTilemap - call Get2DMenuSelection - ret -; 24022 - -_InterpretBattleMenu:: ; 24022 - ld hl, CopyMenuData - ld a, [wMenuData_2DMenuItemStringsBank] - rst FarCall - - call Draw2DMenu - farcall MobileTextBorder - call UpdateSprites - call ApplyTilemap - call Get2DMenuSelection - ret -; 2403c - -_InterpretMobileMenu:: ; 2403c - ld hl, CopyMenuData - ld a, [wMenuData_2DMenuItemStringsBank] - rst FarCall - - call Draw2DMenu - farcall MobileTextBorder - call UpdateSprites - call ApplyTilemap - call Init2DMenuCursorPosition - ld hl, w2DMenuFlags1 - set 7, [hl] -.loop - call DelayFrame - farcall Function10032e - ld a, [wcd2b] - and a - jr nz, .quit - call MobileMenuJoypad - ld a, [wMenuJoypadFilter] - and c - jr z, .loop - call Mobile_GetMenuSelection - ret - -.quit - ld a, [w2DMenuNumCols] - ld c, a - ld a, [w2DMenuNumRows] - call SimpleMultiply - ld [wMenuCursorBuffer], a - and a - ret -; 24085 - - - -Draw2DMenu: ; 24085 - xor a - ld [hBGMapMode], a - call MenuBox - call Place2DMenuItemStrings - ret -; 2408f - -Get2DMenuSelection: ; 2408f - call Init2DMenuCursorPosition - call StaticMenuJoypad - call MenuClickSound -Mobile_GetMenuSelection: ; 24098 - ld a, [wMenuDataFlags] - bit 1, a - jr z, .skip - call GetMenuJoypad - bit SELECT_F, a - jr nz, .quit1 - -.skip - ld a, [wMenuDataFlags] - bit 0, a - jr nz, .skip2 - call GetMenuJoypad - bit B_BUTTON_F, a - jr nz, .quit2 - -.skip2 - ld a, [w2DMenuNumCols] - ld c, a - ld a, [wMenuCursorY] - dec a - call SimpleMultiply - ld c, a - ld a, [wMenuCursorX] - add c - ld [wMenuCursorBuffer], a - and a - ret - -.quit1 - scf - ret - -.quit2 - scf - ret -; 240cd - -Get2DMenuNumberOfColumns: ; 240cd - ld a, [wMenuData_2DMenuDimensions] - and $f - ret -; 240d3 - -Get2DMenuNumberOfRows: ; 240d3 - ld a, [wMenuData_2DMenuDimensions] - swap a - and $f - ret -; 240db - -Place2DMenuItemStrings: ; 240db - ld hl, wMenuData_2DMenuItemStringsAddr - ld e, [hl] - inc hl - ld d, [hl] - call GetMenuTextStartCoord - call Coord2Tile - call Get2DMenuNumberOfRows - ld b, a -.row - push bc - push hl - call Get2DMenuNumberOfColumns - ld c, a -.col - push bc - ld a, [wMenuData_2DMenuItemStringsBank] - call Place2DMenuItemName - inc de - ld a, [wMenuData_2DMenuSpacing] - ld c, a - ld b, 0 - add hl, bc - pop bc - dec c - jr nz, .col - pop hl - ld bc, 2 * SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ld hl, wMenuData_2DMenuFunctionAddr - ld a, [hli] - ld h, [hl] - ld l, a - or h - ret z - ld a, [wMenuData_2DMenuFunctionBank] - rst FarCall - ret -; 2411a - - -Init2DMenuCursorPosition: ; 2411a (9:411a) - call GetMenuTextStartCoord - ld a, b - ld [w2DMenuCursorInitY], a - dec c - ld a, c - ld [w2DMenuCursorInitX], a - call Get2DMenuNumberOfRows - ld [w2DMenuNumRows], a - call Get2DMenuNumberOfColumns - ld [w2DMenuNumCols], a - call .InitFlags_a - call .InitFlags_b - call .InitFlags_c - ld a, [w2DMenuNumCols] - ld e, a - ld a, [wMenuCursorBuffer] - ld b, a - xor a - ld d, 0 -.loop - inc d - add e - cp b - jr c, .loop - sub e - ld c, a - ld a, b - sub c - and a - jr z, .reset1 - cp e - jr z, .okay1 - jr c, .okay1 -.reset1 - ld a, 1 -.okay1 - ld [wMenuCursorX], a - ld a, [w2DMenuNumRows] - ld e, a - ld a, d - and a - jr z, .reset2 - cp e - jr z, .okay2 - jr c, .okay2 -.reset2 - ld a, 1 -.okay2 - ld [wMenuCursorY], a - xor a - ld [wCursorOffCharacter], a - ld [wCursorCurrentTile], a - ld [wCursorCurrentTile + 1], a - ret -; 24179 - -.InitFlags_a: ; 24179 - xor a - ld hl, w2DMenuFlags1 - ld [hli], a - ld [hld], a - ld a, [wMenuDataFlags] - bit 5, a - ret z - set 5, [hl] - set 4, [hl] - ret -; 2418a - -.InitFlags_b: ; 2418a - ld a, [wMenuData_2DMenuSpacing] - or $20 - ld [w2DMenuCursorOffsets], a - ret -; 24193 - -.InitFlags_c: ; 24193 - ld hl, wMenuDataFlags - ld a, A_BUTTON - bit 0, [hl] - jr nz, .skip - or B_BUTTON -.skip - bit 1, [hl] - jr z, .skip2 - or SELECT -.skip2 - ld [wMenuJoypadFilter], a - ret -; 241a8 - - -_StaticMenuJoypad:: ; 241a8 - call Place2DMenuCursor -_ScrollingMenuJoypad:: ; 241ab - ld hl, w2DMenuFlags2 - res 7, [hl] - ld a, [hBGMapMode] - push af - call MenuJoypadLoop - pop af - ld [hBGMapMode], a - ret -; 241ba - -MobileMenuJoypad: ; 241ba - ld hl, w2DMenuFlags2 - res 7, [hl] - ld a, [hBGMapMode] - push af - call Move2DMenuCursor - call Do2DMenuRTCJoypad - jr nc, .skip_joypad - call _2DMenuInterpretJoypad -.skip_joypad - pop af - ld [hBGMapMode], a - call GetMenuJoypad - ld c, a - ret -; 241d5 - - -Unreferenced_Function241d5: ; 241d5 - call Place2DMenuCursor -.loop - call Move2DMenuCursor - call HDMATransferTileMapToWRAMBank3 ; BUG: This function is in another bank. - ; Pointer in current bank (9) is bogus. - call .loop2 - jr nc, .done - call _2DMenuInterpretJoypad - jr c, .done - ld a, [w2DMenuFlags1] - bit 7, a - jr nz, .done - call GetMenuJoypad - ld c, a - ld a, [wMenuJoypadFilter] - and c - jr z, .loop - -.done - ret - -.loop2 - call Menu_WasButtonPressed - ret c - ld c, 1 - ld b, 3 - call AdvanceMobileInactivityTimerAndCheckExpired ; BUG: This function is in another bank. - ; Pointer in current bank (9) is bogus. - ret c - farcall Function100337 - ret c - ld a, [w2DMenuFlags1] - bit 7, a - jr z, .loop2 - and a - ret -; 24216 - - -MenuJoypadLoop: ; 24216 -.loop - call Move2DMenuCursor - call .BGMap_OAM - call Do2DMenuRTCJoypad - jr nc, .done - call _2DMenuInterpretJoypad - jr c, .done - ld a, [w2DMenuFlags1] - bit 7, a - jr nz, .done - call GetMenuJoypad - ld b, a - ld a, [wMenuJoypadFilter] - and b - jr z, .loop - -.done - ret -; 24238 - -.BGMap_OAM: ; 24238 - ld a, [hOAMUpdate] - push af - ld a, $1 - ld [hOAMUpdate], a - call WaitBGMap - pop af - ld [hOAMUpdate], a - xor a - ld [hBGMapMode], a - ret -; 24249 - -Do2DMenuRTCJoypad: ; 24249 -.loopRTC - call RTC - call Menu_WasButtonPressed - ret c - ld a, [w2DMenuFlags1] - bit 7, a - jr z, .loopRTC - and a - ret -; 24259 - -Menu_WasButtonPressed: ; 24259 - ld a, [w2DMenuFlags1] - bit 6, a - jr z, .skip_to_joypad - callfar PlaySpriteAnimationsAndDelayFrame - -.skip_to_joypad - call JoyTextDelay - call GetMenuJoypad - and a - ret z - scf - ret -; 24270 - -_2DMenuInterpretJoypad: ; 24270 - call GetMenuJoypad - bit A_BUTTON_F, a - jp nz, .a_b_start_select - bit B_BUTTON_F, a - jp nz, .a_b_start_select - bit SELECT_F, a - jp nz, .a_b_start_select - bit START_F, a - jp nz, .a_b_start_select - bit D_RIGHT_F, a - jr nz, .d_right - bit D_LEFT_F, a - jr nz, .d_left - bit D_UP_F, a - jr nz, .d_up - bit D_DOWN_F, a - jr nz, .d_down - and a - ret - -.set_bit_7 ; 24299 - ld hl, w2DMenuFlags2 - set 7, [hl] - scf - ret - -.d_down - ld hl, wMenuCursorY - ld a, [w2DMenuNumRows] - cp [hl] - jr z, .check_wrap_around_down - inc [hl] - xor a - ret - -.check_wrap_around_down - ld a, [w2DMenuFlags1] - bit 5, a - jr nz, .wrap_around_down - bit 3, a - jp nz, .set_bit_7 - xor a - ret - -.wrap_around_down - ld [hl], $1 - xor a - ret - -.d_up - ld hl, wMenuCursorY - ld a, [hl] - dec a - jr z, .check_wrap_around_up - ld [hl], a - xor a - ret - -.check_wrap_around_up - ld a, [w2DMenuFlags1] - bit 5, a - jr nz, .wrap_around_up - bit 2, a - jp nz, .set_bit_7 - xor a - ret - -.wrap_around_up - ld a, [w2DMenuNumRows] - ld [hl], a - xor a - ret - -.d_left - ld hl, wMenuCursorX - ld a, [hl] - dec a - jr z, .check_wrap_around_left - ld [hl], a - xor a - ret - -.check_wrap_around_left - ld a, [w2DMenuFlags1] - bit 4, a - jr nz, .wrap_around_left - bit 1, a - jp nz, .set_bit_7 - xor a - ret - -.wrap_around_left - ld a, [w2DMenuNumCols] - ld [hl], a - xor a - ret - -.d_right - ld hl, wMenuCursorX - ld a, [w2DMenuNumCols] - cp [hl] - jr z, .check_wrap_around_right - inc [hl] - xor a - ret - -.check_wrap_around_right - ld a, [w2DMenuFlags1] - bit 4, a - jr nz, .wrap_around_right - bit 0, a - jp nz, .set_bit_7 - xor a - ret - -.wrap_around_right - ld [hl], $1 - xor a - ret -; 24318 - -.a_b_start_select ; 24318 - xor a - ret -; 2431a - -Move2DMenuCursor: ; 2431a - ld hl, wCursorCurrentTile - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [hl] - cp "▶" - jr nz, Place2DMenuCursor - ld a, [wCursorOffCharacter] - ld [hl], a -Place2DMenuCursor: ; 24329 - ld a, [w2DMenuCursorInitY] - ld b, a - ld a, [w2DMenuCursorInitX] - ld c, a - call Coord2Tile - ld a, [w2DMenuCursorOffsets] - swap a - and $f - ld c, a - ld a, [wMenuCursorY] - ld b, a - xor a - dec b - jr z, .got_row -.row_loop - add c - dec b - jr nz, .row_loop - -.got_row - ld c, SCREEN_WIDTH - call AddNTimes - ld a, [w2DMenuCursorOffsets] - and $f - ld c, a - ld a, [wMenuCursorX] - ld b, a - xor a - dec b - jr z, .got_col -.col_loop - add c - dec b - jr nz, .col_loop - -.got_col - ld c, a - add hl, bc - ld a, [hl] - cp "▶" - jr z, .cursor_on - ld [wCursorOffCharacter], a - ld [hl], "▶" - -.cursor_on - ld a, l - ld [wCursorCurrentTile], a - ld a, h - ld [wCursorCurrentTile + 1], a - ret -; 24374 - -_PushWindow:: ; 24374 - ld a, [rSVBK] - push af - ld a, BANK(wWindowStack) - ld [rSVBK], a - - ld hl, wWindowStackPointer - ld e, [hl] - inc hl - ld d, [hl] - push de - - ld b, $10 - ld hl, wMenuFlags -.loop - ld a, [hli] - ld [de], a - dec de - dec b - jr nz, .loop - -; If bit 6 or 7 of the menu flags is set, set bit 0 of the address -; at 7:[wWindowStackPointer], and draw the menu using the coordinates from the header. -; Otherwise, reset bit 0 of 7:[wWindowStackPointer]. - ld a, [wMenuFlags] - bit 6, a - jr nz, .bit_6 - bit 7, a - jr z, .not_bit_7 - -.bit_6 - ld hl, wWindowStackPointer - ld a, [hli] - ld h, [hl] - ld l, a - set 0, [hl] - call MenuBoxCoord2Tile - call .copy - call MenuBoxCoord2Attr - call .copy - jr .done - -.not_bit_7 - pop hl ; last-pushed register was de - push hl - ld a, [hld] - ld l, [hl] - ld h, a - res 0, [hl] - -.done - pop hl - call .ret ; empty function - ld a, h - ld [de], a - dec de - ld a, l - ld [de], a - dec de - ld hl, wWindowStackPointer - ld [hl], e - inc hl - ld [hl], d - - pop af - ld [rSVBK], a - ld hl, wWindowStackSize - inc [hl] - ret -; 243cd - -.copy ; 243cd - call GetMenuBoxDims - inc b - inc c - call .ret ; empty function - -.row - push bc - push hl - -.col - ld a, [hli] - ld [de], a - dec de - dec c - jr nz, .col - - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - - ret -; 243e7 - -.ret ; 243e7 - ret -; 243e8 - -_ExitMenu:: ; 243e8 - xor a - ld [hBGMapMode], a - - ld a, [rSVBK] - push af - ld a, BANK(wWindowStack) - ld [rSVBK], a - - call GetWindowStackTop - ld a, l - or h - jp z, Error_Cant_ExitMenu - ld a, l - ld [wWindowStackPointer], a - ld a, h - ld [wWindowStackPointer + 1], a - call PopWindow - ld a, [wMenuFlags] - bit 0, a - jr z, .loop - ld d, h - ld e, l - call RestoreTileBackup - -.loop - call GetWindowStackTop - ld a, h - or l - jr z, .done - call PopWindow - -.done - pop af - ld [rSVBK], a - ld hl, wWindowStackSize - dec [hl] - ret -; 24423 - -Unreferenced_Function24423: ; 24423 - ld a, [wVramState] - bit 0, a - ret z - xor a ; sScratch - call GetSRAMBank - hlcoord 0, 0 - ld de, sScratch - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - call CopyBytes - call CloseSRAM - call OverworldTextModeSwitch - xor a ; sScratch - call GetSRAMBank - ld hl, sScratch - decoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT -.loop - ld a, [hl] - cp $61 - jr c, .next - ld [de], a -.next - inc hl - inc de - dec bc - ld a, c - or b - jr nz, .loop - call CloseSRAM - ret -; 2445d - -Error_Cant_ExitMenu: ; 2445d - ld hl, .Text_NoWindowsAvailableForPopping - call PrintText - call WaitBGMap -.InfiniteLoop: - jr .InfiniteLoop -; 24468 - -.Text_NoWindowsAvailableForPopping: ; 24468 - text_jump UnknownText_0x1c46b7 - db "@" -; 2446d - -_InitVerticalMenuCursor:: ; 2446d - ld a, [wMenuDataFlags] - ld b, a - ld hl, w2DMenuCursorInitY - ld a, [wMenuBorderTopCoord] - inc a - bit 6, b - jr nz, .skip_offset - inc a -.skip_offset - ld [hli], a -; w2DMenuCursorInitX - ld a, [wMenuBorderLeftCoord] - inc a - ld [hli], a -; w2DMenuNumRows - ld a, [wMenuDataItems] - ld [hli], a -; w2DMenuNumCols - ld a, 1 - ld [hli], a -; w2DMenuFlags1 - ld [hl], $0 - bit 5, b - jr z, .skip_bit_5 - set 5, [hl] -.skip_bit_5 - ld a, [wMenuFlags] - bit 4, a - jr z, .skip_bit_6 - set 6, [hl] -.skip_bit_6 - inc hl -; w2DMenuFlags2 - xor a - ld [hli], a -; w2DMenuCursorOffsets - ln a, 2, 0 - ld [hli], a -; wMenuJoypadFilter - ld a, A_BUTTON - bit 0, b - jr nz, .skip_bit_1 - add B_BUTTON -.skip_bit_1 - ld [hli], a -; wMenuCursorY - ld a, [wMenuCursorBuffer] - and a - jr z, .load_at_the_top - ld c, a - ld a, [wMenuDataItems] - cp c - jr nc, .load_position -.load_at_the_top - ld c, 1 -.load_position - ld [hl], c - inc hl -; wMenuCursorX - ld a, 1 - ld [hli], a -; wCursorOffCharacter, wCursorCurrentTile - xor a - ld [hli], a - ld [hli], a - ld [hli], a - ret -; 244c3 diff --git a/engine/menu/buy_sell_toss.asm b/engine/menu/buy_sell_toss.asm new file mode 100755 index 000000000..84481d030 --- /dev/null +++ b/engine/menu/buy_sell_toss.asm @@ -0,0 +1,235 @@ +SelectQuantityToToss: ; 24fbf + ld hl, TossItem_MenuHeader + call LoadMenuHeader + call Toss_Sell_Loop + ret +; 24fc9 + +SelectQuantityToBuy: ; 24fc9 + farcall GetItemPrice +RooftopSale_SelectQuantityToBuy: ; 24fcf + ld a, d + ld [wBuffer1], a + ld a, e + ld [wBuffer2], a + ld hl, BuyItem_MenuHeader + call LoadMenuHeader + call Toss_Sell_Loop + ret +; 24fe1 + +SelectQuantityToSell: ; 24fe1 + farcall GetItemPrice + ld a, d + ld [wBuffer1], a + ld a, e + ld [wBuffer2], a + ld hl, SellItem_MenuHeader + call LoadMenuHeader + call Toss_Sell_Loop + ret +; 24ff9 + +Toss_Sell_Loop: ; 24ff9 + ld a, 1 + ld [wItemQuantityChangeBuffer], a +.loop + call BuySellToss_UpdateQuantityDisplay ; update display + call BuySellToss_InterpretJoypad ; joy action + jr nc, .loop + cp -1 + jr nz, .nope ; pressed B + scf + ret + +.nope + and a + ret +; 2500e + +BuySellToss_InterpretJoypad: ; 2500e + call JoyTextDelay_ForcehJoyDown ; get joypad + bit B_BUTTON_F, c + jr nz, .b + bit A_BUTTON_F, c + jr nz, .a + bit D_DOWN_F, c + jr nz, .down + bit D_UP_F, c + jr nz, .up + bit D_LEFT_F, c + jr nz, .left + bit D_RIGHT_F, c + jr nz, .right + and a + ret + +.b + ld a, -1 + scf + ret + +.a + ld a, 0 + scf + ret + +.down + ld hl, wItemQuantityChangeBuffer + dec [hl] + jr nz, .finish_down + ld a, [wItemQuantityBuffer] + ld [hl], a + +.finish_down + and a + ret + +.up + ld hl, wItemQuantityChangeBuffer + inc [hl] + ld a, [wItemQuantityBuffer] + cp [hl] + jr nc, .finish_up + ld [hl], 1 + +.finish_up + and a + ret + +.left + ld a, [wItemQuantityChangeBuffer] + sub 10 + jr c, .load_1 + jr z, .load_1 + jr .finish_left + +.load_1 + ld a, 1 + +.finish_left + ld [wItemQuantityChangeBuffer], a + and a + ret + +.right + ld a, [wItemQuantityChangeBuffer] + add 10 + ld b, a + ld a, [wItemQuantityBuffer] + cp b + jr nc, .finish_right + ld b, a + +.finish_right + ld a, b + ld [wItemQuantityChangeBuffer], a + and a + ret +; 25072 + +BuySellToss_UpdateQuantityDisplay: ; 25072 + call MenuBox + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + 1 + add hl, de + ld [hl], "×" + inc hl + ld de, wItemQuantityChangeBuffer + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld a, [wMenuDataPointer] + ld e, a + ld a, [wMenuDataPointer + 1] + ld d, a + ld a, [wMenuDataBank] + call FarCall_de + ret +; 25097 + +ret_25097: ; 25097 + ret +; 25098 + +DisplayPurchasePrice: ; 25098 + call BuySell_MultiplyPrice + call BuySell_DisplaySubtotal + ret +; 2509f + +DisplaySellingPrice: ; 2509f + call BuySell_MultiplyPrice + call Sell_HalvePrice + call BuySell_DisplaySubtotal + ret +; 250a9 + +BuySell_MultiplyPrice: ; 250a9 + xor a + ld [hMultiplicand + 0], a + ld a, [wBuffer1] + ld [hMultiplicand + 1], a + ld a, [wBuffer2] + ld [hMultiplicand + 2], a + ld a, [wItemQuantityChangeBuffer] + ld [hMultiplier], a + push hl + call Multiply + pop hl + ret +; 250c1 + +Sell_HalvePrice: ; 250c1 + push hl + ld hl, hProduct + 1 + ld a, [hl] + srl a + ld [hli], a + ld a, [hl] + rra + ld [hli], a + ld a, [hl] + rra + ld [hl], a + pop hl + ret +; 250d1 + +BuySell_DisplaySubtotal: ; 250d1 + push hl + ld hl, hMoneyTemp + ld a, [hProduct + 1] + ld [hli], a + ld a, [hProduct + 2] + ld [hli], a + ld a, [hProduct + 3] + ld [hl], a + pop hl + inc hl + ld de, hMoneyTemp + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + call WaitBGMap + ret +; 250ed + +TossItem_MenuHeader: ; 0x250ed + db MENU_BACKUP_TILES ; flags + menu_coords 15, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw ret_25097 + db 0 ; default option +; 0x250f5 + +BuyItem_MenuHeader: ; 0x250f5 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw DisplayPurchasePrice + db -1 ; default option +; 0x250fd + +SellItem_MenuHeader: ; 0x250fd + db MENU_BACKUP_TILES ; flags + menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw DisplaySellingPrice + db 0 ; default option +; 0x25105 diff --git a/engine/menu/clock_reset.asm b/engine/menu/clock_reset.asm new file mode 100755 index 000000000..c05129349 --- /dev/null +++ b/engine/menu/clock_reset.asm @@ -0,0 +1,254 @@ + +ResetClock_GetWraparoundTime: ; 20000 (8:4000) + push hl + dec a + ld e, a + ld d, 0 + ld hl, .WrapAroundTimes +rept 4 + add hl, de +endr + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld b, [hl] + inc hl + ld c, [hl] + pop hl + ret +; 20015 (8:4015) + +.WrapAroundTimes: ; 20015 + dw wBuffer4 + db 7, 4 + + dw wBuffer5 + db 24, 12 + + dw wBuffer6 + db 60, 15 +; 20021 + +RestartClock: ; 20021 (8:4021) +; If we're here, we had an RTC overflow. + ld hl, .Text_ClockTimeMayBeWrong + call PrintText + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call LoadStandardMenuHeader + call ClearTileMap + ld hl, .Text_SetWithControlPad + call PrintText + call .SetClock + call ExitMenu + pop bc + ld hl, wOptions + ld [hl], b + ld c, a + ret +; 20047 (8:4047) + +.Text_ClockTimeMayBeWrong: ; 0x20047 + ; The clock's time may be wrong. Please reset the time. + text_jump UnknownText_0x1c40e6 + db "@" +; 0x2004c + +.Text_SetWithControlPad: ; 0x2004c + ; Set with the Control Pad. Confirm: A Button Cancel: B Button + text_jump UnknownText_0x1c411c + db "@" +; 0x20051 + +.SetClock: ; 20051 (8:4051) + ld a, 1 + ld [wBuffer1], a ; which digit + ld [wBuffer2], a + ld a, 8 + ld [wBuffer3], a + call UpdateTime + call GetWeekday + ld [wBuffer4], a + ld a, [hHours] + ld [wBuffer5], a + ld a, [hMinutes] + ld [wBuffer6], a + +.loop + call .joy_loop + jr nc, .loop + and a + ret nz + call .PrintTime + ld hl, .Text_IsThisOK + call PrintText + call YesNoBox + jr c, .cancel + ld a, [wBuffer4] + ld [wStringBuffer2], a + ld a, [wBuffer5] + ld [wStringBuffer2 + 1], a + ld a, [wBuffer6] + ld [wStringBuffer2 + 2], a + xor a + ld [wStringBuffer2 + 3], a + call InitTime + call .PrintTime + ld hl, .Text_ClockReset + call PrintText + call WaitPressAorB_BlinkCursor + xor a + ret + +.cancel + ld a, $1 + ret +; 200b0 (8:40b0) + +.Text_IsThisOK: ; 0x200b0 + ; Is this OK? + text_jump UnknownText_0x1c415b + db "@" +; 0x200b5 + +.Text_ClockReset: ; 0x200b5 + ; The clock has been reset. + text_jump UnknownText_0x1c4168 + db "@" +; 0x200ba + +.joy_loop + call JoyTextDelay_ForcehJoyDown + ld c, a + push af + call .PrintTime + pop af + bit 0, a + jr nz, .press_A + bit 1, a + jr nz, .press_B + bit 6, a + jr nz, .pressed_up + bit 7, a + jr nz, .pressed_down + bit 5, a + jr nz, .pressed_left + bit 4, a + jr nz, .pressed_right + jr .joy_loop + +.press_A + ld a, $0 + scf + ret + +.press_B + ld a, $1 + scf + ret + +.pressed_up + ld a, [wBuffer1] + call ResetClock_GetWraparoundTime + ld a, [de] + inc a + ld [de], a + cp b + jr c, .done_scroll + ld a, $0 + ld [de], a + jr .done_scroll + +.pressed_down + ld a, [wBuffer1] + call ResetClock_GetWraparoundTime + ld a, [de] + dec a + ld [de], a + cp -1 + jr nz, .done_scroll + ld a, b + dec a + ld [de], a + jr .done_scroll + +.pressed_left + ld hl, wBuffer1 + dec [hl] + jr nz, .done_scroll + ld [hl], $3 + jr .done_scroll + +.pressed_right + ld hl, wBuffer1 + inc [hl] + ld a, [hl] + cp $4 + jr c, .done_scroll + ld [hl], $1 + +.done_scroll + xor a + ret + +.PrintTime: ; 2011f (8:411f) + hlcoord 0, 5 + ld b, 5 + ld c, 18 + call TextBox + decoord 1, 8 + ld a, [wBuffer4] + ld b, a + farcall PrintDayOfWeek + ld a, [wBuffer5] + ld b, a + ld a, [wBuffer6] + ld c, a + decoord 11, 8 + farcall PrintHoursMins + ld a, [wBuffer2] + lb de, " ", " " + call .PlaceChars + ld a, [wBuffer1] + lb de, "▲", "▼" + call .PlaceChars + ld a, [wBuffer1] + ld [wBuffer2], a + ret +; 20160 (8:4160) + +.unreferenced ; 20160 +; unused + ld a, [wBuffer3] + ld b, a + call Coord2Tile + ret +; 20168 + +.PlaceChars: ; 20168 (8:4168) + push de + call ResetClock_GetWraparoundTime + ld a, [wBuffer3] + dec a + ld b, a + call Coord2Tile + pop de + ld [hl], d + ld bc, 2 * SCREEN_WIDTH + add hl, bc + ld [hl], e + ret +; 2017c (8:417c) + +UnreferencedString_HourJP: ; 2017c +; unused + db "じ@" ; HR +; 2017e + +UnreferencedString_MinuteJP: ; 2017e +; unused + db "ふん@" ; MIN +; 20181 diff --git a/engine/menu/delete_save_change_clock.asm b/engine/menu/delete_save_change_clock.asm new file mode 100755 index 000000000..431dc6034 --- /dev/null +++ b/engine/menu/delete_save_change_clock.asm @@ -0,0 +1,296 @@ +_ResetClock: ; 4d3b1 + farcall BlankScreen + ld b, SCGB_DIPLOMA + call GetSGBLayout + call LoadStandardFont + call LoadFontsExtra + ld de, MUSIC_MAIN_MENU + call PlayMusic + ld hl, .text_askreset + call PrintText + ld hl, .NoYes_MenuHeader + call CopyMenuHeader + call VerticalMenu + ret c + ld a, [wMenuCursorY] + cp $1 + ret z + call ClockResetPassword + jr c, .wrongpassword + ld a, BANK(sRTCStatusFlags) + call GetSRAMBank + ld a, $80 + ld [sRTCStatusFlags], a + call CloseSRAM + ld hl, .text_okay + call PrintText + ret + +.wrongpassword + ld hl, .text_wrong + call PrintText + ret + +.text_okay ; 0x4d3fe + ; Password OK. Select CONTINUE & reset settings. + text_jump UnknownText_0x1c55db + db "@" + +.text_wrong ; 0x4d403 + ; Wrong password! + text_jump UnknownText_0x1c560b + db "@" + +.text_askreset ; 0x4d408 + ; Reset the clock? + text_jump UnknownText_0x1c561c + db "@" + +.NoYes_MenuHeader: ; 0x4d40d + db 0 ; flags + menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .NoYes_MenuData + db 1 ; default option + +.NoYes_MenuData: ; 0x4d415 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "NO@" + db "YES@" + +ClockResetPassword: ; 4d41e + call .CalculatePassword + push de + ld hl, wStringBuffer2 + ld bc, 5 + xor a + call ByteFill + ld a, $4 + ld [wStringBuffer2 + 5], a + ld hl, .pleaseenterpasswordtext + call PrintText +.loop + call .updateIDdisplay +.loop2 + call JoyTextDelay + ld a, [hJoyLast] + ld b, a + and A_BUTTON + jr nz, .confirm + ld a, b + and D_PAD + jr z, .loop2 + call .dpadinput + ld c, 3 + call DelayFrames + jr .loop + +.confirm + call .ConvertDecIDToBytes + pop de + ld a, e + cp l + jr nz, .nope + ld a, d + cp h + jr nz, .nope + and a + ret + +.nope + scf + ret + +.pleaseenterpasswordtext ; 0x4d463 + ; Please enter the password. + text_jump UnknownText_0x1c562e + db "@" + +.updateIDdisplay ; 4d468 + hlcoord 14, 15 + ld de, wStringBuffer2 + ld c, 5 +.loop3 + ld a, [de] + add "0" + ld [hli], a + inc de + dec c + jr nz, .loop3 + hlcoord 14, 16 + ld bc, 5 + ld a, " " + call ByteFill + hlcoord 14, 16 + ld a, [wStringBuffer2 + 5] + ld e, a + ld d, $0 + add hl, de + ld [hl], "▲" + ret + +.dpadinput ; 4d490 + ld a, b + and D_LEFT + jr nz, .left + ld a, b + and D_RIGHT + jr nz, .right + ld a, b + and D_UP + jr nz, .up + ld a, b + and D_DOWN + jr nz, .down + ret + +.left + ld a, [wStringBuffer2 + 5] + and a + ret z + dec a + ld [wStringBuffer2 + 5], a + ret + +.right + ld a, [wStringBuffer2 + 5] + cp $4 + ret z + inc a + ld [wStringBuffer2 + 5], a + ret + +.up + call .getcurrentdigit + ld a, [hl] + cp 9 + jr z, .wraparound_up + inc a + ld [hl], a + ret + +.wraparound_up + ld [hl], $0 + ret + +.down + call .getcurrentdigit + ld a, [hl] + and a + jr z, .wraparound_down + dec a + ld [hl], a + ret + +.wraparound_down + ld [hl], 9 + ret + +.getcurrentdigit ; 4d4d5 + ld a, [wStringBuffer2 + 5] + ld e, a + ld d, $0 + ld hl, wStringBuffer2 + add hl, de + ret + +.ConvertDecIDToBytes: ; 4d4e0 + ld hl, 0 + ld de, wStringBuffer2 + 4 + ld bc, 1 + call .ConvertToBytes + ld bc, 10 + call .ConvertToBytes + ld bc, 100 + call .ConvertToBytes + ld bc, 1000 + call .ConvertToBytes + ld bc, 10000 +.ConvertToBytes: ; 4d501 + ld a, [de] + dec de + push hl + ld hl, 0 + call AddNTimes + ld c, l + ld b, h + pop hl + add hl, bc + ret + +.CalculatePassword: ; 4d50f + ld a, BANK(sPlayerData) + call GetSRAMBank + ld de, 0 + ld hl, sPlayerData + (wPlayerID - wPlayerData) + ld c, $2 + call .ComponentFromNumber + ld hl, sPlayerData + (wPlayerName - wPlayerData) + ld c, NAME_LENGTH_JAPANESE - 1 + call .ComponentFromString + ld hl, sPlayerData + (wMoney - wPlayerData) + ld c, $3 + call .ComponentFromNumber + call CloseSRAM + ret + +.ComponentFromNumber: ; 4d533 + ld a, [hli] + add e + ld e, a + ld a, $0 + adc d + ld d, a + dec c + jr nz, .ComponentFromNumber + ret + +.ComponentFromString: ; 4d53e + ld a, [hli] + cp "@" + ret z + add e + ld e, a + ld a, $0 + adc d + ld d, a + dec c + jr nz, .ComponentFromString + ret + +_DeleteSaveData: ; 4d54c + farcall BlankScreen + ld b, SCGB_DIPLOMA + call GetSGBLayout + call LoadStandardFont + call LoadFontsExtra + ld de, MUSIC_MAIN_MENU + call PlayMusic + ld hl, .Text_ClearAllSaveData + call PrintText + ld hl, .NoYesMenuHeader + call CopyMenuHeader + call VerticalMenu + ret c + ld a, [wMenuCursorY] + cp $1 + ret z + farcall EmptyAllSRAMBanks + ret + +.Text_ClearAllSaveData: ; 0x4d580 + ; Clear all save data? + text_jump UnknownText_0x1c564a + db "@" + +.NoYesMenuHeader: ; 0x4d585 + db 0 ; flags + menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option + +.MenuData: ; 0x4d58d + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "NO@" + db "YES@" diff --git a/engine/menu/main_menu.asm b/engine/menu/main_menu.asm new file mode 100755 index 000000000..d83ce873b --- /dev/null +++ b/engine/menu/main_menu.asm @@ -0,0 +1,361 @@ +GFX_49c0c: ; 49c0c +INCBIN "gfx/unknown/049c0c.2bpp" +; 49cdc + +MainMenu: ; 49cdc + xor a + ld [wDisableTextAcceleration], a + call Function49ed0 + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + ld hl, wGameTimerPause + res GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] + call MainMenu_GetWhichMenu + ld [wWhichIndexSet], a + call MainMenu_PrintCurrentTimeAndDay + ld hl, .MenuHeader + call LoadMenuHeader + call MainMenuJoypadLoop + call CloseWindow + jr c, .quit + call ClearTileMap + ld a, [wMenuSelection] + ld hl, .Jumptable + rst JumpTable + jr MainMenu + +.quit + ret +; 49d14 + +.MenuHeader: ; 49d14 + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 16, 7 + dw .MenuData + db 1 ; default option +; 49d1c + +.MenuData: ; 49d1c + db STATICMENU_CURSOR ; flags + db 0 ; items + dw MainMenuItems + dw PlaceMenuStrings + dw .Strings +; 49d20 + +.Strings: ; 49d24 + db "CONTINUE@" + db "NEW GAME@" + db "OPTION@" + db "MYSTERY GIFT@" + db "MOBILE@" + db "MOBILE STUDIUM@" + +.Jumptable: ; 0x49d60 + dw MainMenu_Continue + dw MainMenu_NewGame + dw MainMenu_Options + dw MainMenu_MysteryGift + dw MainMenu_Mobile + dw MainMenu_MobileStudium +; 0x49d6c + +CONTINUE EQU 0 +NEW_GAME EQU 1 +OPTION EQU 2 +MYSTERY_GIFT EQU 3 +MOBILE EQU 4 +MOBILE_STUDIUM EQU 5 + +MainMenuItems: + +NewGameMenu: ; 0x49d6c + db 2 + db NEW_GAME + db OPTION + db -1 + +ContinueMenu: ; 0x49d70 + db 3 + db CONTINUE + db NEW_GAME + db OPTION + db -1 + +MobileMysteryMenu: ; 0x49d75 + db 5 + db CONTINUE + db NEW_GAME + db OPTION + db MYSTERY_GIFT + db MOBILE + db -1 + +MobileMenu: ; 0x49d7c + db 4 + db CONTINUE + db NEW_GAME + db OPTION + db MOBILE + db -1 + +MobileStudiumMenu: ; 0x49d82 + db 5 + db CONTINUE + db NEW_GAME + db OPTION + db MOBILE + db MOBILE_STUDIUM + db -1 + +MysteryMobileStudiumMenu: ; 0x49d89 + db 6 + db CONTINUE + db NEW_GAME + db OPTION + db MYSTERY_GIFT + db MOBILE + db MOBILE_STUDIUM + db -1 + +MysteryMenu: ; 0x49d91 + db 4 + db CONTINUE + db NEW_GAME + db OPTION + db MYSTERY_GIFT + db -1 + +MysteryStudiumMenu: ; 0x49d97 + db 5 + db CONTINUE + db NEW_GAME + db OPTION + db MYSTERY_GIFT + db MOBILE_STUDIUM + db -1 + +StudiumMenu: ; 0x49d9e + db 4 + db CONTINUE + db NEW_GAME + db OPTION + db MOBILE_STUDIUM + db -1 + + +MainMenu_GetWhichMenu: ; 49da4 + nop + nop + nop + ld a, [wSaveFileExists] + and a + jr nz, .next + ld a, $0 ; New Game + ret + +.next + ld a, [hCGB] + cp $1 + ld a, $1 + ret nz + ld a, BANK(sNumDailyMysteryGiftPartnerIDs) + call GetSRAMBank + ld a, [sNumDailyMysteryGiftPartnerIDs] + cp -1 + call CloseSRAM + jr nz, .mystery_gift + ; This check makes no difference. + ld a, [wStatusFlags] + bit STATUSFLAGS_MAIN_MENU_MOBILE_CHOICES_F, a + ld a, $1 ; Continue + jr z, .ok + jr .ok + +.ok + jr .ok2 + +.ok2 + ld a, $1 ; Continue + ret + +.mystery_gift + ; This check makes no difference. + ld a, [wStatusFlags] + bit STATUSFLAGS_MAIN_MENU_MOBILE_CHOICES_F, a + jr z, .ok3 + jr .ok3 + +.ok3 + jr .ok4 + +.ok4 + ld a, $6 ; Mystery Gift + ret +; 49de4 + +MainMenuJoypadLoop: ; 49de4 + call SetUpMenu +.loop + call MainMenu_PrintCurrentTimeAndDay + ld a, [w2DMenuFlags1] + set 5, a + ld [w2DMenuFlags1], a + call GetScrollingMenuJoypad + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .b_button + cp A_BUTTON + jr z, .a_button + jr .loop + +.a_button + call PlayClickSFX + and a + ret + +.b_button + scf + ret +; 49e09 + +MainMenu_PrintCurrentTimeAndDay: ; 49e09 + ld a, [wSaveFileExists] + and a + ret z + xor a + ld [hBGMapMode], a + call .PlaceBox + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call .PlaceTime + pop af + ld [wOptions], a + ld a, $1 + ld [hBGMapMode], a + ret +; 49e27 + + +.PlaceBox: ; 49e27 + call CheckRTCStatus + and $80 + jr nz, .TimeFail + hlcoord 0, 14 + ld b, 2 + ld c, 18 + call TextBox + ret + +.TimeFail: + call SpeechTextBox + ret +; 49e3d + + +.PlaceTime: ; 49e3d + ld a, [wSaveFileExists] + and a + ret z + call CheckRTCStatus + and $80 + jp nz, .PrintTimeNotSet + call UpdateTime + call GetWeekday + ld b, a + decoord 1, 15 + call .PlaceCurrentDay + decoord 4, 16 + ld a, [hHours] + ld c, a + farcall PrintHour + ld [hl], ":" + inc hl + ld de, hMinutes + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ret + +.min +; unused + db "min.@" +; 49e75 + +.PrintTimeNotSet: ; 49e75 + hlcoord 1, 14 + ld de, .TimeNotSet + call PlaceString + ret +; 49e7f + +.TimeNotSet: ; 49e7f + db "TIME NOT SET@" +; 49e8c + +.UnusedText: ; 49e8c + ; Clock time unknown + text_jump UnknownText_0x1c5182 + db "@" +; 49e91 + +.PlaceCurrentDay: ; 49e91 + push de + ld hl, .Days + ld a, b + call GetNthString + ld d, h + ld e, l + pop hl + call PlaceString + ld h, b + ld l, c + ld de, .Day + call PlaceString + ret +; 49ea8 + +.Days: + db "SUN@" + db "MON@" + db "TUES@" + db "WEDNES@" + db "THURS@" + db "FRI@" + db "SATUR@" +.Day: + db "DAY@" +; 49ed0 + +Function49ed0: ; 49ed0 + xor a + ld [hMapAnims], a + call ClearTileMap + call LoadFontsExtra + call LoadStandardFont + call ClearWindowData + ret +; 49ee0 + + +MainMenu_NewGame: ; 49ee0 + farcall NewGame + ret +; 49ee7 + +MainMenu_Options: ; 49ee7 + farcall OptionsMenu + ret +; 49eee + +MainMenu_Continue: ; 49eee + farcall Continue + ret +; 49ef5 + +MainMenu_MysteryGift: ; 49ef5 + farcall MysteryGift + ret +; 49efc diff --git a/engine/menu/mart.asm b/engine/menu/mart.asm new file mode 100755 index 000000000..911251f65 --- /dev/null +++ b/engine/menu/mart.asm @@ -0,0 +1,970 @@ + const_def + const MARTTEXT_HOW_MANY + const MARTTEXT_COSTS_THIS_MUCH + const MARTTEXT_NOT_ENOUGH_MONEY + const MARTTEXT_BAG_FULL + const MARTTEXT_HERE_YOU_GO + const MARTTEXT_SOLD_OUT + +OpenMartDialog:: ; 15a45 + call GetMart + ld a, c + ld [wEngineBuffer1], a + call LoadMartPointer + ld a, [wEngineBuffer1] + ld hl, .dialogs + rst JumpTable + ret +; 15a57 + +.dialogs + dw MartDialog + dw HerbShop + dw BargainShop + dw Pharmacist + dw RooftopSale +; 15a61 + +MartDialog: ; 15a61 + ld a, 0 + ld [wEngineBuffer1], a + xor a + ld [wEngineBuffer5], a + call StandardMart + ret +; 15a6e + +HerbShop: ; 15a6e + call FarReadMart + call LoadStandardMenuHeader + ld hl, Text_HerbShop_Intro + call MartTextBox + call BuyMenu + ld hl, Text_HerbShop_ComeAgain + call MartTextBox + ret +; 15a84 + +BargainShop: ; 15a84 + ld b, BANK(BargainShopData) + ld de, BargainShopData + call LoadMartPointer + call ReadMart + call LoadStandardMenuHeader + ld hl, Text_BargainShop_Intro + call MartTextBox + call BuyMenu + ld hl, wBargainShopFlags + ld a, [hli] + or [hl] + jr z, .skip_set + ld hl, wDailyFlags + set DAILYFLAGS_GOLDENROD_UNDERGROUND_BARGAIN_F, [hl] + +.skip_set + ld hl, Text_BargainShop_ComeAgain + call MartTextBox + ret +; 15aae + +Pharmacist: ; 15aae + call FarReadMart + call LoadStandardMenuHeader + ld hl, Text_Pharmacist_Intro + call MartTextBox + call BuyMenu + ld hl, Text_Pharmacist_ComeAgain + call MartTextBox + ret +; 15ac4 + +RooftopSale: ; 15ac4 + ld b, BANK(RooftopSaleMart1) + ld de, RooftopSaleMart1 + ld hl, wStatusFlags + bit STATUSFLAGS_HALL_OF_FAME_F, [hl] + jr z, .ok + ld b, BANK(RooftopSaleMart2) + ld de, RooftopSaleMart2 + +.ok + call LoadMartPointer + call ReadMart + call LoadStandardMenuHeader + ld hl, Text_Mart_HowMayIHelpYou + call MartTextBox + call BuyMenu + ld hl, Text_Mart_ComeAgain + call MartTextBox + ret +; 15aee + +INCLUDE "data/items/rooftop_sale.asm" + +LoadMartPointer: ; 15b10 + ld a, b + ld [wMartPointerBank], a + ld a, e + ld [wMartPointer], a + ld a, d + ld [wMartPointer + 1], a + ld hl, wCurMart + xor a + ld bc, 16 + call ByteFill + xor a + ld [wEngineBuffer5], a + ld [wBargainShopFlags], a + ld [wFacingDirection], a + ret +; 15b31 + +GetMart: ; 15b31 + ld a, e + cp (Marts.End - Marts) / 2 + jr c, .IsAMart + ld b, BANK(DefaultMart) + ld de, DefaultMart + ret + +.IsAMart: + ld hl, Marts + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld b, BANK(Marts) + ret +; 15b47 + +StandardMart: ; 15b47 +.loop + ld a, [wEngineBuffer5] + ld hl, .MartFunctions + rst JumpTable + ld [wEngineBuffer5], a + cp $ff + jr nz, .loop + ret + +.MartFunctions: + dw .HowMayIHelpYou + dw .TopMenu + dw .Buy + dw .Sell + dw .Quit + dw .AnythingElse +; 15b62 + +.HowMayIHelpYou: ; 15b62 + call LoadStandardMenuHeader + ld hl, Text_Mart_HowMayIHelpYou + call PrintText + ld a, $1 ; top menu + ret +; 15b6e + +.TopMenu: ; 15b6e + ld hl, MenuHeader_BuySell + call CopyMenuHeader + call VerticalMenu + jr c, .quit + ld a, [wMenuCursorY] + cp $1 + jr z, .buy + cp $2 + jr z, .sell +.quit + ld a, $4 ; Come again! + ret +.buy + ld a, $2 ; buy + ret +.sell + ld a, $3 ; sell + ret +; 15b8d + +.Buy: ; 15b8d + call ExitMenu + call FarReadMart + call BuyMenu + and a + ld a, $5 ; Anything else? + ret +; 15b9a + +.Sell: ; 15b9a + call ExitMenu + call SellMenu + ld a, $5 ; Anything else? + ret +; 15ba3 + +.Quit: ; 15ba3 + call ExitMenu + ld hl, Text_Mart_ComeAgain + call MartTextBox + ld a, $ff ; exit + ret +; 15baf + +.AnythingElse: ; 15baf + call LoadStandardMenuHeader + ld hl, Text_Mart_AnythingElse + call PrintText + ld a, $1 ; top menu + ret +; 15bbb + +FarReadMart: ; 15bbb + ld hl, wMartPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wCurMart +.CopyMart: + ld a, [wMartPointerBank] + call GetFarByte + ld [de], a + inc hl + inc de + cp -1 + jr nz, .CopyMart + ld hl, wMartItem1BCD + ld de, wCurMart + 1 +.ReadMartItem: + ld a, [de] + inc de + cp -1 + jr z, .done + push de + call GetMartItemPrice + pop de + jr .ReadMartItem + +.done + ret +; 15be5 + +GetMartItemPrice: ; 15be5 +; Return the price of item a in BCD at hl and in tiles at wStringBuffer1. + push hl + ld [wCurItem], a + farcall GetItemPrice + pop hl + +GetMartPrice: ; 15bf0 +; Return price de in BCD at hl and in tiles at wStringBuffer1. + push hl + ld a, d + ld [wStringBuffer2], a + ld a, e + ld [wStringBuffer2 + 1], a + ld hl, wStringBuffer1 + ld de, wStringBuffer2 + lb bc, PRINTNUM_LEADINGZEROS | 2, 6 ; 6 digits + call PrintNum + pop hl + + ld de, wStringBuffer1 + ld c, 6 / 2 ; 6 digits +.loop + call .CharToNybble + swap a + ld b, a + call .CharToNybble + or b + ld [hli], a + dec c + jr nz, .loop + ret +; 15c1a + +.CharToNybble: ; 15c1a + ld a, [de] + inc de + cp " " + jr nz, .not_space + ld a, "0" + +.not_space + sub "0" + ret +; 15c25 + +ReadMart: ; 15c25 +; Load the mart pointer. Mart data is local (no need for bank). + ld hl, wMartPointer + ld a, [hli] + ld h, [hl] + ld l, a + push hl +; set hl to the first item + inc hl + ld bc, wMartItem1BCD + ld de, wCurMart + 1 +.loop +; copy the item to wCurMart + (ItemIndex) + ld a, [hli] + ld [de], a + inc de +; -1 is the terminator + cp -1 + jr z, .done + + push de +; copy the price to de + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a +; convert the price to 3-byte BCD at [bc] + push hl + ld h, b + ld l, c + call GetMartPrice + ld b, h + ld c, l + pop hl + + pop de + jr .loop + +.done + pop hl + ld a, [hl] + ld [wCurMart], a + ret +; 15c51 + +INCLUDE "data/items/bargain_shop.asm" + + +BuyMenu: ; 15c62 + call FadeToMenu + farcall BlankScreen + xor a + ld [wMenuScrollPositionBackup], a + ld a, 1 + ld [wMenuCursorBufferBackup], a +.loop + call BuyMenuLoop ; menu loop + jr nc, .loop + call CloseSubmenu + ret +; 15c7d + +LoadBuyMenuText: ; 15c7d +; load text from a nested table +; which table is in wEngineBuffer1 +; which entry is in register a + push af + call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers + ld a, [hli] + ld h, [hl] + ld l, a + pop af + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call PrintText + ret +; 15c91 + +MartAskPurchaseQuantity: ; 15c91 + call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers + inc hl + inc hl + ld a, [hl] + and a + jp z, StandardMartAskPurchaseQuantity + cp 1 + jp z, BargainShopAskPurchaseQuantity + jp RooftopSaleAskPurchaseQuantity +; 15ca3 + +GetMartDialogGroup: ; 15ca3 + ld a, [wEngineBuffer1] + ld e, a + ld d, 0 + ld hl, .MartTextFunctionPointers + add hl, de + add hl, de + add hl, de + ret +; 15cb0 + +.MartTextFunctionPointers: ; 15cb0 + dwb .StandardMartPointers, 0 + dwb .HerbShopPointers, 0 + dwb .BargainShopPointers, 1 + dwb .PharmacyPointers, 0 + dwb .StandardMartPointers, 2 +; 15cbf + +.StandardMartPointers: ; 15cbf + dw Text_Mart_HowMany + dw Text_Mart_CostsThisMuch + dw Text_Mart_InsufficientFunds + dw Text_Mart_BagFull + dw Text_Mart_HereYouGo + dw BuyMenuLoop + +.HerbShopPointers: ; 15ccb + dw Text_HerbShop_HowMany + dw Text_HerbShop_CostsThisMuch + dw Text_HerbShop_InsufficientFunds + dw Text_HerbShop_BagFull + dw Text_HerbShop_HereYouGo + dw BuyMenuLoop + +.BargainShopPointers: ; 15cd7 + dw BuyMenuLoop + dw Text_BargainShop_CostsThisMuch + dw Text_BargainShop_InsufficientFunds + dw Text_BargainShop_BagFull + dw Text_BargainShop_HereYouGo + dw Text_BargainShop_SoldOut + +.PharmacyPointers: ; 15ce3 + dw Text_Pharmacy_HowMany + dw Text_Pharmacy_CostsThisMuch + dw Text_Pharmacy_InsufficientFunds + dw Text_Pharmacy_BagFull + dw Text_Pharmacy_HereYouGo + dw BuyMenuLoop +; 15cef + + +BuyMenuLoop: ; 15cef + farcall PlaceMoneyTopRight + call UpdateSprites + ld hl, MenuHeader_Buy + call CopyMenuHeader + ld a, [wMenuCursorBufferBackup] + ld [wMenuCursorBuffer], a + ld a, [wMenuScrollPositionBackup] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wMenuScrollPositionBackup], a + ld a, [wMenuCursorY] + ld [wMenuCursorBufferBackup], a + call SpeechTextBox + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .set_carry + cp A_BUTTON + jr z, .useless_pointer + +.useless_pointer + call MartAskPurchaseQuantity + jr c, .cancel + call MartConfirmPurchase + jr c, .cancel + ld de, wMoney + ld bc, hMoneyTemp + ld a, $3 ; useless load + call CompareMoney + jr c, .insufficient_funds + ld hl, wNumItems + call ReceiveItem + jr nc, .insufficient_bag_space + ld a, [wMartItemID] + ld e, a + ld d, $0 + ld b, SET_FLAG + ld hl, wBargainShopFlags + call FlagAction + call PlayTransactionSound + ld de, wMoney + ld bc, hMoneyTemp + call TakeMoney + ld a, MARTTEXT_HERE_YOU_GO + call LoadBuyMenuText + call JoyWaitAorB + +.cancel + call SpeechTextBox + and a + ret + +.set_carry + scf + ret + +.insufficient_bag_space + ld a, MARTTEXT_BAG_FULL + call LoadBuyMenuText + call JoyWaitAorB + and a + ret + +.insufficient_funds + ld a, MARTTEXT_NOT_ENOUGH_MONEY + call LoadBuyMenuText + call JoyWaitAorB + and a + ret +; 15d83 + +StandardMartAskPurchaseQuantity: + ld a, 99 + ld [wItemQuantityBuffer], a + ld a, MARTTEXT_HOW_MANY + call LoadBuyMenuText + farcall SelectQuantityToBuy + call ExitMenu + ret +; 15d97 + +MartConfirmPurchase: ; 15d97 + predef PartyMonItemName + ld a, MARTTEXT_COSTS_THIS_MUCH + call LoadBuyMenuText + call YesNoBox + ret +; 15da5 + +BargainShopAskPurchaseQuantity: + ld a, 1 + ld [wItemQuantityChangeBuffer], a + ld a, [wMartItemID] + ld e, a + ld d, $0 + ld b, CHECK_FLAG + ld hl, wBargainShopFlags + call FlagAction + ld a, c + and a + jr nz, .SoldOut + ld a, [wMartItemID] + ld e, a + ld d, $0 + ld hl, wMartPointer + ld a, [hli] + ld h, [hl] + ld l, a + inc hl + add hl, de + add hl, de + add hl, de + inc hl + ld a, [hli] + ld [hMoneyTemp + 2], a + ld a, [hl] + ld [hMoneyTemp + 1], a + xor a + ld [hMoneyTemp], a + and a + ret + +.SoldOut: + ld a, MARTTEXT_SOLD_OUT + call LoadBuyMenuText + call JoyWaitAorB + scf + ret +; 15de2 + +RooftopSaleAskPurchaseQuantity: + ld a, MARTTEXT_HOW_MANY + call LoadBuyMenuText + call .GetSalePrice + ld a, 99 + ld [wItemQuantityBuffer], a + farcall RooftopSale_SelectQuantityToBuy + call ExitMenu + ret +; 15df9 + +.GetSalePrice: ; 15df9 + ld a, [wMartItemID] + ld e, a + ld d, 0 + ld hl, wMartPointer + ld a, [hli] + ld h, [hl] + ld l, a + inc hl + add hl, de + add hl, de + add hl, de + inc hl + ld e, [hl] + inc hl + ld d, [hl] + ret +; 15e0e + + +Text_Mart_HowMany: ; 0x15e0e + ; How many? + text_jump UnknownText_0x1c4bfd + db "@" +; 0x15e13 + +Text_Mart_CostsThisMuch: ; 0x15e13 + ; @ (S) will be ¥@ . + text_jump UnknownText_0x1c4c08 + db "@" +; 0x15e18 + +MenuHeader_Buy: ; 0x15e18 + db MENU_BACKUP_TILES ; flags + menu_coords 1, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x15e20 + +.MenuData ; 0x15e20 + db SCROLLINGMENU_DISPLAY_ARROWS | SCROLLINGMENU_ENABLE_FUNCTION3 ; flags + db 4, 8 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wCurMart + dba PlaceMenuItemName + dba .PrintBCDPrices + dba UpdateItemDescription +; 15e30 + +.PrintBCDPrices: ; 15e30 + ld a, [wScrollingMenuCursorPosition] + ld c, a + ld b, 0 + ld hl, wMartItem1BCD + add hl, bc + add hl, bc + add hl, bc + push de + ld d, h + ld e, l + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + ld c, PRINTNUM_LEADINGZEROS | PRINTNUM_MONEY | 3 + call PrintBCDNumber + ret +; 15e4a (5:5e4a) + +Text_HerbShop_Intro: ; 0x15e4a + ; Hello, dear. I sell inexpensive herbal medicine. They're good, but a trifle bitter. Your #MON may not like them. Hehehehe… + text_jump UnknownText_0x1c4c28 + db "@" +; 0x15e4f + +Text_HerbShop_HowMany: ; 0x15e4f + ; How many? + text_jump UnknownText_0x1c4ca3 + db "@" +; 0x15e54 + +Text_HerbShop_CostsThisMuch: ; 0x15e54 + ; @ (S) will be ¥@ . + text_jump UnknownText_0x1c4cae + db "@" +; 0x15e59 + +Text_HerbShop_HereYouGo: ; 0x15e59 + ; Thank you, dear. Hehehehe… + text_jump UnknownText_0x1c4cce + db "@" +; 0x15e5e + +Text_HerbShop_BagFull: ; 0x15e5e + ; Oh? Your PACK is full, dear. + text_jump UnknownText_0x1c4cea + db "@" +; 0x15e63 + +Text_HerbShop_InsufficientFunds: ; 0x15e63 + ; Hehehe… You don't have the money. + text_jump UnknownText_0x1c4d08 + db "@" +; 0x15e68 + +Text_HerbShop_ComeAgain: ; 0x15e68 + ; Come again, dear. Hehehehe… + text_jump UnknownText_0x1c4d2a + db "@" +; 0x15e6d + +Text_BargainShop_Intro: ; 0x15e6d + ; Hiya! Care to see some bargains? I sell rare items that nobody else carries--but only one of each item. + text_jump UnknownText_0x1c4d47 + db "@" +; 0x15e72 + +Text_BargainShop_CostsThisMuch: ; 0x15e72 + ; costs ¥@ . Want it? + text_jump UnknownText_0x1c4db0 + db "@" +; 0x15e77 + +Text_BargainShop_HereYouGo: ; 0x15e77 + ; Thanks. + text_jump UnknownText_0x1c4dcd + db "@" +; 0x15e7c + +Text_BargainShop_BagFull: ; 0x15e7c + ; Uh-oh, your PACK is chock-full. + text_jump UnknownText_0x1c4dd6 + db "@" +; 0x15e81 + +Text_BargainShop_SoldOut: ; 0x15e81 + ; You bought that already. I'm all sold out of it. + text_jump UnknownText_0x1c4df7 + db "@" +; 0x15e86 + +Text_BargainShop_InsufficientFunds: ; 0x15e86 + ; Uh-oh, you're short on funds. + text_jump UnknownText_0x1c4e28 + db "@" +; 0x15e8b + +Text_BargainShop_ComeAgain: ; 0x15e8b + ; Come by again sometime. + text_jump UnknownText_0x1c4e46 + db "@" +; 0x15e90 + +Text_Pharmacist_Intro: ; 0x15e90 + ; What's up? Need some medicine? + text_jump UnknownText_0x1c4e5f + db "@" +; 0x15e95 + +Text_Pharmacy_HowMany: ; 0x15e95 + ; How many? + text_jump UnknownText_0x1c4e7e + db "@" +; 0x15e9a + +Text_Pharmacy_CostsThisMuch: ; 0x15e9a + ; @ (S) will cost ¥@ . + text_jump UnknownText_0x1c4e89 + db "@" +; 0x15e9f + +Text_Pharmacy_HereYouGo: ; 0x15e9f + ; Thanks much! + text_jump UnknownText_0x1c4eab + db "@" +; 0x15ea4 + +Text_Pharmacy_BagFull: ; 0x15ea4 + ; You don't have any more space. + text_jump UnknownText_0x1c4eb9 + db "@" +; 0x15ea9 + +Text_Pharmacy_InsufficientFunds: ; 0x15ea9 + ; Huh? That's not enough money. + text_jump UnknownText_0x1c4ed8 + db "@" +; 0x15eae + +Text_Pharmacist_ComeAgain: ; 0x15eae + ; All right. See you around. + text_jump UnknownText_0x1c4ef6 + db "@" +; 0x15eb3 + + +SellMenu: ; 15eb3 + call DisableSpriteUpdates + farcall DepositSellInitPackBuffers +.loop + farcall DepositSellPack + ld a, [wPackUsedItem] + and a + jp z, .quit + call .TryToSellItem + jr .loop + +.quit + call ReturnToMapWithSpeechTextbox + and a + ret +; 15ed3 + +.Unreferenced_NothingToSell: + ld hl, .NothingToSellText + call MenuTextBoxBackup + and a + ret +; 15edb + +.NothingToSellText: ; 0x15edb + ; You don't have anything to sell. + text_jump UnknownText_0x1c4f12 + db "@" +; 0x15ee0 + + +.TryToSellItem: ; 15ee0 + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + ld hl, .dw + rst JumpTable + ret +; 15eee + +.dw ; 15eee + dw .try_sell + dw .cant_buy + dw .cant_buy + dw .cant_buy + dw .try_sell + dw .try_sell + dw .try_sell +; 15efc + +.cant_buy ; 15efc + ret +; 15efd + + +.try_sell ; 15efd + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr z, .okay_to_sell + ld hl, TextMart_CantBuyFromYou + call PrintText + and a + ret + +.okay_to_sell + ld hl, Text_Mart_SellHowMany + call PrintText + farcall PlaceMoneyAtTopLeftOfTextbox + farcall SelectQuantityToSell + call ExitMenu + jr c, .declined + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ld hl, Text_Mart_ICanPayThisMuch + call PrintTextBoxText + call YesNoBox + jr c, .declined + ld de, wMoney + ld bc, hMoneyTemp + call GiveMoney + ld a, [wMartItemID] + ld hl, wNumItems + call TossItem + predef PartyMonItemName + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ld hl, Text_Mart_SoldForAmount + call PrintTextBoxText + call PlayTransactionSound + farcall PlaceMoneyBottomLeft + call JoyWaitAorB + +.declined + call ExitMenu + and a + ret +; 15f73 + +Text_Mart_SellHowMany: ; 0x15f73 + ; How many? + text_jump UnknownText_0x1c4f33 + db "@" +; 0x15f78 + +Text_Mart_ICanPayThisMuch: ; 0x15f78 + ; I can pay you ¥@ . Is that OK? + text_jump UnknownText_0x1c4f3e + db "@" +; 0x15f7d + +.UnusedString15f7d: ; 15f7d + db "!ダミー!@" + +Text_Mart_HowMayIHelpYou: ; 0x15f83 + ; Welcome! How may I help you? + text_jump UnknownText_0x1c4f62 + db "@" +; 0x15f88 + +MenuHeader_BuySell: ; 0x15f88 + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 7, 8 + dw .MenuData + db 1 ; default option +; 0x15f90 + +.MenuData ; 0x15f90 + db STATICMENU_CURSOR ; strings + db 3 ; items + db "BUY@" + db "SELL@" + db "QUIT@" +; 0x15f96 + +Text_Mart_HereYouGo: ; 0x15fa0 + ; Here you are. Thank you! + text_jump UnknownText_0x1c4f80 + db "@" +; 0x15fa5 + +Text_Mart_InsufficientFunds: ; 0x15fa5 + ; You don't have enough money. + text_jump UnknownText_0x1c4f9a + db "@" +; 0x15faa + +Text_Mart_BagFull: ; 0x15faa + ; You can't carry any more items. + text_jump UnknownText_0x1c4fb7 + db "@" +; 0x15faf + +TextMart_CantBuyFromYou: ; 0x15faf + ; Sorry, I can't buy that from you. + text_jump UnknownText_0x1c4fd7 + db "@" +; 0x15fb4 + +Text_Mart_ComeAgain: ; 0x15fb4 + ; Please come again! + text_jump UnknownText_0x1c4ff9 + db "@" +; 0x15fb9 + +Text_Mart_AnythingElse: ; 0x15fb9 + text_jump UnknownText_0x1c500d + db "@" +; 0x15fbe + +Text_Mart_SoldForAmount: ; 0x15fbe + text_jump UnknownText_0x1c502e + db "@" +; 0x15fc3 + +PlayTransactionSound: ; 15fc3 + call WaitSFX + ld de, SFX_TRANSACTION + call PlaySFX + ret +; 15fcd + +MartTextBox: ; 15fcd + call MenuTextBox + call JoyWaitAorB + call ExitMenu + ret +; 15fd7 diff --git a/engine/menu/menu.asm b/engine/menu/menu.asm new file mode 100755 index 000000000..51de2e1a4 --- /dev/null +++ b/engine/menu/menu.asm @@ -0,0 +1,841 @@ +_2DMenu_:: ; 2400e + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + call UpdateSprites + call ApplyTilemap + call Get2DMenuSelection + ret +; 24022 + +_InterpretBattleMenu:: ; 24022 + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + farcall MobileTextBorder + call UpdateSprites + call ApplyTilemap + call Get2DMenuSelection + ret +; 2403c + +_InterpretMobileMenu:: ; 2403c + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + farcall MobileTextBorder + call UpdateSprites + call ApplyTilemap + call Init2DMenuCursorPosition + ld hl, w2DMenuFlags1 + set 7, [hl] +.loop + call DelayFrame + farcall Function10032e + ld a, [wcd2b] + and a + jr nz, .quit + call MobileMenuJoypad + ld a, [wMenuJoypadFilter] + and c + jr z, .loop + call Mobile_GetMenuSelection + ret + +.quit + ld a, [w2DMenuNumCols] + ld c, a + ld a, [w2DMenuNumRows] + call SimpleMultiply + ld [wMenuCursorBuffer], a + and a + ret +; 24085 + + + +Draw2DMenu: ; 24085 + xor a + ld [hBGMapMode], a + call MenuBox + call Place2DMenuItemStrings + ret +; 2408f + +Get2DMenuSelection: ; 2408f + call Init2DMenuCursorPosition + call StaticMenuJoypad + call MenuClickSound +Mobile_GetMenuSelection: ; 24098 + ld a, [wMenuDataFlags] + bit 1, a + jr z, .skip + call GetMenuJoypad + bit SELECT_F, a + jr nz, .quit1 + +.skip + ld a, [wMenuDataFlags] + bit 0, a + jr nz, .skip2 + call GetMenuJoypad + bit B_BUTTON_F, a + jr nz, .quit2 + +.skip2 + ld a, [w2DMenuNumCols] + ld c, a + ld a, [wMenuCursorY] + dec a + call SimpleMultiply + ld c, a + ld a, [wMenuCursorX] + add c + ld [wMenuCursorBuffer], a + and a + ret + +.quit1 + scf + ret + +.quit2 + scf + ret +; 240cd + +Get2DMenuNumberOfColumns: ; 240cd + ld a, [wMenuData_2DMenuDimensions] + and $f + ret +; 240d3 + +Get2DMenuNumberOfRows: ; 240d3 + ld a, [wMenuData_2DMenuDimensions] + swap a + and $f + ret +; 240db + +Place2DMenuItemStrings: ; 240db + ld hl, wMenuData_2DMenuItemStringsAddr + ld e, [hl] + inc hl + ld d, [hl] + call GetMenuTextStartCoord + call Coord2Tile + call Get2DMenuNumberOfRows + ld b, a +.row + push bc + push hl + call Get2DMenuNumberOfColumns + ld c, a +.col + push bc + ld a, [wMenuData_2DMenuItemStringsBank] + call Place2DMenuItemName + inc de + ld a, [wMenuData_2DMenuSpacing] + ld c, a + ld b, 0 + add hl, bc + pop bc + dec c + jr nz, .col + pop hl + ld bc, 2 * SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ld hl, wMenuData_2DMenuFunctionAddr + ld a, [hli] + ld h, [hl] + ld l, a + or h + ret z + ld a, [wMenuData_2DMenuFunctionBank] + rst FarCall + ret +; 2411a + + +Init2DMenuCursorPosition: ; 2411a (9:411a) + call GetMenuTextStartCoord + ld a, b + ld [w2DMenuCursorInitY], a + dec c + ld a, c + ld [w2DMenuCursorInitX], a + call Get2DMenuNumberOfRows + ld [w2DMenuNumRows], a + call Get2DMenuNumberOfColumns + ld [w2DMenuNumCols], a + call .InitFlags_a + call .InitFlags_b + call .InitFlags_c + ld a, [w2DMenuNumCols] + ld e, a + ld a, [wMenuCursorBuffer] + ld b, a + xor a + ld d, 0 +.loop + inc d + add e + cp b + jr c, .loop + sub e + ld c, a + ld a, b + sub c + and a + jr z, .reset1 + cp e + jr z, .okay1 + jr c, .okay1 +.reset1 + ld a, 1 +.okay1 + ld [wMenuCursorX], a + ld a, [w2DMenuNumRows] + ld e, a + ld a, d + and a + jr z, .reset2 + cp e + jr z, .okay2 + jr c, .okay2 +.reset2 + ld a, 1 +.okay2 + ld [wMenuCursorY], a + xor a + ld [wCursorOffCharacter], a + ld [wCursorCurrentTile], a + ld [wCursorCurrentTile + 1], a + ret +; 24179 + +.InitFlags_a: ; 24179 + xor a + ld hl, w2DMenuFlags1 + ld [hli], a + ld [hld], a + ld a, [wMenuDataFlags] + bit 5, a + ret z + set 5, [hl] + set 4, [hl] + ret +; 2418a + +.InitFlags_b: ; 2418a + ld a, [wMenuData_2DMenuSpacing] + or $20 + ld [w2DMenuCursorOffsets], a + ret +; 24193 + +.InitFlags_c: ; 24193 + ld hl, wMenuDataFlags + ld a, A_BUTTON + bit 0, [hl] + jr nz, .skip + or B_BUTTON +.skip + bit 1, [hl] + jr z, .skip2 + or SELECT +.skip2 + ld [wMenuJoypadFilter], a + ret +; 241a8 + + +_StaticMenuJoypad:: ; 241a8 + call Place2DMenuCursor +_ScrollingMenuJoypad:: ; 241ab + ld hl, w2DMenuFlags2 + res 7, [hl] + ld a, [hBGMapMode] + push af + call MenuJoypadLoop + pop af + ld [hBGMapMode], a + ret +; 241ba + +MobileMenuJoypad: ; 241ba + ld hl, w2DMenuFlags2 + res 7, [hl] + ld a, [hBGMapMode] + push af + call Move2DMenuCursor + call Do2DMenuRTCJoypad + jr nc, .skip_joypad + call _2DMenuInterpretJoypad +.skip_joypad + pop af + ld [hBGMapMode], a + call GetMenuJoypad + ld c, a + ret +; 241d5 + + +Unreferenced_Function241d5: ; 241d5 + call Place2DMenuCursor +.loop + call Move2DMenuCursor + call HDMATransferTileMapToWRAMBank3 ; BUG: This function is in another bank. + ; Pointer in current bank (9) is bogus. + call .loop2 + jr nc, .done + call _2DMenuInterpretJoypad + jr c, .done + ld a, [w2DMenuFlags1] + bit 7, a + jr nz, .done + call GetMenuJoypad + ld c, a + ld a, [wMenuJoypadFilter] + and c + jr z, .loop + +.done + ret + +.loop2 + call Menu_WasButtonPressed + ret c + ld c, 1 + ld b, 3 + call AdvanceMobileInactivityTimerAndCheckExpired ; BUG: This function is in another bank. + ; Pointer in current bank (9) is bogus. + ret c + farcall Function100337 + ret c + ld a, [w2DMenuFlags1] + bit 7, a + jr z, .loop2 + and a + ret +; 24216 + + +MenuJoypadLoop: ; 24216 +.loop + call Move2DMenuCursor + call .BGMap_OAM + call Do2DMenuRTCJoypad + jr nc, .done + call _2DMenuInterpretJoypad + jr c, .done + ld a, [w2DMenuFlags1] + bit 7, a + jr nz, .done + call GetMenuJoypad + ld b, a + ld a, [wMenuJoypadFilter] + and b + jr z, .loop + +.done + ret +; 24238 + +.BGMap_OAM: ; 24238 + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + call WaitBGMap + pop af + ld [hOAMUpdate], a + xor a + ld [hBGMapMode], a + ret +; 24249 + +Do2DMenuRTCJoypad: ; 24249 +.loopRTC + call RTC + call Menu_WasButtonPressed + ret c + ld a, [w2DMenuFlags1] + bit 7, a + jr z, .loopRTC + and a + ret +; 24259 + +Menu_WasButtonPressed: ; 24259 + ld a, [w2DMenuFlags1] + bit 6, a + jr z, .skip_to_joypad + callfar PlaySpriteAnimationsAndDelayFrame + +.skip_to_joypad + call JoyTextDelay + call GetMenuJoypad + and a + ret z + scf + ret +; 24270 + +_2DMenuInterpretJoypad: ; 24270 + call GetMenuJoypad + bit A_BUTTON_F, a + jp nz, .a_b_start_select + bit B_BUTTON_F, a + jp nz, .a_b_start_select + bit SELECT_F, a + jp nz, .a_b_start_select + bit START_F, a + jp nz, .a_b_start_select + bit D_RIGHT_F, a + jr nz, .d_right + bit D_LEFT_F, a + jr nz, .d_left + bit D_UP_F, a + jr nz, .d_up + bit D_DOWN_F, a + jr nz, .d_down + and a + ret + +.set_bit_7 ; 24299 + ld hl, w2DMenuFlags2 + set 7, [hl] + scf + ret + +.d_down + ld hl, wMenuCursorY + ld a, [w2DMenuNumRows] + cp [hl] + jr z, .check_wrap_around_down + inc [hl] + xor a + ret + +.check_wrap_around_down + ld a, [w2DMenuFlags1] + bit 5, a + jr nz, .wrap_around_down + bit 3, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_down + ld [hl], $1 + xor a + ret + +.d_up + ld hl, wMenuCursorY + ld a, [hl] + dec a + jr z, .check_wrap_around_up + ld [hl], a + xor a + ret + +.check_wrap_around_up + ld a, [w2DMenuFlags1] + bit 5, a + jr nz, .wrap_around_up + bit 2, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_up + ld a, [w2DMenuNumRows] + ld [hl], a + xor a + ret + +.d_left + ld hl, wMenuCursorX + ld a, [hl] + dec a + jr z, .check_wrap_around_left + ld [hl], a + xor a + ret + +.check_wrap_around_left + ld a, [w2DMenuFlags1] + bit 4, a + jr nz, .wrap_around_left + bit 1, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_left + ld a, [w2DMenuNumCols] + ld [hl], a + xor a + ret + +.d_right + ld hl, wMenuCursorX + ld a, [w2DMenuNumCols] + cp [hl] + jr z, .check_wrap_around_right + inc [hl] + xor a + ret + +.check_wrap_around_right + ld a, [w2DMenuFlags1] + bit 4, a + jr nz, .wrap_around_right + bit 0, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_right + ld [hl], $1 + xor a + ret +; 24318 + +.a_b_start_select ; 24318 + xor a + ret +; 2431a + +Move2DMenuCursor: ; 2431a + ld hl, wCursorCurrentTile + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hl] + cp "▶" + jr nz, Place2DMenuCursor + ld a, [wCursorOffCharacter] + ld [hl], a +Place2DMenuCursor: ; 24329 + ld a, [w2DMenuCursorInitY] + ld b, a + ld a, [w2DMenuCursorInitX] + ld c, a + call Coord2Tile + ld a, [w2DMenuCursorOffsets] + swap a + and $f + ld c, a + ld a, [wMenuCursorY] + ld b, a + xor a + dec b + jr z, .got_row +.row_loop + add c + dec b + jr nz, .row_loop + +.got_row + ld c, SCREEN_WIDTH + call AddNTimes + ld a, [w2DMenuCursorOffsets] + and $f + ld c, a + ld a, [wMenuCursorX] + ld b, a + xor a + dec b + jr z, .got_col +.col_loop + add c + dec b + jr nz, .col_loop + +.got_col + ld c, a + add hl, bc + ld a, [hl] + cp "▶" + jr z, .cursor_on + ld [wCursorOffCharacter], a + ld [hl], "▶" + +.cursor_on + ld a, l + ld [wCursorCurrentTile], a + ld a, h + ld [wCursorCurrentTile + 1], a + ret +; 24374 + +_PushWindow:: ; 24374 + ld a, [rSVBK] + push af + ld a, BANK(wWindowStack) + ld [rSVBK], a + + ld hl, wWindowStackPointer + ld e, [hl] + inc hl + ld d, [hl] + push de + + ld b, $10 + ld hl, wMenuFlags +.loop + ld a, [hli] + ld [de], a + dec de + dec b + jr nz, .loop + +; If bit 6 or 7 of the menu flags is set, set bit 0 of the address +; at 7:[wWindowStackPointer], and draw the menu using the coordinates from the header. +; Otherwise, reset bit 0 of 7:[wWindowStackPointer]. + ld a, [wMenuFlags] + bit 6, a + jr nz, .bit_6 + bit 7, a + jr z, .not_bit_7 + +.bit_6 + ld hl, wWindowStackPointer + ld a, [hli] + ld h, [hl] + ld l, a + set 0, [hl] + call MenuBoxCoord2Tile + call .copy + call MenuBoxCoord2Attr + call .copy + jr .done + +.not_bit_7 + pop hl ; last-pushed register was de + push hl + ld a, [hld] + ld l, [hl] + ld h, a + res 0, [hl] + +.done + pop hl + call .ret ; empty function + ld a, h + ld [de], a + dec de + ld a, l + ld [de], a + dec de + ld hl, wWindowStackPointer + ld [hl], e + inc hl + ld [hl], d + + pop af + ld [rSVBK], a + ld hl, wWindowStackSize + inc [hl] + ret +; 243cd + +.copy ; 243cd + call GetMenuBoxDims + inc b + inc c + call .ret ; empty function + +.row + push bc + push hl + +.col + ld a, [hli] + ld [de], a + dec de + dec c + jr nz, .col + + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + + ret +; 243e7 + +.ret ; 243e7 + ret +; 243e8 + +_ExitMenu:: ; 243e8 + xor a + ld [hBGMapMode], a + + ld a, [rSVBK] + push af + ld a, BANK(wWindowStack) + ld [rSVBK], a + + call GetWindowStackTop + ld a, l + or h + jp z, Error_Cant_ExitMenu + ld a, l + ld [wWindowStackPointer], a + ld a, h + ld [wWindowStackPointer + 1], a + call PopWindow + ld a, [wMenuFlags] + bit 0, a + jr z, .loop + ld d, h + ld e, l + call RestoreTileBackup + +.loop + call GetWindowStackTop + ld a, h + or l + jr z, .done + call PopWindow + +.done + pop af + ld [rSVBK], a + ld hl, wWindowStackSize + dec [hl] + ret +; 24423 + +Unreferenced_Function24423: ; 24423 + ld a, [wVramState] + bit 0, a + ret z + xor a ; sScratch + call GetSRAMBank + hlcoord 0, 0 + ld de, sScratch + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + call CopyBytes + call CloseSRAM + call OverworldTextModeSwitch + xor a ; sScratch + call GetSRAMBank + ld hl, sScratch + decoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT +.loop + ld a, [hl] + cp $61 + jr c, .next + ld [de], a +.next + inc hl + inc de + dec bc + ld a, c + or b + jr nz, .loop + call CloseSRAM + ret +; 2445d + +Error_Cant_ExitMenu: ; 2445d + ld hl, .Text_NoWindowsAvailableForPopping + call PrintText + call WaitBGMap +.InfiniteLoop: + jr .InfiniteLoop +; 24468 + +.Text_NoWindowsAvailableForPopping: ; 24468 + text_jump UnknownText_0x1c46b7 + db "@" +; 2446d + +_InitVerticalMenuCursor:: ; 2446d + ld a, [wMenuDataFlags] + ld b, a + ld hl, w2DMenuCursorInitY + ld a, [wMenuBorderTopCoord] + inc a + bit 6, b + jr nz, .skip_offset + inc a +.skip_offset + ld [hli], a +; w2DMenuCursorInitX + ld a, [wMenuBorderLeftCoord] + inc a + ld [hli], a +; w2DMenuNumRows + ld a, [wMenuDataItems] + ld [hli], a +; w2DMenuNumCols + ld a, 1 + ld [hli], a +; w2DMenuFlags1 + ld [hl], $0 + bit 5, b + jr z, .skip_bit_5 + set 5, [hl] +.skip_bit_5 + ld a, [wMenuFlags] + bit 4, a + jr z, .skip_bit_6 + set 6, [hl] +.skip_bit_6 + inc hl +; w2DMenuFlags2 + xor a + ld [hli], a +; w2DMenuCursorOffsets + ln a, 2, 0 + ld [hli], a +; wMenuJoypadFilter + ld a, A_BUTTON + bit 0, b + jr nz, .skip_bit_1 + add B_BUTTON +.skip_bit_1 + ld [hli], a +; wMenuCursorY + ld a, [wMenuCursorBuffer] + and a + jr z, .load_at_the_top + ld c, a + ld a, [wMenuDataItems] + cp c + jr nc, .load_position +.load_at_the_top + ld c, 1 +.load_position + ld [hl], c + inc hl +; wMenuCursorX + ld a, 1 + ld [hli], a +; wCursorOffCharacter, wCursorCurrentTile + xor a + ld [hli], a + ld [hli], a + ld [hli], a + ret +; 244c3 diff --git a/engine/menu/menu_2.asm b/engine/menu/menu_2.asm new file mode 100644 index 000000000..16cce5348 --- /dev/null +++ b/engine/menu/menu_2.asm @@ -0,0 +1,253 @@ +PlaceMenuItemName: ; 0x24ab4 + push de + ld a, [wMenuSelection] + ld [wNamedObjectIndexBuffer], a + call GetItemName + pop hl + call PlaceString + ret + +PlaceMenuItemQuantity: ; 0x24ac3 + push de + ld a, [wMenuSelection] + ld [wCurItem], a + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + pop hl + and a + jr nz, .done + ld de, $15 + add hl, de + ld [hl], "×" + inc hl + ld de, wMenuSelectionQuantity + lb bc, 1, 2 + call PrintNum + +.done + ret + +PlaceMoneyTopRight: ; 24ae8 + ld hl, MenuHeader_0x24b15 + call CopyMenuHeader + jr PlaceMoneyTextBox + +PlaceMoneyBottomLeft: ; 24af0 + ld hl, MenuHeader_0x24b1d + call CopyMenuHeader + jr PlaceMoneyTextBox + +PlaceMoneyAtTopLeftOfTextbox: ; 24af8 + ld hl, MenuHeader_0x24b15 + lb de, 0, 11 + call OffsetMenuHeader + +PlaceMoneyTextBox: ; 24b01 + call MenuBox + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + 1 + add hl, de + ld de, wMoney + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + ret + +MenuHeader_0x24b15: ; 0x24b15 + db MENU_BACKUP_TILES ; flags + menu_coords 11, 0, SCREEN_WIDTH - 1, 2 + dw NULL + db 1 ; default option + +MenuHeader_0x24b1d: ; 0x24b1d + db MENU_BACKUP_TILES ; flags + menu_coords 0, 11, 8, 13 + dw NULL + db 1 ; default option + +DisplayCoinCaseBalance: ; 24b25 + ; Place a text box of size 1x7 at 11, 0. + hlcoord 11, 0 + ld b, 1 + ld c, 7 + call TextBox + hlcoord 12, 0 + ld de, CoinString + call PlaceString + hlcoord 17, 1 + ld de, ShowMoney_TerminatorString + call PlaceString + ld de, wCoins + lb bc, 2, 4 + hlcoord 13, 1 + call PrintNum + ret + +DisplayMoneyAndCoinBalance: ; 24b4e + hlcoord 5, 0 + ld b, 3 + ld c, 13 + call TextBox + hlcoord 6, 1 + ld de, MoneyString + call PlaceString + hlcoord 12, 1 + ld de, wMoney + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + hlcoord 6, 3 + ld de, CoinString + call PlaceString + hlcoord 15, 3 + ld de, wCoins + lb bc, 2, 4 + call PrintNum + ret + +MoneyString: ; 24b83 + db "MONEY@" +CoinString: ; 24b89 + db "COIN@" +ShowMoney_TerminatorString: ; 24b8e + db "@" + +Unreferenced_Function24b8f: ; 24b8f +; related to safari? + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + hlcoord 0, 0 + ld b, 3 + ld c, 7 + call TextBox + hlcoord 1, 1 + ld de, wSafariTimeRemaining + lb bc, 2, 3 + call PrintNum + hlcoord 4, 1 + ld de, .slash_500 + call PlaceString + hlcoord 1, 3 + ld de, .booru_ko + call PlaceString + hlcoord 5, 3 + ld de, wSafariBallsRemaining + lb bc, 1, 2 + call PrintNum + pop af + ld [wOptions], a + ret + +.slash_500 ; 24bcf + db "/500@" +.booru_ko ; 24bd4 + db "ボール   こ@" + +StartMenu_DrawBugContestStatusBox: ; 24bdc + hlcoord 0, 0 + ld b, 5 + ld c, 17 + call TextBox + ret + +StartMenu_PrintBugContestStatus: ; 24be7 + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call StartMenu_DrawBugContestStatusBox + hlcoord 1, 5 + ld de, .Balls_EN + call PlaceString + hlcoord 8, 5 + ld de, wParkBallsRemaining + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + hlcoord 1, 1 + ld de, .CAUGHT + call PlaceString + ld a, [wContestMon] + and a + ld de, .None + jr z, .no_contest_mon + ld [wd265], a + call GetPokemonName + +.no_contest_mon + hlcoord 8, 1 + call PlaceString + ld a, [wContestMon] + and a + jr z, .skip_level + hlcoord 1, 3 + ld de, .LEVEL + call PlaceString + ld a, [wContestMonLevel] + ld h, b + ld l, c + inc hl + ld c, 3 + call Print8BitNumRightAlign + +.skip_level + pop af + ld [wOptions], a + ret + +.Balls_JP: ; 24c43 + db "ボール   こ@" +.CAUGHT: ; 24c4b + db "CAUGHT@" +.Balls_EN: ; 24c52 + db "BALLS:@" +.None: ; 24c59 + db "None@" +.LEVEL: ; 24c5e + db "LEVEL@" + +FindApricornsInBag: ; 24c64 +; Checks the bag for Apricorns. + ld hl, wBuffer1 + xor a + ld [hli], a + dec a + ld bc, 10 + call ByteFill + + ld hl, ApricornBalls +.loop + ld a, [hl] + cp -1 + jr z, .done + push hl + ld [wCurItem], a + ld hl, wNumItems + call CheckItem + pop hl + jr nc, .nope + ld a, [hl] + call .addtobuffer +.nope + inc hl + inc hl + jr .loop + +.done + ld a, [wBuffer1] + and a + ret nz + scf + ret + +.addtobuffer ; 24c94 + push hl + ld hl, wBuffer1 + inc [hl] + ld e, [hl] + ld d, 0 + add hl, de + ld [hl], a + pop hl + ret + +INCLUDE "data/items/apricorn_balls.asm" diff --git a/engine/menu/mon_menu.asm b/engine/menu/mon_menu.asm new file mode 100755 index 000000000..088b1b1a3 --- /dev/null +++ b/engine/menu/mon_menu.asm @@ -0,0 +1,304 @@ +INCLUDE "data/mon_menu.asm" + +MonSubmenu: ; 24d19 + xor a + ld [hBGMapMode], a + call GetMonSubmenuItems + farcall FreezeMonIcons + ld hl, .MenuHeader + call LoadMenuHeader + call .GetTopCoord + call PopulateMonMenu + + ld a, 1 + ld [hBGMapMode], a + call MonMenuLoop + ld [wMenuSelection], a + + call ExitMenu + ret +; 24d3f + +.MenuHeader: ; 24d3f + db MENU_BACKUP_TILES ; flags + menu_coords 6, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw 0 + db 1 ; default option +; 24d47 + +.GetTopCoord: ; 24d47 +; TopCoord = 1 + BottomCoord - 2 * (NumSubmenuItems + 1) + ld a, [wBuffer1] + inc a + add a + ld b, a + ld a, [wMenuBorderBottomCoord] + sub b + inc a + ld [wMenuBorderTopCoord], a + call MenuBox + ret +; 24d59 + +MonMenuLoop: ; 24d59 +.loop + ld a, MENU_UNUSED_3 | MENU_BACKUP_TILES_2 ; flags + ld [wMenuDataFlags], a + ld a, [wBuffer1] ; items + ld [wMenuDataItems], a + call InitVerticalMenuCursor + ld hl, w2DMenuFlags1 + set 6, [hl] + call StaticMenuJoypad + ld de, SFX_READ_TEXT_2 + call PlaySFX + ld a, [hJoyPressed] + bit A_BUTTON_F, a + jr nz, .select + bit B_BUTTON_F, a + jr nz, .cancel + jr .loop + +.cancel + ld a, MONMENUITEM_CANCEL + ret + +.select + ld a, [wMenuCursorY] + dec a + ld c, a + ld b, 0 + ld hl, wBuffer2 + add hl, bc + ld a, [hl] + ret +; 24d91 + +PopulateMonMenu: ; 24d91 + call MenuBoxCoord2Tile + ld bc, 2 * SCREEN_WIDTH + 2 + add hl, bc + ld de, wBuffer2 +.loop + ld a, [de] + inc de + cp -1 + ret z + push de + push hl + call GetMonMenuString + pop hl + call PlaceString + ld bc, 2 * SCREEN_WIDTH + add hl, bc + pop de + jr .loop +; 24db0 + +GetMonMenuString: ; 24db0 + ld hl, MonMenuOptions + 1 + ld de, 3 + call IsInArray + dec hl + ld a, [hli] + cp MONMENU_MENUOPTION + jr z, .NotMove + inc hl + ld a, [hl] + ld [wd265], a + call GetMoveName + ret + +.NotMove: + inc hl + ld a, [hl] + dec a + ld hl, MonMenuOptionStrings + call GetNthString + ld d, h + ld e, l + ret +; 24dd4 + +GetMonSubmenuItems: ; 24dd4 + call ResetMonSubmenu + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + ld a, [wLinkMode] + and a + jr nz, .skip_moves + ld a, MON_MOVES + call GetPartyParamLocation + ld d, h + ld e, l + ld c, NUM_MOVES +.loop + push bc + push de + ld a, [de] + and a + jr z, .next + push hl + call IsFieldMove + pop hl + jr nc, .next + call AddMonMenuItem + +.next + pop de + inc de + pop bc + dec c + jr nz, .loop + +.skip_moves + ld a, MONMENUITEM_STATS + call AddMonMenuItem + ld a, MONMENUITEM_SWITCH + call AddMonMenuItem + ld a, MONMENUITEM_MOVE + call AddMonMenuItem + ld a, [wLinkMode] + and a + jr nz, .skip2 + push hl + ld a, MON_ITEM + call GetPartyParamLocation + ld d, [hl] + farcall ItemIsMail + pop hl + ld a, MONMENUITEM_MAIL + jr c, .ok + ld a, MONMENUITEM_ITEM + +.ok + call AddMonMenuItem + +.skip2 + ld a, [wBuffer1] + cp NUM_MONMENU_ITEMS + jr z, .ok2 + ld a, MONMENUITEM_CANCEL + call AddMonMenuItem + +.ok2 + call TerminateMonSubmenu + ret + +.egg + ld a, MONMENUITEM_STATS + call AddMonMenuItem + ld a, MONMENUITEM_SWITCH + call AddMonMenuItem + ld a, MONMENUITEM_CANCEL + call AddMonMenuItem + call TerminateMonSubmenu + ret +; 24e52 + +IsFieldMove: ; 24e52 + ld b, a + ld hl, MonMenuOptions +.next + ld a, [hli] + cp -1 + jr z, .nope + cp MONMENU_MENUOPTION + jr z, .nope + ld d, [hl] + inc hl + ld a, [hli] + cp b + jr nz, .next + ld a, d + scf + +.nope + ret +; 24e68 + +ResetMonSubmenu: ; 24e68 + xor a + ld [wBuffer1], a + ld hl, wBuffer2 + ld bc, NUM_MONMENU_ITEMS + 1 + call ByteFill + ret +; 24e76 + +TerminateMonSubmenu: ; 24e76 + ld a, [wBuffer1] + ld e, a + ld d, 0 + ld hl, wBuffer2 + add hl, de + ld [hl], -1 + ret +; 24e83 + +AddMonMenuItem: ; 24e83 + push hl + push de + push af + ld a, [wBuffer1] + ld e, a + inc a + ld [wBuffer1], a + ld d, 0 + ld hl, wBuffer2 + add hl, de + pop af + ld [hl], a + pop de + pop hl + ret +; 24e99 + +BattleMonMenu: ; 24e99 + ld hl, MenuHeader_0x24ed4 + call CopyMenuHeader + xor a + ld [hBGMapMode], a + call MenuBox + call UpdateSprites + call PlaceVerticalMenuItems + call WaitBGMap + call CopyMenuData + ld a, [wMenuDataFlags] + bit 7, a + jr z, .set_carry + call InitVerticalMenuCursor + ld hl, w2DMenuFlags1 + set 6, [hl] + call StaticMenuJoypad + ld de, SFX_READ_TEXT_2 + call PlaySFX + ld a, [hJoyPressed] + bit B_BUTTON_F, a + jr z, .clear_carry + ret z + +.set_carry + scf + ret + +.clear_carry + and a + ret +; 24ed4 + +MenuHeader_0x24ed4: ; 24ed4 + db 0 ; flags + menu_coords 11, 11, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw MenuData_0x24edc + db 1 ; default option +; 24edc + +MenuData_0x24edc: ; 24edc + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 3 ; items + db "SWITCH@" + db "STATS@" + db "CANCEL@" +; 24ef2 diff --git a/engine/menu/naming_screen.asm b/engine/menu/naming_screen.asm new file mode 100755 index 000000000..a958e10eb --- /dev/null +++ b/engine/menu/naming_screen.asm @@ -0,0 +1,1467 @@ +NAMINGSCREEN_CURSOR EQU $7e + +NAMINGSCREEN_BORDER EQUS "\"■\"" ; $60 +NAMINGSCREEN_MIDDLELINE EQUS "\"→\"" ; $eb +NAMINGSCREEN_UNDERLINE EQUS "\"\"" ; $f2 + +_NamingScreen: ; 0x116b7 + call DisableSpriteUpdates + call NamingScreen + call ReturnToMapWithSpeechTextbox + ret + +; 0x116c1 + +NamingScreen: ; 116c1 + ld hl, wNamingScreenDestinationPointer + ld [hl], e + inc hl + ld [hl], d + ld hl, wNamingScreenType + ld [hl], b + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + call .SetUpNamingScreen + call DelayFrame +.loop + call NamingScreenJoypadLoop + jr nc, .loop + pop af + ld [hInMenu], a + pop af + ld [hMapAnims], a + pop af + ld [wOptions], a + call ClearJoypad + ret + +; 116f8 + +.SetUpNamingScreen: ; 116f8 + call ClearBGPalettes + ld b, SCGB_DIPLOMA + call GetSGBLayout + call DisableLCD + call LoadNamingScreenGFX + call NamingScreen_InitText + ld a, LCDC_DEFAULT + ld [rLCDC], a + call .GetNamingScreenSetup + call WaitBGMap + call WaitTop + call SetPalettes + call NamingScreen_InitNameEntry + ret + +; 1171d + +.GetNamingScreenSetup: ; 1171d + ld a, [wNamingScreenType] + and 7 + 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 + +; 1172e + +.Jumptable: ; 1172e (4:572e) + dw .Pokemon + dw .Player + dw .Rival + dw .Mom + dw .Box + dw .Tomodachi + dw .Pokemon + dw .Pokemon + +.Pokemon: ; 1173e (4:573e) + ld a, [wCurPartySpecies] + ld [wd265], a + ld hl, LoadMenuMonIcon + ld a, BANK(LoadMenuMonIcon) + ld e, $1 + rst FarCall ; ; indirect jump to LoadMenuMonIcon (8e83f (23:683f)) + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + hlcoord 5, 2 + call PlaceString + ld l, c + ld h, b + ld de, .NicknameStrings + call PlaceString + inc de + hlcoord 5, 4 + call PlaceString + farcall GetGender + jr c, .genderless + ld a, "♂" + jr nz, .place_gender + ld a, "♀" +.place_gender + hlcoord 1, 2 + ld [hl], a +.genderless + call .StoreMonIconParams + ret + +; 11780 (4:5780) + +.NicknameStrings: ; 11780 + db "'S@" + db "NICKNAME?@" + +; 1178d + +.Player: ; 1178d (4:578d) + farcall GetPlayerIcon + call .LoadSprite + hlcoord 5, 2 + ld de, .PlayerNameString + call PlaceString + call .StoreSpriteIconParams + ret + +; 117a3 (4:57a3) + +.PlayerNameString: ; 117a3 + db "YOUR NAME?@" + +; 117ae + +.Rival: ; 117ae (4:57ae) + ld de, SilverSpriteGFX + ld b, BANK(SilverSpriteGFX) + call .LoadSprite + hlcoord 5, 2 + ld de, .RivalNameString + call PlaceString + call .StoreSpriteIconParams + ret + +; 117c3 (4:57c3) + +.RivalNameString: ; 117c3 + db "RIVAL'S NAME?@" + +; 117d1 + +.Mom: ; 117d1 (4:57d1) + ld de, MomSpriteGFX + ld b, BANK(MomSpriteGFX) + call .LoadSprite + hlcoord 5, 2 + ld de, .MomNameString + call PlaceString + call .StoreSpriteIconParams + ret + +; 117e6 (4:57e6) + +.MomNameString: ; 117e6 + db "MOTHER'S NAME?@" + +; 117f5 + +.Box: ; 117f5 (4:57f5) + ld de, PokeBallSpriteGFX + ld hl, vTiles0 tile $00 + lb bc, BANK(PokeBallSpriteGFX), 4 + call Request2bpp + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], a + depixel 4, 4, 4, 0 + ld a, SPRITE_ANIM_INDEX_RED_WALK + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], $0 + hlcoord 5, 2 + ld de, .BoxNameString + call PlaceString + call .StoreBoxIconParams + ret + +; 11822 (4:5822) + +.BoxNameString: ; 11822 + db "BOX NAME?@" + +; 1182c + +.Tomodachi: ; 1182c (4:582c) + hlcoord 3, 2 + ld de, .oTomodachi_no_namae_sutoringu + call PlaceString + call .StoreSpriteIconParams + ret + +; 11839 (4:5839) + +.oTomodachi_no_namae_sutoringu ; 11839 + db "おともだち の なまえは?@" + +; 11847 + +.LoadSprite: ; 11847 (4:5847) + push de + ld hl, vTiles0 tile $00 + ld c, $4 + push bc + call Request2bpp + pop bc + ld hl, 12 tiles + add hl, de + ld e, l + ld d, h + ld hl, vTiles0 tile $04 + call Request2bpp + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], a + pop de + ld b, SPRITE_ANIM_INDEX_RED_WALK + ld a, d + cp HIGH(KrisSpriteGFX) + jr nz, .not_kris + ld a, e + cp LOW(KrisSpriteGFX) + jr nz, .not_kris + ld b, SPRITE_ANIM_INDEX_BLUE_WALK +.not_kris + ld a, b + depixel 4, 4, 4, 0 + call _InitSpriteAnimStruct + ret + +.StoreMonIconParams: ; 1187b (4:587b) + ld a, MON_NAME_LENGTH - 1 + hlcoord 5, 6 + jr .StoreParams + +.StoreSpriteIconParams: ; 11882 (4:5882) + ld a, PLAYER_NAME_LENGTH - 1 + hlcoord 5, 6 + jr .StoreParams + +.StoreBoxIconParams: ; 11889 (4:5889) + ld a, BOX_NAME_LENGTH - 1 + hlcoord 5, 4 + jr .StoreParams + +.StoreParams: ; 11890 (4:5890) + ld [wNamingScreenMaxNameLength], a + ld a, l + ld [wNamingScreenStringEntryCoord], a + ld a, h + ld [wNamingScreenStringEntryCoord + 1], a + ret + +NamingScreen_IsTargetBox: ; 1189c + push bc + push af + ld a, [wNamingScreenType] + sub $3 + ld b, a + pop af + dec b + pop bc + ret + +; 118a8 + +NamingScreen_InitText: ; 118a8 + call WaitTop + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, NAMINGSCREEN_BORDER + call ByteFill + hlcoord 1, 1 + lb bc, 6, 18 + call NamingScreen_IsTargetBox + jr nz, .not_box + lb bc, 4, 18 + +.not_box + call ClearBox + ld de, NameInputUpper +NamingScreen_ApplyTextInputMode: ; 118ca + call NamingScreen_IsTargetBox + jr nz, .not_box + ld hl, BoxNameInputLower - NameInputLower + add hl, de + ld d, h + ld e, l + +.not_box + push de + hlcoord 1, 8 + lb bc, 7, 18 + call NamingScreen_IsTargetBox + jr nz, .not_box_2 + hlcoord 1, 6 + lb bc, 9, 18 + +.not_box_2 + call ClearBox + hlcoord 1, 16 + lb bc, 1, 18 + call ClearBox + pop de + hlcoord 2, 8 + ld b, $5 + call NamingScreen_IsTargetBox + jr nz, .row + hlcoord 2, 6 + ld b, $6 + +.row + ld c, $11 +.col + ld a, [de] + ld [hli], a + inc de + dec c + jr nz, .col + push de + ld de, 2 * SCREEN_WIDTH - $11 + add hl, de + pop de + dec b + jr nz, .row + ret + +; 11915 + +NamingScreenJoypadLoop: ; 11915 + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .quit + call .RunJumptable + farcall PlaySpriteAnimationsAndDelayFrame + call .UpdateStringEntry + call DelayFrame + and a + ret + +.quit + callfar ClearSpriteAnims + call ClearSprites + xor a + ld [hSCX], a + ld [hSCY], a + scf + ret + +; 11940 + +.UpdateStringEntry: ; 11940 + xor a + ld [hBGMapMode], a + hlcoord 1, 5 + call NamingScreen_IsTargetBox + jr nz, .got_coords + hlcoord 1, 3 + +.got_coords + lb bc, 1, 18 + call ClearBox + ld hl, wNamingScreenDestinationPointer + ld e, [hl] + inc hl + ld d, [hl] + ld hl, wNamingScreenStringEntryCoord + ld a, [hli] + ld h, [hl] + ld l, a + call PlaceString + ld a, $1 + ld [hBGMapMode], a + ret + +; 11968 + +.RunJumptable: ; 11968 + 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 + +; 11977 + +.Jumptable: ; 11977 (4:5977) + dw .InitCursor + dw .ReadButtons + +.InitCursor: ; 1197b (4:597b) + depixel 10, 3 + call NamingScreen_IsTargetBox + jr nz, .got_cursor_position + ld d, 8 * 8 +.got_cursor_position + ld a, SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR + call _InitSpriteAnimStruct + ld a, c + ld [wNamingScreenCursorObjectPointer], a + ld a, b + ld [wNamingScreenCursorObjectPointer + 1], a + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld [hl], a + ld hl, wJumptableIndex + inc [hl] + ret + +.ReadButtons: ; 119a1 (4:59a1) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and A_BUTTON + jr nz, .a + ld a, [hl] + and B_BUTTON + jr nz, .b + ld a, [hl] + and START + jr nz, .start + ld a, [hl] + and SELECT + jr nz, .select + ret + +.a + call .GetCursorPosition + cp $1 + jr z, .select + cp $2 + jr z, .b + cp $3 + jr z, .end + call NamingScreen_GetLastCharacter + call NamingScreen_TryAddCharacter + ret nc + +.start + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $8 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $4 + call NamingScreen_IsTargetBox + ret nz + inc [hl] + ret + +.b + call NamingScreen_DeleteCharacter + ret + +.end + call NamingScreen_StoreEntry + ld hl, wJumptableIndex + set 7, [hl] + ret + +.select + ld hl, wNamingScreenLetterCase + ld a, [hl] + xor 1 + ld [hl], a + jr z, .upper + ld de, NameInputLower + call NamingScreen_ApplyTextInputMode + ret + +.upper + ld de, NameInputUpper + call NamingScreen_ApplyTextInputMode + ret + +.GetCursorPosition: ; 11a0b (4:5a0b) + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + +NamingScreen_GetCursorPosition: ; 11a11 (4:5a11) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + push bc + ld b, $4 + call NamingScreen_IsTargetBox + jr nz, .not_box + inc b +.not_box + cp b + pop bc + jr nz, .not_bottom_row + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $3 + jr c, .case_switch + cp $6 + jr c, .delete + ld a, $3 + ret + +.case_switch + ld a, $1 + ret + +.delete + ld a, $2 + ret + +.not_bottom_row + xor a + ret + +NamingScreen_AnimateCursor: ; 11a3b (4:5a3b) + call .GetDPad + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + ld e, a + swap e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], e + ld d, $4 + call NamingScreen_IsTargetBox + jr nz, .ok + inc d +.ok + cp d + ld de, .LetterEntries + ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 0 + jr nz, .ok2 + ld de, .CaseDelEnd + ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR_BIG - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 1 +.ok2 + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + add [hl] ; default SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld l, [hl] + ld h, $0 + add hl, de + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; 11a79 (4:5a79) + +.LetterEntries: ; 11a79 + db $00, $10, $20, $30, $40, $50, $60, $70, $80 + +.CaseDelEnd: ; 11a82 + db $00, $00, $00, $30, $30, $30, $60, $60, $60 + +; 11a8b + +.GetDPad: ; 11a8b (4:5a8b) + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .up + ld a, [hl] + and D_DOWN + jr nz, .down + ld a, [hl] + and D_LEFT + jr nz, .left + ld a, [hl] + and D_RIGHT + jr nz, .right + ret + +.right + call NamingScreen_GetCursorPosition + and a + jr nz, .asm_11ab7 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $8 + jr nc, .asm_11ab4 + inc [hl] + ret + +.asm_11ab4 + ld [hl], $0 + ret + +.asm_11ab7 + cp $3 + jr nz, .asm_11abc + xor a +.asm_11abc + ld e, a + add a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.left + call NamingScreen_GetCursorPosition + and a + jr nz, .asm_11ad8 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_11ad5 + dec [hl] + ret + +.asm_11ad5 + ld [hl], $8 + ret + +.asm_11ad8 + cp $1 + jr nz, .asm_11ade + ld a, $4 +.asm_11ade + dec a + dec a + ld e, a + add a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.down + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + call NamingScreen_IsTargetBox + jr nz, .asm_11af9 + cp $5 + jr nc, .asm_11aff + inc [hl] + ret + +.asm_11af9 + cp $4 + jr nc, .asm_11aff + inc [hl] + ret + +.asm_11aff + ld [hl], $0 + ret + +.up + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_11b0c + dec [hl] + ret + +.asm_11b0c + ld [hl], $4 + call NamingScreen_IsTargetBox + ret nz + inc [hl] + ret + +NamingScreen_TryAddCharacter: ; 11b14 (4:5b14) + ld a, [wNamingScreenLastCharacter] ; lost +MailComposition_TryAddCharacter: ; 11b17 (4:5b17) + ld a, [wNamingScreenMaxNameLength] + ld c, a + ld a, [wNamingScreenCurrNameLength] + cp c + ret nc + + ld a, [wNamingScreenLastCharacter] + +NamingScreen_LoadNextCharacter: ; 11b23 + call NamingScreen_GetTextCursorPosition + ld [hl], a + +NamingScreen_AdvanceCursor_CheckEndOfString: ; 11b27 + ld hl, wNamingScreenCurrNameLength + inc [hl] + call NamingScreen_GetTextCursorPosition + ld a, [hl] + cp "@" + jr z, .end_of_string + ld [hl], NAMINGSCREEN_UNDERLINE + and a + ret + +.end_of_string + scf + ret + +; 11b39 (4:5b39) + +; unused + ld a, [wNamingScreenCurrNameLength] + and a + ret z + push hl + ld hl, wNamingScreenCurrNameLength + dec [hl] + call NamingScreen_GetTextCursorPosition + ld c, [hl] + pop hl + +.loop + ld a, [hli] + cp $ff + jr z, NamingScreen_AdvanceCursor_CheckEndOfString + cp c + jr z, .done + inc hl + jr .loop + +.done + ld a, [hl] + jr NamingScreen_LoadNextCharacter + +; 11b56 + +INCLUDE "data/text/unused_dakutens.asm" + +; 11bbc + +NamingScreen_DeleteCharacter: ; 11bbc (4:5bbc) + ld hl, wNamingScreenCurrNameLength + ld a, [hl] + and a + ret z + dec [hl] + call NamingScreen_GetTextCursorPosition + ld [hl], NAMINGSCREEN_UNDERLINE + inc hl + ld a, [hl] + cp NAMINGSCREEN_UNDERLINE + ret nz + ld [hl], NAMINGSCREEN_MIDDLELINE + ret + +NamingScreen_GetTextCursorPosition: ; 11bd0 (4:5bd0) + push af + ld hl, wNamingScreenDestinationPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wNamingScreenCurrNameLength] + ld e, a + ld d, 0 + add hl, de + pop af + ret + +; 11be0 + +NamingScreen_InitNameEntry: ; 11be0 +; load NAMINGSCREEN_UNDERLINE, (NAMINGSCREEN_MIDDLELINE * [wNamingScreenMaxNameLength]), "@" into the dw address at wNamingScreenDestinationPointer + ld hl, wNamingScreenDestinationPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld [hl], NAMINGSCREEN_UNDERLINE + inc hl + ld a, [wNamingScreenMaxNameLength] + dec a + ld c, a + ld a, NAMINGSCREEN_MIDDLELINE +.loop + ld [hli], a + dec c + jr nz, .loop + ld [hl], "@" + ret + +; 11bf7 + +NamingScreen_StoreEntry: ; 11bf7 (4:5bf7) + ld hl, wNamingScreenDestinationPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wNamingScreenMaxNameLength] + ld c, a +.loop + ld a, [hl] + cp NAMINGSCREEN_MIDDLELINE + jr z, .terminator + cp NAMINGSCREEN_UNDERLINE + jr nz, .not_terminator +.terminator + ld [hl], "@" +.not_terminator + inc hl + dec c + jr nz, .loop + ret + +NamingScreen_GetLastCharacter: ; 11c11 (4:5c11) + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + add [hl] + sub $8 + srl a + srl a + srl a + ld e, a + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + add [hl] + sub $10 + srl a + srl a + srl a + ld d, a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH +.loop + ld a, d + and a + jr z, .done + add hl, bc + dec d + jr .loop + +.done + add hl, de + ld a, [hl] + ld [wNamingScreenLastCharacter], a + ret + +LoadNamingScreenGFX: ; 11c51 + call ClearSprites + callfar ClearSpriteAnims + call LoadStandardFont + call LoadFontsExtra + + ld de, NamingScreenGFX_MiddleLine + ld hl, vTiles0 tile NAMINGSCREEN_MIDDLELINE + lb bc, BANK(NamingScreenGFX_MiddleLine), 1 + call Get1bpp + + ld de, NamingScreenGFX_UnderLine + ld hl, vTiles0 tile NAMINGSCREEN_UNDERLINE + lb bc, BANK(NamingScreenGFX_UnderLine), 1 + call Get1bpp + + ld de, vTiles2 tile NAMINGSCREEN_BORDER + ld hl, NamingScreenGFX_Border + ld bc, 1 tiles + ld a, BANK(NamingScreenGFX_Border) + call FarCopyBytes + + ld de, vTiles0 tile NAMINGSCREEN_CURSOR + ld hl, NamingScreenGFX_Cursor + ld bc, 2 tiles + ld a, BANK(NamingScreenGFX_Cursor) + call FarCopyBytes + + ld a, $5 + ld hl, wSpriteAnimDict + 9 * 2 + ld [hli], a + ld [hl], NAMINGSCREEN_CURSOR + xor a + ld [hSCY], a + ld [wGlobalAnimYOffset], a + ld [hSCX], a + ld [wGlobalAnimXOffset], a + ld [wJumptableIndex], a + ld [wNamingScreenLetterCase], a + ld [hBGMapMode], a + ld [wNamingScreenCurrNameLength], a + ld a, $7 + ld [hWX], a + ret + +; 11cb7 + +NamingScreenGFX_Border: ; 11cb7 +INCBIN "gfx/naming_screen/border.2bpp" +; 11cc7 + +NamingScreenGFX_Cursor: ; 11cc7 +INCBIN "gfx/naming_screen/cursor.2bpp" +; 11ce7 + +INCLUDE "data/text/name_input_chars.asm" +; 11e5d + +NamingScreenGFX_End: ; unused +INCBIN "gfx/naming_screen/end.1bpp" +; 11e6d + +NamingScreenGFX_MiddleLine: +INCBIN "gfx/naming_screen/middle_line.1bpp" +; 11e6d + +NamingScreenGFX_UnderLine: ; 11e6d +INCBIN "gfx/naming_screen/underline.1bpp" +; 11e75 + +_ComposeMailMessage: ; 11e75 (mail?) + ld hl, wNamingScreenDestinationPointer + ld [hl], e + inc hl + ld [hl], d + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + call .InitBlankMail + call DelayFrame + +.loop + call .DoMailEntry + jr nc, .loop + + pop af + ld [hInMenu], a + pop af + ld [hMapAnims], a + ret + +.InitBlankMail: ; 11e9a (4:5e9a) + call ClearBGPalettes + call DisableLCD + call LoadNamingScreenGFX + ld de, vTiles0 tile $00 + ld hl, .MailIcon + ld bc, 8 tiles + ld a, BANK(.MailIcon) + call FarCopyBytes + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], a + + ; init mail icon + depixel 3, 2 + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call _InitSpriteAnimStruct + + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], $0 + call .InitCharset + ld a, LCDC_DEFAULT + ld [rLCDC], a + call .initwNamingScreenMaxNameLength + ld b, SCGB_DIPLOMA + call GetSGBLayout + call WaitBGMap + call WaitTop + ld a, %11100100 + call DmgToCgbBGPals + ld a, %11100100 + call DmgToCgbObjPal0 + call NamingScreen_InitNameEntry + ld hl, wNamingScreenDestinationPointer + ld e, [hl] + inc hl + ld d, [hl] + ld hl, MAIL_LINE_LENGTH + add hl, de + ld [hl], "" + ret + +; 11ef4 (4:5ef4) + +.MailIcon: ; 11ef4 +INCBIN "gfx/icons/mail_big.2bpp" +; 11f74 + +.initwNamingScreenMaxNameLength ; 11f74 (4:5f74) + ld a, MAIL_MSG_LENGTH + 1 + ld [wNamingScreenMaxNameLength], a + ret + +; 11f7a (4:5f7a) + +.UnusedString11f7a: + db "メールを かいてね@" + +; 11f84 + +.InitCharset: ; 11f84 (4:5f84) + call WaitTop + hlcoord 0, 0 + ld bc, 6 * SCREEN_WIDTH + ld a, NAMINGSCREEN_BORDER + call ByteFill + hlcoord 0, 6 + ld bc, 12 * SCREEN_WIDTH + ld a, " " + call ByteFill + hlcoord 1, 1 + lb bc, 4, SCREEN_WIDTH - 2 + call ClearBox + ld de, MailEntry_Uppercase + +.PlaceMailCharset: ; 11fa9 (4:5fa9) + hlcoord 1, 7 + ld b, 6 +.next + ld c, SCREEN_WIDTH - 1 +.loop_ + ld a, [de] + ld [hli], a + inc de + dec c + jr nz, .loop_ + push de + ld de, SCREEN_WIDTH + 1 + add hl, de + pop de + dec b + jr nz, .next + ret + +.DoMailEntry: ; 11fc0 (4:5fc0) + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .exit_mail + call .DoJumptable + farcall PlaySpriteAnimationsAndDelayFrame + call .Update + call DelayFrame + and a + ret + +.exit_mail + callfar ClearSpriteAnims + call ClearSprites + xor a + ld [hSCX], a + ld [hSCY], a + scf + ret + +.Update: ; 11feb (4:5feb) + xor a + ld [hBGMapMode], a + hlcoord 1, 1 + lb bc, 4, 18 + call ClearBox + ld hl, wNamingScreenDestinationPointer + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 2, 2 + call PlaceString + ld a, $1 + ld [hBGMapMode], a + ret + +.DoJumptable: ; 12008 (4:6008) + 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: ; 12017 (4:6017) + dw .init_blinking_cursor + dw .process_joypad + +.init_blinking_cursor ; 1201b (4:601b) + depixel 9, 2 + ld a, SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR + call _InitSpriteAnimStruct + ld a, c + ld [wNamingScreenCursorObjectPointer], a + ld a, b + ld [wNamingScreenCursorObjectPointer + 1], a + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld [hl], a + ld hl, wJumptableIndex + inc [hl] + ret + +.process_joypad ; 1203a (4:603a) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and A_BUTTON + jr nz, .a + ld a, [hl] + and B_BUTTON + jr nz, .b + ld a, [hl] + and START + jr nz, .start + ld a, [hl] + and SELECT + jr nz, .select + ret + +.a + call NamingScreen_PressedA_GetCursorCommand + cp $1 + jr z, .select + cp $2 + jr z, .b + cp $3 + jr z, .finished + call NamingScreen_GetLastCharacter + call MailComposition_TryAddLastCharacter + jr c, .start + ld hl, wNamingScreenCurrNameLength + ld a, [hl] + cp MAIL_LINE_LENGTH + ret nz + inc [hl] + call NamingScreen_GetTextCursorPosition + ld [hl], NAMINGSCREEN_UNDERLINE + dec hl + ld [hl], "" + ret + +.start + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $9 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $5 + ret + +.b + call NamingScreen_DeleteCharacter + ld hl, wNamingScreenCurrNameLength + ld a, [hl] + cp MAIL_LINE_LENGTH + ret nz + dec [hl] + call NamingScreen_GetTextCursorPosition + ld [hl], NAMINGSCREEN_UNDERLINE + inc hl + ld [hl], "" + ret + +.finished + call NamingScreen_StoreEntry + ld hl, wJumptableIndex + set 7, [hl] + ret + +.select + ld hl, wNamingScreenLetterCase + ld a, [hl] + xor 1 + ld [hl], a + jr nz, .switch_to_lowercase + ld de, MailEntry_Uppercase + call .PlaceMailCharset + ret + +.switch_to_lowercase + ld de, MailEntry_Lowercase + call .PlaceMailCharset + ret + +; called from engine/sprite_anims.asm + +ComposeMail_AnimateCursor: ; 120c1 (4:60c1) + call .GetDPad + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + ld e, a + swap e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], e + cp $5 + ld de, .LetterEntries + ld a, 0 + jr nz, .got_pointer + ld de, .CaseDelEnd + ld a, 1 +.got_pointer + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + add [hl] + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld l, [hl] + ld h, 0 + add hl, de + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; 120f8 (4:60f8) + +.LetterEntries: ; 120f8 + db $00, $10, $20, $30, $40, $50, $60, $70, $80, $90 + +.CaseDelEnd: ; 12102 + db $00, $00, $00, $30, $30, $30, $60, $60, $60, $60 + +; 1210c + +.GetDPad: ; 1210c (4:610c) + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .up + ld a, [hl] + and D_DOWN + jr nz, .down + ld a, [hl] + and D_LEFT + jr nz, .left + ld a, [hl] + and D_RIGHT + jr nz, .right + ret + +.right + call ComposeMail_GetCursorPosition + and a + jr nz, .case_del_done_right + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $9 + jr nc, .wrap_around_letter_right + inc [hl] + ret + +.wrap_around_letter_right + ld [hl], $0 + ret + +.case_del_done_right + cp $3 + jr nz, .wrap_around_command_right + xor a +.wrap_around_command_right + ld e, a + add a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.left + call ComposeMail_GetCursorPosition + and a + jr nz, .caps_del_done_left + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .wrap_around_letter_left + dec [hl] + ret + +.wrap_around_letter_left + ld [hl], $9 + ret + +.caps_del_done_left + cp $1 + jr nz, .wrap_around_command_left + ld a, $4 +.wrap_around_command_left + dec a + dec a + ld e, a + add a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.down + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $5 + jr nc, .wrap_around_down + inc [hl] + ret + +.wrap_around_down + ld [hl], $0 + ret + +.up + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .wrap_around_up + dec [hl] + ret + +.wrap_around_up + ld [hl], $5 + ret + +NamingScreen_PressedA_GetCursorCommand: ; 12185 (4:6185) + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + +ComposeMail_GetCursorPosition: ; 1218b (4:618b) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $5 + jr nz, .letter + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $3 + jr c, .case + cp $6 + jr c, .del + ld a, $3 + ret + +.case + ld a, $1 + ret + +.del + ld a, $2 + ret + +.letter + xor a + ret + +MailComposition_TryAddLastCharacter: ; 121ac (4:61ac) + ld a, [wNamingScreenLastCharacter] + jp MailComposition_TryAddCharacter + +; 121b2 (4:61b2) + +; unused + ld a, [wNamingScreenCurrNameLength] + and a + ret z + cp $11 + jr nz, .asm_121c3 + push hl + ld hl, wNamingScreenCurrNameLength + dec [hl] + dec [hl] + jr .asm_121c8 + +.asm_121c3 + push hl + ld hl, wNamingScreenCurrNameLength + dec [hl] + +.asm_121c8 + call NamingScreen_GetTextCursorPosition + ld c, [hl] + pop hl +.asm_121cd + ld a, [hli] + cp $ff + jp z, NamingScreen_AdvanceCursor_CheckEndOfString + cp c + jr z, .asm_121d9 + inc hl + jr .asm_121cd + +.asm_121d9 + ld a, [hl] + jp NamingScreen_LoadNextCharacter + +; 121dd + +INCLUDE "data/text/mail_input_chars.asm" + +; 122c1 diff --git a/engine/menu/options_menu.asm b/engine/menu/options_menu.asm new file mode 100755 index 000000000..c0a255cb0 --- /dev/null +++ b/engine/menu/options_menu.asm @@ -0,0 +1,583 @@ +_OptionsMenu: ; e41d0 + ld hl, hInMenu + ld a, [hl] + push af + ld [hl], $1 + call ClearBGPalettes + hlcoord 0, 0 + ld b, 16 + ld c, 18 + call TextBox + hlcoord 2, 2 + ld de, StringOptions + call PlaceString + xor a + ld [wJumptableIndex], a + ld c, $6 ; number of items on the menu minus 1 (for cancel) + +.print_text_loop ; this next will display the settings of each option when the menu is opened + push bc + xor a + ld [hJoyLast], a + call GetOptionPointer + pop bc + ld hl, wJumptableIndex + inc [hl] + dec c + jr nz, .print_text_loop + + call UpdateFrame + xor a + ld [wJumptableIndex], a + inc a + ld [hBGMapMode], a + call WaitBGMap + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + +.joypad_loop + call JoyTextDelay + ld a, [hJoyPressed] + and START | B_BUTTON + jr nz, .ExitOptions + call OptionsControl + jr c, .dpad + call GetOptionPointer + jr c, .ExitOptions + +.dpad + call Options_UpdateCursorPosition + ld c, 3 + call DelayFrames + jr .joypad_loop + +.ExitOptions: + ld de, SFX_TRANSACTION + call PlaySFX + call WaitSFX + pop af + ld [hInMenu], a + ret +; e4241 + +StringOptions: ; e4241 + db "TEXT SPEED" + db " :" + db "BATTLE SCENE" + db " :" + db "BATTLE STYLE" + db " :" + db "SOUND" + db " :" + db "PRINT" + db " :" + db "MENU ACCOUNT" + db " :" + db "FRAME" + db " :TYPE" + db "CANCEL@" +; e42d6 + + +GetOptionPointer: ; e42d6 + ld a, [wJumptableIndex] ; load the cursor position to a + ld e, a ; copy it to de + ld d, 0 + ld hl, .Pointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl ; jump to the code of the current highlighted item +; e42e5 + +.Pointers: + dw Options_TextSpeed + dw Options_BattleScene + dw Options_BattleStyle + dw Options_Sound + dw Options_Print + dw Options_MenuAccount + dw Options_Frame + dw Options_Cancel +; e42f5 + + + const_def + const OPT_TEXT_SPEED_FAST ; 0 + const OPT_TEXT_SPEED_MED ; 1 + const OPT_TEXT_SPEED_SLOW ; 2 + +Options_TextSpeed: ; e42f5 + call GetTextSpeed + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + ld a, c ; right pressed + cp OPT_TEXT_SPEED_SLOW + jr c, .Increase + ld c, OPT_TEXT_SPEED_FAST + -1 + +.Increase: + inc c + ld a, e + jr .Save + +.LeftPressed: + ld a, c + and a + jr nz, .Decrease + ld c, OPT_TEXT_SPEED_SLOW + 1 + +.Decrease: + dec c + ld a, d + +.Save: + ld b, a + ld a, [wOptions] + and $f0 + or b + ld [wOptions], a + +.NonePressed: + ld b, 0 + ld hl, .Strings + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 11, 3 + call PlaceString + and a + ret +; e4331 + +.Strings: +; entries correspond to OPT_TEXT_SPEED_* constants + dw .Fast + dw .Mid + dw .Slow + +.Fast: db "FAST@" +.Mid: db "MID @" +.Slow: db "SLOW@" +; e4346 + + +GetTextSpeed: ; e4346 +; converts TEXT_DELAY_* value in a to OPT_TEXT_SPEED_* value in c, +; with previous/next TEXT_DELAY_* values in d/e + ld a, [wOptions] + and $7 + cp TEXT_DELAY_SLOW + jr z, .slow + cp TEXT_DELAY_FAST + jr z, .fast + ; none of the above + ld c, OPT_TEXT_SPEED_MED + lb de, TEXT_DELAY_FAST, TEXT_DELAY_SLOW + ret + +.slow + ld c, OPT_TEXT_SPEED_SLOW + lb de, TEXT_DELAY_MED, TEXT_DELAY_FAST + ret + +.fast + ld c, OPT_TEXT_SPEED_FAST + lb de, TEXT_DELAY_SLOW, TEXT_DELAY_MED + ret +; e4365 + + +Options_BattleScene: ; e4365 + ld hl, wOptions + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + bit BATTLE_SCENE, [hl] + jr nz, .ToggleOn + jr .ToggleOff + +.LeftPressed: + bit BATTLE_SCENE, [hl] + jr z, .ToggleOff + jr .ToggleOn + +.NonePressed: + bit BATTLE_SCENE, [hl] + jr z, .ToggleOn + jr .ToggleOff + +.ToggleOn: + res BATTLE_SCENE, [hl] + ld de, .On + jr .Display + +.ToggleOff: + set BATTLE_SCENE, [hl] + ld de, .Off + +.Display: + hlcoord 11, 5 + call PlaceString + and a + ret +; e4398 + +.On: db "ON @" +.Off: db "OFF@" +; e43a0 + + +Options_BattleStyle: ; e43a0 + ld hl, wOptions + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + bit BATTLE_SHIFT, [hl] + jr nz, .ToggleShift + jr .ToggleSet + +.LeftPressed: + bit BATTLE_SHIFT, [hl] + jr z, .ToggleSet + jr .ToggleShift + +.NonePressed: + bit BATTLE_SHIFT, [hl] + jr nz, .ToggleSet + +.ToggleShift: + res BATTLE_SHIFT, [hl] + ld de, .Shift + jr .Display + +.ToggleSet: + set BATTLE_SHIFT, [hl] + ld de, .Set + +.Display: + hlcoord 11, 7 + call PlaceString + and a + ret +; e43d1 + +.Shift: db "SHIFT@" +.Set: db "SET @" +; e43dd + + +Options_Sound: ; e43dd + ld hl, wOptions + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + bit STEREO, [hl] + jr nz, .SetMono + jr .SetStereo + +.LeftPressed: + bit STEREO, [hl] + jr z, .SetStereo + jr .SetMono + +.NonePressed: + bit STEREO, [hl] + jr nz, .ToggleStereo + jr .ToggleMono + +.SetMono: + res STEREO, [hl] + call RestartMapMusic + +.ToggleMono: + ld de, .Mono + jr .Display + +.SetStereo: + set STEREO, [hl] + call RestartMapMusic + +.ToggleStereo: + ld de, .Stereo + +.Display: + hlcoord 11, 9 + call PlaceString + and a + ret +; e4416 + +.Mono: db "MONO @" +.Stereo: db "STEREO@" +; e4424 + + + const_def + const OPT_PRINT_LIGHTEST ; 0 + const OPT_PRINT_LIGHTER ; 1 + const OPT_PRINT_NORMAL ; 2 + const OPT_PRINT_DARKER ; 3 + const OPT_PRINT_DARKEST ; 4 + +Options_Print: ; e4424 + call GetPrinterSetting + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + ld a, c + cp OPT_PRINT_DARKEST + jr c, .Increase + ld c, OPT_PRINT_LIGHTEST - 1 + +.Increase: + inc c + ld a, e + jr .Save + +.LeftPressed: + ld a, c + and a + jr nz, .Decrease + ld c, OPT_PRINT_DARKEST + 1 + +.Decrease: + dec c + ld a, d + +.Save: + ld b, a + ld [wGBPrinter], a + +.NonePressed: + ld b, $0 + ld hl, .Strings + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 11, 11 + call PlaceString + and a + ret +; e445a + +.Strings: +; entries correspond to OPT_PRINT_* constants + dw .Lightest + dw .Lighter + dw .Normal + dw .Darker + dw .Darkest + +.Lightest: db "LIGHTEST@" +.Lighter: db "LIGHTER @" +.Normal: db "NORMAL @" +.Darker: db "DARKER @" +.Darkest: db "DARKEST @" +; e4491 + + +GetPrinterSetting: ; e4491 +; converts GBPRINTER_* value in a to OPT_PRINT_* value in c, +; with previous/next GBPRINTER_* values in d/e + ld a, [wGBPrinter] + and a + jr z, .IsLightest + cp GBPRINTER_LIGHTER + jr z, .IsLight + cp GBPRINTER_DARKER + jr z, .IsDark + cp GBPRINTER_DARKEST + jr z, .IsDarkest + ; none of the above + ld c, OPT_PRINT_NORMAL + lb de, GBPRINTER_LIGHTER, GBPRINTER_DARKER + ret + +.IsLightest: + ld c, OPT_PRINT_LIGHTEST + lb de, GBPRINTER_DARKEST, GBPRINTER_LIGHTER + ret + +.IsLight: + ld c, OPT_PRINT_LIGHTER + lb de, GBPRINTER_LIGHTEST, GBPRINTER_NORMAL + ret + +.IsDark: + ld c, OPT_PRINT_DARKER + lb de, GBPRINTER_NORMAL, GBPRINTER_DARKEST + ret + +.IsDarkest: + ld c, OPT_PRINT_DARKEST + lb de, GBPRINTER_DARKER, GBPRINTER_LIGHTEST + ret +; e44c1 + +Options_MenuAccount: ; e44c1 + ld hl, wOptions2 + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + bit MENU_ACCOUNT, [hl] + jr nz, .ToggleOff + jr .ToggleOn + +.LeftPressed: + bit MENU_ACCOUNT, [hl] + jr z, .ToggleOn + jr .ToggleOff + +.NonePressed: + bit MENU_ACCOUNT, [hl] + jr nz, .ToggleOn + +.ToggleOff: + res MENU_ACCOUNT, [hl] + ld de, .Off + jr .Display + +.ToggleOn: + set MENU_ACCOUNT, [hl] + ld de, .On + +.Display: + hlcoord 11, 13 + call PlaceString + and a + ret +; e44f2 + +.Off: db "OFF@" +.On: db "ON @" +; e44fa + + +Options_Frame: ; e44fa + ld hl, wTextBoxFrame + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr nz, .RightPressed + and a + ret + +.RightPressed: + ld a, [hl] + inc a + jr .Save + +.LeftPressed: + ld a, [hl] + dec a + +.Save: + and $7 + ld [hl], a +UpdateFrame: ; e4512 + ld a, [wTextBoxFrame] + hlcoord 16, 15 ; where on the screen the number is drawn + add "1" + ld [hl], a + call LoadFontsExtra + and a + ret +; e4520 + +Options_Cancel: ; e4520 + ld a, [hJoyPressed] + and A_BUTTON + jr nz, .Exit + and a + ret + +.Exit: + scf + ret +; e452a + +OptionsControl: ; e452a + ld hl, wJumptableIndex + ld a, [hJoyLast] + cp D_DOWN + jr z, .DownPressed + cp D_UP + jr z, .UpPressed + and a + ret + +.DownPressed: + ld a, [hl] ; load the cursor position to a + cp $7 ; maximum number of items in option menu + jr nz, .CheckFive + ld [hl], $0 + scf + ret + +.CheckFive: ; I have no idea why this exists... + cp $5 + jr nz, .Increase + ld [hl], $5 + +.Increase: + inc [hl] + scf + ret + +.UpPressed: + ld a, [hl] + cp $6 + jr nz, .NotSix + ld [hl], $5 ; Another thing where I'm not sure why it exists + scf + ret + +.NotSix: + and a + jr nz, .Decrease + ld [hl], $8 ; number of option items +1 + +.Decrease: + dec [hl] + scf + ret +; e455c + +Options_UpdateCursorPosition: ; e455c + hlcoord 1, 1 + ld de, SCREEN_WIDTH + ld c, $10 +.loop + ld [hl], " " + add hl, de + dec c + jr nz, .loop + hlcoord 1, 2 + ld bc, 2 * SCREEN_WIDTH + ld a, [wJumptableIndex] + call AddNTimes + ld [hl], "▶" + ret +; e4579 diff --git a/engine/menu/pack.asm b/engine/menu/pack.asm new file mode 100644 index 000000000..ea3a051ac --- /dev/null +++ b/engine/menu/pack.asm @@ -0,0 +1,1711 @@ +; Pack.Jumptable and BattlePack.Jumptable indexes + const_def + const PACKSTATE_INITGFX ; 0 + const PACKSTATE_INITITEMSPOCKET ; 1 + const PACKSTATE_ITEMSPOCKETMENU ; 2 + const PACKSTATE_INITBALLSPOCKET ; 3 + const PACKSTATE_BALLSPOCKETMENU ; 4 + const PACKSTATE_INITKEYITEMSPOCKET ; 5 + const PACKSTATE_KEYITEMSPOCKETMENU ; 6 + const PACKSTATE_INITTMHMPOCKET ; 7 + const PACKSTATE_TMHMPOCKETMENU ; 8 + const PACKSTATE_QUITNOSCRIPT ; 9 + const PACKSTATE_QUITRUNSCRIPT ; 10 + +Pack: ; 10000 + ld hl, wOptions + set NO_TEXT_SCROLL, [hl] + call InitPackBuffers +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call .RunJumptable + call DelayFrame + jr .loop + +.done + ld a, [wCurrPocket] + ld [wLastPocket], a + ld hl, wOptions + res NO_TEXT_SCROLL, [hl] + ret +; 10026 + +.RunJumptable: ; 10026 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call Pack_GetJumptablePointer + jp hl + +; 10030 + +.Jumptable: ; 10030 (4:4030) +; entries correspond to PACKSTATE_* constants + dw .InitGFX ; 0 + dw .InitItemsPocket ; 1 + dw .ItemsPocketMenu ; 2 + dw .InitBallsPocket ; 3 + dw .BallsPocketMenu ; 4 + dw .InitKeyItemsPocket ; 5 + dw .KeyItemsPocketMenu ; 6 + dw .InitTMHMPocket ; 7 + dw .TMHMPocketMenu ; 8 + dw Pack_QuitNoScript ; 9 + dw Pack_QuitRunScript ; 10 + +.InitGFX: ; 10046 (4:4046) + xor a + ld [hBGMapMode], a + call Pack_InitGFX + ld a, [wPackJumptableIndex] + ld [wJumptableIndex], a + call Pack_InitColors + ret + +.InitItemsPocket: ; 10056 (4:4056) + xor a ; ITEM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.ItemsPocketMenu: ; 10067 (4:4067) + ld hl, ItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wItemsPocketCursor], a + ld b, PACKSTATE_INITTMHMPOCKET ; left + ld c, PACKSTATE_INITBALLSPOCKET ; right + call Pack_InterpretJoypad + ret c + call .ItemBallsKey_LoadSubmenu + ret + +.InitKeyItemsPocket: ; 10094 (4:4094) + ld a, KEY_ITEM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.KeyItemsPocketMenu: ; 100a6 (4:40a6) + ld hl, KeyItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wKeyItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wKeyItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wKeyItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wKeyItemsPocketCursor], a + ld b, PACKSTATE_INITBALLSPOCKET ; left + ld c, PACKSTATE_INITTMHMPOCKET ; right + call Pack_InterpretJoypad + ret c + call .ItemBallsKey_LoadSubmenu + ret + +.InitTMHMPocket: ; 100d3 (4:40d3) + ld a, TM_HM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + xor a + ld [hBGMapMode], a + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.TMHMPocketMenu: ; 100e8 (4:40e8) + farcall TMHMPocket + ld b, PACKSTATE_INITKEYITEMSPOCKET ; left + ld c, PACKSTATE_INITITEMSPOCKET ; right + call Pack_InterpretJoypad + ret c + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .use_quit + ld hl, .MenuHeader2 + ld de, .Jumptable2 + jr .load_jump + +.use_quit + ld hl, .MenuHeader1 + ld de, .Jumptable1 +.load_jump + push de + call LoadMenuHeader + call VerticalMenu + call ExitMenu + pop hl + ret c + ld a, [wMenuCursorY] + dec a + call Pack_GetJumptablePointer + jp hl + +; 10124 (4:4124) +.MenuHeader1: ; 0x10124 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData_1 + db 1 ; default option +; 0x1012c + +.MenuData_1: ; 0x1012c + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "USE@" + db "QUIT@" +; 0x10137 + +.Jumptable1: ; 10137 + dw .UseItem + dw QuitItemSubmenu + +; 1013b + +.MenuHeader2: ; 0x1013b + db MENU_BACKUP_TILES ; flags + menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData_2 + db 1 ; default option +; 0x10143 + +.MenuData_2: ; 0x10143 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 3 ; items + db "USE@" + db "GIVE@" + db "QUIT@" +; 0x10153 + +.Jumptable2: ; 10153 + dw .UseItem + dw GiveItem + dw QuitItemSubmenu +; 10159 + +.UseItem: ; 10159 + farcall AskTeachTMHM + ret c + farcall ChooseMonToLearnTMHM + jr c, .declined + ld hl, wOptions + ld a, [hl] + push af + res NO_TEXT_SCROLL, [hl] + farcall TeachTMHM + pop af + ld [wOptions], a +.declined + xor a + ld [hBGMapMode], a + call Pack_InitGFX + call WaitBGMap_DrawPackGFX + call Pack_InitColors + ret + +.InitBallsPocket: ; 10186 (4:4186) + ld a, BALL_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.BallsPocketMenu: ; 10198 (4:4198) + ld hl, BallsPocketMenuHeader + call CopyMenuHeader + ld a, [wBallsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wBallsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wBallsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wBallsPocketCursor], a + ld b, PACKSTATE_INITITEMSPOCKET ; left + ld c, PACKSTATE_INITKEYITEMSPOCKET ; right + call Pack_InterpretJoypad + ret c + call .ItemBallsKey_LoadSubmenu + ret + +.ItemBallsKey_LoadSubmenu: ; 101c5 (4:41c5) + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .tossable + farcall CheckSelectableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .selectable + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .usable + jr .unusable + +.selectable + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .selectable_usable + jr .selectable_unusable + +.tossable + farcall CheckSelectableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .tossable_selectable + jr .tossable_unselectable + +.usable + ld hl, MenuHeader_UsableKeyItem + ld de, Jumptable_UseGiveTossRegisterQuit + jr .build_menu + +.selectable_usable + ld hl, MenuHeader_UsableItem + ld de, Jumptable_UseGiveTossQuit + jr .build_menu + +.tossable_selectable + ld hl, MenuHeader_UnusableItem + ld de, Jumptable_UseQuit + jr .build_menu + +.tossable_unselectable + ld hl, MenuHeader_UnusableKeyItem + ld de, Jumptable_UseRegisterQuit + jr .build_menu + +.unusable + ld hl, MenuHeader_HoldableKeyItem + ld de, Jumptable_GiveTossRegisterQuit + jr .build_menu + +.selectable_unusable + ld hl, MenuHeader_HoldableItem + ld de, Jumptable_GiveTossQuit +.build_menu + push de + call LoadMenuHeader + call VerticalMenu + call ExitMenu + pop hl + ret c + ld a, [wMenuCursorY] + dec a + call Pack_GetJumptablePointer + jp hl + +; 10249 (4:4249) +MenuHeader_UsableKeyItem: ; 0x10249 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10251 + +.MenuData: ; 0x10251 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 5 ; items + db "USE@" + db "GIVE@" + db "TOSS@" + db "SEL@" + db "QUIT@" +; 0x1026a + +Jumptable_UseGiveTossRegisterQuit: ; 1026a + dw UseItem + dw GiveItem + dw TossMenu + dw RegisterItem + dw QuitItemSubmenu +; 10274 + +MenuHeader_UsableItem: ; 0x10274 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x1027c + +.MenuData: ; 0x1027c + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 4 ; items + db "USE@" + db "GIVE@" + db "TOSS@" + db "QUIT@" +; 0x10291 + +Jumptable_UseGiveTossQuit: ; 10291 + dw UseItem + dw GiveItem + dw TossMenu + dw QuitItemSubmenu +; 10299 + +MenuHeader_UnusableItem: ; 0x10299 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x102a1 + +.MenuData: ; 0x102a1 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "USE@" + db "QUIT@" +; 0x102ac + +Jumptable_UseQuit: ; 102ac + dw UseItem + dw QuitItemSubmenu +; 102b0 + +MenuHeader_UnusableKeyItem: ; 0x102b0 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x102b8 + +.MenuData: ; 0x102b8 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 3 ; items + db "USE@" + db "SEL@" + db "QUIT@" +; 0x102c7 + +Jumptable_UseRegisterQuit: ; 102c7 + dw UseItem + dw RegisterItem + dw QuitItemSubmenu +; 102cd + +MenuHeader_HoldableKeyItem: ; 0x102cd + db MENU_BACKUP_TILES ; flags + menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x102d5 + +.MenuData: ; 0x102d5 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 4 ; items + db "GIVE@" + db "TOSS@" + db "SEL@" + db "QUIT@" +; 0x102ea + +Jumptable_GiveTossRegisterQuit: ; 102ea + dw GiveItem + dw TossMenu + dw RegisterItem + dw QuitItemSubmenu +; 102f2 + +MenuHeader_HoldableItem: ; 0x102f2 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x102fa + +.MenuData: ; 0x102fa + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 3 ; items + db "GIVE@" + db "TOSS@" + db "QUIT@" +; 0x1030b + +Jumptable_GiveTossQuit: ; 1030b + dw GiveItem + dw TossMenu + dw QuitItemSubmenu + +; 10311 + +UseItem: ; 10311 + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + ld hl, .dw + rst JumpTable + ret +; 1031f + +.dw ; 1031f (4:431f) +; entries correspond to ITEMMENU_* constants + dw .Oak ; ITEMMENU_NOUSE + dw .Oak + dw .Oak + dw .Oak + dw .Current ; ITEMMENU_CURRENT + dw .Party ; ITEMMENU_PARTY + dw .Field ; ITEMMENU_CLOSE +; 1035c + +.Oak: ; 1032d (4:432d) + ld hl, Text_ThisIsntTheTime + call Pack_PrintTextNoScroll + ret + +.Current: ; 10334 (4:4334) + call DoItemEffect + ret + +.Party: ; 10338 (4:4338) + ld a, [wPartyCount] + and a + jr z, .NoPokemon + call DoItemEffect + xor a + ld [hBGMapMode], a + call Pack_InitGFX + call WaitBGMap_DrawPackGFX + call Pack_InitColors + ret + +.NoPokemon: + ld hl, TextJump_YouDontHaveAMon + call Pack_PrintTextNoScroll + ret + +.Field: ; 10355 (4:4355) + call DoItemEffect + ld a, [wItemEffectSucceeded] + and a + jr z, .Oak + ld a, PACKSTATE_QUITRUNSCRIPT + ld [wJumptableIndex], a + ret +; 10364 (4:4364) + +TossMenu: ; 10364 + ld hl, Text_ThrowAwayHowMany + call Pack_PrintTextNoScroll + farcall SelectQuantityToToss + push af + call ExitMenu + pop af + jr c, .finish + call Pack_GetItemName + ld hl, Text_ConfirmThrowAway + call MenuTextBox + call YesNoBox + push af + call ExitMenu + pop af + jr c, .finish + ld hl, wNumItems + ld a, [wCurItemQuantity] + call TossItem + call Pack_GetItemName + ld hl, Text_ThrewAway + call Pack_PrintTextNoScroll +.finish + ret +; 1039d + +Unreferenced_ResetPocketCursorPositions: ; 1039d + ld a, [wCurrPocket] + and a ; ITEM_POCKET + jr z, .items + dec a ; BALL_POCKET + jr z, .balls + dec a ; KEY_ITEM_POCKET + jr z, .key + ret + +.balls + xor a + ld [wBallsPocketCursor], a + ld [wBallsPocketScrollPosition], a + ret + +.items + xor a + ld [wItemsPocketCursor], a + ld [wItemsPocketScrollPosition], a + ret + +.key + xor a + ld [wKeyItemsPocketCursor], a + ld [wKeyItemsPocketScrollPosition], a + ret +; 103c2 + +RegisterItem: ; 103c2 + farcall CheckSelectableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .cant_register + ld a, [wCurrPocket] + rrca + rrca + and $c0 + ld b, a + ld a, [wCurItemQuantity] + inc a + and $3f + or b + ld [wWhichRegisteredItem], a + ld a, [wCurItem] + ld [wRegisteredItem], a + call Pack_GetItemName + ld de, SFX_FULL_HEAL + call WaitPlaySFX + ld hl, Text_RegisteredItem + call Pack_PrintTextNoScroll + ret + +.cant_register + ld hl, Text_CantRegister + call Pack_PrintTextNoScroll + ret +; 103fd + +GiveItem: ; 103fd + ld a, [wPartyCount] + and a + jp z, .NoPokemon + ld a, [wOptions] + push af + res NO_TEXT_SCROLL, a + ld [wOptions], a + ld a, PARTYMENUACTION_GIVE_ITEM + ld [wPartyMenuActionText], a + call ClearBGPalettes + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX +.loop + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + jr c, .finish + ld a, [wCurPartySpecies] + cp EGG + jr nz, .give + ld hl, .Egg + call PrintText + jr .loop + +.give + ld a, [wJumptableIndex] + push af + ld a, [wPackJumptableIndex] + push af + call GetCurNick + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + call TryGiveItemToPartymon + pop af + ld [wPackJumptableIndex], a + pop af + ld [wJumptableIndex], a +.finish + pop af + ld [wOptions], a + xor a + ld [hBGMapMode], a + call Pack_InitGFX + call WaitBGMap_DrawPackGFX + call Pack_InitColors + ret + +.NoPokemon: ; 10486 (4:4486) + ld hl, TextJump_YouDontHaveAMon + call Pack_PrintTextNoScroll + ret +; 1048d (4:448d) +.Egg: ; 0x1048d + ; An EGG can't hold an item. + text_jump Text_AnEGGCantHoldAnItem + db "@" +; 0x10492 + +QuitItemSubmenu: ; 10492 + ret +; 10493 + +BattlePack: ; 10493 + ld hl, wOptions + set NO_TEXT_SCROLL, [hl] + call InitPackBuffers +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .end + call .RunJumptable + call DelayFrame + jr .loop + +.end + ld a, [wCurrPocket] + ld [wLastPocket], a + ld hl, wOptions + res NO_TEXT_SCROLL, [hl] + ret +; 104b9 + +.RunJumptable: ; 104b9 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call Pack_GetJumptablePointer + jp hl + +; 104c3 + +.Jumptable: ; 104c3 (4:44c3) +; entries correspond to PACKSTATE_* constants + dw .InitGFX ; 0 + dw .InitItemsPocket ; 1 + dw .ItemsPocketMenu ; 2 + dw .InitBallsPocket ; 3 + dw .BallsPocketMenu ; 4 + dw .InitKeyItemsPocket ; 5 + dw .KeyItemsPocketMenu ; 6 + dw .InitTMHMPocket ; 7 + dw .TMHMPocketMenu ; 8 + dw Pack_QuitNoScript ; 9 + dw Pack_QuitRunScript ; 10 + +.InitGFX: ; 104d9 (4:44d9) + xor a + ld [hBGMapMode], a + call Pack_InitGFX + ld a, [wPackJumptableIndex] + ld [wJumptableIndex], a + call Pack_InitColors + ret + +.InitItemsPocket: ; 104e9 (4:44e9) + xor a ; ITEM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.ItemsPocketMenu: ; 104fa (4:44fa) + ld hl, ItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wItemsPocketCursor], a + ld b, PACKSTATE_INITTMHMPOCKET ; left + ld c, PACKSTATE_INITBALLSPOCKET ; right + call Pack_InterpretJoypad + ret c + call ItemSubmenu + ret + +.InitKeyItemsPocket: ; 10527 (4:4527) + ld a, KEY_ITEM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.KeyItemsPocketMenu: ; 10539 (4:4539) + ld hl, KeyItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wKeyItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wKeyItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wKeyItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wKeyItemsPocketCursor], a + ld b, PACKSTATE_INITBALLSPOCKET ; left + ld c, PACKSTATE_INITTMHMPOCKET ; right + call Pack_InterpretJoypad + ret c + call ItemSubmenu + ret + +.InitTMHMPocket: ; 10566 (4:4566) + ld a, TM_HM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + xor a + ld [hBGMapMode], a + call WaitBGMap_DrawPackGFX + ld hl, Text_PackEmptyString + call Pack_PrintTextNoScroll + call Pack_JumptableNext + ret + +.TMHMPocketMenu: ; 10581 (4:4581) + farcall TMHMPocket + ld b, PACKSTATE_INITKEYITEMSPOCKET ; left + ld c, PACKSTATE_INITITEMSPOCKET ; right + call Pack_InterpretJoypad + ret c + xor a + call TMHMSubmenu + ret + +.InitBallsPocket: ; 10594 (4:4594) + ld a, BALL_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.BallsPocketMenu: ; 105a6 (4:45a6) + ld hl, BallsPocketMenuHeader + call CopyMenuHeader + ld a, [wBallsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wBallsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wBallsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wBallsPocketCursor], a + ld b, PACKSTATE_INITITEMSPOCKET ; left + ld c, PACKSTATE_INITKEYITEMSPOCKET ; right + call Pack_InterpretJoypad + ret c + call ItemSubmenu + ret + +ItemSubmenu: ; 105d3 (4:45d3) + farcall CheckItemContext + ld a, [wItemAttributeParamBuffer] +TMHMSubmenu: ; 105dc (4:45dc) + and a + jr z, .NoUse + ld hl, .UsableMenuHeader + ld de, .UsableJumptable + jr .proceed + +.NoUse: + ld hl, .UnusableMenuHeader + ld de, .UnusableJumptable +.proceed + push de + call LoadMenuHeader + call VerticalMenu + call ExitMenu + pop hl + ret c + ld a, [wMenuCursorY] + dec a + call Pack_GetJumptablePointer + jp hl + +; 10601 (4:4601) +.UsableMenuHeader: ; 0x10601 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .UsableMenuData + db 1 ; default option +; 0x10609 + +.UsableMenuData: ; 0x10609 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "USE@" + db "QUIT@" +; 0x10614 + +.UsableJumptable: ; 10614 + dw .Use + dw .Quit +; 10618 + +.UnusableMenuHeader: ; 0x10618 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .UnusableMenuData + db 1 ; default option +; 0x10620 + +.UnusableMenuData: ; 0x10620 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 1 ; items + db "QUIT@" +; 0x10627 + +.UnusableJumptable: ; 10627 + dw .Quit +; 10629 + +.Use: ; 10629 + farcall CheckItemContext + ld a, [wItemAttributeParamBuffer] + ld hl, .ItemFunctionJumptable + rst JumpTable + ret + +.ItemFunctionJumptable: ; 10637 (4:4637) +; entries correspond to ITEMMENU_* constants + dw .Oak ; ITEMMENU_NOUSE + dw .Oak + dw .Oak + dw .Oak + dw .Unused ; ITEMMENU_CURRENT + dw .BattleField ; ITEMMENU_PARTY + dw .BattleOnly ; ITEMMENU_CLOSE + +.Oak: ; 10645 (4:4645) + ld hl, Text_ThisIsntTheTime + call Pack_PrintTextNoScroll + ret + +.Unused: ; 1064c (4:464c) + call DoItemEffect + ld a, [wItemEffectSucceeded] + and a + jr nz, .ReturnToBattle + ret + +.BattleField: ; 10656 (4:4656) + call DoItemEffect + ld a, [wItemEffectSucceeded] + and a + jr nz, .quit_run_script + xor a + ld [hBGMapMode], a + call Pack_InitGFX + call WaitBGMap_DrawPackGFX + call Pack_InitColors + ret + +.ReturnToBattle: ; 1066c (4:466c) + call ClearBGPalettes + jr .quit_run_script + +.BattleOnly: ; 10671 (4:4671) + call DoItemEffect + ld a, [wItemEffectSucceeded] + and a + jr z, .Oak + cp $2 + jr z, .didnt_use_item +.quit_run_script ; 1067e (4:467e) + ld a, PACKSTATE_QUITRUNSCRIPT + ld [wJumptableIndex], a + ret + +.didnt_use_item ; 10684 (4:4684) + xor a + ld [wItemEffectSucceeded], a + ret +; 10689 (4:4689) +.Quit: ; 10689 + ret +; 1068a + +InitPackBuffers: ; 1068a + xor a + ld [wJumptableIndex], a + ; pocket id -> jumptable index + ld a, [wLastPocket] + maskbits NUM_POCKETS + ld [wCurrPocket], a + inc a + add a + dec a + ld [wPackJumptableIndex], a + xor a ; FALSE + ld [wPackUsedItem], a + xor a + ld [wSwitchItem], a + ret +; 106a5 + +DepositSellInitPackBuffers: ; 106a5 + xor a + ld [hBGMapMode], a + ld [wJumptableIndex], a ; PACKSTATE_INITGFX + ld [wPackJumptableIndex], a ; PACKSTATE_INITGFX + ld [wCurrPocket], a ; ITEM_POCKET + ld [wPackUsedItem], a + ld [wSwitchItem], a + call Pack_InitGFX + call Pack_InitColors + ret +; 106be + +DepositSellPack: ; 106be +.loop + call .RunJumptable + call DepositSellTutorial_InterpretJoypad + jr c, .loop + ret +; 106c7 + +.RunJumptable: ; 106c7 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call Pack_GetJumptablePointer + jp hl + +; 106d1 + +.Jumptable: ; 106d1 (4:46d1) +; entries correspond to *_POCKET constants + dw .ItemsPocket + dw .BallsPocket + dw .KeyItemsPocket + dw .TMHMPocket + +.ItemsPocket: ; 106d9 (4:46d9) + xor a ; ITEM_POCKET + call InitPocket + ld hl, PC_Mart_ItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wItemsPocketCursor], a + ret + +.KeyItemsPocket: ; 106ff (4:46ff) + ld a, KEY_ITEM_POCKET + call InitPocket + ld hl, PC_Mart_KeyItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wKeyItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wKeyItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wKeyItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wKeyItemsPocketCursor], a + ret + +.TMHMPocket: ; 10726 (4:4726) + ld a, TM_HM_POCKET + call InitPocket + call WaitBGMap_DrawPackGFX + farcall TMHMPocket + ld a, [wCurItem] + ld [wCurItem], a + ret + +.BallsPocket: ; 1073b (4:473b) + ld a, BALL_POCKET + call InitPocket + ld hl, PC_Mart_BallsPocketMenuHeader + call CopyMenuHeader + ld a, [wBallsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wBallsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wBallsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wBallsPocketCursor], a + ret + +InitPocket: ; 10762 (4:4762) + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + ret + +DepositSellTutorial_InterpretJoypad: ; 1076f + ld hl, wMenuJoypad + ld a, [hl] + and A_BUTTON + jr nz, .a_button + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and D_LEFT + jr nz, .d_left + ld a, [hl] + and D_RIGHT + jr nz, .d_right + scf + ret + +.a_button + ld a, TRUE + ld [wPackUsedItem], a + and a + ret + +.b_button + xor a ; FALSE + ld [wPackUsedItem], a + and a + ret + +.d_left + ld a, [wJumptableIndex] + dec a + maskbits NUM_POCKETS + ld [wJumptableIndex], a + push de + ld de, SFX_SWITCH_POCKETS + call PlaySFX + pop de + scf + ret + +.d_right + ld a, [wJumptableIndex] + inc a + maskbits NUM_POCKETS + ld [wJumptableIndex], a + push de + ld de, SFX_SWITCH_POCKETS + call PlaySFX + pop de + scf + ret +; 107bb + +TutorialPack: ; 107bb + call DepositSellInitPackBuffers + ld a, [wInputType] + or a + jr z, .loop + farcall _DudeAutoInput_RightA +.loop + call .RunJumptable + call DepositSellTutorial_InterpretJoypad + jr c, .loop + xor a ; FALSE + ld [wPackUsedItem], a + ret +; 107d7 + +.RunJumptable: ; 107d7 + ld a, [wJumptableIndex] + ld hl, .dw + call Pack_GetJumptablePointer + jp hl + +; 107e1 + +.dw ; 107e1 (4:47e1) +; entries correspond to *_POCKET constants + dw .Items + dw .Balls + dw .KeyItems + dw .TMHM + +.Items: ; 107e9 (4:47e9) + xor a ; ITEM_POCKET + ld hl, .ItemsMenuHeader + jr .DisplayPocket + +; 107ef (4:47ef) +.ItemsMenuHeader: ; 0x107ef + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .ItemsMenuData + db 1 ; default option +; 0x107f7 + +.ItemsMenuData: ; 0x107f7 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wDudeNumItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10807 + +.KeyItems: ; 10807 (4:4807) + ld a, KEY_ITEM_POCKET + ld hl, .KeyItemsMenuHeader + jr .DisplayPocket + +; 1080e (4:480e) +.KeyItemsMenuHeader: ; 0x1080e + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .KeyItemsMenuData + db 1 ; default option +; 0x10816 + +.KeyItemsMenuData: ; 0x10816 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wDudeNumKeyItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10826 + +.TMHM: ; 10826 (4:4826) + ld a, TM_HM_POCKET + call InitPocket + call WaitBGMap_DrawPackGFX + farcall TMHMPocket + ld a, [wCurItem] + ld [wCurItem], a + ret + +.Balls: ; 1083b (4:483b) + ld a, BALL_POCKET + ld hl, .BallsMenuHeader + jr .DisplayPocket + +; 10842 (4:4842) +.BallsMenuHeader: ; 0x10842 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .BallsMenuData + db 1 ; default option +; 0x1084a + +.BallsMenuData: ; 0x1084a + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wDudeNumBalls + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 1085a + +.DisplayPocket: ; 1085a (4:485a) + push hl + call InitPocket + pop hl + call CopyMenuHeader + call ScrollingMenu + ret + +Pack_JumptableNext: ; 10866 (4:4866) + ld hl, wJumptableIndex + inc [hl] + ret + +Pack_GetJumptablePointer: ; 1086b + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret +; 10874 + +Pack_QuitNoScript: ; 10874 (4:4874) + ld hl, wJumptableIndex + set 7, [hl] + xor a ; FALSE + ld [wPackUsedItem], a + ret + +Pack_QuitRunScript: ; 1087e (4:487e) + ld hl, wJumptableIndex + set 7, [hl] + ld a, TRUE + ld [wPackUsedItem], a + ret + +Pack_PrintTextNoScroll: ; 10889 (4:4889) + ld a, [wOptions] + push af + set NO_TEXT_SCROLL, a + ld [wOptions], a + call PrintText + pop af + ld [wOptions], a + ret + +WaitBGMap_DrawPackGFX: ; 1089a (4:489a) + call WaitBGMap +DrawPackGFX: ; 1089d + ld a, [wCurrPocket] + maskbits NUM_POCKETS + ld e, a + ld d, $0 + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jr z, .male_dude + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr nz, .female +.male_dude + ld hl, PackGFXPointers + add hl, de + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + ld hl, vTiles2 tile $50 + lb bc, BANK(PackGFX), 15 + call Request2bpp + ret + +.female + farcall DrawKrisPackGFX + ret +; 108cc + +PackGFXPointers: ; 108cc + dw PackGFX + (15 tiles) * 1 ; ITEM_POCKET + dw PackGFX + (15 tiles) * 3 ; BALL_POCKET + dw PackGFX + (15 tiles) * 0 ; KEY_ITEM_POCKET + dw PackGFX + (15 tiles) * 2 ; TM_HM_POCKET +; 108d4 + +Pack_InterpretJoypad: ; 108d4 (4:48d4) + ld hl, wMenuJoypad + ld a, [wSwitchItem] + and a + jr nz, .switching_item + ld a, [hl] + and A_BUTTON + jr nz, .a_button + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and D_LEFT + jr nz, .d_left + ld a, [hl] + and D_RIGHT + jr nz, .d_right + ld a, [hl] + and SELECT + jr nz, .select + scf + ret + +.a_button + and a + ret + +.b_button + ld a, PACKSTATE_QUITNOSCRIPT + ld [wJumptableIndex], a + scf + ret + +.d_left + ld a, b + ld [wJumptableIndex], a + ld [wPackJumptableIndex], a + push de + ld de, SFX_SWITCH_POCKETS + call PlaySFX + pop de + scf + ret + +.d_right + ld a, c + ld [wJumptableIndex], a + ld [wPackJumptableIndex], a + push de + ld de, SFX_SWITCH_POCKETS + call PlaySFX + pop de + scf + ret + +.select + farcall SwitchItemsInBag + ld hl, Text_MoveItemWhere + call Pack_PrintTextNoScroll + scf + ret + +.switching_item + ld a, [hl] + and A_BUTTON | SELECT + jr nz, .place_insert + ld a, [hl] + and B_BUTTON + jr nz, .end_switch + scf + ret + +.place_insert + farcall SwitchItemsInBag + ld de, SFX_SWITCH_POKEMON + call WaitPlaySFX + ld de, SFX_SWITCH_POKEMON + call WaitPlaySFX +.end_switch + xor a + ld [wSwitchItem], a + scf + ret + +Pack_InitGFX: ; 10955 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + ld hl, PackMenuGFX + ld de, vTiles2 + ld bc, $60 tiles + ld a, BANK(PackMenuGFX) + call FarCopyBytes +; Background (blue if male, pink if female) + hlcoord 0, 1 + ld bc, 11 * SCREEN_WIDTH + ld a, $24 + call ByteFill +; This is where the items themselves will be listed. + hlcoord 5, 1 + lb bc, 11, 15 + call ClearBox +; ◀▶ POCKET ▼▲ ITEMS + hlcoord 0, 0 + ld a, $28 + ld c, SCREEN_WIDTH +.loop + ld [hli], a + inc a + dec c + jr nz, .loop + call DrawPocketName + call PlacePackGFX +; Place the textbox for displaying the item description + hlcoord 0, SCREEN_HEIGHT - 4 - 2 + lb bc, 4, SCREEN_WIDTH - 2 + call TextBox + call EnableLCD + call DrawPackGFX + ret +; 109a5 + +PlacePackGFX: ; 109a5 + hlcoord 0, 3 + ld a, $50 + ld de, SCREEN_WIDTH - 5 + ld b, 3 +.row + ld c, 5 +.column + ld [hli], a + inc a + dec c + jr nz, .column + add hl, de + dec b + jr nz, .row + ret +; 109bb + +DrawPocketName: ; 109bb + ld a, [wCurrPocket] + ; * 15 + ld d, a + swap a + sub d + ld d, 0 + ld e, a + ld hl, .tilemap + add hl, de + ld d, h + ld e, l + hlcoord 0, 7 + ld c, 3 +.row + ld b, 5 +.col + ld a, [de] + inc de + ld [hli], a + dec b + jr nz, .col + ld a, c + ld c, SCREEN_WIDTH - 5 + add hl, bc + ld c, a + dec c + jr nz, .row + ret +; 109e1 + +.tilemap ; 109e1 +; ITEM_POCKET + db $00, $04, $04, $04, $01 ; top border + db $06, $07, $08, $09, $0a ; Items + db $02, $05, $05, $05, $03 ; bottom border +; BALL_POCKET + db $00, $04, $04, $04, $01 ; top border + db $15, $16, $17, $18, $19 ; Balls + db $02, $05, $05, $05, $03 ; bottom border +; KEY_ITEM_POCKET + db $00, $04, $04, $04, $01 ; top border + db $0b, $0c, $0d, $0e, $0f ; Key Items + db $02, $05, $05, $05, $03 ; bottom border +; TM_HM_POCKET + db $00, $04, $04, $04, $01 ; top border + db $10, $11, $12, $13, $14 ; TM/HM + db $02, $05, $05, $05, $03 ; bottom border +; 10a1d + +Pack_GetItemName: ; 10a1d + ld a, [wCurItem] + ld [wNamedObjectIndexBuffer], a + call GetItemName + call CopyName1 + ret +; 10a2a + +Unreferenced_Pack_ClearTilemap: ; 10a2a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill + ret +; 10a36 + +ClearPocketList: ; 10a36 (4:4a36) + hlcoord 5, 2 + lb bc, 10, SCREEN_WIDTH - 5 + call ClearBox + ret + +Pack_InitColors: ; 10a40 + call WaitBGMap + ld b, SCGB_PACKPALS + call GetSGBLayout + call SetPalettes + call DelayFrame + ret +; 10a4f + +ItemsPocketMenuHeader: ; 0x10a4f + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10a57 + +.MenuData: ; 0x10a57 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wNumItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10a67 + +PC_Mart_ItemsPocketMenuHeader: ; 0x10a67 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10a6f + +.MenuData: ; 0x10a6f + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wNumItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10a7f + +KeyItemsPocketMenuHeader: ; 0x10a7f + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10a87 + +.MenuData: ; 0x10a87 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wNumKeyItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10a97 + +PC_Mart_KeyItemsPocketMenuHeader: ; 0x10a97 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10a9f + +.MenuData: ; 0x10a9f + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags + db 5, 8 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wNumKeyItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10aaf + +BallsPocketMenuHeader: ; 0x10aaf + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10ab7 + +.MenuData: ; 0x10ab7 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wNumBalls + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10ac7 + +PC_Mart_BallsPocketMenuHeader: ; 0x10ac7 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10acf + +.MenuData: ; 0x10acf + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wNumBalls + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10adf + +Text_PackNoItems: ; 0x10adf + ; No items. + text_jump UnknownText_0x1c0b9a + db "@" +; 0x10ae4 + +Text_ThrowAwayHowMany: ; 0x10ae4 + ; Throw away how many? + text_jump UnknownText_0x1c0ba5 + db "@" +; 0x10ae9 + +Text_ConfirmThrowAway: ; 0x10ae9 + ; Throw away @ @ (S)? + text_jump UnknownText_0x1c0bbb + db "@" +; 0x10aee + +Text_ThrewAway: ; 0x10aee + ; Threw away @ (S). + text_jump UnknownText_0x1c0bd8 + db "@" +; 0x10af3 + +Text_ThisIsntTheTime: ; 0x10af3 + ; OAK: ! This isn't the time to use that! + text_jump UnknownText_0x1c0bee + db "@" +; 0x10af8 + +TextJump_YouDontHaveAMon: ; 0x10af8 + ; You don't have a #MON! + text_jump Text_YouDontHaveAMon + db "@" +; 0x10afd + +Text_RegisteredItem: ; 0x10afd + ; Registered the @ . + text_jump UnknownText_0x1c0c2e + db "@" +; 0x10b02 + +Text_CantRegister: ; 0x10b02 + ; You can't register that item. + text_jump UnknownText_0x1c0c45 + db "@" +; 0x10b07 + +Text_MoveItemWhere: ; 0x10b07 + ; Where should this be moved to? + text_jump UnknownText_0x1c0c63 + db "@" +; 0x10b0c + +Text_PackEmptyString: ; 0x10b0c + ; + text_jump UnknownText_0x1c0c83 + db "@" +; 0x10b11 + +TextJump_YouCantUseItInABattle: ; 0x10b11 + ; Doesn't seem to be used anywhere + ; "You can't use it in a battle." + text_jump Text_YouCantUseItInABattle + db "@" +; 0x10b16 + +PackMenuGFX: +INCBIN "gfx/pack/pack_menu.2bpp" +PackGFX: +INCBIN "gfx/pack/pack.2bpp" diff --git a/engine/menu/scrolling_menu.asm b/engine/menu/scrolling_menu.asm new file mode 100755 index 000000000..3be3d839c --- /dev/null +++ b/engine/menu/scrolling_menu.asm @@ -0,0 +1,543 @@ +_InitScrollingMenu:: ; 245af + xor a + ld [wMenuJoypad], a + ld [hBGMapMode], a + inc a + ld [hInMenu], a + call InitScrollingMenuCursor + call ScrollingMenu_InitFlags + call ScrollingMenu_ValidateSwitchItem + call ScrollingMenu_InitDisplay + call ApplyTilemap + xor a + ld [hBGMapMode], a + ret +; 245cb + +_ScrollingMenu:: ; 245cb +.loop + call ScrollingMenuJoyAction + jp c, .exit + call z, .zero + jr .loop +; 245d6 + +.exit ; 245d6 + call MenuClickSound + ld [wMenuJoypad], a + ld a, 0 + ld [hInMenu], a + ret +; 245e1 + +.zero ; 245e1 + call ScrollingMenu_InitDisplay + ld a, 1 + ld [hBGMapMode], a + ld c, 3 + call DelayFrames + xor a + ld [hBGMapMode], a + ret +; 245f1 + +ScrollingMenu_InitDisplay: ; 245f1 + xor a + ld [hBGMapMode], a + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call ScrollingMenu_UpdateDisplay + call ScrollingMenu_PlaceCursor + call ScrollingMenu_CheckCallFunction3 + pop af + ld [wOptions], a + ret +; 24609 + +ScrollingMenuJoyAction: ; 24609 +.loop + call ScrollingMenuJoypad + ld a, [hJoyLast] + and D_PAD + ld b, a + ld a, [hJoyPressed] + and BUTTONS + or b + bit A_BUTTON_F, a + jp nz, .a_button + bit B_BUTTON_F, a + jp nz, .b_button + bit SELECT_F, a + jp nz, .select + bit START_F, a + jp nz, .start + bit D_RIGHT_F, a + jp nz, .d_right + bit D_LEFT_F, a + jp nz, .d_left + bit D_UP_F, a + jp nz, .d_up + bit D_DOWN_F, a + jp nz, .d_down + jr .loop +; 24640 + +.unreferenced ; unused + ld a, -1 + and a + ret +; 24644 + +.a_button ; 24644 + call PlaceHollowCursor + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [wMenuSelection] + ld [wCurItem], a + ld a, [wMenuSelectionQuantity] + ld [wItemQuantityBuffer], a + call ScrollingMenu_GetCursorPosition + dec a + ld [wScrollingMenuCursorPosition], a + ld [wCurItemQuantity], a + ld a, [wMenuSelection] + cp -1 + jr z, .b_button + ld a, A_BUTTON + scf + ret +; 2466f + +.b_button ; 2466f + ld a, B_BUTTON + scf + ret +; 24673 + +.select ; 24673 + ld a, [wMenuDataFlags] + bit 7, a + jp z, xor_a_dec_a + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [wMenuSelection] + cp -1 + jp z, xor_a_dec_a + call ScrollingMenu_GetCursorPosition + dec a + ld [wScrollingMenuCursorPosition], a + ld a, SELECT + scf + ret +; 24695 + +.start ; 24695 + ld a, [wMenuDataFlags] + bit 6, a + jp z, xor_a_dec_a + ld a, START + scf + ret +; 246a1 + +.d_left ; 246a1 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a_dec_a + ld a, [wMenuDataFlags] + bit 3, a + jp z, xor_a_dec_a + ld a, D_LEFT + scf + ret +; 246b5 + +.d_right ; 246b5 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a_dec_a + ld a, [wMenuDataFlags] + bit 2, a + jp z, xor_a_dec_a + ld a, D_RIGHT + scf + ret +; 246c9 + +.d_up ; 246c9 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a + ld hl, wMenuScrollPosition + ld a, [hl] + and a + jr z, .xor_dec_up + dec [hl] + jp xor_a + +.xor_dec_up + jp xor_a_dec_a +; 246df + +.d_down ; 246df + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a + ld hl, wMenuScrollPosition + ld a, [wMenuData_ScrollingMenuHeight] + add [hl] + ld b, a + ld a, [wScrollingMenuListSize] + cp b + jr c, .xor_dec_down + inc [hl] + jp xor_a + +.xor_dec_down + jp xor_a_dec_a +; 246fc + +ScrollingMenu_GetCursorPosition: ; 246fc + ld a, [wMenuScrollPosition] + ld c, a + ld a, [wMenuCursorY] + add c + ld c, a + ret +; 24706 + +ScrollingMenu_ClearLeftColumn: ; 24706 (9:4706) + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + add hl, de + ld de, 2 * SCREEN_WIDTH + ld a, [wMenuData_ScrollingMenuHeight] +.loop + ld [hl], " " + add hl, de + dec a + jr nz, .loop + ret + +InitScrollingMenuCursor: ; 2471a + ld hl, wMenuData_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wMenuData_ItemsPointerBank] + call GetFarByte + ld [wScrollingMenuListSize], a + ld a, [wMenuData_ScrollingMenuHeight] + ld c, a + ld a, [wMenuScrollPosition] + add c + ld c, a + ld a, [wScrollingMenuListSize] + inc a + cp c + jr nc, .skip + ld a, [wMenuData_ScrollingMenuHeight] + ld c, a + ld a, [wScrollingMenuListSize] + inc a + sub c + jr nc, .store + xor a + +.store + ld [wMenuScrollPosition], a + +.skip + ld a, [wMenuScrollPosition] + ld c, a + ld a, [wMenuCursorBuffer] + add c + ld b, a + ld a, [wScrollingMenuListSize] + inc a + cp b + jr c, .asm_2475a + jr nc, .asm_24763 + +.asm_2475a + xor a + ld [wMenuScrollPosition], a + ld a, $1 + ld [wMenuCursorBuffer], a + +.asm_24763 + ret +; 24764 + +ScrollingMenu_InitFlags: ; 24764 + ld a, [wMenuDataFlags] + ld c, a + ld a, [wScrollingMenuListSize] + ld b, a + ld a, [wMenuBorderTopCoord] + add 1 + ld [w2DMenuCursorInitY], a + ld a, [wMenuBorderLeftCoord] + add 0 + ld [w2DMenuCursorInitX], a + ld a, [wMenuData_ScrollingMenuHeight] + cp b + jr c, .no_extra_row + jr z, .no_extra_row + ld a, b + inc a +.no_extra_row + ld [w2DMenuNumRows], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, $8c + bit 2, c + jr z, .skip_set_0 + set 0, a + +.skip_set_0 + bit 3, c + jr z, .skip_set_1 + set 1, a + +.skip_set_1 + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuCursorOffsets], a + ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN + bit 7, c + jr z, .disallow_select + add SELECT + +.disallow_select + bit 6, c + jr z, .disallow_start + add START + +.disallow_start + ld [wMenuJoypadFilter], a + ld a, [w2DMenuNumRows] + ld b, a + ld a, [wMenuCursorBuffer] + and a + jr z, .reset_cursor + cp b + jr z, .cursor_okay + jr c, .cursor_okay + +.reset_cursor + ld a, 1 + +.cursor_okay + ld [wMenuCursorY], a + ld a, 1 + ld [wMenuCursorX], a + xor a + ld [wCursorCurrentTile], a + ld [wCursorCurrentTile + 1], a + ld [wCursorOffCharacter], a + ret +; 247dd + +ScrollingMenu_ValidateSwitchItem: ; 247dd + ld a, [wScrollingMenuListSize] + ld c, a + ld a, [wSwitchItem] + and a + jr z, .done + dec a + cp c + jr c, .done + xor a + ld [wSwitchItem], a + +.done + ret +; 247f0 + +ScrollingMenu_UpdateDisplay: ; 247f0 + call ClearWholeMenuBox + ld a, [wMenuDataFlags] + bit 4, a ; place arrows + jr z, .okay + ld a, [wMenuScrollPosition] + and a + jr z, .okay + ld a, [wMenuBorderTopCoord] + ld b, a + ld a, [wMenuBorderRightCoord] + ld c, a + call Coord2Tile + ld [hl], "▲" + +.okay + call MenuBoxCoord2Tile + ld bc, SCREEN_WIDTH + 1 + add hl, bc + ld a, [wMenuData_ScrollingMenuHeight] + ld b, a + ld c, $0 +.loop + ld a, [wMenuScrollPosition] + add c + ld [wScrollingMenuCursorPosition], a + ld a, c + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [wMenuSelection] + cp -1 + jr z, .cancel + push bc + push hl + call ScrollingMenu_CallFunctions1and2 + pop hl + ld bc, 2 * SCREEN_WIDTH + add hl, bc + pop bc + inc c + ld a, c + cp b + jr nz, .loop + ld a, [wMenuDataFlags] + bit 4, a ; place arrows + jr z, .done + ld a, [wMenuBorderBottomCoord] + ld b, a + ld a, [wMenuBorderRightCoord] + ld c, a + call Coord2Tile + ld [hl], "▼" + +.done + ret + +.cancel + ld a, [wMenuDataFlags] + bit 0, a ; call function on cancel + jr nz, .call_function + ld de, .string_2485f + call PlaceString + ret + +.string_2485f + db "CANCEL@" + +.call_function + ld d, h + ld e, l + ld hl, wMenuData_ScrollingMenuFunction1 + jp CallPointerAt +; 2486e + +ScrollingMenu_CallFunctions1and2: ; 2486e + push hl + ld d, h + ld e, l + ld hl, wMenuData_ScrollingMenuFunction1 + call CallPointerAt + pop hl + ld a, [wMenuData_ScrollingMenuWidth] + and a + jr z, .done + ld e, a + ld d, $0 + add hl, de + ld d, h + ld e, l + ld hl, wMenuData_ScrollingMenuFunction2 + call CallPointerAt + +.done + ret +; 2488b + +ScrollingMenu_PlaceCursor: ; 2488b + ld a, [wSwitchItem] + and a + jr z, .done + ld b, a + ld a, [wMenuScrollPosition] + cp b + jr nc, .done + ld c, a + ld a, [wMenuData_ScrollingMenuHeight] + add c + cp b + jr c, .done + ld a, b + sub c + dec a + add a + add $1 + ld c, a + ld a, [wMenuBorderTopCoord] + add c + ld b, a + ld a, [wMenuBorderLeftCoord] + add $0 + ld c, a + call Coord2Tile + ld [hl], "▷" + +.done + ret +; 248b8 + +ScrollingMenu_CheckCallFunction3: ; 248b8 + ld a, [wMenuDataFlags] + bit 5, a ; call function 3 + ret z + bit 1, a ; call function 3 if not switching items + jr z, .call + ld a, [wSwitchItem] + and a + ret nz + +.call + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld hl, wMenuData_ScrollingMenuFunction3 + call CallPointerAt + ret +; 248d5 + +ScrollingMenu_GetListItemCoordAndFunctionArgs: ; 248d5 + push de + push hl + ld e, a + ld a, [wMenuScrollPosition] + add e + ld e, a + ld d, $0 + ld hl, wMenuData_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + inc hl ; items + ld a, [wMenuData_ScrollingMenuSpacing] + cp 1 + jr z, .got_spacing + cp 2 + jr z, .pointless_jump +.pointless_jump + add hl, de +.got_spacing + add hl, de + ld a, [wMenuData_ItemsPointerBank] + call GetFarByte + ld [wMenuSelection], a + ld [wCurItem], a + inc hl + ld a, [wMenuData_ItemsPointerBank] + call GetFarByte + ld [wMenuSelectionQuantity], a + pop hl + pop de + ret +; 2490c diff --git a/engine/menu/start_menu.asm b/engine/menu/start_menu.asm new file mode 100755 index 000000000..037efd947 --- /dev/null +++ b/engine/menu/start_menu.asm @@ -0,0 +1,1993 @@ +; StartMenu.Items indexes + const_def + const STARTMENUITEM_POKEDEX ; 0 + const STARTMENUITEM_POKEMON ; 1 + const STARTMENUITEM_PACK ; 2 + const STARTMENUITEM_STATUS ; 3 + const STARTMENUITEM_SAVE ; 4 + const STARTMENUITEM_OPTION ; 5 + const STARTMENUITEM_EXIT ; 6 + const STARTMENUITEM_POKEGEAR ; 7 + const STARTMENUITEM_QUIT ; 8 + + +StartMenu:: ; 125cd + + call ClearWindowData + + ld de, SFX_MENU + call PlaySFX + + farcall ReanchorBGMap_NoOAMUpdate + + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + ld hl, .MenuHeader + jr z, .GotMenuData + ld hl, .ContestMenuHeader +.GotMenuData: + + call LoadMenuHeader + call .SetUpMenuItems + ld a, [wBattleMenuCursorBuffer] + ld [wMenuCursorBuffer], a + call .DrawMenuAccount_ + call DrawVariableLengthMenuBox + call .DrawBugContestStatusBox + call SafeUpdateSprites + call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap + farcall LoadFonts_NoOAMUpdate + call .DrawBugContestStatus + call UpdateTimePals + jr .Select + +.Reopen: + call UpdateSprites + call UpdateTimePals + call .SetUpMenuItems + ld a, [wBattleMenuCursorBuffer] + ld [wMenuCursorBuffer], a + +.Select: + call .GetInput + jr c, .Exit + call .DrawMenuAccount + ld a, [wMenuCursorBuffer] + ld [wBattleMenuCursorBuffer], a + call PlayClickSFX + call PlaceHollowCursor + call .OpenMenu + +; Menu items have different return functions. +; For example, saving exits the menu. + ld hl, .MenuReturns + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.MenuReturns: + dw .Reopen + dw .Exit + dw .ExitMenuCallFuncCloseText + dw .ExitMenuRunScriptCloseText + dw .ExitMenuRunScript + dw .ReturnEnd + dw .ReturnRedraw + +.Exit: + ld a, [hOAMUpdate] + push af + ld a, 1 + ld [hOAMUpdate], a + call LoadFontsExtra + pop af + ld [hOAMUpdate], a +.ReturnEnd: + call ExitMenu +.ReturnEnd2: + call CloseText + call UpdateTimePals + ret + +.GetInput: +; Return carry on exit, and no-carry on selection. + xor a + ld [hBGMapMode], a + call .DrawMenuAccount + call SetUpMenu + ld a, $ff + ld [wMenuSelection], a +.loop + call .PrintMenuAccount + call GetScrollingMenuJoypad + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .b + cp A_BUTTON + jr z, .a + jr .loop +.a + call PlayClickSFX + and a + ret +.b + scf + ret +; 12691 + +.ExitMenuRunScript: ; 12691 + call ExitMenu + ld a, HMENURETURN_SCRIPT + ld [hMenuReturn], a + ret +; 12699 + +.ExitMenuRunScriptCloseText: ; 12699 + call ExitMenu + ld a, HMENURETURN_SCRIPT + ld [hMenuReturn], a + jr .ReturnEnd2 +; 126a2 + +.ExitMenuCallFuncCloseText: ; 126a2 + call ExitMenu + ld hl, wQueuedScriptAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wQueuedScriptBank] + rst FarCall + jr .ReturnEnd2 +; 126b1 + +.ReturnRedraw: ; 126b1 + call .Clear + jp .Reopen +; 126b7 + +.Clear: ; 126b7 + call ClearBGPalettes + call Call_ExitMenu + call ReloadTilesetAndPalettes + call .DrawMenuAccount_ + call DrawVariableLengthMenuBox + call .DrawBugContestStatus + call UpdateSprites + call ret_d90 + call FinishExitMenu + ret +; 126d3 + + +.MenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 10, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default selection + +.ContestMenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 10, 2, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default selection + +.MenuData: + db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_ENABLE_START ; flags + dn 0, 0 ; rows, columns + dw wMenuItemsList + dw .MenuString + dw .Items + +.Items: +; entries correspond to STARTMENUITEM_* constants + dw StartMenu_Pokedex, .PokedexString, .PokedexDesc + dw StartMenu_Pokemon, .PartyString, .PartyDesc + dw StartMenu_Pack, .PackString, .PackDesc + dw StartMenu_Status, .StatusString, .StatusDesc + dw StartMenu_Save, .SaveString, .SaveDesc + dw StartMenu_Option, .OptionString, .OptionDesc + dw StartMenu_Exit, .ExitString, .ExitDesc + dw StartMenu_Pokegear, .PokegearString, .PokegearDesc + dw StartMenu_Quit, .QuitString, .QuitDesc + +.PokedexString: db "#DEX@" +.PartyString: db "#MON@" +.PackString: db "PACK@" +.StatusString: db "@" +.SaveString: db "SAVE@" +.OptionString: db "OPTION@" +.ExitString: db "EXIT@" +.PokegearString: db "GEAR@" +.QuitString: db "QUIT@" + +.PokedexDesc: + db "#MON" + next "database@" + +.PartyDesc: + db "Party " + next "status@" + +.PackDesc: + db "Contains" + next "items@" + +.PokegearDesc: + db "Trainer's" + next "key device@" + +.StatusDesc: + db "Your own" + next "status@" + +.SaveDesc: + db "Save your" + next "progress@" + +.OptionDesc: + db "Change" + next "settings@" + +.ExitDesc: + db "Close this" + next "menu@" + +.QuitDesc: + db "Quit and" + next "be judged.@" + + +.OpenMenu: ; 127e5 + ld a, [wMenuSelection] + call .GetMenuAccountTextPointer + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 127ef + +.MenuString: ; 127ef + push de + ld a, [wMenuSelection] + call .GetMenuAccountTextPointer + inc hl + inc hl + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + call PlaceString + ret +; 12800 + +.MenuDesc: ; 12800 + push de + ld a, [wMenuSelection] + cp $ff + jr z, .none + call .GetMenuAccountTextPointer +rept 4 + inc hl +endr + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + call PlaceString + ret +.none + pop de + ret +; 12819 + + +.GetMenuAccountTextPointer: ; 12819 + ld e, a + ld d, 0 + ld hl, wMenuDataPointerTableAddr + ld a, [hli] + ld h, [hl] + ld l, a +rept 6 + add hl, de +endr + ret +; 12829 + + +.SetUpMenuItems: ; 12829 + xor a + ld [wWhichIndexSet], a + call .FillMenuList + + ld hl, wStatusFlags + bit STATUSFLAGS_POKEDEX_F, [hl] + jr z, .no_pokedex + ld a, STARTMENUITEM_POKEDEX + call .AppendMenuList +.no_pokedex + + ld a, [wPartyCount] + and a + jr z, .no_pokemon + ld a, STARTMENUITEM_POKEMON + call .AppendMenuList +.no_pokemon + + ld a, [wLinkMode] + and a + jr nz, .no_pack + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + jr nz, .no_pack + ld a, STARTMENUITEM_PACK + call .AppendMenuList +.no_pack + + ld hl, wPokegearFlags + bit POKEGEAR_OBTAINED_F, [hl] + jr z, .no_pokegear + ld a, STARTMENUITEM_POKEGEAR + call .AppendMenuList +.no_pokegear + + ld a, STARTMENUITEM_STATUS + call .AppendMenuList + + ld a, [wLinkMode] + and a + jr nz, .no_save + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + ld a, STARTMENUITEM_QUIT + jr nz, .write + ld a, STARTMENUITEM_SAVE +.write + call .AppendMenuList +.no_save + + ld a, STARTMENUITEM_OPTION + call .AppendMenuList + ld a, STARTMENUITEM_EXIT + call .AppendMenuList + ld a, c + ld [wMenuItemsList], a + ret +; 1288d + + +.FillMenuList: ; 1288d + xor a + ld hl, wMenuItemsList + ld [hli], a + ld a, -1 + ld bc, wMenuItemsListEnd - (wMenuItemsList + 1) + call ByteFill + ld de, wMenuItemsList + 1 + ld c, 0 + ret +; 128a0 + +.AppendMenuList: ; 128a0 + ld [de], a + inc de + inc c + ret +; 128a4 + +.DrawMenuAccount_: ; 128a4 + jp .DrawMenuAccount +; 128a7 + +.PrintMenuAccount: ; 128a7 + call .IsMenuAccountOn + ret z + call .DrawMenuAccount + decoord 0, 14 + jp .MenuDesc +; 128b4 + +.DrawMenuAccount: ; 128b4 + call .IsMenuAccountOn + ret z + hlcoord 0, 13 + lb bc, 5, 10 + call ClearBox + hlcoord 0, 13 + ld b, 3 + ld c, 8 + jp TextBoxPalette +; 128cb + +.IsMenuAccountOn: ; 128cb + ld a, [wOptions2] + and 1 << MENU_ACCOUNT + ret +; 128d1 + +.DrawBugContestStatusBox: ; 128d1 + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + ret z + farcall StartMenu_DrawBugContestStatusBox + ret +; 128de + +.DrawBugContestStatus: ; 128de + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + jr nz, .contest + ret +.contest + farcall StartMenu_PrintBugContestStatus + ret +; 128ed + + +StartMenu_Exit: ; 128ed +; Exit the menu. + + ld a, 1 + ret +; 128f0 + + +StartMenu_Quit: ; 128f0 +; Retire from the bug catching contest. + + ld hl, .EndTheContestText + call StartMenuYesNo + jr c, .DontEndContest + ld a, BANK(BugCatchingContestReturnToGateScript) + ld hl, BugCatchingContestReturnToGateScript + call FarQueueScript + ld a, 4 + ret + +.DontEndContest: + ld a, 0 + ret + +.EndTheContestText: + text_jump UnknownText_0x1c1a6c + db "@" +; 1290b + + +StartMenu_Save: ; 1290b +; Save the game. + + call BufferScreen + farcall SaveMenu + jr nc, .asm_12919 + ld a, 0 + ret +.asm_12919 + ld a, 1 + ret +; 1291c + + +StartMenu_Option: ; 1291c +; Game options. + + call FadeToMenu + farcall OptionsMenu + ld a, 6 + ret +; 12928 + + +StartMenu_Status: ; 12928 +; Player status. + + call FadeToMenu + farcall TrainerCard + call CloseSubmenu + ld a, 0 + ret +; 12937 + + +StartMenu_Pokedex: ; 12937 + + ld a, [wPartyCount] + and a + jr z, .asm_12949 + + call FadeToMenu + farcall Pokedex + call CloseSubmenu + +.asm_12949 + ld a, 0 + ret +; 1294c + + +StartMenu_Pokegear: ; 1294c + + call FadeToMenu + farcall PokeGear + call CloseSubmenu + ld a, 0 + ret +; 1295b + + +StartMenu_Pack: ; 1295b + + call FadeToMenu + farcall Pack + ld a, [wPackUsedItem] + and a + jr nz, .used_item + call CloseSubmenu + ld a, 0 + ret + +.used_item + call ExitAllMenus + ld a, 4 + ret +; 12976 + + +StartMenu_Pokemon: ; 12976 + + ld a, [wPartyCount] + and a + jr z, .return + + call FadeToMenu + +.choosemenu + xor a + ld [wPartyMenuActionText], a ; Choose a POKéMON. + call ClearBGPalettes + +.menu + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + +.menunoreload + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes ; load regular palettes? + call DelayFrame + farcall PartyMenuSelect + jr c, .return ; if cancelled or pressed B + + call PokemonActionSubmenu + cp 3 + jr z, .menu + cp 0 + jr z, .choosemenu + cp 1 + jr z, .menunoreload + cp 2 + jr z, .quit + +.return + call CloseSubmenu + ld a, 0 + ret + +.quit + ld a, b + push af + call ExitAllMenus + pop af + ret +; 129d5 + +HasNoItems: ; 129d5 + ld a, [wNumItems] + and a + ret nz + ld a, [wNumKeyItems] + and a + ret nz + ld a, [wNumBalls] + and a + ret nz + ld hl, wTMsHMs + ld b, NUM_TMS + NUM_HMS +.loop + ld a, [hli] + and a + jr nz, .done + dec b + jr nz, .loop + scf + ret +.done + and a + ret + +TossItemFromPC: ; 129f4 + push de + call PartyMonItemName + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .key_item + ld hl, .TossHowMany + call MenuTextBox + farcall SelectQuantityToToss + push af + call CloseWindow + call ExitMenu + pop af + jr c, .quit + ld hl, .ConfirmToss + call MenuTextBox + call YesNoBox + push af + call ExitMenu + pop af + jr c, .quit + pop hl + ld a, [wCurItemQuantity] + call TossItem + call PartyMonItemName + ld hl, .TossedThisMany + call MenuTextBox + call ExitMenu + and a + ret + +.key_item + call .CantToss +.quit + pop hl + scf + ret + +.TossHowMany: + ; Toss out how many @ (S)? + text_jump UnknownText_0x1c1a90 + db "@" + +.ConfirmToss: + ; Throw away @ @ (S)? + text_jump UnknownText_0x1c1aad + db "@" + +.TossedThisMany: + ; Discarded @ (S). + text_jump UnknownText_0x1c1aca + db "@" + +.CantToss: + ld hl, .TooImportantToToss + call MenuTextBoxBackup + ret + +.TooImportantToToss: + ; That's too impor- tant to toss out! + text_jump UnknownText_0x1c1adf + db "@" +; 0x12a60 + +CantUseItem: ; 12a60 + ld hl, CantUseItemText + call MenuTextBoxWaitButton + ret +; 12a67 + +CantUseItemText: ; 12a67 + text_jump UnknownText_0x1c1b03 + db "@" +; 12a6c + + +PartyMonItemName: ; 12a6c + ld a, [wCurItem] + ld [wd265], a + call GetItemName + call CopyName1 + ret +; 12a79 + + +CancelPokemonAction: ; 12a79 + farcall InitPartyMenuWithCancel + farcall UnfreezeMonIcons + ld a, 1 + ret +; 12a88 + + +PokemonActionSubmenu: ; 12a88 + hlcoord 1, 15 + lb bc, 2, 18 + call ClearBox + farcall MonSubmenu + call GetCurNick + ld a, [wMenuSelection] + ld hl, .Actions + ld de, 3 + call IsInArray + jr nc, .nothing + + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.nothing + ld a, 0 + ret + +.Actions: + dbw MONMENUITEM_CUT, MonMenu_Cut + dbw MONMENUITEM_FLY, MonMenu_Fly + dbw MONMENUITEM_SURF, MonMenu_Surf + dbw MONMENUITEM_STRENGTH, MonMenu_Strength + dbw MONMENUITEM_FLASH, MonMenu_Flash + dbw MONMENUITEM_WHIRLPOOL, MonMenu_Whirlpool + dbw MONMENUITEM_DIG, MonMenu_Dig + dbw MONMENUITEM_TELEPORT, MonMenu_Teleport + dbw MONMENUITEM_SOFTBOILED, MonMenu_Softboiled_MilkDrink + dbw MONMENUITEM_MILKDRINK, MonMenu_Softboiled_MilkDrink + dbw MONMENUITEM_HEADBUTT, MonMenu_Headbutt + dbw MONMENUITEM_WATERFALL, MonMenu_Waterfall + dbw MONMENUITEM_ROCKSMASH, MonMenu_RockSmash + dbw MONMENUITEM_SWEETSCENT, MonMenu_SweetScent + dbw MONMENUITEM_STATS, OpenPartyStats + dbw MONMENUITEM_SWITCH, SwitchPartyMons + dbw MONMENUITEM_ITEM, GiveTakePartyMonItem + dbw MONMENUITEM_CANCEL, CancelPokemonAction + dbw MONMENUITEM_MOVE, ManagePokemonMoves + dbw MONMENUITEM_MAIL, MonMailAction +; 12aec + + +SwitchPartyMons: ; 12aec + +; Don't try if there's nothing to switch! + ld a, [wPartyCount] + cp 2 + jr c, .DontSwitch + + ld a, [wCurPartyMon] + inc a + ld [wSwitchMon], a + + farcall HoldSwitchmonIcon + farcall InitPartyMenuNoCancel + + ld a, PARTYMENUACTION_MOVE + ld [wPartyMenuActionText], a + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + + hlcoord 0, 1 + ld bc, SCREEN_WIDTH * 2 + ld a, [wSwitchMon] + dec a + call AddNTimes + ld [hl], "▷" + call WaitBGMap + call SetPalettes + call DelayFrame + + farcall PartyMenuSelect + bit 1, b + jr c, .DontSwitch + + farcall _SwitchPartyMons + + xor a + ld [wPartyMenuActionText], a + + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + + ld a, 1 + ret + +.DontSwitch: + xor a + ld [wPartyMenuActionText], a + call CancelPokemonAction + ret +; 12b60 + + +GiveTakePartyMonItem: ; 12b60 + +; Eggs can't hold items! + ld a, [wCurPartySpecies] + cp EGG + jr z, .cancel + + ld hl, GiveTakeItemMenuData + call LoadMenuHeader + call VerticalMenu + call ExitMenu + jr c, .cancel + + call GetCurNick + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + ld a, [wMenuCursorY] + cp 1 + jr nz, .take + + call LoadStandardMenuHeader + call ClearPalettes + call .GiveItem + call ClearPalettes + call LoadFontsBattleExtra + call ExitMenu + ld a, 0 + ret + +.take + call TakePartyItem + ld a, 3 + ret + +.cancel + ld a, 3 + ret +; 12ba9 + + +.GiveItem: + + farcall DepositSellInitPackBuffers + +.loop + farcall DepositSellPack + + ld a, [wcf66] + and a + jr z, .quit + + ld a, [wcf65] + cp 2 + jr z, .next + + call CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .next + + call TryGiveItemToPartymon + jr .quit + +.next + ld hl, CantBeHeldText + call MenuTextBoxBackup + jr .loop + +.quit + ret +; 12bd9 + + +TryGiveItemToPartymon: ; 12bd9 + + call SpeechTextBox + call PartyMonItemName + call GetPartyItemLocation + ld a, [hl] + and a + jr z, .give_item_to_mon + + push hl + ld d, a + farcall ItemIsMail + pop hl + jr c, .please_remove_mail + ld a, [hl] + jr .already_holding_item + +.give_item_to_mon + call GiveItemToPokemon + ld hl, MadeHoldText + call MenuTextBoxBackup + call GivePartyItem + ret + +.please_remove_mail + ld hl, PleaseRemoveMailText + call MenuTextBoxBackup + ret + +.already_holding_item + ld [wd265], a + call GetItemName + ld hl, SwitchAlreadyHoldingText + call StartMenuYesNo + jr c, .abort + + call GiveItemToPokemon + ld a, [wd265] + push af + ld a, [wCurItem] + ld [wd265], a + pop af + ld [wCurItem], a + call ReceiveItemFromPokemon + jr nc, .bag_full + + ld hl, TookAndMadeHoldText + call MenuTextBoxBackup + ld a, [wd265] + ld [wCurItem], a + call GivePartyItem + ret + +.bag_full + ld a, [wd265] + ld [wCurItem], a + call ReceiveItemFromPokemon + ld hl, ItemStorageIsFullText + call MenuTextBoxBackup + +.abort + ret +; 12c4c + + +GivePartyItem: ; 12c4c + + call GetPartyItemLocation + ld a, [wCurItem] + ld [hl], a + ld d, a + farcall ItemIsMail + jr nc, .done + call ComposeMailMessage + +.done + ret +; 12c60 + + +TakePartyItem: ; 12c60 + + call SpeechTextBox + call GetPartyItemLocation + ld a, [hl] + and a + jr z, .asm_12c8c + + ld [wCurItem], a + call ReceiveItemFromPokemon + jr nc, .asm_12c94 + + farcall ItemIsMail + call GetPartyItemLocation + ld a, [hl] + ld [wd265], a + ld [hl], NO_ITEM + call GetItemName + ld hl, TookFromText + call MenuTextBoxBackup + jr .asm_12c9a + +.asm_12c8c + ld hl, IsntHoldingAnythingText + call MenuTextBoxBackup + jr .asm_12c9a + +.asm_12c94 + ld hl, ItemStorageIsFullText + call MenuTextBoxBackup + +.asm_12c9a + ret +; 12c9b + + +GiveTakeItemMenuData: ; 12c9b + db MENU_SPRITE_ANIMS | MENU_BACKUP_TILES ; flags + menu_coords 12, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .Items + db 1 ; default option + +.Items: + db STATICMENU_CURSOR ; flags + db 2 ; # items + db "GIVE@" + db "TAKE@" +; 12caf + + +TookAndMadeHoldText: ; 12caf + text_jump UnknownText_0x1c1b2c + db "@" +; 12cb4 + +MadeHoldText: ; 12cb4 + text_jump UnknownText_0x1c1b57 + db "@" +; 12cb9 + +PleaseRemoveMailText: ; 12cb9 + text_jump UnknownText_0x1c1b6f + db "@" +; 12cbe + +IsntHoldingAnythingText: ; 12cbe + text_jump UnknownText_0x1c1b8e + db "@" +; 12cc3 + +ItemStorageIsFullText: ; 12cc3 + text_jump UnknownText_0x1c1baa + db "@" +; 12cc8 + +TookFromText: ; 12cc8 + text_jump UnknownText_0x1c1bc4 + db "@" +; 12ccd + +SwitchAlreadyHoldingText: ; 12ccd + text_jump UnknownText_0x1c1bdc + db "@" +; 12cd2 + +CantBeHeldText: ; 12cd2 + text_jump UnknownText_0x1c1c09 + db "@" +; 12cd7 + + +GetPartyItemLocation: ; 12cd7 + push af + ld a, MON_ITEM + call GetPartyParamLocation + pop af + ret +; 12cdf + + +ReceiveItemFromPokemon: ; 12cdf + ld a, 1 + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + jp ReceiveItem +; 12cea + + +GiveItemToPokemon: ; 12cea (4:6cea) + ld a, 1 + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + jp TossItem + +StartMenuYesNo: ; 12cf5 + call MenuTextBox + call YesNoBox + jp ExitMenu +; 12cfe + + +ComposeMailMessage: ; 12cfe (4:6cfe) + ld de, wTempMailMessage + farcall _ComposeMailMessage + ld hl, wPlayerName + ld de, wTempMailAuthor + ld bc, NAME_LENGTH - 1 + call CopyBytes + ld hl, wPlayerID + ld bc, 2 + call CopyBytes + ld a, [wCurPartySpecies] + ld [de], a + inc de + ld a, [wCurItem] + ld [de], a + ld a, [wCurPartyMon] + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wTempMail + ld bc, MAIL_STRUCT_LENGTH + ld a, BANK(sPartyMail) + call GetSRAMBank + call CopyBytes + call CloseSRAM + ret + +MonMailAction: ; 12d45 +; If in the time capsule or trade center, +; selecting the mail only allows you to +; read the mail. + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jr z, .read + cp LINK_TRADECENTER + jr z, .read + +; Show the READ/TAKE/QUIT menu. + ld hl, .MenuHeader + call LoadMenuHeader + call VerticalMenu + call ExitMenu + +; Interpret the menu. + jp c, .done + ld a, [wMenuCursorY] + cp $1 + jr z, .read + cp $2 + jr z, .take + jp .done + +.read + farcall ReadPartyMonMail + ld a, $0 + ret + +.take + ld hl, .sendmailtopctext + call StartMenuYesNo + jr c, .RemoveMailToBag + ld a, [wCurPartyMon] + ld b, a + farcall SendMailToPC + jr c, .MailboxFull + ld hl, .sentmailtopctext + call MenuTextBoxBackup + jr .done + +.MailboxFull: + ld hl, .mailboxfulltext + call MenuTextBoxBackup + jr .done + +.RemoveMailToBag: + ld hl, .mailwilllosemessagetext + call StartMenuYesNo + jr c, .done + call GetPartyItemLocation + ld a, [hl] + ld [wCurItem], a + call ReceiveItemFromPokemon + jr nc, .BagIsFull + call GetPartyItemLocation + ld [hl], $0 + call GetCurNick + ld hl, .tookmailfrommontext + call MenuTextBoxBackup + jr .done + +.BagIsFull: + ld hl, .bagfulltext + call MenuTextBoxBackup + jr .done + +.done + ld a, $3 + ret +; 12dc9 + + +.MenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 12, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option +; 0x12dd1 + +.MenuData: + db STATICMENU_CURSOR ; flags + db 3 ; items + db "READ@" + db "TAKE@" + db "QUIT@" +; 0x12de2 + + +.mailwilllosemessagetext +; The MAIL will lose its message. OK? + text_jump UnknownText_0x1c1c22 + db "@" +; 0x12de7 + +.tookmailfrommontext +; MAIL detached from . + text_jump UnknownText_0x1c1c47 + db "@" +; 0x12dec + +.bagfulltext +; There's no space for removing MAIL. + text_jump UnknownText_0x1c1c62 + db "@" +; 0x12df1 + +.sendmailtopctext +; Send the removed MAIL to your PC? + text_jump UnknownText_0x1c1c86 + db "@" +; 0x12df6 + +.mailboxfulltext +; Your PC's MAILBOX is full. + text_jump UnknownText_0x1c1ca9 + db "@" +; 0x12dfb + +.sentmailtopctext +; The MAIL was sent to your PC. + text_jump UnknownText_0x1c1cc4 + db "@" +; 0x12e00 + + +OpenPartyStats: ; 12e00 + call LoadStandardMenuHeader + call ClearSprites +; PartyMon + xor a + ld [wMonType], a + call LowVolume + predef StatsScreenInit + call MaxVolume + call Call_ExitMenu + ld a, 0 + ret +; 12e1b + + +MonMenu_Cut: ; 12e1b + farcall CutFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12e30 + + +MonMenu_Fly: ; 12e30 + farcall FlyFunction + ld a, [wFieldMoveSucceeded] + cp $2 + jr z, .Fail + cp $0 + jr z, .Error + farcall StubbedTrainerRankings_Fly + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret + +.Error: + ld a, $0 + ret + +.Unreferenced: + ld a, $1 + ret +; 12e55 + +MonMenu_Flash: ; 12e55 + farcall OWFlash + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12e6a + +MonMenu_Strength: ; 12e6a + farcall StrengthFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12e7f + +MonMenu_Whirlpool: ; 12e7f + farcall WhirlpoolFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12e94 + +MonMenu_Waterfall: ; 12e94 + farcall WaterfallFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12ea9 + +MonMenu_Teleport: ; 12ea9 + farcall TeleportFunction + ld a, [wFieldMoveSucceeded] + and a + jr z, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12ebd + +MonMenu_Surf: ; 12ebd + farcall SurfFunction + ld a, [wFieldMoveSucceeded] + and a + jr z, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12ed1 + +MonMenu_Dig: ; 12ed1 + farcall DigFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12ee6 + +MonMenu_Softboiled_MilkDrink: ; 12ee6 + call .CheckMonHasEnoughHP + jr nc, .NotEnoughHP + farcall Softboiled_MilkDrinkFunction + jr .finish + +.NotEnoughHP: + ld hl, .Text_NotEnoughHP + call PrintText + +.finish + xor a + ld [wPartyMenuActionText], a + ld a, $3 + ret +; 12f00 + +.Text_NotEnoughHP: + ; Not enough HP! + text_jump UnknownText_0x1c1ce3 + db "@" +; 0x12f05 + +.CheckMonHasEnoughHP: +; Need to have at least (MaxHP / 5) HP left. + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld [hDividend + 0], a + ld a, [hl] + ld [hDividend + 1], a + ld a, 5 + ld [hDivisor], a + ld b, 2 + call Divide + ld a, MON_HP + 1 + call GetPartyParamLocation + ld a, [hQuotient + 2] + sub [hl] + dec hl + ld a, [hQuotient + 1] + sbc [hl] + ret +; 12f26 + +MonMenu_Headbutt: ; 12f26 + farcall HeadbuttFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12f3b + +MonMenu_RockSmash: ; 12f3b + farcall RockSmashFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12f50 + +MonMenu_SweetScent: ; 12f50 + farcall SweetScentFromMenu + ld b, $4 + ld a, $2 + ret +; 12f5b + +ChooseMoveToDelete: ; 12f5b + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call LoadFontsBattleExtra + call .ChooseMoveToDelete + pop bc + ld a, b + ld [wOptions], a + push af + call ClearBGPalettes + pop af + ret +; 12f73 + +.ChooseMoveToDelete + call SetUpMoveScreenBG + ld de, DeleteMoveScreenAttrs + call SetMenuAttributes + call SetUpMoveList + ld hl, w2DMenuFlags1 + set 6, [hl] + jr .enter_loop + +.loop + call ScrollingMenuJoypad + bit B_BUTTON_F, a + jp nz, .b_button + bit A_BUTTON_F, a + jp nz, .a_button + +.enter_loop + call PrepareToPlaceMoveData + call PlaceMoveData + jp .loop +; 12f9c + +.a_button + and a + jr .finish + +.b_button + scf + +.finish + push af + xor a + ld [wSwitchMon], a + ld hl, w2DMenuFlags1 + res 6, [hl] + call ClearSprites + call ClearTileMap + pop af + ret +; 12fb2 + +DeleteMoveScreenAttrs: ; 12fb2 + db 3, 1 + db 3, 1 + db $40, $00 + dn 2, 0 + db D_UP | D_DOWN | A_BUTTON | B_BUTTON +; 12fba + +ManagePokemonMoves: ; 12fba + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call MoveScreenLoop + pop af + ld [wOptions], a + call ClearBGPalettes + +.egg + ld a, $0 + ret +; 12fd5 + +MoveScreenLoop: ; 12fd5 + ld a, [wCurPartyMon] + inc a + ld [wPartyMenuCursor], a + call SetUpMoveScreenBG + call Function132d3 + ld de, MoveScreenAttributes + call SetMenuAttributes +.loop + call SetUpMoveList + ld hl, w2DMenuFlags1 + set 6, [hl] + jr .skip_joy + +.joy_loop + call ScrollingMenuJoypad + bit 1, a + jp nz, .b_button + bit 0, a + jp nz, .a_button + bit 4, a + jp nz, .d_right + bit 5, a + jp nz, .d_left + +.skip_joy + call PrepareToPlaceMoveData + ld a, [wMoveSwapBuffer] + and a + jr nz, .moving_move + call PlaceMoveData + jp .joy_loop + +.moving_move + ld a, " " + hlcoord 1, 11 + ld bc, 5 + call ByteFill + hlcoord 1, 12 + lb bc, 5, SCREEN_WIDTH - 2 + call ClearBox + hlcoord 1, 12 + ld de, String_MoveWhere + call PlaceString + jp .joy_loop +.b_button + call PlayClickSFX + call WaitSFX + ld a, [wMoveSwapBuffer] + and a + jp z, .exit + + ld a, [wMoveSwapBuffer] + ld [wMenuCursorY], a + xor a + ld [wMoveSwapBuffer], a + hlcoord 1, 2 + lb bc, 8, SCREEN_WIDTH - 2 + call ClearBox + jp .loop +; 1305b + +.d_right + ld a, [wMoveSwapBuffer] + and a + jp nz, .joy_loop + + ld a, [wCurPartyMon] + ld b, a + push bc + call .cycle_right + pop bc + ld a, [wCurPartyMon] + cp b + jp z, .joy_loop + jp MoveScreenLoop + +.d_left + ld a, [wMoveSwapBuffer] + and a + jp nz, .joy_loop + ld a, [wCurPartyMon] + ld b, a + push bc + call .cycle_left + pop bc + ld a, [wCurPartyMon] + cp b + jp z, .joy_loop + jp MoveScreenLoop + +.cycle_right + ld a, [wCurPartyMon] + inc a + ld [wCurPartyMon], a + ld c, a + ld b, 0 + ld hl, wPartySpecies + add hl, bc + ld a, [hl] + cp -1 + jr z, .cycle_left + cp EGG + ret nz + jr .cycle_right + +.cycle_left + ld a, [wCurPartyMon] + and a + ret z +.cycle_left_loop + ld a, [wCurPartyMon] + dec a + ld [wCurPartyMon], a + ld c, a + ld b, 0 + ld hl, wPartySpecies + add hl, bc + ld a, [hl] + cp EGG + ret nz + ld a, [wCurPartyMon] + and a + jr z, .cycle_right + jr .cycle_left_loop +; 130c6 + +.a_button + call PlayClickSFX + call WaitSFX + ld a, [wMoveSwapBuffer] + and a + jr nz, .place_move + ld a, [wMenuCursorY] + ld [wMoveSwapBuffer], a + call PlaceHollowCursor + jp .moving_move + +.place_move + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + push hl + call .copy_move + pop hl + ld bc, $15 + add hl, bc + call .copy_move + ld a, [wBattleMode] + jr z, .swap_moves + ld hl, wBattleMonMoves + ld bc, $20 + ld a, [wCurPartyMon] + call AddNTimes + push hl + call .copy_move + pop hl + ld bc, 6 + add hl, bc + call .copy_move + +.swap_moves + ld de, SFX_SWITCH_POKEMON + call PlaySFX + call WaitSFX + ld de, SFX_SWITCH_POKEMON + call PlaySFX + call WaitSFX + hlcoord 1, 2 + lb bc, 8, 18 + call ClearBox + hlcoord 10, 10 + lb bc, 1, 9 + call ClearBox + jp .loop +; 1313a + +.copy_move + push hl + ld a, [wMenuCursorY] + dec a + ld c, a + ld b, $0 + add hl, bc + ld d, h + ld e, l + pop hl + ld a, [wMoveSwapBuffer] + dec a + ld c, a + ld b, $0 + add hl, bc + ld a, [de] + ld b, [hl] + ld [hl], a + ld a, b + ld [de], a + ret +; 13154 + +.exit + xor a + ld [wMoveSwapBuffer], a + ld hl, w2DMenuFlags1 + res 6, [hl] + call ClearSprites + jp ClearTileMap +; 13163 + +MoveScreenAttributes: ; 13163 + db 3, 1 + db 3, 1 + db $40, $00 + dn 2, 0 + db D_UP | D_DOWN | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON +; 1316b + +String_MoveWhere: ; 1316b + db "Where?@" +; 13172 + +SetUpMoveScreenBG: ; 13172 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + xor a + ld [hBGMapMode], a + farcall LoadStatsScreenPageTilesGFX + farcall ClearSpriteAnims2 + ld a, [wCurPartyMon] + ld e, a + ld d, $0 + ld hl, wPartySpecies + add hl, de + ld a, [hl] + ld [wd265], a + ld e, $2 + farcall LoadMenuMonIcon + hlcoord 0, 1 + ld b, 9 + ld c, 18 + call TextBox + hlcoord 0, 11 + ld b, 5 + ld c, 18 + call TextBox + hlcoord 2, 0 + lb bc, 2, 3 + call ClearBox + xor a + ld [wMonType], a + ld hl, wPartyMonNicknames + ld a, [wCurPartyMon] + call GetNick + hlcoord 5, 1 + call PlaceString + push bc + farcall CopyMonToTempMon + pop hl + call PrintLevel + ld hl, wPlayerHPPal + call SetHPPal + ld b, SCGB_MOVE_LIST + call GetSGBLayout + hlcoord 16, 0 + lb bc, 1, 3 + jp ClearBox +; 131ef + +SetUpMoveList: ; 131ef + xor a + ld [hBGMapMode], a + ld [wMoveSwapBuffer], a + ld [wMonType], a + predef CopyMonToTempMon + ld hl, wTempMonMoves + ld de, wListMoves_MoveIndicesBuffer + ld bc, NUM_MOVES + call CopyBytes + ld a, SCREEN_WIDTH * 2 + ld [wBuffer1], a + hlcoord 2, 3 + predef ListMoves + hlcoord 10, 4 + predef ListMovePP + call WaitBGMap + call SetPalettes + ld a, [wNumMoves] + inc a + ld [w2DMenuNumRows], a + hlcoord 0, 11 + ld b, 5 + ld c, 18 + jp TextBox +; 13235 + +PrepareToPlaceMoveData: ; 13235 + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld a, [wMenuCursorY] + dec a + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + ld [wCurMove], a + hlcoord 1, 12 + lb bc, 5, 18 + jp ClearBox +; 13256 + +PlaceMoveData: ; 13256 + xor a + ld [hBGMapMode], a + hlcoord 0, 10 + ld de, String_MoveType_Top + call PlaceString + hlcoord 0, 11 + ld de, String_MoveType_Bottom + call PlaceString + hlcoord 12, 12 + ld de, String_MoveAtk + call PlaceString + ld a, [wCurMove] + ld b, a + hlcoord 2, 12 + predef PrintMoveType + ld a, [wCurMove] + dec a + ld hl, Moves + MOVE_POWER + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + hlcoord 16, 12 + cp 2 + jr c, .no_power + ld [wd265], a + ld de, wd265 + lb bc, 1, 3 + call PrintNum + jr .description + +.no_power + ld de, String_MoveNoPower + call PlaceString + +.description + hlcoord 1, 14 + predef PrintMoveDesc + ld a, $1 + ld [hBGMapMode], a + ret +; 132ba + +String_MoveType_Top: ; 132ba + db "┌─────┐@" +; 132c2 +String_MoveType_Bottom: ; 132c2 + db "│TYPE/└@" +; 132ca +String_MoveAtk: ; 132ca + db "ATK/@" +; 132cf +String_MoveNoPower: ; 132cf + db "---@" +; 132d3 + +Function132d3: ; 132d3 + call Function132da + call Function132fe + ret +; 132da + +Function132da: ; 132da + ld a, [wCurPartyMon] + and a + ret z + ld c, a + ld e, a + ld d, 0 + ld hl, wPartyCount + add hl, de +.loop + ld a, [hl] + and a + jr z, .prev + cp EGG + jr z, .prev + cp NUM_POKEMON + 1 + jr c, .legal + +.prev + dec hl + dec c + jr nz, .loop + ret + +.legal + hlcoord 16, 0 + ld [hl], "◀" + ret +; 132fe + +Function132fe: ; 132fe + ld a, [wCurPartyMon] + inc a + ld c, a + ld a, [wPartyCount] + cp c + ret z + ld e, c + ld d, 0 + ld hl, wPartySpecies + add hl, de +.loop + ld a, [hl] + cp -1 + ret z + and a + jr z, .next + cp EGG + jr z, .next + cp NUM_POKEMON + 1 + jr c, .legal + +.next + inc hl + jr .loop + +.legal + hlcoord 18, 0 + ld [hl], "▶" + ret +; 13327 diff --git a/engine/menu/switch_items.asm b/engine/menu/switch_items.asm new file mode 100755 index 000000000..77b635246 --- /dev/null +++ b/engine/menu/switch_items.asm @@ -0,0 +1,274 @@ +SwitchItemsInBag: ; 2490c (9:490c) + ld a, [wSwitchItem] + and a + jr z, .init + ld b, a + ld a, [wScrollingMenuCursorPosition] + inc a + cp b + jr z, .trivial + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + ld a, [hl] + cp -1 + ret z + ld a, [wSwitchItem] + dec a + ld [wSwitchItem], a + call Function249a7 + jp c, Function249d1 + ld a, [wScrollingMenuCursorPosition] + ld c, a + ld a, [wSwitchItem] + cp c + jr c, .asm_2497a + jr .asm_2494a + +.init + ld a, [wScrollingMenuCursorPosition] + inc a + ld [wSwitchItem], a + ret + +.trivial + xor a + ld [wSwitchItem], a + ret + +.asm_2494a + ld a, [wSwitchItem] + call Function24a40 + ld a, [wScrollingMenuCursorPosition] + ld d, a + ld a, [wSwitchItem] + ld e, a + call Function24a6c + push bc + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + dec hl + push hl + call ItemSwitch_ConvertSpacingToDW + add hl, bc + ld d, h + ld e, l + pop hl + pop bc + call Function24aab + ld a, [wScrollingMenuCursorPosition] + call Function24a4d + xor a + ld [wSwitchItem], a + ret + +.asm_2497a + ld a, [wSwitchItem] + call Function24a40 + ld a, [wScrollingMenuCursorPosition] + ld d, a + ld a, [wSwitchItem] + ld e, a + call Function24a6c + push bc + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + ld d, h + ld e, l + call ItemSwitch_ConvertSpacingToDW + add hl, bc + pop bc + call CopyBytes + ld a, [wScrollingMenuCursorPosition] + call Function24a4d + xor a + ld [wSwitchItem], a + ret + +Function249a7: ; 249a7 (9:49a7) + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + ld d, h + ld e, l + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + ld a, [de] + cp [hl] + jr nz, .asm_249cd + ld a, [wScrollingMenuCursorPosition] + call Function24a97 + cp 99 + jr z, .asm_249cd + ld a, [wSwitchItem] + call Function24a97 + cp 99 + jr nz, .asm_249cf +.asm_249cd + and a + ret + +.asm_249cf + scf + ret + +Function249d1: ; 249d1 (9:49d1) + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + inc hl + push hl + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + inc hl + ld a, [hl] + pop hl + add [hl] + cp 100 + jr c, .asm_24a01 + sub 99 + push af + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + inc hl + ld [hl], 99 + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + inc hl + pop af + ld [hl], a + xor a + ld [wSwitchItem], a + ret + +.asm_24a01 + push af + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + inc hl + pop af + ld [hl], a + ld hl, wMenuData_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wSwitchItem] + cp [hl] + jr nz, .asm_24a25 + dec [hl] + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + ld [hl], $ff + xor a + ld [wSwitchItem], a + ret + +.asm_24a25 + dec [hl] + call ItemSwitch_ConvertSpacingToDW + push bc + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + pop bc + push hl + add hl, bc + pop de +.asm_24a34 + ld a, [hli] + ld [de], a + inc de + cp $ff + jr nz, .asm_24a34 + xor a + ld [wSwitchItem], a + ret + +Function24a40: ; 24a40 (9:4a40) + call ItemSwitch_GetNthItem + ld de, wd002 + call ItemSwitch_ConvertSpacingToDW + call CopyBytes + ret + +Function24a4d: ; 24a4d (9:4a4d) + call ItemSwitch_GetNthItem + ld d, h + ld e, l + ld hl, wd002 + call ItemSwitch_ConvertSpacingToDW + call CopyBytes + ret + +ItemSwitch_GetNthItem: ; 24a5c (9:4a5c) + push af + call ItemSwitch_ConvertSpacingToDW + ld hl, wMenuData_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + inc hl + pop af + call AddNTimes + ret + +Function24a6c: ; 24a6c (9:4a6c) + push hl + call ItemSwitch_ConvertSpacingToDW + ld a, d + sub e + jr nc, .dont_negate + dec a + cpl +.dont_negate + ld hl, 0 + call AddNTimes + ld b, h + ld c, l + pop hl + ret + +ItemSwitch_ConvertSpacingToDW: ; 24a80 (9:4a80) +; This function is absolutely idiotic. + push hl + ld a, [wMenuData_ScrollingMenuSpacing] + ld c, a + ld b, 0 + ld hl, .spacing_dws + add hl, bc + add hl, bc + ld c, [hl] + inc hl + ld b, [hl] + pop hl + ret + +; 24a91 (9:4a91) + +.spacing_dws ; 24a91 + dw 0, 1, 2 +; 24a97 + +Function24a97: ; 24a97 (9:4a97) + push af + call ItemSwitch_ConvertSpacingToDW + ld a, c + cp 2 + jr nz, .not_2 + pop af + call ItemSwitch_GetNthItem + inc hl + ld a, [hl] + ret + +.not_2 + pop af + ld a, $1 + ret + +Function24aab: ; 24aab (9:4aab) +.loop + ld a, [hld] + ld [de], a + dec de + dec bc + ld a, b + or c + jr nz, .loop + ret diff --git a/engine/menu/timeset.asm b/engine/menu/timeset.asm new file mode 100755 index 000000000..eda3094e1 --- /dev/null +++ b/engine/menu/timeset.asm @@ -0,0 +1,773 @@ +TIMESET_UP_ARROW EQUS "\"♂\"" ; $ef +TIMESET_DOWN_ARROW EQUS "\"♀\"" ; $f5 + +InitClock: ; 90672 (24:4672) +; Ask the player to set the time. + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + + ld a, $0 + ld [wSpriteUpdatesEnabled], a + ld a, $10 + ld [wMusicFade], a + ld a, LOW(MUSIC_NONE) + ld [wMusicFadeID], a + ld a, HIGH(MUSIC_NONE) + ld [wMusicFadeID + 1], a + ld c, 8 + call DelayFrames + call RotateFourPalettesLeft + call ClearTileMap + call ClearSprites + ld b, SCGB_DIPLOMA + call GetSGBLayout + xor a + ld [hBGMapMode], a + call LoadStandardFont + ld de, TimeSetBackgroundGFX + ld hl, vTiles2 tile $00 + lb bc, BANK(TimeSetBackgroundGFX), 1 + call Request1bpp + ld de, TimeSetUpArrowGFX + ld hl, vTiles2 tile $01 + lb bc, BANK(TimeSetUpArrowGFX), 1 + call Request1bpp + ld de, TimeSetDownArrowGFX + ld hl, vTiles2 tile $02 + lb bc, BANK(TimeSetDownArrowGFX), 1 + call Request1bpp + call .ClearScreen + call WaitBGMap + call RotateFourPalettesRight + ld hl, Text_WokeUpOak + call PrintText + ld hl, wTimeSetBuffer + ld bc, 50 + xor a + call ByteFill + ld a, 10 ; default hour = 10 AM + ld [wInitHourBuffer], a + +.loop + ld hl, Text_WhatTimeIsIt + call PrintText + hlcoord 3, 7 + ld b, 2 + ld c, 15 + call TextBox + hlcoord 11, 7 + ld [hl], $1 + hlcoord 11, 10 + ld [hl], $2 + hlcoord 4, 9 + call DisplayHourOClock + ld c, 10 + call DelayFrames + +.SetHourLoop: + call JoyTextDelay + call SetHour + jr nc, .SetHourLoop + + ld a, [wInitHourBuffer] + ld [wStringBuffer2 + 1], a + call .ClearScreen + ld hl, Text_WhatHrs + call PrintText + call YesNoBox + jr nc, .HourIsSet + call .ClearScreen + jr .loop + +.HourIsSet: + ld hl, Text_HowManyMinutes + call PrintText + hlcoord 11, 7 + lb bc, 2, 7 + call TextBox + hlcoord 15, 7 + ld [hl], $1 + hlcoord 15, 10 + ld [hl], $2 + hlcoord 12, 9 + call DisplayMinutesWithMinString + ld c, 10 + call DelayFrames + +.SetMinutesLoop: + call JoyTextDelay + call SetMinutes + jr nc, .SetMinutesLoop + + ld a, [wInitMinuteBuffer] + ld [wStringBuffer2 + 2], a + call .ClearScreen + ld hl, Text_WhoaMins + call PrintText + call YesNoBox + jr nc, .MinutesAreSet + call .ClearScreen + jr .HourIsSet + +.MinutesAreSet: + call InitTimeOfDay + ld hl, OakText_ResponseToSetTime + call PrintText + call WaitPressAorB_BlinkCursor + pop af + ld [hInMenu], a + ret + +.ClearScreen: ; 90783 (24:4783) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + ld a, $1 + ld [hBGMapMode], a + ret + +SetHour: ; 90795 (24:4795) + ld a, [hJoyPressed] + and A_BUTTON + jr nz, .Confirm + + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .up + ld a, [hl] + and D_DOWN + jr nz, .down + call DelayFrame + and a + ret + +.down + ld hl, wInitHourBuffer + ld a, [hl] + and a + jr nz, .DecreaseThroughMidnight + ld a, 23 + 1 +.DecreaseThroughMidnight: + dec a + ld [hl], a + jr .okay + +.up + ld hl, wInitHourBuffer + ld a, [hl] + cp 23 + jr c, .AdvanceThroughMidnight + ld a, -1 +.AdvanceThroughMidnight: + inc a + ld [hl], a + +.okay + hlcoord 4, 9 + ld a, " " + ld bc, 15 + call ByteFill + hlcoord 4, 9 + call DisplayHourOClock + call WaitBGMap + and a + ret + +.Confirm: + scf + ret + +DisplayHourOClock: ; 907de (24:47de) + push hl + ld a, [wInitHourBuffer] + ld c, a + ld e, l + ld d, h + call PrintHour + inc hl + ld de, String_oclock + call PlaceString + pop hl + ret +; 907f1 (24:47f1) + +UnreferencedFunction907f1: ; 907f1 + ld h, d + ld l, e + push hl + call DisplayHourOClock + pop de + inc de + inc de + ld a, ":" + ld [de], a + inc de + push de + ld hl, 3 + add hl, de + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + pop hl + call DisplayMinutesWithMinString + inc hl + inc hl + inc hl + ret +; 90810 + +SetMinutes: ; 90810 (24:4810) + ld a, [hJoyPressed] + and A_BUTTON + jr nz, .a_button + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .d_up + ld a, [hl] + and D_DOWN + jr nz, .d_down + call DelayFrame + and a + ret + +.d_down + ld hl, wInitMinuteBuffer + ld a, [hl] + and a + jr nz, .decrease + ld a, 59 + 1 +.decrease + dec a + ld [hl], a + jr .finish_dpad + +.d_up + ld hl, wInitMinuteBuffer + ld a, [hl] + cp 59 + jr c, .increase + ld a, -1 +.increase + inc a + ld [hl], a +.finish_dpad + hlcoord 12, 9 + ld a, " " + ld bc, 7 + call ByteFill + hlcoord 12, 9 + call DisplayMinutesWithMinString + call WaitBGMap + and a + ret +.a_button + scf + ret + +DisplayMinutesWithMinString: ; 90859 (24:4859) + ld de, wInitMinuteBuffer + call PrintTwoDigitNumberRightAlign + inc hl + ld de, String_min + call PlaceString + ret + +PrintTwoDigitNumberRightAlign: ; 90867 (24:4867) + push hl + ld a, " " + ld [hli], a + ld [hl], a + pop hl + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + ret +; 90874 (24:4874) + +Text_WokeUpOak: ; 0x90874 + ; Zzz… Hm? Wha…? You woke me up! Will you check the clock for me? + text_jump UnknownText_0x1bc29c + db "@" +; 0x90879 + +Text_WhatTimeIsIt: ; 0x90879 + ; What time is it? + text_jump UnknownText_0x1bc2eb + db "@" +; 0x9087e + +String_oclock: + db "o'clock@" +; 90886 + +Text_WhatHrs: ; 0x90886 + ; What?@ @ + text_jump UnknownText_0x1bc2fd + start_asm + hlcoord 1, 16 + call DisplayHourOClock + ld hl, .QuestionMark + ret +; 90895 (24:4895) + +.QuestionMark: ; 0x90895 + ; ? + text_jump UnknownText_0x1bc305 + db "@" +; 0x9089a + +Text_HowManyMinutes: ; 0x9089a + ; How many minutes? + text_jump UnknownText_0x1bc308 + db "@" +; 0x9089f + +String_min: + db "min.@" +; 908a4 + +Text_WhoaMins: ; 0x908a4 + ; Whoa!@ @ + text_jump UnknownText_0x1bc31b + start_asm + hlcoord 7, 14 + call DisplayMinutesWithMinString + ld hl, .QuestionMark + ret +; 908b3 (24:48b3) + +.QuestionMark: ; 0x908b3 + ; ? + text_jump UnknownText_0x1bc323 + db "@" +; 0x908b8 + +OakText_ResponseToSetTime: ; 0x908b8 + start_asm + decoord 1, 14 + ld a, [wInitHourBuffer] + ld c, a + call PrintHour + ld [hl], ":" + inc hl + ld de, wInitMinuteBuffer + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld b, h + ld c, l + ld a, [wInitHourBuffer] + cp MORN_HOUR + jr c, .nite + cp DAY_HOUR + 1 + jr c, .morn + cp NITE_HOUR + jr c, .day +.nite: + ld hl, .sodark + ret +.morn: + ld hl, .overslept + ret +.day: + ld hl, .yikes + ret +; 908ec (24:48ec) + +.overslept ; 0x908ec + ; ! I overslept! + text_jump UnknownText_0x1bc326 + db "@" +; 0x908f1 + +.yikes ; 0x908f1 + ; ! Yikes! I over- slept! + text_jump UnknownText_0x1bc336 + db "@" +; 0x908f6 + +.sodark ; 0x908f6 + ; ! No wonder it's so dark! + text_jump UnknownText_0x1bc34f + db "@" +; 0x908fb + +TimeSetBackgroundGFX: ; 908fb +INCBIN "gfx/new_game/timeset_bg.1bpp" +TimeSetUpArrowGFX: ; 90903 +INCBIN "gfx/new_game/up_arrow.1bpp" +TimeSetDownArrowGFX: ; 9090b +INCBIN "gfx/new_game/down_arrow.1bpp" +; 90913 + +SetDayOfWeek: ; 90913 + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + ld de, TimeSetUpArrowGFX + ld hl, vTiles0 tile TIMESET_UP_ARROW + lb bc, BANK(TimeSetUpArrowGFX), 1 + call Request1bpp + ld de, TimeSetDownArrowGFX + ld hl, vTiles0 tile TIMESET_DOWN_ARROW + lb bc, BANK(TimeSetDownArrowGFX), 1 + call Request1bpp + xor a + ld [wTempDayOfWeek], a +.loop + hlcoord 0, 12 + lb bc, 4, 18 + call TextBox + call LoadStandardMenuHeader + ld hl, .WhatDayIsItText + call PrintText + hlcoord 9, 3 + ld b, 2 + ld c, 9 + call TextBox + hlcoord 14, 3 + ld [hl], TIMESET_UP_ARROW + hlcoord 14, 6 + ld [hl], TIMESET_DOWN_ARROW + hlcoord 10, 5 + call .PlaceWeekdayString + call ApplyTilemap + ld c, 10 + call DelayFrames +.loop2 + call JoyTextDelay + call .GetJoypadAction + jr nc, .loop2 + call ExitMenu + call UpdateSprites + ld hl, .ConfirmWeekdayText + call PrintText + call YesNoBox + jr c, .loop + ld a, [wTempDayOfWeek] + ld [wStringBuffer2], a + call InitDayOfWeek + call LoadStandardFont + pop af + ld [hInMenu], a + ret +; 90993 + +.GetJoypadAction: ; 90993 + ld a, [hJoyPressed] + and A_BUTTON + jr z, .not_A + scf + ret + +.not_A + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .d_up + ld a, [hl] + and D_DOWN + jr nz, .d_down + call DelayFrame + and a + ret + +.d_down + ld hl, wTempDayOfWeek + ld a, [hl] + and a + jr nz, .decrease + ld a, SATURDAY + 1 + +.decrease + dec a + ld [hl], a + jr .finish_dpad + +.d_up + ld hl, wTempDayOfWeek + ld a, [hl] + cp 6 + jr c, .increase + ld a, SUNDAY - 1 + +.increase + inc a + ld [hl], a + +.finish_dpad + xor a + ld [hBGMapMode], a + hlcoord 10, 4 + ld b, 2 + ld c, 9 + call ClearBox + hlcoord 10, 5 + call .PlaceWeekdayString + call WaitBGMap + and a + ret +; 909de + +.PlaceWeekdayString: ; 909de + push hl + ld a, [wTempDayOfWeek] + ld e, a + ld d, 0 + ld hl, .WeekdayStrings + add hl, de + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + call PlaceString + ret +; 909f2 + +.WeekdayStrings: ; 909f2 +; entries correspond to wCurDay constants (see constants/wram_constants.asm) + dw .Sunday + dw .Monday + dw .Tuesday + dw .Wednesday + dw .Thursday + dw .Friday + dw .Saturday + dw .Sunday + +.Sunday: db " SUNDAY@" +.Monday: db " MONDAY@" +.Tuesday: db " TUESDAY@" +.Wednesday: db "WEDNESDAY@" +.Thursday: db "THURSDAY@" +.Friday: db " FRIDAY@" +.Saturday: db "SATURDAY@" + + +.WhatDayIsItText: ; 0x90a3f + ; What day is it? + text_jump UnknownText_0x1bc369 + db "@" +; 0x90a44 + +.ConfirmWeekdayText: ; 0x90a44 + start_asm + hlcoord 1, 14 + call .PlaceWeekdayString + ld hl, .IsIt + ret +; 90a4f (24:4a4f) + +.IsIt: ; 0x90a4f + ; , is it? + text_jump UnknownText_0x1bc37a + db "@" +; 0x90a54 + +InitialSetDSTFlag: ; 90a54 + ld a, [wDST] + set 7, a + ld [wDST], a + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ld hl, .Text + call PlaceHLTextAtBC + ret +; 90a6c + +.Text: ; 90a6c + start_asm + call UpdateTime + ld a, [hHours] + ld b, a + ld a, [hMinutes] + ld c, a + decoord 1, 14 + farcall PrintHoursMins + ld hl, .DSTIsThatOK + ret +; 90a83 (24:4a83) + +.DSTIsThatOK: ; 0x90a83 + ; DST, is that OK? + text_jump Text_DSTIsThatOK + db "@" +; 0x90a88 + +InitialClearDSTFlag: ; 90a88 + ld a, [wDST] + res 7, a + ld [wDST], a + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ld hl, .Text + call PlaceHLTextAtBC + ret +; 90aa0 + +.Text: ; 90aa0 + start_asm + call UpdateTime + ld a, [hHours] + ld b, a + ld a, [hMinutes] + ld c, a + decoord 1, 14 + farcall PrintHoursMins + ld hl, .IsThatOK + ret +; 90ab7 + +.IsThatOK: ; 0x90ab7 + ; , is that OK? + text_jump UnknownText_0x1c5ff1 + db "@" +; 0x90abc + +DebugDisplayTime: ; 90abc + hlcoord 1, 14 + lb bc, 3, SCREEN_WIDTH - 2 + call ClearBox + ld hl, .Text + call PlaceHLTextAtBC + ret +; 90acc + +.Text: ; 0x90acc + start_asm + call UpdateTime + + hlcoord 1, 14 + ld [hl], "R" + inc hl + ld [hl], "T" + inc hl + ld [hl], " " + inc hl + + ld de, hRTCDayLo + call .PrintTime + + hlcoord 1, 16 + ld [hl], "D" + inc hl + ld [hl], "F" + inc hl + ld [hl], " " + inc hl + + ld de, wStartDay + call .PrintTime + + ld [hl], " " + inc hl + + ld a, [wDST] + bit 7, a + jr z, .off + + ld [hl], "O" + inc hl + ld [hl], "N" + inc hl + jr .done + +.off + ld [hl], "O" + inc hl + ld [hl], "F" + inc hl + ld [hl], "F" + inc hl + +.done + ld hl, .NowOnDebug + ret +; 90b13 + +.NowOnDebug: ; 0x90b13 + text "Now on DEBUG…" + prompt +; 0x90b23 + +.PrintTime: ; 90b23 + lb bc, 1, 3 + call PrintNum + ld [hl], "." + inc hl + inc de + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld [hl], ":" + inc hl + inc de + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ret +; 90b3e + +PrintHour: ; 90b3e (24:4b3e) + ld l, e + ld h, d + push bc + call GetTimeOfDayString + call PlaceString + ld l, c + ld h, b + inc hl + pop bc + call AdjustHourForAMorPM + ld [wd265], a + ld de, wd265 + call PrintTwoDigitNumberRightAlign + ret + +GetTimeOfDayString: ; 90b58 (24:4b58) + ld a, c + cp MORN_HOUR + jr c, .nite + cp DAY_HOUR + jr c, .morn + cp NITE_HOUR + jr c, .day +.nite + ld de, .nite_string + ret +.morn + ld de, .morn_string + ret +.day + ld de, .day_string + ret +; 90b71 (24:4b71) + +.nite_string: db "NITE@" +.morn_string: db "MORN@" +.day_string: db "DAY@" +; 90b7f + +AdjustHourForAMorPM: +; Convert the hour stored in c (0-23) to a 1-12 value + ld a, c + or a + jr z, .midnight + cp NOON_HOUR + ret c + ret z + sub NOON_HOUR + ret + +.midnight + ld a, NOON_HOUR + ret diff --git a/engine/menu/tmhm.asm b/engine/menu/tmhm.asm new file mode 100755 index 000000000..9db3dc291 --- /dev/null +++ b/engine/menu/tmhm.asm @@ -0,0 +1,49 @@ +CanLearnTMHMMove: ; 11639 + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call GetBaseData + ld hl, wBaseTMHM + push hl + + ld a, [wPutativeTMHMMove] + ld b, a + ld c, 0 + ld hl, TMHMMoves +.loop + ld a, [hli] + and a + jr z, .end + cp b + jr z, .asm_11659 + inc c + jr .loop + +.asm_11659 + pop hl + ld b, CHECK_FLAG + push de + ld d, 0 + predef SmallFarFlagAction + pop de + ret + +.end + pop hl + ld c, 0 + ret +; 1166a + +GetTMHMMove: ; 1166a + ld a, [wd265] + dec a + ld hl, TMHMMoves + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wd265], a + ret +; 1167a + + +INCLUDE "data/moves/tmhm_moves.asm" diff --git a/engine/menu/trainer_card.asm b/engine/menu/trainer_card.asm new file mode 100755 index 000000000..e84c1c9f3 --- /dev/null +++ b/engine/menu/trainer_card.asm @@ -0,0 +1,623 @@ +; TrainerCard.Jumptable indexes + const_def + const TRAINERCARDSTATE_PAGE1_LOADGFX ; 0 + const TRAINERCARDSTATE_PAGE1_JOYPAD ; 1 + const TRAINERCARDSTATE_PAGE2_LOADGFX ; 2 + const TRAINERCARDSTATE_PAGE2_JOYPAD ; 3 + const TRAINERCARDSTATE_PAGE3_LOADGFX ; 4 + const TRAINERCARDSTATE_PAGE3_JOYPAD ; 5 + const TRAINERCARDSTATE_QUIT ; 6 + +TrainerCard: ; 25105 + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call .InitRAM +.loop + call UpdateTime + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .quit + ld a, [hJoyLast] + and B_BUTTON + jr nz, .quit + call .RunJumptable + call DelayFrame + jr .loop + +.quit + pop af + ld [wOptions], a + pop af + ld [wVramState], a + ret + +.InitRAM: ; 2513b (9:513b) + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call DisableLCD + + farcall GetCardPic + + ld hl, CardRightCornerGFX + ld de, vTiles2 tile $1c + ld bc, 1 tiles + ld a, BANK(CardRightCornerGFX) + call FarCopyBytes + + ld hl, CardStatusGFX + ld de, vTiles2 tile $29 + ld bc, 86 tiles + ld a, BANK(CardStatusGFX) + call FarCopyBytes + + call TrainerCard_PrintTopHalfOfCard + + hlcoord 0, 8 + ld d, 6 + call TrainerCard_InitBorder + + call EnableLCD + call WaitBGMap + ld b, SCGB_TRAINER_CARD + call GetSGBLayout + call SetPalettes + call WaitBGMap + ld hl, wJumptableIndex + xor a ; TRAINERCARDSTATE_PAGE1_LOADGFX + ld [hli], a ; wJumptableIndex + ld [hli], a ; wTrainerCardBadgeFrameCounter + ld [hli], a ; wTrainerCardBadgeTileID + ld [hl], a ; wTrainerCardBadgeAttributes + ret + +.RunJumptable: ; 2518e (9:518e) + jumptable .Jumptable, wJumptableIndex + +.Jumptable: ; 2519d (9:519d) +; entries correspond to TRAINERCARDSTATE_* constants + dw TrainerCard_Page1_LoadGFX + dw TrainerCard_Page1_Joypad + dw TrainerCard_Page2_LoadGFX + dw TrainerCard_Page2_Joypad + dw TrainerCard_Page3_LoadGFX + dw TrainerCard_Page3_Joypad + dw TrainerCard_Quit + +TrainerCard_IncrementJumptable: ; 251ab (9:51ab) + ld hl, wJumptableIndex + inc [hl] + ret + +TrainerCard_Quit: ; 251b0 (9:51b0) + ld hl, wJumptableIndex + set 7, [hl] + ret + +TrainerCard_Page1_LoadGFX: ; 251b6 (9:51b6) + call ClearSprites + hlcoord 0, 8 + ld d, 6 + call TrainerCard_InitBorder + call WaitBGMap + ld de, CardStatusGFX + ld hl, vTiles2 tile $29 + lb bc, BANK(CardStatusGFX), 86 + call Request2bpp + call TrainerCard_Page1_PrintDexCaught_GameTime + call TrainerCard_IncrementJumptable + ret + +TrainerCard_Page1_Joypad: ; 251d7 (9:51d7) + call TrainerCard_Page1_PrintGameTime + ld hl, hJoyLast + ld a, [hl] + and D_RIGHT | A_BUTTON + jr nz, .pressed_right_a + ret + +.pressed_right_a + ld a, TRAINERCARDSTATE_PAGE2_LOADGFX + ld [wJumptableIndex], a + ret + +.Unreferenced_KantoCheck: + ld a, [wKantoBadges] + and a + ret z + ld a, TRAINERCARDSTATE_PAGE3_LOADGFX + ld [wJumptableIndex], a + ret + +; 251f4 + +TrainerCard_Page2_LoadGFX: ; 251f4 (9:51f4) + call ClearSprites + hlcoord 0, 8 + ld d, 6 + call TrainerCard_InitBorder + call WaitBGMap + ld de, LeaderGFX + ld hl, vTiles2 tile $29 + lb bc, BANK(LeaderGFX), 86 + call Request2bpp + ld de, BadgeGFX + ld hl, vTiles0 tile $00 + lb bc, BANK(BadgeGFX), 44 + call Request2bpp + call TrainerCard_Page2_3_InitObjectsAndStrings + call TrainerCard_IncrementJumptable + ret + +TrainerCard_Page2_Joypad: ; 25221 (9:5221) + ld hl, TrainerCard_JohtoBadgesOAM + call TrainerCard_Page2_3_AnimateBadges + ld hl, hJoyLast + ld a, [hl] + and A_BUTTON + jr nz, .Quit + ld a, [hl] + and D_LEFT + jr nz, .d_left + ret + +.d_left + ld a, TRAINERCARDSTATE_PAGE1_LOADGFX + ld [wJumptableIndex], a + ret + +.Unreferenced_KantoCheck: + ld a, [wKantoBadges] + and a + ret z + ld a, TRAINERCARDSTATE_PAGE3_LOADGFX + ld [wJumptableIndex], a + ret + +.Quit: + ld a, TRAINERCARDSTATE_QUIT + ld [wJumptableIndex], a + ret + +TrainerCard_Page3_LoadGFX: ; 2524c (9:524c) + call ClearSprites + hlcoord 0, 8 + ld d, 6 + call TrainerCard_InitBorder + call WaitBGMap + ld de, LeaderGFX2 + ld hl, vTiles2 tile $29 + lb bc, BANK(LeaderGFX2), 86 + call Request2bpp + ld de, BadgeGFX2 + ld hl, vTiles0 tile $00 + lb bc, BANK(BadgeGFX2), 44 + call Request2bpp + call TrainerCard_Page2_3_InitObjectsAndStrings + call TrainerCard_IncrementJumptable + ret + +TrainerCard_Page3_Joypad: ; 25279 (9:5279) + ld hl, TrainerCard_JohtoBadgesOAM + call TrainerCard_Page2_3_AnimateBadges + ld hl, hJoyLast + ld a, [hl] + and D_LEFT + jr nz, .left + ld a, [hl] + and D_RIGHT + jr nz, .right + ret + +.left + ld a, TRAINERCARDSTATE_PAGE2_LOADGFX + ld [wJumptableIndex], a + ret + +.right + ld a, TRAINERCARDSTATE_PAGE1_LOADGFX + ld [wJumptableIndex], a + ret + +TrainerCard_PrintTopHalfOfCard: ; 25299 (9:5299) + hlcoord 0, 0 + ld d, 5 + call TrainerCard_InitBorder + hlcoord 2, 2 + ld de, .Name_Money + call PlaceString + hlcoord 2, 4 + ld de, .ID_No + call TrainerCardSetup_PlaceTilemapString + hlcoord 7, 2 + ld de, wPlayerName + call PlaceString + hlcoord 5, 4 + ld de, wPlayerID + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + hlcoord 7, 6 + ld de, wMoney + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + hlcoord 1, 3 + ld de, .HorizontalDivider + call TrainerCardSetup_PlaceTilemapString + hlcoord 14, 1 + lb bc, 5, 7 + xor a + ld [hGraphicStartTile], a + predef PlaceGraphic + ret + +; 252ec (9:52ec) + +.Name_Money: ; 252ec + db "NAME/" + next "" + next "MONEY@" + +.ID_No: ; 252f9 + db $27, $28, -1 ; ID NO + +.HorizontalDivider: ; 252fc + db $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $26, -1 ; ____________> +; 2530a + +TrainerCard_Page1_PrintDexCaught_GameTime: ; 2530a (9:530a) + hlcoord 2, 10 + ld de, .Dex_PlayTime + call PlaceString + hlcoord 10, 15 + ld de, .Badges + call PlaceString + ld hl, wPokedexCaught + ld b, wEndPokedexCaught - wPokedexCaught + call CountSetBits + ld de, wd265 + hlcoord 15, 10 + lb bc, 1, 3 + call PrintNum + call TrainerCard_Page1_PrintGameTime + hlcoord 2, 8 + ld de, .StatusTilemap + call TrainerCardSetup_PlaceTilemapString + ld a, [wStatusFlags] + bit STATUSFLAGS_POKEDEX_F, a + ret nz + hlcoord 1, 9 + lb bc, 2, 17 + call ClearBox + ret + +.Dex_PlayTime: + db "#DEX" + next "PLAY TIME@@" + +.Badges: + db " BADGES▶@" + +.StatusTilemap: ; 25366 + db $29, $2a, $2b, $2c, $2d, -1 +; 2536c + +TrainerCard_Page2_3_InitObjectsAndStrings: ; 2536c (9:536c) + hlcoord 2, 8 + ld de, .BadgesTilemap + call TrainerCardSetup_PlaceTilemapString + hlcoord 2, 10 + ld a, $29 + ld c, 4 +.loop + call TrainerCard_Page2_3_PlaceLeadersFaces +rept 4 + inc hl +endr + dec c + jr nz, .loop + hlcoord 2, 13 + ld a, $51 + ld c, 4 +.loop2 + call TrainerCard_Page2_3_PlaceLeadersFaces +rept 4 + inc hl +endr + dec c + jr nz, .loop2 + xor a + ld [wTrainerCardBadgeFrameCounter], a + ld hl, TrainerCard_JohtoBadgesOAM + call TrainerCard_Page2_3_OAMUpdate + ret + +; 253a2 (9:53a2) + +.BadgesTilemap: ; 253a2 + db $79, $7a, $7b, $7c, $7d, -1 ; "BADGES" +; 253a8 + +TrainerCardSetup_PlaceTilemapString: ; 253a8 (9:53a8) +.loop + ld a, [de] + cp -1 + ret z + ld [hli], a + inc de + jr .loop + +TrainerCard_InitBorder: ; 253b0 (9:53b0) + ld e, SCREEN_WIDTH +.loop1 + ld a, $23 + ld [hli], a + dec e + jr nz, .loop1 + + ld a, $23 + ld [hli], a + ld e, SCREEN_HEIGHT - 1 + ld a, " " +.loop2 + ld [hli], a + dec e + jr nz, .loop2 + + ld a, $1c + ld [hli], a + ld a, $23 + ld [hli], a +.loop3 + ld a, $23 + ld [hli], a + + ld e, SCREEN_HEIGHT + ld a, " " +.loop4 + ld [hli], a + dec e + jr nz, .loop4 + + ld a, $23 + ld [hli], a + dec d + jr nz, .loop3 + + ld a, $23 + ld [hli], a + ld a, $24 + ld [hli], a + + ld e, SCREEN_HEIGHT - 1 + ld a, " " +.loop5 + ld [hli], a + dec e + jr nz, .loop5 + ld a, $23 + ld [hli], a + ld e, SCREEN_WIDTH +.loop6 + ld a, $23 + ld [hli], a + dec e + jr nz, .loop6 + ret + +TrainerCard_Page2_3_PlaceLeadersFaces: ; 253f4 (9:53f4) + push de + push hl + ld [hli], a + inc a + ld [hli], a + inc a + ld [hli], a + inc a + ld [hli], a + inc a + ld de, SCREEN_WIDTH - 3 + add hl, de + ld [hli], a + inc a + ld [hli], a + inc a + ld [hli], a + inc a + ld de, SCREEN_WIDTH - 3 + add hl, de + ld [hli], a + inc a + ld [hli], a + inc a + ld [hli], a + inc a + pop hl + pop de + ret + +TrainerCard_Page1_PrintGameTime: ; 25415 (9:5415) + hlcoord 11, 12 + ld de, wGameTimeHours + lb bc, 2, 4 + call PrintNum + inc hl + ld de, wGameTimeMinutes + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld a, [hVBlankCounter] + and $1f + ret nz + hlcoord 15, 12 + ld a, [hl] + xor " " ^ $2e ; alternate between space and small colon ($2e) tiles + ld [hl], a + ret + +TrainerCard_Page2_3_AnimateBadges: ; 25438 (9:5438) + ld a, [hVBlankCounter] + and %111 + ret nz + ld a, [wTrainerCardBadgeFrameCounter] + inc a + and %111 + ld [wTrainerCardBadgeFrameCounter], a + jr TrainerCard_Page2_3_OAMUpdate + +TrainerCard_Page2_3_OAMUpdate: ; 25448 (9:5448) +; copy flag array pointer + ld a, [hli] + ld e, a + ld a, [hli] +; get flag array + ld d, a + ld a, [de] + ld c, a + ld de, wVirtualOAMSprite00 + ld b, NUM_JOHTO_BADGES +.loop + srl c + push bc + jr nc, .skip_badge + push hl + ld a, [hli] ; y + ld b, a + ld a, [hli] ; x + ld c, a + ld a, [hli] ; pal + ld [wTrainerCardBadgeAttributes], a + ld a, [wTrainerCardBadgeFrameCounter] + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, [hl] + ld [wTrainerCardBadgeTileID], a + call .PrepOAM + pop hl +.skip_badge + ld bc, $b ; 3 + 2 * 4 + add hl, bc + pop bc + dec b + jr nz, .loop + ret + +.PrepOAM: ; 2547b (9:547b) + ld a, [wTrainerCardBadgeTileID] + and 1 << 7 + jr nz, .xflip + ld hl, .facing1 + jr .loop2 + +.xflip + ld hl, .facing2 +.loop2 + ld a, [hli] + cp -1 + ret z + add b + ld [de], a ; y + inc de + + ld a, [hli] + add c + ld [de], a ; x + inc de + + ld a, [wTrainerCardBadgeTileID] + and $ff ^ (1 << 7) + add [hl] + ld [de], a ; tile id + inc hl + inc de + + ld a, [wTrainerCardBadgeAttributes] + add [hl] + ld [de], a ; attributes + inc hl + inc de + jr .loop2 + +; 254a7 (9:54a7) + +.facing1 ; 254a7 + dsprite 0, 0, 0, 0, $00, 0 + dsprite 0, 0, 1, 0, $01, 0 + dsprite 1, 0, 0, 0, $02, 0 + dsprite 1, 0, 1, 0, $03, 0 + db -1 + +.facing2 ; 254b8 + dsprite 0, 0, 0, 0, $01, 0 | X_FLIP + dsprite 0, 0, 1, 0, $00, 0 | X_FLIP + dsprite 1, 0, 0, 0, $03, 0 | X_FLIP + dsprite 1, 0, 1, 0, $02, 0 | X_FLIP + db -1 + +TrainerCard_JohtoBadgesOAM: ; 254c9 +; Template OAM data for each badge on the trainer card. +; Format: + ; y, x, palette + ; cycle 1: face tile, in1 tile, in2 tile, in3 tile + ; cycle 2: face tile, in1 tile, in2 tile, in3 tile + + dw wJohtoBadges + + ; Zephyrbadge + db $68, $18, 0 + db $00, $20, $24, $20 | (1 << 7) + db $00, $20, $24, $20 | (1 << 7) + + ; Hivebadge + db $68, $38, 0 + db $04, $20, $24, $20 | (1 << 7) + db $04, $20, $24, $20 | (1 << 7) + + ; Plainbadge + db $68, $58, 0 + db $08, $20, $24, $20 | (1 << 7) + db $08, $20, $24, $20 | (1 << 7) + + ; Fogbadge + db $68, $78, 0 + db $0c, $20, $24, $20 | (1 << 7) + db $0c, $20, $24, $20 | (1 << 7) + + ; Mineralbadge + db $80, $38, 0 + db $10, $20, $24, $20 | (1 << 7) + db $10, $20, $24, $20 | (1 << 7) + + ; Stormbadge + db $80, $18, 0 + db $14, $20, $24, $20 | (1 << 7) + db $14, $20, $24, $20 | (1 << 7) + + ; Glacierbadge + db $80, $58, 0 + db $18, $20, $24, $20 | (1 << 7) + db $18, $20, $24, $20 | (1 << 7) + + ; Risingbadge + ; X-flips on alternate cycles. + db $80, $78, 0 + db $1c, $20, $24, $20 | (1 << 7) + db $1c | (1 << 7), $20, $24, $20 | (1 << 7) +; 25523 + +CardStatusGFX: INCBIN "gfx/trainer_card/card_status.2bpp" + +LeaderGFX: INCBIN "gfx/trainer_card/leaders.2bpp" +LeaderGFX2: INCBIN "gfx/trainer_card/leaders.2bpp" +BadgeGFX: INCBIN "gfx/trainer_card/badges.2bpp" +BadgeGFX2: INCBIN "gfx/trainer_card/badges.2bpp" + +CardRightCornerGFX: INCBIN "gfx/trainer_card/card_right_corner.2bpp" diff --git a/engine/menu_2.asm b/engine/menu_2.asm deleted file mode 100644 index 16cce5348..000000000 --- a/engine/menu_2.asm +++ /dev/null @@ -1,253 +0,0 @@ -PlaceMenuItemName: ; 0x24ab4 - push de - ld a, [wMenuSelection] - ld [wNamedObjectIndexBuffer], a - call GetItemName - pop hl - call PlaceString - ret - -PlaceMenuItemQuantity: ; 0x24ac3 - push de - ld a, [wMenuSelection] - ld [wCurItem], a - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - pop hl - and a - jr nz, .done - ld de, $15 - add hl, de - ld [hl], "×" - inc hl - ld de, wMenuSelectionQuantity - lb bc, 1, 2 - call PrintNum - -.done - ret - -PlaceMoneyTopRight: ; 24ae8 - ld hl, MenuHeader_0x24b15 - call CopyMenuHeader - jr PlaceMoneyTextBox - -PlaceMoneyBottomLeft: ; 24af0 - ld hl, MenuHeader_0x24b1d - call CopyMenuHeader - jr PlaceMoneyTextBox - -PlaceMoneyAtTopLeftOfTextbox: ; 24af8 - ld hl, MenuHeader_0x24b15 - lb de, 0, 11 - call OffsetMenuHeader - -PlaceMoneyTextBox: ; 24b01 - call MenuBox - call MenuBoxCoord2Tile - ld de, SCREEN_WIDTH + 1 - add hl, de - ld de, wMoney - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - ret - -MenuHeader_0x24b15: ; 0x24b15 - db MENU_BACKUP_TILES ; flags - menu_coords 11, 0, SCREEN_WIDTH - 1, 2 - dw NULL - db 1 ; default option - -MenuHeader_0x24b1d: ; 0x24b1d - db MENU_BACKUP_TILES ; flags - menu_coords 0, 11, 8, 13 - dw NULL - db 1 ; default option - -DisplayCoinCaseBalance: ; 24b25 - ; Place a text box of size 1x7 at 11, 0. - hlcoord 11, 0 - ld b, 1 - ld c, 7 - call TextBox - hlcoord 12, 0 - ld de, CoinString - call PlaceString - hlcoord 17, 1 - ld de, ShowMoney_TerminatorString - call PlaceString - ld de, wCoins - lb bc, 2, 4 - hlcoord 13, 1 - call PrintNum - ret - -DisplayMoneyAndCoinBalance: ; 24b4e - hlcoord 5, 0 - ld b, 3 - ld c, 13 - call TextBox - hlcoord 6, 1 - ld de, MoneyString - call PlaceString - hlcoord 12, 1 - ld de, wMoney - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - hlcoord 6, 3 - ld de, CoinString - call PlaceString - hlcoord 15, 3 - ld de, wCoins - lb bc, 2, 4 - call PrintNum - ret - -MoneyString: ; 24b83 - db "MONEY@" -CoinString: ; 24b89 - db "COIN@" -ShowMoney_TerminatorString: ; 24b8e - db "@" - -Unreferenced_Function24b8f: ; 24b8f -; related to safari? - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - hlcoord 0, 0 - ld b, 3 - ld c, 7 - call TextBox - hlcoord 1, 1 - ld de, wSafariTimeRemaining - lb bc, 2, 3 - call PrintNum - hlcoord 4, 1 - ld de, .slash_500 - call PlaceString - hlcoord 1, 3 - ld de, .booru_ko - call PlaceString - hlcoord 5, 3 - ld de, wSafariBallsRemaining - lb bc, 1, 2 - call PrintNum - pop af - ld [wOptions], a - ret - -.slash_500 ; 24bcf - db "/500@" -.booru_ko ; 24bd4 - db "ボール   こ@" - -StartMenu_DrawBugContestStatusBox: ; 24bdc - hlcoord 0, 0 - ld b, 5 - ld c, 17 - call TextBox - ret - -StartMenu_PrintBugContestStatus: ; 24be7 - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call StartMenu_DrawBugContestStatusBox - hlcoord 1, 5 - ld de, .Balls_EN - call PlaceString - hlcoord 8, 5 - ld de, wParkBallsRemaining - lb bc, PRINTNUM_RIGHTALIGN | 1, 2 - call PrintNum - hlcoord 1, 1 - ld de, .CAUGHT - call PlaceString - ld a, [wContestMon] - and a - ld de, .None - jr z, .no_contest_mon - ld [wd265], a - call GetPokemonName - -.no_contest_mon - hlcoord 8, 1 - call PlaceString - ld a, [wContestMon] - and a - jr z, .skip_level - hlcoord 1, 3 - ld de, .LEVEL - call PlaceString - ld a, [wContestMonLevel] - ld h, b - ld l, c - inc hl - ld c, 3 - call Print8BitNumRightAlign - -.skip_level - pop af - ld [wOptions], a - ret - -.Balls_JP: ; 24c43 - db "ボール   こ@" -.CAUGHT: ; 24c4b - db "CAUGHT@" -.Balls_EN: ; 24c52 - db "BALLS:@" -.None: ; 24c59 - db "None@" -.LEVEL: ; 24c5e - db "LEVEL@" - -FindApricornsInBag: ; 24c64 -; Checks the bag for Apricorns. - ld hl, wBuffer1 - xor a - ld [hli], a - dec a - ld bc, 10 - call ByteFill - - ld hl, ApricornBalls -.loop - ld a, [hl] - cp -1 - jr z, .done - push hl - ld [wCurItem], a - ld hl, wNumItems - call CheckItem - pop hl - jr nc, .nope - ld a, [hl] - call .addtobuffer -.nope - inc hl - inc hl - jr .loop - -.done - ld a, [wBuffer1] - and a - ret nz - scf - ret - -.addtobuffer ; 24c94 - push hl - ld hl, wBuffer1 - inc [hl] - ld e, [hl] - ld d, 0 - add hl, de - ld [hl], a - pop hl - ret - -INCLUDE "data/items/apricorn_balls.asm" diff --git a/engine/mon_icons.asm b/engine/mon_icons.asm deleted file mode 100755 index 5a26d2d7c..000000000 --- a/engine/mon_icons.asm +++ /dev/null @@ -1,471 +0,0 @@ -LoadOverworldMonIcon: ; 8e82b - ld a, e - call ReadMonMenuIcon - ld l, a - ld h, 0 - add hl, hl - ld de, IconPointers - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - ld b, BANK(Icons) - ld c, 8 - ret -; 8e83f - -LoadMenuMonIcon: ; 8e83f - push hl - push de - push bc - call .LoadIcon - pop bc - pop de - pop hl - ret -; 8e849 - -.LoadIcon: ; 8e849 - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 8e854 - - -.Jumptable: ; 8e854 (23:6854) - dw PartyMenu_InitAnimatedMonIcon ; party menu - dw NamingScreen_InitAnimatedMonIcon ; naming screen - dw MoveList_InitAnimatedMonIcon ; moves (?) - dw Trade_LoadMonIconGFX ; trade - dw Mobile_InitAnimatedMonIcon ; mobile - dw Mobile_InitPartyMenuBGPal71 ; mobile - dw .GetPartyMenuMonIcon ; unused - -.GetPartyMenuMonIcon: ; 8e862 (23:6862) - call InitPartyMenuIcon - call .GetPartyMonItemGFX - call SetPartyMonIconAnimSpeed - ret - -.GetPartyMonItemGFX: ; 8e86c (23:686c) - push bc - ld a, [hObjectStructIndexBuffer] - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - pop bc - ld a, [hl] - and a - jr z, .no_item - push hl - push bc - ld d, a - callfar ItemIsMail - pop bc - pop hl - jr c, .not_mail - ld a, $6 - jr .got_tile -.not_mail - ld a, $5 - ; jr .got_tile - -.no_item - ld a, $4 -.got_tile - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], a - ret - -Mobile_InitAnimatedMonIcon: ; 8e898 (23:6898) - call PartyMenu_InitAnimatedMonIcon - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld a, SPRITE_ANIM_SEQ_NULL - ld [hl], a - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, 9 * 8 - ld [hl], a - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, 9 * 8 - ld [hl], a - ret - -Mobile_InitPartyMenuBGPal71: ; 8e8b1 (23:68b1) - call InitPartyMenuIcon - call SetPartyMonIconAnimSpeed - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld a, SPRITE_ANIM_SEQ_NULL - ld [hl], a - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, 3 * 8 - ld [hl], a - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, 12 * 8 - ld [hl], a - ld a, c - ld [wc608], a - ld a, b - ld [wc608 + 1], a - ret - -PartyMenu_InitAnimatedMonIcon: ; 8e8d5 (23:68d5) - call InitPartyMenuIcon - call .SpawnItemIcon - call SetPartyMonIconAnimSpeed - ret - -.SpawnItemIcon: ; 8e8df (23:68df) - push bc - ld a, [hObjectStructIndexBuffer] - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - pop bc - ld a, [hl] - and a - ret z - push hl - push bc - ld d, a - callfar ItemIsMail - pop bc - pop hl - jr c, .mail - ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_ITEM - jr .okay - -.mail - ld a, SPRITE_ANIM_FRAMESET_PARTY_MON_WITH_MAIL -.okay - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], a - ret - -InitPartyMenuIcon: ; 8e908 (23:6908) - ld a, [wCurIconTile] - push af - ld a, [hObjectStructIndexBuffer] - ld hl, wPartySpecies - ld e, a - ld d, $0 - add hl, de - ld a, [hl] - call ReadMonMenuIcon - ld [wCurIcon], a - call GetMemIconGFX - ld a, [hObjectStructIndexBuffer] -; y coord - add a - add a - add a - add a - add $1c - ld d, a -; x coord - ld e, $10 -; type is partymon icon - ld a, SPRITE_ANIM_INDEX_PARTY_MON - call InitSpriteAnimStruct - pop af - ld hl, SPRITEANIMSTRUCT_TILE_ID - add hl, bc - ld [hl], a - ret - -SetPartyMonIconAnimSpeed: ; 8e936 (23:6936) - push bc - ld a, [hObjectStructIndexBuffer] - ld b, a - call .getspeed - ld a, b - pop bc - ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET - add hl, bc - ld [hl], a - rlca - rlca - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], a - ret - -.getspeed ; 8e94c (23:694c) - farcall PlacePartymonHPBar - call GetHPPal - ld e, d - ld d, 0 - ld hl, .speeds - add hl, de - ld b, [hl] - ret -; 8e95e (23:695e) - -.speeds ; 8e95e - db $00 ; HP_GREEN - db $40 ; HP_YELLOW - db $80 ; HP_RED -; 8e961 - -NamingScreen_InitAnimatedMonIcon: ; 8e961 (23:6961) - ld a, [wd265] - call ReadMonMenuIcon - ld [wCurIcon], a - xor a - call GetIconGFX - depixel 4, 4, 4, 0 - ld a, SPRITE_ANIM_INDEX_PARTY_MON - call InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld [hl], SPRITE_ANIM_SEQ_NULL - ret - -MoveList_InitAnimatedMonIcon: ; 8e97d (23:697d) - ld a, [wd265] - call ReadMonMenuIcon - ld [wCurIcon], a - xor a - call GetIconGFX - ld d, 3 * 8 + 2 ; depixel 3, 4, 2, 4 - ld e, 4 * 8 + 4 - ld a, SPRITE_ANIM_INDEX_PARTY_MON - call InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld [hl], SPRITE_ANIM_SEQ_NULL - ret - -Trade_LoadMonIconGFX: ; 8e99a (23:699a) - ld a, [wd265] - call ReadMonMenuIcon - ld [wCurIcon], a - ld a, $62 - ld [wCurIconTile], a - call GetMemIconGFX - ret - -GetSpeciesIcon: ; 8e9ac -; Load species icon into VRAM at tile a - push de - ld a, [wd265] - call ReadMonMenuIcon - ld [wCurIcon], a - pop de - ld a, e - call GetIconGFX - ret -; 8e9bc - - -FlyFunction_GetMonIcon: ; 8e9bc (23:69bc) - push de - ld a, [wd265] - call ReadMonMenuIcon - ld [wCurIcon], a - pop de - ld a, e - call GetIcon_a - ret -; 8e9cc (23:69cc) - -Unreferenced_GetMonIcon2: ; 8e9cc - push de - ld a, [wd265] - call ReadMonMenuIcon - ld [wCurIcon], a - pop de - call GetIcon_de - ret -; 8e9db - -GetMemIconGFX: ; 8e9db (23:69db) - ld a, [wCurIconTile] -GetIconGFX: ; 8e9de - call GetIcon_a - ld de, 8 tiles - add hl, de - ld de, HeldItemIcons - lb bc, BANK(HeldItemIcons), 2 - call GetGFXUnlessMobile - ld a, [wCurIconTile] - add 10 - ld [wCurIconTile], a - ret - -HeldItemIcons: -INCBIN "gfx/icons/mail.2bpp" -INCBIN "gfx/icons/item.2bpp" -; 8ea17 - -GetIcon_de: ; 8ea17 -; Load icon graphics into VRAM starting from tile de. - ld l, e - ld h, d - jr GetIcon - -GetIcon_a: ; 8ea1b -; Load icon graphics into VRAM starting from tile a. - ld l, a - ld h, 0 - -GetIcon: ; 8ea1e -; Load icon graphics into VRAM starting from tile hl. - -; One tile is 16 bytes long. -rept 4 - add hl, hl -endr - - ld de, vTiles0 - add hl, de - push hl - -; The icons are contiguous, in order and of the same -; size, so the pointer table is somewhat redundant. - ld a, [wCurIcon] - push hl - ld l, a - ld h, 0 - add hl, hl - ld de, IconPointers - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - pop hl - - lb bc, BANK(Icons), 8 - call GetGFXUnlessMobile - - pop hl - ret -; 8ea3f - -GetGFXUnlessMobile: ; 8ea3f - ld a, [wLinkMode] - cp LINK_MOBILE - jp nz, Request2bpp - jp Get2bpp_2 -; 8ea4a - -FreezeMonIcons: ; 8ea4a - ld hl, wSpriteAnimationStructs - ld e, PARTY_LENGTH - ld a, [wMenuCursorY] - ld d, a -.loop - ld a, [hl] - and a - jr z, .next - cp d - jr z, .loadwithtwo - ld a, SPRITE_ANIM_SEQ_NULL - jr .ok - -.loadwithtwo - ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH - -.ok - push hl - ld c, l - ld b, h - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld [hl], a - pop hl - -.next - ld bc, $10 - add hl, bc - dec e - jr nz, .loop - ret -; 8ea71 - -UnfreezeMonIcons: ; 8ea71 - ld hl, wSpriteAnimationStructs - ld e, PARTY_LENGTH -.loop - ld a, [hl] - and a - jr z, .next - push hl - ld c, l - ld b, h - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld [hl], SPRITE_ANIM_SEQ_PARTY_MON - pop hl -.next - ld bc, $10 - add hl, bc - dec e - jr nz, .loop - ret -; 8ea8c (23:6a8c) - -HoldSwitchmonIcon: ; 8ea8c - ld hl, wSpriteAnimationStructs - ld e, PARTY_LENGTH - ld a, [wSwitchMon] - ld d, a -.loop - ld a, [hl] - and a - jr z, .next - cp d - jr z, .is_switchmon - ld a, SPRITE_ANIM_SEQ_PARTY_MON_SELECTED - jr .join_back - -.is_switchmon - ld a, SPRITE_ANIM_SEQ_PARTY_MON_SWITCH -.join_back - push hl - ld c, l - ld b, h - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld [hl], a - pop hl -.next - ld bc, $10 - add hl, bc - dec e - jr nz, .loop - ret - -ReadMonMenuIcon: ; 8eab3 - cp EGG - jr z, .egg - dec a - ld hl, MonMenuIcons - ld e, a - ld d, 0 - add hl, de - ld a, [hl] - ret -.egg - ld a, ICON_EGG - ret -; 8eac4 - - -INCLUDE "data/pokemon/menu_icons.asm" - -INCLUDE "data/icon_pointers.asm" - -INCLUDE "gfx/icons.asm" diff --git a/engine/mon_menu.asm b/engine/mon_menu.asm deleted file mode 100755 index 088b1b1a3..000000000 --- a/engine/mon_menu.asm +++ /dev/null @@ -1,304 +0,0 @@ -INCLUDE "data/mon_menu.asm" - -MonSubmenu: ; 24d19 - xor a - ld [hBGMapMode], a - call GetMonSubmenuItems - farcall FreezeMonIcons - ld hl, .MenuHeader - call LoadMenuHeader - call .GetTopCoord - call PopulateMonMenu - - ld a, 1 - ld [hBGMapMode], a - call MonMenuLoop - ld [wMenuSelection], a - - call ExitMenu - ret -; 24d3f - -.MenuHeader: ; 24d3f - db MENU_BACKUP_TILES ; flags - menu_coords 6, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw 0 - db 1 ; default option -; 24d47 - -.GetTopCoord: ; 24d47 -; TopCoord = 1 + BottomCoord - 2 * (NumSubmenuItems + 1) - ld a, [wBuffer1] - inc a - add a - ld b, a - ld a, [wMenuBorderBottomCoord] - sub b - inc a - ld [wMenuBorderTopCoord], a - call MenuBox - ret -; 24d59 - -MonMenuLoop: ; 24d59 -.loop - ld a, MENU_UNUSED_3 | MENU_BACKUP_TILES_2 ; flags - ld [wMenuDataFlags], a - ld a, [wBuffer1] ; items - ld [wMenuDataItems], a - call InitVerticalMenuCursor - ld hl, w2DMenuFlags1 - set 6, [hl] - call StaticMenuJoypad - ld de, SFX_READ_TEXT_2 - call PlaySFX - ld a, [hJoyPressed] - bit A_BUTTON_F, a - jr nz, .select - bit B_BUTTON_F, a - jr nz, .cancel - jr .loop - -.cancel - ld a, MONMENUITEM_CANCEL - ret - -.select - ld a, [wMenuCursorY] - dec a - ld c, a - ld b, 0 - ld hl, wBuffer2 - add hl, bc - ld a, [hl] - ret -; 24d91 - -PopulateMonMenu: ; 24d91 - call MenuBoxCoord2Tile - ld bc, 2 * SCREEN_WIDTH + 2 - add hl, bc - ld de, wBuffer2 -.loop - ld a, [de] - inc de - cp -1 - ret z - push de - push hl - call GetMonMenuString - pop hl - call PlaceString - ld bc, 2 * SCREEN_WIDTH - add hl, bc - pop de - jr .loop -; 24db0 - -GetMonMenuString: ; 24db0 - ld hl, MonMenuOptions + 1 - ld de, 3 - call IsInArray - dec hl - ld a, [hli] - cp MONMENU_MENUOPTION - jr z, .NotMove - inc hl - ld a, [hl] - ld [wd265], a - call GetMoveName - ret - -.NotMove: - inc hl - ld a, [hl] - dec a - ld hl, MonMenuOptionStrings - call GetNthString - ld d, h - ld e, l - ret -; 24dd4 - -GetMonSubmenuItems: ; 24dd4 - call ResetMonSubmenu - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - ld a, [wLinkMode] - and a - jr nz, .skip_moves - ld a, MON_MOVES - call GetPartyParamLocation - ld d, h - ld e, l - ld c, NUM_MOVES -.loop - push bc - push de - ld a, [de] - and a - jr z, .next - push hl - call IsFieldMove - pop hl - jr nc, .next - call AddMonMenuItem - -.next - pop de - inc de - pop bc - dec c - jr nz, .loop - -.skip_moves - ld a, MONMENUITEM_STATS - call AddMonMenuItem - ld a, MONMENUITEM_SWITCH - call AddMonMenuItem - ld a, MONMENUITEM_MOVE - call AddMonMenuItem - ld a, [wLinkMode] - and a - jr nz, .skip2 - push hl - ld a, MON_ITEM - call GetPartyParamLocation - ld d, [hl] - farcall ItemIsMail - pop hl - ld a, MONMENUITEM_MAIL - jr c, .ok - ld a, MONMENUITEM_ITEM - -.ok - call AddMonMenuItem - -.skip2 - ld a, [wBuffer1] - cp NUM_MONMENU_ITEMS - jr z, .ok2 - ld a, MONMENUITEM_CANCEL - call AddMonMenuItem - -.ok2 - call TerminateMonSubmenu - ret - -.egg - ld a, MONMENUITEM_STATS - call AddMonMenuItem - ld a, MONMENUITEM_SWITCH - call AddMonMenuItem - ld a, MONMENUITEM_CANCEL - call AddMonMenuItem - call TerminateMonSubmenu - ret -; 24e52 - -IsFieldMove: ; 24e52 - ld b, a - ld hl, MonMenuOptions -.next - ld a, [hli] - cp -1 - jr z, .nope - cp MONMENU_MENUOPTION - jr z, .nope - ld d, [hl] - inc hl - ld a, [hli] - cp b - jr nz, .next - ld a, d - scf - -.nope - ret -; 24e68 - -ResetMonSubmenu: ; 24e68 - xor a - ld [wBuffer1], a - ld hl, wBuffer2 - ld bc, NUM_MONMENU_ITEMS + 1 - call ByteFill - ret -; 24e76 - -TerminateMonSubmenu: ; 24e76 - ld a, [wBuffer1] - ld e, a - ld d, 0 - ld hl, wBuffer2 - add hl, de - ld [hl], -1 - ret -; 24e83 - -AddMonMenuItem: ; 24e83 - push hl - push de - push af - ld a, [wBuffer1] - ld e, a - inc a - ld [wBuffer1], a - ld d, 0 - ld hl, wBuffer2 - add hl, de - pop af - ld [hl], a - pop de - pop hl - ret -; 24e99 - -BattleMonMenu: ; 24e99 - ld hl, MenuHeader_0x24ed4 - call CopyMenuHeader - xor a - ld [hBGMapMode], a - call MenuBox - call UpdateSprites - call PlaceVerticalMenuItems - call WaitBGMap - call CopyMenuData - ld a, [wMenuDataFlags] - bit 7, a - jr z, .set_carry - call InitVerticalMenuCursor - ld hl, w2DMenuFlags1 - set 6, [hl] - call StaticMenuJoypad - ld de, SFX_READ_TEXT_2 - call PlaySFX - ld a, [hJoyPressed] - bit B_BUTTON_F, a - jr z, .clear_carry - ret z - -.set_carry - scf - ret - -.clear_carry - and a - ret -; 24ed4 - -MenuHeader_0x24ed4: ; 24ed4 - db 0 ; flags - menu_coords 11, 11, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw MenuData_0x24edc - db 1 ; default option -; 24edc - -MenuData_0x24edc: ; 24edc - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 3 ; items - db "SWITCH@" - db "STATS@" - db "CANCEL@" -; 24ef2 diff --git a/engine/mon_stats.asm b/engine/mon_stats.asm deleted file mode 100644 index 2b5586c51..000000000 --- a/engine/mon_stats.asm +++ /dev/null @@ -1,485 +0,0 @@ -DrawPlayerHP: ; 50b0a - ld a, $1 - jr DrawHP - -DrawEnemyHP: ; 50b0e - ld a, $2 - -DrawHP: ; 50b10 - ld [wWhichHPBar], a - push hl - push bc - ; box mons have full HP - ld a, [wMonType] - cp BOXMON - jr z, .at_least_1_hp - - ld a, [wTempMonHP] - ld b, a - ld a, [wTempMonHP + 1] - ld c, a - -; Any HP? - or b - jr nz, .at_least_1_hp - - xor a - ld c, a - ld e, a - ld a, 6 - ld d, a - jp .fainted - -.at_least_1_hp - ld a, [wTempMonMaxHP] - ld d, a - ld a, [wTempMonMaxHP + 1] - ld e, a - ld a, [wMonType] - cp BOXMON - jr nz, .not_boxmon - - ld b, d - ld c, e - -.not_boxmon - predef ComputeHPBarPixels - ld a, 6 - ld d, a - ld c, a - -.fainted - ld a, c - pop bc - ld c, a - pop hl - push de - push hl - push hl - call DrawBattleHPBar - pop hl - -; Print HP - bccoord 1, 1, 0 - add hl, bc - ld de, wTempMonHP - ld a, [wMonType] - cp BOXMON - jr nz, .not_boxmon_2 - ld de, wTempMonMaxHP -.not_boxmon_2 - lb bc, 2, 3 - call PrintNum - - ld a, "/" - ld [hli], a - -; Print max HP - ld de, wTempMonMaxHP - lb bc, 2, 3 - call PrintNum - pop hl - pop de - ret - -PrintTempMonStats: ; 50b7b -; Print wTempMon's stats at hl, with spacing bc. - push bc - push hl - ld de, .StatNames - call PlaceString - pop hl - pop bc - add hl, bc - ld bc, SCREEN_WIDTH - add hl, bc - ld de, wTempMonAttack - lb bc, 2, 3 - call .PrintStat - ld de, wTempMonDefense - call .PrintStat - ld de, wTempMonSpclAtk - call .PrintStat - ld de, wTempMonSpclDef - call .PrintStat - ld de, wTempMonSpeed - jp PrintNum - -.PrintStat: ; 50bab - push hl - call PrintNum - pop hl - ld de, SCREEN_WIDTH * 2 - add hl, de - ret - -.StatNames: ; 50bb5 - db "ATTACK" - next "DEFENSE" - next "SPCL.ATK" - next "SPCL.DEF" - next "SPEED" - next "@" - -GetGender: ; 50bdd -; Return the gender of a given monster (wCurPartyMon/wCurOTMon/wCurWildMon). -; When calling this function, a should be set to an appropriate wMonType value. - -; return values: -; a = 1: f = nc|nz; male -; a = 0: f = nc|z; female -; f = c: genderless - -; This is determined by comparing the Attack and Speed DVs -; with the species' gender ratio. - -; Figure out what type of monster struct we're looking at. - -; 0: PartyMon - ld hl, wPartyMon1DVs - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wMonType] - and a - jr z, .PartyMon - -; 1: OTPartyMon - ld hl, wOTPartyMon1DVs - dec a - jr z, .PartyMon - -; 2: sBoxMon - ld hl, sBoxMon1DVs - ld bc, BOXMON_STRUCT_LENGTH - dec a - jr z, .sBoxMon - -; 3: Unknown - ld hl, wTempMonDVs - dec a - jr z, .DVs - -; else: WildMon - ld hl, wEnemyMonDVs - jr .DVs - -; Get our place in the party/box. - -.PartyMon: -.sBoxMon - ld a, [wCurPartyMon] - call AddNTimes - -.DVs: - -; sBoxMon data is read directly from SRAM. - ld a, [wMonType] - cp BOXMON - ld a, BANK(sBox) - call z, GetSRAMBank - -; Attack DV - ld a, [hli] - and $f0 - ld b, a -; Speed DV - ld a, [hl] - and $f0 - swap a - -; Put our DVs together. - or b - ld b, a - -; Close SRAM if we were dealing with a sBoxMon. - ld a, [wMonType] - cp BOXMON - call z, CloseSRAM - -; We need the gender ratio to do anything with this. - push bc - ld a, [wCurPartySpecies] - dec a - ld hl, BaseData + BASE_GENDER - ld bc, BASE_DATA_SIZE - call AddNTimes - pop bc - - ld a, BANK(BaseData) - call GetFarByte - -; The higher the ratio, the more likely the monster is to be female. - - cp GENDERLESS - jr z, .Genderless - - and a ; GENDER_F0? - jr z, .Male - - cp GENDER_F100 - jr z, .Female - -; Values below the ratio are male, and vice versa. - cp b - jr c, .Male - -.Female: - xor a - ret - -.Male: - ld a, 1 - and a - ret - -.Genderless: - scf - ret - -ListMovePP: ; 50c50 - ld a, [wNumMoves] - inc a - ld c, a - ld a, NUM_MOVES - sub c - ld b, a - push hl - ld a, [wBuffer1] - ld e, a - ld d, $0 - ld a, $3e ; P - call .load_loop - ld a, b - and a - jr z, .skip - ld c, a - ld a, "-" - call .load_loop - -.skip - pop hl - inc hl - inc hl - inc hl - ld d, h - ld e, l - ld hl, wTempMonMoves - ld b, 0 -.loop - ld a, [hli] - and a - jr z, .done - push bc - push hl - push de - ld hl, wMenuCursorY - ld a, [hl] - push af - ld [hl], b - push hl - callfar GetMaxPPOfMove - pop hl - pop af - ld [hl], a - pop de - pop hl - push hl - ld bc, wTempMonPP - (wTempMonMoves + 1) - add hl, bc - ld a, [hl] - and $3f - ld [wStringBuffer1 + 4], a - ld h, d - ld l, e - push hl - ld de, wStringBuffer1 + 4 - lb bc, 1, 2 - call PrintNum - ld a, "/" - ld [hli], a - ld de, wd265 - lb bc, 1, 2 - call PrintNum - pop hl - ld a, [wBuffer1] - ld e, a - ld d, 0 - add hl, de - ld d, h - ld e, l - pop hl - pop bc - inc b - ld a, b - cp NUM_MOVES - jr nz, .loop - -.done - ret - -.load_loop ; 50cc9 - ld [hli], a - ld [hld], a - add hl, de - dec c - jr nz, .load_loop - ret - -Unreferenced_Function50cd0: ; 50cd0 -.loop - ld [hl], $32 - inc hl - ld [hl], $3e - dec hl - add hl, de - dec c - jr nz, .loop - ret - -Unused_PlaceEnemyHPLevel: - push hl - push hl - ld hl, wPartyMonNicknames - ld a, [wCurPartyMon] - call GetNick - pop hl - call PlaceString - call CopyMonToTempMon - pop hl - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - push hl - ld bc, -12 - add hl, bc - ld b, $0 - call DrawEnemyHP - pop hl - ld bc, 5 - add hl, bc - push de - call PrintLevel - pop de - -.egg - ret - -PlaceStatusString: ; 50d0a - push de - inc de - inc de - ld a, [de] - ld b, a - inc de - ld a, [de] - or b - pop de - jr nz, PlaceNonFaintStatus - push de - ld de, FntString - call CopyStatusString - pop de - ld a, $1 - and a - ret - -FntString: ; 50d22 - db "FNT@" - -CopyStatusString: ; 50d25 - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - ld [hl], a - ret - -PlaceNonFaintStatus: ; 50d2e - push de - ld a, [de] - ld de, PsnString - bit PSN, a - jr nz, .place - ld de, BrnString - bit BRN, a - jr nz, .place - ld de, FrzString - bit FRZ, a - jr nz, .place - ld de, ParString - bit PAR, a - jr nz, .place - ld de, SlpString - and SLP - jr z, .no_status - -.place - call CopyStatusString - ld a, $1 - and a - -.no_status - pop de - ret - -SlpString: db "SLP@" -PsnString: db "PSN@" -BrnString: db "BRN@" -FrzString: db "FRZ@" -ParString: db "PAR@" - -ListMoves: ; 50d6f -; List moves at hl, spaced every [wBuffer1] tiles. - ld de, wListMoves_MoveIndicesBuffer - ld b, $0 -.moves_loop - ld a, [de] - inc de - and a - jr z, .no_more_moves - push de - push hl - push hl - ld [wCurSpecies], a - ld a, MOVE_NAME - ld [wNamedObjectTypeBuffer], a - call GetName - ld de, wStringBuffer1 - pop hl - push bc - call PlaceString - pop bc - ld a, b - ld [wNumMoves], a - inc b - pop hl - push bc - ld a, [wBuffer1] - ld c, a - ld b, 0 - add hl, bc - pop bc - pop de - ld a, b - cp NUM_MOVES - jr z, .done - jr .moves_loop - -.no_more_moves - ld a, b -.nonmove_loop - push af - ld [hl], "-" - ld a, [wBuffer1] - ld c, a - ld b, 0 - add hl, bc - pop af - inc a - cp NUM_MOVES - jr nz, .nonmove_loop - -.done - ret diff --git a/engine/move_mon.asm b/engine/move_mon.asm deleted file mode 100755 index 8ccf319f0..000000000 --- a/engine/move_mon.asm +++ /dev/null @@ -1,1845 +0,0 @@ -TryAddMonToParty: ; d88c -; Check if to copy wild mon or generate a new one - ; Whose is it? - ld de, wPartyCount - ld a, [wMonType] - and $f - jr z, .getpartylocation ; PARTYMON - ld de, wOTPartyCount - -.getpartylocation - ; Do we have room for it? - ld a, [de] - inc a - cp PARTY_LENGTH + 1 - ret nc - ; Increase the party count - ld [de], a - ld a, [de] ; Why are we doing this? - ld [hMoveMon], a ; HRAM backup - add e - ld e, a - jr nc, .loadspecies - inc d - -.loadspecies - ; Load the species of the Pokemon into the party list. - ; The terminator is usually here, but it'll be back. - ld a, [wCurPartySpecies] - ld [de], a - ; Load the terminator into the next slot. - inc de - ld a, -1 - ld [de], a - ; Now let's load the OT name. - ld hl, wPartyMonOT - ld a, [wMonType] - and $f - jr z, .loadOTname - ld hl, wOTPartyMonOT - -.loadOTname - ld a, [hMoveMon] ; Restore index from backup - dec a - call SkipNames - ld d, h - ld e, l - ld hl, wPlayerName - ld bc, NAME_LENGTH - call CopyBytes - ; Only initialize the nickname for party mon - ld a, [wMonType] - and a - jr nz, .skipnickname - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - ld hl, wPartyMonNicknames - ld a, [hMoveMon] - dec a - call SkipNames - ld d, h - ld e, l - ld hl, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - -.skipnickname - ld hl, wPartyMon1Species - ld a, [wMonType] - and $f - jr z, .initializeStats - ld hl, wOTPartyMon1Species - -.initializeStats - ld a, [hMoveMon] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes -GeneratePartyMonStats: ; d906 -; wBattleMode specifies whether it's a wild mon or not. -; wMonType specifies whether it's an opposing mon or not. -; wCurPartySpecies/wCurPartyLevel specify the species and level. -; hl points to the wPartyMon struct to fill. - - ld e, l - ld d, h - push hl - - ; Initialize the species - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - call GetBaseData - ld a, [wBaseDexNo] - ld [de], a - inc de - - ; Copy the item if it's a wild mon - ld a, [wBattleMode] - and a - ld a, $0 - jr z, .skipitem - ld a, [wEnemyMonItem] -.skipitem - ld [de], a - inc de - - ; Copy the moves if it's a wild mon - push de - ld h, d - ld l, e - ld a, [wBattleMode] - and a - jr z, .randomlygeneratemoves - ld a, [wMonType] - and a - jr nz, .randomlygeneratemoves - ld de, wEnemyMonMoves - rept NUM_MOVES + -1 - ld a, [de] - inc de - ld [hli], a - endr - ld a, [de] - ld [hl], a - jr .next - -.randomlygeneratemoves - xor a - rept NUM_MOVES + -1 - ld [hli], a - endr - ld [hl], a - ld [wBuffer1], a - predef FillMoves - -.next - pop de -rept NUM_MOVES - inc de -endr - - ; Initialize ID. - ld a, [wPlayerID] - ld [de], a - inc de - ld a, [wPlayerID + 1] - ld [de], a - inc de - - ; Initialize Exp. - push de - ld a, [wCurPartyLevel] - ld d, a - callfar CalcExpAtLevel - pop de - ld a, [hProduct + 1] - ld [de], a - inc de - ld a, [hProduct + 2] - ld [de], a - inc de - ld a, [hProduct + 3] - ld [de], a - inc de - - ; Initialize stat experience. - xor a - ld b, MON_DVS - MON_STAT_EXP -.loop - ld [de], a - inc de - dec b - jr nz, .loop - - pop hl - push hl - ld a, [wMonType] - and $f - jr z, .registerpokedex - - push hl - farcall GetTrainerDVs - pop hl - jr .initializeDVs - -.registerpokedex - ld a, [wCurPartySpecies] - ld [wd265], a - dec a - push de - call CheckCaughtMon - ld a, [wd265] - dec a - call SetSeenAndCaughtMon - pop de - - pop hl - push hl - ld a, [wBattleMode] - and a - jr nz, .copywildmonDVs - - call Random - ld b, a - call Random - ld c, a -.initializeDVs - ld a, b - ld [de], a - inc de - ld a, c - ld [de], a - inc de - - ; Initialize PP. - push hl - push de - inc hl - inc hl - call FillPP - pop de - pop hl -rept 4 - inc de -endr - - ; Initialize happiness. - ld a, BASE_HAPPINESS - ld [de], a - inc de - - xor a - ; PokerusStatus - ld [de], a - inc de - ; CaughtData/CaughtTime/CaughtLevel - ld [de], a - inc de - ; CaughtGender/CaughtLocation - ld [de], a - inc de - - ; Initialize level. - ld a, [wCurPartyLevel] - ld [de], a - inc de - - xor a - ; Status - ld [de], a - inc de - ; Unused - ld [de], a - inc de - - ; Initialize HP. - ld bc, MON_STAT_EXP - 1 - add hl, bc - ld a, 1 - ld c, a - ld b, FALSE - call CalcMonStatC - ld a, [hProduct + 2] - ld [de], a - inc de - ld a, [hProduct + 3] - ld [de], a - inc de - jr .initstats - -.copywildmonDVs - ld a, [wEnemyMonDVs] - ld [de], a - inc de - ld a, [wEnemyMonDVs + 1] - ld [de], a - inc de - - push hl - ld hl, wEnemyMonPP - ld b, NUM_MOVES -.wildmonpploop - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .wildmonpploop - pop hl - - ; Initialize happiness. - ld a, BASE_HAPPINESS - ld [de], a - inc de - - xor a - ; PokerusStatus - ld [de], a - inc de - ; CaughtData/CaughtTime/CaughtLevel - ld [de], a - inc de - ; CaughtGender/CaughtLocation - ld [de], a - inc de - - ; Initialize level. - ld a, [wCurPartyLevel] - ld [de], a - inc de - - ld hl, wEnemyMonStatus - ; Copy wEnemyMonStatus - ld a, [hli] - ld [de], a - inc de - ; Copy EnemyMonUnused - ld a, [hli] - ld [de], a - inc de - ; Copy wEnemyMonHP - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - inc de - -.initstats - ld a, [wBattleMode] - dec a - jr nz, .generatestats - ld hl, wEnemyMonMaxHP - ld bc, PARTYMON_STRUCT_LENGTH - MON_MAXHP - call CopyBytes - pop hl - jr .registerunowndex - -.generatestats - pop hl - ld bc, MON_STAT_EXP - 1 - add hl, bc - ld b, FALSE - call CalcMonStats - -.registerunowndex - ld a, [wMonType] - and $f - jr nz, .done - ld a, [wCurPartySpecies] - cp UNOWN - jr nz, .done - ld hl, wPartyMon1DVs - ld a, [wPartyCount] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - predef GetUnownLetter - callfar UpdateUnownDex - -.done - scf ; When this function returns, the carry flag indicates success vs failure. - ret -; da6d - -FillPP: ; da6d - push bc - ld b, NUM_MOVES -.loop - ld a, [hli] - and a - jr z, .next - dec a - push hl - push de - push bc - ld hl, Moves - ld bc, MOVE_LENGTH - call AddNTimes - ld de, wStringBuffer1 - ld a, BANK(Moves) - call FarCopyBytes - pop bc - pop de - pop hl - ld a, [wStringBuffer1 + MOVE_PP] - -.next - ld [de], a - inc de - dec b - jr nz, .loop - pop bc - ret -; da96 - -AddTempmonToParty: ; da96 - ld hl, wPartyCount - ld a, [hl] - cp PARTY_LENGTH - scf - ret z - - inc a - ld [hl], a - ld c, a - ld b, 0 - add hl, bc - ld a, [wCurPartySpecies] - ld [hli], a - ld [hl], $ff - - ld hl, wPartyMon1Species - ld a, [wPartyCount] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld e, l - ld d, h - ld hl, wTempMonSpecies - call CopyBytes - - ld hl, wPartyMonOT - ld a, [wPartyCount] - dec a - call SkipNames - ld d, h - ld e, l - ld hl, wOTPartyMonOT - ld a, [wCurPartyMon] - call SkipNames - ld bc, NAME_LENGTH - call CopyBytes - - ld hl, wPartyMonNicknames - ld a, [wPartyCount] - dec a - call SkipNames - ld d, h - ld e, l - ld hl, wOTPartyMonNicknames - ld a, [wCurPartyMon] - call SkipNames - ld bc, MON_NAME_LENGTH - call CopyBytes - - ld a, [wCurPartySpecies] - ld [wNamedObjectIndexBuffer], a - cp EGG - jr z, .egg - dec a - call SetSeenAndCaughtMon - ld hl, wPartyMon1Happiness - ld a, [wPartyCount] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld [hl], BASE_HAPPINESS -.egg - - ld a, [wCurPartySpecies] - cp UNOWN - jr nz, .done - ld hl, wPartyMon1DVs - ld a, [wPartyCount] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - predef GetUnownLetter - callfar UpdateUnownDex - ld a, [wFirstUnownSeen] - and a - jr nz, .done - ld a, [wUnownLetter] - ld [wFirstUnownSeen], a -.done - - and a - ret - -SendGetMonIntoFromBox: ; db3f -; Sents/Gets mon into/from Box depending on Parameter -; wPokemonWithdrawDepositParameter == 0: get mon into Party -; wPokemonWithdrawDepositParameter == 1: sent mon into Box -; wPokemonWithdrawDepositParameter == 2: get mon from DayCare -; wPokemonWithdrawDepositParameter == 3: put mon into DayCare - - ld a, BANK(sBoxCount) - call GetSRAMBank - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .check_IfPartyIsFull - cp DAY_CARE_WITHDRAW - jr z, .check_IfPartyIsFull - cp DAY_CARE_DEPOSIT - ld hl, wBreedMon1Species - jr z, .breedmon - - ; we want to sent a mon into the Box - ; so check if there's enough space - ld hl, sBoxCount - ld a, [hl] - cp MONS_PER_BOX - jr nz, .there_is_room - jp CloseSRAM_And_SetCarryFlag - -.check_IfPartyIsFull - ld hl, wPartyCount - ld a, [hl] - cp PARTY_LENGTH - jp z, CloseSRAM_And_SetCarryFlag - -.there_is_room - inc a - ld [hl], a - ld c, a - ld b, 0 - add hl, bc - ld a, [wPokemonWithdrawDepositParameter] - cp DAY_CARE_WITHDRAW - ld a, [wBreedMon1Species] - jr z, .okay1 - ld a, [wCurPartySpecies] - -.okay1 - ld [hli], a - ld [hl], $ff - ld a, [wPokemonWithdrawDepositParameter] - dec a - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wPartyCount] - jr nz, .okay2 - ld hl, sBoxMon1Species - ld bc, BOXMON_STRUCT_LENGTH - ld a, [sBoxCount] - -.okay2 - dec a ; wPartyCount - 1 - call AddNTimes - -.breedmon - push hl - ld e, l - ld d, h - ld a, [wPokemonWithdrawDepositParameter] - and a - ld hl, sBoxMon1Species - ld bc, BOXMON_STRUCT_LENGTH - jr z, .okay3 - cp DAY_CARE_WITHDRAW - ld hl, wBreedMon1Species - jr z, .okay4 - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - -.okay3 - ld a, [wCurPartyMon] - call AddNTimes - -.okay4 - ld bc, BOXMON_STRUCT_LENGTH - call CopyBytes - ld a, [wPokemonWithdrawDepositParameter] - cp DAY_CARE_DEPOSIT - ld de, wBreedMon1OT - jr z, .okay5 - dec a - ld hl, wPartyMonOT - ld a, [wPartyCount] - jr nz, .okay6 - ld hl, sBoxMonOT - ld a, [sBoxCount] - -.okay6 - dec a - call SkipNames - ld d, h - ld e, l - -.okay5 - ld hl, sBoxMonOT - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .okay7 - ld hl, wBreedMon1OT - cp DAY_CARE_WITHDRAW - jr z, .okay8 - ld hl, wPartyMonOT - -.okay7 - ld a, [wCurPartyMon] - call SkipNames - -.okay8 - ld bc, NAME_LENGTH - call CopyBytes - ld a, [wPokemonWithdrawDepositParameter] - cp DAY_CARE_DEPOSIT - ld de, wBreedMon1Nick - jr z, .okay9 - dec a - ld hl, wPartyMonNicknames - ld a, [wPartyCount] - jr nz, .okay10 - ld hl, sBoxMonNicknames - ld a, [sBoxCount] - -.okay10 - dec a - call SkipNames - ld d, h - ld e, l - -.okay9 - ld hl, sBoxMonNicknames - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .okay11 - ld hl, wBreedMon1Nick - cp DAY_CARE_WITHDRAW - jr z, .okay12 - ld hl, wPartyMonNicknames - -.okay11 - ld a, [wCurPartyMon] - call SkipNames - -.okay12 - ld bc, MON_NAME_LENGTH - call CopyBytes - pop hl - - ld a, [wPokemonWithdrawDepositParameter] - cp PC_DEPOSIT - jr z, .took_out_of_box - cp DAY_CARE_DEPOSIT - jp z, .CloseSRAM_And_ClearCarryFlag - - push hl - srl a - add $2 - ld [wMonType], a - predef CopyMonToTempMon - callfar CalcLevel - ld a, d - ld [wCurPartyLevel], a - pop hl - - ld b, h - ld c, l - ld hl, MON_LEVEL - add hl, bc - ld [hl], a - ld hl, MON_MAXHP - add hl, bc - ld d, h - ld e, l - ld hl, MON_STAT_EXP - 1 - add hl, bc - - push bc - ld b, TRUE - call CalcMonStats - pop bc - - ld a, [wPokemonWithdrawDepositParameter] - and a - jr nz, .CloseSRAM_And_ClearCarryFlag - ld hl, MON_STATUS - add hl, bc - xor a - ld [hl], a - ld hl, MON_HP - add hl, bc - ld d, h - ld e, l - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - inc hl - inc hl - ld a, [hli] - ld [de], a - ld a, [hl] - inc de - ld [de], a - jr .CloseSRAM_And_ClearCarryFlag - -.egg - xor a - ld [de], a - inc de - ld [de], a - jr .CloseSRAM_And_ClearCarryFlag - -.took_out_of_box - ld a, [sBoxCount] - dec a - ld b, a - call RestorePPofDepositedPokemon -.CloseSRAM_And_ClearCarryFlag: - call CloseSRAM - and a - ret -; dcb1 - -CloseSRAM_And_SetCarryFlag: ; dcb1 - call CloseSRAM - scf - ret -; dcb6 - -RestorePPofDepositedPokemon: ; dcb6 - ld a, b - ld hl, sBoxMons - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld b, h - ld c, l - ld hl, MON_PP - add hl, bc - push hl - push bc - ld de, wTempMonPP - ld bc, NUM_MOVES - call CopyBytes - pop bc - ld hl, MON_MOVES - add hl, bc - push hl - ld de, wTempMonMoves - ld bc, NUM_MOVES - call CopyBytes - pop hl - pop de - - ld a, [wMenuCursorY] - push af - ld a, [wMonType] - push af - ld b, 0 -.loop - ld a, [hli] - and a - jr z, .done - ld [wTempMonMoves], a - ld a, BOXMON - ld [wMonType], a - ld a, b - ld [wMenuCursorY], a - push bc - push hl - push de - farcall GetMaxPPOfMove - pop de - pop hl - ld a, [wd265] - ld b, a - ld a, [de] - and %11000000 - add b - ld [de], a - pop bc - inc de - inc b - ld a, b - cp NUM_MOVES - jr c, .loop - -.done - pop af - ld [wMonType], a - pop af - ld [wMenuCursorY], a - ret -; dd21 - -RetrieveMonFromDayCareMan: ; dd21 - ld a, [wBreedMon1Species] - ld [wCurPartySpecies], a - ld de, SFX_TRANSACTION - call PlaySFX - call WaitSFX - call GetBreedMon1LevelGrowth - ld a, b - ld [wd002], a - ld a, e - ld [wCurPartyLevel], a - xor a - ld [wPokemonWithdrawDepositParameter], a - jp RetrieveBreedmon -; dd42 - -RetrieveMonFromDayCareLady: ; dd42 - ld a, [wBreedMon2Species] - ld [wCurPartySpecies], a - ld de, SFX_TRANSACTION - call PlaySFX - call WaitSFX - call GetBreedMon2LevelGrowth - ld a, b - ld [wd002], a - ld a, e - ld [wCurPartyLevel], a - ld a, PC_DEPOSIT - ld [wPokemonWithdrawDepositParameter], a - jp RetrieveBreedmon -; dd64 - -RetrieveBreedmon: ; dd64 - ld hl, wPartyCount - ld a, [hl] - cp PARTY_LENGTH - jr nz, .room_in_party - scf - ret - -.room_in_party - inc a - ld [hl], a - ld c, a - ld b, 0 - add hl, bc - ld a, [wPokemonWithdrawDepositParameter] - and a - ld a, [wBreedMon1Species] - ld de, wBreedMon1Nick - jr z, .okay - ld a, [wBreedMon2Species] - ld de, wBreedMon2Nick - -.okay - ld [hli], a - ld [wCurSpecies], a - ld a, $ff - ld [hl], a - ld hl, wPartyMonNicknames - ld a, [wPartyCount] - dec a - call SkipNames - push hl - ld h, d - ld l, e - pop de - call CopyBytes - push hl - ld hl, wPartyMonOT - ld a, [wPartyCount] - dec a - call SkipNames - ld d, h - ld e, l - pop hl - call CopyBytes - push hl - call GetLastPartyMon - pop hl - ld bc, BOXMON_STRUCT_LENGTH - call CopyBytes - call GetBaseData - call GetLastPartyMon - ld b, d - ld c, e - ld hl, MON_LEVEL - add hl, bc - ld a, [wCurPartyLevel] - ld [hl], a - ld hl, MON_MAXHP - add hl, bc - ld d, h - ld e, l - ld hl, $a - add hl, bc - push bc - ld b, TRUE - call CalcMonStats - ld hl, wPartyMon1Moves - ld a, [wPartyCount] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - ld a, $1 - ld [wBuffer1], a - predef FillMoves - ld a, [wPartyCount] - dec a - ld [wCurPartyMon], a - farcall HealPartyMon - ld a, [wCurPartyLevel] - ld d, a - callfar CalcExpAtLevel - pop bc - ld hl, $8 - add hl, bc - ld a, [hMultiplicand] - ld [hli], a - ld a, [hMultiplicand + 1] - ld [hli], a - ld a, [hMultiplicand + 2] - ld [hl], a - and a - ret -; de1a - -GetLastPartyMon: ; de1a - ld a, [wPartyCount] - dec a - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - ret -; de2a - -DepositMonWithDayCareMan: ; de2a - ld de, wBreedMon1Nick - call DepositBreedmon - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - jp RemoveMonFromPartyOrBox -; de37 - -DepositMonWithDayCareLady: ; de37 - ld de, wBreedMon2Nick - call DepositBreedmon - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - jp RemoveMonFromPartyOrBox -; de44 - -DepositBreedmon: ; de44 - ld a, [wCurPartyMon] - ld hl, wPartyMonNicknames - call SkipNames - call CopyBytes - ld a, [wCurPartyMon] - ld hl, wPartyMonOT - call SkipNames - call CopyBytes - ld a, [wCurPartyMon] - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld bc, BOXMON_STRUCT_LENGTH - jp CopyBytes - -SendMonIntoBox: ; de6e -; Sends the mon into one of Bills Boxes -; the data comes mainly from 'wEnemyMon:' - ld a, BANK(sBoxCount) - call GetSRAMBank - ld de, sBoxCount - ld a, [de] - cp MONS_PER_BOX - jp nc, .full - inc a - ld [de], a - - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - ld c, a -.loop - inc de - ld a, [de] - ld b, a - ld a, c - ld c, b - ld [de], a - inc a - jr nz, .loop - - call GetBaseData - call ShiftBoxMon - - ld hl, wPlayerName - ld de, sBoxMonOT - ld bc, NAME_LENGTH - call CopyBytes - - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - - ld de, sBoxMonNicknames - ld hl, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - - ld hl, wEnemyMon - ld de, sBoxMon1 - ld bc, 1 + 1 + NUM_MOVES ; species + item + moves - call CopyBytes - - ld hl, wPlayerID - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - inc de - push de - ld a, [wCurPartyLevel] - ld d, a - callfar CalcExpAtLevel - pop de - ld a, [hProduct + 1] - ld [de], a - inc de - ld a, [hProduct + 2] - ld [de], a - inc de - ld a, [hProduct + 3] - ld [de], a - inc de - - ; Set all 5 Experience Values to 0 - xor a - ld b, 2 * 5 -.loop2 - ld [de], a - inc de - dec b - jr nz, .loop2 - - ld hl, wEnemyMonDVs - ld b, 2 + NUM_MOVES ; DVs and PP ; wEnemyMonHappiness - wEnemyMonDVs -.loop3 - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .loop3 - - ld a, BASE_HAPPINESS - ld [de], a - inc de - xor a - ld [de], a - inc de - ld [de], a - inc de - ld [de], a - inc de - ld a, [wCurPartyLevel] - ld [de], a - ld a, [wCurPartySpecies] - dec a - call SetSeenAndCaughtMon - ld a, [wCurPartySpecies] - cp UNOWN - jr nz, .not_unown - ld hl, sBoxMon1DVs - predef GetUnownLetter - callfar UpdateUnownDex - -.not_unown - ld hl, sBoxMon1Moves - ld de, wTempMonMoves - ld bc, NUM_MOVES - call CopyBytes - - ld hl, sBoxMon1PP - ld de, wTempMonPP - ld bc, NUM_MOVES - call CopyBytes - - ld b, 0 - call RestorePPofDepositedPokemon - - call CloseSRAM - scf - ret -; df42 - -.full ; df42 - call CloseSRAM - and a - ret -; df47 - -ShiftBoxMon: ; df47 - ld hl, sBoxMonOT - ld bc, NAME_LENGTH - call .shift - - ld hl, sBoxMonNicknames - ld bc, MON_NAME_LENGTH - call .shift - - ld hl, sBoxMons - ld bc, BOXMON_STRUCT_LENGTH - -.shift - ld a, [sBoxCount] - cp 2 - ret c - - push hl - call AddNTimes - dec hl - ld e, l - ld d, h - pop hl - - ld a, [sBoxCount] - dec a - call AddNTimes - dec hl - - push hl - ld a, [sBoxCount] - dec a - ld hl, 0 - call AddNTimes - ld c, l - ld b, h - pop hl -.loop - ld a, [hld] - ld [de], a - dec de - dec bc - ld a, c - or b - jr nz, .loop - ret -; df8c - -GiveEgg:: ; df8c - ld a, [wCurPartySpecies] - push af - callfar GetPreEvolution - callfar GetPreEvolution - ld a, [wCurPartySpecies] - dec a - -; TryAddMonToParty sets Seen and Caught flags -; when it is successful. This routine will make -; sure that we aren't newly setting flags. - push af - call CheckCaughtMon - pop af - push bc - call CheckSeenMon - push bc - - call TryAddMonToParty - -; If we haven't caught this Pokemon before receiving -; the Egg, reset the flag that was just set by -; TryAddMonToParty. - pop bc - ld a, c - and a - jr nz, .skip_caught_flag - ld a, [wCurPartySpecies] - dec a - ld c, a - ld d, $0 - ld hl, wPokedexCaught - ld b, RESET_FLAG - predef SmallFarFlagAction - -.skip_caught_flag -; If we haven't seen this Pokemon before receiving -; the Egg, reset the flag that was just set by -; TryAddMonToParty. - pop bc - ld a, c - and a - jr nz, .skip_seen_flag - ld a, [wCurPartySpecies] - dec a - ld c, a - ld d, $0 - ld hl, wPokedexSeen - ld b, RESET_FLAG - predef SmallFarFlagAction - -.skip_seen_flag - pop af - ld [wCurPartySpecies], a - ld a, [wPartyCount] - dec a - ld bc, PARTYMON_STRUCT_LENGTH - ld hl, wPartyMon1Species - call AddNTimes - ld a, [wCurPartySpecies] - ld [hl], a - ld hl, wPartyCount - ld a, [hl] - ld b, 0 - ld c, a - add hl, bc - ld a, EGG - ld [hl], a - ld a, [wPartyCount] - dec a - ld hl, wPartyMonNicknames - call SkipNames - ld de, String_Egg - call CopyName2 - ld a, [wPartyCount] - dec a - ld hl, wPartyMon1Happiness - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld a, [wMonStatusFlags] - bit 1, a - ld a, 1 - jr nz, .got_init_happiness - ld a, [wBaseEggSteps] - -.got_init_happiness - ld [hl], a - ld a, [wPartyCount] - dec a - ld hl, wPartyMon1HP - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - xor a - ld [hli], a - ld [hl], a - and a - ret -; e035 - -String_Egg: ; e035 - db "EGG@" -; e039 - -RemoveMonFromPartyOrBox: ; e039 - ld hl, wPartyCount - - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .okay - - ld a, BANK(sBoxCount) - call GetSRAMBank - ld hl, sBoxCount - -.okay - ld a, [hl] - dec a - ld [hli], a - ld a, [wCurPartyMon] - ld c, a - ld b, 0 - add hl, bc - ld e, l - ld d, h - inc de -.loop - ld a, [de] - inc de - ld [hli], a - inc a - jr nz, .loop - ld hl, wPartyMonOT - ld d, PARTY_LENGTH - 1 - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .party - ld hl, sBoxMonOT - ld d, MONS_PER_BOX - 1 - -.party - ; If this is the last mon in our party (box), - ; shift all the other mons up to close the gap. - ld a, [wCurPartyMon] - call SkipNames - ld a, [wCurPartyMon] - cp d - jr nz, .delete_inside - ld [hl], -1 - jp .finish - -.delete_inside - ; Shift the OT names - ld d, h - ld e, l - ld bc, MON_NAME_LENGTH - add hl, bc - ld bc, wPartyMonNicknames - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .party2 - ld bc, sBoxMonNicknames -.party2 - call CopyDataUntil - ; Shift the struct - ld hl, wPartyMons - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .party4 - ld hl, sBoxMons - ld bc, BOXMON_STRUCT_LENGTH -.party4 - ld a, [wCurPartyMon] - call AddNTimes - ld d, h - ld e, l - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .party5 - ld bc, BOXMON_STRUCT_LENGTH - add hl, bc - ld bc, sBoxMonOT - jr .copy - -.party5 - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - ld bc, wPartyMonOT -.copy - call CopyDataUntil - ; Shift the nicknames - ld hl, wPartyMonNicknames - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .party6 - ld hl, sBoxMonNicknames -.party6 - ld bc, MON_NAME_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld d, h - ld e, l - ld bc, MON_NAME_LENGTH - add hl, bc - ld bc, wPartyMonNicknamesEnd - ld a, [wPokemonWithdrawDepositParameter] - and a - jr z, .party7 - ld bc, sBoxMonNicknamesEnd -.party7 - call CopyDataUntil - ; Mail time! -.finish - ld a, [wPokemonWithdrawDepositParameter] - and a - jp nz, CloseSRAM - ld a, [wLinkMode] - and a - ret nz - ; Shift mail - ld a, BANK(sPartyMail) - call GetSRAMBank - ; If this is the last mon in our party, no need to shift mail. - ld hl, wPartyCount - ld a, [wCurPartyMon] - cp [hl] - jr z, .close_sram - ; Shift our mail messages up. - ld hl, sPartyMail - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - push hl - add hl, bc - pop de - ld a, [wCurPartyMon] - ld b, a -.loop2 - push bc - push hl - ld bc, MAIL_STRUCT_LENGTH - call CopyBytes - pop hl - push hl - ld bc, MAIL_STRUCT_LENGTH - add hl, bc - pop de - pop bc - inc b - ld a, [wPartyCount] - cp b - jr nz, .loop2 -.close_sram - jp CloseSRAM -; e134 - - -ComputeNPCTrademonStats: ; e134 - ld a, MON_LEVEL - call GetPartyParamLocation - ld a, [hl] - ld [MON_LEVEL], a ; wow - ld a, MON_SPECIES - call GetPartyParamLocation - ld a, [hl] - ld [wCurSpecies], a - call GetBaseData - ld a, MON_MAXHP - call GetPartyParamLocation - ld d, h - ld e, l - push de - ld a, MON_STAT_EXP - 1 - call GetPartyParamLocation - ld b, TRUE - call CalcMonStats - pop de - ld a, MON_HP - call GetPartyParamLocation - ld a, [de] - inc de - ld [hli], a - ld a, [de] - ld [hl], a - ret -; e167 - -CalcMonStats: ; e167 -; Calculates all 6 Stats of a mon -; b: Take into account stat EXP if TRUE -; 'c' counts from 1-6 and points with 'wBaseStats' to the base value -; hl is the path to the Stat EXP -; de points to where the final stats will be saved - - ld c, $0 -.loop - inc c - call CalcMonStatC - ld a, [hMultiplicand + 1] - ld [de], a - inc de - ld a, [hMultiplicand + 2] - ld [de], a - inc de - ld a, c - cp STAT_SDEF - jr nz, .loop - ret -; e17b - -CalcMonStatC: ; e17b -; 'c' is 1-6 and points to the BaseStat -; 1: HP -; 2: Attack -; 3: Defense -; 4: Speed -; 5: SpAtk -; 6: SpDef - push hl - push de - push bc - ld a, b - ld d, a - push hl - ld hl, wBaseStats - dec hl ; has to be decreased, because 'c' begins with 1 - ld b, $0 - add hl, bc - ld a, [hl] - ld e, a - pop hl - push hl - ld a, c - cp STAT_SDEF - jr nz, .not_spdef - dec hl - dec hl - -.not_spdef - sla c - ld a, d - and a - jr z, .no_stat_exp - add hl, bc - push de - ld a, [hld] - ld e, a - ld d, [hl] - farcall GetSquareRoot - pop de - -.no_stat_exp - srl c - pop hl - push bc - ld bc, MON_DVS - MON_HP_EXP + 1 - add hl, bc - pop bc - ld a, c - cp STAT_ATK - jr z, .Attack - cp STAT_DEF - jr z, .Defense - cp STAT_SPD - jr z, .Speed - cp STAT_SATK - jr z, .Special - cp STAT_SDEF - jr z, .Special -; DV_HP = (DV_ATK & 1) << 3 + (DV_DEF & 1) << 2 + (DV_SPD & 1) << 1 + (DV_SPC & 1) - push bc - ld a, [hl] - swap a - and $1 - add a - add a - add a - ld b, a - ld a, [hli] - and $1 - add a - add a - add b - ld b, a - ld a, [hl] - swap a - and $1 - add a - add b - ld b, a - ld a, [hl] - and $1 - add b - pop bc - jr .GotDV - -.Attack: - ld a, [hl] - swap a - and $f - jr .GotDV - -.Defense: - ld a, [hl] - and $f - jr .GotDV - -.Speed: - inc hl - ld a, [hl] - swap a - and $f - jr .GotDV - -.Special: - inc hl - ld a, [hl] - and $f - -.GotDV: - ld d, 0 - add e - ld e, a - jr nc, .no_overflow_1 - inc d - -.no_overflow_1 - sla e - rl d - srl b - srl b - ld a, b - add e - jr nc, .no_overflow_2 - inc d - -.no_overflow_2 - ld [hMultiplicand + 2], a - ld a, d - ld [hMultiplicand + 1], a - xor a - ld [hMultiplicand + 0], a - ld a, [wCurPartyLevel] - ld [hMultiplier], a - call Multiply - ld a, [hProduct + 1] - ld [hDividend + 0], a - ld a, [hProduct + 2] - ld [hDividend + 1], a - ld a, [hProduct + 3] - ld [hDividend + 2], a - ld a, 100 - ld [hDivisor], a - ld a, 3 - ld b, a - call Divide - ld a, c - cp STAT_HP - ld a, STAT_MIN_NORMAL - jr nz, .not_hp - ld a, [wCurPartyLevel] - ld b, a - ld a, [hQuotient + 2] - add b - ld [hMultiplicand + 2], a - jr nc, .no_overflow_3 - ld a, [hQuotient + 1] - inc a - ld [hMultiplicand + 1], a - -.no_overflow_3 - ld a, STAT_MIN_HP - -.not_hp - ld b, a - ld a, [hQuotient + 2] - add b - ld [hMultiplicand + 2], a - jr nc, .no_overflow_4 - ld a, [hQuotient + 1] - inc a - ld [hMultiplicand + 1], a - -.no_overflow_4 - ld a, [hQuotient + 1] - cp HIGH(MAX_STAT_VALUE + 1) + 1 - jr nc, .max_stat - cp HIGH(MAX_STAT_VALUE + 1) - jr c, .stat_value_okay - ld a, [hQuotient + 2] - cp LOW(MAX_STAT_VALUE + 1) - jr c, .stat_value_okay - -.max_stat - ld a, HIGH(MAX_STAT_VALUE) - ld [hMultiplicand + 1], a - ld a, LOW(MAX_STAT_VALUE) - ld [hMultiplicand + 2], a - -.stat_value_okay - pop bc - pop de - pop hl - ret -; e277 - -GivePoke:: ; e277 - push de - push bc - xor a ; PARTYMON - ld [wMonType], a - call TryAddMonToParty - jr nc, .failed - ld hl, wPartyMonNicknames - ld a, [wPartyCount] - dec a - ld [wCurPartyMon], a - call SkipNames - ld d, h - ld e, l - pop bc - ld a, b - ld b, 0 - push bc - push de - push af - ld a, [wCurItem] - and a - jr z, .done - ld a, [wCurPartyMon] - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld a, [wCurItem] - ld [hl], a - jr .done - -.failed - ld a, [wCurPartySpecies] - ld [wTempEnemyMonSpecies], a - callfar LoadEnemyMon - call SendMonIntoBox - jp nc, .FailedToGiveMon - ld a, BOXMON - ld [wMonType], a - xor a - ld [wCurPartyMon], a - ld de, wMonOrItemNameBuffer - pop bc - ld a, b - ld b, 1 - push bc - push de - push af - ld a, [wCurItem] - and a - jr z, .done - ld a, [wCurItem] - ld [sBoxMon1Item], a - -.done - ld a, [wCurPartySpecies] - ld [wd265], a - ld [wTempEnemyMonSpecies], a - call GetPokemonName - ld hl, wStringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - pop af - and a - jp z, .wildmon - pop de - pop bc - pop hl - push bc - push hl - ld a, [wScriptBank] - call GetFarHalfword - ld bc, MON_NAME_LENGTH - ld a, [wScriptBank] - call FarCopyBytes - pop hl - inc hl - inc hl - ld a, [wScriptBank] - call GetFarHalfword - pop bc - ld a, b - and a - push de - push bc - jr nz, .send_to_box - - push hl - ld a, [wCurPartyMon] - ld hl, wPartyMonOT - call SkipNames - ld d, h - ld e, l - pop hl -.otnameloop - ld a, [wScriptBank] - call GetFarByte - ld [de], a - inc hl - inc de - cp "@" - jr nz, .otnameloop - ld a, [wScriptBank] - call GetFarByte - ld b, a - push bc - ld a, [wCurPartyMon] - ld hl, wPartyMon1ID - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld a, HIGH(01001) - ld [hli], a - ld [hl], LOW(01001) - pop bc - farcall SetGiftPartyMonCaughtData - jr .skip_nickname - -.send_to_box - ld a, BANK(sBoxMonOT) - call GetSRAMBank - ld de, sBoxMonOT -.loop - ld a, [wScriptBank] - call GetFarByte - ld [de], a - inc hl - inc de - cp "@" - jr nz, .loop - ld a, [wScriptBank] - call GetFarByte - ld b, a - ld hl, sBoxMon1ID - call Random - ld [hli], a - call Random - ld [hl], a - call CloseSRAM - farcall SetGiftBoxMonCaughtData - jr .skip_nickname - -.wildmon - pop de - pop bc - push bc - push de - ld a, b - and a - jr z, .party - farcall SetBoxMonCaughtData - jr .set_caught_data - -.party - farcall SetCaughtData -.set_caught_data - farcall GiveANickname_YesNo - pop de - jr c, .skip_nickname - call InitNickname - -.skip_nickname - pop bc - pop de - ld a, b - and a - ret z - ld hl, TextJump_WasSentToBillsPC - call PrintText - ld a, BANK(sBoxMonNicknames) - call GetSRAMBank - ld hl, wMonOrItemNameBuffer - ld de, sBoxMonNicknames - ld bc, MON_NAME_LENGTH - call CopyBytes - call CloseSRAM - ld b, $1 - ret -; e3d4 - -.FailedToGiveMon: ; e3d4 - pop bc - pop de - ld b, $2 - ret -; e3d9 - -TextJump_WasSentToBillsPC: ; 0xe3d9 - ; was sent to BILL's PC. - text_jump Text_WasSentToBillsPC - db "@" -; 0xe3de - -InitNickname: ; e3de - push de - call LoadStandardMenuHeader - call DisableSpriteUpdates - pop de - push de - ld b, $0 - farcall NamingScreen - pop hl - ld de, wStringBuffer1 - call InitName - ld a, $4 ; ExitAllMenus is in bank 0, XXX could this be in bank 4 in pokered? - ld hl, ExitAllMenus - rst FarCall - ret -; e3fd diff --git a/engine/move_mon_wo_mail.asm b/engine/move_mon_wo_mail.asm deleted file mode 100755 index 5d81da8a0..000000000 --- a/engine/move_mon_wo_mail.asm +++ /dev/null @@ -1,133 +0,0 @@ -InsertPokemonIntoBox: ; 51322 - ld a, BANK(sBoxCount) - call GetSRAMBank - ld hl, sBoxCount - call InsertSpeciesIntoBoxOrParty - ld a, [sBoxCount] - dec a - ld [wd265], a - ld hl, sBoxMonNicknames - ld bc, MON_NAME_LENGTH - ld de, wBufferMonNick - call InsertDataIntoBoxOrParty - ld a, [sBoxCount] - dec a - ld [wd265], a - ld hl, sBoxMonOT - ld bc, NAME_LENGTH - ld de, wBufferMonOT - call InsertDataIntoBoxOrParty - ld a, [sBoxCount] - dec a - ld [wd265], a - ld hl, sBoxMons - ld bc, BOXMON_STRUCT_LENGTH - ld de, wBufferMon - call InsertDataIntoBoxOrParty - ld hl, wBufferMonMoves - ld de, wTempMonMoves - ld bc, NUM_MOVES - call CopyBytes - ld hl, wBufferMonPP - ld de, wTempMonPP - ld bc, NUM_MOVES - call CopyBytes - ld a, [wCurPartyMon] - ld b, a - farcall RestorePPofDepositedPokemon - jp CloseSRAM - -InsertPokemonIntoParty: ; 5138b - ld hl, wPartyCount - call InsertSpeciesIntoBoxOrParty - ld a, [wPartyCount] - dec a - ld [wd265], a - ld hl, wPartyMonNicknames - ld bc, MON_NAME_LENGTH - ld de, wBufferMonNick - call InsertDataIntoBoxOrParty - ld a, [wPartyCount] - dec a - ld [wd265], a - ld hl, wPartyMonOT - ld bc, NAME_LENGTH - ld de, wBufferMonOT - call InsertDataIntoBoxOrParty - ld a, [wPartyCount] - dec a - ld [wd265], a - ld hl, wPartyMons - ld bc, PARTYMON_STRUCT_LENGTH - ld de, wBufferMon - call InsertDataIntoBoxOrParty - ret - -InsertSpeciesIntoBoxOrParty: ; 513cb - inc [hl] - inc hl - ld a, [wCurPartyMon] - ld c, a - ld b, 0 - add hl, bc - ld a, [wCurPartySpecies] - ld c, a -.loop - ld a, [hl] - ld [hl], c - inc hl - inc c - ld c, a - jr nz, .loop - ret - -InsertDataIntoBoxOrParty: ; 513e0 - push de - push hl - push bc - ld a, [wd265] - dec a - call AddNTimes - push hl - add hl, bc - ld d, h - ld e, l - pop hl -.loop - push bc - ld a, [wd265] - ld b, a - ld a, [wCurPartyMon] - cp b - pop bc - jr z, .insert - push hl - push de - push bc - call CopyBytes - pop bc - pop de - pop hl - push hl - ld a, l - sub c - ld l, a - ld a, h - sbc b - ld h, a - pop de - ld a, [wd265] - dec a - ld [wd265], a - jr .loop - -.insert - pop bc - pop hl - ld a, [wCurPartyMon] - call AddNTimes - ld d, h - ld e, l - pop hl - call CopyBytes - ret diff --git a/engine/movement.asm b/engine/movement.asm deleted file mode 100644 index 3dbb0b83a..000000000 --- a/engine/movement.asm +++ /dev/null @@ -1,864 +0,0 @@ -MovementPointers: ; 5075 -; entries correspond to macros/scripts/movement.asm enumeration - dw Movement_turn_head_down ; 00 - dw Movement_turn_head_up ; 01 - dw Movement_turn_head_left ; 02 - dw Movement_turn_head_right ; 03 - dw Movement_turn_step_down ; 04 - dw Movement_turn_step_up ; 05 - dw Movement_turn_step_left ; 06 - dw Movement_turn_step_right ; 07 - dw Movement_slow_step_down ; 08 - dw Movement_slow_step_up ; 09 - dw Movement_slow_step_left ; 0a - dw Movement_slow_step_right ; 0b - dw Movement_step_down ; 0c - dw Movement_step_up ; 0d - dw Movement_step_left ; 0e - dw Movement_step_right ; 0f - dw Movement_big_step_down ; 10 - dw Movement_big_step_up ; 11 - dw Movement_big_step_left ; 12 - dw Movement_big_step_right ; 13 - dw Movement_slow_slide_step_down ; 14 - dw Movement_slow_slide_step_up ; 15 - dw Movement_slow_slide_step_left ; 16 - dw Movement_slow_slide_step_right ; 17 - dw Movement_slide_step_down ; 18 - dw Movement_slide_step_up ; 19 - dw Movement_slide_step_left ; 1a - dw Movement_slide_step_right ; 1b - dw Movement_fast_slide_step_down ; 1c - dw Movement_fast_slide_step_up ; 1d - dw Movement_fast_slide_step_left ; 1e - dw Movement_fast_slide_step_right ; 1f - dw Movement_turn_away_down ; 20 - dw Movement_turn_away_up ; 21 - dw Movement_turn_away_left ; 22 - dw Movement_turn_away_right ; 23 - dw Movement_turn_in_down ; 24 - dw Movement_turn_in_up ; 25 - dw Movement_turn_in_left ; 26 - dw Movement_turn_in_right ; 27 - dw Movement_turn_waterfall_down ; 28 - dw Movement_turn_waterfall_up ; 29 - dw Movement_turn_waterfall_left ; 2a - dw Movement_turn_waterfall_right ; 2b - dw Movement_slow_jump_step_down ; 2c - dw Movement_slow_jump_step_up ; 2d - dw Movement_slow_jump_step_left ; 2e - dw Movement_slow_jump_step_right ; 2f - dw Movement_jump_step_down ; 30 - dw Movement_jump_step_up ; 31 - dw Movement_jump_step_left ; 32 - dw Movement_jump_step_right ; 33 - dw Movement_fast_jump_step_down ; 34 - dw Movement_fast_jump_step_up ; 35 - dw Movement_fast_jump_step_left ; 36 - dw Movement_fast_jump_step_right ; 37 - dw Movement_remove_sliding ; 38 - dw Movement_set_sliding ; 39 - dw Movement_remove_fixed_facing ; 3a - dw Movement_fix_facing ; 3b - dw Movement_show_object ; 3c - dw Movement_hide_object ; 3d - dw Movement_step_sleep_1 ; 3e - dw Movement_step_sleep_2 ; 3f - dw Movement_step_sleep_3 ; 40 - dw Movement_step_sleep_4 ; 41 - dw Movement_step_sleep_5 ; 42 - dw Movement_step_sleep_6 ; 43 - dw Movement_step_sleep_7 ; 44 - dw Movement_step_sleep_8 ; 45 - dw Movement_step_sleep ; 46 - dw Movement_step_end ; 47 - dw Movement_48 ; 48 - dw Movement_remove_object ; 49 - dw Movement_step_loop ; 4a - dw Movement_4b ; 4b - dw Movement_teleport_from ; 4c - dw Movement_teleport_to ; 4d - dw Movement_skyfall ; 4e - dw Movement_step_dig ; 4f - dw Movement_step_bump ; 50 - dw Movement_fish_got_bite ; 51 - dw Movement_fish_cast_rod ; 52 - dw Movement_hide_emote ; 53 - dw Movement_show_emote ; 54 - dw Movement_step_shake ; 55 - dw Movement_tree_shake ; 56 - dw Movement_rock_smash ; 57 - dw Movement_return_dig ; 58 - dw Movement_skyfall_top ; 59 -; 5129 - - -Movement_teleport_from: ; 5129 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_TELEPORT_FROM - ret -; 5130 - -Movement_teleport_to: ; 5130 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_TELEPORT_TO - ret -; 5137 - -Movement_skyfall: ; 5137 - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SKYFALL - ret -; 513e - -Movement_skyfall_top: ; 513e - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SKYFALL_TOP - ret -; 5145 - -Movement_step_dig: ; 5145 - call GetSpriteDirection - rlca - rlca - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], a - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_SPIN - call JumpMovementPointer - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_03 - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret -; 516a - -Movement_return_dig: ; 516a - call GetSpriteDirection - rlca - rlca - ld hl, OBJECT_STEP_FRAME - add hl, bc - ld [hl], a - call JumpMovementPointer - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_RETURN_DIG - ret -; 5189 - -Movement_fish_got_bite: ; 5189 - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_FISHING - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_GOT_BITE - ret -; 5196 - -Movement_rock_smash: ; 5196 - call JumpMovementPointer - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_ROCK_SMASH - ret -; 51ab - -Movement_fish_cast_rod: ; 51ab - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_FISHING - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 51b8 - -Movement_step_loop: ; 51b8 - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - ld [hl], $0 - jp ContinueReadingMovement -; 51c1 - -Movement_step_end: ; 51c1 - call RestoreDefaultMovement - ld hl, OBJECT_MOVEMENTTYPE - add hl, bc - ld [hl], a - - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - ld [hl], $0 - - ld hl, wVramState - res 7, [hl] - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_SLEEP - ret -; 51db - -Movement_48: ; 51db - call RestoreDefaultMovement - ld hl, OBJECT_MOVEMENTTYPE - add hl, bc - ld [hl], a - - ld hl, OBJECT_MOVEMENT_BYTE_INDEX - add hl, bc - ld [hl], $0 - - call JumpMovementPointer - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_03 - - ld hl, wVramState - res 7, [hl] - ret -; 51fd - -Movement_remove_object: ; 51fd - call DeleteMapObject - ld hl, wObjectFollow_Leader - ld a, [hMapObjectIndexBuffer] - cp [hl] - jr nz, .not_leading - ld [hl], -1 - -.not_leading - ld hl, wVramState - res 7, [hl] - ret -; 5210 - -Movement_4b: ; 5210 - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_04 - - ld hl, wVramState - res 7, [hl] - ret -; 5222 - -Movement_step_sleep_1: ; 5222 - ld a, 1 - jr Movement_step_sleep_common - -Movement_step_sleep_2: ; 5226 - ld a, 2 - jr Movement_step_sleep_common - -Movement_step_sleep_3: ; 522a - ld a, 3 - jr Movement_step_sleep_common - -Movement_step_sleep_4: ; 522e - ld a, 4 - jr Movement_step_sleep_common - -Movement_step_sleep_5: ; 5232 - ld a, 5 - jr Movement_step_sleep_common - -Movement_step_sleep_6: ; 5236 - ld a, 6 - jr Movement_step_sleep_common - -Movement_step_sleep_7: ; 523a - ld a, 7 - jr Movement_step_sleep_common - -Movement_step_sleep_8: ; 523e - ld a, 8 - jr Movement_step_sleep_common - -Movement_step_sleep: ; 5242 -; parameters: -; duration (DecimalParam) - - call JumpMovementPointer - jr Movement_step_sleep_common - -Movement_step_sleep_common: ; 5247 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_03 - - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret -; 525f - -Movement_step_bump: ; 525f - ld a, 1 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_BUMP - - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_BUMP - - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret -; 5279 - -Movement_tree_shake: ; 5279 - ld a, 24 - ld hl, OBJECT_STEP_DURATION - add hl, bc - ld [hl], a - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_03 - - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_WEIRD_TREE - - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret -; 5293 - -Movement_remove_sliding: ; 5293 - ld hl, OBJECT_FLAGS1 - add hl, bc - res SLIDING, [hl] - jp ContinueReadingMovement -; 529c - -Movement_set_sliding: ; 529c - ld hl, OBJECT_FLAGS1 - add hl, bc - set SLIDING, [hl] - jp ContinueReadingMovement -; 52a5 - -Movement_remove_fixed_facing: ; 52a5 - ld hl, OBJECT_FLAGS1 - add hl, bc - res FIXED_FACING, [hl] - jp ContinueReadingMovement -; 52ae - -Movement_fix_facing: ; 52ae - ld hl, OBJECT_FLAGS1 - add hl, bc - set FIXED_FACING, [hl] - jp ContinueReadingMovement -; 52b7 - -Movement_show_object: ; 52b7 - ld hl, OBJECT_FLAGS1 - add hl, bc - res INVISIBLE, [hl] - jp ContinueReadingMovement -; 52c0 - -Movement_hide_object: ; 52c0 - ld hl, OBJECT_FLAGS1 - add hl, bc - set INVISIBLE, [hl] - jp ContinueReadingMovement -; 52c9 - -Movement_hide_emote: ; 52c9 - call DespawnEmote - jp ContinueReadingMovement -; 52cf - -Movement_show_emote: ; 52cf - call SpawnEmote - jp ContinueReadingMovement -; 52d5 - -Movement_step_shake: ; 52d5 -; parameters: -; displacement (DecimalParam) - - call JumpMovementPointer - call ShakeScreen - jp ContinueReadingMovement -; 52de - -Movement_turn_head_down: ; 52de - ld a, OW_DOWN - jr TurnHead - -Movement_turn_head_up: ; 52e2 - ld a, OW_UP - jr TurnHead - -Movement_turn_head_left: ; 52e6 - ld a, OW_LEFT - jr TurnHead - -Movement_turn_head_right: ; 52ea - ld a, OW_RIGHT - jr TurnHead - -TurnHead: ; 52ee - ld hl, OBJECT_FACING - add hl, bc - ld [hl], a - - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld [hl], STANDING - ret -; 5300 - -Movement_slow_step_down: ; 5300 - ld a, STEP_SLOW << 2 | DOWN - jp NormalStep -; 5305 - -Movement_slow_step_up: ; 5305 - ld a, STEP_SLOW << 2 | UP - jp NormalStep -; 530a - -Movement_slow_step_left: ; 530a - ld a, STEP_SLOW << 2 | LEFT - jp NormalStep -; 530f - -Movement_slow_step_right: ; 530f - ld a, STEP_SLOW << 2 | RIGHT - jp NormalStep -; 5314 - -Movement_step_down: ; 5314 - ld a, STEP_WALK << 2 | DOWN - jp NormalStep -; 5319 - -Movement_step_up: ; 5319 - ld a, STEP_WALK << 2 | UP - jp NormalStep -; 531e - -Movement_step_left: ; 531e - ld a, STEP_WALK << 2 | LEFT - jp NormalStep -; 5323 - -Movement_step_right: ; 5323 - ld a, STEP_WALK << 2 | RIGHT - jp NormalStep -; 5328 - -Movement_big_step_down: ; 5328 - ld a, STEP_BIKE << 2 | DOWN - jp NormalStep -; 532d - -Movement_big_step_up: ; 532d - ld a, STEP_BIKE << 2 | UP - jp NormalStep -; 5332 - -Movement_big_step_left: ; 5332 - ld a, STEP_BIKE << 2 | LEFT - jp NormalStep -; 5337 - -Movement_big_step_right: ; 5337 - ld a, STEP_BIKE << 2 | RIGHT - jp NormalStep -; 533c - - -Movement_turn_away_down: ; 533c - ld a, STEP_SLOW << 2 | DOWN - jp TurningStep -; 5341 - -Movement_turn_away_up: ; 5341 - ld a, STEP_SLOW << 2 | UP - jp TurningStep -; 5346 - -Movement_turn_away_left: ; 5346 - ld a, STEP_SLOW << 2 | LEFT - jp TurningStep -; 534b - -Movement_turn_away_right: ; 534b - ld a, STEP_SLOW << 2 | RIGHT - jp TurningStep -; 5350 - -Movement_turn_in_down: ; 5350 - ld a, STEP_WALK << 2 | DOWN - jp TurningStep -; 5355 - -Movement_turn_in_up: ; 5355 - ld a, STEP_WALK << 2 | UP - jp TurningStep -; 535a - -Movement_turn_in_left: ; 535a - ld a, STEP_WALK << 2 | LEFT - jp TurningStep -; 535f - -Movement_turn_in_right: ; 535f - ld a, STEP_WALK << 2 | RIGHT - jp TurningStep -; 5364 - -Movement_turn_waterfall_down: ; 5364 - ld a, STEP_BIKE << 2 | DOWN - jp TurningStep -; 5369 - -Movement_turn_waterfall_up: ; 5369 - ld a, STEP_BIKE << 2 | UP - jp TurningStep -; 536e - -Movement_turn_waterfall_left: ; 536e - ld a, STEP_BIKE << 2 | LEFT - jp TurningStep -; 5373 - -Movement_turn_waterfall_right: ; 5373 - ld a, STEP_BIKE << 2 | RIGHT - jp TurningStep -; 5378 - - -Movement_slow_slide_step_down: ; 5378 - ld a, STEP_SLOW << 2 | DOWN - jp SlideStep -; 537d - -Movement_slow_slide_step_up: ; 537d - ld a, STEP_SLOW << 2 | UP - jp SlideStep -; 5382 - -Movement_slow_slide_step_left: ; 5382 - ld a, STEP_SLOW << 2 | LEFT - jp SlideStep -; 5387 - -Movement_slow_slide_step_right: ; 5387 - ld a, STEP_SLOW << 2 | RIGHT - jp SlideStep -; 538c - -Movement_slide_step_down: ; 538c - ld a, STEP_WALK << 2 | DOWN - jp SlideStep -; 5391 - -Movement_slide_step_up: ; 5391 - ld a, STEP_WALK << 2 | UP - jp SlideStep -; 5396 - -Movement_slide_step_left: ; 5396 - ld a, STEP_WALK << 2 | LEFT - jp SlideStep -; 539b - -Movement_slide_step_right: ; 539b - ld a, STEP_WALK << 2 | RIGHT - jp SlideStep -; 53a0 - -Movement_fast_slide_step_down: ; 53a0 - ld a, STEP_BIKE << 2 | DOWN - jp SlideStep -; 53a5 - -Movement_fast_slide_step_up: ; 53a5 - ld a, STEP_BIKE << 2 | UP - jp SlideStep -; 53aa - -Movement_fast_slide_step_left: ; 53aa - ld a, STEP_BIKE << 2 | LEFT - jp SlideStep -; 53af - -Movement_fast_slide_step_right: ; 53af - ld a, STEP_BIKE << 2 | RIGHT - jp SlideStep -; 53b4 - - -Movement_slow_jump_step_down: ; 53b4 - ld a, STEP_SLOW << 2 | DOWN - jp JumpStep -; 53b9 - -Movement_slow_jump_step_up: ; 53b9 - ld a, STEP_SLOW << 2 | UP - jp JumpStep -; 53be - -Movement_slow_jump_step_left: ; 53be - ld a, STEP_SLOW << 2 | LEFT - jp JumpStep -; 53c3 - -Movement_slow_jump_step_right: ; 53c3 - ld a, STEP_SLOW << 2 | RIGHT - jp JumpStep -; 53c8 - -Movement_jump_step_down: ; 53c8 - ld a, STEP_WALK << 2 | DOWN - jp JumpStep -; 53cd - -Movement_jump_step_up: ; 53cd - ld a, STEP_WALK << 2 | UP - jp JumpStep -; 53d2 - -Movement_jump_step_left: ; 53d2 - ld a, STEP_WALK << 2 | LEFT - jp JumpStep -; 53d7 - -Movement_jump_step_right: ; 53d7 - ld a, STEP_WALK << 2 | RIGHT - jp JumpStep -; 53dc - -Movement_fast_jump_step_down: ; 53dc - ld a, STEP_BIKE << 2 | DOWN - jp JumpStep -; 53e1 - -Movement_fast_jump_step_up: ; 53e1 - ld a, STEP_BIKE << 2 | UP - jp JumpStep -; 53e6 - -Movement_fast_jump_step_left: ; 53e6 - ld a, STEP_BIKE << 2 | LEFT - jp JumpStep -; 53eb - -Movement_fast_jump_step_right: ; 53eb - ld a, STEP_BIKE << 2 | RIGHT - jp JumpStep -; 53f0 - - -Movement_turn_step_down: ; 53f0 - ld a, OW_DOWN - jr TurnStep - -Movement_turn_step_up: ; 53f4 - ld a, OW_UP - jr TurnStep - -Movement_turn_step_left: ; 53f8 - ld a, OW_LEFT - jr TurnStep - -Movement_turn_step_right: ; 53fc - ld a, OW_RIGHT - jr TurnStep - -TurnStep: ; 5400 - ld hl, OBJECT_1D ; new facing - add hl, bc - ld [hl], a - - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STEP - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_HALF_STEP - ret -; 5412 - -NormalStep: ; 5412 - call InitStep - call UpdateTallGrassFlags - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STEP - - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - call CheckSuperTallGrassTile - jr z, .shake_grass - - call CheckGrassTile - jr c, .skip_grass - -.shake_grass - call ShakeGrass - -.skip_grass - ld hl, wCenteredObject - ld a, [hMapObjectIndexBuffer] - cp [hl] - jr z, .player - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_NPC_WALK - ret - -.player - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_PLAYER_WALK - ret -; 5446 - -TurningStep: ; 5446 - call InitStep - call UpdateTallGrassFlags - - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_SPIN - - ld hl, wCenteredObject - ld a, [hMapObjectIndexBuffer] - cp [hl] - jr z, .player - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_NPC_WALK - ret - -.player - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_PLAYER_WALK - ret -; 5468 - - -SlideStep: ; 5468 - call InitStep - call UpdateTallGrassFlags - - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STAND - - ld hl, wCenteredObject - ld a, [hMapObjectIndexBuffer] - cp [hl] - jr z, .player - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_NPC_WALK - ret - -.player - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_PLAYER_WALK - ret -; 548a - - -JumpStep: ; 548a - call InitStep - ld hl, OBJECT_1F - add hl, bc - ld [hl], $0 - - ld hl, OBJECT_FLAGS2 - add hl, bc - res OVERHEAD, [hl] - - ld hl, OBJECT_ACTION - add hl, bc - ld [hl], OBJECT_ACTION_STEP - - call SpawnShadow - - ld hl, wCenteredObject - ld a, [hMapObjectIndexBuffer] - cp [hl] - jr z, .player - - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_NPC_JUMP - ret - -.player - ld hl, OBJECT_STEP_TYPE - add hl, bc - ld [hl], STEP_TYPE_PLAYER_JUMP - ret -; 54b8 diff --git a/engine/mystery_gift.asm b/engine/mystery_gift.asm deleted file mode 100755 index c73e4246e..000000000 --- a/engine/mystery_gift.asm +++ /dev/null @@ -1,1735 +0,0 @@ -DoMysteryGift: ; 1048ba (41:48ba) - call ClearTileMap - call ClearSprites - call WaitBGMap - call InitMysteryGiftLayout - hlcoord 3, 8 - ld de, .String_PressAToLink_BToCancel - call PlaceString - call WaitBGMap - farcall PrepMysteryGiftDataToSend - call MysteryGift_ClearTrainerData - ld a, $2 - ld [wca01], a - ld a, $14 - ld [wca02], a - ld a, [rIE] - push af - - call Function104a95 - - ld d, a - xor a - ld [rIF], a - pop af - ld [rIE], a - push de - call ClearTileMap - call EnableLCD - call WaitBGMap - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - pop de - hlcoord 2, 8 - ld a, d - ld de, .Text_LinkCanceled ; Link has been canceled - cp $10 - jp z, .LinkCanceled - cp $6c - jp nz, .CommunicationError - ld a, [wc900] - cp 3 - jr z, .skip_checks - call .CheckAlreadyGotFiveGiftsToday - ld hl, .Text_MaxFiveGifts ; Only 5 gifts a day - jp nc, .PrintTextAndExit - call .CheckAlreadyGotAGiftFromThatPerson - ld hl, .Text_MaxOneGiftPerPerson ; Only one gift a day per person - jp c, .PrintTextAndExit -.skip_checks - ld a, [wMysteryGiftPlayerBackupItem] - and a - jp nz, .GiftWaiting - ld a, [wMysteryGiftPartnerBackupItem] - and a - jp nz, .FriendNotReady - ld a, [wc900] - cp 3 - jr z, .skip_append_save - call .AddMysteryGiftPartnerID - ld a, [wc900] - cp 4 - jr z, .skip_append_save - call .SaveMysteryGiftTrainerName - farcall RestoreMobileEventIndex - farcall StubbedTrainerRankings_MysteryGift - farcall BackupMobileEventIndex -.skip_append_save - ld a, [wMysteryGiftPartnerSentDeco] - and a - jr z, .item - ld a, [wMysteryGiftPartnerWhichDeco] - ld c, a - farcall MysteryGiftGetDecoration - push bc - call MysteryGift_CheckAndSetDecorationAlreadyReceived - pop bc - jr nz, .item - callfar GetDecorationName_c - ld h, d - ld l, e - ld de, wStringBuffer1 - ld bc, ITEM_NAME_LENGTH - call CopyBytes - ld hl, .Text_SentToHome ; sent decoration to home - jr .PrintTextAndExit - -.item - call GetMysteryGiftBank - ld a, [wMysteryGiftPartnerWhichItem] - ld c, a - farcall MysteryGiftGetItemHeldEffect - ld a, c - ld [sBackupMysteryGiftItem], a - ld [wNamedObjectIndexBuffer], a - call CloseSRAM - call GetItemName - ld hl, .Text_Sent ; sent item - jr .PrintTextAndExit - -.LinkCanceled: ; 1049af (41:49af) - ld hl, .Text_LinkCanceled ; Link has been canceled - jr .PrintTextAndExit - -.CommunicationError: ; 1049b4 (41:49b4) - ld hl, .Text_CommunicationError ; Communication error - call PrintText - jp DoMysteryGift - -.GiftWaiting: ; 1049bd (41:49bd) - ld hl, .Text_ReceiveGiftAtCounter ; receive gift at counter - jr .PrintTextAndExit - -.FriendNotReady: ; 1049c2 (41:49c2) - ld hl, .Text_FriendNotReady ; friend not ready - -.PrintTextAndExit: ; 1049c5 (41:49c5) - call PrintText - ld a, LCDC_DEFAULT - ld [rLCDC], a - ret -; 1049cd (41:49cd) - -.String_PressAToLink_BToCancel: ; 1049cd - db "Press A to" - next "link IR-Device" - next "Press B to" - next "cancel it." - db "@" -; 1049fd - -.Text_LinkCanceled: ; 1049fd - text_jump UnknownText_0x1c0436 - db "@" -; 104a02 - -.Text_CommunicationError: ; 104a02 - text_jump UnknownText_0x1c0454 - db "@" -; 104a07 - -.Text_ReceiveGiftAtCounter: ; 104a07 - text_jump UnknownText_0x1c046a - db "@" -; 104a0c - -.Text_FriendNotReady: ; 104a0c - text_jump UnknownText_0x1c048e - db "@" -; 104a11 - -.Text_MaxFiveGifts: ; 104a11 - text_jump UnknownText_0x1c04a7 - db "@" -; 104a16 - -.Text_MaxOneGiftPerPerson: ; 104a16 - text_jump UnknownText_0x1c04c6 - db "@" -; 104a1b - -.Text_Sent: ; 104a1b - text_jump UnknownText_0x1c04e9 - db "@" -; 104a20 - -.Text_SentToHome: ; 104a20 - text_jump UnknownText_0x1c04fa - db "@" -; 104a25 - -.CheckAlreadyGotFiveGiftsToday: ; 104a25 (41:4a25) - call GetMysteryGiftBank - ld a, [sNumDailyMysteryGiftPartnerIDs] - cp $5 - jp CloseSRAM - -.CheckAlreadyGotAGiftFromThatPerson: ; 104a30 (41:4a30) - call GetMysteryGiftBank - ld a, [wMysteryGiftPartnerID] - ld b, a - ld a, [wMysteryGiftPartnerID + 1] - ld c, a - ld a, [sNumDailyMysteryGiftPartnerIDs] - ld d, a - ld hl, sDailyMysteryGiftPartnerIDs -.loop - ld a, d - and a - jr z, .No - ld a, [hli] - cp b - jr nz, .skip - ld a, [hl] - cp c - jr z, .Yes -.skip - inc hl - dec d - jr .loop -.Yes: - scf -.No: - jp CloseSRAM - -.AddMysteryGiftPartnerID: ; 104a56 (41:4a56) - call GetMysteryGiftBank - ld hl, sNumDailyMysteryGiftPartnerIDs - ld a, [hl] - inc [hl] - ld hl, sDailyMysteryGiftPartnerIDs ; inc hl - ld e, a - ld d, $0 - add hl, de - add hl, de - ld a, [wMysteryGiftPartnerID] - ld [hli], a - ld a, [wMysteryGiftPartnerID + 1] - ld [hl], a - jp CloseSRAM - -.SaveMysteryGiftTrainerName: ; 104a71 (41:4a71) - call GetMysteryGiftBank - ld a, $1 - ld [sMysteryGiftTrainerHouseFlag], a - ld hl, wMysteryGiftPartnerName - ld de, sMysteryGiftPartnerName - ld bc, NAME_LENGTH - call CopyBytes - ld a, $1 - ld [de], a - inc de - ld hl, wMysteryGiftTrainerData - ld bc, (1 + 1 + NUM_MOVES) * PARTY_LENGTH + 2 - call CopyBytes - jp CloseSRAM - -Function104a95: ; 104a95 (41:4a95) - di - farcall ClearChannels - call Function104d5e - -.loop2 - call Function104d96 - call Function104ddd - ld a, [hMGStatusFlags] - cp $10 - jp z, Function104bd0 - cp $6c - jr nz, .loop2 - - ld a, [hPrintNum9] - cp $2 - jr z, Function104b22 - ld hl, hPrintNum1 - ld b, $1 - call Function104d56 - jr nz, .ly_loop - call Function104b49 - jp nz, Function104bd0 - jr Function104b0a - ; Delay frame -.ly_loop - ld a, [rLY] - cp LY_VBLANK - jr c, .ly_loop - ld c, LOW(rRP) - ld a, $c0 - ld [$ff00+c], a - ld b, 240 ; This might have been intended as a 4-second timeout buffer. - ; However, it is reset with each frame. -.loop3 - push bc - call MysteryGift_ReadJoypad - - ld b, $2 - ld c, LOW(rRP) - ; Delay frame -.ly_loop2 - ld a, [$ff00+c] - and b - ld b, a - ld a, [rLY] - cp LY_VBLANK - jr nc, .ly_loop2 -.ly_loop3 - ld a, [$ff00+c] - and b - ld b, a - ld a, [rLY] - cp LY_VBLANK - jr c, .ly_loop3 - - ld a, b - pop bc - dec b - jr z, .loop2 ; we never jump here - or a - jr nz, .loop2 - ; Check if we've pressed the B button - ld a, [hMGJoypadReleased] - bit B_BUTTON_F, a - jr z, .loop3 - ld a, $10 - ld [hMGStatusFlags], a - jp Function104bd0 - -Function104b04: ; 104b04 (41:4b04) - call Function104b40 - jp nz, Function104bd0 -Function104b0a: ; 104b0a (41:4b0a) - call Function104d38 - jp nz, Function104bd0 - call Function104b88 - jp nz, Function104bd0 - call Function104d43 - jp nz, Function104bd0 - call Function105033 - jp Function104bd0 - -Function104b22: ; 104b22 (41:4b22) - call Function104b88 - jp nz, Function104bd0 - call Function104d43 - jp nz, Function104bd0 - call Function104b40 - jp nz, Function104bd0 - call Function104d38 - jp nz, Function104bd0 - call Function10502e - jp Function104bd0 - -Function104b40: ; 104b40 (41:4b40) - ld hl, hPrintNum1 - ld b, $1 - call Function104d56 - ret nz - -Function104b49: ; 104b49 (41:4b49) - call Function105033 - ld a, [hMGStatusFlags] - cp $6c - ret nz - ld a, [hPrintNum1] - cp $96 - jp nz, Function104d32 - ld a, $90 - ld [hPrintNum1], a - call Function104d38 - ret nz - ld hl, hPrintNum1 - ld b, $1 - call Function104d4e - ret nz - call Function10502e - ld a, [hMGStatusFlags] - cp $6c - ret nz - call Function104d43 - ret nz - ld hl, wMysteryGiftTrainerData - ld a, [wca02] - ld b, a - call Function104d56 - ret nz - call Function105033 - ld a, [hMGStatusFlags] - cp $6c - ret - -Function104b88: ; 104b88 (41:4b88) - ld a, $96 - ld [hPrintNum1], a - ld hl, hPrintNum1 - ld b, $1 - call Function104d4e - ret nz - call Function10502e - ld a, [hMGStatusFlags] - cp $6c - ret nz - call Function104d43 - ret nz - ld hl, hPrintNum1 - ld b, $1 - call Function104d56 - ret nz - call Function105033 - ld a, [hMGStatusFlags] - cp $6c - ret nz - ld a, [hPrintNum1] - cp $90 - jp nz, Function104d32 - call Function104d38 - ret nz - ld hl, wOverworldMap - ld a, [wca02] - ld b, a - call Function104d4e - ret nz - call Function10502e - ld a, [hMGStatusFlags] - cp $6c - ret - -Function104bd0: ; 104bd0 (41:4bd0) - nop - ld a, [hMGStatusFlags] - cp $10 - jr z, .quit - cp $6c - jr nz, .quit - ld hl, wca01 - dec [hl] - jr z, .quit - ld hl, wMysteryGiftTrainerData - ld de, wMysteryGiftPartnerData - ld bc, wMysteryGiftPartnerDataEnd - wMysteryGiftPartnerData - call CopyBytes - ld a, [wMysteryGiftTrainerData] - cp $3 - jr nc, .quit - farcall StagePartyDataForMysteryGift - call MysteryGift_ClearTrainerData - ld a, $26 - ld [wca02], a - ld a, [hPrintNum9] - cp $2 - jr z, .asm_104c10 - call Function104d43 - jr nz, Function104bd0 - jp Function104b04 - -.asm_104c10 - call Function104d38 - jr nz, Function104bd0 - jp Function104b22 - -.quit - ld a, [hMGStatusFlags] - push af - call Function104da0 - xor a - ld [rIF], a - ld a, [rIE] - or $1 - ld [rIE], a - ei - call DelayFrame - pop af - ret - -Function104c2d: ; 104c2d (41:4c2d) - di - farcall ClearChannels - call Function104d5e -.asm_104c37 - call Function104d96 - call Function104ddd - ld a, [hMGStatusFlags] - cp $10 - jp z, Function104d1c - cp $6c - jr nz, .asm_104c37 - ld a, [hPrintNum9] - cp $2 - jr z, .asm_104c6c - call Function104c8a - jp nz, Function104d1c - call Function104d38 - jp nz, Function104d1c - call Function104cd2 - jp nz, Function104d1c - call Function104d43 - jp nz, Function104d1c - call Function105033 - jp Function104d1c -.asm_104c6c - call Function104cd2 - jp nz, Function104d1c - call Function104d43 - jp nz, Function104d1c - call Function104c8a - jp nz, Function104d1c - call Function104d38 - jp nz, Function104d1c - call Function10502e - jp Function104d1c - -Function104c8a: ; 104c8a (41:4c8a) - ld hl, hPrintNum1 - ld b, $1 - call Function104d56 - ret nz - call Function105033 - ld a, [hMGStatusFlags] - cp $6c - ret nz - ld a, [hPrintNum1] - cp $3c - jp nz, Function104d32 - swap a - ld [hPrintNum1], a - call Function104d38 - ret nz - ld hl, hPrintNum1 - ld b, $1 - call Function104d4e - ret nz - call Function10502e - ld a, [hMGStatusFlags] - cp $6c - ret nz - call Function104d43 - ret nz - ld hl, wMysteryGiftTrainerData - ld a, [wca02] - ld b, a - call Function104d56 - ret nz - call Function105033 - ld a, [hMGStatusFlags] - cp $6c - ret - -Function104cd2: ; 104cd2 (41:4cd2) - ld a, $3c - ld [hPrintNum1], a - ld hl, hPrintNum1 - ld b, $1 - call Function104d4e - ret nz - call Function10502e - ld a, [hMGStatusFlags] - cp $6c - ret nz - call Function104d43 - ret nz - ld hl, hPrintNum1 - ld b, $1 - call Function104d56 - ret nz - call Function105033 - ld a, [hMGStatusFlags] - cp $6c - ret nz - ld a, [hPrintNum1] - swap a - cp $3c - jp nz, Function104d32 - call Function104d38 - ret nz - ld hl, wOverworldMap - ld a, [wca02] - ld b, a - call Function104d4e - ret nz - call Function10502e - ld a, [hMGStatusFlags] - cp $6c - ret - -Function104d1c: ; 104d1c (41:4d1c) - nop - ld a, [hMGStatusFlags] - push af - call Function104da0 - xor a - ld [rIF], a - ld a, [rIE] - or $1 - ld [rIE], a - ei - call DelayFrame - pop af - ret - -Function104d32: ; 104d32 (41:4d32) - ld a, $80 - ld [hMGStatusFlags], a - and a - ret - -Function104d38: ; 104d38 (41:4d38) - call Function104d96 - call Function104e46 - ld a, [hMGStatusFlags] - cp $6c - ret - -Function104d43: ; 104d43 (41:4d43) - call Function104d96 - call Function104dfe - ld a, [hMGStatusFlags] - cp $6c - ret - -Function104d4e: ; 104d4e (41:4d4e) - call Function104e93 - ld a, [hMGStatusFlags] - cp $6c - ret - -Function104d56: ; 104d56 (41:4d56) - call Function104f57 - ld a, [hMGStatusFlags] - cp $6c - ret - -Function104d5e: ; 104d5e (41:4d5e) - call Function104d74 - ld a, $4 - ld [rIE], a - xor a - ld [rIF], a - call Function104d96 - xor a - ld b, a -.asm_104d6d - inc a - jr nz, .asm_104d6d - inc b - jr nz, .asm_104d6d - ret - -Function104d74: ; 104d74 (41:4d74) - xor a - ld [rTAC], a - ld a, $fe - ld [rTMA], a - ld [rTIMA], a - ld a, $2 - ld [rTAC], a - or $4 - ld [rTAC], a - ret - -Function104d86: ; 104d86 (41:4d86) - xor a - ld [rTAC], a - ld [rTMA], a - ld [rTIMA], a - ld a, $2 - ld [rTAC], a - or $4 - ld [rTAC], a - ret - -Function104d96: ; 104d96 (41:4d96) - ld a, $c0 - call Function104e8c - ld a, $1 - ld [hPrintNum9], a - ret - -Function104da0: ; 104da0 (41:4da0) - xor a - call Function104e8c - ld a, $2 - ld [rTAC], a - ret - -Function104da9: ; 104da9 (41:4da9) - inc d - ret z - xor a - ld [rIF], a - halt - ld a, [$ff00+c] - bit 1, a - jr z, Function104da9 - or a - ret - -Function104db7: ; 104db7 (41:4db7) - inc d - ret z - xor a - ld [rIF], a - halt - ld a, [$ff00+c] - bit 1, a - jr nz, Function104db7 - or a - ret - -Function104dc5: ; 104dc5 (41:4dc5) - ld a, $c1 - ld [$ff00+c], a -.wait - dec d - ret z - xor a - ld [rIF], a - halt - jr .wait - -Function104dd1: ; 104dd1 (41:4dd1) - ld a, $c0 - ld [$ff00+c], a -.wait - dec d - ret z - xor a - ld [rIF], a - halt - jr .wait - -Function104ddd: ; 104ddd (41:4ddd) - ld d, $0 - ld e, d - ld a, $1 - ld [hPrintNum9], a -.loop - call MysteryGift_ReadJoypad - ld b, $2 - ld c, LOW(rRP) - ld a, [hMGJoypadReleased] - bit B_BUTTON_F, a - jr z, .next - ld a, $10 - ld [hMGStatusFlags], a - ret - -.next - bit 0, a - jr nz, Function104e3a - ld a, [$ff00+c] - and b - jr nz, .loop - -Function104dfe: ; 104dfe (41:4dfe) - ld c, LOW(rRP) - ld d, $0 - ld e, d - call Function104db7 - jp z, Function104f42 - ld d, e - call Function104da9 - jp z, Function104f42 - call Function104db7 - jp z, Function104f42 - call Function104da9 - jp z, Function104f42 - ld a, $6c - ld [hMGStatusFlags], a - ld d, $3d - call Function104dd1 - ld d, $5 - call Function104dc5 - ld d, $15 - call Function104dd1 - ld d, $5 - call Function104dc5 - ld d, $5 - call Function104dd1 - ret - -Function104e3a: ; 104e3a (41:4e3a) - ; Wait a random amount of time - call Random - ld e, a - and $f - ld d, a -.loop - dec de - ld a, d - or e - jr nz, .loop -Function104e46: ; 104e46 (41:4e46) - ld a, $2 - ld [hPrintNum9], a - ld c, LOW(rRP) - ld d, $0 - ld e, d - ld d, $3d - call Function104dd1 - ld d, $5 - call Function104dc5 - ld d, $15 - call Function104dd1 - ld d, $5 - call Function104dc5 - ld d, $5 - call Function104dd1 - ld d, e - call Function104db7 - jp z, Function104f42 - ld d, e - call Function104da9 - jp z, Function104f42 - call Function104db7 - jp z, Function104f42 - call Function104da9 - jp z, Function104f42 - ld d, $3d - call Function104dd1 - ld a, $6c - ld [hMGStatusFlags], a - ret - -Function104e8c: ; 104e8c (41:4e8c) - ld [rRP], a - ld a, $ff - ld [hMGStatusFlags], a - ret - -Function104e93: ; 104e93 (41:4e93) - xor a - ld [hPrintNum5], a - ld [hPrintNum6], a - push hl - push bc - ld c, LOW(rRP) - ld d, $3d - call Function104dd1 - ld hl, hPrintNum2 - ld a, $5a - ld [hli], a - ld [hl], b - dec hl - ld b, $2 - call Function104ed6 - pop bc - pop hl - call Function104ed6 - ld a, [hPrintNum5] - ld [hPrintNum2], a - ld a, [hPrintNum6] - ld [hPrintNum3], a - push hl - ld hl, hPrintNum2 - ld b, $2 - call Function104ed6 - ld hl, hMGStatusFlags - ld b, $1 - call Function104faf - ld a, [hPrintNum2] - ld [hPrintNum5], a - ld a, [hPrintNum3] - ld [hPrintNum6], a - pop hl - ret - -Function104ed6: ; 104ed6 (41:4ed6) - ld c, LOW(rRP) - ld d, $5 - call Function104dd1 - ld d, $5 - call Function104dc5 - ld d, $15 - call Function104dd1 - ld a, b - cpl - ld b, a - ld a, $f4 - ld [rTMA], a -.asm_104eee - inc b - jr z, .asm_104f2e - ld a, $8 - ld [hPrintNum4], a - ld a, [hli] - ld e, a - ld a, [hPrintNum5] - add e - ld [hPrintNum5], a - ld a, [hPrintNum6] - adc 0 - ld [hPrintNum6], a -.asm_104f02 - xor a - ld [rIF], a - halt - ld a, $c1 - ld [rRP], a - ld d, $1 - ld a, e - rlca - ld e, a - jr nc, .asm_104f13 - inc d -.asm_104f13 - ld a, [rTIMA] - cp $f8 - jr c, .asm_104f13 - ld a, $c0 - ld [rRP], a - dec d - jr z, .asm_104f25 - xor a - ld [rIF], a - halt -.asm_104f25 - ld a, [hPrintNum4] - dec a - jr z, .asm_104eee - ld [hPrintNum4], a - jr .asm_104f02 -.asm_104f2e - ld a, $fe - ld [rTMA], a - xor a - ld [rIF], a - halt - ld d, $5 - call Function104dc5 - ld d, $11 - call Function104dd1 - ret - -Function104f42: ; 104f42 (41:4f42) - ld a, [hMGStatusFlags] - or $2 - ld [hMGStatusFlags], a - ret - -Function104f49: ; 104f49 (41:4f49) - ld a, [hMGStatusFlags] - or $1 - ld [hMGStatusFlags], a - ret - -Function104f50: ; 104f50 (41:4f50) - ld a, [hMGStatusFlags] - or $80 - ld [hMGStatusFlags], a - ret - -Function104f57: ; 104f57 (41:4f57) - xor a - ld [hPrintNum5], a - ld [hPrintNum6], a - push bc - push hl - ld hl, hPrintNum2 - ld b, $2 - call Function104faf - ld a, [hPrintNum3] - ld [hPrintNum8], a - ld b, a - pop hl - pop af - cp b - jp c, Function104f50 - ld a, [hPrintNum2] - cp $5a - jp nz, Function104f50 - call Function104faf - ld a, [hPrintNum5] - ld d, a - ld a, [hPrintNum6] - ld e, a - push hl - push de - ld hl, hPrintNum2 - ld b, $2 - call Function104faf - pop de - ld hl, hPrintNum2 - ld a, [hli] - xor d - ld b, a - ld a, [hl] - xor e - or b - call nz, Function104f49 - push de - ld d, $3d - call Function104dd1 - ld hl, hMGStatusFlags - ld b, $1 - call Function104ed6 - pop de - pop hl - ld a, d - ld [hPrintNum5], a - ld a, e - ld [hPrintNum6], a - ret - -Function104faf: ; 104faf (41:4faf) - ld c, LOW(rRP) - ld d, $0 - call Function104db7 - jp z, Function104f42 - ld d, $0 - call Function104da9 - jp z, Function104f42 - ld d, $0 - call Function104db7 - jp z, Function104f42 - ld a, b - cpl - ld b, a - xor a - ld [hMGJoypadPressed + 2], a - call Function104d86 -.asm_104fd2 - inc b - jr z, .asm_10501a - ld a, $8 - ld [hPrintNum4], a -.asm_104fd9 - ld d, $0 -.asm_104fdb - inc d - jr z, .asm_104fe5 - ld a, [$ff00+c] - bit 1, a - jr z, .asm_104fdb - ld d, $0 -.asm_104fe5 - inc d - jr z, .asm_104fed - ld a, [$ff00+c] - bit 1, a - jr nz, .asm_104fe5 -.asm_104fed - ld a, [hMGJoypadPressed + 2] - ld d, a - ld a, [rTIMA] - ld [hMGJoypadPressed + 2], a - sub d - cp $12 - jr c, .asm_104ffd - set 0, e - jr .asm_104fff -.asm_104ffd - res 0, e -.asm_104fff - ld a, [hPrintNum4] - dec a - ld [hPrintNum4], a - jr z, .asm_10500b - ld a, e - rlca - ld e, a - jr .asm_104fd9 -.asm_10500b - ld a, e - ld [hli], a - ld a, [hPrintNum5] - add e - ld [hPrintNum5], a - ld a, [hPrintNum6] - adc 0 - ld [hPrintNum6], a - jr .asm_104fd2 -.asm_10501a - call Function104d74 - xor a - ld [rIF], a - ld d, $0 - call Function104da9 - jp z, Function104f42 - ld d, $10 - call Function104dd1 - ret - -Function10502e: ; 10502e (41:502e) - ld b, $0 - jp Function104e93 - -Function105033: ; 105033 (41:5033) - ld b, $0 - jp Function104f57 - -MysteryGift_ReadJoypad: ; 105038 (41:5038) -; We can only get four inputs at a time. -; We take d-pad first for no particular reason. - ld a, R_DPAD - ld [rJOYP], a -; Read twice to give the request time to take. - ld a, [rJOYP] - ld a, [rJOYP] - -; The Joypad register output is in the lo nybble (inversed). -; We make the hi nybble of our new container d-pad input. - cpl - and $f - swap a - -; We'll keep this in b for now. - ld b, a - -; Buttons make 8 total inputs (A, B, Select, Start). -; We can fit this into one byte. - ld a, R_BUTTONS - ld [rJOYP], a -; Wait for input to stabilize. -rept 6 - ld a, [rJOYP] -endr -; Buttons take the lo nybble. - cpl - and $f - or b - ld c, a -; To get the delta we xor the last frame's input with the new one. - ld a, [hMGJoypadPressed] - xor c -; Released this frame: - and c - ld [hMGJoypadReleased], a -; Pressed this frame: - ld a, c - ld [hMGJoypadPressed], a - ld a, $30 -; Reset the joypad register since we're done with it. - ld [rJOYP], a - ret - -MysteryGift_CheckAndSetDecorationAlreadyReceived: ; 105069 (41:5069) - call GetMysteryGiftBank - ld d, $0 - ld b, CHECK_FLAG - ld hl, sMysteryGiftDecorationsReceived - predef_id SmallFarFlagAction - push hl - push bc - call Predef - call CloseSRAM - ld a, c - and a - pop bc - pop hl - ret nz - call GetMysteryGiftBank - ld b, SET_FLAG - predef SmallFarFlagAction - call CloseSRAM - xor a - ret - -MysteryGift_CopyReceivedDecosToPC: ; 105091 (41:5091) - call GetMysteryGiftBank - ld c, $0 -.loop - push bc - ld d, $0 - ld b, CHECK_FLAG - ld hl, sMysteryGiftDecorationsReceived - predef SmallFarFlagAction - ld a, c - and a - pop bc - jr z, .skip - push bc - callfar SetSpecificDecorationFlag - pop bc -.skip - inc c - ld a, c - cp TrophyIDs - DecorationIDs - jr c, .loop - jp CloseSRAM - -UnlockMysteryGift: ; 1050b9 - call GetMysteryGiftBank - ld hl, sMysteryGiftUnlocked - ld a, [hl] - inc a - jr nz, .ok - ld [hld], a - ld [hl], a -.ok - jp CloseSRAM -; 1050c8 - -Function1050c8: ; 1050c8 - call GetMysteryGiftBank - ld a, [sNumDailyMysteryGiftPartnerIDs] - cp $ff - jr z, .okay - xor a - ld [sNumDailyMysteryGiftPartnerIDs], a -.okay - jp CloseSRAM -; 1050d9 - - -BackupMysteryGift: ; 1050d9 - call GetMysteryGiftBank - ld hl, sMysteryGiftItem - ld de, sBackupMysteryGiftItem - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - jp CloseSRAM -; 1050ea - - -RestoreMysteryGift: ; 1050ea (41:50ea) - call GetMysteryGiftBank - ld hl, sBackupMysteryGiftItem - ld de, sMysteryGiftItem - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - jp CloseSRAM - -MysteryGift_ClearTrainerData: ; 1050fb (41:50fb) - ld hl, wMysteryGiftTrainerData - xor a - ld b, wMysteryGiftTrainerDataEnd - wMysteryGiftTrainerData -.loop - ld [hli], a - dec b - jr nz, .loop - ret - - -GetMysteryGiftBank: ; 105106 - ld a, BANK(sBackupMysteryGiftItem) - jp GetSRAMBank -; 10510b - - -StagePartyDataForMysteryGift: ; 10510b (41:510b) -; You will be sending this data to your mystery gift partner. -; Structure is the same as a trainer with species and moves -; defined. - ld a, BANK(sPokemonData) - call GetSRAMBank - ld de, wMysteryGiftStaging - ld bc, sPokemonData + wPartyMons - wPokemonData - ld hl, sPokemonData + wPartySpecies - wPokemonData -.loop - ld a, [hli] - cp -1 - jr z, .party_end - cp EGG - jr z, .next - push hl - ; copy level - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - ld [de], a - inc de - ; copy species - ld hl, MON_SPECIES - add hl, bc - ld a, [hl] - ld [de], a - inc de - ; copy moves - ld hl, MON_MOVES - add hl, bc - push bc - ld bc, NUM_MOVES - call CopyBytes - pop bc - pop hl -.next - push hl - ld hl, PARTYMON_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - pop hl - jr .loop -.party_end - ld a, -1 - ld [de], a - ld a, $26 - ld [wca00], a - jp CloseSRAM - -InitMysteryGiftLayout: ; 105153 (41:5153) - call ClearBGPalettes - call DisableLCD - ld hl, MysteryGiftGFX - ld de, vTiles2 tile $00 - ld a, BANK(MysteryGiftGFX) - ld bc, MysteryGiftGFX.End - MysteryGiftGFX - call FarCopyBytes - hlcoord 0, 0 - ld a, $42 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - call ByteFill - hlcoord 3, 7 - lb bc, 9, 15 - call ClearBox - hlcoord 0, 0 - ld a, $0 - ld [hli], a - inc a - ld [hl], a - hlcoord 0, 1 - inc a - ld [hli], a - inc a - ld [hl], a - hlcoord 7, 1 - ld a, $12 - call .Load5GFX - hlcoord 2, 2 - ld a, $17 - call .Load16GFX - hlcoord 2, 3 - ld a, $27 - call .Load16GFX - hlcoord 9, 4 - ld a, $37 - ld [hli], a - inc a - ld [hl], a - hlcoord 1, 2 - ld [hl], $4 - hlcoord 1, 3 - ld a, $5 - call .Load14Column - ld a, $9 - hlcoord 18, 5 - call .Load11Column - hlcoord 2, 5 - ld a, $b - call .Load16Row - hlcoord 2, 16 - ld a, $7 - call .Load16Row - hlcoord 2, 5 - ld a, $d - call .Load5GFX - hlcoord 7, 5 - ld [hl], $c - hlcoord 18, 5 - ld [hl], $a - hlcoord 18, 16 - ld [hl], $8 - hlcoord 1, 16 - ld [hl], $6 - hlcoord 2, 6 - ld a, $3a - call .Load16Row - hlcoord 2, 15 - ld a, $40 - call .Load16Row - hlcoord 2, 6 - ld a, $3c - call .Load9Column - hlcoord 17, 6 - ld a, $3e - call .Load9Column - hlcoord 2, 6 - ld [hl], $39 - hlcoord 17, 6 - ld [hl], $3b - hlcoord 2, 15 - ld [hl], $3f - hlcoord 17, 15 - ld [hl], $41 - call EnableLCD - call WaitBGMap - ld b, SCGB_MYSTERY_GIFT - call GetSGBLayout - call SetPalettes - ret - -.Load5GFX: ; 10522e (41:522e) - ld b, 5 - jr .gfx_loop -; 105232 (41:5232) - -.Unreferenced_Load6GFX: - ld b, 6 - jr .gfx_loop - -.Load16GFX: ; 105236 (41:5236) - ld b, 16 - -.gfx_loop ; 105238 (41:5238) - ld [hli], a - inc a - dec b - jr nz, .gfx_loop - ret - -.Load9Column: ; 10523e (41:523e) - ld b, 9 - jr .col_loop - -.Load11Column: ; 105242 (41:5242) - ld b, 11 - jr .col_loop - -.Load14Column: ; 105246 (41:5246) - ld b, 14 - -.col_loop ; 105248 (41:5248) - ld [hl], a - ld de, SCREEN_WIDTH - add hl, de - dec b - jr nz, .col_loop - ret - -.Load16Row: ; 105251 (41:5251) - ld b, 16 -.row_loop - ld [hli], a - dec b - jr nz, .row_loop - ret - -MysteryGiftGFX: ; 105258 -INCBIN "gfx/mystery_gift/mystery_gift.2bpp" -.End - -Function105688: ; 105688 (41:5688) - call ClearTileMap - call ClearSprites - call WaitBGMap - call Function1057d7 - hlcoord 3, 8 - ld de, String_PressAToLink_BToCancel_JP - call PlaceString - call WaitBGMap - call Function10578c - call MysteryGift_ClearTrainerData - ld a, $24 - ld [wca02], a - ld a, [rIE] - push af - call Function104c2d - ld d, a - xor a - ld [rIF], a - pop af - ld [rIE], a - ld a, d - cp $10 - jp z, Function105712 - cp $6c - jp nz, Function10571a - call Function1056eb - ld c, 60 - call DelayFrames - call Function105777 - ld hl, Text_ReceivedCard - call PrintText - ld de, wMysteryGiftTrainerData - farcall Function8ac70 - ld a, c - ld [wd265], a - ld hl, Text_CardNotRegistered - jr c, PrintTextAndExit_JP - ld hl, Text_ListedCardAsNumber - jr PrintTextAndExit_JP - -Function1056eb: ; 1056eb (41:56eb) - ld c, 16 -.loop - ld hl, wVirtualOAMSprite00YCoord - ld b, 8 -.dec_y_loop - dec [hl] -rept SPRITEOAMSTRUCT_LENGTH - inc hl -endr - dec b - jr nz, .dec_y_loop - ld hl, wVirtualOAMSprite08YCoord - ld b, 8 -.inc_y_loop - inc [hl] -rept SPRITEOAMSTRUCT_LENGTH - inc hl -endr - dec b - jr nz, .inc_y_loop - dec c - ret z - push bc - ld c, 4 - call DelayFrames - pop bc - jr .loop - -Function105712: ; 105712 (41:5712) - call Function105777 - ld hl, Text_MGLinkCanceled - jr PrintTextAndExit_JP - -Function10571a: ; 10571a (41:571a) - call Function105777 - ld hl, Text_MGCommError - call PrintText - jp Function105688 - -PrintTextAndExit_JP: ; 105726 (41:5726) - call PrintText - ld a, LCDC_DEFAULT - ld [rLCDC], a - ret -; 10572e (41:572e) - -String_PressAToLink_BToCancel_JP: ; 10572e - db "エーボタンおすと" - next "つうしんおこなわれるよ!" - next "ビーボタンおすと" - next "つうしんちゅうし します" - db "@" - -; 10575e - -Text_ReceivedCard: ; 10575e - text_jump UnknownText_0x1c051a - db "@" - -Text_ListedCardAsNumber: ; 105763 - text_jump UnknownText_0x1c0531 - db "@" - -Text_CardNotRegistered: ; 105768 - text_jump UnknownText_0x1c0555 - db "@" - -Text_MGLinkCanceled: ; 10576d - text_jump UnknownText_0x1c0573 - db "@" - -Text_MGCommError: ; 105772 - text_jump UnknownText_0x1c0591 - db "@" -; 105777 - -Function105777: ; 105777 (41:5777) - call ClearSprites - call ClearTileMap - call EnableLCD - call WaitBGMap - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - ret - -Function10578c: ; 10578c (41:578c) - ld de, wOverworldMap - ld a, BANK(sPlayerData) - call GetSRAMBank - ld hl, sPlayerData + wPlayerName - wPlayerData - ld bc, NAME_LENGTH - call CopyBytes - ld hl, sPlayerData + wPlayerID - wPlayerData - ld bc, 2 - call CopyBytes - ld hl, sPlayerData + wSecretID - wPlayerData - ld bc, 2 - call CopyBytes - call CloseSRAM - ld a, BANK(sCrystalData) - call GetSRAMBank - ld a, [sCrystalData + 0] - ld [de], a - inc de - ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 - call GetSRAMBank - ld hl, $a603 ; address of MBC30 bank - ld bc, $8 - call CopyBytes - ld hl, $a007 ; address of MBC30 bank - ld bc, $c - call CopyBytes - call CloseSRAM - ret - -Function1057d7: ; 1057d7 (41:57d7) - call ClearBGPalettes - call DisableLCD - ld hl, MysteryGiftJP_GFX - ld de, vTiles2 tile $00 - ld a, BANK(MysteryGiftJP_GFX) - lb bc, 4, 0 - call FarCopyBytes - ld hl, MysteryGiftJP_GFX + $40 tiles - ld de, vTiles0 tile $00 - ld a, BANK(MysteryGiftJP_GFX) - ld bc, $80 - call FarCopyBytes - hlcoord 0, 0 - ld a, $3f - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - call ByteFill - hlcoord 3, 7 - lb bc, 9, 15 - call ClearBox - hlcoord 0, 0 - ld a, $0 - ld [hli], a - inc a - ld [hl], a - hlcoord 0, 1 - inc a - ld [hli], a - inc a - ld [hl], a - hlcoord 4, 2 - ld a, $13 - call .Load11Row - hlcoord 4, 3 - ld a, $1e - call .Load12Row - hlcoord 4, 4 - ld a, $2a - call .Load12Row - hlcoord 1, 2 - ld [hl], $4 - hlcoord 1, 3 - ld a, $5 - call .Load14Column - ld a, $9 - hlcoord 18, 5 - call .Load11Column - hlcoord 2, 5 - ld a, $b - call .Load16Row - hlcoord 2, 16 - ld a, $7 - call .Load16Row - hlcoord 2, 5 - ld a, $d - call .Load6Row - hlcoord 8, 5 - ld [hl], $c - hlcoord 18, 5 - ld [hl], $a - hlcoord 18, 16 - ld [hl], $8 - hlcoord 1, 16 - ld [hl], $6 - hlcoord 2, 6 - ld a, $37 - call .Load16Row - hlcoord 2, 15 - ld a, $3d - call .Load16Row - hlcoord 2, 6 - ld a, $39 - call .Load9Column - hlcoord 17, 6 - ld a, $3b - call .Load9Column - hlcoord 2, 6 - ld [hl], $36 - hlcoord 17, 6 - ld [hl], $38 - hlcoord 2, 15 - ld [hl], $3c - hlcoord 17, 15 - ld [hl], $3e - ld de, wVirtualOAMSprite00 - ld hl, .OAM_data - ld bc, 16 * SPRITEOAMSTRUCT_LENGTH - call CopyBytes - call EnableLCD - call WaitBGMap - ld b, $2 - farcall GetMysteryGift_MobileAdapterLayout - jp SetPalettes - -.Load6Row: ; 1058c6 (41:58c6) - ld b, 6 - jr .row_loop - -.Load11Row: ; 1058ca (41:58ca) - ld b, 11 - jr .row_loop - -.Load12Row: ; 1058ce (41:58ce) - ld b, 12 - -.row_loop ; 1058d0 (41:58d0) - ld [hli], a - inc a - dec b - jr nz, .row_loop - ret - -.Load9Column: ; 1058d6 (41:58d6) - ld b, 9 - jr .column_loop - -.Load11Column: ; 1058da (41:58da) - ld b, 11 - jr .column_loop - -.Load14Column: ; 1058de (41:58de) - ld b, 14 - -.column_loop ; 1058e0 (41:58e0) - ld [hl], a - ld de, SCREEN_WIDTH - add hl, de - dec b - jr nz, .column_loop - ret - -.Load16Row: ; 1058e9 (41:58e9) - ld b, 16 -.row_loop_no_inc - ld [hli], a - dec b - jr nz, .row_loop_no_inc - ret -; 1058f0 (41:58f0) - -.OAM_data: ; 1058f0 - dsprite 2, 1, 6, 4, $00, 0 - dsprite 2, 1, 7, 4, $01, 0 - dsprite 2, 1, 8, 4, $02, 0 - dsprite 2, 1, 9, 4, $03, 0 - dsprite 3, 1, 6, 4, $04, 0 - dsprite 3, 1, 7, 4, $05, 0 - dsprite 3, 1, 8, 4, $06, 0 - dsprite 3, 1, 9, 4, $07, 0 - dsprite 0, 1, 11, 4, $00, 0 - dsprite 0, 1, 12, 4, $01, 0 - dsprite 0, 1, 13, 4, $02, 0 - dsprite 0, 1, 14, 4, $03, 0 - dsprite 1, 1, 11, 4, $04, 0 - dsprite 1, 1, 12, 4, $05, 0 - dsprite 1, 1, 13, 4, $06, 0 - dsprite 1, 1, 14, 4, $07, 0 - -; japanese mystery gift gfx -MysteryGiftJP_GFX: ; 105930 -INCBIN "gfx/mystery_gift/mystery_gift_jp.2bpp" diff --git a/engine/mystery_gift_2.asm b/engine/mystery_gift_2.asm deleted file mode 100755 index e0e2e88fd..000000000 --- a/engine/mystery_gift_2.asm +++ /dev/null @@ -1,152 +0,0 @@ -PrepMysteryGiftDataToSend: ; 2c642 (b:4642) - ld de, wMysteryGiftStaging - ld a, $1 - ld [de], a - inc de ; wc801 - ld a, BANK(sGameData) - call GetSRAMBank - ld hl, sPlayerData + wPlayerID - wPlayerData - ld a, [hli] - ld [de], a - ld b, a - inc de ; wc802 - ld a, [hl] - ld [de], a - ld c, a - inc de ; wc803 - push bc - ld hl, sPlayerData + wPlayerName - wPlayerData - ld bc, NAME_LENGTH - call CopyBytes - push de ; wc80e - ld hl, sPokemonData + wPokedexCaught - wPokemonData - ld b, wEndPokedexCaught - wPokedexCaught - call CountSetBits - pop de - pop bc - ld a, [wd265] - ld [de], a - inc de ; wc80f - call CloseSRAM - call Random - and 1 - ld [de], a - inc de ; wc810 - call .RandomSample - ld [de], a - inc de ; wc811 - ld a, c - ld c, b - ld b, a - call .RandomSample - ld [de], a - inc de ; wc812 - ld a, BANK(sBackupMysteryGiftItem) - call GetSRAMBank - ld a, [sBackupMysteryGiftItem] - ld [de], a - inc de - ld a, [sBackupMysteryGiftItem + 1] - ld [de], a - ld a, $14 - ld [wca00], a - call CloseSRAM - ld hl, wMysteryGiftStaging - ld de, wMysteryGiftPlayerData - ld bc, wMysteryGiftPlayerDataEnd - wMysteryGiftPlayerData - jp CopyBytes - -.RandomSample: ; 2c6ac (b:46ac) - push de - call Random - cp 10 percent - jr c, .tenpercent - call Random - and %111 - ld d, a - rl d - ld e, $80 -.loop - rlc e - dec a - jr nz, .loop - ld a, e - and c - jr z, .skip - ld a, $1 -.skip - add d - jr .done - -.tenpercent - call Random - cp 20 percent - 1 - jr c, .twopercent - call Random - and %011 - ld d, a - rl d - ld e, $80 -.loop2 - rlc e - dec a - jr nz, .loop2 - ld a, e - and b - jr z, .skip2 - ld a, $1 -.skip2 - add d - add $10 - jr .done - -.twopercent - call Random - cp 20 percent - 1 - jr c, .pointfourpercent - ld a, b - swap a - and $7 - add $18 - jr .done - -.pointfourpercent - ld a, b - and $80 - ld a, $20 - jr z, .done - ld a, $21 - -.done - pop de - ret - -MysteryGiftGetItemHeldEffect: ; 2c708 (b:4708) - ld a, c - cp MysteryGiftItems.End - MysteryGiftItems - jr nc, MysteryGiftFallbackItem - ld hl, MysteryGiftItems - ld b, 0 - add hl, bc - ld c, [hl] - ret - -MysteryGiftGetDecoration: ; 2c715 (b:4715) - ld a, c - cp MysteryGiftDecos.End - MysteryGiftDecos - jr nc, MysteryGiftFallbackItem - ld hl, MysteryGiftDecos - ld b, 0 - add hl, bc - ld c, [hl] - ret - -MysteryGiftFallbackItem: ; 2c722 (b:4722) - ld c, DECO_POLKADOT_BED ; GREAT_BALL - ret -; 2c725 (b:4725) - - -INCLUDE "data/items/mystery_gift_items.asm" - -INCLUDE "data/decorations/mystery_gift_decos.asm" diff --git a/engine/naming_screen.asm b/engine/naming_screen.asm deleted file mode 100755 index a958e10eb..000000000 --- a/engine/naming_screen.asm +++ /dev/null @@ -1,1467 +0,0 @@ -NAMINGSCREEN_CURSOR EQU $7e - -NAMINGSCREEN_BORDER EQUS "\"■\"" ; $60 -NAMINGSCREEN_MIDDLELINE EQUS "\"→\"" ; $eb -NAMINGSCREEN_UNDERLINE EQUS "\"\"" ; $f2 - -_NamingScreen: ; 0x116b7 - call DisableSpriteUpdates - call NamingScreen - call ReturnToMapWithSpeechTextbox - ret - -; 0x116c1 - -NamingScreen: ; 116c1 - ld hl, wNamingScreenDestinationPointer - ld [hl], e - inc hl - ld [hl], d - ld hl, wNamingScreenType - ld [hl], b - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - call .SetUpNamingScreen - call DelayFrame -.loop - call NamingScreenJoypadLoop - jr nc, .loop - pop af - ld [hInMenu], a - pop af - ld [hMapAnims], a - pop af - ld [wOptions], a - call ClearJoypad - ret - -; 116f8 - -.SetUpNamingScreen: ; 116f8 - call ClearBGPalettes - ld b, SCGB_DIPLOMA - call GetSGBLayout - call DisableLCD - call LoadNamingScreenGFX - call NamingScreen_InitText - ld a, LCDC_DEFAULT - ld [rLCDC], a - call .GetNamingScreenSetup - call WaitBGMap - call WaitTop - call SetPalettes - call NamingScreen_InitNameEntry - ret - -; 1171d - -.GetNamingScreenSetup: ; 1171d - ld a, [wNamingScreenType] - and 7 - 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 - -; 1172e - -.Jumptable: ; 1172e (4:572e) - dw .Pokemon - dw .Player - dw .Rival - dw .Mom - dw .Box - dw .Tomodachi - dw .Pokemon - dw .Pokemon - -.Pokemon: ; 1173e (4:573e) - ld a, [wCurPartySpecies] - ld [wd265], a - ld hl, LoadMenuMonIcon - ld a, BANK(LoadMenuMonIcon) - ld e, $1 - rst FarCall ; ; indirect jump to LoadMenuMonIcon (8e83f (23:683f)) - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - hlcoord 5, 2 - call PlaceString - ld l, c - ld h, b - ld de, .NicknameStrings - call PlaceString - inc de - hlcoord 5, 4 - call PlaceString - farcall GetGender - jr c, .genderless - ld a, "♂" - jr nz, .place_gender - ld a, "♀" -.place_gender - hlcoord 1, 2 - ld [hl], a -.genderless - call .StoreMonIconParams - ret - -; 11780 (4:5780) - -.NicknameStrings: ; 11780 - db "'S@" - db "NICKNAME?@" - -; 1178d - -.Player: ; 1178d (4:578d) - farcall GetPlayerIcon - call .LoadSprite - hlcoord 5, 2 - ld de, .PlayerNameString - call PlaceString - call .StoreSpriteIconParams - ret - -; 117a3 (4:57a3) - -.PlayerNameString: ; 117a3 - db "YOUR NAME?@" - -; 117ae - -.Rival: ; 117ae (4:57ae) - ld de, SilverSpriteGFX - ld b, BANK(SilverSpriteGFX) - call .LoadSprite - hlcoord 5, 2 - ld de, .RivalNameString - call PlaceString - call .StoreSpriteIconParams - ret - -; 117c3 (4:57c3) - -.RivalNameString: ; 117c3 - db "RIVAL'S NAME?@" - -; 117d1 - -.Mom: ; 117d1 (4:57d1) - ld de, MomSpriteGFX - ld b, BANK(MomSpriteGFX) - call .LoadSprite - hlcoord 5, 2 - ld de, .MomNameString - call PlaceString - call .StoreSpriteIconParams - ret - -; 117e6 (4:57e6) - -.MomNameString: ; 117e6 - db "MOTHER'S NAME?@" - -; 117f5 - -.Box: ; 117f5 (4:57f5) - ld de, PokeBallSpriteGFX - ld hl, vTiles0 tile $00 - lb bc, BANK(PokeBallSpriteGFX), 4 - call Request2bpp - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], a - depixel 4, 4, 4, 0 - ld a, SPRITE_ANIM_INDEX_RED_WALK - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], $0 - hlcoord 5, 2 - ld de, .BoxNameString - call PlaceString - call .StoreBoxIconParams - ret - -; 11822 (4:5822) - -.BoxNameString: ; 11822 - db "BOX NAME?@" - -; 1182c - -.Tomodachi: ; 1182c (4:582c) - hlcoord 3, 2 - ld de, .oTomodachi_no_namae_sutoringu - call PlaceString - call .StoreSpriteIconParams - ret - -; 11839 (4:5839) - -.oTomodachi_no_namae_sutoringu ; 11839 - db "おともだち の なまえは?@" - -; 11847 - -.LoadSprite: ; 11847 (4:5847) - push de - ld hl, vTiles0 tile $00 - ld c, $4 - push bc - call Request2bpp - pop bc - ld hl, 12 tiles - add hl, de - ld e, l - ld d, h - ld hl, vTiles0 tile $04 - call Request2bpp - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], a - pop de - ld b, SPRITE_ANIM_INDEX_RED_WALK - ld a, d - cp HIGH(KrisSpriteGFX) - jr nz, .not_kris - ld a, e - cp LOW(KrisSpriteGFX) - jr nz, .not_kris - ld b, SPRITE_ANIM_INDEX_BLUE_WALK -.not_kris - ld a, b - depixel 4, 4, 4, 0 - call _InitSpriteAnimStruct - ret - -.StoreMonIconParams: ; 1187b (4:587b) - ld a, MON_NAME_LENGTH - 1 - hlcoord 5, 6 - jr .StoreParams - -.StoreSpriteIconParams: ; 11882 (4:5882) - ld a, PLAYER_NAME_LENGTH - 1 - hlcoord 5, 6 - jr .StoreParams - -.StoreBoxIconParams: ; 11889 (4:5889) - ld a, BOX_NAME_LENGTH - 1 - hlcoord 5, 4 - jr .StoreParams - -.StoreParams: ; 11890 (4:5890) - ld [wNamingScreenMaxNameLength], a - ld a, l - ld [wNamingScreenStringEntryCoord], a - ld a, h - ld [wNamingScreenStringEntryCoord + 1], a - ret - -NamingScreen_IsTargetBox: ; 1189c - push bc - push af - ld a, [wNamingScreenType] - sub $3 - ld b, a - pop af - dec b - pop bc - ret - -; 118a8 - -NamingScreen_InitText: ; 118a8 - call WaitTop - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, NAMINGSCREEN_BORDER - call ByteFill - hlcoord 1, 1 - lb bc, 6, 18 - call NamingScreen_IsTargetBox - jr nz, .not_box - lb bc, 4, 18 - -.not_box - call ClearBox - ld de, NameInputUpper -NamingScreen_ApplyTextInputMode: ; 118ca - call NamingScreen_IsTargetBox - jr nz, .not_box - ld hl, BoxNameInputLower - NameInputLower - add hl, de - ld d, h - ld e, l - -.not_box - push de - hlcoord 1, 8 - lb bc, 7, 18 - call NamingScreen_IsTargetBox - jr nz, .not_box_2 - hlcoord 1, 6 - lb bc, 9, 18 - -.not_box_2 - call ClearBox - hlcoord 1, 16 - lb bc, 1, 18 - call ClearBox - pop de - hlcoord 2, 8 - ld b, $5 - call NamingScreen_IsTargetBox - jr nz, .row - hlcoord 2, 6 - ld b, $6 - -.row - ld c, $11 -.col - ld a, [de] - ld [hli], a - inc de - dec c - jr nz, .col - push de - ld de, 2 * SCREEN_WIDTH - $11 - add hl, de - pop de - dec b - jr nz, .row - ret - -; 11915 - -NamingScreenJoypadLoop: ; 11915 - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .quit - call .RunJumptable - farcall PlaySpriteAnimationsAndDelayFrame - call .UpdateStringEntry - call DelayFrame - and a - ret - -.quit - callfar ClearSpriteAnims - call ClearSprites - xor a - ld [hSCX], a - ld [hSCY], a - scf - ret - -; 11940 - -.UpdateStringEntry: ; 11940 - xor a - ld [hBGMapMode], a - hlcoord 1, 5 - call NamingScreen_IsTargetBox - jr nz, .got_coords - hlcoord 1, 3 - -.got_coords - lb bc, 1, 18 - call ClearBox - ld hl, wNamingScreenDestinationPointer - ld e, [hl] - inc hl - ld d, [hl] - ld hl, wNamingScreenStringEntryCoord - ld a, [hli] - ld h, [hl] - ld l, a - call PlaceString - ld a, $1 - ld [hBGMapMode], a - ret - -; 11968 - -.RunJumptable: ; 11968 - 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 - -; 11977 - -.Jumptable: ; 11977 (4:5977) - dw .InitCursor - dw .ReadButtons - -.InitCursor: ; 1197b (4:597b) - depixel 10, 3 - call NamingScreen_IsTargetBox - jr nz, .got_cursor_position - ld d, 8 * 8 -.got_cursor_position - ld a, SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR - call _InitSpriteAnimStruct - ld a, c - ld [wNamingScreenCursorObjectPointer], a - ld a, b - ld [wNamingScreenCursorObjectPointer + 1], a - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld [hl], a - ld hl, wJumptableIndex - inc [hl] - ret - -.ReadButtons: ; 119a1 (4:59a1) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and A_BUTTON - jr nz, .a - ld a, [hl] - and B_BUTTON - jr nz, .b - ld a, [hl] - and START - jr nz, .start - ld a, [hl] - and SELECT - jr nz, .select - ret - -.a - call .GetCursorPosition - cp $1 - jr z, .select - cp $2 - jr z, .b - cp $3 - jr z, .end - call NamingScreen_GetLastCharacter - call NamingScreen_TryAddCharacter - ret nc - -.start - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $8 - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $4 - call NamingScreen_IsTargetBox - ret nz - inc [hl] - ret - -.b - call NamingScreen_DeleteCharacter - ret - -.end - call NamingScreen_StoreEntry - ld hl, wJumptableIndex - set 7, [hl] - ret - -.select - ld hl, wNamingScreenLetterCase - ld a, [hl] - xor 1 - ld [hl], a - jr z, .upper - ld de, NameInputLower - call NamingScreen_ApplyTextInputMode - ret - -.upper - ld de, NameInputUpper - call NamingScreen_ApplyTextInputMode - ret - -.GetCursorPosition: ; 11a0b (4:5a0b) - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - -NamingScreen_GetCursorPosition: ; 11a11 (4:5a11) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - push bc - ld b, $4 - call NamingScreen_IsTargetBox - jr nz, .not_box - inc b -.not_box - cp b - pop bc - jr nz, .not_bottom_row - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $3 - jr c, .case_switch - cp $6 - jr c, .delete - ld a, $3 - ret - -.case_switch - ld a, $1 - ret - -.delete - ld a, $2 - ret - -.not_bottom_row - xor a - ret - -NamingScreen_AnimateCursor: ; 11a3b (4:5a3b) - call .GetDPad - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - ld e, a - swap e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], e - ld d, $4 - call NamingScreen_IsTargetBox - jr nz, .ok - inc d -.ok - cp d - ld de, .LetterEntries - ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 0 - jr nz, .ok2 - ld de, .CaseDelEnd - ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR_BIG - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 1 -.ok2 - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - add [hl] ; default SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld l, [hl] - ld h, $0 - add hl, de - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -; 11a79 (4:5a79) - -.LetterEntries: ; 11a79 - db $00, $10, $20, $30, $40, $50, $60, $70, $80 - -.CaseDelEnd: ; 11a82 - db $00, $00, $00, $30, $30, $30, $60, $60, $60 - -; 11a8b - -.GetDPad: ; 11a8b (4:5a8b) - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .up - ld a, [hl] - and D_DOWN - jr nz, .down - ld a, [hl] - and D_LEFT - jr nz, .left - ld a, [hl] - and D_RIGHT - jr nz, .right - ret - -.right - call NamingScreen_GetCursorPosition - and a - jr nz, .asm_11ab7 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $8 - jr nc, .asm_11ab4 - inc [hl] - ret - -.asm_11ab4 - ld [hl], $0 - ret - -.asm_11ab7 - cp $3 - jr nz, .asm_11abc - xor a -.asm_11abc - ld e, a - add a - add e - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - ret - -.left - call NamingScreen_GetCursorPosition - and a - jr nz, .asm_11ad8 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .asm_11ad5 - dec [hl] - ret - -.asm_11ad5 - ld [hl], $8 - ret - -.asm_11ad8 - cp $1 - jr nz, .asm_11ade - ld a, $4 -.asm_11ade - dec a - dec a - ld e, a - add a - add e - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - ret - -.down - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - call NamingScreen_IsTargetBox - jr nz, .asm_11af9 - cp $5 - jr nc, .asm_11aff - inc [hl] - ret - -.asm_11af9 - cp $4 - jr nc, .asm_11aff - inc [hl] - ret - -.asm_11aff - ld [hl], $0 - ret - -.up - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - and a - jr z, .asm_11b0c - dec [hl] - ret - -.asm_11b0c - ld [hl], $4 - call NamingScreen_IsTargetBox - ret nz - inc [hl] - ret - -NamingScreen_TryAddCharacter: ; 11b14 (4:5b14) - ld a, [wNamingScreenLastCharacter] ; lost -MailComposition_TryAddCharacter: ; 11b17 (4:5b17) - ld a, [wNamingScreenMaxNameLength] - ld c, a - ld a, [wNamingScreenCurrNameLength] - cp c - ret nc - - ld a, [wNamingScreenLastCharacter] - -NamingScreen_LoadNextCharacter: ; 11b23 - call NamingScreen_GetTextCursorPosition - ld [hl], a - -NamingScreen_AdvanceCursor_CheckEndOfString: ; 11b27 - ld hl, wNamingScreenCurrNameLength - inc [hl] - call NamingScreen_GetTextCursorPosition - ld a, [hl] - cp "@" - jr z, .end_of_string - ld [hl], NAMINGSCREEN_UNDERLINE - and a - ret - -.end_of_string - scf - ret - -; 11b39 (4:5b39) - -; unused - ld a, [wNamingScreenCurrNameLength] - and a - ret z - push hl - ld hl, wNamingScreenCurrNameLength - dec [hl] - call NamingScreen_GetTextCursorPosition - ld c, [hl] - pop hl - -.loop - ld a, [hli] - cp $ff - jr z, NamingScreen_AdvanceCursor_CheckEndOfString - cp c - jr z, .done - inc hl - jr .loop - -.done - ld a, [hl] - jr NamingScreen_LoadNextCharacter - -; 11b56 - -INCLUDE "data/text/unused_dakutens.asm" - -; 11bbc - -NamingScreen_DeleteCharacter: ; 11bbc (4:5bbc) - ld hl, wNamingScreenCurrNameLength - ld a, [hl] - and a - ret z - dec [hl] - call NamingScreen_GetTextCursorPosition - ld [hl], NAMINGSCREEN_UNDERLINE - inc hl - ld a, [hl] - cp NAMINGSCREEN_UNDERLINE - ret nz - ld [hl], NAMINGSCREEN_MIDDLELINE - ret - -NamingScreen_GetTextCursorPosition: ; 11bd0 (4:5bd0) - push af - ld hl, wNamingScreenDestinationPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wNamingScreenCurrNameLength] - ld e, a - ld d, 0 - add hl, de - pop af - ret - -; 11be0 - -NamingScreen_InitNameEntry: ; 11be0 -; load NAMINGSCREEN_UNDERLINE, (NAMINGSCREEN_MIDDLELINE * [wNamingScreenMaxNameLength]), "@" into the dw address at wNamingScreenDestinationPointer - ld hl, wNamingScreenDestinationPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld [hl], NAMINGSCREEN_UNDERLINE - inc hl - ld a, [wNamingScreenMaxNameLength] - dec a - ld c, a - ld a, NAMINGSCREEN_MIDDLELINE -.loop - ld [hli], a - dec c - jr nz, .loop - ld [hl], "@" - ret - -; 11bf7 - -NamingScreen_StoreEntry: ; 11bf7 (4:5bf7) - ld hl, wNamingScreenDestinationPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wNamingScreenMaxNameLength] - ld c, a -.loop - ld a, [hl] - cp NAMINGSCREEN_MIDDLELINE - jr z, .terminator - cp NAMINGSCREEN_UNDERLINE - jr nz, .not_terminator -.terminator - ld [hl], "@" -.not_terminator - inc hl - dec c - jr nz, .loop - ret - -NamingScreen_GetLastCharacter: ; 11c11 (4:5c11) - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - add [hl] - sub $8 - srl a - srl a - srl a - ld e, a - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - add [hl] - sub $10 - srl a - srl a - srl a - ld d, a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH -.loop - ld a, d - and a - jr z, .done - add hl, bc - dec d - jr .loop - -.done - add hl, de - ld a, [hl] - ld [wNamingScreenLastCharacter], a - ret - -LoadNamingScreenGFX: ; 11c51 - call ClearSprites - callfar ClearSpriteAnims - call LoadStandardFont - call LoadFontsExtra - - ld de, NamingScreenGFX_MiddleLine - ld hl, vTiles0 tile NAMINGSCREEN_MIDDLELINE - lb bc, BANK(NamingScreenGFX_MiddleLine), 1 - call Get1bpp - - ld de, NamingScreenGFX_UnderLine - ld hl, vTiles0 tile NAMINGSCREEN_UNDERLINE - lb bc, BANK(NamingScreenGFX_UnderLine), 1 - call Get1bpp - - ld de, vTiles2 tile NAMINGSCREEN_BORDER - ld hl, NamingScreenGFX_Border - ld bc, 1 tiles - ld a, BANK(NamingScreenGFX_Border) - call FarCopyBytes - - ld de, vTiles0 tile NAMINGSCREEN_CURSOR - ld hl, NamingScreenGFX_Cursor - ld bc, 2 tiles - ld a, BANK(NamingScreenGFX_Cursor) - call FarCopyBytes - - ld a, $5 - ld hl, wSpriteAnimDict + 9 * 2 - ld [hli], a - ld [hl], NAMINGSCREEN_CURSOR - xor a - ld [hSCY], a - ld [wGlobalAnimYOffset], a - ld [hSCX], a - ld [wGlobalAnimXOffset], a - ld [wJumptableIndex], a - ld [wNamingScreenLetterCase], a - ld [hBGMapMode], a - ld [wNamingScreenCurrNameLength], a - ld a, $7 - ld [hWX], a - ret - -; 11cb7 - -NamingScreenGFX_Border: ; 11cb7 -INCBIN "gfx/naming_screen/border.2bpp" -; 11cc7 - -NamingScreenGFX_Cursor: ; 11cc7 -INCBIN "gfx/naming_screen/cursor.2bpp" -; 11ce7 - -INCLUDE "data/text/name_input_chars.asm" -; 11e5d - -NamingScreenGFX_End: ; unused -INCBIN "gfx/naming_screen/end.1bpp" -; 11e6d - -NamingScreenGFX_MiddleLine: -INCBIN "gfx/naming_screen/middle_line.1bpp" -; 11e6d - -NamingScreenGFX_UnderLine: ; 11e6d -INCBIN "gfx/naming_screen/underline.1bpp" -; 11e75 - -_ComposeMailMessage: ; 11e75 (mail?) - ld hl, wNamingScreenDestinationPointer - ld [hl], e - inc hl - ld [hl], d - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - call .InitBlankMail - call DelayFrame - -.loop - call .DoMailEntry - jr nc, .loop - - pop af - ld [hInMenu], a - pop af - ld [hMapAnims], a - ret - -.InitBlankMail: ; 11e9a (4:5e9a) - call ClearBGPalettes - call DisableLCD - call LoadNamingScreenGFX - ld de, vTiles0 tile $00 - ld hl, .MailIcon - ld bc, 8 tiles - ld a, BANK(.MailIcon) - call FarCopyBytes - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], a - - ; init mail icon - depixel 3, 2 - ld a, SPRITE_ANIM_INDEX_PARTY_MON - call _InitSpriteAnimStruct - - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld [hl], $0 - call .InitCharset - ld a, LCDC_DEFAULT - ld [rLCDC], a - call .initwNamingScreenMaxNameLength - ld b, SCGB_DIPLOMA - call GetSGBLayout - call WaitBGMap - call WaitTop - ld a, %11100100 - call DmgToCgbBGPals - ld a, %11100100 - call DmgToCgbObjPal0 - call NamingScreen_InitNameEntry - ld hl, wNamingScreenDestinationPointer - ld e, [hl] - inc hl - ld d, [hl] - ld hl, MAIL_LINE_LENGTH - add hl, de - ld [hl], "" - ret - -; 11ef4 (4:5ef4) - -.MailIcon: ; 11ef4 -INCBIN "gfx/icons/mail_big.2bpp" -; 11f74 - -.initwNamingScreenMaxNameLength ; 11f74 (4:5f74) - ld a, MAIL_MSG_LENGTH + 1 - ld [wNamingScreenMaxNameLength], a - ret - -; 11f7a (4:5f7a) - -.UnusedString11f7a: - db "メールを かいてね@" - -; 11f84 - -.InitCharset: ; 11f84 (4:5f84) - call WaitTop - hlcoord 0, 0 - ld bc, 6 * SCREEN_WIDTH - ld a, NAMINGSCREEN_BORDER - call ByteFill - hlcoord 0, 6 - ld bc, 12 * SCREEN_WIDTH - ld a, " " - call ByteFill - hlcoord 1, 1 - lb bc, 4, SCREEN_WIDTH - 2 - call ClearBox - ld de, MailEntry_Uppercase - -.PlaceMailCharset: ; 11fa9 (4:5fa9) - hlcoord 1, 7 - ld b, 6 -.next - ld c, SCREEN_WIDTH - 1 -.loop_ - ld a, [de] - ld [hli], a - inc de - dec c - jr nz, .loop_ - push de - ld de, SCREEN_WIDTH + 1 - add hl, de - pop de - dec b - jr nz, .next - ret - -.DoMailEntry: ; 11fc0 (4:5fc0) - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .exit_mail - call .DoJumptable - farcall PlaySpriteAnimationsAndDelayFrame - call .Update - call DelayFrame - and a - ret - -.exit_mail - callfar ClearSpriteAnims - call ClearSprites - xor a - ld [hSCX], a - ld [hSCY], a - scf - ret - -.Update: ; 11feb (4:5feb) - xor a - ld [hBGMapMode], a - hlcoord 1, 1 - lb bc, 4, 18 - call ClearBox - ld hl, wNamingScreenDestinationPointer - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 2, 2 - call PlaceString - ld a, $1 - ld [hBGMapMode], a - ret - -.DoJumptable: ; 12008 (4:6008) - 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: ; 12017 (4:6017) - dw .init_blinking_cursor - dw .process_joypad - -.init_blinking_cursor ; 1201b (4:601b) - depixel 9, 2 - ld a, SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR - call _InitSpriteAnimStruct - ld a, c - ld [wNamingScreenCursorObjectPointer], a - ld a, b - ld [wNamingScreenCursorObjectPointer + 1], a - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld [hl], a - ld hl, wJumptableIndex - inc [hl] - ret - -.process_joypad ; 1203a (4:603a) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and A_BUTTON - jr nz, .a - ld a, [hl] - and B_BUTTON - jr nz, .b - ld a, [hl] - and START - jr nz, .start - ld a, [hl] - and SELECT - jr nz, .select - ret - -.a - call NamingScreen_PressedA_GetCursorCommand - cp $1 - jr z, .select - cp $2 - jr z, .b - cp $3 - jr z, .finished - call NamingScreen_GetLastCharacter - call MailComposition_TryAddLastCharacter - jr c, .start - ld hl, wNamingScreenCurrNameLength - ld a, [hl] - cp MAIL_LINE_LENGTH - ret nz - inc [hl] - call NamingScreen_GetTextCursorPosition - ld [hl], NAMINGSCREEN_UNDERLINE - dec hl - ld [hl], "" - ret - -.start - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $9 - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $5 - ret - -.b - call NamingScreen_DeleteCharacter - ld hl, wNamingScreenCurrNameLength - ld a, [hl] - cp MAIL_LINE_LENGTH - ret nz - dec [hl] - call NamingScreen_GetTextCursorPosition - ld [hl], NAMINGSCREEN_UNDERLINE - inc hl - ld [hl], "" - ret - -.finished - call NamingScreen_StoreEntry - ld hl, wJumptableIndex - set 7, [hl] - ret - -.select - ld hl, wNamingScreenLetterCase - ld a, [hl] - xor 1 - ld [hl], a - jr nz, .switch_to_lowercase - ld de, MailEntry_Uppercase - call .PlaceMailCharset - ret - -.switch_to_lowercase - ld de, MailEntry_Lowercase - call .PlaceMailCharset - ret - -; called from engine/sprite_anims.asm - -ComposeMail_AnimateCursor: ; 120c1 (4:60c1) - call .GetDPad - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - ld e, a - swap e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], e - cp $5 - ld de, .LetterEntries - ld a, 0 - jr nz, .got_pointer - ld de, .CaseDelEnd - ld a, 1 -.got_pointer - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - add [hl] - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld l, [hl] - ld h, 0 - add hl, de - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -; 120f8 (4:60f8) - -.LetterEntries: ; 120f8 - db $00, $10, $20, $30, $40, $50, $60, $70, $80, $90 - -.CaseDelEnd: ; 12102 - db $00, $00, $00, $30, $30, $30, $60, $60, $60, $60 - -; 1210c - -.GetDPad: ; 1210c (4:610c) - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .up - ld a, [hl] - and D_DOWN - jr nz, .down - ld a, [hl] - and D_LEFT - jr nz, .left - ld a, [hl] - and D_RIGHT - jr nz, .right - ret - -.right - call ComposeMail_GetCursorPosition - and a - jr nz, .case_del_done_right - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $9 - jr nc, .wrap_around_letter_right - inc [hl] - ret - -.wrap_around_letter_right - ld [hl], $0 - ret - -.case_del_done_right - cp $3 - jr nz, .wrap_around_command_right - xor a -.wrap_around_command_right - ld e, a - add a - add e - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - ret - -.left - call ComposeMail_GetCursorPosition - and a - jr nz, .caps_del_done_left - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .wrap_around_letter_left - dec [hl] - ret - -.wrap_around_letter_left - ld [hl], $9 - ret - -.caps_del_done_left - cp $1 - jr nz, .wrap_around_command_left - ld a, $4 -.wrap_around_command_left - dec a - dec a - ld e, a - add a - add e - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - ret - -.down - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $5 - jr nc, .wrap_around_down - inc [hl] - ret - -.wrap_around_down - ld [hl], $0 - ret - -.up - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - and a - jr z, .wrap_around_up - dec [hl] - ret - -.wrap_around_up - ld [hl], $5 - ret - -NamingScreen_PressedA_GetCursorCommand: ; 12185 (4:6185) - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - -ComposeMail_GetCursorPosition: ; 1218b (4:618b) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $5 - jr nz, .letter - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $3 - jr c, .case - cp $6 - jr c, .del - ld a, $3 - ret - -.case - ld a, $1 - ret - -.del - ld a, $2 - ret - -.letter - xor a - ret - -MailComposition_TryAddLastCharacter: ; 121ac (4:61ac) - ld a, [wNamingScreenLastCharacter] - jp MailComposition_TryAddCharacter - -; 121b2 (4:61b2) - -; unused - ld a, [wNamingScreenCurrNameLength] - and a - ret z - cp $11 - jr nz, .asm_121c3 - push hl - ld hl, wNamingScreenCurrNameLength - dec [hl] - dec [hl] - jr .asm_121c8 - -.asm_121c3 - push hl - ld hl, wNamingScreenCurrNameLength - dec [hl] - -.asm_121c8 - call NamingScreen_GetTextCursorPosition - ld c, [hl] - pop hl -.asm_121cd - ld a, [hli] - cp $ff - jp z, NamingScreen_AdvanceCursor_CheckEndOfString - cp c - jr z, .asm_121d9 - inc hl - jr .asm_121cd - -.asm_121d9 - ld a, [hl] - jp NamingScreen_LoadNextCharacter - -; 121dd - -INCLUDE "data/text/mail_input_chars.asm" - -; 122c1 diff --git a/engine/npc_movement.asm b/engine/npc_movement.asm deleted file mode 100755 index 5670935e8..000000000 --- a/engine/npc_movement.asm +++ /dev/null @@ -1,573 +0,0 @@ -Function6ec1: ; 6ec1 - - ld hl, OBJECT_PALETTE - add hl, bc - bit 5, [hl] - jr z, .not_bit_5 - - ld hl, OBJECT_FLAGS1 - add hl, bc - bit 4, [hl] ; lost, uncomment next line to fix -; jr nz, .resume - push hl - push bc - call Function6f2c - pop bc - pop hl - ret c - jr .resume - -.not_bit_5 - ld hl, OBJECT_FLAGS1 - add hl, bc - bit 4, [hl] - jr nz, .resume - push hl - push bc - call Function6f07 - pop bc - pop hl - ret c - -.resume - bit 6, [hl] - jr nz, .bit_6 - - push hl - push bc - call WillObjectBumpIntoSomeoneElse - pop bc - pop hl - ret c - -.bit_6 - bit 5, [hl] - jr nz, .bit_5 - push hl - call HasObjectReachedMovementLimit - pop hl - ret c - - push hl - call IsObjectMovingOffEdgeOfScreen - pop hl - ret c - -.bit_5 - and a - ret -; 6f07 - - -Function6f07: ; 6f07 - call Function6f5f - ret c - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - ld hl, OBJECT_PALETTE - add hl, bc - bit OAM_PRIORITY, [hl] - jp nz, Function6fa1 - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - ld d, a - call GetTileCollision - and a ; LANDTILE - jr z, Function6f3e - scf - ret -; 6f2c - -Function6f2c: ; 6f2c - call Function6f5f - ret c - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - call GetTileCollision - cp WATERTILE - jr z, Function6f3e - scf - ret -; 6f3e - -Function6f3e: ; 6f3e - ld hl, OBJECT_NEXT_TILE - add hl, bc - ld a, [hl] - call Function6f7f - ret nc - push af - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld a, [hl] - maskbits NUM_DIRECTIONS - ld e, a - ld d, 0 - ld hl, .data_6f5b - add hl, de - pop af - and [hl] - ret z - scf - ret -; 6f5b - -.data_6f5b - db DOWN_MASK, UP_MASK, RIGHT_MASK, LEFT_MASK -; 6f5f - -Function6f5f: ; 6f5f - ld hl, OBJECT_STANDING_TILE - add hl, bc - ld a, [hl] - call Function6f7f - ret nc - push af - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - maskbits NUM_DIRECTIONS - ld e, a - ld d, 0 - ld hl, .data_6f7b - add hl, de - pop af - and [hl] - ret z - scf - ret -; 6f7b - -.data_6f7b - db UP_MASK, DOWN_MASK, LEFT_MASK, RIGHT_MASK -; 6f7f - -Function6f7f: ; 6f7f - ld d, a - and $f0 - cp $b0 - jr z, .done - cp $c0 - jr z, .done - xor a - ret - -.done - ld a, d - and 7 - ld e, a - ld d, 0 - ld hl, .data_6f99 - add hl, de - ld a, [hl] - scf - ret -; 6f99 - -.data_6f99 - db 8, 4, 1, 2 - db 10, 6, 9, 5 -; 6fa1 - -Function6fa1: ; 6fa1 - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld a, [hl] - maskbits NUM_DIRECTIONS - jr z, .down - dec a - jr z, .up - dec a - jr z, .left - jr .right - -.down - inc e - push de - inc d - jr .continue - -.up - push de - inc d - jr .continue - -.left - push de - inc e - jr .continue - -.right - inc d - push de - inc e - -.continue - call GetCoordTile - call GetTileCollision - pop de - and a ; LANDTILE - jr nz, .not_land - call GetCoordTile - call GetTileCollision - and a ; LANDTILE - jr nz, .not_land - xor a - ret - -.not_land - scf - ret -; 6fd9 - - - -CheckFacingObject:: ; 6fd9 - - call GetFacingTileCoord - -; Double the distance for counter tiles. - call CheckCounterTile - jr nz, .asm_6ff1 - - ld a, [wPlayerStandingMapX] - sub d - cpl - inc a - add d - ld d, a - - ld a, [wPlayerStandingMapY] - sub e - cpl - inc a - add e - ld e, a - -.asm_6ff1 - ld bc, wObjectStructs ; redundant - ld a, 0 - ld [hMapObjectIndexBuffer], a - call IsNPCAtCoord - ret nc - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld a, [hl] - cp STANDING - jr z, .standing - xor a - ret - -.standing - scf - ret -; 7009 - - -WillObjectBumpIntoSomeoneElse: ; 7009 - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - jr IsNPCAtCoord -; 7015 - -Unreferenced_Function7015: - ld a, [hMapObjectIndexBuffer] - call GetObjectStruct - call .CheckWillBeFacingNPC - call IsNPCAtCoord - ret - -.CheckWillBeFacingNPC: ; 7021 - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - call GetSpriteDirection - and a - jr z, .down - cp OW_UP - jr z, .up - cp OW_LEFT - jr z, .left - inc d - ret - -.down - inc e - ret - -.up - dec e - ret - -.left - dec d - ret -; 7041 - -IsNPCAtCoord: ; 7041 - ld bc, wObjectStructs - xor a -.loop - ld [hObjectStructIndexBuffer], a - call DoesObjectHaveASprite - jr z, .next - - ld hl, OBJECT_FLAGS1 - add hl, bc - bit 7, [hl] - jr nz, .next - - ld hl, OBJECT_PALETTE - add hl, bc - bit 7, [hl] - jr z, .got - - call Function7171 - jr nc, .ok - jr .ok2 - -.got - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [hl] - cp d - jr nz, .ok - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld a, [hl] - cp e - jr nz, .ok - -.ok2 - ld a, [hMapObjectIndexBuffer] - ld l, a - ld a, [hObjectStructIndexBuffer] - cp l - jr nz, .setcarry - -.ok - ld hl, OBJECT_MAP_X - add hl, bc - ld a, [hl] - cp d - jr nz, .next - ld hl, OBJECT_MAP_Y - add hl, bc - ld a, [hl] - cp e - jr nz, .next - ld a, [hMapObjectIndexBuffer] - ld l, a - ld a, [hObjectStructIndexBuffer] - cp l - jr nz, .setcarry - -.next - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - ld a, [hObjectStructIndexBuffer] - inc a - cp NUM_OBJECT_STRUCTS - jr nz, .loop - and a - ret - -.setcarry - scf - ret -; 70a4 - -HasObjectReachedMovementLimit: ; 70a4 - ld hl, OBJECT_RADIUS - add hl, bc - ld a, [hl] - and a - jr z, .nope - and $f - jr z, .check_y - ld e, a - ld d, a - ld hl, OBJECT_INIT_X - add hl, bc - ld a, [hl] - sub d - ld d, a - ld a, [hl] - add e - ld e, a - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [hl] - cp d - jr z, .yes - cp e - jr z, .yes - -.check_y - ld hl, OBJECT_RADIUS - add hl, bc - ld a, [hl] - swap a - and $f - jr z, .nope - ld e, a - ld d, a - ld hl, OBJECT_INIT_Y - add hl, bc - ld a, [hl] - sub d - ld d, a - ld a, [hl] - add e - ld e, a - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld a, [hl] - cp d - jr z, .yes - cp e - jr z, .yes - -.nope - xor a - ret - -.yes - scf - ret -; 70ed - -IsObjectMovingOffEdgeOfScreen: ; 70ed - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [wXCoord] - cp [hl] - jr z, .check_y - jr nc, .yes - add $9 - cp [hl] - jr c, .yes - -.check_y - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld a, [wYCoord] - cp [hl] - jr z, .nope - jr nc, .yes - add $8 - cp [hl] - jr c, .yes - -.nope - and a - ret - -.yes - scf - ret -; 7113 - -Unreferenced_Function7113: - ld a, [wPlayerStandingMapX] - ld d, a - ld a, [wPlayerStandingMapY] - ld e, a - ld bc, wObjectStructs - xor a -.loop - ld [hObjectStructIndexBuffer], a - call DoesObjectHaveASprite - jr z, .next - ld hl, OBJECT_MOVEMENTTYPE - add hl, bc - ld a, [hl] - cp SPRITEMOVEDATA_BIGDOLLSYM - jr nz, .not_snorlax - call Function7171 - jr c, .yes - jr .next - -.not_snorlax - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld a, [hl] - cp e - jr nz, .check_current_coords - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [hl] - cp d - jr nz, .check_current_coords - ld a, [hObjectStructIndexBuffer] - cp $0 - jr z, .next - jr .yes - -.check_current_coords - ld hl, OBJECT_MAP_Y - add hl, bc - ld a, [hl] - cp e - jr nz, .next - ld hl, OBJECT_MAP_X - add hl, bc - ld a, [hl] - cp d - jr nz, .next - jr .yes - -.next - ld hl, OBJECT_STRUCT_LENGTH - add hl, bc - ld b, h - ld c, l - ld a, [hObjectStructIndexBuffer] - inc a - cp NUM_OBJECT_STRUCTS - jr nz, .loop - xor a - ret - -.yes - scf - ret -; 7171 - - -Function7171: ; 7171 - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, d - sub [hl] - jr c, .nope - cp $2 - jr nc, .nope - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld a, e - sub [hl] - jr c, .nope - cp $2 - jr nc, .nope - scf - ret - -.nope - and a - ret -; 718d diff --git a/engine/options_menu.asm b/engine/options_menu.asm deleted file mode 100755 index c0a255cb0..000000000 --- a/engine/options_menu.asm +++ /dev/null @@ -1,583 +0,0 @@ -_OptionsMenu: ; e41d0 - ld hl, hInMenu - ld a, [hl] - push af - ld [hl], $1 - call ClearBGPalettes - hlcoord 0, 0 - ld b, 16 - ld c, 18 - call TextBox - hlcoord 2, 2 - ld de, StringOptions - call PlaceString - xor a - ld [wJumptableIndex], a - ld c, $6 ; number of items on the menu minus 1 (for cancel) - -.print_text_loop ; this next will display the settings of each option when the menu is opened - push bc - xor a - ld [hJoyLast], a - call GetOptionPointer - pop bc - ld hl, wJumptableIndex - inc [hl] - dec c - jr nz, .print_text_loop - - call UpdateFrame - xor a - ld [wJumptableIndex], a - inc a - ld [hBGMapMode], a - call WaitBGMap - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - -.joypad_loop - call JoyTextDelay - ld a, [hJoyPressed] - and START | B_BUTTON - jr nz, .ExitOptions - call OptionsControl - jr c, .dpad - call GetOptionPointer - jr c, .ExitOptions - -.dpad - call Options_UpdateCursorPosition - ld c, 3 - call DelayFrames - jr .joypad_loop - -.ExitOptions: - ld de, SFX_TRANSACTION - call PlaySFX - call WaitSFX - pop af - ld [hInMenu], a - ret -; e4241 - -StringOptions: ; e4241 - db "TEXT SPEED" - db " :" - db "BATTLE SCENE" - db " :" - db "BATTLE STYLE" - db " :" - db "SOUND" - db " :" - db "PRINT" - db " :" - db "MENU ACCOUNT" - db " :" - db "FRAME" - db " :TYPE" - db "CANCEL@" -; e42d6 - - -GetOptionPointer: ; e42d6 - ld a, [wJumptableIndex] ; load the cursor position to a - ld e, a ; copy it to de - ld d, 0 - ld hl, .Pointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl ; jump to the code of the current highlighted item -; e42e5 - -.Pointers: - dw Options_TextSpeed - dw Options_BattleScene - dw Options_BattleStyle - dw Options_Sound - dw Options_Print - dw Options_MenuAccount - dw Options_Frame - dw Options_Cancel -; e42f5 - - - const_def - const OPT_TEXT_SPEED_FAST ; 0 - const OPT_TEXT_SPEED_MED ; 1 - const OPT_TEXT_SPEED_SLOW ; 2 - -Options_TextSpeed: ; e42f5 - call GetTextSpeed - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - ld a, c ; right pressed - cp OPT_TEXT_SPEED_SLOW - jr c, .Increase - ld c, OPT_TEXT_SPEED_FAST + -1 - -.Increase: - inc c - ld a, e - jr .Save - -.LeftPressed: - ld a, c - and a - jr nz, .Decrease - ld c, OPT_TEXT_SPEED_SLOW + 1 - -.Decrease: - dec c - ld a, d - -.Save: - ld b, a - ld a, [wOptions] - and $f0 - or b - ld [wOptions], a - -.NonePressed: - ld b, 0 - ld hl, .Strings - add hl, bc - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 11, 3 - call PlaceString - and a - ret -; e4331 - -.Strings: -; entries correspond to OPT_TEXT_SPEED_* constants - dw .Fast - dw .Mid - dw .Slow - -.Fast: db "FAST@" -.Mid: db "MID @" -.Slow: db "SLOW@" -; e4346 - - -GetTextSpeed: ; e4346 -; converts TEXT_DELAY_* value in a to OPT_TEXT_SPEED_* value in c, -; with previous/next TEXT_DELAY_* values in d/e - ld a, [wOptions] - and $7 - cp TEXT_DELAY_SLOW - jr z, .slow - cp TEXT_DELAY_FAST - jr z, .fast - ; none of the above - ld c, OPT_TEXT_SPEED_MED - lb de, TEXT_DELAY_FAST, TEXT_DELAY_SLOW - ret - -.slow - ld c, OPT_TEXT_SPEED_SLOW - lb de, TEXT_DELAY_MED, TEXT_DELAY_FAST - ret - -.fast - ld c, OPT_TEXT_SPEED_FAST - lb de, TEXT_DELAY_SLOW, TEXT_DELAY_MED - ret -; e4365 - - -Options_BattleScene: ; e4365 - ld hl, wOptions - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - bit BATTLE_SCENE, [hl] - jr nz, .ToggleOn - jr .ToggleOff - -.LeftPressed: - bit BATTLE_SCENE, [hl] - jr z, .ToggleOff - jr .ToggleOn - -.NonePressed: - bit BATTLE_SCENE, [hl] - jr z, .ToggleOn - jr .ToggleOff - -.ToggleOn: - res BATTLE_SCENE, [hl] - ld de, .On - jr .Display - -.ToggleOff: - set BATTLE_SCENE, [hl] - ld de, .Off - -.Display: - hlcoord 11, 5 - call PlaceString - and a - ret -; e4398 - -.On: db "ON @" -.Off: db "OFF@" -; e43a0 - - -Options_BattleStyle: ; e43a0 - ld hl, wOptions - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - bit BATTLE_SHIFT, [hl] - jr nz, .ToggleShift - jr .ToggleSet - -.LeftPressed: - bit BATTLE_SHIFT, [hl] - jr z, .ToggleSet - jr .ToggleShift - -.NonePressed: - bit BATTLE_SHIFT, [hl] - jr nz, .ToggleSet - -.ToggleShift: - res BATTLE_SHIFT, [hl] - ld de, .Shift - jr .Display - -.ToggleSet: - set BATTLE_SHIFT, [hl] - ld de, .Set - -.Display: - hlcoord 11, 7 - call PlaceString - and a - ret -; e43d1 - -.Shift: db "SHIFT@" -.Set: db "SET @" -; e43dd - - -Options_Sound: ; e43dd - ld hl, wOptions - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - bit STEREO, [hl] - jr nz, .SetMono - jr .SetStereo - -.LeftPressed: - bit STEREO, [hl] - jr z, .SetStereo - jr .SetMono - -.NonePressed: - bit STEREO, [hl] - jr nz, .ToggleStereo - jr .ToggleMono - -.SetMono: - res STEREO, [hl] - call RestartMapMusic - -.ToggleMono: - ld de, .Mono - jr .Display - -.SetStereo: - set STEREO, [hl] - call RestartMapMusic - -.ToggleStereo: - ld de, .Stereo - -.Display: - hlcoord 11, 9 - call PlaceString - and a - ret -; e4416 - -.Mono: db "MONO @" -.Stereo: db "STEREO@" -; e4424 - - - const_def - const OPT_PRINT_LIGHTEST ; 0 - const OPT_PRINT_LIGHTER ; 1 - const OPT_PRINT_NORMAL ; 2 - const OPT_PRINT_DARKER ; 3 - const OPT_PRINT_DARKEST ; 4 - -Options_Print: ; e4424 - call GetPrinterSetting - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - ld a, c - cp OPT_PRINT_DARKEST - jr c, .Increase - ld c, OPT_PRINT_LIGHTEST - 1 - -.Increase: - inc c - ld a, e - jr .Save - -.LeftPressed: - ld a, c - and a - jr nz, .Decrease - ld c, OPT_PRINT_DARKEST + 1 - -.Decrease: - dec c - ld a, d - -.Save: - ld b, a - ld [wGBPrinter], a - -.NonePressed: - ld b, $0 - ld hl, .Strings - add hl, bc - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 11, 11 - call PlaceString - and a - ret -; e445a - -.Strings: -; entries correspond to OPT_PRINT_* constants - dw .Lightest - dw .Lighter - dw .Normal - dw .Darker - dw .Darkest - -.Lightest: db "LIGHTEST@" -.Lighter: db "LIGHTER @" -.Normal: db "NORMAL @" -.Darker: db "DARKER @" -.Darkest: db "DARKEST @" -; e4491 - - -GetPrinterSetting: ; e4491 -; converts GBPRINTER_* value in a to OPT_PRINT_* value in c, -; with previous/next GBPRINTER_* values in d/e - ld a, [wGBPrinter] - and a - jr z, .IsLightest - cp GBPRINTER_LIGHTER - jr z, .IsLight - cp GBPRINTER_DARKER - jr z, .IsDark - cp GBPRINTER_DARKEST - jr z, .IsDarkest - ; none of the above - ld c, OPT_PRINT_NORMAL - lb de, GBPRINTER_LIGHTER, GBPRINTER_DARKER - ret - -.IsLightest: - ld c, OPT_PRINT_LIGHTEST - lb de, GBPRINTER_DARKEST, GBPRINTER_LIGHTER - ret - -.IsLight: - ld c, OPT_PRINT_LIGHTER - lb de, GBPRINTER_LIGHTEST, GBPRINTER_NORMAL - ret - -.IsDark: - ld c, OPT_PRINT_DARKER - lb de, GBPRINTER_NORMAL, GBPRINTER_DARKEST - ret - -.IsDarkest: - ld c, OPT_PRINT_DARKEST - lb de, GBPRINTER_DARKER, GBPRINTER_LIGHTEST - ret -; e44c1 - -Options_MenuAccount: ; e44c1 - ld hl, wOptions2 - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - bit MENU_ACCOUNT, [hl] - jr nz, .ToggleOff - jr .ToggleOn - -.LeftPressed: - bit MENU_ACCOUNT, [hl] - jr z, .ToggleOn - jr .ToggleOff - -.NonePressed: - bit MENU_ACCOUNT, [hl] - jr nz, .ToggleOn - -.ToggleOff: - res MENU_ACCOUNT, [hl] - ld de, .Off - jr .Display - -.ToggleOn: - set MENU_ACCOUNT, [hl] - ld de, .On - -.Display: - hlcoord 11, 13 - call PlaceString - and a - ret -; e44f2 - -.Off: db "OFF@" -.On: db "ON @" -; e44fa - - -Options_Frame: ; e44fa - ld hl, wTextBoxFrame - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr nz, .RightPressed - and a - ret - -.RightPressed: - ld a, [hl] - inc a - jr .Save - -.LeftPressed: - ld a, [hl] - dec a - -.Save: - and $7 - ld [hl], a -UpdateFrame: ; e4512 - ld a, [wTextBoxFrame] - hlcoord 16, 15 ; where on the screen the number is drawn - add "1" - ld [hl], a - call LoadFontsExtra - and a - ret -; e4520 - -Options_Cancel: ; e4520 - ld a, [hJoyPressed] - and A_BUTTON - jr nz, .Exit - and a - ret - -.Exit: - scf - ret -; e452a - -OptionsControl: ; e452a - ld hl, wJumptableIndex - ld a, [hJoyLast] - cp D_DOWN - jr z, .DownPressed - cp D_UP - jr z, .UpPressed - and a - ret - -.DownPressed: - ld a, [hl] ; load the cursor position to a - cp $7 ; maximum number of items in option menu - jr nz, .CheckFive - ld [hl], $0 - scf - ret - -.CheckFive: ; I have no idea why this exists... - cp $5 - jr nz, .Increase - ld [hl], $5 - -.Increase: - inc [hl] - scf - ret - -.UpPressed: - ld a, [hl] - cp $6 - jr nz, .NotSix - ld [hl], $5 ; Another thing where I'm not sure why it exists - scf - ret - -.NotSix: - and a - jr nz, .Decrease - ld [hl], $8 ; number of option items +1 - -.Decrease: - dec [hl] - scf - ret -; e455c - -Options_UpdateCursorPosition: ; e455c - hlcoord 1, 1 - ld de, SCREEN_WIDTH - ld c, $10 -.loop - ld [hl], " " - add hl, de - dec c - jr nz, .loop - hlcoord 1, 2 - ld bc, 2 * SCREEN_WIDTH - ld a, [wJumptableIndex] - call AddNTimes - ld [hl], "▶" - ret -; e4579 diff --git a/engine/overworld.asm b/engine/overworld.asm deleted file mode 100755 index 381c2d89f..000000000 --- a/engine/overworld.asm +++ /dev/null @@ -1,715 +0,0 @@ -GetEmote2bpp: ; 1412a - ld a, $1 - ld [rVBK], a - call Get2bpp - xor a - ld [rVBK], a - ret -; 14135 - -_ReplaceKrisSprite:: ; 14135 - call GetPlayerSprite - ld a, [wUsedSprites] - ld [hUsedSpriteIndex], a - ld a, [wUsedSprites + 1] - ld [hUsedSpriteTile], a - call GetUsedSprite - ret -; 14146 - -Function14146: ; mobile - ld hl, wSpriteFlags - ld a, [hl] - push af - res 7, [hl] - set 6, [hl] - call LoadUsedSpritesGFX - pop af - ld [wSpriteFlags], a - ret -; 14157 - -Function14157: ; mobile - ld hl, wSpriteFlags - ld a, [hl] - push af - set 7, [hl] - res 6, [hl] - call LoadUsedSpritesGFX - pop af - ld [wSpriteFlags], a - ret -; 14168 - -RefreshSprites:: ; 14168 - call .Refresh - call LoadUsedSpritesGFX - ret -; 1416f - -.Refresh: ; 1416f - xor a - ld bc, wUsedSpritesEnd - wUsedSprites - ld hl, wUsedSprites - call ByteFill - call GetPlayerSprite - call AddMapSprites - call LoadAndSortSprites - ret -; 14183 - -GetPlayerSprite: ; 14183 -; Get Chris or Kris's sprite. - ld hl, ChrisStateSprites - ld a, [wPlayerSpriteSetupFlags] - bit PLAYERSPRITESETUP_FEMALE_TO_MALE_F, a - jr nz, .go - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .go - ld hl, KrisStateSprites - -.go - ld a, [wPlayerState] - ld c, a -.loop - ld a, [hli] - cp c - jr z, .good - inc hl - cp -1 - jr nz, .loop - -; Any player state not in the array defaults to Chris's sprite. - xor a ; ld a, PLAYER_NORMAL - ld [wPlayerState], a - ld a, SPRITE_CHRIS - jr .finish - -.good - ld a, [hl] - -.finish - ld [wUsedSprites + 0], a - ld [wPlayerSprite], a - ld [wPlayerObjectSprite], a - ret - -INCLUDE "data/sprites/player_sprites.asm" - - -AddMapSprites: ; 141c9 - call GetMapEnvironment - call CheckOutdoorMap - jr z, .outdoor - call AddIndoorSprites - ret - -.outdoor - call AddOutdoorSprites - ret -; 141d9 - - -AddIndoorSprites: ; 141d9 - ld hl, wMap1ObjectSprite - ld a, 1 -.loop - push af - ld a, [hl] - call AddSpriteGFX - ld de, OBJECT_LENGTH - add hl, de - pop af - inc a - cp NUM_OBJECTS - jr nz, .loop - ret -; 141ee - - -AddOutdoorSprites: ; 141ee - ld a, [wMapGroup] - dec a - ld c, a - ld b, 0 - ld hl, OutdoorSprites - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld c, MAX_OUTDOOR_SPRITES -.loop - push bc - ld a, [hli] - call AddSpriteGFX - pop bc - dec c - jr nz, .loop - ret -; 14209 - - -LoadUsedSpritesGFX: ; 14209 - ld a, MAPCALLBACK_SPRITES - call RunMapCallback - call GetUsedSprites - call .LoadMiscTiles - ret -; 14215 - -.LoadMiscTiles: ; 14215 - ld a, [wSpriteFlags] - bit 6, a - ret nz - - ld c, EMOTE_SHADOW - farcall LoadEmote - call GetMapEnvironment - call CheckOutdoorMap - ld c, EMOTE_GRASS_RUSTLE - jr z, .outdoor - ld c, EMOTE_BOULDER_DUST -.outdoor - farcall LoadEmote - ret -; 14236 - - - -SafeGetSprite: ; 14236 - push hl - call GetSprite - pop hl - ret -; 1423c - -GetSprite: ; 1423c - call GetMonSprite - ret c - - ld hl, OverworldSprites + SPRITEDATA_ADDR - dec a - ld c, a - ld b, 0 - ld a, NUM_SPRITEDATA_FIELDS - call AddNTimes - ; load the address into de - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - ; load the length into c - ld a, [hli] - swap a - ld c, a - ; load the sprite bank into both b and h - ld b, [hl] - ld a, [hli] - ; load the sprite type into l - ld l, [hl] - ld h, a - ret -; 14259 - - -GetMonSprite: ; 14259 -; Return carry if a monster sprite was loaded. - - cp SPRITE_POKEMON - jr c, .Normal - cp SPRITE_DAY_CARE_MON_1 - jr z, .BreedMon1 - cp SPRITE_DAY_CARE_MON_2 - jr z, .BreedMon2 - cp SPRITE_VARS - jr nc, .Variable - jr .Icon - -.Normal: - and a - ret - -.Icon: - sub SPRITE_POKEMON - ld e, a - ld d, 0 - ld hl, SpriteMons - add hl, de - ld a, [hl] - jr .Mon - -.BreedMon1 - ld a, [wBreedMon1Species] - jr .Mon - -.BreedMon2 - ld a, [wBreedMon2Species] - -.Mon: - ld e, a - and a - jr z, .NoBreedmon - - farcall LoadOverworldMonIcon - - ld l, 1 - ld h, 0 - scf - ret - -.Variable: - sub SPRITE_VARS - ld e, a - ld d, 0 - ld hl, wVariableSprites - add hl, de - ld a, [hl] - and a - jp nz, GetMonSprite - -.NoBreedmon: - ld a, 1 - ld l, 1 - ld h, 0 - and a - ret -; 142a7 - - -_DoesSpriteHaveFacings:: ; 142a7 -; Checks to see whether we can apply a facing to a sprite. -; Returns carry unless the sprite is a Pokemon or a Still Sprite. - cp SPRITE_POKEMON - jr nc, .only_down - - push hl - push bc - ld hl, OverworldSprites + SPRITEDATA_TYPE - dec a - ld c, a - ld b, 0 - ld a, NUM_SPRITEDATA_FIELDS - call AddNTimes - ld a, [hl] - pop bc - pop hl - cp STILL_SPRITE - jr nz, .only_down - scf - ret - -.only_down - and a - ret -; 142c4 - - -_GetSpritePalette:: ; 142c4 - ld a, c - call GetMonSprite - jr c, .is_pokemon - - ld hl, OverworldSprites + SPRITEDATA_PALETTE - dec a - ld c, a - ld b, 0 - ld a, NUM_SPRITEDATA_FIELDS - call AddNTimes - ld c, [hl] - ret - -.is_pokemon - xor a - ld c, a - ret -; 142db - - -LoadAndSortSprites: ; 142db - call LoadSpriteGFX - call SortUsedSprites - call ArrangeUsedSprites - ret -; 142e5 - - -AddSpriteGFX: ; 142e5 -; Add any new sprite ids to a list of graphics to be loaded. -; Return carry if the list is full. - - push hl - push bc - ld b, a - ld hl, wUsedSprites + 2 - ld c, SPRITE_GFX_LIST_CAPACITY - 1 -.loop - ld a, [hl] - cp b - jr z, .exists - and a - jr z, .new - inc hl - inc hl - dec c - jr nz, .loop - - pop bc - pop hl - scf - ret - -.exists - pop bc - pop hl - and a - ret - -.new - ld [hl], b - pop bc - pop hl - and a - ret -; 14306 - - -LoadSpriteGFX: ; 14306 -; Bug: b is not preserved, so it's useless as a next count. -; Uncomment the lines below to fix. - - ld hl, wUsedSprites - ld b, SPRITE_GFX_LIST_CAPACITY -.loop - ld a, [hli] - and a - jr z, .done - push hl - call .LoadSprite - pop hl - ld [hli], a - dec b - jr nz, .loop - -.done - ret - -.LoadSprite: - ; push bc - call GetSprite - ; pop bc - ld a, l - ret -; 1431e - - -SortUsedSprites: ; 1431e -; Bubble-sort sprites by type. - -; Run backwards through wUsedSprites to find the last one. - - ld c, SPRITE_GFX_LIST_CAPACITY - ld de, wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2 -.FindLastSprite: - ld a, [de] - and a - jr nz, .FoundLastSprite - dec de - dec de - dec c - jr nz, .FindLastSprite -.FoundLastSprite: - dec c - jr z, .quit - -; If the length of the current sprite is -; higher than a later one, swap them. - - inc de - ld hl, wUsedSprites + 1 - -.CheckSprite: - push bc - push de - push hl - -.CheckFollowing: - ld a, [de] - cp [hl] - jr nc, .loop - -; Swap the two sprites. - - ld b, a - ld a, [hl] - ld [hl], b - ld [de], a - dec de - dec hl - ld a, [de] - ld b, a - ld a, [hl] - ld [hl], b - ld [de], a - inc de - inc hl - -; Keep doing this until everything's in order. - -.loop - dec de - dec de - dec c - jr nz, .CheckFollowing - - pop hl - inc hl - inc hl - pop de - pop bc - dec c - jr nz, .CheckSprite - -.quit - ret -; 14355 - - -ArrangeUsedSprites: ; 14355 -; Get the length of each sprite and space them out in VRAM. -; Crystal introduces a second table in VRAM bank 0. - - ld hl, wUsedSprites - ld c, SPRITE_GFX_LIST_CAPACITY - ld b, 0 -.FirstTableLength: -; Keep going until the end of the list. - ld a, [hli] - and a - jr z, .quit - - ld a, [hl] - call GetSpriteLength - -; Spill over into the second table after $80 tiles. - add b - cp $80 - jr z, .loop - jr nc, .SecondTable - -.loop - ld [hl], b - inc hl - ld b, a - -; Assumes the next table will be reached before c hits 0. - dec c - jr nz, .FirstTableLength - -.SecondTable: -; The second tile table starts at tile $80. - ld b, $80 - dec hl -.SecondTableLength: -; Keep going until the end of the list. - ld a, [hli] - and a - jr z, .quit - - ld a, [hl] - call GetSpriteLength - -; There are only two tables, so don't go any further than that. - add b - jr c, .quit - - ld [hl], b - ld b, a - inc hl - - dec c - jr nz, .SecondTableLength - -.quit - ret -; 14386 - - -GetSpriteLength: ; 14386 -; Return the length of sprite type a in tiles. - - cp WALKING_SPRITE - jr z, .AnyDirection - cp STANDING_SPRITE - jr z, .AnyDirection - cp STILL_SPRITE - jr z, .OneDirection - - ld a, 12 - ret - -.AnyDirection: - ld a, 12 - ret - -.OneDirection: - ld a, 4 - ret -; 1439b - - -GetUsedSprites: ; 1439b - ld hl, wUsedSprites - ld c, SPRITE_GFX_LIST_CAPACITY - -.loop - ld a, [wSpriteFlags] - res 5, a - ld [wSpriteFlags], a - - ld a, [hli] - and a - jr z, .done - ld [hUsedSpriteIndex], a - - ld a, [hli] - ld [hUsedSpriteTile], a - - bit 7, a - jr z, .dont_set - - ld a, [wSpriteFlags] - set 5, a ; load VBank0 - ld [wSpriteFlags], a - -.dont_set - push bc - push hl - call GetUsedSprite - pop hl - pop bc - dec c - jr nz, .loop - -.done - ret -; 143c8 - -GetUsedSprite: ; 143c8 - ld a, [hUsedSpriteIndex] - call SafeGetSprite - ld a, [hUsedSpriteTile] - call .GetTileAddr - push hl - push de - push bc - ld a, [wSpriteFlags] - bit 7, a - jr nz, .skip - call .CopyToVram - -.skip - pop bc - ld l, c - ld h, $0 -rept 4 - add hl, hl -endr - pop de - add hl, de - ld d, h - ld e, l - pop hl - - ld a, [wSpriteFlags] - bit 5, a - jr nz, .done - bit 6, a - jr nz, .done - - ld a, [hUsedSpriteIndex] - call _DoesSpriteHaveFacings - jr c, .done - - ld a, h - add $8 - ld h, a - call .CopyToVram - -.done - ret -; 14406 - -.GetTileAddr: ; 14406 -; Return the address of tile (a) in (hl). - and $7f - ld l, a - ld h, 0 -rept 4 - add hl, hl -endr - ld a, l - add LOW(vTiles0) - ld l, a - ld a, h - adc HIGH(vTiles0) - ld h, a - ret -; 14418 - -.CopyToVram: ; 14418 - ld a, [rVBK] - push af - ld a, [wSpriteFlags] - bit 5, a - ld a, $1 - jr z, .bankswitch - ld a, $0 - -.bankswitch - ld [rVBK], a - call Get2bpp - pop af - ld [rVBK], a - ret -; 1442f - -LoadEmote:: ; 1442f -; Get the address of the pointer to emote c. - ld a, c - ld bc, 6 ; sizeof(emote) - ld hl, Emotes - call AddNTimes -; Load the emote address into de - ld e, [hl] - inc hl - ld d, [hl] -; load the length of the emote (in tiles) into c - inc hl - ld c, [hl] - swap c -; load the emote pointer bank into b - inc hl - ld b, [hl] -; load the VRAM destination into hl - inc hl - ld a, [hli] - ld h, [hl] - ld l, a -; if the emote has a length of 0, do not proceed (error handling) - ld a, c - and a - ret z - call GetEmote2bpp - ret -; 1444d - - -INCLUDE "data/sprites/emotes.asm" - -INCLUDE "data/sprites/sprite_mons.asm" - -INCLUDE "data/maps/outdoor_sprites.asm" - -INCLUDE "data/sprites/sprites.asm" diff --git a/engine/overworld/decorations.asm b/engine/overworld/decorations.asm new file mode 100755 index 000000000..33d0ca0cd --- /dev/null +++ b/engine/overworld/decorations.asm @@ -0,0 +1,1303 @@ +InitDecorations: ; 26751 (9:6751) + ld a, DECO_FEATHERY_BED + ld [wDecoBed], a + ld a, DECO_TOWN_MAP + ld [wDecoPoster], a + ret + +_PlayerDecorationMenu: ; 0x2675c + ld a, [wWhichIndexSet] + push af + ld hl, .MenuHeader + call LoadMenuHeader + xor a + ld [wBuffer5], a + ld a, $1 + ld [wBuffer6], a +.top_loop + ld a, [wBuffer6] + ld [wMenuCursorBuffer], a + call .FindCategoriesWithOwnedDecos + call DoNthMenu + ld a, [wMenuCursorY] + ld [wBuffer6], a + jr c, .exit_menu + ld a, [wMenuSelection] + ld hl, .pointers + call MenuJumptable + jr nc, .top_loop + +.exit_menu + call ExitMenu + pop af + ld [wWhichIndexSet], a + ld a, [wBuffer5] + ld c, a + ret +; 0x2679a + +.MenuHeader: ; 0x2679a + db MENU_BACKUP_TILES ; flags + menu_coords 5, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option +; 0x267a2 + +.MenuData: ; 0x267a2 + db STATICMENU_CURSOR | STATICMENU_WRAP ; flags + db 0 ; items + dw wd002 + dw PlaceNthMenuStrings + dw .pointers +; 0x267aa + +.pointers ; 267aa + dw DecoBedMenu, .bed + dw DecoCarpetMenu, .carpet + dw DecoPlantMenu, .plant + dw DecoPosterMenu, .poster + dw DecoConsoleMenu, .game + dw DecoOrnamentMenu, .ornament + dw DecoBigDollMenu, .big_doll + dw DecoExitMenu, .exit + +.bed db "BED@" +.carpet db "CARPET@" +.plant db "PLANT@" +.poster db "POSTER@" +.game db "GAME CONSOLE@" +.ornament db "ORNAMENT@" +.big_doll db "BIG DOLL@" +.exit db "EXIT@" +; 26806 + +.FindCategoriesWithOwnedDecos: ; 26806 + xor a + ld [wWhichIndexSet], a + call .ClearStringBuffer2 + call .FindOwndDecos + ld a, 7 + call .AppendToStringBuffer2 + ld hl, wStringBuffer2 + ld de, wd002 + ld bc, ITEM_NAME_LENGTH + call CopyBytes + ret + +.ClearStringBuffer2: ; 26822 (9:6822) + ld hl, wStringBuffer2 + xor a + ld [hli], a + ld bc, ITEM_NAME_LENGTH - 1 + ld a, -1 + call ByteFill + ret + +.AppendToStringBuffer2: ; 26830 (9:6830) + ld hl, wStringBuffer2 + inc [hl] + ld e, [hl] + ld d, 0 + add hl, de + ld [hl], a + ret + +.FindOwndDecos: ; 2683a (9:683a) + ld hl, .dw +.loop + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + or e + jr z, .done + push hl + call _de_ + pop hl + jr nc, .next + ld a, [hl] + push hl + call .AppendToStringBuffer2 + pop hl +.next + inc hl + jr .loop +.done + ret +; 26855 (9:6855) + +.dw ; 26855 + dwb FindOwnedBeds, 0 ; bed + dwb FindOwnedCarpets, 1 ; carpet + dwb FindOwnedPlants, 2 ; plant + dwb FindOwnedPosters, 3 ; poster + dwb FindOwnedConsoles, 4 ; game console + dwb FindOwnedOrnaments, 5 ; ornament + dwb FindOwnedBigDolls, 6 ; big doll + dw 0 ; end +; 2686c + +Deco_FillTempWithMinusOne: ; 2686c + xor a + ld hl, wd002 + ld [hli], a + ld a, -1 + ld bc, $10 + call ByteFill + ret +; 2687a + +CheckAllDecorationFlags: ; 2687a +.loop + ld a, [hli] + cp -1 + jr z, .done + push hl + push af + ld b, CHECK_FLAG + call DecorationFlagAction + ld a, c + and a + pop bc + ld a, b + call nz, AppendDecoIndex + pop hl + jr .loop + +.done + ret +; 26891 + +AppendDecoIndex: ; 26891 + ld hl, wd002 + inc [hl] + ld e, [hl] + ld d, $0 + add hl, de + ld [hl], a + ret +; 2689b + +FindOwnedDecosInCategory: ; 2689b + push bc + push hl + call Deco_FillTempWithMinusOne + pop hl + call CheckAllDecorationFlags + pop bc + ld a, [wd002] + and a + ret z + + ld a, c + call AppendDecoIndex + ld a, 0 + call AppendDecoIndex + scf + ret +; 268b5 + +DecoBedMenu: ; 268b5 + call FindOwnedBeds + call PopulateDecoCategoryMenu + xor a + ret +; 268bd + +FindOwnedBeds: ; 268bd + ld hl, .beds + ld c, BEDS + jp FindOwnedDecosInCategory +; 268c5 + +.beds ; 268c5 + db DECO_FEATHERY_BED ; 2 + db DECO_PINK_BED ; 3 + db DECO_POLKADOT_BED ; 4 + db DECO_PIKACHU_BED ; 5 + db -1 +; 268ca + +DecoCarpetMenu: ; 268ca + call FindOwnedCarpets + call PopulateDecoCategoryMenu + xor a + ret +; 268d2 + +FindOwnedCarpets: ; 268d2 + ld hl, .carpets + ld c, CARPETS + jp FindOwnedDecosInCategory +; 268da + +.carpets ; 268da + db DECO_RED_CARPET ; 7 + db DECO_BLUE_CARPET ; 8 + db DECO_YELLOW_CARPET ; 9 + db DECO_GREEN_CARPET ; a + db -1 +; 268df + +DecoPlantMenu: ; 268df + call FindOwnedPlants + call PopulateDecoCategoryMenu + xor a + ret +; 268e7 + +FindOwnedPlants: ; 268e7 + ld hl, .plants + ld c, PLANTS + jp FindOwnedDecosInCategory +; 268ef + +.plants ; 268ef + db DECO_MAGNAPLANT ; c + db DECO_TROPICPLANT ; d + db DECO_JUMBOPLANT ; e + db -1 +; 268f3 + +DecoPosterMenu: ; 268f3 + call FindOwnedPosters + call PopulateDecoCategoryMenu + xor a + ret +; 268fb + +FindOwnedPosters: ; 268fb + ld hl, .posters + ld c, POSTERS + jp FindOwnedDecosInCategory +; 26903 + +.posters ; 26903 + db DECO_TOWN_MAP ; 10 + db DECO_PIKACHU_POSTER ; 11 + db DECO_CLEFAIRY_POSTER ; 12 + db DECO_JIGGLYPUFF_POSTER ; 13 + db -1 +; 26908 + +DecoConsoleMenu: ; 26908 + call FindOwnedConsoles + call PopulateDecoCategoryMenu + xor a + ret +; 26910 + +FindOwnedConsoles: ; 26910 + ld hl, .consoles + ld c, CONSOLES + jp FindOwnedDecosInCategory +; 26918 + +.consoles ; 26918 + db DECO_FAMICOM ; 15 + db DECO_SNES ; 16 + db DECO_N64 ; 17 + db DECO_VIRTUAL_BOY ; 18 + db -1 +; 2691d + +DecoOrnamentMenu: ; 2691d + call FindOwnedOrnaments + call PopulateDecoCategoryMenu + xor a + ret +; 26925 + +FindOwnedOrnaments: ; 26925 + ld hl, .ornaments + ld c, DOLLS + jp FindOwnedDecosInCategory +; 2692d + +.ornaments ; 2692d + db DECO_PIKACHU_DOLL ; 1e + db DECO_SURF_PIKACHU_DOLL ; 1f + db DECO_CLEFAIRY_DOLL ; 20 + db DECO_JIGGLYPUFF_DOLL ; 21 + db DECO_BULBASAUR_DOLL ; 22 + db DECO_CHARMANDER_DOLL ; 23 + db DECO_SQUIRTLE_DOLL ; 24 + db DECO_POLIWAG_DOLL ; 25 + db DECO_DIGLETT_DOLL ; 26 + db DECO_STARMIE_DOLL ; 27 + db DECO_MAGIKARP_DOLL ; 28 + db DECO_ODDISH_DOLL ; 29 + db DECO_GENGAR_DOLL ; 2a + db DECO_SHELLDER_DOLL ; 2b + db DECO_GRIMER_DOLL ; 2c + db DECO_VOLTORB_DOLL ; 2d + db DECO_WEEDLE_DOLL ; 2e + db DECO_UNOWN_DOLL ; 2f + db DECO_GEODUDE_DOLL ; 30 + db DECO_MACHOP_DOLL ; 31 + db DECO_TENTACOOL_DOLL ; 32 + db DECO_GOLD_TROPHY_DOLL ; 33 + db DECO_SILVER_TROPHY_DOLL ; 34 + db -1 +; 26945 + +DecoBigDollMenu: ; 26945 + call FindOwnedBigDolls + call PopulateDecoCategoryMenu + xor a + ret +; 2694d + +FindOwnedBigDolls: ; 2694d + ld hl, .big_dolls + ld c, BIG_DOLLS + jp FindOwnedDecosInCategory +; 26955 + +.big_dolls ; 26955 + db DECO_BIG_SNORLAX_DOLL ; 1a + db DECO_BIG_ONIX_DOLL ; 1b + db DECO_BIG_LAPRAS_DOLL ; 1c + db -1 +; 26959 + +DecoExitMenu: ; 26959 + scf + ret +; 2695b + +PopulateDecoCategoryMenu: ; 2695b + ld a, [wd002] + and a + jr z, .empty + cp 8 + jr nc, .beyond_eight + xor a + ld [wWhichIndexSet], a + ld hl, .NonscrollingMenuHeader + call LoadMenuHeader + call DoNthMenu + jr c, .no_action_1 + call DoDecorationAction2 + +.no_action_1 + call ExitMenu + ret + +.beyond_eight + ld hl, wd002 + ld e, [hl] + dec [hl] + ld d, 0 + add hl, de + ld [hl], -1 + call LoadStandardMenuHeader + ld hl, .ScrollingMenuHeader + call CopyMenuHeader + xor a + ld [hBGMapMode], a + call InitScrollingMenu + xor a + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuJoypad] + cp 2 + jr z, .no_action_2 + call DoDecorationAction2 + +.no_action_2 + call ExitMenu + ret + +.empty + ld hl, .Text_nothing_to_choose + call MenuTextBoxBackup + ret +; 269b0 + +.Text_nothing_to_choose: ; 0x269b0 + ; There's nothing to choose. + text_jump UnknownText_0x1bc471 + db "@" +; 0x269b5 + +.NonscrollingMenuHeader: ; 0x269b5 + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .NonscrollingMenuData + db 1 ; default option +; 0x269bd + +.NonscrollingMenuData: ; 0x269bd + db STATICMENU_CURSOR | STATICMENU_WRAP ; flags + db 0 ; items + dw wd002 + dw DecorationMenuFunction + dw DecorationAttributes +; 0x269c5 + +.ScrollingMenuHeader: ; 0x269c5 + db MENU_BACKUP_TILES ; flags + menu_coords 1, 1, SCREEN_WIDTH - 2, SCREEN_HEIGHT - 2 + dw .ScrollingMenuData + db 1 ; default option +; 0x269cd + +.ScrollingMenuData: ; 0x269cd + db SCROLLINGMENU_DISPLAY_ARROWS ; flags + db 8, 0 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wd002 ; text pointer + dba DecorationMenuFunction + dbw 0, 0 + dbw 0, 0 +; 269dd + + +GetDecorationData: ; 269dd + ld hl, DecorationAttributes + ld bc, 6 + call AddNTimes + ret +; 269e7 + +GetDecorationName: ; 269e7 + push hl + call GetDecorationData + call GetDecoName + pop hl + call CopyName2 + ret +; 269f3 + +DecorationMenuFunction: ; 269f3 + ld a, [wMenuSelection] + push de + call GetDecorationData + call GetDecoName + pop hl + call PlaceString + ret +; 26a02 + +DoDecorationAction2: ; 26a02 + ld a, [wMenuSelection] + call GetDecorationData + ld de, 2 ; function 2 + add hl, de + ld a, [hl] + ld hl, .DecoActions + rst JumpTable + ret +; 26a12 + +.DecoActions: ; 26a12 + dw DecoAction_nothing + dw DecoAction_setupbed + dw DecoAction_putawaybed + dw DecoAction_setupcarpet + dw DecoAction_putawaycarpet + dw DecoAction_setupplant + dw DecoAction_putawayplant + dw DecoAction_setupposter + dw DecoAction_putawayposter + dw DecoAction_setupconsole + dw DecoAction_putawayconsole + dw DecoAction_setupbigdoll + dw DecoAction_putawaybigdoll + dw DecoAction_setupornament + dw DecoAction_putawayornament +; 26a30 + + +GetDecorationFlag: ; 26a30 + call GetDecorationData + ld de, 3 ; event flag + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a + ret +; 26a3b + +DecorationFlagAction: ; 26a3b + push bc + call GetDecorationFlag + pop bc + call EventFlagAction + ret +; 26a44 + +GetDecorationSprite: ; 26a44 + ld a, c + call GetDecorationData + ld de, 5 ; sprite + add hl, de + ld a, [hl] + ld c, a + ret +; 26a4f + +INCLUDE "data/decorations/attributes.asm" + +INCLUDE "data/decorations/names.asm" + +GetDecoName: ; 26c72 + ld a, [hli] + ld e, [hl] + ld bc, wStringBuffer2 + push bc + ld hl, .NameFunctions + rst JumpTable + pop de + ret +; 26c7e + +.NameFunctions: ; 26c7e + dw .invalid + dw .plant + dw .bed + dw .carpet + dw .poster + dw .doll + dw .bigdoll +; 26c8c + + +.invalid ; 26c8c + ret +; 26c8d + +.plant ; 26c8d + ld a, e + jr .getdeconame + +.bed ; 26c90 + call .plant + ld a, _BED + jr .getdeconame + +.carpet ; 26c97 + call .plant + ld a, _CARPET + jr .getdeconame + +.poster ; 26c9e + ld a, e + call .getpokename + ld a, _POSTER + jr .getdeconame + +.doll ; 26ca6 + ld a, e + call .getpokename + ld a, _DOLL + jr .getdeconame + +.bigdoll ; 26cae + push de + ld a, BIG_ + call .getdeconame + pop de + ld a, e + jr .getpokename + +.unused ; 26cb8 + push de + call .getdeconame + pop de + ld a, e + jr .getdeconame + +.getpokename ; 26cc0 + push bc + ld [wd265], a + call GetPokemonName + pop bc + jr .copy + +.getdeconame ; 26cca + call ._getdeconame + jr .copy + +._getdeconame ; 26ccf + push bc + ld hl, DecorationNames + call GetNthString + ld d, h + ld e, l + pop bc + ret + +.copy ; 26cda + ld h, b + ld l, c + call CopyName2 + dec hl + ld b, h + ld c, l + ret +; 26ce3 + +DecoAction_nothing: ; 26ce3 + scf + ret +; 26ce5 + +DecoAction_setupbed: ; 26ce5 + ld hl, wDecoBed + jp DecoAction_TrySetItUp +; 26ceb + +DecoAction_putawaybed: ; 26ceb + ld hl, wDecoBed + jp DecoAction_TryPutItAway +; 26cf1 + +DecoAction_setupcarpet: ; 26cf1 + ld hl, wDecoCarpet + jp DecoAction_TrySetItUp +; 26cf7 + +DecoAction_putawaycarpet: ; 26cf7 + ld hl, wDecoCarpet + jp DecoAction_TryPutItAway +; 26cfd + +DecoAction_setupplant: ; 26cfd + ld hl, wDecoPlant + jp DecoAction_TrySetItUp +; 26d03 + +DecoAction_putawayplant: ; 26d03 + ld hl, wDecoPlant + jp DecoAction_TryPutItAway +; 26d09 + +DecoAction_setupposter: ; 26d09 + ld hl, wDecoPoster + jp DecoAction_TrySetItUp +; 26d0f + +DecoAction_putawayposter: ; 26d0f + ld hl, wDecoPoster + jp DecoAction_TryPutItAway +; 26d15 + +DecoAction_setupconsole: ; 26d15 + ld hl, wDecoConsole + jp DecoAction_TrySetItUp +; 26d1b + +DecoAction_putawayconsole: ; 26d1b + ld hl, wDecoConsole + jp DecoAction_TryPutItAway +; 26d21 + +DecoAction_setupbigdoll: ; 26d21 + ld hl, wDecoBigDoll + jp DecoAction_TrySetItUp +; 26d27 + +DecoAction_putawaybigdoll: ; 26d27 + ld hl, wDecoBigDoll + jp DecoAction_TryPutItAway +; 26d2d + +DecoAction_TrySetItUp: ; 26d2d + ld a, [hl] + ld [wBuffer1], a + push hl + call DecoAction_SetItUp + jr c, .failed + ld a, 1 + ld [wBuffer5], a + pop hl + ld a, [wMenuSelection] + ld [hl], a + xor a + ret + +.failed + pop hl + xor a + ret +; 26d46 + +DecoAction_SetItUp: ; 26d46 +; See if there's anything of the same type already out + ld a, [wBuffer1] + and a + jr z, .nothingthere +; See if that item is already out + ld b, a + ld a, [wMenuSelection] + cp b + jr z, .alreadythere +; Put away the item that's already out, and set up the new one + ld a, [wMenuSelection] + ld hl, wStringBuffer4 + call GetDecorationName + ld a, [wBuffer1] + ld hl, wStringBuffer3 + call GetDecorationName + ld hl, DecoText_PutAwayAndSetUp + call MenuTextBoxBackup + xor a + ret + +.nothingthere + ld a, [wMenuSelection] + ld hl, wStringBuffer3 + call GetDecorationName + ld hl, DecoText_SetUpTheDeco + call MenuTextBoxBackup + xor a + ret + +.alreadythere + ld hl, DecoText_AlreadySetUp + call MenuTextBoxBackup + scf + ret +; 26d86 + +DecoAction_TryPutItAway: ; 26d86 +; If there is no item of that type already set, there is nothing to put away. + ld a, [hl] + ld [wBuffer1], a + xor a + ld [hl], a + ld a, [wBuffer1] + and a + jr z, .nothingthere +; Put it away. + ld a, $1 + ld [wBuffer5], a + ld a, [wBuffer1] + ld [wMenuSelection], a + ld hl, wStringBuffer3 + call GetDecorationName + ld hl, DecoText_PutAwayTheDeco + call MenuTextBoxBackup + xor a + ret + +.nothingthere + ld hl, DecoText_NothingToPutAway + call MenuTextBoxBackup + xor a + ret +; 26db3 + +DecoAction_setupornament: ; 26db3 + ld hl, UnknownText_0x26e41 + call DecoAction_AskWhichSide + jr c, .cancel + call DecoAction_SetItUp_Ornament + jr c, .cancel + ld a, $1 + ld [wBuffer5], a + jr DecoAction_FinishUp_Ornament + +.cancel + xor a + ret + +DecoAction_putawayornament: ; 26dc9 + ld hl, DecoText_WhichSide + call DecoAction_AskWhichSide + jr nc, .incave + xor a + ret + +.incave + call DecoAction_PutItAway_Ornament + +DecoAction_FinishUp_Ornament: ; 26dd6 + call QueryWhichSide + ld a, [wSelectedDecoration] + ld [hl], a + ld a, [wOtherDecoration] + ld [de], a + xor a + ret +; 26de3 + +DecoAction_SetItUp_Ornament: ; 26de3 + ld a, [wSelectedDecoration] + and a + jr z, .nothingthere + ld b, a + ld a, [wMenuSelection] + cp b + jr z, .failed + ld a, b + ld hl, wStringBuffer3 + call GetDecorationName + ld a, [wMenuSelection] + ld hl, wStringBuffer4 + call GetDecorationName + ld a, [wMenuSelection] + ld [wSelectedDecoration], a + call .getwhichside + ld hl, DecoText_PutAwayAndSetUp + call MenuTextBoxBackup + xor a + ret + +.nothingthere + ld a, [wMenuSelection] + ld [wSelectedDecoration], a + call .getwhichside + ld a, [wMenuSelection] + ld hl, wStringBuffer3 + call GetDecorationName + ld hl, DecoText_SetUpTheDeco + call MenuTextBoxBackup + xor a + ret + +.failed + ld hl, DecoText_AlreadySetUp + call MenuTextBoxBackup + scf + ret +; 26e33 + +.getwhichside ; 26e33 + ld a, [wMenuSelection] + ld b, a + ld a, [wOtherDecoration] + cp b + ret nz + xor a + ld [wOtherDecoration], a + ret +; 26e41 + +UnknownText_0x26e41: ; 0x26e41 + ; Which side do you want to put it on? + text_jump UnknownText_0x1bc48c + db "@" +; 0x26e46 + +DecoAction_PutItAway_Ornament: ; 26e46 + ld a, [wSelectedDecoration] + and a + jr z, .nothingthere + ld hl, wStringBuffer3 + call GetDecorationName + ld a, $1 + ld [wBuffer5], a + xor a + ld [wSelectedDecoration], a + ld hl, DecoText_PutAwayTheDeco + call MenuTextBoxBackup + xor a + ret + +.nothingthere + ld hl, DecoText_NothingToPutAway + call MenuTextBoxBackup + xor a + ret +; 26e6b + +DecoText_WhichSide: ; 0x26e6b + ; Which side do you want to put away? + text_jump UnknownText_0x1bc4b2 + db "@" +; 0x26e70 + +DecoAction_AskWhichSide: ; 26e70 + call MenuTextBox + ld hl, MenuHeader_0x26eab + call GetMenu2 + call ExitMenu + call CopyMenuData + jr c, .nope + ld a, [wMenuCursorY] + cp 3 + jr z, .nope + ld [wBuffer2], a + call QueryWhichSide + ld a, [hl] + ld [wSelectedDecoration], a + ld a, [de] + ld [wOtherDecoration], a + xor a + ret + +.nope + scf + ret +; 26e9a + +QueryWhichSide: ; 26e9a + ld hl, wDecoRightOrnament + ld de, wDecoLeftOrnament + ld a, [wBuffer2] + cp 1 + ret z + push hl + ld h, d + ld l, e + pop de + ret +; 26eab + +MenuHeader_0x26eab: ; 0x26eab + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 13, 7 + dw MenuData_0x26eb3 + db 1 ; default option +; 0x26eb3 + +MenuData_0x26eb3: ; 0x26eb3 + db STATICMENU_CURSOR ; flags + db 3 ; items + db "RIGHT SIDE@" + db "LEFT SIDE@" + db "CANCEL@" +; 0x26ed1 + +DecoText_PutAwayTheDeco: ; 0x26ed1 + ; Put away the @ . + text_jump UnknownText_0x1bc4d7 + db "@" +; 0x26ed6 + +DecoText_NothingToPutAway: ; 0x26ed6 + ; There's nothing to put away. + text_jump UnknownText_0x1bc4ec + db "@" +; 0x26edb + +DecoText_SetUpTheDeco: ; 0x26edb + ; Set up the @ . + text_jump UnknownText_0x1bc509 + db "@" +; 0x26ee0 + +DecoText_PutAwayAndSetUp: ; 0x26ee0 + ; Put away the @ and set up the @ . + text_jump UnknownText_0x1bc51c + db "@" +; 0x26ee5 + +DecoText_AlreadySetUp: ; 0x26ee5 + ; That's already set up. + text_jump UnknownText_0x1bc546 + db "@" +; 0x26eea + +GetDecorationName_c_de: ; 26eea + ld a, c + ld h, d + ld l, e + call GetDecorationName + ret +; 26ef1 + +DecorationFlagAction_c: ; 26ef1 + ld a, c + jp DecorationFlagAction +; 26ef5 + + +GetDecorationName_c: ; 26ef5 (9:6ef5) + ld a, c + call GetDecorationID + ld hl, wStringBuffer1 + push hl + call GetDecorationName + pop de + ret + + +SetSpecificDecorationFlag: ; 26f02 + ld a, c + call GetDecorationID + ld b, SET_FLAG + call DecorationFlagAction + ret +; 26f0c + +GetDecorationID: ; 26f0c + push hl + push de + ld e, a + ld d, 0 + ld hl, DecorationIDs + add hl, de + ld a, [hl] + pop de + pop hl + ret +; 26f19 + +SetAllDecorationFlags: ; 26f19 + ld hl, DecorationIDs +.loop + ld a, [hli] + cp -1 + jr z, .done + push hl + ld b, SET_FLAG + call DecorationFlagAction + pop hl + jr .loop + +.done + ret +; 26f2b + +INCLUDE "data/decorations/decorations.asm" + +DescribeDecoration:: ; 26f59 + ld a, b + ld hl, .JumpTable + rst JumpTable + ret +; 26f5f + +.JumpTable: ; 26f5f +; entries correspond to DECODESC_* constants + dw DecorationDesc_Poster + dw DecorationDesc_LeftOrnament + dw DecorationDesc_RightOrnament + dw DecorationDesc_GiantOrnament + dw DecorationDesc_Console +; 26f69 + +DecorationDesc_Poster: ; 26f69 + ld a, [wDecoPoster] + ld hl, DecorationDesc_PosterPointers + ld de, 3 + call IsInArray + jr c, .nope + ld de, DecorationDesc_NullPoster + ld b, BANK(DecorationDesc_NullPoster) + ret + +.nope + ld b, BANK(DecorationDesc_TownMapPoster) + inc hl + ld a, [hli] + ld d, [hl] + ld e, a + ret +; 26f84 + +DecorationDesc_PosterPointers: ; 26f84 + dbw DECO_TOWN_MAP, DecorationDesc_TownMapPoster + dbw DECO_PIKACHU_POSTER, DecorationDesc_PikachuPoster + dbw DECO_CLEFAIRY_POSTER, DecorationDesc_ClefairyPoster + dbw DECO_JIGGLYPUFF_POSTER, DecorationDesc_JigglypuffPoster + db -1 +; 26f91 + +DecorationDesc_TownMapPoster: ; 0x26f91 + opentext + writetext .TownMapText + waitbutton + special OverworldTownMap + closetext + end +; 0x26f9b + +.TownMapText: ; 0x26f9b + ; It's the TOWN MAP. + text_jump UnknownText_0x1bc55d + db "@" +; 0x26fa0 + +DecorationDesc_PikachuPoster: ; 0x26fa0 + jumptext .PikaPosterText +; 0x26fa3 + +.PikaPosterText: ; 0x26fa3 + ; It's a poster of a cute PIKACHU. + text_jump UnknownText_0x1bc570 + db "@" +; 0x26fa8 + +DecorationDesc_ClefairyPoster: ; 0x26fa8 + jumptext .ClefairyPosterText +; 0x26fab + +.ClefairyPosterText: ; 0x26fab + ; It's a poster of a cute CLEFAIRY. + text_jump UnknownText_0x1bc591 + db "@" +; 0x26fb0 + +DecorationDesc_JigglypuffPoster: ; 0x26fb0 + jumptext .JigglypuffPosterText +; 0x26fb3 + +.JigglypuffPosterText: ; 0x26fb3 + ; It's a poster of a cute JIGGLYPUFF. + text_jump UnknownText_0x1bc5b3 + db "@" +; 0x26fb8 + +DecorationDesc_NullPoster: ; 26fb8 + end +; 26fb9 + +DecorationDesc_LeftOrnament: ; 26fb9 + ld a, [wDecoLeftOrnament] + jr DecorationDesc_OrnamentOrConsole + +DecorationDesc_RightOrnament: ; 26fbe + ld a, [wDecoRightOrnament] + jr DecorationDesc_OrnamentOrConsole + +DecorationDesc_Console: ; 26fc3 + ld a, [wDecoConsole] + jr DecorationDesc_OrnamentOrConsole + +DecorationDesc_OrnamentOrConsole: ; 26fc8 + ld c, a + ld de, wStringBuffer3 + call GetDecorationName_c_de + ld b, BANK(.OrnamentConsoleScript) + ld de, .OrnamentConsoleScript + ret +; 26fd5 + +.OrnamentConsoleScript: ; 26fd5 + jumptext .OrnamentConsoleText +; 26fd8 + +.OrnamentConsoleText: ; 0x26fd8 + ; It's an adorable @ . + text_jump UnknownText_0x1bc5d7 + db "@" +; 0x26fdd + +DecorationDesc_GiantOrnament: ; 26fdd + ld b, BANK(.BigDollScript) + ld de, .BigDollScript + ret +; 26fe3 + +.BigDollScript: ; 26fe3 + jumptext .BigDollText +; 26fe6 + +.BigDollText: ; 0x26fe6 + ; A giant doll! It's fluffy and cuddly. + text_jump UnknownText_0x1bc5ef + db "@" +; 0x26feb + +ToggleMaptileDecorations: ; 26feb + lb de, 0, 4 + ld a, [wDecoBed] + call SetDecorationTile + lb de, 7, 4 + ld a, [wDecoPlant] + call SetDecorationTile + lb de, 6, 0 + ld a, [wDecoPoster] + call SetDecorationTile + call SetPosterVisibility + lb de, 0, 0 + call PadCoords_de + ld a, [wDecoCarpet] + and a + ret z + call _GetDecorationSprite + ld [hl], a + push af + lb de, 0, 2 + call PadCoords_de + pop af + inc a + ld [hli], a + inc a + ld [hli], a + dec a + ld [hl], a + ret +; 27027 + +SetPosterVisibility: ; 27027 + ld b, SET_FLAG + ld a, [wDecoPoster] + and a + jr nz, .ok + ld b, RESET_FLAG + +.ok + ld de, EVENT_PLAYERS_ROOM_POSTER + jp EventFlagAction +; 27037 + +SetDecorationTile: ; 27037 + push af + call PadCoords_de + pop af + and a + ret z + call _GetDecorationSprite + ld [hl], a + ret +; 27043 + +ToggleDecorationsVisibility: ; 27043 + ld de, EVENT_PLAYERS_HOUSE_2F_CONSOLE + ld hl, wVariableSprites + SPRITE_CONSOLE - SPRITE_VARS + ld a, [wDecoConsole] + call ToggleDecorationVisibility + ld de, EVENT_PLAYERS_HOUSE_2F_DOLL_1 + ld hl, wVariableSprites + SPRITE_DOLL_1 - SPRITE_VARS + ld a, [wDecoLeftOrnament] + call ToggleDecorationVisibility + ld de, EVENT_PLAYERS_HOUSE_2F_DOLL_2 + ld hl, wVariableSprites + SPRITE_DOLL_2 - SPRITE_VARS + ld a, [wDecoRightOrnament] + call ToggleDecorationVisibility + ld de, EVENT_PLAYERS_HOUSE_2F_BIG_DOLL + ld hl, wVariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS + ld a, [wDecoBigDoll] + call ToggleDecorationVisibility + ret +; 27074 + +ToggleDecorationVisibility: ; 27074 + and a + jr z, .hide + call _GetDecorationSprite + ld [hl], a + ld b, RESET_FLAG + jp EventFlagAction + +.hide + ld b, SET_FLAG + jp EventFlagAction +; 27085 + +_GetDecorationSprite: ; 27085 + ld c, a + push de + push hl + farcall GetDecorationSprite + pop hl + pop de + ld a, c + ret +; 27092 + +PadCoords_de: ; 27092 + ld a, d + add 4 + ld d, a + ld a, e + add 4 + ld e, a + call GetBlockLocation + ret diff --git a/engine/overworld/events.asm b/engine/overworld/events.asm new file mode 100644 index 000000000..cc2c8c574 --- /dev/null +++ b/engine/overworld/events.asm @@ -0,0 +1,1111 @@ +INCLUDE "constants.asm" + + +SECTION "Events", ROMX + +OverworldLoop:: ; 966b0 + xor a + ld [wMapStatus], a +.loop + ld a, [wMapStatus] + ld hl, .jumps + rst JumpTable + ld a, [wMapStatus] + cp 3 ; done + jr nz, .loop +.done + ret + +.jumps + dw StartMap + dw EnterMap + dw HandleMap + dw .done +; 966cb + +DisableEvents: ; 966cb + xor a + ld [wScriptFlags3], a + ret +; 966d0 + +EnableEvents:: ; 966d0 + ld a, $ff + ld [wScriptFlags3], a + ret +; 966d6 + +CheckBit5_ScriptFlags3: ; 966d6 + ld hl, wScriptFlags3 + bit 5, [hl] + ret +; 966dc + +DisableWarpsConnxns: ; 966dc + ld hl, wScriptFlags3 + res 2, [hl] + ret +; 966e2 + +DisableCoordEvents: ; 966e2 + ld hl, wScriptFlags3 + res 1, [hl] + ret +; 966e8 + +DisableStepCount: ; 966e8 + ld hl, wScriptFlags3 + res 0, [hl] + ret +; 966ee + +DisableWildEncounters: ; 966ee + ld hl, wScriptFlags3 + res 4, [hl] + ret +; 966f4 + +EnableWarpsConnxns: ; 966f4 + ld hl, wScriptFlags3 + set 2, [hl] + ret +; 966fa + +EnableCoordEvents: ; 966fa + ld hl, wScriptFlags3 + set 1, [hl] + ret +; 96700 + +EnableStepCount: ; 96700 + ld hl, wScriptFlags3 + set 0, [hl] + ret +; 96706 + +EnableWildEncounters: ; 96706 + ld hl, wScriptFlags3 + set 4, [hl] + ret +; 9670c + +CheckWarpConnxnScriptFlag: ; 9670c + ld hl, wScriptFlags3 + bit 2, [hl] + ret +; 96712 + +CheckCoordEventScriptFlag: ; 96712 + ld hl, wScriptFlags3 + bit 1, [hl] + ret +; 96718 + +CheckStepCountScriptFlag: ; 96718 + ld hl, wScriptFlags3 + bit 0, [hl] + ret +; 9671e + +CheckWildEncountersScriptFlag: ; 9671e + ld hl, wScriptFlags3 + bit 4, [hl] + ret +; 96724 + +StartMap: ; 96724 + xor a + ld [wScriptVar], a + xor a + ld [wScriptRunning], a + ld hl, wMapStatus + ld bc, wMapStatusEnd - wMapStatus + call ByteFill + farcall InitCallReceiveDelay + call ClearJoypad +EnterMap: ; 9673e + xor a + ld [wXYComparePointer], a + ld [wXYComparePointer + 1], a + call SetUpFiveStepWildEncounterCooldown + farcall RunMapSetupScript + call DisableEvents + + ld a, [hMapEntryMethod] + cp MAPSETUP_CONNECTION + jr nz, .dont_enable + call EnableEvents +.dont_enable + + ld a, [hMapEntryMethod] + cp MAPSETUP_RELOADMAP + jr nz, .dontresetpoison + xor a + ld [wPoisonStepCount], a +.dontresetpoison + + xor a ; end map entry + ld [hMapEntryMethod], a + ld a, 2 ; HandleMap + ld [wMapStatus], a + ret +; 9676d + +UnusedWait30Frames: ; 9676d + ld c, 30 + call DelayFrames + ret +; 96773 + +HandleMap: ; 96773 + call ResetOverworldDelay + call HandleMapTimeAndJoypad + farcall HandleCmdQueue ; no need to farcall + call MapEvents + +; Not immediately entering a connected map will cause problems. + ld a, [wMapStatus] + cp 2 ; HandleMap + ret nz + + call HandleMapObjects + call NextOverworldFrame + call HandleMapBackground + call CheckPlayerState + ret +; 96795 + +MapEvents: ; 96795 + ld a, [wMapEventStatus] + ld hl, .jumps + rst JumpTable + ret + +.jumps + dw .events + dw .no_events +; 967a1 + +.events ; 967a1 + call PlayerEvents + call DisableEvents + farcall ScriptEvents + ret +; 967ae + +.no_events ; 967ae + ret +; 967af + +MaxOverworldDelay: ; 967af + db 2 +; 967b0 + +ResetOverworldDelay: ; 967b0 + ld a, [MaxOverworldDelay] + ld [wOverworldDelay], a + ret +; 967b7 + +NextOverworldFrame: ; 967b7 + ld a, [wOverworldDelay] + and a + ret z + ld c, a + call DelayFrames + ret +; 967c1 + +HandleMapTimeAndJoypad: ; 967c1 + ld a, [wMapEventStatus] + cp 1 ; no events + ret z + + call UpdateTime + call GetJoypad + call TimeOfDayPals + ret +; 967d1 + +HandleMapObjects: ; 967d1 + farcall HandleNPCStep ; engine/map_objects.asm + farcall _HandlePlayerStep + call _CheckObjectEnteringVisibleRange + ret +; 967e1 + +HandleMapBackground: ; 967e1 + farcall _UpdateSprites + farcall ScrollScreen + farcall PlaceMapNameSign + ret +; 967f4 + +CheckPlayerState: ; 967f4 + ld a, [wPlayerStepFlags] + bit 5, a ; in the middle of step + jr z, .events + bit 6, a ; stopping step + jr z, .noevents + bit 4, a ; in midair + jr nz, .noevents + call EnableEvents +.events + ld a, 0 ; events + ld [wMapEventStatus], a + ret + +.noevents + ld a, 1 ; no events + ld [wMapEventStatus], a + ret +; 96812 + +_CheckObjectEnteringVisibleRange: ; 96812 + ld hl, wPlayerStepFlags + bit 6, [hl] + ret z + farcall CheckObjectEnteringVisibleRange + ret +; 9681f + +PlayerEvents: ; 9681f + xor a +; If there's already a player event, don't interrupt it. + ld a, [wScriptRunning] + and a + ret nz + + call Dummy_CheckScriptFlags3Bit5 ; This is a waste of time + + call CheckTrainerBattle3 + jr c, .ok + + call CheckTileEvent + jr c, .ok + + call RunMemScript + jr c, .ok + + call RunSceneScript + jr c, .ok + + call CheckTimeEvents + jr c, .ok + + call OWPlayerInput + jr c, .ok + + xor a + ret + +.ok + push af + farcall EnableScriptMode + pop af + + ld [wScriptRunning], a + call DoPlayerEvent + ld a, [wScriptRunning] + cp PLAYEREVENT_CONNECTION + jr z, .ok2 + cp PLAYEREVENT_JOYCHANGEFACING + jr z, .ok2 + + xor a + ld [wLandmarkSignTimer], a + +.ok2 + scf + ret +; 96867 + +CheckTrainerBattle3: ; 96867 + nop + nop + call CheckTrainerBattle2 + jr nc, .nope + + ld a, PLAYEREVENT_SEENBYTRAINER + scf + ret + +.nope + xor a + ret +; 96874 + +CheckTileEvent: ; 96874 +; Check for warps, coord events, or wild battles. + + call CheckWarpConnxnScriptFlag + jr z, .connections_disabled + + farcall CheckMovingOffEdgeOfMap + jr c, .map_connection + + call CheckWarpTile + jr c, .warp_tile + +.connections_disabled + call CheckCoordEventScriptFlag + jr z, .coord_events_disabled + + call CheckCurrentMapCoordEvents + jr c, .coord_event + +.coord_events_disabled + call CheckStepCountScriptFlag + jr z, .step_count_disabled + + call CountStep + ret c + +.step_count_disabled + call CheckWildEncountersScriptFlag + jr z, .ok + + call RandomEncounter + ret c + jr .ok ; pointless + +.ok + xor a + ret + +.map_connection + ld a, PLAYEREVENT_CONNECTION + scf + ret + +.warp_tile + ld a, [wPlayerStandingTile] + call CheckPitTile + jr nz, .not_pit + ld a, PLAYEREVENT_FALL + scf + ret + +.not_pit + ld a, PLAYEREVENT_WARP + scf + ret + +.coord_event + ld hl, wCurCoordEventScriptAddr + ld a, [hli] + ld h, [hl] + ld l, a + call GetMapScriptsBank + call CallScript + ret +; 968c7 + +CheckWildEncounterCooldown:: ; 968c7 + ld hl, wWildEncounterCooldown + ld a, [hl] + and a + ret z + dec [hl] + ret z + scf + ret +; 968d1 + +SetUpFiveStepWildEncounterCooldown: ; 968d1 + ld a, 5 + ld [wWildEncounterCooldown], a + ret +; 968d7 + +ret_968d7: ; 968d7 + ret +;968d8 + +SetMinTwoStepWildEncounterCooldown: ; 968d8 + ld a, [wWildEncounterCooldown] + cp 2 + ret nc + ld a, 2 + ld [wWildEncounterCooldown], a + ret +; 968e4 + +Dummy_CheckScriptFlags3Bit5: ; 968e4 + call CheckBit5_ScriptFlags3 + ret z + call ret_2f3e + ret +; 968ec + +RunSceneScript: ; 968ec + ld a, [wCurrMapSceneScriptCount] + and a + jr z, .nope + + ld c, a + call CheckScenes + cp c + jr nc, .nope + + ld e, a + ld d, 0 + ld hl, wCurrMapSceneScriptsPointer + ld a, [hli] + ld h, [hl] + ld l, a +rept 4 + add hl, de +endr + + call GetMapScriptsBank + call GetFarHalfword + call GetMapScriptsBank + call CallScript + + ld hl, wScriptFlags + res 3, [hl] + + farcall EnableScriptMode + farcall ScriptEvents + + ld hl, wScriptFlags + bit 3, [hl] + jr z, .nope + + ld hl, wPriorityScriptAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wPriorityScriptBank] + call CallScript + scf + ret + +.nope + xor a + ret +; 9693a + +CheckTimeEvents: ; 9693a + ld a, [wLinkMode] + and a + jr nz, .nothing + + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + jr z, .do_daily + + farcall CheckBugContestTimer + jr c, .end_bug_contest + xor a + ret + +.do_daily + farcall CheckDailyResetTimer + farcall CheckPokerusTick + farcall CheckPhoneCall + ret c + +.nothing + xor a + ret + +.end_bug_contest + ld a, BANK(BugCatchingContestOverScript) + ld hl, BugCatchingContestOverScript + call CallScript + scf + ret +; 96970 + +.unused ; 96970 + ld a, 8 + scf + ret +; 96974 + +OWPlayerInput: ; 96974 + + call PlayerMovement + ret c + and a + jr nz, .NoAction + +; Can't perform button actions while sliding on ice. + farcall CheckStandingOnIce + jr c, .NoAction + + call CheckAPressOW + jr c, .Action + + call CheckMenuOW + jr c, .Action + +.NoAction: + xor a + ret + +.Action: + push af + farcall StopPlayerForEvent + pop af + scf + ret +; 96999 + +CheckAPressOW: ; 96999 + ld a, [hJoyPressed] + and A_BUTTON + ret z + call TryObjectEvent + ret c + call TryBGEvent + ret c + call TryTileCollisionEvent + ret c + xor a + ret +; 969ac + +PlayTalkObject: ; 969ac + push de + ld de, SFX_READ_TEXT_2 + call PlaySFX + pop de + ret +; 969b5 + +TryObjectEvent: ; 969b5 + farcall CheckFacingObject + jr c, .IsObject + xor a + ret + +.IsObject: + call PlayTalkObject + ld a, [hObjectStructIndexBuffer] + call GetObjectStruct + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, bc + ld a, [hl] + ld [hLastTalked], a + + ld a, [hLastTalked] + call GetMapObject + ld hl, MAPOBJECT_COLOR + add hl, bc + ld a, [hl] + and %00001111 + +; Bug: If IsInArray returns nc, data at bc will be executed as code. + push bc + ld de, 3 + ld hl, .pointers + call IsInArray + jr nc, .nope_bugged + pop bc + + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.nope_bugged + ; pop bc + xor a + ret + +.pointers + dbw OBJECTTYPE_SCRIPT, .script + dbw OBJECTTYPE_ITEMBALL, .itemball + dbw OBJECTTYPE_TRAINER, .trainer + ; the remaining four are dummy events + dbw OBJECTTYPE_3, .three + dbw OBJECTTYPE_4, .four + dbw OBJECTTYPE_5, .five + dbw OBJECTTYPE_6, .six + db -1 +; 96a04 + +.script ; 96a04 + ld hl, MAPOBJECT_SCRIPT_POINTER + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call GetMapScriptsBank + call CallScript + ret +; 96a12 + +.itemball ; 96a12 + ld hl, MAPOBJECT_SCRIPT_POINTER + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call GetMapScriptsBank + ld de, wEngineBuffer1 + ld bc, 2 + call FarCopyBytes + ld a, PLAYEREVENT_ITEMBALL + scf + ret +; 96a29 + +.trainer ; 96a29 + call TalkToTrainer + ld a, PLAYEREVENT_TALKTOTRAINER + scf + ret +; 96a30 + +.three ; 96a30 + xor a + ret +; 96a32 + +.four ; 96a32 + xor a + ret +; 96a34 + +.five ; 96a34 + xor a + ret +; 96a36 + +.six ; 96a36 + xor a + ret +; 96a38 + +TryBGEvent: ; 96a38 + call CheckFacingBGEvent + jr c, .is_bg_event + xor a + ret + +.is_bg_event: + ld a, [wEngineBuffer3] + ld hl, .bg_events + rst JumpTable + ret + +.bg_events + dw .read + dw .up + dw .down + dw .right + dw .left + dw .ifset + dw .ifnotset + dw .itemifset + dw .copy +; 96a59 + +.up + ld b, OW_UP + jr .checkdir +.down + ld b, OW_DOWN + jr .checkdir +.right + ld b, OW_RIGHT + jr .checkdir +.left + ld b, OW_LEFT + jr .checkdir + +.checkdir + ld a, [wPlayerDirection] + and %1100 + cp b + jp nz, .dontread + +.read + call PlayTalkObject + ld hl, wEngineBuffer4 + ld a, [hli] + ld h, [hl] + ld l, a + call GetMapScriptsBank + call CallScript + scf + ret + +.itemifset + call CheckBGEventFlag + jp nz, .dontread + call PlayTalkObject + call GetMapScriptsBank + ld de, wEngineBuffer1 + ld bc, 3 + call FarCopyBytes + ld a, BANK(HiddenItemScript) + ld hl, HiddenItemScript + call CallScript + scf + ret + +.copy + call CheckBGEventFlag + jr nz, .dontread + call GetMapScriptsBank + ld de, wEngineBuffer1 + ld bc, 3 + call FarCopyBytes + jr .dontread + +.ifset + call CheckBGEventFlag + jr z, .dontread + jr .thenread + +.ifnotset + call CheckBGEventFlag + jr nz, .dontread + +.thenread + push hl + call PlayTalkObject + pop hl + inc hl + inc hl + call GetMapScriptsBank + call GetFarHalfword + call GetMapScriptsBank + call CallScript + scf + ret + +.dontread + xor a + ret +; 96ad8 + +CheckBGEventFlag: ; 96ad8 + ld hl, wEngineBuffer4 + ld a, [hli] + ld h, [hl] + ld l, a + push hl + call GetMapScriptsBank + call GetFarHalfword + ld e, l + ld d, h + ld b, CHECK_FLAG + call EventFlagAction + ld a, c + and a + pop hl + ret +; 96af0 + +PlayerMovement: ; 96af0 + farcall DoPlayerMovement + ld a, c + ld hl, .pointers + rst JumpTable + ld a, c + ret +; 96afd + +.pointers + dw .zero + dw .one + dw .two + dw .three + dw .four + dw .five + dw .six + dw .seven + +.zero +.four ; 96b0d + xor a + ld c, a + ret +; 96b10 + +.seven ; 96b10 + call ret_968d7 ; mobile + xor a + ld c, a + ret +; 96b16 + +.one ; 96b16 + ld a, 5 + ld c, a + scf + ret +; 96b1b + +.two ; 96b1b + ld a, 9 + ld c, a + scf + ret +; 96b20 + +.three ; 96b20 +; force the player to move in some direction + ld a, BANK(Script_ForcedMovement) + ld hl, Script_ForcedMovement + call CallScript +; ld a, -1 + ld c, a + scf + ret +; 96b2b + +.five +.six ; 96b2b + ld a, -1 + ld c, a + and a + ret +; 96b30 + +CheckMenuOW: ; 96b30 + xor a + ld [hMenuReturn], a + ld [hMenuReturn + 1], a + ld a, [hJoyPressed] + + bit SELECT_F, a + jr nz, .Select + + bit START_F, a + jr z, .NoMenu + + ld a, BANK(StartMenuScript) + ld hl, StartMenuScript + call CallScript + scf + ret + +.NoMenu: + xor a + ret + +.Select: + call PlayTalkObject + ld a, BANK(SelectMenuScript) + ld hl, SelectMenuScript + call CallScript + scf + ret +; 96b58 + +StartMenuScript: ; 96b58 + callasm StartMenu + jump StartMenuCallback +; 96b5f + +SelectMenuScript: ; 96b5f + callasm SelectMenu + jump SelectMenuCallback +; 96b66 + +StartMenuCallback: +SelectMenuCallback: ; 96b66 + copybytetovar hMenuReturn + ifequal HMENURETURN_SCRIPT, .Script + ifequal HMENURETURN_ASM, .Asm + end +; 96b72 + +.Script: ; 96b72 + ptjump wQueuedScriptBank +; 96b75 + +.Asm: ; 96b75 + ptcallasm wQueuedScriptBank + end +; 96b79 + +CountStep: ; 96b79 + ; Don't count steps in link communication rooms. + ld a, [wLinkMode] + and a + jr nz, .done + + ; If there is a special phone call, don't count the step. + farcall CheckSpecialPhoneCall + jr c, .doscript + + ; If Repel wore off, don't count the step. + call DoRepelStep + jr c, .doscript + + ; Count the step for poison and total steps + ld hl, wPoisonStepCount + inc [hl] + ld hl, wStepCount + inc [hl] + ; Every 256 steps, increase the happiness of all your Pokemon. + jr nz, .skip_happiness + + farcall StepHappiness + +.skip_happiness + ; Every 256 steps, offset from the happiness incrementor by 128 steps, + ; decrease the hatch counter of all your eggs until you reach the first + ; one that is ready to hatch. + ld a, [wStepCount] + cp $80 + jr nz, .skip_egg + + farcall DoEggStep + jr nz, .hatch + +.skip_egg + ; Increase the EXP of (both) DayCare Pokemon by 1. + farcall DayCareStep + + ; Every four steps, deal damage to all Poisoned Pokemon + ld hl, wPoisonStepCount + ld a, [hl] + cp 4 + jr c, .skip_poison + ld [hl], 0 + + farcall DoPoisonStep + jr c, .doscript + +.skip_poison + farcall DoBikeStep + +.done + xor a + ret + +.doscript + ld a, -1 + scf + ret + +.hatch + ld a, 8 + scf + ret +; 96bd3 + +; unused +.unreferenced ; 96bd3 + ld a, 7 + scf + ret +; 96bd7 + +DoRepelStep: ; 96bd7 + ld a, [wRepelEffect] + and a + ret z + + dec a + ld [wRepelEffect], a + ret nz + + ld a, BANK(RepelWoreOffScript) + ld hl, RepelWoreOffScript + call CallScript + scf + ret +; 96beb + +DoPlayerEvent: ; 96beb + ld a, [wScriptRunning] + and a + ret z + + cp PLAYEREVENT_MAPSCRIPT ; run script + ret z + + cp NUM_PLAYER_EVENTS + ret nc + + ld c, a + ld b, 0 + ld hl, PlayerEventScriptPointers + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + ld [wScriptBank], a + ld a, [hli] + ld [wScriptPos], a + ld a, [hl] + ld [wScriptPos + 1], a + ret +; 96c0c + +PlayerEventScriptPointers: ; 96c0c + dba Invalid_0x96c2d ; 0 + dba SeenByTrainerScript ; 1 + dba TalkToTrainerScript ; 2 + dba FindItemInBallScript ; 3 + dba EdgeWarpScript ; 4 + dba WarpToNewMapScript ; 5 + dba FallIntoMapScript ; 6 + dba Script_OverworldWhiteout ; 7 + dba HatchEggScript ; 8 + dba ChangeDirectionScript ; 9 + dba Invalid_0x96c2d ; 10 +; 96c2d + +Invalid_0x96c2d: ; 96c2d + end +; 96c2e + +; unused + end +; 96c2f + +HatchEggScript: ; 96c2f + callasm OverworldHatchEgg + end +; 96c34 + +WarpToNewMapScript: ; 96c34 + warpsound + newloadmap MAPSETUP_DOOR + end +; 96c38 + +FallIntoMapScript: ; 96c38 + newloadmap MAPSETUP_FALL + playsound SFX_KINESIS + applymovement PLAYER, MovementData_0x96c48 + playsound SFX_STRENGTH + scall LandAfterPitfallScript + end +; 96c48 + +MovementData_0x96c48: ; 96c48 + skyfall + step_end +; 96c4a + +LandAfterPitfallScript: ; 96c4a + earthquake 16 + end +; 96c4d + +EdgeWarpScript: ; 4 + reloadandreturn MAPSETUP_CONNECTION +; 96c4f + +ChangeDirectionScript: ; 9 + deactivatefacing 3 + callasm EnableWildEncounters + end +; 96c56 + +INCLUDE "engine/overworld/scripting.asm" + +INCLUDE "engine/overworld/events_2.asm" diff --git a/engine/overworld/events_2.asm b/engine/overworld/events_2.asm new file mode 100644 index 000000000..6e106541a --- /dev/null +++ b/engine/overworld/events_2.asm @@ -0,0 +1,650 @@ +; More overworld event handling. + + +WarpToSpawnPoint:: ; 97c28 + ld hl, wStatusFlags2 + res STATUSFLAGS2_SAFARI_GAME_F, [hl] + res STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + ret +; 97c30 + +RunMemScript:: ; 97c30 +; If there is no script here, we don't need to be here. + ld a, [wMapReentryScriptQueueFlag] + and a + ret z +; Execute the script at (wMapReentryScriptBank):(wMapReentryScriptAddress). + ld hl, wMapReentryScriptAddress + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wMapReentryScriptBank] + call CallScript + scf +; Clear the buffer for the next script. + push af + xor a + ld hl, wMapReentryScriptQueueFlag + ld bc, 8 + call ByteFill + pop af + ret +; 97c4f + +LoadScriptBDE:: ; 97c4f +; If there's already a script here, don't overwrite. + ld hl, wMapReentryScriptQueueFlag + ld a, [hl] + and a + ret nz +; Set the flag + ld [hl], 1 + inc hl +; Load the script pointer b:de into (wMapReentryScriptBank):(wMapReentryScriptAddress) + ld [hl], b + inc hl + ld [hl], e + inc hl + ld [hl], d + scf + ret +; 97c5f + +TryTileCollisionEvent:: ; 97c5f + call GetFacingTileCoord + ld [wEngineBuffer1], a + ld c, a + farcall CheckFacingTileForStdScript + jr c, .done + + call CheckCutTreeTile + jr nz, .whirlpool + farcall TryCutOW + jr .done + +.whirlpool + ld a, [wEngineBuffer1] + call CheckWhirlpoolTile + jr nz, .waterfall + farcall TryWhirlpoolOW + jr .done + +.waterfall + ld a, [wEngineBuffer1] + call CheckWaterfallTile + jr nz, .headbutt + farcall TryWaterfallOW + jr .done + +.headbutt + ld a, [wEngineBuffer1] + call CheckHeadbuttTreeTile + jr nz, .surf + farcall TryHeadbuttOW + jr c, .done + jr .noevent + +.surf + farcall TrySurfOW + jr nc, .noevent + jr .done + +.noevent + xor a + ret + +.done + call PlayClickSFX + ld a, $ff + scf + ret +; 97cc0 + + +RandomEncounter:: ; 97cc0 +; Random encounter + + call CheckWildEncounterCooldown + jr c, .nope + call CanUseSweetScent + jr nc, .nope + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + jr nz, .bug_contest + farcall TryWildEncounter + jr nz, .nope + jr .ok + +.bug_contest + call _TryWildEncounter_BugContest + jr nc, .nope + jr .ok_bug_contest + +.nope + ld a, 1 + and a + ret + +.ok + ld a, BANK(WildBattleScript) + ld hl, WildBattleScript + jr .done + +.ok_bug_contest + ld a, BANK(BugCatchingContestBattleScript) + ld hl, BugCatchingContestBattleScript + jr .done + +.done + call CallScript + scf + ret +; 97cf9 + +WildBattleScript: ; 97cf9 + randomwildmon + startbattle + reloadmapafterbattle + end +; 97cfd + +CanUseSweetScent:: ; 97cfd + ld hl, wStatusFlags + bit STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] + jr nz, .no + ld a, [wEnvironment] + cp CAVE + jr z, .ice_check + cp DUNGEON + jr z, .ice_check + farcall CheckGrassCollision + jr nc, .no + +.ice_check + ld a, [wPlayerStandingTile] + call CheckIceTile + jr z, .no + scf + ret + +.no + and a + ret +; 97d23 + +_TryWildEncounter_BugContest: ; 97d23 + call TryWildEncounter_BugContest + ret nc + call ChooseWildEncounter_BugContest + farcall CheckRepelEffect + ret +; 97d31 + +ChooseWildEncounter_BugContest:: ; 97d31 +; Pick a random mon out of ContestMons. + +.loop + call Random + cp 100 << 1 + jr nc, .loop + srl a + + ld hl, ContestMons + ld de, 4 +.CheckMon: + sub [hl] + jr c, .GotMon + add hl, de + jr .CheckMon + +.GotMon: + inc hl + +; Species + ld a, [hli] + ld [wTempWildMonSpecies], a + +; Min level + ld a, [hli] + ld d, a + +; Max level + ld a, [hl] + + sub d + jr nz, .RandomLevel + +; If min and max are the same. + ld a, d + jr .GotLevel + +.RandomLevel: +; Get a random level between the min and max. + ld c, a + inc c + call Random + ld a, [hRandomAdd] + call SimpleDivide + add d + +.GotLevel: + ld [wCurPartyLevel], a + + xor a + ret +; 97d64 + +TryWildEncounter_BugContest: ; 97d64 + ld a, [wPlayerStandingTile] + call CheckSuperTallGrassTile + ld b, 40 percent + jr z, .ok + ld b, 20 percent + +.ok + farcall ApplyMusicEffectOnEncounterRate + farcall ApplyCleanseTagEffectOnEncounterRate + call Random + ld a, [hRandomAdd] + cp b + ret c + ld a, 1 + and a + ret +; 97d87 + + +INCLUDE "data/wild/bug_contest_mons.asm" + + +DoBikeStep:: ; 97db3 + nop + nop + ; If the bike shop owner doesn't have our number, or + ; if we've already gotten the call, we don't have to + ; be here. + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl] + jr z, .NoCall + + ; If we're not on the bike, we don't have to be here. + ld a, [wPlayerState] + cp PLAYER_BIKE + jr nz, .NoCall + + ; If we're not in an area of phone service, we don't + ; have to be here. + call GetMapPhoneService + and a + jr nz, .NoCall + + ; Check the bike step count and check whether we've + ; taken 65536 of them yet. + ld hl, wBikeStep + ld a, [hli] + ld d, a + ld e, [hl] + cp 255 + jr nz, .increment + ld a, e + cp 255 + jr z, .dont_increment + +.increment + inc de + ld [hl], e + dec hl + ld [hl], d + +.dont_increment + ; If we've taken at least 1024 steps, have the bike + ; shop owner try to call us. + ld a, d + cp HIGH(1024) + jr c, .NoCall + + ; If a call has already been queued, don't overwrite + ; that call. + ld a, [wSpecialPhoneCallID] + and a + jr nz, .NoCall + + ; Queue the call. + ld a, SPECIALCALL_BIKESHOP + ld [wSpecialPhoneCallID], a + xor a + ld [wSpecialPhoneCallID + 1], a + ld hl, wStatusFlags2 + res STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl] + scf + ret + +.NoCall: + xor a + ret +; 97df9 + +ClearCmdQueue:: ; 97df9 + ld hl, wCmdQueue + ld de, 6 + ld c, 4 + xor a +.loop + ld [hl], a + add hl, de + dec c + jr nz, .loop + ret +; 97e08 + +HandleCmdQueue:: ; 97e08 + ld hl, wCmdQueue + xor a +.loop + ld [hMapObjectIndexBuffer], a + ld a, [hl] + and a + jr z, .skip + push hl + ld b, h + ld c, l + call HandleQueuedCommand + pop hl + +.skip + ld de, CMDQUEUE_ENTRY_SIZE + add hl, de + ld a, [hMapObjectIndexBuffer] + inc a + cp CMDQUEUE_CAPACITY + jr nz, .loop + ret +; 97e25 + +Unreferenced_GetNthCmdQueueEntry: ; 97e25 + ld hl, wCmdQueue + ld bc, CMDQUEUE_ENTRY_SIZE + call AddNTimes + ld b, h + ld c, l + ret +; 97e31 + +WriteCmdQueue:: ; 97e31 + push bc + push de + call .GetNextEmptyEntry + ld d, h + ld e, l + pop hl + pop bc + ret c + ld a, b + ld bc, CMDQUEUE_ENTRY_SIZE - 1 + call FarCopyBytes + xor a + ld [hl], a + ret +; 97e45 + +.GetNextEmptyEntry: ; 97e45 + ld hl, wCmdQueue + ld de, CMDQUEUE_ENTRY_SIZE + ld c, CMDQUEUE_CAPACITY +.loop + ld a, [hl] + and a + jr z, .done + add hl, de + dec c + jr nz, .loop + scf + ret + +.done + ld a, CMDQUEUE_CAPACITY + sub c + and a + ret +; 97e5c + +DelCmdQueue:: ; 97e5c + ld hl, wCmdQueue + ld de, CMDQUEUE_ENTRY_SIZE + ld c, CMDQUEUE_CAPACITY +.loop + ld a, [hl] + cp b + jr z, .done + add hl, de + dec c + jr nz, .loop + and a + ret + +.done + xor a + ld [hl], a + scf + ret +; 97e72 + +_DelCmdQueue: ; 97e72 + ld hl, CMDQUEUE_TYPE + add hl, bc + ld [hl], 0 + ret +; 97e79 + +HandleQueuedCommand: ; 97e79 + ld hl, CMDQUEUE_TYPE + add hl, bc + ld a, [hl] + cp 5 + jr c, .okay + xor a + +.okay + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + add hl, de + ld a, [hli] + push af + ld a, [hli] + ld h, [hl] + ld l, a + pop af + rst FarCall + ret +; 97e94 + +.Jumptable: ; 97e94 + dba CmdQueue_Null + dba CmdQueue_Null2 + dba CmdQueue_StoneTable + dba CmdQueue_Type3 + dba CmdQueue_Type4 +; 97ea3 + +CmdQueueAnonymousJumptable: ; 97ea3 + ld hl, CMDQUEUE_05 + add hl, bc + ld a, [hl] + pop hl + rst JumpTable + ret +; 97eab + +CmdQueueAnonJT_Increment: ; 97eab + ld hl, CMDQUEUE_05 + add hl, bc + inc [hl] + ret +; 97eb1 + +CmdQueueAnonJT_Decrement: ; 97eb1 + ld hl, CMDQUEUE_05 + add hl, bc + dec [hl] + ret +; 97eb7 + +CmdQueue_Null: ; 97eb7 + ret +; 97eb8 + +CmdQueue_Null2: ; 97eb8 + call ret_2f3e + ret +; 97ebc + +CmdQueue_Type4: ; 97ebc + call CmdQueueAnonymousJumptable + ; anonymous dw + dw .zero + dw .one +; 97ec3 + +.zero ; 97ec3 + ld a, [hSCY] + ld hl, 4 + add hl, bc + ld [hl], a + call CmdQueueAnonJT_Increment +.one ; 97ecd + ld hl, 1 + add hl, bc + ld a, [hl] + dec a + ld [hl], a + jr z, .finish + and $1 + jr z, .add + ld hl, 2 + add hl, bc + ld a, [hSCY] + sub [hl] + ld [hSCY], a + ret + +.add + ld hl, 2 + add hl, bc + ld a, [hSCY] + add [hl] + ld [hSCY], a + ret + +.finish + ld hl, 4 + add hl, bc + ld a, [hl] + ld [hSCY], a + call _DelCmdQueue + ret +; 97ef9 + +CmdQueue_Type3: ; 97ef9 + call CmdQueueAnonymousJumptable + ; anonymous dw + dw .zero + dw .one + dw .two +; 97f02 + +.zero ; 97f02 + call .IsPlayerFacingDown + jr z, .PlayerNotFacingDown + call CmdQueueAnonJT_Increment +.one ; 97f0a + call .IsPlayerFacingDown + jr z, .PlayerNotFacingDown + call CmdQueueAnonJT_Increment + + ld hl, 2 + add hl, bc + ld a, [hl] + ld [wd173], a + ret +; 97f1b + +.two ; 97f1b + call .IsPlayerFacingDown + jr z, .PlayerNotFacingDown + call CmdQueueAnonJT_Decrement + + ld hl, 3 + add hl, bc + ld a, [hl] + ld [wd173], a + ret +; 97f2c + +.PlayerNotFacingDown: ; 97f2c + ld a, $7f + ld [wd173], a + ld hl, 5 + add hl, bc + ld [hl], 0 + ret +; 97f38 + +.IsPlayerFacingDown: ; 97f38 + push bc + ld bc, wPlayerStruct + call GetSpriteDirection + and a + pop bc + ret +; 97f42 + +CmdQueue_StoneTable: ; 97f42 + ld de, wPlayerStruct + ld a, NUM_OBJECT_STRUCTS +.loop + push af + + ld hl, OBJECT_SPRITE + add hl, de + ld a, [hl] + and a + jr z, .next + + ld hl, OBJECT_MOVEMENTTYPE + add hl, de + ld a, [hl] + cp SPRITEMOVEDATA_STRENGTH_BOULDER + jr nz, .next + + ld hl, OBJECT_NEXT_TILE + add hl, de + ld a, [hl] + call CheckPitTile + jr nz, .next + + ld hl, OBJECT_DIRECTION_WALKING + add hl, de + ld a, [hl] + cp STANDING + jr nz, .next + call HandleStoneQueue + jr c, .fall_down_hole + +.next + ld hl, OBJECT_STRUCT_LENGTH + add hl, de + ld d, h + ld e, l + + pop af + dec a + jr nz, .loop + ret + +.fall_down_hole + pop af + ret +; 97f7e diff --git a/engine/overworld/init_map.asm b/engine/overworld/init_map.asm new file mode 100644 index 000000000..2eb4998a6 --- /dev/null +++ b/engine/overworld/init_map.asm @@ -0,0 +1,103 @@ +ReanchorBGMap_NoOAMUpdate:: ; 6454 + call DelayFrame + ld a, [hOAMUpdate] + push af + + ld a, $1 + ld [hOAMUpdate], a + ld a, [hBGMapMode] + push af + xor a + ld [hBGMapMode], a + + call .ReanchorBGMap + + pop af + ld [hBGMapMode], a + pop af + ld [hOAMUpdate], a + ld hl, wVramState + set 6, [hl] + ret + +.ReanchorBGMap: + xor a + ld [hLCDCPointer], a + ld [hBGMapMode], a + ld a, $90 + ld [hWY], a + call OverworldTextModeSwitch + ld a, HIGH(vBGMap1) + call .LoadBGMapAddrIntoHRAM + call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap + farcall LoadOW_BGPal7 + farcall ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + xor a + ld [hBGMapMode], a + ld [hWY], a + farcall HDMATransfer_FillBGMap0WithBlack ; no need to farcall + ld a, HIGH(vBGMap0) + call .LoadBGMapAddrIntoHRAM + xor a ; LOW(vBGMap0) + ld [wBGMapAnchor], a + ld a, HIGH(vBGMap0) + ld [wBGMapAnchor + 1], a + xor a + ld [hSCX], a + ld [hSCY], a + call ApplyBGMapAnchorToObjects + ret + +.LoadBGMapAddrIntoHRAM: ; 64b9 + ld [hBGMapAddress + 1], a + xor a + ld [hBGMapAddress], a + ret + +LoadFonts_NoOAMUpdate:: ; 64bf + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + + call .LoadGFX + + pop af + ld [hOAMUpdate], a + ret + +.LoadGFX: + call LoadFontsExtra + ld a, $90 + ld [hWY], a + call SafeUpdateSprites + call LoadStandardFont + ret + +HDMATransfer_FillBGMap0WithBlack: ; 64db + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + ld a, "■" + ld hl, wDecompressScratch + ld bc, wScratchAttrMap - wDecompressScratch + call ByteFill + ld a, HIGH(wDecompressScratch) + ld [rHDMA1], a + ld a, LOW(wDecompressScratch) + ld [rHDMA2], a + ld a, HIGH(vBGMap0 % $8000) + ld [rHDMA3], a + ld a, LOW(vBGMap0 % $8000) + ld [rHDMA4], a + ld a, $3f + ld [hDMATransfer], a + call DelayFrame + + pop af + ld [rSVBK], a + ret diff --git a/engine/overworld/landmarks.asm b/engine/overworld/landmarks.asm new file mode 100644 index 000000000..f16f48e67 --- /dev/null +++ b/engine/overworld/landmarks.asm @@ -0,0 +1,87 @@ +GetLandmarkCoords: ; 0x1ca896 +; Return coordinates (d, e) of landmark e. + push hl + ld l, e + ld h, 0 + add hl, hl + add hl, hl + ld de, Landmarks + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + ret +; 0x1ca8a5 + + +GetLandmarkName:: ; 0x1ca8a5 +; Copy the name of landmark e to wStringBuffer1. + push hl + push de + push bc + + ld l, e + ld h, 0 + add hl, hl + add hl, hl + ld de, Landmarks + 2 + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + + ld de, wStringBuffer1 + ld c, 18 +.copy + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .copy + + pop bc + pop de + pop hl + ret +; 0x1ca8c3 + + +INCLUDE "data/maps/landmarks.asm" + + +RegionCheck: ; 0x1caea1 +; Checks if the player is in Kanto or Johto. +; If in Johto, returns 0 in e. +; If in Kanto, returns 1 in e. + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + call GetWorldMapLocation + cp FAST_SHIP ; S.S. Aqua + jr z, .johto + cp SPECIAL_MAP + jr nz, .checkagain + +; In a special map, get the backup map group / map id + ld a, [wBackupMapGroup] + ld b, a + ld a, [wBackupMapNumber] + ld c, a + call GetWorldMapLocation + +.checkagain + cp KANTO_LANDMARK + jr c, .johto + +; Victory Road area is considered to be Johto. + cp VICTORY_ROAD + jr c, .kanto + +.johto + ld e, JOHTO_REGION + ret +.kanto + ld e, KANTO_REGION + ret diff --git a/engine/overworld/map_object_action.asm b/engine/overworld/map_object_action.asm new file mode 100755 index 000000000..c82cd80a2 --- /dev/null +++ b/engine/overworld/map_object_action.asm @@ -0,0 +1,313 @@ +ObjectActionPairPointers: ; 445f +; entries correspond to OBJECT_ACTION_* constants + dw SetFacingStanding, SetFacingStanding + dw SetFacingStandAction, SetFacingCurrent + dw SetFacingStepAction, SetFacingCurrent + dw SetFacingBumpAction, SetFacingCurrent + dw SetFacingCounterclockwiseSpin, SetFacingCurrent + dw SetFacingCounterclockwiseSpin2, SetFacingStanding + dw SetFacingFish, SetFacingFish + dw SetFacingShadow, SetFacingStanding + dw SetFacingEmote, SetFacingEmote + dw SetFacingBigDollSym, SetFacingBigDollSym + dw SetFacingBounce, SetFacingFreezeBounce + dw SetFacingWeirdTree, SetFacingCurrent + dw SetFacingBigDollAsym, SetFacingBigDollAsym + dw SetFacingBigDoll, SetFacingBigDoll + dw SetFacingBoulderDust, SetFacingStanding + dw SetFacingGrassShake, SetFacingStanding + dw SetFacingSkyfall, SetFacingCurrent +; 44a3 + +SetFacingStanding: ; 44a3 + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], STANDING + ret +; 44aa + +SetFacingCurrent: ; 44aa + call GetSpriteDirection + or FACING_STEP_DOWN_0 ; useless + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], a + ret +; 44b5 + +SetFacingStandAction: ; 44b5 + ld hl, OBJECT_FACING_STEP + add hl, bc + ld a, [hl] + and 1 + jr nz, SetFacingStepAction + jp SetFacingCurrent +; 44c1 + +SetFacingStepAction: ; 44c1 + ld hl, OBJECT_FLAGS1 + add hl, bc + bit SLIDING, [hl] + jp nz, SetFacingCurrent + + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld a, [hl] + inc a + and %00001111 + ld [hl], a + + rrca + rrca + and %00000011 + ld d, a + + call GetSpriteDirection + or FACING_STEP_DOWN_0 ; useless + or d + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], a + ret +; 44e4 + +SetFacingSkyfall: ; 44e4 + ld hl, OBJECT_FLAGS1 + add hl, bc + bit SLIDING, [hl] + jp nz, SetFacingCurrent + + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld a, [hl] + add 2 + and %00001111 + ld [hl], a + + rrca + rrca + and %00000011 + ld d, a + + call GetSpriteDirection + or FACING_STEP_DOWN_0 ; useless + or d + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], a + ret +; 4508 + +SetFacingBumpAction: ; 4508 + ld hl, OBJECT_FLAGS1 + add hl, bc + bit SLIDING, [hl] + jp nz, SetFacingCurrent + + ld hl, OBJECT_STEP_FRAME + add hl, bc + inc [hl] + + ld a, [hl] + rrca + rrca + rrca + and %00000011 + ld d, a + + call GetSpriteDirection + or FACING_STEP_DOWN_0 ; useless + or d + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], a + ret +; 4529 + +SetFacingCounterclockwiseSpin: ; 4529 + call CounterclockwiseSpinAction + ld hl, OBJECT_FACING + add hl, bc + ld a, [hl] + or FACING_STEP_DOWN_0 ; useless + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], a + ret +; 4539 + +SetFacingCounterclockwiseSpin2: ; 4539 + call CounterclockwiseSpinAction + jp SetFacingStanding +; 453f + +CounterclockwiseSpinAction: ; 453f +; Here, OBJECT_STEP_FRAME consists of two 2-bit components, +; using only bits 0,1 and 4,5. +; bits 0,1 is a timer (4 overworld frames) +; bits 4,5 determines the facing - the direction is counterclockwise. + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld a, [hl] + and %11110000 + ld e, a + + ld a, [hl] + inc a + and %00001111 + ld d, a + cp 4 + jr c, .ok + + ld d, 0 + ld a, e + add $10 + and %00110000 + ld e, a + +.ok + ld a, d + or e + ld [hl], a + + swap e + ld d, 0 + ld hl, .Directions + add hl, de + ld a, [hl] + ld hl, OBJECT_FACING + add hl, bc + ld [hl], a + ret +; 456a + +.Directions: ; 456a + db OW_DOWN, OW_RIGHT, OW_UP, OW_LEFT +; 456e + +SetFacingFish: ; 456e + call GetSpriteDirection + rrca + rrca + add FACING_FISH_DOWN + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], a + ret +; 457b + +SetFacingShadow: ; 457b + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], FACING_SHADOW + ret +; 4582 + +SetFacingEmote: ; 4582 emote + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], FACING_EMOTE + ret +; 4589 + +SetFacingBigDollSym: ; 4589 + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], FACING_BIG_DOLL_SYM + ret +; 4590 + +SetFacingBounce: ; 4590 + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld a, [hl] + inc a + and %00001111 + ld [hl], a + and %00001000 + jr z, SetFacingFreezeBounce + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], FACING_STEP_UP_0 + ret +; 45a4 + +SetFacingFreezeBounce: ; 45a4 + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], FACING_STEP_DOWN_0 + ret +; 45ab + +SetFacingWeirdTree: ; 45ab + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld a, [hl] + inc a + ld [hl], a + and %00001100 + rrca + rrca + add FACING_WEIRD_TREE_0 + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], a + ret +; 45be + +SetFacingBigDollAsym: ; 45be + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], FACING_BIG_DOLL_ASYM + ret +; 45c5 + +SetFacingBigDoll: ; 45c5 + ld a, [wVariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS] + ld d, FACING_BIG_DOLL_SYM ; symmetric + cp SPRITE_BIG_SNORLAX + jr z, .ok + cp SPRITE_BIG_LAPRAS + jr z, .ok + ld d, FACING_BIG_DOLL_ASYM ; asymmetric + +.ok + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], d + ret +; 45da + +SetFacingBoulderDust: ; 45da + ld hl, OBJECT_STEP_FRAME + add hl, bc + inc [hl] + ld a, [hl] + + ld hl, OBJECT_FACING_STEP + add hl, bc + and 2 + ld a, FACING_BOULDER_DUST_1 + jr z, .ok + inc a ; FACING_BOULDER_DUST_2 +.ok + ld [hl], a + ret +; 45ed + +SetFacingGrassShake: ; 45ed + ld hl, OBJECT_STEP_FRAME + add hl, bc + inc [hl] + ld a, [hl] + ld hl, OBJECT_FACING_STEP + add hl, bc + and 4 + ld a, FACING_GRASS_1 + jr z, .ok + inc a ; FACING_GRASS_2 + +.ok + ld [hl], a + ret +; 4600 diff --git a/engine/overworld/map_objects.asm b/engine/overworld/map_objects.asm new file mode 100644 index 000000000..8d6f4082f --- /dev/null +++ b/engine/overworld/map_objects.asm @@ -0,0 +1,3123 @@ +INCLUDE "data/sprites/facings.asm" + +INCLUDE "data/sprites/map_objects.asm" + + +; 4357 +DeleteMapObject:: ; 4357 + push bc + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, bc + ld a, [hl] + push af + ld h, b + ld l, c + ld bc, OBJECT_STRUCT_LENGTH + xor a + call ByteFill + pop af + cp -1 + jr z, .ok + bit 7, a + jr nz, .ok + call GetMapObject + ld hl, OBJECT_SPRITE + add hl, bc + ld [hl], -1 +.ok + pop bc + ret +; 437b + +Function437b: ; 437b + call .CheckObjectStillVisible + ret c + call .HandleStepType + call .HandleObjectAction + ret + +.CheckObjectStillVisible: + ld hl, OBJECT_FLAGS2 + add hl, bc + res 6, [hl] + ld a, [wXCoord] + ld e, a + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [hl] + add 1 + sub e + jr c, .ok + cp MAPOBJECT_SCREEN_WIDTH + jr nc, .ok + ld a, [wYCoord] + ld e, a + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld a, [hl] + add 1 + sub e + jr c, .ok + cp MAPOBJECT_SCREEN_HEIGHT + jr nc, .ok + jr .yes + +.ok + ld hl, OBJECT_FLAGS2 + add hl, bc + set 6, [hl] + ld a, [wXCoord] + ld e, a + ld hl, OBJECT_INIT_X + add hl, bc + ld a, [hl] + add 1 + sub e + jr c, .ok2 + cp MAPOBJECT_SCREEN_WIDTH + jr nc, .ok2 + ld a, [wYCoord] + ld e, a + ld hl, OBJECT_INIT_Y + add hl, bc + ld a, [hl] + add 1 + sub e + jr c, .ok2 + cp MAPOBJECT_SCREEN_HEIGHT + jr nc, .ok2 +.yes + and a + ret + +.ok2 + ld hl, OBJECT_FLAGS1 + add hl, bc + bit 1, [hl] + jr nz, .yes2 + call DeleteMapObject + scf + ret + +.yes2 + ld hl, OBJECT_FLAGS2 + add hl, bc + set 6, [hl] + and a + ret + +.HandleStepType: + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld a, [hl] + and a + jr z, .zero + ld hl, OBJECT_FLAGS2 + add hl, bc + bit 5, [hl] + jr nz, .bit5 + cp STEP_TYPE_SLEEP + jr z, .one + jr .ok3 + +.zero + call ObjectMovementReset + ld hl, OBJECT_FLAGS2 + add hl, bc + bit 5, [hl] + jr nz, .bit5 +.one + call MapObjectMovementPattern + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld a, [hl] + and a + ret z + cp STEP_TYPE_SLEEP + ret z +.ok3 + ld hl, StepTypesJumptable + rst JumpTable + ret + +.bit5 + ret + +.HandleObjectAction: + ld hl, OBJECT_FLAGS1 + add hl, bc + bit INVISIBLE, [hl] + jr nz, SetFacingStanding + ld hl, OBJECT_FLAGS2 + add hl, bc + bit 6, [hl] + jr nz, SetFacingStanding + bit 5, [hl] + jr nz, asm_4448 + ld de, ObjectActionPairPointers ; use first column + jr _HandleObjectAction +; 4440 + +Function4440: ; 4440 + ld hl, OBJECT_FLAGS1 + add hl, bc + bit INVISIBLE, [hl] + jr nz, SetFacingStanding +asm_4448 + ld de, ObjectActionPairPointers + 2 ; use second column + jr _HandleObjectAction +; 444d + +_HandleObjectAction +; call [4 * wObjectStructs[ObjInd, OBJECT_ACTION] + de] + ld hl, OBJECT_ACTION + add hl, bc + ld a, [hl] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call _hl_ + ret +; 445f + +INCLUDE "engine/overworld/map_object_action.asm" + +CopyNextCoordsTileToStandingCoordsTile: ; 4600 + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [hl] + ld hl, OBJECT_MAP_X + add hl, bc + ld [hl], a + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld a, [hl] + ld hl, OBJECT_MAP_Y + add hl, bc + ld [hl], a + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + ld hl, OBJECT_STANDING_TILE + add hl, bc + ld [hl], a + call SetTallGrassFlags + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + call UselessAndA + ret +; 462a + +Function462a: ; 462a + ld hl, OBJECT_MAP_X + add hl, bc + ld a, [hl] + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld [hl], a + ld hl, OBJECT_MAP_Y + add hl, bc + ld a, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld [hl], a + ret +; 463f + +UpdateTallGrassFlags: ; 463f + ld hl, OBJECT_FLAGS2 + add hl, bc + bit OVERHEAD, [hl] + jr z, .ok + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + call SetTallGrassFlags +.ok + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + call UselessAndA + ret c ; never happens + ld hl, OBJECT_STANDING_TILE + add hl, bc + ld a, [hl] + call UselessAndA + ret +; 4661 + +SetTallGrassFlags: ; 4661 + call CheckSuperTallGrassTile + jr z, .set + call CheckGrassTile + jr c, .reset +.set + ld hl, OBJECT_FLAGS2 + add hl, bc + set OVERHEAD, [hl] + ret + +.reset + ld hl, OBJECT_FLAGS2 + add hl, bc + res OVERHEAD, [hl] + ret +; 4679 + +UselessAndA: ; 4679 + and a + ret +; 467b + +EndSpriteMovement: ; 467b + xor a + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], a + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a ; OBJECT_1E + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret +; 4690 + +InitStep: ; 4690 + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], a + ld hl, OBJECT_FLAGS1 + add hl, bc + bit FIXED_FACING, [hl] + jr nz, GetNextTile + add a + add a + and %00001100 + ld hl, OBJECT_FACING + add hl, bc + ld [hl], a +GetNextTile: ; 46a6 + call GetStepVector + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld a, d + call GetStepVectorSign + ld hl, OBJECT_MAP_X + add hl, bc + add [hl] + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld [hl], a + ld d, a + ld a, e + call GetStepVectorSign + ld hl, OBJECT_MAP_Y + add hl, bc + add [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld [hl], a + ld e, a + push bc + call GetCoordTile + pop bc + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld [hl], a + ret +; 46d7 + +AddStepVector: ; 46d7 + call GetStepVector + ld hl, OBJECT_SPRITE_X + add hl, bc + ld a, [hl] + add d + ld [hl], a + ld hl, OBJECT_SPRITE_Y + add hl, bc + ld a, [hl] + add e + ld [hl], a + ret +; 46e9 + +GetStepVector: ; 46e9 +; Return (x, y, duration, speed) in (d, e, a, h). + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + and %00001111 + add a + add a + ld l, a + ld h, 0 + ld de, StepVectors + add hl, de + ld d, [hl] + inc hl + ld e, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ret +; 4700 + +StepVectors: ; 4700 +; x, y, duration, speed + ; slow + db 0, 1, 16, 1 + db 0, -1, 16, 1 + db -1, 0, 16, 1 + db 1, 0, 16, 1 + ; normal + db 0, 2, 8, 2 + db 0, -2, 8, 2 + db -2, 0, 8, 2 + db 2, 0, 8, 2 + ; fast + db 0, 4, 4, 4 + db 0, -4, 4, 4 + db -4, 0, 4, 4 + db 4, 0, 4, 4 +; 4730 + +GetStepVectorSign: ; 4730 + add a + ret z ; 0 or 128 + ld a, 1 + ret nc ; 1 - 127 + ld a, -1 + ret ; 129 - 255 +; 4738 + +UpdatePlayerStep: ; 4738 + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + and %00000011 + ld [wPlayerStepDirection], a + call AddStepVector + ld a, [wPlayerStepVectorX] + add d + ld [wPlayerStepVectorX], a + ld a, [wPlayerStepVectorY] + add e + ld [wPlayerStepVectorY], a + ld hl, wPlayerStepFlags + set 5, [hl] + ret +; 4759 + +Unreferenced_Function4759: ; 4759 + push bc + ld e, a + ld d, 0 + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, bc + ld a, [hl] + call GetMapObject + add hl, de + ld a, [hl] + pop bc + ret +; 4769 + +RestoreDefaultMovement: ; 4769 + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, bc + ld a, [hl] + cp -1 + jr z, .ok + push bc + call GetMapObject + ld hl, MAPOBJECT_MOVEMENT + add hl, bc + ld a, [hl] + pop bc + ret + +.ok + ld a, SPRITEMOVEFN_STANDING + ret +; 4780 + +ClearObjectMovementByteIndex: ; 4780 + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + ld [hl], 0 + ret +; 4787 + +IncrementObjectMovementByteIndex: ; 4787 + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + inc [hl] + ret +; 478d + +DecrementObjectMovementByteIndex: ; 478d + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + dec [hl] + ret +; 4793 + +MovementAnonymousJumptable: ; 4793 + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + ld a, [hl] + pop hl + rst JumpTable + ret +; 479b + +ClearObjectStructField1c: ; 479b + ld hl, OBJECT_1C + add hl, bc + ld [hl], 0 + ret +; 47a2 + +IncrementObjectStructField1c: ; 47a2 + ld hl, OBJECT_1C + add hl, bc + inc [hl] + ret +; 47a8 + +Field1cAnonymousJumptable: ; 47a8 + ld hl, OBJECT_1C + add hl, bc + ld a, [hl] + pop hl + rst JumpTable + ret +; 47b0 + +GetValueObjectStructField1c: ; 47b0 + ld hl, OBJECT_1C + add hl, bc + ld a, [hl] + ret +; 47b6 + +SetValueObjectStructField1c: ; 47b6 + ld hl, OBJECT_1C + add hl, bc + ld [hl], a + ret +; 47bc + +ObjectMovementReset: ; 47bc + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + push bc + call GetCoordTile + pop bc + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld [hl], a + call CopyNextCoordsTileToStandingCoordsTile + call EndSpriteMovement + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 47dd + +MapObjectMovementPattern: ; 47dd + call ClearObjectStructField1c + call GetSpriteMovementFunction + ld a, [hl] + ld hl, .Pointers + rst JumpTable + ret + +.Pointers: ; 47e9 +; entries correspond to SPRITEMOVEFN_* constants + dw .Null_00 ; 00 + dw .RandomWalkY ; 01 + dw .RandomWalkX ; 02 + dw .RandomWalkXY ; 03 + dw .RandomSpin1 ; 04 + dw .RandomSpin2 ; 05 + dw .Standing ; 06 + dw .ObeyDPad ; 07 + dw .Movement08 ; 08 + dw .Movement09 ; 09 + dw .Movement0a ; 0a + dw .Movement0b ; 0b + dw .Movement0c ; 0c + dw .Movement0d ; 0d + dw .Movement0e ; 0e + dw .Follow ; 0f + dw .Script ; 10 + dw .Strength ; 11 + dw .FollowNotExact ; 12 + dw .MovementShadow ; 13 + dw .MovementEmote ; 14 + dw .MovementBigStanding ; 15 + dw .MovementBouncing ; 16 + dw .MovementScreenShake ; 17 + dw .MovementSpinClockwise ; 18 + dw .MovementSpinCounterclockwise ; 19 + dw .MovementBoulderDust ; 1a + dw .MovementShakingGrass ; 1b + +.Null_00: + ret + +.RandomWalkY: + call Random + ld a, [hRandomAdd] + and %00000001 + jp .RandomWalkContinue + +.RandomWalkX: + call Random + ld a, [hRandomAdd] + and %00000001 + or %00000010 + jp .RandomWalkContinue + +.RandomWalkXY: + call Random + ld a, [hRandomAdd] + and %00000011 + jp .RandomWalkContinue + +.RandomSpin1: + call Random + ld a, [hRandomAdd] + and %00001100 + ld hl, OBJECT_FACING + add hl, bc + ld [hl], a + jp RandomStepDuration_Slow + +.RandomSpin2: + ld hl, OBJECT_FACING + add hl, bc + ld a, [hl] + and %00001100 + ld d, a + call Random + ld a, [hRandomAdd] + and %00001100 + cp d + jr nz, .keep + xor %00001100 +.keep + ld [hl], a + jp RandomStepDuration_Fast + +.Standing: + call Function462a + call EndSpriteMovement + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_05 + ret + +.ObeyDPad: + ld hl, Function5000 + jp HandleMovementData + +.Movement08: + ld hl, Function5015 + jp HandleMovementData + +.Movement09: + ld hl, Function5026 + jp HandleMovementData + +.Movement0a: + jp _GetMovementObject + +.Movement0b: + jp _GetMovementObject + +.Movement0c: + jp _GetMovementObject + +.Movement0d: + ld hl, Function5000 + jp HandleMovementData + +.Movement0e: + jp _GetMovementObject + +.Follow: + ld hl, GetFollowerNextMovementByte + jp HandleMovementData + +.Script: + ld hl, GetMovementByte + jp HandleMovementData + +.Strength: + call MovementAnonymousJumptable + dw .Strength_Start + dw .Strength_Stop + +.Strength_Start: + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + call CheckPitTile + jr z, .on_pit + ld hl, OBJECT_FLAGS2 + add hl, bc + bit 2, [hl] + res 2, [hl] + jr z, .ok + ld hl, OBJECT_RANGE + add hl, bc + ld a, [hl] + and %00000011 + or 0 + call InitStep + call Function6ec1 + jr c, .ok2 + ld de, SFX_STRENGTH + call PlaySFX + call SpawnStrengthBoulderDust + call UpdateTallGrassFlags + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_0F + ret + +.ok2 + call Function462a +.ok + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret + +.on_pit + call IncrementObjectMovementByteIndex +.Strength_Stop: + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret + +.FollowNotExact: + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + ld hl, OBJECT_RANGE + add hl, bc + ld a, [hl] + push bc + call GetObjectStruct + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + cp STANDING + jr z, .standing + ld hl, OBJECT_MAP_X + add hl, bc + ld a, [hl] + cp d + jr z, .equal + jr c, .less + ld a, 3 + jr .done + +.less + ld a, 2 + jr .done + +.equal + ld hl, OBJECT_MAP_Y + add hl, bc + ld a, [hl] + cp e + jr z, .standing + jr c, .less2 + ld a, 0 + jr .done + +.less2 + ld a, 1 +.done + ld d, a + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + and %00001100 + or d + pop bc + jp NormalStep + +.standing + pop bc + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + ret + +.MovementBigStanding: + call EndSpriteMovement + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_BIG_DOLL_SYM + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_04 + ret + +.MovementBouncing: + call EndSpriteMovement + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_BOUNCE + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_04 + ret + +.MovementSpinCounterclockwise: + call MovementAnonymousJumptable + dw .MovementSpinInit + dw .MovementSpinRepeat + dw .MovementSpinTurnLeft + +.MovementSpinClockwise: + call MovementAnonymousJumptable + dw .MovementSpinInit + dw .MovementSpinRepeat + dw .MovementSpinTurnRight + +.MovementSpinInit: + call EndSpriteMovement + call IncrementObjectMovementByteIndex +.MovementSpinRepeat: + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + ld hl, OBJECT_RANGE + add hl, bc + ld a, [hl] + ld a, $10 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_03 + call IncrementObjectMovementByteIndex + ret + +.MovementSpinTurnLeft: + ld de, .DirectionData_Counterclockwise + call .MovementSpinNextFacing + jr .MovementSpinCounterclockwise + +.DirectionData_Counterclockwise: ; 49c0 + db OW_RIGHT, OW_LEFT, OW_DOWN, OW_UP + +.MovementSpinTurnRight: + ld de, .DirectionData_Clockwise + call .MovementSpinNextFacing + jr .MovementSpinClockwise + +.DirectionData_Clockwise: ; 49cc + db OW_LEFT, OW_RIGHT, OW_UP, OW_DOWN + +.MovementSpinNextFacing: + ld hl, OBJECT_FACING + add hl, bc + ld a, [hl] + and %00001100 + rrca + rrca + push hl + ld l, a + ld h, 0 + add hl, de + ld a, [hl] + pop hl + ld [hl], a + call DecrementObjectMovementByteIndex + ret + +.MovementShadow: + call ._MovementShadow_Grass_Emote_BoulderDust + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_SHADOW + ld hl, OBJECT_STEP_DURATION + add hl, de + ld a, [hl] + inc a + add a + add 0 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld hl, OBJECT_DIRECTION_WALKING + add hl, de + ld a, [hl] + maskbits NUM_DIRECTIONS + ld d, 1 * 8 + 6 + cp DOWN + jr z, .ok_13 + cp UP + jr z, .ok_13 + ld d, 1 * 8 + 4 +.ok_13 + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], d + ld hl, OBJECT_SPRITE_X_OFFSET + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_TRACKING_OBJECT + ret + +.MovementEmote: + call EndSpriteMovement + call ._MovementShadow_Grass_Emote_BoulderDust + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_EMOTE + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 0 + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], -2 * 8 + ld hl, OBJECT_SPRITE_X_OFFSET + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_TRACKING_OBJECT + ret + +.MovementBoulderDust: + call EndSpriteMovement + call ._MovementShadow_Grass_Emote_BoulderDust + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_BOULDER_DUST + ld hl, OBJECT_STEP_DURATION + add hl, de + ld a, [hl] + inc a + add a + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld hl, OBJECT_DIRECTION_WALKING + add hl, de + ld a, [hl] + and %00000011 + ld e, a + ld d, 0 + ld hl, .data_4a81 + add hl, de + add hl, de + ld d, [hl] + inc hl + ld e, [hl] + ld hl, OBJECT_SPRITE_X_OFFSET + add hl, bc + ld [hl], d + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], e + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_TRACKING_OBJECT + ret + +.data_4a81 ; 4a81 + ; x, y + db 0, -4 + db 0, 8 + db 6, 2 + db -6, 2 + +.MovementShakingGrass: + call EndSpriteMovement + call ._MovementShadow_Grass_Emote_BoulderDust + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_GRASS_SHAKE + ld hl, OBJECT_STEP_DURATION + add hl, de + ld a, [hl] + add -1 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_TRACKING_OBJECT + ret + +._MovementShadow_Grass_Emote_BoulderDust: + ld hl, OBJECT_RANGE + add hl, bc + ld a, [hl] + push bc + call GetObjectStruct + ld d, b + ld e, c + pop bc + ld hl, OBJECT_1D + add hl, bc + ld [hl], e + inc hl + ld [hl], d + ret + +.MovementScreenShake: + call EndSpriteMovement + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_00 + ld hl, OBJECT_RANGE + add hl, bc + ld a, [hl] + call ._MovementScreenShake + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], e + ld hl, OBJECT_1E + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_15 + ret + +._MovementScreenShake: + ld d, a + and %00111111 + ld e, a + ld a, d + rlca + rlca + and %00000011 + ld d, a + inc d + ld a, 1 +.loop + dec d + ret z + add a + jr .loop + +.RandomWalkContinue: + call InitStep + call Function6ec1 ; check whether the object can move in that direction + jr c, .NewDuration + call UpdateTallGrassFlags + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STEP + ld hl, wCenteredObject + ld a, [hMapObjectIndexBuffer] + cp [hl] + jr z, .load_6 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_07 + ret + +.load_6 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_PLAYER_WALK + ret + +.NewDuration: + call EndSpriteMovement + call Function462a +RandomStepDuration_Slow: ; 4b1d + call Random + ld a, [hRandomAdd] + and %01111111 + jr SetRandomStepDuration +; 4b26 + +RandomStepDuration_Fast: ; 4b26 + call Random + ld a, [hRandomAdd] + and %00011111 +SetRandomStepDuration: ; 4b2d + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_03 + ret +; 4b45 + +StepTypesJumptable: ; 4b45 +; entries correspond to STEP_TYPE_* constants + dw ObjectMovementReset ; 00 + dw MapObjectMovementPattern ; 01 + dw NPCStep ; 02 + dw StepType03 ; 03 + dw StepType04 ; 04 + dw StepType05 ; 05 + dw PlayerStep ; 06 + dw StepType07 ; 07 + dw NPCJump ; 08 + dw PlayerJump ; 09 + dw PlayerOrNPCTurnStep ; 0a + dw StepTypeBump ; 0b + dw TeleportFrom ; 0c + dw TeleportTo ; 0d + dw Skyfall ; 0e + dw StepType0f ; 0f + dw GotBiteStep ; 10 + dw RockSmashStep ; 11 + dw ReturnDigStep ; 12 + dw StepTypeTrackingObject ; 13 + dw StepType14 ; 14 + dw StepType15 ; 15 + dw StepType16 ; 16 + dw StepType17 ; 17 + dw StepType18 ; 18 + dw SkyfallTop ; 19 +; 4b79 + +WaitStep_InPlace: ; 4b79 + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4b86 + +NPCJump: ; 4b86 + call Field1cAnonymousJumptable +; anonymous dw + dw .Jump + dw .Land + +.Jump: + call AddStepVector + call UpdateJumpPosition + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call CopyNextCoordsTileToStandingCoordsTile + call GetNextTile + ld hl, OBJECT_FLAGS2 + add hl, bc + res 3, [hl] + call IncrementObjectStructField1c + ret + +.Land: + call AddStepVector + call UpdateJumpPosition + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call CopyNextCoordsTileToStandingCoordsTile + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4bbf + +PlayerJump: ; 4bbf + call Field1cAnonymousJumptable +; anonymous dw + dw .initjump + dw .stepjump + dw .initland + dw .stepland + +.initjump + ld hl, wPlayerStepFlags + set 7, [hl] + call IncrementObjectStructField1c +.stepjump + call UpdateJumpPosition + call UpdatePlayerStep + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call CopyNextCoordsTileToStandingCoordsTile + ld hl, OBJECT_FLAGS2 + add hl, bc + res 3, [hl] + ld hl, wPlayerStepFlags + set 6, [hl] + set 4, [hl] + call IncrementObjectStructField1c + ret + +.initland + call GetNextTile + ld hl, wPlayerStepFlags + set 7, [hl] + call IncrementObjectStructField1c +.stepland + call UpdateJumpPosition + call UpdatePlayerStep + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, wPlayerStepFlags + set 6, [hl] + call CopyNextCoordsTileToStandingCoordsTile + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4c18 + +TeleportFrom: ; 4c18 + call Field1cAnonymousJumptable +; anonymous dw + dw .InitSpin + dw .DoSpin + dw .InitSpinRise + dw .DoSpinRise +; 4c23 + +.InitSpin: + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 16 + call IncrementObjectStructField1c +.DoSpin: + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_SPIN + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call IncrementObjectStructField1c + ret + +.InitSpinRise: + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], 0 + ld hl, OBJECT_1F + add hl, bc + ld [hl], $10 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 16 + ld hl, OBJECT_FLAGS2 + add hl, bc + res 3, [hl] + call IncrementObjectStructField1c +.DoSpinRise: + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_SPIN + ld hl, OBJECT_1F + add hl, bc + inc [hl] + ld a, [hl] + ld d, $60 + call Sine + ld a, h + sub $60 + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4c89 + +TeleportTo: ; 4c89 + call Field1cAnonymousJumptable +; anonymous dw + dw .InitWait + dw .DoWait + dw .InitDescent + dw .DoDescent + dw .InitFinalSpin + dw .DoFinalSpin + dw .FinishStep +; 4c9a + +.InitWait: + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_00 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 16 + call IncrementObjectStructField1c + ret +; 4caa + +.DoWait: + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call IncrementObjectStructField1c +.InitDescent: + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], 0 + ld hl, OBJECT_1F + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 16 + call IncrementObjectStructField1c + ret +; 4cc9 + +.DoDescent: + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_SPIN + ld hl, OBJECT_1F + add hl, bc + inc [hl] + ld a, [hl] + ld d, $60 + call Sine + ld a, h + sub $60 + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call IncrementObjectStructField1c +.InitFinalSpin: + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 16 + call IncrementObjectStructField1c + ret +; 4cf5 + +.DoFinalSpin: + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_SPIN + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz +.FinishStep: + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], 0 + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4d14 + +Skyfall: ; 4d14 + call Field1cAnonymousJumptable +; anonymous dw + dw .Init + dw .Step + dw .Fall + dw .Finish +; 4d1f + +.Init: + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_00 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 16 + call IncrementObjectStructField1c +.Step: + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STEP + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], 0 + ld hl, OBJECT_1F + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 16 + call IncrementObjectStructField1c +.Fall: + ld hl, OBJECT_1F + add hl, bc + inc [hl] + ld a, [hl] + ld d, $60 + call Sine + ld a, h + sub $60 + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call IncrementObjectStructField1c +.Finish: + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], 0 + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4d7e + +GotBiteStep: ; 4d7e + call Field1cAnonymousJumptable +; anonymous dw + dw .Init + dw .Run +; 4d85 + +.Init: + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 8 + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], 0 + call IncrementObjectStructField1c +.Run: + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld a, [hl] + xor 1 + ld [hl], a + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4daf + +RockSmashStep: ; 4daf + call .Step + jp WaitStep_InPlace +; 4db5 + +.Step: + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld a, [hl] + and %00000001 + ld a, OBJECT_ACTION_STAND + jr z, .yes + ld a, OBJECT_ACTION_00 +.yes + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], a + ret +; 4dc8 + +ReturnDigStep: ; 4dc8 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld a, [hl] + and %00000001 + ld a, OBJECT_ACTION_SPIN + jr z, .yes + ld a, OBJECT_ACTION_SPIN_FLICKER +.yes + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], a + jp WaitStep_InPlace +; 4ddd + +StepType03: ; 4ddd + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4df0 + +StepType18: ; 4df0 + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + jp DeleteMapObject +; 4dff + +StepTypeBump: ; 4dff + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4e0c + +StepType05: ; 4e0c + call Field1cAnonymousJumptable +; anonymous dw + dw .Reset + dw StepType04 + +.Reset: + call RestoreDefaultMovement + call GetInitialFacing + ld hl, OBJECT_FACING + add hl, bc + ld [hl], a + call IncrementObjectStructField1c +StepType04: ; 4e21 + call Stubbed_Function4fb2 + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret +; 4e2b + +NPCStep: ; 4e2b + call Stubbed_Function4fb2 + call AddStepVector + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call CopyNextCoordsTileToStandingCoordsTile + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4e47 + +StepType07: ; 4e47 + call AddStepVector + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call CopyNextCoordsTileToStandingCoordsTile + jp RandomStepDuration_Slow +; 4e56 + +PlayerStep: ; 4e56 +; AnimateStep? + call Field1cAnonymousJumptable +; anonymous dw + dw .init + dw .step + +.init + ld hl, wPlayerStepFlags + set 7, [hl] + call IncrementObjectStructField1c +.step + call UpdatePlayerStep + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, wPlayerStepFlags + set 6, [hl] + call CopyNextCoordsTileToStandingCoordsTile + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4e83 + +PlayerOrNPCTurnStep: ; 4e83 + call Field1cAnonymousJumptable +; anonymous dw + dw .init1 + dw .step1 + dw .init2 + dw .step2 + +.init1 + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld a, [hl] + ld [hl], 2 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 2 + call IncrementObjectStructField1c +.step1 + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + call IncrementObjectStructField1c +.init2 + ld hl, OBJECT_1D ; new facing + add hl, bc + ld a, [hl] + ld hl, OBJECT_FACING + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 2 + call IncrementObjectStructField1c +.step2 + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4ecd + +StepType0f: ; 4ecd + call AddStepVector + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + push bc + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, bc + ld a, [hl] + ld b, a + farcall CopyDECoordsToMapObject + pop bc + ld hl, OBJECT_FLAGS2 + add hl, bc + res 2, [hl] + call CopyNextCoordsTileToStandingCoordsTile + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4f04 + +StepTypeTrackingObject: ; 4f04 + ld hl, OBJECT_1D + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + ld hl, OBJECT_SPRITE + add hl, de + ld a, [hl] + and a + jr z, .nope + ld hl, OBJECT_SPRITE_X + add hl, de + ld a, [hl] + ld hl, OBJECT_SPRITE_X + add hl, bc + ld [hl], a + ld hl, OBJECT_SPRITE_Y + add hl, de + ld a, [hl] + ld hl, OBJECT_SPRITE_Y + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld a, [hl] + and a + ret z + dec [hl] + ret nz +.nope + jp DeleteMapObject +; 4f33 + +StepType14: ; 4f33 +StepType15: ; 4f33 + call Field1cAnonymousJumptable +; anonymous dw + dw .Init + dw .Run + +.Init: + xor a + ld hl, OBJECT_1D + add hl, bc + ld [hl], a + call IncrementObjectStructField1c +.Run: + ld hl, OBJECT_1D + add hl, bc + ld d, [hl] + ld a, [wPlayerStepVectorY] + sub d + ld [wPlayerStepVectorY], a + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + jr z, .ok + ld a, [hl] + call .GetSign + ld hl, OBJECT_1D + add hl, bc + ld [hl], a + ld d, a + ld a, [wPlayerStepVectorY] + add d + ld [wPlayerStepVectorY], a + ret + +.ok + call DeleteMapObject + ret + +.GetSign: + ld hl, OBJECT_1E + add hl, bc + and 1 + ld a, [hl] + ret z + cpl + inc a + ret +; 4f77 + +StepType16: ; 4f77 + call Field1cAnonymousJumptable ; ???? +; 4f7a +StepType17: ; 4f7a + call Field1cAnonymousJumptable +; anonymous dw + dw .null + dw .null + dw .null +.null +; 4f83 + +SkyfallTop: ; 4f83 + call Field1cAnonymousJumptable +; anonymous dw + dw .Init + dw .Run + +.Init: + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_SKYFALL + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], 16 + call IncrementObjectStructField1c + +.Run: + ld hl, OBJECT_STEP_DURATION + add hl, bc + dec [hl] + ret nz + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], $60 + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], 0 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 4fb2 + +Stubbed_Function4fb2: + ret + ld hl, OBJECT_1D + add hl, bc + inc [hl] + ld a, [hl] + srl a + srl a + and %00000111 + ld l, a + ld h, 0 + ld de, .y + add hl, de + ld a, [hl] + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], a + ret + +.y ; 4fcd + db 0, -1, -2, -3, -4, -3, -2, -1 +; 4fd5 +UpdateJumpPosition: ; 4fd5 + call GetStepVector + ld a, h + ld hl, OBJECT_1F + add hl, bc + ld e, [hl] + add e + ld [hl], a + nop + srl e + ld d, 0 + ld hl, .y + add hl, de + ld a, [hl] + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld [hl], a + ret + +.y ; 4ff0 + db -4, -6, -8, -10, -11, -12, -12, -12 + db -11, -10, -9, -8, -6, -4, 0, 0 +; 5000 +Function5000: ; unscripted? +; copy [wPlayerNextMovement] to [wPlayerMovement] + ld a, [wPlayerNextMovement] + ld hl, wPlayerMovement + ld [hl], a +; load [wPlayerNextMovement] with movement_step_sleep + ld a, movement_step_sleep + ld [wPlayerNextMovement], a +; recover the previous value of [wPlayerNextMovement] + ld a, [hl] + ret +; 500e + +GetMovementByte: + ld hl, wMovementDataPointer + call _GetMovementByte + ret +; 5015 + +Function5015: ; 5015 + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + ld e, [hl] + inc [hl] + ld d, 0 + ld hl, wc2e2 + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ld a, [hl] + ret +; 5026 + +Function5026: ; 5026 + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + ld e, [hl] + inc [hl] + ld d, 0 + ld hl, wc2e6 + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ld a, [hl] + ret +; 5037 + +_GetMovementObject: ; 5037 + ld hl, GetMovementObject + jp HandleMovementData +; 503d + +GetMovementObject: ; 503d + ld a, [wMovementObject] + ret +; 5041 + +HandleMovementData: ; 5041 + call .StorePointer +.loop + xor a + ld [wMovementByteWasControlSwitch], a + call JumpMovementPointer + call DoMovementFunction + ld a, [wMovementByteWasControlSwitch] + and a + jr nz, .loop + ret + +.StorePointer: + ld a, l + ld [wMovementPointer], a + ld a, h + ld [wMovementPointer + 1], a + ret +; 505e + +JumpMovementPointer: ; 505e + ld hl, wMovementPointer + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 5065 + +ContinueReadingMovement: ; 5065 + ld a, 1 + ld [wMovementByteWasControlSwitch], a + ret +; 506b + +DoMovementFunction: ; 506b + push af + call ApplyMovementToFollower + pop af + ld hl, MovementPointers + rst JumpTable + ret +; 5075 + +INCLUDE "engine/overworld/movement.asm" +; 54b8 + +ApplyMovementToFollower: ; 54b8 + ld e, a + ld a, [wObjectFollow_Follower] + cp -1 + ret z + ld a, [wObjectFollow_Leader] + ld d, a + ld a, [hMapObjectIndexBuffer] + cp d + ret nz + ld a, e + cp movement_step_sleep + ret z + cp movement_step_end + ret z + cp movement_step_4b + ret z + cp movement_step_bump + ret z + cp movement_slow_step + ret c + push af + ld hl, wFollowerMovementQueueLength + inc [hl] + ld e, [hl] + ld d, 0 + ld hl, wFollowMovementQueue + add hl, de + pop af + ld [hl], a + ret +; 54e6 + +GetFollowerNextMovementByte: ; 54e6 + ld hl, wFollowerMovementQueueLength + ld a, [hl] + and a + jr z, .done + cp -1 + jr z, .done + dec [hl] + ld e, a + ld d, 0 + ld hl, wFollowMovementQueue + add hl, de + inc e + ld a, -1 +.loop + ld d, [hl] + ld [hld], a + ld a, d + dec e + jr nz, .loop + ret + +.done + call .CancelFollowIfLeaderMissing + ret c + ld a, movement_step_sleep + ret + +.CancelFollowIfLeaderMissing: + ld a, [wObjectFollow_Leader] + cp -1 + jr z, .nope + push bc + call GetObjectStruct + ld hl, OBJECT_SPRITE + add hl, bc + ld a, [hl] + pop bc + and a + jr z, .nope + and a + ret + +.nope + ld a, -1 + ld [wObjectFollow_Follower], a + ld a, movement_step_end + scf + ret +; 5529 + +SpawnShadow: ; 5529 + push bc + ld de, .ShadowObject + call CopyTempObjectData + call InitTempObject + pop bc + ret + +.ShadowObject: + ; vtile, palette, movement + db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SHADOW +; 5538 + +SpawnStrengthBoulderDust: ; 5538 + push bc + ld de, .BoulderDustObject + call CopyTempObjectData + call InitTempObject + pop bc + ret + +.BoulderDustObject: + db $00, PAL_OW_SILVER, SPRITEMOVEDATA_BOULDERDUST +; 5547 + +SpawnEmote: ; 5547 + push bc + ld de, .EmoteObject + call CopyTempObjectData + call InitTempObject + pop bc + ret + +.EmoteObject: + db $00, PAL_OW_SILVER, SPRITEMOVEDATA_EMOTE +; 5556 + +ShakeGrass: ; 5556 + push bc + ld de, .data_5562 + call CopyTempObjectData + call InitTempObject + pop bc + ret + +.data_5562 + db $00, PAL_OW_TREE, SPRITEMOVEDATA_GRASS +; 5565 + +ShakeScreen: ; 5565 + push bc + push af + ld de, .ScreenShakeObject + call CopyTempObjectData + pop af + ld [wTempObjectCopyRange], a + call InitTempObject + pop bc + ret + +.ScreenShakeObject: + db $00, PAL_OW_SILVER, SPRITEMOVEDATA_SCREENSHAKE +; 5579 +DespawnEmote: ; 5579 + push bc + ld a, [hMapObjectIndexBuffer] + ld c, a + call .DeleteEmote + pop bc + ret + +.DeleteEmote: + ld de, wObjectStructs + ld a, NUM_OBJECT_STRUCTS +.loop + push af + ld hl, OBJECT_FLAGS1 + add hl, de + bit EMOTE_OBJECT, [hl] + jr z, .next + ld hl, OBJECT_SPRITE + add hl, de + ld a, [hl] + and a + jr z, .next + push bc + xor a + ld bc, OBJECT_STRUCT_LENGTH + call ByteFill + pop bc +.next + ld hl, OBJECT_STRUCT_LENGTH + add hl, de + ld d, h + ld e, l + pop af + dec a + jr nz, .loop + ret +; 55ac + +InitTempObject: ; 55ac + call FindFirstEmptyObjectStruct + ret nc + ld d, h + ld e, l + farcall CopyTempObjectToObjectStruct + ret +; 55b9 + +CopyTempObjectData: ; 55b9 +; load into wTempObjectCopy: +; -1, -1, [de], [de + 1], [de + 2], [hMapObjectIndexBuffer], [NextMapX], [NextMapY], -1 +; This spawns the object at the same place as whichever object is loaded into bc. + ld hl, wTempObjectCopyMapObjectIndex + ld [hl], -1 + inc hl + ld [hl], -1 + inc hl + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hli], a + ld a, [hMapObjectIndexBuffer] + ld [hli], a + push hl + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + pop hl + ld [hl], d + inc hl + ld [hl], e + inc hl + ld [hl], -1 + ret +; 55e0 + +Function55e0:: ; 55e0 + ld a, [wVramState] + bit 0, a + ret z + ld bc, wObjectStructs + xor a +.loop + ld [hMapObjectIndexBuffer], a + call DoesObjectHaveASprite + jr z, .ok + call Function565c +.ok + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + ld a, [hMapObjectIndexBuffer] + inc a + cp NUM_OBJECT_STRUCTS + jr nz, .loop + ret +; 5602 + +Function5602: ; 5602, called at battle start + call Function5645 ; clear sprites + ld a, PLAYER + call Function5629 ; respawn player + ld a, [wBattleScriptFlags] + bit 7, a + jr z, .ok + ld a, [hLastTalked] + and a + jr z, .ok + call Function5629 ; respawn opponent +.ok + call _UpdateSprites + ret +; 561d + +Function561d: ; 561d + call Function5645 ; clear sprites + ld a, PLAYER + call Function5629 ; respawn player + call _UpdateSprites + ret +; 5629 + +Function5629: ; 5629 + cp NUM_OBJECTS + ret nc + call GetMapObject + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + cp -1 + ret z + cp NUM_OBJECT_STRUCTS + ret nc + call GetObjectStruct + call DoesObjectHaveASprite + ret z + call Function5673 + ret +; 5645 + +Function5645: ; 5645 + xor a + ld bc, wObjectStructs +.loop + ld [hMapObjectIndexBuffer], a + call SetFacing_Standing + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + ld a, [hMapObjectIndexBuffer] + inc a + cp NUM_OBJECT_STRUCTS + jr nz, .loop + ret +; 565c + +Function565c: ; 565c + push bc + call Function56cd + pop bc + jr c, SetFacing_Standing + call Function56a3 + jr c, SetFacing_Standing + call Function5688 + farcall Function4440 + xor a + ret +; 5673 + +Function5673: ; 5673 + call Function56a3 + jr c, SetFacing_Standing + farcall Function4440 ; no need to farcall + xor a + ret +; 5680 + +SetFacing_Standing: ; 5680 + ld hl, OBJECT_FACING_STEP + add hl, bc + ld [hl], STANDING + scf + ret +; 5688 + +Function5688: ; 5688 + push bc + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + call GetCoordTile + pop bc + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld [hl], a + farcall UpdateTallGrassFlags ; no need to farcall + ret +; 56a3 + +Function56a3: ; 56a3 + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + inc d + inc e + ld a, [wXCoord] + cp d + jr z, .equal_x + jr nc, .nope + add MAPOBJECT_SCREEN_WIDTH - 1 + cp d + jr c, .nope +.equal_x + ld a, [wYCoord] + cp e + jr z, .equal_y + jr nc, .nope + add MAPOBJECT_SCREEN_HEIGHT - 1 + cp e + jr c, .nope +.equal_y + xor a + ret + +.nope + scf + ret +; 56cd + +Function56cd: ; 56cd + ld a, [wPlayerBGMapOffsetX] + ld d, a + ld hl, OBJECT_SPRITE_X_OFFSET + add hl, bc + ld a, [hl] + ld hl, OBJECT_SPRITE_X + add hl, bc + add [hl] + add d + cp $f0 + jr nc, .ok1 + cp $a0 + jp nc, .nope +.ok1 + and %00000111 + ld d, 2 + cp 4 + jr c, .ok2 + ld d, 3 +.ok2 + ld a, [hl] + srl a + srl a + srl a + cp SCREEN_WIDTH + jr c, .ok3 + sub BG_MAP_WIDTH +.ok3 + ld [hUsedSpriteIndex], a + ld a, [wPlayerBGMapOffsetY] + ld e, a + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + ld a, [hl] + ld hl, OBJECT_SPRITE_Y + add hl, bc + add [hl] + add e + cp $f0 + jr nc, .ok4 + cp $90 + jr nc, .nope +.ok4 + and %00000111 + ld e, 2 + cp 4 + jr c, .ok5 + ld e, 3 +.ok5 + ld a, [hl] + srl a + srl a + srl a + cp SCREEN_HEIGHT + jr c, .ok6 + sub BG_MAP_HEIGHT +.ok6 + ld [hUsedSpriteTile], a + ld hl, OBJECT_PALETTE + add hl, bc + bit 7, [hl] + jr z, .ok7 + ld a, d + add 2 + ld d, a + ld a, e + add 2 + ld e, a +.ok7 + ld a, d + ld [hFFBF], a +.loop + ld a, [hFFBF] + ld d, a + ld a, [hUsedSpriteTile] + add e + dec a + cp SCREEN_HEIGHT + jr nc, .ok9 + ld b, a +.next + ld a, [hUsedSpriteIndex] + add d + dec a + cp SCREEN_WIDTH + jr nc, .ok8 + ld c, a + push bc + call Coord2Tile + pop bc +; NPCs disappear if standing on tile $60-$7f (or $e0-$ff), +; since those IDs are for text characters and textbox frames. + ld a, [hl] + cp FIRST_REGULAR_TEXT_CHAR + jr nc, .nope +.ok8 + dec d + jr nz, .next +.ok9 + dec e + jr nz, .loop + and a + ret + +.nope + scf + ret +; 576a + +HandleNPCStep:: ; 576a + call .ResetStepVector + call .DoStepsForAllObjects + ret + +.ResetStepVector: + xor a + ld [wPlayerStepVectorX], a + ld [wPlayerStepVectorY], a + ld [wPlayerStepFlags], a + ld a, -1 + ld [wPlayerStepDirection], a + ret + +.DoStepsForAllObjects: + ld bc, wObjectStructs + xor a +.loop + ld [hMapObjectIndexBuffer], a + call DoesObjectHaveASprite + jr z, .next + call Function437b +.next + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + ld a, [hMapObjectIndexBuffer] + inc a + cp NUM_OBJECT_STRUCTS + jr nz, .loop + ret +; 579d + +RefreshPlayerSprite: ; 579d + ld a, movement_step_sleep + ld [wPlayerNextMovement], a + ld [wPlayerMovement], a + xor a + ld [wPlayerTurningDirection], a + ld [wPlayerObjectStepFrame], a + call .TryResetPlayerAction + farcall CheckWarpFacingDown + call c, SpawnInFacingDown + call .SpawnInCustomFacing + ret +; 57bc + +.TryResetPlayerAction: ; 57bc + ld hl, wPlayerSpriteSetupFlags + bit PLAYERSPRITESETUP_RESET_ACTION_F, [hl] + jr nz, .ok + ret + +.ok + ld a, OBJECT_ACTION_00 + ld [wPlayerAction], a + ret +; 57ca + +.SpawnInCustomFacing: ; 57ca + ld hl, wPlayerSpriteSetupFlags + bit PLAYERSPRITESETUP_CUSTOM_FACING_F, [hl] + ret z + ld a, [wPlayerSpriteSetupFlags] + and PLAYERSPRITESETUP_FACING_MASK + add a + add a + jr ContinueSpawnFacing +; 57d9 + +SpawnInFacingDown: ; 57d9 + ld a, 0 +ContinueSpawnFacing: ; 57db + ld bc, wPlayerStruct + call SetSpriteDirection + ret +; 57e2 + +_SetPlayerPalette: ; 57e2 + ld a, d + and %10000000 + ret z + ld bc, 0 ; debug? + ld hl, OBJECT_FACING + add hl, bc + ld a, [hl] + or d + ld [hl], a + ld a, d + swap a + and %00000111 + ld d, a + ld bc, wPlayerStruct + ld hl, OBJECT_PALETTE + add hl, bc + ld a, [hl] + and %11111000 + or d + ld [hl], a + ret +; 5803 + +StartFollow:: ; 5803 + push bc + ld a, b + call SetLeaderIfVisible + pop bc + ret c + ld a, c + call SetFollowerIfVisible + farcall QueueFollowerFirstStep + ret +; 5815 + +SetLeaderIfVisible: ; 5815 + call CheckObjectVisibility + ret c + ld a, [hObjectStructIndexBuffer] + ld [wObjectFollow_Leader], a + ret +; 581f + +StopFollow:: ; 581f + call ResetLeader + call ResetFollower + ret +; 5826 + +ResetLeader: ; 5826 + ld a, -1 + ld [wObjectFollow_Leader], a + ret +; 582c + +SetFollowerIfVisible: ; 582c + push af + call ResetFollower + pop af + call CheckObjectVisibility + ret c + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld [hl], SPRITEMOVEDATA_FOLLOWING + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_00 + ld a, [hObjectStructIndexBuffer] + ld [wObjectFollow_Follower], a + ret +; 5847 + +ResetFollower: ; 5847 + ld a, [wObjectFollow_Follower] + cp -1 + ret z + call GetObjectStruct + farcall Function58e3 ; no need to bankswitch + ld a, -1 + ld [wObjectFollow_Follower], a + ret +; 585c + +SetFlagsForMovement_1:: ; 585c + ld a, c + call CheckObjectVisibility + ret c + push bc + call Function587a + pop bc + ld hl, OBJECT_FLAGS2 + add hl, bc + res 5, [hl] + xor a + ret +; 586e + +Function586e: ; 586e + call CheckObjectVisibility + ret c + ld hl, OBJECT_FLAGS2 + add hl, bc + set 5, [hl] + xor a + ret +; 587a + +Function587a: ; 587a + ld bc, wObjectStructs + xor a +.loop + push af + call DoesObjectHaveASprite + jr z, .next + ld hl, OBJECT_FLAGS2 + add hl, bc + set 5, [hl] +.next + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + pop af + inc a + cp NUM_OBJECT_STRUCTS + jr nz, .loop + ret +; 5897 + +_SetFlagsForMovement_2:: ; 5897 + ld a, [wObjectFollow_Leader] + cp -1 + ret z + push bc + call GetObjectStruct + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, bc + ld a, [hl] + pop bc + cp c + ret nz + ld a, [wObjectFollow_Follower] + cp -1 + ret z + call GetObjectStruct + ld hl, OBJECT_FLAGS2 + add hl, bc + res 5, [hl] + ret +; 58b9 + +Function58b9:: ; 58b9 + push bc + ld bc, wObjectStructs + xor a +.loop + push af + call DoesObjectHaveASprite + jr z, .next + ld hl, OBJECT_FLAGS2 + add hl, bc + res 5, [hl] +.next + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + pop af + inc a + cp NUM_OBJECT_STRUCTS + jr nz, .loop + pop bc + ret +; 58d8 + +Function58d8: ; 58d8 + call CheckObjectVisibility + ret c + ld hl, OBJECT_FLAGS2 + add hl, bc + res 5, [hl] + ret +; 58e3 + +Function58e3: ; 58e3 + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, bc + ld a, [hl] + cp -1 + jp z, Function5903 ; a jr would have been appropriate here + push bc + call GetMapObject + ld hl, MAPOBJECT_MOVEMENT + add hl, bc + ld a, [hl] + pop bc + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_00 + ret +; 5903 + +Function5903: ; 5903 + call GetSpriteDirection + rrca + rrca + ld e, a + ld d, 0 + ld hl, .standing_movefns + add hl, de + ld a, [hl] + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_00 + ret + +.standing_movefns + db SPRITEMOVEDATA_STANDING_DOWN + db SPRITEMOVEDATA_STANDING_UP + db SPRITEMOVEDATA_STANDING_LEFT + db SPRITEMOVEDATA_STANDING_RIGHT +; 5920 + +_UpdateSprites:: ; 5920 + ld a, [wVramState] + bit 0, a + ret z + xor a + ld [hUsedSpriteIndex], a + ld a, [hOAMUpdate] + push af + ld a, 1 + ld [hOAMUpdate], a + call InitSprites + call .fill + pop af + ld [hOAMUpdate], a + ret + +.fill + ld a, [wVramState] + bit 1, a + ld b, LOW(wVirtualOAMEnd) + jr z, .ok + ld b, 28 * SPRITEOAMSTRUCT_LENGTH +.ok + ld a, [hUsedSpriteIndex] + cp b + ret nc + ld l, a + ld h, HIGH(wVirtualOAM) + ld de, SPRITEOAMSTRUCT_LENGTH + ld a, b + ld c, SCREEN_HEIGHT_PX + 2 * TILE_WIDTH +.loop + ld [hl], c ; y + add hl, de + cp l + jr nz, .loop + ret +; 5958 + +ApplyBGMapAnchorToObjects: ; 5958 + push hl + push de + push bc + ld a, [wPlayerBGMapOffsetX] + ld d, a + ld a, [wPlayerBGMapOffsetY] + ld e, a + ld bc, wObjectStructs + ld a, NUM_OBJECT_STRUCTS +.loop + push af + call DoesObjectHaveASprite + jr z, .skip + ld hl, OBJECT_SPRITE_X + add hl, bc + ld a, [hl] + add d + ld [hl], a + ld hl, OBJECT_SPRITE_Y + add hl, bc + ld a, [hl] + add e + ld [hl], a +.skip + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + pop af + dec a + jr nz, .loop + xor a + ld [wPlayerBGMapOffsetX], a + ld [wPlayerBGMapOffsetY], a + pop bc + pop de + pop hl + ret +; 5991 + + +PRIORITY_LOW EQU $10 +PRIORITY_NORM EQU $20 +PRIORITY_HIGH EQU $30 + +InitSprites: ; 5991 + call .DeterminePriorities + ld c, PRIORITY_HIGH + call .InitSpritesByPriority + ld c, PRIORITY_NORM + call .InitSpritesByPriority + ld c, PRIORITY_LOW + call .InitSpritesByPriority + ret + +.DeterminePriorities: + xor a + ld hl, wMovementPointer + ld bc, NUM_OBJECT_STRUCTS + call ByteFill + ld d, 0 + ld bc, wObjectStructs + ld hl, wMovementPointer +.loop + push hl + call DoesObjectHaveASprite + jr z, .skip + ld hl, OBJECT_FACING_STEP + add hl, bc + ld a, [hl] + cp STANDING + jr z, .skip +; Define the sprite priority. + ld e, PRIORITY_LOW + ld hl, OBJECT_FLAGS2 + add hl, bc + bit LOW_PRIORITY, [hl] + jr nz, .add + ld e, PRIORITY_NORM + bit HIGH_PRIORITY, [hl] + jr z, .add + ld e, PRIORITY_HIGH + jr .add + +.skip + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + pop hl + jr .next + +.add + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + pop hl + ld a, d + or e + ld [hli], a +.next + inc d + ld a, d + cp NUM_OBJECT_STRUCTS + jr nz, .loop + ret + +.InitSpritesByPriority: + ld hl, wMovementPointer +.next_sprite + ld a, [hli] + ld d, a + and $f0 + ret z + cp c + jr nz, .next_sprite + push bc + push hl + ld a, d + and $f + call .GetObjectStructPointer + call .InitSprite + pop hl + pop bc + jr .next_sprite + +.InitSprite: + ld hl, OBJECT_SPRITE_TILE + add hl, bc + ld a, [hl] + and %01111111 + ld [hFFC1], a + xor a + bit 7, [hl] + jr nz, .skip1 + or %00001000 +.skip1 + ld hl, OBJECT_FLAGS2 + add hl, bc + ld e, [hl] + bit 7, e + jr z, .skip2 + or %10000000 +.skip2 + bit 4, e + jr z, .skip3 + or %00010000 +.skip3 + ld hl, OBJECT_PALETTE + add hl, bc + ld d, a + ld a, [hl] + and %00000111 + or d + ld d, a + xor a + bit 3, e + jr z, .skip4 + or %10000000 +.skip4 + ld [hFFC2], a + ld hl, OBJECT_SPRITE_X + add hl, bc + ld a, [hl] + ld hl, OBJECT_SPRITE_X_OFFSET + add hl, bc + add [hl] + add 8 + ld e, a + ld a, [wPlayerBGMapOffsetX] + add e + ld [hFFBF], a + ld hl, OBJECT_SPRITE_Y + add hl, bc + ld a, [hl] + ld hl, OBJECT_SPRITE_Y_OFFSET + add hl, bc + add [hl] + add 12 + ld e, a + ld a, [wPlayerBGMapOffsetY] + add e + ld [hFFC0], a + ld hl, OBJECT_FACING_STEP + add hl, bc + ld a, [hl] + cp STANDING + jp z, .done + cp NUM_FACINGS + jp nc, .done + ld l, a + ld h, 0 + add hl, hl + ld bc, Facings + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hUsedSpriteIndex] + ld c, a + ld b, HIGH(wVirtualOAM) + ld a, [hli] + ld [hUsedSpriteTile], a + add c + cp LOW(wVirtualOAMEnd) + jr nc, .full +.addsprite + ld a, [hFFC0] + add [hl] + inc hl + ld [bc], a ; y + inc c + ld a, [hFFBF] + add [hl] + inc hl + ld [bc], a ; x + inc c + ld e, [hl] + inc hl + ld a, [hFFC1] + bit 2, e + jr z, .nope1 + xor a +.nope1 + add [hl] + inc hl + ld [bc], a ; tile id + inc c + ld a, e + bit 1, a + jr z, .nope2 + ld a, [hFFC2] + or e +.nope2 + and OBP_NUM | X_FLIP | Y_FLIP | PRIORITY + or d + ld [bc], a ; attributes + inc c + ld a, [hUsedSpriteTile] + dec a + ld [hUsedSpriteTile], a + jr nz, .addsprite + ld a, c + ld [hUsedSpriteIndex], a +.done + xor a + ret + +.full + scf + ret + +.GetObjectStructPointer: + ld c, a + ld b, 0 + ld hl, .Addresses + add hl, bc + add hl, bc + ld c, [hl] + inc hl + ld b, [hl] + ret + +.Addresses: ; 5ace + dw wPlayerStruct + dw wObject1Struct + dw wObject2Struct + dw wObject3Struct + dw wObject4Struct + dw wObject5Struct + dw wObject6Struct + dw wObject7Struct + dw wObject8Struct + dw wObject9Struct + dw wObject10Struct + dw wObject11Struct + dw wObject12Struct +; 5ae8 diff --git a/engine/overworld/map_objects_2.asm b/engine/overworld/map_objects_2.asm new file mode 100644 index 000000000..038e2b49b --- /dev/null +++ b/engine/overworld/map_objects_2.asm @@ -0,0 +1,70 @@ +LoadObjectMasks: ; 2454f + ld hl, wObjectMasks + xor a + ld bc, NUM_OBJECTS + call ByteFill + nop + ld bc, wMapObjects + ld de, wObjectMasks + xor a +.loop + push af + push bc + push de + call GetObjectTimeMask + jr c, .next + call CheckObjectFlag +.next + pop de + ld [de], a + inc de + pop bc + ld hl, OBJECT_LENGTH + add hl, bc + ld b, h + ld c, l + pop af + inc a + cp NUM_OBJECTS + jr nz, .loop + ret + +CheckObjectFlag: ; 2457d (9:457d) + ld hl, MAPOBJECT_SPRITE + add hl, bc + ld a, [hl] + and a + jr z, .masked + ld hl, MAPOBJECT_EVENT_FLAG + add hl, bc + ld a, [hli] + ld e, a + ld a, [hl] + ld d, a + cp -1 + jr nz, .check + ld a, e + cp -1 + jr z, .unmasked + jr .masked +.check + ld b, CHECK_FLAG + call EventFlagAction + ld a, c + and a + jr nz, .masked +.unmasked + xor a + ret + +.masked + ld a, -1 + scf + ret + +GetObjectTimeMask: ; 245a7 (9:45a7) + call CheckObjectTime + ld a, -1 + ret c + xor a + ret diff --git a/engine/overworld/map_setup.asm b/engine/overworld/map_setup.asm new file mode 100644 index 000000000..268574de0 --- /dev/null +++ b/engine/overworld/map_setup.asm @@ -0,0 +1,260 @@ +RunMapSetupScript:: ; 15363 + ld a, [hMapEntryMethod] + and $f + dec a + ld c, a + ld b, 0 + ld hl, MapSetupScripts + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call ReadMapSetupScript + ret +; 15377 + +INCLUDE "data/maps/setup_scripts.asm" + +ReadMapSetupScript: ; 1541d +.loop + ld a, [hli] + cp -1 + ret z + + push hl + + ld c, a + ld b, 0 + ld hl, MapSetupCommands + add hl, bc + add hl, bc + add hl, bc + + ; bank + ld b, [hl] + inc hl + + ; address + ld a, [hli] + ld h, [hl] + ld l, a + + ; Bit 7 of the bank indicates a parameter. + ; This is left unused. + bit 7, b + jr z, .go + + pop de + ld a, [de] + ld c, a + inc de + push de + +.go + ld a, b + and $7f + rst FarCall + + pop hl + jr .loop +; 15440 + +MapSetupCommands: ; 15440 +; entries correspond to command indexes in constants/map_setup_constants.asm + dba EnableLCD ; 00 + dba DisableLCD ; 01 + dba MapSetup_Sound_Off ; 02 + dba PlayMapMusic ; 03 + dba RestartMapMusic ; 04 + dba FadeToMapMusic ; 05 + dba RotatePalettesRightMapAndMusic ; 06 + dba EnterMapMusic ; 07 + dba ForceMapMusic ; 08 + dba FadeInMusic ; 09 + dba LoadBlockData ; 0a (callback 1) + dba LoadNeighboringBlockData ; 0b + dba SaveScreen ; 0c + dba BufferScreen ; 0d + dba LoadGraphics ; 0e + dba LoadTileset ; 0f + dba LoadMapTimeOfDay ; 10 + dba LoadMapPalettes ; 11 + dba LoadWildMonData ; 12 + dba RefreshMapSprites ; 13 + dba HandleNewMap ; 14 + dba InitCommandQueue ; 15 + dba LoadObjectsRunCallback_02 ; 16 + dba LoadSpawnPoint ; 17 + dba EnterMapConnection ; 18 + dba LoadWarpData ; 19 + dba LoadMapAttributes ; 1a + dba LoadMapAttributes_SkipPeople ; 1b + dba ClearBGPalettes ; 1c + dba FadeOutPalettes ; 1d + dba FadeInPalettes ; 1e + dba GetCoordOfUpperLeftCorner ; 1f + dba RestoreFacingAfterWarp ; 20 + dba SpawnInFacingDown ; 21 + dba SpawnPlayer ; 22 + dba RefreshPlayerCoords ; 23 + dba DelayClearingOldSprites ; 24 + dba DelayLoadingNewSprites ; 25 + dba UpdateRoamMons ; 26 + dba JumpRoamMons ; 27 + dba FadeOldMapMusic ; 28 + dba ActivateMapAnims ; 29 + dba SuspendMapAnims ; 2a + dba RetainOldPalettes ; 2b + dba DontScrollText ; 2c + dba ReturnFromMapSetupScript ; 2d +; 154ca + + +DontScrollText: ; 154ca + xor a + ld [wDisableTextAcceleration], a + ret +; 154cf + +ActivateMapAnims: ; 154cf + ld a, $1 + ld [hMapAnims], a + ret +; 154d3 + +SuspendMapAnims: ; 154d3 + xor a + ld [hMapAnims], a + ret +; 154d7 + +LoadObjectsRunCallback_02: ; 154d7 + ld a, MAPCALLBACK_OBJECTS + call RunMapCallback + farcall LoadObjectMasks + farcall InitializeVisibleSprites + ret +; 154ea (5:54ea) + +; unused + ret +; 154eb + +DelayClearingOldSprites: ; 154eb + ld hl, wPlayerSpriteSetupFlags + set PLAYERSPRITESETUP_RESET_ACTION_F, [hl] + ret +; 154f1 + +DelayLoadingNewSprites: ; 154f1 + ld hl, wPlayerSpriteSetupFlags + set PLAYERSPRITESETUP_SKIP_RELOAD_GFX_F, [hl] + ret + +CheckReplaceKrisSprite: ; 154f7 + nop + call .CheckBiking + jr c, .ok + call .CheckSurfing + jr c, .ok + call .CheckSurfing2 + jr c, .ok + ret + +.ok + call ReplaceKrisSprite + ret + +.CheckBiking: ; 1550c (5:550c) + and a + ld hl, wBikeFlags + bit BIKEFLAGS_ALWAYS_ON_BIKE_F, [hl] + ret z + ld a, PLAYER_BIKE + ld [wPlayerState], a + scf + ret + +.CheckSurfing2: ; 1551a (5:551a) + ld a, [wPlayerState] + cp PLAYER_NORMAL + jr z, .nope + cp PLAYER_SKATE + jr z, .nope + cp PLAYER_SURF + jr z, .surfing + cp PLAYER_SURF_PIKA + jr z, .surfing + call GetMapEnvironment + cp INDOOR + jr z, .checkbiking + cp ENVIRONMENT_5 + jr z, .checkbiking + cp DUNGEON + jr z, .checkbiking + jr .nope +.checkbiking + ld a, [wPlayerState] + cp PLAYER_BIKE + jr nz, .nope +.surfing + ld a, PLAYER_NORMAL + ld [wPlayerState], a + scf + ret + +.nope + and a + ret + +.CheckSurfing: ; 1554e (5:554e) + call CheckOnWater + jr nz, .ret_nc + ld a, [wPlayerState] + cp PLAYER_SURF + jr z, ._surfing + cp PLAYER_SURF_PIKA + jr z, ._surfing + ld a, PLAYER_SURF + ld [wPlayerState], a +._surfing + scf + ret +.ret_nc + and a + ret +; 15567 + +FadeOldMapMusic: ; 15567 + ld a, 6 + call SkipMusic + ret +; 1556d + +RetainOldPalettes: ; 1556d + farcall _UpdateTimePals + ret + +RotatePalettesRightMapAndMusic: ; 15574 + ld e, 0 + ld a, [wMusicFadeID] + ld d, 0 + ld a, [wMusicFadeID + 1] + ld a, $4 + ld [wMusicFade], a + call RotateThreePalettesRight + ret +; 15587 + +ForceMapMusic: ; 15587 + ld a, [wPlayerState] + cp PLAYER_BIKE + jr nz, .notbiking + call VolumeOff + ld a, $88 + ld [wMusicFade], a +.notbiking + call TryRestartMapMusic + ret +; 1559a diff --git a/engine/overworld/movement.asm b/engine/overworld/movement.asm new file mode 100644 index 000000000..3dbb0b83a --- /dev/null +++ b/engine/overworld/movement.asm @@ -0,0 +1,864 @@ +MovementPointers: ; 5075 +; entries correspond to macros/scripts/movement.asm enumeration + dw Movement_turn_head_down ; 00 + dw Movement_turn_head_up ; 01 + dw Movement_turn_head_left ; 02 + dw Movement_turn_head_right ; 03 + dw Movement_turn_step_down ; 04 + dw Movement_turn_step_up ; 05 + dw Movement_turn_step_left ; 06 + dw Movement_turn_step_right ; 07 + dw Movement_slow_step_down ; 08 + dw Movement_slow_step_up ; 09 + dw Movement_slow_step_left ; 0a + dw Movement_slow_step_right ; 0b + dw Movement_step_down ; 0c + dw Movement_step_up ; 0d + dw Movement_step_left ; 0e + dw Movement_step_right ; 0f + dw Movement_big_step_down ; 10 + dw Movement_big_step_up ; 11 + dw Movement_big_step_left ; 12 + dw Movement_big_step_right ; 13 + dw Movement_slow_slide_step_down ; 14 + dw Movement_slow_slide_step_up ; 15 + dw Movement_slow_slide_step_left ; 16 + dw Movement_slow_slide_step_right ; 17 + dw Movement_slide_step_down ; 18 + dw Movement_slide_step_up ; 19 + dw Movement_slide_step_left ; 1a + dw Movement_slide_step_right ; 1b + dw Movement_fast_slide_step_down ; 1c + dw Movement_fast_slide_step_up ; 1d + dw Movement_fast_slide_step_left ; 1e + dw Movement_fast_slide_step_right ; 1f + dw Movement_turn_away_down ; 20 + dw Movement_turn_away_up ; 21 + dw Movement_turn_away_left ; 22 + dw Movement_turn_away_right ; 23 + dw Movement_turn_in_down ; 24 + dw Movement_turn_in_up ; 25 + dw Movement_turn_in_left ; 26 + dw Movement_turn_in_right ; 27 + dw Movement_turn_waterfall_down ; 28 + dw Movement_turn_waterfall_up ; 29 + dw Movement_turn_waterfall_left ; 2a + dw Movement_turn_waterfall_right ; 2b + dw Movement_slow_jump_step_down ; 2c + dw Movement_slow_jump_step_up ; 2d + dw Movement_slow_jump_step_left ; 2e + dw Movement_slow_jump_step_right ; 2f + dw Movement_jump_step_down ; 30 + dw Movement_jump_step_up ; 31 + dw Movement_jump_step_left ; 32 + dw Movement_jump_step_right ; 33 + dw Movement_fast_jump_step_down ; 34 + dw Movement_fast_jump_step_up ; 35 + dw Movement_fast_jump_step_left ; 36 + dw Movement_fast_jump_step_right ; 37 + dw Movement_remove_sliding ; 38 + dw Movement_set_sliding ; 39 + dw Movement_remove_fixed_facing ; 3a + dw Movement_fix_facing ; 3b + dw Movement_show_object ; 3c + dw Movement_hide_object ; 3d + dw Movement_step_sleep_1 ; 3e + dw Movement_step_sleep_2 ; 3f + dw Movement_step_sleep_3 ; 40 + dw Movement_step_sleep_4 ; 41 + dw Movement_step_sleep_5 ; 42 + dw Movement_step_sleep_6 ; 43 + dw Movement_step_sleep_7 ; 44 + dw Movement_step_sleep_8 ; 45 + dw Movement_step_sleep ; 46 + dw Movement_step_end ; 47 + dw Movement_48 ; 48 + dw Movement_remove_object ; 49 + dw Movement_step_loop ; 4a + dw Movement_4b ; 4b + dw Movement_teleport_from ; 4c + dw Movement_teleport_to ; 4d + dw Movement_skyfall ; 4e + dw Movement_step_dig ; 4f + dw Movement_step_bump ; 50 + dw Movement_fish_got_bite ; 51 + dw Movement_fish_cast_rod ; 52 + dw Movement_hide_emote ; 53 + dw Movement_show_emote ; 54 + dw Movement_step_shake ; 55 + dw Movement_tree_shake ; 56 + dw Movement_rock_smash ; 57 + dw Movement_return_dig ; 58 + dw Movement_skyfall_top ; 59 +; 5129 + + +Movement_teleport_from: ; 5129 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_TELEPORT_FROM + ret +; 5130 + +Movement_teleport_to: ; 5130 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_TELEPORT_TO + ret +; 5137 + +Movement_skyfall: ; 5137 + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SKYFALL + ret +; 513e + +Movement_skyfall_top: ; 513e + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SKYFALL_TOP + ret +; 5145 + +Movement_step_dig: ; 5145 + call GetSpriteDirection + rlca + rlca + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], a + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_SPIN + call JumpMovementPointer + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_03 + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret +; 516a + +Movement_return_dig: ; 516a + call GetSpriteDirection + rlca + rlca + ld hl, OBJECT_STEP_FRAME + add hl, bc + ld [hl], a + call JumpMovementPointer + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_RETURN_DIG + ret +; 5189 + +Movement_fish_got_bite: ; 5189 + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_FISHING + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_GOT_BITE + ret +; 5196 + +Movement_rock_smash: ; 5196 + call JumpMovementPointer + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_ROCK_SMASH + ret +; 51ab + +Movement_fish_cast_rod: ; 51ab + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_FISHING + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 51b8 + +Movement_step_loop: ; 51b8 + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + ld [hl], $0 + jp ContinueReadingMovement +; 51c1 + +Movement_step_end: ; 51c1 + call RestoreDefaultMovement + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld [hl], a + + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + ld [hl], $0 + + ld hl, wVramState + res 7, [hl] + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_SLEEP + ret +; 51db + +Movement_48: ; 51db + call RestoreDefaultMovement + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld [hl], a + + ld hl, OBJECT_MOVEMENT_BYTE_INDEX + add hl, bc + ld [hl], $0 + + call JumpMovementPointer + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_03 + + ld hl, wVramState + res 7, [hl] + ret +; 51fd + +Movement_remove_object: ; 51fd + call DeleteMapObject + ld hl, wObjectFollow_Leader + ld a, [hMapObjectIndexBuffer] + cp [hl] + jr nz, .not_leading + ld [hl], -1 + +.not_leading + ld hl, wVramState + res 7, [hl] + ret +; 5210 + +Movement_4b: ; 5210 + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_04 + + ld hl, wVramState + res 7, [hl] + ret +; 5222 + +Movement_step_sleep_1: ; 5222 + ld a, 1 + jr Movement_step_sleep_common + +Movement_step_sleep_2: ; 5226 + ld a, 2 + jr Movement_step_sleep_common + +Movement_step_sleep_3: ; 522a + ld a, 3 + jr Movement_step_sleep_common + +Movement_step_sleep_4: ; 522e + ld a, 4 + jr Movement_step_sleep_common + +Movement_step_sleep_5: ; 5232 + ld a, 5 + jr Movement_step_sleep_common + +Movement_step_sleep_6: ; 5236 + ld a, 6 + jr Movement_step_sleep_common + +Movement_step_sleep_7: ; 523a + ld a, 7 + jr Movement_step_sleep_common + +Movement_step_sleep_8: ; 523e + ld a, 8 + jr Movement_step_sleep_common + +Movement_step_sleep: ; 5242 +; parameters: +; duration (DecimalParam) + + call JumpMovementPointer + jr Movement_step_sleep_common + +Movement_step_sleep_common: ; 5247 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_03 + + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret +; 525f + +Movement_step_bump: ; 525f + ld a, 1 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_BUMP + + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_BUMP + + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret +; 5279 + +Movement_tree_shake: ; 5279 + ld a, 24 + ld hl, OBJECT_STEP_DURATION + add hl, bc + ld [hl], a + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_03 + + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_WEIRD_TREE + + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret +; 5293 + +Movement_remove_sliding: ; 5293 + ld hl, OBJECT_FLAGS1 + add hl, bc + res SLIDING, [hl] + jp ContinueReadingMovement +; 529c + +Movement_set_sliding: ; 529c + ld hl, OBJECT_FLAGS1 + add hl, bc + set SLIDING, [hl] + jp ContinueReadingMovement +; 52a5 + +Movement_remove_fixed_facing: ; 52a5 + ld hl, OBJECT_FLAGS1 + add hl, bc + res FIXED_FACING, [hl] + jp ContinueReadingMovement +; 52ae + +Movement_fix_facing: ; 52ae + ld hl, OBJECT_FLAGS1 + add hl, bc + set FIXED_FACING, [hl] + jp ContinueReadingMovement +; 52b7 + +Movement_show_object: ; 52b7 + ld hl, OBJECT_FLAGS1 + add hl, bc + res INVISIBLE, [hl] + jp ContinueReadingMovement +; 52c0 + +Movement_hide_object: ; 52c0 + ld hl, OBJECT_FLAGS1 + add hl, bc + set INVISIBLE, [hl] + jp ContinueReadingMovement +; 52c9 + +Movement_hide_emote: ; 52c9 + call DespawnEmote + jp ContinueReadingMovement +; 52cf + +Movement_show_emote: ; 52cf + call SpawnEmote + jp ContinueReadingMovement +; 52d5 + +Movement_step_shake: ; 52d5 +; parameters: +; displacement (DecimalParam) + + call JumpMovementPointer + call ShakeScreen + jp ContinueReadingMovement +; 52de + +Movement_turn_head_down: ; 52de + ld a, OW_DOWN + jr TurnHead + +Movement_turn_head_up: ; 52e2 + ld a, OW_UP + jr TurnHead + +Movement_turn_head_left: ; 52e6 + ld a, OW_LEFT + jr TurnHead + +Movement_turn_head_right: ; 52ea + ld a, OW_RIGHT + jr TurnHead + +TurnHead: ; 52ee + ld hl, OBJECT_FACING + add hl, bc + ld [hl], a + + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld [hl], STANDING + ret +; 5300 + +Movement_slow_step_down: ; 5300 + ld a, STEP_SLOW << 2 | DOWN + jp NormalStep +; 5305 + +Movement_slow_step_up: ; 5305 + ld a, STEP_SLOW << 2 | UP + jp NormalStep +; 530a + +Movement_slow_step_left: ; 530a + ld a, STEP_SLOW << 2 | LEFT + jp NormalStep +; 530f + +Movement_slow_step_right: ; 530f + ld a, STEP_SLOW << 2 | RIGHT + jp NormalStep +; 5314 + +Movement_step_down: ; 5314 + ld a, STEP_WALK << 2 | DOWN + jp NormalStep +; 5319 + +Movement_step_up: ; 5319 + ld a, STEP_WALK << 2 | UP + jp NormalStep +; 531e + +Movement_step_left: ; 531e + ld a, STEP_WALK << 2 | LEFT + jp NormalStep +; 5323 + +Movement_step_right: ; 5323 + ld a, STEP_WALK << 2 | RIGHT + jp NormalStep +; 5328 + +Movement_big_step_down: ; 5328 + ld a, STEP_BIKE << 2 | DOWN + jp NormalStep +; 532d + +Movement_big_step_up: ; 532d + ld a, STEP_BIKE << 2 | UP + jp NormalStep +; 5332 + +Movement_big_step_left: ; 5332 + ld a, STEP_BIKE << 2 | LEFT + jp NormalStep +; 5337 + +Movement_big_step_right: ; 5337 + ld a, STEP_BIKE << 2 | RIGHT + jp NormalStep +; 533c + + +Movement_turn_away_down: ; 533c + ld a, STEP_SLOW << 2 | DOWN + jp TurningStep +; 5341 + +Movement_turn_away_up: ; 5341 + ld a, STEP_SLOW << 2 | UP + jp TurningStep +; 5346 + +Movement_turn_away_left: ; 5346 + ld a, STEP_SLOW << 2 | LEFT + jp TurningStep +; 534b + +Movement_turn_away_right: ; 534b + ld a, STEP_SLOW << 2 | RIGHT + jp TurningStep +; 5350 + +Movement_turn_in_down: ; 5350 + ld a, STEP_WALK << 2 | DOWN + jp TurningStep +; 5355 + +Movement_turn_in_up: ; 5355 + ld a, STEP_WALK << 2 | UP + jp TurningStep +; 535a + +Movement_turn_in_left: ; 535a + ld a, STEP_WALK << 2 | LEFT + jp TurningStep +; 535f + +Movement_turn_in_right: ; 535f + ld a, STEP_WALK << 2 | RIGHT + jp TurningStep +; 5364 + +Movement_turn_waterfall_down: ; 5364 + ld a, STEP_BIKE << 2 | DOWN + jp TurningStep +; 5369 + +Movement_turn_waterfall_up: ; 5369 + ld a, STEP_BIKE << 2 | UP + jp TurningStep +; 536e + +Movement_turn_waterfall_left: ; 536e + ld a, STEP_BIKE << 2 | LEFT + jp TurningStep +; 5373 + +Movement_turn_waterfall_right: ; 5373 + ld a, STEP_BIKE << 2 | RIGHT + jp TurningStep +; 5378 + + +Movement_slow_slide_step_down: ; 5378 + ld a, STEP_SLOW << 2 | DOWN + jp SlideStep +; 537d + +Movement_slow_slide_step_up: ; 537d + ld a, STEP_SLOW << 2 | UP + jp SlideStep +; 5382 + +Movement_slow_slide_step_left: ; 5382 + ld a, STEP_SLOW << 2 | LEFT + jp SlideStep +; 5387 + +Movement_slow_slide_step_right: ; 5387 + ld a, STEP_SLOW << 2 | RIGHT + jp SlideStep +; 538c + +Movement_slide_step_down: ; 538c + ld a, STEP_WALK << 2 | DOWN + jp SlideStep +; 5391 + +Movement_slide_step_up: ; 5391 + ld a, STEP_WALK << 2 | UP + jp SlideStep +; 5396 + +Movement_slide_step_left: ; 5396 + ld a, STEP_WALK << 2 | LEFT + jp SlideStep +; 539b + +Movement_slide_step_right: ; 539b + ld a, STEP_WALK << 2 | RIGHT + jp SlideStep +; 53a0 + +Movement_fast_slide_step_down: ; 53a0 + ld a, STEP_BIKE << 2 | DOWN + jp SlideStep +; 53a5 + +Movement_fast_slide_step_up: ; 53a5 + ld a, STEP_BIKE << 2 | UP + jp SlideStep +; 53aa + +Movement_fast_slide_step_left: ; 53aa + ld a, STEP_BIKE << 2 | LEFT + jp SlideStep +; 53af + +Movement_fast_slide_step_right: ; 53af + ld a, STEP_BIKE << 2 | RIGHT + jp SlideStep +; 53b4 + + +Movement_slow_jump_step_down: ; 53b4 + ld a, STEP_SLOW << 2 | DOWN + jp JumpStep +; 53b9 + +Movement_slow_jump_step_up: ; 53b9 + ld a, STEP_SLOW << 2 | UP + jp JumpStep +; 53be + +Movement_slow_jump_step_left: ; 53be + ld a, STEP_SLOW << 2 | LEFT + jp JumpStep +; 53c3 + +Movement_slow_jump_step_right: ; 53c3 + ld a, STEP_SLOW << 2 | RIGHT + jp JumpStep +; 53c8 + +Movement_jump_step_down: ; 53c8 + ld a, STEP_WALK << 2 | DOWN + jp JumpStep +; 53cd + +Movement_jump_step_up: ; 53cd + ld a, STEP_WALK << 2 | UP + jp JumpStep +; 53d2 + +Movement_jump_step_left: ; 53d2 + ld a, STEP_WALK << 2 | LEFT + jp JumpStep +; 53d7 + +Movement_jump_step_right: ; 53d7 + ld a, STEP_WALK << 2 | RIGHT + jp JumpStep +; 53dc + +Movement_fast_jump_step_down: ; 53dc + ld a, STEP_BIKE << 2 | DOWN + jp JumpStep +; 53e1 + +Movement_fast_jump_step_up: ; 53e1 + ld a, STEP_BIKE << 2 | UP + jp JumpStep +; 53e6 + +Movement_fast_jump_step_left: ; 53e6 + ld a, STEP_BIKE << 2 | LEFT + jp JumpStep +; 53eb + +Movement_fast_jump_step_right: ; 53eb + ld a, STEP_BIKE << 2 | RIGHT + jp JumpStep +; 53f0 + + +Movement_turn_step_down: ; 53f0 + ld a, OW_DOWN + jr TurnStep + +Movement_turn_step_up: ; 53f4 + ld a, OW_UP + jr TurnStep + +Movement_turn_step_left: ; 53f8 + ld a, OW_LEFT + jr TurnStep + +Movement_turn_step_right: ; 53fc + ld a, OW_RIGHT + jr TurnStep + +TurnStep: ; 5400 + ld hl, OBJECT_1D ; new facing + add hl, bc + ld [hl], a + + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STEP + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_HALF_STEP + ret +; 5412 + +NormalStep: ; 5412 + call InitStep + call UpdateTallGrassFlags + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STEP + + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + call CheckSuperTallGrassTile + jr z, .shake_grass + + call CheckGrassTile + jr c, .skip_grass + +.shake_grass + call ShakeGrass + +.skip_grass + ld hl, wCenteredObject + ld a, [hMapObjectIndexBuffer] + cp [hl] + jr z, .player + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_NPC_WALK + ret + +.player + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_PLAYER_WALK + ret +; 5446 + +TurningStep: ; 5446 + call InitStep + call UpdateTallGrassFlags + + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_SPIN + + ld hl, wCenteredObject + ld a, [hMapObjectIndexBuffer] + cp [hl] + jr z, .player + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_NPC_WALK + ret + +.player + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_PLAYER_WALK + ret +; 5468 + + +SlideStep: ; 5468 + call InitStep + call UpdateTallGrassFlags + + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STAND + + ld hl, wCenteredObject + ld a, [hMapObjectIndexBuffer] + cp [hl] + jr z, .player + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_NPC_WALK + ret + +.player + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_PLAYER_WALK + ret +; 548a + + +JumpStep: ; 548a + call InitStep + ld hl, OBJECT_1F + add hl, bc + ld [hl], $0 + + ld hl, OBJECT_FLAGS2 + add hl, bc + res OVERHEAD, [hl] + + ld hl, OBJECT_ACTION + add hl, bc + ld [hl], OBJECT_ACTION_STEP + + call SpawnShadow + + ld hl, wCenteredObject + ld a, [hMapObjectIndexBuffer] + cp [hl] + jr z, .player + + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_NPC_JUMP + ret + +.player + ld hl, OBJECT_STEP_TYPE + add hl, bc + ld [hl], STEP_TYPE_PLAYER_JUMP + ret +; 54b8 diff --git a/engine/overworld/npc_movement.asm b/engine/overworld/npc_movement.asm new file mode 100755 index 000000000..5670935e8 --- /dev/null +++ b/engine/overworld/npc_movement.asm @@ -0,0 +1,573 @@ +Function6ec1: ; 6ec1 + + ld hl, OBJECT_PALETTE + add hl, bc + bit 5, [hl] + jr z, .not_bit_5 + + ld hl, OBJECT_FLAGS1 + add hl, bc + bit 4, [hl] ; lost, uncomment next line to fix +; jr nz, .resume + push hl + push bc + call Function6f2c + pop bc + pop hl + ret c + jr .resume + +.not_bit_5 + ld hl, OBJECT_FLAGS1 + add hl, bc + bit 4, [hl] + jr nz, .resume + push hl + push bc + call Function6f07 + pop bc + pop hl + ret c + +.resume + bit 6, [hl] + jr nz, .bit_6 + + push hl + push bc + call WillObjectBumpIntoSomeoneElse + pop bc + pop hl + ret c + +.bit_6 + bit 5, [hl] + jr nz, .bit_5 + push hl + call HasObjectReachedMovementLimit + pop hl + ret c + + push hl + call IsObjectMovingOffEdgeOfScreen + pop hl + ret c + +.bit_5 + and a + ret +; 6f07 + + +Function6f07: ; 6f07 + call Function6f5f + ret c + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + ld hl, OBJECT_PALETTE + add hl, bc + bit OAM_PRIORITY, [hl] + jp nz, Function6fa1 + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + ld d, a + call GetTileCollision + and a ; LANDTILE + jr z, Function6f3e + scf + ret +; 6f2c + +Function6f2c: ; 6f2c + call Function6f5f + ret c + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + call GetTileCollision + cp WATERTILE + jr z, Function6f3e + scf + ret +; 6f3e + +Function6f3e: ; 6f3e + ld hl, OBJECT_NEXT_TILE + add hl, bc + ld a, [hl] + call Function6f7f + ret nc + push af + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + maskbits NUM_DIRECTIONS + ld e, a + ld d, 0 + ld hl, .data_6f5b + add hl, de + pop af + and [hl] + ret z + scf + ret +; 6f5b + +.data_6f5b + db DOWN_MASK, UP_MASK, RIGHT_MASK, LEFT_MASK +; 6f5f + +Function6f5f: ; 6f5f + ld hl, OBJECT_STANDING_TILE + add hl, bc + ld a, [hl] + call Function6f7f + ret nc + push af + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + maskbits NUM_DIRECTIONS + ld e, a + ld d, 0 + ld hl, .data_6f7b + add hl, de + pop af + and [hl] + ret z + scf + ret +; 6f7b + +.data_6f7b + db UP_MASK, DOWN_MASK, LEFT_MASK, RIGHT_MASK +; 6f7f + +Function6f7f: ; 6f7f + ld d, a + and $f0 + cp $b0 + jr z, .done + cp $c0 + jr z, .done + xor a + ret + +.done + ld a, d + and 7 + ld e, a + ld d, 0 + ld hl, .data_6f99 + add hl, de + ld a, [hl] + scf + ret +; 6f99 + +.data_6f99 + db 8, 4, 1, 2 + db 10, 6, 9, 5 +; 6fa1 + +Function6fa1: ; 6fa1 + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + maskbits NUM_DIRECTIONS + jr z, .down + dec a + jr z, .up + dec a + jr z, .left + jr .right + +.down + inc e + push de + inc d + jr .continue + +.up + push de + inc d + jr .continue + +.left + push de + inc e + jr .continue + +.right + inc d + push de + inc e + +.continue + call GetCoordTile + call GetTileCollision + pop de + and a ; LANDTILE + jr nz, .not_land + call GetCoordTile + call GetTileCollision + and a ; LANDTILE + jr nz, .not_land + xor a + ret + +.not_land + scf + ret +; 6fd9 + + + +CheckFacingObject:: ; 6fd9 + + call GetFacingTileCoord + +; Double the distance for counter tiles. + call CheckCounterTile + jr nz, .asm_6ff1 + + ld a, [wPlayerStandingMapX] + sub d + cpl + inc a + add d + ld d, a + + ld a, [wPlayerStandingMapY] + sub e + cpl + inc a + add e + ld e, a + +.asm_6ff1 + ld bc, wObjectStructs ; redundant + ld a, 0 + ld [hMapObjectIndexBuffer], a + call IsNPCAtCoord + ret nc + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + cp STANDING + jr z, .standing + xor a + ret + +.standing + scf + ret +; 7009 + + +WillObjectBumpIntoSomeoneElse: ; 7009 + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + jr IsNPCAtCoord +; 7015 + +Unreferenced_Function7015: + ld a, [hMapObjectIndexBuffer] + call GetObjectStruct + call .CheckWillBeFacingNPC + call IsNPCAtCoord + ret + +.CheckWillBeFacingNPC: ; 7021 + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + call GetSpriteDirection + and a + jr z, .down + cp OW_UP + jr z, .up + cp OW_LEFT + jr z, .left + inc d + ret + +.down + inc e + ret + +.up + dec e + ret + +.left + dec d + ret +; 7041 + +IsNPCAtCoord: ; 7041 + ld bc, wObjectStructs + xor a +.loop + ld [hObjectStructIndexBuffer], a + call DoesObjectHaveASprite + jr z, .next + + ld hl, OBJECT_FLAGS1 + add hl, bc + bit 7, [hl] + jr nz, .next + + ld hl, OBJECT_PALETTE + add hl, bc + bit 7, [hl] + jr z, .got + + call Function7171 + jr nc, .ok + jr .ok2 + +.got + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [hl] + cp d + jr nz, .ok + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld a, [hl] + cp e + jr nz, .ok + +.ok2 + ld a, [hMapObjectIndexBuffer] + ld l, a + ld a, [hObjectStructIndexBuffer] + cp l + jr nz, .setcarry + +.ok + ld hl, OBJECT_MAP_X + add hl, bc + ld a, [hl] + cp d + jr nz, .next + ld hl, OBJECT_MAP_Y + add hl, bc + ld a, [hl] + cp e + jr nz, .next + ld a, [hMapObjectIndexBuffer] + ld l, a + ld a, [hObjectStructIndexBuffer] + cp l + jr nz, .setcarry + +.next + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + ld a, [hObjectStructIndexBuffer] + inc a + cp NUM_OBJECT_STRUCTS + jr nz, .loop + and a + ret + +.setcarry + scf + ret +; 70a4 + +HasObjectReachedMovementLimit: ; 70a4 + ld hl, OBJECT_RADIUS + add hl, bc + ld a, [hl] + and a + jr z, .nope + and $f + jr z, .check_y + ld e, a + ld d, a + ld hl, OBJECT_INIT_X + add hl, bc + ld a, [hl] + sub d + ld d, a + ld a, [hl] + add e + ld e, a + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [hl] + cp d + jr z, .yes + cp e + jr z, .yes + +.check_y + ld hl, OBJECT_RADIUS + add hl, bc + ld a, [hl] + swap a + and $f + jr z, .nope + ld e, a + ld d, a + ld hl, OBJECT_INIT_Y + add hl, bc + ld a, [hl] + sub d + ld d, a + ld a, [hl] + add e + ld e, a + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld a, [hl] + cp d + jr z, .yes + cp e + jr z, .yes + +.nope + xor a + ret + +.yes + scf + ret +; 70ed + +IsObjectMovingOffEdgeOfScreen: ; 70ed + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [wXCoord] + cp [hl] + jr z, .check_y + jr nc, .yes + add $9 + cp [hl] + jr c, .yes + +.check_y + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld a, [wYCoord] + cp [hl] + jr z, .nope + jr nc, .yes + add $8 + cp [hl] + jr c, .yes + +.nope + and a + ret + +.yes + scf + ret +; 7113 + +Unreferenced_Function7113: + ld a, [wPlayerStandingMapX] + ld d, a + ld a, [wPlayerStandingMapY] + ld e, a + ld bc, wObjectStructs + xor a +.loop + ld [hObjectStructIndexBuffer], a + call DoesObjectHaveASprite + jr z, .next + ld hl, OBJECT_MOVEMENTTYPE + add hl, bc + ld a, [hl] + cp SPRITEMOVEDATA_BIGDOLLSYM + jr nz, .not_snorlax + call Function7171 + jr c, .yes + jr .next + +.not_snorlax + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld a, [hl] + cp e + jr nz, .check_current_coords + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [hl] + cp d + jr nz, .check_current_coords + ld a, [hObjectStructIndexBuffer] + cp $0 + jr z, .next + jr .yes + +.check_current_coords + ld hl, OBJECT_MAP_Y + add hl, bc + ld a, [hl] + cp e + jr nz, .next + ld hl, OBJECT_MAP_X + add hl, bc + ld a, [hl] + cp d + jr nz, .next + jr .yes + +.next + ld hl, OBJECT_STRUCT_LENGTH + add hl, bc + ld b, h + ld c, l + ld a, [hObjectStructIndexBuffer] + inc a + cp NUM_OBJECT_STRUCTS + jr nz, .loop + xor a + ret + +.yes + scf + ret +; 7171 + + +Function7171: ; 7171 + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, d + sub [hl] + jr c, .nope + cp $2 + jr nc, .nope + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld a, e + sub [hl] + jr c, .nope + cp $2 + jr nc, .nope + scf + ret + +.nope + and a + ret +; 718d diff --git a/engine/overworld/overworld.asm b/engine/overworld/overworld.asm new file mode 100755 index 000000000..381c2d89f --- /dev/null +++ b/engine/overworld/overworld.asm @@ -0,0 +1,715 @@ +GetEmote2bpp: ; 1412a + ld a, $1 + ld [rVBK], a + call Get2bpp + xor a + ld [rVBK], a + ret +; 14135 + +_ReplaceKrisSprite:: ; 14135 + call GetPlayerSprite + ld a, [wUsedSprites] + ld [hUsedSpriteIndex], a + ld a, [wUsedSprites + 1] + ld [hUsedSpriteTile], a + call GetUsedSprite + ret +; 14146 + +Function14146: ; mobile + ld hl, wSpriteFlags + ld a, [hl] + push af + res 7, [hl] + set 6, [hl] + call LoadUsedSpritesGFX + pop af + ld [wSpriteFlags], a + ret +; 14157 + +Function14157: ; mobile + ld hl, wSpriteFlags + ld a, [hl] + push af + set 7, [hl] + res 6, [hl] + call LoadUsedSpritesGFX + pop af + ld [wSpriteFlags], a + ret +; 14168 + +RefreshSprites:: ; 14168 + call .Refresh + call LoadUsedSpritesGFX + ret +; 1416f + +.Refresh: ; 1416f + xor a + ld bc, wUsedSpritesEnd - wUsedSprites + ld hl, wUsedSprites + call ByteFill + call GetPlayerSprite + call AddMapSprites + call LoadAndSortSprites + ret +; 14183 + +GetPlayerSprite: ; 14183 +; Get Chris or Kris's sprite. + ld hl, ChrisStateSprites + ld a, [wPlayerSpriteSetupFlags] + bit PLAYERSPRITESETUP_FEMALE_TO_MALE_F, a + jr nz, .go + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .go + ld hl, KrisStateSprites + +.go + ld a, [wPlayerState] + ld c, a +.loop + ld a, [hli] + cp c + jr z, .good + inc hl + cp -1 + jr nz, .loop + +; Any player state not in the array defaults to Chris's sprite. + xor a ; ld a, PLAYER_NORMAL + ld [wPlayerState], a + ld a, SPRITE_CHRIS + jr .finish + +.good + ld a, [hl] + +.finish + ld [wUsedSprites + 0], a + ld [wPlayerSprite], a + ld [wPlayerObjectSprite], a + ret + +INCLUDE "data/sprites/player_sprites.asm" + + +AddMapSprites: ; 141c9 + call GetMapEnvironment + call CheckOutdoorMap + jr z, .outdoor + call AddIndoorSprites + ret + +.outdoor + call AddOutdoorSprites + ret +; 141d9 + + +AddIndoorSprites: ; 141d9 + ld hl, wMap1ObjectSprite + ld a, 1 +.loop + push af + ld a, [hl] + call AddSpriteGFX + ld de, OBJECT_LENGTH + add hl, de + pop af + inc a + cp NUM_OBJECTS + jr nz, .loop + ret +; 141ee + + +AddOutdoorSprites: ; 141ee + ld a, [wMapGroup] + dec a + ld c, a + ld b, 0 + ld hl, OutdoorSprites + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld c, MAX_OUTDOOR_SPRITES +.loop + push bc + ld a, [hli] + call AddSpriteGFX + pop bc + dec c + jr nz, .loop + ret +; 14209 + + +LoadUsedSpritesGFX: ; 14209 + ld a, MAPCALLBACK_SPRITES + call RunMapCallback + call GetUsedSprites + call .LoadMiscTiles + ret +; 14215 + +.LoadMiscTiles: ; 14215 + ld a, [wSpriteFlags] + bit 6, a + ret nz + + ld c, EMOTE_SHADOW + farcall LoadEmote + call GetMapEnvironment + call CheckOutdoorMap + ld c, EMOTE_GRASS_RUSTLE + jr z, .outdoor + ld c, EMOTE_BOULDER_DUST +.outdoor + farcall LoadEmote + ret +; 14236 + + + +SafeGetSprite: ; 14236 + push hl + call GetSprite + pop hl + ret +; 1423c + +GetSprite: ; 1423c + call GetMonSprite + ret c + + ld hl, OverworldSprites + SPRITEDATA_ADDR + dec a + ld c, a + ld b, 0 + ld a, NUM_SPRITEDATA_FIELDS + call AddNTimes + ; load the address into de + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ; load the length into c + ld a, [hli] + swap a + ld c, a + ; load the sprite bank into both b and h + ld b, [hl] + ld a, [hli] + ; load the sprite type into l + ld l, [hl] + ld h, a + ret +; 14259 + + +GetMonSprite: ; 14259 +; Return carry if a monster sprite was loaded. + + cp SPRITE_POKEMON + jr c, .Normal + cp SPRITE_DAY_CARE_MON_1 + jr z, .BreedMon1 + cp SPRITE_DAY_CARE_MON_2 + jr z, .BreedMon2 + cp SPRITE_VARS + jr nc, .Variable + jr .Icon + +.Normal: + and a + ret + +.Icon: + sub SPRITE_POKEMON + ld e, a + ld d, 0 + ld hl, SpriteMons + add hl, de + ld a, [hl] + jr .Mon + +.BreedMon1 + ld a, [wBreedMon1Species] + jr .Mon + +.BreedMon2 + ld a, [wBreedMon2Species] + +.Mon: + ld e, a + and a + jr z, .NoBreedmon + + farcall LoadOverworldMonIcon + + ld l, 1 + ld h, 0 + scf + ret + +.Variable: + sub SPRITE_VARS + ld e, a + ld d, 0 + ld hl, wVariableSprites + add hl, de + ld a, [hl] + and a + jp nz, GetMonSprite + +.NoBreedmon: + ld a, 1 + ld l, 1 + ld h, 0 + and a + ret +; 142a7 + + +_DoesSpriteHaveFacings:: ; 142a7 +; Checks to see whether we can apply a facing to a sprite. +; Returns carry unless the sprite is a Pokemon or a Still Sprite. + cp SPRITE_POKEMON + jr nc, .only_down + + push hl + push bc + ld hl, OverworldSprites + SPRITEDATA_TYPE + dec a + ld c, a + ld b, 0 + ld a, NUM_SPRITEDATA_FIELDS + call AddNTimes + ld a, [hl] + pop bc + pop hl + cp STILL_SPRITE + jr nz, .only_down + scf + ret + +.only_down + and a + ret +; 142c4 + + +_GetSpritePalette:: ; 142c4 + ld a, c + call GetMonSprite + jr c, .is_pokemon + + ld hl, OverworldSprites + SPRITEDATA_PALETTE + dec a + ld c, a + ld b, 0 + ld a, NUM_SPRITEDATA_FIELDS + call AddNTimes + ld c, [hl] + ret + +.is_pokemon + xor a + ld c, a + ret +; 142db + + +LoadAndSortSprites: ; 142db + call LoadSpriteGFX + call SortUsedSprites + call ArrangeUsedSprites + ret +; 142e5 + + +AddSpriteGFX: ; 142e5 +; Add any new sprite ids to a list of graphics to be loaded. +; Return carry if the list is full. + + push hl + push bc + ld b, a + ld hl, wUsedSprites + 2 + ld c, SPRITE_GFX_LIST_CAPACITY - 1 +.loop + ld a, [hl] + cp b + jr z, .exists + and a + jr z, .new + inc hl + inc hl + dec c + jr nz, .loop + + pop bc + pop hl + scf + ret + +.exists + pop bc + pop hl + and a + ret + +.new + ld [hl], b + pop bc + pop hl + and a + ret +; 14306 + + +LoadSpriteGFX: ; 14306 +; Bug: b is not preserved, so it's useless as a next count. +; Uncomment the lines below to fix. + + ld hl, wUsedSprites + ld b, SPRITE_GFX_LIST_CAPACITY +.loop + ld a, [hli] + and a + jr z, .done + push hl + call .LoadSprite + pop hl + ld [hli], a + dec b + jr nz, .loop + +.done + ret + +.LoadSprite: + ; push bc + call GetSprite + ; pop bc + ld a, l + ret +; 1431e + + +SortUsedSprites: ; 1431e +; Bubble-sort sprites by type. + +; Run backwards through wUsedSprites to find the last one. + + ld c, SPRITE_GFX_LIST_CAPACITY + ld de, wUsedSprites + (SPRITE_GFX_LIST_CAPACITY - 1) * 2 +.FindLastSprite: + ld a, [de] + and a + jr nz, .FoundLastSprite + dec de + dec de + dec c + jr nz, .FindLastSprite +.FoundLastSprite: + dec c + jr z, .quit + +; If the length of the current sprite is +; higher than a later one, swap them. + + inc de + ld hl, wUsedSprites + 1 + +.CheckSprite: + push bc + push de + push hl + +.CheckFollowing: + ld a, [de] + cp [hl] + jr nc, .loop + +; Swap the two sprites. + + ld b, a + ld a, [hl] + ld [hl], b + ld [de], a + dec de + dec hl + ld a, [de] + ld b, a + ld a, [hl] + ld [hl], b + ld [de], a + inc de + inc hl + +; Keep doing this until everything's in order. + +.loop + dec de + dec de + dec c + jr nz, .CheckFollowing + + pop hl + inc hl + inc hl + pop de + pop bc + dec c + jr nz, .CheckSprite + +.quit + ret +; 14355 + + +ArrangeUsedSprites: ; 14355 +; Get the length of each sprite and space them out in VRAM. +; Crystal introduces a second table in VRAM bank 0. + + ld hl, wUsedSprites + ld c, SPRITE_GFX_LIST_CAPACITY + ld b, 0 +.FirstTableLength: +; Keep going until the end of the list. + ld a, [hli] + and a + jr z, .quit + + ld a, [hl] + call GetSpriteLength + +; Spill over into the second table after $80 tiles. + add b + cp $80 + jr z, .loop + jr nc, .SecondTable + +.loop + ld [hl], b + inc hl + ld b, a + +; Assumes the next table will be reached before c hits 0. + dec c + jr nz, .FirstTableLength + +.SecondTable: +; The second tile table starts at tile $80. + ld b, $80 + dec hl +.SecondTableLength: +; Keep going until the end of the list. + ld a, [hli] + and a + jr z, .quit + + ld a, [hl] + call GetSpriteLength + +; There are only two tables, so don't go any further than that. + add b + jr c, .quit + + ld [hl], b + ld b, a + inc hl + + dec c + jr nz, .SecondTableLength + +.quit + ret +; 14386 + + +GetSpriteLength: ; 14386 +; Return the length of sprite type a in tiles. + + cp WALKING_SPRITE + jr z, .AnyDirection + cp STANDING_SPRITE + jr z, .AnyDirection + cp STILL_SPRITE + jr z, .OneDirection + + ld a, 12 + ret + +.AnyDirection: + ld a, 12 + ret + +.OneDirection: + ld a, 4 + ret +; 1439b + + +GetUsedSprites: ; 1439b + ld hl, wUsedSprites + ld c, SPRITE_GFX_LIST_CAPACITY + +.loop + ld a, [wSpriteFlags] + res 5, a + ld [wSpriteFlags], a + + ld a, [hli] + and a + jr z, .done + ld [hUsedSpriteIndex], a + + ld a, [hli] + ld [hUsedSpriteTile], a + + bit 7, a + jr z, .dont_set + + ld a, [wSpriteFlags] + set 5, a ; load VBank0 + ld [wSpriteFlags], a + +.dont_set + push bc + push hl + call GetUsedSprite + pop hl + pop bc + dec c + jr nz, .loop + +.done + ret +; 143c8 + +GetUsedSprite: ; 143c8 + ld a, [hUsedSpriteIndex] + call SafeGetSprite + ld a, [hUsedSpriteTile] + call .GetTileAddr + push hl + push de + push bc + ld a, [wSpriteFlags] + bit 7, a + jr nz, .skip + call .CopyToVram + +.skip + pop bc + ld l, c + ld h, $0 +rept 4 + add hl, hl +endr + pop de + add hl, de + ld d, h + ld e, l + pop hl + + ld a, [wSpriteFlags] + bit 5, a + jr nz, .done + bit 6, a + jr nz, .done + + ld a, [hUsedSpriteIndex] + call _DoesSpriteHaveFacings + jr c, .done + + ld a, h + add $8 + ld h, a + call .CopyToVram + +.done + ret +; 14406 + +.GetTileAddr: ; 14406 +; Return the address of tile (a) in (hl). + and $7f + ld l, a + ld h, 0 +rept 4 + add hl, hl +endr + ld a, l + add LOW(vTiles0) + ld l, a + ld a, h + adc HIGH(vTiles0) + ld h, a + ret +; 14418 + +.CopyToVram: ; 14418 + ld a, [rVBK] + push af + ld a, [wSpriteFlags] + bit 5, a + ld a, $1 + jr z, .bankswitch + ld a, $0 + +.bankswitch + ld [rVBK], a + call Get2bpp + pop af + ld [rVBK], a + ret +; 1442f + +LoadEmote:: ; 1442f +; Get the address of the pointer to emote c. + ld a, c + ld bc, 6 ; sizeof(emote) + ld hl, Emotes + call AddNTimes +; Load the emote address into de + ld e, [hl] + inc hl + ld d, [hl] +; load the length of the emote (in tiles) into c + inc hl + ld c, [hl] + swap c +; load the emote pointer bank into b + inc hl + ld b, [hl] +; load the VRAM destination into hl + inc hl + ld a, [hli] + ld h, [hl] + ld l, a +; if the emote has a length of 0, do not proceed (error handling) + ld a, c + and a + ret z + call GetEmote2bpp + ret +; 1444d + + +INCLUDE "data/sprites/emotes.asm" + +INCLUDE "data/sprites/sprite_mons.asm" + +INCLUDE "data/maps/outdoor_sprites.asm" + +INCLUDE "data/sprites/sprites.asm" diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm new file mode 100755 index 000000000..ef9afc7ad --- /dev/null +++ b/engine/overworld/player_movement.asm @@ -0,0 +1,851 @@ +DoPlayerMovement:: ; 80000 + + call .GetDPad + ld a, movement_step_sleep + ld [wMovementAnimation], a + xor a + ld [wd041], a + call .TranslateIntoMovement + ld c, a + ld a, [wMovementAnimation] + ld [wPlayerNextMovement], a + ret + +.GetDPad: + + ld a, [hJoyDown] + ld [wCurInput], a + +; Standing downhill instead moves down. + + ld hl, wBikeFlags + bit BIKEFLAGS_DOWNHILL_F, [hl] + ret z + + ld c, a + and D_PAD + ret nz + + ld a, c + or D_DOWN + ld [wCurInput], a + ret +; 8002d + +.TranslateIntoMovement: + ld a, [wPlayerState] + cp PLAYER_NORMAL + jr z, .Normal + cp PLAYER_SURF + jr z, .Surf + cp PLAYER_SURF_PIKA + jr z, .Surf + cp PLAYER_BIKE + jr z, .Normal + cp PLAYER_SKATE + jr z, .Ice + +.Normal: + call .CheckForced + call .GetAction + call .CheckTile + ret c + call .CheckTurning + ret c + call .TryStep + ret c + call .TryJump + ret c + call .CheckWarp + ret c + jr .NotMoving + +.Surf: + call .CheckForced + call .GetAction + call .CheckTile + ret c + call .CheckTurning + ret c + call .TrySurf + ret c + jr .NotMoving + +.Ice: + call .CheckForced + call .GetAction + call .CheckTile + ret c + call .CheckTurning + ret c + call .TryStep + ret c + call .TryJump + ret c + call .CheckWarp + ret c + ld a, [wWalkingDirection] + cp STANDING + jr z, .HitWall + call .BumpSound +.HitWall: + call .StandInPlace + xor a + ret + +.NotMoving: + ld a, [wWalkingDirection] + cp STANDING + jr z, .Standing + +; Walking into an edge warp won't bump. + ld a, [wEngineBuffer4] + and a + jr nz, .CantMove + call .BumpSound +.CantMove: + call ._WalkInPlace + xor a + ret + +.Standing: + call .StandInPlace + xor a + ret +; 800b7 + +.CheckTile: ; 800b7 +; Tiles such as waterfalls and warps move the player +; in a given direction, overriding input. + + ld a, [wPlayerStandingTile] + ld c, a + call CheckWhirlpoolTile + jr c, .not_whirlpool + ld a, 3 + scf + ret + +.not_whirlpool + and $f0 + cp HI_NYBBLE_CURRENT + jr z, .water + cp HI_NYBBLE_WALK + jr z, .land1 + cp HI_NYBBLE_WALK_ALT + jr z, .land2 + cp HI_NYBBLE_WARPS + jr z, .warps + jr .no_walk + +.water + ld a, c + maskbits NUM_DIRECTIONS + ld c, a + ld b, 0 + ld hl, .water_table + add hl, bc + ld a, [hl] + ld [wWalkingDirection], a + jr .continue_walk + +.water_table + db RIGHT ; COLL_WATERFALL_RIGHT + db LEFT ; COLL_WATERFALL_LEFT + db UP ; COLL_WATERFALL_UP + db DOWN ; COLL_WATERFALL + +.land1 + ld a, c + and 7 + ld c, a + ld b, 0 + ld hl, .land1_table + add hl, bc + ld a, [hl] + cp STANDING + jr z, .no_walk + ld [wWalkingDirection], a + jr .continue_walk + +.land1_table + db STANDING ; COLL_BRAKE + db RIGHT ; COLL_WALK_RIGHT + db LEFT ; COLL_WALK_LEFT + db UP ; COLL_WALK_UP + db DOWN ; COLL_WALK_DOWN + db STANDING ; COLL_BRAKE_45 + db STANDING ; COLL_BRAKE_46 + db STANDING ; COLL_BRAKE_47 + +.land2 + ld a, c + and 7 + ld c, a + ld b, 0 + ld hl, .land2_table + add hl, bc + ld a, [hl] + cp STANDING + jr z, .no_walk + ld [wWalkingDirection], a + jr .continue_walk + +.land2_table + db RIGHT ; COLL_WALK_RIGHT_ALT + db LEFT ; COLL_WALK_LEFT_ALT + db UP ; COLL_WALK_UP_ALT + db DOWN ; COLL_WALK_DOWN_ALT + db STANDING ; COLL_BRAKE_ALT + db STANDING ; COLL_BRAKE_55 + db STANDING ; COLL_BRAKE_56 + db STANDING ; COLL_BRAKE_57 + +.warps + ld a, c + cp COLL_DOOR + jr z, .down + cp COLL_DOOR_79 + jr z, .down + cp COLL_STAIRCASE + jr z, .down + cp COLL_CAVE + jr nz, .no_walk + +.down + ld a, DOWN + ld [wWalkingDirection], a + jr .continue_walk + +.no_walk + xor a + ret + +.continue_walk + ld a, STEP_WALK + call .DoStep + ld a, 5 + scf + ret +; 80147 + +.CheckTurning: ; 80147 +; If the player is turning, change direction first. This also lets +; the player change facing without moving by tapping a direction. + + ld a, [wPlayerTurningDirection] + cp 0 + jr nz, .not_turning + ld a, [wWalkingDirection] + cp STANDING + jr z, .not_turning + + ld e, a + ld a, [wPlayerDirection] + rrca + rrca + maskbits NUM_DIRECTIONS + cp e + jr z, .not_turning + + ld a, STEP_TURN + call .DoStep + ld a, 2 + scf + ret + +.not_turning + xor a + ret +; 8016b + +.TryStep: ; 8016b + +; Surfing actually calls .TrySurf directly instead of passing through here. + ld a, [wPlayerState] + cp PLAYER_SURF + jr z, .TrySurf + cp PLAYER_SURF_PIKA + jr z, .TrySurf + + call .CheckLandPerms + jr c, .bump + + call .CheckNPC + and a + jr z, .bump + cp 2 + jr z, .bump + + ld a, [wPlayerStandingTile] + call CheckIceTile + jr nc, .ice + +; Downhill riding is slower when not moving down. + call .BikeCheck + jr nz, .walk + + ld hl, wBikeFlags + bit BIKEFLAGS_DOWNHILL_F, [hl] + jr z, .fast + + ld a, [wWalkingDirection] + cp DOWN + jr z, .fast + + ld a, STEP_WALK + call .DoStep + scf + ret + +.fast + ld a, STEP_BIKE + call .DoStep + scf + ret + +.walk + ld a, STEP_WALK + call .DoStep + scf + ret + +.ice + ld a, STEP_ICE + call .DoStep + scf + ret + +; unused + xor a + ret + +.bump + xor a + ret +; 801c0 + +.TrySurf: ; 801c0 + + call .CheckSurfPerms + ld [wd040], a + jr c, .surf_bump + + call .CheckNPC + ld [wd03f], a + and a + jr z, .surf_bump + cp 2 + jr z, .surf_bump + + ld a, [wd040] + and a + jr nz, .ExitWater + + ld a, STEP_WALK + call .DoStep + scf + ret + +.ExitWater: + call .GetOutOfWater + call PlayMapMusic + ld a, STEP_WALK + call .DoStep + ld a, 6 + scf + ret + +.surf_bump + xor a + ret +; 801f3 + +.TryJump: ; 801f3 + ld a, [wPlayerStandingTile] + ld e, a + and $f0 + cp HI_NYBBLE_LEDGES + jr nz, .DontJump + + ld a, e + and 7 + ld e, a + ld d, 0 + ld hl, .data_8021e + add hl, de + ld a, [wFacingDirection] + and [hl] + jr z, .DontJump + + ld de, SFX_JUMP_OVER_LEDGE + call PlaySFX + ld a, STEP_LEDGE + call .DoStep + ld a, 7 + scf + ret + +.DontJump: + xor a + ret + +.data_8021e + db FACE_RIGHT ; COLL_HOP_RIGHT + db FACE_LEFT ; COLL_HOP_LEFT + db FACE_UP ; COLL_HOP_UP + db FACE_DOWN ; COLL_HOP_DOWN + db FACE_RIGHT | FACE_DOWN ; COLL_HOP_DOWN_RIGHT + db FACE_DOWN | FACE_LEFT ; COLL_HOP_DOWN_LEFT + db FACE_UP | FACE_RIGHT ; COLL_HOP_UP_RIGHT + db FACE_UP | FACE_LEFT ; COLL_HOP_UP_LEFT +; 80226 + +.CheckWarp: ; 80226 + +; Bug: Since no case is made for STANDING here, it will check +; [.edgewarps + $ff]. This resolves to $3e at $8035a. +; This causes wd041 to be nonzero when standing on tile $3e, +; making bumps silent. + + ld a, [wWalkingDirection] + ; cp STANDING + ; jr z, .not_warp + ld e, a + ld d, 0 + ld hl, .EdgeWarps + add hl, de + ld a, [wPlayerStandingTile] + cp [hl] + jr nz, .not_warp + + ld a, 1 + ld [wd041], a + ld a, [wWalkingDirection] + ; This is in the wrong place. + cp STANDING + jr z, .not_warp + + ld e, a + ld a, [wPlayerDirection] + rrca + rrca + maskbits NUM_DIRECTIONS + cp e + jr nz, .not_warp + call WarpCheck + jr nc, .not_warp + + call .StandInPlace + scf + ld a, 1 + ret + +.not_warp + xor a + ret + +.EdgeWarps: + db COLL_WARP_CARPET_DOWN + db COLL_WARP_CARPET_UP + db COLL_WARP_CARPET_LEFT + db COLL_WARP_CARPET_RIGHT +; 8025f + +.DoStep: + ld e, a + ld d, 0 + ld hl, .Steps + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + + ld a, [wWalkingDirection] + ld e, a + cp STANDING + jp z, .StandInPlace + + add hl, de + ld a, [hl] + ld [wMovementAnimation], a + + ld hl, .FinishFacing + add hl, de + ld a, [hl] + ld [wPlayerTurningDirection], a + + ld a, 4 + ret + +.Steps: + dw .SlowStep + dw .NormalStep + dw .FastStep + dw .JumpStep + dw .SlideStep + dw .TurningStep + dw .BackJumpStep + dw .FinishFacing + +.SlowStep: + slow_step DOWN + slow_step UP + slow_step LEFT + slow_step RIGHT +.NormalStep: + step DOWN + step UP + step LEFT + step RIGHT +.FastStep: + big_step DOWN + big_step UP + big_step LEFT + big_step RIGHT +.JumpStep: + jump_step DOWN + jump_step UP + jump_step LEFT + jump_step RIGHT +.SlideStep: + fast_slide_step DOWN + fast_slide_step UP + fast_slide_step LEFT + fast_slide_step RIGHT +.BackJumpStep: + jump_step UP + jump_step DOWN + jump_step RIGHT + jump_step LEFT +.TurningStep: + turn_step DOWN + turn_step UP + turn_step LEFT + turn_step RIGHT +.FinishFacing: + db $80 + DOWN + db $80 + UP + db $80 + LEFT + db $80 + RIGHT +; 802b3 + +.StandInPlace: ; 802b3 + ld a, 0 + ld [wPlayerTurningDirection], a + ld a, movement_step_sleep + ld [wMovementAnimation], a + xor a + ret +; 802bf + +._WalkInPlace: ; 802bf + ld a, 0 + ld [wPlayerTurningDirection], a + ld a, movement_step_bump + ld [wMovementAnimation], a + xor a + ret +; 802cb + +.CheckForced: ; 802cb +; When sliding on ice, input is forced to remain in the same direction. + + call CheckStandingOnIce + ret nc + + ld a, [wPlayerTurningDirection] + cp 0 + ret z + + maskbits NUM_DIRECTIONS + ld e, a + ld d, 0 + ld hl, .forced_dpad + add hl, de + ld a, [wCurInput] + and BUTTONS + or [hl] + ld [wCurInput], a + ret + +.forced_dpad + db D_DOWN, D_UP, D_LEFT, D_RIGHT +; 802ec + +.GetAction: ; 802ec +; Poll player input and update movement info. + + ld hl, .table + ld de, .table2 - .table1 + ld a, [wCurInput] + bit D_DOWN_F, a + jr nz, .d_down + bit D_UP_F, a + jr nz, .d_up + bit D_LEFT_F, a + jr nz, .d_left + bit D_RIGHT_F, a + jr nz, .d_right +; Standing + jr .update + +.d_down add hl, de +.d_up add hl, de +.d_left add hl, de +.d_right add hl, de + +.update + ld a, [hli] + ld [wWalkingDirection], a + ld a, [hli] + ld [wFacingDirection], a + ld a, [hli] + ld [wWalkingX], a + ld a, [hli] + ld [wWalkingY], a + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hl] + ld [wWalkingTile], a + ret + +.table +; struct: +; walk direction +; facing +; x movement +; y movement +; tile collision pointer +.table1 + db STANDING, FACE_CURRENT, 0, 0 + dw wPlayerStandingTile +.table2 + db RIGHT, FACE_RIGHT, 1, 0 + dw wTileRight + db LEFT, FACE_LEFT, -1, 0 + dw wTileLeft + db UP, FACE_UP, 0, -1 + dw wTileUp + db DOWN, FACE_DOWN, 0, 1 + dw wTileDown +; 80341 + +.CheckNPC: ; 80341 +; Returns 0 if there is an NPC in front that you can't move +; Returns 1 if there is no NPC in front +; Returns 2 if there is a movable NPC in front + ld a, 0 + ld [hMapObjectIndexBuffer], a +; Load the next X coordinate into d + ld a, [wPlayerStandingMapX] + ld d, a + ld a, [wWalkingX] + add d + ld d, a +; Load the next Y coordinate into e + ld a, [wPlayerStandingMapY] + ld e, a + ld a, [wWalkingY] + add e + ld e, a +; Find an object struct with coordinates equal to d,e + ld bc, wObjectStructs ; redundant + farcall IsNPCAtCoord + jr nc, .is_npc + call .CheckStrengthBoulder + jr c, .no_bump + + xor a + ret + +.is_npc + ld a, 1 + ret + +.no_bump + ld a, 2 + ret +; 8036f + +.CheckStrengthBoulder: ; 8036f + + ld hl, wBikeFlags + bit BIKEFLAGS_STRENGTH_ACTIVE_F, [hl] + jr z, .not_boulder + + ld hl, OBJECT_DIRECTION_WALKING + add hl, bc + ld a, [hl] + cp STANDING + jr nz, .not_boulder + + ld hl, OBJECT_PALETTE + add hl, bc + bit 6, [hl] + jr z, .not_boulder + + ld hl, OBJECT_FLAGS2 + add hl, bc + set 2, [hl] + + ld a, [wWalkingDirection] + ld d, a + ld hl, OBJECT_RANGE + add hl, bc + ld a, [hl] + and $fc + or d + ld [hl], a + + scf + ret + +.not_boulder + xor a + ret +; 8039e + +.CheckLandPerms: ; 8039e +; Return 0 if walking onto land and tile permissions allow it. +; Otherwise, return carry. + + ld a, [wTilePermissions] + ld d, a + ld a, [wFacingDirection] + and d + jr nz, .NotWalkable + + ld a, [wWalkingTile] + call .CheckWalkable + jr c, .NotWalkable + + xor a + ret + +.NotWalkable: + scf + ret +; 803b4 + +.CheckSurfPerms: ; 803b4 +; Return 0 if moving in water, or 1 if moving onto land. +; Otherwise, return carry. + + ld a, [wTilePermissions] + ld d, a + ld a, [wFacingDirection] + and d + jr nz, .NotSurfable + + ld a, [wWalkingTile] + call .CheckSurfable + jr c, .NotSurfable + + and a + ret + +.NotSurfable: + scf + ret +; 803ca + +.BikeCheck: ; 803ca + ld a, [wPlayerState] + cp PLAYER_BIKE + ret z + cp PLAYER_SKATE + ret +; 803d3 + +.CheckWalkable: ; 803d3 +; Return 0 if tile a is land. Otherwise, return carry. + + call GetTileCollision + and a ; LANDTILE? + ret z + scf + ret +; 803da + +.CheckSurfable: ; 803da +; Return 0 if tile a is water, or 1 if land. +; Otherwise, return carry. + + call GetTileCollision + cp WATERTILE + jr z, .Water + +; Can walk back onto land from water. + and a ; LANDTILE? + jr z, .Land + + jr .Neither + +.Water: + xor a + ret + +.Land: + ld a, 1 + and a + ret + +.Neither: + scf + ret +; 803ee + +.BumpSound: ; 803ee + + call CheckSFX + ret c + ld de, SFX_BUMP + call PlaySFX + ret +; 803f9 + +.GetOutOfWater: ; 803f9 + push bc + ld a, PLAYER_NORMAL + ld [wPlayerState], a + call ReplaceKrisSprite ; UpdateSprites + pop bc + ret +; 80404 + +CheckStandingOnIce:: ; 80404 + ld a, [wPlayerTurningDirection] + cp 0 + jr z, .not_ice + cp $f0 + jr z, .not_ice + ld a, [wPlayerStandingTile] + call CheckIceTile + jr nc, .yep + ld a, [wPlayerState] + cp PLAYER_SKATE + jr nz, .not_ice + +.yep + scf + ret + +.not_ice + and a + ret +; 80422 + +StopPlayerForEvent:: ; 80422 + ld hl, wPlayerNextMovement + ld a, movement_step_sleep + cp [hl] + ret z + + ld [hl], a + ld a, 0 + ld [wPlayerTurningDirection], a + ret +; 80430 diff --git a/engine/overworld/player_object.asm b/engine/overworld/player_object.asm new file mode 100755 index 000000000..7d287dedb --- /dev/null +++ b/engine/overworld/player_object.asm @@ -0,0 +1,856 @@ +BlankScreen: ; 8000 + call DisableSpriteUpdates + xor a + ld [hBGMapMode], a + call ClearBGPalettes + call ClearSprites + hlcoord 0, 0 + ld bc, wTileMapEnd - wTileMap + ld a, " " + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, wAttrMapEnd - wAttrMap + ld a, $7 + call ByteFill + call WaitBGMap2 + call SetPalettes + ret + +SpawnPlayer: ; 8029 + ld a, -1 + ld [wObjectFollow_Leader], a + ld [wObjectFollow_Follower], a + ld a, $0 + ld hl, PlayerObjectTemplate + call CopyPlayerObjectTemplate + ld b, $0 + call PlayerSpawn_ConvertCoords + ld a, PLAYER_OBJECT + call GetMapObject + ld hl, MAPOBJECT_COLOR + add hl, bc + ln e, PAL_NPC_RED, OBJECTTYPE_SCRIPT + ld a, [wPlayerSpriteSetupFlags] + bit PLAYERSPRITESETUP_FEMALE_TO_MALE_F, a + jr nz, .ok + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .ok + ln e, PAL_NPC_BLUE, OBJECTTYPE_SCRIPT + +.ok + ld [hl], e + ld a, PLAYER_OBJECT + ld [hMapObjectIndexBuffer], a + ld bc, wMapObjects + ld a, PLAYER_OBJECT + ld [hObjectStructIndexBuffer], a + ld de, wObjectStructs + call CopyMapObjectToObjectStruct + ld a, PLAYER + ld [wCenteredObject], a + ret + +PlayerObjectTemplate: ; 8071 +; A dummy map object used to initialize the player object. +; Shorter than the actual amount copied by two bytes. +; Said bytes seem to be unused. + object_event -4, -4, SPRITE_CHRIS, SPRITEMOVEDATA_PLAYER, 15, 15, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, 0, -1 + +CopyDECoordsToMapObject:: ; 807e + push de + ld a, b + call GetMapObject + pop de + ld hl, MAPOBJECT_X_COORD + add hl, bc + ld [hl], d + ld hl, MAPOBJECT_Y_COORD + add hl, bc + ld [hl], e + ret + +PlayerSpawn_ConvertCoords: ; 808f + push bc + ld a, [wXCoord] + add 4 + ld d, a + ld a, [wYCoord] + add 4 + ld e, a + pop bc + call CopyDECoordsToMapObject + ret + +WriteObjectXY:: ; 80a1 + ld a, b + call CheckObjectVisibility + ret c + + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + ld a, [hMapObjectIndexBuffer] + ld b, a + call CopyDECoordsToMapObject + and a + ret + +RefreshPlayerCoords: ; 80b8 + ld a, [wXCoord] + add 4 + ld d, a + ld hl, wPlayerStandingMapX + sub [hl] + ld [hl], d + ld hl, wMapObjects + MAPOBJECT_X_COORD + ld [hl], d + ld hl, wPlayerLastMapX + ld [hl], d + ld d, a + ld a, [wYCoord] + add 4 + ld e, a + ld hl, wPlayerStandingMapY + sub [hl] + ld [hl], e + ld hl, wMapObjects + MAPOBJECT_Y_COORD + ld [hl], e + ld hl, wPlayerLastMapY + ld [hl], e + ld e, a + ld a, [wObjectFollow_Leader] + cp $0 + ret nz ; wtf + ret + +CopyObjectStruct:: ; 80e7 + call CheckObjectMask + and a + ret nz ; masked + + ld hl, wObjectStructs + OBJECT_STRUCT_LENGTH * 1 + ld a, 1 + ld de, OBJECT_STRUCT_LENGTH +.loop + ld [hObjectStructIndexBuffer], a + ld a, [hl] + and a + jr z, .done + add hl, de + ld a, [hObjectStructIndexBuffer] + inc a + cp NUM_OBJECT_STRUCTS + jr nz, .loop + scf + ret ; overflow + +.done + ld d, h + ld e, l + call CopyMapObjectToObjectStruct + ld hl, wVramState + bit 7, [hl] + ret z + + ld hl, OBJECT_FLAGS2 + add hl, de + set 5, [hl] + ret + +CopyMapObjectToObjectStruct: ; 8116 + call .CopyMapObjectToTempObject + call CopyTempObjectToObjectStruct + ret + +.CopyMapObjectToTempObject: ; 811d + ld a, [hObjectStructIndexBuffer] + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld [hl], a + + ld a, [hMapObjectIndexBuffer] + ld [wTempObjectCopyMapObjectIndex], a + + ld hl, MAPOBJECT_SPRITE + add hl, bc + ld a, [hl] + ld [wTempObjectCopySprite], a + + call GetSpriteVTile + ld [wTempObjectCopySpriteVTile], a + + ld a, [hl] + call GetSpritePalette + ld [wTempObjectCopyPalette], a + + ld hl, MAPOBJECT_COLOR + add hl, bc + ld a, [hl] + and $f0 + jr z, .skip_color_override + swap a + and PALETTE_MASK + ld [wTempObjectCopyPalette], a + +.skip_color_override + ld hl, MAPOBJECT_MOVEMENT + add hl, bc + ld a, [hl] + ld [wTempObjectCopyMovement], a + + ld hl, MAPOBJECT_RANGE + add hl, bc + ld a, [hl] + ld [wTempObjectCopyRange], a + + ld hl, MAPOBJECT_X_COORD + add hl, bc + ld a, [hl] + ld [wTempObjectCopyX], a + + ld hl, MAPOBJECT_Y_COORD + add hl, bc + ld a, [hl] + ld [wTempObjectCopyY], a + + ld hl, MAPOBJECT_RADIUS + add hl, bc + ld a, [hl] + ld [wTempObjectCopyRadius], a + ret + +InitializeVisibleSprites: ; 8177 + ld bc, wMapObjects + OBJECT_LENGTH + ld a, 1 +.loop + ld [hMapObjectIndexBuffer], a + ld hl, MAPOBJECT_SPRITE + add hl, bc + ld a, [hl] + and a + jr z, .next + + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + cp -1 + jr nz, .next + + ld a, [wXCoord] + ld d, a + ld a, [wYCoord] + ld e, a + + ld hl, MAPOBJECT_X_COORD + add hl, bc + ld a, [hl] + add 1 + sub d + jr c, .next + + cp MAPOBJECT_SCREEN_WIDTH + jr nc, .next + + ld hl, MAPOBJECT_Y_COORD + add hl, bc + ld a, [hl] + add 1 + sub e + jr c, .next + + cp MAPOBJECT_SCREEN_HEIGHT + jr nc, .next + + push bc + call CopyObjectStruct + pop bc + jp c, .ret + +.next + ld hl, OBJECT_LENGTH + add hl, bc + ld b, h + ld c, l + ld a, [hMapObjectIndexBuffer] + inc a + cp NUM_OBJECTS + jr nz, .loop + ret + +.ret ; 81c9 + ret + +CheckObjectEnteringVisibleRange:: ; 81ca + nop + ld a, [wPlayerStepDirection] + cp STANDING + ret z + ld hl, .dw + rst JumpTable + ret + +.dw ; 81d6 + dw .Down + dw .Up + dw .Left + dw .Right + +.Up: ; 81de + ld a, [wYCoord] + sub 1 + jr .Vertical + +.Down: ; 81e5 + ld a, [wYCoord] + add 9 +.Vertical: ; 81ea + ld d, a + ld a, [wXCoord] + ld e, a + ld bc, wMapObjects + OBJECT_LENGTH + ld a, 1 +.loop_v + ld [hMapObjectIndexBuffer], a + ld hl, MAPOBJECT_SPRITE + add hl, bc + ld a, [hl] + and a + jr z, .next_v + ld hl, MAPOBJECT_Y_COORD + add hl, bc + ld a, d + cp [hl] + jr nz, .next_v + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + cp -1 + jr nz, .next_v + ld hl, MAPOBJECT_X_COORD + add hl, bc + ld a, [hl] + add 1 + sub e + jr c, .next_v + cp MAPOBJECT_SCREEN_WIDTH + jr nc, .next_v + push de + push bc + call CopyObjectStruct + pop bc + pop de + +.next_v + ld hl, OBJECT_LENGTH + add hl, bc + ld b, h + ld c, l + ld a, [hMapObjectIndexBuffer] + inc a + cp NUM_OBJECTS + jr nz, .loop_v + ret + +.Left: ; 8232 + ld a, [wXCoord] + sub 1 + jr .Horizontal + +.Right: ; 8239 + ld a, [wXCoord] + add 10 +.Horizontal: ; 823e + ld e, a + ld a, [wYCoord] + ld d, a + ld bc, wMapObjects + OBJECT_LENGTH + ld a, 1 +.loop_h + ld [hMapObjectIndexBuffer], a + ld hl, MAPOBJECT_SPRITE + add hl, bc + ld a, [hl] + and a + jr z, .next_h + ld hl, MAPOBJECT_X_COORD + add hl, bc + ld a, e + cp [hl] + jr nz, .next_h + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + cp -1 + jr nz, .next_h + ld hl, MAPOBJECT_Y_COORD + add hl, bc + ld a, [hl] + add 1 + sub d + jr c, .next_h + cp MAPOBJECT_SCREEN_HEIGHT + jr nc, .next_h + push de + push bc + call CopyObjectStruct + pop bc + pop de + +.next_h + ld hl, OBJECT_LENGTH + add hl, bc + ld b, h + ld c, l + ld a, [hMapObjectIndexBuffer] + inc a + cp NUM_OBJECTS + jr nz, .loop_h + ret + +CopyTempObjectToObjectStruct: ; 8286 + ld a, [wTempObjectCopyMapObjectIndex] + ld hl, OBJECT_MAP_OBJECT_INDEX + add hl, de + ld [hl], a + + ld a, [wTempObjectCopyMovement] + call CopySpriteMovementData + + ld a, [wTempObjectCopyPalette] + ld hl, OBJECT_PALETTE + add hl, de + or [hl] + ld [hl], a + + ld a, [wTempObjectCopyY] + call .InitYCoord + + ld a, [wTempObjectCopyX] + call .InitXCoord + + ld a, [wTempObjectCopySprite] + ld hl, OBJECT_SPRITE + add hl, de + ld [hl], a + + ld a, [wTempObjectCopySpriteVTile] + ld hl, OBJECT_SPRITE_TILE + add hl, de + ld [hl], a + + ld hl, OBJECT_STEP_TYPE + add hl, de + ld [hl], STEP_TYPE_00 + + ld hl, OBJECT_FACING_STEP + add hl, de + ld [hl], STANDING + + ld a, [wTempObjectCopyRadius] + call .InitRadius + + ld a, [wTempObjectCopyRange] + ld hl, OBJECT_RANGE + add hl, de + ld [hl], a + + and a + ret + +.InitYCoord: ; 82d5 + ld hl, OBJECT_INIT_Y + add hl, de + ld [hl], a + + ld hl, OBJECT_NEXT_MAP_Y + add hl, de + ld [hl], a + + ld hl, wYCoord + sub [hl] + and $f + swap a + ld hl, wPlayerBGMapOffsetY + sub [hl] + ld hl, OBJECT_SPRITE_Y + add hl, de + ld [hl], a + ret + +.InitXCoord: ; 82f1 + ld hl, OBJECT_INIT_X + add hl, de + ld [hl], a + ld hl, OBJECT_NEXT_MAP_X + add hl, de + ld [hl], a + ld hl, wXCoord + sub [hl] + and $f + swap a + ld hl, wPlayerBGMapOffsetX + sub [hl] + ld hl, OBJECT_SPRITE_X + add hl, de + ld [hl], a + ret + +.InitRadius: ; 830d + ld h, a + inc a + and $f + ld l, a + ld a, h + add $10 + and $f0 + or l + ld hl, OBJECT_RADIUS + add hl, de + ld [hl], a + ret + +TrainerWalkToPlayer: ; 831e + ld a, [hLastTalked] + call InitMovementBuffer + ld a, movement_step_sleep + call AppendToMovementBuffer + ld a, [wd03f] + dec a + jr z, .TerminateStep + ld a, [hLastTalked] + ld b, a + ld c, PLAYER + ld d, 1 + call .GetPathToPlayer + call DecrementMovementBufferCount + +.TerminateStep: + ld a, movement_step_end + call AppendToMovementBuffer + ret + +.GetPathToPlayer: ; 8341 + push de + push bc +; get player object struct, load to de + ld a, c + call GetMapObject + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + call GetObjectStruct + ld d, b + ld e, c + +; get last talked object struct, load to bc + pop bc + ld a, b + call GetMapObject + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + call GetObjectStruct + +; get last talked coords, load to bc + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld c, [hl] + ld b, a + +; get player coords, load to de + ld hl, OBJECT_NEXT_MAP_X + add hl, de + ld a, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, de + ld e, [hl] + ld d, a + + pop af + call ComputePathToWalkToPlayer + ret + +SurfStartStep: ; 8379 + call InitMovementBuffer + call .GetMovementData + call AppendToMovementBuffer + ld a, movement_step_end + call AppendToMovementBuffer + ret + +.GetMovementData: ; 8388 + ld a, [wPlayerDirection] + srl a + srl a + maskbits NUM_DIRECTIONS + ld e, a + ld d, 0 + ld hl, .movement_data + add hl, de + ld a, [hl] + ret + +.movement_data + slow_step DOWN + slow_step UP + slow_step LEFT + slow_step RIGHT + +FollowNotExact:: ; 839e + push bc + ld a, c + call CheckObjectVisibility + ld d, b + ld e, c + pop bc + ret c + + ld a, b + call CheckObjectVisibility + ret c + +; object 2 is now in bc, object 1 is now in de + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld c, [hl] + ld b, a + + ld hl, OBJECT_NEXT_MAP_X + add hl, de + ld a, [hl] + cp b + jr z, .same_x + jr c, .to_the_left + inc b + jr .continue + +.to_the_left + dec b + jr .continue + +.same_x + ld hl, OBJECT_NEXT_MAP_Y + add hl, de + ld a, [hl] + cp c + jr z, .continue + jr c, .below + inc c + jr .continue + +.below + dec c + +.continue + ld hl, OBJECT_NEXT_MAP_X + add hl, de + ld [hl], b + ld a, b + ld hl, wXCoord + sub [hl] + and $f + swap a + ld hl, wPlayerBGMapOffsetX + sub [hl] + ld hl, OBJECT_SPRITE_X + add hl, de + ld [hl], a + ld hl, OBJECT_NEXT_MAP_Y + add hl, de + ld [hl], c + ld a, c + ld hl, wYCoord + sub [hl] + and $f + swap a + ld hl, wPlayerBGMapOffsetY + sub [hl] + ld hl, OBJECT_SPRITE_Y + add hl, de + ld [hl], a + ld a, [hObjectStructIndexBuffer] + ld hl, OBJECT_RANGE + add hl, de + ld [hl], a + ld hl, OBJECT_MOVEMENTTYPE + add hl, de + ld [hl], SPRITEMOVEDATA_FOLLOWNOTEXACT + ld hl, OBJECT_STEP_TYPE + add hl, de + ld [hl], STEP_TYPE_00 + ret + +GetRelativeFacing:: ; 8417 +; Determines which way map object e would have to turn to face map object d. Returns carry if it's impossible for whatever reason. + ld a, d + call GetMapObject + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + cp NUM_OBJECT_STRUCTS + jr nc, .carry + ld d, a + ld a, e + call GetMapObject + ld hl, MAPOBJECT_OBJECT_STRUCT_ID + add hl, bc + ld a, [hl] + cp NUM_OBJECT_STRUCTS + jr nc, .carry + ld e, a + call .GetFacing_e_relativeto_d + ret + +.carry + scf + ret + +.GetFacing_e_relativeto_d: ; 8439 +; Determines which way object e would have to turn to face object d. Returns carry if it's impossible. +; load the coordinates of object d into bc + ld a, d + call GetObjectStruct + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld c, [hl] + ld b, a + push bc +; load the coordinates of object e into de + ld a, e + call GetObjectStruct + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + pop bc +; |x1 - x2| + ld a, b + sub d + jr z, .same_x_1 + jr nc, .b_right_of_d_1 + cpl + inc a + +.b_right_of_d_1 +; |y1 - y2| + ld h, a + ld a, c + sub e + jr z, .same_y_1 + jr nc, .c_below_e_1 + cpl + inc a + +.c_below_e_1 +; |y1 - y2| - |x1 - x2| + sub h + jr c, .same_y_1 + +.same_x_1 +; compare the y coordinates + ld a, c + cp e + jr z, .same_x_and_y + jr c, .c_directly_below_e +; c directly above e + ld d, DOWN + and a + ret + +.c_directly_below_e + ld d, UP + and a + ret + +.same_y_1 + ld a, b + cp d + jr z, .same_x_and_y + jr c, .b_directly_right_of_d +; b directly left of d + ld d, RIGHT + and a + ret + +.b_directly_right_of_d + ld d, LEFT + and a + ret + +.same_x_and_y + scf + ret + +QueueFollowerFirstStep: ; 848a + call .QueueFirstStep + jr c, .same + ld [wFollowMovementQueue], a + xor a + ld [wFollowerMovementQueueLength], a + ret + +.same + ld a, -1 + ld [wFollowerMovementQueueLength], a + ret + +.QueueFirstStep: + ld a, [wObjectFollow_Leader] + call GetObjectStruct + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld d, [hl] + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld e, [hl] + ld a, [wObjectFollow_Follower] + call GetObjectStruct + ld hl, OBJECT_NEXT_MAP_X + add hl, bc + ld a, d + cp [hl] + jr z, .check_y + jr c, .left + and a + ld a, movement_step + RIGHT + ret + +.left + and a + ld a, movement_step + LEFT + ret + +.check_y + ld hl, OBJECT_NEXT_MAP_Y + add hl, bc + ld a, e + cp [hl] + jr z, .same_xy + jr c, .up + and a + ld a, movement_step + DOWN + ret + +.up + and a + ld a, movement_step + UP + ret + +.same_xy + scf + ret diff --git a/engine/overworld/player_step.asm b/engine/overworld/player_step.asm new file mode 100755 index 000000000..675c6553b --- /dev/null +++ b/engine/overworld/player_step.asm @@ -0,0 +1,270 @@ +_HandlePlayerStep:: ; d497 (3:5497) + ld a, [wPlayerStepFlags] + and a + ret z + bit 7, a ; starting step + jr nz, .update_overworld_map + bit 6, a ; finishing step + jr nz, .update_player_coords + bit 5, a ; ongoing step + jr nz, .finish + ret + +.update_overworld_map + ld a, 4 + ld [wHandlePlayerStep], a + call UpdateOverworldMap + jr .finish + +.update_player_coords + call UpdatePlayerCoords + jr .finish + +.finish + call HandlePlayerStep + ld a, [wPlayerStepVectorX] + ld d, a + ld a, [wPlayerStepVectorY] + ld e, a + ld a, [wPlayerBGMapOffsetX] + sub d + ld [wPlayerBGMapOffsetX], a + ld a, [wPlayerBGMapOffsetY] + sub e + ld [wPlayerBGMapOffsetY], a + ret + +ScrollScreen:: ; d4d2 (3:54d2) + ld a, [wPlayerStepVectorX] + ld d, a + ld a, [wPlayerStepVectorY] + ld e, a + ld a, [hSCX] + add d + ld [hSCX], a + ld a, [hSCY] + add e + ld [hSCY], a + ret + +HandlePlayerStep: ; d4e5 (3:54e5) + ld hl, wHandlePlayerStep + ld a, [hl] + and a + ret z + dec [hl] + ld a, [hl] + ld hl, .Jumptable + rst JumpTable + ret + +.Jumptable: ; d4f2 (3:54f2) + dw GetMovementPermissions + dw BufferScreen + dw .mobile + dw .fail2 +; The rest are never used. Ever. + dw .fail1 + dw .fail1 + dw .fail1 + dw .fail1 + dw .fail1 + dw .fail1 + dw .fail1 + +.fail1 ; d508 (3:5508) + ret + +.mobile ; d509 (3:5509) + farcall StubbedTrainerRankings_StepCount + ret + +.fail2 ; d510 (3:5510) + ret + +UpdatePlayerCoords: ; d511 (3:5511) + ld a, [wPlayerStepDirection] + and a + jr nz, .check_step_down + ld hl, wYCoord + inc [hl] + ret + +.check_step_down + cp UP + jr nz, .check_step_left + ld hl, wYCoord + dec [hl] + ret + +.check_step_left + cp LEFT + jr nz, .check_step_right + ld hl, wXCoord + dec [hl] + ret + +.check_step_right + cp RIGHT + ret nz + ld hl, wXCoord + inc [hl] + ret + +UpdateOverworldMap: ; d536 (3:5536) + ld a, [wPlayerStepDirection] + and a + jr z, .step_down + cp UP + jr z, .step_up + cp LEFT + jr z, .step_left + cp RIGHT + jr z, .step_right + ret + +.step_down + call .ScrollOverworldMapDown + call LoadMapPart + call ScrollMapUp + ret + +.step_up + call .ScrollOverworldMapUp + call LoadMapPart + call ScrollMapDown + ret + +.step_left + call .ScrollOverworldMapLeft + call LoadMapPart + call ScrollMapRight + ret + +.step_right + call .ScrollOverworldMapRight + call LoadMapPart + call ScrollMapLeft + ret + +.ScrollOverworldMapDown: ; d571 (3:5571) + ld a, [wBGMapAnchor] + add 2 * BG_MAP_WIDTH + ld [wBGMapAnchor], a + jr nc, .not_overflowed + ld a, [wBGMapAnchor + 1] + inc a + and %11 + or HIGH(vBGMap0) + ld [wBGMapAnchor + 1], a +.not_overflowed + ld hl, wMetatileStandingY + inc [hl] + ld a, [hl] + cp 2 ; was 1 + jr nz, .done_down + ld [hl], 0 + call .Add6ToOverworldMapAnchor +.done_down + ret + +.Add6ToOverworldMapAnchor: ; d595 (3:5595) + ld hl, wOverworldMapAnchor + ld a, [wMapWidth] + add 6 + add [hl] + ld [hli], a + ret nc + inc [hl] + ret + +.ScrollOverworldMapUp: ; d5a2 (3:55a2) + ld a, [wBGMapAnchor] + sub 2 * BG_MAP_WIDTH + ld [wBGMapAnchor], a + jr nc, .not_underflowed + ld a, [wBGMapAnchor + 1] + dec a + and %11 + or HIGH(vBGMap0) + ld [wBGMapAnchor + 1], a +.not_underflowed + ld hl, wMetatileStandingY + dec [hl] + ld a, [hl] + cp -1 ; was 0 + jr nz, .done_up + ld [hl], $1 + call .Sub6FromOverworldMapAnchor +.done_up + ret + +.Sub6FromOverworldMapAnchor: ; d5c6 (3:55c6) + ld hl, wOverworldMapAnchor + ld a, [wMapWidth] + add 6 + ld b, a + ld a, [hl] + sub b + ld [hli], a + ret nc + dec [hl] + ret + +.ScrollOverworldMapLeft: ; d5d5 (3:55d5) + ld a, [wBGMapAnchor] + ld e, a + and $e0 + ld d, a + ld a, e + sub $2 + and $1f + or d + ld [wBGMapAnchor], a + ld hl, wMetatileStandingX + dec [hl] + ld a, [hl] + cp -1 + jr nz, .done_left + ld [hl], 1 + call .DecrementwOverworldMapAnchor +.done_left + ret + +.DecrementwOverworldMapAnchor: ; d5f4 (3:55f4) + ld hl, wOverworldMapAnchor + ld a, [hl] + sub 1 + ld [hli], a + ret nc + dec [hl] + ret + +.ScrollOverworldMapRight: ; d5fe (3:55fe) + ld a, [wBGMapAnchor] + ld e, a + and $e0 + ld d, a + ld a, e + add $2 + and $1f + or d + ld [wBGMapAnchor], a + ld hl, wMetatileStandingX + inc [hl] + ld a, [hl] + cp 2 + jr nz, .done_right + ld [hl], 0 + call .IncrementwOverworldMapAnchor +.done_right + ret + +.IncrementwOverworldMapAnchor: ; d61d (3:561d) + ld hl, wOverworldMapAnchor + ld a, [hl] + add 1 + ld [hli], a + ret nc + inc [hl] + ret diff --git a/engine/overworld/scripting.asm b/engine/overworld/scripting.asm new file mode 100644 index 000000000..f65f2f9c0 --- /dev/null +++ b/engine/overworld/scripting.asm @@ -0,0 +1,2857 @@ +; Event scripting commands. + + +EnableScriptMode:: + push af + ld a, SCRIPT_READ + ld [wScriptMode], a + pop af + ret + +ScriptEvents:: + call StartScript +.loop + ld a, [wScriptMode] + ld hl, .modes + rst JumpTable + call CheckScript + jr nz, .loop + ret + +.modes + dw EndScript + dw RunScriptCommand + dw WaitScriptMovement + dw WaitScript + +EndScript: + call StopScript + ret + +WaitScript: + call StopScript + + ld hl, wScriptDelay + dec [hl] + ret nz + + farcall Function58b9 + + ld a, SCRIPT_READ + ld [wScriptMode], a + call StartScript + ret + +WaitScriptMovement: + call StopScript + + ld hl, wVramState + bit 7, [hl] + ret nz + + farcall Function58b9 + + ld a, SCRIPT_READ + ld [wScriptMode], a + call StartScript + ret + +RunScriptCommand: + call GetScriptByte + ld hl, ScriptCommandTable + rst JumpTable + ret + + +ScriptCommandTable: +; entries correspond to macros/scripts/events.asm enumeration + dw Script_scall ; 00 + dw Script_farscall ; 01 + dw Script_ptcall ; 02 + dw Script_jump ; 03 + dw Script_farjump ; 04 + dw Script_ptjump ; 05 + dw Script_ifequal ; 06 + dw Script_ifnotequal ; 07 + dw Script_iffalse ; 08 + dw Script_iftrue ; 09 + dw Script_ifgreater ; 0a + dw Script_ifless ; 0b + dw Script_jumpstd ; 0c + dw Script_callstd ; 0d + dw Script_callasm ; 0e + dw Script_special ; 0f + dw Script_ptcallasm ; 10 + dw Script_checkmapscene ; 11 + dw Script_setmapscene ; 12 + dw Script_checkscene ; 13 + dw Script_setscene ; 14 + dw Script_writebyte ; 15 + dw Script_addvar ; 16 + dw Script_random ; 17 + dw Script_checkver ; 18 + dw Script_copybytetovar ; 19 + dw Script_copyvartobyte ; 1a + dw Script_loadvar ; 1b + dw Script_checkcode ; 1c + dw Script_writevarcode ; 1d + dw Script_writecode ; 1e + dw Script_giveitem ; 1f + dw Script_takeitem ; 20 + dw Script_checkitem ; 21 + dw Script_givemoney ; 22 + dw Script_takemoney ; 23 + dw Script_checkmoney ; 24 + dw Script_givecoins ; 25 + dw Script_takecoins ; 26 + dw Script_checkcoins ; 27 + dw Script_addcellnum ; 28 + dw Script_delcellnum ; 29 + dw Script_checkcellnum ; 2a + dw Script_checktime ; 2b + dw Script_checkpoke ; 2c + dw Script_givepoke ; 2d + dw Script_giveegg ; 2e + dw Script_givepokeitem ; 2f + dw Script_checkpokeitem ; 30 + dw Script_checkevent ; 31 + dw Script_clearevent ; 32 + dw Script_setevent ; 33 + dw Script_checkflag ; 34 + dw Script_clearflag ; 35 + dw Script_setflag ; 36 + dw Script_wildon ; 37 + dw Script_wildoff ; 38 + dw Script_xycompare ; 39 + dw Script_warpmod ; 3a + dw Script_blackoutmod ; 3b + dw Script_warp ; 3c + dw Script_readmoney ; 3d + dw Script_readcoins ; 3e + dw Script_vartomem ; 3f + dw Script_pokenamemem ; 40 + dw Script_itemtotext ; 41 + dw Script_mapnametotext ; 42 + dw Script_trainertotext ; 43 + dw Script_stringtotext ; 44 + dw Script_itemnotify ; 45 + dw Script_pocketisfull ; 46 + dw Script_opentext ; 47 + dw Script_refreshscreen ; 48 + dw Script_closetext ; 49 + dw Script_loadbytec2cf ; 4a + dw Script_farwritetext ; 4b + dw Script_writetext ; 4c + dw Script_repeattext ; 4d + dw Script_yesorno ; 4e + dw Script_loadmenu ; 4f + dw Script_closewindow ; 50 + dw Script_jumptextfaceplayer ; 51 +if _CRYSTAL + dw Script_farjumptext ; 52 +endc + dw Script_jumptext ; 53 + dw Script_waitbutton ; 54 + dw Script_buttonsound ; 55 + dw Script_pokepic ; 56 + dw Script_closepokepic ; 57 + dw Script__2dmenu ; 58 + dw Script_verticalmenu ; 59 + dw Script_loadpikachudata ; 5a + dw Script_randomwildmon ; 5b + dw Script_loadmemtrainer ; 5c + dw Script_loadwildmon ; 5d + dw Script_loadtrainer ; 5e + dw Script_startbattle ; 5f + dw Script_reloadmapafterbattle ; 60 + dw Script_catchtutorial ; 61 + dw Script_trainertext ; 62 + dw Script_trainerflagaction ; 63 + dw Script_winlosstext ; 64 + dw Script_scripttalkafter ; 65 + dw Script_endifjustbattled ; 66 + dw Script_checkjustbattled ; 67 + dw Script_setlasttalked ; 68 + dw Script_applymovement ; 69 + dw Script_applymovement2 ; 6a + dw Script_faceplayer ; 6b + dw Script_faceobject ; 6c + dw Script_variablesprite ; 6d + dw Script_disappear ; 6e + dw Script_appear ; 6f + dw Script_follow ; 70 + dw Script_stopfollow ; 71 + dw Script_moveobject ; 72 + dw Script_writeobjectxy ; 73 + dw Script_loademote ; 74 + dw Script_showemote ; 75 + dw Script_turnobject ; 76 + dw Script_follownotexact ; 77 + dw Script_earthquake ; 78 + dw Script_changemap ; 79 + dw Script_changeblock ; 7a + dw Script_reloadmap ; 7b + dw Script_reloadmappart ; 7c + dw Script_writecmdqueue ; 7d + dw Script_delcmdqueue ; 7e + dw Script_playmusic ; 7f + dw Script_encountermusic ; 80 + dw Script_musicfadeout ; 81 + dw Script_playmapmusic ; 82 + dw Script_dontrestartmapmusic ; 83 + dw Script_cry ; 84 + dw Script_playsound ; 85 + dw Script_waitsfx ; 86 + dw Script_warpsound ; 87 + dw Script_specialsound ; 88 + dw Script_passtoengine ; 89 + dw Script_newloadmap ; 8a + dw Script_pause ; 8b + dw Script_deactivatefacing ; 8c + dw Script_priorityjump ; 8d + dw Script_warpcheck ; 8e + dw Script_ptpriorityjump ; 8f + dw Script_return ; 90 + dw Script_end ; 91 + dw Script_reloadandreturn ; 92 + dw Script_endall ; 93 + dw Script_pokemart ; 94 + dw Script_elevator ; 95 + dw Script_trade ; 96 + dw Script_askforphonenumber ; 97 + dw Script_phonecall ; 98 + dw Script_hangup ; 99 + dw Script_describedecoration ; 9a + dw Script_fruittree ; 9b + dw Script_specialphonecall ; 9c + dw Script_checkphonecall ; 9d + dw Script_verbosegiveitem ; 9e + dw Script_verbosegiveitem2 ; 9f + dw Script_swarm ; a0 + dw Script_halloffame ; a1 + dw Script_credits ; a2 + dw Script_warpfacing ; a3 + dw Script_battletowertext ; a4 + dw Script_landmarktotext ; a5 + dw Script_trainerclassname ; a6 + dw Script_name ; a7 + dw Script_wait ; a8 + dw Script_checksave ; a9 + +StartScript: + ld hl, wScriptFlags + set SCRIPT_RUNNING, [hl] + ret + +CheckScript: + ld hl, wScriptFlags + bit SCRIPT_RUNNING, [hl] + ret + +StopScript: + ld hl, wScriptFlags + res SCRIPT_RUNNING, [hl] + ret + +Script_callasm: +; script command 0xe +; parameters: asm + + call GetScriptByte + ld b, a + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, b + rst FarCall + ret + +Script_special: +; script command 0xf +; parameters: predefined_script + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + farcall Special + ret + +Script_ptcallasm: +; script command 0x10 +; parameters: asm + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld b, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ld a, b + rst FarCall + ret + +Script_jumptextfaceplayer: +; script command 0x51 +; parameters: text_pointer + + ld a, [wScriptBank] + ld [wScriptTextBank], a + call GetScriptByte + ld [wScriptTextAddr], a + call GetScriptByte + ld [wScriptTextAddr + 1], a + ld b, BANK(JumpTextFacePlayerScript) + ld hl, JumpTextFacePlayerScript + jp ScriptJump + +Script_jumptext: +; script command 0x53 +; parameters: text_pointer + + ld a, [wScriptBank] + ld [wScriptTextBank], a + call GetScriptByte + ld [wScriptTextAddr], a + call GetScriptByte + ld [wScriptTextAddr + 1], a + ld b, BANK(JumpTextScript) + ld hl, JumpTextScript + jp ScriptJump + +JumpTextFacePlayerScript: + faceplayer +JumpTextScript: + opentext + repeattext -1, -1 + waitbutton + closetext + end + + +if _CRYSTAL + +Script_farjumptext: +; script command 0x52 +; parameters: text_pointer + + call GetScriptByte + ld [wScriptTextBank], a + call GetScriptByte + ld [wScriptTextAddr], a + call GetScriptByte + ld [wScriptTextAddr + 1], a + ld b, BANK(JumpTextScript) + ld hl, JumpTextScript + jp ScriptJump + +endc + + +Script_writetext: +; script command 0x4c +; parameters: text_pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptBank] + ld b, a + call MapTextbox + ret + +Script_farwritetext: +; script command 0x4b +; parameters: text_pointer + + call GetScriptByte + ld b, a + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + call MapTextbox + ret + +Script_repeattext: +; script command 0x4d +; parameters: byte, byte + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + cp -1 + jr nz, .done + ld a, l + cp -1 + jr nz, .done + ld hl, wScriptTextBank + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a + call MapTextbox + ret + +.done + ret + +Script_waitbutton: +; script command 0x54 + + jp WaitButton + +Script_buttonsound: +; script command 0x55 + + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + call WaitBGMap + call ButtonSound + pop af + ld [hOAMUpdate], a + ret + +Script_yesorno: +; script command 0x4e + + call YesNoBox + ld a, FALSE + jr c, .no + ld a, TRUE +.no + ld [wScriptVar], a + ret + +Script_loadmenu: +; script command 0x4f +; parameters: menu_header + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld de, LoadMenuHeader + ld a, [wScriptBank] + call Call_a_de + call UpdateSprites + ret + +Script_closewindow: +; script command 0x50 + + call CloseWindow + call UpdateSprites + ret + +Script_pokepic: +; script command 0x56 +; parameters: pokemon + + call GetScriptByte + and a + jr nz, .ok + ld a, [wScriptVar] +.ok + ld [wCurPartySpecies], a + farcall Pokepic + ret + +Script_closepokepic: +; script command 0x57 + + farcall ClosePokepic + ret + +Script_verticalmenu: +; script command 0x59 + + ld a, [wScriptBank] + ld hl, VerticalMenu + rst FarCall + ld a, [wMenuCursorY] + jr nc, .ok + xor a +.ok + ld [wScriptVar], a + ret + +Script__2dmenu: +; script command 0x58 + + ld a, [wScriptBank] + ld hl, _2DMenu + rst FarCall + ld a, [wMenuCursorBuffer] + jr nc, .ok + xor a +.ok + ld [wScriptVar], a + ret + +Script_battletowertext: +; script command 0xa4 +; parameters: pointer, memory + + call SetUpTextBox + call GetScriptByte + ld c, a + farcall BattleTowerText + ret + +Script_verbosegiveitem: +; script command 0x9e +; parameters: item, quantity + + call Script_giveitem + call CurItemName + ld de, wStringBuffer1 + ld a, 1 + call CopyConvertedText + ld b, BANK(GiveItemScript) + ld de, GiveItemScript + jp ScriptCall + + +ret_96f76: + ret + +GiveItemScript: + callasm ret_96f76 + writetext ReceivedItemText + iffalse .Full + waitsfx + specialsound + waitbutton + itemnotify + end + +.Full: + buttonsound + pocketisfull + end + +ReceivedItemText: + text_jump UnknownText_0x1c4719 + db "@" + + +Script_verbosegiveitem2: +; script command 0x9f +; parameters: item, var + + call GetScriptByte + cp -1 + jr nz, .ok + ld a, [wScriptVar] +.ok + ld [wCurItem], a + call GetScriptByte + call GetVarAction + ld a, [de] + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + call ReceiveItem + ld a, TRUE + jr c, .ok2 + xor a +.ok2 + ld [wScriptVar], a + call CurItemName + ld de, wStringBuffer1 + ld a, 1 + call CopyConvertedText + ld b, BANK(GiveItemScript) + ld de, GiveItemScript + jp ScriptCall + +Script_itemnotify: +; script command 0x45 + + call GetPocketName + call CurItemName + ld b, BANK(PutItemInPocketText) + ld hl, PutItemInPocketText + call MapTextbox + ret + +Script_pocketisfull: +; script command 0x46 + + call GetPocketName + call CurItemName + ld b, BANK(PocketIsFullText) + ld hl, PocketIsFullText + call MapTextbox + ret + +Script_specialsound: +; script command 0x88 + + farcall CheckItemPocket + ld a, [wItemAttributeParamBuffer] + cp TM_HM + ld de, SFX_GET_TM + jr z, .play + ld de, SFX_ITEM +.play + call PlaySFX + call WaitSFX + ret + + +GetPocketName: + farcall CheckItemPocket + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + maskbits NUM_POCKETS + add a + ld e, a + ld d, 0 + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a + ld hl, wStringBuffer3 + call CopyName2 + ret + +.Pockets: + dw .Item + dw .Key + dw .Ball + dw .TM + +.Item: + db "ITEM POCKET@" +.Key: + db "KEY POCKET@" +.Ball: + db "BALL POCKET@" +.TM: + db "TM POCKET@" + +CurItemName: + ld a, [wCurItem] + ld [wd265], a + call GetItemName + ret + + +PutItemInPocketText: + text_jump UnknownText_0x1c472c + db "@" + +PocketIsFullText: + text_jump UnknownText_0x1c474b + db "@" + + +Script_pokemart: +; script command 0x94 +; parameters: dialog_id, mart_id + + call GetScriptByte + ld c, a + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall OpenMartDialog + ret + +Script_elevator: +; script command 0x95 +; parameters: floor_list_pointer + + xor a + ld [wScriptVar], a + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall Elevator + ret c + ld a, TRUE + ld [wScriptVar], a + ret + +Script_trade: +; script command 0x96 +; parameters: trade_id + + call GetScriptByte + ld e, a + farcall NPCTrade + ret + +Script_phonecall: +; script command 0x98 +; parameters: caller_name + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall PhoneCall + ret + +Script_hangup: +; script command 0x99 + + farcall HangUp + ret + +Script_askforphonenumber: +; script command 0x97 +; parameters: number + + call YesNoBox + jr c, .refused + call GetScriptByte + ld c, a + farcall AddPhoneNumber + jr c, .phonefull + xor a ; PHONE_CONTACT_GOT + jr .done +.phonefull + ld a, PHONE_CONTACTS_FULL + jr .done +.refused + call GetScriptByte + ld a, PHONE_CONTACT_REFUSED +.done + ld [wScriptVar], a + ret + +Script_describedecoration: +; script command 0x9a +; parameters: byte + + call GetScriptByte + ld b, a + farcall DescribeDecoration + ld h, d + ld l, e + jp ScriptJump + +Script_fruittree: +; script command 0x9b +; parameters: tree_id + + call GetScriptByte + ld [wCurFruitTree], a + ld b, BANK(FruitTreeScript) + ld hl, FruitTreeScript + jp ScriptJump + +Script_swarm: +; script command 0xa0 +; parameters: flag, map_group, map_id + + call GetScriptByte + ld c, a + call GetScriptByte + ld d, a + call GetScriptByte + ld e, a + farcall StoreSwarmMapIndices + ret + +Script_trainertext: +; script command 0x62 +; parameters: which_text + + call GetScriptByte + ld c, a + ld b, 0 + ld hl, wWalkingX + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wEngineBuffer1] + ld b, a + call MapTextbox + ret + +Script_scripttalkafter: +; script command 0x65 + + ld hl, wScriptAfterPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wEngineBuffer1] + ld b, a + jp ScriptJump + +Script_trainerflagaction: +; script command 0x63 +; parameters: action + + xor a + ld [wScriptVar], a + ld hl, wd041 + ld e, [hl] + inc hl + ld d, [hl] + call GetScriptByte + ld b, a + call EventFlagAction + ld a, c + and a + ret z + ld a, TRUE + ld [wScriptVar], a + ret + +Script_winlosstext: +; script command 0x64 +; parameters: win_text_pointer, loss_text_pointer + + ld hl, wWinTextPointer + call GetScriptByte + ld [hli], a + call GetScriptByte + ld [hli], a + ld hl, wLossTextPointer + call GetScriptByte + ld [hli], a + call GetScriptByte + ld [hli], a + ret + +Script_endifjustbattled: +; script command 0x66 + + ld a, [wRunningTrainerBattleScript] + and a + ret z + jp Script_end + +Script_checkjustbattled: +; script command 0x67 + + ld a, TRUE + ld [wScriptVar], a + ld a, [wRunningTrainerBattleScript] + and a + ret nz + xor a + ld [wScriptVar], a + ret + +Script_encountermusic: +; script command 0x80 + + ld a, [wOtherTrainerClass] + ld e, a + farcall PlayTrainerEncounterMusic + ret + +Script_playmapmusic: +; script command 0x82 + + call PlayMapMusic + ret + +Script_playmusic: +; script command 0x7f +; parameters: music_pointer + + ld de, MUSIC_NONE + call PlayMusic + xor a + ld [wMusicFade], a + call MaxVolume + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + call PlayMusic + ret + +Script_musicfadeout: +; script command 0x81 +; parameters: music, fadetime + + call GetScriptByte + ld [wMusicFadeID], a + call GetScriptByte + ld [wMusicFadeID + 1], a + call GetScriptByte + and $ff ^ (1 << MUSIC_FADE_IN_F) + ld [wMusicFade], a + ret + +Script_playsound: +; script command 0x85 +; parameters: sound_pointer + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + call PlaySFX + ret + +Script_waitsfx: +; script command 0x86 + + call WaitSFX + ret + +Script_warpsound: +; script command 0x87 + + farcall GetWarpSFX + call PlaySFX + ret + +Script_cry: +; script command 0x84 +; parameters: cry_id + + call GetScriptByte + push af + call GetScriptByte + pop af + and a + jr nz, .ok + ld a, [wScriptVar] +.ok + call PlayMonCry + ret + +GetScriptObject: + and a ; PLAYER? + ret z + cp LAST_TALKED + ret z + dec a + ret + +Script_setlasttalked: +; script command 0x68 +; parameters: object_id + + call GetScriptByte + call GetScriptObject + ld [hLastTalked], a + ret + +Script_applymovement: +; script command 0x69 +; parameters: object_id, data + + call GetScriptByte + call GetScriptObject + ld c, a + +ApplyMovement: + push bc + ld a, c + farcall SetFlagsForMovement_1 + pop bc + + push bc + call SetFlagsForMovement_2 + pop bc + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptBank] + ld b, a + call GetMovementData + ret c + + ld a, SCRIPT_WAIT_MOVEMENT + ld [wScriptMode], a + call StopScript + ret + +SetFlagsForMovement_2: + farcall _SetFlagsForMovement_2 + ret + +Script_applymovement2: +; script command 0x6a +; parameters: data +; apply movement to last talked + + ld a, [hLastTalked] + ld c, a + jp ApplyMovement + +Script_faceplayer: +; script command 0x6b + + ld a, [hLastTalked] + and a + ret z + ld d, $0 + ld a, [hLastTalked] + ld e, a + farcall GetRelativeFacing + ld a, d + add a + add a + ld e, a + ld a, [hLastTalked] + ld d, a + call ApplyObjectFacing + ret + +Script_faceobject: +; script command 0x6c +; parameters: object1, object2 + + call GetScriptByte + call GetScriptObject + cp LAST_TALKED + jr c, .ok + ld a, [hLastTalked] +.ok + ld e, a + call GetScriptByte + call GetScriptObject + cp LAST_TALKED + jr nz, .ok2 + ld a, [hLastTalked] +.ok2 + ld d, a + push de + farcall GetRelativeFacing + pop bc + ret c + ld a, d + add a + add a + ld e, a + ld d, c + call ApplyObjectFacing + ret + +Script_turnobject: +; script command 0x76 +; parameters: object_id, facing + + call GetScriptByte + call GetScriptObject + cp LAST_TALKED + jr nz, .ok + ld a, [hLastTalked] +.ok + ld d, a + call GetScriptByte + add a + add a + ld e, a + call ApplyObjectFacing + ret + +ApplyObjectFacing: + ld a, d + push de + call CheckObjectVisibility + jr c, .not_visible + ld hl, OBJECT_SPRITE + add hl, bc + ld a, [hl] + push bc + call DoesSpriteHaveFacings + pop bc + jr c, .not_visible ; STILL_SPRITE + ld hl, OBJECT_FLAGS1 + add hl, bc + bit FIXED_FACING, [hl] + jr nz, .not_visible + pop de + ld a, e + call SetSpriteDirection + ld hl, wVramState + bit 6, [hl] + jr nz, .text_state + call .DisableTextTiles +.text_state + call UpdateSprites + ret + +.not_visible + pop de + scf + ret + +.DisableTextTiles: + call LoadMapPart + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT +.loop + res 7, [hl] + inc hl + dec bc + ld a, b + or c + jr nz, .loop + ret + +Script_variablesprite: +; script command 0x6d +; parameters: byte, sprite + + call GetScriptByte + ld e, a + ld d, $0 + ld hl, wVariableSprites + add hl, de + call GetScriptByte + ld [hl], a + ret + +Script_appear: +; script command 0x6f +; parameters: object_id + + call GetScriptByte + call GetScriptObject + call _CopyObjectStruct + ld a, [hMapObjectIndexBuffer] + ld b, 0 ; clear + call ApplyEventActionAppearDisappear + ret + +Script_disappear: +; script command 0x6e +; parameters: object_id + + call GetScriptByte + call GetScriptObject + cp LAST_TALKED + jr nz, .ok + ld a, [hLastTalked] +.ok + call DeleteObjectStruct + ld a, [hMapObjectIndexBuffer] + ld b, 1 ; set + call ApplyEventActionAppearDisappear + farcall _UpdateSprites + ret + +ApplyEventActionAppearDisappear: + push bc + call GetMapObject + ld hl, MAPOBJECT_EVENT_FLAG + add hl, bc + pop bc + ld e, [hl] + inc hl + ld d, [hl] + ld a, -1 + cp e + jr nz, .okay + cp d + jr nz, .okay + xor a + ret +.okay + call EventFlagAction + ret + +Script_follow: +; script command 0x70 +; parameters: object2, object1 + + call GetScriptByte + call GetScriptObject + ld b, a + call GetScriptByte + call GetScriptObject + ld c, a + farcall StartFollow + ret + +Script_stopfollow: +; script command 0x71 + + farcall StopFollow + ret + +Script_moveobject: +; script command 0x72 +; parameters: object id, x, y + + call GetScriptByte + call GetScriptObject + ld b, a + call GetScriptByte + add 4 + ld d, a + call GetScriptByte + add 4 + ld e, a + farcall CopyDECoordsToMapObject + ret + +Script_writeobjectxy: +; script command 0x73 +; parameters: object_id + + call GetScriptByte + call GetScriptObject + cp LAST_TALKED + jr nz, .ok + ld a, [hLastTalked] +.ok + ld b, a + farcall WriteObjectXY + ret + +Script_follownotexact: +; script command 0x77 +; parameters: object2, object1 + + call GetScriptByte + call GetScriptObject + ld b, a + call GetScriptByte + call GetScriptObject + ld c, a + farcall FollowNotExact + ret + +Script_loademote: +; script command 0x74 +; parameters: bubble + + call GetScriptByte + cp -1 + jr nz, .not_var_emote + ld a, [wScriptVar] +.not_var_emote + ld c, a + farcall LoadEmote + ret + +Script_showemote: +; script command 0x75 +; parameters: bubble, object_id, time + + call GetScriptByte + ld [wScriptVar], a + call GetScriptByte + call GetScriptObject + cp LAST_TALKED + jr z, .ok + ld [hLastTalked], a +.ok + call GetScriptByte + ld [wScriptDelay], a + ld b, BANK(ShowEmoteScript) + ld de, ShowEmoteScript + jp ScriptCall + +ShowEmoteScript: + loademote EMOTE_MEM + applymovement2 .Show + pause 0 + applymovement2 .Hide + end + +.Show: + show_emote + step_sleep 1 + step_end + +.Hide: + hide_emote + step_sleep 1 + step_end + + +Script_earthquake: +; script command 0x78 +; parameters: param + + ld hl, EarthquakeMovement + ld de, wEarthquakeMovementDataBuffer + ld bc, EarthquakeMovement.End - EarthquakeMovement + call CopyBytes + call GetScriptByte + ld [wEarthquakeMovementDataBuffer + 1], a + and %00111111 + ld [wEarthquakeMovementDataBuffer + 3], a + ld b, BANK(.script) + ld de, .script + jp ScriptCall + +.script + applymovement PLAYER, wEarthquakeMovementDataBuffer + end + +EarthquakeMovement: + step_shake 16 ; the 16 gets overwritten with the script byte + step_sleep 16 ; the 16 gets overwritten with the lower 6 bits of the script byte + step_end +.End + + +Script_loadpikachudata: +; script command 0x5a + + ld a, PIKACHU + ld [wTempWildMonSpecies], a + ld a, 5 + ld [wCurPartyLevel], a + ret + +Script_randomwildmon: +; script command 0x5b + + xor a + ld [wBattleScriptFlags], a + ret + +Script_loadmemtrainer: +; script command 0x5c + + ld a, (1 << 7) | 1 + ld [wBattleScriptFlags], a + ld a, [wTempTrainerClass] + ld [wOtherTrainerClass], a + ld a, [wTempTrainerID] + ld [wOtherTrainerID], a + ret + +Script_loadwildmon: +; script command 0x5d +; parameters: pokemon, level + + ld a, (1 << 7) + ld [wBattleScriptFlags], a + call GetScriptByte + ld [wTempWildMonSpecies], a + call GetScriptByte + ld [wCurPartyLevel], a + ret + +Script_loadtrainer: +; script command 0x5e +; parameters: trainer_group, trainer_id + + ld a, (1 << 7) | 1 + ld [wBattleScriptFlags], a + call GetScriptByte + ld [wOtherTrainerClass], a + call GetScriptByte + ld [wOtherTrainerID], a + ret + +Script_startbattle: +; script command 0x5f + + call BufferScreen + predef StartBattle + ld a, [wBattleResult] + and $3f + ld [wScriptVar], a + ret + +Script_catchtutorial: +; script command 0x61 +; parameters: byte + + call GetScriptByte + ld [wBattleType], a + call BufferScreen + farcall CatchTutorial + jp Script_reloadmap + +Script_reloadmapafterbattle: +; script command 0x60 + + ld hl, wBattleScriptFlags + ld d, [hl] + ld [hl], $0 + ld a, [wBattleResult] + and $3f + cp $1 + jr nz, .notblackedout + ld b, BANK(Script_BattleWhiteout) + ld hl, Script_BattleWhiteout + jp ScriptJump + +.notblackedout + bit 0, d + jr z, .was_wild + farcall MomTriesToBuySomething + jr .done + +.was_wild + ld a, [wBattleResult] + bit 7, a + jr z, .done + ld b, BANK(Script_SpecialBillCall) + ld de, Script_SpecialBillCall + farcall LoadScriptBDE +.done + jp Script_reloadmap + +Script_reloadmap: +; script command 0x7b + + xor a + ld [wBattleScriptFlags], a + ld a, MAPSETUP_RELOADMAP + ld [hMapEntryMethod], a + ld a, $1 + call LoadMapStatus + call StopScript + ret + +Script_scall: +; script command 0x0 +; parameters: pointer + + ld a, [wScriptBank] + ld b, a + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + jr ScriptCall + +Script_farscall: +; script command 0x1 +; parameters: pointer + + call GetScriptByte + ld b, a + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + jr ScriptCall + +Script_ptcall: +; script command 0x2 +; parameters: pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld b, [hl] + inc hl + ld e, [hl] + inc hl + ld d, [hl] + ; fallthrough + +ScriptCall: +; Bug: The script stack has a capacity of 5 scripts, yet there is +; nothing to stop you from pushing a sixth script. The high part +; of the script address can then be overwritten by modifications +; to wScriptDelay, causing the script to return to the rst/interrupt +; space. + + push de + ld hl, wScriptStackSize + ld e, [hl] + inc [hl] + ld d, $0 + ld hl, wScriptStack + add hl, de + add hl, de + add hl, de + pop de + ld a, [wScriptBank] + ld [hli], a + ld a, [wScriptPos] + ld [hli], a + ld a, [wScriptPos + 1] + ld [hl], a + ld a, b + ld [wScriptBank], a + ld a, e + ld [wScriptPos], a + ld a, d + ld [wScriptPos + 1], a + ret + +CallCallback:: + ld a, [wScriptBank] + or $80 + ld [wScriptBank], a + jp ScriptCall + +Script_jump: +; script command 0x3 +; parameters: pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptBank] + ld b, a + jp ScriptJump + +Script_farjump: +; script command 0x4 +; parameters: pointer + + call GetScriptByte + ld b, a + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + jp ScriptJump + +Script_ptjump: +; script command 0x5 +; parameters: pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld b, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + jp ScriptJump + +Script_iffalse: +; script command 0x8 +; parameters: pointer + + ld a, [wScriptVar] + and a + jp nz, SkipTwoScriptBytes + jp Script_jump + +Script_iftrue: +; script command 0x9 +; parameters: pointer + + ld a, [wScriptVar] + and a + jp nz, Script_jump + jp SkipTwoScriptBytes + +Script_ifequal: +; script command 0x6 +; parameters: byte, pointer + + call GetScriptByte + ld hl, wScriptVar + cp [hl] + jr z, Script_jump + jr SkipTwoScriptBytes + +Script_ifnotequal: +; script command 0x7 +; parameters: byte, pointer + + call GetScriptByte + ld hl, wScriptVar + cp [hl] + jr nz, Script_jump + jr SkipTwoScriptBytes + +Script_ifgreater: +; script command 0xa +; parameters: byte, pointer + + ld a, [wScriptVar] + ld b, a + call GetScriptByte + cp b + jr c, Script_jump + jr SkipTwoScriptBytes + +Script_ifless: +; script command 0xb +; parameters: byte, pointer + + call GetScriptByte + ld b, a + ld a, [wScriptVar] + cp b + jr c, Script_jump + jr SkipTwoScriptBytes + +Script_jumpstd: +; script command 0xc +; parameters: predefined_script + + call StdScript + jr ScriptJump + +Script_callstd: +; script command 0xd +; parameters: predefined_script + + call StdScript + ld d, h + ld e, l + jp ScriptCall + +StdScript: + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld hl, StdScripts + add hl, de + add hl, de + add hl, de + ld a, BANK(StdScripts) + call GetFarByte + ld b, a + inc hl + ld a, BANK(StdScripts) + call GetFarHalfword + ret + +SkipTwoScriptBytes: + call GetScriptByte + call GetScriptByte + ret + +ScriptJump: + ld a, b + ld [wScriptBank], a + ld a, l + ld [wScriptPos], a + ld a, h + ld [wScriptPos + 1], a + ret + +Script_priorityjump: +; script command 0x8d +; parameters: pointer + + ld a, [wScriptBank] + ld [wPriorityScriptBank], a + call GetScriptByte + ld [wPriorityScriptAddr], a + call GetScriptByte + ld [wPriorityScriptAddr + 1], a + ld hl, wScriptFlags + set 3, [hl] + ret + +Script_checkscene: +; script command 0x13 + + call CheckScenes + jr z, .no_scene + ld [wScriptVar], a + ret + +.no_scene + ld a, $ff + ld [wScriptVar], a + ret + +Script_checkmapscene: +; script command 0x11 +; parameters: map_group, map_id + + call GetScriptByte + ld b, a + call GetScriptByte + ld c, a + call GetMapSceneID + ld a, d + or e + jr z, .no_scene + ld a, [de] + ld [wScriptVar], a + ret + +.no_scene + ld a, $ff + ld [wScriptVar], a + ret + +Script_setscene: +; script command 0x14 +; parameters: scene_id + + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + jr DoScene + +Script_setmapscene: +; script command 0x12 +; parameters: map_group, map_id, scene_id + + call GetScriptByte + ld b, a + call GetScriptByte + ld c, a +DoScene: + call GetMapSceneID + ld a, d + or e + jr z, .no_scene + call GetScriptByte + ld [de], a +.no_scene + ret + +Script_copybytetovar: +; script command 0x19 +; parameters: address + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [hl] + ld [wScriptVar], a + ret + +Script_copyvartobyte: +; script command 0x1a +; parameters: address + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptVar] + ld [hl], a + ret + +Script_loadvar: +; script command 0x1b +; parameters: address, value + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + call GetScriptByte + ld [hl], a + ret + +Script_writebyte: +; script command 0x15 +; parameters: value + + call GetScriptByte + ld [wScriptVar], a + ret + +Script_addvar: +; script command 0x16 +; parameters: value + + call GetScriptByte + ld hl, wScriptVar + add [hl] + ld [hl], a + ret + +Script_random: +; script command 0x17 +; parameters: input + + call GetScriptByte + ld [wScriptVar], a + and a + ret z + + ld c, a + call .Divide256byC + and a + jr z, .no_restriction ; 256 % b == 0 + ld b, a + xor a + sub b + ld b, a +.loop + push bc + call Random + pop bc + ld a, [hRandomAdd] + cp b + jr nc, .loop + jr .finish + +.no_restriction + push bc + call Random + pop bc + ld a, [hRandomAdd] + +.finish + push af + ld a, [wScriptVar] + ld c, a + pop af + call SimpleDivide + ld [wScriptVar], a + ret + +.Divide256byC: + xor a + ld b, a + sub c +.mod_loop + inc b + sub c + jr nc, .mod_loop + dec b + add c + ret + +Script_checkcode: +; script command 0x1c +; parameters: variable_id + + call GetScriptByte + call GetVarAction + ld a, [de] + ld [wScriptVar], a + ret + +Script_writevarcode: +; script command 0x1d +; parameters: variable_id + + call GetScriptByte + call GetVarAction + ld a, [wScriptVar] + ld [de], a + ret + +Script_writecode: +; script command 0x1e +; parameters: variable_id, value + + call GetScriptByte + call GetVarAction + call GetScriptByte + ld [de], a + ret + +GetVarAction: + ld c, a + farcall _GetVarAction + ret + +Script_checkver: +; script command 0x18 + + ld a, [.gs_version] + ld [wScriptVar], a + ret + +.gs_version: + db GS_VERSION + +Script_pokenamemem: +; script command 0x40 +; parameters: pokemon (0 aka USE_SCRIPT_VAR to use wScriptVar), memory + + call GetScriptByte + and a + jr nz, .gotit + ld a, [wScriptVar] +.gotit + ld [wd265], a + call GetPokemonName + ld de, wStringBuffer1 + +ConvertMemToText: + call GetScriptByte + cp NUM_MEM_BUFFERS + jr c, .ok + xor a +.ok + +CopyConvertedText: + ld hl, wStringBuffer3 + ld bc, wStringBuffer4 - wStringBuffer3 + call AddNTimes + call CopyName2 + ret + +Script_itemtotext: +; script command 0x41 +; parameters: item (0 aka USE_SCRIPT_VAR to use wScriptVar), memory + + call GetScriptByte + and a ; USE_SCRIPT_VAR + jr nz, .ok + ld a, [wScriptVar] +.ok + ld [wd265], a + call GetItemName + ld de, wStringBuffer1 + jr ConvertMemToText + +Script_mapnametotext: +; script command 0x42 +; parameters: memory + + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + call GetWorldMapLocation + +ConvertLandmarkToText: + ld e, a + farcall GetLandmarkName + ld de, wStringBuffer1 + jp ConvertMemToText + +Script_landmarktotext: +; script command 0xa5 +; parameters: id, memory + + call GetScriptByte + jr ConvertLandmarkToText + +Script_trainertotext: +; script command 0x43 +; parameters: trainer_id, trainer_group, memory + + call GetScriptByte + ld c, a + call GetScriptByte + ld b, a + farcall GetTrainerName + jr ConvertMemToText + +Script_name: +; script command 0xa7 +; parameters: type, id, memory + + call GetScriptByte + ld [wNamedObjectTypeBuffer], a + +ContinueToGetName: + call GetScriptByte + ld [wCurSpecies], a + call GetName + ld de, wStringBuffer1 + jp ConvertMemToText + +Script_trainerclassname: +; script command 0xa6 +; parameters: id, memory + + ld a, TRAINER_NAME + ld [wNamedObjectTypeBuffer], a + jr ContinueToGetName + +Script_readmoney: +; script command 0x3d +; parameters: account, memory + + call ResetStringBuffer1 + call GetMoneyAccount + ld hl, wStringBuffer1 + lb bc, PRINTNUM_RIGHTALIGN | 3, 6 + call PrintNum + ld de, wStringBuffer1 + jp ConvertMemToText + +Script_readcoins: +; script command 0x3e +; parameters: memory + + call ResetStringBuffer1 + ld hl, wStringBuffer1 + ld de, wCoins + lb bc, PRINTNUM_RIGHTALIGN | 2, 6 + call PrintNum + ld de, wStringBuffer1 + jp ConvertMemToText + +Script_vartomem: +; script command 0x3f +; parameters: memory + + call ResetStringBuffer1 + ld de, wScriptVar + ld hl, wStringBuffer1 + lb bc, PRINTNUM_RIGHTALIGN | 1, 3 + call PrintNum + ld de, wStringBuffer1 + jp ConvertMemToText + +ResetStringBuffer1: + ld hl, wStringBuffer1 + ld bc, NAME_LENGTH + ld a, "@" + call ByteFill + ret + +Script_stringtotext: +; script command 0x44 +; parameters: text_pointer, memory + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld hl, CopyName1 + rst FarCall + ld de, wStringBuffer2 + jp ConvertMemToText + +Script_givepokeitem: +; script command 0x2f +; parameters: pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptBank] + call GetFarByte + ld b, a + push bc + inc hl + ld bc, MAIL_MSG_LENGTH + ld de, wd002 + ld a, [wScriptBank] + call FarCopyBytes + pop bc + farcall GivePokeItem + ret + +Script_checkpokeitem: +; script command 0x30 +; parameters: pointer + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall CheckPokeItem + ret + +Script_giveitem: +; script command 0x1f +; parameters: item, quantity + + call GetScriptByte + cp ITEM_FROM_MEM + jr nz, .ok + ld a, [wScriptVar] +.ok + ld [wCurItem], a + call GetScriptByte + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + call ReceiveItem + jr nc, .full + ld a, TRUE + ld [wScriptVar], a + ret +.full + xor a + ld [wScriptVar], a + ret + +Script_takeitem: +; script command 0x20 +; parameters: item, quantity + + xor a + ld [wScriptVar], a + call GetScriptByte + ld [wCurItem], a + call GetScriptByte + ld [wItemQuantityChangeBuffer], a + ld a, -1 + ld [wCurItemQuantity], a + ld hl, wNumItems + call TossItem + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_checkitem: +; script command 0x21 +; parameters: item + + xor a + ld [wScriptVar], a + call GetScriptByte + ld [wCurItem], a + ld hl, wNumItems + call CheckItem + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_givemoney: +; script command 0x22 +; parameters: account, money + + call GetMoneyAccount + call LoadMoneyAmountToMem + farcall GiveMoney + ret + +Script_takemoney: +; script command 0x23 +; parameters: account, money + + call GetMoneyAccount + call LoadMoneyAmountToMem + farcall TakeMoney + ret + +Script_checkmoney: +; script command 0x24 +; parameters: account, money + + call GetMoneyAccount + call LoadMoneyAmountToMem + farcall CompareMoney + +CompareMoneyAction: + jr c, .less + jr z, .exact + ld a, HAVE_MORE + jr .done +.exact + ld a, HAVE_AMOUNT + jr .done +.less + ld a, HAVE_LESS +.done + ld [wScriptVar], a + ret + +GetMoneyAccount: + call GetScriptByte + and a + ld de, wMoney ; YOUR_MONEY + ret z + ld de, wMomsMoney ; MOMS_MONEY + ret + +LoadMoneyAmountToMem: + ld bc, hMoneyTemp + push bc + call GetScriptByte + ld [bc], a + inc bc + call GetScriptByte + ld [bc], a + inc bc + call GetScriptByte + ld [bc], a + pop bc + ret + +Script_givecoins: +; script command 0x25 +; parameters: coins + + call LoadCoinAmountToMem + farcall GiveCoins + ret + +Script_takecoins: +; script command 0x26 +; parameters: coins + + call LoadCoinAmountToMem + farcall TakeCoins + ret + +Script_checkcoins: +; script command 0x27 +; parameters: coins + + call LoadCoinAmountToMem + farcall CheckCoins + jr CompareMoneyAction + +LoadCoinAmountToMem: + call GetScriptByte + ld [hMoneyTemp + 1], a + call GetScriptByte + ld [hMoneyTemp], a + ld bc, hMoneyTemp + ret + +Script_checktime: +; script command 0x2b +; parameters: time + + xor a + ld [wScriptVar], a + farcall CheckTime + call GetScriptByte + and c + ret z + ld a, TRUE + ld [wScriptVar], a + ret + +Script_checkpoke: +; script command 0x2c +; parameters: pokemon + + xor a + ld [wScriptVar], a + call GetScriptByte + ld hl, wPartySpecies + ld de, 1 + call IsInArray + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_addcellnum: +; script command 0x28 +; parameters: person + + xor a + ld [wScriptVar], a + call GetScriptByte + ld c, a + farcall AddPhoneNumber + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_delcellnum: +; script command 0x29 +; parameters: person + + xor a + ld [wScriptVar], a + call GetScriptByte + ld c, a + farcall DelCellNum + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_checkcellnum: +; script command 0x2a +; parameters: person +; returns false if the cell number is not in your phone + + xor a + ld [wScriptVar], a + call GetScriptByte + ld c, a + farcall CheckCellNum + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_specialphonecall: +; script command 0x9c +; parameters: call_id + + call GetScriptByte + ld [wSpecialPhoneCallID], a + call GetScriptByte + ld [wSpecialPhoneCallID + 1], a + ret + +Script_checkphonecall: +; script command 0x9d +; returns false if no special phone call is stored + + ld a, [wSpecialPhoneCallID] + and a + jr z, .ok + ld a, TRUE +.ok + ld [wScriptVar], a + ret + +Script_givepoke: +; script command 0x2d +; parameters: pokemon, level, item, trainer, trainer_name_pointer, pkmn_nickname + + call GetScriptByte + ld [wCurPartySpecies], a + call GetScriptByte + ld [wCurPartyLevel], a + call GetScriptByte + ld [wCurItem], a + call GetScriptByte + and a + ld b, a + jr z, .ok + ld hl, wScriptPos + ld e, [hl] + inc hl + ld d, [hl] + call GetScriptByte + call GetScriptByte + call GetScriptByte + call GetScriptByte +.ok + farcall GivePoke + ld a, b + ld [wScriptVar], a + ret + +Script_giveegg: +; script command 0x2e +; parameters: pokemon, level +; if no room in the party, return 0 in wScriptVar; else, return 2 + + xor a ; PARTYMON + ld [wScriptVar], a + ld [wMonType], a + call GetScriptByte + ld [wCurPartySpecies], a + call GetScriptByte + ld [wCurPartyLevel], a + farcall GiveEgg + ret nc + ld a, 2 + ld [wScriptVar], a + ret + +Script_setevent: +; script command 0x33 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, SET_FLAG + call EventFlagAction + ret + +Script_clearevent: +; script command 0x32 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, RESET_FLAG + call EventFlagAction + ret + +Script_checkevent: +; script command 0x31 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, CHECK_FLAG + call EventFlagAction + ld a, c + and a + jr z, .false + ld a, TRUE +.false + ld [wScriptVar], a + ret + +Script_setflag: +; script command 0x36 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, SET_FLAG + call _EngineFlagAction + ret + +Script_clearflag: +; script command 0x35 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, RESET_FLAG + call _EngineFlagAction + ret + +Script_checkflag: +; script command 0x34 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, CHECK_FLAG + call _EngineFlagAction + ld a, c + and a + jr z, .false + ld a, TRUE +.false + ld [wScriptVar], a + ret + +_EngineFlagAction: + farcall EngineFlagAction + ret + +Script_wildoff: +; script command 0x38 + + ld hl, wStatusFlags + set STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] + ret + +Script_wildon: +; script command 0x37 + + ld hl, wStatusFlags + res STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] + ret + +Script_xycompare: +; script command 0x39 +; parameters: pointer + + call GetScriptByte + ld [wXYComparePointer], a + call GetScriptByte + ld [wXYComparePointer + 1], a + ret + +Script_warpfacing: +; script command 0xa3 +; parameters: facing, map_group, map_id, x, y + + call GetScriptByte + maskbits NUM_DIRECTIONS + ld c, a + ld a, [wPlayerSpriteSetupFlags] + set PLAYERSPRITESETUP_CUSTOM_FACING_F, a + or c + ld [wPlayerSpriteSetupFlags], a +; fall through + +Script_warp: +; script command 0x3c +; parameters: map_group, map_id, x, y + +; This seems to be some sort of error handling case. + call GetScriptByte + and a + jr z, .not_ok + ld [wMapGroup], a + call GetScriptByte + ld [wMapNumber], a + call GetScriptByte + ld [wXCoord], a + call GetScriptByte + ld [wYCoord], a + ld a, -1 + ld [wDefaultSpawnpoint], a + ld a, MAPSETUP_WARP + ld [hMapEntryMethod], a + ld a, 1 + call LoadMapStatus + call StopScript + ret + +.not_ok + call GetScriptByte + call GetScriptByte + call GetScriptByte + ld a, -1 + ld [wDefaultSpawnpoint], a + ld a, MAPSETUP_BADWARP + ld [hMapEntryMethod], a + ld a, 1 + call LoadMapStatus + call StopScript + ret + +Script_warpmod: +; script command 0x3a +; parameters: warp_id, map_group, map_id + + call GetScriptByte + ld [wBackupWarpNumber], a + call GetScriptByte + ld [wBackupMapGroup], a + call GetScriptByte + ld [wBackupMapNumber], a + ret + +Script_blackoutmod: +; script command 0x3b +; parameters: map_group, map_id + + call GetScriptByte + ld [wLastSpawnMapGroup], a + call GetScriptByte + ld [wLastSpawnMapNumber], a + ret + +Script_dontrestartmapmusic: +; script command 0x83 + + ld a, 1 + ld [wDontPlayMapMusicOnReload], a + ret + +Script_writecmdqueue: +; script command 0x7d +; parameters: queue_pointer + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall WriteCmdQueue ; no need to farcall + ret + +Script_delcmdqueue: +; script command 0x7e +; parameters: byte + + xor a + ld [wScriptVar], a + call GetScriptByte + ld b, a + farcall DelCmdQueue ; no need to farcall + ret c + ld a, 1 + ld [wScriptVar], a + ret + +Script_changemap: +; script command 0x79 +; parameters: map_data_pointer + + call GetScriptByte + ld [wMapBlocksBank], a + call GetScriptByte + ld [wMapBlocksPointer], a + call GetScriptByte + ld [wMapBlocksPointer + 1], a + call ChangeMap + call BufferScreen + ret + +Script_changeblock: +; script command 0x7a +; parameters: x, y, block + + call GetScriptByte + add 4 + ld d, a + call GetScriptByte + add 4 + ld e, a + call GetBlockLocation + call GetScriptByte + ld [hl], a + call BufferScreen + ret + +Script_reloadmappart:: +; script command 0x7c + + xor a + ld [hBGMapMode], a + call OverworldTextModeSwitch + call GetMovementPermissions + farcall ReloadMapPart + call UpdateSprites + ret + +Script_warpcheck: +; script command 0x8e + + call WarpCheck + ret nc + farcall EnableEvents + ret + +Script_enableevents: +; unused + farcall EnableEvents + ret + +Script_newloadmap: +; script command 0x8a +; parameters: which_method + + call GetScriptByte + ld [hMapEntryMethod], a + ld a, 1 + call LoadMapStatus + call StopScript + ret + +Script_reloadandreturn: +; script command 0x92 + + call Script_newloadmap + jp Script_end + +Script_opentext: +; script command 0x47 + + call OpenText + ret + +Script_refreshscreen: +; script command 0x48 +; parameters: dummy + + call RefreshScreen + call GetScriptByte + ret + +Script_loadbytec2cf: +; script command 0x4a +; parameters: byte + + call GetScriptByte + ld [wc2cf], a + ret + + db closetext_command ; unused + +Script_closetext: +; script command 0x49 + + call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap + call CloseText + ret + + +Script_passtoengine: +; script command 0x89 +; parameters: data_pointer + + call GetScriptByte + push af + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + pop af + call StartAutoInput + ret + +Script_pause: +; script command 0x8b +; parameters: length + + call GetScriptByte + and a + jr z, .loop + ld [wScriptDelay], a +.loop + ld c, 2 + call DelayFrames + ld hl, wScriptDelay + dec [hl] + jr nz, .loop + ret + +Script_deactivatefacing: +; script command 0x8c +; parameters: time + + call GetScriptByte + and a + jr z, .no_time + ld [wScriptDelay], a +.no_time + ld a, SCRIPT_WAIT + ld [wScriptMode], a + call StopScript + ret + +Script_ptpriorityjump: +; script command 0x8f +; parameters: pointer + + call StopScript + jp Script_jump + +Script_end: +; script command 0x91 + + call ExitScriptSubroutine + jr c, .resume + ret + +.resume + xor a + ld [wScriptRunning], a + ld a, SCRIPT_OFF + ld [wScriptMode], a + ld hl, wScriptFlags + res 0, [hl] + call StopScript + ret + +Script_return: +; script command 0x90 + + call ExitScriptSubroutine + jr c, .dummy +.dummy + ld hl, wScriptFlags + res 0, [hl] + call StopScript + ret + +ExitScriptSubroutine: +; Return carry if there's no parent to return to. + + ld hl, wScriptStackSize + ld a, [hl] + and a + jr z, .done + dec [hl] + ld e, [hl] + ld d, $0 + ld hl, wScriptStack + add hl, de + add hl, de + add hl, de + ld a, [hli] + ld b, a + and " " + ld [wScriptBank], a + ld a, [hli] + ld e, a + ld [wScriptPos], a + ld a, [hl] + ld d, a + ld [wScriptPos + 1], a + and a + ret +.done + scf + ret + +Script_endall: +; script command 0x93 + + xor a + ld [wScriptStackSize], a + ld [wScriptRunning], a + ld a, SCRIPT_OFF + ld [wScriptMode], a + ld hl, wScriptFlags + res 0, [hl] + call StopScript + ret + +Script_halloffame: +; script command 0xa1 + + ld hl, wGameTimerPause + res GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] + farcall StubbedTrainerRankings_HallOfFame + farcall StubbedTrainerRankings_HallOfFame2 + farcall HallOfFame + ld hl, wGameTimerPause + set GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] + jr ReturnFromCredits + +Script_credits: +; script command 0xa2 + + farcall RedCredits +ReturnFromCredits: + call Script_endall + ld a, $3 + call LoadMapStatus + call StopScript + ret + +Script_wait: +; script command 0xa8 +; parameters: unknown + + push bc + call GetScriptByte +.loop + push af + ld c, 6 + call DelayFrames + pop af + dec a + jr nz, .loop + pop bc + ret + +Script_checksave: +; script command 0xa9 + + farcall CheckSave + ld a, c + ld [wScriptVar], a + ret + + +; unused + ld a, [.byte] + ld [wScriptVar], a + ret + +.byte + db 0 diff --git a/engine/overworld/select_menu.asm b/engine/overworld/select_menu.asm new file mode 100755 index 000000000..9898afda2 --- /dev/null +++ b/engine/overworld/select_menu.asm @@ -0,0 +1,191 @@ +SelectMenu:: ; 13327 + + call CheckRegisteredItem + jr c, .NotRegistered + jp UseRegisteredItem + +.NotRegistered: + call OpenText + ld b, BANK(ItemMayBeRegisteredText) + ld hl, ItemMayBeRegisteredText + call MapTextbox + call WaitButton + jp CloseText +; 13340 + + +ItemMayBeRegisteredText: ; 13340 + text_jump UnknownText_0x1c1cf3 + db "@" +; 13345 + + +CheckRegisteredItem: ; 13345 + + ld a, [wWhichRegisteredItem] + and a + jr z, .NoRegisteredItem + and REGISTERED_POCKET + rlca + rlca + ld hl, .Pockets + rst JumpTable + ret + +.Pockets: +; entries correspond to *_POCKET constants + dw .CheckItem + dw .CheckBall + dw .CheckKeyItem + dw .CheckTMHM + +.CheckItem: + ld hl, wNumItems + call .CheckRegisteredNo + jr c, .NoRegisteredItem + inc hl + ld e, a + ld d, 0 + add hl, de + add hl, de + call .IsSameItem + jr c, .NoRegisteredItem + and a + ret + +.CheckKeyItem: + ld a, [wRegisteredItem] + ld hl, wKeyItems + ld de, 1 + call IsInArray + jr nc, .NoRegisteredItem + ld a, [wRegisteredItem] + ld [wCurItem], a + and a + ret + +.CheckBall: + ld hl, wNumBalls + call .CheckRegisteredNo + jr nc, .NoRegisteredItem + inc hl + ld e, a + ld d, 0 + add hl, de + add hl, de + call .IsSameItem + jr c, .NoRegisteredItem + ret + +.CheckTMHM: + jr .NoRegisteredItem + +.NoRegisteredItem: + xor a + ld [wWhichRegisteredItem], a + ld [wRegisteredItem], a + scf + ret +; 133a6 + + +.CheckRegisteredNo: ; 133a6 + ld a, [wWhichRegisteredItem] + and REGISTERED_NUMBER + dec a + cp [hl] + jr nc, .NotEnoughItems + ld [wCurItemQuantity], a + and a + ret + +.NotEnoughItems: + scf + ret +; 133b6 + + +.IsSameItem: ; 133b6 + ld a, [wRegisteredItem] + cp [hl] + jr nz, .NotSameItem + ld [wCurItem], a + and a + ret + +.NotSameItem: + scf + ret +; 133c3 + + +UseRegisteredItem: ; 133c3 + + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + ld hl, .SwitchTo + rst JumpTable + ret + +.SwitchTo: +; entries correspond to ITEMMENU_* constants + dw .CantUse + dw .NoFunction + dw .NoFunction + dw .NoFunction + dw .Current + dw .Party + dw .Overworld +; 133df + +.NoFunction: ; 133df + call OpenText + call CantUseItem + call CloseText + and a + ret +; 133ea + +.Current: ; 133ea + call OpenText + call DoItemEffect + call CloseText + and a + ret +; 133f5 + +.Party: ; 133f5 + call RefreshScreen + call FadeToMenu + call DoItemEffect + call CloseSubmenu + call CloseText + and a + ret +; 13406 + +.Overworld: ; 13406 + call RefreshScreen + ld a, 1 + ld [wUsingItemWithSelect], a + call DoItemEffect + xor a + ld [wUsingItemWithSelect], a + ld a, [wItemEffectSucceeded] + cp 1 + jr nz, ._cantuse + scf + ld a, HMENURETURN_SCRIPT + ld [hMenuReturn], a + ret +; 13422 + +.CantUse: ; 13422 + call RefreshScreen + +._cantuse + call CantUseItem + call CloseText + and a + ret +; 1342d diff --git a/engine/overworld/spawn_points.asm b/engine/overworld/spawn_points.asm new file mode 100644 index 000000000..1a3d12441 --- /dev/null +++ b/engine/overworld/spawn_points.asm @@ -0,0 +1,62 @@ +INCLUDE "data/maps/spawn_points.asm" + + +LoadSpawnPoint: ; 1531f + ; loads the spawn point in wDefaultSpawnpoint + push hl + push de + ld a, [wDefaultSpawnpoint] + cp SPAWN_N_A + jr z, .spawn_n_a + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, SpawnPoints + add hl, de + ld a, [hli] + ld [wMapGroup], a + ld a, [hli] + ld [wMapNumber], a + ld a, [hli] + ld [wXCoord], a + ld a, [hli] + ld [wYCoord], a +.spawn_n_a + pop de + pop hl + ret +; 15344 + + +IsSpawnPoint: ; 15344 +; Checks if the map loaded in de is a spawn point. Returns carry if it's a spawn point. + ld hl, SpawnPoints + ld c, 0 +.loop + ld a, [hl] + cp SPAWN_N_A + jr z, .nope + cp d + jr nz, .next + inc hl + ld a, [hld] + cp e + jr z, .yes + +.next + push bc + ld bc, 4 ; length of a spawn table entry + add hl, bc + pop bc + inc c + jr .loop + +.nope + and a + ret + +.yes + scf + ret +; 15363 diff --git a/engine/overworld/tile_events.asm b/engine/overworld/tile_events.asm new file mode 100755 index 000000000..705c0e427 --- /dev/null +++ b/engine/overworld/tile_events.asm @@ -0,0 +1,110 @@ +CheckWarpCollision:: ; 1499a +; Is this tile a warp? + ld a, [wPlayerStandingTile] + cp COLL_PIT + jr z, .warp + cp COLL_PIT_68 + jr z, .warp + and $f0 + cp HI_NYBBLE_WARPS + jr z, .warp + and a + ret + +.warp + scf + ret +; 149af + +CheckDirectionalWarp:: ; 149af +; If this is a directional warp, clear carry (press the designated button to warp). +; Else, set carry (immediate warp). + ld a, [wPlayerStandingTile] + cp COLL_WARP_CARPET_DOWN + jr z, .directional + cp COLL_WARP_CARPET_LEFT + jr z, .directional + cp COLL_WARP_CARPET_UP + jr z, .directional + cp COLL_WARP_CARPET_RIGHT + jr z, .directional + scf + ret + +.directional + xor a + ret +; 149c6 + +CheckWarpFacingDown: ; 149c6 + ld de, 1 + ld hl, .blocks + ld a, [wPlayerStandingTile] + call IsInArray + ret +; 149d3 + +.blocks ; 149d3 + db COLL_DOOR + db COLL_DOOR_79 + db COLL_STAIRCASE + db COLL_STAIRCASE_73 + db COLL_CAVE + db COLL_CAVE_74 + db COLL_WARP_PANEL + db COLL_DOOR_75 + db COLL_DOOR_7D + db -1 +; 149dd + +CheckGrassCollision:: ; 149dd + ld a, [wPlayerStandingTile] + ld hl, .blocks + ld de, 1 + call IsInArray + ret +; 149ea + +.blocks ; 149ea + db COLL_CUT_08 + db COLL_TALL_GRASS + db COLL_LONG_GRASS + db COLL_CUT_28 + db COLL_WATER + db COLL_GRASS_48 + db COLL_GRASS_49 + db COLL_GRASS_4A + db COLL_GRASS_4B + db COLL_GRASS_4C + db -1 +; 149f5 + +CheckCutCollision: ; 149f5 + ld a, c + ld hl, .blocks + ld de, 1 + call IsInArray + ret +; 14a00 + +.blocks ; 14a00 + db COLL_CUT_TREE + db COLL_CUT_TREE_1A + db COLL_TALL_GRASS_10 + db COLL_TALL_GRASS + db COLL_LONG_GRASS + db COLL_LONG_GRASS_1C + db -1 +; 14a07 + +GetWarpSFX:: ; 14a07 + ld a, [wPlayerStandingTile] + ld de, SFX_ENTER_DOOR + cp COLL_DOOR + ret z + ld de, SFX_WARP_TO + cp COLL_WARP_PANEL + ret z + ld de, SFX_EXIT_BUILDING + ret +; 14a1a diff --git a/engine/overworld/time.asm b/engine/overworld/time.asm new file mode 100755 index 000000000..0f83447cc --- /dev/null +++ b/engine/overworld/time.asm @@ -0,0 +1,465 @@ +_InitializeStartDay: ; 113d6 + call InitializeStartDay + ret +; 113da + +ClearDailyTimers: ; 113da + xor a + ld [wLuckyNumberDayBuffer], a + ld [wUnusedTwoDayTimer], a + ld [wDailyResetTimer], a + ret +; 113e5 + +InitCallReceiveDelay:: ; 113e5 + xor a + ld [wTimeCyclesSinceLastCall], a + +NextCallReceiveDelay: ; 113e9 + ld a, [wTimeCyclesSinceLastCall] + cp 3 + jr c, .okay + ld a, 3 + +.okay + ld e, a + ld d, 0 + ld hl, .ReceiveCallDelays + add hl, de + ld a, [hl] + jp RestartReceiveCallDelay +; 113fd + +.ReceiveCallDelays: + db 20, 10, 5, 3 +; 11401 + +CheckReceiveCallTimer: ; 11401 + call CheckReceiveCallDelay ; check timer + ret nc + ld hl, wTimeCyclesSinceLastCall + ld a, [hl] + cp 3 + jr nc, .ok + inc [hl] + +.ok + call NextCallReceiveDelay ; restart timer + scf + ret +; 11413 + +InitOneDayCountdown: ; 11413 + ld a, 1 + +InitNDaysCountdown: ; 11415 + ld [hl], a + push hl + call UpdateTime + pop hl + inc hl + call CopyDayToHL + ret +; 11420 + +CheckDayDependentEventHL: ; 11420 + inc hl + push hl + call CalcDaysSince + call GetDaysSince + pop hl + dec hl + call UpdateTimeRemaining + ret +; 1142e + +RestartReceiveCallDelay: ; 1142e + ld hl, wReceiveCallDelay_MinsRemaining + ld [hl], a + call UpdateTime + ld hl, wReceiveCallDelay_StartTime + call CopyDayHourMinToHL + ret +; 1143c + +CheckReceiveCallDelay: ; 1143c + ld hl, wReceiveCallDelay_StartTime + call CalcMinsHoursDaysSince + call GetMinutesSinceIfLessThan60 + ld hl, wReceiveCallDelay_MinsRemaining + call UpdateTimeRemaining + ret +; 1144c + +RestartDailyResetTimer: ; 1144c + ld hl, wDailyResetTimer + jp InitOneDayCountdown +; 11452 + +CheckDailyResetTimer:: ; 11452 + ld hl, wDailyResetTimer + call CheckDayDependentEventHL + ret nc + xor a + ld hl, wDailyFlags + ld [hli], a ; wDailyFlags + ld [hli], a ; wWeeklyFlags + ld [hli], a ; wSwarmFlags + ld [hl], a ; wSwarmFlags + 1 + ld hl, wDailyRematchFlags +rept 4 + ld [hli], a +endr + ld hl, wDailyPhoneItemFlags +rept 4 + ld [hli], a +endr + ld hl, wDailyPhoneTimeOfDayFlags +rept 4 + ld [hli], a +endr + ld hl, wKenjiBreakTimer + ld a, [hl] + and a + jr z, .RestartKenjiBreakCountdown + dec [hl] + jr nz, .DontRestartKenjiBreakCountdown +.RestartKenjiBreakCountdown: + call SampleKenjiBreakCountdown +.DontRestartKenjiBreakCountdown: + jr RestartDailyResetTimer +; 11485 + +SampleKenjiBreakCountdown: ; 11485 +; Generate a random number between 3 and 6 + call Random + and %11 + add 3 + ld [wKenjiBreakTimer], a + ret +; 11490 + +StartBugContestTimer: ; 11490 + ld a, BUG_CONTEST_MINUTES + ld [wBugContestMinsRemaining], a + ld a, BUG_CONTEST_SECONDS + ld [wBugContestSecsRemaining], a + call UpdateTime + ld hl, wBugContestStartTime + call CopyDayHourMinSecToHL + ret +; 114a4 + + +CheckBugContestTimer:: ; 114a4 (4:54a4) + ld hl, wBugContestStartTime + call CalcSecsMinsHoursDaysSince + ld a, [wDaysSince] + and a + jr nz, .timed_out + ld a, [wHoursSince] + and a + jr nz, .timed_out + ld a, [wSecondsSince] + ld b, a + ld a, [wBugContestSecsRemaining] + sub b + jr nc, .okay + add 60 + +.okay + ld [wBugContestSecsRemaining], a + ld a, [wMinutesSince] + ld b, a + ld a, [wBugContestMinsRemaining] + sbc b + ld [wBugContestMinsRemaining], a + jr c, .timed_out + and a + ret + +.timed_out + xor a + ld [wBugContestMinsRemaining], a + ld [wBugContestSecsRemaining], a + scf + ret + + +InitializeStartDay: ; 114dd + call UpdateTime + ld hl, wTimerEventStartDay + call CopyDayToHL + ret +; 114e7 + +CheckPokerusTick:: ; 114e7 + ld hl, wTimerEventStartDay + call CalcDaysSince + call GetDaysSince + and a + jr z, .done ; not even a day has passed since game start + ld b, a + farcall ApplyPokerusTick +.done + xor a + ret +; 114fc + +SetUnusedTwoDayTimer: ; 114fc + ld a, 2 + ld hl, wUnusedTwoDayTimer + ld [hl], a + call UpdateTime + ld hl, wUnusedTwoDayTimerStartDate + call CopyDayToHL + ret +; 1150c + +CheckUnusedTwoDayTimer: ; 1150c + ld hl, wUnusedTwoDayTimerStartDate + call CalcDaysSince + call GetDaysSince + ld hl, wUnusedTwoDayTimer + call UpdateTimeRemaining + ret +; 1151c + +; unused + ld hl, wDailyFlags + set DAILYFLAGS_FISH_SWARM_F, [hl] + ret +; 11522 + +; unused + and a + ld hl, wDailyFlags + bit DAILYFLAGS_FISH_SWARM_F, [hl] + ret nz + scf + ret +; 1152b + +RestartLuckyNumberCountdown: ; 1152b + call .GetDaysUntilNextFriday + ld hl, wLuckyNumberDayBuffer + jp InitNDaysCountdown +; 11534 + +.GetDaysUntilNextFriday: ; 11534 + call GetWeekday + ld c, a + ld a, FRIDAY + sub c + jr z, .friday_saturday + jr nc, .earlier ; could have done "ret nc" + +.friday_saturday + add 7 + +.earlier + ret +; 11542 + +_CheckLuckyNumberShowFlag: ; 11542 + ld hl, wLuckyNumberDayBuffer + jp CheckDayDependentEventHL +; 11548 + +DoMysteryGiftIfDayHasPassed: ; 11548 + ld a, BANK(sMysteryGiftTimer) + call GetSRAMBank + ld hl, sMysteryGiftTimer + ld a, [hli] + ld [wBuffer1], a + ld a, [hl] + ld [wBuffer2], a + call CloseSRAM + + ld hl, wBuffer1 + call CheckDayDependentEventHL + jr nc, .not_timed_out + ld hl, wBuffer1 + call InitOneDayCountdown + call CloseSRAM + farcall Function1050c8 + +.not_timed_out + ld a, BANK(sMysteryGiftTimer) + call GetSRAMBank + ld hl, wBuffer1 + ld a, [hli] + ld [sMysteryGiftTimer], a + ld a, [hl] + ld [sMysteryGiftTimer + 1], a + call CloseSRAM + ret +; 11586 + +UpdateTimeRemaining: ; 11586 +; If the amount of time elapsed exceeds the capacity of its +; unit, skip this part. + cp -1 + jr z, .set_carry + ld c, a + ld a, [hl] ; time remaining + sub c + jr nc, .ok + xor a + +.ok + ld [hl], a + jr z, .set_carry + xor a + ret + +.set_carry + xor a + ld [hl], a + scf + ret +; 11599 + +GetSecondsSinceIfLessThan60: ; 11599 + ld a, [wDaysSince] + and a + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wHoursSince] + and a + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wMinutesSince] + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wSecondsSince] + ret +; 115ae + +GetMinutesSinceIfLessThan60: ; 115ae + ld a, [wDaysSince] + and a + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wHoursSince] + and a + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wMinutesSince] + ret +; 115be + +GetHoursSinceIfLessThan24: ; 115be + ld a, [wDaysSince] + and a + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wHoursSince] + ret +; 115c8 + +GetDaysSince: ; 115c8 + ld a, [wDaysSince] + ret +; 115cc + +GetTimeElapsed_ExceedsUnitLimit: ; 115cc + ld a, -1 + ret +; 115cf + +CalcDaysSince: ; 115cf + xor a + jr _CalcDaysSince +; 115d2 + +CalcHoursDaysSince: ; 115d2 + inc hl + xor a + jr _CalcHoursDaysSince +; 115d6 + +CalcMinsHoursDaysSince: ; 115d6 + inc hl + inc hl + xor a + jr _CalcMinsHoursDaysSince +; 115db + +CalcSecsMinsHoursDaysSince: ; 115db + inc hl + inc hl + inc hl + ld a, [hSeconds] + ld c, a + sub [hl] + jr nc, .skip + add 60 +.skip + ld [hl], c ; current seconds + dec hl + ld [wSecondsSince], a ; seconds since + +_CalcMinsHoursDaysSince: ; 115eb + ld a, [hMinutes] + ld c, a + sbc [hl] + jr nc, .skip + add 60 +.skip + ld [hl], c ; current minutes + dec hl + ld [wMinutesSince], a ; minutes since + +_CalcHoursDaysSince: ; 115f8 + ld a, [hHours] + ld c, a + sbc [hl] + jr nc, .skip + add 24 +.skip + ld [hl], c ; current hours + dec hl + ld [wHoursSince], a ; hours since + +_CalcDaysSince: + ld a, [wCurDay] + ld c, a + sbc [hl] + jr nc, .skip + add 20 * 7 +.skip + ld [hl], c ; current days + ld [wDaysSince], a ; days since + ret +; 11613 + +CopyDayHourMinSecToHL: ; 11613 + ld a, [wCurDay] + ld [hli], a + ld a, [hHours] + ld [hli], a + ld a, [hMinutes] + ld [hli], a + ld a, [hSeconds] + ld [hli], a + ret +; 11621 + +CopyDayToHL: ; 11621 + ld a, [wCurDay] + ld [hl], a + ret +; 11626 + +CopyDayHourToHL: ; 11626 + ld a, [wCurDay] + ld [hli], a + ld a, [hHours] + ld [hli], a + ret +; 1162e + +CopyDayHourMinToHL: ; 1162e + ld a, [wCurDay] + ld [hli], a + ld a, [hHours] + ld [hli], a + ld a, [hMinutes] + ld [hli], a + ret +; 11639 diff --git a/engine/overworld/variables.asm b/engine/overworld/variables.asm new file mode 100755 index 000000000..89026fdba --- /dev/null +++ b/engine/overworld/variables.asm @@ -0,0 +1,151 @@ +_GetVarAction:: ; 80648 (20:4648) + ld a, c + cp NUM_VARS + jr c, .valid + xor a +.valid + ld c, a + ld b, 0 + ld hl, .VarActionTable + add hl, bc + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld b, [hl] + ld a, b + and RETVAR_EXECUTE + jr nz, .call + ld a, b + and RETVAR_ADDR_DE + ret nz + ld a, [de] + jr .loadstringbuffer2 + +.call + call _de_ + ret + +.loadstringbuffer2 ; 8066c (20:466c) + ld de, wStringBuffer2 + ld [de], a + ret +; 80671 (20:4671) + +.VarActionTable: ; 80671 +; entries correspond to VAR_* constants + ; RETVAR_STRBUF2: copy [de] to wStringBuffer2 + ; RETVAR_ADDR_DE: return address in de + ; RETVAR_EXECUTE: call function + dwb wStringBuffer2, RETVAR_STRBUF2 + dwb wPartyCount, RETVAR_STRBUF2 + dwb .BattleResult, RETVAR_EXECUTE + dwb wBattleType, RETVAR_ADDR_DE + dwb wTimeOfDay, RETVAR_STRBUF2 + dwb .CountCaughtMons, RETVAR_EXECUTE + dwb .CountSeenMons, RETVAR_EXECUTE + dwb .CountBadges, RETVAR_EXECUTE + dwb wPlayerState, RETVAR_ADDR_DE + dwb .PlayerFacing, RETVAR_EXECUTE + dwb hHours, RETVAR_STRBUF2 + dwb .DayOfWeek, RETVAR_EXECUTE + dwb wMapGroup, RETVAR_STRBUF2 + dwb wMapNumber, RETVAR_STRBUF2 + dwb .UnownCaught, RETVAR_EXECUTE + dwb wEnvironment, RETVAR_STRBUF2 + dwb .BoxFreeSpace, RETVAR_EXECUTE + dwb wBugContestMinsRemaining, RETVAR_STRBUF2 + dwb wXCoord, RETVAR_STRBUF2 + dwb wYCoord, RETVAR_STRBUF2 + dwb wSpecialPhoneCallID, RETVAR_STRBUF2 + dwb wNrOfBeatenBattleTowerTrainers, RETVAR_STRBUF2 + dwb wKurtApricornQuantity, RETVAR_STRBUF2 + dwb wCurrentCaller, RETVAR_ADDR_DE + dwb wBlueCardBalance, RETVAR_ADDR_DE + dwb wBuenasPassword, RETVAR_ADDR_DE + dwb wKenjiBreakTimer, RETVAR_STRBUF2 + dwb NULL, RETVAR_STRBUF2 +; 806c5 + +.CountCaughtMons: ; 806c5 +; Caught mons. + ld hl, wPokedexCaught + ld b, wEndPokedexCaught - wPokedexCaught + call CountSetBits + ld a, [wd265] + jp .loadstringbuffer2 +; 806d3 + +.CountSeenMons: ; 806d3 +; Seen mons. + ld hl, wPokedexSeen + ld b, wEndPokedexSeen - wPokedexSeen + call CountSetBits + ld a, [wd265] + jp .loadstringbuffer2 +; 806e1 + +.CountBadges: ; 806e1 +; Number of owned badges. + ld hl, wBadges + ld b, 2 + call CountSetBits + ld a, [wd265] + jp .loadstringbuffer2 +; 806ef + +.PlayerFacing: ; 806ef +; The direction the player is facing. + ld a, [wPlayerDirection] + and $c + rrca + rrca + jp .loadstringbuffer2 +; 806f9 + +.DayOfWeek: ; 806f9 +; The day of the week. + call GetWeekday + jp .loadstringbuffer2 +; 806ff + +.UnownCaught: ; 806ff +; Number of unique Unown caught. + call .count + ld a, b + jp .loadstringbuffer2 + +.count + ld hl, wUnownDex + ld b, 0 +.loop + ld a, [hli] + and a + ret z + inc b + ld a, b + cp NUM_UNOWN + jr c, .loop + ret +; 80715 + +.BoxFreeSpace: ; 80715 +; Remaining slots in the current box. + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + ld a, MONS_PER_BOX + sub [hl] + ld b, a + call CloseSRAM + ld a, b + jp .loadstringbuffer2 +; 80728 + +.BattleResult: ; 80728 + ld a, [wBattleResult] + and $3f + jp .loadstringbuffer2 +; 80730 diff --git a/engine/overworld/warp_connection.asm b/engine/overworld/warp_connection.asm new file mode 100755 index 000000000..069b72234 --- /dev/null +++ b/engine/overworld/warp_connection.asm @@ -0,0 +1,439 @@ + +HandleNewMap: ; 1045b0 + call Clearwc7e8 + call ResetMapBufferEventFlags + call ResetFlashIfOutOfCave + call GetCurrentMapSceneID + call ResetBikeFlags + ld a, MAPCALLBACK_NEWMAP + call RunMapCallback +InitCommandQueue: ; 1045c4 + farcall ClearCmdQueue + ld a, MAPCALLBACK_CMDQUEUE + call RunMapCallback + call GetMapTimeOfDay + ld [wMapTimeOfDay], a + ret + + +EnterMapConnection: ; 1045d6 +; Return carry if a connection has been entered. + ld a, [wPlayerStepDirection] + and a + jp z, .south + cp UP + jp z, .north + cp LEFT + jp z, .west + cp RIGHT + jp z, .east + ret + +.west + ld a, [wWestConnectedMapGroup] + ld [wMapGroup], a + ld a, [wWestConnectedMapNumber] + ld [wMapNumber], a + ld a, [wWestConnectionStripXOffset] + ld [wXCoord], a + ld a, [wWestConnectionStripYOffset] + ld hl, wYCoord + add [hl] + ld [hl], a + ld c, a + ld hl, wWestConnectionWindow + ld a, [hli] + ld h, [hl] + ld l, a + srl c + jr z, .skip_to_load + ld a, [wWestConnectedMapWidth] + add 6 + ld e, a + ld d, 0 + +.loop + add hl, de + dec c + jr nz, .loop + +.skip_to_load + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a + jp .done + +.east + ld a, [wEastConnectedMapGroup] + ld [wMapGroup], a + ld a, [wEastConnectedMapNumber] + ld [wMapNumber], a + ld a, [wEastConnectionStripXOffset] + ld [wXCoord], a + ld a, [wEastConnectionStripYOffset] + ld hl, wYCoord + add [hl] + ld [hl], a + ld c, a + ld hl, wEastConnectionWindow + ld a, [hli] + ld h, [hl] + ld l, a + srl c + jr z, .skip_to_load2 + ld a, [wEastConnectedMapWidth] + add 6 + ld e, a + ld d, 0 + +.loop2 + add hl, de + dec c + jr nz, .loop2 + +.skip_to_load2 + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a + jp .done + +.north + ld a, [wNorthConnectedMapGroup] + ld [wMapGroup], a + ld a, [wNorthConnectedMapNumber] + ld [wMapNumber], a + ld a, [wNorthConnectionStripYOffset] + ld [wYCoord], a + ld a, [wNorthConnectionStripXOffset] + ld hl, wXCoord + add [hl] + ld [hl], a + ld c, a + ld hl, wNorthConnectionWindow + ld a, [hli] + ld h, [hl] + ld l, a + ld b, 0 + srl c + add hl, bc + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a + jp .done + +.south + ld a, [wSouthConnectedMapGroup] + ld [wMapGroup], a + ld a, [wSouthConnectedMapNumber] + ld [wMapNumber], a + ld a, [wSouthConnectionStripYOffset] + ld [wYCoord], a + ld a, [wSouthConnectionStripXOffset] + ld hl, wXCoord + add [hl] + ld [hl], a + ld c, a + ld hl, wSouthConnectionWindow + ld a, [hli] + ld h, [hl] + ld l, a + ld b, 0 + srl c + add hl, bc + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a +.done + scf + ret +; 1046c6 + +LoadWarpData: ; 1046c6 + call .SaveDigWarp + call .SetSpawn + ld a, [wNextWarp] + ld [wWarpNumber], a + ld a, [wNextMapGroup] + ld [wMapGroup], a + ld a, [wNextMapNumber] + ld [wMapNumber], a + ret + +.SaveDigWarp: ; 1046df (41:46df) + call GetMapEnvironment + call CheckOutdoorMap + ret nz + ld a, [wNextMapGroup] + ld b, a + ld a, [wNextMapNumber] + ld c, a + call GetAnyMapEnvironment + call CheckIndoorMap + ret nz + +; MOUNT_MOON_SQUARE and TIN_TOWER_ROOF are outdoor maps within indoor maps. +; Dig and Escape Rope should not take you to them. + ld a, [wPrevMapGroup] + cp GROUP_MOUNT_MOON_SQUARE ; GROUP_TIN_TOWER_ROOF + jr nz, .not_mt_moon_or_tin_tower + ld a, [wPrevMapNumber] + cp MAP_MOUNT_MOON_SQUARE + ret z + cp MAP_TIN_TOWER_ROOF + ret z +.not_mt_moon_or_tin_tower + + ld a, [wPrevWarp] + ld [wDigWarpNumber], a + ld a, [wPrevMapGroup] + ld [wDigMapGroup], a + ld a, [wPrevMapNumber] + ld [wDigMapNumber], a + ret + +.SetSpawn: ; 104718 (41:4718) + call GetMapEnvironment + call CheckOutdoorMap + ret nz + ld a, [wNextMapGroup] + ld b, a + ld a, [wNextMapNumber] + ld c, a + call GetAnyMapEnvironment + call CheckIndoorMap + ret nz + ld a, [wNextMapGroup] + ld b, a + ld a, [wNextMapNumber] + ld c, a + +; Respawn in Pokémon Centers. + call GetAnyMapTileset + ld a, c + cp TILESET_POKECENTER + jr z, .pokecenter_pokecom + cp TILESET_POKECOM_CENTER + jr z, .pokecenter_pokecom + ret +.pokecenter_pokecom + + ld a, [wPrevMapGroup] + ld [wLastSpawnMapGroup], a + ld a, [wPrevMapNumber] + ld [wLastSpawnMapNumber], a + ret + +LoadMapTimeOfDay: ; 104750 + ld hl, wVramState + res 6, [hl] + ld a, $1 + ld [wSpriteUpdatesEnabled], a + farcall ReplaceTimeOfDayPals + farcall UpdateTimeOfDayPal + call OverworldTextModeSwitch + call .ClearBGMap + call .PushAttrMap + ret + +.ClearBGMap: ; 104770 (41:4770) + ld a, HIGH(vBGMap0) + ld [wBGMapAnchor + 1], a + xor a ; LOW(vBGMap0) + ld [wBGMapAnchor], a + ld [hSCY], a + ld [hSCX], a + farcall ApplyBGMapAnchorToObjects + + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + + xor a + ld bc, vBGMap1 - vBGMap0 + hlbgcoord 0, 0 + call ByteFill + + pop af + ld [rVBK], a + + ld a, "■" + ld bc, vBGMap1 - vBGMap0 + hlbgcoord 0, 0 + call ByteFill + ret + +.PushAttrMap: ; 1047a3 (41:47a3) + decoord 0, 0 + call .copy + ld a, [hCGB] + and a + ret z + + decoord 0, 0, wAttrMap + ld a, $1 + ld [rVBK], a +.copy + hlbgcoord 0, 0 + ld c, SCREEN_WIDTH + ld b, SCREEN_HEIGHT +.row + push bc +.column + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .column + ld bc, BG_MAP_WIDTH - SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ld a, $0 + ld [rVBK], a + ret + +LoadGraphics: ; 1047cf + call LoadTileset + call LoadTilesetGFX + xor a + ld [hMapAnims], a + xor a + ld [hTileAnimFrame], a + farcall RefreshSprites + call LoadFontsExtra + farcall LoadOverworldFont + ret + +LoadMapPalettes: ; 1047eb + ld b, SCGB_MAPPALS + jp GetSGBLayout +; 1047f0 + +RefreshMapSprites: ; 1047f0 + call ClearSprites + farcall ReturnFromMapSetupScript + call GetMovementPermissions + farcall RefreshPlayerSprite + farcall CheckReplaceKrisSprite + ld hl, wPlayerSpriteSetupFlags + bit PLAYERSPRITESETUP_SKIP_RELOAD_GFX_F, [hl] + jr nz, .skip + ld hl, wVramState + set 0, [hl] + call SafeUpdateSprites +.skip + ld a, [wPlayerSpriteSetupFlags] + and %00011100 + ld [wPlayerSpriteSetupFlags], a + ret + +CheckMovingOffEdgeOfMap:: ; 104820 (41:4820) + ld a, [wPlayerStepDirection] + cp STANDING + ret z + and a ; DOWN + jr z, .down + cp UP + jr z, .up + cp LEFT + jr z, .left + cp RIGHT + jr z, .right + and a + ret + +.down + ld a, [wPlayerStandingMapY] + sub 4 + ld b, a + ld a, [wMapHeight] + add a + cp b + jr z, .ok + and a + ret + +.up + ld a, [wPlayerStandingMapY] + sub 4 + cp -1 + jr z, .ok + and a + ret + +.left + ld a, [wPlayerStandingMapX] + sub 4 + cp -1 + jr z, .ok + and a + ret + +.right + ld a, [wPlayerStandingMapX] + sub 4 + ld b, a + ld a, [wMapWidth] + add a + cp b + jr z, .ok + and a + ret + +.ok + scf + ret + + +GetCoordOfUpperLeftCorner:: ; 10486d + ld hl, wOverworldMap + ld a, [wXCoord] + bit 0, a + jr nz, .increment_then_halve1 + srl a + add $1 + jr .resume + +.increment_then_halve1 + add $1 + srl a + +.resume + ld c, a + ld b, $0 + add hl, bc + ld a, [wMapWidth] + add $6 + ld c, a + ld b, $0 + ld a, [wYCoord] + bit 0, a + jr nz, .increment_then_halve2 + srl a + add $1 + jr .resume2 + +.increment_then_halve2 + add $1 + srl a + +.resume2 + call AddNTimes + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a + ld a, [wYCoord] + and $1 + ld [wMetatileStandingY], a + ld a, [wXCoord] + and $1 + ld [wMetatileStandingX], a + ret +; 1048ba diff --git a/engine/overworld/wildmons.asm b/engine/overworld/wildmons.asm new file mode 100755 index 000000000..494e8d2a4 --- /dev/null +++ b/engine/overworld/wildmons.asm @@ -0,0 +1,1000 @@ +LoadWildMonData: ; 29ff8 + call _GrassWildmonLookup + jr c, .copy + ld hl, wMornEncounterRate + xor a + ld [hli], a + ld [hli], a + ld [hl], a + jr .done_copy + +.copy + inc hl + inc hl + ld de, wMornEncounterRate + ld bc, 3 + call CopyBytes +.done_copy + call _WaterWildmonLookup + ld a, 0 + jr nc, .no_copy + inc hl + inc hl + ld a, [hl] +.no_copy + ld [wWaterEncounterRate], a + ret + +FindNest: ; 2a01f +; Parameters: +; e: 0 = Johto, 1 = Kanto +; wNamedObjectIndexBuffer: species + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + ld a, e + and a + jr nz, .kanto + decoord 0, 0 + ld hl, JohtoGrassWildMons + call .FindGrass + ld hl, JohtoWaterWildMons + call .FindWater + call .RoamMon1 + call .RoamMon2 + ret + +.kanto + decoord 0, 0 + ld hl, KantoGrassWildMons + call .FindGrass + ld hl, KantoWaterWildMons + jp .FindWater +; 2a052 + +.FindGrass: ; 2a052 + ld a, [hl] + cp -1 + ret z + push hl + ld a, [hli] + ld b, a + ld a, [hli] + ld c, a + inc hl + inc hl + inc hl + ld a, NUM_GRASSMON * 3 + call .SearchMapForMon + jr nc, .next_grass + ld [de], a + inc de + +.next_grass + pop hl + ld bc, GRASS_WILDDATA_LENGTH + add hl, bc + jr .FindGrass +; 2a06e + +.FindWater: ; 2a06e + ld a, [hl] + cp -1 + ret z + push hl + ld a, [hli] + ld b, a + ld a, [hli] + ld c, a + inc hl + ld a, 3 + call .SearchMapForMon + jr nc, .next_water + ld [de], a + inc de + +.next_water + pop hl + ld bc, 3 * 3 + add hl, bc + jr .FindWater +; 2a088 + +.SearchMapForMon: ; 2a088 + inc hl +.ScanMapLoop: + push af + ld a, [wNamedObjectIndexBuffer] + cp [hl] + jr z, .found + inc hl + inc hl + pop af + dec a + jr nz, .ScanMapLoop + and a + ret + +.found + pop af + jp .AppendNest +; 2a09c + +.AppendNest: ; 2a09c + push de + call GetWorldMapLocation + ld c, a + hlcoord 0, 0 + ld de, SCREEN_WIDTH * SCREEN_HEIGHT +.AppendNestLoop: + ld a, [hli] + cp c + jr z, .found_nest + dec de + ld a, e + or d + jr nz, .AppendNestLoop + ld a, c + pop de + scf + ret + +.found_nest + pop de + and a + ret +; 2a0b7 + +.RoamMon1: ; 2a0b7 + ld a, [wRoamMon1Species] + ld b, a + ld a, [wNamedObjectIndexBuffer] + cp b + ret nz + ld a, [wRoamMon1MapGroup] + ld b, a + ld a, [wRoamMon1MapNumber] + ld c, a + call .AppendNest + ret nc + ld [de], a + inc de + ret +; 2a0cf + +.RoamMon2: ; 2a0cf + ld a, [wRoamMon2Species] + ld b, a + ld a, [wNamedObjectIndexBuffer] + cp b + ret nz + ld a, [wRoamMon2MapGroup] + ld b, a + ld a, [wRoamMon2MapNumber] + ld c, a + call .AppendNest + ret nc + ld [de], a + inc de + ret +; 2a0e7 + +TryWildEncounter:: ; 2a0e7 +; Try to trigger a wild encounter. + call .EncounterRate + jr nc, .no_battle + call ChooseWildEncounter + jr nz, .no_battle + call CheckRepelEffect + jr nc, .no_battle + xor a + ret + +.no_battle + xor a ; BATTLETYPE_NORMAL + ld [wTempWildMonSpecies], a + ld [wBattleType], a + ld a, 1 + and a + ret +; 2a103 + +.EncounterRate: ; 2a103 + call GetMapEncounterRate + call ApplyMusicEffectOnEncounterRate + call ApplyCleanseTagEffectOnEncounterRate + call Random + cp b + ret +; 2a111 + +GetMapEncounterRate: ; 2a111 + ld hl, wMornEncounterRate + call CheckOnWater + ld a, wWaterEncounterRate - wMornEncounterRate + jr z, .ok + ld a, [wTimeOfDay] +.ok + ld c, a + ld b, 0 + add hl, bc + ld b, [hl] + ret +; 2a124 + +ApplyMusicEffectOnEncounterRate:: ; 2a124 +; Pokemon March and Ruins of Alph signal double encounter rate. +; Pokemon Lullaby halves encounter rate. + ld a, [wMapMusic] + cp MUSIC_POKEMON_MARCH + jr z, .double + cp MUSIC_RUINS_OF_ALPH_RADIO + jr z, .double + cp MUSIC_POKEMON_LULLABY + ret nz + srl b + ret + +.double + sla b + ret +; 2a138 + +ApplyCleanseTagEffectOnEncounterRate:: ; 2a138 +; Cleanse Tag halves encounter rate. + ld hl, wPartyMon1Item + ld de, PARTYMON_STRUCT_LENGTH + ld a, [wPartyCount] + ld c, a +.loop + ld a, [hl] + cp CLEANSE_TAG + jr z, .cleansetag + add hl, de + dec c + jr nz, .loop + ret + +.cleansetag + srl b + ret +; 2a14f + +ChooseWildEncounter: ; 2a14f + call LoadWildMonDataPointer + jp nc, .nowildbattle + call CheckEncounterRoamMon + jp c, .startwildbattle + + inc hl + inc hl + inc hl + call CheckOnWater + ld de, WaterMonProbTable + jr z, .watermon + inc hl + inc hl + ld a, [wTimeOfDay] + ld bc, $e + call AddNTimes + ld de, GrassMonProbTable + +.watermon +; hl contains the pointer to the wild mon data, let's save that to the stack + push hl +.randomloop + call Random + cp 100 + jr nc, .randomloop + inc a ; 1 <= a <= 100 + ld b, a + ld h, d + ld l, e +; This next loop chooses which mon to load up. +.prob_bracket_loop + ld a, [hli] + cp b + jr nc, .got_it + inc hl + jr .prob_bracket_loop + +.got_it + ld c, [hl] + ld b, 0 + pop hl + add hl, bc ; this selects our mon + ld a, [hli] + ld b, a +; If the Pokemon is encountered by surfing, we need to give the levels some variety. + call CheckOnWater + jr nz, .ok +; Check if we buff the wild mon, and by how much. + call Random + cp 35 percent + jr c, .ok + inc b + cp 65 percent + jr c, .ok + inc b + cp 85 percent + jr c, .ok + inc b + cp 95 percent + jr c, .ok + inc b +; Store the level +.ok + ld a, b + ld [wCurPartyLevel], a + ld b, [hl] + ; ld a, b + call ValidateTempWildMonSpecies + jr c, .nowildbattle + + ld a, b ; This is in the wrong place. + cp UNOWN + jr nz, .done + + ld a, [wUnlockedUnowns] + and a + jr z, .nowildbattle + +.done + jr .loadwildmon + +.nowildbattle + ld a, 1 + and a + ret + +.loadwildmon + ld a, b + ld [wTempWildMonSpecies], a + +.startwildbattle + xor a + ret +; 2a1cb + +INCLUDE "data/wild/probabilities.asm" + +CheckRepelEffect:: ; 2a1df +; If there is no active Repel, there's no need to be here. + ld a, [wRepelEffect] + and a + jr z, .encounter +; Get the first Pokemon in your party that isn't fainted. + ld hl, wPartyMon1HP + ld bc, PARTYMON_STRUCT_LENGTH - 1 +.loop + ld a, [hli] + or [hl] + jr nz, .ok + add hl, bc + jr .loop + +.ok +; to PartyMonLevel +rept 4 + dec hl +endr + + ld a, [wCurPartyLevel] + cp [hl] + jr nc, .encounter + and a + ret + +.encounter + scf + ret +; 2a200 + +LoadWildMonDataPointer: ; 2a200 + call CheckOnWater + jr z, _WaterWildmonLookup + +_GrassWildmonLookup: ; 2a205 + ld hl, SwarmGrassWildMons + ld bc, GRASS_WILDDATA_LENGTH + call _SwarmWildmonCheck + ret c + ld hl, JohtoGrassWildMons + ld de, KantoGrassWildMons + call _JohtoWildmonCheck + ld bc, GRASS_WILDDATA_LENGTH + jr _NormalWildmonOK + +_WaterWildmonLookup: ; 2a21d + ld hl, SwarmWaterWildMons + ld bc, WATER_WILDDATA_LENGTH + call _SwarmWildmonCheck + ret c + ld hl, JohtoWaterWildMons + ld de, KantoWaterWildMons + call _JohtoWildmonCheck + ld bc, WATER_WILDDATA_LENGTH + jr _NormalWildmonOK + +_JohtoWildmonCheck + call IsInJohto + and a + ret z + ld h, d + ld l, e + ret + +_SwarmWildmonCheck + call CopyCurrMapDE + push hl + ld hl, wSwarmFlags + bit SWARMFLAGS_DUNSPARCE_SWARM_F, [hl] + pop hl + jr z, .CheckYanma + ld a, [wDunsparceMapGroup] + cp d + jr nz, .CheckYanma + ld a, [wDunsparceMapNumber] + cp e + jr nz, .CheckYanma + call LookUpWildmonsForMapDE + jr nc, _NoSwarmWildmon + scf + ret + +.CheckYanma: + push hl + ld hl, wSwarmFlags + bit SWARMFLAGS_YANMA_SWARM_F, [hl] + pop hl + jr z, _NoSwarmWildmon + ld a, [wYanmaMapGroup] + cp d + jr nz, _NoSwarmWildmon + ld a, [wYanmaMapNumber] + cp e + jr nz, _NoSwarmWildmon + call LookUpWildmonsForMapDE + jr nc, _NoSwarmWildmon + scf + ret + +_NoSwarmWildmon + and a + ret + +_NormalWildmonOK + call CopyCurrMapDE + jr LookUpWildmonsForMapDE +; 2a27f + +CopyCurrMapDE: ; 2a27f + ld a, [wMapGroup] + ld d, a + ld a, [wMapNumber] + ld e, a + ret +; 2a288 + +LookUpWildmonsForMapDE: ; 2a288 +.loop + push hl + ld a, [hl] + inc a + jr z, .nope + ld a, d + cp [hl] + jr nz, .next + inc hl + ld a, e + cp [hl] + jr z, .yup + +.next + pop hl + add hl, bc + jr .loop + +.nope + pop hl + and a + ret + +.yup + pop hl + scf + ret +; 2a2a0 + + +InitRoamMons: ; 2a2a0 +; initialize wRoamMon structs + +; species + ld a, RAIKOU + ld [wRoamMon1Species], a + ld a, ENTEI + ld [wRoamMon2Species], a + +; level + ld a, 40 + ld [wRoamMon1Level], a + ld [wRoamMon2Level], a + +; raikou starting map + ld a, GROUP_ROUTE_42 + ld [wRoamMon1MapGroup], a + ld a, MAP_ROUTE_42 + ld [wRoamMon1MapNumber], a + +; entei starting map + ld a, GROUP_ROUTE_37 + ld [wRoamMon2MapGroup], a + ld a, MAP_ROUTE_37 + ld [wRoamMon2MapNumber], a + +; hp + xor a ; generate new stats + ld [wRoamMon1HP], a + ld [wRoamMon2HP], a + + ret +; 2a2ce + + +CheckEncounterRoamMon: ; 2a2ce + push hl +; Don't trigger an encounter if we're on water. + call CheckOnWater + jr z, .DontEncounterRoamMon +; Load the current map group and number to de + call CopyCurrMapDE +; Randomly select a beast. + call Random + cp 100 ; 25/64 chance + jr nc, .DontEncounterRoamMon + and %00000011 ; Of that, a 3/4 chance. Running total: 75/256, or around 29.3%. + jr z, .DontEncounterRoamMon + dec a ; 1/3 chance that it's Entei, 1/3 chance that it's Raikou +; Compare its current location with yours + ld hl, wRoamMon1MapGroup + ld c, a + ld b, 0 + ld a, 7 ; length of the roam_struct + call AddNTimes + ld a, d + cp [hl] + jr nz, .DontEncounterRoamMon + inc hl + ld a, e + cp [hl] + jr nz, .DontEncounterRoamMon +; We've decided to take on a beast, so stage its information for battle. + dec hl + dec hl + dec hl + ld a, [hli] + ld [wTempWildMonSpecies], a + ld a, [hl] + ld [wCurPartyLevel], a + ld a, BATTLETYPE_ROAMING + ld [wBattleType], a + + pop hl + scf + ret + +.DontEncounterRoamMon: + pop hl + and a + ret +; 2a30d + + +UpdateRoamMons: ; 2a30d + ld a, [wRoamMon1MapGroup] + cp GROUP_N_A + jr z, .SkipRaikou + ld b, a + ld a, [wRoamMon1MapNumber] + ld c, a + call .Update + ld a, b + ld [wRoamMon1MapGroup], a + ld a, c + ld [wRoamMon1MapNumber], a + +.SkipRaikou: + ld a, [wRoamMon2MapGroup] + cp GROUP_N_A + jr z, .SkipEntei + ld b, a + ld a, [wRoamMon2MapNumber] + ld c, a + call .Update + ld a, b + ld [wRoamMon2MapGroup], a + ld a, c + ld [wRoamMon2MapNumber], a + +.SkipEntei: + ld a, [wRoamMon3MapGroup] + cp GROUP_N_A + jr z, .Finished + ld b, a + ld a, [wRoamMon3MapNumber] + ld c, a + call .Update + ld a, b + ld [wRoamMon3MapGroup], a + ld a, c + ld [wRoamMon3MapNumber], a + +.Finished: + jp _BackUpMapIndices +; 2a355 + + +.Update: ; 2a355 + ld hl, RoamMaps +.loop +; Are we at the end of the table? + ld a, [hl] + cp -1 + ret z +; Is this the correct entry? + ld a, b + cp [hl] + jr nz, .next + inc hl + ld a, c + cp [hl] + jr z, .yes +; We don't have the correct entry yet, so let's continue. A 0 terminates each entry. +.next + ld a, [hli] + and a + jr nz, .next + jr .loop + +; We have the correct entry now, so let's choose a random map from it. +.yes + inc hl + ld d, h + ld e, l +.update_loop + ld h, d + ld l, e +; Choose which map to warp to. + call Random + and %00011111 ; 1/8n chance it moves to a completely random map, where n is the number of roaming connections from the current map. + jr z, JumpRoamMon + and %11 + cp [hl] + jr nc, .update_loop ; invalid index, try again + inc hl + ld c, a + ld b, $0 + add hl, bc + add hl, bc + ld a, [wRoamMons_LastMapGroup] + cp [hl] + jr nz, .done + inc hl + ld a, [wRoamMons_LastMapNumber] + cp [hl] + jr z, .update_loop + dec hl + +.done + ld a, [hli] + ld b, a + ld c, [hl] + ret + +JumpRoamMons: ; 2a394 + ld a, [wRoamMon1MapGroup] + cp GROUP_N_A + jr z, .SkipRaikou + call JumpRoamMon + ld a, b + ld [wRoamMon1MapGroup], a + ld a, c + ld [wRoamMon1MapNumber], a + +.SkipRaikou: + ld a, [wRoamMon2MapGroup] + cp GROUP_N_A + jr z, .SkipEntei + call JumpRoamMon + ld a, b + ld [wRoamMon2MapGroup], a + ld a, c + ld [wRoamMon2MapNumber], a + +.SkipEntei: + ld a, [wRoamMon3MapGroup] + cp GROUP_N_A + jr z, .Finished + call JumpRoamMon + ld a, b + ld [wRoamMon3MapGroup], a + ld a, c + ld [wRoamMon3MapNumber], a + +.Finished: + jp _BackUpMapIndices + +JumpRoamMon: ; 2a3cd +.loop + ld hl, RoamMaps +.innerloop1 ; This loop happens to be unnecessary. + call Random ; Choose a random number. + maskbits NUM_ROAMMON_MAPS ; Mask the number to limit it between 0 and 15. + cp NUM_ROAMMON_MAPS ; If the number is not less than 16, try again. + jr nc, .innerloop1 ; I'm sure you can guess why this check is bogus. + inc a + ld b, a +.innerloop2 ; Loop to get hl to the address of the chosen roam map. + dec b + jr z, .ok +.innerloop3 ; Loop to skip the current roam map, which is terminated by a 0. + ld a, [hli] + and a + jr nz, .innerloop3 + jr .innerloop2 +; Check to see if the selected map is the one the player is currently in. If so, try again. +.ok + ld a, [wMapGroup] + cp [hl] + jr nz, .done + inc hl + ld a, [wMapNumber] + cp [hl] + jr z, .loop + dec hl +; Return the map group and number in bc. +.done + ld a, [hli] + ld b, a + ld c, [hl] + ret +; 2a3f6 + +_BackUpMapIndices: ; 2a3f6 + ld a, [wRoamMons_CurrentMapNumber] + ld [wRoamMons_LastMapNumber], a + ld a, [wRoamMons_CurrentMapGroup] + ld [wRoamMons_LastMapGroup], a + ld a, [wMapNumber] + ld [wRoamMons_CurrentMapNumber], a + ld a, [wMapGroup] + ld [wRoamMons_CurrentMapGroup], a + ret +; 2a40f + + +INCLUDE "data/wild/roammon_maps.asm" + + +ValidateTempWildMonSpecies: ; 2a4a0 +; Due to a development oversight, this function is called with the wild Pokemon's level, not its species, in a. + and a + jr z, .nowildmon ; = 0 + cp NUM_POKEMON + 1 ; 252 + jr nc, .nowildmon ; >= 252 + and a ; 1 <= Species <= 251 + ret + +.nowildmon + scf + ret +; 2a4ab + +; Finds a rare wild Pokemon in the route of the trainer calling, then checks if it's been Seen already. +; The trainer will then tell you about the Pokemon if you haven't seen it. +RandomUnseenWildMon: ; 2a4ab + farcall GetCallerLocation + ld d, b + ld e, c + ld hl, JohtoGrassWildMons + ld bc, GRASS_WILDDATA_LENGTH + call LookUpWildmonsForMapDE + jr c, .GetGrassmon + ld hl, KantoGrassWildMons + call LookUpWildmonsForMapDE + jr nc, .done + +.GetGrassmon: + push hl + ld bc, 5 + 4 * 2 ; Location of the level of the 5th wild Pokemon in that map + add hl, bc + ld a, [wTimeOfDay] + ld bc, NUM_GRASSMON * 2 + call AddNTimes +.randloop1 + call Random + and %11 + jr z, .randloop1 + dec a + ld c, a + ld b, $0 + add hl, bc + add hl, bc +; We now have the pointer to one of the last (rarest) three wild Pokemon found in that area. + inc hl + ld c, [hl] ; Contains the species index of this rare Pokemon + pop hl + ld de, 5 + 0 * 2 + add hl, de + inc hl ; Species index of the most common Pokemon on that route + ld b, 4 +.loop2 + ld a, [hli] + cp c ; Compare this most common Pokemon with the rare one stored in c. + jr z, .done + inc hl + dec b + jr nz, .loop2 +; This Pokemon truly is rare. + push bc + dec c + ld a, c + call CheckSeenMon + pop bc + jr nz, .done +; Since we haven't seen it, have the caller tell us about it. + ld de, wStringBuffer1 + call CopyName1 + ld a, c + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, .SawRareMonText + call PrintText + xor a + ld [wScriptVar], a + ret + +.done + ld a, $1 + ld [wScriptVar], a + ret + +.SawRareMonText: + ; I just saw some rare @ in @ . I'll call you if I see another rare #MON, OK? + text_jump UnknownText_0x1bd34b + db "@" +; 0x2a51f + +RandomPhoneWildMon: ; 2a51f + farcall GetCallerLocation + ld d, b + ld e, c + ld hl, JohtoGrassWildMons + ld bc, GRASS_WILDDATA_LENGTH + call LookUpWildmonsForMapDE + jr c, .ok + ld hl, KantoGrassWildMons + call LookUpWildmonsForMapDE + +.ok + ld bc, 5 + 0 * 2 + add hl, bc + ld a, [wTimeOfDay] + inc a + ld bc, NUM_GRASSMON * 2 +.loop + dec a + jr z, .done + add hl, bc + jr .loop + +.done + call Random + and %11 + ld c, a + ld b, $0 + add hl, bc + add hl, bc + inc hl + ld a, [hl] + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wStringBuffer4 + ld bc, MON_NAME_LENGTH + jp CopyBytes +; 2a567 + +RandomPhoneMon: ; 2a567 +; Get a random monster owned by the trainer who's calling. + farcall GetCallerLocation + ld hl, TrainerGroups + ld a, d + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, BANK(TrainerGroups) + call GetFarHalfword + +.skip_trainer + dec e + jr z, .skipped +.skip + ld a, BANK(Trainers) + call GetFarByte + inc hl + cp -1 + jr nz, .skip + jr .skip_trainer +.skipped + +.skip_name + ld a, BANK(Trainers) + call GetFarByte + inc hl + cp "@" + jr nz, .skip_name + + ld a, BANK(Trainers) + call GetFarByte + inc hl + ld bc, 2 ; level, species + cp TRAINERTYPE_NORMAL + jr z, .got_mon_length + ld bc, 2 + NUM_MOVES ; level, species, moves + cp TRAINERTYPE_MOVES + jr z, .got_mon_length + ld bc, 2 + 1 ; level, species, item + cp TRAINERTYPE_ITEM + jr z, .got_mon_length + ; TRAINERTYPE_ITEM_MOVES + ld bc, 2 + 1 + NUM_MOVES ; level, species, item, moves +.got_mon_length + + ld e, 0 + push hl +.count_mon + inc e + add hl, bc + ld a, BANK(Trainers) + call GetFarByte + cp -1 + jr nz, .count_mon + pop hl + +.rand + call Random + maskbits PARTY_LENGTH + cp e + jr nc, .rand + + inc a +.get_mon + dec a + jr z, .got_mon + add hl, bc + jr .get_mon +.got_mon + + inc hl ; species + ld a, BANK(Trainers) + call GetFarByte + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wStringBuffer4 + ld bc, MON_NAME_LENGTH + jp CopyBytes +; 2a5e9 + + +INCLUDE "data/wild/johto_grass.asm" +INCLUDE "data/wild/johto_water.asm" +INCLUDE "data/wild/kanto_grass.asm" +INCLUDE "data/wild/kanto_water.asm" +INCLUDE "data/wild/swarm_grass.asm" +INCLUDE "data/wild/swarm_water.asm" diff --git a/engine/pack.asm b/engine/pack.asm deleted file mode 100644 index ea3a051ac..000000000 --- a/engine/pack.asm +++ /dev/null @@ -1,1711 +0,0 @@ -; Pack.Jumptable and BattlePack.Jumptable indexes - const_def - const PACKSTATE_INITGFX ; 0 - const PACKSTATE_INITITEMSPOCKET ; 1 - const PACKSTATE_ITEMSPOCKETMENU ; 2 - const PACKSTATE_INITBALLSPOCKET ; 3 - const PACKSTATE_BALLSPOCKETMENU ; 4 - const PACKSTATE_INITKEYITEMSPOCKET ; 5 - const PACKSTATE_KEYITEMSPOCKETMENU ; 6 - const PACKSTATE_INITTMHMPOCKET ; 7 - const PACKSTATE_TMHMPOCKETMENU ; 8 - const PACKSTATE_QUITNOSCRIPT ; 9 - const PACKSTATE_QUITRUNSCRIPT ; 10 - -Pack: ; 10000 - ld hl, wOptions - set NO_TEXT_SCROLL, [hl] - call InitPackBuffers -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call .RunJumptable - call DelayFrame - jr .loop - -.done - ld a, [wCurrPocket] - ld [wLastPocket], a - ld hl, wOptions - res NO_TEXT_SCROLL, [hl] - ret -; 10026 - -.RunJumptable: ; 10026 - ld a, [wJumptableIndex] - ld hl, .Jumptable - call Pack_GetJumptablePointer - jp hl - -; 10030 - -.Jumptable: ; 10030 (4:4030) -; entries correspond to PACKSTATE_* constants - dw .InitGFX ; 0 - dw .InitItemsPocket ; 1 - dw .ItemsPocketMenu ; 2 - dw .InitBallsPocket ; 3 - dw .BallsPocketMenu ; 4 - dw .InitKeyItemsPocket ; 5 - dw .KeyItemsPocketMenu ; 6 - dw .InitTMHMPocket ; 7 - dw .TMHMPocketMenu ; 8 - dw Pack_QuitNoScript ; 9 - dw Pack_QuitRunScript ; 10 - -.InitGFX: ; 10046 (4:4046) - xor a - ld [hBGMapMode], a - call Pack_InitGFX - ld a, [wPackJumptableIndex] - ld [wJumptableIndex], a - call Pack_InitColors - ret - -.InitItemsPocket: ; 10056 (4:4056) - xor a ; ITEM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.ItemsPocketMenu: ; 10067 (4:4067) - ld hl, ItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wItemsPocketCursor], a - ld b, PACKSTATE_INITTMHMPOCKET ; left - ld c, PACKSTATE_INITBALLSPOCKET ; right - call Pack_InterpretJoypad - ret c - call .ItemBallsKey_LoadSubmenu - ret - -.InitKeyItemsPocket: ; 10094 (4:4094) - ld a, KEY_ITEM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.KeyItemsPocketMenu: ; 100a6 (4:40a6) - ld hl, KeyItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wKeyItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wKeyItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wKeyItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wKeyItemsPocketCursor], a - ld b, PACKSTATE_INITBALLSPOCKET ; left - ld c, PACKSTATE_INITTMHMPOCKET ; right - call Pack_InterpretJoypad - ret c - call .ItemBallsKey_LoadSubmenu - ret - -.InitTMHMPocket: ; 100d3 (4:40d3) - ld a, TM_HM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - xor a - ld [hBGMapMode], a - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.TMHMPocketMenu: ; 100e8 (4:40e8) - farcall TMHMPocket - ld b, PACKSTATE_INITKEYITEMSPOCKET ; left - ld c, PACKSTATE_INITITEMSPOCKET ; right - call Pack_InterpretJoypad - ret c - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .use_quit - ld hl, .MenuHeader2 - ld de, .Jumptable2 - jr .load_jump - -.use_quit - ld hl, .MenuHeader1 - ld de, .Jumptable1 -.load_jump - push de - call LoadMenuHeader - call VerticalMenu - call ExitMenu - pop hl - ret c - ld a, [wMenuCursorY] - dec a - call Pack_GetJumptablePointer - jp hl - -; 10124 (4:4124) -.MenuHeader1: ; 0x10124 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData_1 - db 1 ; default option -; 0x1012c - -.MenuData_1: ; 0x1012c - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "USE@" - db "QUIT@" -; 0x10137 - -.Jumptable1: ; 10137 - dw .UseItem - dw QuitItemSubmenu - -; 1013b - -.MenuHeader2: ; 0x1013b - db MENU_BACKUP_TILES ; flags - menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData_2 - db 1 ; default option -; 0x10143 - -.MenuData_2: ; 0x10143 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 3 ; items - db "USE@" - db "GIVE@" - db "QUIT@" -; 0x10153 - -.Jumptable2: ; 10153 - dw .UseItem - dw GiveItem - dw QuitItemSubmenu -; 10159 - -.UseItem: ; 10159 - farcall AskTeachTMHM - ret c - farcall ChooseMonToLearnTMHM - jr c, .declined - ld hl, wOptions - ld a, [hl] - push af - res NO_TEXT_SCROLL, [hl] - farcall TeachTMHM - pop af - ld [wOptions], a -.declined - xor a - ld [hBGMapMode], a - call Pack_InitGFX - call WaitBGMap_DrawPackGFX - call Pack_InitColors - ret - -.InitBallsPocket: ; 10186 (4:4186) - ld a, BALL_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.BallsPocketMenu: ; 10198 (4:4198) - ld hl, BallsPocketMenuHeader - call CopyMenuHeader - ld a, [wBallsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wBallsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wBallsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wBallsPocketCursor], a - ld b, PACKSTATE_INITITEMSPOCKET ; left - ld c, PACKSTATE_INITKEYITEMSPOCKET ; right - call Pack_InterpretJoypad - ret c - call .ItemBallsKey_LoadSubmenu - ret - -.ItemBallsKey_LoadSubmenu: ; 101c5 (4:41c5) - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .tossable - farcall CheckSelectableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .selectable - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .usable - jr .unusable - -.selectable - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .selectable_usable - jr .selectable_unusable - -.tossable - farcall CheckSelectableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .tossable_selectable - jr .tossable_unselectable - -.usable - ld hl, MenuHeader_UsableKeyItem - ld de, Jumptable_UseGiveTossRegisterQuit - jr .build_menu - -.selectable_usable - ld hl, MenuHeader_UsableItem - ld de, Jumptable_UseGiveTossQuit - jr .build_menu - -.tossable_selectable - ld hl, MenuHeader_UnusableItem - ld de, Jumptable_UseQuit - jr .build_menu - -.tossable_unselectable - ld hl, MenuHeader_UnusableKeyItem - ld de, Jumptable_UseRegisterQuit - jr .build_menu - -.unusable - ld hl, MenuHeader_HoldableKeyItem - ld de, Jumptable_GiveTossRegisterQuit - jr .build_menu - -.selectable_unusable - ld hl, MenuHeader_HoldableItem - ld de, Jumptable_GiveTossQuit -.build_menu - push de - call LoadMenuHeader - call VerticalMenu - call ExitMenu - pop hl - ret c - ld a, [wMenuCursorY] - dec a - call Pack_GetJumptablePointer - jp hl - -; 10249 (4:4249) -MenuHeader_UsableKeyItem: ; 0x10249 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10251 - -.MenuData: ; 0x10251 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 5 ; items - db "USE@" - db "GIVE@" - db "TOSS@" - db "SEL@" - db "QUIT@" -; 0x1026a - -Jumptable_UseGiveTossRegisterQuit: ; 1026a - dw UseItem - dw GiveItem - dw TossMenu - dw RegisterItem - dw QuitItemSubmenu -; 10274 - -MenuHeader_UsableItem: ; 0x10274 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x1027c - -.MenuData: ; 0x1027c - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 4 ; items - db "USE@" - db "GIVE@" - db "TOSS@" - db "QUIT@" -; 0x10291 - -Jumptable_UseGiveTossQuit: ; 10291 - dw UseItem - dw GiveItem - dw TossMenu - dw QuitItemSubmenu -; 10299 - -MenuHeader_UnusableItem: ; 0x10299 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x102a1 - -.MenuData: ; 0x102a1 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "USE@" - db "QUIT@" -; 0x102ac - -Jumptable_UseQuit: ; 102ac - dw UseItem - dw QuitItemSubmenu -; 102b0 - -MenuHeader_UnusableKeyItem: ; 0x102b0 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x102b8 - -.MenuData: ; 0x102b8 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 3 ; items - db "USE@" - db "SEL@" - db "QUIT@" -; 0x102c7 - -Jumptable_UseRegisterQuit: ; 102c7 - dw UseItem - dw RegisterItem - dw QuitItemSubmenu -; 102cd - -MenuHeader_HoldableKeyItem: ; 0x102cd - db MENU_BACKUP_TILES ; flags - menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x102d5 - -.MenuData: ; 0x102d5 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 4 ; items - db "GIVE@" - db "TOSS@" - db "SEL@" - db "QUIT@" -; 0x102ea - -Jumptable_GiveTossRegisterQuit: ; 102ea - dw GiveItem - dw TossMenu - dw RegisterItem - dw QuitItemSubmenu -; 102f2 - -MenuHeader_HoldableItem: ; 0x102f2 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x102fa - -.MenuData: ; 0x102fa - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 3 ; items - db "GIVE@" - db "TOSS@" - db "QUIT@" -; 0x1030b - -Jumptable_GiveTossQuit: ; 1030b - dw GiveItem - dw TossMenu - dw QuitItemSubmenu - -; 10311 - -UseItem: ; 10311 - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - ld hl, .dw - rst JumpTable - ret -; 1031f - -.dw ; 1031f (4:431f) -; entries correspond to ITEMMENU_* constants - dw .Oak ; ITEMMENU_NOUSE - dw .Oak - dw .Oak - dw .Oak - dw .Current ; ITEMMENU_CURRENT - dw .Party ; ITEMMENU_PARTY - dw .Field ; ITEMMENU_CLOSE -; 1035c - -.Oak: ; 1032d (4:432d) - ld hl, Text_ThisIsntTheTime - call Pack_PrintTextNoScroll - ret - -.Current: ; 10334 (4:4334) - call DoItemEffect - ret - -.Party: ; 10338 (4:4338) - ld a, [wPartyCount] - and a - jr z, .NoPokemon - call DoItemEffect - xor a - ld [hBGMapMode], a - call Pack_InitGFX - call WaitBGMap_DrawPackGFX - call Pack_InitColors - ret - -.NoPokemon: - ld hl, TextJump_YouDontHaveAMon - call Pack_PrintTextNoScroll - ret - -.Field: ; 10355 (4:4355) - call DoItemEffect - ld a, [wItemEffectSucceeded] - and a - jr z, .Oak - ld a, PACKSTATE_QUITRUNSCRIPT - ld [wJumptableIndex], a - ret -; 10364 (4:4364) - -TossMenu: ; 10364 - ld hl, Text_ThrowAwayHowMany - call Pack_PrintTextNoScroll - farcall SelectQuantityToToss - push af - call ExitMenu - pop af - jr c, .finish - call Pack_GetItemName - ld hl, Text_ConfirmThrowAway - call MenuTextBox - call YesNoBox - push af - call ExitMenu - pop af - jr c, .finish - ld hl, wNumItems - ld a, [wCurItemQuantity] - call TossItem - call Pack_GetItemName - ld hl, Text_ThrewAway - call Pack_PrintTextNoScroll -.finish - ret -; 1039d - -Unreferenced_ResetPocketCursorPositions: ; 1039d - ld a, [wCurrPocket] - and a ; ITEM_POCKET - jr z, .items - dec a ; BALL_POCKET - jr z, .balls - dec a ; KEY_ITEM_POCKET - jr z, .key - ret - -.balls - xor a - ld [wBallsPocketCursor], a - ld [wBallsPocketScrollPosition], a - ret - -.items - xor a - ld [wItemsPocketCursor], a - ld [wItemsPocketScrollPosition], a - ret - -.key - xor a - ld [wKeyItemsPocketCursor], a - ld [wKeyItemsPocketScrollPosition], a - ret -; 103c2 - -RegisterItem: ; 103c2 - farcall CheckSelectableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .cant_register - ld a, [wCurrPocket] - rrca - rrca - and $c0 - ld b, a - ld a, [wCurItemQuantity] - inc a - and $3f - or b - ld [wWhichRegisteredItem], a - ld a, [wCurItem] - ld [wRegisteredItem], a - call Pack_GetItemName - ld de, SFX_FULL_HEAL - call WaitPlaySFX - ld hl, Text_RegisteredItem - call Pack_PrintTextNoScroll - ret - -.cant_register - ld hl, Text_CantRegister - call Pack_PrintTextNoScroll - ret -; 103fd - -GiveItem: ; 103fd - ld a, [wPartyCount] - and a - jp z, .NoPokemon - ld a, [wOptions] - push af - res NO_TEXT_SCROLL, a - ld [wOptions], a - ld a, PARTYMENUACTION_GIVE_ITEM - ld [wPartyMenuActionText], a - call ClearBGPalettes - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX -.loop - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes - call DelayFrame - farcall PartyMenuSelect - jr c, .finish - ld a, [wCurPartySpecies] - cp EGG - jr nz, .give - ld hl, .Egg - call PrintText - jr .loop - -.give - ld a, [wJumptableIndex] - push af - ld a, [wPackJumptableIndex] - push af - call GetCurNick - ld hl, wStringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - call TryGiveItemToPartymon - pop af - ld [wPackJumptableIndex], a - pop af - ld [wJumptableIndex], a -.finish - pop af - ld [wOptions], a - xor a - ld [hBGMapMode], a - call Pack_InitGFX - call WaitBGMap_DrawPackGFX - call Pack_InitColors - ret - -.NoPokemon: ; 10486 (4:4486) - ld hl, TextJump_YouDontHaveAMon - call Pack_PrintTextNoScroll - ret -; 1048d (4:448d) -.Egg: ; 0x1048d - ; An EGG can't hold an item. - text_jump Text_AnEGGCantHoldAnItem - db "@" -; 0x10492 - -QuitItemSubmenu: ; 10492 - ret -; 10493 - -BattlePack: ; 10493 - ld hl, wOptions - set NO_TEXT_SCROLL, [hl] - call InitPackBuffers -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .end - call .RunJumptable - call DelayFrame - jr .loop - -.end - ld a, [wCurrPocket] - ld [wLastPocket], a - ld hl, wOptions - res NO_TEXT_SCROLL, [hl] - ret -; 104b9 - -.RunJumptable: ; 104b9 - ld a, [wJumptableIndex] - ld hl, .Jumptable - call Pack_GetJumptablePointer - jp hl - -; 104c3 - -.Jumptable: ; 104c3 (4:44c3) -; entries correspond to PACKSTATE_* constants - dw .InitGFX ; 0 - dw .InitItemsPocket ; 1 - dw .ItemsPocketMenu ; 2 - dw .InitBallsPocket ; 3 - dw .BallsPocketMenu ; 4 - dw .InitKeyItemsPocket ; 5 - dw .KeyItemsPocketMenu ; 6 - dw .InitTMHMPocket ; 7 - dw .TMHMPocketMenu ; 8 - dw Pack_QuitNoScript ; 9 - dw Pack_QuitRunScript ; 10 - -.InitGFX: ; 104d9 (4:44d9) - xor a - ld [hBGMapMode], a - call Pack_InitGFX - ld a, [wPackJumptableIndex] - ld [wJumptableIndex], a - call Pack_InitColors - ret - -.InitItemsPocket: ; 104e9 (4:44e9) - xor a ; ITEM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.ItemsPocketMenu: ; 104fa (4:44fa) - ld hl, ItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wItemsPocketCursor], a - ld b, PACKSTATE_INITTMHMPOCKET ; left - ld c, PACKSTATE_INITBALLSPOCKET ; right - call Pack_InterpretJoypad - ret c - call ItemSubmenu - ret - -.InitKeyItemsPocket: ; 10527 (4:4527) - ld a, KEY_ITEM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.KeyItemsPocketMenu: ; 10539 (4:4539) - ld hl, KeyItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wKeyItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wKeyItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wKeyItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wKeyItemsPocketCursor], a - ld b, PACKSTATE_INITBALLSPOCKET ; left - ld c, PACKSTATE_INITTMHMPOCKET ; right - call Pack_InterpretJoypad - ret c - call ItemSubmenu - ret - -.InitTMHMPocket: ; 10566 (4:4566) - ld a, TM_HM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - xor a - ld [hBGMapMode], a - call WaitBGMap_DrawPackGFX - ld hl, Text_PackEmptyString - call Pack_PrintTextNoScroll - call Pack_JumptableNext - ret - -.TMHMPocketMenu: ; 10581 (4:4581) - farcall TMHMPocket - ld b, PACKSTATE_INITKEYITEMSPOCKET ; left - ld c, PACKSTATE_INITITEMSPOCKET ; right - call Pack_InterpretJoypad - ret c - xor a - call TMHMSubmenu - ret - -.InitBallsPocket: ; 10594 (4:4594) - ld a, BALL_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.BallsPocketMenu: ; 105a6 (4:45a6) - ld hl, BallsPocketMenuHeader - call CopyMenuHeader - ld a, [wBallsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wBallsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wBallsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wBallsPocketCursor], a - ld b, PACKSTATE_INITITEMSPOCKET ; left - ld c, PACKSTATE_INITKEYITEMSPOCKET ; right - call Pack_InterpretJoypad - ret c - call ItemSubmenu - ret - -ItemSubmenu: ; 105d3 (4:45d3) - farcall CheckItemContext - ld a, [wItemAttributeParamBuffer] -TMHMSubmenu: ; 105dc (4:45dc) - and a - jr z, .NoUse - ld hl, .UsableMenuHeader - ld de, .UsableJumptable - jr .proceed - -.NoUse: - ld hl, .UnusableMenuHeader - ld de, .UnusableJumptable -.proceed - push de - call LoadMenuHeader - call VerticalMenu - call ExitMenu - pop hl - ret c - ld a, [wMenuCursorY] - dec a - call Pack_GetJumptablePointer - jp hl - -; 10601 (4:4601) -.UsableMenuHeader: ; 0x10601 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .UsableMenuData - db 1 ; default option -; 0x10609 - -.UsableMenuData: ; 0x10609 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "USE@" - db "QUIT@" -; 0x10614 - -.UsableJumptable: ; 10614 - dw .Use - dw .Quit -; 10618 - -.UnusableMenuHeader: ; 0x10618 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .UnusableMenuData - db 1 ; default option -; 0x10620 - -.UnusableMenuData: ; 0x10620 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 1 ; items - db "QUIT@" -; 0x10627 - -.UnusableJumptable: ; 10627 - dw .Quit -; 10629 - -.Use: ; 10629 - farcall CheckItemContext - ld a, [wItemAttributeParamBuffer] - ld hl, .ItemFunctionJumptable - rst JumpTable - ret - -.ItemFunctionJumptable: ; 10637 (4:4637) -; entries correspond to ITEMMENU_* constants - dw .Oak ; ITEMMENU_NOUSE - dw .Oak - dw .Oak - dw .Oak - dw .Unused ; ITEMMENU_CURRENT - dw .BattleField ; ITEMMENU_PARTY - dw .BattleOnly ; ITEMMENU_CLOSE - -.Oak: ; 10645 (4:4645) - ld hl, Text_ThisIsntTheTime - call Pack_PrintTextNoScroll - ret - -.Unused: ; 1064c (4:464c) - call DoItemEffect - ld a, [wItemEffectSucceeded] - and a - jr nz, .ReturnToBattle - ret - -.BattleField: ; 10656 (4:4656) - call DoItemEffect - ld a, [wItemEffectSucceeded] - and a - jr nz, .quit_run_script - xor a - ld [hBGMapMode], a - call Pack_InitGFX - call WaitBGMap_DrawPackGFX - call Pack_InitColors - ret - -.ReturnToBattle: ; 1066c (4:466c) - call ClearBGPalettes - jr .quit_run_script - -.BattleOnly: ; 10671 (4:4671) - call DoItemEffect - ld a, [wItemEffectSucceeded] - and a - jr z, .Oak - cp $2 - jr z, .didnt_use_item -.quit_run_script ; 1067e (4:467e) - ld a, PACKSTATE_QUITRUNSCRIPT - ld [wJumptableIndex], a - ret - -.didnt_use_item ; 10684 (4:4684) - xor a - ld [wItemEffectSucceeded], a - ret -; 10689 (4:4689) -.Quit: ; 10689 - ret -; 1068a - -InitPackBuffers: ; 1068a - xor a - ld [wJumptableIndex], a - ; pocket id -> jumptable index - ld a, [wLastPocket] - maskbits NUM_POCKETS - ld [wCurrPocket], a - inc a - add a - dec a - ld [wPackJumptableIndex], a - xor a ; FALSE - ld [wPackUsedItem], a - xor a - ld [wSwitchItem], a - ret -; 106a5 - -DepositSellInitPackBuffers: ; 106a5 - xor a - ld [hBGMapMode], a - ld [wJumptableIndex], a ; PACKSTATE_INITGFX - ld [wPackJumptableIndex], a ; PACKSTATE_INITGFX - ld [wCurrPocket], a ; ITEM_POCKET - ld [wPackUsedItem], a - ld [wSwitchItem], a - call Pack_InitGFX - call Pack_InitColors - ret -; 106be - -DepositSellPack: ; 106be -.loop - call .RunJumptable - call DepositSellTutorial_InterpretJoypad - jr c, .loop - ret -; 106c7 - -.RunJumptable: ; 106c7 - ld a, [wJumptableIndex] - ld hl, .Jumptable - call Pack_GetJumptablePointer - jp hl - -; 106d1 - -.Jumptable: ; 106d1 (4:46d1) -; entries correspond to *_POCKET constants - dw .ItemsPocket - dw .BallsPocket - dw .KeyItemsPocket - dw .TMHMPocket - -.ItemsPocket: ; 106d9 (4:46d9) - xor a ; ITEM_POCKET - call InitPocket - ld hl, PC_Mart_ItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wItemsPocketCursor], a - ret - -.KeyItemsPocket: ; 106ff (4:46ff) - ld a, KEY_ITEM_POCKET - call InitPocket - ld hl, PC_Mart_KeyItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wKeyItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wKeyItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wKeyItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wKeyItemsPocketCursor], a - ret - -.TMHMPocket: ; 10726 (4:4726) - ld a, TM_HM_POCKET - call InitPocket - call WaitBGMap_DrawPackGFX - farcall TMHMPocket - ld a, [wCurItem] - ld [wCurItem], a - ret - -.BallsPocket: ; 1073b (4:473b) - ld a, BALL_POCKET - call InitPocket - ld hl, PC_Mart_BallsPocketMenuHeader - call CopyMenuHeader - ld a, [wBallsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wBallsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wBallsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wBallsPocketCursor], a - ret - -InitPocket: ; 10762 (4:4762) - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - ret - -DepositSellTutorial_InterpretJoypad: ; 1076f - ld hl, wMenuJoypad - ld a, [hl] - and A_BUTTON - jr nz, .a_button - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and D_LEFT - jr nz, .d_left - ld a, [hl] - and D_RIGHT - jr nz, .d_right - scf - ret - -.a_button - ld a, TRUE - ld [wPackUsedItem], a - and a - ret - -.b_button - xor a ; FALSE - ld [wPackUsedItem], a - and a - ret - -.d_left - ld a, [wJumptableIndex] - dec a - maskbits NUM_POCKETS - ld [wJumptableIndex], a - push de - ld de, SFX_SWITCH_POCKETS - call PlaySFX - pop de - scf - ret - -.d_right - ld a, [wJumptableIndex] - inc a - maskbits NUM_POCKETS - ld [wJumptableIndex], a - push de - ld de, SFX_SWITCH_POCKETS - call PlaySFX - pop de - scf - ret -; 107bb - -TutorialPack: ; 107bb - call DepositSellInitPackBuffers - ld a, [wInputType] - or a - jr z, .loop - farcall _DudeAutoInput_RightA -.loop - call .RunJumptable - call DepositSellTutorial_InterpretJoypad - jr c, .loop - xor a ; FALSE - ld [wPackUsedItem], a - ret -; 107d7 - -.RunJumptable: ; 107d7 - ld a, [wJumptableIndex] - ld hl, .dw - call Pack_GetJumptablePointer - jp hl - -; 107e1 - -.dw ; 107e1 (4:47e1) -; entries correspond to *_POCKET constants - dw .Items - dw .Balls - dw .KeyItems - dw .TMHM - -.Items: ; 107e9 (4:47e9) - xor a ; ITEM_POCKET - ld hl, .ItemsMenuHeader - jr .DisplayPocket - -; 107ef (4:47ef) -.ItemsMenuHeader: ; 0x107ef - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .ItemsMenuData - db 1 ; default option -; 0x107f7 - -.ItemsMenuData: ; 0x107f7 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wDudeNumItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10807 - -.KeyItems: ; 10807 (4:4807) - ld a, KEY_ITEM_POCKET - ld hl, .KeyItemsMenuHeader - jr .DisplayPocket - -; 1080e (4:480e) -.KeyItemsMenuHeader: ; 0x1080e - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .KeyItemsMenuData - db 1 ; default option -; 0x10816 - -.KeyItemsMenuData: ; 0x10816 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wDudeNumKeyItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10826 - -.TMHM: ; 10826 (4:4826) - ld a, TM_HM_POCKET - call InitPocket - call WaitBGMap_DrawPackGFX - farcall TMHMPocket - ld a, [wCurItem] - ld [wCurItem], a - ret - -.Balls: ; 1083b (4:483b) - ld a, BALL_POCKET - ld hl, .BallsMenuHeader - jr .DisplayPocket - -; 10842 (4:4842) -.BallsMenuHeader: ; 0x10842 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .BallsMenuData - db 1 ; default option -; 0x1084a - -.BallsMenuData: ; 0x1084a - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wDudeNumBalls - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 1085a - -.DisplayPocket: ; 1085a (4:485a) - push hl - call InitPocket - pop hl - call CopyMenuHeader - call ScrollingMenu - ret - -Pack_JumptableNext: ; 10866 (4:4866) - ld hl, wJumptableIndex - inc [hl] - ret - -Pack_GetJumptablePointer: ; 1086b - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret -; 10874 - -Pack_QuitNoScript: ; 10874 (4:4874) - ld hl, wJumptableIndex - set 7, [hl] - xor a ; FALSE - ld [wPackUsedItem], a - ret - -Pack_QuitRunScript: ; 1087e (4:487e) - ld hl, wJumptableIndex - set 7, [hl] - ld a, TRUE - ld [wPackUsedItem], a - ret - -Pack_PrintTextNoScroll: ; 10889 (4:4889) - ld a, [wOptions] - push af - set NO_TEXT_SCROLL, a - ld [wOptions], a - call PrintText - pop af - ld [wOptions], a - ret - -WaitBGMap_DrawPackGFX: ; 1089a (4:489a) - call WaitBGMap -DrawPackGFX: ; 1089d - ld a, [wCurrPocket] - maskbits NUM_POCKETS - ld e, a - ld d, $0 - ld a, [wBattleType] - cp BATTLETYPE_TUTORIAL - jr z, .male_dude - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr nz, .female -.male_dude - ld hl, PackGFXPointers - add hl, de - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - ld hl, vTiles2 tile $50 - lb bc, BANK(PackGFX), 15 - call Request2bpp - ret - -.female - farcall DrawKrisPackGFX - ret -; 108cc - -PackGFXPointers: ; 108cc - dw PackGFX + (15 tiles) * 1 ; ITEM_POCKET - dw PackGFX + (15 tiles) * 3 ; BALL_POCKET - dw PackGFX + (15 tiles) * 0 ; KEY_ITEM_POCKET - dw PackGFX + (15 tiles) * 2 ; TM_HM_POCKET -; 108d4 - -Pack_InterpretJoypad: ; 108d4 (4:48d4) - ld hl, wMenuJoypad - ld a, [wSwitchItem] - and a - jr nz, .switching_item - ld a, [hl] - and A_BUTTON - jr nz, .a_button - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and D_LEFT - jr nz, .d_left - ld a, [hl] - and D_RIGHT - jr nz, .d_right - ld a, [hl] - and SELECT - jr nz, .select - scf - ret - -.a_button - and a - ret - -.b_button - ld a, PACKSTATE_QUITNOSCRIPT - ld [wJumptableIndex], a - scf - ret - -.d_left - ld a, b - ld [wJumptableIndex], a - ld [wPackJumptableIndex], a - push de - ld de, SFX_SWITCH_POCKETS - call PlaySFX - pop de - scf - ret - -.d_right - ld a, c - ld [wJumptableIndex], a - ld [wPackJumptableIndex], a - push de - ld de, SFX_SWITCH_POCKETS - call PlaySFX - pop de - scf - ret - -.select - farcall SwitchItemsInBag - ld hl, Text_MoveItemWhere - call Pack_PrintTextNoScroll - scf - ret - -.switching_item - ld a, [hl] - and A_BUTTON | SELECT - jr nz, .place_insert - ld a, [hl] - and B_BUTTON - jr nz, .end_switch - scf - ret - -.place_insert - farcall SwitchItemsInBag - ld de, SFX_SWITCH_POKEMON - call WaitPlaySFX - ld de, SFX_SWITCH_POKEMON - call WaitPlaySFX -.end_switch - xor a - ld [wSwitchItem], a - scf - ret - -Pack_InitGFX: ; 10955 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - ld hl, PackMenuGFX - ld de, vTiles2 - ld bc, $60 tiles - ld a, BANK(PackMenuGFX) - call FarCopyBytes -; Background (blue if male, pink if female) - hlcoord 0, 1 - ld bc, 11 * SCREEN_WIDTH - ld a, $24 - call ByteFill -; This is where the items themselves will be listed. - hlcoord 5, 1 - lb bc, 11, 15 - call ClearBox -; ◀▶ POCKET ▼▲ ITEMS - hlcoord 0, 0 - ld a, $28 - ld c, SCREEN_WIDTH -.loop - ld [hli], a - inc a - dec c - jr nz, .loop - call DrawPocketName - call PlacePackGFX -; Place the textbox for displaying the item description - hlcoord 0, SCREEN_HEIGHT - 4 - 2 - lb bc, 4, SCREEN_WIDTH - 2 - call TextBox - call EnableLCD - call DrawPackGFX - ret -; 109a5 - -PlacePackGFX: ; 109a5 - hlcoord 0, 3 - ld a, $50 - ld de, SCREEN_WIDTH - 5 - ld b, 3 -.row - ld c, 5 -.column - ld [hli], a - inc a - dec c - jr nz, .column - add hl, de - dec b - jr nz, .row - ret -; 109bb - -DrawPocketName: ; 109bb - ld a, [wCurrPocket] - ; * 15 - ld d, a - swap a - sub d - ld d, 0 - ld e, a - ld hl, .tilemap - add hl, de - ld d, h - ld e, l - hlcoord 0, 7 - ld c, 3 -.row - ld b, 5 -.col - ld a, [de] - inc de - ld [hli], a - dec b - jr nz, .col - ld a, c - ld c, SCREEN_WIDTH - 5 - add hl, bc - ld c, a - dec c - jr nz, .row - ret -; 109e1 - -.tilemap ; 109e1 -; ITEM_POCKET - db $00, $04, $04, $04, $01 ; top border - db $06, $07, $08, $09, $0a ; Items - db $02, $05, $05, $05, $03 ; bottom border -; BALL_POCKET - db $00, $04, $04, $04, $01 ; top border - db $15, $16, $17, $18, $19 ; Balls - db $02, $05, $05, $05, $03 ; bottom border -; KEY_ITEM_POCKET - db $00, $04, $04, $04, $01 ; top border - db $0b, $0c, $0d, $0e, $0f ; Key Items - db $02, $05, $05, $05, $03 ; bottom border -; TM_HM_POCKET - db $00, $04, $04, $04, $01 ; top border - db $10, $11, $12, $13, $14 ; TM/HM - db $02, $05, $05, $05, $03 ; bottom border -; 10a1d - -Pack_GetItemName: ; 10a1d - ld a, [wCurItem] - ld [wNamedObjectIndexBuffer], a - call GetItemName - call CopyName1 - ret -; 10a2a - -Unreferenced_Pack_ClearTilemap: ; 10a2a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, " " - call ByteFill - ret -; 10a36 - -ClearPocketList: ; 10a36 (4:4a36) - hlcoord 5, 2 - lb bc, 10, SCREEN_WIDTH - 5 - call ClearBox - ret - -Pack_InitColors: ; 10a40 - call WaitBGMap - ld b, SCGB_PACKPALS - call GetSGBLayout - call SetPalettes - call DelayFrame - ret -; 10a4f - -ItemsPocketMenuHeader: ; 0x10a4f - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10a57 - -.MenuData: ; 0x10a57 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wNumItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10a67 - -PC_Mart_ItemsPocketMenuHeader: ; 0x10a67 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10a6f - -.MenuData: ; 0x10a6f - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wNumItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10a7f - -KeyItemsPocketMenuHeader: ; 0x10a7f - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10a87 - -.MenuData: ; 0x10a87 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wNumKeyItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10a97 - -PC_Mart_KeyItemsPocketMenuHeader: ; 0x10a97 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10a9f - -.MenuData: ; 0x10a9f - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags - db 5, 8 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wNumKeyItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10aaf - -BallsPocketMenuHeader: ; 0x10aaf - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10ab7 - -.MenuData: ; 0x10ab7 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wNumBalls - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10ac7 - -PC_Mart_BallsPocketMenuHeader: ; 0x10ac7 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10acf - -.MenuData: ; 0x10acf - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wNumBalls - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10adf - -Text_PackNoItems: ; 0x10adf - ; No items. - text_jump UnknownText_0x1c0b9a - db "@" -; 0x10ae4 - -Text_ThrowAwayHowMany: ; 0x10ae4 - ; Throw away how many? - text_jump UnknownText_0x1c0ba5 - db "@" -; 0x10ae9 - -Text_ConfirmThrowAway: ; 0x10ae9 - ; Throw away @ @ (S)? - text_jump UnknownText_0x1c0bbb - db "@" -; 0x10aee - -Text_ThrewAway: ; 0x10aee - ; Threw away @ (S). - text_jump UnknownText_0x1c0bd8 - db "@" -; 0x10af3 - -Text_ThisIsntTheTime: ; 0x10af3 - ; OAK: ! This isn't the time to use that! - text_jump UnknownText_0x1c0bee - db "@" -; 0x10af8 - -TextJump_YouDontHaveAMon: ; 0x10af8 - ; You don't have a #MON! - text_jump Text_YouDontHaveAMon - db "@" -; 0x10afd - -Text_RegisteredItem: ; 0x10afd - ; Registered the @ . - text_jump UnknownText_0x1c0c2e - db "@" -; 0x10b02 - -Text_CantRegister: ; 0x10b02 - ; You can't register that item. - text_jump UnknownText_0x1c0c45 - db "@" -; 0x10b07 - -Text_MoveItemWhere: ; 0x10b07 - ; Where should this be moved to? - text_jump UnknownText_0x1c0c63 - db "@" -; 0x10b0c - -Text_PackEmptyString: ; 0x10b0c - ; - text_jump UnknownText_0x1c0c83 - db "@" -; 0x10b11 - -TextJump_YouCantUseItInABattle: ; 0x10b11 - ; Doesn't seem to be used anywhere - ; "You can't use it in a battle." - text_jump Text_YouCantUseItInABattle - db "@" -; 0x10b16 - -PackMenuGFX: -INCBIN "gfx/pack/pack_menu.2bpp" -PackGFX: -INCBIN "gfx/pack/pack.2bpp" diff --git a/engine/party_menu.asm b/engine/party_menu.asm deleted file mode 100644 index fc1783c71..000000000 --- a/engine/party_menu.asm +++ /dev/null @@ -1,932 +0,0 @@ -SelectMonFromParty: ; 50000 - call DisableSpriteUpdates - xor a - ld [wPartyMenuActionText], a - call ClearBGPalettes - call InitPartyMenuLayout - call WaitBGMap - call SetPalettes - call DelayFrame - call PartyMenuSelect - call ReturnToMapWithSpeechTextbox - ret -; 5001d - - -SelectTradeOrDayCareMon: ; 5001d - ld a, b - ld [wPartyMenuActionText], a - call DisableSpriteUpdates - call ClearBGPalettes - call InitPartyMenuLayout - call WaitBGMap - ld b, SCGB_PARTY_MENU - call GetSGBLayout - call SetPalettes - call DelayFrame - call PartyMenuSelect - call ReturnToMapWithSpeechTextbox - ret -; 5003f - -InitPartyMenuLayout: ; 5003f - call LoadPartyMenuGFX - call InitPartyMenuWithCancel - call InitPartyMenuGFX - call WritePartyMenuTilemap - call PrintPartyMenuText - ret -; 5004f - -LoadPartyMenuGFX: ; 5004f - call LoadFontsBattleExtra - callfar InitPartyMenuPalettes ; engine/color.asm - callfar ClearSpriteAnims2 - ret -; 5005f - - -WritePartyMenuTilemap: ; 0x5005f - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, " " - call ByteFill ; blank the tilemap - call GetPartyMenuQualityIndexes -.loop - ld a, [hli] - cp -1 - jr z, .end - push hl - ld hl, .Jumptable - rst JumpTable - pop hl - jr .loop -.end - pop af - ld [wOptions], a - ret -; 0x50089 - -.Jumptable: ; 50089 -; entries correspond to PARTYMENUQUALITY_* constants - dw PlacePartyNicknames - dw PlacePartyHPBar - dw PlacePartyMenuHPDigits - dw PlacePartyMonLevel - dw PlacePartyMonStatus - dw PlacePartyMonTMHMCompatibility - dw PlacePartyMonEvoStoneCompatibility - dw PlacePartyMonGender - dw PlacePartyMonMobileBattleSelection -; 5009b - -PlacePartyNicknames: ; 5009b - hlcoord 3, 1 - ld a, [wPartyCount] - and a - jr z, .end - ld c, a - ld b, $0 -.loop - push bc - push hl - push hl - ld hl, wPartyMonNicknames - ld a, b - call GetNick - pop hl - call PlaceString - pop hl - ld de, 2 * SCREEN_WIDTH - add hl, de - pop bc - inc b - dec c - jr nz, .loop - -.end - dec hl - dec hl - ld de, .CANCEL - call PlaceString - ret -; 500c8 - -.CANCEL: ; 500c8 - db "CANCEL@" -; 500cf - - -PlacePartyHPBar: ; 500cf - xor a - ld [wSGBPals], a - ld a, [wPartyCount] - and a - ret z - ld c, a - ld b, $0 - hlcoord 11, 2 -.loop - push bc - push hl - call PartyMenuCheckEgg - jr z, .skip - push hl - call PlacePartymonHPBar - pop hl - ld d, $6 - ld b, $0 - call DrawBattleHPBar - ld hl, wHPPals - ld a, [wSGBPals] - ld c, a - ld b, $0 - add hl, bc - call SetHPPal - ld b, SCGB_PARTY_MENU_HP_PALS - call GetSGBLayout -.skip - ld hl, wSGBPals - inc [hl] - pop hl - ld de, 2 * SCREEN_WIDTH - add hl, de - pop bc - inc b - dec c - jr nz, .loop - ld b, SCGB_PARTY_MENU - call GetSGBLayout - ret -; 50117 - -PlacePartymonHPBar: ; 50117 - ld a, b - ld bc, PARTYMON_STRUCT_LENGTH - ld hl, wPartyMon1HP - call AddNTimes - ld a, [hli] - or [hl] - jr nz, .not_fainted - xor a - ld e, a - ld c, a - ret - -.not_fainted - dec hl - ld a, [hli] - ld b, a - ld a, [hli] - ld c, a - ld a, [hli] - ld d, a - ld a, [hli] - ld e, a - predef ComputeHPBarPixels - ret -; 50138 - -PlacePartyMenuHPDigits: ; 50138 - ld a, [wPartyCount] - and a - ret z - ld c, a - ld b, $0 - hlcoord 13, 1 -.loop - push bc - push hl - call PartyMenuCheckEgg - jr z, .next - push hl - ld a, b - ld bc, PARTYMON_STRUCT_LENGTH - ld hl, wPartyMon1HP - call AddNTimes - ld e, l - ld d, h - pop hl - push de - lb bc, 2, 3 - call PrintNum - pop de - ld a, "/" - ld [hli], a - inc de - inc de - lb bc, 2, 3 - call PrintNum - -.next - pop hl - ld de, 2 * SCREEN_WIDTH - add hl, de - pop bc - inc b - dec c - jr nz, .loop - ret -; 50176 - -PlacePartyMonLevel: ; 50176 - ld a, [wPartyCount] - and a - ret z - ld c, a - ld b, 0 - hlcoord 8, 2 -.loop - push bc - push hl - call PartyMenuCheckEgg - jr z, .next - push hl - ld a, b - ld bc, PARTYMON_STRUCT_LENGTH - ld hl, wPartyMon1Level - call AddNTimes - ld e, l - ld d, h - pop hl - ld a, [de] - cp 100 ; This is distinct from MAX_LEVEL. - jr nc, .ThreeDigits - ld a, "" - ld [hli], a - lb bc, PRINTNUM_RIGHTALIGN | 1, 2 - ; jr .okay -.ThreeDigits: - lb bc, PRINTNUM_RIGHTALIGN | 1, 3 -; .okay - call PrintNum - -.next - pop hl - ld de, SCREEN_WIDTH * 2 - add hl, de - pop bc - inc b - dec c - jr nz, .loop - ret -; 501b2 - -PlacePartyMonStatus: ; 501b2 - ld a, [wPartyCount] - and a - ret z - ld c, a - ld b, 0 - hlcoord 5, 2 -.loop - push bc - push hl - call PartyMenuCheckEgg - jr z, .next - push hl - ld a, b - ld bc, PARTYMON_STRUCT_LENGTH - ld hl, wPartyMon1Status - call AddNTimes - ld e, l - ld d, h - pop hl - call PlaceStatusString - -.next - pop hl - ld de, SCREEN_WIDTH * 2 - add hl, de - pop bc - inc b - dec c - jr nz, .loop - ret -; 501e0 - -PlacePartyMonTMHMCompatibility: ; 501e0 - ld a, [wPartyCount] - and a - ret z - ld c, a - ld b, 0 - hlcoord 12, 2 -.loop - push bc - push hl - call PartyMenuCheckEgg - jr z, .next - push hl - ld hl, wPartySpecies - ld e, b - ld d, 0 - add hl, de - ld a, [hl] - ld [wCurPartySpecies], a - predef CanLearnTMHMMove - pop hl - call .PlaceAbleNotAble - call PlaceString - -.next - pop hl - ld de, SCREEN_WIDTH * 2 - add hl, de - pop bc - inc b - dec c - jr nz, .loop - ret -; 50215 - -.PlaceAbleNotAble: ; 50215 - ld a, c - and a - jr nz, .able - ld de, .string_not_able - ret - -.able - ld de, .string_able - ret -; 50221 - -.string_able ; 50221 - db "ABLE@" -; 50226 - -.string_not_able ; 50226 - db "NOT ABLE@" -; 5022f - - -PlacePartyMonEvoStoneCompatibility: ; 5022f - ld a, [wPartyCount] - and a - ret z - ld c, a - ld b, 0 - hlcoord 12, 2 -.loop - push bc - push hl - call PartyMenuCheckEgg - jr z, .next - push hl - ld a, b - ld bc, PARTYMON_STRUCT_LENGTH - ld hl, wPartyMon1Species - call AddNTimes - ld a, [hl] - dec a - ld e, a - ld d, 0 - ld hl, EvosAttacksPointers - add hl, de - add hl, de - call .DetermineCompatibility - pop hl - call PlaceString - -.next - pop hl - ld de, 2 * SCREEN_WIDTH - add hl, de - pop bc - inc b - dec c - jr nz, .loop - ret -; 50268 - -.DetermineCompatibility: ; 50268 - ld de, wStringBuffer1 - ld a, BANK(EvosAttacksPointers) - ld bc, 2 - call FarCopyBytes - ld hl, wStringBuffer1 - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wStringBuffer1 - ld a, BANK(EvosAttacks) - ld bc, 10 - call FarCopyBytes - ld hl, wStringBuffer1 -.loop2 - ld a, [hli] - and a - jr z, .nope - inc hl - inc hl - cp EVOLVE_ITEM - jr nz, .loop2 - dec hl - dec hl - ld a, [wCurItem] - cp [hl] - inc hl - inc hl - jr nz, .loop2 - ld de, .string_able - ret - -.nope - ld de, .string_not_able - ret -; 502a3 - -.string_able ; 502a3 - db "ABLE@" -; 502a8 -.string_not_able ; 502a8 - db "NOT ABLE@" -; 502b1 - - -PlacePartyMonGender: ; 502b1 - ld a, [wPartyCount] - and a - ret z - ld c, a - ld b, 0 - hlcoord 12, 2 -.loop - push bc - push hl - call PartyMenuCheckEgg - jr z, .next - ld [wCurPartySpecies], a - push hl - ld a, b - ld [wCurPartyMon], a - xor a - ld [wMonType], a - call GetGender - ld de, .unknown - jr c, .got_gender - ld de, .male - jr nz, .got_gender - ld de, .female - -.got_gender - pop hl - call PlaceString - -.next - pop hl - ld de, 2 * SCREEN_WIDTH - add hl, de - pop bc - inc b - dec c - jr nz, .loop - ret -; 502ee - -.male ; 502ee - db "♂…MALE@" -; 502f5 - -.female ; 502f5 - db "♀…FEMALE@" -; 502fe - -.unknown ; 502fe - db "…UNKNOWN@" -; 50307 - - -PlacePartyMonMobileBattleSelection: ; 50307 - ld a, [wPartyCount] - and a - ret z - ld c, a - ld b, 0 - hlcoord 12, 1 -.loop - push bc - push hl - ld de, .String_Sanka_Shinai - call PlaceString - pop hl - ld de, 2 * SCREEN_WIDTH - add hl, de - pop bc - inc b - dec c - jr nz, .loop - ld a, l - ld e, MON_NAME_LENGTH - sub e - ld l, a - ld a, h - sbc $0 - ld h, a - ld de, .String_Kettei_Yameru - call PlaceString - ld b, $3 - ld c, $0 - ld hl, wd002 - ld a, [hl] -.loop2 - push hl - push bc - hlcoord 12, 1 -.loop3 - and a - jr z, .done - ld de, 2 * SCREEN_WIDTH - add hl, de - dec a - jr .loop3 - -.done - ld de, .String_Banme - push hl - call PlaceString - pop hl - pop bc - push bc - push hl - ld a, c - ld hl, .Strings_1_2_3 - call GetNthString - ld d, h - ld e, l - pop hl - call PlaceString - pop bc - pop hl - inc hl - ld a, [hl] - inc c - dec b - ret z - jr .loop2 -; 5036b - -.String_Banme: ; 5036b - db " ばんめ  @" ; Place -; 50372 -.String_Sanka_Shinai: ; 50372 - db "さんかしない@" ; Cancel -; 50379 -.String_Kettei_Yameru: ; 50379 - db "けってい  やめる@" ; Quit -; 50383 -.Strings_1_2_3: ; 50383 - db "1@", "2@", "3@" ; 1st, 2nd, 3rd -; 50389 - - -PartyMenuCheckEgg: ; 50389 - ld a, LOW(wPartySpecies) - add b - ld e, a - ld a, HIGH(wPartySpecies) - adc 0 - ld d, a - ld a, [de] - cp EGG - ret -; 50396 - -GetPartyMenuQualityIndexes: ; 50396 - ld a, [wPartyMenuActionText] - and $f0 - jr nz, .skip - ld a, [wPartyMenuActionText] - and $f - ld e, a - ld d, 0 - ld hl, PartyMenuQualityPointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret - -.skip - ld hl, PartyMenuQualityPointers.Default - ret -; 503b2 - -INCLUDE "data/party_menu_qualities.asm" - - -InitPartyMenuGFX: ; 503e0 - ld hl, wPartyCount - ld a, [hli] - and a - ret z - ld c, a - xor a - ld [hObjectStructIndexBuffer], a -.loop - push bc - push hl - ld hl, LoadMenuMonIcon - ld a, BANK(LoadMenuMonIcon) - ld e, $0 - rst FarCall - ld a, [hObjectStructIndexBuffer] - inc a - ld [hObjectStructIndexBuffer], a - pop hl - pop bc - dec c - jr nz, .loop - callfar PlaySpriteAnimations - ret -; 50405 - -InitPartyMenuWithCancel: ; 50405 -; with cancel - xor a - ld [wSwitchMon], a - ld de, PartyMenuAttributes - call SetMenuAttributes - ld a, [wPartyCount] - inc a - ld [w2DMenuNumRows], a ; list length - dec a - ld b, a - ld a, [wPartyMenuCursor] - and a - jr z, .skip - inc b - cp b - jr c, .done - -.skip - ld a, 1 - -.done - ld [wMenuCursorY], a - ld a, A_BUTTON | B_BUTTON - ld [wMenuJoypadFilter], a - ret -; 5042d - -InitPartyMenuNoCancel: ; 0x5042d -; no cancel - ld de, PartyMenuAttributes - call SetMenuAttributes - ld a, [wPartyCount] - ld [w2DMenuNumRows], a ; list length - ld b, a - ld a, [wPartyMenuCursor] - and a - jr z, .skip - inc b - cp b - jr c, .done -.skip - ld a, 1 -.done - ld [wMenuCursorY], a - ld a, A_BUTTON | B_BUTTON - ld [wMenuJoypadFilter], a - ret -; 5044f (14:444f) - -PartyMenuAttributes: ; 5044f -; cursor y -; cursor x -; num rows -; num cols -; bit 6: animate sprites bit 5: wrap around -; ? -; distance between items (hi: y, lo: x) -; allowed buttons (mask) - db 1, 0 - db 0, 1 - db $60, $00 - dn 2, 0 - db 0 -; 50457 - -PartyMenuSelect: ; 0x50457 -; sets carry if exitted menu. - call StaticMenuJoypad - call PlaceHollowCursor - ld a, [wPartyCount] - inc a - ld b, a - ld a, [wMenuCursorY] ; menu selection? - cp b - jr z, .exitmenu ; CANCEL - ld [wPartyMenuCursor], a - ld a, [hJoyLast] - ld b, a - bit B_BUTTON_F, b - jr nz, .exitmenu ; B button - ld a, [wMenuCursorY] - dec a - ld [wCurPartyMon], a - ld c, a - ld b, $0 - ld hl, wPartySpecies - add hl, bc - ld a, [hl] - ld [wCurPartySpecies], a - - ld de, SFX_READ_TEXT_2 - call PlaySFX - call WaitSFX - and a - ret - -.exitmenu - ld de, SFX_READ_TEXT_2 - call PlaySFX - call WaitSFX - scf - ret -; 0x5049a - - -PrintPartyMenuText: ; 5049a - hlcoord 0, 14 - lb bc, 2, 18 - call TextBox - ld a, [wPartyCount] - and a - jr nz, .haspokemon - ld de, YouHaveNoPKMNString - jr .gotstring -.haspokemon ; 504ae - ld a, [wPartyMenuActionText] - and $f ; drop high nibble - ld hl, PartyMenuStrings - ld e, a - ld d, $0 - add hl, de - add hl, de - ld a, [hli] - ld d, [hl] - ld e, a -.gotstring ; 504be - ld a, [wOptions] - push af - set 4, a ; disable text delay - ld [wOptions], a - hlcoord 1, 16 ; Coord - call PlaceString - pop af - ld [wOptions], a - ret -; 0x504d2 - -PartyMenuStrings: ; 0x504d2 - dw ChooseAMonString - dw UseOnWhichPKMNString - dw WhichPKMNString - dw TeachWhichPKMNString - dw MoveToWhereString - dw UseOnWhichPKMNString - dw ChooseAMonString ; Probably used to be ChooseAFemalePKMNString - dw ChooseAMonString ; Probably used to be ChooseAMalePKMNString - dw ToWhichPKMNString - -ChooseAMonString: ; 0x504e4 - db "Choose a #MON.@" - -UseOnWhichPKMNString: ; 0x504f3 - db "Use on which ?@" - -WhichPKMNString: ; 0x50504 - db "Which ?@" - -TeachWhichPKMNString: ; 0x5050e - db "Teach which ?@" - -MoveToWhereString: ; 0x5051e - db "Move to where?@" - -ChooseAFemalePKMNString: ; 0x5052d -; unused - db "Choose a ♀.@" - -ChooseAMalePKMNString: ; 0x5053b -; unused - db "Choose a ♂.@" - -ToWhichPKMNString: ; 0x50549 - db "To which ?@" - -YouHaveNoPKMNString: ; 0x50556 - db "You have no !@" - -PrintPartyMenuActionText: ; 50566 - ld a, [wCurPartyMon] - ld hl, wPartyMonNicknames - call GetNick - ld a, [wPartyMenuActionText] - and $f - ld hl, .MenuActionTexts - call .PrintText - ret -; 5057b - -.MenuActionTexts: ; 5057b -; entries correspond to PARTYMENUTEXT_* constants - dw .Text_CuredOfPoison - dw .Text_BurnWasHealed - dw .Text_Defrosted - dw .Text_WokeUp - dw .Text_RidOfParalysis - dw .Text_RecoveredSomeHP - dw .Text_HealthReturned - dw .Text_Revitalized - dw .Text_GrewToLevel - dw .Text_CameToItsSenses -; 5058f - -.Text_RecoveredSomeHP: ; 0x5058f - ; recovered @ HP! - text_jump UnknownText_0x1bc0a2 - db "@" -; 0x50594 - -.Text_CuredOfPoison: ; 0x50594 - ; 's cured of poison. - text_jump UnknownText_0x1bc0bb - db "@" -; 0x50599 - -.Text_RidOfParalysis: ; 0x50599 - ; 's rid of paralysis. - text_jump UnknownText_0x1bc0d2 - db "@" -; 0x5059e - -.Text_BurnWasHealed: ; 0x5059e - ; 's burn was healed. - text_jump UnknownText_0x1bc0ea - db "@" -; 0x505a3 - -.Text_Defrosted: ; 0x505a3 - ; was defrosted. - text_jump UnknownText_0x1bc101 - db "@" -; 0x505a8 - -.Text_WokeUp: ; 0x505a8 - ; woke up. - text_jump UnknownText_0x1bc115 - db "@" -; 0x505ad - -.Text_HealthReturned: ; 0x505ad - ; 's health returned. - text_jump UnknownText_0x1bc123 - db "@" -; 0x505b2 - -.Text_Revitalized: ; 0x505b2 - ; is revitalized. - text_jump UnknownText_0x1bc13a - db "@" -; 0x505b7 - -.Text_GrewToLevel: ; 0x505b7 - ; grew to level @ !@ @ - text_jump UnknownText_0x1bc14f - db "@" -; 0x505bc - -.Text_CameToItsSenses: ; 0x505bc - ; came to its senses. - text_jump UnknownText_0x1bc16e - db "@" -; 0x505c1 - - -.PrintText: ; 505c1 - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wOptions] - push af - set NO_TEXT_SCROLL, a - ld [wOptions], a - call PrintText - pop af - ld [wOptions], a - ret -; 505da diff --git a/engine/pic_animation.asm b/engine/pic_animation.asm deleted file mode 100644 index 8781c2fd0..000000000 --- a/engine/pic_animation.asm +++ /dev/null @@ -1,1141 +0,0 @@ -; Pic animation arrangement. - -Unused_AnimateMon_Slow_Normal: ; d0000 - hlcoord 12, 0 - ld a, [wBattleMode] - cp WILD_BATTLE - jr z, .wild - ld e, ANIM_MON_SLOW - ld d, $0 - call AnimateFrontpic - ret - -.wild - ld e, ANIM_MON_NORMAL - ld d, $0 - call AnimateFrontpic - ret -; d001a - -AnimateMon_Menu: ; d001a - ld e, ANIM_MON_MENU - ld d, $0 - call AnimateFrontpic - ret -; d0022 - -AnimateMon_Trade: ; d0022 - ld e, ANIM_MON_TRADE - ld d, $0 - call AnimateFrontpic - ret -; d002a - -AnimateMon_Evolve: ; d002a - ld e, ANIM_MON_EVOLVE - ld d, $0 - call AnimateFrontpic - ret -; d0032 - -AnimateMon_Hatch: ; d0032 - ld e, ANIM_MON_HATCH - ld d, $0 - call AnimateFrontpic - ret -; d003a - -AnimateMon_Unused: ; d003a - ld e, ANIM_MON_UNUSED - ld d, $0 - call AnimateFrontpic - ret -; d0042 - -pokeanim: MACRO - rept _NARG -; Workaround for a bug where macro args can't come after the start of a symbol -if !DEF(\1_POKEANIM) -\1_POKEANIM EQUS "PokeAnim_\1_" -endc - db (\1_POKEANIM - PokeAnim_SetupCommands) / 2 - shift - endr - db (PokeAnim_Finish_ - PokeAnim_SetupCommands) / 2 -ENDM - -PokeAnims: ; d0042 - dw .Slow - dw .Normal - dw .Menu - dw .Trade - dw .Evolve - dw .Hatch - dw .Unused ; same as .Menu - dw .Egg1 - dw .Egg2 - -.Slow: pokeanim StereoCry, Setup2, Play -.Normal: pokeanim StereoCry, Setup, Play -.Menu: pokeanim CryNoWait, Setup, Play, SetWait, Wait, Idle, Play -.Trade: pokeanim Idle, Play2, Idle, Play, SetWait, Wait, Cry, Setup, Play -.Evolve: pokeanim Idle, Play, SetWait, Wait, CryNoWait, Setup, Play -.Hatch: pokeanim Idle, Play, CryNoWait, Setup, Play, SetWait, Wait, Idle, Play -.Unused: pokeanim CryNoWait, Setup, Play, SetWait, Wait, Idle, Play -.Egg1: pokeanim Setup, Play -.Egg2: pokeanim Idle, Play - - -AnimateFrontpic: ; d008e - call AnimateMon_CheckIfPokemon - ret c - call LoadMonAnimation -.loop - call SetUpPokeAnim - push af - farcall HDMATransferTileMapToWRAMBank3 - pop af - jr nc, .loop - ret -; d00a3 - -LoadMonAnimation: ; d00a3 - push hl - ld c, e - ld b, 0 - ld hl, PokeAnims - add hl, bc - add hl, bc - ld a, [hli] - ld b, [hl] - ld c, a - pop hl - call PokeAnim_InitPicAttributes - ret -; d00b4 - -SetUpPokeAnim: ; d00b4 - ld a, [rSVBK] - push af - ld a, BANK(wPokeAnimSceneIndex) - ld [rSVBK], a - ld a, [wPokeAnimSceneIndex] - ld c, a - ld b, 0 - ld hl, wPokeAnimPointer - ld a, [hli] - ld h, [hl] - ld l, a - add hl, bc - ld a, [hl] - ld hl, PokeAnim_SetupCommands - rst JumpTable - ld a, [wPokeAnimSceneIndex] - ld c, a - pop af - ld [rSVBK], a - ld a, c - and $80 - ret z - scf - ret -; d00da - -PokeAnim_SetupCommands: ; d00da -setup_command: MACRO -\1_: dw \1 -ENDM - setup_command PokeAnim_Finish - setup_command PokeAnim_BasePic - setup_command PokeAnim_SetWait - setup_command PokeAnim_Wait - setup_command PokeAnim_Setup - setup_command PokeAnim_Setup2 - setup_command PokeAnim_Idle - setup_command PokeAnim_Play - setup_command PokeAnim_Play2 - setup_command PokeAnim_Cry - setup_command PokeAnim_CryNoWait - setup_command PokeAnim_StereoCry -; d00f2 - -PokeAnim_SetWait: ; d00f2 - ld a, 18 - ld [wPokeAnimWaitCounter], a - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - -PokeAnim_Wait: ; d00fe - ld hl, wPokeAnimWaitCounter - dec [hl] - ret nz - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d010b - -PokeAnim_Setup: ; d010b - ld c, FALSE - ld b, 0 - call PokeAnim_InitAnim - call PokeAnim_SetVBank1 - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d011d - -PokeAnim_Setup2: ; d011d - ld c, FALSE - ld b, 4 - call PokeAnim_InitAnim - call PokeAnim_SetVBank1 - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d012f - -PokeAnim_Idle: ; d012f - ld c, TRUE - ld b, 0 - call PokeAnim_InitAnim - call PokeAnim_SetVBank1 - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d0141 - -PokeAnim_Play: ; d0141 - call PokeAnim_DoAnimScript - ld a, [wPokeAnimJumptableIndex] - bit 7, a - ret z - call PokeAnim_PlaceGraphic - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d0155 - -PokeAnim_Play2: ; d0155 - call PokeAnim_DoAnimScript - ld a, [wPokeAnimJumptableIndex] - bit 7, a - ret z - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d0166 - -PokeAnim_BasePic: ; d0166 - call PokeAnim_DeinitFrames - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d0171 - -PokeAnim_Finish: ; d0171 - call PokeAnim_DeinitFrames - ld hl, wPokeAnimSceneIndex - set 7, [hl] - ret -; d017a - -PokeAnim_Cry: ; d017a - ld a, [wPokeAnimSpecies] - call _PlayMonCry - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d0188 - -PokeAnim_CryNoWait: ; d0188 - ld a, [wPokeAnimSpecies] - call PlayMonCry2 - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d0196 - -PokeAnim_StereoCry: ; d0196 - ld a, $f - ld [wCryTracks], a - ld a, [wPokeAnimSpecies] - call PlayStereoCry2 - ld a, [wPokeAnimSceneIndex] - inc a - ld [wPokeAnimSceneIndex], a - ret -; d01a9 - -PokeAnim_DeinitFrames: ; d01a9 - ld a, [rSVBK] - push af - ld a, BANK(wPokeAnimCoord) - ld [rSVBK], a - call PokeAnim_PlaceGraphic - farcall HDMATransferTileMapToWRAMBank3 - call PokeAnim_SetVBank0 - farcall HDMATransferAttrMapToWRAMBank3 - pop af - ld [rSVBK], a - ret -; d01c6 - -AnimateMon_CheckIfPokemon: ; d01c6 - ld a, [wCurPartySpecies] - cp EGG - jr z, .fail - call IsAPokemon - jr c, .fail - and a - ret - -.fail - scf - ret -; d01d6 - -PokeAnim_InitPicAttributes: ; d01d6 - ld a, [rSVBK] - push af - ld a, BANK(wPokeAnimSceneIndex) - ld [rSVBK], a - - push bc - push de - push hl - ld hl, wPokeAnimSceneIndex - ld bc, wPokeAnimStructEnd - wPokeAnimSceneIndex - xor a - call ByteFill - pop hl - pop de - pop bc - -; bc contains anim pointer - ld a, c - ld [wPokeAnimPointer], a - ld a, b - ld [wPokeAnimPointer + 1], a -; hl contains tilemap coords - ld a, l - ld [wPokeAnimCoord], a - ld a, h - ld [wPokeAnimCoord + 1], a -; d = start tile - ld a, d - ld [wPokeAnimGraphicStartTile], a - - ld a, BANK(wCurPartySpecies) - ld hl, wCurPartySpecies - call GetFarWRAMByte - ld [wPokeAnimSpecies], a - - ld a, BANK(wUnownLetter) - ld hl, wUnownLetter - call GetFarWRAMByte - ld [wPokeAnimUnownLetter], a - - call PokeAnim_GetSpeciesOrUnown - ld [wPokeAnimSpeciesOrUnown], a - - call PokeAnim_GetFrontpicDims - ld a, c - ld [wPokeAnimFrontpicHeight], a - - pop af - ld [rSVBK], a - ret -; d0228 - -PokeAnim_InitAnim: ; d0228 - ld a, [rSVBK] - push af - ld a, BANK(wPokeAnimIdleFlag) - ld [rSVBK], a - push bc - ld hl, wPokeAnimIdleFlag - ld bc, wPokeAnimStructEnd - wPokeAnimIdleFlag - xor a - call ByteFill - pop bc - ld a, b - ld [wPokeAnimSpeed], a - ld a, c - ld [wPokeAnimIdleFlag], a - call GetMonAnimPointer - call GetMonFramesPointer - call GetMonBitmaskPointer - pop af - ld [rSVBK], a - ret -; d0250 - -PokeAnim_DoAnimScript: ; d0250 - xor a - ld [hBGMapMode], a -.loop - ld a, [wPokeAnimJumptableIndex] - and $7f - ld hl, .Jumptable - rst JumpTable - ret -; d025d - -.Jumptable: ; d025d - dw .RunAnim - dw .WaitAnim -; d0261 - -.RunAnim: ; d0261 - call PokeAnim_GetPointer - ld a, [wPokeAnimCommand] - cp -1 - jr z, PokeAnim_End - cp -2 - jr z, .SetRepeat - cp -3 - jr z, .DoRepeat - call PokeAnim_GetFrame - ld a, [wPokeAnimParameter] - call PokeAnim_GetDuration - ld [wPokeAnimWaitCounter], a - call PokeAnim_StartWaitAnim -.WaitAnim: ; d0282 - ld a, [wPokeAnimWaitCounter] - dec a - ld [wPokeAnimWaitCounter], a - ret nz - call PokeAnim_StopWaitAnim - ret -; d028e - -.SetRepeat: ; d028e - ld a, [wPokeAnimParameter] - ld [wPokeAnimRepeatTimer], a - jr .loop -; d0296 - -.DoRepeat: ; d0296 - ld a, [wPokeAnimRepeatTimer] - and a - ret z - dec a - ld [wPokeAnimRepeatTimer], a - ret z - ld a, [wPokeAnimParameter] - ld [wPokeAnimFrame], a - jr .loop -; d02a8 - -PokeAnim_End: ; d02a8 - ld hl, wPokeAnimJumptableIndex - set 7, [hl] - ret -; d02ae - -PokeAnim_GetDuration: ; d02ae -; a * (1 + [wPokeAnimSpeed] / 16) - ld c, a - ld b, $0 - ld hl, 0 - ld a, [wPokeAnimSpeed] - call AddNTimes - ld a, h - swap a - and $f0 - ld h, a - ld a, l - swap a - and $f - or h - add c - ret -; d02c8 - -PokeAnim_GetFrame: ; d02c8 - call PokeAnim_PlaceGraphic - ld a, [wPokeAnimCommand] - and a - ret z - call PokeAnim_GetBitmaskIndex - push hl - call PokeAnim_CopyBitmaskToBuffer - pop hl - call PokeAnim_ConvertAndApplyBitmask - ret -; d02dc - -PokeAnim_StartWaitAnim: ; d02dc - ld a, [wPokeAnimJumptableIndex] - inc a - ld [wPokeAnimJumptableIndex], a - ret -; d02e4 - -PokeAnim_StopWaitAnim: ; d02e4 - ld a, [wPokeAnimJumptableIndex] - dec a - ld [wPokeAnimJumptableIndex], a - ret -; d02ec - -PokeAnim_IsUnown: ; d02ec - ld a, [wPokeAnimSpecies] - cp UNOWN - ret -; d02f2 - -PokeAnim_IsEgg: ; d02f2 - ld a, [wPokeAnimSpecies] - cp EGG - ret -; d02f8 - -PokeAnim_GetPointer: ; d02f8 - push hl - ld a, [wPokeAnimFrame] - ld e, a - ld d, $0 - ld hl, wPokeAnimPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - add hl, de - add hl, de - ld a, [wPokeAnimPointerBank] - call GetFarHalfword - ld a, l - ld [wPokeAnimCommand], a - ld a, h - ld [wPokeAnimParameter], a - ld hl, wPokeAnimFrame - inc [hl] - pop hl - ret -; d031b - -PokeAnim_GetBitmaskIndex: ; d031b - ld a, [wPokeAnimCommand] - dec a - ld c, a - ld b, $0 - ld hl, wPokeAnimFramesAddr - ld a, [hli] - ld h, [hl] - ld l, a - add hl, bc - add hl, bc - ld a, [wPokeAnimFramesBank] - call GetFarHalfword - ld a, [wPokeAnimFramesBank] - call GetFarByte - ld [wPokeAnimCurBitmask], a - inc hl - ret -; d033b - -PokeAnim_CopyBitmaskToBuffer: ; d033b - call .GetSize - push bc - ld hl, wPokeAnimBitmaskAddr - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wPokeAnimCurBitmask] - call AddNTimes - pop bc - ld de, wPokeAnimBitmaskBuffer - ld a, [wPokeAnimBitmaskBank] - call FarCopyBytes - ret -; d0356 - -.GetSize: ; d0356 - push hl - ld a, [wPokeAnimFrontpicHeight] - sub 5 ; to get a number 0, 1, or 2 - ld c, a - ld b, 0 - ld hl, .Sizes - add hl, bc - ld c, [hl] - ld b, 0 - pop hl - ret -; d0368 - -.Sizes: db 4, 5, 7 - -poke_anim_box: MACRO -y = 7 -rept \1 -x = 7 + -\1 -rept \1 - db x + y -x = x + 1 -endr -y = y + 7 -endr -ENDM - -PokeAnim_ConvertAndApplyBitmask: ; d036b - xor a - ld [wPokeAnimBitmaskCurBit], a - ld [wPokeAnimBitmaskCurRow], a - ld [wPokeAnimBitmaskCurCol], a -.loop - push hl - call .IsCurBitSet - pop hl - ld a, b - and a - jr z, .next - - ld a, [wPokeAnimFramesBank] - call GetFarByte - inc hl - push hl - call .ApplyFrame - pop hl - -.next - push hl - call .NextBit - pop hl - jr nc, .loop - ret -; d0392 - -.IsCurBitSet: ; d0392 -; which byte - ld a, [wPokeAnimBitmaskCurBit] - and $f8 - rrca - rrca - rrca - ld e, a - ld d, 0 - ld hl, wPokeAnimBitmaskBuffer - add hl, de - ld b, [hl] -; which bit - ld a, [wPokeAnimBitmaskCurBit] - and $7 - jr z, .skip - - ld c, a - ld a, b -.loop2 - rrca - dec c - jr nz, .loop2 - ld b, a - -.skip - xor a - bit 0, b - jr z, .finish - ld a, 1 - -.finish - ld b, a - ld hl, wPokeAnimBitmaskCurBit - inc [hl] - ret -; d03bd - -.ApplyFrame: ; d03bd - push af - call .GetCoord - pop af - push hl - call .GetTilemap - ld hl, wPokeAnimGraphicStartTile - add [hl] - pop hl - ld [hl], a - ret -; d03cd - -.GetCoord: ; d03cd - call .GetStartCoord - ld a, [wPokeAnimBitmaskCurRow] - ld bc, SCREEN_WIDTH - call AddNTimes - ld a, [wBoxAlignment] - and a - jr nz, .go - ld a, [wPokeAnimBitmaskCurCol] - ld e, a - ld d, 0 - add hl, de - jr .skip2 - -.go - ld a, [wPokeAnimBitmaskCurCol] - ld e, a - ld a, l - sub e - ld l, a - ld a, h - sbc 0 - ld h, a - -.skip2 - ret -; d03f4 - -; unused - db 6, 5, 4 - -.GetTilemap: ; d03f7 - push af - ld a, [wPokeAnimFrontpicHeight] - cp 5 - jr z, .check_add_24 - cp 6 - jr z, .check_add_13 - pop af - ret - -.check_add_24 - pop af - cp 5 * 5 - jr nc, .add_24 - push hl - push de - ld hl, ._5by5 - ld e, a - ld d, 0 - add hl, de - ld a, [hl] - pop de - pop hl - ret - -.add_24 - add 24 - ret - -.check_add_13 - pop af - cp 6 * 6 - jr nc, .add_13 - push hl - push de - ld hl, ._6by6 - ld e, a - ld d, 0 - add hl, de - ld a, [hl] - pop de - pop hl - ret - -.add_13 - add 13 - ret -; d042f - -._5by5: - poke_anim_box 5 - ; db 9, 10, 11, 12, 13 - ; db 16, 17, 18, 19, 20 - ; db 23, 24, 25, 26, 27 - ; db 30, 31, 32, 33, 34 - ; db 37, 38, 39, 40, 41 - -._6by6: - poke_anim_box 6 - ; db 8, 9, 10, 11, 12, 13 - ; db 15, 16, 17, 18, 19, 20 - ; db 22, 23, 24, 25, 26, 27 - ; db 29, 30, 31, 32, 33, 34 - ; db 36, 37, 38, 39, 40, 41 - ; db 43, 44, 45, 46, 47, 48 - - -.GetStartCoord: ; d046c - ld hl, wPokeAnimCoord - ld a, [hli] - ld h, [hl] - ld l, a - - ld a, [wPokeAnimFrontpicHeight] - ld de, 0 - ld bc, 6 - cp 7 - jr z, .okay - ld de, SCREEN_WIDTH + 1 - ld bc, SCREEN_WIDTH + 5 - cp 6 - jr z, .okay - ld de, 2 * SCREEN_WIDTH + 1 - ld bc, 2 * SCREEN_WIDTH + 5 -.okay - - ld a, [wBoxAlignment] - and a - jr nz, .add_bc - add hl, de - ret - -.add_bc - add hl, bc - ret -; d0499 - -.NextBit: ; d0499 - ld a, [wPokeAnimBitmaskCurRow] - inc a - ld [wPokeAnimBitmaskCurRow], a - ld c, a - ld a, [wPokeAnimFrontpicHeight] - cp c - jr nz, .no_carry - xor a - ld [wPokeAnimBitmaskCurRow], a - ld a, [wPokeAnimBitmaskCurCol] - inc a - ld [wPokeAnimBitmaskCurCol], a - ld c, a - ld a, [wPokeAnimFrontpicHeight] - cp c - jr nz, .no_carry - scf - ret - -.no_carry - xor a - ret -; d04bd - -PokeAnim_PlaceGraphic: ; d04bd - call .ClearBox - ld a, [wBoxAlignment] - and a - jr nz, .flipped - ld de, 1 - ld bc, 0 - jr .okay - -.flipped - ld de, -1 - ld bc, 6 - -.okay - ld hl, wPokeAnimCoord - ld a, [hli] - ld h, [hl] - ld l, a - add hl, bc - ld c, 7 - ld b, 7 - ld a, [wPokeAnimGraphicStartTile] -.loop - push bc - push hl - push de - ld de, SCREEN_WIDTH -.loop2 - ld [hl], a - inc a - add hl, de - dec b - jr nz, .loop2 - pop de - pop hl - add hl, de - pop bc - dec c - jr nz, .loop - ret -; d04f6 - -.ClearBox: ; d04f6 - ld hl, wPokeAnimCoord - ld a, [hli] - ld h, [hl] - ld l, a - ld b, 7 - ld c, 7 - call ClearBox - ret -; d0504 - -PokeAnim_SetVBank1: ; d0504 - ld a, [rSVBK] - push af - ld a, BANK(wPokeAnimCoord) - ld [rSVBK], a - xor a - ld [hBGMapMode], a - call .SetFlag - farcall HDMATransferAttrMapToWRAMBank3 - pop af - ld [rSVBK], a - ret -; d051b - -.SetFlag: ; d051b - call PokeAnim_GetAttrMapCoord - ld b, 7 - ld c, 7 - ld de, SCREEN_WIDTH -.row - push bc - push hl -.col - ld a, [hl] - or 8 - ld [hl], a - add hl, de - dec c - jr nz, .col - pop hl - inc hl - pop bc - dec b - jr nz, .row - ret -; d0536 - -PokeAnim_SetVBank0: ; d0536 - call PokeAnim_GetAttrMapCoord - ld b, 7 - ld c, 7 - ld de, SCREEN_WIDTH -.row - push bc - push hl -.col - ld a, [hl] - and $f7 - ld [hl], a - add hl, de - dec c - jr nz, .col - pop hl - inc hl - pop bc - dec b - jr nz, .row - ret -; d0551 - -PokeAnim_GetAttrMapCoord: ; d0551 - ld hl, wPokeAnimCoord - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wAttrMap - wTileMap - add hl, de - ret -; d055c - -GetMonAnimPointer: ; d055c - call PokeAnim_IsEgg - jr z, .egg - - ld c, BANK(UnownAnimations) - ld hl, UnownAnimationPointers - ld de, UnownAnimationIdlePointers - call PokeAnim_IsUnown - jr z, .unown - ld c, BANK(PicAnimations) - ld hl, AnimationPointers - ld de, AnimationIdlePointers -.unown - - ld a, [wPokeAnimIdleFlag] - and a - jr z, .idles - ld h, d - ld l, e -.idles - - ld a, [wPokeAnimSpeciesOrUnown] - dec a - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, c - ld [wPokeAnimPointerBank], a - call GetFarHalfword - ld a, l - ld [wPokeAnimPointerAddr], a - ld a, h - ld [wPokeAnimPointerAddr + 1], a - ret - -.egg - ld hl, EggAnimation - ld c, BANK(EggAnimation) - ld a, [wPokeAnimIdleFlag] - and a - jr z, .idles_egg - ld hl, EggAnimationIdle - ld c, BANK(EggAnimationIdle) -.idles_egg - - ld a, c - ld [wPokeAnimPointerBank], a - ld a, l - ld [wPokeAnimPointerAddr], a - ld a, h - ld [wPokeAnimPointerAddr + 1], a - ret -; d05b4 - -PokeAnim_GetFrontpicDims: ; d05b4 - ld a, [rSVBK] - push af - ld a, BANK(wCurPartySpecies) - ld [rSVBK], a - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - call GetBaseData - ld a, [wBasePicSize] - and $f - ld c, a - pop af - ld [rSVBK], a - ret -; d05ce - -GetMonFramesPointer: ; d05ce - call PokeAnim_IsEgg - jr z, .egg - - call PokeAnim_IsUnown - ld b, BANK(UnownFramesPointers) - ld c, BANK(UnownsFrames) - ld hl, UnownFramesPointers - jr z, .got_frames - ld a, [wPokeAnimSpecies] - cp JOHTO_POKEMON - ld b, BANK(FramesPointers) - ld c, BANK(KantoFrames) - ld hl, FramesPointers - jr c, .got_frames - ld c, BANK(JohtoFrames) -.got_frames - ld a, c - ld [wPokeAnimFramesBank], a - - ld a, [wPokeAnimSpeciesOrUnown] - dec a - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, b - call GetFarHalfword - ld a, l - ld [wPokeAnimFramesAddr], a - ld a, h - ld [wPokeAnimFramesAddr + 1], a - ret - -.egg - ld hl, EggFrames - ld c, BANK(EggFrames) - ld a, c - ld [wPokeAnimFramesBank], a - ld a, l - ld [wPokeAnimFramesAddr], a - ld a, h - ld [wPokeAnimFramesAddr + 1], a - ret -; d061b - -GetMonBitmaskPointer: ; d061b - call PokeAnim_IsEgg - jr z, .egg - - call PokeAnim_IsUnown - ld a, BANK(UnownBitmasksPointers) - ld hl, UnownBitmasksPointers - jr z, .unown - ld a, BANK(BitmasksPointers) - ld hl, BitmasksPointers -.unown - ld [wPokeAnimBitmaskBank], a - - ld a, [wPokeAnimSpeciesOrUnown] - dec a - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [wPokeAnimBitmaskBank] - call GetFarHalfword - ld a, l - ld [wPokeAnimBitmaskAddr], a - ld a, h - ld [wPokeAnimBitmaskAddr + 1], a - ret - -.egg - ld c, BANK(EggBitmasks) - ld hl, EggBitmasks - ld a, c - ld [wPokeAnimBitmaskBank], a - ld a, l - ld [wPokeAnimBitmaskAddr], a - ld a, h - ld [wPokeAnimBitmaskAddr + 1], a - ret -; d065c - -PokeAnim_GetSpeciesOrUnown: ; d065c - call PokeAnim_IsUnown - jr z, .unown - ld a, [wPokeAnimSpecies] - ret - -.unown - ld a, [wPokeAnimUnownLetter] - ret -; d0669 - -Unused_HOF_AnimateAlignedFrontpic: ; d0669 - ld a, $1 - ld [wBoxAlignment], a - -HOF_AnimateFrontpic: ; d066e - call AnimateMon_CheckIfPokemon - jr c, .fail - ld h, d - ld l, e - push bc - push hl - ld de, vTiles2 - predef GetAnimatedFrontpic - pop hl - pop bc - ld d, 0 - ld e, c - call AnimateFrontpic - xor a - ld [wBoxAlignment], a - ret - -.fail - xor a - ld [wBoxAlignment], a - inc a - ld [wCurPartySpecies], a - ret -; d0695 diff --git a/engine/player_gfx.asm b/engine/player_gfx.asm deleted file mode 100644 index deb16ad3a..000000000 --- a/engine/player_gfx.asm +++ /dev/null @@ -1,224 +0,0 @@ -Unreferenced_Function88248: ; 88248 - ld c, CAL - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .okay - ld c, KAREN - -.okay - ld a, c - ld [wTrainerClass], a - ret - -MovePlayerPicRight: ; 88258 - hlcoord 6, 4 - ld de, 1 - jr MovePlayerPic - -MovePlayerPicLeft: ; 88260 - hlcoord 13, 4 - ld de, -1 - ; fallthrough - -MovePlayerPic: ; 88266 -; Move player pic at hl by de * 7 tiles. - ld c, $8 -.loop - push bc - push hl - push de - xor a - ld [hBGMapMode], a - lb bc, 7, 7 - predef PlaceGraphic - xor a - ld [hBGMapThird], a - call WaitBGMap - call DelayFrame - pop de - pop hl - add hl, de - pop bc - dec c - ret z - push hl - push bc - ld a, l - sub e - ld l, a - ld a, h - sbc d - ld h, a - lb bc, 7, 7 - call ClearBox - pop bc - pop hl - jr .loop - -ShowPlayerNamingChoices: ; 88297 - ld hl, ChrisNameMenuHeader - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .GotGender - ld hl, KrisNameMenuHeader -.GotGender: - call LoadMenuHeader - call VerticalMenu - ld a, [wMenuCursorY] - dec a - call CopyNameFromMenu - call CloseWindow - ret - -INCLUDE "data/player_names.asm" - -GetPlayerNameArray: ; 88318 This Function is never called - ld hl, wPlayerName - ld de, MalePlayerNameArray - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .done - ld de, FemalePlayerNameArray - -.done - call InitName - ret - -GetPlayerIcon: ; 8832c -; Get the player icon corresponding to gender - -; Male - ld de, ChrisSpriteGFX - ld b, BANK(ChrisSpriteGFX) - - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .done - -; Female - ld de, KrisSpriteGFX - ld b, BANK(KrisSpriteGFX) - -.done - ret - -GetCardPic: ; 8833e - ld hl, ChrisCardPic - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .GotClass - ld hl, KrisCardPic -.GotClass: - ld de, vTiles2 tile $00 - ld bc, $23 tiles - ld a, BANK(ChrisCardPic) ; BANK(KrisCardPic) - call FarCopyBytes - ld hl, CardGFX - ld de, vTiles2 tile $23 - ld bc, 6 tiles - ld a, BANK(CardGFX) - call FarCopyBytes - ret - -ChrisCardPic: ; 88365 -INCBIN "gfx/trainer_card/chris_card.2bpp" - -KrisCardPic: ; 88595 -INCBIN "gfx/trainer_card/kris_card.2bpp" - -CardGFX: ; 887c5 -INCBIN "gfx/trainer_card/trainer_card.2bpp" - -GetPlayerBackpic: ; 88825 - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, GetChrisBackpic - call GetKrisBackpic - ret - -GetChrisBackpic: ; 88830 - ld hl, ChrisBackpic - ld b, BANK(ChrisBackpic) - ld de, vTiles2 tile $31 - ld c, 7 * 7 - predef DecompressGet2bpp - ret - -HOF_LoadTrainerFrontpic: ; 88840 - call WaitBGMap - xor a - ld [hBGMapMode], a - ld e, 0 - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .GotClass - ld e, 1 - -.GotClass: - ld a, e - ld [wTrainerClass], a - ld de, ChrisPic - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .GotPic - ld de, KrisPic - -.GotPic: - ld hl, vTiles2 - ld b, BANK(ChrisPic) ; BANK(KrisPic) - ld c, 7 * 7 - call Get2bpp - call WaitBGMap - ld a, $1 - ld [hBGMapMode], a - ret - -DrawIntroPlayerPic: ; 88874 -; Draw the player pic at (6,4). - -; Get class - ld e, CHRIS - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .GotClass - ld e, KRIS -.GotClass: - ld a, e - ld [wTrainerClass], a - -; Load pic - ld de, ChrisPic - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .GotPic - ld de, KrisPic -.GotPic: - ld hl, vTiles2 - ld b, BANK(ChrisPic) ; BANK(KrisPic) - ld c, 7 * 7 ; dimensions - call Get2bpp - -; Draw - xor a - ld [hGraphicStartTile], a - hlcoord 6, 4 - lb bc, 7, 7 - predef PlaceGraphic - ret - -ChrisPic: ; 888a9 -INCBIN "gfx/player/chris.2bpp" - -KrisPic: ; 88bb9 -INCBIN "gfx/player/kris.2bpp" - -GetKrisBackpic: ; 88ec9 -; Kris's backpic is uncompressed. - ld de, KrisBackpic - ld hl, vTiles2 tile $31 - lb bc, BANK(KrisBackpic), 7 * 7 ; dimensions - call Get2bpp - ret - -KrisBackpic: ; 88ed6 -INCBIN "gfx/player/kris_back.2bpp" diff --git a/engine/player_movement.asm b/engine/player_movement.asm deleted file mode 100755 index ef9afc7ad..000000000 --- a/engine/player_movement.asm +++ /dev/null @@ -1,851 +0,0 @@ -DoPlayerMovement:: ; 80000 - - call .GetDPad - ld a, movement_step_sleep - ld [wMovementAnimation], a - xor a - ld [wd041], a - call .TranslateIntoMovement - ld c, a - ld a, [wMovementAnimation] - ld [wPlayerNextMovement], a - ret - -.GetDPad: - - ld a, [hJoyDown] - ld [wCurInput], a - -; Standing downhill instead moves down. - - ld hl, wBikeFlags - bit BIKEFLAGS_DOWNHILL_F, [hl] - ret z - - ld c, a - and D_PAD - ret nz - - ld a, c - or D_DOWN - ld [wCurInput], a - ret -; 8002d - -.TranslateIntoMovement: - ld a, [wPlayerState] - cp PLAYER_NORMAL - jr z, .Normal - cp PLAYER_SURF - jr z, .Surf - cp PLAYER_SURF_PIKA - jr z, .Surf - cp PLAYER_BIKE - jr z, .Normal - cp PLAYER_SKATE - jr z, .Ice - -.Normal: - call .CheckForced - call .GetAction - call .CheckTile - ret c - call .CheckTurning - ret c - call .TryStep - ret c - call .TryJump - ret c - call .CheckWarp - ret c - jr .NotMoving - -.Surf: - call .CheckForced - call .GetAction - call .CheckTile - ret c - call .CheckTurning - ret c - call .TrySurf - ret c - jr .NotMoving - -.Ice: - call .CheckForced - call .GetAction - call .CheckTile - ret c - call .CheckTurning - ret c - call .TryStep - ret c - call .TryJump - ret c - call .CheckWarp - ret c - ld a, [wWalkingDirection] - cp STANDING - jr z, .HitWall - call .BumpSound -.HitWall: - call .StandInPlace - xor a - ret - -.NotMoving: - ld a, [wWalkingDirection] - cp STANDING - jr z, .Standing - -; Walking into an edge warp won't bump. - ld a, [wEngineBuffer4] - and a - jr nz, .CantMove - call .BumpSound -.CantMove: - call ._WalkInPlace - xor a - ret - -.Standing: - call .StandInPlace - xor a - ret -; 800b7 - -.CheckTile: ; 800b7 -; Tiles such as waterfalls and warps move the player -; in a given direction, overriding input. - - ld a, [wPlayerStandingTile] - ld c, a - call CheckWhirlpoolTile - jr c, .not_whirlpool - ld a, 3 - scf - ret - -.not_whirlpool - and $f0 - cp HI_NYBBLE_CURRENT - jr z, .water - cp HI_NYBBLE_WALK - jr z, .land1 - cp HI_NYBBLE_WALK_ALT - jr z, .land2 - cp HI_NYBBLE_WARPS - jr z, .warps - jr .no_walk - -.water - ld a, c - maskbits NUM_DIRECTIONS - ld c, a - ld b, 0 - ld hl, .water_table - add hl, bc - ld a, [hl] - ld [wWalkingDirection], a - jr .continue_walk - -.water_table - db RIGHT ; COLL_WATERFALL_RIGHT - db LEFT ; COLL_WATERFALL_LEFT - db UP ; COLL_WATERFALL_UP - db DOWN ; COLL_WATERFALL - -.land1 - ld a, c - and 7 - ld c, a - ld b, 0 - ld hl, .land1_table - add hl, bc - ld a, [hl] - cp STANDING - jr z, .no_walk - ld [wWalkingDirection], a - jr .continue_walk - -.land1_table - db STANDING ; COLL_BRAKE - db RIGHT ; COLL_WALK_RIGHT - db LEFT ; COLL_WALK_LEFT - db UP ; COLL_WALK_UP - db DOWN ; COLL_WALK_DOWN - db STANDING ; COLL_BRAKE_45 - db STANDING ; COLL_BRAKE_46 - db STANDING ; COLL_BRAKE_47 - -.land2 - ld a, c - and 7 - ld c, a - ld b, 0 - ld hl, .land2_table - add hl, bc - ld a, [hl] - cp STANDING - jr z, .no_walk - ld [wWalkingDirection], a - jr .continue_walk - -.land2_table - db RIGHT ; COLL_WALK_RIGHT_ALT - db LEFT ; COLL_WALK_LEFT_ALT - db UP ; COLL_WALK_UP_ALT - db DOWN ; COLL_WALK_DOWN_ALT - db STANDING ; COLL_BRAKE_ALT - db STANDING ; COLL_BRAKE_55 - db STANDING ; COLL_BRAKE_56 - db STANDING ; COLL_BRAKE_57 - -.warps - ld a, c - cp COLL_DOOR - jr z, .down - cp COLL_DOOR_79 - jr z, .down - cp COLL_STAIRCASE - jr z, .down - cp COLL_CAVE - jr nz, .no_walk - -.down - ld a, DOWN - ld [wWalkingDirection], a - jr .continue_walk - -.no_walk - xor a - ret - -.continue_walk - ld a, STEP_WALK - call .DoStep - ld a, 5 - scf - ret -; 80147 - -.CheckTurning: ; 80147 -; If the player is turning, change direction first. This also lets -; the player change facing without moving by tapping a direction. - - ld a, [wPlayerTurningDirection] - cp 0 - jr nz, .not_turning - ld a, [wWalkingDirection] - cp STANDING - jr z, .not_turning - - ld e, a - ld a, [wPlayerDirection] - rrca - rrca - maskbits NUM_DIRECTIONS - cp e - jr z, .not_turning - - ld a, STEP_TURN - call .DoStep - ld a, 2 - scf - ret - -.not_turning - xor a - ret -; 8016b - -.TryStep: ; 8016b - -; Surfing actually calls .TrySurf directly instead of passing through here. - ld a, [wPlayerState] - cp PLAYER_SURF - jr z, .TrySurf - cp PLAYER_SURF_PIKA - jr z, .TrySurf - - call .CheckLandPerms - jr c, .bump - - call .CheckNPC - and a - jr z, .bump - cp 2 - jr z, .bump - - ld a, [wPlayerStandingTile] - call CheckIceTile - jr nc, .ice - -; Downhill riding is slower when not moving down. - call .BikeCheck - jr nz, .walk - - ld hl, wBikeFlags - bit BIKEFLAGS_DOWNHILL_F, [hl] - jr z, .fast - - ld a, [wWalkingDirection] - cp DOWN - jr z, .fast - - ld a, STEP_WALK - call .DoStep - scf - ret - -.fast - ld a, STEP_BIKE - call .DoStep - scf - ret - -.walk - ld a, STEP_WALK - call .DoStep - scf - ret - -.ice - ld a, STEP_ICE - call .DoStep - scf - ret - -; unused - xor a - ret - -.bump - xor a - ret -; 801c0 - -.TrySurf: ; 801c0 - - call .CheckSurfPerms - ld [wd040], a - jr c, .surf_bump - - call .CheckNPC - ld [wd03f], a - and a - jr z, .surf_bump - cp 2 - jr z, .surf_bump - - ld a, [wd040] - and a - jr nz, .ExitWater - - ld a, STEP_WALK - call .DoStep - scf - ret - -.ExitWater: - call .GetOutOfWater - call PlayMapMusic - ld a, STEP_WALK - call .DoStep - ld a, 6 - scf - ret - -.surf_bump - xor a - ret -; 801f3 - -.TryJump: ; 801f3 - ld a, [wPlayerStandingTile] - ld e, a - and $f0 - cp HI_NYBBLE_LEDGES - jr nz, .DontJump - - ld a, e - and 7 - ld e, a - ld d, 0 - ld hl, .data_8021e - add hl, de - ld a, [wFacingDirection] - and [hl] - jr z, .DontJump - - ld de, SFX_JUMP_OVER_LEDGE - call PlaySFX - ld a, STEP_LEDGE - call .DoStep - ld a, 7 - scf - ret - -.DontJump: - xor a - ret - -.data_8021e - db FACE_RIGHT ; COLL_HOP_RIGHT - db FACE_LEFT ; COLL_HOP_LEFT - db FACE_UP ; COLL_HOP_UP - db FACE_DOWN ; COLL_HOP_DOWN - db FACE_RIGHT | FACE_DOWN ; COLL_HOP_DOWN_RIGHT - db FACE_DOWN | FACE_LEFT ; COLL_HOP_DOWN_LEFT - db FACE_UP | FACE_RIGHT ; COLL_HOP_UP_RIGHT - db FACE_UP | FACE_LEFT ; COLL_HOP_UP_LEFT -; 80226 - -.CheckWarp: ; 80226 - -; Bug: Since no case is made for STANDING here, it will check -; [.edgewarps + $ff]. This resolves to $3e at $8035a. -; This causes wd041 to be nonzero when standing on tile $3e, -; making bumps silent. - - ld a, [wWalkingDirection] - ; cp STANDING - ; jr z, .not_warp - ld e, a - ld d, 0 - ld hl, .EdgeWarps - add hl, de - ld a, [wPlayerStandingTile] - cp [hl] - jr nz, .not_warp - - ld a, 1 - ld [wd041], a - ld a, [wWalkingDirection] - ; This is in the wrong place. - cp STANDING - jr z, .not_warp - - ld e, a - ld a, [wPlayerDirection] - rrca - rrca - maskbits NUM_DIRECTIONS - cp e - jr nz, .not_warp - call WarpCheck - jr nc, .not_warp - - call .StandInPlace - scf - ld a, 1 - ret - -.not_warp - xor a - ret - -.EdgeWarps: - db COLL_WARP_CARPET_DOWN - db COLL_WARP_CARPET_UP - db COLL_WARP_CARPET_LEFT - db COLL_WARP_CARPET_RIGHT -; 8025f - -.DoStep: - ld e, a - ld d, 0 - ld hl, .Steps - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - - ld a, [wWalkingDirection] - ld e, a - cp STANDING - jp z, .StandInPlace - - add hl, de - ld a, [hl] - ld [wMovementAnimation], a - - ld hl, .FinishFacing - add hl, de - ld a, [hl] - ld [wPlayerTurningDirection], a - - ld a, 4 - ret - -.Steps: - dw .SlowStep - dw .NormalStep - dw .FastStep - dw .JumpStep - dw .SlideStep - dw .TurningStep - dw .BackJumpStep - dw .FinishFacing - -.SlowStep: - slow_step DOWN - slow_step UP - slow_step LEFT - slow_step RIGHT -.NormalStep: - step DOWN - step UP - step LEFT - step RIGHT -.FastStep: - big_step DOWN - big_step UP - big_step LEFT - big_step RIGHT -.JumpStep: - jump_step DOWN - jump_step UP - jump_step LEFT - jump_step RIGHT -.SlideStep: - fast_slide_step DOWN - fast_slide_step UP - fast_slide_step LEFT - fast_slide_step RIGHT -.BackJumpStep: - jump_step UP - jump_step DOWN - jump_step RIGHT - jump_step LEFT -.TurningStep: - turn_step DOWN - turn_step UP - turn_step LEFT - turn_step RIGHT -.FinishFacing: - db $80 + DOWN - db $80 + UP - db $80 + LEFT - db $80 + RIGHT -; 802b3 - -.StandInPlace: ; 802b3 - ld a, 0 - ld [wPlayerTurningDirection], a - ld a, movement_step_sleep - ld [wMovementAnimation], a - xor a - ret -; 802bf - -._WalkInPlace: ; 802bf - ld a, 0 - ld [wPlayerTurningDirection], a - ld a, movement_step_bump - ld [wMovementAnimation], a - xor a - ret -; 802cb - -.CheckForced: ; 802cb -; When sliding on ice, input is forced to remain in the same direction. - - call CheckStandingOnIce - ret nc - - ld a, [wPlayerTurningDirection] - cp 0 - ret z - - maskbits NUM_DIRECTIONS - ld e, a - ld d, 0 - ld hl, .forced_dpad - add hl, de - ld a, [wCurInput] - and BUTTONS - or [hl] - ld [wCurInput], a - ret - -.forced_dpad - db D_DOWN, D_UP, D_LEFT, D_RIGHT -; 802ec - -.GetAction: ; 802ec -; Poll player input and update movement info. - - ld hl, .table - ld de, .table2 - .table1 - ld a, [wCurInput] - bit D_DOWN_F, a - jr nz, .d_down - bit D_UP_F, a - jr nz, .d_up - bit D_LEFT_F, a - jr nz, .d_left - bit D_RIGHT_F, a - jr nz, .d_right -; Standing - jr .update - -.d_down add hl, de -.d_up add hl, de -.d_left add hl, de -.d_right add hl, de - -.update - ld a, [hli] - ld [wWalkingDirection], a - ld a, [hli] - ld [wFacingDirection], a - ld a, [hli] - ld [wWalkingX], a - ld a, [hli] - ld [wWalkingY], a - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [hl] - ld [wWalkingTile], a - ret - -.table -; struct: -; walk direction -; facing -; x movement -; y movement -; tile collision pointer -.table1 - db STANDING, FACE_CURRENT, 0, 0 - dw wPlayerStandingTile -.table2 - db RIGHT, FACE_RIGHT, 1, 0 - dw wTileRight - db LEFT, FACE_LEFT, -1, 0 - dw wTileLeft - db UP, FACE_UP, 0, -1 - dw wTileUp - db DOWN, FACE_DOWN, 0, 1 - dw wTileDown -; 80341 - -.CheckNPC: ; 80341 -; Returns 0 if there is an NPC in front that you can't move -; Returns 1 if there is no NPC in front -; Returns 2 if there is a movable NPC in front - ld a, 0 - ld [hMapObjectIndexBuffer], a -; Load the next X coordinate into d - ld a, [wPlayerStandingMapX] - ld d, a - ld a, [wWalkingX] - add d - ld d, a -; Load the next Y coordinate into e - ld a, [wPlayerStandingMapY] - ld e, a - ld a, [wWalkingY] - add e - ld e, a -; Find an object struct with coordinates equal to d,e - ld bc, wObjectStructs ; redundant - farcall IsNPCAtCoord - jr nc, .is_npc - call .CheckStrengthBoulder - jr c, .no_bump - - xor a - ret - -.is_npc - ld a, 1 - ret - -.no_bump - ld a, 2 - ret -; 8036f - -.CheckStrengthBoulder: ; 8036f - - ld hl, wBikeFlags - bit BIKEFLAGS_STRENGTH_ACTIVE_F, [hl] - jr z, .not_boulder - - ld hl, OBJECT_DIRECTION_WALKING - add hl, bc - ld a, [hl] - cp STANDING - jr nz, .not_boulder - - ld hl, OBJECT_PALETTE - add hl, bc - bit 6, [hl] - jr z, .not_boulder - - ld hl, OBJECT_FLAGS2 - add hl, bc - set 2, [hl] - - ld a, [wWalkingDirection] - ld d, a - ld hl, OBJECT_RANGE - add hl, bc - ld a, [hl] - and $fc - or d - ld [hl], a - - scf - ret - -.not_boulder - xor a - ret -; 8039e - -.CheckLandPerms: ; 8039e -; Return 0 if walking onto land and tile permissions allow it. -; Otherwise, return carry. - - ld a, [wTilePermissions] - ld d, a - ld a, [wFacingDirection] - and d - jr nz, .NotWalkable - - ld a, [wWalkingTile] - call .CheckWalkable - jr c, .NotWalkable - - xor a - ret - -.NotWalkable: - scf - ret -; 803b4 - -.CheckSurfPerms: ; 803b4 -; Return 0 if moving in water, or 1 if moving onto land. -; Otherwise, return carry. - - ld a, [wTilePermissions] - ld d, a - ld a, [wFacingDirection] - and d - jr nz, .NotSurfable - - ld a, [wWalkingTile] - call .CheckSurfable - jr c, .NotSurfable - - and a - ret - -.NotSurfable: - scf - ret -; 803ca - -.BikeCheck: ; 803ca - ld a, [wPlayerState] - cp PLAYER_BIKE - ret z - cp PLAYER_SKATE - ret -; 803d3 - -.CheckWalkable: ; 803d3 -; Return 0 if tile a is land. Otherwise, return carry. - - call GetTileCollision - and a ; LANDTILE? - ret z - scf - ret -; 803da - -.CheckSurfable: ; 803da -; Return 0 if tile a is water, or 1 if land. -; Otherwise, return carry. - - call GetTileCollision - cp WATERTILE - jr z, .Water - -; Can walk back onto land from water. - and a ; LANDTILE? - jr z, .Land - - jr .Neither - -.Water: - xor a - ret - -.Land: - ld a, 1 - and a - ret - -.Neither: - scf - ret -; 803ee - -.BumpSound: ; 803ee - - call CheckSFX - ret c - ld de, SFX_BUMP - call PlaySFX - ret -; 803f9 - -.GetOutOfWater: ; 803f9 - push bc - ld a, PLAYER_NORMAL - ld [wPlayerState], a - call ReplaceKrisSprite ; UpdateSprites - pop bc - ret -; 80404 - -CheckStandingOnIce:: ; 80404 - ld a, [wPlayerTurningDirection] - cp 0 - jr z, .not_ice - cp $f0 - jr z, .not_ice - ld a, [wPlayerStandingTile] - call CheckIceTile - jr nc, .yep - ld a, [wPlayerState] - cp PLAYER_SKATE - jr nz, .not_ice - -.yep - scf - ret - -.not_ice - and a - ret -; 80422 - -StopPlayerForEvent:: ; 80422 - ld hl, wPlayerNextMovement - ld a, movement_step_sleep - cp [hl] - ret z - - ld [hl], a - ld a, 0 - ld [wPlayerTurningDirection], a - ret -; 80430 diff --git a/engine/player_object.asm b/engine/player_object.asm deleted file mode 100755 index 7d287dedb..000000000 --- a/engine/player_object.asm +++ /dev/null @@ -1,856 +0,0 @@ -BlankScreen: ; 8000 - call DisableSpriteUpdates - xor a - ld [hBGMapMode], a - call ClearBGPalettes - call ClearSprites - hlcoord 0, 0 - ld bc, wTileMapEnd - wTileMap - ld a, " " - call ByteFill - hlcoord 0, 0, wAttrMap - ld bc, wAttrMapEnd - wAttrMap - ld a, $7 - call ByteFill - call WaitBGMap2 - call SetPalettes - ret - -SpawnPlayer: ; 8029 - ld a, -1 - ld [wObjectFollow_Leader], a - ld [wObjectFollow_Follower], a - ld a, $0 - ld hl, PlayerObjectTemplate - call CopyPlayerObjectTemplate - ld b, $0 - call PlayerSpawn_ConvertCoords - ld a, PLAYER_OBJECT - call GetMapObject - ld hl, MAPOBJECT_COLOR - add hl, bc - ln e, PAL_NPC_RED, OBJECTTYPE_SCRIPT - ld a, [wPlayerSpriteSetupFlags] - bit PLAYERSPRITESETUP_FEMALE_TO_MALE_F, a - jr nz, .ok - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .ok - ln e, PAL_NPC_BLUE, OBJECTTYPE_SCRIPT - -.ok - ld [hl], e - ld a, PLAYER_OBJECT - ld [hMapObjectIndexBuffer], a - ld bc, wMapObjects - ld a, PLAYER_OBJECT - ld [hObjectStructIndexBuffer], a - ld de, wObjectStructs - call CopyMapObjectToObjectStruct - ld a, PLAYER - ld [wCenteredObject], a - ret - -PlayerObjectTemplate: ; 8071 -; A dummy map object used to initialize the player object. -; Shorter than the actual amount copied by two bytes. -; Said bytes seem to be unused. - object_event -4, -4, SPRITE_CHRIS, SPRITEMOVEDATA_PLAYER, 15, 15, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, 0, -1 - -CopyDECoordsToMapObject:: ; 807e - push de - ld a, b - call GetMapObject - pop de - ld hl, MAPOBJECT_X_COORD - add hl, bc - ld [hl], d - ld hl, MAPOBJECT_Y_COORD - add hl, bc - ld [hl], e - ret - -PlayerSpawn_ConvertCoords: ; 808f - push bc - ld a, [wXCoord] - add 4 - ld d, a - ld a, [wYCoord] - add 4 - ld e, a - pop bc - call CopyDECoordsToMapObject - ret - -WriteObjectXY:: ; 80a1 - ld a, b - call CheckObjectVisibility - ret c - - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - ld a, [hMapObjectIndexBuffer] - ld b, a - call CopyDECoordsToMapObject - and a - ret - -RefreshPlayerCoords: ; 80b8 - ld a, [wXCoord] - add 4 - ld d, a - ld hl, wPlayerStandingMapX - sub [hl] - ld [hl], d - ld hl, wMapObjects + MAPOBJECT_X_COORD - ld [hl], d - ld hl, wPlayerLastMapX - ld [hl], d - ld d, a - ld a, [wYCoord] - add 4 - ld e, a - ld hl, wPlayerStandingMapY - sub [hl] - ld [hl], e - ld hl, wMapObjects + MAPOBJECT_Y_COORD - ld [hl], e - ld hl, wPlayerLastMapY - ld [hl], e - ld e, a - ld a, [wObjectFollow_Leader] - cp $0 - ret nz ; wtf - ret - -CopyObjectStruct:: ; 80e7 - call CheckObjectMask - and a - ret nz ; masked - - ld hl, wObjectStructs + OBJECT_STRUCT_LENGTH * 1 - ld a, 1 - ld de, OBJECT_STRUCT_LENGTH -.loop - ld [hObjectStructIndexBuffer], a - ld a, [hl] - and a - jr z, .done - add hl, de - ld a, [hObjectStructIndexBuffer] - inc a - cp NUM_OBJECT_STRUCTS - jr nz, .loop - scf - ret ; overflow - -.done - ld d, h - ld e, l - call CopyMapObjectToObjectStruct - ld hl, wVramState - bit 7, [hl] - ret z - - ld hl, OBJECT_FLAGS2 - add hl, de - set 5, [hl] - ret - -CopyMapObjectToObjectStruct: ; 8116 - call .CopyMapObjectToTempObject - call CopyTempObjectToObjectStruct - ret - -.CopyMapObjectToTempObject: ; 811d - ld a, [hObjectStructIndexBuffer] - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld [hl], a - - ld a, [hMapObjectIndexBuffer] - ld [wTempObjectCopyMapObjectIndex], a - - ld hl, MAPOBJECT_SPRITE - add hl, bc - ld a, [hl] - ld [wTempObjectCopySprite], a - - call GetSpriteVTile - ld [wTempObjectCopySpriteVTile], a - - ld a, [hl] - call GetSpritePalette - ld [wTempObjectCopyPalette], a - - ld hl, MAPOBJECT_COLOR - add hl, bc - ld a, [hl] - and $f0 - jr z, .skip_color_override - swap a - and PALETTE_MASK - ld [wTempObjectCopyPalette], a - -.skip_color_override - ld hl, MAPOBJECT_MOVEMENT - add hl, bc - ld a, [hl] - ld [wTempObjectCopyMovement], a - - ld hl, MAPOBJECT_RANGE - add hl, bc - ld a, [hl] - ld [wTempObjectCopyRange], a - - ld hl, MAPOBJECT_X_COORD - add hl, bc - ld a, [hl] - ld [wTempObjectCopyX], a - - ld hl, MAPOBJECT_Y_COORD - add hl, bc - ld a, [hl] - ld [wTempObjectCopyY], a - - ld hl, MAPOBJECT_RADIUS - add hl, bc - ld a, [hl] - ld [wTempObjectCopyRadius], a - ret - -InitializeVisibleSprites: ; 8177 - ld bc, wMapObjects + OBJECT_LENGTH - ld a, 1 -.loop - ld [hMapObjectIndexBuffer], a - ld hl, MAPOBJECT_SPRITE - add hl, bc - ld a, [hl] - and a - jr z, .next - - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld a, [hl] - cp -1 - jr nz, .next - - ld a, [wXCoord] - ld d, a - ld a, [wYCoord] - ld e, a - - ld hl, MAPOBJECT_X_COORD - add hl, bc - ld a, [hl] - add 1 - sub d - jr c, .next - - cp MAPOBJECT_SCREEN_WIDTH - jr nc, .next - - ld hl, MAPOBJECT_Y_COORD - add hl, bc - ld a, [hl] - add 1 - sub e - jr c, .next - - cp MAPOBJECT_SCREEN_HEIGHT - jr nc, .next - - push bc - call CopyObjectStruct - pop bc - jp c, .ret - -.next - ld hl, OBJECT_LENGTH - add hl, bc - ld b, h - ld c, l - ld a, [hMapObjectIndexBuffer] - inc a - cp NUM_OBJECTS - jr nz, .loop - ret - -.ret ; 81c9 - ret - -CheckObjectEnteringVisibleRange:: ; 81ca - nop - ld a, [wPlayerStepDirection] - cp STANDING - ret z - ld hl, .dw - rst JumpTable - ret - -.dw ; 81d6 - dw .Down - dw .Up - dw .Left - dw .Right - -.Up: ; 81de - ld a, [wYCoord] - sub 1 - jr .Vertical - -.Down: ; 81e5 - ld a, [wYCoord] - add 9 -.Vertical: ; 81ea - ld d, a - ld a, [wXCoord] - ld e, a - ld bc, wMapObjects + OBJECT_LENGTH - ld a, 1 -.loop_v - ld [hMapObjectIndexBuffer], a - ld hl, MAPOBJECT_SPRITE - add hl, bc - ld a, [hl] - and a - jr z, .next_v - ld hl, MAPOBJECT_Y_COORD - add hl, bc - ld a, d - cp [hl] - jr nz, .next_v - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld a, [hl] - cp -1 - jr nz, .next_v - ld hl, MAPOBJECT_X_COORD - add hl, bc - ld a, [hl] - add 1 - sub e - jr c, .next_v - cp MAPOBJECT_SCREEN_WIDTH - jr nc, .next_v - push de - push bc - call CopyObjectStruct - pop bc - pop de - -.next_v - ld hl, OBJECT_LENGTH - add hl, bc - ld b, h - ld c, l - ld a, [hMapObjectIndexBuffer] - inc a - cp NUM_OBJECTS - jr nz, .loop_v - ret - -.Left: ; 8232 - ld a, [wXCoord] - sub 1 - jr .Horizontal - -.Right: ; 8239 - ld a, [wXCoord] - add 10 -.Horizontal: ; 823e - ld e, a - ld a, [wYCoord] - ld d, a - ld bc, wMapObjects + OBJECT_LENGTH - ld a, 1 -.loop_h - ld [hMapObjectIndexBuffer], a - ld hl, MAPOBJECT_SPRITE - add hl, bc - ld a, [hl] - and a - jr z, .next_h - ld hl, MAPOBJECT_X_COORD - add hl, bc - ld a, e - cp [hl] - jr nz, .next_h - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld a, [hl] - cp -1 - jr nz, .next_h - ld hl, MAPOBJECT_Y_COORD - add hl, bc - ld a, [hl] - add 1 - sub d - jr c, .next_h - cp MAPOBJECT_SCREEN_HEIGHT - jr nc, .next_h - push de - push bc - call CopyObjectStruct - pop bc - pop de - -.next_h - ld hl, OBJECT_LENGTH - add hl, bc - ld b, h - ld c, l - ld a, [hMapObjectIndexBuffer] - inc a - cp NUM_OBJECTS - jr nz, .loop_h - ret - -CopyTempObjectToObjectStruct: ; 8286 - ld a, [wTempObjectCopyMapObjectIndex] - ld hl, OBJECT_MAP_OBJECT_INDEX - add hl, de - ld [hl], a - - ld a, [wTempObjectCopyMovement] - call CopySpriteMovementData - - ld a, [wTempObjectCopyPalette] - ld hl, OBJECT_PALETTE - add hl, de - or [hl] - ld [hl], a - - ld a, [wTempObjectCopyY] - call .InitYCoord - - ld a, [wTempObjectCopyX] - call .InitXCoord - - ld a, [wTempObjectCopySprite] - ld hl, OBJECT_SPRITE - add hl, de - ld [hl], a - - ld a, [wTempObjectCopySpriteVTile] - ld hl, OBJECT_SPRITE_TILE - add hl, de - ld [hl], a - - ld hl, OBJECT_STEP_TYPE - add hl, de - ld [hl], STEP_TYPE_00 - - ld hl, OBJECT_FACING_STEP - add hl, de - ld [hl], STANDING - - ld a, [wTempObjectCopyRadius] - call .InitRadius - - ld a, [wTempObjectCopyRange] - ld hl, OBJECT_RANGE - add hl, de - ld [hl], a - - and a - ret - -.InitYCoord: ; 82d5 - ld hl, OBJECT_INIT_Y - add hl, de - ld [hl], a - - ld hl, OBJECT_NEXT_MAP_Y - add hl, de - ld [hl], a - - ld hl, wYCoord - sub [hl] - and $f - swap a - ld hl, wPlayerBGMapOffsetY - sub [hl] - ld hl, OBJECT_SPRITE_Y - add hl, de - ld [hl], a - ret - -.InitXCoord: ; 82f1 - ld hl, OBJECT_INIT_X - add hl, de - ld [hl], a - ld hl, OBJECT_NEXT_MAP_X - add hl, de - ld [hl], a - ld hl, wXCoord - sub [hl] - and $f - swap a - ld hl, wPlayerBGMapOffsetX - sub [hl] - ld hl, OBJECT_SPRITE_X - add hl, de - ld [hl], a - ret - -.InitRadius: ; 830d - ld h, a - inc a - and $f - ld l, a - ld a, h - add $10 - and $f0 - or l - ld hl, OBJECT_RADIUS - add hl, de - ld [hl], a - ret - -TrainerWalkToPlayer: ; 831e - ld a, [hLastTalked] - call InitMovementBuffer - ld a, movement_step_sleep - call AppendToMovementBuffer - ld a, [wd03f] - dec a - jr z, .TerminateStep - ld a, [hLastTalked] - ld b, a - ld c, PLAYER - ld d, 1 - call .GetPathToPlayer - call DecrementMovementBufferCount - -.TerminateStep: - ld a, movement_step_end - call AppendToMovementBuffer - ret - -.GetPathToPlayer: ; 8341 - push de - push bc -; get player object struct, load to de - ld a, c - call GetMapObject - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld a, [hl] - call GetObjectStruct - ld d, b - ld e, c - -; get last talked object struct, load to bc - pop bc - ld a, b - call GetMapObject - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld a, [hl] - call GetObjectStruct - -; get last talked coords, load to bc - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld c, [hl] - ld b, a - -; get player coords, load to de - ld hl, OBJECT_NEXT_MAP_X - add hl, de - ld a, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, de - ld e, [hl] - ld d, a - - pop af - call ComputePathToWalkToPlayer - ret - -SurfStartStep: ; 8379 - call InitMovementBuffer - call .GetMovementData - call AppendToMovementBuffer - ld a, movement_step_end - call AppendToMovementBuffer - ret - -.GetMovementData: ; 8388 - ld a, [wPlayerDirection] - srl a - srl a - maskbits NUM_DIRECTIONS - ld e, a - ld d, 0 - ld hl, .movement_data - add hl, de - ld a, [hl] - ret - -.movement_data - slow_step DOWN - slow_step UP - slow_step LEFT - slow_step RIGHT - -FollowNotExact:: ; 839e - push bc - ld a, c - call CheckObjectVisibility - ld d, b - ld e, c - pop bc - ret c - - ld a, b - call CheckObjectVisibility - ret c - -; object 2 is now in bc, object 1 is now in de - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld c, [hl] - ld b, a - - ld hl, OBJECT_NEXT_MAP_X - add hl, de - ld a, [hl] - cp b - jr z, .same_x - jr c, .to_the_left - inc b - jr .continue - -.to_the_left - dec b - jr .continue - -.same_x - ld hl, OBJECT_NEXT_MAP_Y - add hl, de - ld a, [hl] - cp c - jr z, .continue - jr c, .below - inc c - jr .continue - -.below - dec c - -.continue - ld hl, OBJECT_NEXT_MAP_X - add hl, de - ld [hl], b - ld a, b - ld hl, wXCoord - sub [hl] - and $f - swap a - ld hl, wPlayerBGMapOffsetX - sub [hl] - ld hl, OBJECT_SPRITE_X - add hl, de - ld [hl], a - ld hl, OBJECT_NEXT_MAP_Y - add hl, de - ld [hl], c - ld a, c - ld hl, wYCoord - sub [hl] - and $f - swap a - ld hl, wPlayerBGMapOffsetY - sub [hl] - ld hl, OBJECT_SPRITE_Y - add hl, de - ld [hl], a - ld a, [hObjectStructIndexBuffer] - ld hl, OBJECT_RANGE - add hl, de - ld [hl], a - ld hl, OBJECT_MOVEMENTTYPE - add hl, de - ld [hl], SPRITEMOVEDATA_FOLLOWNOTEXACT - ld hl, OBJECT_STEP_TYPE - add hl, de - ld [hl], STEP_TYPE_00 - ret - -GetRelativeFacing:: ; 8417 -; Determines which way map object e would have to turn to face map object d. Returns carry if it's impossible for whatever reason. - ld a, d - call GetMapObject - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld a, [hl] - cp NUM_OBJECT_STRUCTS - jr nc, .carry - ld d, a - ld a, e - call GetMapObject - ld hl, MAPOBJECT_OBJECT_STRUCT_ID - add hl, bc - ld a, [hl] - cp NUM_OBJECT_STRUCTS - jr nc, .carry - ld e, a - call .GetFacing_e_relativeto_d - ret - -.carry - scf - ret - -.GetFacing_e_relativeto_d: ; 8439 -; Determines which way object e would have to turn to face object d. Returns carry if it's impossible. -; load the coordinates of object d into bc - ld a, d - call GetObjectStruct - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld c, [hl] - ld b, a - push bc -; load the coordinates of object e into de - ld a, e - call GetObjectStruct - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - pop bc -; |x1 - x2| - ld a, b - sub d - jr z, .same_x_1 - jr nc, .b_right_of_d_1 - cpl - inc a - -.b_right_of_d_1 -; |y1 - y2| - ld h, a - ld a, c - sub e - jr z, .same_y_1 - jr nc, .c_below_e_1 - cpl - inc a - -.c_below_e_1 -; |y1 - y2| - |x1 - x2| - sub h - jr c, .same_y_1 - -.same_x_1 -; compare the y coordinates - ld a, c - cp e - jr z, .same_x_and_y - jr c, .c_directly_below_e -; c directly above e - ld d, DOWN - and a - ret - -.c_directly_below_e - ld d, UP - and a - ret - -.same_y_1 - ld a, b - cp d - jr z, .same_x_and_y - jr c, .b_directly_right_of_d -; b directly left of d - ld d, RIGHT - and a - ret - -.b_directly_right_of_d - ld d, LEFT - and a - ret - -.same_x_and_y - scf - ret - -QueueFollowerFirstStep: ; 848a - call .QueueFirstStep - jr c, .same - ld [wFollowMovementQueue], a - xor a - ld [wFollowerMovementQueueLength], a - ret - -.same - ld a, -1 - ld [wFollowerMovementQueueLength], a - ret - -.QueueFirstStep: - ld a, [wObjectFollow_Leader] - call GetObjectStruct - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld d, [hl] - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld e, [hl] - ld a, [wObjectFollow_Follower] - call GetObjectStruct - ld hl, OBJECT_NEXT_MAP_X - add hl, bc - ld a, d - cp [hl] - jr z, .check_y - jr c, .left - and a - ld a, movement_step + RIGHT - ret - -.left - and a - ld a, movement_step + LEFT - ret - -.check_y - ld hl, OBJECT_NEXT_MAP_Y - add hl, bc - ld a, e - cp [hl] - jr z, .same_xy - jr c, .up - and a - ld a, movement_step + DOWN - ret - -.up - and a - ld a, movement_step + UP - ret - -.same_xy - scf - ret diff --git a/engine/player_step.asm b/engine/player_step.asm deleted file mode 100755 index 675c6553b..000000000 --- a/engine/player_step.asm +++ /dev/null @@ -1,270 +0,0 @@ -_HandlePlayerStep:: ; d497 (3:5497) - ld a, [wPlayerStepFlags] - and a - ret z - bit 7, a ; starting step - jr nz, .update_overworld_map - bit 6, a ; finishing step - jr nz, .update_player_coords - bit 5, a ; ongoing step - jr nz, .finish - ret - -.update_overworld_map - ld a, 4 - ld [wHandlePlayerStep], a - call UpdateOverworldMap - jr .finish - -.update_player_coords - call UpdatePlayerCoords - jr .finish - -.finish - call HandlePlayerStep - ld a, [wPlayerStepVectorX] - ld d, a - ld a, [wPlayerStepVectorY] - ld e, a - ld a, [wPlayerBGMapOffsetX] - sub d - ld [wPlayerBGMapOffsetX], a - ld a, [wPlayerBGMapOffsetY] - sub e - ld [wPlayerBGMapOffsetY], a - ret - -ScrollScreen:: ; d4d2 (3:54d2) - ld a, [wPlayerStepVectorX] - ld d, a - ld a, [wPlayerStepVectorY] - ld e, a - ld a, [hSCX] - add d - ld [hSCX], a - ld a, [hSCY] - add e - ld [hSCY], a - ret - -HandlePlayerStep: ; d4e5 (3:54e5) - ld hl, wHandlePlayerStep - ld a, [hl] - and a - ret z - dec [hl] - ld a, [hl] - ld hl, .Jumptable - rst JumpTable - ret - -.Jumptable: ; d4f2 (3:54f2) - dw GetMovementPermissions - dw BufferScreen - dw .mobile - dw .fail2 -; The rest are never used. Ever. - dw .fail1 - dw .fail1 - dw .fail1 - dw .fail1 - dw .fail1 - dw .fail1 - dw .fail1 - -.fail1 ; d508 (3:5508) - ret - -.mobile ; d509 (3:5509) - farcall StubbedTrainerRankings_StepCount - ret - -.fail2 ; d510 (3:5510) - ret - -UpdatePlayerCoords: ; d511 (3:5511) - ld a, [wPlayerStepDirection] - and a - jr nz, .check_step_down - ld hl, wYCoord - inc [hl] - ret - -.check_step_down - cp UP - jr nz, .check_step_left - ld hl, wYCoord - dec [hl] - ret - -.check_step_left - cp LEFT - jr nz, .check_step_right - ld hl, wXCoord - dec [hl] - ret - -.check_step_right - cp RIGHT - ret nz - ld hl, wXCoord - inc [hl] - ret - -UpdateOverworldMap: ; d536 (3:5536) - ld a, [wPlayerStepDirection] - and a - jr z, .step_down - cp UP - jr z, .step_up - cp LEFT - jr z, .step_left - cp RIGHT - jr z, .step_right - ret - -.step_down - call .ScrollOverworldMapDown - call LoadMapPart - call ScrollMapUp - ret - -.step_up - call .ScrollOverworldMapUp - call LoadMapPart - call ScrollMapDown - ret - -.step_left - call .ScrollOverworldMapLeft - call LoadMapPart - call ScrollMapRight - ret - -.step_right - call .ScrollOverworldMapRight - call LoadMapPart - call ScrollMapLeft - ret - -.ScrollOverworldMapDown: ; d571 (3:5571) - ld a, [wBGMapAnchor] - add 2 * BG_MAP_WIDTH - ld [wBGMapAnchor], a - jr nc, .not_overflowed - ld a, [wBGMapAnchor + 1] - inc a - and %11 - or HIGH(vBGMap0) - ld [wBGMapAnchor + 1], a -.not_overflowed - ld hl, wMetatileStandingY - inc [hl] - ld a, [hl] - cp 2 ; was 1 - jr nz, .done_down - ld [hl], 0 - call .Add6ToOverworldMapAnchor -.done_down - ret - -.Add6ToOverworldMapAnchor: ; d595 (3:5595) - ld hl, wOverworldMapAnchor - ld a, [wMapWidth] - add 6 - add [hl] - ld [hli], a - ret nc - inc [hl] - ret - -.ScrollOverworldMapUp: ; d5a2 (3:55a2) - ld a, [wBGMapAnchor] - sub 2 * BG_MAP_WIDTH - ld [wBGMapAnchor], a - jr nc, .not_underflowed - ld a, [wBGMapAnchor + 1] - dec a - and %11 - or HIGH(vBGMap0) - ld [wBGMapAnchor + 1], a -.not_underflowed - ld hl, wMetatileStandingY - dec [hl] - ld a, [hl] - cp -1 ; was 0 - jr nz, .done_up - ld [hl], $1 - call .Sub6FromOverworldMapAnchor -.done_up - ret - -.Sub6FromOverworldMapAnchor: ; d5c6 (3:55c6) - ld hl, wOverworldMapAnchor - ld a, [wMapWidth] - add 6 - ld b, a - ld a, [hl] - sub b - ld [hli], a - ret nc - dec [hl] - ret - -.ScrollOverworldMapLeft: ; d5d5 (3:55d5) - ld a, [wBGMapAnchor] - ld e, a - and $e0 - ld d, a - ld a, e - sub $2 - and $1f - or d - ld [wBGMapAnchor], a - ld hl, wMetatileStandingX - dec [hl] - ld a, [hl] - cp -1 - jr nz, .done_left - ld [hl], 1 - call .DecrementwOverworldMapAnchor -.done_left - ret - -.DecrementwOverworldMapAnchor: ; d5f4 (3:55f4) - ld hl, wOverworldMapAnchor - ld a, [hl] - sub 1 - ld [hli], a - ret nc - dec [hl] - ret - -.ScrollOverworldMapRight: ; d5fe (3:55fe) - ld a, [wBGMapAnchor] - ld e, a - and $e0 - ld d, a - ld a, e - add $2 - and $1f - or d - ld [wBGMapAnchor], a - ld hl, wMetatileStandingX - inc [hl] - ld a, [hl] - cp 2 - jr nz, .done_right - ld [hl], 0 - call .IncrementwOverworldMapAnchor -.done_right - ret - -.IncrementwOverworldMapAnchor: ; d61d (3:561d) - ld hl, wOverworldMapAnchor - ld a, [hl] - add 1 - ld [hli], a - ret nc - inc [hl] - ret diff --git a/engine/pokegear.asm b/engine/pokegear.asm deleted file mode 100755 index f04276b2d..000000000 --- a/engine/pokegear.asm +++ /dev/null @@ -1,3097 +0,0 @@ -; Pokégear cards - const_def - const POKEGEARCARD_CLOCK ; 0 - const POKEGEARCARD_MAP ; 1 - const POKEGEARCARD_PHONE ; 2 - const POKEGEARCARD_RADIO ; 3 -NUM_POKEGEAR_CARDS EQU const_value - -; PokegearJumptable.Jumptable indexes - const_def - const POKEGEARSTATE_CLOCKINIT ; 0 - const POKEGEARSTATE_CLOCKJOYPAD ; 1 - const POKEGEARSTATE_MAPCHECKREGION ; 2 - const POKEGEARSTATE_JOHTOMAPINIT ; 3 - const POKEGEARSTATE_JOHTOMAPJOYPAD ; 4 - const POKEGEARSTATE_KANTOMAPINIT ; 5 - const POKEGEARSTATE_KANTOMAPJOYPAD ; 6 - const POKEGEARSTATE_PHONEINIT ; 7 - const POKEGEARSTATE_PHONEJOYPAD ; 8 - const POKEGEARSTATE_MAKEPHONECALL ; 9 - const POKEGEARSTATE_FINISHPHONECALL ; a - const POKEGEARSTATE_RADIOINIT ; b - const POKEGEARSTATE_RADIOJOYPAD ; c - -PokeGear: ; 90b8d (24:4b8d) - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - ld a, [wVramState] - push af - xor a - ld [wVramState], a - call .InitTilemap - call DelayFrame -.loop - call UpdateTime - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call PokegearJumptable - farcall PlaySpriteAnimations - call DelayFrame - jr .loop - -.done - ld de, SFX_READ_TEXT_2 - call PlaySFX - call WaitSFX - pop af - ld [wVramState], a - pop af - ld [hInMenu], a - pop af - ld [wOptions], a - call ClearBGPalettes - xor a ; LOW(vBGMap0) - ld [hBGMapAddress], a - ld a, HIGH(vBGMap0) - 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 - farcall ClearSpriteAnims - call InitPokegearModeIndicatorArrow - ld a, 8 - call SkipMusic - ld a, LCDC_DEFAULT - ld [rLCDC], a - call TownMap_InitCursorAndPlayerIconPositions - xor a - ld [wJumptableIndex], a ; POKEGEARSTATE_CLOCKINIT - ld [wPokegearCard], a ; POKEGEARCARD_CLOCK - ld [wPokegearMapRegion], a ; JOHTO_REGION - 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 tile $30 - ld a, BANK(PokegearGFX) - call FarDecompress - ld hl, PokegearSpritesGFX - ld de, vTiles0 - ld a, BANK(PokegearSpritesGFX) - call Decompress - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - call GetWorldMapLocation - cp FAST_SHIP - jr z, .ssaqua - farcall 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, wPokegearCard - 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 ; POKEGEARCARD_CLOCK - db $10 ; POKEGEARCARD_MAP - db $20 ; POKEGEARCARD_PHONE - db $30 ; POKEGEARCARD_RADIO -; 90d56 - -TownMap_GetCurrentLandmark: ; 90d56 - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - call GetWorldMapLocation - cp SPECIAL_MAP - ret nz - ld a, [wBackupMapGroup] - ld b, a - ld a, [wBackupMapNumber] - ld c, a - call GetWorldMapLocation - ret - -; 90d70 - -TownMap_InitCursorAndPlayerIconPositions: ; 90d70 (24:4d70) - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - call GetWorldMapLocation - cp FAST_SHIP - jr z, .FastShip - cp SPECIAL_MAP - jr nz, .LoadLandmark - ld a, [wBackupMapGroup] - ld b, a - ld a, [wBackupMapNumber] - 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, POKEGEARSTATE_CLOCKINIT - ld [wJumptableIndex], a - xor a ; POKEGEARCARD_CLOCK - ld [wPokegearCard], a - ret - -InitPokegearTilemap: ; 90da8 (24:4da8) - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $4f - call ByteFill - ld a, [wPokegearCard] - maskbits NUM_POKEGEAR_CARDS - 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 - farcall TownMapPals - ld a, [wPokegearMapRegion] - and a - jr nz, .kanto_0 - xor a ; LOW(vBGMap0) - ld [hBGMapAddress], a - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - call .UpdateBGMap - ld a, $90 - jr .finish - -.kanto_0 - xor a ; LOW(vBGMap1) - ld [hBGMapAddress], a - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - call .UpdateBGMap - xor a -.finish - ld [hWY], a - ; swap region maps - ld a, [wPokegearMapRegion] - maskbits NUM_REGIONS - xor 1 - ld [wPokegearMapRegion], 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 -; entries correspond to POKEGEARCARD_* constants - 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 - farcall PokegearMap - ld a, $07 - ld bc, $12 - hlcoord 1, 2 - call ByteFill - hlcoord 0, 2 - ld [hl], $06 - 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 GetMapPhoneService - 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 POKEGEAR_MAP_CARD_F, a - call nz, .PlaceMapIcon - ld a, [de] - bit POKEGEAR_PHONE_CARD_F, a - call nz, .PlacePhoneIcon - ld a, [de] - bit POKEGEAR_RADIO_CARD_F, 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) -; entries correspond to POKEGEARSTATE_* constants - 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 POKEGEAR_MAP_CARD_F, a - jr z, .no_map_card - ld c, POKEGEARSTATE_MAPCHECKREGION - ld b, POKEGEARCARD_MAP - jr .done - -.no_map_card - ld a, [wPokegearFlags] - bit POKEGEAR_PHONE_CARD_F, a - jr z, .no_phone_card - ld c, POKEGEARSTATE_PHONEINIT - ld b, POKEGEARCARD_PHONE - jr .done - -.no_phone_card - ld a, [wPokegearFlags] - bit POKEGEAR_RADIO_CARD_F, a - ret z - ld c, POKEGEARSTATE_RADIOINIT - ld b, POKEGEARCARD_RADIO -.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 - farcall 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, POKEGEARSTATE_JOHTOMAPINIT - jr .done - ret - -.kanto - ld a, POKEGEARSTATE_KANTOMAPINIT -.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 POKEGEAR_PHONE_CARD_F, a - jr z, .no_phone - ld c, POKEGEARSTATE_PHONEINIT - ld b, POKEGEARCARD_PHONE - jr .done - -.no_phone - ld a, [wPokegearFlags] - bit POKEGEAR_RADIO_CARD_F, a - ret z - ld c, POKEGEARSTATE_RADIOINIT - ld b, POKEGEARCARD_RADIO - jr .done - -.left - ld c, POKEGEARSTATE_CLOCKINIT - ld b, POKEGEARCARD_CLOCK -.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, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, 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 - farcall 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], $04 - 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 - farcall GetLandmarkName - pop de - farcall TownMap_ConvertLineBreakCharacters - hlcoord 8, 0 - ld [hl], $34 - ret - -; 910d4 - -PokegearMap_UpdateCursorPosition: ; 910d4 - push bc - ld e, a - farcall 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, [wStatusFlags] - bit STATUSFLAGS_HALL_OF_FAME_F, 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], $08 - 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 POKEGEAR_PHONE_CARD_F, a - jr z, .no_phone - ld c, POKEGEARSTATE_PHONEINIT - ld b, POKEGEARCARD_PHONE - jr .switch_page - -.no_phone - ld a, [wPokegearFlags] - bit POKEGEAR_MAP_CARD_F, a - jr z, .no_map - ld c, POKEGEARSTATE_MAPCHECKREGION - ld b, POKEGEARCARD_MAP - jr .switch_page - -.no_map - ld c, POKEGEARSTATE_CLOCKINIT - ld b, POKEGEARCARD_CLOCK -.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 POKEGEAR_MAP_CARD_F, a - jr z, .no_map - ld c, POKEGEARSTATE_MAPCHECKREGION - ld b, POKEGEARCARD_MAP - jr .switch_page - -.no_map - ld c, POKEGEARSTATE_CLOCKINIT - ld b, POKEGEARCARD_CLOCK - jr .switch_page - -.right - ld a, [wPokegearFlags] - bit POKEGEAR_RADIO_CARD_F, a - ret z - ld c, POKEGEARSTATE_RADIOINIT - ld b, POKEGEARCARD_RADIO -.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, POKEGEARSTATE_PHONEJOYPAD - ld [wJumptableIndex], a - ret - -PokegearPhone_MakePhoneCall: ; 911eb (24:51eb) - call GetMapPhoneService - and a - jr nz, .no_service - ld hl, wOptions - 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, wOptions - set NO_TEXT_SCROLL, [hl] - ld a, $1 - ld [hInMenu], a - call PokegearPhone_UpdateCursor - ld hl, wJumptableIndex - inc [hl] - ret - -.no_service - farcall Phone_NoSignal - ld hl, .OutOfServiceArea - call PrintText - ld a, POKEGEARSTATE_PHONEJOYPAD - 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 - farcall HangUp - ld a, POKEGEARSTATE_PHONEJOYPAD - 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] - farcall 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 - -; unused - 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 [wPokegearCard], a - call DeleteSpriteAnimStruct2ToEnd - ret - -ExitPokegearRadio_HandleMusic: ; 91492 - ld a, [wPokegearRadioMusicPlaying] - cp RESTART_MAP_MUSIC - jr z, .restart_map_music - cp ENTER_MAP_MUSIC - 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, wSpriteAnim2 - ld bc, wSpriteAnimationStructsEnd - wSpriteAnim2 - xor a - call ByteFill - ld a, 2 - ld [wSpriteAnimCount], a - ret - -Pokegear_LoadTilemapRLE: ; 914bb (24:54bb) - ; Format: repeat count, tile ID - ; Terminated with -1 - hlcoord 0, 0 -.loop - ld a, [de] - cp -1 - 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) - -; unused - ld [wPokegearRadioChannelBank], a - ld a, [hli] - ld [wPokegearRadioChannelAddr], a - ld a, [hli] - ld [wPokegearRadioChannelAddr + 1], a - ret - -; 916ad - -RadioChannels: -; entries correspond to constants/radio_constants.asm - -; 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, [wTimeOfDay] - 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 POKEGEAR_EXPN_CARD_F, a - jr z, .NoSignal - jp LoadStation_PlacesAndPeople - -.LetsAllSing: - call .InJohto - jr c, .NoSignal - ld a, [wPokegearFlags] - bit POKEGEAR_EXPN_CARD_F, a - jr z, .NoSignal - jp LoadStation_LetsAllSing - -.PokeFluteRadio: - call .InJohto - jr c, .NoSignal - ld a, [wPokegearFlags] - bit POKEGEAR_EXPN_CARD_F, 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, [wStatusFlags] - bit STATUSFLAGS_ROCKET_SIGNAL_F, 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, [wStatusFlags2] - bit STATUSFLAGS2_ROCKETS_IN_RADIO_TOWER_F, 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, UnownStationName - 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, UnownStationName - ret - -; 91853 (24:5853) - -Unreferenced_LoadStation: ; 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, RESTART_MAP_MUSIC - 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, ENTER_MAP_MUSIC - 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 - lb bc, 4, 18 - call TextBox - ret - -; 918bf - -OaksPKMNTalkName: db "OAK's Talk@" -PokedexShowName: db "#DEX Show@" -PokemonMusicName: db "#MON Music@" -LuckyChannelName: db "Lucky Channel@" -UnownStationName: db "?????@" - -PlacesAndPeopleName: db "Places & People@" -LetsAllSingName: db "Let's All Sing!@" -PokeFluteStationName: db "# FLUTE@" -; 9191c - -_TownMap: ; 9191c - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - - ld a, [wVramState] - push af - xor a - ld [wVramState], a - - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - call Pokegear_LoadGFX - farcall ClearSpriteAnims - ld a, 8 - call SkipMusic - ld a, LCDC_DEFAULT - 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 [wVramState], a - pop af - ld [hInMenu], a - pop af - ld [wOptions], 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 - farcall 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, JOHTO_REGION - jr .okay_tilemap - -.kanto2 - ld e, KANTO_REGION -.okay_tilemap - farcall PokegearMap - ld a, $07 - ld bc, 6 - hlcoord 1, 0 - call ByteFill - hlcoord 0, 0 - ld [hl], $06 - hlcoord 7, 0 - ld [hl], $17 - hlcoord 7, 1 - ld [hl], $16 - hlcoord 7, 2 - ld [hl], $26 - ld a, $07 - ld bc, NAME_LENGTH - hlcoord 8, 2 - call ByteFill - hlcoord 19, 2 - ld [hl], $17 - ld a, [wTownMapCursorLandmark] - call PokegearMap_UpdateLandmarkName - farcall TownMapPals - ret -; 91a53 - -PlayRadio: ; 91a53 - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [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 [wOptions], a - call ExitPokegearRadio_HandleMusic - ret - -; 91a87 - -.PlayStation: ; 91a87 - ld a, ENTER_MAP_MUSIC - ld [wPokegearRadioMusicPlaying], 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 -; entries correspond to MAPRADIO_* constants - 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, [wTimeOfDay] - 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 - farcall 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 - farcall 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 ; LOW(vBGMap0) - ld [hBGMapAddress], a - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - ld a, [wTownMapPlayerIconLandmark] - ld e, a - ret - -; 91b73 - -FlyMapScroll: ; 91b73 - ld a, [wStartFlypoint] - ld e, a - ld a, [wEndFlypoint] - 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] - farcall GetLandmarkName - hlcoord 2, 1 - ld de, wStringBuffer1 - 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] - farcall 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, wVisitedSpawns - ld b, CHECK_FLAG - ld d, 0 - predef SmallFarFlagAction - ld a, c - ret - -; 91c5e - -INCLUDE "data/maps/flypoints.asm" - -ret_91c8f: ; 91c8f - ret - -; 91c90 - -FlyMap: ; 91c90 - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - 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, [wBackupMapGroup] - ld b, a - ld a, [wBackupMapNumber] - 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 [wStartFlypoint], a -; ..and end at Silver Cave. - ld a, FLY_MT_SILVER - ld [wEndFlypoint], 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 [wStartFlypoint], a -; ...and end at Indigo Plateau - ld a, FLY_INDIGO - ld [wEndFlypoint], 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 [wStartFlypoint], a -; ..and end at Silver Cave - ld a, FLY_MT_SILVER - ld [wEndFlypoint], 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 - -Pokedex_GetArea: ; 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_REGION - 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_REGION - call .GetAndPlaceNest - ret - -.right - ld a, [wStatusFlags] - bit STATUSFLAGS_HALL_OF_FAME_F, a - ret z - ld a, [hWY] - and a - ret z - call ClearSprites - xor a - ld [hWY], a - ld a, KANTO_REGION - 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, wVirtualOAM - ld bc, wVirtualOAMEnd - wVirtualOAM - 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 - farcall FindNest ; load nest landmarks into wTileMap[0,0] - decoord 0, 0 - ld hl, wVirtualOAMSprite00 -.nestloop - ld a, [de] - and a - jr z, .done_nest - push de - ld e, a - push hl - farcall GetLandmarkCoords - pop hl - ; load into OAM - ld a, d - sub 4 - ld [hli], a ; y - ld a, e - sub 4 - ld [hli], a ; x - ld a, $7f ; nest icon - ld [hli], a ; tile id - xor a - ld [hli], a ; attributes - ; next - pop de - inc de - jr .nestloop - -.done_nest - ld hl, wVirtualOAM - decoord 0, 0 - ld bc, wVirtualOAMEnd - wVirtualOAM - call CopyBytes - ret - -; 91e5a - -.HideNestsShowPlayer: ; 91e5a - call .CheckPlayerLocation - ret c - ld a, [wTownMapPlayerIconLandmark] - ld e, a - farcall GetLandmarkCoords - ld c, e - ld b, d - ld de, .PlayerOAM - ld hl, wVirtualOAMSprite00 -.ShowPlayerLoop: - ld a, [de] - cp $80 - jr z, .clear_oam - add b - ld [hli], a ; y - inc de - ld a, [de] - add c - ld [hli], a ; x - inc de - ld a, [de] - add $78 ; where the player's sprite is loaded - ld [hli], a ; tile id - inc de - push bc - ld c, PAL_OW_RED - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .male - inc c ; PAL_OW_BLUE -.male - ld a, c - ld [hli], a ; attributes - pop bc - jr .ShowPlayerLoop - -.clear_oam - ld hl, wVirtualOAMSprite04 - ld bc, wVirtualOAMEnd - wVirtualOAMSprite04 - xor a - call ByteFill - ret - -; 91e9c - -.PlayerOAM: ; 91e9c - ; y pxl, x pxl, tile offset - 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, wVirtualOAM - ld bc, wVirtualOAMEnd - wVirtualOAM - xor a - call ByteFill - scf - ret - -; 91ed0 - -.GetPlayerOrFastShipIcon: ; 91ed0 - ld a, [wTownMapPlayerIconLandmark] - cp FAST_SHIP - jr z, .FastShip - farcall 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, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT -.loop -; Current tile - ld a, [hli] - push hl -; The palette map covers tiles $00 to $5f; $60 and above 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 PALETTE_MASK - 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 PALETTE_MASK - 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 "gfx/pokegear/town_map_palette_map.asm" -; 91f7b - -TownMapMon: ; 91f7b -; Draw the FlyMon icon at town map location - -; Get FlyMon species - ld a, [wCurPartyMon] - ld hl, wPartySpecies - ld e, a - ld d, $0 - add hl, de - ld a, [hl] - ld [wd265], a -; Get FlyMon icon - ld e, $08 ; starting tile in VRAM - farcall 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], $08 - 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 - farcall 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, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, 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 - farcall 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), 48 - 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" - -Unreferenced_Function92311: - 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 - farcall 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 - farcall 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 ; LOW(vBGMap0) - ld [hBGMapAddress], a - ld a, HIGH(vBGMap0) - 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 diff --git a/engine/pokegear/pokegear.asm b/engine/pokegear/pokegear.asm new file mode 100755 index 000000000..f04276b2d --- /dev/null +++ b/engine/pokegear/pokegear.asm @@ -0,0 +1,3097 @@ +; Pokégear cards + const_def + const POKEGEARCARD_CLOCK ; 0 + const POKEGEARCARD_MAP ; 1 + const POKEGEARCARD_PHONE ; 2 + const POKEGEARCARD_RADIO ; 3 +NUM_POKEGEAR_CARDS EQU const_value + +; PokegearJumptable.Jumptable indexes + const_def + const POKEGEARSTATE_CLOCKINIT ; 0 + const POKEGEARSTATE_CLOCKJOYPAD ; 1 + const POKEGEARSTATE_MAPCHECKREGION ; 2 + const POKEGEARSTATE_JOHTOMAPINIT ; 3 + const POKEGEARSTATE_JOHTOMAPJOYPAD ; 4 + const POKEGEARSTATE_KANTOMAPINIT ; 5 + const POKEGEARSTATE_KANTOMAPJOYPAD ; 6 + const POKEGEARSTATE_PHONEINIT ; 7 + const POKEGEARSTATE_PHONEJOYPAD ; 8 + const POKEGEARSTATE_MAKEPHONECALL ; 9 + const POKEGEARSTATE_FINISHPHONECALL ; a + const POKEGEARSTATE_RADIOINIT ; b + const POKEGEARSTATE_RADIOJOYPAD ; c + +PokeGear: ; 90b8d (24:4b8d) + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + ld a, [wVramState] + push af + xor a + ld [wVramState], a + call .InitTilemap + call DelayFrame +.loop + call UpdateTime + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call PokegearJumptable + farcall PlaySpriteAnimations + call DelayFrame + jr .loop + +.done + ld de, SFX_READ_TEXT_2 + call PlaySFX + call WaitSFX + pop af + ld [wVramState], a + pop af + ld [hInMenu], a + pop af + ld [wOptions], a + call ClearBGPalettes + xor a ; LOW(vBGMap0) + ld [hBGMapAddress], a + ld a, HIGH(vBGMap0) + 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 + farcall ClearSpriteAnims + call InitPokegearModeIndicatorArrow + ld a, 8 + call SkipMusic + ld a, LCDC_DEFAULT + ld [rLCDC], a + call TownMap_InitCursorAndPlayerIconPositions + xor a + ld [wJumptableIndex], a ; POKEGEARSTATE_CLOCKINIT + ld [wPokegearCard], a ; POKEGEARCARD_CLOCK + ld [wPokegearMapRegion], a ; JOHTO_REGION + 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 tile $30 + ld a, BANK(PokegearGFX) + call FarDecompress + ld hl, PokegearSpritesGFX + ld de, vTiles0 + ld a, BANK(PokegearSpritesGFX) + call Decompress + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + call GetWorldMapLocation + cp FAST_SHIP + jr z, .ssaqua + farcall 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, wPokegearCard + 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 ; POKEGEARCARD_CLOCK + db $10 ; POKEGEARCARD_MAP + db $20 ; POKEGEARCARD_PHONE + db $30 ; POKEGEARCARD_RADIO +; 90d56 + +TownMap_GetCurrentLandmark: ; 90d56 + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + call GetWorldMapLocation + cp SPECIAL_MAP + ret nz + ld a, [wBackupMapGroup] + ld b, a + ld a, [wBackupMapNumber] + ld c, a + call GetWorldMapLocation + ret + +; 90d70 + +TownMap_InitCursorAndPlayerIconPositions: ; 90d70 (24:4d70) + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + call GetWorldMapLocation + cp FAST_SHIP + jr z, .FastShip + cp SPECIAL_MAP + jr nz, .LoadLandmark + ld a, [wBackupMapGroup] + ld b, a + ld a, [wBackupMapNumber] + 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, POKEGEARSTATE_CLOCKINIT + ld [wJumptableIndex], a + xor a ; POKEGEARCARD_CLOCK + ld [wPokegearCard], a + ret + +InitPokegearTilemap: ; 90da8 (24:4da8) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $4f + call ByteFill + ld a, [wPokegearCard] + maskbits NUM_POKEGEAR_CARDS + 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 + farcall TownMapPals + ld a, [wPokegearMapRegion] + and a + jr nz, .kanto_0 + xor a ; LOW(vBGMap0) + ld [hBGMapAddress], a + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + call .UpdateBGMap + ld a, $90 + jr .finish + +.kanto_0 + xor a ; LOW(vBGMap1) + ld [hBGMapAddress], a + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + call .UpdateBGMap + xor a +.finish + ld [hWY], a + ; swap region maps + ld a, [wPokegearMapRegion] + maskbits NUM_REGIONS + xor 1 + ld [wPokegearMapRegion], 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 +; entries correspond to POKEGEARCARD_* constants + 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 + farcall PokegearMap + ld a, $07 + ld bc, $12 + hlcoord 1, 2 + call ByteFill + hlcoord 0, 2 + ld [hl], $06 + 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 GetMapPhoneService + 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 POKEGEAR_MAP_CARD_F, a + call nz, .PlaceMapIcon + ld a, [de] + bit POKEGEAR_PHONE_CARD_F, a + call nz, .PlacePhoneIcon + ld a, [de] + bit POKEGEAR_RADIO_CARD_F, 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) +; entries correspond to POKEGEARSTATE_* constants + 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 POKEGEAR_MAP_CARD_F, a + jr z, .no_map_card + ld c, POKEGEARSTATE_MAPCHECKREGION + ld b, POKEGEARCARD_MAP + jr .done + +.no_map_card + ld a, [wPokegearFlags] + bit POKEGEAR_PHONE_CARD_F, a + jr z, .no_phone_card + ld c, POKEGEARSTATE_PHONEINIT + ld b, POKEGEARCARD_PHONE + jr .done + +.no_phone_card + ld a, [wPokegearFlags] + bit POKEGEAR_RADIO_CARD_F, a + ret z + ld c, POKEGEARSTATE_RADIOINIT + ld b, POKEGEARCARD_RADIO +.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 + farcall 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, POKEGEARSTATE_JOHTOMAPINIT + jr .done + ret + +.kanto + ld a, POKEGEARSTATE_KANTOMAPINIT +.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 POKEGEAR_PHONE_CARD_F, a + jr z, .no_phone + ld c, POKEGEARSTATE_PHONEINIT + ld b, POKEGEARCARD_PHONE + jr .done + +.no_phone + ld a, [wPokegearFlags] + bit POKEGEAR_RADIO_CARD_F, a + ret z + ld c, POKEGEARSTATE_RADIOINIT + ld b, POKEGEARCARD_RADIO + jr .done + +.left + ld c, POKEGEARSTATE_CLOCKINIT + ld b, POKEGEARCARD_CLOCK +.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, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, 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 + farcall 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], $04 + 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 + farcall GetLandmarkName + pop de + farcall TownMap_ConvertLineBreakCharacters + hlcoord 8, 0 + ld [hl], $34 + ret + +; 910d4 + +PokegearMap_UpdateCursorPosition: ; 910d4 + push bc + ld e, a + farcall 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, [wStatusFlags] + bit STATUSFLAGS_HALL_OF_FAME_F, 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], $08 + 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 POKEGEAR_PHONE_CARD_F, a + jr z, .no_phone + ld c, POKEGEARSTATE_PHONEINIT + ld b, POKEGEARCARD_PHONE + jr .switch_page + +.no_phone + ld a, [wPokegearFlags] + bit POKEGEAR_MAP_CARD_F, a + jr z, .no_map + ld c, POKEGEARSTATE_MAPCHECKREGION + ld b, POKEGEARCARD_MAP + jr .switch_page + +.no_map + ld c, POKEGEARSTATE_CLOCKINIT + ld b, POKEGEARCARD_CLOCK +.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 POKEGEAR_MAP_CARD_F, a + jr z, .no_map + ld c, POKEGEARSTATE_MAPCHECKREGION + ld b, POKEGEARCARD_MAP + jr .switch_page + +.no_map + ld c, POKEGEARSTATE_CLOCKINIT + ld b, POKEGEARCARD_CLOCK + jr .switch_page + +.right + ld a, [wPokegearFlags] + bit POKEGEAR_RADIO_CARD_F, a + ret z + ld c, POKEGEARSTATE_RADIOINIT + ld b, POKEGEARCARD_RADIO +.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, POKEGEARSTATE_PHONEJOYPAD + ld [wJumptableIndex], a + ret + +PokegearPhone_MakePhoneCall: ; 911eb (24:51eb) + call GetMapPhoneService + and a + jr nz, .no_service + ld hl, wOptions + 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, wOptions + set NO_TEXT_SCROLL, [hl] + ld a, $1 + ld [hInMenu], a + call PokegearPhone_UpdateCursor + ld hl, wJumptableIndex + inc [hl] + ret + +.no_service + farcall Phone_NoSignal + ld hl, .OutOfServiceArea + call PrintText + ld a, POKEGEARSTATE_PHONEJOYPAD + 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 + farcall HangUp + ld a, POKEGEARSTATE_PHONEJOYPAD + 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] + farcall 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 + +; unused + 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 [wPokegearCard], a + call DeleteSpriteAnimStruct2ToEnd + ret + +ExitPokegearRadio_HandleMusic: ; 91492 + ld a, [wPokegearRadioMusicPlaying] + cp RESTART_MAP_MUSIC + jr z, .restart_map_music + cp ENTER_MAP_MUSIC + 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, wSpriteAnim2 + ld bc, wSpriteAnimationStructsEnd - wSpriteAnim2 + xor a + call ByteFill + ld a, 2 + ld [wSpriteAnimCount], a + ret + +Pokegear_LoadTilemapRLE: ; 914bb (24:54bb) + ; Format: repeat count, tile ID + ; Terminated with -1 + hlcoord 0, 0 +.loop + ld a, [de] + cp -1 + 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) + +; unused + ld [wPokegearRadioChannelBank], a + ld a, [hli] + ld [wPokegearRadioChannelAddr], a + ld a, [hli] + ld [wPokegearRadioChannelAddr + 1], a + ret + +; 916ad + +RadioChannels: +; entries correspond to constants/radio_constants.asm + +; 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, [wTimeOfDay] + 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 POKEGEAR_EXPN_CARD_F, a + jr z, .NoSignal + jp LoadStation_PlacesAndPeople + +.LetsAllSing: + call .InJohto + jr c, .NoSignal + ld a, [wPokegearFlags] + bit POKEGEAR_EXPN_CARD_F, a + jr z, .NoSignal + jp LoadStation_LetsAllSing + +.PokeFluteRadio: + call .InJohto + jr c, .NoSignal + ld a, [wPokegearFlags] + bit POKEGEAR_EXPN_CARD_F, 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, [wStatusFlags] + bit STATUSFLAGS_ROCKET_SIGNAL_F, 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, [wStatusFlags2] + bit STATUSFLAGS2_ROCKETS_IN_RADIO_TOWER_F, 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, UnownStationName + 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, UnownStationName + ret + +; 91853 (24:5853) + +Unreferenced_LoadStation: ; 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, RESTART_MAP_MUSIC + 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, ENTER_MAP_MUSIC + 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 + lb bc, 4, 18 + call TextBox + ret + +; 918bf + +OaksPKMNTalkName: db "OAK's Talk@" +PokedexShowName: db "#DEX Show@" +PokemonMusicName: db "#MON Music@" +LuckyChannelName: db "Lucky Channel@" +UnownStationName: db "?????@" + +PlacesAndPeopleName: db "Places & People@" +LetsAllSingName: db "Let's All Sing!@" +PokeFluteStationName: db "# FLUTE@" +; 9191c + +_TownMap: ; 9191c + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + + ld a, [wVramState] + push af + xor a + ld [wVramState], a + + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + call Pokegear_LoadGFX + farcall ClearSpriteAnims + ld a, 8 + call SkipMusic + ld a, LCDC_DEFAULT + 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 [wVramState], a + pop af + ld [hInMenu], a + pop af + ld [wOptions], 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 + farcall 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, JOHTO_REGION + jr .okay_tilemap + +.kanto2 + ld e, KANTO_REGION +.okay_tilemap + farcall PokegearMap + ld a, $07 + ld bc, 6 + hlcoord 1, 0 + call ByteFill + hlcoord 0, 0 + ld [hl], $06 + hlcoord 7, 0 + ld [hl], $17 + hlcoord 7, 1 + ld [hl], $16 + hlcoord 7, 2 + ld [hl], $26 + ld a, $07 + ld bc, NAME_LENGTH + hlcoord 8, 2 + call ByteFill + hlcoord 19, 2 + ld [hl], $17 + ld a, [wTownMapCursorLandmark] + call PokegearMap_UpdateLandmarkName + farcall TownMapPals + ret +; 91a53 + +PlayRadio: ; 91a53 + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [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 [wOptions], a + call ExitPokegearRadio_HandleMusic + ret + +; 91a87 + +.PlayStation: ; 91a87 + ld a, ENTER_MAP_MUSIC + ld [wPokegearRadioMusicPlaying], 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 +; entries correspond to MAPRADIO_* constants + 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, [wTimeOfDay] + 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 + farcall 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 + farcall 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 ; LOW(vBGMap0) + ld [hBGMapAddress], a + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + ld a, [wTownMapPlayerIconLandmark] + ld e, a + ret + +; 91b73 + +FlyMapScroll: ; 91b73 + ld a, [wStartFlypoint] + ld e, a + ld a, [wEndFlypoint] + 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] + farcall GetLandmarkName + hlcoord 2, 1 + ld de, wStringBuffer1 + 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] + farcall 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, wVisitedSpawns + ld b, CHECK_FLAG + ld d, 0 + predef SmallFarFlagAction + ld a, c + ret + +; 91c5e + +INCLUDE "data/maps/flypoints.asm" + +ret_91c8f: ; 91c8f + ret + +; 91c90 + +FlyMap: ; 91c90 + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + 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, [wBackupMapGroup] + ld b, a + ld a, [wBackupMapNumber] + 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 [wStartFlypoint], a +; ..and end at Silver Cave. + ld a, FLY_MT_SILVER + ld [wEndFlypoint], 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 [wStartFlypoint], a +; ...and end at Indigo Plateau + ld a, FLY_INDIGO + ld [wEndFlypoint], 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 [wStartFlypoint], a +; ..and end at Silver Cave + ld a, FLY_MT_SILVER + ld [wEndFlypoint], 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 + +Pokedex_GetArea: ; 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_REGION + 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_REGION + call .GetAndPlaceNest + ret + +.right + ld a, [wStatusFlags] + bit STATUSFLAGS_HALL_OF_FAME_F, a + ret z + ld a, [hWY] + and a + ret z + call ClearSprites + xor a + ld [hWY], a + ld a, KANTO_REGION + 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, wVirtualOAM + ld bc, wVirtualOAMEnd - wVirtualOAM + 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 + farcall FindNest ; load nest landmarks into wTileMap[0,0] + decoord 0, 0 + ld hl, wVirtualOAMSprite00 +.nestloop + ld a, [de] + and a + jr z, .done_nest + push de + ld e, a + push hl + farcall GetLandmarkCoords + pop hl + ; load into OAM + ld a, d + sub 4 + ld [hli], a ; y + ld a, e + sub 4 + ld [hli], a ; x + ld a, $7f ; nest icon + ld [hli], a ; tile id + xor a + ld [hli], a ; attributes + ; next + pop de + inc de + jr .nestloop + +.done_nest + ld hl, wVirtualOAM + decoord 0, 0 + ld bc, wVirtualOAMEnd - wVirtualOAM + call CopyBytes + ret + +; 91e5a + +.HideNestsShowPlayer: ; 91e5a + call .CheckPlayerLocation + ret c + ld a, [wTownMapPlayerIconLandmark] + ld e, a + farcall GetLandmarkCoords + ld c, e + ld b, d + ld de, .PlayerOAM + ld hl, wVirtualOAMSprite00 +.ShowPlayerLoop: + ld a, [de] + cp $80 + jr z, .clear_oam + add b + ld [hli], a ; y + inc de + ld a, [de] + add c + ld [hli], a ; x + inc de + ld a, [de] + add $78 ; where the player's sprite is loaded + ld [hli], a ; tile id + inc de + push bc + ld c, PAL_OW_RED + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .male + inc c ; PAL_OW_BLUE +.male + ld a, c + ld [hli], a ; attributes + pop bc + jr .ShowPlayerLoop + +.clear_oam + ld hl, wVirtualOAMSprite04 + ld bc, wVirtualOAMEnd - wVirtualOAMSprite04 + xor a + call ByteFill + ret + +; 91e9c + +.PlayerOAM: ; 91e9c + ; y pxl, x pxl, tile offset + 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, wVirtualOAM + ld bc, wVirtualOAMEnd - wVirtualOAM + xor a + call ByteFill + scf + ret + +; 91ed0 + +.GetPlayerOrFastShipIcon: ; 91ed0 + ld a, [wTownMapPlayerIconLandmark] + cp FAST_SHIP + jr z, .FastShip + farcall 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, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT +.loop +; Current tile + ld a, [hli] + push hl +; The palette map covers tiles $00 to $5f; $60 and above 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 PALETTE_MASK + 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 PALETTE_MASK + 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 "gfx/pokegear/town_map_palette_map.asm" +; 91f7b + +TownMapMon: ; 91f7b +; Draw the FlyMon icon at town map location + +; Get FlyMon species + ld a, [wCurPartyMon] + ld hl, wPartySpecies + ld e, a + ld d, $0 + add hl, de + ld a, [hl] + ld [wd265], a +; Get FlyMon icon + ld e, $08 ; starting tile in VRAM + farcall 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], $08 + 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 + farcall 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, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, 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 + farcall 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), 48 + 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" + +Unreferenced_Function92311: + 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 + farcall 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 + farcall 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 ; LOW(vBGMap0) + ld [hBGMapAddress], a + ld a, HIGH(vBGMap0) + 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 diff --git a/engine/pokegear/radio.asm b/engine/pokegear/radio.asm new file mode 100644 index 000000000..ffaef80f0 --- /dev/null +++ b/engine/pokegear/radio.asm @@ -0,0 +1,1932 @@ +PlayRadioShow: +; If we're already in the radio program proper, we don't need to be here. + ld a, [wCurrentRadioLine] + cp POKE_FLUTE_RADIO + jr nc, .ok +; If Team Rocket is not occupying the radio tower, we don't need to be here. + ld a, [wStatusFlags2] + bit STATUSFLAGS2_ROCKETS_IN_RADIO_TOWER_F, a + jr z, .ok +; If we're in Kanto, we don't need to be here. + call IsInJohto + and a + jr nz, .ok +; Team Rocket broadcasts on all stations. + ld a, ROCKET_RADIO + ld [wCurrentRadioLine], a +.ok +; Jump to the currently loaded station. The index to which we need to jump is in wCurrentRadioLine. + ld a, [wCurrentRadioLine] + ld e, a + ld d, 0 + ld hl, RadioJumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +RadioJumptable: +; entries correspond to constants/radio_constants.asm + dw OaksPKMNTalk1 ; $00 + dw PokedexShow1 ; $01 + dw BenMonMusic1 ; $02 + dw LuckyNumberShow1 ; $03 + dw BuenasPassword1 ; $04 + dw PeoplePlaces1 ; $05 + dw FernMonMusic1 ; $06 + dw RocketRadio1 ; $07 + dw PokeFluteRadio ; $08 + dw UnownRadio ; $09 + dw EvolutionRadio ; $0a +; OaksPKMNTalk + dw OaksPKMNTalk2 ; $0b + dw OaksPKMNTalk3 ; $0c + dw OaksPKMNTalk4 ; $0d + dw OaksPKMNTalk5 ; $0e + dw OaksPKMNTalk6 ; $0f + dw OaksPKMNTalk7 ; $10 + dw OaksPKMNTalk8 ; $11 + dw OaksPKMNTalk9 ; $12 + dw PokedexShow2 ; $13 + dw PokedexShow3 ; $14 + dw PokedexShow4 ; $15 + dw PokedexShow5 ; $16 +; Ben Music + dw BenMonMusic2 ; $17 + dw BenMonMusic3 ; $18 + dw BenFernMusic4 ; $19 + dw BenFernMusic5 ; $1a + dw BenFernMusic6 ; $1b + dw BenFernMusic7 ; $1c + dw FernMonMusic2 ; $1d +; Lucky Number Show + dw LuckyNumberShow2 ; $1e + dw LuckyNumberShow3 ; $1f + dw LuckyNumberShow4 ; $20 + dw LuckyNumberShow5 ; $21 + dw LuckyNumberShow6 ; $22 + dw LuckyNumberShow7 ; $23 + dw LuckyNumberShow8 ; $24 + dw LuckyNumberShow9 ; $25 + dw LuckyNumberShow10 ; $26 + dw LuckyNumberShow11 ; $27 + dw LuckyNumberShow12 ; $28 + dw LuckyNumberShow13 ; $29 + dw LuckyNumberShow14 ; $2a + dw LuckyNumberShow15 ; $2b +; People & Places + dw PeoplePlaces2 ; $2c + dw PeoplePlaces3 ; $2d + dw PeoplePlaces4 ; $2e + dw PeoplePlaces5 ; $2f + dw PeoplePlaces6 ; $30 + dw PeoplePlaces7 ; $31 +; Rocket Radio + dw RocketRadio2 ; $32 + dw RocketRadio3 ; $33 + dw RocketRadio4 ; $34 + dw RocketRadio5 ; $35 + dw RocketRadio6 ; $36 + dw RocketRadio7 ; $37 + dw RocketRadio8 ; $38 + dw RocketRadio9 ; $39 + dw RocketRadio10 ; $3a +; More Pokemon Channel stuff + dw OaksPKMNTalk10 ; $3b + dw OaksPKMNTalk11 ; $3c + dw OaksPKMNTalk12 ; $3d + dw OaksPKMNTalk13 ; $3e + dw OaksPKMNTalk14 ; $3f +; Buenas Password + dw BuenasPassword2 ; $40 + dw BuenasPassword3 ; $41 + dw BuenasPassword4 ; $42 + dw BuenasPassword5 ; $43 + dw BuenasPassword6 ; $44 + dw BuenasPassword7 ; $45 + dw BuenasPassword8 ; $46 + dw BuenasPassword9 ; $47 + dw BuenasPassword10 ; $48 + dw BuenasPassword11 ; $49 + dw BuenasPassword12 ; $4a + dw BuenasPassword13 ; $4b + dw BuenasPassword14 ; $4c + dw BuenasPassword15 ; $4d + dw BuenasPassword16 ; $4e + dw BuenasPassword17 ; $4f + dw BuenasPassword18 ; $50 + dw BuenasPassword19 ; $51 + dw BuenasPassword20 ; $52 + dw BuenasPassword21 ; $53 + dw RadioScroll ; $54 +; More Pokemon Channel stuff + dw PokedexShow6 ; $55 + dw PokedexShow7 ; $56 + dw PokedexShow8 ; $57 + + +PrintRadioLine: + ld [wNextRadioLine], a + ld hl, wRadioText + ld a, [wNumRadioLinesPrinted] + cp 2 + jr nc, .print + inc hl + ld [hl], TX_START + inc a + ld [wNumRadioLinesPrinted], a + cp 2 + jr nz, .print + bccoord 1, 16 + call PlaceHLTextAtBC + jr .skip +.print + call PrintTextBoxText +.skip + ld a, RADIO_SCROLL + ld [wCurrentRadioLine], a + ld a, 100 + ld [wRadioTextDelay], a + ret + +ReplacePeriodsWithSpaces: + push hl + ld b, SCREEN_WIDTH * 2 +.loop + ld a, [hl] + cp "." + jr nz, .next + ld [hl], " " + +.next + inc hl + dec b + jr nz, .loop + pop hl + ret + +RadioScroll: + ld hl, wRadioTextDelay + ld a, [hl] + and a + jr z, .proceed + dec [hl] + ret +.proceed + ld a, [wNextRadioLine] + ld [wCurrentRadioLine], a + ld a, [wNumRadioLinesPrinted] + cp 1 + call nz, CopyBottomLineToTopLine + jp ClearBottomLine + +OaksPKMNTalk1: + ld a, 5 + ld [wOaksPKMNTalkSegmentCounter], a + call StartRadioStation + ld hl, OPT_IntroText1 + ld a, OAKS_POKEMON_TALK_2 + jp NextRadioLine + +OaksPKMNTalk2: + ld hl, OPT_IntroText2 + ld a, OAKS_POKEMON_TALK_3 + jp NextRadioLine + +OaksPKMNTalk3: + ld hl, OPT_IntroText3 + ld a, OAKS_POKEMON_TALK_4 + jp NextRadioLine + +OaksPKMNTalk4: +; Choose a random route, and a random Pokemon from that route. +.sample + call Random + and %11111 + cp (OaksPKMNTalkRoutes.End - OaksPKMNTalkRoutes) / 2 + jr nc, .sample + ; We now have a number between 0 and 14. + ld hl, OaksPKMNTalkRoutes + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld b, [hl] + inc hl + ld c, [hl] + ; bc now contains the chosen map's group and number indices. + push bc + + ; Search the JohtoGrassWildMons array for the chosen map. + ld hl, JohtoGrassWildMons +.loop + ld a, BANK(JohtoGrassWildMons) + call GetFarByte + cp -1 + jr z, .overflow + inc hl + cp b + jr nz, .next + ld a, BANK(JohtoGrassWildMons) + call GetFarByte + cp c + jr z, .done +.next + dec hl + ld de, GRASS_WILDDATA_LENGTH + add hl, de + jr .loop + +.done + ; Point hl to the list of morning Pokémon., skipping percentages +rept 4 + inc hl +endr + ; Generate a number, either 0, 1, or 2, to choose a time of day. +.loop2 + call Random + maskbits NUM_DAYTIMES + cp DARKNESS_F + jr z, .loop2 + + ld bc, 2 * NUM_GRASSMON + call AddNTimes +.loop3 + ; Choose one of the middle three Pokemon. + call Random + and NUM_GRASSMON + cp 2 + jr c, .loop3 + cp 5 + jr nc, .loop3 + ld e, a + ld d, 0 + add hl, de + add hl, de + inc hl ; skip level + ld a, BANK(JohtoGrassWildMons) + call GetFarByte + ld [wNamedObjectIndexBuffer], a + ld [wCurPartySpecies], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + + ; Now that we've chosen our wild Pokemon, + ; let's recover the map index info and get its name. + pop bc + call GetWorldMapLocation + ld e, a + farcall GetLandmarkName + ld hl, OPT_OakText1 + call CopyRadioTextToRAM + ld a, OAKS_POKEMON_TALK_5 + jp PrintRadioLine + +.overflow + pop bc + ld a, OAKS_POKEMON_TALK + jp PrintRadioLine + +INCLUDE "data/radio/oaks_pkmn_talk_routes.asm" + +OaksPKMNTalk5: + ld hl, OPT_OakText2 + ld a, OAKS_POKEMON_TALK_6 + jp NextRadioLine + +OaksPKMNTalk6: + ld hl, OPT_OakText3 + ld a, OAKS_POKEMON_TALK_7 + jp NextRadioLine + +OPT_IntroText1: + ; MARY: PROF.OAK'S + text_jump _OPT_IntroText1 + db "@" + +OPT_IntroText2: + ; #MON TALK! + text_jump _OPT_IntroText2 + db "@" + +OPT_IntroText3: + ; With me, MARY! + text_jump _OPT_IntroText3 + db "@" + +OPT_OakText1: + ; OAK: @ @ + text_jump _OPT_OakText1 + db "@" + +OPT_OakText2: + ; may be seen around + text_jump _OPT_OakText2 + db "@" + +OPT_OakText3: + ; @ . + text_jump _OPT_OakText3 + db "@" + +OaksPKMNTalk7: + ld a, [wCurPartySpecies] + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, OPT_MaryText1 + ld a, OAKS_POKEMON_TALK_8 + jp NextRadioLine + +OPT_MaryText1: + ; MARY: @ 's + text_jump _OPT_MaryText1 + db "@" + +OaksPKMNTalk8: + ; 0-15 are all valid indexes into .Adverbs, + ; so no need for a retry loop + call Random + maskbits NUM_OAKS_POKEMON_TALK_ADVERBS + ld e, a + ld d, 0 + ld hl, .Adverbs + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld a, OAKS_POKEMON_TALK_9 + jp NextRadioLine + +.Adverbs: +; there are NUM_OAKS_POKEMON_TALK_ADVERBS entries + dw .sweetadorably + dw .wigglyslickly + dw .aptlynamed + dw .undeniablykindof + dw .unbearably + dw .wowimpressively + dw .almostpoisonously + dw .sensually + dw .mischievously + dw .topically + dw .addictively + dw .looksinwater + dw .evolutionmustbe + dw .provocatively + dw .flippedout + dw .heartmeltingly + +.sweetadorably + ; sweet and adorably + text_jump OPT_SweetAdorably + db "@" + +.wigglyslickly + ; wiggly and slickly + text_jump OPT_WigglySlickly + db "@" + +.aptlynamed + ; aptly named and + text_jump OPT_AptlyNamed + db "@" + +.undeniablykindof + ; undeniably kind of + text_jump OPT_UndeniablyKindOf + db "@" + +.unbearably + ; so, so unbearably + text_jump OPT_Unbearably + db "@" + +.wowimpressively + ; wow, impressively + text_jump OPT_WowImpressively + db "@" + +.almostpoisonously + ; almost poisonously + text_jump OPT_AlmostPoisonously + db "@" + +.sensually + ; ooh, so sensually + text_jump OPT_Sensually + db "@" + +.mischievously + ; so mischievously + text_jump OPT_Mischievously + db "@" + +.topically + ; so very topically + text_jump OPT_Topically + db "@" + +.addictively + ; sure addictively + text_jump OPT_Addictively + db "@" + +.looksinwater + ; looks in water is + text_jump OPT_LooksInWater + db "@" + +.evolutionmustbe + ; evolution must be + text_jump OPT_EvolutionMustBe + db "@" + +.provocatively + ; provocatively + text_jump OPT_Provocatively + db "@" + +.flippedout + ; so flipped out and + text_jump OPT_FlippedOut + db "@" + +.heartmeltingly + ; heart-meltingly + text_jump OPT_HeartMeltingly + db "@" + +OaksPKMNTalk9: + ; 0-15 are all valid indexes into .Adjectives, + ; so no need for a retry loop + call Random + maskbits NUM_OAKS_POKEMON_TALK_ADJECTIVES + ld e, a + ld d, 0 + ld hl, .Adjectives + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wOaksPKMNTalkSegmentCounter] + dec a + ld [wOaksPKMNTalkSegmentCounter], a + ld a, OAKS_POKEMON_TALK_4 + jr nz, .ok + ld a, 5 + ld [wOaksPKMNTalkSegmentCounter], a + ld a, OAKS_POKEMON_TALK_10 +.ok + jp NextRadioLine + +.Adjectives: +; there are NUM_OAKS_POKEMON_TALK_ADJECTIVES entries + dw .cute + dw .weird + dw .pleasant + dw .boldsortof + dw .frightening + dw .suavedebonair + dw .powerful + dw .exciting + dw .groovy + dw .inspiring + dw .friendly + dw .hothothot + dw .stimulating + dw .guarded + dw .lovely + dw .speedy + +.cute + ; cute. + text_jump OPT_Cute + db "@" + +.weird + ; weird. + text_jump OPT_Weird + db "@" + +.pleasant + ; pleasant. + text_jump OPT_Pleasant + db "@" + +.boldsortof + ; bold, sort of. + text_jump OPT_BoldSortOf + db "@" + +.frightening + ; frightening. + text_jump OPT_Frightening + db "@" + +.suavedebonair + ; suave & debonair! + text_jump OPT_SuaveDebonair + db "@" + +.powerful + ; powerful. + text_jump OPT_Powerful + db "@" + +.exciting + ; exciting. + text_jump OPT_Exciting + db "@" + +.groovy + ; groovy! + text_jump OPT_Groovy + db "@" + +.inspiring + ; inspiring. + text_jump OPT_Inspiring + db "@" + +.friendly + ; friendly. + text_jump OPT_Friendly + db "@" + +.hothothot + ; hot, hot, hot! + text_jump OPT_HotHotHot + db "@" + +.stimulating + ; stimulating. + text_jump OPT_Stimulating + db "@" + +.guarded + ; guarded. + text_jump OPT_Guarded + db "@" + +.lovely + ; lovely. + text_jump OPT_Lovely + db "@" + +.speedy + ; speedy. + text_jump OPT_Speedy + db "@" + +OaksPKMNTalk10: + farcall RadioMusicRestartPokemonChannel + ld hl, OPT_RestartText + call PrintText + call WaitBGMap + ld hl, OPT_PokemonChannelText + call PrintText + ld a, OAKS_POKEMON_TALK_11 + ld [wCurrentRadioLine], a + ld a, 100 + ld [wRadioTextDelay], a + ret + +OPT_PokemonChannelText: + ; #MON + text_jump _OPT_PokemonChannelText + db "@" + +OPT_RestartText: + db "@" + +OaksPKMNTalk11: + ld hl, wRadioTextDelay + dec [hl] + ret nz + hlcoord 9, 14 + ld de, .pokemon_string + ld a, OAKS_POKEMON_TALK_12 + jp PlaceRadioString + +.pokemon_string + db "#MON@" + +OaksPKMNTalk12: + ld hl, wRadioTextDelay + dec [hl] + ret nz + hlcoord 1, 16 + ld de, .pokemon_channel_string + ld a, OAKS_POKEMON_TALK_13 + jp PlaceRadioString + +.pokemon_channel_string + db "#MON Channel@" + +OaksPKMNTalk13: + ld hl, wRadioTextDelay + dec [hl] + ret nz + hlcoord 12, 16 + ld de, .terminator + ld a, OAKS_POKEMON_TALK_14 + jp PlaceRadioString + +.terminator + db "@" + +OaksPKMNTalk14: + ld hl, wRadioTextDelay + dec [hl] + ret nz + ld de, MUSIC_POKEMON_TALK + callfar RadioMusicRestartDE + ld hl, .terminator + call PrintText + ld a, OAKS_POKEMON_TALK_4 + ld [wNextRadioLine], a + xor a + ld [wNumRadioLinesPrinted], a + ld a, RADIO_SCROLL + ld [wCurrentRadioLine], a + ld a, 10 + ld [wRadioTextDelay], a + ret + +.terminator + db "@" + +PlaceRadioString: + ld [wCurrentRadioLine], a + ld a, 100 + ld [wRadioTextDelay], a + jp PlaceString + +CopyBottomLineToTopLine: + hlcoord 0, 15 + decoord 0, 13 + ld bc, SCREEN_WIDTH * 2 + jp CopyBytes + +ClearBottomLine: + hlcoord 1, 15 + ld bc, SCREEN_WIDTH - 2 + ld a, " " + call ByteFill + hlcoord 1, 16 + ld bc, SCREEN_WIDTH - 2 + ld a, " " + jp ByteFill + +PokedexShow_GetDexEntryBank: + push hl + push de + ld a, [wCurPartySpecies] + dec a + rlca + rlca + maskbits NUM_DEX_ENTRY_BANKS + ld hl, .PokedexEntryBanks + ld d, 0 + ld e, a + add hl, de + ld a, [hl] + pop de + pop hl + ret + +.PokedexEntryBanks: + db BANK(PokedexEntries1) + db BANK(PokedexEntries2) + db BANK(PokedexEntries3) + db BANK(PokedexEntries4) + +PokedexShow1: + call StartRadioStation +.loop + call Random + cp NUM_POKEMON + jr nc, .loop + ld c, a + push bc + ld a, c + call CheckCaughtMon + pop bc + jr z, .loop + inc c + ld a, c + ld [wCurPartySpecies], a + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, PokedexShowText + ld a, POKEDEX_SHOW_2 + jp NextRadioLine + +PokedexShow2: + ld a, [wCurPartySpecies] + dec a + ld hl, PokedexDataPointerTable + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, BANK(PokedexDataPointerTable) + call GetFarHalfword + call PokedexShow_GetDexEntryBank + push af + push hl + call CopyDexEntryPart1 + dec hl + ld [hl], "" + ld hl, wPokedexShowPointerAddr + call CopyRadioTextToRAM + pop hl + pop af + call CopyDexEntryPart2 +rept 4 + inc hl +endr + ld a, l + ld [wPokedexShowPointerAddr], a + ld a, h + ld [wPokedexShowPointerAddr + 1], a + ld a, POKEDEX_SHOW_3 + jp PrintRadioLine + +PokedexShow3: + call CopyDexEntry + ld a, POKEDEX_SHOW_4 + jp PrintRadioLine + +PokedexShow4: + call CopyDexEntry + ld a, POKEDEX_SHOW_5 + jp PrintRadioLine + +PokedexShow5: + call CopyDexEntry + ld a, POKEDEX_SHOW_6 + jp PrintRadioLine + +PokedexShow6: + call CopyDexEntry + ld a, POKEDEX_SHOW_7 + jp PrintRadioLine + +PokedexShow7: + call CopyDexEntry + ld a, POKEDEX_SHOW_8 + jp PrintRadioLine + +PokedexShow8: + call CopyDexEntry + ld a, POKEDEX_SHOW + jp PrintRadioLine + +CopyDexEntry: + ld a, [wPokedexShowPointerAddr] + ld l, a + ld a, [wPokedexShowPointerAddr + 1] + ld h, a + ld a, [wPokedexShowPointerBank] + push af + push hl + call CopyDexEntryPart1 + dec hl + ld [hl], "" + ld hl, wPokedexShowPointerAddr + call CopyRadioTextToRAM + pop hl + pop af + call CopyDexEntryPart2 + ret + +CopyDexEntryPart1: + ld de, wPokedexShowPointerBank + ld bc, SCREEN_WIDTH - 1 + call FarCopyBytes + ld hl, wPokedexShowPointerAddr + ld [hl], TX_START + inc hl + ld [hl], "" + inc hl +.loop + ld a, [hli] + cp "@" + ret z + cp "" + ret z + cp "" + ret z + jr .loop + +CopyDexEntryPart2: + ld d, a +.loop + ld a, d + call GetFarByte + inc hl + cp "@" + jr z, .okay + cp "" + jr z, .okay + cp "" + jr nz, .loop +.okay + ld a, l + ld [wPokedexShowPointerAddr], a + ld a, h + ld [wPokedexShowPointerAddr + 1], a + ld a, d + ld [wPokedexShowPointerBank], a + ret + +PokedexShowText: + ; @ @ + text_jump _PokedexShowText + db "@" + +BenMonMusic1: + call StartPokemonMusicChannel + ld hl, BenIntroText1 + ld a, POKEMON_MUSIC_2 + jp NextRadioLine + +BenMonMusic2: + ld hl, BenIntroText2 + ld a, POKEMON_MUSIC_3 + jp NextRadioLine + +BenMonMusic3: + ld hl, BenIntroText3 + ld a, POKEMON_MUSIC_4 + jp NextRadioLine + +FernMonMusic1: + call StartPokemonMusicChannel + ld hl, FernIntroText1 + ld a, LETS_ALL_SING_2 + jp NextRadioLine + +FernMonMusic2: + ld hl, FernIntroMusic2 + ld a, POKEMON_MUSIC_4 + jp NextRadioLine + +BenFernMusic4: + ld hl, BenFernText1 + ld a, POKEMON_MUSIC_5 + jp NextRadioLine + +BenFernMusic5: + call GetWeekday + and 1 + ld hl, BenFernText2A + jr z, .SunTueThurSun + ld hl, BenFernText2B +.SunTueThurSun: + ld a, POKEMON_MUSIC_6 + jp NextRadioLine + +BenFernMusic6: + call GetWeekday + and 1 + ld hl, BenFernText3A + jr z, .SunTueThurSun + ld hl, BenFernText3B +.SunTueThurSun: + ld a, POKEMON_MUSIC_7 + jp NextRadioLine + +BenFernMusic7: + ret + +StartPokemonMusicChannel: + call RadioTerminator + call PrintText + ld de, MUSIC_POKEMON_MARCH + call GetWeekday + and 1 + jr z, .SunTueThurSun + ld de, MUSIC_POKEMON_LULLABY +.SunTueThurSun: + callfar RadioMusicRestartDE + ret + +BenIntroText1: + ; BEN: #MON MUSIC + text_jump _BenIntroText1 + db "@" + +BenIntroText2: + ; CHANNEL! + text_jump _BenIntroText2 + db "@" + +BenIntroText3: + ; It's me, DJ BEN! + text_jump _BenIntroText3 + db "@" + +FernIntroText1: + ; FERN: #MUSIC! + text_jump _FernIntroText1 + db "@" + +FernIntroMusic2: + ; With DJ FERN! + text_jump _FernIntroText2 + db "@" + +BenFernText1: + ; Today's @ , + text_jump _BenFernText1 + db "@" + +BenFernText2A: + ; so let us jam to + text_jump _BenFernText2A + db "@" + +BenFernText2B: + ; so chill out to + text_jump _BenFernText2B + db "@" + +BenFernText3A: + ; #MON March! + text_jump _BenFernText3A + db "@" + +BenFernText3B: + ; #MON Lullaby! + text_jump _BenFernText3B + db "@" + +LuckyNumberShow1: + call StartRadioStation + callfar CheckLuckyNumberShowFlag + jr nc, .dontreset + callfar ResetLuckyNumberShowFlag +.dontreset + ld hl, LC_Text1 + ld a, LUCKY_NUMBER_SHOW_2 + jp NextRadioLine + +LuckyNumberShow2: + ld hl, LC_Text2 + ld a, LUCKY_NUMBER_SHOW_3 + jp NextRadioLine + +LuckyNumberShow3: + ld hl, LC_Text3 + ld a, LUCKY_NUMBER_SHOW_4 + jp NextRadioLine + +LuckyNumberShow4: + ld hl, LC_Text4 + ld a, LUCKY_NUMBER_SHOW_5 + jp NextRadioLine + +LuckyNumberShow5: + ld hl, LC_Text5 + ld a, LUCKY_NUMBER_SHOW_6 + jp NextRadioLine + +LuckyNumberShow6: + ld hl, LC_Text6 + ld a, LUCKY_NUMBER_SHOW_7 + jp NextRadioLine + +LuckyNumberShow7: + ld hl, LC_Text7 + ld a, LUCKY_NUMBER_SHOW_8 + jp NextRadioLine + +LuckyNumberShow8: + ld hl, wStringBuffer1 + ld de, wLuckyIDNumber + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + ld a, "@" + ld [wStringBuffer1 + 5], a + ld hl, LC_Text8 + ld a, LUCKY_NUMBER_SHOW_9 + jp NextRadioLine + +LuckyNumberShow9: + ld hl, LC_Text9 + ld a, LUCKY_NUMBER_SHOW_10 + jp NextRadioLine + +LuckyNumberShow10: + ld hl, LC_Text7 + ld a, LUCKY_NUMBER_SHOW_11 + jp NextRadioLine + +LuckyNumberShow11: + ld hl, LC_Text8 + ld a, LUCKY_NUMBER_SHOW_12 + jp NextRadioLine + +LuckyNumberShow12: + ld hl, LC_Text10 + ld a, LUCKY_NUMBER_SHOW_13 + jp NextRadioLine + +LuckyNumberShow13: + ld hl, LC_Text11 + call Random + and a + ld a, LUCKY_CHANNEL + jr nz, .okay + ld a, LUCKY_NUMBER_SHOW_14 +.okay + jp NextRadioLine + +LuckyNumberShow14: + ld hl, LC_DragText1 + ld a, LUCKY_NUMBER_SHOW_15 + jp NextRadioLine + +LuckyNumberShow15: + ld hl, LC_DragText2 + ld a, LUCKY_CHANNEL + jp NextRadioLine + +LC_Text1: + ; REED: Yeehaw! How + text_jump _LC_Text1 + db "@" + +LC_Text2: + ; y'all doin' now? + text_jump _LC_Text2 + db "@" + +LC_Text3: + ; Whether you're up + text_jump _LC_Text3 + db "@" + +LC_Text4: + ; or way down low, + text_jump _LC_Text4 + db "@" + +LC_Text5: + ; don't you miss the + text_jump _LC_Text5 + db "@" + +LC_Text6: + ; LUCKY NUMBER SHOW! + text_jump _LC_Text6 + db "@" + +LC_Text7: + ; This week's Lucky + text_jump _LC_Text7 + db "@" + +LC_Text8: + ; Number is @ ! + text_jump _LC_Text8 + db "@" + +LC_Text9: + ; I'll repeat that! + text_jump _LC_Text9 + db "@" + +LC_Text10: + ; Match it and go to + text_jump _LC_Text10 + db "@" + +LC_Text11: + ; the RADIO TOWER! + text_jump _LC_Text11 + db "@" + +LC_DragText1: + ; …Repeating myself + text_jump _LC_DragText1 + db "@" + +LC_DragText2: + ; gets to be a drag… + text_jump _LC_DragText2 + db "@" + +PeoplePlaces1: + call StartRadioStation + ld hl, PnP_Text1 + ld a, PLACES_AND_PEOPLE_2 + jp NextRadioLine + +PeoplePlaces2: + ld hl, PnP_Text2 + ld a, PLACES_AND_PEOPLE_3 + jp NextRadioLine + +PeoplePlaces3: + ld hl, PnP_Text3 + call Random + cp 49 percent - 1 + ld a, PLACES_AND_PEOPLE_4 ; People + jr c, .ok + ld a, PLACES_AND_PEOPLE_6 ; Places +.ok + jp NextRadioLine + +PnP_Text1: + ; PLACES AND PEOPLE! + text_jump _PnP_Text1 + db "@" + +PnP_Text2: + ; Brought to you by + text_jump _PnP_Text2 + db "@" + +PnP_Text3: + ; me, DJ LILY! + text_jump _PnP_Text3 + db "@" + +PeoplePlaces4: ; People + call Random + maskbits NUM_TRAINER_CLASSES + inc a + cp NUM_TRAINER_CLASSES - 1 + jr nc, PeoplePlaces4 + push af + ld hl, PnP_HiddenPeople + ld a, [wStatusFlags] + bit STATUSFLAGS_HALL_OF_FAME_F, a + jr z, .ok + ld hl, PnP_HiddenPeople_BeatE4 + ld a, [wKantoBadges] + cp %11111111 ; all badges + jr nz, .ok + ld hl, PnP_HiddenPeople_BeatKanto +.ok + pop af + ld c, a + ld de, 1 + push bc + call IsInArray + pop bc + jr c, PeoplePlaces4 + push bc + callfar GetTrainerClassName + ld de, wStringBuffer1 + call CopyName1 + pop bc + ld b, 1 + callfar GetTrainerName + ld hl, PnP_Text4 + ld a, PLACES_AND_PEOPLE_5 + jp NextRadioLine + +INCLUDE "data/radio/pnp_hidden_people.asm" + +PnP_Text4: + ; @ @ @ + text_jump _PnP_Text4 + db "@" + +PeoplePlaces5: + ; 0-15 are all valid indexes into .Adjectives, + ; so no need for a retry loop + call Random + maskbits NUM_PNP_PEOPLE_ADJECTIVES + ld e, a + ld d, 0 + ld hl, .Adjectives + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call Random + cp 4 percent + ld a, PLACES_AND_PEOPLE + jr c, .ok + call Random + cp 49 percent - 1 + ld a, PLACES_AND_PEOPLE_4 ; People + jr c, .ok + ld a, PLACES_AND_PEOPLE_6 ; Places +.ok + jp NextRadioLine + +.Adjectives: +; there are NUM_PNP_PEOPLE_ADJECTIVES entries + dw PnP_cute + dw PnP_lazy + dw PnP_happy + dw PnP_noisy + dw PnP_precocious + dw PnP_bold + dw PnP_picky + dw PnP_sortofok + dw PnP_soso + dw PnP_great + dw PnP_mytype + dw PnP_cool + dw PnP_inspiring + dw PnP_weird + dw PnP_rightforme + dw PnP_odd + +PnP_cute: + ; is cute. + text_jump _PnP_cute + db "@" + +PnP_lazy: + ; is sort of lazy. + text_jump _PnP_lazy + db "@" + +PnP_happy: + ; is always happy. + text_jump _PnP_happy + db "@" + +PnP_noisy: + ; is quite noisy. + text_jump _PnP_noisy + db "@" + +PnP_precocious: + ; is precocious. + text_jump _PnP_precocious + db "@" + +PnP_bold: + ; is somewhat bold. + text_jump _PnP_bold + db "@" + +PnP_picky: + ; is too picky! + text_jump _PnP_picky + db "@" + +PnP_sortofok: + ; is sort of OK. + text_jump _PnP_sortofok + db "@" + +PnP_soso: + ; is just so-so. + text_jump _PnP_soso + db "@" + +PnP_great: + ; is actually great. + text_jump _PnP_great + db "@" + +PnP_mytype: + ; is just my type. + text_jump _PnP_mytype + db "@" + +PnP_cool: + ; is so cool, no? + text_jump _PnP_cool + db "@" + +PnP_inspiring: + ; is inspiring! + text_jump _PnP_inspiring + db "@" + +PnP_weird: + ; is kind of weird. + text_jump _PnP_weird + db "@" + +PnP_rightforme: + ; is right for me? + text_jump _PnP_rightforme + db "@" + +PnP_odd: + ; is definitely odd! + text_jump _PnP_odd + db "@" + +PeoplePlaces6: ; Places + call Random + cp (PnP_HiddenPlaces.End - PnP_HiddenPlaces) / 2 + jr nc, PeoplePlaces6 + ld hl, PnP_HiddenPlaces + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld b, [hl] + inc hl + ld c, [hl] + call GetWorldMapLocation + ld e, a + farcall GetLandmarkName + ld hl, PnP_Text5 + ld a, PLACES_AND_PEOPLE_7 + jp NextRadioLine + +INCLUDE "data/radio/pnp_hidden_places.asm" + +PnP_Text5: + ; @ @ + text_jump _PnP_Text5 + db "@" + +PeoplePlaces7: + ; 0-15 are all valid indexes into .Adjectives, + ; so no need for a retry loop + call Random + maskbits NUM_PNP_PLACES_ADJECTIVES + ld e, a + ld d, 0 + ld hl, .Adjectives + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call CopyRadioTextToRAM + call Random + cp 4 percent + ld a, PLACES_AND_PEOPLE + jr c, .ok + call Random + cp 49 percent - 1 + ld a, PLACES_AND_PEOPLE_4 ; People + jr c, .ok + ld a, PLACES_AND_PEOPLE_6 ; Places +.ok + jp PrintRadioLine + +.Adjectives: +; there are NUM_PNP_PLACES_ADJECTIVES entries + dw PnP_cute + dw PnP_lazy + dw PnP_happy + dw PnP_noisy + dw PnP_precocious + dw PnP_bold + dw PnP_picky + dw PnP_sortofok + dw PnP_soso + dw PnP_great + dw PnP_mytype + dw PnP_cool + dw PnP_inspiring + dw PnP_weird + dw PnP_rightforme + dw PnP_odd + +RocketRadio1: + call StartRadioStation + ld hl, RocketRadioText1 + ld a, ROCKET_RADIO_2 + jp NextRadioLine + +RocketRadio2: + ld hl, RocketRadioText2 + ld a, ROCKET_RADIO_3 + jp NextRadioLine + +RocketRadio3: + ld hl, RocketRadioText3 + ld a, ROCKET_RADIO_4 + jp NextRadioLine + +RocketRadio4: + ld hl, RocketRadioText4 + ld a, ROCKET_RADIO_5 + jp NextRadioLine + +RocketRadio5: + ld hl, RocketRadioText5 + ld a, ROCKET_RADIO_6 + jp NextRadioLine + +RocketRadio6: + ld hl, RocketRadioText6 + ld a, ROCKET_RADIO_7 + jp NextRadioLine + +RocketRadio7: + ld hl, RocketRadioText7 + ld a, ROCKET_RADIO_8 + jp NextRadioLine + +RocketRadio8: + ld hl, RocketRadioText8 + ld a, ROCKET_RADIO_9 + jp NextRadioLine + +RocketRadio9: + ld hl, RocketRadioText9 + ld a, ROCKET_RADIO_10 + jp NextRadioLine + +RocketRadio10: + ld hl, RocketRadioText10 + ld a, ROCKET_RADIO + jp NextRadioLine + +RocketRadioText1: + ; … …Ahem, we are + text_jump _RocketRadioText1 + db "@" + +RocketRadioText2: + ; TEAM ROCKET! + text_jump _RocketRadioText2 + db "@" + +RocketRadioText3: + ; After three years + text_jump _RocketRadioText3 + db "@" + +RocketRadioText4: + ; of preparation, we + text_jump _RocketRadioText4 + db "@" + +RocketRadioText5: + ; have risen again + text_jump _RocketRadioText5 + db "@" + +RocketRadioText6: + ; from the ashes! + text_jump _RocketRadioText6 + db "@" + +RocketRadioText7: + ; GIOVANNI! @ Can you + text_jump _RocketRadioText7 + db "@" + +RocketRadioText8: + ; hear?@ We did it! + text_jump _RocketRadioText8 + db "@" + +RocketRadioText9: + ; @ Where is our boss? + text_jump _RocketRadioText9 + db "@" + +RocketRadioText10: + ; @ Is he listening? + text_jump _RocketRadioText10 + db "@" + +PokeFluteRadio: + call StartRadioStation + ld a, 1 + ld [wNumRadioLinesPrinted], a + ret + +UnownRadio: + call StartRadioStation + ld a, 1 + ld [wNumRadioLinesPrinted], a + ret + +EvolutionRadio: + call StartRadioStation + ld a, 1 + ld [wNumRadioLinesPrinted], a + ret + +BuenasPassword1: +; Determine if we need to be here + call BuenasPasswordCheckTime + jp nc, .PlayPassword + ld a, [wNumRadioLinesPrinted] + and a + jp z, BuenasPassword20 + jp BuenasPassword8 + +.PlayPassword: + call StartRadioStation + ld a, [hBGMapMode] + push af + xor a + ld [hBGMapMode], a + ld de, BuenasPasswordChannelName + hlcoord 2, 9 + call PlaceString + pop af + ld [hBGMapMode], a + ld hl, BuenaRadioText1 + ld a, BUENAS_PASSWORD_2 + jp NextRadioLine + +BuenasPassword2: + ld hl, BuenaRadioText2 + ld a, BUENAS_PASSWORD_3 + jp NextRadioLine + +BuenasPassword3: + call BuenasPasswordCheckTime + ld hl, BuenaRadioText3 + jp c, BuenasPasswordAfterMidnight + ld a, BUENAS_PASSWORD_4 + jp NextRadioLine + +BuenasPassword4: + call BuenasPasswordCheckTime + jp c, BuenasPassword8 + ld a, [wBuenasPassword] +; If we already generated the password today, we don't need to generate a new one. + ld hl, wWeeklyFlags + bit WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] + jr nz, .AlreadyGotIt +; There are only 11 groups to choose from. +.greater_than_11 + call Random + maskbits NUM_PASSWORD_CATEGORIES + cp NUM_PASSWORD_CATEGORIES + jr nc, .greater_than_11 +; Store it in the high nybble of e. + swap a + ld e, a +; For each group, choose one of the three passwords. +.greater_than_three + call Random + maskbits NUM_PASSWORDS_PER_CATEGORY + cp NUM_PASSWORDS_PER_CATEGORY + jr nc, .greater_than_three +; The high nybble of wBuenasPassword will now contain the password group index, and the low nybble contains the actual password. + add e + ld [wBuenasPassword], a +; Set the flag so that we don't generate a new password this week. + ld hl, wWeeklyFlags + set WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] +.AlreadyGotIt: + ld c, a + call GetBuenasPassword + ld hl, BuenaRadioText4 + ld a, BUENAS_PASSWORD_5 + jp NextRadioLine + +GetBuenasPassword: +; The password indices are held in c. High nybble contains the group index, low nybble contains the word index. +; Load the password group pointer in hl. + ld a, c + swap a + and $f + ld hl, BuenasPasswordTable + ld d, 0 + ld e, a + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a +; Get the password type and store it in b. + ld a, [hli] + ld b, a + push hl + inc hl +; Get the password index. + ld a, c + and $f + ld c, a + push hl + ld hl, .StringFunctionJumpTable + ld e, b + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + pop de ; de now contains the pointer to the value of this week's password, in Blue Card Points. + call _hl_ + pop hl + ld c, [hl] + ret + +.StringFunctionJumpTable: +; entries correspond to BUENA_* constants + dw .Mon ; BUENA_MON + dw .Item ; BUENA_ITEM + dw .Move ; BUENA_MOVE + dw .RawString ; BUENA_STRING + +.Mon: + call .GetTheIndex + call GetPokemonName + ret + +.Item: + call .GetTheIndex + call GetItemName + ret + +.Move: + call .GetTheIndex + call GetMoveName + ret + +.GetTheIndex: + ld h, 0 + ld l, c + add hl, de + ld a, [hl] + ld [wNamedObjectIndexBuffer], a + ret + +.RawString: +; Get the string from the table... + ld a, c + and a + jr z, .skip +.read_loop + ld a, [de] + inc de + cp "@" + jr nz, .read_loop + dec c + jr nz, .read_loop +; ... and copy it into wStringBuffer1. +.skip + ld hl, wStringBuffer1 +.copy_loop + ld a, [de] + inc de + ld [hli], a + cp "@" + jr nz, .copy_loop + ld de, wStringBuffer1 + ret + +INCLUDE "data/radio/buenas_passwords.asm" + +BuenasPassword5: + ld hl, BuenaRadioText5 + ld a, BUENAS_PASSWORD_6 + jp NextRadioLine + +BuenasPassword6: + ld hl, BuenaRadioText6 + ld a, BUENAS_PASSWORD_7 + jp NextRadioLine + +BuenasPassword7: + call BuenasPasswordCheckTime + ld hl, BuenaRadioText7 + jr c, BuenasPasswordAfterMidnight + ld a, BUENAS_PASSWORD + jp NextRadioLine + +BuenasPasswordAfterMidnight: + push hl + ld hl, wWeeklyFlags + res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] + pop hl + ld a, BUENAS_PASSWORD_8 + jp NextRadioLine + +BuenasPassword8: + ld hl, wWeeklyFlags + res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] + ld hl, BuenaRadioMidnightText10 + ld a, BUENAS_PASSWORD_9 + jp NextRadioLine + +BuenasPassword9: + ld hl, BuenaRadioMidnightText1 + ld a, BUENAS_PASSWORD_10 + jp NextRadioLine + +BuenasPassword10: + ld hl, BuenaRadioMidnightText2 + ld a, BUENAS_PASSWORD_11 + jp NextRadioLine + +BuenasPassword11: + ld hl, BuenaRadioMidnightText3 + ld a, BUENAS_PASSWORD_12 + jp NextRadioLine + +BuenasPassword12: + ld hl, BuenaRadioMidnightText4 + ld a, BUENAS_PASSWORD_13 + jp NextRadioLine + +BuenasPassword13: + ld hl, BuenaRadioMidnightText5 + ld a, BUENAS_PASSWORD_14 + jp NextRadioLine + +BuenasPassword14: + ld hl, BuenaRadioMidnightText6 + ld a, BUENAS_PASSWORD_15 + jp NextRadioLine + +BuenasPassword15: + ld hl, BuenaRadioMidnightText7 + ld a, BUENAS_PASSWORD_16 + jp NextRadioLine + +BuenasPassword16: + ld hl, BuenaRadioMidnightText8 + ld a, BUENAS_PASSWORD_17 + jp NextRadioLine + +BuenasPassword17: + ld hl, BuenaRadioMidnightText9 + ld a, BUENAS_PASSWORD_18 + jp NextRadioLine + +BuenasPassword18: + ld hl, BuenaRadioMidnightText10 + ld a, BUENAS_PASSWORD_19 + jp NextRadioLine + +BuenasPassword19: + ld hl, BuenaRadioMidnightText10 + ld a, BUENAS_PASSWORD_20 + jp NextRadioLine + +BuenasPassword20: + ld a, [hBGMapMode] + push af + farcall NoRadioMusic + farcall NoRadioName + pop af + ld [hBGMapMode], a + ld hl, wWeeklyFlags + res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] + ld a, BUENAS_PASSWORD + ld [wCurrentRadioLine], a + xor a + ld [wNumRadioLinesPrinted], a + ld hl, BuenaOffTheAirText + ld a, BUENAS_PASSWORD_21 + jp NextRadioLine + +BuenasPassword21: + ld a, BUENAS_PASSWORD + ld [wCurrentRadioLine], a + xor a + ld [wNumRadioLinesPrinted], a + call BuenasPasswordCheckTime + jp nc, BuenasPassword1 + ld hl, BuenaOffTheAirText + ld a, BUENAS_PASSWORD_21 + jp NextRadioLine + +BuenasPasswordCheckTime: + call UpdateTime + ld a, [hHours] + cp NITE_HOUR + ret + +BuenasPasswordChannelName: + db "BUENA'S PASSWORD@" + +BuenaRadioText1: + ; BUENA: BUENA here! + text_jump _BuenaRadioText1 + db "@" + +BuenaRadioText2: + ; Today's password! + text_jump _BuenaRadioText2 + db "@" + +BuenaRadioText3: + ; Let me think… It's + text_jump _BuenaRadioText3 + db "@" + +BuenaRadioText4: + ; @ ! + text_jump _BuenaRadioText4 + db "@" + +BuenaRadioText5: + ; Don't forget it! + text_jump _BuenaRadioText5 + db "@" + +BuenaRadioText6: + ; I'm in GOLDENROD's + text_jump _BuenaRadioText6 + db "@" + +BuenaRadioText7: + ; RADIO TOWER! + text_jump _BuenaRadioText7 + db "@" + +BuenaRadioMidnightText1: + ; BUENA: Oh my… + text_jump _BuenaRadioMidnightText1 + db "@" + +BuenaRadioMidnightText2: + ; It's midnight! I + text_jump _BuenaRadioMidnightText2 + db "@" + +BuenaRadioMidnightText3: + ; have to shut down! + text_jump _BuenaRadioMidnightText3 + db "@" + +BuenaRadioMidnightText4: + ; Thanks for tuning + text_jump _BuenaRadioMidnightText4 + db "@" + +BuenaRadioMidnightText5: + ; in to the end! But + text_jump _BuenaRadioMidnightText5 + db "@" + +BuenaRadioMidnightText6: + ; don't stay up too + text_jump _BuenaRadioMidnightText6 + db "@" + +BuenaRadioMidnightText7: + ; late! Presented to + text_jump _BuenaRadioMidnightText7 + db "@" + +BuenaRadioMidnightText8: + ; you by DJ BUENA! + text_jump _BuenaRadioMidnightText8 + db "@" + +BuenaRadioMidnightText9: + ; I'm outta here! + text_jump _BuenaRadioMidnightText9 + db "@" + +BuenaRadioMidnightText10: + ; … + text_jump _BuenaRadioMidnightText10 + db "@" + +BuenaOffTheAirText: + ; + text_jump _BuenaOffTheAirText + db "@" + +CopyRadioTextToRAM: + ld a, [hl] + cp TX_FAR + jp z, FarCopyRadioText + ld de, wRadioText + ld bc, SCREEN_WIDTH * 2 + jp CopyBytes + +StartRadioStation: + ld a, [wNumRadioLinesPrinted] + and a + ret nz + call RadioTerminator + call PrintText + ld hl, RadioChannelSongs + ld a, [wCurrentRadioLine] + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + callfar RadioMusicRestartDE + ret + +INCLUDE "data/radio/channel_music.asm" + +NextRadioLine: + push af + call CopyRadioTextToRAM + pop af + jp PrintRadioLine diff --git a/engine/pokemon/billspc.asm b/engine/pokemon/billspc.asm new file mode 100755 index 000000000..96d6ac310 --- /dev/null +++ b/engine/pokemon/billspc.asm @@ -0,0 +1,2618 @@ +_DepositPKMN: ; e2391 (38:6391) + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [hMapAnims], a + call BillsPC_InitRAM + xor a + ld [wBillsPC_LoadedBox], a + call DelayFrame +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call .RunJumptable + call DelayFrame + jr .loop +.done + call ClearSprites + pop af + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret + +.RunJumptable: ; e23d5 (38:63d5) + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl + +.Jumptable: ; e23df (38:63df) + dw .Init + dw .HandleJoypad + dw .WhatsUp + dw .Submenu + dw BillsPC_EndJumptableLoop + +.Init: ; e23e9 (38:63e9) + xor a + ld [hBGMapMode], a + call ClearSprites + call CopyBoxmonSpecies + call BillsPC_BoxName + ld de, PCString_ChooseaPKMN + call BillsPC_PlaceString + ld a, $5 + ld [wBillsPC_NumMonsOnScreen], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $ff + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + call WaitBGMap + call BillsPC_UpdateSelectionCursor + call BillsPC_IncrementJumptableIndex + ret + +.HandleJoypad: ; e241a (38:641a) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and A_BUTTON + jr nz, .a_button + call Withdraw_UpDown + and a + ret z + call BillsPC_UpdateSelectionCursor + xor a + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + ret + +.a_button + call BillsPC_GetSelectedPokemonSpecies + and a + ret z + cp -1 + jr z, .b_button + ld a, $2 + ld [wJumptableIndex], a + ret +; e2452 (38:6452) + +.go_back + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button + ld a, $4 + ld [wJumptableIndex], a + ret + +.WhatsUp: ; e245d (38:645d) + xor a + ld [hBGMapMode], a + call ClearSprites + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ld a, $1 + ld [wMenuCursorY], a + call BillsPC_IncrementJumptableIndex + ret + +.Submenu: ; e247d (38:647d) + ld hl, BillsPCDepositMenuHeader + call CopyMenuHeader + ld a, [wMenuCursorY] + call StoreTo_wMenuCursorBuffer + call VerticalMenu + jp c, BillsPCDepositFuncCancel + ld a, [wMenuCursorY] + dec a + and %11 + ld e, a + ld d, 0 + ld hl, BillsPCDepositJumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +BillsPCDepositJumptable: ; e24a1 (38:64a1) + dw BillsPCDepositFuncDeposit ; Deposit Pokemon + dw BillsPCDepositFuncStats ; Pokemon Stats + dw BillsPCDepositFuncRelease ; Release Pokemon + dw BillsPCDepositFuncCancel ; Cancel + + +BillsPCDepositFuncDeposit: ; e24a9 (38:64a9) + call BillsPC_CheckMail_PreventBlackout + jp c, BillsPCDepositFuncCancel + call DepositPokemon + jr c, .box_full + ld a, $0 + ld [wJumptableIndex], a + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ret + +.box_full + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ret + +BillsPCDepositFuncStats: ; e24c8 (38:64c8) + call LoadStandardMenuHeader + call BillsPC_StatsScreen + call ExitMenu + call PCMonInfo + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ret + +BillsPCDepositFuncRelease: ; e24e0 (38:64e0) + call BillsPC_CheckMail_PreventBlackout + jr c, BillsPCDepositFuncCancel + call BillsPC_IsMonAnEgg + jr c, BillsPCDepositFuncCancel + ld a, [wMenuCursorY] + push af + ld de, PCString_ReleasePKMN + call BillsPC_PlaceString + call LoadStandardMenuHeader + lb bc, 14, 11 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call ExitMenu + and a + jr nz, .failed_release + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + call ReleasePKMN_ByePKMN + ld a, $0 + ld [wJumptableIndex], a + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + pop af + ret + +.failed_release + ld de, PCString_WhatsUp + call BillsPC_PlaceString + pop af + ld [wMenuCursorY], a + ret + +BillsPCDepositFuncCancel: ; e2537 (38:6537) + ld a, $0 + ld [wJumptableIndex], a + ret +; e253d (38:653d) + +BillsPCDepositMenuHeader: ; 0xe253d (38:653d) + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe2545 + +.MenuData: ; 0xe2545 (38:6545) + db STATICMENU_CURSOR ; flags + db 4 ; items + db "DEPOSIT@" + db "STATS@" + db "RELEASE@" + db "CANCEL@" +; 0xe2564 (38:6564) + +Unreferenced_BillsPCClearThreeBoxes: ; e2564 + hlcoord 0, 0 + ld b, 4 + ld c, 8 + call ClearBox + hlcoord 0, 4 + ld b, 10 + ld c, 9 + call ClearBox + hlcoord 0, 14 + ld b, 2 + ld c, 8 + call ClearBox + ret +; e2583 + +_WithdrawPKMN: ; e2583 (38:6583) + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [hMapAnims], a + call BillsPC_InitRAM + ld a, NUM_BOXES + 1 + ld [wBillsPC_LoadedBox], a + call DelayFrame +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call .RunJumptable + call DelayFrame + jr .loop +.done + call ClearSprites + pop af + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret + +.RunJumptable: ; e25c8 (38:65c8) + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl + +.Jumptable: ; e25d2 (38:65d2) + dw .Init + dw .Joypad + dw .PrepSubmenu + dw BillsPC_Withdraw + dw BillsPC_EndJumptableLoop + +.Init: ; e25dc (38:65dc) + ld a, NUM_BOXES + 1 + ld [wBillsPC_LoadedBox], a + xor a + ld [hBGMapMode], a + call ClearSprites + call CopyBoxmonSpecies + call BillsPC_BoxName + ld de, PCString_ChooseaPKMN + call BillsPC_PlaceString + ld a, $5 + ld [wBillsPC_NumMonsOnScreen], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $ff + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + call WaitBGMap + call BillsPC_UpdateSelectionCursor + call BillsPC_IncrementJumptableIndex + ret + +.Joypad: ; e2612 (38:6612) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and A_BUTTON + jr nz, .a_button + call Withdraw_UpDown + and a + ret z + call BillsPC_UpdateSelectionCursor + xor a + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + ret +.a_button + call BillsPC_GetSelectedPokemonSpecies + and a + ret z + cp -1 + jr z, .b_button + ld a, $2 + ld [wJumptableIndex], a + ret ; e264a (38:664a) + +.unused + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button + ld a, $4 + ld [wJumptableIndex], a + ret +; e2655 + +.PrepSubmenu: ; e2655 (38:6655) + xor a + ld [hBGMapMode], a + call ClearSprites + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ld a, $1 + ld [wMenuCursorY], a + call BillsPC_IncrementJumptableIndex + ret + +BillsPC_Withdraw: ; e2675 (38:6675) + ld hl, .MenuHeader + call CopyMenuHeader + ld a, [wMenuCursorY] + call StoreTo_wMenuCursorBuffer + call VerticalMenu + jp c, .cancel + ld a, [wMenuCursorY] + dec a + and %11 + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.dw ; e2699 (38:6699) #mark + dw .withdraw ; Withdraw + dw .stats ; Stats + dw .release ; Release + dw .cancel ; Cancel + + +.withdraw ; e26a1 (38:66a1) + call BillsPC_CheckMail_PreventBlackout + jp c, .cancel + call TryWithdrawPokemon + jr c, .FailedWithdraw + ld a, $0 + ld [wJumptableIndex], a + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ret +.FailedWithdraw: + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ret + +.stats ; e26c0 (38:66c0) + call LoadStandardMenuHeader + call BillsPC_StatsScreen + call ExitMenu + call PCMonInfo + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ret + +.release ; e26d8 (38:66d8) + ld a, [wMenuCursorY] + push af + call BillsPC_IsMonAnEgg + jr c, .FailedRelease + ld de, PCString_ReleasePKMN + call BillsPC_PlaceString + call LoadStandardMenuHeader + lb bc, 14, 11 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call ExitMenu + and a + jr nz, .FailedRelease + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, REMOVE_BOX + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + call ReleasePKMN_ByePKMN + ld a, $0 + ld [wJumptableIndex], a + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + pop af + ret +.FailedRelease: + ld de, PCString_WhatsUp + call BillsPC_PlaceString + pop af + ld [wMenuCursorY], a + ret + +.cancel ; e272b (38:672b) + ld a, $0 + ld [wJumptableIndex], a + ret +; e2731 (38:6731) + +.MenuHeader: ; 0xe2731 + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe2739 + +.MenuData: ; 0xe2739 + db STATICMENU_CURSOR ; flags + db 4 ; items + db "WITHDRAW@" + db "STATS@" + db "RELEASE@" + db "CANCEL@" +; 0xe2759 + +_MovePKMNWithoutMail: ; e2759 + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [hMapAnims], a + call BillsPC_InitRAM + ld a, [wCurBox] + and $f + inc a + ld [wBillsPC_LoadedBox], a + call DelayFrame +.asm_e2781 + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .asm_e2793 + call .RunJumptable + call DelayFrame + jr .asm_e2781 + +.asm_e2793 + call ClearSprites + pop af + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret +; e27a2 + +.RunJumptable: ; e27a2 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl +; e27ac + +.Jumptable: ; e27ac + dw .Init + dw .Joypad + dw .PrepSubmenu + dw .MoveMonWOMailSubmenu + dw .PrepInsertCursor + dw .Joypad2 + dw BillsPC_EndJumptableLoop +; e27ba + +.Init: ; e27ba + xor a + ld [hBGMapMode], a + call ClearSprites + call CopyBoxmonSpecies + ld de, PCString_ChooseaPKMN + call BillsPC_PlaceString + ld a, 5 + ld [wBillsPC_NumMonsOnScreen], a + call BillsPC_RefreshTextboxes + call BillsPC_MoveMonWOMail_BoxNameAndArrows + call PCMonInfo + ld a, $ff + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + call WaitBGMap + call BillsPC_UpdateSelectionCursor + call BillsPC_IncrementJumptableIndex + ret +; e27eb + +.Joypad: ; e27eb + ld hl, hJoyPressed + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and A_BUTTON + jr nz, .a_button + call MoveMonWithoutMail_DPad + jr c, .d_pad + and a + ret z + call BillsPC_UpdateSelectionCursor + xor a + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + ret + +.d_pad + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ld a, $0 + ld [wJumptableIndex], a + ret + +.a_button + call BillsPC_GetSelectedPokemonSpecies + and a + ret z + cp -1 + jr z, .b_button + ld a, $2 + ld [wJumptableIndex], a + ret + +.unused + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button + ld a, $6 + ld [wJumptableIndex], a + ret +; e283d + +.PrepSubmenu: ; e283d + xor a + ld [hBGMapMode], a + call ClearSprites + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ld a, $1 + ld [wMenuCursorY], a + call BillsPC_IncrementJumptableIndex + ret +; e285d + +.MoveMonWOMailSubmenu: ; e285d + ld hl, .MenuHeader + call CopyMenuHeader + ld a, [wMenuCursorY] + call StoreTo_wMenuCursorBuffer + call VerticalMenu + jp c, .Cancel + ld a, [wMenuCursorY] + dec a + and %11 + ld e, a + ld d, 0 + ld hl, .Jumptable2 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e2881 + +.Jumptable2: ; e2881 + dw .Move + dw .Stats + dw .Cancel +; e2887 + +.Move: ; e2887 + call BillsPC_CheckMail_PreventBlackout + jp c, .Cancel + ld a, [wBillsPC_ScrollPosition] + ld [wBillsPC_BackupScrollPosition], a + ld a, [wBillsPC_CursorPosition] + ld [wBillsPC_BackupCursorPosition], a + ld a, [wBillsPC_LoadedBox] + ld [wBillsPC_BackupLoadedBox], a + ld a, $4 + ld [wJumptableIndex], a + ret +; e28a5 + +.Stats: ; e28a5 + call LoadStandardMenuHeader + call BillsPC_StatsScreen + call ExitMenu + call PCMonInfo + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ret +; e28bd + +.Cancel: ; e28bd + ld a, $0 + ld [wJumptableIndex], a + ret +; e28c3 + +.MenuHeader: ; 0xe28c3 + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe28cb + +.MenuData: ; 0xe28cb + db STATICMENU_CURSOR ; flags + db 3 ; items + db "MOVE@" + db "STATS@" + db "CANCEL@" +; 0xe28df + +.PrepInsertCursor: ; e28df + xor a + ld [hBGMapMode], a + call CopyBoxmonSpecies + ld de, PCString_MoveToWhere + call BillsPC_PlaceString + ld a, $5 + ld [wBillsPC_NumMonsOnScreen], a + call BillsPC_RefreshTextboxes + call BillsPC_MoveMonWOMail_BoxNameAndArrows + call ClearSprites + call BillsPC_UpdateInsertCursor + call WaitBGMap + call BillsPC_IncrementJumptableIndex + ret +; e2903 + +.Joypad2: ; e2903 + ld hl, hJoyPressed + ld a, [hl] + and B_BUTTON + jr nz, .b_button_2 + ld a, [hl] + and A_BUTTON + jr nz, .a_button_2 + call MoveMonWithoutMail_DPad_2 + jr c, .dpad_2 + and a + ret z + call BillsPC_UpdateInsertCursor + xor a + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + ld a, $1 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + ret + +.dpad_2 + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ld a, $4 + ld [wJumptableIndex], a + ret + +.a_button_2 + call BillsPC_CheckSpaceInDestination + jr c, .no_space + call MovePKMNWitoutMail_InsertMon + ld a, $0 + ld [wJumptableIndex], a + ret + +.no_space + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button_2 + ld a, [wBillsPC_BackupScrollPosition] + ld [wBillsPC_ScrollPosition], a + ld a, [wBillsPC_BackupCursorPosition] + ld [wBillsPC_CursorPosition], a + ld a, [wBillsPC_BackupLoadedBox] + ld [wBillsPC_LoadedBox], a + ld a, $0 + ld [wJumptableIndex], a + ret +; e2963 + +BillsPC_InitRAM: ; e2963 (38:6963) + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call BillsPC_InitGFX + ld hl, wBillsPCPokemonList + ld bc, $338 + xor a + call ByteFill + xor a + ld [wJumptableIndex], a + ld [wcf64], a + ld [wcf65], a + ld [wcf66], a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ret + +BillsPC_IncrementJumptableIndex: ; e298d (38:698d) + ld hl, wJumptableIndex + inc [hl] + ret + +BillsPC_EndJumptableLoop: ; e2992 (38:6992) + ld hl, wJumptableIndex + set 7, [hl] + ret + +_StatsScreenDPad: ; e2998 (38:6998) + ld a, [wBillsPC_NumMonsOnScreen] + ld d, a + ld a, [wBillsPC_NumMonsInBox] + and a + jr z, .empty + dec a + cp $1 + jr z, .empty + ld e, a + ld a, [hl] + and D_UP + jr nz, BillsPC_PressUp + ld a, [hl] + and D_DOWN + jr nz, BillsPC_PressDown +.empty + jp BillsPC_JoypadDidNothing + +Withdraw_UpDown: ; e29b5 (38:69b5) + ld hl, hJoyLast + ld a, [wBillsPC_NumMonsOnScreen] + ld d, a + ld a, [wBillsPC_NumMonsInBox] + ld e, a + and a + jr z, .empty + ld a, [hl] + and D_UP + jr nz, BillsPC_PressUp + ld a, [hl] + and D_DOWN + jr nz, BillsPC_PressDown +.empty + jp BillsPC_JoypadDidNothing +; e29d0 (38:69d0) + +MoveMonWithoutMail_DPad: ; e29d0 + ld hl, hJoyLast + ld a, [wBillsPC_NumMonsOnScreen] + ld d, a + ld a, [wBillsPC_NumMonsInBox] + ld e, a + and a + jr z, .check_left_right + ld a, [hl] + and D_UP + jr nz, BillsPC_PressUp + ld a, [hl] + and D_DOWN + jr nz, BillsPC_PressDown + +.check_left_right + ld a, [hl] + and D_LEFT + jr nz, BillsPC_PressLeft + ld a, [hl] + and D_RIGHT + jr nz, BillsPC_PressRight + jr BillsPC_JoypadDidNothing + +MoveMonWithoutMail_DPad_2: ; e29f4 + ld hl, hJoyLast + ld a, [wBillsPC_NumMonsOnScreen] + ld d, a + ld a, [wBillsPC_NumMonsInBox] + ld e, a + and a + jr z, .check_left_right + + ld a, [hl] + and D_UP + jr nz, BillsPC_PressUp + ld a, [hl] + and D_DOWN + jr nz, BillsPC_PressDown + +.check_left_right + ld a, [hl] + and D_LEFT + jr nz, BillsPC_PressLeft + ld a, [hl] + and D_RIGHT + jr nz, BillsPC_PressRight + jr BillsPC_JoypadDidNothing + +BillsPC_PressUp: ; e2a18 (38:6a18) + ld hl, wBillsPC_CursorPosition + ld a, [hl] + and a + jr z, .top + dec [hl] + jr BillsPC_UpDownDidSomething + +.top + ld hl, wBillsPC_ScrollPosition + ld a, [hl] + and a + jr z, BillsPC_JoypadDidNothing + dec [hl] + jr BillsPC_UpDownDidSomething + +BillsPC_PressDown: ; e2a2c (38:6a2c) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + inc a + cp e + jr nc, BillsPC_JoypadDidNothing + + ld hl, wBillsPC_CursorPosition + ld a, [hl] + inc a + cp d + jr nc, .not_bottom + inc [hl] + jr BillsPC_UpDownDidSomething + +.not_bottom + ld hl, wBillsPC_ScrollPosition + inc [hl] + jr BillsPC_UpDownDidSomething +; e2a48 (38:6a48) + +BillsPC_PressLeft: ; e2a48 + ld hl, wBillsPC_LoadedBox + ld a, [hl] + and a + jr z, .wrap_around + dec [hl] + jr BillsPC_LeftRightDidSomething + +.wrap_around + ld [hl], NUM_BOXES + jr BillsPC_LeftRightDidSomething + +BillsPC_PressRight: ; e2a56 + ld hl, wBillsPC_LoadedBox + ld a, [hl] + cp NUM_BOXES + jr z, .wrap_around + inc [hl] + jr BillsPC_LeftRightDidSomething + +.wrap_around + ld [hl], 0 + jr BillsPC_LeftRightDidSomething + +BillsPC_JoypadDidNothing: ; e2a65 (38:6a65) + xor a + and a + ret + +BillsPC_UpDownDidSomething: ; e2a68 (38:6a68) + ld a, TRUE + and a + ret +; e2a6c (38:6a6c) + +BillsPC_LeftRightDidSomething: ; e2a6c + scf + ret +; e2a6e + +BillsPC_PlaceString: ; e2a6e (38:6a6e) + push de + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + pop de + hlcoord 1, 16 + call PlaceString + ret +; e2a80 (38:6a80) + +BillsPC_MoveMonWOMail_BoxNameAndArrows: ; e2a80 + call BillsPC_BoxName + hlcoord 8, 1 + ld [hl], $5f + hlcoord 19, 1 + ld [hl], $5e + ret +; e2a8e + +BillsPC_BoxName: ; e2a8e (38:6a8e) + hlcoord 8, 0 + lb bc, 1, 10 + call TextBox + + ld a, [wBillsPC_LoadedBox] + and a + jr z, .party + + cp NUM_BOXES + 1 + jr nz, .gotbox + + ld a, [wCurBox] + inc a +.gotbox + dec a + ld hl, wBoxNames + ld bc, BOX_NAME_LENGTH + call AddNTimes + ld e, l + ld d, h + jr .print + +.party + ld de, .PartyPKMN +.print + hlcoord 10, 1 + call PlaceString + ret +; e2abd (38:6abd) + +.PartyPKMN: + db "PARTY @" +; e2ac6 + +PCMonInfo: ; e2ac6 (38:6ac6) +; Display a monster's pic and +; attributes when highlighting +; it in a PC menu. + +; Includes the neat cascading +; effect when showing the pic. + +; Example: Species, level, gender, +; whether it's holding an item. + + hlcoord 0, 0 + lb bc, 15, 8 + call ClearBox + + hlcoord 8, 14 + lb bc, 1, 3 + call ClearBox + + call BillsPC_GetSelectedPokemonSpecies + and a + ret z + cp -1 + ret z + + ld [wd265], a + hlcoord 1, 4 + xor a + ld b, 7 +.row + ld c, 7 + push af + push hl +.col + ld [hli], a + add 7 + dec c + jr nz, .col + pop hl + ld de, SCREEN_WIDTH + add hl, de + pop af + inc a + dec b + jr nz, .row + + call BillsPC_LoadMonStats + ld a, [wd265] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + ld hl, wTempMonDVs + predef GetUnownLetter + call GetBaseData + ld de, vTiles2 tile $00 + predef GetMonFrontpic + xor a + ld [wBillsPC_MonHasMail], a + ld a, [wCurPartySpecies] + ld [wd265], a + cp EGG + ret z + + call GetBasePokemonName + hlcoord 1, 14 + call PlaceString + + hlcoord 1, 12 + call PrintLevel + + ld a, $3 + ld [wMonType], a + farcall GetGender + jr c, .skip_gender + ld a, "♂" + jr nz, .printgender + ld a, "♀" +.printgender + hlcoord 5, 12 + ld [hl], a +.skip_gender + + ld a, [wTempMonItem] + and a + ret z + + ld d, a + callfar ItemIsMail + jr c, .mail + ld a, $5d ; item icon + jr .printitem +.mail + ld a, $1 + ld [wBillsPC_MonHasMail], a + ld a, $5c ; mail icon +.printitem + hlcoord 7, 12 + ld [hl], a + ret + +BillsPC_LoadMonStats: ; e2b6d (38:6b6d) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld e, a + ld d, $0 + ld hl, wBillsPCPokemonList + 1 ; box number + add hl, de + add hl, de + add hl, de + ld a, [hl] + and a + jr z, .party + cp NUM_BOXES + 1 + jr z, .sBox + ld b, a + call GetBoxPointer + ld a, b + call GetSRAMBank + push hl + ld bc, sBoxMon1Level - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonLevel], a + pop hl + push hl + ld bc, sBoxMon1Item - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonItem], a + pop hl + ld bc, sBoxMon1DVs - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld de, wTempMonDVs + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + call CloseSRAM + ret + +.party + ld hl, wPartyMon1Level + ld bc, PARTYMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonLevel], a + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonItem], a + ld hl, wPartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld de, wTempMonDVs + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ret + +.sBox + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxMon1Level + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonLevel], a + + ld hl, sBoxMon1Item + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonItem], a + + ld hl, sBoxMon1DVs + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld de, wTempMonDVs + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + + call CloseSRAM + ret + +BillsPC_RefreshTextboxes: ; e2c2c (38:6c2c) + hlcoord 8, 2 + lb bc, 10, 10 + call TextBox + + hlcoord 8, 2 + ld [hl], "└" + hlcoord 19, 2 + ld [hl], "┘" + + ld a, [wBillsPC_ScrollPosition] + ld e, a + ld d, 0 + ld hl, wBillsPCPokemonList + add hl, de + add hl, de + add hl, de + ld e, l + ld d, h + hlcoord 9, 4 + ld a, [wBillsPC_NumMonsOnScreen] +.loop + push af + push de + push hl + call .PlaceNickname + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop de + inc de + inc de + inc de + pop af + dec a + jr nz, .loop + ret +; e2c67 (38:6c67) + +.CancelString: + db "CANCEL@" +; e2c6e + +.PlaceNickname: ; e2c6e (38:6c6e) + ld a, [de] + and a + ret z + cp -1 + jr nz, .get_nickname + ld de, .CancelString + call PlaceString + ret + +.get_nickname + inc de + ld a, [de] + ld b, a + inc de + ld a, [de] + ld e, a + ld a, b + and a + jr z, .party + cp NUM_BOXES + 1 + jr z, .sBox + push hl + call GetBoxPointer + ld a, b + call GetSRAMBank + push hl + ld bc, sBoxMons - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + pop hl + and a + jr z, .boxfail + ld bc, sBoxMonNicknames - sBox + add hl, bc + ld bc, MON_NAME_LENGTH + ld a, e + call AddNTimes + ld de, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + pop hl + ld de, wStringBuffer1 + call PlaceString + ret + +.boxfail + call CloseSRAM + pop hl + jr .placeholder_string + +.party + push hl + ld hl, wPartySpecies + ld d, $0 + add hl, de + ld a, [hl] + and a + jr z, .partyfail + ld hl, wPartyMonNicknames + ld bc, MON_NAME_LENGTH + ld a, e + call AddNTimes + ld de, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + pop hl + ld de, wStringBuffer1 + call PlaceString + ret + +.partyfail + pop hl + jr .placeholder_string + +.sBox + push hl + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + ld d, $0 + add hl, de + ld a, [hl] + and a + jr z, .sBoxFail + ld hl, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + ld a, e + call AddNTimes + ld de, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + pop hl + ld de, wStringBuffer1 + call PlaceString + ret + +.sBoxFail + call CloseSRAM + pop hl +.placeholder_string + ld de, .Placeholder + call PlaceString + ret +; e2d2a (38:6d2a) + +.Placeholder: + db "-----@" +; e2d30 + +copy_box_data: MACRO +.loop\@ + ld a, [hl] + cp -1 + jr z, .done\@ + and a + jr z, .done\@ + ld [de], a + inc de + ld a, [wBillsPC_LoadedBox] + ld [de], a + inc de + ld a, [wd003] + ld [de], a + inc a + ld [wd003], a + inc de + inc hl + ld a, [wd004] + inc a + ld [wd004], a + jr .loop\@ + +.done\@ +if \1 + call CloseSRAM +endc + ld a, -1 + ld [de], a + ld a, [wd004] + inc a + ld [wBillsPC_NumMonsInBox], a +ENDM + +CopyBoxmonSpecies: ; e2d30 (38:6d30) + xor a + ld hl, wBillsPCPokemonList + ld bc, 3 * 30 + call ByteFill + ld de, wBillsPCPokemonList + xor a + ld [wd003], a + ld [wd004], a + ld a, [wBillsPC_LoadedBox] + and a + jr z, .party + cp NUM_BOXES + 1 + jr z, .sBox + ld b, a + call GetBoxPointer + ld a, b + call GetSRAMBank + inc hl + copy_box_data 1 + ret + +.party + ld hl, wPartySpecies + copy_box_data 0 + ret + +.sBox + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + copy_box_data 1 + ret + +BillsPC_GetSelectedPokemonSpecies: ; e2def (38:6def) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld e, a + ld d, $0 + ld hl, wBillsPCPokemonList + add hl, de + add hl, de + add hl, de + ld a, [hl] + ret + +BillsPC_UpdateSelectionCursor: ; e2e01 (38:6e01) + ld a, [wBillsPC_NumMonsInBox] + and a + jr nz, .place_cursor + call ClearSprites + ret + +.place_cursor + ld hl, .OAM + ld de, wVirtualOAMSprite00 +.loop + ld a, [hl] + cp -1 + ret z + ld a, [wBillsPC_CursorPosition] + and $7 + swap a + add [hl] + inc hl + ld [de], a ; y + inc de +rept SPRITEOAMSTRUCT_LENGTH + -1 + ld a, [hli] + ld [de], a + inc de +endr + jr .loop +; e2e2b (38:6e2b) + +.OAM: ; e2e2b + dsprite 4, 6, 10, 0, $00, 0 + dsprite 4, 6, 11, 0, $00, 0 + dsprite 4, 6, 12, 0, $00, 0 + dsprite 4, 6, 13, 0, $00, 0 + dsprite 4, 6, 14, 0, $00, 0 + dsprite 4, 6, 15, 0, $00, 0 + dsprite 4, 6, 16, 0, $00, 0 + dsprite 4, 6, 17, 0, $00, 0 + dsprite 4, 6, 18, 0, $00, 0 + dsprite 4, 6, 18, 7, $00, 0 + dsprite 7, 1, 10, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 11, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 12, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 13, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 14, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 15, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 16, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 17, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 18, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 18, 7, $00, 0 | Y_FLIP + dsprite 5, 6, 9, 6, $01, 0 + dsprite 6, 1, 9, 6, $01, 0 | Y_FLIP + dsprite 5, 6, 19, 1, $01, 0 | X_FLIP + dsprite 6, 1, 19, 1, $01, 0 | X_FLIP | Y_FLIP + db -1 +; e2e8c + +BillsPC_UpdateInsertCursor: ; e2e8c + ld hl, .OAM + ld de, wVirtualOAMSprite00 +.loop + ld a, [hl] + cp -1 + ret z + ld a, [wBillsPC_CursorPosition] + and $7 + swap a + add [hl] + inc hl + ld [de], a ; y + inc de +rept SPRITEOAMSTRUCT_LENGTH + -1 + ld a, [hli] + ld [de], a + inc de +endr + jr .loop +; e2eac + +.OAM: ; e2eac + dsprite 4, 7, 10, 0, $06, 0 + dsprite 5, 3, 11, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 12, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 13, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 14, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 15, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 16, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 17, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 18, 0, $00, 0 | Y_FLIP + dsprite 4, 7, 19, 0, $07, 0 + db -1 +; e2ed5 + +Unreferenced_BillsPC_FillBox: ; e2ed5 +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; e2ee5 + +BillsPC_CheckSpaceInDestination: ; e2ee5 +; If moving within a box, no need to be here. + ld hl, wBillsPC_LoadedBox + ld a, [wBillsPC_BackupLoadedBox] + cp [hl] + jr z, .same_box + +; Exceeding box or party capacity is a big no-no. + ld a, [wBillsPC_LoadedBox] + and a + jr z, .party + ld e, MONS_PER_BOX + 1 + jr .compare + +.party + ld e, PARTY_LENGTH + 1 +.compare + ld a, [wBillsPC_NumMonsInBox] + cp e + jr nc, .no_room +.same_box + and a + ret + +.no_room + ld de, PCString_TheresNoRoom + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret +; e2f18 + +BillsPC_CheckMail_PreventBlackout: ; e2f18 (38:6f18) + ld a, [wBillsPC_LoadedBox] + and a + jr nz, .Okay + ld a, [wBillsPC_NumMonsInBox] + cp $3 + jr c, .ItsYourLastPokemon + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + farcall CheckCurPartyMonFainted + jr c, .AllOthersFainted + ld a, [wBillsPC_MonHasMail] + and a + jr nz, .HasMail +.Okay: + and a + ret + +.HasMail: + ld de, PCString_RemoveMail + jr .NotOkay + +.AllOthersFainted: + ld de, PCString_NoMoreUsablePKMN + jr .NotOkay + +.ItsYourLastPokemon: + ld de, PCString_ItsYourLastPKMN +.NotOkay: + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret + +BillsPC_IsMonAnEgg: ; e2f5f (38:6f5f) + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + and a + ret + +.egg + ld de, PCString_NoReleasingEGGS + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret + +BillsPC_StatsScreen: ; e2f7e (38:6f7e) + call LowVolume + call BillsPC_CopyMon + ld a, $3 + ld [wMonType], a + predef StatsScreenInit + call BillsPC_InitGFX + call MaxVolume + ret + +StatsScreenDPad: ; e2f95 (38:6f95) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and A_BUTTON | B_BUTTON | D_RIGHT | D_LEFT + ld [wMenuJoypad], a + jr nz, .pressed_a_b_right_left + ld a, [hl] + and D_DOWN | D_UP + ld [wMenuJoypad], a + jr nz, .pressed_down_up + jr .pressed_a_b_right_left + +.pressed_down_up + call _StatsScreenDPad + and a + jr z, .did_nothing + call BillsPC_GetSelectedPokemonSpecies + ld [wd265], a + call BillsPC_LoadMonStats + ld a, [wd265] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + ld hl, wTempMonDVs + predef GetUnownLetter + call GetBaseData + call BillsPC_CopyMon +.pressed_a_b_right_left + ret + +.did_nothing + xor a + ld [wMenuJoypad], a + ret + +BillsPC_CopyMon: ; e2fd6 (38:6fd6) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, [wBillsPC_LoadedBox] + and a + jr z, .party + cp NUM_BOXES + 1 + jr nz, .box + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + call CopySpeciesToTemp + ld hl, sBoxMonNicknames + call CopyNicknameToTemp + ld hl, sBoxMonOT + call CopyOTNameToTemp + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + call CloseSRAM + farcall CalcBufferMonStats + ret + +.party + ld hl, wPartySpecies + call CopySpeciesToTemp + ld hl, wPartyMonNicknames + call CopyNicknameToTemp + ld hl, wPartyMonOT + call CopyOTNameToTemp + ld hl, wPartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ret + +.box + ld b, a + call GetBoxPointer + ld a, b + call GetSRAMBank + push hl + inc hl + call CopySpeciesToTemp + pop hl + push hl + ld bc, sBoxMonNicknames - sBox + add hl, bc + call CopyNicknameToTemp + pop hl + push hl + ld bc, sBoxMonOT - sBox + add hl, bc + call CopyOTNameToTemp + pop hl + ld bc, sBoxMons - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call CopyMonToTemp + call CloseSRAM + farcall CalcBufferMonStats + ret + +DepositPokemon: ; e307c (38:707c) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld hl, wPartyMonNicknames + ld a, [wCurPartyMon] + call GetNick + ld a, PC_DEPOSIT + ld [wPokemonWithdrawDepositParameter], a + predef SendGetMonIntoFromBox + jr c, .asm_boxisfull + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ld a, [wCurPartySpecies] + call PlayMonCry + hlcoord 0, 0 + lb bc, 15, 8 + call ClearBox + hlcoord 8, 14 + lb bc, 1, 3 + call ClearBox + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + call WaitBGMap + hlcoord 1, 16 + ld de, PCString_Stored + call PlaceString + ld l, c + ld h, b + ld de, wStringBuffer1 + call PlaceString + ld a, "!" + ld [bc], a + ld c, 50 + call DelayFrames + and a + ret + +.asm_boxisfull + ld de, PCString_BoxFull + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret + +TryWithdrawPokemon: ; e30fa (38:70fa) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + ld a, [wCurPartyMon] + ld hl, sBoxMonNicknames + call GetNick + call CloseSRAM + xor a + ld [wPokemonWithdrawDepositParameter], a + predef SendGetMonIntoFromBox + jr c, .PartyFull + ld a, REMOVE_BOX + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ld a, [wCurPartySpecies] + call PlayMonCry + hlcoord 0, 0 + lb bc, 15, 8 + call ClearBox + hlcoord 8, 14 + lb bc, 1, 3 + call ClearBox + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + call WaitBGMap + hlcoord 1, 16 + ld de, PCString_Got + call PlaceString + ld l, c + ld h, b + ld de, wStringBuffer1 + call PlaceString + ld a, $e7 + ld [bc], a + ld c, 50 + call DelayFrames + and a + ret + +.PartyFull: + ld de, PCString_PartyFull + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret + + +ReleasePKMN_ByePKMN: ; e3180 (38:7180) + hlcoord 0, 0 + lb bc, 15, 8 + call ClearBox + hlcoord 8, 14 + lb bc, 1, 3 + call ClearBox + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + + call WaitBGMap + ld a, [wCurPartySpecies] + call GetCryIndex + jr c, .skip_cry + ld e, c + ld d, b + call PlayCry +.skip_cry + + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + hlcoord 1, 16 + ld de, PCString_ReleasedPKMN + call PlaceString + ld c, 80 + call DelayFrames + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + hlcoord 1, 16 + ld de, PCString_Bye + call PlaceString + ld l, c + ld h, b + inc hl + ld de, wStringBuffer1 + call PlaceString + ld l, c + ld h, b + ld [hl], $e7 + ld c, 50 + call DelayFrames + ret +; e31e7 (38:71e7) + +MovePKMNWitoutMail_InsertMon: ; e31e7 + push hl + push de + push bc + push af + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + hlcoord 1, 16 + ld de, .Saving_LeaveOn + call PlaceString + ld c, 20 + call DelayFrames + pop af + pop bc + pop de + pop hl + ld a, [wCurBox] + push af + ld bc, 0 + ld a, [wBillsPC_BackupLoadedBox] + and a + jr nz, .moving_from_box + set 0, c + +.moving_from_box + ld a, [wBillsPC_LoadedBox] + and a + jr nz, .moving_to_box + set 1, c + +.moving_to_box + ld hl, .Jumptable + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .dw_return + push de + jp hl +; e322a + +.dw_return ; e322a + pop af + ld e, a + farcall MoveMonWOMail_InsertMon_SaveGame + ret +; e3233 + +.Saving_LeaveOn: + db "Saving… Leave ON!@" +; e3245 + +.Jumptable: ; e3245 + dw .BoxToBox + dw .PartyToBox + dw .BoxToParty + dw .PartyToParty +; e324d + +.BoxToBox: ; e324d + ld hl, wBillsPC_BackupLoadedBox + ld a, [wBillsPC_LoadedBox] + cp [hl] + jr z, .same_box + call .CopyFromBox + call .CopyToBox + ret + +.same_box + call .CopyFromBox + call .CheckTrivialMove + call .CopyToBox + ret +; e3267 + +.PartyToBox: ; e3267 + call .CopyFromParty + ld a, $1 + ld [wGameLogicPaused], a + farcall SaveGameData + xor a + ld [wGameLogicPaused], a + call .CopyToBox + ret +; e327d + +.BoxToParty: ; e327d + call .CopyFromBox + call .CopyToParty + ret +; e3284 + +.PartyToParty: ; e3284 + call .CopyFromParty + call .CheckTrivialMove + call .CopyToParty + ret +; e328e + +.CheckTrivialMove: ; e328e + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld e, a + ld a, [wBillsPC_BackupCursorPosition] + ld hl, wBillsPC_BackupScrollPosition + add [hl] + cp e + ret nc + ld hl, wBillsPC_CursorPosition + ld a, [hl] + and a + jr z, .top_of_screen + dec [hl] + ret + +.top_of_screen + ld hl, wBillsPC_ScrollPosition + ld a, [hl] + and a + ret z + dec [hl] + ret +; e32b0 + +.CopyFromBox: ; e32b0 + ld a, [wBillsPC_BackupLoadedBox] + dec a + ld e, a + farcall MoveMonWOMail_SaveGame + ld a, [wBillsPC_BackupCursorPosition] + ld hl, wBillsPC_BackupScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + call CopySpeciesToTemp + ld hl, sBoxMonNicknames + call CopyNicknameToTemp + ld hl, sBoxMonOT + call CopyOTNameToTemp + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + call CopyMonToTemp + call CloseSRAM + farcall CalcBufferMonStats + ld a, REMOVE_BOX + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ret +; e32fa + +.CopyToBox: ; e32fa + ld a, [wBillsPC_LoadedBox] + dec a + ld e, a + farcall MoveMonWOMail_SaveGame + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + farcall InsertPokemonIntoBox + ret +; e3316 + +.CopyFromParty: ; e3316 + ld a, [wBillsPC_BackupCursorPosition] + ld hl, wBillsPC_BackupScrollPosition + add [hl] + ld [wCurPartyMon], a + ld hl, wPartySpecies + call CopySpeciesToTemp + ld hl, wPartyMonNicknames + call CopyNicknameToTemp + ld hl, wPartyMonOT + call CopyOTNameToTemp + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call CopyMonToTemp + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ret +; e3346 + +.CopyToParty: ; e3346 + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + farcall InsertPokemonIntoParty + ret +; e3357 + +CopySpeciesToTemp: ; e3357 (38:7357) + ld a, [wCurPartyMon] + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + ld [wCurPartySpecies], a + ret + +CopyNicknameToTemp: ; e3363 (38:7363) + ld bc, MON_NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMonNick + ld bc, MON_NAME_LENGTH + call CopyBytes + ret + +CopyOTNameToTemp: ; e3376 (38:7376) + ld bc, NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMonOT + ld bc, NAME_LENGTH + call CopyBytes + ret + +CopyMonToTemp: ; e3389 (38:7389) + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMon + call CopyBytes + ret + +GetBoxPointer: ; e3396 (38:7396) + dec b + ld c, b + ld b, 0 + ld hl, .boxes + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a + ret +; e33a6 (38:73a6) + +.boxes ; e33a6 + ; bank, address + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 +; e33d0 + +BillsPC_ApplyPalettes: ; e33d0 (38:73d0) + ld b, a + call GetSGBLayout + ld a, %11100100 + call DmgToCgbBGPals + ld a, %11111100 + call DmgToCgbObjPal0 + ret + +BillsPC_Jumptable: ; e33df (38:73df) + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +BillsPC_InitGFX: ; e33e8 (38:73e8) + call DisableLCD + ld hl, vTiles2 tile $00 + ld bc, $31 tiles + xor a + call ByteFill + call LoadStandardFont + call LoadFontsBattleExtra + ld hl, PCMailGFX + ld de, vTiles2 tile $5c + ld bc, 4 tiles + call CopyBytes + ld hl, PCSelectLZ + ld de, vTiles0 tile $00 + call Decompress + ld a, 6 + call SkipMusic + call EnableLCD + ret +; e3419 (38:7419) + +PCSelectLZ: INCBIN "gfx/pc/pc.2bpp.lz" +PCMailGFX: INCBIN "gfx/pc/pc_mail.2bpp" +; e34dd + +PCString_ChooseaPKMN: db "Choose a .@" +PCString_WhatsUp: db "What's up?@" +PCString_ReleasePKMN: db "Release ?@" +PCString_MoveToWhere: db "Move to where?@" +PCString_ItsYourLastPKMN: db "It's your last !@" +PCString_TheresNoRoom: db "There's no room!@" +PCString_NoMoreUsablePKMN: db "No more usable !@" +PCString_RemoveMail: db "Remove MAIL.@" +PCString_ReleasedPKMN: db "Released .@" +PCString_Bye: db "Bye,@" +PCString_Stored: db "Stored @" +PCString_Got: db "Got @" +PCString_Non: db "Non.@" +PCString_BoxFull: db "The BOX is full.@" +PCString_PartyFull: db "The party's full!@" +PCString_NoReleasingEGGS: db "No releasing EGGS!@" +; e35aa + + +_ChangeBox: ; e35aa (38:75aa) + call LoadStandardMenuHeader + call BillsPC_ClearTilemap +.loop + xor a + ld [hBGMapMode], a + call BillsPC_PrintBoxName + call BillsPC_PlaceChooseABoxString + ld hl, _ChangeBox_MenuHeader + call CopyMenuHeader + xor a + ld [wMenuScrollPosition], a + hlcoord 0, 4 + lb bc, 8, 9 + call TextBox + call ScrollingMenu + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .done + call BillsPC_PlaceWhatsUpString + call BillsPC_ChangeBoxSubmenu + jr .loop +.done + call CloseWindow + ret + +BillsPC_ClearTilemap: ; e35e2 (38:75e2) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill + ret +; e35f1 (38:75f1) + +_ChangeBox_MenuHeader: ; 0xe35f1 + db MENU_BACKUP_TILES ; flags + menu_coords 1, 5, 9, 12 + dw .MenuData + db 1 ; default option +; 0xe35f9 + +.MenuData ; 0xe35f9 + db MENU_UNUSED_1 | MENU_UNUSED_3 ; flags + db 4, 0 + db 1 + dba .boxes + dba .boxnames + dba NULL + dba BillsPC_PrintBoxCountAndCapacity +; e3609 + +.boxes ; e3609 + db NUM_BOXES +x = 1 +rept NUM_BOXES + db x +x = x + 1 +endr + db -1 +; e3619 + +.boxnames ; e3619 + push de + ld a, [wMenuSelection] + dec a + call GetBoxName + pop hl + call PlaceString + ret +; e3626 + +GetBoxName: ; e3626 (38:7626) + ld bc, BOX_NAME_LENGTH + ld hl, wBoxNames + call AddNTimes + ld d, h + ld e, l + ret +; e3632 (38:7632) + +BillsPC_PrintBoxCountAndCapacity: ; e3632 + hlcoord 11, 7 + lb bc, 5, 7 + call TextBox + ld a, [wMenuSelection] + cp -1 + ret z + hlcoord 12, 9 + ld de, .Pokemon + call PlaceString + call GetBoxCount + ld [wd265], a + hlcoord 13, 11 + ld de, wd265 + lb bc, 1, 2 + call PrintNum + ld de, .out_of_20 + call PlaceString + ret +; e3663 + +.Pokemon: ; e3663 + db "#MON@" +; e3668 + +.out_of_20 ; e3668 + ; db "/20@" + db "/" + db "0" + MONS_PER_BOX / 10 ; "2" + db "0" + MONS_PER_BOX % 10 ; "0" + db "@" +; e366c + +GetBoxCount: ; e366c (38:766c) + ld a, [wCurBox] + ld c, a + ld a, [wMenuSelection] + dec a + cp c + jr z, .activebox + ld c, a + ld b, 0 + ld hl, .boxbanks + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + ld b, a + call GetSRAMBank + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hl] + call CloseSRAM + ld c, a + ld a, [wSavedAtLeastOnce] + and a + jr z, .newfile + ld a, c + ret + +.newfile + xor a + ret + +.activebox + ld a, BANK(sBoxCount) + ld b, a + call GetSRAMBank + ld hl, sBoxCount + ld a, [hl] + call CloseSRAM + ret +; e36a5 (38:76a5) + +.boxbanks ; e36a5 + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 +; e36cf + +BillsPC_PrintBoxName: ; e36cf (38:76cf) + hlcoord 0, 0 + ld b, 2 + ld c, 18 + call TextBox + hlcoord 1, 2 + ld de, .Current + call PlaceString + ld a, [wCurBox] + and $f + call GetBoxName + hlcoord 11, 2 + call PlaceString + ret +; e36f1 (38:76f1) + +.Current: ; e36f1 + db "CURRENT@" +; e36f9 + +BillsPC_ChangeBoxSubmenu: ; e36f9 (38:76f9) + ld hl, .MenuHeader + call LoadMenuHeader + call VerticalMenu + call ExitMenu + ret c + ld a, [wMenuCursorY] + cp $1 + jr z, .Switch + cp $2 + jr z, .Name + cp $3 + jr z, .Print + and a + ret + +.Print: + call GetBoxCount + and a + jr z, .EmptyBox + ld e, l + ld d, h + ld a, [wMenuSelection] + dec a + ld c, a + farcall PrintPCBox + call BillsPC_ClearTilemap + and a + ret + +.EmptyBox: + call BillsPC_PlaceEmptyBoxString_SFX + and a + ret + +.Switch: + ld a, [wMenuSelection] + dec a + ld e, a + ld a, [wCurBox] + cp e + ret z + farcall ChangeBoxSaveGame + ret + +.Name: + ld b, $4 ; box + ld de, wd002 + farcall NamingScreen + call ClearTileMap + call LoadStandardFont + call LoadFontsBattleExtra + ld a, [wMenuSelection] + dec a + call GetBoxName + ld e, l + ld d, h + ld hl, wd002 + ld c, BOX_NAME_LENGTH - 1 + call InitString + ld a, [wMenuSelection] + dec a + call GetBoxName + ld de, wd002 + call CopyName2 + ret +; e3778 (38:7778) + + hlcoord 11, 7 ; unused + +.MenuHeader: ; 0xe377b + db MENU_BACKUP_TILES ; flags + menu_coords 11, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe3783 + +.MenuData: ; 0xe3783 + db STATICMENU_CURSOR ; flags + db 4 ; items + db "SWITCH@" + db "NAME@" + db "PRINT@" + db "QUIT@" +; 0xe379c + +BillsPC_PlaceChooseABoxString: ; e379c (38:779c) + ld de, .ChooseABox + jr BillsPC_PlaceChangeBoxString +; e37a1 (38:77a1) + +.ChooseABox: ; e37a1 + db "Choose a BOX.@" +; e37af + +BillsPC_PlaceWhatsUpString: ; e37af (38:77af) + ld de, .WhatsUp + jr BillsPC_PlaceChangeBoxString +; e37b4 (38:77b4) + +.WhatsUp: ; e37b4 + db "What's up?@" +; e37be + +BillsPC_PlaceEmptyBoxString_SFX: ; e37be (38:77be) + ld de, .NoMonString + call BillsPC_PlaceChangeBoxString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + ret +; e37d3 (38:77d3) + +.NoMonString: ; e37d3 + db "There's no #MON.@" +; e37e3 + +BillsPC_PlaceChangeBoxString: ; e37e3 (38:77e3) + push de + hlcoord 0, 14 + lb bc, 2, 18 + call TextBox + pop de + hlcoord 1, 16 + call PlaceString + ld a, $1 + ld [hBGMapMode], a + ret diff --git a/engine/pokemon/billspctop.asm b/engine/pokemon/billspctop.asm new file mode 100755 index 000000000..1e808c02c --- /dev/null +++ b/engine/pokemon/billspctop.asm @@ -0,0 +1,387 @@ +_BillsPC: ; e3fd + call .CheckCanUsePC + ret c + call .LogIn + call .UseBillsPC + jp .LogOut + +.CheckCanUsePC: ; e40a (3:640a) + ld a, [wPartyCount] + and a + ret nz + ld hl, .Text_GottaHavePokemon + call MenuTextBoxBackup + scf + ret + +.Text_GottaHavePokemon: ; 0xe417 + ; You gotta have #MON to call! + text_jump UnknownText_0x1c1006 + db "@" + +.LogIn: ; e41c (3:641c) + xor a + ld [hBGMapMode], a + call LoadStandardMenuHeader + call ClearPCItemScreen + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + ld hl, .Text_What + call PrintText + pop af + ld [wOptions], a + call LoadFontsBattleExtra + ret + +.Text_What: ; 0xe43a + ; What? + text_jump UnknownText_0x1c1024 + db "@" + +.LogOut: ; e43f (3:643f) + call CloseSubmenu + ret + +.UseBillsPC: ; e443 (3:6443) + ld hl, .MenuHeader + call LoadMenuHeader + ld a, $1 +.loop + ld [wMenuCursorBuffer], a + call SetPalettes + xor a + ld [wWhichIndexSet], a + ld [hBGMapMode], a + call DoNthMenu + jr c, .cancel + ld a, [wMenuCursorBuffer] + push af + ld a, [wMenuSelection] + ld hl, .Jumptable + rst JumpTable + pop bc + ld a, b + jr nc, .loop +.cancel + call CloseWindow + ret + +.MenuHeader: ; 0xe46f + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option + +.MenuData: ; 0xe477 + db STATICMENU_CURSOR ; flags + db 0 ; items + dw .items + dw PlaceMenuStrings + dw .strings + +.strings ; e47f + db "WITHDRAW @" + db "DEPOSIT @" + db "CHANGE BOX@" + db "MOVE W/O MAIL@" + db "SEE YA!@" + +.Jumptable: ; e4ba (3:64ba) + dw BillsPC_WithdrawMenu + dw BillsPC_DepositMenu + dw BillsPC_ChangeBoxMenu + dw BillsPC_MovePKMNMenu + dw BillsPC_SeeYa + +.items ; e4c4 + db 5 + db 0 ; WITHDRAW + db 1; DEPOSIT + db 2 ; CHANGE BOX + db 3 ; MOVE PKMN + db 4 ; SEE YA! + db -1 + +BillsPC_SeeYa: ; e4cb + scf + ret + +BillsPC_MovePKMNMenu: ; e4cd + call LoadStandardMenuHeader + farcall IsAnyMonHoldingMail + jr nc, .no_mail + ld hl, .Text_MonHoldingMail + call PrintText + jr .quit + +.no_mail + farcall StartMoveMonWOMail_SaveGame + jr c, .quit + farcall _MovePKMNWithoutMail + call ReturnToMapFromSubmenu + call ClearPCItemScreen + +.quit + call CloseWindow + and a + ret + +.Text_MonHoldingMail: ; 0xe4f9 + ; There is a #MON holding MAIL. Please remove the MAIL. + text_jump UnknownText_0x1c102b + db "@" + +BillsPC_DepositMenu: ; e4fe (3:64fe) + call LoadStandardMenuHeader + farcall _DepositPKMN + call ReturnToMapFromSubmenu + call ClearPCItemScreen + call CloseWindow + and a + ret + +Unreferenced_Functione512: + ld a, [wPartyCount] + and a + jr z, .no_mon + cp 2 + jr c, .only_one_mon + and a + ret + +.no_mon + ld hl, .Text_NoMon + call MenuTextBoxBackup + scf + ret + +.only_one_mon + ld hl, .Text_ItsYourLastMon + call MenuTextBoxBackup + scf + ret + +.Text_NoMon: ; 0xe52e + ; You don't have a single #MON! + text_jump UnknownText_0x1c1062 + db "@" + +.Text_ItsYourLastMon: ; 0xe533 + ; You can't deposit your last #MON! + text_jump UnknownText_0x1c1080 + db "@" + +CheckCurPartyMonFainted: ; e538 + ld hl, wPartyMon1HP + ld de, PARTYMON_STRUCT_LENGTH + ld b, $0 +.loop + ld a, [wCurPartyMon] + cp b + jr z, .skip + ld a, [hli] + or [hl] + jr nz, .notfainted + dec hl + +.skip + inc b + ld a, [wPartyCount] + cp b + jr z, .done + add hl, de + jr .loop + +.done + scf + ret + +.notfainted + and a + ret + +BillsPC_WithdrawMenu: ; e559 (3:6559) + call LoadStandardMenuHeader + farcall _WithdrawPKMN + call ReturnToMapFromSubmenu + call ClearPCItemScreen + call CloseWindow + and a + ret + +Unreferenced_Functione56d: + ld a, [wPartyCount] + cp PARTY_LENGTH + jr nc, .asm_e576 + and a + ret + +.asm_e576 + ld hl, UnknownText_0xe57e + call MenuTextBoxBackup + scf + ret + +UnknownText_0xe57e: ; 0xe57e + ; You can't take any more #MON. + text_jump UnknownText_0x1c10a2 + db "@" + +BillsPC_ChangeBoxMenu: ; e583 (3:6583) + farcall _ChangeBox + and a + ret + +ClearPCItemScreen: ; e58b + call DisableSpriteUpdates + xor a + ld [hBGMapMode], a + call ClearBGPalettes + call ClearSprites + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + hlcoord 0, 0 + lb bc, 10, 18 + call TextBox + hlcoord 0, 12 + lb bc, 4, 18 + call TextBox + call WaitBGMap2 + call SetPalettes ; load regular palettes? + ret + +CopyBoxmonToTempMon: ; e5bb + ld a, [wCurPartyMon] + ld hl, sBoxMon1Species + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld de, wTempMonSpecies + ld bc, BOXMON_STRUCT_LENGTH + ld a, BANK(sBoxMon1Species) + call GetSRAMBank + call CopyBytes + call CloseSRAM + ret + +Unreferenced_Functione5d9: + ld a, [wCurBox] + cp b + jr z, .same_box + ld a, b + ld hl, .BoxAddrs + ld bc, 3 + call AddNTimes + ld a, [hli] + push af + ld a, [hli] + ld h, [hl] + ld l, a + pop af + jr .okay + +.same_box + ld a, BANK(sBoxCount) + ld hl, sBoxCount + +.okay + call GetSRAMBank + ld a, [hl] + ld bc, 1 + MONS_PER_BOX + 1 + add hl, bc + ld b, a + ld c, $0 + ld de, wc608 + ld a, b + and a + jr z, .empty_box +.loop + push hl + push bc + ld a, c + ld bc, 0 + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [de], a + inc de + ld [wCurSpecies], a + call GetBaseData + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MONS_PER_BOX * (BOXMON_STRUCT_LENGTH + NAME_LENGTH) + add hl, bc + call SkipNames + call CopyBytes + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MON_LEVEL + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [de], a + inc de + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MON_DVS + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hli] + and $f0 + ld b, a + ld a, [hl] + and $f0 + swap a + or b + ld b, a + ld a, [wBaseGender] + cp b + ld a, $1 + jr c, .okay2 + xor a +.okay2 + ld [de], a + inc de + pop bc + pop hl + + inc c + dec b + jr nz, .loop +.empty_box + call CloseSRAM + ret + +.BoxAddrs: ; e66e + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 diff --git a/engine/pokemon/breeding.asm b/engine/pokemon/breeding.asm new file mode 100755 index 000000000..58b42953c --- /dev/null +++ b/engine/pokemon/breeding.asm @@ -0,0 +1,994 @@ +CheckBreedmonCompatibility: ; 16e1d + call .CheckBreedingGroupCompatibility + ld c, $0 + jp nc, .done + ld a, [wBreedMon1Species] + ld [wCurPartySpecies], a + ld a, [wBreedMon1DVs] + ld [wTempMonDVs], a + ld a, [wBreedMon1DVs + 1] + ld [wTempMonDVs + 1], a + ld a, TEMPMON + ld [wMonType], a + predef GetGender + jr c, .genderless + ld b, $1 + jr nz, .breedmon2 + inc b + +.breedmon2 + push bc + ld a, [wBreedMon2Species] + ld [wCurPartySpecies], a + ld a, [wBreedMon2DVs] + ld [wTempMonDVs], a + ld a, [wBreedMon2DVs + 1] + ld [wTempMonDVs + 1], a + ld a, $3 + ld [wMonType], a + predef GetGender + pop bc + jr c, .genderless + ld a, $1 + jr nz, .compare_gender + inc a + +.compare_gender + cp b + jr nz, .compute + +.genderless + ld c, $0 + ld a, [wBreedMon1Species] + cp DITTO + jr z, .ditto1 + ld a, [wBreedMon2Species] + cp DITTO + jr nz, .done + jr .compute + +.ditto1 + ld a, [wBreedMon2Species] + cp DITTO + jr z, .done + +.compute + call .CheckDVs + ld c, 255 + jp z, .done + ld a, [wBreedMon2Species] + ld b, a + ld a, [wBreedMon1Species] + cp b + ld c, 254 + jr z, .compare_ids + ld c, 128 +.compare_ids + ; Speed up + ld a, [wBreedMon1ID] + ld b, a + ld a, [wBreedMon2ID] + cp b + jr nz, .done + ld a, [wBreedMon1ID + 1] + ld b, a + ld a, [wBreedMon2ID + 1] + cp b + jr nz, .done + ld a, c + sub 77 + ld c, a + +.done + ld a, c + ld [wd265], a + ret +; 16ebc + + +.CheckDVs: ; 16ebc (5:6ebc) +; If Defense DVs match and the lower 3 bits of the Special DVs match, +; avoid breeding + ld a, [wBreedMon1DVs] + and %1111 + ld b, a + ld a, [wBreedMon2DVs] + and %1111 + cp b + ret nz + ld a, [wBreedMon1DVs + 1] + and %111 + ld b, a + ld a, [wBreedMon2DVs + 1] + and %111 + cp b + ret +; 16ed6 + +.CheckBreedingGroupCompatibility: ; 16ed6 +; If either mon is in the No Eggs group, +; they are not compatible. + ld a, [wBreedMon2Species] + ld [wCurSpecies], a + call GetBaseData + ld a, [wBaseEggGroups] + cp EGG_NONE * $11 + jr z, .Incompatible + + ld a, [wBreedMon1Species] + ld [wCurSpecies], a + call GetBaseData + ld a, [wBaseEggGroups] + cp EGG_NONE * $11 + jr z, .Incompatible + +; Ditto is automatically compatible with everything. +; If not Ditto, load the breeding groups into b/c and d/e. + ld a, [wBreedMon2Species] + cp DITTO + jr z, .Compatible + ld [wCurSpecies], a + call GetBaseData + ld a, [wBaseEggGroups] + push af + and $f + ld b, a + pop af + and $f0 + swap a + ld c, a + + ld a, [wBreedMon1Species] + cp DITTO + jr z, .Compatible + ld [wCurSpecies], a + push bc + call GetBaseData + pop bc + ld a, [wBaseEggGroups] + push af + and $f + ld d, a + pop af + and $f0 + swap a + ld e, a + + ld a, d + cp b + jr z, .Compatible + cp c + jr z, .Compatible + + ld a, e + cp b + jr z, .Compatible + cp c + jr z, .Compatible + +.Incompatible: + and a + ret + +.Compatible: + scf + ret +; 16f3e + +DoEggStep:: ; 16f3e + ld de, wPartySpecies + ld hl, wPartyMon1Happiness + ld c, 0 +.loop + ld a, [de] + inc de + cp -1 + ret z + cp EGG + jr nz, .next + dec [hl] + jr nz, .next + ld a, 1 + and a + ret + +.next + push de + ld de, PARTYMON_STRUCT_LENGTH + add hl, de + pop de + jr .loop +; 16f5e + +OverworldHatchEgg:: ; 16f5e + call RefreshScreen + call LoadStandardMenuHeader + call HatchEggs + call ExitAllMenus + call RestartMapMusic + jp CloseText +; 16f70 + +HatchEggs: ; 16f70 (5:6f70) + ld de, wPartySpecies + ld hl, wPartyMon1Happiness + xor a + ld [wCurPartyMon], a + +.loop ; 16f7a (5:6f7a) + ld a, [de] + inc de + cp -1 + jp z, .done + push de + push hl + cp EGG + jp nz, .next + ld a, [hl] + and a + jp nz, .next + ld [hl], $78 + + push de + + farcall SetEggMonCaughtData + farcall StubbedTrainerRankings_EggsHatched + ld a, [wCurPartyMon] + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [wCurPartySpecies], a + dec a + call SetSeenAndCaughtMon + + ld a, [wCurPartySpecies] + cp TOGEPI + jr nz, .nottogepi + ; set the event flag for hatching togepi + ld de, EVENT_TOGEPI_HATCHED + ld b, SET_FLAG + call EventFlagAction +.nottogepi + + pop de + + ld a, [wCurPartySpecies] + dec de + ld [de], a + ld [wd265], a + ld [wCurSpecies], a + call GetPokemonName + xor a + ld [wd26b], a + call GetBaseData + ld a, [wCurPartyMon] + ld hl, wPartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + push hl + ld bc, MON_MAXHP + add hl, bc + ld d, h + ld e, l + pop hl + push hl + ld bc, MON_LEVEL + add hl, bc + ld a, [hl] + ld [wCurPartyLevel], a + pop hl + push hl + ld bc, MON_STATUS + add hl, bc + xor a + ld [hli], a + ld [hl], a + pop hl + push hl + ld bc, MON_STAT_EXP - 1 + add hl, bc + ld b, FALSE + predef CalcMonStats + pop bc + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_HP + add hl, bc + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + ld hl, MON_ID + add hl, bc + ld a, [wPlayerID] + ld [hli], a + ld a, [wPlayerID + 1] + ld [hl], a + ld a, [wCurPartyMon] + ld hl, wPartyMonOT + ld bc, NAME_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wPlayerName + call CopyBytes + ld hl, .Text_HatchEgg + call PrintText + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + ld bc, MON_NAME_LENGTH + call AddNTimes + ld d, h + ld e, l + push de + ld hl, .Text_NicknameHatchling + call PrintText + call YesNoBox + pop de + jr c, .nonickname + + ld a, $1 + ld [wd26b], a + xor a + ld [wMonType], a + push de + ld b, $0 + farcall NamingScreen + pop hl + ld de, wStringBuffer1 + call InitName + jr .next + +.nonickname + ld hl, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + +.next ; 1707d (5:707d) + ld hl, wCurPartyMon + inc [hl] + pop hl + ld de, PARTYMON_STRUCT_LENGTH + add hl, de + pop de + jp .loop + +.done ; 1708a (5:708a) + ret +; 1708b (5:708b) + +.Text_HatchEgg: ; 0x1708b + ; Huh? @ @ + text_jump UnknownText_0x1c0db0 + start_asm + ld hl, wVramState + res 0, [hl] + push hl + push de + push bc + ld a, [wCurPartySpecies] + push af + call EggHatch_AnimationSequence + ld hl, .ClearTextbox + call PrintText + pop af + ld [wCurPartySpecies], a + pop bc + pop de + pop hl + ld hl, .CameOutOfItsEgg + ret +; 170b0 (5:70b0) + +.ClearTextbox: ; 0x170b0 + ; + text_jump UnknownText_0x1c0db8 + db "@" +; 0x170b5 + +.CameOutOfItsEgg: ; 0x170b5 + ; came out of its EGG!@ @ + text_jump UnknownText_0x1c0dba + db "@" +; 0x170ba + +.Text_NicknameHatchling: ; 0x170ba + ; Give a nickname to @ ? + text_jump UnknownText_0x1c0dd8 + db "@" +; 0x170bf + +InitEggMoves: ; 170bf + call GetHeritableMoves + ld d, h + ld e, l + ld b, NUM_MOVES +.loop + ld a, [de] + and a + jr z, .done + ld hl, wEggMonMoves + ld c, NUM_MOVES +.next + ld a, [de] + cp [hl] + jr z, .skip + inc hl + dec c + jr nz, .next + call GetEggMove + jr nc, .skip + call LoadEggMove + +.skip + inc de + dec b + jr nz, .loop + +.done + ret +; 170e4 + +GetEggMove: ; 170e4 + push bc + ld a, [wEggMonSpecies] + dec a + ld c, a + ld b, 0 + ld hl, EggMovePointers + add hl, bc + add hl, bc + ld a, BANK(EggMovePointers) + call GetFarHalfword +.loop + ld a, BANK(EggMoves) + call GetFarByte + cp -1 + jr z, .reached_end + ld b, a + ld a, [de] + cp b + jr z, .done_carry + inc hl + jr .loop + +.reached_end + call GetBreedmonMovePointer + ld b, NUM_MOVES +.loop2 + ld a, [de] + cp [hl] + jr z, .found_eggmove + inc hl + dec b + jr z, .inherit_tmhm + jr .loop2 + +.found_eggmove + ld a, [wEggMonSpecies] + dec a + ld c, a + ld b, 0 + ld hl, EvosAttacksPointers + add hl, bc + add hl, bc + ld a, BANK(EvosAttacksPointers) + call GetFarHalfword +.loop3 + ld a, BANK(EvosAttacks) + call GetFarByte + inc hl + and a + jr nz, .loop3 +.loop4 + ld a, BANK(EvosAttacks) + call GetFarByte + and a + jr z, .inherit_tmhm + inc hl + ld a, BANK(EvosAttacks) + call GetFarByte + ld b, a + ld a, [de] + cp b + jr z, .done_carry + inc hl + jr .loop4 + +.inherit_tmhm + ld hl, TMHMMoves +.loop5 + ld a, BANK(TMHMMoves) + call GetFarByte + inc hl + and a + jr z, .done + ld b, a + ld a, [de] + cp b + jr nz, .loop5 + ld [wPutativeTMHMMove], a + predef CanLearnTMHMMove + ld a, c + and a + jr z, .done + +.done_carry + pop bc + scf + ret + +.done + pop bc + and a + ret +; 17169 + +LoadEggMove: ; 17169 + push de + push bc + ld a, [de] + ld b, a + ld hl, wEggMonMoves + ld c, NUM_MOVES +.loop + ld a, [hli] + and a + jr z, .done + dec c + jr nz, .loop + ld de, wEggMonMoves + ld hl, wEggMonMoves + 1 + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + +.done + dec hl + ld [hl], b + ld hl, wEggMonMoves + ld de, wEggMonPP + predef FillPP + pop bc + pop de + ret +; 17197 + +GetHeritableMoves: ; 17197 + ld hl, wBreedMon2Moves + ld a, [wBreedMon1Species] + cp DITTO + jr z, .ditto1 + ld a, [wBreedMon2Species] + cp DITTO + jr z, .ditto2 + ld a, [wBreedMotherOrNonDitto] + and a + ret z + ld hl, wBreedMon1Moves + ret + +.ditto1 + ld a, [wCurPartySpecies] + push af + ld a, [wBreedMon2Species] + ld [wCurPartySpecies], a + ld a, [wBreedMon2DVs] + ld [wTempMonDVs], a + ld a, [wBreedMon2DVs + 1] + ld [wTempMonDVs + 1], a + ld a, TEMPMON + ld [wMonType], a + predef GetGender + jr c, .inherit_mon2_moves + jr nz, .inherit_mon2_moves + jr .inherit_mon1_moves + +.ditto2 + ld a, [wCurPartySpecies] + push af + ld a, [wBreedMon1Species] + ld [wCurPartySpecies], a + ld a, [wBreedMon1DVs] + ld [wTempMonDVs], a + ld a, [wBreedMon1DVs + 1] + ld [wTempMonDVs + 1], a + ld a, TEMPMON + ld [wMonType], a + predef GetGender + jr c, .inherit_mon1_moves + jr nz, .inherit_mon1_moves + +.inherit_mon2_moves + ld hl, wBreedMon2Moves + pop af + ld [wCurPartySpecies], a + ret + +.inherit_mon1_moves + ld hl, wBreedMon1Moves + pop af + ld [wCurPartySpecies], a + ret +; 1720b + +GetBreedmonMovePointer: ; 1720b + ld hl, wBreedMon1Moves + ld a, [wBreedMon1Species] + cp DITTO + ret z + ld a, [wBreedMon2Species] + cp DITTO + jr z, .ditto + ld a, [wBreedMotherOrNonDitto] + and a + ret z + +.ditto + ld hl, wBreedMon2Moves + ret +; 17224 + + +GetEggFrontpic: ; 17224 (5:7224) + push de + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + ld hl, wBattleMonDVs + predef GetUnownLetter + pop de + predef_jump GetMonFrontpic + +GetHatchlingFrontpic: ; 1723c (5:723c) + push de + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + ld hl, wBattleMonDVs + predef GetUnownLetter + pop de + predef_jump GetAnimatedFrontpic + +Hatch_UpdateFrontpicBGMapCenter: ; 17254 (5:7254) + push af + call WaitTop + push hl + push bc + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + pop bc + pop hl + ld a, b + ld [hBGMapAddress + 1], a + ld a, c + ld [hGraphicStartTile], a + lb bc, 7, 7 + predef PlaceGraphic + pop af + call Hatch_LoadFrontpicPal + call SetPalettes + jp WaitBGMap + +EggHatch_DoAnimFrame: ; 1727f (5:727f) + push hl + push de + push bc + callfar PlaySpriteAnimations + call DelayFrame + pop bc + pop de + pop hl + ret + +EggHatch_AnimationSequence: ; 1728f (5:728f) + ld a, [wd265] + ld [wJumptableIndex], a + ld a, [wCurSpecies] + push af + ld de, MUSIC_NONE + call PlayMusic + farcall BlankScreen + call DisableLCD + ld hl, EggHatchGFX + ld de, vTiles0 tile $00 + ld bc, 2 tiles + ld a, BANK(EggHatchGFX) + call FarCopyBytes + farcall ClearSpriteAnims + ld de, vTiles2 tile $00 + ld a, [wJumptableIndex] + call GetHatchlingFrontpic + ld de, vTiles2 tile $31 + ld a, EGG + call GetEggFrontpic + ld de, MUSIC_EVOLUTION + call PlayMusic + call EnableLCD + hlcoord 7, 4 + ld b, HIGH(vBGMap0) + ld c, $31 ; Egg tiles start here + ld a, EGG + call Hatch_UpdateFrontpicBGMapCenter + ld c, 80 + call DelayFrames + xor a + ld [wFrameCounter], a + ld a, [hSCX] + ld b, a +.outerloop + ld hl, wFrameCounter + ld a, [hl] + inc [hl] + cp 8 + jr nc, .done + ld e, [hl] +.loop +; wobble e times + ld a, 2 + ld [hSCX], a + ld a, -2 + ld [wGlobalAnimXOffset], a + call EggHatch_DoAnimFrame + ld c, 2 + call DelayFrames + ld a, -2 + ld [hSCX], a + ld a, 2 + ld [wGlobalAnimXOffset], a + call EggHatch_DoAnimFrame + ld c, 2 + call DelayFrames + dec e + jr nz, .loop + ld c, 16 + call DelayFrames + call EggHatch_CrackShell + jr .outerloop + +.done + ld de, SFX_EGG_HATCH + call PlaySFX + xor a + ld [hSCX], a + ld [wGlobalAnimXOffset], a + call ClearSprites + call Hatch_InitShellFragments + hlcoord 6, 3 + ld b, HIGH(vBGMap0) + ld c, $00 ; Hatchling tiles start here + ld a, [wJumptableIndex] + call Hatch_UpdateFrontpicBGMapCenter + call Hatch_ShellFragmentLoop + call WaitSFX + ld a, [wJumptableIndex] + ld [wCurPartySpecies], a + hlcoord 6, 3 + ld d, $0 + ld e, ANIM_MON_HATCH + predef AnimateFrontpic + pop af + ld [wCurSpecies], a + ret + +Hatch_LoadFrontpicPal: ; 17363 (5:7363) + ld [wPlayerHPPal], a + ld b, SCGB_EVOLUTION + ld c, $0 + jp GetSGBLayout + +EggHatch_CrackShell: ; 1736d (5:736d) + ld a, [wFrameCounter] + dec a + and $7 + cp $7 + ret z + srl a + ret nc + swap a + srl a + add 9 * 8 + 4 + ld d, a + ld e, 11 * 8 + ld a, SPRITE_ANIM_INDEX_EGG_CRACK + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], $0 + ld de, SFX_EGG_CRACK + jp PlaySFX +; 17393 (5:7393) + +EggHatchGFX: ; 17393 +INCBIN "gfx/evo/egg_hatch.2bpp" +; 173b3 + +Hatch_InitShellFragments: ; 173b3 (5:73b3) + farcall ClearSpriteAnims + ld hl, .SpriteData +.loop + ld a, [hli] + cp -1 + jr z, .done + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + push hl + push bc + + ld a, SPRITE_ANIM_INDEX_EGG_HATCH + call _InitSpriteAnimStruct + + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], $0 + + pop de + ld a, e + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + add [hl] + ld [hl], a + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], d + + pop hl + jr .loop +.done + ld de, SFX_EGG_HATCH + call PlaySFX + call EggHatch_DoAnimFrame + ret +; 173ef (5:73ef) + +shell_fragment: MACRO +; y tile, y pxl, x tile, x pxl, frameset offset, ??? + db (\1 * 8) % $100 + \2, (\3 * 8) % $100 + \4, \5 - SPRITE_ANIM_FRAMESET_EGG_HATCH_1, \6 +ENDM + +.SpriteData: ; 173ef + shell_fragment 10, 4, 9, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $3c + shell_fragment 11, 4, 9, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $04 + shell_fragment 10, 4, 10, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $30 + shell_fragment 11, 4, 10, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $10 + shell_fragment 10, 4, 11, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_3, $24 + shell_fragment 11, 4, 11, 0, SPRITE_ANIM_FRAMESET_EGG_HATCH_4, $1c + shell_fragment 10, 0, 9, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_1, $36 + shell_fragment 12, 0, 9, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_2, $0a + shell_fragment 10, 0, 10, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_3, $2a + shell_fragment 12, 0, 10, 4, SPRITE_ANIM_FRAMESET_EGG_HATCH_4, $16 + db -1 +; 17418 + +Hatch_ShellFragmentLoop: ; 17418 (5:7418) + ld c, 129 +.loop + call EggHatch_DoAnimFrame + dec c + jr nz, .loop + ret + +DayCareMon1: ; 17421 + ld hl, DayCareMon1Text + call PrintText + ld a, [wBreedMon1Species] + call PlayMonCry + ld a, [wDayCareLady] + bit DAYCARELADY_HAS_MON_F, a + jr z, DayCareMonCursor + call ButtonSound + ld hl, wBreedMon2Nick + call DayCareMonCompatibilityText + jp PrintText + +DayCareMon2: ; 17440 + ld hl, DayCareMon2Text + call PrintText + ld a, [wBreedMon2Species] + call PlayMonCry + ld a, [wDayCareMan] + bit DAYCAREMAN_HAS_MON_F, a + jr z, DayCareMonCursor + call ButtonSound + ld hl, wBreedMon1Nick + call DayCareMonCompatibilityText + jp PrintText + +DayCareMonCursor: ; 1745f + jp WaitPressAorB_BlinkCursor +; 17462 + +DayCareMon2Text: ; 0x17462 + ; It's @ that was left with the DAY-CARE LADY. + text_jump UnknownText_0x1c0df3 + db "@" +; 0x17467 + +DayCareMon1Text: ; 0x17467 + ; It's @ that was left with the DAY-CARE MAN. + text_jump UnknownText_0x1c0e24 + db "@" +; 0x1746c + +DayCareMonCompatibilityText: ; 1746c + push bc + ld de, wStringBuffer1 + ld bc, NAME_LENGTH + call CopyBytes + call CheckBreedmonCompatibility + pop bc + ld a, [wd265] + ld hl, .AllAlone + cp -1 + jr z, .done + ld hl, .Incompatible + and a + jr z, .done + ld hl, .HighCompatibility + cp 230 + jr nc, .done + cp 70 + ld hl, .ModerateCompatibility + jr nc, .done + ld hl, .SlightCompatibility + +.done + ret +; 1749c + +.AllAlone: ; 0x1749c + ; It's brimming with energy. + text_jump UnknownText_0x1c0e54 + db "@" +; 0x174a1 + +.Incompatible: ; 0x174a1 + ; It has no interest in @ . + text_jump UnknownText_0x1c0e6f + db "@" +; 0x174a6 + +.HighCompatibility: ; 0x174a6 + ; It appears to care for @ . + text_jump UnknownText_0x1c0e8d + db "@" +; 0x174ab + +.ModerateCompatibility: ; 0x174ab + ; It's friendly with @ . + text_jump UnknownText_0x1c0eac + db "@" +; 0x174b0 + +.SlightCompatibility: ; 0x174b0 + ; It shows interest in @ . + text_jump UnknownText_0x1c0ec6 + db "@" +; 0x174b5 + +Unreferenced_DayCareMonPrintEmptyString: ; 174b5 + ld hl, .string + ret +; 174b9 + +.string ; 174b9 + db "@" +; 174ba + diff --git a/engine/pokemon/caught_data.asm b/engine/pokemon/caught_data.asm new file mode 100644 index 000000000..3bfacf539 --- /dev/null +++ b/engine/pokemon/caught_data.asm @@ -0,0 +1,247 @@ +CheckPartyFullAfterContest: ; 4d9e5 + ld a, [wContestMon] + and a + jp z, .DidntCatchAnything + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + ld hl, wPartyCount + ld a, [hl] + cp PARTY_LENGTH + jp nc, .TryAddToBox + inc a + ld [hl], a + ld c, a + ld b, 0 + add hl, bc + ld a, [wContestMon] + ld [hli], a + ld [wCurSpecies], a + ld a, -1 + ld [hl], a + ld hl, wPartyMon1Species + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wContestMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ld a, [wPartyCount] + dec a + ld hl, wPartyMonOT + call SkipNames + ld d, h + ld e, l + ld hl, wPlayerName + call CopyBytes + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + call GiveANickname_YesNo + jr c, .Party_SkipNickname + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + xor a + ld [wMonType], a + ld de, wMonOrItemNameBuffer + callfar InitNickname + +.Party_SkipNickname: + ld a, [wPartyCount] + dec a + ld hl, wPartyMonNicknames + call SkipNames + ld d, h + ld e, l + ld hl, wMonOrItemNameBuffer + call CopyBytes + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1Level + call GetPartyLocation + ld a, [hl] + ld [wCurPartyLevel], a + call SetCaughtData + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1CaughtLocation + call GetPartyLocation + ld a, [hl] + and CAUGHT_GENDER_MASK + ld b, NATIONAL_PARK + or b + ld [hl], a + xor a + ld [wContestMon], a + and a ; BUGCONTEST_CAUGHT_MON + ld [wScriptVar], a + ret + +.TryAddToBox: ; 4daa3 + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + ld a, [hl] + cp MONS_PER_BOX + call CloseSRAM + jr nc, .BoxFull + xor a + ld [wCurPartyMon], a + ld hl, wContestMon + ld de, wBufferMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + ld hl, wPlayerName + ld de, wBufferMonOT + ld bc, NAME_LENGTH + call CopyBytes + callfar InsertPokemonIntoBox + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + call GiveANickname_YesNo + ld hl, wStringBuffer1 + jr c, .Box_SkipNickname + ld a, BOXMON + ld [wMonType], a + ld de, wMonOrItemNameBuffer + callfar InitNickname + ld hl, wMonOrItemNameBuffer + +.Box_SkipNickname: + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + ld de, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + +.BoxFull: + ld a, BANK(sBoxMon1Level) + call GetSRAMBank + ld a, [sBoxMon1Level] + ld [wCurPartyLevel], a + call CloseSRAM + call SetBoxMonCaughtData + ld a, BANK(sBoxMon1CaughtLocation) + call GetSRAMBank + ld hl, sBoxMon1CaughtLocation + ld a, [hl] + and CAUGHT_GENDER_MASK + ld b, NATIONAL_PARK + or b + ld [hl], a + call CloseSRAM + xor a + ld [wContestMon], a + ld a, BUGCONTEST_BOXED_MON + ld [wScriptVar], a + ret + +.DidntCatchAnything: ; 4db35 + ld a, BUGCONTEST_NO_CATCH + ld [wScriptVar], a + ret + +GiveANickname_YesNo: ; 4db3b + ld hl, TextJump_GiveANickname + call PrintText + jp YesNoBox + +TextJump_GiveANickname: ; 0x4db44 + ; Give a nickname to the @ you received? + text_jump UnknownText_0x1c12fc + db "@" + +SetCaughtData: ; 4db49 + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1CaughtLevel + call GetPartyLocation +SetBoxmonOrEggmonCaughtData: ; 4db53 + ld a, [wTimeOfDay] + inc a + rrca + rrca + ld b, a + ld a, [wCurPartyLevel] + or b + ld [hli], a + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + cp MAP_POKECENTER_2F + jr nz, .NotPokecenter2F + ld a, b + cp GROUP_POKECENTER_2F + jr nz, .NotPokecenter2F + + ld a, [wBackupMapGroup] + ld b, a + ld a, [wBackupMapNumber] + ld c, a + +.NotPokecenter2F: + call GetWorldMapLocation + ld b, a + ld a, [wPlayerGender] + rrca ; shift bit 0 (PLAYERGENDER_FEMALE_F) to bit 7 (CAUGHT_GENDER_MASK) + or b + ld [hl], a + ret + +SetBoxMonCaughtData: ; 4db83 + ld a, BANK(sBoxMon1CaughtLevel) + call GetSRAMBank + ld hl, sBoxMon1CaughtLevel + call SetBoxmonOrEggmonCaughtData + call CloseSRAM + ret + +SetGiftBoxMonCaughtData: ; 4db92 + push bc + ld a, BANK(sBoxMon1CaughtLevel) + call GetSRAMBank + ld hl, sBoxMon1CaughtLevel + pop bc + call SetGiftMonCaughtData + call CloseSRAM + ret + +SetGiftPartyMonCaughtData: ; 4dba3 + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1CaughtLevel + push bc + call GetPartyLocation + pop bc +SetGiftMonCaughtData: ; 4dbaf + xor a + ld [hli], a + ld a, GIFT_LOCATION + rrc b + or b + ld [hl], a + ret + +SetEggMonCaughtData: ; 4dbb8 (13:5bb8) + ld a, [wCurPartyMon] + ld hl, wPartyMon1CaughtLevel + call GetPartyLocation + ld a, [wCurPartyLevel] + push af + ld a, CAUGHT_EGG_LEVEL + ld [wCurPartyLevel], a + call SetBoxmonOrEggmonCaughtData + pop af + ld [wCurPartyLevel], a + ret diff --git a/engine/pokemon/european_mail.asm b/engine/pokemon/european_mail.asm new file mode 100644 index 000000000..8f037cc43 --- /dev/null +++ b/engine/pokemon/european_mail.asm @@ -0,0 +1,129 @@ +IsMailEuropean: ; 1de5c8 +; return 1 if French +; return 2 if German +; return 3 if Italian +; return 4 if Spanish +; return 0 if none of the above + ld c, $0 + ld hl, sPartyMon1MailAuthorNationality - sPartyMon1Mail + add hl, de + ld a, [hli] + cp "E" + ret nz + ld a, [hli] + inc c + cp "F" + ret z + inc c + cp "G" + ret z + inc c + cp "I" + ret z + inc c + cp "S" + ret z + ld c, $0 + ret + +; The regular font. +StandardEnglishFont: ; 1de5e6 +INCBIN "gfx/font/english.1bpp" + +; An extended font. +FrenchGermanFont: ; 1de9e6 +INCBIN "gfx/font/french_german.1bpp" + +; An even more extended font. +SpanishItalianFont: ; 1dede6 +INCBIN "gfx/font/spanish_italian.1bpp" + +HandleFrenchGermanMail: ; 1df1e6 +; called if mail is french or german +; fix 's 't 'v + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + cp $dc ; 's in french/german font + jr nz, .check_intermediate_chars + ld a, "'s" + jr .replace + +.check_intermediate_chars + sub "'s" + jr c, .dont_replace + cp "'v" - "'s" + 1 + jr nc, .dont_replace + add $cd + +.replace + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret + +LireLeCourrierAnglais: +DeutenEnglischenPost: ; 1df203 +; Cette fonction convertit certains des caractères anglais pour +; leur équivalent dans le jeu de caractères français. +; Diese Funktion wandelt bestimmte englische Zeichen, um ihre +; Entsprechung in der Deutschen-Zeichensatz. + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + cp "'s" + jr nz, .check_intermediate_chars + ld a, $dc + jr .replace + +.check_intermediate_chars + sub $cd + jr c, .dont_replace + cp "'v" - "'s" + 1 + jr nc, .dont_replace + add "'s" + +.replace + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret + +HandleSpanishItalianMail: ; 1df220 +LeerCorreosIngleses: +LeggiPostaInglese: +; This function converts certain characters between +; the English and Spanish/Italian character sets. +; Esta función convierte ciertos caracteres entre +; el juego de caracteres Inglés y Español. +; Questa funzione converte alcuni caratteri tra +; l'inglese e il set di caratteri italiani. + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + and $f0 + cp $d0 + jr nz, .dont_replace + ld a, [hl] + add $8 + and $f + or $d0 + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret diff --git a/engine/pokemon/evolve.asm b/engine/pokemon/evolve.asm new file mode 100755 index 000000000..5a7e75dfa --- /dev/null +++ b/engine/pokemon/evolve.asm @@ -0,0 +1,676 @@ +EvolvePokemon: ; 421d8 + ld hl, wEvolvableFlags + xor a + ld [hl], a + ld a, [wCurPartyMon] + ld c, a + ld b, SET_FLAG + call EvoFlagAction +EvolveAfterBattle: ; 421e6 + xor a + ld [wMonTriedToEvolve], a + dec a + ld [wCurPartyMon], a + push hl + push bc + push de + ld hl, wPartyCount + + push hl + +EvolveAfterBattle_MasterLoop + ld hl, wCurPartyMon + inc [hl] + + pop hl + + inc hl + ld a, [hl] + cp $ff + jp z, .ReturnToMap + + ld [wEvolutionOldSpecies], a + + push hl + ld a, [wCurPartyMon] + ld c, a + ld hl, wEvolvableFlags + ld b, CHECK_FLAG + call EvoFlagAction + ld a, c + and a + jp z, EvolveAfterBattle_MasterLoop + + ld a, [wEvolutionOldSpecies] + dec a + ld b, 0 + ld c, a + ld hl, EvosAttacksPointers + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + + push hl + xor a + ld [wMonType], a + predef CopyMonToTempMon + pop hl + +.loop + ld a, [hli] + and a + jr z, EvolveAfterBattle_MasterLoop + + ld b, a + + cp EVOLVE_TRADE + jr z, .trade + + ld a, [wLinkMode] + and a + jp nz, .dont_evolve_2 + + ld a, b + cp EVOLVE_ITEM + jp z, .item + + ld a, [wForceEvolution] + and a + jp nz, .dont_evolve_2 + + ld a, b + cp EVOLVE_LEVEL + jp z, .level + + cp EVOLVE_HAPPINESS + jr z, .happiness + + +; EVOLVE_STAT + ld a, [wTempMonLevel] + cp [hl] + jp c, .dont_evolve_1 + + call IsMonHoldingEverstone + jp z, .dont_evolve_1 + + push hl + ld de, wTempMonAttack + ld hl, wTempMonDefense + ld c, 2 + call StringCmp + ld a, ATK_EQ_DEF + jr z, .got_tyrogue_evo + ld a, ATK_LT_DEF + jr c, .got_tyrogue_evo + ld a, ATK_GT_DEF +.got_tyrogue_evo + pop hl + + inc hl + cp [hl] + jp nz, .dont_evolve_2 + + inc hl + jr .proceed + + +.happiness + ld a, [wTempMonHappiness] + cp HAPPINESS_TO_EVOLVE + jp c, .dont_evolve_2 + + call IsMonHoldingEverstone + jp z, .dont_evolve_2 + + ld a, [hli] + cp TR_ANYTIME + jr z, .proceed + cp TR_MORNDAY + jr z, .happiness_daylight + +; TR_NITE + ld a, [wTimeOfDay] + cp NITE_F + jp nz, .dont_evolve_3 + jr .proceed + +.happiness_daylight + ld a, [wTimeOfDay] + cp NITE_F + jp z, .dont_evolve_3 + jr .proceed + + +.trade + ld a, [wLinkMode] + and a + jp z, .dont_evolve_2 + + call IsMonHoldingEverstone + jp z, .dont_evolve_2 + + ld a, [hli] + ld b, a + inc a + jr z, .proceed + + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jp z, .dont_evolve_3 + + ld a, [wTempMonItem] + cp b + jp nz, .dont_evolve_3 + + xor a + ld [wTempMonItem], a + jr .proceed + + +.item + ld a, [hli] + ld b, a + ld a, [wCurItem] + cp b + jp nz, .dont_evolve_3 + + ld a, [wForceEvolution] + and a + jp z, .dont_evolve_3 + ld a, [wLinkMode] + and a + jp nz, .dont_evolve_3 + jr .proceed + + +.level + ld a, [hli] + ld b, a + ld a, [wTempMonLevel] + cp b + jp c, .dont_evolve_3 + call IsMonHoldingEverstone + jp z, .dont_evolve_3 + +.proceed + ld a, [wTempMonLevel] + ld [wCurPartyLevel], a + ld a, $1 + ld [wMonTriedToEvolve], a + + push hl + + ld a, [hl] + ld [wEvolutionNewSpecies], a + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + call CopyName1 + ld hl, Text_WhatEvolving + call PrintText + + ld c, 50 + call DelayFrames + + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + lb bc, 12, 20 + call ClearBox + + ld a, $1 + ld [hBGMapMode], a + call ClearSprites + + farcall EvolutionAnimation + + push af + call ClearSprites + pop af + jp c, CancelEvolution + + ld hl, Text_CongratulationsYourPokemon + call PrintText + + pop hl + + ld a, [hl] + ld [wCurSpecies], a + ld [wTempMonSpecies], a + ld [wEvolutionNewSpecies], a + ld [wd265], a + call GetPokemonName + + push hl + ld hl, Text_EvolvedIntoPKMN + call PrintTextBoxText + farcall StubbedTrainerRankings_MonsEvolved + + ld de, MUSIC_NONE + call PlayMusic + ld de, SFX_CAUGHT_MON + call PlaySFX + call WaitSFX + + ld c, 40 + call DelayFrames + + call ClearTileMap + call UpdateSpeciesNameIfNotNicknamed + call GetBaseData + + ld hl, wTempMonExp + 2 + ld de, wTempMonMaxHP + ld b, TRUE + predef CalcMonStats + + ld a, [wCurPartyMon] + ld hl, wPartyMons + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld e, l + ld d, h + ld bc, MON_MAXHP + add hl, bc + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, wTempMonMaxHP + 1 + ld a, [hld] + sub c + ld c, a + ld a, [hl] + sbc b + ld b, a + ld hl, wTempMonHP + 1 + ld a, [hl] + add c + ld [hld], a + ld a, [hl] + adc b + ld [hl], a + + ld hl, wTempMonSpecies + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + + ld a, [wCurSpecies] + ld [wd265], a + xor a + ld [wMonType], a + call LearnLevelMoves + ld a, [wd265] + dec a + call SetSeenAndCaughtMon + + ld a, [wd265] + cp UNOWN + jr nz, .skip_unown + + ld hl, wTempMonDVs + predef GetUnownLetter + callfar UpdateUnownDex + +.skip_unown + pop de + pop hl + ld a, [wTempMonSpecies] + ld [hl], a + push hl + ld l, e + ld h, d + jp EvolveAfterBattle_MasterLoop +; 423f8 + +.dont_evolve_1 + inc hl +.dont_evolve_2 + inc hl +.dont_evolve_3 + inc hl + jp .loop + +; unused + pop hl +.ReturnToMap: + pop de + pop bc + pop hl + ld a, [wLinkMode] + and a + ret nz + ld a, [wBattleMode] + and a + ret nz + ld a, [wMonTriedToEvolve] + and a + call nz, RestartMapMusic + ret +; 42414 + +UpdateSpeciesNameIfNotNicknamed: ; 42414 + ld a, [wCurSpecies] + push af + ld a, [wBaseDexNo] + ld [wd265], a + call GetPokemonName + pop af + ld [wCurSpecies], a + ld hl, wStringBuffer1 + ld de, wStringBuffer2 +.loop + ld a, [de] + inc de + cp [hl] + inc hl + ret nz + cp "@" + jr nz, .loop + + ld a, [wCurPartyMon] + ld bc, MON_NAME_LENGTH + ld hl, wPartyMonNicknames + call AddNTimes + push hl + ld a, [wCurSpecies] + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 + pop de + ld bc, MON_NAME_LENGTH + jp CopyBytes +; 42454 + +CancelEvolution: ; 42454 + ld hl, Text_StoppedEvolving + call PrintText + call ClearTileMap + pop hl + jp EvolveAfterBattle_MasterLoop +; 42461 + +IsMonHoldingEverstone: ; 42461 + push hl + ld a, [wCurPartyMon] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + cp EVERSTONE + pop hl + ret +; 42473 + +Text_CongratulationsYourPokemon: ; 0x42473 + ; Congratulations! Your @ @ + text_jump UnknownText_0x1c4b92 + db "@" +; 0x42478 + +Text_EvolvedIntoPKMN: ; 0x42478 + ; evolved into @ ! + text_jump UnknownText_0x1c4baf + db "@" +; 0x4247d + +Text_StoppedEvolving: ; 0x4247d + ; Huh? @ stopped evolving! + text_jump UnknownText_0x1c4bc5 + db "@" +; 0x42482 + +Text_WhatEvolving: ; 0x42482 + ; What? @ is evolving! + text_jump UnknownText_0x1c4be3 + db "@" +; 0x42487 + + +LearnLevelMoves: ; 42487 + ld a, [wd265] + ld [wCurPartySpecies], a + dec a + ld b, 0 + ld c, a + ld hl, EvosAttacksPointers + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + +.skip_evos + ld a, [hli] + and a + jr nz, .skip_evos + +.find_move + ld a, [hli] + and a + jr z, .done + + ld b, a + ld a, [wCurPartyLevel] + cp b + ld a, [hli] + jr nz, .find_move + + push hl + ld d, a + ld hl, wPartyMon1Moves + ld a, [wCurPartyMon] + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + + ld b, NUM_MOVES +.check_move + ld a, [hli] + cp d + jr z, .has_move + dec b + jr nz, .check_move + jr .learn +.has_move + + pop hl + jr .find_move + +.learn + ld a, d + ld [wPutativeTMHMMove], a + ld [wd265], a + call GetMoveName + call CopyName1 + predef LearnMove + pop hl + jr .find_move + +.done + ld a, [wCurPartySpecies] + ld [wd265], a + ret +; 424e1 + + +FillMoves: ; 424e1 +; Fill in moves at de for wCurPartySpecies at wCurPartyLevel + + push hl + push de + push bc + ld hl, EvosAttacksPointers + ld b, 0 + ld a, [wCurPartySpecies] + dec a + add a + rl b + ld c, a + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a +.GoToAttacks: + ld a, [hli] + and a + jr nz, .GoToAttacks + jr .GetLevel + +.NextMove: + pop de +.GetMove: + inc hl +.GetLevel: + ld a, [hli] + and a + jp z, .done + ld b, a + ld a, [wCurPartyLevel] + cp b + jp c, .done + ld a, [wEvolutionOldSpecies] + and a + jr z, .CheckMove + ld a, [wd002] + cp b + jr nc, .GetMove + +.CheckMove: + push de + ld c, NUM_MOVES +.CheckRepeat: + ld a, [de] + inc de + cp [hl] + jr z, .NextMove + dec c + jr nz, .CheckRepeat + pop de + push de + ld c, NUM_MOVES +.CheckSlot: + ld a, [de] + and a + jr z, .LearnMove + inc de + dec c + jr nz, .CheckSlot + pop de + push de + push hl + ld h, d + ld l, e + call ShiftMoves + ld a, [wEvolutionOldSpecies] + and a + jr z, .ShiftedMove + push de + ld bc, wPartyMon1PP - (wPartyMon1Moves + NUM_MOVES - 1) + add hl, bc + ld d, h + ld e, l + call ShiftMoves + pop de + +.ShiftedMove: + pop hl + +.LearnMove: + ld a, [hl] + ld [de], a + ld a, [wEvolutionOldSpecies] + and a + jr z, .NextMove + push hl + ld a, [hl] + ld hl, MON_PP - MON_MOVES + add hl, de + push hl + dec a + ld hl, Moves + MOVE_PP + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + pop hl + ld [hl], a + pop hl + jr .NextMove + +.done + pop bc + pop de + pop hl + ret +; 4256e + +ShiftMoves: ; 4256e + ld c, NUM_MOVES - 1 +.loop + inc de + ld a, [de] + ld [hli], a + dec c + jr nz, .loop + ret +; 42577 + + +EvoFlagAction: ; 42577 + push de + ld d, $0 + predef SmallFarFlagAction + pop de + ret +; 42581 + +GetPreEvolution: ; 42581 +; Find the first mon to evolve into wCurPartySpecies. + +; Return carry and the new species in wCurPartySpecies +; if a pre-evolution is found. + + ld c, 0 +.loop ; For each Pokemon... + ld hl, EvosAttacksPointers + ld b, 0 + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a +.loop2 ; For each evolution... + ld a, [hli] + and a + jr z, .no_evolve ; If we jump, this Pokemon does not evolve into wCurPartySpecies. + cp EVOLVE_STAT ; This evolution type has the extra parameter of stat comparison. + jr nz, .not_tyrogue + inc hl + +.not_tyrogue + inc hl + ld a, [wCurPartySpecies] + cp [hl] + jr z, .found_preevo + inc hl + ld a, [hl] + and a + jr nz, .loop2 + +.no_evolve + inc c + ld a, c + cp NUM_POKEMON + jr c, .loop + and a + ret + +.found_preevo + inc c + ld a, c + ld [wCurPartySpecies], a + scf + ret +; 425b1 diff --git a/engine/pokemon/experience.asm b/engine/pokemon/experience.asm new file mode 100644 index 000000000..6b94ed357 --- /dev/null +++ b/engine/pokemon/experience.asm @@ -0,0 +1,162 @@ +CalcLevel: ; 50e1b + ld a, [wTempMonSpecies] + ld [wCurSpecies], a + call GetBaseData + ld d, 1 +.next_level + inc d + ld a, d + cp LOW(MAX_LEVEL + 1) + jr z, .got_level + call CalcExpAtLevel + push hl + ld hl, wTempMonExp + 2 + ld a, [hProduct + 3] + ld c, a + ld a, [hld] + sub c + ld a, [hProduct + 2] + ld c, a + ld a, [hld] + sbc c + ld a, [hProduct + 1] + ld c, a + ld a, [hl] + sbc c + pop hl + jr nc, .next_level + +.got_level + dec d + ret + +CalcExpAtLevel: ; 50e47 +; (a/b)*n**3 + c*n**2 + d*n - e + ld a, [wBaseGrowthRate] + add a + add a + ld c, a + ld b, 0 + ld hl, GrowthRates + add hl, bc +; Cube the level + call .LevelSquared + ld a, d + ld [hMultiplier], a + call Multiply + +; Multiply by a + ld a, [hl] + and $f0 + swap a + ld [hMultiplier], a + call Multiply +; Divide by b + ld a, [hli] + and $f + ld [hDivisor], a + ld b, 4 + call Divide +; Push the cubic term to the stack + ld a, [hQuotient + 0] + push af + ld a, [hQuotient + 1] + push af + ld a, [hQuotient + 2] + push af +; Square the level and multiply by the lower 7 bits of c + call .LevelSquared + ld a, [hl] + and $7f + ld [hMultiplier], a + call Multiply +; Push the absolute value of the quadratic term to the stack + ld a, [hProduct + 1] + push af + ld a, [hProduct + 2] + push af + ld a, [hProduct + 3] + push af + ld a, [hli] + push af +; Multiply the level by d + xor a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + ld a, d + ld [hMultiplicand + 2], a + ld a, [hli] + ld [hMultiplier], a + call Multiply +; Subtract e + ld b, [hl] + ld a, [hProduct + 3] + sub b + ld [hMultiplicand + 2], a + ld b, $0 + ld a, [hProduct + 2] + sbc b + ld [hMultiplicand + 1], a + ld a, [hProduct + 1] + sbc b + ld [hMultiplicand], a +; If bit 7 of c is set, c is negative; otherwise, it's positive + pop af + and $80 + jr nz, .subtract +; Add c*n**2 to (d*n - e) + pop bc + ld a, [hProduct + 3] + add b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + adc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + adc b + ld [hMultiplicand], a + jr .done_quadratic + +.subtract +; Subtract c*n**2 from (d*n - e) + pop bc + ld a, [hProduct + 3] + sub b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + sbc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + sbc b + ld [hMultiplicand], a + +.done_quadratic +; Add (a/b)*n**3 to (d*n - e +/- c*n**2) + pop bc + ld a, [hProduct + 3] + add b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + adc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + adc b + ld [hMultiplicand], a + ret + +.LevelSquared: ; 50eed + xor a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + ld a, d + ld [hMultiplicand + 2], a + ld [hMultiplier], a + jp Multiply + +INCLUDE "data/growth_rates.asm" diff --git a/engine/pokemon/health.asm b/engine/pokemon/health.asm new file mode 100755 index 000000000..cc47e8252 --- /dev/null +++ b/engine/pokemon/health.asm @@ -0,0 +1,110 @@ +HealParty: ; c658 + xor a + ld [wCurPartyMon], a + ld hl, wPartySpecies +.loop + ld a, [hli] + cp -1 + jr z, .done + cp EGG + jr z, .next + + push hl + call HealPartyMon + pop hl + +.next + ld a, [wCurPartyMon] + inc a + ld [wCurPartyMon], a + jr .loop + +.done + ret + +HealPartyMon: ; c677 + ld a, MON_SPECIES + call GetPartyParamLocation + ld d, h + ld e, l + + ld hl, MON_STATUS + add hl, de + xor a + ld [hli], a + ld [hl], a + + ld hl, MON_MAXHP + add hl, de + + ; bc = MON_HP + ld b, h + ld c, l + dec bc + dec bc + + ld a, [hli] + ld [bc], a + inc bc + ld a, [hl] + ld [bc], a + + farcall RestoreAllPP + ret + +ComputeHPBarPixels: ; c699 +; e = bc * (6 * 8) / de + ld a, b + or c + jr z, .zero + push hl + xor a + ld [hMultiplicand + 0], a + ld a, b + ld [hMultiplicand + 1], a + ld a, c + ld [hMultiplicand + 2], a + ld a, 6 * 8 + ld [hMultiplier], a + call Multiply + ; We need de to be under 256 because hDivisor is only 1 byte. + ld a, d + and a + jr z, .divide + ; divide de and hProduct by 4 + srl d + rr e + srl d + rr e + ld a, [hProduct + 2] + ld b, a + ld a, [hProduct + 3] + srl b + rr a + srl b + rr a + ld [hDividend + 3], a + ld a, b + ld [hDividend + 2], a +.divide + ld a, e + ld [hDivisor], a + ld b, 4 + call Divide + ld a, [hQuotient + 2] + ld e, a + pop hl + and a + ret nz + ld e, 1 + ret + +.zero + ld e, 0 + ret + +AnimateHPBar: ; c6e0 + call WaitBGMap + call _AnimateHPBar + call WaitBGMap + ret diff --git a/engine/pokemon/learn.asm b/engine/pokemon/learn.asm new file mode 100755 index 000000000..fb62289a7 --- /dev/null +++ b/engine/pokemon/learn.asm @@ -0,0 +1,256 @@ +LearnMove: ; 6508 + call LoadTileMapToTempTileMap + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + +.loop + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld d, h + ld e, l + ld b, NUM_MOVES +; Get the first empty move slot. This routine also serves to +; determine whether the Pokemon learning the moves already has +; all four slots occupied, in which case one would need to be +; deleted. +.next + ld a, [hl] + and a + jr z, .learn + inc hl + dec b + jr nz, .next +; If we're here, we enter the routine for forgetting a move +; to make room for the new move we're trying to learn. + push de + call ForgetMove + pop de + jp c, .cancel + + push hl + push de + ld [wd265], a + + ld b, a + ld a, [wBattleMode] + and a + jr z, .not_disabled + ld a, [wDisabledMove] + cp b + jr nz, .not_disabled + xor a + ld [wDisabledMove], a + ld [wPlayerDisableCount], a +.not_disabled + + call GetMoveName + ld hl, Text_1_2_and_Poof ; 1, 2 and… + call PrintText + pop de + pop hl + +.learn + ld a, [wPutativeTMHMMove] + ld [hl], a + ld bc, MON_PP - MON_MOVES + add hl, bc + + push hl + push de + dec a + ld hl, Moves + MOVE_PP + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + pop de + pop hl + + ld [hl], a + + ld a, [wBattleMode] + and a + jp z, .learned + + ld a, [wCurPartyMon] + ld b, a + ld a, [wCurBattleMon] + cp b + jp nz, .learned + + ld a, [wPlayerSubStatus5] + bit SUBSTATUS_TRANSFORMED, a + jp nz, .learned + + ld h, d + ld l, e + ld de, wBattleMonMoves + ld bc, NUM_MOVES + call CopyBytes + ld bc, wPartyMon1PP - (wPartyMon1Moves + NUM_MOVES) + add hl, bc + ld de, wBattleMonPP + ld bc, NUM_MOVES + call CopyBytes + jp .learned + +.cancel + ld hl, Text_StopLearning ; Stop learning ? + call PrintText + call YesNoBox + jp c, .loop + + ld hl, Text_DidNotLearn ; did not learn . + call PrintText + ld b, 0 + ret + +.learned + ld hl, Text_LearnedMove ; learned ! + call PrintText + ld b, 1 + ret +; 65d3 + +ForgetMove: ; 65d3 + push hl + ld hl, Text_TryingToLearn + call PrintText + call YesNoBox + pop hl + ret c + ld bc, -NUM_MOVES + add hl, bc + push hl + ld de, wListMoves_MoveIndicesBuffer + ld bc, NUM_MOVES + call CopyBytes + pop hl +.loop + push hl + ld hl, Text_ForgetWhich + call PrintText + hlcoord 5, 2 + ld b, NUM_MOVES * 2 + ld c, MOVE_NAME_LENGTH + call TextBox + hlcoord 5 + 2, 2 + 2 + ld a, SCREEN_WIDTH * 2 + ld [wBuffer1], a + predef ListMoves + ; w2DMenuData + ld a, $4 + ld [w2DMenuCursorInitY], a + ld a, $6 + ld [w2DMenuCursorInitX], a + ld a, [wNumMoves] + inc a + ld [w2DMenuNumRows], a + ld a, $1 + ld [w2DMenuNumCols], a + ld [wMenuCursorY], a + ld [wMenuCursorX], a + ld a, $3 + ld [wMenuJoypadFilter], a + ld a, $20 + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuCursorOffsets], a + call StaticMenuJoypad + push af + call Call_LoadTempTileMapToTileMap + pop af + pop hl + bit 1, a + jr nz, .cancel + push hl + ld a, [wMenuCursorY] + dec a + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + push af + push bc + call IsHMMove + pop bc + pop de + ld a, d + jr c, .hmmove + pop hl + add hl, bc + and a + ret + +.hmmove + ld hl, Text_CantForgetHM + call PrintText + pop hl + jr .loop + +.cancel + scf + ret +; 666b + +Text_LearnedMove: ; 666b +; learned ! + text_jump UnknownText_0x1c5660 + db "@" +; 6670 + +Text_ForgetWhich: ; 6670 +; Which move should be forgotten? + text_jump UnknownText_0x1c5678 + db "@" +; 6675 + +Text_StopLearning: ; 6675 +; Stop learning ? + text_jump UnknownText_0x1c5699 + db "@" +; 667a + +Text_DidNotLearn: ; 667a +; did not learn . + text_jump UnknownText_0x1c56af + db "@" +; 667f + +Text_TryingToLearn: ; 667f +; is trying to learn . But can't learn more than +; four moves. Delete an older move to make room for ? + text_jump UnknownText_0x1c56c9 + db "@" +; 6684 + +Text_1_2_and_Poof: ; 6684 + text_jump UnknownText_0x1c5740 ; 1, 2 and… + start_asm + push de + ld de, SFX_SWITCH_POKEMON + call PlaySFX + pop de + ld hl, .PoofForgot + ret + +.PoofForgot: +; Poof! forgot . And… + text_jump UnknownText_0x1c574e + db "@" +; 669a + +Text_CantForgetHM: ; 669a +; HM moves can't be forgotten now. + text_jump UnknownText_0x1c5772 + db "@" +; 669f diff --git a/engine/pokemon/mail.asm b/engine/pokemon/mail.asm new file mode 100755 index 000000000..b8685c0df --- /dev/null +++ b/engine/pokemon/mail.asm @@ -0,0 +1,587 @@ +SendMailToPC: ; 4456e + ld a, MON_ITEM + call GetPartyParamLocation + ld d, [hl] + farcall ItemIsMail + jr nc, .full + call GetMailboxCount + cp MAILBOX_CAPACITY + jr nc, .full + ld bc, MAIL_STRUCT_LENGTH + ld hl, sMailbox + call AddNTimes + ld d, h + ld e, l + ld a, [wCurPartyMon] + ld bc, MAIL_STRUCT_LENGTH + ld hl, sPartyMail + call AddNTimes + push hl + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop hl + xor a + ld bc, MAIL_STRUCT_LENGTH + call ByteFill + ld a, MON_ITEM + call GetPartyParamLocation + ld [hl], 0 + ld hl, sMailboxCount + inc [hl] + call CloseSRAM + xor a + ret + +.full + scf + ret +; 445c0 + +DeleteMailFromPC: ; 445c0 (11:45c0) +; Shift all mail messages in the mailbox + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld a, b + push bc + ld hl, sMailbox + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + push hl + add hl, bc + pop de + pop bc +.loop + ld a, b + cp MAILBOX_CAPACITY - 1 + jr z, .done + push bc + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop bc + inc b + jr .loop +.done + ld h, d + ld l, e + xor a + ld bc, MAIL_STRUCT_LENGTH + call ByteFill + ld hl, sMailboxCount + dec [hl] + jp CloseSRAM +; 445f4 (11:45f4) + +ReadMailMessage: ; 445f4 + ld a, b + ld hl, sMailbox + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + farcall ReadAnyMail + ret + +MoveMailFromPCToParty: ; 44607 + ld a, BANK(sMailboxCount) + call GetSRAMBank + push bc + ld a, b + ld bc, MAIL_STRUCT_LENGTH + ld hl, sMailbox + call AddNTimes + push hl + ld a, [wCurPartyMon] + ld bc, MAIL_STRUCT_LENGTH + ld hl, sPartyMail + call AddNTimes + ld d, h + ld e, l + pop hl + push hl + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop hl + ld de, PARTYMON_STRUCT_LENGTH - MON_MOVES + add hl, de + ld d, [hl] + ld a, [wCurPartyMon] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld [hl], d + call CloseSRAM + pop bc + jp DeleteMailFromPC +; 44648 (11:4648) + +GetMailboxCount: ; 44648 + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld a, [sMailboxCount] + ld c, a + jp CloseSRAM +; 44654 + +CheckPokeItem:: ; 44654 + push bc + push de + farcall SelectMonFromParty + ld a, POKEMAIL_REFUSED + jr c, .pop_return + + ld a, [wCurPartyMon] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, [hl] + farcall ItemIsMail + ld a, POKEMAIL_NO_MAIL + jr nc, .pop_return + + ld a, BANK(sPartyMail) + call GetSRAMBank + ld a, [wCurPartyMon] + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + pop hl + pop bc + +; Compare the mail message, byte for byte, with the expected message. + ld a, MAIL_MSG_LENGTH + ld [wd265], a +.loop + ld a, [de] + ld c, a + ld a, b + call GetFarByte + cp "@" + jr z, .done + cp c + ld a, POKEMAIL_WRONG_MAIL + jr nz, .close_sram_return + inc hl + inc de + ld a, [wd265] + dec a + ld [wd265], a + jr nz, .loop + +.done + farcall CheckCurPartyMonFainted + ld a, POKEMAIL_LAST_MON + jr c, .close_sram_return + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ld a, POKEMAIL_CORRECT + +.close_sram_return + call CloseSRAM + jr .return + +.pop_return + pop de + pop bc + +.return + ld [wScriptVar], a + ret +; 446cc + + +GivePokeItem:: ; 446cc + ld a, [wPartyCount] + dec a + push af + push bc + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld [hl], b + pop af + push bc + push af + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wd002 + ld bc, MAIL_MSG_LENGTH + 1 + ld a, BANK(sPartyMail) + call GetSRAMBank + call CopyBytes + pop af + push af + ld hl, wPartyMonOT + ld bc, NAME_LENGTH + call AddNTimes + ld bc, NAME_LENGTH - 1 + call CopyBytes + pop af + ld hl, wPartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + inc de + ld a, [wCurPartySpecies] + ld [de], a + inc de + pop bc + ld a, b + ld [de], a + jp CloseSRAM +; 44725 + + +BackupPartyMonMail: ; 44725 + ld a, BANK(sPartyMail) + call GetSRAMBank + ld hl, sPartyMail + ld de, sPartyMailBackup + ld bc, 6 * MAIL_STRUCT_LENGTH + call CopyBytes + ld hl, sMailboxCount + ld de, sMailboxCountBackup + ld bc, 1 + 10 * MAIL_STRUCT_LENGTH + call CopyBytes + jp CloseSRAM +; 44745 + +RestorePartyMonMail: ; 44745 (11:4745) + ld a, BANK(sPartyMail) + call GetSRAMBank + ld hl, sPartyMailBackup + ld de, sPartyMail + ld bc, 6 * MAIL_STRUCT_LENGTH + call CopyBytes + ld hl, sMailboxCountBackup + ld de, sMailboxCount + ld bc, 1 + 10 * MAIL_STRUCT_LENGTH + call CopyBytes + jp CloseSRAM + +DeletePartyMonMail: ; 44765 (11:4765) + ld a, BANK(sPartyMail) + call GetSRAMBank + xor a + ld hl, sPartyMail + ld bc, 6 * MAIL_STRUCT_LENGTH + call ByteFill + xor a + ld hl, sMailboxCount + ld bc, 1 + 10 * MAIL_STRUCT_LENGTH + call ByteFill + jp CloseSRAM +; 44781 (11:4781) + + +IsAnyMonHoldingMail: ; 44781 + ld a, [wPartyCount] + and a + jr z, .no_mons + ld e, a + ld hl, wPartyMon1Item +.loop + ld d, [hl] + push hl + push de + farcall ItemIsMail + pop de + pop hl + ret c + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + +.no_mons + and a + ret +; 447a0 + +_PlayerMailBoxMenu: ; 0x447a0 + call InitMail + jr z, .nomail + call LoadStandardMenuHeader + call MailboxPC + jp CloseWindow + +.nomail + ld hl, .EmptyMailboxText + jp MenuTextBoxBackup +; 0x447b4 + +.EmptyMailboxText: ; 0x447b4 + text_jump _EmptyMailboxText + db "@" + +InitMail: ; 0x447b9 +; initialize wMailboxCount and beyond with incrementing values, one per mail +; set z if no mail + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld a, [sMailboxCount] + call CloseSRAM + ld hl, wMailboxCount + ld [hli], a + and a + + jr z, .done ; if no mail, we're done + + ; load values in memory with incrementing values starting at wMailboxCount + ld b, a + ld a, 1 +.loop + ld [hli], a + inc a + dec b + jr nz, .loop +.done + ld [hl], -1 ; terminate + + ld a, [wMailboxCount] + and a + ret +; 0x447da + +MailboxPC_GetMailAuthor: ; 0x447da + dec a + ld hl, sMailbox1Author + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld a, BANK(sMailboxCount) + call GetSRAMBank + ld de, wStringBuffer2 + push de + ld bc, NAME_LENGTH - 1 + call CopyBytes + ld a, "@" + ld [de], a + call CloseSRAM + pop de + ret +; 0x447fb + +MailboxPC_PrintMailAuthor: ; 0x447fb + push de + ld a, [wMenuSelection] + call MailboxPC_GetMailAuthor + pop hl + jp PlaceString +; 0x44806 + +MailboxPC: ; 0x44806 + xor a + ld [wCurMessageScrollPosition], a + ld a, 1 + ld [wCurMessageIndex], a +.loop + call InitMail + ld hl, .TopMenuHeader + call CopyMenuHeader + xor a + ld [hBGMapMode], a + call InitScrollingMenu + call UpdateSprites + + ld a, [wCurMessageIndex] + ld [wMenuCursorBuffer], a + ld a, [wCurMessageScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wCurMessageScrollPosition], a + ld a, [wMenuCursorY] + ld [wCurMessageIndex], a + + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .exit + call .Submenu + jr .loop + +.exit + xor a + ret +; 0x4484a + +.Submenu: ; 0x4484a + ld hl, .SubMenuHeader + call LoadMenuHeader + call VerticalMenu + call ExitMenu + jr c, .subexit + ld a, [wMenuCursorY] + dec a + ld hl, .JumpTable + rst JumpTable + +.subexit + ret +; 0x44861 + +.JumpTable: + dw .ReadMail + dw .PutInPack + dw .AttachMail + dw .Cancel + +.ReadMail: ; 0x44869 + call FadeToMenu + ld a, [wMenuSelection] + dec a + ld b, a + call ReadMailMessage + jp CloseSubmenu +; 0x44877 + +.PutInPack: ; 0x44877 + ld hl, .MessageLostText + call MenuTextBox + call YesNoBox + call ExitMenu + ret c + ld a, [wMenuSelection] + dec a + call .GetMailType + ld a, 1 + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + call ReceiveItem + jr c, .put_in_bag + ld hl, .PackFullText + jp MenuTextBoxBackup + +.put_in_bag + ld a, [wMenuSelection] + dec a + ld b, a + call DeleteMailFromPC + ld hl, .PutAwayText + jp MenuTextBoxBackup +; 0x448ac + +.PutAwayText: ; 0x448ac + text_jump ClearedMailPutAwayText + db "@" + +.PackFullText: ; 0x448b1 + text_jump MailPackFullText + db "@" + +.MessageLostText: ; 0x448b6 + text_jump MailMessageLostText + db "@" + +.GetMailType: ; 0x448bb + push af + ld a, BANK(sMailboxCount) + call GetSRAMBank + pop af + ld hl, sMailbox1Type + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [wCurItem], a + jp CloseSRAM +; 0x448d2 + +.AttachMail: ; 0x448d2 + call FadeToMenu + xor a + ld [wPartyMenuActionText], a + call ClearBGPalettes +.try_again + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + jr c, .exit2 + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + ld a, MON_ITEM + call GetPartyParamLocation + ld a, [hl] + and a + jr z, .attach_mail + ld hl, .HoldingMailText + call PrintText + jr .try_again + +.egg + ld hl, .EggText + call PrintText + jr .try_again + +.attach_mail + ld a, [wMenuSelection] + dec a + ld b, a + call MoveMailFromPCToParty + ld hl, .MailMovedText + call PrintText + +.exit2 + jp CloseSubmenu +; 0x4493c + +.HoldingMailText: ; 0x4493c + text_jump MailAlreadyHoldingItemText + db "@" + +.EggText: ; 0x44941 + text_jump MailEggText + db "@" + +.MailMovedText: ; 0x44946 + text_jump MailMovedFromBoxText + db "@" + +.Cancel: + ret + +.TopMenuHeader: ; 0x4494c + db MENU_BACKUP_TILES ; flags + menu_coords 8, 1, SCREEN_WIDTH - 2, 10 + dw .TopMenuData + db 1 ; default option + +.TopMenuData: + db SCROLLINGMENU_DISPLAY_ARROWS ; flags + db 4, 0 ; rows/columns? + db 1 ; horizontal spacing? + dbw 0, wMailboxCount ; text pointer + dba MailboxPC_PrintMailAuthor + dba NULL + dba NULL + +.SubMenuHeader: ; 0x44964 + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 13, 9 + dw .SubMenuData + db 1 ; default option + +.SubMenuData: + db STATICMENU_CURSOR ; flags + db 4 ; items + db "READ MAIL@" + db "PUT IN PACK@" + db "ATTACH MAIL@" + db "CANCEL@" diff --git a/engine/pokemon/mail_2.asm b/engine/pokemon/mail_2.asm new file mode 100755 index 000000000..6e326641b --- /dev/null +++ b/engine/pokemon/mail_2.asm @@ -0,0 +1,949 @@ +ReadPartyMonMail: ; b9229 + ld a, [wCurPartyMon] + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l +ReadAnyMail: ; b9237 + push de + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call DisableLCD + call LoadFontsExtra + pop de + push de + ld a, BANK(sPartyMail) + call GetSRAMBank + farcall IsMailEuropean + call CloseSRAM + ld a, c + ld de, StandardEnglishFont + or a + jr z, .got_font + ld de, FrenchGermanFont + sub $3 + jr c, .got_font + ld de, SpanishItalianFont + +.got_font + ld hl, vTiles1 + lb bc, BANK(StandardEnglishFont), $80 + call Get1bpp + pop de + call .LoadGFX + call EnableLCD + call WaitBGMap + ld a, [wBuffer3] + ld e, a + farcall LoadMailPalettes + call SetPalettes + xor a + ld [hJoyPressed], a + call .loop + call ClearBGPalettes + call DisableLCD + call LoadStandardFont + jp EnableLCD + +.loop + call GetJoypad + ld a, [hJoyPressed] + and A_BUTTON | B_BUTTON | START + jr z, .loop + and START + jr nz, .pressed_start + ret + +.pressed_start + ld a, [wJumptableIndex] + push af + callfar PrintMail ; printer + pop af + ld [wJumptableIndex], a + jr .loop +; b92b8 + +.LoadGFX: ; b92b8 + ld h, d + ld l, e + push hl + ld a, BANK(sPartyMail) + call GetSRAMBank + ld de, sPartyMon1MailAuthorID - sPartyMon1Mail + add hl, de + ld a, [hli] + ld [wBuffer1], a + ld a, [hli] + ld [wBuffer2], a + ld a, [hli] + ld [wCurPartySpecies], a + ld b, [hl] + call CloseSRAM + ld hl, MailGFXPointers + ld c, 0 +.loop2 + ld a, [hli] + cp b + jr z, .got_pointer + cp -1 + jr z, .invalid + inc c + inc hl + inc hl + jr .loop2 + +.invalid + ld hl, MailGFXPointers + inc hl + +.got_pointer + ld a, c + ld [wBuffer3], a + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .done + pop bc + push de + jp hl +.done + ret +; b92f8 + +MailGFXPointers: ; b92f8 + dbw FLOWER_MAIL, LoadFlowerMailGFX + dbw SURF_MAIL, LoadSurfMailGFX + dbw LITEBLUEMAIL, LoadLiteBlueMailGFX + dbw PORTRAITMAIL, LoadPortraitMailGFX + dbw LOVELY_MAIL, LoadLovelyMailGFX + dbw EON_MAIL, LoadEonMailGFX + dbw MORPH_MAIL, LoadMorphMailGFX + dbw BLUESKY_MAIL, LoadBlueSkyMailGFX + dbw MUSIC_MAIL, LoadMusicMailGFX + dbw MIRAGE_MAIL, LoadMirageMailGFX + db -1 +; b9317 + +LoadSurfMailGFX: ; b9317 + push bc + ld hl, vTiles2 tile $31 + ld de, SurfMailBorderGFX + ld c, 8 * 8 + call LoadMailGFX_Color2 + ld de, MailLaprasGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + ld de, SurfMailWaveGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + jr FinishLoadingSurfLiteBlueMailGFX + +LoadLiteBlueMailGFX: ; b9335 + push bc + ld hl, vTiles2 tile $31 + ld de, LiteBlueMailBorderGFX + ld c, 8 * 8 + call LoadMailGFX_Color2 + ld de, MailDratiniGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + ld de, PortraitMailUnderlineGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + +FinishLoadingSurfLiteBlueMailGFX: ; b9351 + ld de, SurfLiteBlueMailSmallShapesGFX + ld c, 2 * 8 + call LoadMailGFX_Color2 + ld c, 2 * 8 + call LoadMailGFX_Color1 + ld de, SurfLiteBlueMailLargeShapesGFX + ld c, 8 * 8 + call LoadMailGFX_Color1 + ld c, 8 * 8 + call LoadMailGFX_Color2 + + call DrawMailBorder + hlcoord 2, 15 + ld a, $3f + call Mail_Draw16TileRow + ld a, $39 + hlcoord 15, 14 + call Mail_Draw3x2Graphic + ld a, $44 + hlcoord 2, 2 + call Mail_Draw2x2Graphic + hlcoord 15, 11 + call Mail_Draw2x2Graphic + ld a, $4c + hlcoord 3, 12 + call Mail_Draw2x2Graphic + hlcoord 15, 2 + call Mail_Draw2x2Graphic + ld a, $50 + hlcoord 6, 3 + call Mail_Draw2x2Graphic + ld a, $40 + hlcoord 13, 2 + ld [hli], a + hlcoord 6, 14 + ld [hl], a + ld a, $41 + hlcoord 4, 5 + ld [hli], a + hlcoord 17, 5 + ld [hli], a + hlcoord 13, 12 + ld [hl], a + ld a, $42 + hlcoord 9, 2 + ld [hli], a + hlcoord 14, 5 + ld [hli], a + hlcoord 3, 10 + ld [hl], a + ld a, $43 + hlcoord 6, 11 + ld [hli], a + pop hl + jp MailGFX_PlaceMessage +; b93d2 + +LoadEonMailGFX: ; b93d2 + push bc + ld hl, vTiles2 tile $31 + ld de, EonMailBorder1GFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, EonMailBorder2GFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, EonMailBorder2GFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, EonMailBorder1GFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, SurfMailBorderGFX + 6 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MailEeveeGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + ld hl, vTiles2 tile $3d + ld de, MailLargeCircleGFX + ld c, 4 * 8 + call LoadMailGFX_Color1 + ld de, EonMailBorder2GFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + + ld a, $31 + hlcoord 0, 0 + call Mail_Place18TileAlternatingRow + hlcoord 1, 17 + call Mail_Place18TileAlternatingRow + ld a, $33 + hlcoord 0, 1 + call Mail_Place16TileAlternatingColumn + hlcoord 19, 0 + call Mail_Place16TileAlternatingColumn + hlcoord 2, 15 + ld a, $35 + call Mail_Draw16TileRow + inc a + hlcoord 15, 14 + call Mail_Draw3x2Graphic + call LovelyEonMail_PlaceIcons + pop hl + jp MailGFX_PlaceMessage +; b944b + +LoadLovelyMailGFX: ; b944b + push bc + ld hl, vTiles2 tile $31 + ld de, LovelyMailBorderGFX + ld c, 5 * 8 + call LoadMailGFX_Color2 + ld de, MailPoliwagGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + ld de, LovelyMailUnderlineGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, LovelyMailLargeHeartGFX + ld c, 4 * 8 + call LoadMailGFX_Color2 + ld de, LovelyMailSmallHeartGFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + + call DrawMailBorder2 + hlcoord 2, 15 + ld a, $3c + call Mail_Draw16TileRow + ld a, $36 + hlcoord 15, 14 + call Mail_Draw3x2Graphic + call LovelyEonMail_PlaceIcons + pop hl + jp MailGFX_PlaceMessage +; b9491 + +LovelyEonMail_PlaceIcons: ; b9491 + ld a, $3d + hlcoord 2, 2 + call Mail_Draw2x2Graphic + hlcoord 16, 2 + call Mail_Draw2x2Graphic + hlcoord 9, 4 + call Mail_Draw2x2Graphic + hlcoord 2, 11 + call Mail_Draw2x2Graphic + hlcoord 6, 12 + call Mail_Draw2x2Graphic + hlcoord 12, 11 + call Mail_Draw2x2Graphic + ld a, $41 + hlcoord 5, 4 + ld [hl], a + hlcoord 6, 2 + ld [hl], a + hlcoord 12, 4 + ld [hl], a + hlcoord 14, 2 + ld [hl], a + hlcoord 3, 13 + ld [hl], a + hlcoord 9, 11 + ld [hl], a + hlcoord 16, 12 + ld [hl], a + ret +; b94d6 + +LoadMorphMailGFX: ; b94d6 + push bc + ld hl, vTiles2 tile $31 + ld bc, 5 * 8 + call MailGFX_GenerateMonochromeTilesColor2 + ld de, MorphMailBorderCornerGFX + 3 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MorphMailBorderCornerGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MorphMailBorderGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, EonMailBorder1GFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, MorphMailDividerGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MailDittoGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + call DrawMailBorder2 + ld a, $31 + hlcoord 1, 1 + call Mail_Draw2x2Graphic + hlcoord 17, 15 + call Mail_Draw2x2Graphic + hlcoord 1, 3 + ld [hl], a + hlcoord 3, 1 + ld [hl], a + hlcoord 16, 16 + ld [hl], a + hlcoord 18, 14 + ld [hl], a + ld a, $36 + hlcoord 1, 4 + ld [hl], a + hlcoord 2, 3 + ld [hl], a + hlcoord 3, 2 + ld [hl], a + hlcoord 4, 1 + ld [hl], a + inc a + hlcoord 15, 16 + ld [hl], a + hlcoord 16, 15 + ld [hl], a + hlcoord 17, 14 + ld [hl], a + hlcoord 18, 13 + ld [hl], a + inc a + hlcoord 2, 15 + ld b, $e + call Mail_DrawRowLoop + inc a + hlcoord 2, 11 + call Mail_Draw16TileRow + hlcoord 2, 5 + call Mail_Draw16TileRow + inc a + hlcoord 6, 1 + call Mail_Draw13TileRow + hlcoord 1, 16 + call Mail_Draw13TileRow + inc a + hlcoord 3, 13 + call Mail_Draw3x2Graphic + pop hl + jp MailGFX_PlaceMessage +; b9582 + +LoadBlueSkyMailGFX: ; b9582 + push bc + ld hl, vTiles2 tile $31 + ld de, EonMailBorder1GFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld a, $ff + ld bc, 1 tiles + call ByteFill + ld de, BlueSkyMailGrassGFX + ld c, 1 * 8 + call LoadMailGFX_Color3 + ld de, MailDragoniteGFX + ld c, 23 * 8 + call LoadMailGFX_Color3 + ld de, MailCloudGFX + ld c, 6 * 8 + call LoadMailGFX_Color1 + ld de, FlowerMailBorderGFX + 6 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, MailCloudGFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, MailCloudGFX + 2 * 8 + ld c, 2 * 8 + call LoadMailGFX_Color1 + ld de, MailCloudGFX + 5 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color1 + + ld a, $31 + hlcoord 0, 0 + call Mail_DrawFullWidthBorder + hlcoord 0, 1 + call Mail_DrawLeftRightBorder + hlcoord 19, 1 + call Mail_DrawLeftRightBorder + inc a + hlcoord 0, 17 + call Mail_DrawFullWidthBorder + inc a + hlcoord 0, 16 + call Mail_DrawFullWidthBorder + inc a + hlcoord 2, 2 + call Mail_Place6TileRow + hlcoord 3, 3 + call Mail_Place6TileRow + hlcoord 4, 4 + call Mail_Place6TileRow + dec hl + ld [hl], $7f + dec a + hlcoord 15, 14 + call Mail_Draw2x2Graphic + add $4 + hlcoord 15, 16 + ld [hli], a + inc a + ld [hl], a + inc a + push af + hlcoord 12, 1 + call Mail_Draw3x2Graphic + pop af + hlcoord 15, 4 + call Mail_Draw3x2Graphic + inc a + hlcoord 2, 11 + call Mail_Draw16TileRow + inc a + hlcoord 10, 3 + call Mail_Draw2x2Graphic + pop hl + jp MailGFX_PlaceMessage +; b9636 + +Mail_Place6TileRow: ; b9636 + ld b, $6 +.loop + ld [hli], a + inc a + dec b + jr nz, .loop + ret +; b963e + +LoadFlowerMailGFX: ; b963e + push bc + ld hl, vTiles2 tile $31 + ld de, FlowerMailBorderGFX + ld c, 8 * 8 + call LoadMailGFX_Color1 + ld de, MailOddishGFX + ld c, 4 * 8 + call LoadMailGFX_Color3 + ld de, FlowerMailBorderGFX + 6 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, FlowerMailFlowerGFX + ld c, 4 * 8 + call LoadMailGFX_Color1 + ld c, 4 * 8 + call LoadMailGFX_Color2 + + call DrawMailBorder + hlcoord 2, 15 + ld a, $3d ; underline + call Mail_Draw16TileRow + ld a, $39 ; oddish + hlcoord 16, 13 + call Mail_Draw2x2Graphic + hlcoord 2, 13 + call Mail_Draw2x2Graphic + ld a, $3e + hlcoord 2, 2 + call Mail_Draw2x2Graphic + hlcoord 5, 3 + call Mail_Draw2x2Graphic + hlcoord 10, 2 + call Mail_Draw2x2Graphic + hlcoord 16, 3 + call Mail_Draw2x2Graphic + hlcoord 5, 11 + call Mail_Draw2x2Graphic + hlcoord 16, 10 + call Mail_Draw2x2Graphic + ld a, $42 + hlcoord 3, 4 + call Mail_Draw2x2Graphic + hlcoord 12, 3 + call Mail_Draw2x2Graphic + hlcoord 14, 2 + call Mail_Draw2x2Graphic + hlcoord 2, 10 + call Mail_Draw2x2Graphic + hlcoord 14, 11 + call Mail_Draw2x2Graphic + pop hl + jp MailGFX_PlaceMessage +; b96ca + +LoadPortraitMailGFX: ; b96ca + push bc + ld hl, vTiles2 tile $31 + ld de, PortraitMailBorderGFX + ld c, 5 * 8 + call LoadMailGFX_Color2 + ld de, PortraitMailUnderlineGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld hl, vTiles2 tile $3d + ld de, PortraitMailLargePokeballGFX + ld c, 4 * 8 + call LoadMailGFX_Color1 + ld de, PortraitMailSmallPokeballGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + + call DrawMailBorder2 + hlcoord 8, 15 + ld a, $36 + ld b, $a + call Mail_DrawRowLoop + call LovelyEonMail_PlaceIcons + ld a, $1 + ld [wUnownLetter], a + hlcoord 1, 10 + call PrepMonFrontpic + pop hl + jp MailGFX_PlaceMessage +; b9710 + +LoadMusicMailGFX: ; b9710 + push bc + ld hl, vTiles2 tile $31 + ld de, MusicMailBorderGFX + ld c, 4 * 8 + call LoadMailGFX_Color2 + ld de, MorphMailBorderGFX + ld c, 2 * 8 + call LoadMailGFX_Color2 + ld de, MailNatuGFX + ld c, 6 * 8 + call LoadMailGFX_Color3 + xor a + ld bc, 1 tiles + call ByteFill + ld de, MusicMailLargeNoteGFX + ld c, 3 * 8 + call LoadMailGFX_Color1 + ld de, MusicMailSmallNoteGFX + ld c, 1 * 8 + call LoadMailGFX_Color1 + + ld a, $31 + hlcoord 0, 0 + call Mail_Place18TileAlternatingRow + hlcoord 1, 17 + call Mail_Place18TileAlternatingRow + ld a, $33 + hlcoord 0, 1 + call Mail_Place16TileAlternatingColumn + hlcoord 19, 0 + call Mail_Place16TileAlternatingColumn + ld a, $35 + hlcoord 2, 15 + call Mail_Place14TileAlternatingRow + ld a, $37 + hlcoord 15, 14 + call Mail_Draw3x2Graphic + call LovelyEonMail_PlaceIcons + pop hl + jp MailGFX_PlaceMessage +; b9776 + +LoadMirageMailGFX: ; b9776 + push bc + ld hl, vTiles2 tile $31 + ld bc, 5 * 8 + call MailGFX_GenerateMonochromeTilesColor2 + ld de, BlueSkyMailGrassGFX + ld c, 1 * 8 + call LoadMailGFX_Color2 + ld de, MailMewGFX + ld c, 18 * 8 + call LoadMailGFX_Color2 + ld de, LiteBlueMailBorderGFX + 1 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color1 + ld de, LiteBlueMailBorderGFX + 6 * 8 + ld c, 1 * 8 + call LoadMailGFX_Color1 + + call DrawMailBorder2 + ld a, $36 + hlcoord 1, 16 + call Mail_DrawTopBottomBorder + inc a + hlcoord 15, 14 + call Mail_Draw3x2Graphic + inc a + hlcoord 15, 16 + ld [hli], a + inc a + ld [hl], a + ld a, $3f + hlcoord 1, 1 + call Mail_Place18TileAlternatingRow + ld a, $41 + hlcoord 0, 2 + call Mail_Place14TileAlternatingColumn + ld a, $43 + hlcoord 19, 2 + call Mail_Place14TileAlternatingColumn + ld a, $45 + hlcoord 0, 1 + ld [hl], a + inc a + hlcoord 19, 1 + ld [hl], a + inc a + hlcoord 0, 16 + ld [hl], a + inc a + hlcoord 19, 16 + ld [hl], a + inc a + hlcoord 2, 5 + call Mail_Draw16TileRow + inc a + hlcoord 2, 11 + call Mail_Draw16TileRow + pop hl + jp MailGFX_PlaceMessage +; b97f8 + +MailGFX_GenerateMonochromeTilesColor2: ; b97f8 +.loop + xor a + ld [hli], a + ld a, $ff + ld [hli], a + dec bc + ld a, b + or c + jr nz, .loop + ret +; b9803 + +MailGFX_PlaceMessage: ; b9803 + ld bc, MAIL_STRUCT_LENGTH + ld de, wTempMail + ld a, BANK(sPartyMail) + call GetSRAMBank + call CopyBytes + call CloseSRAM + ld hl, wTempMailAuthor + ld de, wMonOrItemNameBuffer + ld bc, NAME_LENGTH - 1 + call CopyBytes + ld a, "@" + ld [wTempMailAuthor], a + ld [wMonOrItemNameBuffer + NAME_LENGTH - 1], a + ld de, wTempMailMessage + hlcoord 2, 7 + call PlaceString + ld de, wMonOrItemNameBuffer + ld a, [de] + and a + ret z + ld a, [wBuffer3] + hlcoord 8, 14 + cp $3 ; PORTRAITMAIL + jr z, .place_author + hlcoord 6, 14 + cp $6 ; MORPH_MAIL + jr z, .place_author + hlcoord 5, 14 + +.place_author + jp PlaceString +; b984e + +Unreferenced_Functionb984e: ; b984e +.loop + ld a, [hl] + xor $ff + ld [hli], a + dec bc + ld a, b + or c + jr nz, .loop + ret +; b9858 + +DrawMailBorder: ; b9858 + hlcoord 0, 0 + ld a, $31 + ld [hli], a + inc a + call Mail_DrawTopBottomBorder + inc a + ld [hli], a + inc a + call Mail_DrawLeftRightBorder + ld a, $36 + ld [hli], a + inc a + call Mail_DrawTopBottomBorder + hlcoord 19, 1 + ld a, $35 + call Mail_DrawLeftRightBorder + ld a, $38 + ld [hl], a + ret +; b987b + +DrawMailBorder2: ; b987b + hlcoord 0, 0 + ld a, $31 + ld [hli], a + inc a + call Mail_DrawTopBottomBorder + ld [hl], $31 + inc hl + inc a + call Mail_DrawLeftRightBorder + ld [hl], $31 + inc hl + inc a + call Mail_DrawTopBottomBorder + hlcoord 19, 1 + ld a, $35 + call Mail_DrawLeftRightBorder + ld [hl], $31 + ret +; b989e + +Mail_Place14TileAlternatingRow: ; b989e + push af + ld b, 14 / 2 + jr Mail_PlaceAlternatingRow + +Mail_Place16TileAlternatingRow: ; b98a3 + push af + ld b, 16 / 2 + jr Mail_PlaceAlternatingRow + +Mail_Place18TileAlternatingRow: ; b98a8 + push af + ld b, 18 / 2 + +Mail_PlaceAlternatingRow: ; b98ab +.loop + ld [hli], a + inc a + ld [hli], a + dec a + dec b + jr nz, .loop + ld [hl], a + pop af + ret +; b98b5 + +Mail_Place14TileAlternatingColumn: ; b98b5 + push af + ld b, 14 / 2 + jr Mail_PlaceAlternatingColumn + +Mail_Place16TileAlternatingColumn: ; b98ba + push af + ld b, 16 / 2 + +Mail_PlaceAlternatingColumn: ; b98bd +.loop + ld [hl], a + ld de, SCREEN_WIDTH + add hl, de + inc a + ld [hl], a + add hl, de + dec a + dec b + jr nz, .loop + ld [hl], a + pop af + ret +; b98cc + +Mail_Draw7TileRow: ; b98cc + ld b, $7 + jr Mail_DrawRowLoop + +Mail_Draw13TileRow: ; b98d0 + ld b, $d + jr Mail_DrawRowLoop + +Mail_Draw16TileRow: ; b98d4 + ld b, $10 + jr Mail_DrawRowLoop + +Mail_DrawTopBottomBorder: ; b98d8 + ld b, SCREEN_WIDTH - 2 + jr Mail_DrawRowLoop + +Mail_DrawFullWidthBorder: ; b98dc + ld b, SCREEN_WIDTH + +Mail_DrawRowLoop: ; b98de +.loop + ld [hli], a + dec b + jr nz, .loop + ret +; b98e3 + +Mail_DrawLeftRightBorder: ; b98e3 + ld b, SCREEN_HEIGHT - 2 + ld de, SCREEN_WIDTH +.loop + ld [hl], a + add hl, de + dec b + jr nz, .loop + ret +; b98ee + +Mail_Draw2x2Graphic: ; b98ee + push af + ld [hli], a + inc a + ld [hl], a + ld bc, SCREEN_WIDTH - 1 + add hl, bc + inc a + ld [hli], a + inc a + ld [hl], a + pop af + ret +; b98fc + +Mail_Draw3x2Graphic: ; b98fc + ld [hli], a + inc a + ld [hli], a + inc a + ld [hl], a + ld bc, SCREEN_WIDTH - 2 + add hl, bc + inc a + ld [hli], a + inc a + ld [hli], a + inc a + ld [hl], a + ret +; b990c + +LoadMailGFX_Color1: ; b990c +.loop + ld a, [de] + inc de + ld [hli], a + xor a + ld [hli], a + dec c + jr nz, .loop + ret +; b9915 + +LoadMailGFX_Color2: ; b9915 +.loop + xor a + ld [hli], a + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .loop + ret +; b991e + +LoadMailGFX_Color3: ; b991e +.loop + ld a, [de] + inc de + ld [hli], a + ld [hli], a + dec c + jr nz, .loop + ret +; b9926 + +INCLUDE "gfx/mail.asm" + +ItemIsMail: ; b9e76 + ld a, d + ld hl, MailItems + ld de, 1 + jp IsInArray +; b9e80 + +INCLUDE "data/items/mail_items.asm" diff --git a/engine/pokemon/mon_stats.asm b/engine/pokemon/mon_stats.asm new file mode 100644 index 000000000..2b5586c51 --- /dev/null +++ b/engine/pokemon/mon_stats.asm @@ -0,0 +1,485 @@ +DrawPlayerHP: ; 50b0a + ld a, $1 + jr DrawHP + +DrawEnemyHP: ; 50b0e + ld a, $2 + +DrawHP: ; 50b10 + ld [wWhichHPBar], a + push hl + push bc + ; box mons have full HP + ld a, [wMonType] + cp BOXMON + jr z, .at_least_1_hp + + ld a, [wTempMonHP] + ld b, a + ld a, [wTempMonHP + 1] + ld c, a + +; Any HP? + or b + jr nz, .at_least_1_hp + + xor a + ld c, a + ld e, a + ld a, 6 + ld d, a + jp .fainted + +.at_least_1_hp + ld a, [wTempMonMaxHP] + ld d, a + ld a, [wTempMonMaxHP + 1] + ld e, a + ld a, [wMonType] + cp BOXMON + jr nz, .not_boxmon + + ld b, d + ld c, e + +.not_boxmon + predef ComputeHPBarPixels + ld a, 6 + ld d, a + ld c, a + +.fainted + ld a, c + pop bc + ld c, a + pop hl + push de + push hl + push hl + call DrawBattleHPBar + pop hl + +; Print HP + bccoord 1, 1, 0 + add hl, bc + ld de, wTempMonHP + ld a, [wMonType] + cp BOXMON + jr nz, .not_boxmon_2 + ld de, wTempMonMaxHP +.not_boxmon_2 + lb bc, 2, 3 + call PrintNum + + ld a, "/" + ld [hli], a + +; Print max HP + ld de, wTempMonMaxHP + lb bc, 2, 3 + call PrintNum + pop hl + pop de + ret + +PrintTempMonStats: ; 50b7b +; Print wTempMon's stats at hl, with spacing bc. + push bc + push hl + ld de, .StatNames + call PlaceString + pop hl + pop bc + add hl, bc + ld bc, SCREEN_WIDTH + add hl, bc + ld de, wTempMonAttack + lb bc, 2, 3 + call .PrintStat + ld de, wTempMonDefense + call .PrintStat + ld de, wTempMonSpclAtk + call .PrintStat + ld de, wTempMonSpclDef + call .PrintStat + ld de, wTempMonSpeed + jp PrintNum + +.PrintStat: ; 50bab + push hl + call PrintNum + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + ret + +.StatNames: ; 50bb5 + db "ATTACK" + next "DEFENSE" + next "SPCL.ATK" + next "SPCL.DEF" + next "SPEED" + next "@" + +GetGender: ; 50bdd +; Return the gender of a given monster (wCurPartyMon/wCurOTMon/wCurWildMon). +; When calling this function, a should be set to an appropriate wMonType value. + +; return values: +; a = 1: f = nc|nz; male +; a = 0: f = nc|z; female +; f = c: genderless + +; This is determined by comparing the Attack and Speed DVs +; with the species' gender ratio. + +; Figure out what type of monster struct we're looking at. + +; 0: PartyMon + ld hl, wPartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wMonType] + and a + jr z, .PartyMon + +; 1: OTPartyMon + ld hl, wOTPartyMon1DVs + dec a + jr z, .PartyMon + +; 2: sBoxMon + ld hl, sBoxMon1DVs + ld bc, BOXMON_STRUCT_LENGTH + dec a + jr z, .sBoxMon + +; 3: Unknown + ld hl, wTempMonDVs + dec a + jr z, .DVs + +; else: WildMon + ld hl, wEnemyMonDVs + jr .DVs + +; Get our place in the party/box. + +.PartyMon: +.sBoxMon + ld a, [wCurPartyMon] + call AddNTimes + +.DVs: + +; sBoxMon data is read directly from SRAM. + ld a, [wMonType] + cp BOXMON + ld a, BANK(sBox) + call z, GetSRAMBank + +; Attack DV + ld a, [hli] + and $f0 + ld b, a +; Speed DV + ld a, [hl] + and $f0 + swap a + +; Put our DVs together. + or b + ld b, a + +; Close SRAM if we were dealing with a sBoxMon. + ld a, [wMonType] + cp BOXMON + call z, CloseSRAM + +; We need the gender ratio to do anything with this. + push bc + ld a, [wCurPartySpecies] + dec a + ld hl, BaseData + BASE_GENDER + ld bc, BASE_DATA_SIZE + call AddNTimes + pop bc + + ld a, BANK(BaseData) + call GetFarByte + +; The higher the ratio, the more likely the monster is to be female. + + cp GENDERLESS + jr z, .Genderless + + and a ; GENDER_F0? + jr z, .Male + + cp GENDER_F100 + jr z, .Female + +; Values below the ratio are male, and vice versa. + cp b + jr c, .Male + +.Female: + xor a + ret + +.Male: + ld a, 1 + and a + ret + +.Genderless: + scf + ret + +ListMovePP: ; 50c50 + ld a, [wNumMoves] + inc a + ld c, a + ld a, NUM_MOVES + sub c + ld b, a + push hl + ld a, [wBuffer1] + ld e, a + ld d, $0 + ld a, $3e ; P + call .load_loop + ld a, b + and a + jr z, .skip + ld c, a + ld a, "-" + call .load_loop + +.skip + pop hl + inc hl + inc hl + inc hl + ld d, h + ld e, l + ld hl, wTempMonMoves + ld b, 0 +.loop + ld a, [hli] + and a + jr z, .done + push bc + push hl + push de + ld hl, wMenuCursorY + ld a, [hl] + push af + ld [hl], b + push hl + callfar GetMaxPPOfMove + pop hl + pop af + ld [hl], a + pop de + pop hl + push hl + ld bc, wTempMonPP - (wTempMonMoves + 1) + add hl, bc + ld a, [hl] + and $3f + ld [wStringBuffer1 + 4], a + ld h, d + ld l, e + push hl + ld de, wStringBuffer1 + 4 + lb bc, 1, 2 + call PrintNum + ld a, "/" + ld [hli], a + ld de, wd265 + lb bc, 1, 2 + call PrintNum + pop hl + ld a, [wBuffer1] + ld e, a + ld d, 0 + add hl, de + ld d, h + ld e, l + pop hl + pop bc + inc b + ld a, b + cp NUM_MOVES + jr nz, .loop + +.done + ret + +.load_loop ; 50cc9 + ld [hli], a + ld [hld], a + add hl, de + dec c + jr nz, .load_loop + ret + +Unreferenced_Function50cd0: ; 50cd0 +.loop + ld [hl], $32 + inc hl + ld [hl], $3e + dec hl + add hl, de + dec c + jr nz, .loop + ret + +Unused_PlaceEnemyHPLevel: + push hl + push hl + ld hl, wPartyMonNicknames + ld a, [wCurPartyMon] + call GetNick + pop hl + call PlaceString + call CopyMonToTempMon + pop hl + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + push hl + ld bc, -12 + add hl, bc + ld b, $0 + call DrawEnemyHP + pop hl + ld bc, 5 + add hl, bc + push de + call PrintLevel + pop de + +.egg + ret + +PlaceStatusString: ; 50d0a + push de + inc de + inc de + ld a, [de] + ld b, a + inc de + ld a, [de] + or b + pop de + jr nz, PlaceNonFaintStatus + push de + ld de, FntString + call CopyStatusString + pop de + ld a, $1 + and a + ret + +FntString: ; 50d22 + db "FNT@" + +CopyStatusString: ; 50d25 + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + ret + +PlaceNonFaintStatus: ; 50d2e + push de + ld a, [de] + ld de, PsnString + bit PSN, a + jr nz, .place + ld de, BrnString + bit BRN, a + jr nz, .place + ld de, FrzString + bit FRZ, a + jr nz, .place + ld de, ParString + bit PAR, a + jr nz, .place + ld de, SlpString + and SLP + jr z, .no_status + +.place + call CopyStatusString + ld a, $1 + and a + +.no_status + pop de + ret + +SlpString: db "SLP@" +PsnString: db "PSN@" +BrnString: db "BRN@" +FrzString: db "FRZ@" +ParString: db "PAR@" + +ListMoves: ; 50d6f +; List moves at hl, spaced every [wBuffer1] tiles. + ld de, wListMoves_MoveIndicesBuffer + ld b, $0 +.moves_loop + ld a, [de] + inc de + and a + jr z, .no_more_moves + push de + push hl + push hl + ld [wCurSpecies], a + ld a, MOVE_NAME + ld [wNamedObjectTypeBuffer], a + call GetName + ld de, wStringBuffer1 + pop hl + push bc + call PlaceString + pop bc + ld a, b + ld [wNumMoves], a + inc b + pop hl + push bc + ld a, [wBuffer1] + ld c, a + ld b, 0 + add hl, bc + pop bc + pop de + ld a, b + cp NUM_MOVES + jr z, .done + jr .moves_loop + +.no_more_moves + ld a, b +.nonmove_loop + push af + ld [hl], "-" + ld a, [wBuffer1] + ld c, a + ld b, 0 + add hl, bc + pop af + inc a + cp NUM_MOVES + jr nz, .nonmove_loop + +.done + ret diff --git a/engine/pokemon/move_mon.asm b/engine/pokemon/move_mon.asm new file mode 100755 index 000000000..8ccf319f0 --- /dev/null +++ b/engine/pokemon/move_mon.asm @@ -0,0 +1,1845 @@ +TryAddMonToParty: ; d88c +; Check if to copy wild mon or generate a new one + ; Whose is it? + ld de, wPartyCount + ld a, [wMonType] + and $f + jr z, .getpartylocation ; PARTYMON + ld de, wOTPartyCount + +.getpartylocation + ; Do we have room for it? + ld a, [de] + inc a + cp PARTY_LENGTH + 1 + ret nc + ; Increase the party count + ld [de], a + ld a, [de] ; Why are we doing this? + ld [hMoveMon], a ; HRAM backup + add e + ld e, a + jr nc, .loadspecies + inc d + +.loadspecies + ; Load the species of the Pokemon into the party list. + ; The terminator is usually here, but it'll be back. + ld a, [wCurPartySpecies] + ld [de], a + ; Load the terminator into the next slot. + inc de + ld a, -1 + ld [de], a + ; Now let's load the OT name. + ld hl, wPartyMonOT + ld a, [wMonType] + and $f + jr z, .loadOTname + ld hl, wOTPartyMonOT + +.loadOTname + ld a, [hMoveMon] ; Restore index from backup + dec a + call SkipNames + ld d, h + ld e, l + ld hl, wPlayerName + ld bc, NAME_LENGTH + call CopyBytes + ; Only initialize the nickname for party mon + ld a, [wMonType] + and a + jr nz, .skipnickname + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + ld hl, wPartyMonNicknames + ld a, [hMoveMon] + dec a + call SkipNames + ld d, h + ld e, l + ld hl, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + +.skipnickname + ld hl, wPartyMon1Species + ld a, [wMonType] + and $f + jr z, .initializeStats + ld hl, wOTPartyMon1Species + +.initializeStats + ld a, [hMoveMon] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes +GeneratePartyMonStats: ; d906 +; wBattleMode specifies whether it's a wild mon or not. +; wMonType specifies whether it's an opposing mon or not. +; wCurPartySpecies/wCurPartyLevel specify the species and level. +; hl points to the wPartyMon struct to fill. + + ld e, l + ld d, h + push hl + + ; Initialize the species + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call GetBaseData + ld a, [wBaseDexNo] + ld [de], a + inc de + + ; Copy the item if it's a wild mon + ld a, [wBattleMode] + and a + ld a, $0 + jr z, .skipitem + ld a, [wEnemyMonItem] +.skipitem + ld [de], a + inc de + + ; Copy the moves if it's a wild mon + push de + ld h, d + ld l, e + ld a, [wBattleMode] + and a + jr z, .randomlygeneratemoves + ld a, [wMonType] + and a + jr nz, .randomlygeneratemoves + ld de, wEnemyMonMoves + rept NUM_MOVES + -1 + ld a, [de] + inc de + ld [hli], a + endr + ld a, [de] + ld [hl], a + jr .next + +.randomlygeneratemoves + xor a + rept NUM_MOVES + -1 + ld [hli], a + endr + ld [hl], a + ld [wBuffer1], a + predef FillMoves + +.next + pop de +rept NUM_MOVES + inc de +endr + + ; Initialize ID. + ld a, [wPlayerID] + ld [de], a + inc de + ld a, [wPlayerID + 1] + ld [de], a + inc de + + ; Initialize Exp. + push de + ld a, [wCurPartyLevel] + ld d, a + callfar CalcExpAtLevel + pop de + ld a, [hProduct + 1] + ld [de], a + inc de + ld a, [hProduct + 2] + ld [de], a + inc de + ld a, [hProduct + 3] + ld [de], a + inc de + + ; Initialize stat experience. + xor a + ld b, MON_DVS - MON_STAT_EXP +.loop + ld [de], a + inc de + dec b + jr nz, .loop + + pop hl + push hl + ld a, [wMonType] + and $f + jr z, .registerpokedex + + push hl + farcall GetTrainerDVs + pop hl + jr .initializeDVs + +.registerpokedex + ld a, [wCurPartySpecies] + ld [wd265], a + dec a + push de + call CheckCaughtMon + ld a, [wd265] + dec a + call SetSeenAndCaughtMon + pop de + + pop hl + push hl + ld a, [wBattleMode] + and a + jr nz, .copywildmonDVs + + call Random + ld b, a + call Random + ld c, a +.initializeDVs + ld a, b + ld [de], a + inc de + ld a, c + ld [de], a + inc de + + ; Initialize PP. + push hl + push de + inc hl + inc hl + call FillPP + pop de + pop hl +rept 4 + inc de +endr + + ; Initialize happiness. + ld a, BASE_HAPPINESS + ld [de], a + inc de + + xor a + ; PokerusStatus + ld [de], a + inc de + ; CaughtData/CaughtTime/CaughtLevel + ld [de], a + inc de + ; CaughtGender/CaughtLocation + ld [de], a + inc de + + ; Initialize level. + ld a, [wCurPartyLevel] + ld [de], a + inc de + + xor a + ; Status + ld [de], a + inc de + ; Unused + ld [de], a + inc de + + ; Initialize HP. + ld bc, MON_STAT_EXP - 1 + add hl, bc + ld a, 1 + ld c, a + ld b, FALSE + call CalcMonStatC + ld a, [hProduct + 2] + ld [de], a + inc de + ld a, [hProduct + 3] + ld [de], a + inc de + jr .initstats + +.copywildmonDVs + ld a, [wEnemyMonDVs] + ld [de], a + inc de + ld a, [wEnemyMonDVs + 1] + ld [de], a + inc de + + push hl + ld hl, wEnemyMonPP + ld b, NUM_MOVES +.wildmonpploop + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .wildmonpploop + pop hl + + ; Initialize happiness. + ld a, BASE_HAPPINESS + ld [de], a + inc de + + xor a + ; PokerusStatus + ld [de], a + inc de + ; CaughtData/CaughtTime/CaughtLevel + ld [de], a + inc de + ; CaughtGender/CaughtLocation + ld [de], a + inc de + + ; Initialize level. + ld a, [wCurPartyLevel] + ld [de], a + inc de + + ld hl, wEnemyMonStatus + ; Copy wEnemyMonStatus + ld a, [hli] + ld [de], a + inc de + ; Copy EnemyMonUnused + ld a, [hli] + ld [de], a + inc de + ; Copy wEnemyMonHP + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + inc de + +.initstats + ld a, [wBattleMode] + dec a + jr nz, .generatestats + ld hl, wEnemyMonMaxHP + ld bc, PARTYMON_STRUCT_LENGTH - MON_MAXHP + call CopyBytes + pop hl + jr .registerunowndex + +.generatestats + pop hl + ld bc, MON_STAT_EXP - 1 + add hl, bc + ld b, FALSE + call CalcMonStats + +.registerunowndex + ld a, [wMonType] + and $f + jr nz, .done + ld a, [wCurPartySpecies] + cp UNOWN + jr nz, .done + ld hl, wPartyMon1DVs + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + predef GetUnownLetter + callfar UpdateUnownDex + +.done + scf ; When this function returns, the carry flag indicates success vs failure. + ret +; da6d + +FillPP: ; da6d + push bc + ld b, NUM_MOVES +.loop + ld a, [hli] + and a + jr z, .next + dec a + push hl + push de + push bc + ld hl, Moves + ld bc, MOVE_LENGTH + call AddNTimes + ld de, wStringBuffer1 + ld a, BANK(Moves) + call FarCopyBytes + pop bc + pop de + pop hl + ld a, [wStringBuffer1 + MOVE_PP] + +.next + ld [de], a + inc de + dec b + jr nz, .loop + pop bc + ret +; da96 + +AddTempmonToParty: ; da96 + ld hl, wPartyCount + ld a, [hl] + cp PARTY_LENGTH + scf + ret z + + inc a + ld [hl], a + ld c, a + ld b, 0 + add hl, bc + ld a, [wCurPartySpecies] + ld [hli], a + ld [hl], $ff + + ld hl, wPartyMon1Species + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld e, l + ld d, h + ld hl, wTempMonSpecies + call CopyBytes + + ld hl, wPartyMonOT + ld a, [wPartyCount] + dec a + call SkipNames + ld d, h + ld e, l + ld hl, wOTPartyMonOT + ld a, [wCurPartyMon] + call SkipNames + ld bc, NAME_LENGTH + call CopyBytes + + ld hl, wPartyMonNicknames + ld a, [wPartyCount] + dec a + call SkipNames + ld d, h + ld e, l + ld hl, wOTPartyMonNicknames + ld a, [wCurPartyMon] + call SkipNames + ld bc, MON_NAME_LENGTH + call CopyBytes + + ld a, [wCurPartySpecies] + ld [wNamedObjectIndexBuffer], a + cp EGG + jr z, .egg + dec a + call SetSeenAndCaughtMon + ld hl, wPartyMon1Happiness + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld [hl], BASE_HAPPINESS +.egg + + ld a, [wCurPartySpecies] + cp UNOWN + jr nz, .done + ld hl, wPartyMon1DVs + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + predef GetUnownLetter + callfar UpdateUnownDex + ld a, [wFirstUnownSeen] + and a + jr nz, .done + ld a, [wUnownLetter] + ld [wFirstUnownSeen], a +.done + + and a + ret + +SendGetMonIntoFromBox: ; db3f +; Sents/Gets mon into/from Box depending on Parameter +; wPokemonWithdrawDepositParameter == 0: get mon into Party +; wPokemonWithdrawDepositParameter == 1: sent mon into Box +; wPokemonWithdrawDepositParameter == 2: get mon from DayCare +; wPokemonWithdrawDepositParameter == 3: put mon into DayCare + + ld a, BANK(sBoxCount) + call GetSRAMBank + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .check_IfPartyIsFull + cp DAY_CARE_WITHDRAW + jr z, .check_IfPartyIsFull + cp DAY_CARE_DEPOSIT + ld hl, wBreedMon1Species + jr z, .breedmon + + ; we want to sent a mon into the Box + ; so check if there's enough space + ld hl, sBoxCount + ld a, [hl] + cp MONS_PER_BOX + jr nz, .there_is_room + jp CloseSRAM_And_SetCarryFlag + +.check_IfPartyIsFull + ld hl, wPartyCount + ld a, [hl] + cp PARTY_LENGTH + jp z, CloseSRAM_And_SetCarryFlag + +.there_is_room + inc a + ld [hl], a + ld c, a + ld b, 0 + add hl, bc + ld a, [wPokemonWithdrawDepositParameter] + cp DAY_CARE_WITHDRAW + ld a, [wBreedMon1Species] + jr z, .okay1 + ld a, [wCurPartySpecies] + +.okay1 + ld [hli], a + ld [hl], $ff + ld a, [wPokemonWithdrawDepositParameter] + dec a + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wPartyCount] + jr nz, .okay2 + ld hl, sBoxMon1Species + ld bc, BOXMON_STRUCT_LENGTH + ld a, [sBoxCount] + +.okay2 + dec a ; wPartyCount - 1 + call AddNTimes + +.breedmon + push hl + ld e, l + ld d, h + ld a, [wPokemonWithdrawDepositParameter] + and a + ld hl, sBoxMon1Species + ld bc, BOXMON_STRUCT_LENGTH + jr z, .okay3 + cp DAY_CARE_WITHDRAW + ld hl, wBreedMon1Species + jr z, .okay4 + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + +.okay3 + ld a, [wCurPartyMon] + call AddNTimes + +.okay4 + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + ld a, [wPokemonWithdrawDepositParameter] + cp DAY_CARE_DEPOSIT + ld de, wBreedMon1OT + jr z, .okay5 + dec a + ld hl, wPartyMonOT + ld a, [wPartyCount] + jr nz, .okay6 + ld hl, sBoxMonOT + ld a, [sBoxCount] + +.okay6 + dec a + call SkipNames + ld d, h + ld e, l + +.okay5 + ld hl, sBoxMonOT + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .okay7 + ld hl, wBreedMon1OT + cp DAY_CARE_WITHDRAW + jr z, .okay8 + ld hl, wPartyMonOT + +.okay7 + ld a, [wCurPartyMon] + call SkipNames + +.okay8 + ld bc, NAME_LENGTH + call CopyBytes + ld a, [wPokemonWithdrawDepositParameter] + cp DAY_CARE_DEPOSIT + ld de, wBreedMon1Nick + jr z, .okay9 + dec a + ld hl, wPartyMonNicknames + ld a, [wPartyCount] + jr nz, .okay10 + ld hl, sBoxMonNicknames + ld a, [sBoxCount] + +.okay10 + dec a + call SkipNames + ld d, h + ld e, l + +.okay9 + ld hl, sBoxMonNicknames + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .okay11 + ld hl, wBreedMon1Nick + cp DAY_CARE_WITHDRAW + jr z, .okay12 + ld hl, wPartyMonNicknames + +.okay11 + ld a, [wCurPartyMon] + call SkipNames + +.okay12 + ld bc, MON_NAME_LENGTH + call CopyBytes + pop hl + + ld a, [wPokemonWithdrawDepositParameter] + cp PC_DEPOSIT + jr z, .took_out_of_box + cp DAY_CARE_DEPOSIT + jp z, .CloseSRAM_And_ClearCarryFlag + + push hl + srl a + add $2 + ld [wMonType], a + predef CopyMonToTempMon + callfar CalcLevel + ld a, d + ld [wCurPartyLevel], a + pop hl + + ld b, h + ld c, l + ld hl, MON_LEVEL + add hl, bc + ld [hl], a + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + + push bc + ld b, TRUE + call CalcMonStats + pop bc + + ld a, [wPokemonWithdrawDepositParameter] + and a + jr nz, .CloseSRAM_And_ClearCarryFlag + ld hl, MON_STATUS + add hl, bc + xor a + ld [hl], a + ld hl, MON_HP + add hl, bc + ld d, h + ld e, l + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + inc hl + inc hl + ld a, [hli] + ld [de], a + ld a, [hl] + inc de + ld [de], a + jr .CloseSRAM_And_ClearCarryFlag + +.egg + xor a + ld [de], a + inc de + ld [de], a + jr .CloseSRAM_And_ClearCarryFlag + +.took_out_of_box + ld a, [sBoxCount] + dec a + ld b, a + call RestorePPofDepositedPokemon +.CloseSRAM_And_ClearCarryFlag: + call CloseSRAM + and a + ret +; dcb1 + +CloseSRAM_And_SetCarryFlag: ; dcb1 + call CloseSRAM + scf + ret +; dcb6 + +RestorePPofDepositedPokemon: ; dcb6 + ld a, b + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld b, h + ld c, l + ld hl, MON_PP + add hl, bc + push hl + push bc + ld de, wTempMonPP + ld bc, NUM_MOVES + call CopyBytes + pop bc + ld hl, MON_MOVES + add hl, bc + push hl + ld de, wTempMonMoves + ld bc, NUM_MOVES + call CopyBytes + pop hl + pop de + + ld a, [wMenuCursorY] + push af + ld a, [wMonType] + push af + ld b, 0 +.loop + ld a, [hli] + and a + jr z, .done + ld [wTempMonMoves], a + ld a, BOXMON + ld [wMonType], a + ld a, b + ld [wMenuCursorY], a + push bc + push hl + push de + farcall GetMaxPPOfMove + pop de + pop hl + ld a, [wd265] + ld b, a + ld a, [de] + and %11000000 + add b + ld [de], a + pop bc + inc de + inc b + ld a, b + cp NUM_MOVES + jr c, .loop + +.done + pop af + ld [wMonType], a + pop af + ld [wMenuCursorY], a + ret +; dd21 + +RetrieveMonFromDayCareMan: ; dd21 + ld a, [wBreedMon1Species] + ld [wCurPartySpecies], a + ld de, SFX_TRANSACTION + call PlaySFX + call WaitSFX + call GetBreedMon1LevelGrowth + ld a, b + ld [wd002], a + ld a, e + ld [wCurPartyLevel], a + xor a + ld [wPokemonWithdrawDepositParameter], a + jp RetrieveBreedmon +; dd42 + +RetrieveMonFromDayCareLady: ; dd42 + ld a, [wBreedMon2Species] + ld [wCurPartySpecies], a + ld de, SFX_TRANSACTION + call PlaySFX + call WaitSFX + call GetBreedMon2LevelGrowth + ld a, b + ld [wd002], a + ld a, e + ld [wCurPartyLevel], a + ld a, PC_DEPOSIT + ld [wPokemonWithdrawDepositParameter], a + jp RetrieveBreedmon +; dd64 + +RetrieveBreedmon: ; dd64 + ld hl, wPartyCount + ld a, [hl] + cp PARTY_LENGTH + jr nz, .room_in_party + scf + ret + +.room_in_party + inc a + ld [hl], a + ld c, a + ld b, 0 + add hl, bc + ld a, [wPokemonWithdrawDepositParameter] + and a + ld a, [wBreedMon1Species] + ld de, wBreedMon1Nick + jr z, .okay + ld a, [wBreedMon2Species] + ld de, wBreedMon2Nick + +.okay + ld [hli], a + ld [wCurSpecies], a + ld a, $ff + ld [hl], a + ld hl, wPartyMonNicknames + ld a, [wPartyCount] + dec a + call SkipNames + push hl + ld h, d + ld l, e + pop de + call CopyBytes + push hl + ld hl, wPartyMonOT + ld a, [wPartyCount] + dec a + call SkipNames + ld d, h + ld e, l + pop hl + call CopyBytes + push hl + call GetLastPartyMon + pop hl + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + call GetBaseData + call GetLastPartyMon + ld b, d + ld c, e + ld hl, MON_LEVEL + add hl, bc + ld a, [wCurPartyLevel] + ld [hl], a + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, $a + add hl, bc + push bc + ld b, TRUE + call CalcMonStats + ld hl, wPartyMon1Moves + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld a, $1 + ld [wBuffer1], a + predef FillMoves + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + farcall HealPartyMon + ld a, [wCurPartyLevel] + ld d, a + callfar CalcExpAtLevel + pop bc + ld hl, $8 + add hl, bc + ld a, [hMultiplicand] + ld [hli], a + ld a, [hMultiplicand + 1] + ld [hli], a + ld a, [hMultiplicand + 2] + ld [hl], a + and a + ret +; de1a + +GetLastPartyMon: ; de1a + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ret +; de2a + +DepositMonWithDayCareMan: ; de2a + ld de, wBreedMon1Nick + call DepositBreedmon + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + jp RemoveMonFromPartyOrBox +; de37 + +DepositMonWithDayCareLady: ; de37 + ld de, wBreedMon2Nick + call DepositBreedmon + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + jp RemoveMonFromPartyOrBox +; de44 + +DepositBreedmon: ; de44 + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call SkipNames + call CopyBytes + ld a, [wCurPartyMon] + ld hl, wPartyMonOT + call SkipNames + call CopyBytes + ld a, [wCurPartyMon] + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld bc, BOXMON_STRUCT_LENGTH + jp CopyBytes + +SendMonIntoBox: ; de6e +; Sends the mon into one of Bills Boxes +; the data comes mainly from 'wEnemyMon:' + ld a, BANK(sBoxCount) + call GetSRAMBank + ld de, sBoxCount + ld a, [de] + cp MONS_PER_BOX + jp nc, .full + inc a + ld [de], a + + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + ld c, a +.loop + inc de + ld a, [de] + ld b, a + ld a, c + ld c, b + ld [de], a + inc a + jr nz, .loop + + call GetBaseData + call ShiftBoxMon + + ld hl, wPlayerName + ld de, sBoxMonOT + ld bc, NAME_LENGTH + call CopyBytes + + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + + ld de, sBoxMonNicknames + ld hl, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + + ld hl, wEnemyMon + ld de, sBoxMon1 + ld bc, 1 + 1 + NUM_MOVES ; species + item + moves + call CopyBytes + + ld hl, wPlayerID + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + inc de + push de + ld a, [wCurPartyLevel] + ld d, a + callfar CalcExpAtLevel + pop de + ld a, [hProduct + 1] + ld [de], a + inc de + ld a, [hProduct + 2] + ld [de], a + inc de + ld a, [hProduct + 3] + ld [de], a + inc de + + ; Set all 5 Experience Values to 0 + xor a + ld b, 2 * 5 +.loop2 + ld [de], a + inc de + dec b + jr nz, .loop2 + + ld hl, wEnemyMonDVs + ld b, 2 + NUM_MOVES ; DVs and PP ; wEnemyMonHappiness - wEnemyMonDVs +.loop3 + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .loop3 + + ld a, BASE_HAPPINESS + ld [de], a + inc de + xor a + ld [de], a + inc de + ld [de], a + inc de + ld [de], a + inc de + ld a, [wCurPartyLevel] + ld [de], a + ld a, [wCurPartySpecies] + dec a + call SetSeenAndCaughtMon + ld a, [wCurPartySpecies] + cp UNOWN + jr nz, .not_unown + ld hl, sBoxMon1DVs + predef GetUnownLetter + callfar UpdateUnownDex + +.not_unown + ld hl, sBoxMon1Moves + ld de, wTempMonMoves + ld bc, NUM_MOVES + call CopyBytes + + ld hl, sBoxMon1PP + ld de, wTempMonPP + ld bc, NUM_MOVES + call CopyBytes + + ld b, 0 + call RestorePPofDepositedPokemon + + call CloseSRAM + scf + ret +; df42 + +.full ; df42 + call CloseSRAM + and a + ret +; df47 + +ShiftBoxMon: ; df47 + ld hl, sBoxMonOT + ld bc, NAME_LENGTH + call .shift + + ld hl, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + call .shift + + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + +.shift + ld a, [sBoxCount] + cp 2 + ret c + + push hl + call AddNTimes + dec hl + ld e, l + ld d, h + pop hl + + ld a, [sBoxCount] + dec a + call AddNTimes + dec hl + + push hl + ld a, [sBoxCount] + dec a + ld hl, 0 + call AddNTimes + ld c, l + ld b, h + pop hl +.loop + ld a, [hld] + ld [de], a + dec de + dec bc + ld a, c + or b + jr nz, .loop + ret +; df8c + +GiveEgg:: ; df8c + ld a, [wCurPartySpecies] + push af + callfar GetPreEvolution + callfar GetPreEvolution + ld a, [wCurPartySpecies] + dec a + +; TryAddMonToParty sets Seen and Caught flags +; when it is successful. This routine will make +; sure that we aren't newly setting flags. + push af + call CheckCaughtMon + pop af + push bc + call CheckSeenMon + push bc + + call TryAddMonToParty + +; If we haven't caught this Pokemon before receiving +; the Egg, reset the flag that was just set by +; TryAddMonToParty. + pop bc + ld a, c + and a + jr nz, .skip_caught_flag + ld a, [wCurPartySpecies] + dec a + ld c, a + ld d, $0 + ld hl, wPokedexCaught + ld b, RESET_FLAG + predef SmallFarFlagAction + +.skip_caught_flag +; If we haven't seen this Pokemon before receiving +; the Egg, reset the flag that was just set by +; TryAddMonToParty. + pop bc + ld a, c + and a + jr nz, .skip_seen_flag + ld a, [wCurPartySpecies] + dec a + ld c, a + ld d, $0 + ld hl, wPokedexSeen + ld b, RESET_FLAG + predef SmallFarFlagAction + +.skip_seen_flag + pop af + ld [wCurPartySpecies], a + ld a, [wPartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Species + call AddNTimes + ld a, [wCurPartySpecies] + ld [hl], a + ld hl, wPartyCount + ld a, [hl] + ld b, 0 + ld c, a + add hl, bc + ld a, EGG + ld [hl], a + ld a, [wPartyCount] + dec a + ld hl, wPartyMonNicknames + call SkipNames + ld de, String_Egg + call CopyName2 + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [wMonStatusFlags] + bit 1, a + ld a, 1 + jr nz, .got_init_happiness + ld a, [wBaseEggSteps] + +.got_init_happiness + ld [hl], a + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1HP + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + xor a + ld [hli], a + ld [hl], a + and a + ret +; e035 + +String_Egg: ; e035 + db "EGG@" +; e039 + +RemoveMonFromPartyOrBox: ; e039 + ld hl, wPartyCount + + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .okay + + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + +.okay + ld a, [hl] + dec a + ld [hli], a + ld a, [wCurPartyMon] + ld c, a + ld b, 0 + add hl, bc + ld e, l + ld d, h + inc de +.loop + ld a, [de] + inc de + ld [hli], a + inc a + jr nz, .loop + ld hl, wPartyMonOT + ld d, PARTY_LENGTH - 1 + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party + ld hl, sBoxMonOT + ld d, MONS_PER_BOX - 1 + +.party + ; If this is the last mon in our party (box), + ; shift all the other mons up to close the gap. + ld a, [wCurPartyMon] + call SkipNames + ld a, [wCurPartyMon] + cp d + jr nz, .delete_inside + ld [hl], -1 + jp .finish + +.delete_inside + ; Shift the OT names + ld d, h + ld e, l + ld bc, MON_NAME_LENGTH + add hl, bc + ld bc, wPartyMonNicknames + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party2 + ld bc, sBoxMonNicknames +.party2 + call CopyDataUntil + ; Shift the struct + ld hl, wPartyMons + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party4 + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH +.party4 + ld a, [wCurPartyMon] + call AddNTimes + ld d, h + ld e, l + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party5 + ld bc, BOXMON_STRUCT_LENGTH + add hl, bc + ld bc, sBoxMonOT + jr .copy + +.party5 + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + ld bc, wPartyMonOT +.copy + call CopyDataUntil + ; Shift the nicknames + ld hl, wPartyMonNicknames + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party6 + ld hl, sBoxMonNicknames +.party6 + ld bc, MON_NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld d, h + ld e, l + ld bc, MON_NAME_LENGTH + add hl, bc + ld bc, wPartyMonNicknamesEnd + ld a, [wPokemonWithdrawDepositParameter] + and a + jr z, .party7 + ld bc, sBoxMonNicknamesEnd +.party7 + call CopyDataUntil + ; Mail time! +.finish + ld a, [wPokemonWithdrawDepositParameter] + and a + jp nz, CloseSRAM + ld a, [wLinkMode] + and a + ret nz + ; Shift mail + ld a, BANK(sPartyMail) + call GetSRAMBank + ; If this is the last mon in our party, no need to shift mail. + ld hl, wPartyCount + ld a, [wCurPartyMon] + cp [hl] + jr z, .close_sram + ; Shift our mail messages up. + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + push hl + add hl, bc + pop de + ld a, [wCurPartyMon] + ld b, a +.loop2 + push bc + push hl + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop hl + push hl + ld bc, MAIL_STRUCT_LENGTH + add hl, bc + pop de + pop bc + inc b + ld a, [wPartyCount] + cp b + jr nz, .loop2 +.close_sram + jp CloseSRAM +; e134 + + +ComputeNPCTrademonStats: ; e134 + ld a, MON_LEVEL + call GetPartyParamLocation + ld a, [hl] + ld [MON_LEVEL], a ; wow + ld a, MON_SPECIES + call GetPartyParamLocation + ld a, [hl] + ld [wCurSpecies], a + call GetBaseData + ld a, MON_MAXHP + call GetPartyParamLocation + ld d, h + ld e, l + push de + ld a, MON_STAT_EXP - 1 + call GetPartyParamLocation + ld b, TRUE + call CalcMonStats + pop de + ld a, MON_HP + call GetPartyParamLocation + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + ret +; e167 + +CalcMonStats: ; e167 +; Calculates all 6 Stats of a mon +; b: Take into account stat EXP if TRUE +; 'c' counts from 1-6 and points with 'wBaseStats' to the base value +; hl is the path to the Stat EXP +; de points to where the final stats will be saved + + ld c, $0 +.loop + inc c + call CalcMonStatC + ld a, [hMultiplicand + 1] + ld [de], a + inc de + ld a, [hMultiplicand + 2] + ld [de], a + inc de + ld a, c + cp STAT_SDEF + jr nz, .loop + ret +; e17b + +CalcMonStatC: ; e17b +; 'c' is 1-6 and points to the BaseStat +; 1: HP +; 2: Attack +; 3: Defense +; 4: Speed +; 5: SpAtk +; 6: SpDef + push hl + push de + push bc + ld a, b + ld d, a + push hl + ld hl, wBaseStats + dec hl ; has to be decreased, because 'c' begins with 1 + ld b, $0 + add hl, bc + ld a, [hl] + ld e, a + pop hl + push hl + ld a, c + cp STAT_SDEF + jr nz, .not_spdef + dec hl + dec hl + +.not_spdef + sla c + ld a, d + and a + jr z, .no_stat_exp + add hl, bc + push de + ld a, [hld] + ld e, a + ld d, [hl] + farcall GetSquareRoot + pop de + +.no_stat_exp + srl c + pop hl + push bc + ld bc, MON_DVS - MON_HP_EXP + 1 + add hl, bc + pop bc + ld a, c + cp STAT_ATK + jr z, .Attack + cp STAT_DEF + jr z, .Defense + cp STAT_SPD + jr z, .Speed + cp STAT_SATK + jr z, .Special + cp STAT_SDEF + jr z, .Special +; DV_HP = (DV_ATK & 1) << 3 + (DV_DEF & 1) << 2 + (DV_SPD & 1) << 1 + (DV_SPC & 1) + push bc + ld a, [hl] + swap a + and $1 + add a + add a + add a + ld b, a + ld a, [hli] + and $1 + add a + add a + add b + ld b, a + ld a, [hl] + swap a + and $1 + add a + add b + ld b, a + ld a, [hl] + and $1 + add b + pop bc + jr .GotDV + +.Attack: + ld a, [hl] + swap a + and $f + jr .GotDV + +.Defense: + ld a, [hl] + and $f + jr .GotDV + +.Speed: + inc hl + ld a, [hl] + swap a + and $f + jr .GotDV + +.Special: + inc hl + ld a, [hl] + and $f + +.GotDV: + ld d, 0 + add e + ld e, a + jr nc, .no_overflow_1 + inc d + +.no_overflow_1 + sla e + rl d + srl b + srl b + ld a, b + add e + jr nc, .no_overflow_2 + inc d + +.no_overflow_2 + ld [hMultiplicand + 2], a + ld a, d + ld [hMultiplicand + 1], a + xor a + ld [hMultiplicand + 0], a + ld a, [wCurPartyLevel] + ld [hMultiplier], a + call Multiply + ld a, [hProduct + 1] + ld [hDividend + 0], a + ld a, [hProduct + 2] + ld [hDividend + 1], a + ld a, [hProduct + 3] + ld [hDividend + 2], a + ld a, 100 + ld [hDivisor], a + ld a, 3 + ld b, a + call Divide + ld a, c + cp STAT_HP + ld a, STAT_MIN_NORMAL + jr nz, .not_hp + ld a, [wCurPartyLevel] + ld b, a + ld a, [hQuotient + 2] + add b + ld [hMultiplicand + 2], a + jr nc, .no_overflow_3 + ld a, [hQuotient + 1] + inc a + ld [hMultiplicand + 1], a + +.no_overflow_3 + ld a, STAT_MIN_HP + +.not_hp + ld b, a + ld a, [hQuotient + 2] + add b + ld [hMultiplicand + 2], a + jr nc, .no_overflow_4 + ld a, [hQuotient + 1] + inc a + ld [hMultiplicand + 1], a + +.no_overflow_4 + ld a, [hQuotient + 1] + cp HIGH(MAX_STAT_VALUE + 1) + 1 + jr nc, .max_stat + cp HIGH(MAX_STAT_VALUE + 1) + jr c, .stat_value_okay + ld a, [hQuotient + 2] + cp LOW(MAX_STAT_VALUE + 1) + jr c, .stat_value_okay + +.max_stat + ld a, HIGH(MAX_STAT_VALUE) + ld [hMultiplicand + 1], a + ld a, LOW(MAX_STAT_VALUE) + ld [hMultiplicand + 2], a + +.stat_value_okay + pop bc + pop de + pop hl + ret +; e277 + +GivePoke:: ; e277 + push de + push bc + xor a ; PARTYMON + ld [wMonType], a + call TryAddMonToParty + jr nc, .failed + ld hl, wPartyMonNicknames + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + call SkipNames + ld d, h + ld e, l + pop bc + ld a, b + ld b, 0 + push bc + push de + push af + ld a, [wCurItem] + and a + jr z, .done + ld a, [wCurPartyMon] + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [wCurItem] + ld [hl], a + jr .done + +.failed + ld a, [wCurPartySpecies] + ld [wTempEnemyMonSpecies], a + callfar LoadEnemyMon + call SendMonIntoBox + jp nc, .FailedToGiveMon + ld a, BOXMON + ld [wMonType], a + xor a + ld [wCurPartyMon], a + ld de, wMonOrItemNameBuffer + pop bc + ld a, b + ld b, 1 + push bc + push de + push af + ld a, [wCurItem] + and a + jr z, .done + ld a, [wCurItem] + ld [sBoxMon1Item], a + +.done + ld a, [wCurPartySpecies] + ld [wd265], a + ld [wTempEnemyMonSpecies], a + call GetPokemonName + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + pop af + and a + jp z, .wildmon + pop de + pop bc + pop hl + push bc + push hl + ld a, [wScriptBank] + call GetFarHalfword + ld bc, MON_NAME_LENGTH + ld a, [wScriptBank] + call FarCopyBytes + pop hl + inc hl + inc hl + ld a, [wScriptBank] + call GetFarHalfword + pop bc + ld a, b + and a + push de + push bc + jr nz, .send_to_box + + push hl + ld a, [wCurPartyMon] + ld hl, wPartyMonOT + call SkipNames + ld d, h + ld e, l + pop hl +.otnameloop + ld a, [wScriptBank] + call GetFarByte + ld [de], a + inc hl + inc de + cp "@" + jr nz, .otnameloop + ld a, [wScriptBank] + call GetFarByte + ld b, a + push bc + ld a, [wCurPartyMon] + ld hl, wPartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, HIGH(01001) + ld [hli], a + ld [hl], LOW(01001) + pop bc + farcall SetGiftPartyMonCaughtData + jr .skip_nickname + +.send_to_box + ld a, BANK(sBoxMonOT) + call GetSRAMBank + ld de, sBoxMonOT +.loop + ld a, [wScriptBank] + call GetFarByte + ld [de], a + inc hl + inc de + cp "@" + jr nz, .loop + ld a, [wScriptBank] + call GetFarByte + ld b, a + ld hl, sBoxMon1ID + call Random + ld [hli], a + call Random + ld [hl], a + call CloseSRAM + farcall SetGiftBoxMonCaughtData + jr .skip_nickname + +.wildmon + pop de + pop bc + push bc + push de + ld a, b + and a + jr z, .party + farcall SetBoxMonCaughtData + jr .set_caught_data + +.party + farcall SetCaughtData +.set_caught_data + farcall GiveANickname_YesNo + pop de + jr c, .skip_nickname + call InitNickname + +.skip_nickname + pop bc + pop de + ld a, b + and a + ret z + ld hl, TextJump_WasSentToBillsPC + call PrintText + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + ld hl, wMonOrItemNameBuffer + ld de, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + ld b, $1 + ret +; e3d4 + +.FailedToGiveMon: ; e3d4 + pop bc + pop de + ld b, $2 + ret +; e3d9 + +TextJump_WasSentToBillsPC: ; 0xe3d9 + ; was sent to BILL's PC. + text_jump Text_WasSentToBillsPC + db "@" +; 0xe3de + +InitNickname: ; e3de + push de + call LoadStandardMenuHeader + call DisableSpriteUpdates + pop de + push de + ld b, $0 + farcall NamingScreen + pop hl + ld de, wStringBuffer1 + call InitName + ld a, $4 ; ExitAllMenus is in bank 0, XXX could this be in bank 4 in pokered? + ld hl, ExitAllMenus + rst FarCall + ret +; e3fd diff --git a/engine/pokemon/move_mon_wo_mail.asm b/engine/pokemon/move_mon_wo_mail.asm new file mode 100755 index 000000000..5d81da8a0 --- /dev/null +++ b/engine/pokemon/move_mon_wo_mail.asm @@ -0,0 +1,133 @@ +InsertPokemonIntoBox: ; 51322 + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + call InsertSpeciesIntoBoxOrParty + ld a, [sBoxCount] + dec a + ld [wd265], a + ld hl, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + ld de, wBufferMonNick + call InsertDataIntoBoxOrParty + ld a, [sBoxCount] + dec a + ld [wd265], a + ld hl, sBoxMonOT + ld bc, NAME_LENGTH + ld de, wBufferMonOT + call InsertDataIntoBoxOrParty + ld a, [sBoxCount] + dec a + ld [wd265], a + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + ld de, wBufferMon + call InsertDataIntoBoxOrParty + ld hl, wBufferMonMoves + ld de, wTempMonMoves + ld bc, NUM_MOVES + call CopyBytes + ld hl, wBufferMonPP + ld de, wTempMonPP + ld bc, NUM_MOVES + call CopyBytes + ld a, [wCurPartyMon] + ld b, a + farcall RestorePPofDepositedPokemon + jp CloseSRAM + +InsertPokemonIntoParty: ; 5138b + ld hl, wPartyCount + call InsertSpeciesIntoBoxOrParty + ld a, [wPartyCount] + dec a + ld [wd265], a + ld hl, wPartyMonNicknames + ld bc, MON_NAME_LENGTH + ld de, wBufferMonNick + call InsertDataIntoBoxOrParty + ld a, [wPartyCount] + dec a + ld [wd265], a + ld hl, wPartyMonOT + ld bc, NAME_LENGTH + ld de, wBufferMonOT + call InsertDataIntoBoxOrParty + ld a, [wPartyCount] + dec a + ld [wd265], a + ld hl, wPartyMons + ld bc, PARTYMON_STRUCT_LENGTH + ld de, wBufferMon + call InsertDataIntoBoxOrParty + ret + +InsertSpeciesIntoBoxOrParty: ; 513cb + inc [hl] + inc hl + ld a, [wCurPartyMon] + ld c, a + ld b, 0 + add hl, bc + ld a, [wCurPartySpecies] + ld c, a +.loop + ld a, [hl] + ld [hl], c + inc hl + inc c + ld c, a + jr nz, .loop + ret + +InsertDataIntoBoxOrParty: ; 513e0 + push de + push hl + push bc + ld a, [wd265] + dec a + call AddNTimes + push hl + add hl, bc + ld d, h + ld e, l + pop hl +.loop + push bc + ld a, [wd265] + ld b, a + ld a, [wCurPartyMon] + cp b + pop bc + jr z, .insert + push hl + push de + push bc + call CopyBytes + pop bc + pop de + pop hl + push hl + ld a, l + sub c + ld l, a + ld a, h + sbc b + ld h, a + pop de + ld a, [wd265] + dec a + ld [wd265], a + jr .loop + +.insert + pop bc + pop hl + ld a, [wCurPartyMon] + call AddNTimes + ld d, h + ld e, l + pop hl + call CopyBytes + ret diff --git a/engine/pokemon/party_menu.asm b/engine/pokemon/party_menu.asm new file mode 100644 index 000000000..fc1783c71 --- /dev/null +++ b/engine/pokemon/party_menu.asm @@ -0,0 +1,932 @@ +SelectMonFromParty: ; 50000 + call DisableSpriteUpdates + xor a + ld [wPartyMenuActionText], a + call ClearBGPalettes + call InitPartyMenuLayout + call WaitBGMap + call SetPalettes + call DelayFrame + call PartyMenuSelect + call ReturnToMapWithSpeechTextbox + ret +; 5001d + + +SelectTradeOrDayCareMon: ; 5001d + ld a, b + ld [wPartyMenuActionText], a + call DisableSpriteUpdates + call ClearBGPalettes + call InitPartyMenuLayout + call WaitBGMap + ld b, SCGB_PARTY_MENU + call GetSGBLayout + call SetPalettes + call DelayFrame + call PartyMenuSelect + call ReturnToMapWithSpeechTextbox + ret +; 5003f + +InitPartyMenuLayout: ; 5003f + call LoadPartyMenuGFX + call InitPartyMenuWithCancel + call InitPartyMenuGFX + call WritePartyMenuTilemap + call PrintPartyMenuText + ret +; 5004f + +LoadPartyMenuGFX: ; 5004f + call LoadFontsBattleExtra + callfar InitPartyMenuPalettes ; engine/color.asm + callfar ClearSpriteAnims2 + ret +; 5005f + + +WritePartyMenuTilemap: ; 0x5005f + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill ; blank the tilemap + call GetPartyMenuQualityIndexes +.loop + ld a, [hli] + cp -1 + jr z, .end + push hl + ld hl, .Jumptable + rst JumpTable + pop hl + jr .loop +.end + pop af + ld [wOptions], a + ret +; 0x50089 + +.Jumptable: ; 50089 +; entries correspond to PARTYMENUQUALITY_* constants + dw PlacePartyNicknames + dw PlacePartyHPBar + dw PlacePartyMenuHPDigits + dw PlacePartyMonLevel + dw PlacePartyMonStatus + dw PlacePartyMonTMHMCompatibility + dw PlacePartyMonEvoStoneCompatibility + dw PlacePartyMonGender + dw PlacePartyMonMobileBattleSelection +; 5009b + +PlacePartyNicknames: ; 5009b + hlcoord 3, 1 + ld a, [wPartyCount] + and a + jr z, .end + ld c, a + ld b, $0 +.loop + push bc + push hl + push hl + ld hl, wPartyMonNicknames + ld a, b + call GetNick + pop hl + call PlaceString + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + +.end + dec hl + dec hl + ld de, .CANCEL + call PlaceString + ret +; 500c8 + +.CANCEL: ; 500c8 + db "CANCEL@" +; 500cf + + +PlacePartyHPBar: ; 500cf + xor a + ld [wSGBPals], a + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, $0 + hlcoord 11, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .skip + push hl + call PlacePartymonHPBar + pop hl + ld d, $6 + ld b, $0 + call DrawBattleHPBar + ld hl, wHPPals + ld a, [wSGBPals] + ld c, a + ld b, $0 + add hl, bc + call SetHPPal + ld b, SCGB_PARTY_MENU_HP_PALS + call GetSGBLayout +.skip + ld hl, wSGBPals + inc [hl] + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ld b, SCGB_PARTY_MENU + call GetSGBLayout + ret +; 50117 + +PlacePartymonHPBar: ; 50117 + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1HP + call AddNTimes + ld a, [hli] + or [hl] + jr nz, .not_fainted + xor a + ld e, a + ld c, a + ret + +.not_fainted + dec hl + ld a, [hli] + ld b, a + ld a, [hli] + ld c, a + ld a, [hli] + ld d, a + ld a, [hli] + ld e, a + predef ComputeHPBarPixels + ret +; 50138 + +PlacePartyMenuHPDigits: ; 50138 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, $0 + hlcoord 13, 1 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1HP + call AddNTimes + ld e, l + ld d, h + pop hl + push de + lb bc, 2, 3 + call PrintNum + pop de + ld a, "/" + ld [hli], a + inc de + inc de + lb bc, 2, 3 + call PrintNum + +.next + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 50176 + +PlacePartyMonLevel: ; 50176 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 8, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Level + call AddNTimes + ld e, l + ld d, h + pop hl + ld a, [de] + cp 100 ; This is distinct from MAX_LEVEL. + jr nc, .ThreeDigits + ld a, "" + ld [hli], a + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + ; jr .okay +.ThreeDigits: + lb bc, PRINTNUM_RIGHTALIGN | 1, 3 +; .okay + call PrintNum + +.next + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 501b2 + +PlacePartyMonStatus: ; 501b2 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 5, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Status + call AddNTimes + ld e, l + ld d, h + pop hl + call PlaceStatusString + +.next + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 501e0 + +PlacePartyMonTMHMCompatibility: ; 501e0 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 12, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld hl, wPartySpecies + ld e, b + ld d, 0 + add hl, de + ld a, [hl] + ld [wCurPartySpecies], a + predef CanLearnTMHMMove + pop hl + call .PlaceAbleNotAble + call PlaceString + +.next + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 50215 + +.PlaceAbleNotAble: ; 50215 + ld a, c + and a + jr nz, .able + ld de, .string_not_able + ret + +.able + ld de, .string_able + ret +; 50221 + +.string_able ; 50221 + db "ABLE@" +; 50226 + +.string_not_able ; 50226 + db "NOT ABLE@" +; 5022f + + +PlacePartyMonEvoStoneCompatibility: ; 5022f + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 12, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + push hl + ld a, b + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wPartyMon1Species + call AddNTimes + ld a, [hl] + dec a + ld e, a + ld d, 0 + ld hl, EvosAttacksPointers + add hl, de + add hl, de + call .DetermineCompatibility + pop hl + call PlaceString + +.next + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 50268 + +.DetermineCompatibility: ; 50268 + ld de, wStringBuffer1 + ld a, BANK(EvosAttacksPointers) + ld bc, 2 + call FarCopyBytes + ld hl, wStringBuffer1 + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wStringBuffer1 + ld a, BANK(EvosAttacks) + ld bc, 10 + call FarCopyBytes + ld hl, wStringBuffer1 +.loop2 + ld a, [hli] + and a + jr z, .nope + inc hl + inc hl + cp EVOLVE_ITEM + jr nz, .loop2 + dec hl + dec hl + ld a, [wCurItem] + cp [hl] + inc hl + inc hl + jr nz, .loop2 + ld de, .string_able + ret + +.nope + ld de, .string_not_able + ret +; 502a3 + +.string_able ; 502a3 + db "ABLE@" +; 502a8 +.string_not_able ; 502a8 + db "NOT ABLE@" +; 502b1 + + +PlacePartyMonGender: ; 502b1 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 12, 2 +.loop + push bc + push hl + call PartyMenuCheckEgg + jr z, .next + ld [wCurPartySpecies], a + push hl + ld a, b + ld [wCurPartyMon], a + xor a + ld [wMonType], a + call GetGender + ld de, .unknown + jr c, .got_gender + ld de, .male + jr nz, .got_gender + ld de, .female + +.got_gender + pop hl + call PlaceString + +.next + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ret +; 502ee + +.male ; 502ee + db "♂…MALE@" +; 502f5 + +.female ; 502f5 + db "♀…FEMALE@" +; 502fe + +.unknown ; 502fe + db "…UNKNOWN@" +; 50307 + + +PlacePartyMonMobileBattleSelection: ; 50307 + ld a, [wPartyCount] + and a + ret z + ld c, a + ld b, 0 + hlcoord 12, 1 +.loop + push bc + push hl + ld de, .String_Sanka_Shinai + call PlaceString + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop bc + inc b + dec c + jr nz, .loop + ld a, l + ld e, MON_NAME_LENGTH + sub e + ld l, a + ld a, h + sbc $0 + ld h, a + ld de, .String_Kettei_Yameru + call PlaceString + ld b, $3 + ld c, $0 + ld hl, wd002 + ld a, [hl] +.loop2 + push hl + push bc + hlcoord 12, 1 +.loop3 + and a + jr z, .done + ld de, 2 * SCREEN_WIDTH + add hl, de + dec a + jr .loop3 + +.done + ld de, .String_Banme + push hl + call PlaceString + pop hl + pop bc + push bc + push hl + ld a, c + ld hl, .Strings_1_2_3 + call GetNthString + ld d, h + ld e, l + pop hl + call PlaceString + pop bc + pop hl + inc hl + ld a, [hl] + inc c + dec b + ret z + jr .loop2 +; 5036b + +.String_Banme: ; 5036b + db " ばんめ  @" ; Place +; 50372 +.String_Sanka_Shinai: ; 50372 + db "さんかしない@" ; Cancel +; 50379 +.String_Kettei_Yameru: ; 50379 + db "けってい  やめる@" ; Quit +; 50383 +.Strings_1_2_3: ; 50383 + db "1@", "2@", "3@" ; 1st, 2nd, 3rd +; 50389 + + +PartyMenuCheckEgg: ; 50389 + ld a, LOW(wPartySpecies) + add b + ld e, a + ld a, HIGH(wPartySpecies) + adc 0 + ld d, a + ld a, [de] + cp EGG + ret +; 50396 + +GetPartyMenuQualityIndexes: ; 50396 + ld a, [wPartyMenuActionText] + and $f0 + jr nz, .skip + ld a, [wPartyMenuActionText] + and $f + ld e, a + ld d, 0 + ld hl, PartyMenuQualityPointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +.skip + ld hl, PartyMenuQualityPointers.Default + ret +; 503b2 + +INCLUDE "data/party_menu_qualities.asm" + + +InitPartyMenuGFX: ; 503e0 + ld hl, wPartyCount + ld a, [hli] + and a + ret z + ld c, a + xor a + ld [hObjectStructIndexBuffer], a +.loop + push bc + push hl + ld hl, LoadMenuMonIcon + ld a, BANK(LoadMenuMonIcon) + ld e, $0 + rst FarCall + ld a, [hObjectStructIndexBuffer] + inc a + ld [hObjectStructIndexBuffer], a + pop hl + pop bc + dec c + jr nz, .loop + callfar PlaySpriteAnimations + ret +; 50405 + +InitPartyMenuWithCancel: ; 50405 +; with cancel + xor a + ld [wSwitchMon], a + ld de, PartyMenuAttributes + call SetMenuAttributes + ld a, [wPartyCount] + inc a + ld [w2DMenuNumRows], a ; list length + dec a + ld b, a + ld a, [wPartyMenuCursor] + and a + jr z, .skip + inc b + cp b + jr c, .done + +.skip + ld a, 1 + +.done + ld [wMenuCursorY], a + ld a, A_BUTTON | B_BUTTON + ld [wMenuJoypadFilter], a + ret +; 5042d + +InitPartyMenuNoCancel: ; 0x5042d +; no cancel + ld de, PartyMenuAttributes + call SetMenuAttributes + ld a, [wPartyCount] + ld [w2DMenuNumRows], a ; list length + ld b, a + ld a, [wPartyMenuCursor] + and a + jr z, .skip + inc b + cp b + jr c, .done +.skip + ld a, 1 +.done + ld [wMenuCursorY], a + ld a, A_BUTTON | B_BUTTON + ld [wMenuJoypadFilter], a + ret +; 5044f (14:444f) + +PartyMenuAttributes: ; 5044f +; cursor y +; cursor x +; num rows +; num cols +; bit 6: animate sprites bit 5: wrap around +; ? +; distance between items (hi: y, lo: x) +; allowed buttons (mask) + db 1, 0 + db 0, 1 + db $60, $00 + dn 2, 0 + db 0 +; 50457 + +PartyMenuSelect: ; 0x50457 +; sets carry if exitted menu. + call StaticMenuJoypad + call PlaceHollowCursor + ld a, [wPartyCount] + inc a + ld b, a + ld a, [wMenuCursorY] ; menu selection? + cp b + jr z, .exitmenu ; CANCEL + ld [wPartyMenuCursor], a + ld a, [hJoyLast] + ld b, a + bit B_BUTTON_F, b + jr nz, .exitmenu ; B button + ld a, [wMenuCursorY] + dec a + ld [wCurPartyMon], a + ld c, a + ld b, $0 + ld hl, wPartySpecies + add hl, bc + ld a, [hl] + ld [wCurPartySpecies], a + + ld de, SFX_READ_TEXT_2 + call PlaySFX + call WaitSFX + and a + ret + +.exitmenu + ld de, SFX_READ_TEXT_2 + call PlaySFX + call WaitSFX + scf + ret +; 0x5049a + + +PrintPartyMenuText: ; 5049a + hlcoord 0, 14 + lb bc, 2, 18 + call TextBox + ld a, [wPartyCount] + and a + jr nz, .haspokemon + ld de, YouHaveNoPKMNString + jr .gotstring +.haspokemon ; 504ae + ld a, [wPartyMenuActionText] + and $f ; drop high nibble + ld hl, PartyMenuStrings + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a +.gotstring ; 504be + ld a, [wOptions] + push af + set 4, a ; disable text delay + ld [wOptions], a + hlcoord 1, 16 ; Coord + call PlaceString + pop af + ld [wOptions], a + ret +; 0x504d2 + +PartyMenuStrings: ; 0x504d2 + dw ChooseAMonString + dw UseOnWhichPKMNString + dw WhichPKMNString + dw TeachWhichPKMNString + dw MoveToWhereString + dw UseOnWhichPKMNString + dw ChooseAMonString ; Probably used to be ChooseAFemalePKMNString + dw ChooseAMonString ; Probably used to be ChooseAMalePKMNString + dw ToWhichPKMNString + +ChooseAMonString: ; 0x504e4 + db "Choose a #MON.@" + +UseOnWhichPKMNString: ; 0x504f3 + db "Use on which ?@" + +WhichPKMNString: ; 0x50504 + db "Which ?@" + +TeachWhichPKMNString: ; 0x5050e + db "Teach which ?@" + +MoveToWhereString: ; 0x5051e + db "Move to where?@" + +ChooseAFemalePKMNString: ; 0x5052d +; unused + db "Choose a ♀.@" + +ChooseAMalePKMNString: ; 0x5053b +; unused + db "Choose a ♂.@" + +ToWhichPKMNString: ; 0x50549 + db "To which ?@" + +YouHaveNoPKMNString: ; 0x50556 + db "You have no !@" + +PrintPartyMenuActionText: ; 50566 + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + ld a, [wPartyMenuActionText] + and $f + ld hl, .MenuActionTexts + call .PrintText + ret +; 5057b + +.MenuActionTexts: ; 5057b +; entries correspond to PARTYMENUTEXT_* constants + dw .Text_CuredOfPoison + dw .Text_BurnWasHealed + dw .Text_Defrosted + dw .Text_WokeUp + dw .Text_RidOfParalysis + dw .Text_RecoveredSomeHP + dw .Text_HealthReturned + dw .Text_Revitalized + dw .Text_GrewToLevel + dw .Text_CameToItsSenses +; 5058f + +.Text_RecoveredSomeHP: ; 0x5058f + ; recovered @ HP! + text_jump UnknownText_0x1bc0a2 + db "@" +; 0x50594 + +.Text_CuredOfPoison: ; 0x50594 + ; 's cured of poison. + text_jump UnknownText_0x1bc0bb + db "@" +; 0x50599 + +.Text_RidOfParalysis: ; 0x50599 + ; 's rid of paralysis. + text_jump UnknownText_0x1bc0d2 + db "@" +; 0x5059e + +.Text_BurnWasHealed: ; 0x5059e + ; 's burn was healed. + text_jump UnknownText_0x1bc0ea + db "@" +; 0x505a3 + +.Text_Defrosted: ; 0x505a3 + ; was defrosted. + text_jump UnknownText_0x1bc101 + db "@" +; 0x505a8 + +.Text_WokeUp: ; 0x505a8 + ; woke up. + text_jump UnknownText_0x1bc115 + db "@" +; 0x505ad + +.Text_HealthReturned: ; 0x505ad + ; 's health returned. + text_jump UnknownText_0x1bc123 + db "@" +; 0x505b2 + +.Text_Revitalized: ; 0x505b2 + ; is revitalized. + text_jump UnknownText_0x1bc13a + db "@" +; 0x505b7 + +.Text_GrewToLevel: ; 0x505b7 + ; grew to level @ !@ @ + text_jump UnknownText_0x1bc14f + db "@" +; 0x505bc + +.Text_CameToItsSenses: ; 0x505bc + ; came to its senses. + text_jump UnknownText_0x1bc16e + db "@" +; 0x505c1 + + +.PrintText: ; 505c1 + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wOptions] + push af + set NO_TEXT_SCROLL, a + ld [wOptions], a + call PrintText + pop af + ld [wOptions], a + ret +; 505da diff --git a/engine/pokemon/search.asm b/engine/pokemon/search.asm new file mode 100755 index 000000000..57b489a37 --- /dev/null +++ b/engine/pokemon/search.asm @@ -0,0 +1,276 @@ +BeastsCheck: ; 0x4a6e8 +; Check if the player owns all three legendary beasts. +; They must exist in either party or PC, and have the player's OT and ID. +; Return the result in wScriptVar. + + ld a, RAIKOU + ld [wScriptVar], a + call CheckOwnMonAnywhere + jr nc, .notexist + + ld a, ENTEI + ld [wScriptVar], a + call CheckOwnMonAnywhere + jr nc, .notexist + + ld a, SUICUNE + ld [wScriptVar], a + call CheckOwnMonAnywhere + jr nc, .notexist + + ; they exist + ld a, 1 + ld [wScriptVar], a + ret + +.notexist + xor a + ld [wScriptVar], a + ret + + +MonCheck: ; 0x4a711 +; Check if the player owns any Pokémon of the species in wScriptVar. +; Return the result in wScriptVar. + + call CheckOwnMonAnywhere + jr c, .exists + + ; doesn't exist + xor a + ld [wScriptVar], a + ret + +.exists + ld a, 1 + ld [wScriptVar], a + ret + + +CheckOwnMonAnywhere: ; 0x4a721 +; Check if the player owns any monsters of the species in wScriptVar. +; It must exist in either party or PC, and have the player's OT and ID. + + ; If there are no monsters in the party, + ; the player must not own any yet. + ld a, [wPartyCount] + and a + ret z + + ld d, a + ld e, 0 + ld hl, wPartyMon1Species + ld bc, wPartyMonOT + + ; Run CheckOwnMon on each Pokémon in the party. +.partymon + call CheckOwnMon + ret c ; found! + + push bc + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop bc + call UpdateOTPointer + dec d + jr nz, .partymon + + ; Run CheckOwnMon on each Pokémon in the PC. + ld a, BANK(sBoxCount) + call GetSRAMBank + ld a, [sBoxCount] + and a + jr z, .boxes + + ld d, a + ld hl, sBoxMon1Species + ld bc, sBoxMonOT +.openboxmon + call CheckOwnMon + jr nc, .loop + + ; found! + call CloseSRAM + ret + +.loop + push bc + ld bc, BOXMON_STRUCT_LENGTH + add hl, bc + pop bc + call UpdateOTPointer + dec d + jr nz, .openboxmon + + ; Run CheckOwnMon on each monster in the other 13 PC boxes. +.boxes + call CloseSRAM + + ld c, 0 +.box + ; Don't search the current box again. + ld a, [wCurBox] + and $f + cp c + jr z, .loopbox + + ; Load the box. + ld hl, BoxAddressTable1 + ld b, 0 + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + call GetSRAMBank + ld a, [hli] + ld h, [hl] + ld l, a + + ; Number of monsters in the box + ld a, [hl] + and a + jr z, .loopbox + + push bc + + push hl + ld de, sBoxMons - sBoxCount + add hl, de + ld d, h + ld e, l + pop hl + push de + ld de, sBoxMonOT - sBoxCount + add hl, de + ld b, h + ld c, l + pop hl + + ld d, a + +.boxmon + call CheckOwnMon + jr nc, .loopboxmon + + ; found! + pop bc + call CloseSRAM + ret + +.loopboxmon + push bc + ld bc, BOXMON_STRUCT_LENGTH + add hl, bc + pop bc + call UpdateOTPointer + dec d + jr nz, .boxmon + pop bc + +.loopbox + inc c + ld a, c + cp NUM_BOXES + jr c, .box + + ; not found + call CloseSRAM + and a + ret + + +CheckOwnMon: ; 0x4a7ba +; Check if a Pokémon belongs to the player and is of a specific species. + +; inputs: +; hl, pointer to PartyMonNSpecies +; bc, pointer to PartyMonNOT +; wScriptVar should contain the species we're looking for + +; outputs: +; sets carry if monster matches species, ID, and OT name. + + push bc + push hl + push de + ld d, b + ld e, c + +; check species + ld a, [wScriptVar] ; species we're looking for + ld b, [hl] ; species we have + cp b + jr nz, .notfound ; species doesn't match + +; check ID number + ld bc, MON_ID + add hl, bc ; now hl points to ID number + ld a, [wPlayerID] + cp [hl] + jr nz, .notfound ; ID doesn't match + inc hl + ld a, [wPlayerID + 1] + cp [hl] + jr nz, .notfound ; ID doesn't match + +; check OT +; This only checks five characters, which is fine for the Japanese version, +; but in the English version the player name is 7 characters, so this is wrong. + + ld hl, wPlayerName + +rept NAME_LENGTH_JAPANESE + -2 ; should be PLAYER_NAME_LENGTH + -2 + ld a, [de] + cp [hl] + jr nz, .notfound + cp "@" + jr z, .found ; reached end of string + inc hl + inc de +endr + + ld a, [de] + cp [hl] + jr z, .found + +.notfound + pop de + pop hl + pop bc + and a + ret + +.found + pop de + pop hl + pop bc + scf + ret +; 0x4a810 + +BoxAddressTable1: ; 4a810 + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 +; 4a83a + +UpdateOTPointer: ; 0x4a83a + push hl + ld hl, NAME_LENGTH + add hl, bc + ld b, h + ld c, l + pop hl + ret +; 0x4a843 diff --git a/engine/pokemon/search2.asm b/engine/pokemon/search2.asm new file mode 100755 index 000000000..b7112f1f8 --- /dev/null +++ b/engine/pokemon/search2.asm @@ -0,0 +1,134 @@ +_FindPartyMonAboveLevel: ; 4dbd2 + ld hl, wPartyMon1Level + call FindAboveLevel + ret + +_FindPartyMonAtLeastThatHappy: ; 4dbd9 + ld hl, wPartyMon1Happiness + call FindAtLeastThatHappy + ret + +_FindPartyMonThatSpecies: ; 4dbe0 + ld hl, wPartyMon1Species + jp FindThatSpecies + +_FindPartyMonThatSpeciesYourTrainerID: ; 4dbe6 + ld hl, wPartyMon1Species + call FindThatSpecies + ret z + ld a, c + ld hl, wPartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [wPlayerID] + cp [hl] + jr nz, .nope + inc hl + ld a, [wPlayerID + 1] + cp [hl] + jr nz, .nope + ld a, $1 + and a + ret + +.nope + xor a + ret + +FindAtLeastThatHappy: ; 4dc0a +; Sets the bits for the Pokemon that have a happiness greater than or equal to b. +; The lowest bits are used. Sets z if no Pokemon in your party is at least that happy. + ld c, $0 + ld a, [wPartyCount] + ld d, a +.loop + ld a, d + dec a + push hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, b + cp [hl] + pop hl + jr z, .greater_equal + jr nc, .lower + +.greater_equal + ld a, c + or $1 + ld c, a + +.lower + sla c + dec d + jr nz, .loop + call RetroactivelyIgnoreEggs + ld a, c + and a + ret + +FindAboveLevel: ; 4dc31 + ld c, $0 + ld a, [wPartyCount] + ld d, a +.loop + ld a, d + dec a + push hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, b + cp [hl] + pop hl + jr c, .greater + ld a, c + or $1 + ld c, a + +.greater + sla c + dec d + jr nz, .loop + call RetroactivelyIgnoreEggs + ld a, c + and a + ret + +FindThatSpecies: ; 4dc56 +; Find species b in your party. +; If you have no Pokemon, returns c = -1 and z. +; If that species is in your party, returns its location in c, and nz. +; Otherwise, returns z. + ld c, -1 + ld hl, wPartySpecies +.loop + ld a, [hli] + cp -1 + ret z + inc c + cp b + jr nz, .loop + ld a, $1 + and a + ret + +RetroactivelyIgnoreEggs: ; 4dc67 + ld e, -2 + ld hl, wPartySpecies +.loop + ld a, [hli] + cp -1 + ret z + cp EGG + jr nz, .skip_notegg + ld a, c + and e + ld c, a + +.skip_notegg + rlc e + jr .loop diff --git a/engine/pokemon/stats_screen.asm b/engine/pokemon/stats_screen.asm new file mode 100755 index 000000000..59d96999f --- /dev/null +++ b/engine/pokemon/stats_screen.asm @@ -0,0 +1,1173 @@ + const_def 1 + const PINK_PAGE ; 1 + const GREEN_PAGE ; 2 + const BLUE_PAGE ; 3 +NUM_STAT_PAGES EQU const_value + -1 + +BattleStatsScreenInit: ; 4dc7b (13:5c7b) + ld a, [wLinkMode] + cp LINK_MOBILE + jr nz, StatsScreenInit + + ld a, [wBattleMode] + and a + jr z, StatsScreenInit + jr _MobileStatsScreenInit + +StatsScreenInit: ; 4dc8a + ld hl, StatsScreenMain + jr StatsScreenInit_gotaddress + +_MobileStatsScreenInit: ; 4dc8f + ld hl, StatsScreenMobile + jr StatsScreenInit_gotaddress + +StatsScreenInit_gotaddress: ; 4dc94 + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a ; disable overworld tile animations + ld a, [wBoxAlignment] ; whether sprite is to be mirrorred + push af + ld a, [wJumptableIndex] + ld b, a + ld a, [wcf64] + ld c, a + + push bc + push hl + call ClearBGPalettes + call ClearTileMap + call UpdateSprites + farcall StatsScreen_LoadFont + pop hl + call _hl_ + call ClearBGPalettes + call ClearTileMap + pop bc + + ; restore old values + ld a, b + ld [wJumptableIndex], a + ld a, c + ld [wcf64], a + pop af + ld [wBoxAlignment], a + pop af + ld [hMapAnims], a + ret +; 0x4dcd2 + +StatsScreenMain: ; 0x4dcd2 + xor a + ld [wJumptableIndex], a + ; stupid interns + ld [wcf64], a + ld a, [wcf64] + and %11111100 + or 1 + ld [wcf64], a +.loop ; 4dce3 + ld a, [wJumptableIndex] + and $ff ^ (1 << 7) + ld hl, StatsScreenPointerTable + rst JumpTable + call StatsScreen_WaitAnim ; check for keys? + ld a, [wJumptableIndex] + bit 7, a + jr z, .loop + ret +; 0x4dcf7 + +StatsScreenMobile: ; 4dcf7 + xor a + ld [wJumptableIndex], a + ; stupid interns + ld [wcf64], a + ld a, [wcf64] + and %11111100 + or 1 + ld [wcf64], a +.loop + farcall Mobile_SetOverworldDelay + ld a, [wJumptableIndex] + and $ff ^ (1 << 7) + ld hl, StatsScreenPointerTable + rst JumpTable + call StatsScreen_WaitAnim + farcall MobileComms_CheckInactivityTimer + jr c, .exit + ld a, [wJumptableIndex] + bit 7, a + jr z, .loop + +.exit + ret +; 4dd2a + +StatsScreenPointerTable: ; 4dd2a + dw MonStatsInit ; regular pokémon + dw EggStatsInit ; egg + dw StatsScreenWaitCry + dw EggStatsJoypad + dw StatsScreen_LoadPage + dw StatsScreenWaitCry + dw MonStatsJoypad + dw StatsScreen_Exit +; 4dd3a + + +StatsScreen_WaitAnim: ; 4dd3a (13:5d3a) + ld hl, wcf64 + bit 6, [hl] + jr nz, .try_anim + bit 5, [hl] + jr nz, .finish + call DelayFrame + ret + +.try_anim + farcall SetUpPokeAnim + jr nc, .finish + ld hl, wcf64 + res 6, [hl] +.finish + ld hl, wcf64 + res 5, [hl] + farcall HDMATransferTileMapToWRAMBank3 + ret + +StatsScreen_SetJumptableIndex: ; 4dd62 (13:5d62) + ld a, [wJumptableIndex] + and $80 + or h + ld [wJumptableIndex], a + ret + +StatsScreen_Exit: ; 4dd6c (13:5d6c) + ld hl, wJumptableIndex + set 7, [hl] + ret + +MonStatsInit: ; 4dd72 (13:5d72) + ld hl, wcf64 + res 6, [hl] + call ClearBGPalettes + call ClearTileMap + farcall HDMATransferTileMapToWRAMBank3 + call StatsScreen_CopyToTempMon + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + call StatsScreen_InitUpperHalf + ld hl, wcf64 + set 4, [hl] + ld h, 4 + call StatsScreen_SetJumptableIndex + ret + +.egg + ld h, 1 + call StatsScreen_SetJumptableIndex + ret + +EggStatsInit: ; 4dda1 + call EggStatsScreen + ld a, [wJumptableIndex] + inc a + ld [wJumptableIndex], a + ret +; 0x4ddac + + +EggStatsJoypad: ; 4ddac (13:5dac) + call StatsScreen_GetJoypad + jr nc, .check + ld h, 0 + call StatsScreen_SetJumptableIndex + ret + +.check + bit A_BUTTON_F, a + jr nz, .quit + and D_DOWN | D_UP | A_BUTTON | B_BUTTON + jp StatsScreen_JoypadAction + +.quit + ld h, 7 + call StatsScreen_SetJumptableIndex + ret + +StatsScreen_LoadPage: ; 4ddc6 (13:5dc6) + call StatsScreen_LoadGFX + ld hl, wcf64 + res 4, [hl] + ld a, [wJumptableIndex] + inc a + ld [wJumptableIndex], a + ret + +MonStatsJoypad: ; 4ddd6 (13:5dd6) + call StatsScreen_GetJoypad + jr nc, .next + ld h, 0 + call StatsScreen_SetJumptableIndex + ret + +.next + and D_DOWN | D_UP | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON + jp StatsScreen_JoypadAction + +StatsScreenWaitCry: ; 4dde6 (13:5de6) + call IsSFXPlaying + ret nc + ld a, [wJumptableIndex] + inc a + ld [wJumptableIndex], a + ret + +StatsScreen_CopyToTempMon: ; 4ddf2 (13:5df2) + ld a, [wMonType] + cp TEMPMON + jr nz, .breedmon + ld a, [wBufferMonSpecies] + ld [wCurSpecies], a + call GetBaseData + ld hl, wBufferMon + ld de, wTempMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + jr .done + +.breedmon + farcall CopyMonToTempMon + ld a, [wCurPartySpecies] + cp EGG + jr z, .done + ld a, [wMonType] + cp BOXMON + jr c, .done + farcall CalcTempmonStats +.done + and a + ret + +StatsScreen_GetJoypad: ; 4de2c (13:5e2c) + call GetJoypad + ld a, [wMonType] + cp TEMPMON + jr nz, .notbreedmon + push hl + push de + push bc + farcall StatsScreenDPad + pop bc + pop de + pop hl + ld a, [wMenuJoypad] + and D_DOWN | D_UP + jr nz, .set_carry + ld a, [wMenuJoypad] + jr .clear_flags + +.notbreedmon + ld a, [hJoyPressed] +.clear_flags + and a + ret + +.set_carry + scf + ret + +StatsScreen_JoypadAction: ; 4de54 (13:5e54) + push af + ld a, [wcf64] + maskbits NUM_STAT_PAGES + ld c, a + pop af + bit B_BUTTON_F, a + jp nz, .b_button + bit D_LEFT_F, a + jr nz, .d_left + bit D_RIGHT_F, a + jr nz, .d_right + bit A_BUTTON_F, a + jr nz, .a_button + bit D_UP_F, a + jr nz, .d_up + bit D_DOWN_F, a + jr nz, .d_down + jr .done + +.d_down + ld a, [wMonType] + cp BOXMON + jr nc, .done + and a + ld a, [wPartyCount] + jr z, .next_mon + ld a, [wOTPartyCount] +.next_mon + ld b, a + ld a, [wCurPartyMon] + inc a + cp b + jr z, .done + ld [wCurPartyMon], a + ld b, a + ld a, [wMonType] + and a + jr nz, .load_mon + ld a, b + inc a + ld [wPartyMenuCursor], a + jr .load_mon + +.d_up + ld a, [wCurPartyMon] + and a + jr z, .done + dec a + ld [wCurPartyMon], a + ld b, a + ld a, [wMonType] + and a + jr nz, .load_mon + ld a, b + inc a + ld [wPartyMenuCursor], a + jr .load_mon + +.a_button + ld a, c + cp BLUE_PAGE ; last page + jr z, .b_button +.d_right + inc c + ld a, BLUE_PAGE ; last page + cp c + jr nc, .set_page + ld c, PINK_PAGE ; first page + jr .set_page + +.d_left + dec c + jr nz, .set_page + ld c, BLUE_PAGE ; last page + jr .set_page + +.done + ret + +.set_page + ld a, [wcf64] + and %11111100 + or c + ld [wcf64], a + ld h, 4 + call StatsScreen_SetJumptableIndex + ret + +.load_mon + ld h, 0 + call StatsScreen_SetJumptableIndex + ret + +.b_button ; 4dee4 (13:5ee4) + ld h, 7 + call StatsScreen_SetJumptableIndex + ret + +StatsScreen_InitUpperHalf: ; 4deea (13:5eea) + call .PlaceHPBar + xor a + ld [hBGMapMode], a + ld a, [wBaseDexNo] + ld [wd265], a + ld [wCurSpecies], a + hlcoord 8, 0 + ld [hl], "№" + inc hl + ld [hl], "." + inc hl + hlcoord 10, 0 + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + ld de, wd265 + call PrintNum + hlcoord 14, 0 + call PrintLevel + ld hl, .NicknamePointers + call GetNicknamePointer + call CopyNickname + hlcoord 8, 2 + call PlaceString + hlcoord 18, 0 + call .PlaceGenderChar + hlcoord 9, 4 + ld a, "/" + ld [hli], a + ld a, [wBaseDexNo] + ld [wd265], a + call GetPokemonName + call PlaceString + call StatsScreen_PlaceHorizontalDivider + call StatsScreen_PlacePageSwitchArrows + call StatsScreen_PlaceShinyIcon + ret + +.PlaceHPBar: ; 4df45 (13:5f45) + ld hl, wTempMonHP + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, wTempMonMaxHP + ld a, [hli] + ld d, a + ld e, [hl] + farcall ComputeHPBarPixels + ld hl, wCurHPPal + call SetHPPal + ld b, SCGB_STATS_SCREEN_HP_PALS + call GetSGBLayout + call DelayFrame + ret + +.PlaceGenderChar: ; 4df66 (13:5f66) + push hl + farcall GetGender + pop hl + ret c + ld a, "♂" + jr nz, .got_gender + ld a, "♀" +.got_gender + ld [hl], a + ret +; 4df77 (13:5f77) + +.NicknamePointers: ; 4df77 + dw wPartyMonNicknames + dw wOTPartyMonNicknames + dw sBoxMonNicknames + dw wBufferMonNick +; 4df7f + +Unreferenced_Function4df7f: ; 4df7f + hlcoord 7, 0 + ld bc, SCREEN_WIDTH + ld d, SCREEN_HEIGHT +.loop + ld a, $31 ; vertical divider + ld [hl], a + add hl, bc + dec d + jr nz, .loop + ret +; 4df8f + +StatsScreen_PlaceHorizontalDivider: ; 4df8f (13:5f8f) + hlcoord 0, 7 + ld b, SCREEN_WIDTH + ld a, $62 ; horizontal divider (empty HP/exp bar) +.loop + ld [hli], a + dec b + jr nz, .loop + ret + +StatsScreen_PlacePageSwitchArrows: ; 4df9b (13:5f9b) + hlcoord 12, 6 + ld [hl], "◀" + hlcoord 19, 6 + ld [hl], "▶" + ret + +StatsScreen_PlaceShinyIcon: ; 4dfa6 (13:5fa6) + ld bc, wTempMonDVs + farcall CheckShininess + ret nc + hlcoord 19, 0 + ld [hl], "⁂" + ret + +StatsScreen_LoadGFX: ; 4dfb6 (13:5fb6) + ld a, [wBaseDexNo] + ld [wd265], a + ld [wCurSpecies], a + xor a + ld [hBGMapMode], a + call .ClearBox + call .PageTilemap + call .LoadPals + ld hl, wcf64 + bit 4, [hl] + jr nz, .place_frontpic + call SetPalettes + ret + +.place_frontpic + call StatsScreen_PlaceFrontpic + ret + +.ClearBox: ; 4dfda (13:5fda) + ld a, [wcf64] + maskbits NUM_STAT_PAGES + ld c, a + call StatsScreen_LoadPageIndicators + hlcoord 0, 8 + lb bc, 10, 20 + call ClearBox + ret + +.LoadPals: ; 4dfed (13:5fed) + ld a, [wcf64] + maskbits NUM_STAT_PAGES + ld c, a + farcall LoadStatsScreenPals + call DelayFrame + ld hl, wcf64 + set 5, [hl] + ret + +.PageTilemap: ; 4e002 (13:6002) + ld a, [wcf64] + maskbits NUM_STAT_PAGES + dec a + ld hl, .Jumptable + rst JumpTable + ret + +.Jumptable: ; 4e00d (13:600d) +; entries correspond to *_PAGE constants + dw .PinkPage + dw .GreenPage + dw .BluePage + +.PinkPage: ; 4e013 (13:6013) + hlcoord 0, 9 + ld b, $0 + predef DrawPlayerHP + hlcoord 8, 9 + ld [hl], $41 ; right HP/exp bar end cap + ld de, .Status_Type + hlcoord 0, 12 + call PlaceString + ld a, [wTempMonPokerusStatus] + ld b, a + and $f + jr nz, .HasPokerus + ld a, b + and $f0 + jr z, .NotImmuneToPkrs + hlcoord 8, 8 + ld [hl], "." ; Pokérus immunity dot +.NotImmuneToPkrs: + ld a, [wMonType] + cp BOXMON + jr z, .StatusOK + hlcoord 6, 13 + push hl + ld de, wTempMonStatus + predef PlaceStatusString + pop hl + jr nz, .done_status + jr .StatusOK +.HasPokerus: + ld de, .PkrsStr + hlcoord 1, 13 + call PlaceString + jr .done_status +.StatusOK: + ld de, .OK_str + call PlaceString +.done_status + hlcoord 1, 15 + predef PrintMonTypes + hlcoord 9, 8 + ld de, SCREEN_WIDTH + ld b, 10 + ld a, $31 ; vertical divider +.vertical_divider + ld [hl], a + add hl, de + dec b + jr nz, .vertical_divider + ld de, .ExpPointStr + hlcoord 10, 9 + call PlaceString + hlcoord 17, 14 + call .PrintNextLevel + hlcoord 13, 10 + lb bc, 3, 7 + ld de, wTempMonExp + call PrintNum + call .CalcExpToNextLevel + hlcoord 13, 13 + lb bc, 3, 7 + ld de, wBuffer1 + call PrintNum + ld de, .LevelUpStr + hlcoord 10, 12 + call PlaceString + ld de, .ToStr + hlcoord 14, 14 + call PlaceString + hlcoord 11, 16 + ld a, [wTempMonLevel] + ld b, a + ld de, wTempMonExp + 2 + predef FillInExpBar + hlcoord 10, 16 + ld [hl], $40 ; left exp bar end cap + hlcoord 19, 16 + ld [hl], $41 ; right exp bar end cap + ret + +.PrintNextLevel: ; 4e0d3 (13:60d3) + ld a, [wTempMonLevel] + push af + cp MAX_LEVEL + jr z, .AtMaxLevel + inc a + ld [wTempMonLevel], a +.AtMaxLevel: + call PrintLevel + pop af + ld [wTempMonLevel], a + ret + +.CalcExpToNextLevel: ; 4e0e7 (13:60e7) + ld a, [wTempMonLevel] + cp MAX_LEVEL + jr z, .AlreadyAtMaxLevel + inc a + ld d, a + farcall CalcExpAtLevel + ld hl, wTempMonExp + 2 + ld hl, wTempMonExp + 2 + ld a, [hQuotient + 2] + sub [hl] + dec hl + ld [wBuffer3], a + ld a, [hQuotient + 1] + sbc [hl] + dec hl + ld [wBuffer2], a + ld a, [hQuotient] + sbc [hl] + ld [wBuffer1], a + ret + +.AlreadyAtMaxLevel: + ld hl, wBuffer1 + xor a + ld [hli], a + ld [hli], a + ld [hl], a + ret +; 4e119 (13:6119) + +.Status_Type: ; 4e119 + db "STATUS/" + next "TYPE/@" +; 4e127 + +.OK_str: ; 4e127 + db "OK @" +; 4e12b + +.ExpPointStr: ; 4e12b + db "EXP POINTS@" +; 4e136 + +.LevelUpStr: ; 4e136 + db "LEVEL UP@" +; 4e13f + +.ToStr: ; 4e13f + db "TO@" +; 4e142 + +.PkrsStr: ; 4e142 + db "#RUS@" +; 4e147 + +.GreenPage: ; 4e147 (13:6147) + ld de, .Item + hlcoord 0, 8 + call PlaceString + call .GetItemName + hlcoord 8, 8 + call PlaceString + ld de, .Move + hlcoord 0, 10 + call PlaceString + ld hl, wTempMonMoves + ld de, wListMoves_MoveIndicesBuffer + ld bc, NUM_MOVES + call CopyBytes + hlcoord 8, 10 + ld a, SCREEN_WIDTH * 2 + ld [wBuffer1], a + predef ListMoves + hlcoord 12, 11 + ld a, SCREEN_WIDTH * 2 + ld [wBuffer1], a + predef ListMovePP + ret + +.GetItemName: ; 4e189 (13:6189) + ld de, .ThreeDashes + ld a, [wTempMonItem] + and a + ret z + ld b, a + farcall TimeCapsule_ReplaceTeruSama + ld a, b + ld [wd265], a + call GetItemName + ret +; 4e1a0 (13:61a0) + +.Item: ; 4e1a0 + db "ITEM@" +; 4e1a5 + +.ThreeDashes: ; 4e1a5 + db "---@" +; 4e1a9 + +.Move: ; 4e1a9 + db "MOVE@" +; 4e1ae + +.BluePage: ; 4e1ae (13:61ae) + call .PlaceOTInfo + hlcoord 10, 8 + ld de, SCREEN_WIDTH + ld b, 10 + ld a, $31 ; vertical divider +.BluePageVerticalDivider: + ld [hl], a + add hl, de + dec b + jr nz, .BluePageVerticalDivider + hlcoord 11, 8 + ld bc, 6 + predef PrintTempMonStats + ret + +.PlaceOTInfo: ; 4e1cc (13:61cc) + ld de, IDNoString + hlcoord 0, 9 + call PlaceString + ld de, OTString + hlcoord 0, 12 + call PlaceString + hlcoord 2, 10 + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + ld de, wTempMonID + call PrintNum + ld hl, .OTNamePointers + call GetNicknamePointer + call CopyNickname + farcall CheckNickErrors + hlcoord 2, 13 + call PlaceString + ld a, [wTempMonCaughtGender] + and a + jr z, .done + cp $7f + jr z, .done + and $80 + ld a, "♂" + jr z, .got_gender + ld a, "♀" +.got_gender + hlcoord 9, 13 + ld [hl], a +.done + ret +; 4e216 (13:6216) + +.OTNamePointers: ; 4e216 + dw wPartyMonOT + dw wOTPartyMonOT + dw sBoxMonOT + dw wBufferMonOT +; 4e21e + +IDNoString: ; 4e21e + db "№.@" + +OTString: ; 4e222 + db "OT/@" +; 4e226 + + +StatsScreen_PlaceFrontpic: ; 4e226 (13:6226) + ld hl, wTempMonDVs + predef GetUnownLetter + call StatsScreen_GetAnimationParam + jr c, .egg + and a + jr z, .no_cry + jr .cry + +.egg + call .AnimateEgg + call SetPalettes + ret + +.no_cry + call .AnimateMon + call SetPalettes + ret + +.cry + call SetPalettes + call .AnimateMon + ld a, [wCurPartySpecies] + call PlayMonCry2 + ret + +.AnimateMon: ; 4e253 (13:6253) + ld hl, wcf64 + set 5, [hl] + ld a, [wCurPartySpecies] + cp UNOWN + jr z, .unown + hlcoord 0, 0 + call PrepMonFrontpic + ret + +.unown + xor a + ld [wBoxAlignment], a + hlcoord 0, 0 + call _PrepMonFrontpic + ret + +.AnimateEgg: ; 4e271 (13:6271) + ld a, [wCurPartySpecies] + cp UNOWN + jr z, .unownegg + ld a, TRUE + ld [wBoxAlignment], a + call .get_animation + ret + +.unownegg + xor a + ld [wBoxAlignment], a + call .get_animation + ret + +.get_animation ; 4e289 (13:6289) + ld a, [wCurPartySpecies] + call IsAPokemon + ret c + call StatsScreen_LoadTextBoxSpaceGFX + ld de, vTiles2 tile $00 + predef GetAnimatedFrontpic + hlcoord 0, 0 + ld d, $0 + ld e, ANIM_MON_MENU + predef LoadMonAnimation + ld hl, wcf64 + set 6, [hl] + ret + +StatsScreen_GetAnimationParam: ; 4e2ad (13:62ad) + ld a, [wMonType] + ld hl, .Jumptable + rst JumpTable + ret + +.Jumptable: ; 4e2b5 (13:62b5) + dw .PartyMon + dw .OTPartyMon + dw .BoxMon + dw .Tempmon + dw .Wildmon + +.PartyMon: ; 4e2bf (13:62bf) + ld a, [wCurPartyMon] + ld hl, wPartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld b, h + ld c, l + jr .CheckEggFaintedFrzSlp + +.OTPartyMon: ; 4e2cf (13:62cf) + xor a + ret + +.BoxMon: ; 4e2d1 (13:62d1) + ld hl, sBoxMons + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld b, h + ld c, l + ld a, BANK(sBoxMons) + call GetSRAMBank + call .CheckEggFaintedFrzSlp + push af + call CloseSRAM + pop af + ret + +.Tempmon: ; 4e2ed (13:62ed) + ld bc, wTempMonSpecies + jr .CheckEggFaintedFrzSlp ; utterly pointless + +.CheckEggFaintedFrzSlp: ; 4e2f2 (13:62f2) + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + call CheckFaintedFrzSlp + jr c, .FaintedFrzSlp +.egg + xor a + scf + ret + +.Wildmon: ; 4e301 (13:6301) + ld a, $1 + and a + ret + +.FaintedFrzSlp: ; 4e305 (13:6305) + xor a + ret + +StatsScreen_LoadTextBoxSpaceGFX: ; 4e307 (13:6307) + nop + push hl + push de + push bc + push af + call DelayFrame + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + ld de, TextBoxSpaceGFX + lb bc, BANK(TextBoxSpaceGFX), 1 + ld hl, vTiles2 tile " " + call Get2bpp + pop af + ld [rVBK], a + pop af + pop bc + pop de + pop hl + ret +; 4e32a (13:632a) + +Unreferenced_4e32a: ; 4e32a +; A blank space tile? + ds 16 +; 4e33a + +EggStatsScreen: ; 4e33a + xor a + ld [hBGMapMode], a + ld hl, wCurHPPal + call SetHPPal + ld b, SCGB_STATS_SCREEN_HP_PALS + call GetSGBLayout + call StatsScreen_PlaceHorizontalDivider + ld de, EggString + hlcoord 8, 1 + call PlaceString + ld de, IDNoString + hlcoord 8, 3 + call PlaceString + ld de, OTString + hlcoord 8, 5 + call PlaceString + ld de, FiveQMarkString + hlcoord 11, 3 + call PlaceString + ld de, FiveQMarkString + hlcoord 11, 5 + call PlaceString + ld a, [wTempMonHappiness] ; egg status + ld de, EggSoonString + cp $6 + jr c, .picked + ld de, EggCloseString + cp $b + jr c, .picked + ld de, EggMoreTimeString + cp $29 + jr c, .picked + ld de, EggALotMoreTimeString +.picked + hlcoord 1, 9 + call PlaceString + ld hl, wcf64 + set 5, [hl] + call SetPalettes ; pals + call DelayFrame + hlcoord 0, 0 + call PrepMonFrontpic + farcall HDMATransferTileMapToWRAMBank3 + call StatsScreen_AnimateEgg + + ld a, [wTempMonHappiness] + cp 6 + ret nc + ld de, SFX_2_BOOPS + call PlaySFX + ret +; 0x4e3c0 + +EggString: ; 4e3c0 + db "EGG@" + +FiveQMarkString: ; 4e3c4 + db "?????@" + +EggSoonString: ; 0x4e3ca + db "It's making sounds" + next "inside. It's going" + next "to hatch soon!@" + +EggCloseString: ; 0x4e3fd + db "It moves around" + next "inside sometimes." + next "It must be close" + next "to hatching.@" + +EggMoreTimeString: ; 0x4e43d + db "Wonder what's" + next "inside? It needs" + next "more time, though.@" + +EggALotMoreTimeString: ; 0x4e46e + db "This EGG needs a" + next "lot more time to" + next "hatch.@" +; 0x4e497 + + +StatsScreen_AnimateEgg: ; 4e497 (13:6497) + call StatsScreen_GetAnimationParam + ret nc + ld a, [wTempMonHappiness] + ld e, $7 + cp 6 + jr c, .animate + ld e, $8 + cp 11 + jr c, .animate + ret + +.animate + push de + ld a, $1 + ld [wBoxAlignment], a + call StatsScreen_LoadTextBoxSpaceGFX + ld de, vTiles2 tile $00 + predef GetAnimatedFrontpic + pop de + hlcoord 0, 0 + ld d, $0 + predef LoadMonAnimation + ld hl, wcf64 + set 6, [hl] + ret + +StatsScreen_LoadPageIndicators: ; 4e4cd (13:64cd) + hlcoord 13, 5 + ld a, $36 ; first of 4 small square tiles + call .load_square + hlcoord 15, 5 + ld a, $36 ; " " " " + call .load_square + hlcoord 17, 5 + ld a, $36 ; " " " " + call .load_square + ld a, c + cp GREEN_PAGE + ld a, $3a ; first of 4 large square tiles + hlcoord 13, 5 ; PINK_PAGE (< GREEN_PAGE) + jr c, .load_square + hlcoord 15, 5 ; GREEN_PAGE (= GREEN_PAGE) + jr z, .load_square + hlcoord 17, 5 ; BLUE_PAGE (> GREEN_PAGE) +.load_square ; 4e4f7 (13:64f7) + push bc + ld [hli], a + inc a + ld [hld], a + ld bc, SCREEN_WIDTH + add hl, bc + inc a + ld [hli], a + inc a + ld [hl], a + pop bc + ret + +CopyNickname: ; 4e505 (13:6505) + ld de, wStringBuffer1 + ld bc, MON_NAME_LENGTH + jr .okay ; utterly pointless +.okay + ld a, [wMonType] + cp BOXMON + jr nz, .partymon + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + push de + call CopyBytes + pop de + call CloseSRAM + ret + +.partymon + push de + call CopyBytes + pop de + ret + +GetNicknamePointer: ; 4e528 (13:6528) + ld a, [wMonType] + add a + ld c, a + ld b, 0 + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wMonType] + cp TEMPMON + ret z + ld a, [wCurPartyMon] + jp SkipNames + + +CheckFaintedFrzSlp: ; 4e53f + ld hl, MON_HP + add hl, bc + ld a, [hli] + or [hl] + jr z, .fainted_frz_slp + ld hl, MON_STATUS + add hl, bc + ld a, [hl] + and 1 << FRZ | SLP + jr nz, .fainted_frz_slp + and a + ret + +.fainted_frz_slp + scf + ret +; 4e554 diff --git a/engine/pokemon/tempmon.asm b/engine/pokemon/tempmon.asm new file mode 100644 index 000000000..723bfb1dd --- /dev/null +++ b/engine/pokemon/tempmon.asm @@ -0,0 +1,127 @@ +CopyMonToTempMon: ; 5084a +; gets the BaseData of a mon +; and copies the party_struct to wTempMon + + ld a, [wCurPartyMon] + ld e, a + call GetMonSpecies + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call GetBaseData + + ld a, [wMonType] + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + and a + jr z, .copywholestruct + ld hl, wOTPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + cp OTPARTYMON + jr z, .copywholestruct + ld bc, BOXMON_STRUCT_LENGTH + callfar CopyBoxmonToTempMon + jr .done + +.copywholestruct + ld a, [wCurPartyMon] + call AddNTimes + ld de, wTempMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + +.done + ret + +CalcBufferMonStats: ; 5088b + ld bc, wBufferMon + jr _TempMonStatsCalculation + +CalcTempmonStats: ; 50890 + ld bc, wTempMon +_TempMonStatsCalculation: ; 50893 + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + ld [wCurPartyLevel], a + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + push bc + ld b, TRUE + predef CalcMonStats + pop bc + ld hl, MON_HP + add hl, bc + ld d, h + ld e, l + ld a, [wCurPartySpecies] + cp EGG + jr nz, .not_egg + xor a + ld [de], a + inc de + ld [de], a + jr .zero_status + +.not_egg + push bc + ld hl, MON_MAXHP + add hl, bc + ld bc, 2 + call CopyBytes + pop bc + +.zero_status + ld hl, MON_STATUS + add hl, bc + xor a + ld [hli], a + ld [hl], a + ret + +GetMonSpecies: ; 508d5 +; [wMonType] has the type of the mon +; e = Nr. of mon (i.e. [wCurPartyMon]) + + ld a, [wMonType] + and a ; PARTYMON + jr z, .partymon + cp OTPARTYMON + jr z, .otpartymon + cp BOXMON + jr z, .boxmon + cp TEMPMON + jr z, .breedmon + ; WILDMON + +.partymon + ld hl, wPartySpecies + jr .done + +.otpartymon + ld hl, wOTPartySpecies + jr .done + +.boxmon + ld a, BANK(sBoxSpecies) + call GetSRAMBank + ld hl, sBoxSpecies + call .done + call CloseSRAM + ret + +.breedmon + ld a, [wBreedMon1Species] + jr .done2 + +.done + ld d, 0 + add hl, de + ld a, [hl] + +.done2 + ld [wCurPartySpecies], a + ret diff --git a/engine/pokemon/tmhm.asm b/engine/pokemon/tmhm.asm new file mode 100755 index 000000000..442f73cfa --- /dev/null +++ b/engine/pokemon/tmhm.asm @@ -0,0 +1,589 @@ +TMHMPocket: ; 2c76f (b:476f) + ld a, $1 + ld [hInMenu], a + call TMHM_PocketLoop + ld a, $0 + ld [hInMenu], a + ret nc + call PlaceHollowCursor + call WaitBGMap + ld a, [wCurItem] + dec a + ld [wCurItemQuantity], a + ld hl, wTMsHMs + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + ld [wItemQuantityBuffer], a + call .ConvertItemToTMHMNumber + scf + ret + +.ConvertItemToTMHMNumber: ; 2c798 (b:4798) + ld a, [wCurItem] + ld c, a + callfar GetNumberedTMHM + ld a, c + ld [wCurItem], a + ret + +ConvertCurItemIntoCurTMHM: ; 2c7a7 (b:47a7) + ld a, [wCurItem] + ld c, a + callfar GetTMHMNumber + ld a, c + ld [wCurTMHM], a + ret + +GetTMHMItemMove: ; 2c7b6 (b:47b6) + call ConvertCurItemIntoCurTMHM + predef GetTMHMMove + ret + +AskTeachTMHM: ; 2c7bf (b:47bf) + ld hl, wOptions + ld a, [hl] + push af + res NO_TEXT_SCROLL, [hl] + ld a, [wCurItem] + cp TM01 + jr c, .NotTMHM + call GetTMHMItemMove + ld a, [wCurTMHM] + ld [wPutativeTMHMMove], a + call GetMoveName + call CopyName1 + ld hl, Text_BootedTM ; Booted up a TM + ld a, [wCurItem] + cp HM01 + jr c, .TM + ld hl, Text_BootedHM ; Booted up an HM +.TM: + call PrintText + ld hl, Text_ItContained + call PrintText + call YesNoBox +.NotTMHM: + pop bc + ld a, b + ld [wOptions], a + ret + +ChooseMonToLearnTMHM: ; 2c7fb + ld hl, wStringBuffer2 + ld de, wTMHMMoveNameBackup + ld bc, 12 + call CopyBytes + call ClearBGPalettes +ChooseMonToLearnTMHM_NoRefresh: ; 2c80a + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + ld a, PARTYMENUACTION_TEACH_TMHM + ld [wPartyMenuActionText], a +.loopback + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + push af + ld a, [wCurPartySpecies] + cp EGG + pop bc ; now contains the former contents of af + jr z, .egg + push bc + ld hl, wTMHMMoveNameBackup + ld de, wStringBuffer2 + ld bc, 12 + call CopyBytes + pop af ; now contains the original contents of af + ret + +.egg + push hl + push de + push bc + push af + ld de, SFX_WRONG + call PlaySFX + call WaitSFX + pop af + pop bc + pop de + pop hl + jr .loopback +; 2c867 + +TeachTMHM: ; 2c867 + predef CanLearnTMHMMove + + push bc + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + pop bc + + ld a, c + and a + jr nz, .compatible + push de + ld de, SFX_WRONG + call PlaySFX + pop de + ld hl, Text_TMHMNotCompatible + call PrintText + jr .nope + +.compatible + callfar KnowsMove + jr c, .nope + + predef LearnMove + ld a, b + and a + jr z, .nope + + farcall StubbedTrainerRankings_TMsHMsTaught + ld a, [wCurItem] + call IsHM + ret c + + ld c, HAPPINESS_LEARNMOVE + callfar ChangeHappiness + call ConsumeTM + jr .learned_move + +.nope + and a + ret + +.unused + ld a, 2 + ld [wItemEffectSucceeded], a +.learned_move + scf + ret +; 2c8bf (b:48bf) + +Text_BootedTM: ; 0x2c8bf + ; Booted up a TM. + text_jump UnknownText_0x1c0373 + db "@" +; 0x2c8c4 + +Text_BootedHM: ; 0x2c8c4 + ; Booted up an HM. + text_jump UnknownText_0x1c0384 + db "@" +; 0x2c8c9 + +Text_ItContained: ; 0x2c8c9 + ; It contained @ . Teach @ to a #MON? + text_jump UnknownText_0x1c0396 + db "@" +; 0x2c8ce + +Text_TMHMNotCompatible: ; 0x2c8ce + ; is not compatible with @ . It can't learn @ . + text_jump UnknownText_0x1c03c2 + db "@" +; 0x2c8d3 + +TMHM_PocketLoop: ; 2c8d3 (b:48d3) + xor a + ld [hBGMapMode], a + call TMHM_DisplayPocketItems + ld a, 2 + ld [w2DMenuCursorInitY], a + ld a, 7 + ld [w2DMenuCursorInitX], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, 5 + sub d + inc a + cp 6 + jr nz, .okay + dec a +.okay + ld [w2DMenuNumRows], a + ld a, $c + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuCursorOffsets], a + ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN | D_LEFT | D_RIGHT + ld [wMenuJoypadFilter], a + ld a, [wTMHMPocketCursor] + inc a + ld [wMenuCursorY], a + ld a, $1 + ld [wMenuCursorX], a + jr TMHM_ShowTMMoveDescription + +TMHM_JoypadLoop: ; 2c915 (b:4915) + call TMHM_DisplayPocketItems + call StaticMenuJoypad + ld b, a + ld a, [wMenuCursorY] + dec a + ld [wTMHMPocketCursor], a + xor a + ld [hBGMapMode], a + ld a, [w2DMenuFlags2] + bit 7, a + jp nz, TMHM_ScrollPocket + ld a, b + ld [wMenuJoypad], a + bit A_BUTTON_F, a + jp nz, TMHM_ChooseTMorHM + bit B_BUTTON_F, a + jp nz, TMHM_ExitPack + bit D_RIGHT_F, a + jp nz, TMHM_ExitPocket + bit D_LEFT_F, a + jp nz, TMHM_ExitPocket +TMHM_ShowTMMoveDescription: ; 2c946 (b:4946) + call TMHM_CheckHoveringOverCancel + jp nc, TMHM_ExitPocket + hlcoord 0, 12 + ld b, 4 + ld c, SCREEN_WIDTH - 2 + call TextBox + ld a, [wCurItem] + cp NUM_TMS + NUM_HMS + 1 + jr nc, TMHM_JoypadLoop + ld [wd265], a + predef GetTMHMMove + ld a, [wd265] + ld [wCurSpecies], a + hlcoord 1, 14 + call PrintMoveDesc + jp TMHM_JoypadLoop + +TMHM_ChooseTMorHM: ; 2c974 (b:4974) + call TMHM_PlaySFX_ReadText2 + call CountTMsHMs ; This stores the count to wd265. + ld a, [wMenuCursorY] + dec a + ld b, a + ld a, [wTMHMPocketScrollPosition] + add b + ld b, a + ld a, [wd265] + cp b + jr z, _TMHM_ExitPack ; our cursor was hovering over CANCEL +TMHM_CheckHoveringOverCancel: ; 2c98a (b:498a) + call TMHM_GetCurrentPocketPosition + ld a, [wMenuCursorY] + ld b, a +.loop + inc c + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jr nc, .okay + ld a, [hli] + and a + jr z, .loop + dec b + jr nz, .loop + ld a, c +.okay + ld [wCurItem], a + cp -1 + ret + +TMHM_ExitPack: ; 2c9a5 (b:49a5) + call TMHM_PlaySFX_ReadText2 +_TMHM_ExitPack: ; 2c9a8 (b:49a8) + ld a, $2 + ld [wMenuJoypad], a + and a + ret + +TMHM_ExitPocket: ; 2c9af (b:49af) + and a + ret + +TMHM_ScrollPocket: ; 2c9b1 (b:49b1) + ld a, b + bit 7, a + jr nz, .skip + ld hl, wTMHMPocketScrollPosition + ld a, [hl] + and a + jp z, TMHM_JoypadLoop + dec [hl] + call TMHM_DisplayPocketItems + jp TMHM_ShowTMMoveDescription + +.skip + call TMHM_GetCurrentPocketPosition + ld b, 5 +.loop + inc c + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jp nc, TMHM_JoypadLoop + ld a, [hli] + and a + jr z, .loop + dec b + jr nz, .loop + ld hl, wTMHMPocketScrollPosition + inc [hl] + call TMHM_DisplayPocketItems + jp TMHM_ShowTMMoveDescription + +TMHM_DisplayPocketItems: ; 2c9e2 (b:49e2) + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jp z, Tutorial_TMHMPocket + + hlcoord 5, 2 + lb bc, 10, 15 + ld a, " " + call ClearBox + call TMHM_GetCurrentPocketPosition + ld d, $5 +.loop2 + inc c + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jr nc, .NotTMHM + ld a, [hli] + and a + jr z, .loop2 + ld b, a + ld a, c + ld [wd265], a + push hl + push de + push bc + call TMHMPocket_GetCurrentLineCoord + push hl + ld a, [wd265] + cp NUM_TMS + 1 + jr nc, .HM + ld de, wd265 + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + jr .okay + +.HM: + push af + sub NUM_TMS + ld [wd265], a + ld [hl], "H" + inc hl + ld de, wd265 + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + pop af + ld [wd265], a +.okay + predef GetTMHMMove + ld a, [wd265] + ld [wPutativeTMHMMove], a + call GetMoveName + pop hl + ld bc, 3 + add hl, bc + push hl + call PlaceString + pop hl + pop bc + ld a, c + push bc + cp NUM_TMS + 1 + jr nc, .hm2 + ld bc, SCREEN_WIDTH + 9 + add hl, bc + ld [hl], "×" + inc hl + ld a, "0" ; why are we doing this? + pop bc + push bc + ld a, b + ld [wd265], a + ld de, wd265 + lb bc, 1, 2 + call PrintNum +.hm2 + pop bc + pop de + pop hl + dec d + jr nz, .loop2 + jr .done + +.NotTMHM: + call TMHMPocket_GetCurrentLineCoord + inc hl + inc hl + inc hl + push de + ld de, TMHM_String_Cancel + call PlaceString + pop de +.done + ret + +TMHMPocket_GetCurrentLineCoord: ; 2ca86 (b:4a86) + hlcoord 5, 0 + ld bc, 2 * SCREEN_WIDTH + ld a, 6 + sub d + ld e, a + ; AddNTimes +.loop + add hl, bc + dec e + jr nz, .loop + ret +; 2ca95 (b:4a95) + +Unreferenced_Function2ca95: ; 2ca95 + pop hl + ld bc, 3 + add hl, bc + predef GetTMHMMove + ld a, [wd265] + ld [wPutativeTMHMMove], a + call GetMoveName + push hl + call PlaceString + pop hl + ret +; 2caae + +TMHM_String_Cancel: ; 2caae + db "CANCEL@" +; 2cab5 + +TMHM_GetCurrentPocketPosition: ; 2cab5 (b:4ab5) + ld hl, wTMsHMs + ld a, [wTMHMPocketScrollPosition] + ld b, a + inc b + ld c, 0 +.loop + inc c + ld a, [hli] + and a + jr z, .loop + dec b + jr nz, .loop + dec hl + dec c + ret + +Tutorial_TMHMPocket: ; 2caca (b:4aca) + hlcoord 9, 3 + push de + ld de, TMHM_String_Cancel + call PlaceString + pop de + ret + +TMHM_PlaySFX_ReadText2: ; 2cad6 (b:4ad6) + push de + ld de, SFX_READ_TEXT_2 + call PlaySFX + pop de + ret +; 2cadf (b:4adf) + +Unreferenced_Function2cadf: ; 2cadf + call ConvertCurItemIntoCurTMHM + call .CheckHaveRoomForTMHM + ld hl, .NoRoomText + jr nc, .print + ld hl, .ReceivedText +.print + jp PrintText +; 2caf0 + +.NoRoomText: ; 0x2caf0 + ; You have no room for any more @ S. + text_jump UnknownText_0x1c03fa + db "@" +; 0x2caf5 + +.ReceivedText: ; 0x2caf5 + ; You received @ ! + text_jump UnknownText_0x1c0421 + db "@" +; 0x2cafa + +.CheckHaveRoomForTMHM: ; 2cafa + ld a, [wd265] + dec a + ld hl, wTMsHMs + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + inc a + cp NUM_TMS * 2 + ret nc + ld [hl], a + ret +; 2cb0c + +ConsumeTM: ; 2cb0c (b:4b0c) + call ConvertCurItemIntoCurTMHM + ld a, [wd265] + dec a + ld hl, wTMsHMs + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + and a + ret z + dec a + ld [hl], a + ret nz + ld a, [wTMHMPocketScrollPosition] + and a + ret z + dec a + ld [wTMHMPocketScrollPosition], a + ret + +CountTMsHMs: ; 2cb2a (b:4b2a) + ld b, 0 + ld c, NUM_TMS + NUM_HMS + ld hl, wTMsHMs +.loop + ld a, [hli] + and a + jr z, .skip + inc b +.skip + dec c + jr nz, .loop + ld a, b + ld [wd265], a + ret + +PrintMoveDesc: ; 2cb3e + push hl + ld hl, MoveDescriptions + ld a, [wCurSpecies] + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + jp PlaceString +; 2cb52 diff --git a/engine/pokemon/types.asm b/engine/pokemon/types.asm new file mode 100644 index 000000000..dc0df61ae --- /dev/null +++ b/engine/pokemon/types.asm @@ -0,0 +1,99 @@ +PrintMonTypes: ; 5090d +; Print one or both types of [wCurSpecies] +; on the stats screen at hl. + + push hl + call GetBaseData + pop hl + + push hl + ld a, [wBaseType1] + call .Print + + ; Single-typed monsters really + ; have two of the same type. + ld a, [wBaseType1] + ld b, a + ld a, [wBaseType2] + cp b + pop hl + jr z, .hide_type_2 + + ld bc, SCREEN_WIDTH + add hl, bc + +.Print: + ld b, a + jr PrintType + +.hide_type_2 + ; Erase any type name that was here before. + ; Seems to be pointless in localized versions. + ld a, " " + ld bc, SCREEN_WIDTH - 3 + add hl, bc + ld [hl], a + inc bc + add hl, bc + ld bc, NAME_LENGTH_JAPANESE - 1 + jp ByteFill +; 5093a + + +PrintMoveType: ; 5093a +; Print the type of move b at hl. + + push hl + ld a, b + dec a + ld bc, MOVE_LENGTH + ld hl, Moves + call AddNTimes + ld de, wStringBuffer1 + ld a, BANK(Moves) + call FarCopyBytes + ld a, [wStringBuffer1 + MOVE_TYPE] + pop hl + + ld b, a + + +PrintType: ; 50953 +; Print type b at hl. + + ld a, b + + push hl + add a + ld hl, TypeNames + ld e, a + ld d, 0 + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + + jp PlaceString +; 50964 + + +GetTypeName: ; 50964 +; Copy the name of type [wd265] to wStringBuffer1. + + ld a, [wd265] + ld hl, TypeNames + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wStringBuffer1 + ld bc, MOVE_NAME_LENGTH + jp CopyBytes +; 5097b + + +INCLUDE "data/types/names.asm" diff --git a/engine/print_party.asm b/engine/print_party.asm deleted file mode 100755 index 1095ce584..000000000 --- a/engine/print_party.asm +++ /dev/null @@ -1,364 +0,0 @@ -PRINTPARTY_HP EQUS "\"◀\"" ; $71 - -PrintPage1: ; 1dc1b0 - hlcoord 0, 0 - decoord 0, 0, wPrinterTileMapBuffer - ld bc, 17 * SCREEN_WIDTH - call CopyBytes - hlcoord 17, 1, wPrinterTileMapBuffer - ld a, $62 - ld [hli], a - inc a - ld [hl], a - hlcoord 17, 2, wPrinterTileMapBuffer - ld a, $64 - ld [hli], a - inc a - ld [hl], a - hlcoord 1, 9, wPrinterTileMapBuffer - ld a, " " - ld [hli], a - ld [hl], a - hlcoord 1, 10, wPrinterTileMapBuffer - ld a, $61 - ld [hli], a - ld [hl], a - hlcoord 2, 11, wPrinterTileMapBuffer - lb bc, 5, 18 - call ClearBox - ld a, [wd265] - dec a - call CheckCaughtMon - push af - ld a, [wd265] - ld b, a - ld c, 1 ; get page 1 - farcall GetDexEntryPagePointer - pop af - ld a, b - hlcoord 1, 11, wPrinterTileMapBuffer - call nz, FarString - hlcoord 19, 0, wPrinterTileMapBuffer - ld [hl], $35 - ld de, SCREEN_WIDTH - add hl, de - ld b, $f -.column_loop - ld [hl], $37 - add hl, de - dec b - jr nz, .column_loop - ld [hl], $3a - ret -; 1dc213 - -PrintPage2: ; 1dc213 - hlcoord 0, 0, wPrinterTileMapBuffer - ld bc, 8 * SCREEN_WIDTH - ld a, " " - call ByteFill - hlcoord 0, 0, wPrinterTileMapBuffer - ld a, $36 - ld b, 6 - call .FillColumn - hlcoord 19, 0, wPrinterTileMapBuffer - ld a, $37 - ld b, 6 - call .FillColumn - hlcoord 0, 6, wPrinterTileMapBuffer - ld [hl], $38 - inc hl - ld a, $39 - ld bc, SCREEN_HEIGHT - call ByteFill - ld [hl], $3a - hlcoord 0, 7, wPrinterTileMapBuffer - ld bc, SCREEN_WIDTH - ld a, $32 - call ByteFill - ld a, [wd265] - dec a - call CheckCaughtMon - push af - ld a, [wd265] - ld b, a - ld c, 2 ; get page 2 - farcall GetDexEntryPagePointer - pop af - hlcoord 1, 1, wPrinterTileMapBuffer - ld a, b - call nz, FarString - ret -; 1dc26a - -.FillColumn: ; 1dc26a - push de - ld de, SCREEN_WIDTH -.column_loop - ld [hl], a - add hl, de - dec b - jr nz, .column_loop - pop de - ret -; 1dc275 - -GBPrinterStrings: -GBPrinterString_Null: db "@" -GBPrinterString_CheckingLink: next " CHECKING LINK...@" -GBPrinterString_Transmitting: next " TRANSMITTING...@" -GBPrinterString_Printing: next " PRINTING...@" -GBPrinterString_PrinterError1: - db " Printer Error 1" - next "" - next "Check the Game Boy" - next "Printer Manual." - db "@" -GBPrinterString_PrinterError2: - db " Printer Error 2" - next "" - next "Check the Game Boy" - next "Printer Manual." - db "@" -GBPrinterString_PrinterError3: - db " Printer Error 3" - next "" - next "Check the Game Boy" - next "Printer Manual." - db "@" -GBPrinterString_PrinterError4: - db " Printer Error 4" - next "" - next "Check the Game Boy" - next "Printer Manual." - db "@" -; 1dc381 - -PrintPartyMonPage1: ; 1dc381 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - xor a - ld [hBGMapMode], a - call LoadFontsBattleExtra - - ld de, GBPrinterHPIcon - ld hl, vTiles2 tile PRINTPARTY_HP - lb bc, BANK(GBPrinterHPIcon), 1 - call Request1bpp - - ld de, GBPrinterLvIcon - ld hl, vTiles2 tile "" - lb bc, BANK(GBPrinterLvIcon), 1 - call Request1bpp - - ld de, StatsScreenPageTilesGFX + 14 tiles ; shiny icon - ld hl, vTiles2 tile "⁂" - lb bc, BANK(StatsScreenPageTilesGFX), 1 - call Get2bpp - - xor a - ld [wMonType], a - farcall CopyMonToTempMon - hlcoord 0, 7 - ld b, 9 - ld c, 18 - call TextBox - hlcoord 8, 2 - ld a, [wTempMonLevel] - call PrintLevel_Force3Digits - hlcoord 12, 2 - ld [hl], PRINTPARTY_HP - inc hl - ld de, wTempMonMaxHP - lb bc, 2, 3 - call PrintNum - ld a, [wCurPartySpecies] - ld [wd265], a - ld [wCurSpecies], a - ld hl, wPartyMonNicknames - call Function1dc50e - hlcoord 8, 4 - call PlaceString - hlcoord 9, 6 - ld [hl], "/" - call GetPokemonName - hlcoord 10, 6 - call PlaceString - hlcoord 8, 0 - ld [hl], "№" - inc hl - ld [hl], "." - inc hl - ld de, wd265 - lb bc, PRINTNUM_LEADINGZEROS | 1, 3 - call PrintNum - hlcoord 1, 9 - ld de, String1dc550 - call PlaceString - ld hl, wPartyMonOT - call Function1dc50e - hlcoord 4, 9 - call PlaceString - hlcoord 1, 11 - ld de, String1dc559 - call PlaceString - hlcoord 4, 11 - ld de, wTempMonID - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - hlcoord 1, 14 - ld de, String1dc554 - call PlaceString - hlcoord 7, 14 - ld a, [wTempMonMoves + 0] - call Function1dc51a - call Function1dc52c - ld hl, wTempMonDVs - predef GetUnownLetter - ld hl, wBoxAlignment - xor a - ld [hl], a - ld a, [wCurPartySpecies] - cp UNOWN - jr z, .asm_1dc469 - inc [hl] - -.asm_1dc469 - hlcoord 0, 0 - call _PrepMonFrontpic - call WaitBGMap - ld b, SCGB_STATS_SCREEN_HP_PALS - call GetSGBLayout - call SetPalettes - ret -; 1dc47b - -PrintPartyMonPage2: ; 1dc47b - call ClearBGPalettes - call ClearTileMap - call ClearSprites - xor a - ld [hBGMapMode], a - call LoadFontsBattleExtra - xor a - ld [wMonType], a - farcall CopyMonToTempMon - hlcoord 0, 0 - ld b, 15 - ld c, 18 - call TextBox - ld bc, SCREEN_WIDTH - decoord 0, 0 - hlcoord 0, 1 - call CopyBytes - hlcoord 7, 0 - ld a, [wTempMonMoves + 1] - call Function1dc51a - hlcoord 7, 2 - ld a, [wTempMonMoves + 2] - call Function1dc51a - hlcoord 7, 4 - ld a, [wTempMonMoves + 3] - call Function1dc51a - hlcoord 7, 7 - ld de, String1dc55d - call PlaceString - hlcoord 16, 7 - ld de, wTempMonAttack - call .PrintTempMonStats - hlcoord 16, 9 - ld de, wTempMonDefense - call .PrintTempMonStats - hlcoord 16, 11 - ld de, wTempMonSpclAtk - call .PrintTempMonStats - hlcoord 16, 13 - ld de, wTempMonSpclDef - call .PrintTempMonStats - hlcoord 16, 15 - ld de, wTempMonSpeed - call .PrintTempMonStats - call WaitBGMap - ld b, SCGB_STATS_SCREEN_HP_PALS - call GetSGBLayout - call SetPalettes - ret -; 1dc507 - -.PrintTempMonStats: ; 1dc507 - lb bc, 2, 3 - call PrintNum - ret -; 1dc50e - -Function1dc50e: ; 1dc50e - ld bc, NAME_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld e, l - ld d, h - ret -; 1dc51a - -Function1dc51a: ; 1dc51a - and a - jr z, .no_move - - ld [wd265], a - call GetMoveName - jr .got_string - -.no_move - ld de, String1dc584 - -.got_string - call PlaceString - ret -; 1dc52c - -Function1dc52c: ; 1dc52c - farcall GetGender - ld a, " " - jr c, .got_gender - ld a, "♂" - jr nz, .got_gender - ld a, "♀" - -.got_gender - hlcoord 17, 2 - ld [hl], a - ld bc, wTempMonDVs - farcall CheckShininess - ret nc - hlcoord 18, 2 - ld [hl], "⁂" - ret -; 1dc550 - -String1dc550: ; 1dc550 - db "OT/@" - -String1dc554: ; 1dc554 - db "MOVE@" - -String1dc559: ; 1dc559 - db "№.@" - -String1dc55d: ; 1dc55d - db "ATTACK" - next "DEFENSE" - next "SPCL.ATK" - next "SPCL.DEF" - next "SPEED" - db "@" - -String1dc584: ; 1dc584 - db "------------@" -; 1dc591 - -GBPrinterHPIcon: ; 1dc591 -INCBIN "gfx/printer/hp.1bpp" - -GBPrinterLvIcon: ; 1dc599 -INCBIN "gfx/printer/lv.1bpp" diff --git a/engine/printer.asm b/engine/printer.asm deleted file mode 100755 index b9e55ef2a..000000000 --- a/engine/printer.asm +++ /dev/null @@ -1,949 +0,0 @@ -INCLUDE "engine/printer_serial.asm" - -SendScreenToPrinter: ; 843f0 -.loop - call JoyTextDelay - call CheckCancelPrint - jr c, .cancel - ld a, [wJumptableIndex] - bit 7, a - jr nz, .finished - call PrinterJumptableIteration - call CheckPrinterStatus - call PlacePrinterStatusString - call DelayFrame - jr .loop - -.finished - and a - ret - -.cancel - scf - ret -; 84411 - -Printer_CleanUpAfterSend: ; 84411 - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - ret -; 84419 - -Printer_PrepareTileMapForPrint: ; 84419 - push af - call Printer_StartTransmission - pop af - ld [wcbfa], a - call Printer_CopyTileMapToBuffer - ret -; 84425 - -Printer_ExitPrinter: ; 84425 - call ReturnToMapFromSubmenu - call Printer_RestartMapMusic - ret -; 8442c - -PrintDexEntry: ; 8442c - ld a, [wPrinterQueueLength] - push af - - ld hl, vTiles1 - ld de, FontInversed - lb bc, BANK(FontInversed), $80 - call Request1bpp - - xor a - ld [hPrinter], a - call Printer_PlayMusic - - ld a, [rIE] - push af - xor a - ld [rIF], a - ld a, $9 - ld [rIE], a - - call Printer_StartTransmission - ld a, $10 - ld [wcbfa], a - farcall PrintPage1 - call ClearTileMap - ld a, %11100100 - call DmgToCgbBGPals - call DelayFrame - - ld hl, hVBlank - ld a, [hl] - push af - ld [hl], $4 - - ld a, 8 ; 16 rows - ld [wPrinterQueueLength], a - call Printer_ResetJoypadRegisters - call SendScreenToPrinter - jr c, .skip_second_page ; canceled or got an error - - call Printer_CleanUpAfterSend - ld c, 12 - call DelayFrames - xor a - ld [hBGMapMode], a - - call Printer_StartTransmission - ld a, $3 - ld [wcbfa], a - farcall PrintPage2 - call Printer_ResetJoypadRegisters - ld a, 4 - ld [wPrinterQueueLength], a - call SendScreenToPrinter - -.skip_second_page - pop af - ld [hVBlank], a - call Printer_CleanUpAfterSend - - xor a - ld [rIF], a - pop af - ld [rIE], a - - call Printer_ExitPrinter - ld c, 8 -.low_volume_delay_frames - call LowVolume - call DelayFrame - dec c - jr nz, .low_volume_delay_frames - - pop af - ld [wPrinterQueueLength], a - ret -; 844bc - -PrintPCBox: ; 844bc (21:44bc) - ld a, [wPrinterQueueLength] - push af - ld a, 18 / 2 - ld [wPrinterQueueLength], a - - ld a, e - ld [wAddrOfBoxToPrint], a - ld a, d - ld [wAddrOfBoxToPrint + 1], a - ld a, b - ld [wBankOfBoxToPrint], a - ld a, c - ld [wWhichBoxToPrint], a - - xor a - ld [hPrinter], a - ld [wFinishedPrintingBox], a - call Printer_PlayMusic - - ld a, [rIE] - push af - xor a - ld [rIF], a - ld a, %1001 - ld [rIE], a - - ld hl, hVBlank - ld a, [hl] - push af - ld [hl], %0100 - - xor a - ld [hBGMapMode], a - call PrintPCBox_Page1 - ld a, $10 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - call Printer_ResetRegistersAndStartDataSend - jr c, .cancel - - call Printer_CleanUpAfterSend - ld c, 12 - call DelayFrames - xor a - ld [hBGMapMode], a - call PrintPCBox_Page2 - ld a, $0 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - call Printer_ResetRegistersAndStartDataSend - jr c, .cancel - - call Printer_CleanUpAfterSend - ld c, 12 - call DelayFrames - - xor a - ld [hBGMapMode], a - call PrintPCBox_Page3 - ld a, $0 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - call Printer_ResetRegistersAndStartDataSend - jr c, .cancel - - call Printer_CleanUpAfterSend - ld c, 12 - call DelayFrames - - xor a - ld [hBGMapMode], a - call PrintPCBox_Page4 - ld a, $3 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - call Printer_ResetRegistersAndStartDataSend -.cancel - pop af - ld [hVBlank], a - call Printer_CleanUpAfterSend - - xor a - ld [rIF], a - pop af - ld [rIE], a - call Printer_ExitPrinter - - pop af - ld [wPrinterQueueLength], a - ret - -Printer_ResetRegistersAndStartDataSend: ; 84559 (21:4559) - call Printer_ResetJoypadRegisters - call SendScreenToPrinter - ret - -PrintUnownStamp: ; 84560 - ld a, [wPrinterQueueLength] - push af - xor a - ld [hPrinter], a - call Printer_PlayMusic - ld a, [rIE] - push af - xor a - ld [rIF], a - ld a, $9 - ld [rIE], a - ld hl, hVBlank - ld a, [hl] - push af - ld [hl], $4 - xor a - ld [hBGMapMode], a - call LoadTileMapToTempTileMap - farcall PlaceUnownPrinterFrontpic - ld a, $0 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - call Call_LoadTempTileMapToTileMap - call Printer_ResetJoypadRegisters - ld a, 18 / 2 - ld [wPrinterQueueLength], a -.loop - call JoyTextDelay - call CheckCancelPrint - jr c, .done - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call PrinterJumptableIteration - ld a, [wJumptableIndex] - cp $2 - jr nc, .check_status - ld a, 6 / 2 - ld [wPrinterRowIndex], a - -.check_status - call CheckPrinterStatus - call PlacePrinterStatusString - call DelayFrame - jr .loop - -.done - pop af - ld [hVBlank], a - call Printer_CleanUpAfterSend - call Call_LoadTempTileMapToTileMap - xor a - ld [rIF], a - pop af - ld [rIE], a - pop af - ld [wPrinterQueueLength], a - ret -; 845d4 - -PrintMail: ; 845d4 - call PrintMail_ - call Printer_ExitPrinter - ret -; 845db - -PrintMail_: ; 845db - ld a, [wPrinterQueueLength] - push af - xor a - ld [hPrinter], a - call Printer_PlayMusic - - ld a, [rIE] - push af - xor a - ld [rIF], a - ld a, %1001 - ld [rIE], a - - xor a - ld [hBGMapMode], a - - ld a, $13 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - ld hl, hVBlank - ld a, [hl] - push af - ld [hl], %0100 - - ld a, 18 / 2 - ld [wPrinterQueueLength], a - call SendScreenToPrinter - - pop af - ld [hVBlank], a - call Printer_CleanUpAfterSend - call Printer_CopyBufferToTileMap - - xor a - ld [rIF], a - pop af - ld [rIE], a - - pop af - ld [wPrinterQueueLength], a - ret -; 8461a - -PrintPartymon: ; 8461a - ld a, [wPrinterQueueLength] - push af - xor a - ld [hPrinter], a - call Printer_PlayMusic - - ld a, [rIE] - push af - xor a - ld [rIF], a - ld a, %1001 - ld [rIE], a - - xor a - ld [hBGMapMode], a - farcall PrintPartyMonPage1 - ld a, $10 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - - ld hl, hVBlank - ld a, [hl] - push af - ld [hl], %0100 - - ld a, 16 / 2 - ld [wPrinterQueueLength], a - call Printer_ResetJoypadRegisters - call SendScreenToPrinter - jr c, .cancel - - call Printer_CleanUpAfterSend - ld c, 12 - call DelayFrames - - xor a - ld [hBGMapMode], a - farcall PrintPartyMonPage2 - ld a, $3 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - - ld a, 18 / 2 - ld [wPrinterQueueLength], a - call Printer_ResetJoypadRegisters - call SendScreenToPrinter -.cancel - pop af - ld [hVBlank], a - call Printer_CleanUpAfterSend - - call Printer_CopyBufferToTileMap - xor a - ld [rIF], a - pop af - ld [rIE], a - call Printer_ExitPrinter - - pop af - ld [wPrinterQueueLength], a - ret -; 84688 - -_PrintDiploma: ; 84688 - ld a, [wPrinterQueueLength] - push af - - farcall PlaceDiplomaOnScreen - - xor a - ld [hPrinter], a - call Printer_PlayMusic - - ld a, [rIE] - push af - xor a - ld [rIF], a - ld a, %1001 - ld [rIE], a - - ld hl, hVBlank - ld a, [hl] - push af - ld [hl], %0100 - - ld a, $10 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - call Printer_ResetJoypadRegisters - - ld a, 18 / 2 - ld [wPrinterQueueLength], a - call SendScreenToPrinter - jr c, .cancel - call Printer_CleanUpAfterSend - ld c, 12 - call DelayFrames - - call LoadTileMapToTempTileMap - xor a - ld [hBGMapMode], a - - farcall PrintDiplomaPage2 - - ld a, $3 ; to be loaded to wcbfa - call Printer_PrepareTileMapForPrint - call Call_LoadTempTileMapToTileMap - call Printer_ResetJoypadRegisters - - ld a, 18 / 2 - ld [wPrinterQueueLength], a - call SendScreenToPrinter -.cancel - pop af - ld [hVBlank], a - call Printer_CleanUpAfterSend - - xor a - ld [rIF], a - pop af - ld [rIE], a - call Printer_ExitPrinter - - pop af - ld [wPrinterQueueLength], a - ret -; 846f6 - -CheckCancelPrint: ; 846f6 - ld a, [hJoyDown] - and B_BUTTON - jr nz, .pressed_b - and a - ret - -.pressed_b - ld a, [wca80] - cp $c - jr nz, .cancel -.loop - ld a, [wPrinterOpcode] - and a - jr nz, .loop - ld a, $16 ; cancel - ld [wPrinterOpcode], a - ld a, $88 - ld [rSB], a - ld a, $1 - ld [rSC], a - ld a, $81 - ld [rSC], a -.loop2 - ld a, [wPrinterOpcode] - and a - jr nz, .loop2 - -.cancel - ld a, $1 - ld [hPrinter], a - scf - ret -; 84728 - -Printer_CopyTileMapToBuffer: ; 84728 - hlcoord 0, 0 - ld de, wPrinterTileMapBuffer - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - call CopyBytes - ret -; 84735 - -Printer_CopyBufferToTileMap: ; 84735 - ld hl, wPrinterTileMapBuffer - decoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - call CopyBytes - ret -; 84742 - -Printer_ResetJoypadRegisters: ; 84742 - xor a - ld [hJoyReleased], a - ld [hJoyPressed], a - ld [hJoyDown], a - ld [hJoyLast], a - ret -; 8474c - -Printer_PlayMusic: ; 8474c - ld de, MUSIC_PRINTER - call PlayMusic2 - ret -; 84753 - -Printer_RestartMapMusic: ; 84753 - call RestartMapMusic - ret -; 84757 - -CheckPrinterStatus: ; 84757 -; Check for printer errors -; If [ca88] == -1, we're disconnected - ld a, [wPrinterHandshake] - cp -1 - jr nz, .printer_connected - ld a, [wPrinterStatusFlags] - cp -1 - jr z, .error_2 -.printer_connected -; ca89 contains printer status flags - ld a, [wPrinterStatusFlags] - and %11100000 - ret z ; no error - - bit 7, a - jr nz, .error_1 - bit 6, a - jr nz, .error_4 - ; paper error - ld a, PRINTER_ERROR_3 - jr .load_text_index - -.error_4 - ; temperature error - ld a, PRINTER_ERROR_4 - jr .load_text_index - -.error_1 - ; printer battery low - ld a, PRINTER_ERROR_1 - jr .load_text_index - -.error_2 - ; connection error - ld a, PRINTER_ERROR_2 -.load_text_index - ld [wPrinterStatus], a - ret -; 84785 - -PlacePrinterStatusString: ; 84785 -; Print nonzero printer status - ld a, [wPrinterStatus] - and a - ret z - push af - xor a - ld [hBGMapMode], a - hlcoord 0, 5 - lb bc, 10, 18 - call TextBox - pop af - ld e, a - ld d, 0 - ld hl, PrinterStatusStringPointers - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 1, 7 - ld a, BANK(GBPrinterStrings) - call FarString - hlcoord 2, 15 - ld de, String_PressBToCancel - call PlaceString - ld a, $1 - ld [hBGMapMode], a - xor a - ld [wPrinterStatus], a - ret -; 847bd - -Unreferenced_Function847bd: ; 847bd - ld a, [wPrinterStatus] - and a - ret z - push af - xor a - ld [hBGMapMode], a - hlcoord 2, 4 - lb bc, 13, 16 - call ClearBox - pop af - ld e, a - ld d, 0 - ld hl, PrinterStatusStringPointers - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 4, 7 - ld a, BANK(GBPrinterStrings) - call FarString - hlcoord 4, 15 - ld de, String_PressBToCancel - call PlaceString - ld a, $1 - ld [hBGMapMode], a - xor a - ld [wPrinterStatus], a - ret -; 847f5 - -String_PressBToCancel: - db "Press B to Cancel@" -; 84807 - -PrinterStatusStringPointers: ; 84807 - dw GBPrinterString_Null ; @ - dw GBPrinterString_CheckingLink ; CHECKING LINK - dw GBPrinterString_Transmitting ; TRANSMITTING - dw GBPrinterString_Printing ; PRINTING - dw GBPrinterString_PrinterError1 ; error 1 - dw GBPrinterString_PrinterError2 ; error 2 - dw GBPrinterString_PrinterError3 ; error 3 - dw GBPrinterString_PrinterError4 ; error 4 -; 84817 - -PrintPCBox_Page1: ; 84817 (21:4817) - xor a - ld [wWhichBoxMonToPrint], a - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, " " - call ByteFill - call Printer_PlaceEmptyBoxSlotString - - hlcoord 0, 0 - ld bc, 9 * SCREEN_WIDTH - ld a, " " - call ByteFill - - call Printer_PlaceSideBorders - call Printer_PlaceTopBorder - - hlcoord 4, 3 - ld de, .String_PokemonList - call PlaceString - - ld a, [wWhichBoxToPrint] - ld bc, BOX_NAME_LENGTH - ld hl, wBoxNames - call AddNTimes - ld d, h - ld e, l - hlcoord 6, 5 - call PlaceString - ld a, 1 - call Printer_GetBoxMonSpecies - hlcoord 2, 9 - ld c, 3 - call Printer_PrintBoxListSegment - ret -; 84865 (21:4865) - -.String_PokemonList: - db "#MON LIST@" -; 8486f - -PrintPCBox_Page2: ; 8486f (21:486f) - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, " " - call ByteFill - call Printer_PlaceEmptyBoxSlotString - call Printer_PlaceSideBorders - ld a, [wFinishedPrintingBox] - and a - ret nz - ld a, 4 - call Printer_GetBoxMonSpecies - hlcoord 2, 0 - ld c, 6 - call Printer_PrintBoxListSegment - ret - -PrintPCBox_Page3: ; 84893 (21:4893) - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, " " - call ByteFill - call Printer_PlaceEmptyBoxSlotString - call Printer_PlaceSideBorders - ld a, [wFinishedPrintingBox] - and a - ret nz - ld a, 10 - call Printer_GetBoxMonSpecies - hlcoord 2, 0 - ld c, 6 - call Printer_PrintBoxListSegment - ret - -PrintPCBox_Page4: ; 848b7 (21:48b7) - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, " " - call ByteFill - call Printer_PlaceEmptyBoxSlotString - hlcoord 1, 15 - lb bc, 2, 18 - call ClearBox - call Printer_PlaceSideBorders - call Printer_PlaceBottomBorders - ld a, [wFinishedPrintingBox] - and a - ret nz - ld a, 16 - call Printer_GetBoxMonSpecies - hlcoord 2, 0 - ld c, 5 - call Printer_PrintBoxListSegment - ret - -Printer_PrintBoxListSegment: ; 848e7 (21:48e7) - ld a, [wBankOfBoxToPrint] - call GetSRAMBank -.loop - ld a, c - and a - jp z, .max_length - dec c - ld a, [de] - cp $ff - jp z, .finish - ld [wd265], a - ld [wCurPartySpecies], a - - push bc - push hl - push de - - push hl - ld bc, 16 - ld a, " " - call ByteFill - pop hl - - push hl - call GetBasePokemonName - pop hl - - push hl - call PlaceString - ld a, [wCurPartySpecies] - cp EGG - pop hl - jr z, .ok2 - - ld bc, MON_NAME_LENGTH - add hl, bc - call Printer_GetMonGender - ld bc, SCREEN_WIDTH - MON_NAME_LENGTH - add hl, bc - ld a, "/" - ld [hli], a - - push hl - ld bc, 14 - ld a, " " - call ByteFill - pop hl - - push hl - ld a, [wAddrOfBoxToPrint] - ld l, a - ld a, [wAddrOfBoxToPrint + 1] - ld h, a - ld bc, sBoxMonNicknames - sBox - add hl, bc - ld bc, MON_NAME_LENGTH - ld a, [wWhichBoxMonToPrint] - call AddNTimes - ld e, l - ld d, h - pop hl - - push hl - call PlaceString - pop hl - - ld bc, MON_NAME_LENGTH - add hl, bc - push hl - ld a, [wAddrOfBoxToPrint] - ld l, a - ld a, [wAddrOfBoxToPrint + 1] - ld h, a - ld bc, 2 + MONS_PER_BOX + MON_LEVEL - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, [wWhichBoxMonToPrint] - call AddNTimes - ld a, [hl] - pop hl - call PrintLevel_Force3Digits -.ok2 - ld hl, wWhichBoxMonToPrint - inc [hl] - pop de - pop hl - ld bc, 3 * SCREEN_WIDTH - add hl, bc - pop bc - inc de - jp .loop - -.finish - ld a, $1 - ld [wFinishedPrintingBox], a -.max_length - call CloseSRAM - ret - -Printer_GetMonGender: ; 8498a (21:498a) - push hl - ld a, [wAddrOfBoxToPrint] - ld l, a - ld a, [wAddrOfBoxToPrint + 1] - ld h, a - ld bc, $2b - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, [wWhichBoxMonToPrint] - call AddNTimes - ld de, wTempMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - ld a, [wWhichBoxMonToPrint] - ld [wCurPartyMon], a - ld a, TEMPMON - ld [wMonType], a - farcall GetGender - ld a, " " - jr c, .got_gender - ld a, "♂" - jr nz, .got_gender - ld a, "♀" -.got_gender - pop hl - ld [hli], a - ret - -Printer_GetBoxMonSpecies: ; 849c6 (21:49c6) - push hl - ld e, a - ld d, $0 - ld a, [wAddrOfBoxToPrint] - ld l, a - ld a, [wAddrOfBoxToPrint + 1] - ld h, a - add hl, de - ld e, l - ld d, h - pop hl - ret - -Printer_PlaceTopBorder: ; 849d7 (21:49d7) - hlcoord 0, 0 - ld a, "┌" - ld [hli], a - ld a, "─" - ld c, SCREEN_WIDTH - 2 -.loop - ld [hli], a - dec c - jr nz, .loop - ld a, "┐" - ld [hl], a - ret - -Printer_PlaceSideBorders: ; 849e9 (21:49e9) - hlcoord 0, 0 - ld de, SCREEN_WIDTH - 1 - ld c, SCREEN_HEIGHT -.loop - ld a, "│" - ld [hl], a - add hl, de - ld a, "│" - ld [hli], a - dec c - jr nz, .loop - ret - -Printer_PlaceBottomBorders: ; 849fc (21:49fc) - hlcoord 0, 17 - ld a, "└" - ld [hli], a - ld a, "─" - ld c, SCREEN_WIDTH - 2 -.loop - ld [hli], a - dec c - jr nz, .loop - ld a, "┘" - ld [hl], a - ret - -Printer_PlaceEmptyBoxSlotString: ; 84a0e (21:4a0e) - hlcoord 2, 0 - ld c, $6 -.loop - push bc - push hl - ld de, String84a25 - call PlaceString - pop hl - ld bc, 3 * SCREEN_WIDTH - add hl, bc - pop bc - dec c - jr nz, .loop - ret -; 84a25 (21:4a25) - -String84a25: ; 84a25 - db " ------@" -; 84a2e diff --git a/engine/printer/print_party.asm b/engine/printer/print_party.asm new file mode 100755 index 000000000..1095ce584 --- /dev/null +++ b/engine/printer/print_party.asm @@ -0,0 +1,364 @@ +PRINTPARTY_HP EQUS "\"◀\"" ; $71 + +PrintPage1: ; 1dc1b0 + hlcoord 0, 0 + decoord 0, 0, wPrinterTileMapBuffer + ld bc, 17 * SCREEN_WIDTH + call CopyBytes + hlcoord 17, 1, wPrinterTileMapBuffer + ld a, $62 + ld [hli], a + inc a + ld [hl], a + hlcoord 17, 2, wPrinterTileMapBuffer + ld a, $64 + ld [hli], a + inc a + ld [hl], a + hlcoord 1, 9, wPrinterTileMapBuffer + ld a, " " + ld [hli], a + ld [hl], a + hlcoord 1, 10, wPrinterTileMapBuffer + ld a, $61 + ld [hli], a + ld [hl], a + hlcoord 2, 11, wPrinterTileMapBuffer + lb bc, 5, 18 + call ClearBox + ld a, [wd265] + dec a + call CheckCaughtMon + push af + ld a, [wd265] + ld b, a + ld c, 1 ; get page 1 + farcall GetDexEntryPagePointer + pop af + ld a, b + hlcoord 1, 11, wPrinterTileMapBuffer + call nz, FarString + hlcoord 19, 0, wPrinterTileMapBuffer + ld [hl], $35 + ld de, SCREEN_WIDTH + add hl, de + ld b, $f +.column_loop + ld [hl], $37 + add hl, de + dec b + jr nz, .column_loop + ld [hl], $3a + ret +; 1dc213 + +PrintPage2: ; 1dc213 + hlcoord 0, 0, wPrinterTileMapBuffer + ld bc, 8 * SCREEN_WIDTH + ld a, " " + call ByteFill + hlcoord 0, 0, wPrinterTileMapBuffer + ld a, $36 + ld b, 6 + call .FillColumn + hlcoord 19, 0, wPrinterTileMapBuffer + ld a, $37 + ld b, 6 + call .FillColumn + hlcoord 0, 6, wPrinterTileMapBuffer + ld [hl], $38 + inc hl + ld a, $39 + ld bc, SCREEN_HEIGHT + call ByteFill + ld [hl], $3a + hlcoord 0, 7, wPrinterTileMapBuffer + ld bc, SCREEN_WIDTH + ld a, $32 + call ByteFill + ld a, [wd265] + dec a + call CheckCaughtMon + push af + ld a, [wd265] + ld b, a + ld c, 2 ; get page 2 + farcall GetDexEntryPagePointer + pop af + hlcoord 1, 1, wPrinterTileMapBuffer + ld a, b + call nz, FarString + ret +; 1dc26a + +.FillColumn: ; 1dc26a + push de + ld de, SCREEN_WIDTH +.column_loop + ld [hl], a + add hl, de + dec b + jr nz, .column_loop + pop de + ret +; 1dc275 + +GBPrinterStrings: +GBPrinterString_Null: db "@" +GBPrinterString_CheckingLink: next " CHECKING LINK...@" +GBPrinterString_Transmitting: next " TRANSMITTING...@" +GBPrinterString_Printing: next " PRINTING...@" +GBPrinterString_PrinterError1: + db " Printer Error 1" + next "" + next "Check the Game Boy" + next "Printer Manual." + db "@" +GBPrinterString_PrinterError2: + db " Printer Error 2" + next "" + next "Check the Game Boy" + next "Printer Manual." + db "@" +GBPrinterString_PrinterError3: + db " Printer Error 3" + next "" + next "Check the Game Boy" + next "Printer Manual." + db "@" +GBPrinterString_PrinterError4: + db " Printer Error 4" + next "" + next "Check the Game Boy" + next "Printer Manual." + db "@" +; 1dc381 + +PrintPartyMonPage1: ; 1dc381 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + xor a + ld [hBGMapMode], a + call LoadFontsBattleExtra + + ld de, GBPrinterHPIcon + ld hl, vTiles2 tile PRINTPARTY_HP + lb bc, BANK(GBPrinterHPIcon), 1 + call Request1bpp + + ld de, GBPrinterLvIcon + ld hl, vTiles2 tile "" + lb bc, BANK(GBPrinterLvIcon), 1 + call Request1bpp + + ld de, StatsScreenPageTilesGFX + 14 tiles ; shiny icon + ld hl, vTiles2 tile "⁂" + lb bc, BANK(StatsScreenPageTilesGFX), 1 + call Get2bpp + + xor a + ld [wMonType], a + farcall CopyMonToTempMon + hlcoord 0, 7 + ld b, 9 + ld c, 18 + call TextBox + hlcoord 8, 2 + ld a, [wTempMonLevel] + call PrintLevel_Force3Digits + hlcoord 12, 2 + ld [hl], PRINTPARTY_HP + inc hl + ld de, wTempMonMaxHP + lb bc, 2, 3 + call PrintNum + ld a, [wCurPartySpecies] + ld [wd265], a + ld [wCurSpecies], a + ld hl, wPartyMonNicknames + call Function1dc50e + hlcoord 8, 4 + call PlaceString + hlcoord 9, 6 + ld [hl], "/" + call GetPokemonName + hlcoord 10, 6 + call PlaceString + hlcoord 8, 0 + ld [hl], "№" + inc hl + ld [hl], "." + inc hl + ld de, wd265 + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + call PrintNum + hlcoord 1, 9 + ld de, String1dc550 + call PlaceString + ld hl, wPartyMonOT + call Function1dc50e + hlcoord 4, 9 + call PlaceString + hlcoord 1, 11 + ld de, String1dc559 + call PlaceString + hlcoord 4, 11 + ld de, wTempMonID + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + hlcoord 1, 14 + ld de, String1dc554 + call PlaceString + hlcoord 7, 14 + ld a, [wTempMonMoves + 0] + call Function1dc51a + call Function1dc52c + ld hl, wTempMonDVs + predef GetUnownLetter + ld hl, wBoxAlignment + xor a + ld [hl], a + ld a, [wCurPartySpecies] + cp UNOWN + jr z, .asm_1dc469 + inc [hl] + +.asm_1dc469 + hlcoord 0, 0 + call _PrepMonFrontpic + call WaitBGMap + ld b, SCGB_STATS_SCREEN_HP_PALS + call GetSGBLayout + call SetPalettes + ret +; 1dc47b + +PrintPartyMonPage2: ; 1dc47b + call ClearBGPalettes + call ClearTileMap + call ClearSprites + xor a + ld [hBGMapMode], a + call LoadFontsBattleExtra + xor a + ld [wMonType], a + farcall CopyMonToTempMon + hlcoord 0, 0 + ld b, 15 + ld c, 18 + call TextBox + ld bc, SCREEN_WIDTH + decoord 0, 0 + hlcoord 0, 1 + call CopyBytes + hlcoord 7, 0 + ld a, [wTempMonMoves + 1] + call Function1dc51a + hlcoord 7, 2 + ld a, [wTempMonMoves + 2] + call Function1dc51a + hlcoord 7, 4 + ld a, [wTempMonMoves + 3] + call Function1dc51a + hlcoord 7, 7 + ld de, String1dc55d + call PlaceString + hlcoord 16, 7 + ld de, wTempMonAttack + call .PrintTempMonStats + hlcoord 16, 9 + ld de, wTempMonDefense + call .PrintTempMonStats + hlcoord 16, 11 + ld de, wTempMonSpclAtk + call .PrintTempMonStats + hlcoord 16, 13 + ld de, wTempMonSpclDef + call .PrintTempMonStats + hlcoord 16, 15 + ld de, wTempMonSpeed + call .PrintTempMonStats + call WaitBGMap + ld b, SCGB_STATS_SCREEN_HP_PALS + call GetSGBLayout + call SetPalettes + ret +; 1dc507 + +.PrintTempMonStats: ; 1dc507 + lb bc, 2, 3 + call PrintNum + ret +; 1dc50e + +Function1dc50e: ; 1dc50e + ld bc, NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld e, l + ld d, h + ret +; 1dc51a + +Function1dc51a: ; 1dc51a + and a + jr z, .no_move + + ld [wd265], a + call GetMoveName + jr .got_string + +.no_move + ld de, String1dc584 + +.got_string + call PlaceString + ret +; 1dc52c + +Function1dc52c: ; 1dc52c + farcall GetGender + ld a, " " + jr c, .got_gender + ld a, "♂" + jr nz, .got_gender + ld a, "♀" + +.got_gender + hlcoord 17, 2 + ld [hl], a + ld bc, wTempMonDVs + farcall CheckShininess + ret nc + hlcoord 18, 2 + ld [hl], "⁂" + ret +; 1dc550 + +String1dc550: ; 1dc550 + db "OT/@" + +String1dc554: ; 1dc554 + db "MOVE@" + +String1dc559: ; 1dc559 + db "№.@" + +String1dc55d: ; 1dc55d + db "ATTACK" + next "DEFENSE" + next "SPCL.ATK" + next "SPCL.DEF" + next "SPEED" + db "@" + +String1dc584: ; 1dc584 + db "------------@" +; 1dc591 + +GBPrinterHPIcon: ; 1dc591 +INCBIN "gfx/printer/hp.1bpp" + +GBPrinterLvIcon: ; 1dc599 +INCBIN "gfx/printer/lv.1bpp" diff --git a/engine/printer/printer.asm b/engine/printer/printer.asm new file mode 100755 index 000000000..0264b4f7a --- /dev/null +++ b/engine/printer/printer.asm @@ -0,0 +1,949 @@ +INCLUDE "engine/printer/printer_serial.asm" + +SendScreenToPrinter: ; 843f0 +.loop + call JoyTextDelay + call CheckCancelPrint + jr c, .cancel + ld a, [wJumptableIndex] + bit 7, a + jr nz, .finished + call PrinterJumptableIteration + call CheckPrinterStatus + call PlacePrinterStatusString + call DelayFrame + jr .loop + +.finished + and a + ret + +.cancel + scf + ret +; 84411 + +Printer_CleanUpAfterSend: ; 84411 + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ret +; 84419 + +Printer_PrepareTileMapForPrint: ; 84419 + push af + call Printer_StartTransmission + pop af + ld [wcbfa], a + call Printer_CopyTileMapToBuffer + ret +; 84425 + +Printer_ExitPrinter: ; 84425 + call ReturnToMapFromSubmenu + call Printer_RestartMapMusic + ret +; 8442c + +PrintDexEntry: ; 8442c + ld a, [wPrinterQueueLength] + push af + + ld hl, vTiles1 + ld de, FontInversed + lb bc, BANK(FontInversed), $80 + call Request1bpp + + xor a + ld [hPrinter], a + call Printer_PlayMusic + + ld a, [rIE] + push af + xor a + ld [rIF], a + ld a, $9 + ld [rIE], a + + call Printer_StartTransmission + ld a, $10 + ld [wcbfa], a + farcall PrintPage1 + call ClearTileMap + ld a, %11100100 + call DmgToCgbBGPals + call DelayFrame + + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], $4 + + ld a, 8 ; 16 rows + ld [wPrinterQueueLength], a + call Printer_ResetJoypadRegisters + call SendScreenToPrinter + jr c, .skip_second_page ; canceled or got an error + + call Printer_CleanUpAfterSend + ld c, 12 + call DelayFrames + xor a + ld [hBGMapMode], a + + call Printer_StartTransmission + ld a, $3 + ld [wcbfa], a + farcall PrintPage2 + call Printer_ResetJoypadRegisters + ld a, 4 + ld [wPrinterQueueLength], a + call SendScreenToPrinter + +.skip_second_page + pop af + ld [hVBlank], a + call Printer_CleanUpAfterSend + + xor a + ld [rIF], a + pop af + ld [rIE], a + + call Printer_ExitPrinter + ld c, 8 +.low_volume_delay_frames + call LowVolume + call DelayFrame + dec c + jr nz, .low_volume_delay_frames + + pop af + ld [wPrinterQueueLength], a + ret +; 844bc + +PrintPCBox: ; 844bc (21:44bc) + ld a, [wPrinterQueueLength] + push af + ld a, 18 / 2 + ld [wPrinterQueueLength], a + + ld a, e + ld [wAddrOfBoxToPrint], a + ld a, d + ld [wAddrOfBoxToPrint + 1], a + ld a, b + ld [wBankOfBoxToPrint], a + ld a, c + ld [wWhichBoxToPrint], a + + xor a + ld [hPrinter], a + ld [wFinishedPrintingBox], a + call Printer_PlayMusic + + ld a, [rIE] + push af + xor a + ld [rIF], a + ld a, %1001 + ld [rIE], a + + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], %0100 + + xor a + ld [hBGMapMode], a + call PrintPCBox_Page1 + ld a, $10 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + call Printer_ResetRegistersAndStartDataSend + jr c, .cancel + + call Printer_CleanUpAfterSend + ld c, 12 + call DelayFrames + xor a + ld [hBGMapMode], a + call PrintPCBox_Page2 + ld a, $0 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + call Printer_ResetRegistersAndStartDataSend + jr c, .cancel + + call Printer_CleanUpAfterSend + ld c, 12 + call DelayFrames + + xor a + ld [hBGMapMode], a + call PrintPCBox_Page3 + ld a, $0 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + call Printer_ResetRegistersAndStartDataSend + jr c, .cancel + + call Printer_CleanUpAfterSend + ld c, 12 + call DelayFrames + + xor a + ld [hBGMapMode], a + call PrintPCBox_Page4 + ld a, $3 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + call Printer_ResetRegistersAndStartDataSend +.cancel + pop af + ld [hVBlank], a + call Printer_CleanUpAfterSend + + xor a + ld [rIF], a + pop af + ld [rIE], a + call Printer_ExitPrinter + + pop af + ld [wPrinterQueueLength], a + ret + +Printer_ResetRegistersAndStartDataSend: ; 84559 (21:4559) + call Printer_ResetJoypadRegisters + call SendScreenToPrinter + ret + +PrintUnownStamp: ; 84560 + ld a, [wPrinterQueueLength] + push af + xor a + ld [hPrinter], a + call Printer_PlayMusic + ld a, [rIE] + push af + xor a + ld [rIF], a + ld a, $9 + ld [rIE], a + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], $4 + xor a + ld [hBGMapMode], a + call LoadTileMapToTempTileMap + farcall PlaceUnownPrinterFrontpic + ld a, $0 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + call Call_LoadTempTileMapToTileMap + call Printer_ResetJoypadRegisters + ld a, 18 / 2 + ld [wPrinterQueueLength], a +.loop + call JoyTextDelay + call CheckCancelPrint + jr c, .done + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call PrinterJumptableIteration + ld a, [wJumptableIndex] + cp $2 + jr nc, .check_status + ld a, 6 / 2 + ld [wPrinterRowIndex], a + +.check_status + call CheckPrinterStatus + call PlacePrinterStatusString + call DelayFrame + jr .loop + +.done + pop af + ld [hVBlank], a + call Printer_CleanUpAfterSend + call Call_LoadTempTileMapToTileMap + xor a + ld [rIF], a + pop af + ld [rIE], a + pop af + ld [wPrinterQueueLength], a + ret +; 845d4 + +PrintMail: ; 845d4 + call PrintMail_ + call Printer_ExitPrinter + ret +; 845db + +PrintMail_: ; 845db + ld a, [wPrinterQueueLength] + push af + xor a + ld [hPrinter], a + call Printer_PlayMusic + + ld a, [rIE] + push af + xor a + ld [rIF], a + ld a, %1001 + ld [rIE], a + + xor a + ld [hBGMapMode], a + + ld a, $13 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], %0100 + + ld a, 18 / 2 + ld [wPrinterQueueLength], a + call SendScreenToPrinter + + pop af + ld [hVBlank], a + call Printer_CleanUpAfterSend + call Printer_CopyBufferToTileMap + + xor a + ld [rIF], a + pop af + ld [rIE], a + + pop af + ld [wPrinterQueueLength], a + ret +; 8461a + +PrintPartymon: ; 8461a + ld a, [wPrinterQueueLength] + push af + xor a + ld [hPrinter], a + call Printer_PlayMusic + + ld a, [rIE] + push af + xor a + ld [rIF], a + ld a, %1001 + ld [rIE], a + + xor a + ld [hBGMapMode], a + farcall PrintPartyMonPage1 + ld a, $10 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], %0100 + + ld a, 16 / 2 + ld [wPrinterQueueLength], a + call Printer_ResetJoypadRegisters + call SendScreenToPrinter + jr c, .cancel + + call Printer_CleanUpAfterSend + ld c, 12 + call DelayFrames + + xor a + ld [hBGMapMode], a + farcall PrintPartyMonPage2 + ld a, $3 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + + ld a, 18 / 2 + ld [wPrinterQueueLength], a + call Printer_ResetJoypadRegisters + call SendScreenToPrinter +.cancel + pop af + ld [hVBlank], a + call Printer_CleanUpAfterSend + + call Printer_CopyBufferToTileMap + xor a + ld [rIF], a + pop af + ld [rIE], a + call Printer_ExitPrinter + + pop af + ld [wPrinterQueueLength], a + ret +; 84688 + +_PrintDiploma: ; 84688 + ld a, [wPrinterQueueLength] + push af + + farcall PlaceDiplomaOnScreen + + xor a + ld [hPrinter], a + call Printer_PlayMusic + + ld a, [rIE] + push af + xor a + ld [rIF], a + ld a, %1001 + ld [rIE], a + + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], %0100 + + ld a, $10 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + call Printer_ResetJoypadRegisters + + ld a, 18 / 2 + ld [wPrinterQueueLength], a + call SendScreenToPrinter + jr c, .cancel + call Printer_CleanUpAfterSend + ld c, 12 + call DelayFrames + + call LoadTileMapToTempTileMap + xor a + ld [hBGMapMode], a + + farcall PrintDiplomaPage2 + + ld a, $3 ; to be loaded to wcbfa + call Printer_PrepareTileMapForPrint + call Call_LoadTempTileMapToTileMap + call Printer_ResetJoypadRegisters + + ld a, 18 / 2 + ld [wPrinterQueueLength], a + call SendScreenToPrinter +.cancel + pop af + ld [hVBlank], a + call Printer_CleanUpAfterSend + + xor a + ld [rIF], a + pop af + ld [rIE], a + call Printer_ExitPrinter + + pop af + ld [wPrinterQueueLength], a + ret +; 846f6 + +CheckCancelPrint: ; 846f6 + ld a, [hJoyDown] + and B_BUTTON + jr nz, .pressed_b + and a + ret + +.pressed_b + ld a, [wca80] + cp $c + jr nz, .cancel +.loop + ld a, [wPrinterOpcode] + and a + jr nz, .loop + ld a, $16 ; cancel + ld [wPrinterOpcode], a + ld a, $88 + ld [rSB], a + ld a, $1 + ld [rSC], a + ld a, $81 + ld [rSC], a +.loop2 + ld a, [wPrinterOpcode] + and a + jr nz, .loop2 + +.cancel + ld a, $1 + ld [hPrinter], a + scf + ret +; 84728 + +Printer_CopyTileMapToBuffer: ; 84728 + hlcoord 0, 0 + ld de, wPrinterTileMapBuffer + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + call CopyBytes + ret +; 84735 + +Printer_CopyBufferToTileMap: ; 84735 + ld hl, wPrinterTileMapBuffer + decoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + call CopyBytes + ret +; 84742 + +Printer_ResetJoypadRegisters: ; 84742 + xor a + ld [hJoyReleased], a + ld [hJoyPressed], a + ld [hJoyDown], a + ld [hJoyLast], a + ret +; 8474c + +Printer_PlayMusic: ; 8474c + ld de, MUSIC_PRINTER + call PlayMusic2 + ret +; 84753 + +Printer_RestartMapMusic: ; 84753 + call RestartMapMusic + ret +; 84757 + +CheckPrinterStatus: ; 84757 +; Check for printer errors +; If [ca88] == -1, we're disconnected + ld a, [wPrinterHandshake] + cp -1 + jr nz, .printer_connected + ld a, [wPrinterStatusFlags] + cp -1 + jr z, .error_2 +.printer_connected +; ca89 contains printer status flags + ld a, [wPrinterStatusFlags] + and %11100000 + ret z ; no error + + bit 7, a + jr nz, .error_1 + bit 6, a + jr nz, .error_4 + ; paper error + ld a, PRINTER_ERROR_3 + jr .load_text_index + +.error_4 + ; temperature error + ld a, PRINTER_ERROR_4 + jr .load_text_index + +.error_1 + ; printer battery low + ld a, PRINTER_ERROR_1 + jr .load_text_index + +.error_2 + ; connection error + ld a, PRINTER_ERROR_2 +.load_text_index + ld [wPrinterStatus], a + ret +; 84785 + +PlacePrinterStatusString: ; 84785 +; Print nonzero printer status + ld a, [wPrinterStatus] + and a + ret z + push af + xor a + ld [hBGMapMode], a + hlcoord 0, 5 + lb bc, 10, 18 + call TextBox + pop af + ld e, a + ld d, 0 + ld hl, PrinterStatusStringPointers + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 1, 7 + ld a, BANK(GBPrinterStrings) + call FarString + hlcoord 2, 15 + ld de, String_PressBToCancel + call PlaceString + ld a, $1 + ld [hBGMapMode], a + xor a + ld [wPrinterStatus], a + ret +; 847bd + +Unreferenced_Function847bd: ; 847bd + ld a, [wPrinterStatus] + and a + ret z + push af + xor a + ld [hBGMapMode], a + hlcoord 2, 4 + lb bc, 13, 16 + call ClearBox + pop af + ld e, a + ld d, 0 + ld hl, PrinterStatusStringPointers + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 4, 7 + ld a, BANK(GBPrinterStrings) + call FarString + hlcoord 4, 15 + ld de, String_PressBToCancel + call PlaceString + ld a, $1 + ld [hBGMapMode], a + xor a + ld [wPrinterStatus], a + ret +; 847f5 + +String_PressBToCancel: + db "Press B to Cancel@" +; 84807 + +PrinterStatusStringPointers: ; 84807 + dw GBPrinterString_Null ; @ + dw GBPrinterString_CheckingLink ; CHECKING LINK + dw GBPrinterString_Transmitting ; TRANSMITTING + dw GBPrinterString_Printing ; PRINTING + dw GBPrinterString_PrinterError1 ; error 1 + dw GBPrinterString_PrinterError2 ; error 2 + dw GBPrinterString_PrinterError3 ; error 3 + dw GBPrinterString_PrinterError4 ; error 4 +; 84817 + +PrintPCBox_Page1: ; 84817 (21:4817) + xor a + ld [wWhichBoxMonToPrint], a + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + call Printer_PlaceEmptyBoxSlotString + + hlcoord 0, 0 + ld bc, 9 * SCREEN_WIDTH + ld a, " " + call ByteFill + + call Printer_PlaceSideBorders + call Printer_PlaceTopBorder + + hlcoord 4, 3 + ld de, .String_PokemonList + call PlaceString + + ld a, [wWhichBoxToPrint] + ld bc, BOX_NAME_LENGTH + ld hl, wBoxNames + call AddNTimes + ld d, h + ld e, l + hlcoord 6, 5 + call PlaceString + ld a, 1 + call Printer_GetBoxMonSpecies + hlcoord 2, 9 + ld c, 3 + call Printer_PrintBoxListSegment + ret +; 84865 (21:4865) + +.String_PokemonList: + db "#MON LIST@" +; 8486f + +PrintPCBox_Page2: ; 8486f (21:486f) + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + call Printer_PlaceEmptyBoxSlotString + call Printer_PlaceSideBorders + ld a, [wFinishedPrintingBox] + and a + ret nz + ld a, 4 + call Printer_GetBoxMonSpecies + hlcoord 2, 0 + ld c, 6 + call Printer_PrintBoxListSegment + ret + +PrintPCBox_Page3: ; 84893 (21:4893) + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + call Printer_PlaceEmptyBoxSlotString + call Printer_PlaceSideBorders + ld a, [wFinishedPrintingBox] + and a + ret nz + ld a, 10 + call Printer_GetBoxMonSpecies + hlcoord 2, 0 + ld c, 6 + call Printer_PrintBoxListSegment + ret + +PrintPCBox_Page4: ; 848b7 (21:48b7) + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + call Printer_PlaceEmptyBoxSlotString + hlcoord 1, 15 + lb bc, 2, 18 + call ClearBox + call Printer_PlaceSideBorders + call Printer_PlaceBottomBorders + ld a, [wFinishedPrintingBox] + and a + ret nz + ld a, 16 + call Printer_GetBoxMonSpecies + hlcoord 2, 0 + ld c, 5 + call Printer_PrintBoxListSegment + ret + +Printer_PrintBoxListSegment: ; 848e7 (21:48e7) + ld a, [wBankOfBoxToPrint] + call GetSRAMBank +.loop + ld a, c + and a + jp z, .max_length + dec c + ld a, [de] + cp $ff + jp z, .finish + ld [wd265], a + ld [wCurPartySpecies], a + + push bc + push hl + push de + + push hl + ld bc, 16 + ld a, " " + call ByteFill + pop hl + + push hl + call GetBasePokemonName + pop hl + + push hl + call PlaceString + ld a, [wCurPartySpecies] + cp EGG + pop hl + jr z, .ok2 + + ld bc, MON_NAME_LENGTH + add hl, bc + call Printer_GetMonGender + ld bc, SCREEN_WIDTH - MON_NAME_LENGTH + add hl, bc + ld a, "/" + ld [hli], a + + push hl + ld bc, 14 + ld a, " " + call ByteFill + pop hl + + push hl + ld a, [wAddrOfBoxToPrint] + ld l, a + ld a, [wAddrOfBoxToPrint + 1] + ld h, a + ld bc, sBoxMonNicknames - sBox + add hl, bc + ld bc, MON_NAME_LENGTH + ld a, [wWhichBoxMonToPrint] + call AddNTimes + ld e, l + ld d, h + pop hl + + push hl + call PlaceString + pop hl + + ld bc, MON_NAME_LENGTH + add hl, bc + push hl + ld a, [wAddrOfBoxToPrint] + ld l, a + ld a, [wAddrOfBoxToPrint + 1] + ld h, a + ld bc, 2 + MONS_PER_BOX + MON_LEVEL + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, [wWhichBoxMonToPrint] + call AddNTimes + ld a, [hl] + pop hl + call PrintLevel_Force3Digits +.ok2 + ld hl, wWhichBoxMonToPrint + inc [hl] + pop de + pop hl + ld bc, 3 * SCREEN_WIDTH + add hl, bc + pop bc + inc de + jp .loop + +.finish + ld a, $1 + ld [wFinishedPrintingBox], a +.max_length + call CloseSRAM + ret + +Printer_GetMonGender: ; 8498a (21:498a) + push hl + ld a, [wAddrOfBoxToPrint] + ld l, a + ld a, [wAddrOfBoxToPrint + 1] + ld h, a + ld bc, $2b + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, [wWhichBoxMonToPrint] + call AddNTimes + ld de, wTempMonDVs + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + ld a, [wWhichBoxMonToPrint] + ld [wCurPartyMon], a + ld a, TEMPMON + ld [wMonType], a + farcall GetGender + ld a, " " + jr c, .got_gender + ld a, "♂" + jr nz, .got_gender + ld a, "♀" +.got_gender + pop hl + ld [hli], a + ret + +Printer_GetBoxMonSpecies: ; 849c6 (21:49c6) + push hl + ld e, a + ld d, $0 + ld a, [wAddrOfBoxToPrint] + ld l, a + ld a, [wAddrOfBoxToPrint + 1] + ld h, a + add hl, de + ld e, l + ld d, h + pop hl + ret + +Printer_PlaceTopBorder: ; 849d7 (21:49d7) + hlcoord 0, 0 + ld a, "┌" + ld [hli], a + ld a, "─" + ld c, SCREEN_WIDTH - 2 +.loop + ld [hli], a + dec c + jr nz, .loop + ld a, "┐" + ld [hl], a + ret + +Printer_PlaceSideBorders: ; 849e9 (21:49e9) + hlcoord 0, 0 + ld de, SCREEN_WIDTH - 1 + ld c, SCREEN_HEIGHT +.loop + ld a, "│" + ld [hl], a + add hl, de + ld a, "│" + ld [hli], a + dec c + jr nz, .loop + ret + +Printer_PlaceBottomBorders: ; 849fc (21:49fc) + hlcoord 0, 17 + ld a, "└" + ld [hli], a + ld a, "─" + ld c, SCREEN_WIDTH - 2 +.loop + ld [hli], a + dec c + jr nz, .loop + ld a, "┘" + ld [hl], a + ret + +Printer_PlaceEmptyBoxSlotString: ; 84a0e (21:4a0e) + hlcoord 2, 0 + ld c, $6 +.loop + push bc + push hl + ld de, String84a25 + call PlaceString + pop hl + ld bc, 3 * SCREEN_WIDTH + add hl, bc + pop bc + dec c + jr nz, .loop + ret +; 84a25 (21:4a25) + +String84a25: ; 84a25 + db " ------@" +; 84a2e diff --git a/engine/printer/printer_serial.asm b/engine/printer/printer_serial.asm new file mode 100755 index 000000000..4e0d10851 --- /dev/null +++ b/engine/printer/printer_serial.asm @@ -0,0 +1,640 @@ +Printer_StartTransmission: ; 84000 + ld hl, wGameboyPrinterRAM + ld bc, wGameboyPrinterRAMEnd - wGameboyPrinterRAM + xor a + call Printer_ByteFill + xor a + ld [rSB], a + ld [rSC], a + ld [wPrinterOpcode], a + ld hl, wPrinterConnectionOpen + set 0, [hl] + ld a, [wGBPrinter] + ld [wGBPrinterSettings], a + xor a + ld [wJumptableIndex], a + ret +; 84022 + +PrinterJumptableIteration: ; 84022 + 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 +; 84031 + +.Jumptable: ; 84031 (21:4031) + dw Print_InitPrinterHandshake ; 00 + dw Printer_CheckConnectionStatus ; 01 + dw Printer_WaitSerial ; 02 + dw Printer_StartTransmittingTilemap ; 03 + dw Printer_TransmissionLoop ; 04 + dw Printer_WaitSerialAndLoopBack2 ; 05 + + dw Printer_EndTilemapTransmission ; 06 + dw Printer_TransmissionLoop ; 07 + dw Printer_WaitSerial ; 08 + dw Printer_SignalSendHeader ; 09 + dw Printer_TransmissionLoop ; 0a + dw Printer_WaitSerial ; 0b + dw Printer_WaitUntilFinished ; 0c + dw Printer_Quit ; 0d + + dw Printer_NextSection_ ; 0e + dw Printer_WaitSerial ; 0f + dw Printer_SignalLoopBack ; 10 + dw Printer_SectionOne ; 11 + dw Printer_WaitLoopBack ; 12 + dw Printer_WaitLoopBack_ ; 13 + +Printer_NextSection: ; 84059 (21:4059) + ld hl, wJumptableIndex + inc [hl] + ret + +Printer_PrevSection: ; 8405e (21:405e) + ld hl, wJumptableIndex + dec [hl] + ret + +Printer_Quit: ; 84063 (21:4063) + xor a + ld [wPrinterStatusFlags], a + ld hl, wJumptableIndex + set 7, [hl] + ret + +Printer_NextSection_: ; 8406d (21:406d) + call Printer_NextSection + ret + +Printer_SectionOne: ; 84071 (21:4071) + ld a, $1 + ld [wJumptableIndex], a + ret + +Print_InitPrinterHandshake: ; 84077 (21:4077) + call Printer_ResetData + ld hl, PrinterDataPacket1 + call Printer_CopyPacket + xor a + ld [wPrinterSendByteCounter], a + ld [wPrinterSendByteCounter + 1], a + ld a, [wPrinterQueueLength] + ld [wPrinterRowIndex], a + call Printer_NextSection + call Printer_WaitHandshake + ld a, PRINTER_STATUS_CHECKING + ld [wPrinterStatus], a + ret + +Printer_StartTransmittingTilemap: ; 84099 (21:4099) + call Printer_ResetData + ; check ??? + ld hl, wPrinterRowIndex + ld a, [hl] + and a + jr z, Printer_EndTilemapTransmission + ; send packet 3 + ld hl, PrinterDataPacket3 ; signal start of transmission + call Printer_CopyPacket + ; prepare to send 40 tiles + call Printer_Convert2RowsTo2bpp + ld a, LOW(40 tiles) + ld [wPrinterSendByteCounter], a + ld a, HIGH(40 tiles) + ld [wPrinterSendByteCounter + 1], a + ; compute the checksum + call Printer_ComputeChecksum + call Printer_NextSection + call Printer_WaitHandshake + ld a, PRINTER_STATUS_TRANSMITTING + ld [wPrinterStatus], a + ret + +Printer_EndTilemapTransmission: ; 840c5 (21:40c5) + ; ensure that we go from here to routine 7 + ld a, $6 + ld [wJumptableIndex], a + ; send packet 4 + ld hl, PrinterDataPacket4 ; signal no transmission + call Printer_CopyPacket + ; send no tile data + xor a + ld [wPrinterSendByteCounter], a + ld [wPrinterSendByteCounter + 1], a + call Printer_NextSection + call Printer_WaitHandshake + ret + +Printer_SignalSendHeader: ; 840de (21:40de) + call Printer_ResetData + ld hl, PrinterDataPacket2 ; signal request print + call Printer_CopyPacket + ; prepare to send 1 tile + call Printer_StageHeaderForSend + ld a, LOW(4) + ld [wPrinterSendByteCounter], a + ld a, HIGH(4) + ld [wPrinterSendByteCounter + 1], a + ; compute the checksum + call Printer_ComputeChecksum + call Printer_NextSection + call Printer_WaitHandshake + ld a, PRINTER_STATUS_PRINTING + ld [wPrinterStatus], a + ret + +Printer_SignalLoopBack: ; 84103 (21:4103) + call Printer_ResetData + ; send packet 1 + ld hl, PrinterDataPacket1 ; signal no transmission + call Printer_CopyPacket + ; send no tile data + xor a + ld [wPrinterSendByteCounter], a + ld [wPrinterSendByteCounter + 1], a + ld a, [wPrinterQueueLength] + ld [wPrinterRowIndex], a + call Printer_NextSection + call Printer_WaitHandshake + ret + +Printer_WaitSerial: ; 84120 (21:4120) + ld hl, wPrinterSerialFrameDelay + inc [hl] + ld a, [hl] + cp $6 + ret c + xor a + ld [hl], a + call Printer_NextSection + ret + +Printer_WaitSerialAndLoopBack2: ; 8412e (21:412e) + ld hl, wPrinterSerialFrameDelay + inc [hl] + ld a, [hl] + cp $6 + ret c + xor a + ld [hl], a + ld hl, wPrinterRowIndex + dec [hl] + call Printer_PrevSection + call Printer_PrevSection + ret + +Printer_CheckConnectionStatus: ; 84143 (21:4143) + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterHandshake] + cp $ff + jr nz, .printer_connected + ld a, [wPrinterStatusFlags] + cp $ff + jr z, .printer_error + +.printer_connected + ld a, [wPrinterHandshake] + cp $81 + jr nz, .printer_error + ld a, [wPrinterStatusFlags] + cp $0 + jr nz, .printer_error + ld hl, wPrinterConnectionOpen + set 1, [hl] + ld a, $5 + ld [wHandshakeFrameDelay], a + call Printer_NextSection + ret + +.printer_error + ld a, $ff + ld [wPrinterHandshake], a + ld [wPrinterStatusFlags], a + ld a, $e + ld [wJumptableIndex], a + ret + +Printer_TransmissionLoop: ; 84180 (21:4180) + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterStatusFlags] + and $f0 + jr nz, .enter_wait_loop + ld a, [wPrinterStatusFlags] + and $1 + jr nz, .cycle_back + call Printer_NextSection + ret + +.cycle_back + call Printer_PrevSection + ret + +.enter_wait_loop + ld a, $12 ; Printer_WaitLoopBack + ld [wJumptableIndex], a + ret + +Printer_WaitUntilFinished: ; 841a1 (21:41a1) + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterStatusFlags] + and $f3 + ret nz + call Printer_NextSection + ret + +Printer_WaitLoopBack: ; 841b0 (21:41b0) + call Printer_NextSection +Printer_WaitLoopBack_: ; 841b3 (21:41b3) + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterStatusFlags] + and $f0 + ret nz + xor a + ld [wJumptableIndex], a + ret + +Printer_WaitHandshake: ; 841c3 (21:41c3) +.loop + ld a, [wPrinterOpcode] + and a + jr nz, .loop + xor a + ld [wPrinterSendByteOffset], a + ld [wPrinterSendByteOffset + 1], a + ld a, $1 + ld [wPrinterOpcode], a + ld a, $88 + ld [rSB], a + ld a, $1 + ld [rSC], a + ld a, $81 + ld [rSC], a + ret + +Printer_CopyPacket: ; 841e2 (21:41e2) + ld a, [hli] + ld [wPrinterData], a + ld a, [hli] + ld [wPrinterData + 1], a + ld a, [hli] + ld [wPrinterData + 2], a + ld a, [hli] + ld [wPrinterData + 3], a + ld a, [hli] + ld [wPrinterChecksum], a + ld a, [hl] + ld [wPrinterChecksum + 1], a + ret + +Printer_ResetData: ; 841fb (21:41fb) + xor a + ld hl, wPrinterData + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, wPrinterChecksum + ld [hli], a + ld [hl], a + xor a + ld [wPrinterSendByteCounter], a + ld [wPrinterSendByteCounter + 1], a + ld hl, wGameboyPrinterRAM + ld bc, wGameboyPrinter2bppSourceEnd - wGameboyPrinter2bppSource + call Printer_ByteFill + ret + +Printer_ComputeChecksum: ; 84219 (21:4219) + ld hl, 0 + ld bc, 4 + ld de, wPrinterData + call .ComputeChecksum + ld a, [wPrinterSendByteCounter] + ld c, a + ld a, [wPrinterSendByteCounter + 1] + ld b, a + ld de, wGameboyPrinterRAM + call .ComputeChecksum + ld a, l + ld [wPrinterChecksum], a + ld a, h + ld [wPrinterChecksum + 1], a + ret + +.ComputeChecksum: ; 8423c (21:423c) +.loop + ld a, [de] + inc de + add l + jr nc, .no_overflow + inc h +.no_overflow + ld l, a + dec bc + ld a, c + or b + jr nz, .loop + ret + +Printer_StageHeaderForSend: ; 84249 (21:4249) + ld a, $1 + ld [wGameboyPrinter2bppSource + 0], a + ld a, [wcbfa] + ld [wGameboyPrinter2bppSource + 1], a + ld a, %11100100 + ld [wGameboyPrinter2bppSource + 2], a + ld a, [wGBPrinterSettings] + ld [wGameboyPrinter2bppSource + 3], a + ret + +Printer_Convert2RowsTo2bpp: ; 84260 (21:4260) + ; de = wPrinterTileMapBuffer + 2 * SCREEN_WIDTH * ([wPrinterQueueLength] - [wPrinterRowIndex]) + ld a, [wPrinterRowIndex] + xor $ff + ld d, a + ld a, [wPrinterQueueLength] + inc a + add d + ld hl, wPrinterTileMapBuffer + ld de, 2 * SCREEN_WIDTH +.loop1 + and a + jr z, .okay1 + add hl, de + dec a + jr .loop1 +.okay1 + ld e, l + ld d, h + ld hl, wGameboyPrinter2bppSource + ld c, 2 * SCREEN_WIDTH +.loop2 + ld a, [de] + inc de + push bc + push de + push hl + ; convert tile index to vram address + swap a + ld d, a + and $f0 + ld e, a + ld a, d + and $f + ld d, a + and $8 + ld a, d + jr nz, .vtiles_8xxx + or $90 + jr .got_vtile_addr + +.vtiles_8xxx + or $80 +.got_vtile_addr + ld d, a + ; copy 1 vtile to hl + lb bc, BANK(Printer_Convert2RowsTo2bpp), 1 + call Request2bpp + pop hl + ld de, 1 tiles + add hl, de + pop de + pop bc + dec c + jr nz, .loop2 + ret + +Printer_ByteFill: ; 842ab + push de + ld e, a +.loop + ld [hl], e + inc hl + dec bc + ld a, c + or b + jr nz, .loop + ld a, e + pop de + ret +; 842b7 + +PrinterDataPacket1: + db 1, 0, $00, 0 + dw 1 +PrinterDataPacket2: + db 2, 0, $04, 0 + dw 0 +PrinterDataPacket3: + db 4, 0, $80, 2 + dw 0 +PrinterDataPacket4: + db 4, 0, $00, 0 + dw 4 +PrinterDataPacket5: ; unused + db 8, 0, $00, 0 + dw 8 +PrinterDataPacket6: ; unused + db 15, 0, $00, 0 + dw 15 +; 842db + +_PrinterReceive:: ; 842db + ld a, [wPrinterOpcode] + add a + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 842ea + +.Jumptable: ; 842ea (21:42ea) + dw Printer_DoNothing ; 00 + + dw Printer_Send0x33 ; 01 + dw Printer_SendPrinterData1 ; 02 + dw Printer_SendPrinterData2 ; 03 + dw Printer_SendPrinterData3 ; 04 + dw Printer_SendPrinterData4 ; 05 + dw Printer_SendNextByte ; 06 + dw Printer_SendwPrinterChecksumLo ; 07 + dw Printer_SendwPrinterChecksumHi ; 08 + dw Printer_Send0x00 ; 09 + dw Printer_ReceiveTowPrinterHandshakeAndSend0x00 ; 0a + dw Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop ; 0b + + dw Printer_Send0x33 ; 0c triggered by AskSerial + dw Printer_Send0x0f ; 0d + dw Printer_Send0x00_ ; 0e + dw Printer_Send0x00_ ; 0f + dw Printer_Send0x00_ ; 10 + dw Printer_Send0x0f ; 11 + dw Printer_Send0x00_ ; 12 + dw Printer_Send0x00 ; 13 + dw Printer_ReceiveTowPrinterHandshakeAndSend0x00 ; 14 + dw Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop_ ; 15 + + dw Printer_Send0x33 ; 16 triggered by pressing B + dw Printer_Send0x08 ; 17 + dw Printer_Send0x00_ ; 18 + dw Printer_Send0x00_ ; 19 + dw Printer_Send0x00_ ; 1a + dw Printer_Send0x08 ; 1b + dw Printer_Send0x00_ ; 1c + dw Printer_Send0x00 ; 1d + dw Printer_ReceiveTowPrinterHandshakeAndSend0x00 ; 1e + dw Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop ; 1f + +Printer_NextInstruction: ; 8432a (21:432a) + ld hl, wPrinterOpcode + inc [hl] + ret + +Printer_DoNothing: ; 8432f (21:432f) + ret + +Printer_Send0x33: ; 84330 (21:4330) + ld a, $33 + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_SendPrinterData1: ; 84339 (21:4339) + ld a, [wPrinterData] + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_SendPrinterData2: ; 84343 (21:4343) + ld a, [wPrinterData + 1] + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_SendPrinterData3: ; 8434d (21:434d) + ld a, [wPrinterData + 2] + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_SendPrinterData4: ; 84357 (21:4357) + ld a, [wPrinterData + 3] + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_SendNextByte: ; 84361 (21:4361) + ; decrement 16-bit counter + ld hl, wPrinterSendByteCounter + ld a, [hli] + ld d, [hl] + ld e, a + or d + jr z, .done + dec de + ld [hl], d + dec hl + ld [hl], e + + ld a, [wPrinterSendByteOffset] + ld e, a + ld a, [wPrinterSendByteOffset + 1] + ld d, a + ld hl, wGameboyPrinterRAM + add hl, de + inc de + ld a, e + ld [wPrinterSendByteOffset], a + ld a, d + ld [wPrinterSendByteOffset + 1], a + ld a, [hl] + call Printer_SerialSend + ret + +.done + call Printer_NextInstruction +Printer_SendwPrinterChecksumLo: ; 8438b (21:438b) + ld a, [wPrinterChecksum] + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_SendwPrinterChecksumHi: ; 84395 (21:4395) + ld a, [wPrinterChecksum + 1] + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_Send0x00: ; 8439f (21:439f) + ld a, $0 + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_ReceiveTowPrinterHandshakeAndSend0x00: ; 843a8 (21:43a8) + ld a, [rSB] + ld [wPrinterHandshake], a + ld a, $0 + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop: ; 843b6 (21:43b6) + ld a, [rSB] + ld [wPrinterStatusFlags], a + xor a + ld [wPrinterOpcode], a + ret + +Printer_Send0x0f: ; 843c0 (21:43c0) + ld a, $f + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_Send0x00_: ; 843c9 (21:43c9) + ld a, $0 + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_Send0x08: ; 843d2 (21:43d2) + ld a, $8 + call Printer_SerialSend + call Printer_NextInstruction + ret + +Printer_SerialSend: ; 843db (21:43db) + ld [rSB], a + ld a, $1 ; switch to internal clock + ld [rSC], a + ld a, $81 ; start transfer + ld [rSC], a + ret + +Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop_: ; 843e6 (21:43e6) + ld a, [rSB] + ld [wPrinterStatusFlags], a + xor a + ld [wPrinterOpcode], a + ret diff --git a/engine/printer_serial.asm b/engine/printer_serial.asm deleted file mode 100755 index 4e0d10851..000000000 --- a/engine/printer_serial.asm +++ /dev/null @@ -1,640 +0,0 @@ -Printer_StartTransmission: ; 84000 - ld hl, wGameboyPrinterRAM - ld bc, wGameboyPrinterRAMEnd - wGameboyPrinterRAM - xor a - call Printer_ByteFill - xor a - ld [rSB], a - ld [rSC], a - ld [wPrinterOpcode], a - ld hl, wPrinterConnectionOpen - set 0, [hl] - ld a, [wGBPrinter] - ld [wGBPrinterSettings], a - xor a - ld [wJumptableIndex], a - ret -; 84022 - -PrinterJumptableIteration: ; 84022 - 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 -; 84031 - -.Jumptable: ; 84031 (21:4031) - dw Print_InitPrinterHandshake ; 00 - dw Printer_CheckConnectionStatus ; 01 - dw Printer_WaitSerial ; 02 - dw Printer_StartTransmittingTilemap ; 03 - dw Printer_TransmissionLoop ; 04 - dw Printer_WaitSerialAndLoopBack2 ; 05 - - dw Printer_EndTilemapTransmission ; 06 - dw Printer_TransmissionLoop ; 07 - dw Printer_WaitSerial ; 08 - dw Printer_SignalSendHeader ; 09 - dw Printer_TransmissionLoop ; 0a - dw Printer_WaitSerial ; 0b - dw Printer_WaitUntilFinished ; 0c - dw Printer_Quit ; 0d - - dw Printer_NextSection_ ; 0e - dw Printer_WaitSerial ; 0f - dw Printer_SignalLoopBack ; 10 - dw Printer_SectionOne ; 11 - dw Printer_WaitLoopBack ; 12 - dw Printer_WaitLoopBack_ ; 13 - -Printer_NextSection: ; 84059 (21:4059) - ld hl, wJumptableIndex - inc [hl] - ret - -Printer_PrevSection: ; 8405e (21:405e) - ld hl, wJumptableIndex - dec [hl] - ret - -Printer_Quit: ; 84063 (21:4063) - xor a - ld [wPrinterStatusFlags], a - ld hl, wJumptableIndex - set 7, [hl] - ret - -Printer_NextSection_: ; 8406d (21:406d) - call Printer_NextSection - ret - -Printer_SectionOne: ; 84071 (21:4071) - ld a, $1 - ld [wJumptableIndex], a - ret - -Print_InitPrinterHandshake: ; 84077 (21:4077) - call Printer_ResetData - ld hl, PrinterDataPacket1 - call Printer_CopyPacket - xor a - ld [wPrinterSendByteCounter], a - ld [wPrinterSendByteCounter + 1], a - ld a, [wPrinterQueueLength] - ld [wPrinterRowIndex], a - call Printer_NextSection - call Printer_WaitHandshake - ld a, PRINTER_STATUS_CHECKING - ld [wPrinterStatus], a - ret - -Printer_StartTransmittingTilemap: ; 84099 (21:4099) - call Printer_ResetData - ; check ??? - ld hl, wPrinterRowIndex - ld a, [hl] - and a - jr z, Printer_EndTilemapTransmission - ; send packet 3 - ld hl, PrinterDataPacket3 ; signal start of transmission - call Printer_CopyPacket - ; prepare to send 40 tiles - call Printer_Convert2RowsTo2bpp - ld a, LOW(40 tiles) - ld [wPrinterSendByteCounter], a - ld a, HIGH(40 tiles) - ld [wPrinterSendByteCounter + 1], a - ; compute the checksum - call Printer_ComputeChecksum - call Printer_NextSection - call Printer_WaitHandshake - ld a, PRINTER_STATUS_TRANSMITTING - ld [wPrinterStatus], a - ret - -Printer_EndTilemapTransmission: ; 840c5 (21:40c5) - ; ensure that we go from here to routine 7 - ld a, $6 - ld [wJumptableIndex], a - ; send packet 4 - ld hl, PrinterDataPacket4 ; signal no transmission - call Printer_CopyPacket - ; send no tile data - xor a - ld [wPrinterSendByteCounter], a - ld [wPrinterSendByteCounter + 1], a - call Printer_NextSection - call Printer_WaitHandshake - ret - -Printer_SignalSendHeader: ; 840de (21:40de) - call Printer_ResetData - ld hl, PrinterDataPacket2 ; signal request print - call Printer_CopyPacket - ; prepare to send 1 tile - call Printer_StageHeaderForSend - ld a, LOW(4) - ld [wPrinterSendByteCounter], a - ld a, HIGH(4) - ld [wPrinterSendByteCounter + 1], a - ; compute the checksum - call Printer_ComputeChecksum - call Printer_NextSection - call Printer_WaitHandshake - ld a, PRINTER_STATUS_PRINTING - ld [wPrinterStatus], a - ret - -Printer_SignalLoopBack: ; 84103 (21:4103) - call Printer_ResetData - ; send packet 1 - ld hl, PrinterDataPacket1 ; signal no transmission - call Printer_CopyPacket - ; send no tile data - xor a - ld [wPrinterSendByteCounter], a - ld [wPrinterSendByteCounter + 1], a - ld a, [wPrinterQueueLength] - ld [wPrinterRowIndex], a - call Printer_NextSection - call Printer_WaitHandshake - ret - -Printer_WaitSerial: ; 84120 (21:4120) - ld hl, wPrinterSerialFrameDelay - inc [hl] - ld a, [hl] - cp $6 - ret c - xor a - ld [hl], a - call Printer_NextSection - ret - -Printer_WaitSerialAndLoopBack2: ; 8412e (21:412e) - ld hl, wPrinterSerialFrameDelay - inc [hl] - ld a, [hl] - cp $6 - ret c - xor a - ld [hl], a - ld hl, wPrinterRowIndex - dec [hl] - call Printer_PrevSection - call Printer_PrevSection - ret - -Printer_CheckConnectionStatus: ; 84143 (21:4143) - ld a, [wPrinterOpcode] - and a - ret nz - ld a, [wPrinterHandshake] - cp $ff - jr nz, .printer_connected - ld a, [wPrinterStatusFlags] - cp $ff - jr z, .printer_error - -.printer_connected - ld a, [wPrinterHandshake] - cp $81 - jr nz, .printer_error - ld a, [wPrinterStatusFlags] - cp $0 - jr nz, .printer_error - ld hl, wPrinterConnectionOpen - set 1, [hl] - ld a, $5 - ld [wHandshakeFrameDelay], a - call Printer_NextSection - ret - -.printer_error - ld a, $ff - ld [wPrinterHandshake], a - ld [wPrinterStatusFlags], a - ld a, $e - ld [wJumptableIndex], a - ret - -Printer_TransmissionLoop: ; 84180 (21:4180) - ld a, [wPrinterOpcode] - and a - ret nz - ld a, [wPrinterStatusFlags] - and $f0 - jr nz, .enter_wait_loop - ld a, [wPrinterStatusFlags] - and $1 - jr nz, .cycle_back - call Printer_NextSection - ret - -.cycle_back - call Printer_PrevSection - ret - -.enter_wait_loop - ld a, $12 ; Printer_WaitLoopBack - ld [wJumptableIndex], a - ret - -Printer_WaitUntilFinished: ; 841a1 (21:41a1) - ld a, [wPrinterOpcode] - and a - ret nz - ld a, [wPrinterStatusFlags] - and $f3 - ret nz - call Printer_NextSection - ret - -Printer_WaitLoopBack: ; 841b0 (21:41b0) - call Printer_NextSection -Printer_WaitLoopBack_: ; 841b3 (21:41b3) - ld a, [wPrinterOpcode] - and a - ret nz - ld a, [wPrinterStatusFlags] - and $f0 - ret nz - xor a - ld [wJumptableIndex], a - ret - -Printer_WaitHandshake: ; 841c3 (21:41c3) -.loop - ld a, [wPrinterOpcode] - and a - jr nz, .loop - xor a - ld [wPrinterSendByteOffset], a - ld [wPrinterSendByteOffset + 1], a - ld a, $1 - ld [wPrinterOpcode], a - ld a, $88 - ld [rSB], a - ld a, $1 - ld [rSC], a - ld a, $81 - ld [rSC], a - ret - -Printer_CopyPacket: ; 841e2 (21:41e2) - ld a, [hli] - ld [wPrinterData], a - ld a, [hli] - ld [wPrinterData + 1], a - ld a, [hli] - ld [wPrinterData + 2], a - ld a, [hli] - ld [wPrinterData + 3], a - ld a, [hli] - ld [wPrinterChecksum], a - ld a, [hl] - ld [wPrinterChecksum + 1], a - ret - -Printer_ResetData: ; 841fb (21:41fb) - xor a - ld hl, wPrinterData - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld hl, wPrinterChecksum - ld [hli], a - ld [hl], a - xor a - ld [wPrinterSendByteCounter], a - ld [wPrinterSendByteCounter + 1], a - ld hl, wGameboyPrinterRAM - ld bc, wGameboyPrinter2bppSourceEnd - wGameboyPrinter2bppSource - call Printer_ByteFill - ret - -Printer_ComputeChecksum: ; 84219 (21:4219) - ld hl, 0 - ld bc, 4 - ld de, wPrinterData - call .ComputeChecksum - ld a, [wPrinterSendByteCounter] - ld c, a - ld a, [wPrinterSendByteCounter + 1] - ld b, a - ld de, wGameboyPrinterRAM - call .ComputeChecksum - ld a, l - ld [wPrinterChecksum], a - ld a, h - ld [wPrinterChecksum + 1], a - ret - -.ComputeChecksum: ; 8423c (21:423c) -.loop - ld a, [de] - inc de - add l - jr nc, .no_overflow - inc h -.no_overflow - ld l, a - dec bc - ld a, c - or b - jr nz, .loop - ret - -Printer_StageHeaderForSend: ; 84249 (21:4249) - ld a, $1 - ld [wGameboyPrinter2bppSource + 0], a - ld a, [wcbfa] - ld [wGameboyPrinter2bppSource + 1], a - ld a, %11100100 - ld [wGameboyPrinter2bppSource + 2], a - ld a, [wGBPrinterSettings] - ld [wGameboyPrinter2bppSource + 3], a - ret - -Printer_Convert2RowsTo2bpp: ; 84260 (21:4260) - ; de = wPrinterTileMapBuffer + 2 * SCREEN_WIDTH * ([wPrinterQueueLength] - [wPrinterRowIndex]) - ld a, [wPrinterRowIndex] - xor $ff - ld d, a - ld a, [wPrinterQueueLength] - inc a - add d - ld hl, wPrinterTileMapBuffer - ld de, 2 * SCREEN_WIDTH -.loop1 - and a - jr z, .okay1 - add hl, de - dec a - jr .loop1 -.okay1 - ld e, l - ld d, h - ld hl, wGameboyPrinter2bppSource - ld c, 2 * SCREEN_WIDTH -.loop2 - ld a, [de] - inc de - push bc - push de - push hl - ; convert tile index to vram address - swap a - ld d, a - and $f0 - ld e, a - ld a, d - and $f - ld d, a - and $8 - ld a, d - jr nz, .vtiles_8xxx - or $90 - jr .got_vtile_addr - -.vtiles_8xxx - or $80 -.got_vtile_addr - ld d, a - ; copy 1 vtile to hl - lb bc, BANK(Printer_Convert2RowsTo2bpp), 1 - call Request2bpp - pop hl - ld de, 1 tiles - add hl, de - pop de - pop bc - dec c - jr nz, .loop2 - ret - -Printer_ByteFill: ; 842ab - push de - ld e, a -.loop - ld [hl], e - inc hl - dec bc - ld a, c - or b - jr nz, .loop - ld a, e - pop de - ret -; 842b7 - -PrinterDataPacket1: - db 1, 0, $00, 0 - dw 1 -PrinterDataPacket2: - db 2, 0, $04, 0 - dw 0 -PrinterDataPacket3: - db 4, 0, $80, 2 - dw 0 -PrinterDataPacket4: - db 4, 0, $00, 0 - dw 4 -PrinterDataPacket5: ; unused - db 8, 0, $00, 0 - dw 8 -PrinterDataPacket6: ; unused - db 15, 0, $00, 0 - dw 15 -; 842db - -_PrinterReceive:: ; 842db - ld a, [wPrinterOpcode] - add a - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 842ea - -.Jumptable: ; 842ea (21:42ea) - dw Printer_DoNothing ; 00 - - dw Printer_Send0x33 ; 01 - dw Printer_SendPrinterData1 ; 02 - dw Printer_SendPrinterData2 ; 03 - dw Printer_SendPrinterData3 ; 04 - dw Printer_SendPrinterData4 ; 05 - dw Printer_SendNextByte ; 06 - dw Printer_SendwPrinterChecksumLo ; 07 - dw Printer_SendwPrinterChecksumHi ; 08 - dw Printer_Send0x00 ; 09 - dw Printer_ReceiveTowPrinterHandshakeAndSend0x00 ; 0a - dw Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop ; 0b - - dw Printer_Send0x33 ; 0c triggered by AskSerial - dw Printer_Send0x0f ; 0d - dw Printer_Send0x00_ ; 0e - dw Printer_Send0x00_ ; 0f - dw Printer_Send0x00_ ; 10 - dw Printer_Send0x0f ; 11 - dw Printer_Send0x00_ ; 12 - dw Printer_Send0x00 ; 13 - dw Printer_ReceiveTowPrinterHandshakeAndSend0x00 ; 14 - dw Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop_ ; 15 - - dw Printer_Send0x33 ; 16 triggered by pressing B - dw Printer_Send0x08 ; 17 - dw Printer_Send0x00_ ; 18 - dw Printer_Send0x00_ ; 19 - dw Printer_Send0x00_ ; 1a - dw Printer_Send0x08 ; 1b - dw Printer_Send0x00_ ; 1c - dw Printer_Send0x00 ; 1d - dw Printer_ReceiveTowPrinterHandshakeAndSend0x00 ; 1e - dw Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop ; 1f - -Printer_NextInstruction: ; 8432a (21:432a) - ld hl, wPrinterOpcode - inc [hl] - ret - -Printer_DoNothing: ; 8432f (21:432f) - ret - -Printer_Send0x33: ; 84330 (21:4330) - ld a, $33 - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_SendPrinterData1: ; 84339 (21:4339) - ld a, [wPrinterData] - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_SendPrinterData2: ; 84343 (21:4343) - ld a, [wPrinterData + 1] - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_SendPrinterData3: ; 8434d (21:434d) - ld a, [wPrinterData + 2] - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_SendPrinterData4: ; 84357 (21:4357) - ld a, [wPrinterData + 3] - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_SendNextByte: ; 84361 (21:4361) - ; decrement 16-bit counter - ld hl, wPrinterSendByteCounter - ld a, [hli] - ld d, [hl] - ld e, a - or d - jr z, .done - dec de - ld [hl], d - dec hl - ld [hl], e - - ld a, [wPrinterSendByteOffset] - ld e, a - ld a, [wPrinterSendByteOffset + 1] - ld d, a - ld hl, wGameboyPrinterRAM - add hl, de - inc de - ld a, e - ld [wPrinterSendByteOffset], a - ld a, d - ld [wPrinterSendByteOffset + 1], a - ld a, [hl] - call Printer_SerialSend - ret - -.done - call Printer_NextInstruction -Printer_SendwPrinterChecksumLo: ; 8438b (21:438b) - ld a, [wPrinterChecksum] - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_SendwPrinterChecksumHi: ; 84395 (21:4395) - ld a, [wPrinterChecksum + 1] - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_Send0x00: ; 8439f (21:439f) - ld a, $0 - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_ReceiveTowPrinterHandshakeAndSend0x00: ; 843a8 (21:43a8) - ld a, [rSB] - ld [wPrinterHandshake], a - ld a, $0 - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop: ; 843b6 (21:43b6) - ld a, [rSB] - ld [wPrinterStatusFlags], a - xor a - ld [wPrinterOpcode], a - ret - -Printer_Send0x0f: ; 843c0 (21:43c0) - ld a, $f - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_Send0x00_: ; 843c9 (21:43c9) - ld a, $0 - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_Send0x08: ; 843d2 (21:43d2) - ld a, $8 - call Printer_SerialSend - call Printer_NextInstruction - ret - -Printer_SerialSend: ; 843db (21:43db) - ld [rSB], a - ld a, $1 ; switch to internal clock - ld [rSC], a - ld a, $81 ; start transfer - ld [rSC], a - ret - -Printer_ReceiveTowPrinterStatusFlagsAndExitSendLoop_: ; 843e6 (21:43e6) - ld a, [rSB] - ld [wPrinterStatusFlags], a - xor a - ld [wPrinterOpcode], a - ret diff --git a/engine/printnum.asm b/engine/printnum.asm deleted file mode 100755 index fec798d5c..000000000 --- a/engine/printnum.asm +++ /dev/null @@ -1,300 +0,0 @@ -_PrintNum:: ; c4c7 -; Print c digits of the b-byte value from de to hl. -; Allows 2 to 7 digits. For 1-digit numbers, add -; the value to char "0" instead of calling PrintNum. -; Some extra flags can be given in bits 5-7 of b. -; Bit 5: money if set (unless left-aligned without leading zeros) -; Bit 6: right-aligned if set -; Bit 7: print leading zeros if set - - push bc - - bit 5, b - jr z, .main - bit 7, b - jr nz, .moneyflag - bit 6, b - jr z, .main - -.moneyflag ; 101xxxxx or 011xxxxx - ld a, "¥" - ld [hli], a - res 5, b ; 100xxxxx or 010xxxxx - -.main - xor a - ld [hPrintNum1], a - ld [hPrintNum2], a - ld [hPrintNum3], a - ld a, b - and $f - cp 1 - jr z, .byte - cp 2 - jr z, .word -; maximum 3 bytes -.long - ld a, [de] - ld [hPrintNum2], a - inc de - ld a, [de] - ld [hPrintNum3], a - inc de - ld a, [de] - ld [hPrintNum4], a - jr .start - -.word - ld a, [de] - ld [hPrintNum3], a - inc de - ld a, [de] - ld [hPrintNum4], a - jr .start - -.byte - ld a, [de] - ld [hPrintNum4], a - -.start - push de - - ld d, b - ld a, c - swap a - and $f - ld e, a - ld a, c - and $f - ld b, a - ld c, 0 - cp 2 - jr z, .two - cp 3 - jr z, .three - cp 4 - jr z, .four - cp 5 - jr z, .five - cp 6 - jr z, .six - -.seven - ld a, HIGH(1000000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(1000000) ; mid - ld [hPrintNum6], a - ld a, LOW(1000000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.six - ld a, HIGH(100000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(100000) ; mid - ld [hPrintNum6], a - ld a, LOW(100000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.five - xor a ; HIGH(10000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(10000) ; mid - ld [hPrintNum6], a - ld a, LOW(10000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.four - xor a ; HIGH(1000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(1000) ; mid - ld [hPrintNum6], a - ld a, LOW(1000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.three - xor a ; HIGH(100 >> 8) - ld [hPrintNum5], a - xor a ; HIGH(100) ; mid - ld [hPrintNum6], a - ld a, LOW(100) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.two - dec e - jr nz, .two_skip - ld a, "0" - ld [hPrintNum1], a -.two_skip - - ld c, 0 - ld a, [hPrintNum4] -.mod_10 - cp 10 - jr c, .modded_10 - sub 10 - inc c - jr .mod_10 -.modded_10 - - ld b, a - ld a, [hPrintNum1] - or c - jr nz, .money - call .PrintLeadingZero - jr .money_leading_zero - -.money - call .PrintYen - push af - ld a, "0" - add c - ld [hl], a - pop af - ld [hPrintNum1], a - inc e - dec e - jr nz, .money_leading_zero - inc hl - ld [hl], "" - -.money_leading_zero - call .AdvancePointer - call .PrintYen - ld a, "0" - add b - ld [hli], a - - pop de - pop bc - ret - -.PrintYen: ; c5ba - push af - ld a, [hPrintNum1] - and a - jr nz, .stop - bit 5, d - jr z, .stop - ld a, "¥" - ld [hli], a - res 5, d - -.stop - pop af - ret - -.PrintDigit: ; c5cb (3:45cb) - dec e - jr nz, .ok - ld a, "0" - ld [hPrintNum1], a -.ok - ld c, 0 -.loop - ld a, [hPrintNum5] - ld b, a - ld a, [hPrintNum2] - ld [hPrintNum8], a - cp b - jr c, .skip1 - sub b - ld [hPrintNum2], a - ld a, [hPrintNum6] - ld b, a - ld a, [hPrintNum3] - ld [hPrintNum9], a - cp b - jr nc, .skip2 - ld a, [hPrintNum2] - or 0 - jr z, .skip3 - dec a - ld [hPrintNum2], a - ld a, [hPrintNum3] -.skip2 - sub b - ld [hPrintNum3], a - ld a, [hPrintNum7] - ld b, a - ld a, [hPrintNum4] - ld [hPrintNum10], a - cp b - jr nc, .skip4 - ld a, [hPrintNum3] - and a - jr nz, .skip5 - ld a, [hPrintNum2] - and a - jr z, .skip6 - dec a - ld [hPrintNum2], a - xor a -.skip5 - dec a - ld [hPrintNum3], a - ld a, [hPrintNum4] -.skip4 - sub b - ld [hPrintNum4], a - inc c - jr .loop -.skip6 - ld a, [hPrintNum9] - ld [hPrintNum3], a -.skip3 - ld a, [hPrintNum8] - ld [hPrintNum2], a -.skip1 - ld a, [hPrintNum1] - or c - jr z, .PrintLeadingZero - ld a, [hPrintNum1] - and a - jr nz, .done - bit 5, d - jr z, .done - ld a, "¥" - ld [hli], a - res 5, d -.done - ld a, "0" - add c - ld [hl], a - ld [hPrintNum1], a - inc e - dec e - ret nz - inc hl - ld [hl], "" - ret - -.PrintLeadingZero: ; c644 -; prints a leading zero unless they are turned off in the flags - bit 7, d ; print leading zeroes? - ret z - ld [hl], "0" - ret - -.AdvancePointer: ; c64a -; increments the pointer unless leading zeroes are not being printed, -; the number is left-aligned, and no nonzero digits have been printed yet - bit 7, d ; print leading zeroes? - jr nz, .inc - bit 6, d ; left alignment or right alignment? - jr z, .inc - ld a, [hPrintNum1] - and a - ret z -.inc - inc hl - ret diff --git a/engine/radio.asm b/engine/radio.asm deleted file mode 100644 index ffaef80f0..000000000 --- a/engine/radio.asm +++ /dev/null @@ -1,1932 +0,0 @@ -PlayRadioShow: -; If we're already in the radio program proper, we don't need to be here. - ld a, [wCurrentRadioLine] - cp POKE_FLUTE_RADIO - jr nc, .ok -; If Team Rocket is not occupying the radio tower, we don't need to be here. - ld a, [wStatusFlags2] - bit STATUSFLAGS2_ROCKETS_IN_RADIO_TOWER_F, a - jr z, .ok -; If we're in Kanto, we don't need to be here. - call IsInJohto - and a - jr nz, .ok -; Team Rocket broadcasts on all stations. - ld a, ROCKET_RADIO - ld [wCurrentRadioLine], a -.ok -; Jump to the currently loaded station. The index to which we need to jump is in wCurrentRadioLine. - ld a, [wCurrentRadioLine] - ld e, a - ld d, 0 - ld hl, RadioJumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -RadioJumptable: -; entries correspond to constants/radio_constants.asm - dw OaksPKMNTalk1 ; $00 - dw PokedexShow1 ; $01 - dw BenMonMusic1 ; $02 - dw LuckyNumberShow1 ; $03 - dw BuenasPassword1 ; $04 - dw PeoplePlaces1 ; $05 - dw FernMonMusic1 ; $06 - dw RocketRadio1 ; $07 - dw PokeFluteRadio ; $08 - dw UnownRadio ; $09 - dw EvolutionRadio ; $0a -; OaksPKMNTalk - dw OaksPKMNTalk2 ; $0b - dw OaksPKMNTalk3 ; $0c - dw OaksPKMNTalk4 ; $0d - dw OaksPKMNTalk5 ; $0e - dw OaksPKMNTalk6 ; $0f - dw OaksPKMNTalk7 ; $10 - dw OaksPKMNTalk8 ; $11 - dw OaksPKMNTalk9 ; $12 - dw PokedexShow2 ; $13 - dw PokedexShow3 ; $14 - dw PokedexShow4 ; $15 - dw PokedexShow5 ; $16 -; Ben Music - dw BenMonMusic2 ; $17 - dw BenMonMusic3 ; $18 - dw BenFernMusic4 ; $19 - dw BenFernMusic5 ; $1a - dw BenFernMusic6 ; $1b - dw BenFernMusic7 ; $1c - dw FernMonMusic2 ; $1d -; Lucky Number Show - dw LuckyNumberShow2 ; $1e - dw LuckyNumberShow3 ; $1f - dw LuckyNumberShow4 ; $20 - dw LuckyNumberShow5 ; $21 - dw LuckyNumberShow6 ; $22 - dw LuckyNumberShow7 ; $23 - dw LuckyNumberShow8 ; $24 - dw LuckyNumberShow9 ; $25 - dw LuckyNumberShow10 ; $26 - dw LuckyNumberShow11 ; $27 - dw LuckyNumberShow12 ; $28 - dw LuckyNumberShow13 ; $29 - dw LuckyNumberShow14 ; $2a - dw LuckyNumberShow15 ; $2b -; People & Places - dw PeoplePlaces2 ; $2c - dw PeoplePlaces3 ; $2d - dw PeoplePlaces4 ; $2e - dw PeoplePlaces5 ; $2f - dw PeoplePlaces6 ; $30 - dw PeoplePlaces7 ; $31 -; Rocket Radio - dw RocketRadio2 ; $32 - dw RocketRadio3 ; $33 - dw RocketRadio4 ; $34 - dw RocketRadio5 ; $35 - dw RocketRadio6 ; $36 - dw RocketRadio7 ; $37 - dw RocketRadio8 ; $38 - dw RocketRadio9 ; $39 - dw RocketRadio10 ; $3a -; More Pokemon Channel stuff - dw OaksPKMNTalk10 ; $3b - dw OaksPKMNTalk11 ; $3c - dw OaksPKMNTalk12 ; $3d - dw OaksPKMNTalk13 ; $3e - dw OaksPKMNTalk14 ; $3f -; Buenas Password - dw BuenasPassword2 ; $40 - dw BuenasPassword3 ; $41 - dw BuenasPassword4 ; $42 - dw BuenasPassword5 ; $43 - dw BuenasPassword6 ; $44 - dw BuenasPassword7 ; $45 - dw BuenasPassword8 ; $46 - dw BuenasPassword9 ; $47 - dw BuenasPassword10 ; $48 - dw BuenasPassword11 ; $49 - dw BuenasPassword12 ; $4a - dw BuenasPassword13 ; $4b - dw BuenasPassword14 ; $4c - dw BuenasPassword15 ; $4d - dw BuenasPassword16 ; $4e - dw BuenasPassword17 ; $4f - dw BuenasPassword18 ; $50 - dw BuenasPassword19 ; $51 - dw BuenasPassword20 ; $52 - dw BuenasPassword21 ; $53 - dw RadioScroll ; $54 -; More Pokemon Channel stuff - dw PokedexShow6 ; $55 - dw PokedexShow7 ; $56 - dw PokedexShow8 ; $57 - - -PrintRadioLine: - ld [wNextRadioLine], a - ld hl, wRadioText - ld a, [wNumRadioLinesPrinted] - cp 2 - jr nc, .print - inc hl - ld [hl], TX_START - inc a - ld [wNumRadioLinesPrinted], a - cp 2 - jr nz, .print - bccoord 1, 16 - call PlaceHLTextAtBC - jr .skip -.print - call PrintTextBoxText -.skip - ld a, RADIO_SCROLL - ld [wCurrentRadioLine], a - ld a, 100 - ld [wRadioTextDelay], a - ret - -ReplacePeriodsWithSpaces: - push hl - ld b, SCREEN_WIDTH * 2 -.loop - ld a, [hl] - cp "." - jr nz, .next - ld [hl], " " - -.next - inc hl - dec b - jr nz, .loop - pop hl - ret - -RadioScroll: - ld hl, wRadioTextDelay - ld a, [hl] - and a - jr z, .proceed - dec [hl] - ret -.proceed - ld a, [wNextRadioLine] - ld [wCurrentRadioLine], a - ld a, [wNumRadioLinesPrinted] - cp 1 - call nz, CopyBottomLineToTopLine - jp ClearBottomLine - -OaksPKMNTalk1: - ld a, 5 - ld [wOaksPKMNTalkSegmentCounter], a - call StartRadioStation - ld hl, OPT_IntroText1 - ld a, OAKS_POKEMON_TALK_2 - jp NextRadioLine - -OaksPKMNTalk2: - ld hl, OPT_IntroText2 - ld a, OAKS_POKEMON_TALK_3 - jp NextRadioLine - -OaksPKMNTalk3: - ld hl, OPT_IntroText3 - ld a, OAKS_POKEMON_TALK_4 - jp NextRadioLine - -OaksPKMNTalk4: -; Choose a random route, and a random Pokemon from that route. -.sample - call Random - and %11111 - cp (OaksPKMNTalkRoutes.End - OaksPKMNTalkRoutes) / 2 - jr nc, .sample - ; We now have a number between 0 and 14. - ld hl, OaksPKMNTalkRoutes - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld b, [hl] - inc hl - ld c, [hl] - ; bc now contains the chosen map's group and number indices. - push bc - - ; Search the JohtoGrassWildMons array for the chosen map. - ld hl, JohtoGrassWildMons -.loop - ld a, BANK(JohtoGrassWildMons) - call GetFarByte - cp -1 - jr z, .overflow - inc hl - cp b - jr nz, .next - ld a, BANK(JohtoGrassWildMons) - call GetFarByte - cp c - jr z, .done -.next - dec hl - ld de, GRASS_WILDDATA_LENGTH - add hl, de - jr .loop - -.done - ; Point hl to the list of morning Pokémon., skipping percentages -rept 4 - inc hl -endr - ; Generate a number, either 0, 1, or 2, to choose a time of day. -.loop2 - call Random - maskbits NUM_DAYTIMES - cp DARKNESS_F - jr z, .loop2 - - ld bc, 2 * NUM_GRASSMON - call AddNTimes -.loop3 - ; Choose one of the middle three Pokemon. - call Random - and NUM_GRASSMON - cp 2 - jr c, .loop3 - cp 5 - jr nc, .loop3 - ld e, a - ld d, 0 - add hl, de - add hl, de - inc hl ; skip level - ld a, BANK(JohtoGrassWildMons) - call GetFarByte - ld [wNamedObjectIndexBuffer], a - ld [wCurPartySpecies], a - call GetPokemonName - ld hl, wStringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - - ; Now that we've chosen our wild Pokemon, - ; let's recover the map index info and get its name. - pop bc - call GetWorldMapLocation - ld e, a - farcall GetLandmarkName - ld hl, OPT_OakText1 - call CopyRadioTextToRAM - ld a, OAKS_POKEMON_TALK_5 - jp PrintRadioLine - -.overflow - pop bc - ld a, OAKS_POKEMON_TALK - jp PrintRadioLine - -INCLUDE "data/radio/oaks_pkmn_talk_routes.asm" - -OaksPKMNTalk5: - ld hl, OPT_OakText2 - ld a, OAKS_POKEMON_TALK_6 - jp NextRadioLine - -OaksPKMNTalk6: - ld hl, OPT_OakText3 - ld a, OAKS_POKEMON_TALK_7 - jp NextRadioLine - -OPT_IntroText1: - ; MARY: PROF.OAK'S - text_jump _OPT_IntroText1 - db "@" - -OPT_IntroText2: - ; #MON TALK! - text_jump _OPT_IntroText2 - db "@" - -OPT_IntroText3: - ; With me, MARY! - text_jump _OPT_IntroText3 - db "@" - -OPT_OakText1: - ; OAK: @ @ - text_jump _OPT_OakText1 - db "@" - -OPT_OakText2: - ; may be seen around - text_jump _OPT_OakText2 - db "@" - -OPT_OakText3: - ; @ . - text_jump _OPT_OakText3 - db "@" - -OaksPKMNTalk7: - ld a, [wCurPartySpecies] - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - ld hl, OPT_MaryText1 - ld a, OAKS_POKEMON_TALK_8 - jp NextRadioLine - -OPT_MaryText1: - ; MARY: @ 's - text_jump _OPT_MaryText1 - db "@" - -OaksPKMNTalk8: - ; 0-15 are all valid indexes into .Adverbs, - ; so no need for a retry loop - call Random - maskbits NUM_OAKS_POKEMON_TALK_ADVERBS - ld e, a - ld d, 0 - ld hl, .Adverbs - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld a, OAKS_POKEMON_TALK_9 - jp NextRadioLine - -.Adverbs: -; there are NUM_OAKS_POKEMON_TALK_ADVERBS entries - dw .sweetadorably - dw .wigglyslickly - dw .aptlynamed - dw .undeniablykindof - dw .unbearably - dw .wowimpressively - dw .almostpoisonously - dw .sensually - dw .mischievously - dw .topically - dw .addictively - dw .looksinwater - dw .evolutionmustbe - dw .provocatively - dw .flippedout - dw .heartmeltingly - -.sweetadorably - ; sweet and adorably - text_jump OPT_SweetAdorably - db "@" - -.wigglyslickly - ; wiggly and slickly - text_jump OPT_WigglySlickly - db "@" - -.aptlynamed - ; aptly named and - text_jump OPT_AptlyNamed - db "@" - -.undeniablykindof - ; undeniably kind of - text_jump OPT_UndeniablyKindOf - db "@" - -.unbearably - ; so, so unbearably - text_jump OPT_Unbearably - db "@" - -.wowimpressively - ; wow, impressively - text_jump OPT_WowImpressively - db "@" - -.almostpoisonously - ; almost poisonously - text_jump OPT_AlmostPoisonously - db "@" - -.sensually - ; ooh, so sensually - text_jump OPT_Sensually - db "@" - -.mischievously - ; so mischievously - text_jump OPT_Mischievously - db "@" - -.topically - ; so very topically - text_jump OPT_Topically - db "@" - -.addictively - ; sure addictively - text_jump OPT_Addictively - db "@" - -.looksinwater - ; looks in water is - text_jump OPT_LooksInWater - db "@" - -.evolutionmustbe - ; evolution must be - text_jump OPT_EvolutionMustBe - db "@" - -.provocatively - ; provocatively - text_jump OPT_Provocatively - db "@" - -.flippedout - ; so flipped out and - text_jump OPT_FlippedOut - db "@" - -.heartmeltingly - ; heart-meltingly - text_jump OPT_HeartMeltingly - db "@" - -OaksPKMNTalk9: - ; 0-15 are all valid indexes into .Adjectives, - ; so no need for a retry loop - call Random - maskbits NUM_OAKS_POKEMON_TALK_ADJECTIVES - ld e, a - ld d, 0 - ld hl, .Adjectives - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wOaksPKMNTalkSegmentCounter] - dec a - ld [wOaksPKMNTalkSegmentCounter], a - ld a, OAKS_POKEMON_TALK_4 - jr nz, .ok - ld a, 5 - ld [wOaksPKMNTalkSegmentCounter], a - ld a, OAKS_POKEMON_TALK_10 -.ok - jp NextRadioLine - -.Adjectives: -; there are NUM_OAKS_POKEMON_TALK_ADJECTIVES entries - dw .cute - dw .weird - dw .pleasant - dw .boldsortof - dw .frightening - dw .suavedebonair - dw .powerful - dw .exciting - dw .groovy - dw .inspiring - dw .friendly - dw .hothothot - dw .stimulating - dw .guarded - dw .lovely - dw .speedy - -.cute - ; cute. - text_jump OPT_Cute - db "@" - -.weird - ; weird. - text_jump OPT_Weird - db "@" - -.pleasant - ; pleasant. - text_jump OPT_Pleasant - db "@" - -.boldsortof - ; bold, sort of. - text_jump OPT_BoldSortOf - db "@" - -.frightening - ; frightening. - text_jump OPT_Frightening - db "@" - -.suavedebonair - ; suave & debonair! - text_jump OPT_SuaveDebonair - db "@" - -.powerful - ; powerful. - text_jump OPT_Powerful - db "@" - -.exciting - ; exciting. - text_jump OPT_Exciting - db "@" - -.groovy - ; groovy! - text_jump OPT_Groovy - db "@" - -.inspiring - ; inspiring. - text_jump OPT_Inspiring - db "@" - -.friendly - ; friendly. - text_jump OPT_Friendly - db "@" - -.hothothot - ; hot, hot, hot! - text_jump OPT_HotHotHot - db "@" - -.stimulating - ; stimulating. - text_jump OPT_Stimulating - db "@" - -.guarded - ; guarded. - text_jump OPT_Guarded - db "@" - -.lovely - ; lovely. - text_jump OPT_Lovely - db "@" - -.speedy - ; speedy. - text_jump OPT_Speedy - db "@" - -OaksPKMNTalk10: - farcall RadioMusicRestartPokemonChannel - ld hl, OPT_RestartText - call PrintText - call WaitBGMap - ld hl, OPT_PokemonChannelText - call PrintText - ld a, OAKS_POKEMON_TALK_11 - ld [wCurrentRadioLine], a - ld a, 100 - ld [wRadioTextDelay], a - ret - -OPT_PokemonChannelText: - ; #MON - text_jump _OPT_PokemonChannelText - db "@" - -OPT_RestartText: - db "@" - -OaksPKMNTalk11: - ld hl, wRadioTextDelay - dec [hl] - ret nz - hlcoord 9, 14 - ld de, .pokemon_string - ld a, OAKS_POKEMON_TALK_12 - jp PlaceRadioString - -.pokemon_string - db "#MON@" - -OaksPKMNTalk12: - ld hl, wRadioTextDelay - dec [hl] - ret nz - hlcoord 1, 16 - ld de, .pokemon_channel_string - ld a, OAKS_POKEMON_TALK_13 - jp PlaceRadioString - -.pokemon_channel_string - db "#MON Channel@" - -OaksPKMNTalk13: - ld hl, wRadioTextDelay - dec [hl] - ret nz - hlcoord 12, 16 - ld de, .terminator - ld a, OAKS_POKEMON_TALK_14 - jp PlaceRadioString - -.terminator - db "@" - -OaksPKMNTalk14: - ld hl, wRadioTextDelay - dec [hl] - ret nz - ld de, MUSIC_POKEMON_TALK - callfar RadioMusicRestartDE - ld hl, .terminator - call PrintText - ld a, OAKS_POKEMON_TALK_4 - ld [wNextRadioLine], a - xor a - ld [wNumRadioLinesPrinted], a - ld a, RADIO_SCROLL - ld [wCurrentRadioLine], a - ld a, 10 - ld [wRadioTextDelay], a - ret - -.terminator - db "@" - -PlaceRadioString: - ld [wCurrentRadioLine], a - ld a, 100 - ld [wRadioTextDelay], a - jp PlaceString - -CopyBottomLineToTopLine: - hlcoord 0, 15 - decoord 0, 13 - ld bc, SCREEN_WIDTH * 2 - jp CopyBytes - -ClearBottomLine: - hlcoord 1, 15 - ld bc, SCREEN_WIDTH - 2 - ld a, " " - call ByteFill - hlcoord 1, 16 - ld bc, SCREEN_WIDTH - 2 - ld a, " " - jp ByteFill - -PokedexShow_GetDexEntryBank: - push hl - push de - ld a, [wCurPartySpecies] - dec a - rlca - rlca - maskbits NUM_DEX_ENTRY_BANKS - ld hl, .PokedexEntryBanks - ld d, 0 - ld e, a - add hl, de - ld a, [hl] - pop de - pop hl - ret - -.PokedexEntryBanks: - db BANK(PokedexEntries1) - db BANK(PokedexEntries2) - db BANK(PokedexEntries3) - db BANK(PokedexEntries4) - -PokedexShow1: - call StartRadioStation -.loop - call Random - cp NUM_POKEMON - jr nc, .loop - ld c, a - push bc - ld a, c - call CheckCaughtMon - pop bc - jr z, .loop - inc c - ld a, c - ld [wCurPartySpecies], a - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - ld hl, PokedexShowText - ld a, POKEDEX_SHOW_2 - jp NextRadioLine - -PokedexShow2: - ld a, [wCurPartySpecies] - dec a - ld hl, PokedexDataPointerTable - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld a, BANK(PokedexDataPointerTable) - call GetFarHalfword - call PokedexShow_GetDexEntryBank - push af - push hl - call CopyDexEntryPart1 - dec hl - ld [hl], "" - ld hl, wPokedexShowPointerAddr - call CopyRadioTextToRAM - pop hl - pop af - call CopyDexEntryPart2 -rept 4 - inc hl -endr - ld a, l - ld [wPokedexShowPointerAddr], a - ld a, h - ld [wPokedexShowPointerAddr + 1], a - ld a, POKEDEX_SHOW_3 - jp PrintRadioLine - -PokedexShow3: - call CopyDexEntry - ld a, POKEDEX_SHOW_4 - jp PrintRadioLine - -PokedexShow4: - call CopyDexEntry - ld a, POKEDEX_SHOW_5 - jp PrintRadioLine - -PokedexShow5: - call CopyDexEntry - ld a, POKEDEX_SHOW_6 - jp PrintRadioLine - -PokedexShow6: - call CopyDexEntry - ld a, POKEDEX_SHOW_7 - jp PrintRadioLine - -PokedexShow7: - call CopyDexEntry - ld a, POKEDEX_SHOW_8 - jp PrintRadioLine - -PokedexShow8: - call CopyDexEntry - ld a, POKEDEX_SHOW - jp PrintRadioLine - -CopyDexEntry: - ld a, [wPokedexShowPointerAddr] - ld l, a - ld a, [wPokedexShowPointerAddr + 1] - ld h, a - ld a, [wPokedexShowPointerBank] - push af - push hl - call CopyDexEntryPart1 - dec hl - ld [hl], "" - ld hl, wPokedexShowPointerAddr - call CopyRadioTextToRAM - pop hl - pop af - call CopyDexEntryPart2 - ret - -CopyDexEntryPart1: - ld de, wPokedexShowPointerBank - ld bc, SCREEN_WIDTH - 1 - call FarCopyBytes - ld hl, wPokedexShowPointerAddr - ld [hl], TX_START - inc hl - ld [hl], "" - inc hl -.loop - ld a, [hli] - cp "@" - ret z - cp "" - ret z - cp "" - ret z - jr .loop - -CopyDexEntryPart2: - ld d, a -.loop - ld a, d - call GetFarByte - inc hl - cp "@" - jr z, .okay - cp "" - jr z, .okay - cp "" - jr nz, .loop -.okay - ld a, l - ld [wPokedexShowPointerAddr], a - ld a, h - ld [wPokedexShowPointerAddr + 1], a - ld a, d - ld [wPokedexShowPointerBank], a - ret - -PokedexShowText: - ; @ @ - text_jump _PokedexShowText - db "@" - -BenMonMusic1: - call StartPokemonMusicChannel - ld hl, BenIntroText1 - ld a, POKEMON_MUSIC_2 - jp NextRadioLine - -BenMonMusic2: - ld hl, BenIntroText2 - ld a, POKEMON_MUSIC_3 - jp NextRadioLine - -BenMonMusic3: - ld hl, BenIntroText3 - ld a, POKEMON_MUSIC_4 - jp NextRadioLine - -FernMonMusic1: - call StartPokemonMusicChannel - ld hl, FernIntroText1 - ld a, LETS_ALL_SING_2 - jp NextRadioLine - -FernMonMusic2: - ld hl, FernIntroMusic2 - ld a, POKEMON_MUSIC_4 - jp NextRadioLine - -BenFernMusic4: - ld hl, BenFernText1 - ld a, POKEMON_MUSIC_5 - jp NextRadioLine - -BenFernMusic5: - call GetWeekday - and 1 - ld hl, BenFernText2A - jr z, .SunTueThurSun - ld hl, BenFernText2B -.SunTueThurSun: - ld a, POKEMON_MUSIC_6 - jp NextRadioLine - -BenFernMusic6: - call GetWeekday - and 1 - ld hl, BenFernText3A - jr z, .SunTueThurSun - ld hl, BenFernText3B -.SunTueThurSun: - ld a, POKEMON_MUSIC_7 - jp NextRadioLine - -BenFernMusic7: - ret - -StartPokemonMusicChannel: - call RadioTerminator - call PrintText - ld de, MUSIC_POKEMON_MARCH - call GetWeekday - and 1 - jr z, .SunTueThurSun - ld de, MUSIC_POKEMON_LULLABY -.SunTueThurSun: - callfar RadioMusicRestartDE - ret - -BenIntroText1: - ; BEN: #MON MUSIC - text_jump _BenIntroText1 - db "@" - -BenIntroText2: - ; CHANNEL! - text_jump _BenIntroText2 - db "@" - -BenIntroText3: - ; It's me, DJ BEN! - text_jump _BenIntroText3 - db "@" - -FernIntroText1: - ; FERN: #MUSIC! - text_jump _FernIntroText1 - db "@" - -FernIntroMusic2: - ; With DJ FERN! - text_jump _FernIntroText2 - db "@" - -BenFernText1: - ; Today's @ , - text_jump _BenFernText1 - db "@" - -BenFernText2A: - ; so let us jam to - text_jump _BenFernText2A - db "@" - -BenFernText2B: - ; so chill out to - text_jump _BenFernText2B - db "@" - -BenFernText3A: - ; #MON March! - text_jump _BenFernText3A - db "@" - -BenFernText3B: - ; #MON Lullaby! - text_jump _BenFernText3B - db "@" - -LuckyNumberShow1: - call StartRadioStation - callfar CheckLuckyNumberShowFlag - jr nc, .dontreset - callfar ResetLuckyNumberShowFlag -.dontreset - ld hl, LC_Text1 - ld a, LUCKY_NUMBER_SHOW_2 - jp NextRadioLine - -LuckyNumberShow2: - ld hl, LC_Text2 - ld a, LUCKY_NUMBER_SHOW_3 - jp NextRadioLine - -LuckyNumberShow3: - ld hl, LC_Text3 - ld a, LUCKY_NUMBER_SHOW_4 - jp NextRadioLine - -LuckyNumberShow4: - ld hl, LC_Text4 - ld a, LUCKY_NUMBER_SHOW_5 - jp NextRadioLine - -LuckyNumberShow5: - ld hl, LC_Text5 - ld a, LUCKY_NUMBER_SHOW_6 - jp NextRadioLine - -LuckyNumberShow6: - ld hl, LC_Text6 - ld a, LUCKY_NUMBER_SHOW_7 - jp NextRadioLine - -LuckyNumberShow7: - ld hl, LC_Text7 - ld a, LUCKY_NUMBER_SHOW_8 - jp NextRadioLine - -LuckyNumberShow8: - ld hl, wStringBuffer1 - ld de, wLuckyIDNumber - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - ld a, "@" - ld [wStringBuffer1 + 5], a - ld hl, LC_Text8 - ld a, LUCKY_NUMBER_SHOW_9 - jp NextRadioLine - -LuckyNumberShow9: - ld hl, LC_Text9 - ld a, LUCKY_NUMBER_SHOW_10 - jp NextRadioLine - -LuckyNumberShow10: - ld hl, LC_Text7 - ld a, LUCKY_NUMBER_SHOW_11 - jp NextRadioLine - -LuckyNumberShow11: - ld hl, LC_Text8 - ld a, LUCKY_NUMBER_SHOW_12 - jp NextRadioLine - -LuckyNumberShow12: - ld hl, LC_Text10 - ld a, LUCKY_NUMBER_SHOW_13 - jp NextRadioLine - -LuckyNumberShow13: - ld hl, LC_Text11 - call Random - and a - ld a, LUCKY_CHANNEL - jr nz, .okay - ld a, LUCKY_NUMBER_SHOW_14 -.okay - jp NextRadioLine - -LuckyNumberShow14: - ld hl, LC_DragText1 - ld a, LUCKY_NUMBER_SHOW_15 - jp NextRadioLine - -LuckyNumberShow15: - ld hl, LC_DragText2 - ld a, LUCKY_CHANNEL - jp NextRadioLine - -LC_Text1: - ; REED: Yeehaw! How - text_jump _LC_Text1 - db "@" - -LC_Text2: - ; y'all doin' now? - text_jump _LC_Text2 - db "@" - -LC_Text3: - ; Whether you're up - text_jump _LC_Text3 - db "@" - -LC_Text4: - ; or way down low, - text_jump _LC_Text4 - db "@" - -LC_Text5: - ; don't you miss the - text_jump _LC_Text5 - db "@" - -LC_Text6: - ; LUCKY NUMBER SHOW! - text_jump _LC_Text6 - db "@" - -LC_Text7: - ; This week's Lucky - text_jump _LC_Text7 - db "@" - -LC_Text8: - ; Number is @ ! - text_jump _LC_Text8 - db "@" - -LC_Text9: - ; I'll repeat that! - text_jump _LC_Text9 - db "@" - -LC_Text10: - ; Match it and go to - text_jump _LC_Text10 - db "@" - -LC_Text11: - ; the RADIO TOWER! - text_jump _LC_Text11 - db "@" - -LC_DragText1: - ; …Repeating myself - text_jump _LC_DragText1 - db "@" - -LC_DragText2: - ; gets to be a drag… - text_jump _LC_DragText2 - db "@" - -PeoplePlaces1: - call StartRadioStation - ld hl, PnP_Text1 - ld a, PLACES_AND_PEOPLE_2 - jp NextRadioLine - -PeoplePlaces2: - ld hl, PnP_Text2 - ld a, PLACES_AND_PEOPLE_3 - jp NextRadioLine - -PeoplePlaces3: - ld hl, PnP_Text3 - call Random - cp 49 percent - 1 - ld a, PLACES_AND_PEOPLE_4 ; People - jr c, .ok - ld a, PLACES_AND_PEOPLE_6 ; Places -.ok - jp NextRadioLine - -PnP_Text1: - ; PLACES AND PEOPLE! - text_jump _PnP_Text1 - db "@" - -PnP_Text2: - ; Brought to you by - text_jump _PnP_Text2 - db "@" - -PnP_Text3: - ; me, DJ LILY! - text_jump _PnP_Text3 - db "@" - -PeoplePlaces4: ; People - call Random - maskbits NUM_TRAINER_CLASSES - inc a - cp NUM_TRAINER_CLASSES - 1 - jr nc, PeoplePlaces4 - push af - ld hl, PnP_HiddenPeople - ld a, [wStatusFlags] - bit STATUSFLAGS_HALL_OF_FAME_F, a - jr z, .ok - ld hl, PnP_HiddenPeople_BeatE4 - ld a, [wKantoBadges] - cp %11111111 ; all badges - jr nz, .ok - ld hl, PnP_HiddenPeople_BeatKanto -.ok - pop af - ld c, a - ld de, 1 - push bc - call IsInArray - pop bc - jr c, PeoplePlaces4 - push bc - callfar GetTrainerClassName - ld de, wStringBuffer1 - call CopyName1 - pop bc - ld b, 1 - callfar GetTrainerName - ld hl, PnP_Text4 - ld a, PLACES_AND_PEOPLE_5 - jp NextRadioLine - -INCLUDE "data/radio/pnp_hidden_people.asm" - -PnP_Text4: - ; @ @ @ - text_jump _PnP_Text4 - db "@" - -PeoplePlaces5: - ; 0-15 are all valid indexes into .Adjectives, - ; so no need for a retry loop - call Random - maskbits NUM_PNP_PEOPLE_ADJECTIVES - ld e, a - ld d, 0 - ld hl, .Adjectives - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call Random - cp 4 percent - ld a, PLACES_AND_PEOPLE - jr c, .ok - call Random - cp 49 percent - 1 - ld a, PLACES_AND_PEOPLE_4 ; People - jr c, .ok - ld a, PLACES_AND_PEOPLE_6 ; Places -.ok - jp NextRadioLine - -.Adjectives: -; there are NUM_PNP_PEOPLE_ADJECTIVES entries - dw PnP_cute - dw PnP_lazy - dw PnP_happy - dw PnP_noisy - dw PnP_precocious - dw PnP_bold - dw PnP_picky - dw PnP_sortofok - dw PnP_soso - dw PnP_great - dw PnP_mytype - dw PnP_cool - dw PnP_inspiring - dw PnP_weird - dw PnP_rightforme - dw PnP_odd - -PnP_cute: - ; is cute. - text_jump _PnP_cute - db "@" - -PnP_lazy: - ; is sort of lazy. - text_jump _PnP_lazy - db "@" - -PnP_happy: - ; is always happy. - text_jump _PnP_happy - db "@" - -PnP_noisy: - ; is quite noisy. - text_jump _PnP_noisy - db "@" - -PnP_precocious: - ; is precocious. - text_jump _PnP_precocious - db "@" - -PnP_bold: - ; is somewhat bold. - text_jump _PnP_bold - db "@" - -PnP_picky: - ; is too picky! - text_jump _PnP_picky - db "@" - -PnP_sortofok: - ; is sort of OK. - text_jump _PnP_sortofok - db "@" - -PnP_soso: - ; is just so-so. - text_jump _PnP_soso - db "@" - -PnP_great: - ; is actually great. - text_jump _PnP_great - db "@" - -PnP_mytype: - ; is just my type. - text_jump _PnP_mytype - db "@" - -PnP_cool: - ; is so cool, no? - text_jump _PnP_cool - db "@" - -PnP_inspiring: - ; is inspiring! - text_jump _PnP_inspiring - db "@" - -PnP_weird: - ; is kind of weird. - text_jump _PnP_weird - db "@" - -PnP_rightforme: - ; is right for me? - text_jump _PnP_rightforme - db "@" - -PnP_odd: - ; is definitely odd! - text_jump _PnP_odd - db "@" - -PeoplePlaces6: ; Places - call Random - cp (PnP_HiddenPlaces.End - PnP_HiddenPlaces) / 2 - jr nc, PeoplePlaces6 - ld hl, PnP_HiddenPlaces - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld b, [hl] - inc hl - ld c, [hl] - call GetWorldMapLocation - ld e, a - farcall GetLandmarkName - ld hl, PnP_Text5 - ld a, PLACES_AND_PEOPLE_7 - jp NextRadioLine - -INCLUDE "data/radio/pnp_hidden_places.asm" - -PnP_Text5: - ; @ @ - text_jump _PnP_Text5 - db "@" - -PeoplePlaces7: - ; 0-15 are all valid indexes into .Adjectives, - ; so no need for a retry loop - call Random - maskbits NUM_PNP_PLACES_ADJECTIVES - ld e, a - ld d, 0 - ld hl, .Adjectives - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call CopyRadioTextToRAM - call Random - cp 4 percent - ld a, PLACES_AND_PEOPLE - jr c, .ok - call Random - cp 49 percent - 1 - ld a, PLACES_AND_PEOPLE_4 ; People - jr c, .ok - ld a, PLACES_AND_PEOPLE_6 ; Places -.ok - jp PrintRadioLine - -.Adjectives: -; there are NUM_PNP_PLACES_ADJECTIVES entries - dw PnP_cute - dw PnP_lazy - dw PnP_happy - dw PnP_noisy - dw PnP_precocious - dw PnP_bold - dw PnP_picky - dw PnP_sortofok - dw PnP_soso - dw PnP_great - dw PnP_mytype - dw PnP_cool - dw PnP_inspiring - dw PnP_weird - dw PnP_rightforme - dw PnP_odd - -RocketRadio1: - call StartRadioStation - ld hl, RocketRadioText1 - ld a, ROCKET_RADIO_2 - jp NextRadioLine - -RocketRadio2: - ld hl, RocketRadioText2 - ld a, ROCKET_RADIO_3 - jp NextRadioLine - -RocketRadio3: - ld hl, RocketRadioText3 - ld a, ROCKET_RADIO_4 - jp NextRadioLine - -RocketRadio4: - ld hl, RocketRadioText4 - ld a, ROCKET_RADIO_5 - jp NextRadioLine - -RocketRadio5: - ld hl, RocketRadioText5 - ld a, ROCKET_RADIO_6 - jp NextRadioLine - -RocketRadio6: - ld hl, RocketRadioText6 - ld a, ROCKET_RADIO_7 - jp NextRadioLine - -RocketRadio7: - ld hl, RocketRadioText7 - ld a, ROCKET_RADIO_8 - jp NextRadioLine - -RocketRadio8: - ld hl, RocketRadioText8 - ld a, ROCKET_RADIO_9 - jp NextRadioLine - -RocketRadio9: - ld hl, RocketRadioText9 - ld a, ROCKET_RADIO_10 - jp NextRadioLine - -RocketRadio10: - ld hl, RocketRadioText10 - ld a, ROCKET_RADIO - jp NextRadioLine - -RocketRadioText1: - ; … …Ahem, we are - text_jump _RocketRadioText1 - db "@" - -RocketRadioText2: - ; TEAM ROCKET! - text_jump _RocketRadioText2 - db "@" - -RocketRadioText3: - ; After three years - text_jump _RocketRadioText3 - db "@" - -RocketRadioText4: - ; of preparation, we - text_jump _RocketRadioText4 - db "@" - -RocketRadioText5: - ; have risen again - text_jump _RocketRadioText5 - db "@" - -RocketRadioText6: - ; from the ashes! - text_jump _RocketRadioText6 - db "@" - -RocketRadioText7: - ; GIOVANNI! @ Can you - text_jump _RocketRadioText7 - db "@" - -RocketRadioText8: - ; hear?@ We did it! - text_jump _RocketRadioText8 - db "@" - -RocketRadioText9: - ; @ Where is our boss? - text_jump _RocketRadioText9 - db "@" - -RocketRadioText10: - ; @ Is he listening? - text_jump _RocketRadioText10 - db "@" - -PokeFluteRadio: - call StartRadioStation - ld a, 1 - ld [wNumRadioLinesPrinted], a - ret - -UnownRadio: - call StartRadioStation - ld a, 1 - ld [wNumRadioLinesPrinted], a - ret - -EvolutionRadio: - call StartRadioStation - ld a, 1 - ld [wNumRadioLinesPrinted], a - ret - -BuenasPassword1: -; Determine if we need to be here - call BuenasPasswordCheckTime - jp nc, .PlayPassword - ld a, [wNumRadioLinesPrinted] - and a - jp z, BuenasPassword20 - jp BuenasPassword8 - -.PlayPassword: - call StartRadioStation - ld a, [hBGMapMode] - push af - xor a - ld [hBGMapMode], a - ld de, BuenasPasswordChannelName - hlcoord 2, 9 - call PlaceString - pop af - ld [hBGMapMode], a - ld hl, BuenaRadioText1 - ld a, BUENAS_PASSWORD_2 - jp NextRadioLine - -BuenasPassword2: - ld hl, BuenaRadioText2 - ld a, BUENAS_PASSWORD_3 - jp NextRadioLine - -BuenasPassword3: - call BuenasPasswordCheckTime - ld hl, BuenaRadioText3 - jp c, BuenasPasswordAfterMidnight - ld a, BUENAS_PASSWORD_4 - jp NextRadioLine - -BuenasPassword4: - call BuenasPasswordCheckTime - jp c, BuenasPassword8 - ld a, [wBuenasPassword] -; If we already generated the password today, we don't need to generate a new one. - ld hl, wWeeklyFlags - bit WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] - jr nz, .AlreadyGotIt -; There are only 11 groups to choose from. -.greater_than_11 - call Random - maskbits NUM_PASSWORD_CATEGORIES - cp NUM_PASSWORD_CATEGORIES - jr nc, .greater_than_11 -; Store it in the high nybble of e. - swap a - ld e, a -; For each group, choose one of the three passwords. -.greater_than_three - call Random - maskbits NUM_PASSWORDS_PER_CATEGORY - cp NUM_PASSWORDS_PER_CATEGORY - jr nc, .greater_than_three -; The high nybble of wBuenasPassword will now contain the password group index, and the low nybble contains the actual password. - add e - ld [wBuenasPassword], a -; Set the flag so that we don't generate a new password this week. - ld hl, wWeeklyFlags - set WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] -.AlreadyGotIt: - ld c, a - call GetBuenasPassword - ld hl, BuenaRadioText4 - ld a, BUENAS_PASSWORD_5 - jp NextRadioLine - -GetBuenasPassword: -; The password indices are held in c. High nybble contains the group index, low nybble contains the word index. -; Load the password group pointer in hl. - ld a, c - swap a - and $f - ld hl, BuenasPasswordTable - ld d, 0 - ld e, a - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a -; Get the password type and store it in b. - ld a, [hli] - ld b, a - push hl - inc hl -; Get the password index. - ld a, c - and $f - ld c, a - push hl - ld hl, .StringFunctionJumpTable - ld e, b - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - pop de ; de now contains the pointer to the value of this week's password, in Blue Card Points. - call _hl_ - pop hl - ld c, [hl] - ret - -.StringFunctionJumpTable: -; entries correspond to BUENA_* constants - dw .Mon ; BUENA_MON - dw .Item ; BUENA_ITEM - dw .Move ; BUENA_MOVE - dw .RawString ; BUENA_STRING - -.Mon: - call .GetTheIndex - call GetPokemonName - ret - -.Item: - call .GetTheIndex - call GetItemName - ret - -.Move: - call .GetTheIndex - call GetMoveName - ret - -.GetTheIndex: - ld h, 0 - ld l, c - add hl, de - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - ret - -.RawString: -; Get the string from the table... - ld a, c - and a - jr z, .skip -.read_loop - ld a, [de] - inc de - cp "@" - jr nz, .read_loop - dec c - jr nz, .read_loop -; ... and copy it into wStringBuffer1. -.skip - ld hl, wStringBuffer1 -.copy_loop - ld a, [de] - inc de - ld [hli], a - cp "@" - jr nz, .copy_loop - ld de, wStringBuffer1 - ret - -INCLUDE "data/radio/buenas_passwords.asm" - -BuenasPassword5: - ld hl, BuenaRadioText5 - ld a, BUENAS_PASSWORD_6 - jp NextRadioLine - -BuenasPassword6: - ld hl, BuenaRadioText6 - ld a, BUENAS_PASSWORD_7 - jp NextRadioLine - -BuenasPassword7: - call BuenasPasswordCheckTime - ld hl, BuenaRadioText7 - jr c, BuenasPasswordAfterMidnight - ld a, BUENAS_PASSWORD - jp NextRadioLine - -BuenasPasswordAfterMidnight: - push hl - ld hl, wWeeklyFlags - res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] - pop hl - ld a, BUENAS_PASSWORD_8 - jp NextRadioLine - -BuenasPassword8: - ld hl, wWeeklyFlags - res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] - ld hl, BuenaRadioMidnightText10 - ld a, BUENAS_PASSWORD_9 - jp NextRadioLine - -BuenasPassword9: - ld hl, BuenaRadioMidnightText1 - ld a, BUENAS_PASSWORD_10 - jp NextRadioLine - -BuenasPassword10: - ld hl, BuenaRadioMidnightText2 - ld a, BUENAS_PASSWORD_11 - jp NextRadioLine - -BuenasPassword11: - ld hl, BuenaRadioMidnightText3 - ld a, BUENAS_PASSWORD_12 - jp NextRadioLine - -BuenasPassword12: - ld hl, BuenaRadioMidnightText4 - ld a, BUENAS_PASSWORD_13 - jp NextRadioLine - -BuenasPassword13: - ld hl, BuenaRadioMidnightText5 - ld a, BUENAS_PASSWORD_14 - jp NextRadioLine - -BuenasPassword14: - ld hl, BuenaRadioMidnightText6 - ld a, BUENAS_PASSWORD_15 - jp NextRadioLine - -BuenasPassword15: - ld hl, BuenaRadioMidnightText7 - ld a, BUENAS_PASSWORD_16 - jp NextRadioLine - -BuenasPassword16: - ld hl, BuenaRadioMidnightText8 - ld a, BUENAS_PASSWORD_17 - jp NextRadioLine - -BuenasPassword17: - ld hl, BuenaRadioMidnightText9 - ld a, BUENAS_PASSWORD_18 - jp NextRadioLine - -BuenasPassword18: - ld hl, BuenaRadioMidnightText10 - ld a, BUENAS_PASSWORD_19 - jp NextRadioLine - -BuenasPassword19: - ld hl, BuenaRadioMidnightText10 - ld a, BUENAS_PASSWORD_20 - jp NextRadioLine - -BuenasPassword20: - ld a, [hBGMapMode] - push af - farcall NoRadioMusic - farcall NoRadioName - pop af - ld [hBGMapMode], a - ld hl, wWeeklyFlags - res WEEKLYFLAGS_BUENAS_PASSWORD_F, [hl] - ld a, BUENAS_PASSWORD - ld [wCurrentRadioLine], a - xor a - ld [wNumRadioLinesPrinted], a - ld hl, BuenaOffTheAirText - ld a, BUENAS_PASSWORD_21 - jp NextRadioLine - -BuenasPassword21: - ld a, BUENAS_PASSWORD - ld [wCurrentRadioLine], a - xor a - ld [wNumRadioLinesPrinted], a - call BuenasPasswordCheckTime - jp nc, BuenasPassword1 - ld hl, BuenaOffTheAirText - ld a, BUENAS_PASSWORD_21 - jp NextRadioLine - -BuenasPasswordCheckTime: - call UpdateTime - ld a, [hHours] - cp NITE_HOUR - ret - -BuenasPasswordChannelName: - db "BUENA'S PASSWORD@" - -BuenaRadioText1: - ; BUENA: BUENA here! - text_jump _BuenaRadioText1 - db "@" - -BuenaRadioText2: - ; Today's password! - text_jump _BuenaRadioText2 - db "@" - -BuenaRadioText3: - ; Let me think… It's - text_jump _BuenaRadioText3 - db "@" - -BuenaRadioText4: - ; @ ! - text_jump _BuenaRadioText4 - db "@" - -BuenaRadioText5: - ; Don't forget it! - text_jump _BuenaRadioText5 - db "@" - -BuenaRadioText6: - ; I'm in GOLDENROD's - text_jump _BuenaRadioText6 - db "@" - -BuenaRadioText7: - ; RADIO TOWER! - text_jump _BuenaRadioText7 - db "@" - -BuenaRadioMidnightText1: - ; BUENA: Oh my… - text_jump _BuenaRadioMidnightText1 - db "@" - -BuenaRadioMidnightText2: - ; It's midnight! I - text_jump _BuenaRadioMidnightText2 - db "@" - -BuenaRadioMidnightText3: - ; have to shut down! - text_jump _BuenaRadioMidnightText3 - db "@" - -BuenaRadioMidnightText4: - ; Thanks for tuning - text_jump _BuenaRadioMidnightText4 - db "@" - -BuenaRadioMidnightText5: - ; in to the end! But - text_jump _BuenaRadioMidnightText5 - db "@" - -BuenaRadioMidnightText6: - ; don't stay up too - text_jump _BuenaRadioMidnightText6 - db "@" - -BuenaRadioMidnightText7: - ; late! Presented to - text_jump _BuenaRadioMidnightText7 - db "@" - -BuenaRadioMidnightText8: - ; you by DJ BUENA! - text_jump _BuenaRadioMidnightText8 - db "@" - -BuenaRadioMidnightText9: - ; I'm outta here! - text_jump _BuenaRadioMidnightText9 - db "@" - -BuenaRadioMidnightText10: - ; … - text_jump _BuenaRadioMidnightText10 - db "@" - -BuenaOffTheAirText: - ; - text_jump _BuenaOffTheAirText - db "@" - -CopyRadioTextToRAM: - ld a, [hl] - cp TX_FAR - jp z, FarCopyRadioText - ld de, wRadioText - ld bc, SCREEN_WIDTH * 2 - jp CopyBytes - -StartRadioStation: - ld a, [wNumRadioLinesPrinted] - and a - ret nz - call RadioTerminator - call PrintText - ld hl, RadioChannelSongs - ld a, [wCurrentRadioLine] - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - callfar RadioMusicRestartDE - ret - -INCLUDE "data/radio/channel_music.asm" - -NextRadioLine: - push af - call CopyRadioTextToRAM - pop af - jp PrintRadioLine diff --git a/engine/routines/math.asm b/engine/routines/math.asm new file mode 100755 index 000000000..0cd6b0b47 --- /dev/null +++ b/engine/routines/math.asm @@ -0,0 +1,196 @@ +_Multiply:: ; 66de + +; hMultiplier is one byte. + ld a, 8 + ld b, a + + xor a + ld [hProduct], a + ld [hMathBuffer + 1], a + ld [hMathBuffer + 2], a + ld [hMathBuffer + 3], a + ld [hMathBuffer + 4], a + + +.loop + ld a, [hMultiplier] + srl a + ld [hMultiplier], a + jr nc, .next + + ld a, [hMathBuffer + 4] + ld c, a + ld a, [hMultiplicand + 2] + add c + ld [hMathBuffer + 4], a + + ld a, [hMathBuffer + 3] + ld c, a + ld a, [hMultiplicand + 1] + adc c + ld [hMathBuffer + 3], a + + ld a, [hMathBuffer + 2] + ld c, a + ld a, [hMultiplicand + 0] + adc c + ld [hMathBuffer + 2], a + + ld a, [hMathBuffer + 1] + ld c, a + ld a, [hProduct] + adc c + ld [hMathBuffer + 1], a + +.next + dec b + jr z, .done + + +; hMultiplicand <<= 1 + + ld a, [hMultiplicand + 2] + add a + ld [hMultiplicand + 2], a + + ld a, [hMultiplicand + 1] + rla + ld [hMultiplicand + 1], a + + ld a, [hMultiplicand + 0] + rla + ld [hMultiplicand + 0], a + + ld a, [hProduct] + rla + ld [hProduct], a + + jr .loop + + +.done + ld a, [hMathBuffer + 4] + ld [hProduct + 3], a + + ld a, [hMathBuffer + 3] + ld [hProduct + 2], a + + ld a, [hMathBuffer + 2] + ld [hProduct + 1], a + + ld a, [hMathBuffer + 1] + ld [hProduct + 0], a + + ret +; 673e + + +_Divide:: ; 673e + xor a + ld [hMathBuffer + 0], a + ld [hMathBuffer + 1], a + ld [hMathBuffer + 2], a + ld [hMathBuffer + 3], a + ld [hMathBuffer + 4], a + + ld a, 9 + ld e, a + +.loop + ld a, [hMathBuffer + 0] + ld c, a + ld a, [hDividend + 1] + sub c + ld d, a + + ld a, [hDivisor] + ld c, a + ld a, [hDividend + 0] + sbc c + jr c, .next + + ld [hDividend + 0], a + + ld a, d + ld [hDividend + 1], a + + ld a, [hMathBuffer + 4] + inc a + ld [hMathBuffer + 4], a + + jr .loop + +.next + ld a, b + cp 1 + jr z, .done + + ld a, [hMathBuffer + 4] + add a + ld [hMathBuffer + 4], a + + ld a, [hMathBuffer + 3] + rla + ld [hMathBuffer + 3], a + + ld a, [hMathBuffer + 2] + rla + ld [hMathBuffer + 2], a + + ld a, [hMathBuffer + 1] + rla + ld [hMathBuffer + 1], a + + dec e + jr nz, .next2 + + ld e, 8 + ld a, [hMathBuffer + 0] + ld [hDivisor], a + xor a + ld [hMathBuffer + 0], a + + ld a, [hDividend + 1] + ld [hDividend + 0], a + + ld a, [hDividend + 2] + ld [hDividend + 1], a + + ld a, [hDividend + 3] + ld [hDividend + 2], a + +.next2 + ld a, e + cp 1 + jr nz, .okay + dec b + +.okay + ld a, [hDivisor] + srl a + ld [hDivisor], a + + ld a, [hMathBuffer + 0] + rr a + ld [hMathBuffer + 0], a + + jr .loop + +.done + ld a, [hDividend + 1] + ld [hDivisor], a + + ld a, [hMathBuffer + 4] + ld [hDividend + 3], a + + ld a, [hMathBuffer + 3] + ld [hDividend + 2], a + + ld a, [hMathBuffer + 2] + ld [hDividend + 1], a + + ld a, [hMathBuffer + 1] + ld [hDividend + 0], a + + ret +; 67c1 diff --git a/engine/routines/printnum.asm b/engine/routines/printnum.asm new file mode 100755 index 000000000..fec798d5c --- /dev/null +++ b/engine/routines/printnum.asm @@ -0,0 +1,300 @@ +_PrintNum:: ; c4c7 +; Print c digits of the b-byte value from de to hl. +; Allows 2 to 7 digits. For 1-digit numbers, add +; the value to char "0" instead of calling PrintNum. +; Some extra flags can be given in bits 5-7 of b. +; Bit 5: money if set (unless left-aligned without leading zeros) +; Bit 6: right-aligned if set +; Bit 7: print leading zeros if set + + push bc + + bit 5, b + jr z, .main + bit 7, b + jr nz, .moneyflag + bit 6, b + jr z, .main + +.moneyflag ; 101xxxxx or 011xxxxx + ld a, "¥" + ld [hli], a + res 5, b ; 100xxxxx or 010xxxxx + +.main + xor a + ld [hPrintNum1], a + ld [hPrintNum2], a + ld [hPrintNum3], a + ld a, b + and $f + cp 1 + jr z, .byte + cp 2 + jr z, .word +; maximum 3 bytes +.long + ld a, [de] + ld [hPrintNum2], a + inc de + ld a, [de] + ld [hPrintNum3], a + inc de + ld a, [de] + ld [hPrintNum4], a + jr .start + +.word + ld a, [de] + ld [hPrintNum3], a + inc de + ld a, [de] + ld [hPrintNum4], a + jr .start + +.byte + ld a, [de] + ld [hPrintNum4], a + +.start + push de + + ld d, b + ld a, c + swap a + and $f + ld e, a + ld a, c + and $f + ld b, a + ld c, 0 + cp 2 + jr z, .two + cp 3 + jr z, .three + cp 4 + jr z, .four + cp 5 + jr z, .five + cp 6 + jr z, .six + +.seven + ld a, HIGH(1000000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(1000000) ; mid + ld [hPrintNum6], a + ld a, LOW(1000000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.six + ld a, HIGH(100000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(100000) ; mid + ld [hPrintNum6], a + ld a, LOW(100000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.five + xor a ; HIGH(10000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(10000) ; mid + ld [hPrintNum6], a + ld a, LOW(10000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.four + xor a ; HIGH(1000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(1000) ; mid + ld [hPrintNum6], a + ld a, LOW(1000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.three + xor a ; HIGH(100 >> 8) + ld [hPrintNum5], a + xor a ; HIGH(100) ; mid + ld [hPrintNum6], a + ld a, LOW(100) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.two + dec e + jr nz, .two_skip + ld a, "0" + ld [hPrintNum1], a +.two_skip + + ld c, 0 + ld a, [hPrintNum4] +.mod_10 + cp 10 + jr c, .modded_10 + sub 10 + inc c + jr .mod_10 +.modded_10 + + ld b, a + ld a, [hPrintNum1] + or c + jr nz, .money + call .PrintLeadingZero + jr .money_leading_zero + +.money + call .PrintYen + push af + ld a, "0" + add c + ld [hl], a + pop af + ld [hPrintNum1], a + inc e + dec e + jr nz, .money_leading_zero + inc hl + ld [hl], "" + +.money_leading_zero + call .AdvancePointer + call .PrintYen + ld a, "0" + add b + ld [hli], a + + pop de + pop bc + ret + +.PrintYen: ; c5ba + push af + ld a, [hPrintNum1] + and a + jr nz, .stop + bit 5, d + jr z, .stop + ld a, "¥" + ld [hli], a + res 5, d + +.stop + pop af + ret + +.PrintDigit: ; c5cb (3:45cb) + dec e + jr nz, .ok + ld a, "0" + ld [hPrintNum1], a +.ok + ld c, 0 +.loop + ld a, [hPrintNum5] + ld b, a + ld a, [hPrintNum2] + ld [hPrintNum8], a + cp b + jr c, .skip1 + sub b + ld [hPrintNum2], a + ld a, [hPrintNum6] + ld b, a + ld a, [hPrintNum3] + ld [hPrintNum9], a + cp b + jr nc, .skip2 + ld a, [hPrintNum2] + or 0 + jr z, .skip3 + dec a + ld [hPrintNum2], a + ld a, [hPrintNum3] +.skip2 + sub b + ld [hPrintNum3], a + ld a, [hPrintNum7] + ld b, a + ld a, [hPrintNum4] + ld [hPrintNum10], a + cp b + jr nc, .skip4 + ld a, [hPrintNum3] + and a + jr nz, .skip5 + ld a, [hPrintNum2] + and a + jr z, .skip6 + dec a + ld [hPrintNum2], a + xor a +.skip5 + dec a + ld [hPrintNum3], a + ld a, [hPrintNum4] +.skip4 + sub b + ld [hPrintNum4], a + inc c + jr .loop +.skip6 + ld a, [hPrintNum9] + ld [hPrintNum3], a +.skip3 + ld a, [hPrintNum8] + ld [hPrintNum2], a +.skip1 + ld a, [hPrintNum1] + or c + jr z, .PrintLeadingZero + ld a, [hPrintNum1] + and a + jr nz, .done + bit 5, d + jr z, .done + ld a, "¥" + ld [hli], a + res 5, d +.done + ld a, "0" + add c + ld [hl], a + ld [hPrintNum1], a + inc e + dec e + ret nz + inc hl + ld [hl], "" + ret + +.PrintLeadingZero: ; c644 +; prints a leading zero unless they are turned off in the flags + bit 7, d ; print leading zeroes? + ret z + ld [hl], "0" + ret + +.AdvancePointer: ; c64a +; increments the pointer unless leading zeroes are not being printed, +; the number is left-aligned, and no nonzero digits have been printed yet + bit 7, d ; print leading zeroes? + jr nz, .inc + bit 6, d ; left alignment or right alignment? + jr z, .inc + ld a, [hPrintNum1] + and a + ret z +.inc + inc hl + ret diff --git a/engine/scripting.asm b/engine/scripting.asm deleted file mode 100644 index f65f2f9c0..000000000 --- a/engine/scripting.asm +++ /dev/null @@ -1,2857 +0,0 @@ -; Event scripting commands. - - -EnableScriptMode:: - push af - ld a, SCRIPT_READ - ld [wScriptMode], a - pop af - ret - -ScriptEvents:: - call StartScript -.loop - ld a, [wScriptMode] - ld hl, .modes - rst JumpTable - call CheckScript - jr nz, .loop - ret - -.modes - dw EndScript - dw RunScriptCommand - dw WaitScriptMovement - dw WaitScript - -EndScript: - call StopScript - ret - -WaitScript: - call StopScript - - ld hl, wScriptDelay - dec [hl] - ret nz - - farcall Function58b9 - - ld a, SCRIPT_READ - ld [wScriptMode], a - call StartScript - ret - -WaitScriptMovement: - call StopScript - - ld hl, wVramState - bit 7, [hl] - ret nz - - farcall Function58b9 - - ld a, SCRIPT_READ - ld [wScriptMode], a - call StartScript - ret - -RunScriptCommand: - call GetScriptByte - ld hl, ScriptCommandTable - rst JumpTable - ret - - -ScriptCommandTable: -; entries correspond to macros/scripts/events.asm enumeration - dw Script_scall ; 00 - dw Script_farscall ; 01 - dw Script_ptcall ; 02 - dw Script_jump ; 03 - dw Script_farjump ; 04 - dw Script_ptjump ; 05 - dw Script_ifequal ; 06 - dw Script_ifnotequal ; 07 - dw Script_iffalse ; 08 - dw Script_iftrue ; 09 - dw Script_ifgreater ; 0a - dw Script_ifless ; 0b - dw Script_jumpstd ; 0c - dw Script_callstd ; 0d - dw Script_callasm ; 0e - dw Script_special ; 0f - dw Script_ptcallasm ; 10 - dw Script_checkmapscene ; 11 - dw Script_setmapscene ; 12 - dw Script_checkscene ; 13 - dw Script_setscene ; 14 - dw Script_writebyte ; 15 - dw Script_addvar ; 16 - dw Script_random ; 17 - dw Script_checkver ; 18 - dw Script_copybytetovar ; 19 - dw Script_copyvartobyte ; 1a - dw Script_loadvar ; 1b - dw Script_checkcode ; 1c - dw Script_writevarcode ; 1d - dw Script_writecode ; 1e - dw Script_giveitem ; 1f - dw Script_takeitem ; 20 - dw Script_checkitem ; 21 - dw Script_givemoney ; 22 - dw Script_takemoney ; 23 - dw Script_checkmoney ; 24 - dw Script_givecoins ; 25 - dw Script_takecoins ; 26 - dw Script_checkcoins ; 27 - dw Script_addcellnum ; 28 - dw Script_delcellnum ; 29 - dw Script_checkcellnum ; 2a - dw Script_checktime ; 2b - dw Script_checkpoke ; 2c - dw Script_givepoke ; 2d - dw Script_giveegg ; 2e - dw Script_givepokeitem ; 2f - dw Script_checkpokeitem ; 30 - dw Script_checkevent ; 31 - dw Script_clearevent ; 32 - dw Script_setevent ; 33 - dw Script_checkflag ; 34 - dw Script_clearflag ; 35 - dw Script_setflag ; 36 - dw Script_wildon ; 37 - dw Script_wildoff ; 38 - dw Script_xycompare ; 39 - dw Script_warpmod ; 3a - dw Script_blackoutmod ; 3b - dw Script_warp ; 3c - dw Script_readmoney ; 3d - dw Script_readcoins ; 3e - dw Script_vartomem ; 3f - dw Script_pokenamemem ; 40 - dw Script_itemtotext ; 41 - dw Script_mapnametotext ; 42 - dw Script_trainertotext ; 43 - dw Script_stringtotext ; 44 - dw Script_itemnotify ; 45 - dw Script_pocketisfull ; 46 - dw Script_opentext ; 47 - dw Script_refreshscreen ; 48 - dw Script_closetext ; 49 - dw Script_loadbytec2cf ; 4a - dw Script_farwritetext ; 4b - dw Script_writetext ; 4c - dw Script_repeattext ; 4d - dw Script_yesorno ; 4e - dw Script_loadmenu ; 4f - dw Script_closewindow ; 50 - dw Script_jumptextfaceplayer ; 51 -if _CRYSTAL - dw Script_farjumptext ; 52 -endc - dw Script_jumptext ; 53 - dw Script_waitbutton ; 54 - dw Script_buttonsound ; 55 - dw Script_pokepic ; 56 - dw Script_closepokepic ; 57 - dw Script__2dmenu ; 58 - dw Script_verticalmenu ; 59 - dw Script_loadpikachudata ; 5a - dw Script_randomwildmon ; 5b - dw Script_loadmemtrainer ; 5c - dw Script_loadwildmon ; 5d - dw Script_loadtrainer ; 5e - dw Script_startbattle ; 5f - dw Script_reloadmapafterbattle ; 60 - dw Script_catchtutorial ; 61 - dw Script_trainertext ; 62 - dw Script_trainerflagaction ; 63 - dw Script_winlosstext ; 64 - dw Script_scripttalkafter ; 65 - dw Script_endifjustbattled ; 66 - dw Script_checkjustbattled ; 67 - dw Script_setlasttalked ; 68 - dw Script_applymovement ; 69 - dw Script_applymovement2 ; 6a - dw Script_faceplayer ; 6b - dw Script_faceobject ; 6c - dw Script_variablesprite ; 6d - dw Script_disappear ; 6e - dw Script_appear ; 6f - dw Script_follow ; 70 - dw Script_stopfollow ; 71 - dw Script_moveobject ; 72 - dw Script_writeobjectxy ; 73 - dw Script_loademote ; 74 - dw Script_showemote ; 75 - dw Script_turnobject ; 76 - dw Script_follownotexact ; 77 - dw Script_earthquake ; 78 - dw Script_changemap ; 79 - dw Script_changeblock ; 7a - dw Script_reloadmap ; 7b - dw Script_reloadmappart ; 7c - dw Script_writecmdqueue ; 7d - dw Script_delcmdqueue ; 7e - dw Script_playmusic ; 7f - dw Script_encountermusic ; 80 - dw Script_musicfadeout ; 81 - dw Script_playmapmusic ; 82 - dw Script_dontrestartmapmusic ; 83 - dw Script_cry ; 84 - dw Script_playsound ; 85 - dw Script_waitsfx ; 86 - dw Script_warpsound ; 87 - dw Script_specialsound ; 88 - dw Script_passtoengine ; 89 - dw Script_newloadmap ; 8a - dw Script_pause ; 8b - dw Script_deactivatefacing ; 8c - dw Script_priorityjump ; 8d - dw Script_warpcheck ; 8e - dw Script_ptpriorityjump ; 8f - dw Script_return ; 90 - dw Script_end ; 91 - dw Script_reloadandreturn ; 92 - dw Script_endall ; 93 - dw Script_pokemart ; 94 - dw Script_elevator ; 95 - dw Script_trade ; 96 - dw Script_askforphonenumber ; 97 - dw Script_phonecall ; 98 - dw Script_hangup ; 99 - dw Script_describedecoration ; 9a - dw Script_fruittree ; 9b - dw Script_specialphonecall ; 9c - dw Script_checkphonecall ; 9d - dw Script_verbosegiveitem ; 9e - dw Script_verbosegiveitem2 ; 9f - dw Script_swarm ; a0 - dw Script_halloffame ; a1 - dw Script_credits ; a2 - dw Script_warpfacing ; a3 - dw Script_battletowertext ; a4 - dw Script_landmarktotext ; a5 - dw Script_trainerclassname ; a6 - dw Script_name ; a7 - dw Script_wait ; a8 - dw Script_checksave ; a9 - -StartScript: - ld hl, wScriptFlags - set SCRIPT_RUNNING, [hl] - ret - -CheckScript: - ld hl, wScriptFlags - bit SCRIPT_RUNNING, [hl] - ret - -StopScript: - ld hl, wScriptFlags - res SCRIPT_RUNNING, [hl] - ret - -Script_callasm: -; script command 0xe -; parameters: asm - - call GetScriptByte - ld b, a - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld a, b - rst FarCall - ret - -Script_special: -; script command 0xf -; parameters: predefined_script - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - farcall Special - ret - -Script_ptcallasm: -; script command 0x10 -; parameters: asm - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld b, [hl] - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - ld a, b - rst FarCall - ret - -Script_jumptextfaceplayer: -; script command 0x51 -; parameters: text_pointer - - ld a, [wScriptBank] - ld [wScriptTextBank], a - call GetScriptByte - ld [wScriptTextAddr], a - call GetScriptByte - ld [wScriptTextAddr + 1], a - ld b, BANK(JumpTextFacePlayerScript) - ld hl, JumpTextFacePlayerScript - jp ScriptJump - -Script_jumptext: -; script command 0x53 -; parameters: text_pointer - - ld a, [wScriptBank] - ld [wScriptTextBank], a - call GetScriptByte - ld [wScriptTextAddr], a - call GetScriptByte - ld [wScriptTextAddr + 1], a - ld b, BANK(JumpTextScript) - ld hl, JumpTextScript - jp ScriptJump - -JumpTextFacePlayerScript: - faceplayer -JumpTextScript: - opentext - repeattext -1, -1 - waitbutton - closetext - end - - -if _CRYSTAL - -Script_farjumptext: -; script command 0x52 -; parameters: text_pointer - - call GetScriptByte - ld [wScriptTextBank], a - call GetScriptByte - ld [wScriptTextAddr], a - call GetScriptByte - ld [wScriptTextAddr + 1], a - ld b, BANK(JumpTextScript) - ld hl, JumpTextScript - jp ScriptJump - -endc - - -Script_writetext: -; script command 0x4c -; parameters: text_pointer - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld a, [wScriptBank] - ld b, a - call MapTextbox - ret - -Script_farwritetext: -; script command 0x4b -; parameters: text_pointer - - call GetScriptByte - ld b, a - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - call MapTextbox - ret - -Script_repeattext: -; script command 0x4d -; parameters: byte, byte - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - cp -1 - jr nz, .done - ld a, l - cp -1 - jr nz, .done - ld hl, wScriptTextBank - ld a, [hli] - ld b, a - ld a, [hli] - ld h, [hl] - ld l, a - call MapTextbox - ret - -.done - ret - -Script_waitbutton: -; script command 0x54 - - jp WaitButton - -Script_buttonsound: -; script command 0x55 - - ld a, [hOAMUpdate] - push af - ld a, $1 - ld [hOAMUpdate], a - call WaitBGMap - call ButtonSound - pop af - ld [hOAMUpdate], a - ret - -Script_yesorno: -; script command 0x4e - - call YesNoBox - ld a, FALSE - jr c, .no - ld a, TRUE -.no - ld [wScriptVar], a - ret - -Script_loadmenu: -; script command 0x4f -; parameters: menu_header - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld de, LoadMenuHeader - ld a, [wScriptBank] - call Call_a_de - call UpdateSprites - ret - -Script_closewindow: -; script command 0x50 - - call CloseWindow - call UpdateSprites - ret - -Script_pokepic: -; script command 0x56 -; parameters: pokemon - - call GetScriptByte - and a - jr nz, .ok - ld a, [wScriptVar] -.ok - ld [wCurPartySpecies], a - farcall Pokepic - ret - -Script_closepokepic: -; script command 0x57 - - farcall ClosePokepic - ret - -Script_verticalmenu: -; script command 0x59 - - ld a, [wScriptBank] - ld hl, VerticalMenu - rst FarCall - ld a, [wMenuCursorY] - jr nc, .ok - xor a -.ok - ld [wScriptVar], a - ret - -Script__2dmenu: -; script command 0x58 - - ld a, [wScriptBank] - ld hl, _2DMenu - rst FarCall - ld a, [wMenuCursorBuffer] - jr nc, .ok - xor a -.ok - ld [wScriptVar], a - ret - -Script_battletowertext: -; script command 0xa4 -; parameters: pointer, memory - - call SetUpTextBox - call GetScriptByte - ld c, a - farcall BattleTowerText - ret - -Script_verbosegiveitem: -; script command 0x9e -; parameters: item, quantity - - call Script_giveitem - call CurItemName - ld de, wStringBuffer1 - ld a, 1 - call CopyConvertedText - ld b, BANK(GiveItemScript) - ld de, GiveItemScript - jp ScriptCall - - -ret_96f76: - ret - -GiveItemScript: - callasm ret_96f76 - writetext ReceivedItemText - iffalse .Full - waitsfx - specialsound - waitbutton - itemnotify - end - -.Full: - buttonsound - pocketisfull - end - -ReceivedItemText: - text_jump UnknownText_0x1c4719 - db "@" - - -Script_verbosegiveitem2: -; script command 0x9f -; parameters: item, var - - call GetScriptByte - cp -1 - jr nz, .ok - ld a, [wScriptVar] -.ok - ld [wCurItem], a - call GetScriptByte - call GetVarAction - ld a, [de] - ld [wItemQuantityChangeBuffer], a - ld hl, wNumItems - call ReceiveItem - ld a, TRUE - jr c, .ok2 - xor a -.ok2 - ld [wScriptVar], a - call CurItemName - ld de, wStringBuffer1 - ld a, 1 - call CopyConvertedText - ld b, BANK(GiveItemScript) - ld de, GiveItemScript - jp ScriptCall - -Script_itemnotify: -; script command 0x45 - - call GetPocketName - call CurItemName - ld b, BANK(PutItemInPocketText) - ld hl, PutItemInPocketText - call MapTextbox - ret - -Script_pocketisfull: -; script command 0x46 - - call GetPocketName - call CurItemName - ld b, BANK(PocketIsFullText) - ld hl, PocketIsFullText - call MapTextbox - ret - -Script_specialsound: -; script command 0x88 - - farcall CheckItemPocket - ld a, [wItemAttributeParamBuffer] - cp TM_HM - ld de, SFX_GET_TM - jr z, .play - ld de, SFX_ITEM -.play - call PlaySFX - call WaitSFX - ret - - -GetPocketName: - farcall CheckItemPocket - ld a, [wItemAttributeParamBuffer] - dec a - ld hl, .Pockets - maskbits NUM_POCKETS - add a - ld e, a - ld d, 0 - add hl, de - ld a, [hli] - ld d, [hl] - ld e, a - ld hl, wStringBuffer3 - call CopyName2 - ret - -.Pockets: - dw .Item - dw .Key - dw .Ball - dw .TM - -.Item: - db "ITEM POCKET@" -.Key: - db "KEY POCKET@" -.Ball: - db "BALL POCKET@" -.TM: - db "TM POCKET@" - -CurItemName: - ld a, [wCurItem] - ld [wd265], a - call GetItemName - ret - - -PutItemInPocketText: - text_jump UnknownText_0x1c472c - db "@" - -PocketIsFullText: - text_jump UnknownText_0x1c474b - db "@" - - -Script_pokemart: -; script command 0x94 -; parameters: dialog_id, mart_id - - call GetScriptByte - ld c, a - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld a, [wScriptBank] - ld b, a - farcall OpenMartDialog - ret - -Script_elevator: -; script command 0x95 -; parameters: floor_list_pointer - - xor a - ld [wScriptVar], a - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld a, [wScriptBank] - ld b, a - farcall Elevator - ret c - ld a, TRUE - ld [wScriptVar], a - ret - -Script_trade: -; script command 0x96 -; parameters: trade_id - - call GetScriptByte - ld e, a - farcall NPCTrade - ret - -Script_phonecall: -; script command 0x98 -; parameters: caller_name - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld a, [wScriptBank] - ld b, a - farcall PhoneCall - ret - -Script_hangup: -; script command 0x99 - - farcall HangUp - ret - -Script_askforphonenumber: -; script command 0x97 -; parameters: number - - call YesNoBox - jr c, .refused - call GetScriptByte - ld c, a - farcall AddPhoneNumber - jr c, .phonefull - xor a ; PHONE_CONTACT_GOT - jr .done -.phonefull - ld a, PHONE_CONTACTS_FULL - jr .done -.refused - call GetScriptByte - ld a, PHONE_CONTACT_REFUSED -.done - ld [wScriptVar], a - ret - -Script_describedecoration: -; script command 0x9a -; parameters: byte - - call GetScriptByte - ld b, a - farcall DescribeDecoration - ld h, d - ld l, e - jp ScriptJump - -Script_fruittree: -; script command 0x9b -; parameters: tree_id - - call GetScriptByte - ld [wCurFruitTree], a - ld b, BANK(FruitTreeScript) - ld hl, FruitTreeScript - jp ScriptJump - -Script_swarm: -; script command 0xa0 -; parameters: flag, map_group, map_id - - call GetScriptByte - ld c, a - call GetScriptByte - ld d, a - call GetScriptByte - ld e, a - farcall StoreSwarmMapIndices - ret - -Script_trainertext: -; script command 0x62 -; parameters: which_text - - call GetScriptByte - ld c, a - ld b, 0 - ld hl, wWalkingX - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wEngineBuffer1] - ld b, a - call MapTextbox - ret - -Script_scripttalkafter: -; script command 0x65 - - ld hl, wScriptAfterPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wEngineBuffer1] - ld b, a - jp ScriptJump - -Script_trainerflagaction: -; script command 0x63 -; parameters: action - - xor a - ld [wScriptVar], a - ld hl, wd041 - ld e, [hl] - inc hl - ld d, [hl] - call GetScriptByte - ld b, a - call EventFlagAction - ld a, c - and a - ret z - ld a, TRUE - ld [wScriptVar], a - ret - -Script_winlosstext: -; script command 0x64 -; parameters: win_text_pointer, loss_text_pointer - - ld hl, wWinTextPointer - call GetScriptByte - ld [hli], a - call GetScriptByte - ld [hli], a - ld hl, wLossTextPointer - call GetScriptByte - ld [hli], a - call GetScriptByte - ld [hli], a - ret - -Script_endifjustbattled: -; script command 0x66 - - ld a, [wRunningTrainerBattleScript] - and a - ret z - jp Script_end - -Script_checkjustbattled: -; script command 0x67 - - ld a, TRUE - ld [wScriptVar], a - ld a, [wRunningTrainerBattleScript] - and a - ret nz - xor a - ld [wScriptVar], a - ret - -Script_encountermusic: -; script command 0x80 - - ld a, [wOtherTrainerClass] - ld e, a - farcall PlayTrainerEncounterMusic - ret - -Script_playmapmusic: -; script command 0x82 - - call PlayMapMusic - ret - -Script_playmusic: -; script command 0x7f -; parameters: music_pointer - - ld de, MUSIC_NONE - call PlayMusic - xor a - ld [wMusicFade], a - call MaxVolume - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - call PlayMusic - ret - -Script_musicfadeout: -; script command 0x81 -; parameters: music, fadetime - - call GetScriptByte - ld [wMusicFadeID], a - call GetScriptByte - ld [wMusicFadeID + 1], a - call GetScriptByte - and $ff ^ (1 << MUSIC_FADE_IN_F) - ld [wMusicFade], a - ret - -Script_playsound: -; script command 0x85 -; parameters: sound_pointer - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - call PlaySFX - ret - -Script_waitsfx: -; script command 0x86 - - call WaitSFX - ret - -Script_warpsound: -; script command 0x87 - - farcall GetWarpSFX - call PlaySFX - ret - -Script_cry: -; script command 0x84 -; parameters: cry_id - - call GetScriptByte - push af - call GetScriptByte - pop af - and a - jr nz, .ok - ld a, [wScriptVar] -.ok - call PlayMonCry - ret - -GetScriptObject: - and a ; PLAYER? - ret z - cp LAST_TALKED - ret z - dec a - ret - -Script_setlasttalked: -; script command 0x68 -; parameters: object_id - - call GetScriptByte - call GetScriptObject - ld [hLastTalked], a - ret - -Script_applymovement: -; script command 0x69 -; parameters: object_id, data - - call GetScriptByte - call GetScriptObject - ld c, a - -ApplyMovement: - push bc - ld a, c - farcall SetFlagsForMovement_1 - pop bc - - push bc - call SetFlagsForMovement_2 - pop bc - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld a, [wScriptBank] - ld b, a - call GetMovementData - ret c - - ld a, SCRIPT_WAIT_MOVEMENT - ld [wScriptMode], a - call StopScript - ret - -SetFlagsForMovement_2: - farcall _SetFlagsForMovement_2 - ret - -Script_applymovement2: -; script command 0x6a -; parameters: data -; apply movement to last talked - - ld a, [hLastTalked] - ld c, a - jp ApplyMovement - -Script_faceplayer: -; script command 0x6b - - ld a, [hLastTalked] - and a - ret z - ld d, $0 - ld a, [hLastTalked] - ld e, a - farcall GetRelativeFacing - ld a, d - add a - add a - ld e, a - ld a, [hLastTalked] - ld d, a - call ApplyObjectFacing - ret - -Script_faceobject: -; script command 0x6c -; parameters: object1, object2 - - call GetScriptByte - call GetScriptObject - cp LAST_TALKED - jr c, .ok - ld a, [hLastTalked] -.ok - ld e, a - call GetScriptByte - call GetScriptObject - cp LAST_TALKED - jr nz, .ok2 - ld a, [hLastTalked] -.ok2 - ld d, a - push de - farcall GetRelativeFacing - pop bc - ret c - ld a, d - add a - add a - ld e, a - ld d, c - call ApplyObjectFacing - ret - -Script_turnobject: -; script command 0x76 -; parameters: object_id, facing - - call GetScriptByte - call GetScriptObject - cp LAST_TALKED - jr nz, .ok - ld a, [hLastTalked] -.ok - ld d, a - call GetScriptByte - add a - add a - ld e, a - call ApplyObjectFacing - ret - -ApplyObjectFacing: - ld a, d - push de - call CheckObjectVisibility - jr c, .not_visible - ld hl, OBJECT_SPRITE - add hl, bc - ld a, [hl] - push bc - call DoesSpriteHaveFacings - pop bc - jr c, .not_visible ; STILL_SPRITE - ld hl, OBJECT_FLAGS1 - add hl, bc - bit FIXED_FACING, [hl] - jr nz, .not_visible - pop de - ld a, e - call SetSpriteDirection - ld hl, wVramState - bit 6, [hl] - jr nz, .text_state - call .DisableTextTiles -.text_state - call UpdateSprites - ret - -.not_visible - pop de - scf - ret - -.DisableTextTiles: - call LoadMapPart - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT -.loop - res 7, [hl] - inc hl - dec bc - ld a, b - or c - jr nz, .loop - ret - -Script_variablesprite: -; script command 0x6d -; parameters: byte, sprite - - call GetScriptByte - ld e, a - ld d, $0 - ld hl, wVariableSprites - add hl, de - call GetScriptByte - ld [hl], a - ret - -Script_appear: -; script command 0x6f -; parameters: object_id - - call GetScriptByte - call GetScriptObject - call _CopyObjectStruct - ld a, [hMapObjectIndexBuffer] - ld b, 0 ; clear - call ApplyEventActionAppearDisappear - ret - -Script_disappear: -; script command 0x6e -; parameters: object_id - - call GetScriptByte - call GetScriptObject - cp LAST_TALKED - jr nz, .ok - ld a, [hLastTalked] -.ok - call DeleteObjectStruct - ld a, [hMapObjectIndexBuffer] - ld b, 1 ; set - call ApplyEventActionAppearDisappear - farcall _UpdateSprites - ret - -ApplyEventActionAppearDisappear: - push bc - call GetMapObject - ld hl, MAPOBJECT_EVENT_FLAG - add hl, bc - pop bc - ld e, [hl] - inc hl - ld d, [hl] - ld a, -1 - cp e - jr nz, .okay - cp d - jr nz, .okay - xor a - ret -.okay - call EventFlagAction - ret - -Script_follow: -; script command 0x70 -; parameters: object2, object1 - - call GetScriptByte - call GetScriptObject - ld b, a - call GetScriptByte - call GetScriptObject - ld c, a - farcall StartFollow - ret - -Script_stopfollow: -; script command 0x71 - - farcall StopFollow - ret - -Script_moveobject: -; script command 0x72 -; parameters: object id, x, y - - call GetScriptByte - call GetScriptObject - ld b, a - call GetScriptByte - add 4 - ld d, a - call GetScriptByte - add 4 - ld e, a - farcall CopyDECoordsToMapObject - ret - -Script_writeobjectxy: -; script command 0x73 -; parameters: object_id - - call GetScriptByte - call GetScriptObject - cp LAST_TALKED - jr nz, .ok - ld a, [hLastTalked] -.ok - ld b, a - farcall WriteObjectXY - ret - -Script_follownotexact: -; script command 0x77 -; parameters: object2, object1 - - call GetScriptByte - call GetScriptObject - ld b, a - call GetScriptByte - call GetScriptObject - ld c, a - farcall FollowNotExact - ret - -Script_loademote: -; script command 0x74 -; parameters: bubble - - call GetScriptByte - cp -1 - jr nz, .not_var_emote - ld a, [wScriptVar] -.not_var_emote - ld c, a - farcall LoadEmote - ret - -Script_showemote: -; script command 0x75 -; parameters: bubble, object_id, time - - call GetScriptByte - ld [wScriptVar], a - call GetScriptByte - call GetScriptObject - cp LAST_TALKED - jr z, .ok - ld [hLastTalked], a -.ok - call GetScriptByte - ld [wScriptDelay], a - ld b, BANK(ShowEmoteScript) - ld de, ShowEmoteScript - jp ScriptCall - -ShowEmoteScript: - loademote EMOTE_MEM - applymovement2 .Show - pause 0 - applymovement2 .Hide - end - -.Show: - show_emote - step_sleep 1 - step_end - -.Hide: - hide_emote - step_sleep 1 - step_end - - -Script_earthquake: -; script command 0x78 -; parameters: param - - ld hl, EarthquakeMovement - ld de, wEarthquakeMovementDataBuffer - ld bc, EarthquakeMovement.End - EarthquakeMovement - call CopyBytes - call GetScriptByte - ld [wEarthquakeMovementDataBuffer + 1], a - and %00111111 - ld [wEarthquakeMovementDataBuffer + 3], a - ld b, BANK(.script) - ld de, .script - jp ScriptCall - -.script - applymovement PLAYER, wEarthquakeMovementDataBuffer - end - -EarthquakeMovement: - step_shake 16 ; the 16 gets overwritten with the script byte - step_sleep 16 ; the 16 gets overwritten with the lower 6 bits of the script byte - step_end -.End - - -Script_loadpikachudata: -; script command 0x5a - - ld a, PIKACHU - ld [wTempWildMonSpecies], a - ld a, 5 - ld [wCurPartyLevel], a - ret - -Script_randomwildmon: -; script command 0x5b - - xor a - ld [wBattleScriptFlags], a - ret - -Script_loadmemtrainer: -; script command 0x5c - - ld a, (1 << 7) | 1 - ld [wBattleScriptFlags], a - ld a, [wTempTrainerClass] - ld [wOtherTrainerClass], a - ld a, [wTempTrainerID] - ld [wOtherTrainerID], a - ret - -Script_loadwildmon: -; script command 0x5d -; parameters: pokemon, level - - ld a, (1 << 7) - ld [wBattleScriptFlags], a - call GetScriptByte - ld [wTempWildMonSpecies], a - call GetScriptByte - ld [wCurPartyLevel], a - ret - -Script_loadtrainer: -; script command 0x5e -; parameters: trainer_group, trainer_id - - ld a, (1 << 7) | 1 - ld [wBattleScriptFlags], a - call GetScriptByte - ld [wOtherTrainerClass], a - call GetScriptByte - ld [wOtherTrainerID], a - ret - -Script_startbattle: -; script command 0x5f - - call BufferScreen - predef StartBattle - ld a, [wBattleResult] - and $3f - ld [wScriptVar], a - ret - -Script_catchtutorial: -; script command 0x61 -; parameters: byte - - call GetScriptByte - ld [wBattleType], a - call BufferScreen - farcall CatchTutorial - jp Script_reloadmap - -Script_reloadmapafterbattle: -; script command 0x60 - - ld hl, wBattleScriptFlags - ld d, [hl] - ld [hl], $0 - ld a, [wBattleResult] - and $3f - cp $1 - jr nz, .notblackedout - ld b, BANK(Script_BattleWhiteout) - ld hl, Script_BattleWhiteout - jp ScriptJump - -.notblackedout - bit 0, d - jr z, .was_wild - farcall MomTriesToBuySomething - jr .done - -.was_wild - ld a, [wBattleResult] - bit 7, a - jr z, .done - ld b, BANK(Script_SpecialBillCall) - ld de, Script_SpecialBillCall - farcall LoadScriptBDE -.done - jp Script_reloadmap - -Script_reloadmap: -; script command 0x7b - - xor a - ld [wBattleScriptFlags], a - ld a, MAPSETUP_RELOADMAP - ld [hMapEntryMethod], a - ld a, $1 - call LoadMapStatus - call StopScript - ret - -Script_scall: -; script command 0x0 -; parameters: pointer - - ld a, [wScriptBank] - ld b, a - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - jr ScriptCall - -Script_farscall: -; script command 0x1 -; parameters: pointer - - call GetScriptByte - ld b, a - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - jr ScriptCall - -Script_ptcall: -; script command 0x2 -; parameters: pointer - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld b, [hl] - inc hl - ld e, [hl] - inc hl - ld d, [hl] - ; fallthrough - -ScriptCall: -; Bug: The script stack has a capacity of 5 scripts, yet there is -; nothing to stop you from pushing a sixth script. The high part -; of the script address can then be overwritten by modifications -; to wScriptDelay, causing the script to return to the rst/interrupt -; space. - - push de - ld hl, wScriptStackSize - ld e, [hl] - inc [hl] - ld d, $0 - ld hl, wScriptStack - add hl, de - add hl, de - add hl, de - pop de - ld a, [wScriptBank] - ld [hli], a - ld a, [wScriptPos] - ld [hli], a - ld a, [wScriptPos + 1] - ld [hl], a - ld a, b - ld [wScriptBank], a - ld a, e - ld [wScriptPos], a - ld a, d - ld [wScriptPos + 1], a - ret - -CallCallback:: - ld a, [wScriptBank] - or $80 - ld [wScriptBank], a - jp ScriptCall - -Script_jump: -; script command 0x3 -; parameters: pointer - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld a, [wScriptBank] - ld b, a - jp ScriptJump - -Script_farjump: -; script command 0x4 -; parameters: pointer - - call GetScriptByte - ld b, a - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - jp ScriptJump - -Script_ptjump: -; script command 0x5 -; parameters: pointer - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld b, [hl] - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - jp ScriptJump - -Script_iffalse: -; script command 0x8 -; parameters: pointer - - ld a, [wScriptVar] - and a - jp nz, SkipTwoScriptBytes - jp Script_jump - -Script_iftrue: -; script command 0x9 -; parameters: pointer - - ld a, [wScriptVar] - and a - jp nz, Script_jump - jp SkipTwoScriptBytes - -Script_ifequal: -; script command 0x6 -; parameters: byte, pointer - - call GetScriptByte - ld hl, wScriptVar - cp [hl] - jr z, Script_jump - jr SkipTwoScriptBytes - -Script_ifnotequal: -; script command 0x7 -; parameters: byte, pointer - - call GetScriptByte - ld hl, wScriptVar - cp [hl] - jr nz, Script_jump - jr SkipTwoScriptBytes - -Script_ifgreater: -; script command 0xa -; parameters: byte, pointer - - ld a, [wScriptVar] - ld b, a - call GetScriptByte - cp b - jr c, Script_jump - jr SkipTwoScriptBytes - -Script_ifless: -; script command 0xb -; parameters: byte, pointer - - call GetScriptByte - ld b, a - ld a, [wScriptVar] - cp b - jr c, Script_jump - jr SkipTwoScriptBytes - -Script_jumpstd: -; script command 0xc -; parameters: predefined_script - - call StdScript - jr ScriptJump - -Script_callstd: -; script command 0xd -; parameters: predefined_script - - call StdScript - ld d, h - ld e, l - jp ScriptCall - -StdScript: - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld hl, StdScripts - add hl, de - add hl, de - add hl, de - ld a, BANK(StdScripts) - call GetFarByte - ld b, a - inc hl - ld a, BANK(StdScripts) - call GetFarHalfword - ret - -SkipTwoScriptBytes: - call GetScriptByte - call GetScriptByte - ret - -ScriptJump: - ld a, b - ld [wScriptBank], a - ld a, l - ld [wScriptPos], a - ld a, h - ld [wScriptPos + 1], a - ret - -Script_priorityjump: -; script command 0x8d -; parameters: pointer - - ld a, [wScriptBank] - ld [wPriorityScriptBank], a - call GetScriptByte - ld [wPriorityScriptAddr], a - call GetScriptByte - ld [wPriorityScriptAddr + 1], a - ld hl, wScriptFlags - set 3, [hl] - ret - -Script_checkscene: -; script command 0x13 - - call CheckScenes - jr z, .no_scene - ld [wScriptVar], a - ret - -.no_scene - ld a, $ff - ld [wScriptVar], a - ret - -Script_checkmapscene: -; script command 0x11 -; parameters: map_group, map_id - - call GetScriptByte - ld b, a - call GetScriptByte - ld c, a - call GetMapSceneID - ld a, d - or e - jr z, .no_scene - ld a, [de] - ld [wScriptVar], a - ret - -.no_scene - ld a, $ff - ld [wScriptVar], a - ret - -Script_setscene: -; script command 0x14 -; parameters: scene_id - - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - jr DoScene - -Script_setmapscene: -; script command 0x12 -; parameters: map_group, map_id, scene_id - - call GetScriptByte - ld b, a - call GetScriptByte - ld c, a -DoScene: - call GetMapSceneID - ld a, d - or e - jr z, .no_scene - call GetScriptByte - ld [de], a -.no_scene - ret - -Script_copybytetovar: -; script command 0x19 -; parameters: address - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld a, [hl] - ld [wScriptVar], a - ret - -Script_copyvartobyte: -; script command 0x1a -; parameters: address - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld a, [wScriptVar] - ld [hl], a - ret - -Script_loadvar: -; script command 0x1b -; parameters: address, value - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - call GetScriptByte - ld [hl], a - ret - -Script_writebyte: -; script command 0x15 -; parameters: value - - call GetScriptByte - ld [wScriptVar], a - ret - -Script_addvar: -; script command 0x16 -; parameters: value - - call GetScriptByte - ld hl, wScriptVar - add [hl] - ld [hl], a - ret - -Script_random: -; script command 0x17 -; parameters: input - - call GetScriptByte - ld [wScriptVar], a - and a - ret z - - ld c, a - call .Divide256byC - and a - jr z, .no_restriction ; 256 % b == 0 - ld b, a - xor a - sub b - ld b, a -.loop - push bc - call Random - pop bc - ld a, [hRandomAdd] - cp b - jr nc, .loop - jr .finish - -.no_restriction - push bc - call Random - pop bc - ld a, [hRandomAdd] - -.finish - push af - ld a, [wScriptVar] - ld c, a - pop af - call SimpleDivide - ld [wScriptVar], a - ret - -.Divide256byC: - xor a - ld b, a - sub c -.mod_loop - inc b - sub c - jr nc, .mod_loop - dec b - add c - ret - -Script_checkcode: -; script command 0x1c -; parameters: variable_id - - call GetScriptByte - call GetVarAction - ld a, [de] - ld [wScriptVar], a - ret - -Script_writevarcode: -; script command 0x1d -; parameters: variable_id - - call GetScriptByte - call GetVarAction - ld a, [wScriptVar] - ld [de], a - ret - -Script_writecode: -; script command 0x1e -; parameters: variable_id, value - - call GetScriptByte - call GetVarAction - call GetScriptByte - ld [de], a - ret - -GetVarAction: - ld c, a - farcall _GetVarAction - ret - -Script_checkver: -; script command 0x18 - - ld a, [.gs_version] - ld [wScriptVar], a - ret - -.gs_version: - db GS_VERSION - -Script_pokenamemem: -; script command 0x40 -; parameters: pokemon (0 aka USE_SCRIPT_VAR to use wScriptVar), memory - - call GetScriptByte - and a - jr nz, .gotit - ld a, [wScriptVar] -.gotit - ld [wd265], a - call GetPokemonName - ld de, wStringBuffer1 - -ConvertMemToText: - call GetScriptByte - cp NUM_MEM_BUFFERS - jr c, .ok - xor a -.ok - -CopyConvertedText: - ld hl, wStringBuffer3 - ld bc, wStringBuffer4 - wStringBuffer3 - call AddNTimes - call CopyName2 - ret - -Script_itemtotext: -; script command 0x41 -; parameters: item (0 aka USE_SCRIPT_VAR to use wScriptVar), memory - - call GetScriptByte - and a ; USE_SCRIPT_VAR - jr nz, .ok - ld a, [wScriptVar] -.ok - ld [wd265], a - call GetItemName - ld de, wStringBuffer1 - jr ConvertMemToText - -Script_mapnametotext: -; script command 0x42 -; parameters: memory - - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - call GetWorldMapLocation - -ConvertLandmarkToText: - ld e, a - farcall GetLandmarkName - ld de, wStringBuffer1 - jp ConvertMemToText - -Script_landmarktotext: -; script command 0xa5 -; parameters: id, memory - - call GetScriptByte - jr ConvertLandmarkToText - -Script_trainertotext: -; script command 0x43 -; parameters: trainer_id, trainer_group, memory - - call GetScriptByte - ld c, a - call GetScriptByte - ld b, a - farcall GetTrainerName - jr ConvertMemToText - -Script_name: -; script command 0xa7 -; parameters: type, id, memory - - call GetScriptByte - ld [wNamedObjectTypeBuffer], a - -ContinueToGetName: - call GetScriptByte - ld [wCurSpecies], a - call GetName - ld de, wStringBuffer1 - jp ConvertMemToText - -Script_trainerclassname: -; script command 0xa6 -; parameters: id, memory - - ld a, TRAINER_NAME - ld [wNamedObjectTypeBuffer], a - jr ContinueToGetName - -Script_readmoney: -; script command 0x3d -; parameters: account, memory - - call ResetStringBuffer1 - call GetMoneyAccount - ld hl, wStringBuffer1 - lb bc, PRINTNUM_RIGHTALIGN | 3, 6 - call PrintNum - ld de, wStringBuffer1 - jp ConvertMemToText - -Script_readcoins: -; script command 0x3e -; parameters: memory - - call ResetStringBuffer1 - ld hl, wStringBuffer1 - ld de, wCoins - lb bc, PRINTNUM_RIGHTALIGN | 2, 6 - call PrintNum - ld de, wStringBuffer1 - jp ConvertMemToText - -Script_vartomem: -; script command 0x3f -; parameters: memory - - call ResetStringBuffer1 - ld de, wScriptVar - ld hl, wStringBuffer1 - lb bc, PRINTNUM_RIGHTALIGN | 1, 3 - call PrintNum - ld de, wStringBuffer1 - jp ConvertMemToText - -ResetStringBuffer1: - ld hl, wStringBuffer1 - ld bc, NAME_LENGTH - ld a, "@" - call ByteFill - ret - -Script_stringtotext: -; script command 0x44 -; parameters: text_pointer, memory - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld a, [wScriptBank] - ld hl, CopyName1 - rst FarCall - ld de, wStringBuffer2 - jp ConvertMemToText - -Script_givepokeitem: -; script command 0x2f -; parameters: pointer - - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - ld a, [wScriptBank] - call GetFarByte - ld b, a - push bc - inc hl - ld bc, MAIL_MSG_LENGTH - ld de, wd002 - ld a, [wScriptBank] - call FarCopyBytes - pop bc - farcall GivePokeItem - ret - -Script_checkpokeitem: -; script command 0x30 -; parameters: pointer - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld a, [wScriptBank] - ld b, a - farcall CheckPokeItem - ret - -Script_giveitem: -; script command 0x1f -; parameters: item, quantity - - call GetScriptByte - cp ITEM_FROM_MEM - jr nz, .ok - ld a, [wScriptVar] -.ok - ld [wCurItem], a - call GetScriptByte - ld [wItemQuantityChangeBuffer], a - ld hl, wNumItems - call ReceiveItem - jr nc, .full - ld a, TRUE - ld [wScriptVar], a - ret -.full - xor a - ld [wScriptVar], a - ret - -Script_takeitem: -; script command 0x20 -; parameters: item, quantity - - xor a - ld [wScriptVar], a - call GetScriptByte - ld [wCurItem], a - call GetScriptByte - ld [wItemQuantityChangeBuffer], a - ld a, -1 - ld [wCurItemQuantity], a - ld hl, wNumItems - call TossItem - ret nc - ld a, TRUE - ld [wScriptVar], a - ret - -Script_checkitem: -; script command 0x21 -; parameters: item - - xor a - ld [wScriptVar], a - call GetScriptByte - ld [wCurItem], a - ld hl, wNumItems - call CheckItem - ret nc - ld a, TRUE - ld [wScriptVar], a - ret - -Script_givemoney: -; script command 0x22 -; parameters: account, money - - call GetMoneyAccount - call LoadMoneyAmountToMem - farcall GiveMoney - ret - -Script_takemoney: -; script command 0x23 -; parameters: account, money - - call GetMoneyAccount - call LoadMoneyAmountToMem - farcall TakeMoney - ret - -Script_checkmoney: -; script command 0x24 -; parameters: account, money - - call GetMoneyAccount - call LoadMoneyAmountToMem - farcall CompareMoney - -CompareMoneyAction: - jr c, .less - jr z, .exact - ld a, HAVE_MORE - jr .done -.exact - ld a, HAVE_AMOUNT - jr .done -.less - ld a, HAVE_LESS -.done - ld [wScriptVar], a - ret - -GetMoneyAccount: - call GetScriptByte - and a - ld de, wMoney ; YOUR_MONEY - ret z - ld de, wMomsMoney ; MOMS_MONEY - ret - -LoadMoneyAmountToMem: - ld bc, hMoneyTemp - push bc - call GetScriptByte - ld [bc], a - inc bc - call GetScriptByte - ld [bc], a - inc bc - call GetScriptByte - ld [bc], a - pop bc - ret - -Script_givecoins: -; script command 0x25 -; parameters: coins - - call LoadCoinAmountToMem - farcall GiveCoins - ret - -Script_takecoins: -; script command 0x26 -; parameters: coins - - call LoadCoinAmountToMem - farcall TakeCoins - ret - -Script_checkcoins: -; script command 0x27 -; parameters: coins - - call LoadCoinAmountToMem - farcall CheckCoins - jr CompareMoneyAction - -LoadCoinAmountToMem: - call GetScriptByte - ld [hMoneyTemp + 1], a - call GetScriptByte - ld [hMoneyTemp], a - ld bc, hMoneyTemp - ret - -Script_checktime: -; script command 0x2b -; parameters: time - - xor a - ld [wScriptVar], a - farcall CheckTime - call GetScriptByte - and c - ret z - ld a, TRUE - ld [wScriptVar], a - ret - -Script_checkpoke: -; script command 0x2c -; parameters: pokemon - - xor a - ld [wScriptVar], a - call GetScriptByte - ld hl, wPartySpecies - ld de, 1 - call IsInArray - ret nc - ld a, TRUE - ld [wScriptVar], a - ret - -Script_addcellnum: -; script command 0x28 -; parameters: person - - xor a - ld [wScriptVar], a - call GetScriptByte - ld c, a - farcall AddPhoneNumber - ret nc - ld a, TRUE - ld [wScriptVar], a - ret - -Script_delcellnum: -; script command 0x29 -; parameters: person - - xor a - ld [wScriptVar], a - call GetScriptByte - ld c, a - farcall DelCellNum - ret nc - ld a, TRUE - ld [wScriptVar], a - ret - -Script_checkcellnum: -; script command 0x2a -; parameters: person -; returns false if the cell number is not in your phone - - xor a - ld [wScriptVar], a - call GetScriptByte - ld c, a - farcall CheckCellNum - ret nc - ld a, TRUE - ld [wScriptVar], a - ret - -Script_specialphonecall: -; script command 0x9c -; parameters: call_id - - call GetScriptByte - ld [wSpecialPhoneCallID], a - call GetScriptByte - ld [wSpecialPhoneCallID + 1], a - ret - -Script_checkphonecall: -; script command 0x9d -; returns false if no special phone call is stored - - ld a, [wSpecialPhoneCallID] - and a - jr z, .ok - ld a, TRUE -.ok - ld [wScriptVar], a - ret - -Script_givepoke: -; script command 0x2d -; parameters: pokemon, level, item, trainer, trainer_name_pointer, pkmn_nickname - - call GetScriptByte - ld [wCurPartySpecies], a - call GetScriptByte - ld [wCurPartyLevel], a - call GetScriptByte - ld [wCurItem], a - call GetScriptByte - and a - ld b, a - jr z, .ok - ld hl, wScriptPos - ld e, [hl] - inc hl - ld d, [hl] - call GetScriptByte - call GetScriptByte - call GetScriptByte - call GetScriptByte -.ok - farcall GivePoke - ld a, b - ld [wScriptVar], a - ret - -Script_giveegg: -; script command 0x2e -; parameters: pokemon, level -; if no room in the party, return 0 in wScriptVar; else, return 2 - - xor a ; PARTYMON - ld [wScriptVar], a - ld [wMonType], a - call GetScriptByte - ld [wCurPartySpecies], a - call GetScriptByte - ld [wCurPartyLevel], a - farcall GiveEgg - ret nc - ld a, 2 - ld [wScriptVar], a - ret - -Script_setevent: -; script command 0x33 -; parameters: bit_number - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld b, SET_FLAG - call EventFlagAction - ret - -Script_clearevent: -; script command 0x32 -; parameters: bit_number - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld b, RESET_FLAG - call EventFlagAction - ret - -Script_checkevent: -; script command 0x31 -; parameters: bit_number - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld b, CHECK_FLAG - call EventFlagAction - ld a, c - and a - jr z, .false - ld a, TRUE -.false - ld [wScriptVar], a - ret - -Script_setflag: -; script command 0x36 -; parameters: bit_number - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld b, SET_FLAG - call _EngineFlagAction - ret - -Script_clearflag: -; script command 0x35 -; parameters: bit_number - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld b, RESET_FLAG - call _EngineFlagAction - ret - -Script_checkflag: -; script command 0x34 -; parameters: bit_number - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld b, CHECK_FLAG - call _EngineFlagAction - ld a, c - and a - jr z, .false - ld a, TRUE -.false - ld [wScriptVar], a - ret - -_EngineFlagAction: - farcall EngineFlagAction - ret - -Script_wildoff: -; script command 0x38 - - ld hl, wStatusFlags - set STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] - ret - -Script_wildon: -; script command 0x37 - - ld hl, wStatusFlags - res STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] - ret - -Script_xycompare: -; script command 0x39 -; parameters: pointer - - call GetScriptByte - ld [wXYComparePointer], a - call GetScriptByte - ld [wXYComparePointer + 1], a - ret - -Script_warpfacing: -; script command 0xa3 -; parameters: facing, map_group, map_id, x, y - - call GetScriptByte - maskbits NUM_DIRECTIONS - ld c, a - ld a, [wPlayerSpriteSetupFlags] - set PLAYERSPRITESETUP_CUSTOM_FACING_F, a - or c - ld [wPlayerSpriteSetupFlags], a -; fall through - -Script_warp: -; script command 0x3c -; parameters: map_group, map_id, x, y - -; This seems to be some sort of error handling case. - call GetScriptByte - and a - jr z, .not_ok - ld [wMapGroup], a - call GetScriptByte - ld [wMapNumber], a - call GetScriptByte - ld [wXCoord], a - call GetScriptByte - ld [wYCoord], a - ld a, -1 - ld [wDefaultSpawnpoint], a - ld a, MAPSETUP_WARP - ld [hMapEntryMethod], a - ld a, 1 - call LoadMapStatus - call StopScript - ret - -.not_ok - call GetScriptByte - call GetScriptByte - call GetScriptByte - ld a, -1 - ld [wDefaultSpawnpoint], a - ld a, MAPSETUP_BADWARP - ld [hMapEntryMethod], a - ld a, 1 - call LoadMapStatus - call StopScript - ret - -Script_warpmod: -; script command 0x3a -; parameters: warp_id, map_group, map_id - - call GetScriptByte - ld [wBackupWarpNumber], a - call GetScriptByte - ld [wBackupMapGroup], a - call GetScriptByte - ld [wBackupMapNumber], a - ret - -Script_blackoutmod: -; script command 0x3b -; parameters: map_group, map_id - - call GetScriptByte - ld [wLastSpawnMapGroup], a - call GetScriptByte - ld [wLastSpawnMapNumber], a - ret - -Script_dontrestartmapmusic: -; script command 0x83 - - ld a, 1 - ld [wDontPlayMapMusicOnReload], a - ret - -Script_writecmdqueue: -; script command 0x7d -; parameters: queue_pointer - - call GetScriptByte - ld e, a - call GetScriptByte - ld d, a - ld a, [wScriptBank] - ld b, a - farcall WriteCmdQueue ; no need to farcall - ret - -Script_delcmdqueue: -; script command 0x7e -; parameters: byte - - xor a - ld [wScriptVar], a - call GetScriptByte - ld b, a - farcall DelCmdQueue ; no need to farcall - ret c - ld a, 1 - ld [wScriptVar], a - ret - -Script_changemap: -; script command 0x79 -; parameters: map_data_pointer - - call GetScriptByte - ld [wMapBlocksBank], a - call GetScriptByte - ld [wMapBlocksPointer], a - call GetScriptByte - ld [wMapBlocksPointer + 1], a - call ChangeMap - call BufferScreen - ret - -Script_changeblock: -; script command 0x7a -; parameters: x, y, block - - call GetScriptByte - add 4 - ld d, a - call GetScriptByte - add 4 - ld e, a - call GetBlockLocation - call GetScriptByte - ld [hl], a - call BufferScreen - ret - -Script_reloadmappart:: -; script command 0x7c - - xor a - ld [hBGMapMode], a - call OverworldTextModeSwitch - call GetMovementPermissions - farcall ReloadMapPart - call UpdateSprites - ret - -Script_warpcheck: -; script command 0x8e - - call WarpCheck - ret nc - farcall EnableEvents - ret - -Script_enableevents: -; unused - farcall EnableEvents - ret - -Script_newloadmap: -; script command 0x8a -; parameters: which_method - - call GetScriptByte - ld [hMapEntryMethod], a - ld a, 1 - call LoadMapStatus - call StopScript - ret - -Script_reloadandreturn: -; script command 0x92 - - call Script_newloadmap - jp Script_end - -Script_opentext: -; script command 0x47 - - call OpenText - ret - -Script_refreshscreen: -; script command 0x48 -; parameters: dummy - - call RefreshScreen - call GetScriptByte - ret - -Script_loadbytec2cf: -; script command 0x4a -; parameters: byte - - call GetScriptByte - ld [wc2cf], a - ret - - db closetext_command ; unused - -Script_closetext: -; script command 0x49 - - call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap - call CloseText - ret - - -Script_passtoengine: -; script command 0x89 -; parameters: data_pointer - - call GetScriptByte - push af - call GetScriptByte - ld l, a - call GetScriptByte - ld h, a - pop af - call StartAutoInput - ret - -Script_pause: -; script command 0x8b -; parameters: length - - call GetScriptByte - and a - jr z, .loop - ld [wScriptDelay], a -.loop - ld c, 2 - call DelayFrames - ld hl, wScriptDelay - dec [hl] - jr nz, .loop - ret - -Script_deactivatefacing: -; script command 0x8c -; parameters: time - - call GetScriptByte - and a - jr z, .no_time - ld [wScriptDelay], a -.no_time - ld a, SCRIPT_WAIT - ld [wScriptMode], a - call StopScript - ret - -Script_ptpriorityjump: -; script command 0x8f -; parameters: pointer - - call StopScript - jp Script_jump - -Script_end: -; script command 0x91 - - call ExitScriptSubroutine - jr c, .resume - ret - -.resume - xor a - ld [wScriptRunning], a - ld a, SCRIPT_OFF - ld [wScriptMode], a - ld hl, wScriptFlags - res 0, [hl] - call StopScript - ret - -Script_return: -; script command 0x90 - - call ExitScriptSubroutine - jr c, .dummy -.dummy - ld hl, wScriptFlags - res 0, [hl] - call StopScript - ret - -ExitScriptSubroutine: -; Return carry if there's no parent to return to. - - ld hl, wScriptStackSize - ld a, [hl] - and a - jr z, .done - dec [hl] - ld e, [hl] - ld d, $0 - ld hl, wScriptStack - add hl, de - add hl, de - add hl, de - ld a, [hli] - ld b, a - and " " - ld [wScriptBank], a - ld a, [hli] - ld e, a - ld [wScriptPos], a - ld a, [hl] - ld d, a - ld [wScriptPos + 1], a - and a - ret -.done - scf - ret - -Script_endall: -; script command 0x93 - - xor a - ld [wScriptStackSize], a - ld [wScriptRunning], a - ld a, SCRIPT_OFF - ld [wScriptMode], a - ld hl, wScriptFlags - res 0, [hl] - call StopScript - ret - -Script_halloffame: -; script command 0xa1 - - ld hl, wGameTimerPause - res GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] - farcall StubbedTrainerRankings_HallOfFame - farcall StubbedTrainerRankings_HallOfFame2 - farcall HallOfFame - ld hl, wGameTimerPause - set GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] - jr ReturnFromCredits - -Script_credits: -; script command 0xa2 - - farcall RedCredits -ReturnFromCredits: - call Script_endall - ld a, $3 - call LoadMapStatus - call StopScript - ret - -Script_wait: -; script command 0xa8 -; parameters: unknown - - push bc - call GetScriptByte -.loop - push af - ld c, 6 - call DelayFrames - pop af - dec a - jr nz, .loop - pop bc - ret - -Script_checksave: -; script command 0xa9 - - farcall CheckSave - ld a, c - ld [wScriptVar], a - ret - - -; unused - ld a, [.byte] - ld [wScriptVar], a - ret - -.byte - db 0 diff --git a/engine/scrolling_menu.asm b/engine/scrolling_menu.asm deleted file mode 100755 index 3be3d839c..000000000 --- a/engine/scrolling_menu.asm +++ /dev/null @@ -1,543 +0,0 @@ -_InitScrollingMenu:: ; 245af - xor a - ld [wMenuJoypad], a - ld [hBGMapMode], a - inc a - ld [hInMenu], a - call InitScrollingMenuCursor - call ScrollingMenu_InitFlags - call ScrollingMenu_ValidateSwitchItem - call ScrollingMenu_InitDisplay - call ApplyTilemap - xor a - ld [hBGMapMode], a - ret -; 245cb - -_ScrollingMenu:: ; 245cb -.loop - call ScrollingMenuJoyAction - jp c, .exit - call z, .zero - jr .loop -; 245d6 - -.exit ; 245d6 - call MenuClickSound - ld [wMenuJoypad], a - ld a, 0 - ld [hInMenu], a - ret -; 245e1 - -.zero ; 245e1 - call ScrollingMenu_InitDisplay - ld a, 1 - ld [hBGMapMode], a - ld c, 3 - call DelayFrames - xor a - ld [hBGMapMode], a - ret -; 245f1 - -ScrollingMenu_InitDisplay: ; 245f1 - xor a - ld [hBGMapMode], a - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call ScrollingMenu_UpdateDisplay - call ScrollingMenu_PlaceCursor - call ScrollingMenu_CheckCallFunction3 - pop af - ld [wOptions], a - ret -; 24609 - -ScrollingMenuJoyAction: ; 24609 -.loop - call ScrollingMenuJoypad - ld a, [hJoyLast] - and D_PAD - ld b, a - ld a, [hJoyPressed] - and BUTTONS - or b - bit A_BUTTON_F, a - jp nz, .a_button - bit B_BUTTON_F, a - jp nz, .b_button - bit SELECT_F, a - jp nz, .select - bit START_F, a - jp nz, .start - bit D_RIGHT_F, a - jp nz, .d_right - bit D_LEFT_F, a - jp nz, .d_left - bit D_UP_F, a - jp nz, .d_up - bit D_DOWN_F, a - jp nz, .d_down - jr .loop -; 24640 - -.unreferenced ; unused - ld a, -1 - and a - ret -; 24644 - -.a_button ; 24644 - call PlaceHollowCursor - ld a, [wMenuCursorY] - dec a - call ScrollingMenu_GetListItemCoordAndFunctionArgs - ld a, [wMenuSelection] - ld [wCurItem], a - ld a, [wMenuSelectionQuantity] - ld [wItemQuantityBuffer], a - call ScrollingMenu_GetCursorPosition - dec a - ld [wScrollingMenuCursorPosition], a - ld [wCurItemQuantity], a - ld a, [wMenuSelection] - cp -1 - jr z, .b_button - ld a, A_BUTTON - scf - ret -; 2466f - -.b_button ; 2466f - ld a, B_BUTTON - scf - ret -; 24673 - -.select ; 24673 - ld a, [wMenuDataFlags] - bit 7, a - jp z, xor_a_dec_a - ld a, [wMenuCursorY] - dec a - call ScrollingMenu_GetListItemCoordAndFunctionArgs - ld a, [wMenuSelection] - cp -1 - jp z, xor_a_dec_a - call ScrollingMenu_GetCursorPosition - dec a - ld [wScrollingMenuCursorPosition], a - ld a, SELECT - scf - ret -; 24695 - -.start ; 24695 - ld a, [wMenuDataFlags] - bit 6, a - jp z, xor_a_dec_a - ld a, START - scf - ret -; 246a1 - -.d_left ; 246a1 - ld hl, w2DMenuFlags2 - bit 7, [hl] - jp z, xor_a_dec_a - ld a, [wMenuDataFlags] - bit 3, a - jp z, xor_a_dec_a - ld a, D_LEFT - scf - ret -; 246b5 - -.d_right ; 246b5 - ld hl, w2DMenuFlags2 - bit 7, [hl] - jp z, xor_a_dec_a - ld a, [wMenuDataFlags] - bit 2, a - jp z, xor_a_dec_a - ld a, D_RIGHT - scf - ret -; 246c9 - -.d_up ; 246c9 - ld hl, w2DMenuFlags2 - bit 7, [hl] - jp z, xor_a - ld hl, wMenuScrollPosition - ld a, [hl] - and a - jr z, .xor_dec_up - dec [hl] - jp xor_a - -.xor_dec_up - jp xor_a_dec_a -; 246df - -.d_down ; 246df - ld hl, w2DMenuFlags2 - bit 7, [hl] - jp z, xor_a - ld hl, wMenuScrollPosition - ld a, [wMenuData_ScrollingMenuHeight] - add [hl] - ld b, a - ld a, [wScrollingMenuListSize] - cp b - jr c, .xor_dec_down - inc [hl] - jp xor_a - -.xor_dec_down - jp xor_a_dec_a -; 246fc - -ScrollingMenu_GetCursorPosition: ; 246fc - ld a, [wMenuScrollPosition] - ld c, a - ld a, [wMenuCursorY] - add c - ld c, a - ret -; 24706 - -ScrollingMenu_ClearLeftColumn: ; 24706 (9:4706) - call MenuBoxCoord2Tile - ld de, SCREEN_WIDTH - add hl, de - ld de, 2 * SCREEN_WIDTH - ld a, [wMenuData_ScrollingMenuHeight] -.loop - ld [hl], " " - add hl, de - dec a - jr nz, .loop - ret - -InitScrollingMenuCursor: ; 2471a - ld hl, wMenuData_ItemsPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wMenuData_ItemsPointerBank] - call GetFarByte - ld [wScrollingMenuListSize], a - ld a, [wMenuData_ScrollingMenuHeight] - ld c, a - ld a, [wMenuScrollPosition] - add c - ld c, a - ld a, [wScrollingMenuListSize] - inc a - cp c - jr nc, .skip - ld a, [wMenuData_ScrollingMenuHeight] - ld c, a - ld a, [wScrollingMenuListSize] - inc a - sub c - jr nc, .store - xor a - -.store - ld [wMenuScrollPosition], a - -.skip - ld a, [wMenuScrollPosition] - ld c, a - ld a, [wMenuCursorBuffer] - add c - ld b, a - ld a, [wScrollingMenuListSize] - inc a - cp b - jr c, .asm_2475a - jr nc, .asm_24763 - -.asm_2475a - xor a - ld [wMenuScrollPosition], a - ld a, $1 - ld [wMenuCursorBuffer], a - -.asm_24763 - ret -; 24764 - -ScrollingMenu_InitFlags: ; 24764 - ld a, [wMenuDataFlags] - ld c, a - ld a, [wScrollingMenuListSize] - ld b, a - ld a, [wMenuBorderTopCoord] - add 1 - ld [w2DMenuCursorInitY], a - ld a, [wMenuBorderLeftCoord] - add 0 - ld [w2DMenuCursorInitX], a - ld a, [wMenuData_ScrollingMenuHeight] - cp b - jr c, .no_extra_row - jr z, .no_extra_row - ld a, b - inc a -.no_extra_row - ld [w2DMenuNumRows], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, $8c - bit 2, c - jr z, .skip_set_0 - set 0, a - -.skip_set_0 - bit 3, c - jr z, .skip_set_1 - set 1, a - -.skip_set_1 - ld [w2DMenuFlags1], a - xor a - ld [w2DMenuFlags2], a - ld a, $20 - ld [w2DMenuCursorOffsets], a - ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN - bit 7, c - jr z, .disallow_select - add SELECT - -.disallow_select - bit 6, c - jr z, .disallow_start - add START - -.disallow_start - ld [wMenuJoypadFilter], a - ld a, [w2DMenuNumRows] - ld b, a - ld a, [wMenuCursorBuffer] - and a - jr z, .reset_cursor - cp b - jr z, .cursor_okay - jr c, .cursor_okay - -.reset_cursor - ld a, 1 - -.cursor_okay - ld [wMenuCursorY], a - ld a, 1 - ld [wMenuCursorX], a - xor a - ld [wCursorCurrentTile], a - ld [wCursorCurrentTile + 1], a - ld [wCursorOffCharacter], a - ret -; 247dd - -ScrollingMenu_ValidateSwitchItem: ; 247dd - ld a, [wScrollingMenuListSize] - ld c, a - ld a, [wSwitchItem] - and a - jr z, .done - dec a - cp c - jr c, .done - xor a - ld [wSwitchItem], a - -.done - ret -; 247f0 - -ScrollingMenu_UpdateDisplay: ; 247f0 - call ClearWholeMenuBox - ld a, [wMenuDataFlags] - bit 4, a ; place arrows - jr z, .okay - ld a, [wMenuScrollPosition] - and a - jr z, .okay - ld a, [wMenuBorderTopCoord] - ld b, a - ld a, [wMenuBorderRightCoord] - ld c, a - call Coord2Tile - ld [hl], "▲" - -.okay - call MenuBoxCoord2Tile - ld bc, SCREEN_WIDTH + 1 - add hl, bc - ld a, [wMenuData_ScrollingMenuHeight] - ld b, a - ld c, $0 -.loop - ld a, [wMenuScrollPosition] - add c - ld [wScrollingMenuCursorPosition], a - ld a, c - call ScrollingMenu_GetListItemCoordAndFunctionArgs - ld a, [wMenuSelection] - cp -1 - jr z, .cancel - push bc - push hl - call ScrollingMenu_CallFunctions1and2 - pop hl - ld bc, 2 * SCREEN_WIDTH - add hl, bc - pop bc - inc c - ld a, c - cp b - jr nz, .loop - ld a, [wMenuDataFlags] - bit 4, a ; place arrows - jr z, .done - ld a, [wMenuBorderBottomCoord] - ld b, a - ld a, [wMenuBorderRightCoord] - ld c, a - call Coord2Tile - ld [hl], "▼" - -.done - ret - -.cancel - ld a, [wMenuDataFlags] - bit 0, a ; call function on cancel - jr nz, .call_function - ld de, .string_2485f - call PlaceString - ret - -.string_2485f - db "CANCEL@" - -.call_function - ld d, h - ld e, l - ld hl, wMenuData_ScrollingMenuFunction1 - jp CallPointerAt -; 2486e - -ScrollingMenu_CallFunctions1and2: ; 2486e - push hl - ld d, h - ld e, l - ld hl, wMenuData_ScrollingMenuFunction1 - call CallPointerAt - pop hl - ld a, [wMenuData_ScrollingMenuWidth] - and a - jr z, .done - ld e, a - ld d, $0 - add hl, de - ld d, h - ld e, l - ld hl, wMenuData_ScrollingMenuFunction2 - call CallPointerAt - -.done - ret -; 2488b - -ScrollingMenu_PlaceCursor: ; 2488b - ld a, [wSwitchItem] - and a - jr z, .done - ld b, a - ld a, [wMenuScrollPosition] - cp b - jr nc, .done - ld c, a - ld a, [wMenuData_ScrollingMenuHeight] - add c - cp b - jr c, .done - ld a, b - sub c - dec a - add a - add $1 - ld c, a - ld a, [wMenuBorderTopCoord] - add c - ld b, a - ld a, [wMenuBorderLeftCoord] - add $0 - ld c, a - call Coord2Tile - ld [hl], "▷" - -.done - ret -; 248b8 - -ScrollingMenu_CheckCallFunction3: ; 248b8 - ld a, [wMenuDataFlags] - bit 5, a ; call function 3 - ret z - bit 1, a ; call function 3 if not switching items - jr z, .call - ld a, [wSwitchItem] - and a - ret nz - -.call - ld a, [wMenuCursorY] - dec a - call ScrollingMenu_GetListItemCoordAndFunctionArgs - ld hl, wMenuData_ScrollingMenuFunction3 - call CallPointerAt - ret -; 248d5 - -ScrollingMenu_GetListItemCoordAndFunctionArgs: ; 248d5 - push de - push hl - ld e, a - ld a, [wMenuScrollPosition] - add e - ld e, a - ld d, $0 - ld hl, wMenuData_ItemsPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - inc hl ; items - ld a, [wMenuData_ScrollingMenuSpacing] - cp 1 - jr z, .got_spacing - cp 2 - jr z, .pointless_jump -.pointless_jump - add hl, de -.got_spacing - add hl, de - ld a, [wMenuData_ItemsPointerBank] - call GetFarByte - ld [wMenuSelection], a - ld [wCurItem], a - inc hl - ld a, [wMenuData_ItemsPointerBank] - call GetFarByte - ld [wMenuSelectionQuantity], a - pop hl - pop de - ret -; 2490c diff --git a/engine/search.asm b/engine/search.asm deleted file mode 100755 index 57b489a37..000000000 --- a/engine/search.asm +++ /dev/null @@ -1,276 +0,0 @@ -BeastsCheck: ; 0x4a6e8 -; Check if the player owns all three legendary beasts. -; They must exist in either party or PC, and have the player's OT and ID. -; Return the result in wScriptVar. - - ld a, RAIKOU - ld [wScriptVar], a - call CheckOwnMonAnywhere - jr nc, .notexist - - ld a, ENTEI - ld [wScriptVar], a - call CheckOwnMonAnywhere - jr nc, .notexist - - ld a, SUICUNE - ld [wScriptVar], a - call CheckOwnMonAnywhere - jr nc, .notexist - - ; they exist - ld a, 1 - ld [wScriptVar], a - ret - -.notexist - xor a - ld [wScriptVar], a - ret - - -MonCheck: ; 0x4a711 -; Check if the player owns any Pokémon of the species in wScriptVar. -; Return the result in wScriptVar. - - call CheckOwnMonAnywhere - jr c, .exists - - ; doesn't exist - xor a - ld [wScriptVar], a - ret - -.exists - ld a, 1 - ld [wScriptVar], a - ret - - -CheckOwnMonAnywhere: ; 0x4a721 -; Check if the player owns any monsters of the species in wScriptVar. -; It must exist in either party or PC, and have the player's OT and ID. - - ; If there are no monsters in the party, - ; the player must not own any yet. - ld a, [wPartyCount] - and a - ret z - - ld d, a - ld e, 0 - ld hl, wPartyMon1Species - ld bc, wPartyMonOT - - ; Run CheckOwnMon on each Pokémon in the party. -.partymon - call CheckOwnMon - ret c ; found! - - push bc - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop bc - call UpdateOTPointer - dec d - jr nz, .partymon - - ; Run CheckOwnMon on each Pokémon in the PC. - ld a, BANK(sBoxCount) - call GetSRAMBank - ld a, [sBoxCount] - and a - jr z, .boxes - - ld d, a - ld hl, sBoxMon1Species - ld bc, sBoxMonOT -.openboxmon - call CheckOwnMon - jr nc, .loop - - ; found! - call CloseSRAM - ret - -.loop - push bc - ld bc, BOXMON_STRUCT_LENGTH - add hl, bc - pop bc - call UpdateOTPointer - dec d - jr nz, .openboxmon - - ; Run CheckOwnMon on each monster in the other 13 PC boxes. -.boxes - call CloseSRAM - - ld c, 0 -.box - ; Don't search the current box again. - ld a, [wCurBox] - and $f - cp c - jr z, .loopbox - - ; Load the box. - ld hl, BoxAddressTable1 - ld b, 0 - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - call GetSRAMBank - ld a, [hli] - ld h, [hl] - ld l, a - - ; Number of monsters in the box - ld a, [hl] - and a - jr z, .loopbox - - push bc - - push hl - ld de, sBoxMons - sBoxCount - add hl, de - ld d, h - ld e, l - pop hl - push de - ld de, sBoxMonOT - sBoxCount - add hl, de - ld b, h - ld c, l - pop hl - - ld d, a - -.boxmon - call CheckOwnMon - jr nc, .loopboxmon - - ; found! - pop bc - call CloseSRAM - ret - -.loopboxmon - push bc - ld bc, BOXMON_STRUCT_LENGTH - add hl, bc - pop bc - call UpdateOTPointer - dec d - jr nz, .boxmon - pop bc - -.loopbox - inc c - ld a, c - cp NUM_BOXES - jr c, .box - - ; not found - call CloseSRAM - and a - ret - - -CheckOwnMon: ; 0x4a7ba -; Check if a Pokémon belongs to the player and is of a specific species. - -; inputs: -; hl, pointer to PartyMonNSpecies -; bc, pointer to PartyMonNOT -; wScriptVar should contain the species we're looking for - -; outputs: -; sets carry if monster matches species, ID, and OT name. - - push bc - push hl - push de - ld d, b - ld e, c - -; check species - ld a, [wScriptVar] ; species we're looking for - ld b, [hl] ; species we have - cp b - jr nz, .notfound ; species doesn't match - -; check ID number - ld bc, MON_ID - add hl, bc ; now hl points to ID number - ld a, [wPlayerID] - cp [hl] - jr nz, .notfound ; ID doesn't match - inc hl - ld a, [wPlayerID + 1] - cp [hl] - jr nz, .notfound ; ID doesn't match - -; check OT -; This only checks five characters, which is fine for the Japanese version, -; but in the English version the player name is 7 characters, so this is wrong. - - ld hl, wPlayerName - -rept NAME_LENGTH_JAPANESE + -2 ; should be PLAYER_NAME_LENGTH + -2 - ld a, [de] - cp [hl] - jr nz, .notfound - cp "@" - jr z, .found ; reached end of string - inc hl - inc de -endr - - ld a, [de] - cp [hl] - jr z, .found - -.notfound - pop de - pop hl - pop bc - and a - ret - -.found - pop de - pop hl - pop bc - scf - ret -; 0x4a810 - -BoxAddressTable1: ; 4a810 - dba sBox1 - dba sBox2 - dba sBox3 - dba sBox4 - dba sBox5 - dba sBox6 - dba sBox7 - dba sBox8 - dba sBox9 - dba sBox10 - dba sBox11 - dba sBox12 - dba sBox13 - dba sBox14 -; 4a83a - -UpdateOTPointer: ; 0x4a83a - push hl - ld hl, NAME_LENGTH - add hl, bc - ld b, h - ld c, l - pop hl - ret -; 0x4a843 diff --git a/engine/search2.asm b/engine/search2.asm deleted file mode 100755 index b7112f1f8..000000000 --- a/engine/search2.asm +++ /dev/null @@ -1,134 +0,0 @@ -_FindPartyMonAboveLevel: ; 4dbd2 - ld hl, wPartyMon1Level - call FindAboveLevel - ret - -_FindPartyMonAtLeastThatHappy: ; 4dbd9 - ld hl, wPartyMon1Happiness - call FindAtLeastThatHappy - ret - -_FindPartyMonThatSpecies: ; 4dbe0 - ld hl, wPartyMon1Species - jp FindThatSpecies - -_FindPartyMonThatSpeciesYourTrainerID: ; 4dbe6 - ld hl, wPartyMon1Species - call FindThatSpecies - ret z - ld a, c - ld hl, wPartyMon1ID - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld a, [wPlayerID] - cp [hl] - jr nz, .nope - inc hl - ld a, [wPlayerID + 1] - cp [hl] - jr nz, .nope - ld a, $1 - and a - ret - -.nope - xor a - ret - -FindAtLeastThatHappy: ; 4dc0a -; Sets the bits for the Pokemon that have a happiness greater than or equal to b. -; The lowest bits are used. Sets z if no Pokemon in your party is at least that happy. - ld c, $0 - ld a, [wPartyCount] - ld d, a -.loop - ld a, d - dec a - push hl - push bc - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - pop bc - ld a, b - cp [hl] - pop hl - jr z, .greater_equal - jr nc, .lower - -.greater_equal - ld a, c - or $1 - ld c, a - -.lower - sla c - dec d - jr nz, .loop - call RetroactivelyIgnoreEggs - ld a, c - and a - ret - -FindAboveLevel: ; 4dc31 - ld c, $0 - ld a, [wPartyCount] - ld d, a -.loop - ld a, d - dec a - push hl - push bc - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - pop bc - ld a, b - cp [hl] - pop hl - jr c, .greater - ld a, c - or $1 - ld c, a - -.greater - sla c - dec d - jr nz, .loop - call RetroactivelyIgnoreEggs - ld a, c - and a - ret - -FindThatSpecies: ; 4dc56 -; Find species b in your party. -; If you have no Pokemon, returns c = -1 and z. -; If that species is in your party, returns its location in c, and nz. -; Otherwise, returns z. - ld c, -1 - ld hl, wPartySpecies -.loop - ld a, [hli] - cp -1 - ret z - inc c - cp b - jr nz, .loop - ld a, $1 - and a - ret - -RetroactivelyIgnoreEggs: ; 4dc67 - ld e, -2 - ld hl, wPartySpecies -.loop - ld a, [hli] - cp -1 - ret z - cp EGG - jr nz, .skip_notegg - ld a, c - and e - ld c, a - -.skip_notegg - rlc e - jr .loop diff --git a/engine/select_menu.asm b/engine/select_menu.asm deleted file mode 100755 index 9898afda2..000000000 --- a/engine/select_menu.asm +++ /dev/null @@ -1,191 +0,0 @@ -SelectMenu:: ; 13327 - - call CheckRegisteredItem - jr c, .NotRegistered - jp UseRegisteredItem - -.NotRegistered: - call OpenText - ld b, BANK(ItemMayBeRegisteredText) - ld hl, ItemMayBeRegisteredText - call MapTextbox - call WaitButton - jp CloseText -; 13340 - - -ItemMayBeRegisteredText: ; 13340 - text_jump UnknownText_0x1c1cf3 - db "@" -; 13345 - - -CheckRegisteredItem: ; 13345 - - ld a, [wWhichRegisteredItem] - and a - jr z, .NoRegisteredItem - and REGISTERED_POCKET - rlca - rlca - ld hl, .Pockets - rst JumpTable - ret - -.Pockets: -; entries correspond to *_POCKET constants - dw .CheckItem - dw .CheckBall - dw .CheckKeyItem - dw .CheckTMHM - -.CheckItem: - ld hl, wNumItems - call .CheckRegisteredNo - jr c, .NoRegisteredItem - inc hl - ld e, a - ld d, 0 - add hl, de - add hl, de - call .IsSameItem - jr c, .NoRegisteredItem - and a - ret - -.CheckKeyItem: - ld a, [wRegisteredItem] - ld hl, wKeyItems - ld de, 1 - call IsInArray - jr nc, .NoRegisteredItem - ld a, [wRegisteredItem] - ld [wCurItem], a - and a - ret - -.CheckBall: - ld hl, wNumBalls - call .CheckRegisteredNo - jr nc, .NoRegisteredItem - inc hl - ld e, a - ld d, 0 - add hl, de - add hl, de - call .IsSameItem - jr c, .NoRegisteredItem - ret - -.CheckTMHM: - jr .NoRegisteredItem - -.NoRegisteredItem: - xor a - ld [wWhichRegisteredItem], a - ld [wRegisteredItem], a - scf - ret -; 133a6 - - -.CheckRegisteredNo: ; 133a6 - ld a, [wWhichRegisteredItem] - and REGISTERED_NUMBER - dec a - cp [hl] - jr nc, .NotEnoughItems - ld [wCurItemQuantity], a - and a - ret - -.NotEnoughItems: - scf - ret -; 133b6 - - -.IsSameItem: ; 133b6 - ld a, [wRegisteredItem] - cp [hl] - jr nz, .NotSameItem - ld [wCurItem], a - and a - ret - -.NotSameItem: - scf - ret -; 133c3 - - -UseRegisteredItem: ; 133c3 - - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - ld hl, .SwitchTo - rst JumpTable - ret - -.SwitchTo: -; entries correspond to ITEMMENU_* constants - dw .CantUse - dw .NoFunction - dw .NoFunction - dw .NoFunction - dw .Current - dw .Party - dw .Overworld -; 133df - -.NoFunction: ; 133df - call OpenText - call CantUseItem - call CloseText - and a - ret -; 133ea - -.Current: ; 133ea - call OpenText - call DoItemEffect - call CloseText - and a - ret -; 133f5 - -.Party: ; 133f5 - call RefreshScreen - call FadeToMenu - call DoItemEffect - call CloseSubmenu - call CloseText - and a - ret -; 13406 - -.Overworld: ; 13406 - call RefreshScreen - ld a, 1 - ld [wUsingItemWithSelect], a - call DoItemEffect - xor a - ld [wUsingItemWithSelect], a - ld a, [wItemEffectSucceeded] - cp 1 - jr nz, ._cantuse - scf - ld a, HMENURETURN_SCRIPT - ld [hMenuReturn], a - ret -; 13422 - -.CantUse: ; 13422 - call RefreshScreen - -._cantuse - call CantUseItem - call CloseText - and a - ret -; 1342d diff --git a/engine/sgb_layouts.asm b/engine/sgb_layouts.asm deleted file mode 100644 index 24bdc952e..000000000 --- a/engine/sgb_layouts.asm +++ /dev/null @@ -1,605 +0,0 @@ -LoadSGBLayout: ; 864c - call CheckCGB - jp nz, LoadSGBLayoutCGB - - ld a, b - cp SCGB_RAM - jr nz, .not_ram - ld a, [wSGBPredef] -.not_ram - cp SCGB_PARTY_MENU_HP_PALS - jp z, SGB_ApplyPartyMenuHPPals - ld l, a - ld h, 0 - add hl, hl - ld de, .Jumptable - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, _LoadSGBLayout_ReturnFromJumpTable - push de - jp hl -; 866f - -.Jumptable: ; 866f - dw .SGB_BattleGrayscale - dw .SGB_BattleColors - dw .SGB_PokegearPals - dw .SGB_StatsScreenHPPals - dw .SGB_Pokedex - dw .SGB_SlotMachine - dw .SGB06 - dw .SGB_GSIntro - dw .SGB_Diploma - dw .SGB_MapPals - dw .SGB_PartyMenu - dw .SGB_Evolution - dw .SGB_GSTitleScreen - dw .SGB0d - dw .SGB_MoveList - dw .SGB0f - dw .SGB_PokedexSearchOption - dw .SGB11 - dw .SGB12 - dw .SGB13 - dw .SGB_PackPals - dw .SGB_TrainerCard - dw .SGB_PokedexUnownMode - dw .SGB_BillsPC - dw .SGB_UnownPuzzle - dw .SGB_GamefreakLogo - dw .SGB_PlayerOrMonFrontpicPals - dw .SGB_TradeTube - dw .SGB_TrainerOrMonFrontpicPals - dw .SGB_MysteryGift - dw .SGB1e -; 86ad - -.SGB_BattleGrayscale: ; 86ad - ld hl, PalPacket_BattleGrayscale - ld de, BlkPacket_Battle - ret -; 86b4 - -.SGB_BattleColors: ; 86b4 - ld hl, BlkPacket_Battle - call PushSGBPals_ - - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - - ld a, [wPlayerHPPal] - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld de, HPBarPals - add hl, de - - ld a, [hli] - ld [wSGBPals + 3], a - ld a, [hli] - ld [wSGBPals + 4], a - ld a, [hli] - ld [wSGBPals + 5], a - ld a, [hl] - ld [wSGBPals + 6], a - - ld a, [wEnemyHPPal] - ld l, a - ld h, 0 - add hl, hl - add hl, hl - - ld de, HPBarPals - add hl, de - ld a, [hli] - ld [wSGBPals + 9], a - ld a, [hli] - ld [wSGBPals + 10], a - ld a, [hli] - ld [wSGBPals + 11], a - ld a, [hl] - ld [wSGBPals + 12], a - - ld hl, PalPacket_9cf6 - ld de, wSGBPals + PALPACKET_LENGTH - ld bc, PALPACKET_LENGTH - call CopyBytes - - call GetBattlemonBackpicPalettePointer - - ld a, [hli] - ld [wSGBPals + 19], a - ld a, [hli] - ld [wSGBPals + 20], a - ld a, [hli] - ld [wSGBPals + 21], a - ld a, [hl] - ld [wSGBPals + 22], a - call GetEnemyFrontpicPalettePointer - ld a, [hli] - ld [wSGBPals + 25], a - ld a, [hli] - ld [wSGBPals + 26], a - ld a, [hli] - ld [wSGBPals + 27], a - ld a, [hl] - ld [wSGBPals + 28], a - - ld hl, wSGBPals - ld de, wSGBPals + PALPACKET_LENGTH - ld a, SCGB_BATTLE_COLORS - ld [wSGBPredef], a - ret -; 873c - -.SGB_MoveList: ; 873c - ld hl, PalPacket_9bd6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - - ld hl, wSGBPals + 1 - ld [hl], $10 - inc hl - inc hl - - ld a, [wPlayerHPPal] - add PREDEFPAL_HP_GREEN - ld [hl], a - ld hl, wSGBPals - ld de, BlkPacket_MoveList - ret -; 875c - -.SGB_PokegearPals: ; 875c - ld hl, PalPacket_Pokegear - ld de, BlkPacket_9a86 - ret -; 8763 - -.SGB_StatsScreenHPPals: ; 8763 - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - ld a, [wCurHPPal] - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld de, HPBarPals - add hl, de - ld a, [hli] - ld [wSGBPals + 3], a - ld a, [hli] - ld [wSGBPals + 4], a - ld a, [hli] - ld [wSGBPals + 5], a - ld a, [hl] - ld [wSGBPals + 6], a - ld a, [wCurPartySpecies] - ld bc, wTempMonDVs - call GetPlayerOrMonPalettePointer - ld a, [hli] - ld [wSGBPals + 9], a - ld a, [hli] - ld [wSGBPals + 10], a - ld a, [hli] - ld [wSGBPals + 11], a - ld a, [hl] - ld [wSGBPals + 12], a - ld hl, wSGBPals - ld de, BlkPacket_StatsScreen - ret -; 87ab - -.SGB_PartyMenu: ; 87ab - ld hl, PalPacket_PartyMenu - ld de, wSGBPals + 1 - ret -; 87b2 - -.SGB_Pokedex: ; 87b2 - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - ld hl, wSGBPals + 3 - ld [hl], LOW(palred 31 + palgreen 20 + palblue 10) - inc hl - ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10) - inc hl - ld [hl], LOW(palred 26 + palgreen 10 + palblue 6) - inc hl - ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6) - ld a, [wCurPartySpecies] - call GetMonPalettePointer_ - ld a, [hli] - ld [wSGBPals + 9], a - ld a, [hli] - ld [wSGBPals + 10], a - ld a, [hli] - ld [wSGBPals + 11], a - ld a, [hl] - ld [wSGBPals + 12], a - ld hl, wSGBPals - ld de, BlkPacket_Pokedex_PC - ret -; 87e9 - -.SGB_BillsPC: ; 87e9 - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - ld hl, wSGBPals + 3 - ld [hl], LOW(palred 31 + palgreen 20 + palblue 10) - inc hl - ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10) - inc hl - ld [hl], LOW(palred 26 + palgreen 10 + palblue 6) - inc hl - ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6) - ld a, [wCurPartySpecies] - ld bc, wTempMonDVs - call GetPlayerOrMonPalettePointer - ld a, [hli] - ld [wSGBPals + 9], a - ld a, [hli] - ld [wSGBPals + 10], a - ld a, [hli] - ld [wSGBPals + 11], a - ld a, [hl] - ld [wSGBPals + 12], a - ld hl, wSGBPals - ld de, BlkPacket_Pokedex_PC - ret -; 8823 - -.SGB_PokedexUnownMode: ; 8823 - call .SGB_Pokedex - ld de, BlkPacket_PokedexUnownMode - ret -; 882a - -.SGB_PokedexSearchOption: ; 882a - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - ld hl, wSGBPals + 3 - ld [hl], LOW(palred 31 + palgreen 20 + palblue 10) - inc hl - ld [hl], HIGH(palred 31 + palgreen 20 + palblue 10) - inc hl - ld [hl], LOW(palred 26 + palgreen 10 + palblue 6) - inc hl - ld [hl], HIGH(palred 26 + palgreen 10 + palblue 6) - ld hl, wSGBPals - ld de, BlkPacket_9a86 - ret -; 884b - -.SGB_PackPals: ; 884b - ld hl, PalPacket_Pack - ld de, BlkPacket_9a86 - ret -; 8852 - -.SGB_SlotMachine: ; 8852 - ld hl, PalPacket_SlotMachine - ld de, BlkPacket_SlotMachine - ret -; 8859 - -.SGB06: ; 8859 - ld hl, PalPacket_SCGB_06 - ld de, BlkPacket_SCGB_06 - ret -; 8860 - -.SGB_Diploma: -.SGB_MysteryGift: ; 8860 - ld hl, PalPacket_Diploma - ld de, BlkPacket_9a86 - ret -; 8867 - -.SGB_GSIntro: ; 8867 - ld b, 0 - ld hl, .BlkPacketTable_GSIntro -rept 4 - add hl, bc -endr - ld e, [hl] - inc hl - ld d, [hl] - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - ret -; 8878 - -.BlkPacketTable_GSIntro: ; 8878 - dw BlkPacket_9a86, PalPacket_GSIntroShellderLapras - dw BlkPacket_GSIntroJigglypuffPikachu, PalPacket_GSIntroJigglypuffPikachu - dw BlkPacket_9a86, PalPacket_GSIntroStartersTransition -; 8884 - -.SGB_GSTitleScreen: ; 8884 - ld hl, PalPacket_GSTitleScreen - ld de, BlkPacket_GSTitleScreen - ld a, SCGB_DIPLOMA - ld [wSGBPredef], a - ret -; 8890 - -.SGB13: ; 8890 - ld hl, PalPacket_SCGB_13 - ld de, BlkPacket_SCGB_13 - ret -; 8897 - -.SGB0f: ; 8897 - ld hl, PalPacket_SCGB_0F - ld de, BlkPacket_9a86 - ret -; 889e - -.SGB11: ; 889e - ld hl, BlkPacket_9a86 - ld de, wPlayerLightScreenCount ; ??? - ld bc, PALPACKET_LENGTH - call CopyBytes - ld hl, PalPacket_SCGB_11 - ld de, BlkPacket_9a86 - ret -; 88b1 - -.SGB_MapPals: ; 88b1 - ld hl, PalPacket_9bd6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - call .GetMapPalsIndex - ld hl, wSGBPals + 1 - ld [hld], a - ld de, BlkPacket_9a86 - ld a, SCGB_MAPPALS - ld [wSGBPredef], a - ret -; 88cd - -.SGB_Evolution: ; 88cd - push bc - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - pop bc - ld a, c - and a - jr z, .partymon - ; Egg - ld hl, wSGBPals + 3 - ld [hl], LOW(palred 7 + palgreen 7 + palblue 7) - inc hl - ld [hl], HIGH(palred 7 + palgreen 7 + palblue 7) - inc hl - ld [hl], LOW(palred 2 + palgreen 3 + palblue 3) - inc hl - ld [hl], HIGH(palred 2 + palgreen 3 + palblue 3) - jr .done - -.partymon - ld hl, wPartyMon1DVs - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld c, l - ld b, h - ld a, [wPlayerHPPal] - call GetPlayerOrMonPalettePointer - ld a, [hli] - ld [wSGBPals + 3], a - ld a, [hli] - ld [wSGBPals + 4], a - ld a, [hli] - ld [wSGBPals + 5], a - ld a, [hl] - ld [wSGBPals + 6], a - -.done - ld hl, wSGBPals - ld de, BlkPacket_9a86 - ret -; 891a - -.SGB0d: -.SGB_TrainerCard: ; 891a - ld hl, PalPacket_Diploma - ld de, BlkPacket_9a86 - ret -; 8921 - -.SGB_UnownPuzzle: ; 8921 - ld hl, PalPacket_UnownPuzzle - ld de, BlkPacket_9a86 - ret -; 8928 - -.SGB12: ; 8928 - ld hl, PalPacket_9bd6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - ld hl, BlkPacket_9a86 - ld de, wSGBPals + PALPACKET_LENGTH - ld bc, PALPACKET_LENGTH - call CopyBytes - call .GetMapPalsIndex - ld hl, wSGBPals + 1 - ld [hl], a - ld hl, wSGBPals + 3 - ld [hl], $2e - ld hl, wSGBPals + $13 - ld a, 5 - ld [hli], a - ld a, [wMenuBorderLeftCoord] - ld [hli], a - ld a, [wMenuBorderTopCoord] - ld [hli], a - ld a, [wMenuBorderRightCoord] - ld [hli], a - ld a, [wMenuBorderBottomCoord] - ld [hl], a - ld hl, wSGBPals - ld de, wSGBPals + PALPACKET_LENGTH - ret -; 8969 - -.SGB1e: ; 8969 - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - ld a, [wCurPartySpecies] - ld l, a - ld h, 0 - add hl, hl - add hl, hl - add hl, hl - ld de, PokemonPalettes - add hl, de - ld a, [wcf65] - and 3 - sla a - sla a - ld c, a - ld b, 0 - add hl, bc - ld a, [hli] - ld [wSGBPals + 3], a - ld a, [hli] - ld [wSGBPals + 4], a - ld a, [hli] - ld [wSGBPals + 5], a - ld a, [hl] - ld [wSGBPals + 6], a - ld hl, wSGBPals - ld de, BlkPacket_9a86 - ret -; 89a6 - -.SGB_GamefreakLogo: ; 89a6 - ld hl, PalPacket_GamefreakLogo - ld de, BlkPacket_9a86 - ret -; 89ad - -.SGB_PlayerOrMonFrontpicPals: ; 89ad - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - ld a, [wCurPartySpecies] - ld bc, wTempMonDVs - call GetPlayerOrMonPalettePointer - ld a, [hli] - ld [wSGBPals + 3], a - ld a, [hli] - ld [wSGBPals + 4], a - ld a, [hli] - ld [wSGBPals + 5], a - ld a, [hl] - ld [wSGBPals + 6], a - ld hl, wSGBPals - ld de, BlkPacket_9a86 - ret -; 89d9 - -.SGB_TradeTube: ; 89d9 - ld hl, PalPacket_TradeTube - ld de, BlkPacket_9a86 - ret -; 89e0 - -.SGB_TrainerOrMonFrontpicPals: ; 89e0 - ld hl, PalPacket_9ce6 - ld de, wSGBPals - ld bc, PALPACKET_LENGTH - call CopyBytes - ld a, [wCurPartySpecies] - ld bc, wTempMonDVs - call GetFrontpicPalettePointer - ld a, [hli] - ld [wSGBPals + 3], a - ld a, [hli] - ld [wSGBPals + 4], a - ld a, [hli] - ld [wSGBPals + 5], a - ld a, [hl] - ld [wSGBPals + 6], a - ld hl, wSGBPals - ld de, BlkPacket_9a86 - ret -; 8a0c - -.GetMapPalsIndex: ; 8a0c - ld a, [wTimeOfDayPal] - cp NITE_F - jr c, .morn_day - ld a, PREDEFPAL_NITE - ret - -.morn_day - ld a, [wEnvironment] - cp ROUTE - jr z, .route - cp CAVE - jr z, .cave - cp DUNGEON - jr z, .cave - cp ENVIRONMENT_5 - jr z, .perm5 - cp GATE - jr z, .gate - ld a, [wMapGroup] - ld e, a - ld d, 0 - ld hl, MapGroupRoofSGBPalInds - add hl, de - ld a, [hl] - ret - -.route - ld a, PREDEFPAL_00 - ret - -.cave - ld a, PREDEFPAL_DUNGEONS - ret - -.perm5 - ld a, PREDEFPAL_VERMILION - ret - -.gate - ld a, PREDEFPAL_PEWTER - ret -; 8a45 - -INCLUDE "data/maps/sgb_roof_pal_inds.asm" - -_LoadSGBLayout_ReturnFromJumpTable: ; 8a60 - push de - call PushSGBPals_ - pop hl - jp PushSGBPals_ -; 8a68 diff --git a/engine/slot_machine.asm b/engine/slot_machine.asm deleted file mode 100755 index 924c78924..000000000 --- a/engine/slot_machine.asm +++ /dev/null @@ -1,2352 +0,0 @@ -SLOTS_NO_BIAS EQU -1 -SLOTS_NO_MATCH EQU -1 - -SLOTS_SEVEN EQU $00 -SLOTS_POKEBALL EQU $04 -SLOTS_CHERRY EQU $08 -SLOTS_PIKACHU EQU $0c -SLOTS_SQUIRTLE EQU $10 -SLOTS_STARYU EQU $14 - -REEL_SIZE EQU 15 - -; Constants for slot_reel offsets (see macros/wram.asm) -REEL_ACTION EQUS "(wReel1ReelAction - wReel1)" -REEL_TILEMAP_ADDR EQUS "(wReel1TilemapAddr - wReel1)" -REEL_POSITION EQUS "(wReel1Position - wReel1)" -REEL_SPIN_DISTANCE EQUS "(wReel1SpinDistance - wReel1)" -REEL_SPIN_RATE EQUS "(wReel1SpinRate - wReel1)" -REEL_OAM_ADDR EQUS "(wReel1OAMAddr - wReel1)" -REEL_X_COORD EQUS "(wReel1XCoord - wReel1)" -REEL_MANIP_COUNTER EQUS "(wReel1ManipCounter - wReel1)" -REEL_MANIP_DELAY EQUS "(wReel1ManipDelay - wReel1)" -REEL_FIELD_0B EQUS "(wReel1Field0b - wReel1)" -REEL_STOP_DELAY EQUS "(wReel1StopDelay - wReel1)" - -; SlotsJumptable constants - const_def - const SLOTS_INIT - const SLOTS_BET_AND_START - const SLOTS_WAIT_START - const SLOTS_WAIT_REEL1 - const SLOTS_WAIT_STOP_REEL1 - const SLOTS_WAIT_REEL2 - const SLOTS_WAIT_STOP_REEL2 - const SLOTS_WAIT_REEL3 - const SLOTS_WAIT_STOP_REEL3 - const SLOTS_NEXT_09 - const SLOTS_NEXT_0A - const SLOTS_NEXT_0B - const SLOTS_FLASH_IF_WIN - const SLOTS_FLASH_SCREEN - const SLOTS_GIVE_EARNED_COINS - const SLOTS_PAYOUT_TEXT_AND_ANIM - const SLOTS_PAYOUT_ANIM - const SLOTS_RESTART_OF_QUIT - const SLOTS_QUIT -SLOTS_END_LOOP_F EQU 7 - -; ReelActionJumptable constants - const_def - const REEL_ACTION_DO_NOTHING - const REEL_ACTION_STOP_REEL_IGNORE_JOYPAD - const REEL_ACTION_QUADRUPLE_RATE - const REEL_ACTION_DOUBLE_RATE - const REEL_ACTION_NORMAL_RATE - const REEL_ACTION_HALF_RATE - const REEL_ACTION_QUARTER_RATE - const REEL_ACTION_STOP_REEL1 - const REEL_ACTION_STOP_REEL2 - const REEL_ACTION_STOP_REEL3 - const REEL_ACTION_SET_UP_REEL2_SKIP_TO_7 - const REEL_ACTION_WAIT_REEL2_SKIP_TO_7 - const REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S - const REEL_ACTION_UNUSED - const REEL_ACTION_CHECK_DROP_REEL - const REEL_ACTION_WAIT_DROP_REEL - const REEL_ACTION_START_SLOW_ADVANCE_REEL3 - const REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3 - const REEL_ACTION_INIT_GOLEM - const REEL_ACTION_WAIT_GOLEM - const REEL_ACTION_END_GOLEM - const REEL_ACTION_INIT_CHANSEY - const REEL_ACTION_WAIT_CHANSEY - const REEL_ACTION_WAIT_EGG - const REEL_ACTION_DROP_REEL - -_SlotMachine: - ld hl, wOptions - set NO_TEXT_SCROLL, [hl] - call .InitGFX - call DelayFrame -.loop - call SlotsLoop - jr nc, .loop - call WaitSFX - ld de, SFX_QUIT_SLOTS - call PlaySFX - call WaitSFX - call ClearBGPalettes - farcall StubbedTrainerRankings_EndSlotsWinStreak - ld hl, wOptions - res NO_TEXT_SCROLL, [hl] - ld hl, rLCDC - res rLCDC_SPRITE_SIZE, [hl] ; 8x8 - ret - -.InitGFX: ; 926f7 (24:66f7) - call ClearBGPalettes - call ClearTileMap - call ClearSprites - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - call DisableLCD - hlbgcoord 0, 0 - ld bc, vBGMap1 - vBGMap0 - ld a, " " - call ByteFill - ld b, SCGB_SLOT_MACHINE - call GetSGBLayout - callfar ClearSpriteAnims - ld hl, wSlots - ld bc, wSlotsDataEnd - wSlots - xor a - call ByteFill - - ld hl, Slots2LZ - ld de, vTiles0 tile $00 - call Decompress - - ld hl, Slots3LZ - ld de, vTiles0 tile $40 - call Decompress - - ld hl, Slots1LZ - ld de, vTiles2 tile $00 - call Decompress - - ld hl, Slots2LZ - ld de, vTiles2 tile $25 - call Decompress - - ld hl, SlotsTilemap - decoord 0, 0 - ld bc, SCREEN_WIDTH * 12 - call CopyBytes - - ld hl, rLCDC - set rLCDC_SPRITE_SIZE, [hl] ; 8x16 - call EnableLCD - ld hl, wSlots - ld bc, wSlotsEnd - wSlots - xor a - call ByteFill - call Slots_InitReelTiles - call Slots_GetPals - ld a, $7 - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], $40 - xor a ; SLOTS_INIT - ld [wJumptableIndex], a - ld a, SLOTS_NO_BIAS - ld [wSlotBias], a - ld de, MUSIC_GAME_CORNER - call PlayMusic - xor a - ld [wKeepSevenBiasChance], a ; 87.5% chance - call Random - and %00101010 - ret nz - ld a, 1 - ld [wKeepSevenBiasChance], a ; 12.5% chance - ret - -Slots_GetPals: ; 9279b (24:679b) - ld a, %11100100 - call DmgToCgbBGPals - lb de, %11100100, %11100100 - ld a, [hCGB] - and a - jr nz, .cgb - lb de, %11000000, %11100100 -.cgb - call DmgToCgbObjPals - ret - -SlotsLoop: ; 927af (24:67af) - ld a, [wJumptableIndex] - bit SLOTS_END_LOOP_F, a - jr nz, .stop - call SlotsJumptable - call Slots_SpinReels - xor a - ld [wCurrSpriteOAMAddr], a - callfar DoNextFrameForFirst16Sprites - call .PrintCoinsAndPayout - call .Stubbed_Function927d3 - call DelayFrame - and a - ret - -.stop - scf - ret - -.Stubbed_Function927d3: ; 927d3 (24:67d3) -; dummied out - ret - ld a, [wReel1ReelAction] - and a - ret nz - ld a, [wReel2ReelAction] - and a - ret nz - ld a, [wFirstTwoReelsMatchingSevens] - and a - jr nz, .matching_sevens - ld a, %11100100 - call DmgToCgbBGPals - ret - -.matching_sevens - ld a, [wTextDelayFrames] - and $7 - ret nz - ld a, [rBGP] - xor %00001100 - call DmgToCgbBGPals - ret - -; 927f8 - -.PrintCoinsAndPayout: ; 927f8 (24:67f8) - hlcoord 5, 1 - ld de, wCoins - lb bc, PRINTNUM_LEADINGZEROS | 2, 4 - call PrintNum - hlcoord 11, 1 - ld de, wPayout - lb bc, PRINTNUM_LEADINGZEROS | 2, 4 - call PrintNum - ret - -; 92811 (24:6811) - -Unreferenced_Function92811: ; 92811 -; debug function? - ld a, [wSlotBias] - add 0 - daa - ld e, a - and $f - add "0" - hlcoord 1, 0 - ld [hl], a - ld a, e - swap a - and $f - add "0" - hlcoord 0, 0 - ld [hl], a - ret - -; 9282c - -Unreferenced_Function9282c: ; 9282c -; animate OAM tiles? - ld hl, wcf66 - ld a, [hl] - inc [hl] - and $7 - ret nz - ld hl, wVirtualOAMSprite16TileID - ld c, NUM_SPRITE_OAM_STRUCTS - 16 -.loop - ld a, [hl] - xor %00100000 - ld [hli], a ; tile id -rept SPRITEOAMSTRUCT_LENGTH + -1 - inc hl -endr - dec c - jr nz, .loop - ret - -; 92844 - -SlotsJumptable: ; 92844 (24:6844) - jumptable .Jumptable, wJumptableIndex - -.Jumptable: - dw SlotsAction_Init ; 00 - dw SlotsAction_BetAndStart ; 01 - dw SlotsAction_WaitStart ; 02 - dw SlotsAction_WaitReel1 ; 03 - dw SlotsAction_WaitStopReel1 ; 04 - dw SlotsAction_WaitReel2 ; 05 - dw SlotsAction_WaitStopReel2 ; 06 - dw SlotsAction_WaitReel3 ; 07 - dw SlotsAction_WaitStopReel3 ; 08 - dw SlotsAction_Next ; 09 - dw SlotsAction_Next ; 0a - dw SlotsAction_Next ; 0b - dw SlotsAction_FlashIfWin ; 0c - dw SlotsAction_FlashScreen ; 0d - dw SlotsAction_GiveEarnedCoins ; 0e - dw SlotsAction_PayoutTextAndAnim ; 0f - dw SlotsAction_PayoutAnim ; 10 - dw SlotsAction_RestartOrQuit ; 11 - dw SlotsAction_Quit ; 12 - -SlotsAction_Next: ; 92879 (24:6879) - ld hl, wJumptableIndex - inc [hl] - ret - -SlotsAction_Init: ; 9287e (24:687e) - call SlotsAction_Next - xor a - ld [wFirstTwoReelsMatching], a - ld [wFirstTwoReelsMatchingSevens], a - ld a, SLOTS_NO_MATCH - ld [wSlotMatched], a - ret - -SlotsAction_BetAndStart: ; 9288e (24:688e) - call Slots_AskBet - jr nc, .proceed - ld a, SLOTS_QUIT - ld [wJumptableIndex], a - ret - -.proceed - call SlotsAction_Next - call Slots_IlluminateBetLights - call Slots_InitBias - ld a, 32 - ld [wSlotsDelay], a - ld a, REEL_ACTION_NORMAL_RATE - ld [wReel1ReelAction], a - ld [wReel2ReelAction], a - ld [wReel3ReelAction], a - ld a, 4 - ld [wReel1ManipCounter], a - ld [wReel2ManipCounter], a - ld [wReel3ManipCounter], a - call WaitSFX - ld a, SFX_SLOT_MACHINE_START - call Slots_PlaySFX - ret - -SlotsAction_WaitStart: ; 928c6 (24:68c6) - ld hl, wSlotsDelay - ld a, [hl] - and a - jr z, .proceed - dec [hl] - ret - -.proceed - call SlotsAction_Next - xor a - ld [hJoypadSum], a - ret - -SlotsAction_WaitReel1: ; 928d6 (24:68d6) - ld hl, hJoypadSum - ld a, [hl] - and A_BUTTON - ret z - call SlotsAction_Next - call Slots_StopReel1 - ld [wReel1ReelAction], a -SlotsAction_WaitStopReel1: ; 928e6 (24:68e6) - ld a, [wReel1ReelAction] - cp REEL_ACTION_DO_NOTHING - ret nz - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - ld bc, wReel1 - ld de, wReel1Stopped - call Slots_LoadReelState - call SlotsAction_Next - xor a - ld [hJoypadSum], a -SlotsAction_WaitReel2: ; 92900 (24:6900) - ld hl, hJoypadSum - ld a, [hl] - and A_BUTTON - ret z - call SlotsAction_Next - call Slots_StopReel2 - ld [wReel2ReelAction], a -SlotsAction_WaitStopReel2: ; 92910 (24:6910) - ld a, [wReel2ReelAction] - cp REEL_ACTION_DO_NOTHING - ret nz - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - ld bc, wReel2 - ld de, wReel2Stopped - call Slots_LoadReelState - call SlotsAction_Next - xor a - ld [hJoypadSum], a -SlotsAction_WaitReel3: ; 9292a (24:692a) - ld hl, hJoypadSum - ld a, [hl] - and A_BUTTON - ret z - call SlotsAction_Next - call Slots_StopReel3 - ld [wReel3ReelAction], a -SlotsAction_WaitStopReel3: ; 9293a (24:693a) - ld a, [wReel3ReelAction] - cp REEL_ACTION_DO_NOTHING - ret nz - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - ld bc, wReel3 - ld de, wReel3Stopped - call Slots_LoadReelState - call SlotsAction_Next - xor a - ld [hJoypadSum], a - ret - -SlotsAction_FlashIfWin: ; 92955 (24:6955) - ld a, [wSlotMatched] - cp SLOTS_NO_MATCH - jr nz, .GotIt - call SlotsAction_Next - call SlotsAction_Next - ret - -.GotIt: - call SlotsAction_Next - ld a, 16 - ld [wSlotsDelay], a -SlotsAction_FlashScreen: ; 9296b (24:696b) - ld hl, wSlotsDelay - ld a, [hl] - and a - jr z, .done - dec [hl] - srl a - ret z - - ld a, [rOBP0] - xor $ff - ld e, a - ld d, a - call DmgToCgbObjPals - ret - -.done - call Slots_GetPals - call SlotsAction_Next - ret - -SlotsAction_GiveEarnedCoins: ; 92987 (24:6987) - xor a - ld [wFirstTwoReelsMatching], a - ld [wFirstTwoReelsMatchingSevens], a - ld a, %11100100 - call DmgToCgbBGPals - call Slots_GetPayout - xor a - ld [wSlotsDelay], a - call SlotsAction_Next - ret - -SlotsAction_PayoutTextAndAnim: ; 9299e (24:699e) - call Slots_PayoutText - call SlotsAction_Next -SlotsAction_PayoutAnim: ; 929a4 (24:69a4) - ld hl, wSlotsDelay - ld a, [hl] - inc [hl] - and $1 - ret z - ld hl, wPayout - ld a, [hli] - ld d, a - or [hl] - jr z, .done - ld e, [hl] - dec de - ld [hl], e - dec hl - ld [hl], d - ld hl, wCoins - ld d, [hl] - inc hl - ld e, [hl] - call Slots_CheckCoinCaseFull - jr c, .okay - inc de -.okay - ld [hl], e - dec hl - ld [hl], d - ld a, [wSlotsDelay] - and $7 - ret z ; ret nz would be more appropriate - ld de, SFX_GET_COIN_FROM_SLOTS - call PlaySFX - ret - -.done - call SlotsAction_Next - ret - -SlotsAction_RestartOrQuit: ; 929d9 (24:69d9) - call Slots_DeilluminateBetLights - call WaitPressAorB_BlinkCursor - call Slots_AskPlayAgain - jr c, .exit_slots - ld a, SLOTS_INIT - ld [wJumptableIndex], a - ret - -.exit_slots - ld a, SLOTS_QUIT - ld [wJumptableIndex], a - ret - -SlotsAction_Quit: ; 929f0 (24:69f0) - ld hl, wJumptableIndex - set SLOTS_END_LOOP_F, [hl] - ret - -Slots_LoadReelState: ; 929f6 (24:69f6) - push de - call Slots_GetCurrentReelState - pop de - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - ret - -Slots_CheckCoinCaseFull: ; 92a04 (24:6a04) - ld a, d - cp HIGH(MAX_COINS) - jr c, .not_full - ld a, e - cp LOW(MAX_COINS) - jr c, .not_full - scf - ret - -.not_full - and a - ret - -Slots_GetCurrentReelState: ; 92a12 (24:6a12) - ld hl, REEL_POSITION - add hl, bc - ld a, [hl] - and a - jr nz, .okay - ld a, $f -.okay - dec a - and $f - ld e, a - ld d, $0 - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - add hl, de - ret - -Slots_StopReel1: ; 92a2b (24:6a2b) -; Always set the REEL_ACTION_STOP_REEL1 action. - ld a, REEL_ACTION_STOP_REEL1 - ret - -Slots_StopReel2: ; 92a2e (24:6a2e) -; As long as, the following three meet, there's a 31.25% chance -; to set action REEL_ACTION_SET_UP_REEL2_SKIP_TO_7: -; - Bet is >= 2 coins -; - There's a 7 symbol visible in reel #1 -; - Current spin isn't biased or is biased towards SEVEN -; In any other case, REEL_ACTION_STOP_REEL2 is set. - - ld a, [wSlotBet] - cp $2 - jr c, .dont_jump - ld a, [wSlotBias] - and a - jr z, .skip - cp SLOTS_NO_BIAS - jr nz, .dont_jump -.skip - call .CheckReel1ForASeven - jr nz, .dont_jump - call Random - cp $50 ; 32% - jr nc, .dont_jump - ld a, REEL_ACTION_SET_UP_REEL2_SKIP_TO_7 - ret - -.dont_jump - ld a, REEL_ACTION_STOP_REEL2 - ret - -.CheckReel1ForASeven: ; 92a51 (24:6a51) - ld a, [wReel1Stopped] - and a - ret z - ld a, [wReel1Stopped + 1] - and a - ret z - ld a, [wReel1Stopped + 2] - and a - ret - -Slots_StopReel3: ; 92a60 (24:6a60) -; If no matching SEVEN symbols in reels #1 and #2: -; - REEL_ACTION_STOP_REEL3, 100% - -; If matching SEVEN symbols and NO bias to SEVEN: -; - REEL_ACTION_STOP_REEL3, 37.5% -; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 31.3% -; - REEL_ACTION_INIT_GOLEM, 31.3% -; - REEL_ACTION_INIT_CHANSEY, 0% - -; If matching SEVEN symbols and bias to SEVEN: -; - REEL_ACTION_STOP_REEL3, 29.7% -; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 23.4% -; - REEL_ACTION_INIT_GOLEM, 23.4% -; - REEL_ACTION_INIT_CHANSEY, 23.4% - - ld a, [wFirstTwoReelsMatching] - and a - jr z, .stop - ld a, [wFirstTwoReelsMatchingSevens] - and a - jr z, .stop - ld a, [wSlotBias] - and a - jr nz, .biased - call Random - cp 180 - jr nc, .stop - cp 120 - jr nc, .slow_advance - cp 60 - jr nc, .golem - ld a, REEL_ACTION_INIT_CHANSEY - ret - -.biased - call Random - cp 160 - jr nc, .stop - cp 80 - jr nc, .slow_advance -.golem - ld a, REEL_ACTION_INIT_GOLEM - ret - -.slow_advance - ld a, REEL_ACTION_START_SLOW_ADVANCE_REEL3 - ret - -.stop - ld a, REEL_ACTION_STOP_REEL3 - ret - -Slots_InitReelTiles: ; 92a98 (24:6a98) - ld bc, wReel1 - ld hl, REEL_OAM_ADDR - add hl, bc - ld de, wVirtualOAMSprite16 - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld de, Reel1Tilemap - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_X_COORD - add hl, bc - ld [hl], 6 * 8 - call .OAM - - ld bc, wReel2 - ld hl, REEL_OAM_ADDR - add hl, bc - ld de, wVirtualOAMSprite24 - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld de, Reel2Tilemap - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_X_COORD - add hl, bc - ld [hl], 10 * 8 - call .OAM - - ld bc, wReel3 - ld hl, REEL_OAM_ADDR - add hl, bc - ld de, wVirtualOAMSprite32 - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld de, Reel3Tilemap - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_X_COORD - add hl, bc - ld [hl], 14 * 8 - call .OAM - ret - -.OAM: ; 92af9 (24:6af9) - ld hl, REEL_ACTION - add hl, bc - ld [hl], REEL_ACTION_DO_NOTHING - ld hl, REEL_POSITION - add hl, bc - ld [hl], REEL_SIZE - 1 - ld hl, REEL_SPIN_DISTANCE - add hl, bc - ld [hl], REEL_ACTION_DO_NOTHING - call Slots_UpdateReelPositionAndOAM - ret - -Slots_SpinReels: ; 92b0f (24:6b0f) - ld bc, wReel1 - call .SpinReel - ld bc, wReel2 - call .SpinReel - ld bc, wReel3 - call .SpinReel - ret - -.SpinReel: ; 92b22 (24:6b22) - ld hl, REEL_SPIN_DISTANCE - add hl, bc - ld a, [hl] - and $f - jr nz, .skip - call ReelActionJumptable -.skip - ld hl, REEL_SPIN_RATE - add hl, bc - ld a, [hl] - and a - ret z - ld d, a - ld hl, REEL_SPIN_DISTANCE - add hl, bc - add [hl] - ld [hl], a - and $f - jr z, Slots_UpdateReelPositionAndOAM - ld hl, REEL_OAM_ADDR - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld e, $8 -.loop - ld a, [hl] - add d - ld [hli], a - inc hl - inc hl - inc hl - dec e - jr nz, .loop - ret - -Slots_UpdateReelPositionAndOAM: ; 92b53 (24:6b53) - ld hl, REEL_X_COORD - add hl, bc - ld a, [hl] - ld [wCurrReelXCoord], a - ld a, 10 * 8 - ld [wCurrReelYCoord], a - ld hl, REEL_POSITION - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - add hl, de - ld e, l - ld d, h - call .LoadOAM - ld hl, REEL_POSITION - add hl, bc - ld a, [hl] - inc a - and $f - cp REEL_SIZE - jr nz, .load - xor a -.load - ld [hl], a - ret - -.LoadOAM: ; 92b83 (24:6b83) - ld hl, REEL_OAM_ADDR - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a -.loop - ld a, [wCurrReelYCoord] - ld [hli], a ; y - ld a, [wCurrReelXCoord] - ld [hli], a ; x - ld a, [de] - ld [hli], a ; tile id - srl a - srl a - set OAM_PRIORITY, a - ld [hli], a ; attributes - - ld a, [wCurrReelYCoord] - ld [hli], a ; y - ld a, [wCurrReelXCoord] - add 1 * TILE_WIDTH - ld [hli], a ; x - ld a, [de] - inc a - inc a - ld [hli], a ; tile id - srl a - srl a - set OAM_PRIORITY, a - ld [hli], a ; attributes - inc de - ld a, [wCurrReelYCoord] - sub 2 * TILE_WIDTH - ld [wCurrReelYCoord], a - cp 2 * TILE_WIDTH - jr nz, .loop - ret - -; 92bbe (24:6bbe) - -Unreferenced_Function92bbe: ; 92bbe - push hl - srl a - srl a - add LOW(.Unknown_92bce) - ld l, a - ld a, 0 - adc HIGH(.Unknown_92bce) - ld h, a - ld a, [hl] - pop hl - ret - -; 92bce - -.Unknown_92bce: ; 92bce - db 0, 1, 2, 3, 4, 5 -; 92bd4 - -ReelActionJumptable: ; 92bd4 (24:6bd4) - ld hl, REEL_ACTION - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -; 92be4 (24:6be4) - -.Jumptable: ; 92be4 - dw ReelAction_DoNothing ; 00 - dw ReelAction_StopReelIgnoreJoypad ; 01 - dw ReelAction_QuadrupleRate ; 02 - dw ReelAction_DoubleRate ; 03 - dw ReelAction_NormalRate ; 04 - dw ReelAction_HalfRate ; 05 - dw ReelAction_QuarterRate ; 06 - dw ReelAction_StopReel1 ; 07 - dw ReelAction_StopReel2 ; 08 - dw ReelAction_StopReel3 ; 09 - dw ReelAction_SetUpReel2SkipTo7 ; 0a - dw ReelAction_WaitReel2SkipTo7 ; 0b - dw ReelAction_FastSpinReel2UntilLinedUp7s ; 0c - dw ReelAction_Unused ; 0d - dw ReelAction_CheckDropReel ; 0e - dw ReelAction_WaitDropReel ; 0f - dw ReelAction_StartSlowAdvanceReel3 ; 10 - dw ReelAction_WaitSlowAdvanceReel3 ; 11 - dw ReelAction_InitGolem ; 12 - dw ReelAction_WaitGolem ; 13 - dw ReelAction_EndGolem ; 14 - dw ReelAction_InitChansey ; 15 - dw ReelAction_WaitChansey ; 16 - dw ReelAction_WaitEgg ; 17 - dw ReelAction_DropReel ; 18 -; 92c16 - -ReelAction_DoNothing: ; 92c16 - ret - -; 92c17 - -ReelAction_QuadrupleRate: ; 92c17 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 16 - ret - -; 92c1e - -ReelAction_DoubleRate: ; 92c1e - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 8 - ret - -; 92c25 - -ReelAction_NormalRate: ; 92c25 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 4 - ret - -; 92c2c - -ReelAction_HalfRate: ; 92c2c - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 2 - ret - -; 92c33 - -ReelAction_QuarterRate: ; 92c33 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 1 - ret - -; 92c3a - -Slots_StopReel: ; 92c3a - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - ld hl, REEL_ACTION - add hl, bc - ld [hl], REEL_ACTION_STOP_REEL_IGNORE_JOYPAD - ld hl, REEL_STOP_DELAY - add hl, bc - ld [hl], 3 -ReelAction_StopReelIgnoreJoypad: ; 92c4c - ld hl, REEL_STOP_DELAY - add hl, bc - ld a, [hl] - and a - jr z, .EndReel - dec [hl] - ret - -.EndReel: - ld hl, REEL_ACTION - add hl, bc - ld a, REEL_ACTION_DO_NOTHING - ld [hl], a - ret - -; 92c5e - -ReelAction_StopReel1: ; 92c5e -; If no bias: don't manipulate reel. -; If bias: manipulate reel up to wReel1ManipCounter (i.e. 4) slots, -; stoping early if the biased symbol shows up anywhere in reel #1, -; even if the current bet won't allow lining it up. - - ld a, [wSlotBias] - cp SLOTS_NO_BIAS - jr z, .NoBias - ld hl, REEL_MANIP_COUNTER - add hl, bc - ld a, [hl] - and a - jr z, .NoBias - dec [hl] - call .CheckForBias - ret nz -.NoBias: - call Slots_StopReel - ret - -; 92c76 - -.CheckForBias: ; 92c76 - call Slots_GetCurrentReelState - ld a, [wSlotBias] - ld e, a - ld a, [hli] - cp e - ret z - ld a, [hli] - cp e - ret z - ld a, [hl] - cp e - ret - -; 92c86 - -ReelAction_StopReel2: ; 92c86 -; If no bias: don't manipulate reel. -; If bias: manipulate reel up to wReel2ManipCounter (i.e. 4) slots, -; stoping early if the biased symbol is lined up in the first two -; reels, according to the lines that the current bet allows. - - call Slots_CheckMatchedFirstTwoReels - jr nc, .nope - ld a, [wSlotBuildingMatch] - ld hl, wSlotBias - cp [hl] - jr z, .NoBias -.nope - ld a, [wSlotBias] - cp SLOTS_NO_BIAS - jr z, .NoBias - ld hl, REEL_MANIP_COUNTER - add hl, bc - ld a, [hl] - and a - jr z, .NoBias - dec [hl] - ret - -.NoBias: - call Slots_StopReel - ret - -; 92ca9 - -ReelAction_StopReel3: ; 92ca9 -; Manipulate the reel up to wReel3ManipCounter (i.e. 4) slots, -; stopping early if the bias symbol is lined up for a win. -; If not biased to any symbols, stop as soon as nothing is lined up. - - call Slots_CheckMatchedAllThreeReels - jr nc, .NoMatch - ld hl, wSlotBias - cp [hl] - jr z, .NoBias - ld hl, REEL_MANIP_COUNTER - add hl, bc - ld a, [hl] - and a - ret z - dec [hl] - ret - -.NoMatch: - ld a, [wSlotBias] - cp SLOTS_NO_BIAS - jr z, .NoBias - ld hl, REEL_MANIP_COUNTER - add hl, bc - ld a, [hl] - and a - jr z, .NoBias - dec [hl] - ret - -.NoBias: - call Slots_StopReel - ret - -; 92cd2 - -ReelAction_SetUpReel2SkipTo7: ; 92cd2 -; Unique reel 2 action (see Slots_StopReel2) -; Ensures that 7 symbols become lined up in the first two reels, -; but more often than not, this is only a way to get our hopes up, as -; it makes exciting reel #3 modes with no success hope more common. - - call Slots_CheckMatchedFirstTwoReels - jr nc, .no_match - ld a, [wFirstTwoReelsMatchingSevens] - and a - jr z, .no_match - call Slots_StopReel - ret - -.no_match - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_REEL2_SKIP_TO_7 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld [hl], 32 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - ret - -; 92cf8 - -ReelAction_WaitReel2SkipTo7: ; 92cf8 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld a, [hl] - and a - jr z, .asm_92d02 - dec [hl] - ret - -.asm_92d02 - ld a, SFX_THROW_BALL - call Slots_PlaySFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 8 - ret - -; 92d13 - -ReelAction_FastSpinReel2UntilLinedUp7s: ; 92d13 - call Slots_CheckMatchedFirstTwoReels - ret nc - ld a, [wFirstTwoReelsMatchingSevens] - and a - ret z - call Slots_StopReel - ret - -; 92d20 - -ReelAction_InitGolem: ; 92d20 -; Ensures SEVENs are lined up if there's bias to SEVEN. -; Ensures nothing is lined up if there's no bias symbols. -; No other bias symbols are compatible with this mode. - -; This is achieved by throwing Golem until the desired result -; is produced. The amount of Golem thrown can be anywhere from -; 1 to 14 for SEVEN bias, and 4-8 for no bias. - - call Slots_CheckMatchedAllThreeReels - ret c - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - call Slots_WaitSFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_GOLEM - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - call Slots_GetNumberOfGolems - push bc - push af - depixel 12, 13 - ld a, SPRITE_ANIM_INDEX_SLOTS_GOLEM - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - pop af - ld [hl], a - pop bc - xor a - ld [wSlotsDelay], a -ReelAction_WaitGolem: ; 92d4f - ld a, [wSlotsDelay] - cp 2 - jr z, .two - cp 1 - jr z, .one - ret - -.two - call Slots_CheckMatchedAllThreeReels - call Slots_StopReel - ret - -.one - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_END_GOLEM - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 8 - ret - -; 92d6e - -ReelAction_EndGolem: ; 92d6e - xor a - ld [wSlotsDelay], a - ld hl, REEL_ACTION - add hl, bc - dec [hl] ; REEL_ACTION_WAIT_GOLEM - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - ret - -; 92d7e - -ReelAction_InitChansey: ; 92d7e -; Ensures the lining up of SEVEN symbols, but this mode is only possible -; when there is bias to SEVEN symbols (and even then, it's still rare). -; Chansey releases and egg and reel #3 is made to advance 17 slots very -; quickly as many times as necessary for the match to SEVENs to show up. - - call Slots_CheckMatchedAllThreeReels - ret c - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - call Slots_WaitSFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_CHANSEY - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - push bc - depixel 12, 0 - ld a, SPRITE_ANIM_INDEX_SLOTS_CHANSEY - call _InitSpriteAnimStruct - pop bc - xor a - ld [wSlotsDelay], a - ret - -; 92da4 - -ReelAction_WaitChansey: ; 92da4 - ld a, [wSlotsDelay] - and a - ret z - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_EGG - ld a, 2 - ld [wSlotsDelay], a -ReelAction_WaitEgg: ; 92db3 - ld a, [wSlotsDelay] - cp $4 - ret c - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_DROP_REEL - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 16 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld [hl], 17 -ReelAction_DropReel: ; 92dca - ld hl, REEL_MANIP_DELAY - add hl, bc - ld a, [hl] - and a - jr z, .check_match - dec [hl] - ret - -.check_match - call Slots_CheckMatchedAllThreeReels - jr nc, .EggAgain - and a - jr nz, .EggAgain - ld a, 5 - ld [wSlotsDelay], a - call Slots_StopReel - ret - -.EggAgain: - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - ld hl, REEL_ACTION - add hl, bc - dec [hl] - dec [hl] ; REEL_ACTION_WAIT_CHANSEY - ld a, 1 - ld [wSlotsDelay], a - ret - -; 92df7 - -ReelAction_Unused: ; 92df7 - call Slots_CheckMatchedAllThreeReels - ret c - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - call Slots_WaitSFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_CHECK_DROP_REEL - call Slots_GetNumberOfGolems - ld hl, REEL_MANIP_DELAY - add hl, bc - ld [hl], a -ReelAction_CheckDropReel: ; 92e10 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld a, [hl] - and a - jr nz, .spin - call Slots_CheckMatchedAllThreeReels - call Slots_StopReel - ret - -.spin - dec [hl] - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_DROP_REEL - ld hl, REEL_FIELD_0B - add hl, bc - ld [hl], 32 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 -ReelAction_WaitDropReel: ; 92e31 - ld hl, REEL_FIELD_0B - add hl, bc - ld a, [hl] - and a - jr z, .DropReel - dec [hl] - ret - -.DropReel: - ld hl, REEL_ACTION - add hl, bc - dec [hl] - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 8 - ret - -; 92e47 - -ReelAction_StartSlowAdvanceReel3: ; 92e47 -; Ensures SEVENs are lined up if there's bias to SEVEN. -; Ensures nothing is lined up if there's no bias symbols. -; No other bias symbols are compatible with this mode. - -; This is achieved by slowly advancing the reel a full round, -; plus any necessary slot until the desired result is produced. - - call Slots_CheckMatchedAllThreeReels - ret c - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - call Slots_WaitSFX - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 1 - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld [hl], 16 -ReelAction_WaitSlowAdvanceReel3: ; 92e64 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld a, [hl] - and a - jr z, .check1 - dec [hl] -.play_sfx - ld a, SFX_GOT_SAFARI_BALLS - call Slots_PlaySFX - ret - -.check1 - ld a, [wSlotBias] - and a - jr nz, .check2 - call Slots_CheckMatchedAllThreeReels - jr nc, .play_sfx - and a - jr nz, .play_sfx - call Slots_StopReel - call WaitSFX - ret - -.check2 - call Slots_CheckMatchedAllThreeReels - jr c, .play_sfx - call Slots_StopReel - call WaitSFX - ret - -; 92e94 - -Slots_CheckMatchedFirstTwoReels: ; 92e94 - xor a - ld [wFirstTwoReelsMatching], a - ld [wFirstTwoReelsMatchingSevens], a - call Slots_GetCurrentReelState - call Slots_CopyReelState - ld a, [wSlotBet] - and 3 - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .return - push de - jp hl - -.return - ld a, [wFirstTwoReelsMatching] - and a - ret z - scf - ret - -; 92ebd - -.Jumptable: ; 92ebd - dw .zero - dw .one - dw .two - dw .three -; 92ec5 - -.three ; 92ec5 - call .CheckUpwardsDiag - call .CheckDownwardsDiag - -.two ; 92ecb - call .CheckBottomRow - call .CheckTopRow - -.one ; 92ed1 - call .CheckMiddleRow - -.zero ; 92ed4 - ret - -; 92ed5 - -.CheckBottomRow: ; 92ed5 - ld hl, wCurrReelStopped - ld a, [wReel1Stopped] - cp [hl] - call z, .StoreResult - ret - -; 92ee0 - -.CheckUpwardsDiag: ; 92ee0 - ld hl, wCurrReelStopped + 1 - ld a, [wReel1Stopped] - cp [hl] - call z, .StoreResult - ret - -; 92eeb - -.CheckMiddleRow: ; 92eeb - ld hl, wCurrReelStopped + 1 - ld a, [wReel1Stopped + 1] - cp [hl] - call z, .StoreResult - ret - -; 92ef6 - -.CheckDownwardsDiag: ; 92ef6 - ld hl, wCurrReelStopped + 1 - ld a, [wReel1Stopped + 2] - cp [hl] - call z, .StoreResult - ret - -; 92f01 - -.CheckTopRow: ; 92f01 - ld hl, wCurrReelStopped + 2 - ld a, [wReel1Stopped + 2] - cp [hl] - call z, .StoreResult - ret - -; 92f0c - -.StoreResult: ; 92f0c - ld [wSlotBuildingMatch], a - and a - jr nz, .matching_sevens - ld a, 1 - ld [wFirstTwoReelsMatchingSevens], a - -.matching_sevens - ld a, 1 - ld [wFirstTwoReelsMatching], a - ret - -; 92f1d - -Slots_CheckMatchedAllThreeReels: ; 92f1d - ld a, SLOTS_NO_MATCH - ld [wSlotMatched], a - call Slots_GetCurrentReelState - call Slots_CopyReelState - ld a, [wSlotBet] - and 3 - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .return - push de - jp hl - -.return - ld a, [wSlotMatched] - cp SLOTS_NO_MATCH - jr nz, .matched_nontrivial - and a - ret - -.matched_nontrivial - scf - ret - -; 92f48 - -.Jumptable: ; 92f48 - dw .zero - dw .one - dw .two - dw .three -; 92f50 - -.three ; 92f50 - call .CheckUpwardsDiag - call .CheckDownwardsDiag - -.two ; 92f56 - call .CheckBottomRow - call .CheckTopRow - -.one ; 92f5c - call .CheckMiddleRow - -.zero ; 92f5f - ret - -; 92f60 - -.CheckBottomRow: ; 92f60 - ld hl, wCurrReelStopped - ld a, [wReel1Stopped] - cp [hl] - ret nz - ld hl, wReel2Stopped - cp [hl] - call z, .StoreResult - ret - -; 92f70 - -.CheckUpwardsDiag: ; 92f70 - ld hl, wCurrReelStopped + 2 - ld a, [wReel1Stopped] - cp [hl] - ret nz - ld hl, wReel2Stopped + 1 - cp [hl] - call z, .StoreResult - ret - -; 92f80 - -.CheckMiddleRow: ; 92f80 - ld hl, wCurrReelStopped + 1 - ld a, [wReel1Stopped + 1] - cp [hl] - ret nz - ld hl, wReel2Stopped + 1 - cp [hl] - call z, .StoreResult - ret - -; 92f90 - -.CheckDownwardsDiag: ; 92f90 - ld hl, wCurrReelStopped - ld a, [wReel1Stopped + 2] - cp [hl] - ret nz - ld hl, wReel2Stopped + 1 - cp [hl] - call z, .StoreResult - ret - -; 92fa0 - -.CheckTopRow: ; 92fa0 - ld hl, wCurrReelStopped + 2 - ld a, [wReel1Stopped + 2] - cp [hl] - ret nz - ld hl, wReel2Stopped + 2 - cp [hl] - call z, .StoreResult - ret - -; 92fb0 - -.StoreResult: ; 92fb0 - ld [wSlotMatched], a - ret - -; 92fb4 - -Slots_CopyReelState: ; 92fb4 - ld de, wCurrReelStopped - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - ret - -; 92fc0 - -Slots_GetNumberOfGolems: ; 92fc0 - ld hl, REEL_POSITION - add hl, bc - ld a, [hl] - push af - push hl - call .Check7Bias - pop hl - pop af - ld [hl], a - ld a, e - ret - -; 92fcf - -.Check7Bias: ; 92fcf - ld a, [wSlotBias] - and a - jr nz, .not_biased_to_seven - ld e, $0 -.loop1 - ld hl, REEL_POSITION - add hl, bc - inc [hl] - inc e - push de - call Slots_CheckMatchedAllThreeReels - pop de - jr nc, .loop1 - and a - jr nz, .loop1 - ret - -.not_biased_to_seven - call Random - and $7 - cp $4 ; ((50 percent) & 7) + 1 - jr c, .not_biased_to_seven - ld e, a -.loop2 - ld a, e - inc e - ld hl, REEL_POSITION - add hl, bc - add [hl] - ld [hl], a - push de - call Slots_CheckMatchedAllThreeReels - pop de - jr c, .loop2 - ret - -; 93002 - -Slots_InitBias: ; 93002 (24:7002) - ld a, [wSlotBias] - and a - ret z - ld hl, .Normal - ld a, [wScriptVar] - and a - jr z, .okay - ld hl, .Lucky -.okay - call Random - ld c, a -.loop - ld a, [hli] - cp c - jr nc, .done - inc hl - jr .loop - -.done - ld a, [hl] - ld [wSlotBias], a - ret - -; 93023 (24:7023) - -.Normal: ; 93023 - db $01, SLOTS_SEVEN ; 1/256 - db $03, SLOTS_POKEBALL ; 1/128 - db $0a, SLOTS_STARYU ; 7/256 - db $14, SLOTS_SQUIRTLE ; 5/128 - db $28, SLOTS_PIKACHU ; 5/64 - db $30, SLOTS_CHERRY ; 1/32 - db $ff, SLOTS_NO_BIAS ; everything else -; 93031 - -.Lucky: ; 93031 - db $02, SLOTS_SEVEN ; 1/128 - db $03, SLOTS_POKEBALL ; 1/256 - db $08, SLOTS_STARYU ; 5/256 - db $10, SLOTS_SQUIRTLE ; 1/32 - db $1e, SLOTS_PIKACHU ; 7/128 - db $50, SLOTS_CHERRY ; 25/128 - db $ff, SLOTS_NO_BIAS ; everything else -; 9303f - -Slots_IlluminateBetLights: ; 9303f (24:703f) - ld b, $14 ; turned on - ld a, [wSlotBet] - dec a - jr z, Slots_Lights1OnOff - dec a - jr z, Slots_Lights2OnOff - jr Slots_Lights3OnOff - -Slots_DeilluminateBetLights: ; 9304c (24:704c) - ld b, $23 ; turned off -Slots_Lights3OnOff: ; 9304e (24:704e) - hlcoord 3, 2 - call Slots_TurnLightsOnOrOff - hlcoord 3, 10 - call Slots_TurnLightsOnOrOff -Slots_Lights2OnOff: ; 9305a (24:705a) - hlcoord 3, 4 - call Slots_TurnLightsOnOrOff - hlcoord 3, 8 - call Slots_TurnLightsOnOrOff -Slots_Lights1OnOff: ; 93066 (24:7066) - hlcoord 3, 6 - -Slots_TurnLightsOnOrOff: ; 93069 (24:7069) - ld a, b - ld [hl], a - ld de, SCREEN_WIDTH / 2 + 3 - add hl, de - ld [hl], a - ld de, SCREEN_WIDTH / 2 - 3 - add hl, de - inc a - ld [hl], a - ld de, SCREEN_WIDTH / 2 + 3 - add hl, de - ld [hl], a - ret - -Slots_AskBet: ; 9307c (24:707c) -.loop - ld hl, .Text_BetHowManyCoins - call PrintText - ld hl, .MenuHeader - call LoadMenuHeader - call VerticalMenu - call CloseWindow - ret c - ld a, [wMenuCursorY] - ld b, a - ld a, 4 - sub b - ld [wSlotBet], a - ld hl, wCoins - ld c, a - ld a, [hli] - and a - jr nz, .Start - ld a, [hl] - cp c - jr nc, .Start - ld hl, .Text_NotEnoughCoins - call PrintText - jr .loop - -.Start: - ld hl, wCoins + 1 - ld a, [hl] - sub c - ld [hld], a - jr nc, .ok - dec [hl] -.ok - call WaitSFX - ld de, SFX_PAY_DAY - call PlaySFX - ld hl, .Text_Start - call PrintText - and a - ret - -; 930c7 (24:70c7) - -.Text_BetHowManyCoins: ; 0x930c7 - ; Bet how many coins? - text_jump UnknownText_0x1c5049 - db "@" -; 0x930cc - -.Text_Start: ; 0x930cc - ; Start! - text_jump UnknownText_0x1c505e - db "@" -; 0x930d1 - -.Text_NotEnoughCoins: ; 0x930d1 - ; Not enough coins. - text_jump UnknownText_0x1c5066 - db "@" -; 0x930d6 - -.MenuHeader: ; 0x930d6 - db MENU_BACKUP_TILES ; flags - menu_coords 14, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default option -; 0x930de - -.MenuData: ; 0x930de - db STATICMENU_CURSOR ; flags - db 3 ; items - db " 3@" - db " 2@" - db " 1@" -; 0x930e9 - -Slots_AskPlayAgain: ; 930e9 (24:70e9) - ld hl, wCoins - ld a, [hli] - or [hl] - jr nz, .you_have_coins - ld hl, .Text_OutOfCoins - call PrintText - ld c, 60 - call DelayFrames - jr .exit_slots - -.you_have_coins - ld hl, .Text_PlayAgain - call PrintText - call LoadMenuTextBox - lb bc, 14, 12 - call PlaceYesNoBox - ld a, [wMenuCursorY] - dec a - call CloseWindow - and a - jr nz, .exit_slots - and a - ret - -.exit_slots - scf - ret - -; 9311a (24:711a) - -.Text_OutOfCoins: ; 9311a - text_jump UnknownText_0x1c5079 - db "@" - -.Text_PlayAgain: ; 9311f - text_jump UnknownText_0x1c5092 - db "@" - -Slots_GetPayout: ; 93124 (24:7124) - ld a, [wSlotMatched] - cp SLOTS_NO_MATCH - jr z, .no_win - srl a - ld e, a - ld d, 0 - ld hl, .PayoutTable - add hl, de - ld a, [hli] - ld [wPayout + 1], a - ld e, a - ld a, [hl] - ld [wPayout], a - ld d, a - farcall StubbedTrainerRankings_AddToSlotsPayouts - ret - -.PayoutTable: - dw 300 - dw 50 - dw 6 - dw 8 - dw 10 - dw 15 - -.no_win - ld hl, wPayout - xor a - ld [hli], a - ld [hl], a - ret - -Slots_PayoutText: ; 93158 (24:7158) - ld a, [wSlotMatched] - cp SLOTS_NO_MATCH - jr nz, .MatchedSomething - ld hl, .Text_Darn - call PrintText - farcall StubbedTrainerRankings_EndSlotsWinStreak - ret - -.MatchedSomething: - srl a - ld e, a - ld d, 0 - ld hl, .PayoutStrings - add hl, de - add hl, de - add hl, de - ld de, wStringBuffer2 - ld bc, 4 - call CopyBytes - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .return - push de - jp hl - -.return - ld hl, .Text_PrintPayout - call PrintText - farcall StubbedTrainerRankings_AddToSlotsWinStreak - ret - -; 93195 (24:7195) - -.PayoutStrings: ; 93195 - dbw "300@", .LinedUpSevens - dbw "50@@", .LinedUpPokeballs - dbw "6@@@", .LinedUpMonOrCherry - dbw "8@@@", .LinedUpMonOrCherry - dbw "10@@", .LinedUpMonOrCherry - dbw "15@@", .LinedUpMonOrCherry -; 931b9 - -.Text_PrintPayout: ; 0x931b9 - start_asm - ld a, [wSlotMatched] - add $25 - ldcoord_a 2, 13 - inc a - ldcoord_a 2, 14 - inc a - ldcoord_a 3, 13 - inc a - ldcoord_a 3, 14 - hlcoord 18, 17 - ld [hl], "▼" - ld hl, .Text_LinedUpWonCoins -rept 4 - inc bc -endr - ret - -; 931db - -.Text_LinedUpWonCoins: ; 0x931db - ; lined up! Won @ coins! - text_jump UnknownText_0x1c509f - db "@" -; 0x931e0 - -.Text_Darn: ; 0x931e0 - ; Darn! - text_jump UnknownText_0x1c50bb - db "@" -; 0x931e5 - -.LinedUpSevens: ; 931e5 - ld a, SFX_2ND_PLACE - call Slots_PlaySFX - call WaitSFX - -; Oddly, the rarest mode (wKeepSevenBiasChance = 1) is the one with -; the worse odds to favor seven symbol streaks (12.5% vs 25%). -; it's possible that either the wKeepSevenBiasChance initialization -; or this code was intended to lead to flipped percentages. - ld a, [wKeepSevenBiasChance] - and a - jr nz, .lower_seven_streak_odds - call Random - and %0010100 - ret z ; 25% chance to stick with seven symbol bias - ld a, SLOTS_NO_BIAS - ld [wSlotBias], a - ret - -.lower_seven_streak_odds - call Random - and %0011100 - ret z ; 12.5% chance to stick with seven symbol bias - ld a, SLOTS_NO_BIAS - ld [wSlotBias], a - ret - -; 9320b - -.LinedUpPokeballs: ; 9320b - ld a, SFX_3RD_PLACE - call Slots_PlaySFX - call WaitSFX - ret - -; 93214 - -.LinedUpMonOrCherry: ; 93214 - ld a, SFX_PRESENT - call Slots_PlaySFX - call WaitSFX - ret - -; 9321d - -Slots_AnimateGolem: ; 9321d (24:721d) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.Jumptable: ; 9322d (24:722d) - dw .init - dw .fall - dw .roll - -.init ; 93233 (24:7233) - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld a, [hl] - and a - jr nz, .retain - ld a, 2 - ld [wSlotsDelay], a - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -.retain - dec [hl] - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $30 - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], $0 - -.fall ; 93259 (24:7259) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $20 - jr c, .play_sound - dec [hl] - ld e, a - ld d, 14 * 8 - farcall BattleAnim_Sine_e - ld a, e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - ret - -.play_sound - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $2 - ld a, 1 - ld [wSlotsDelay], a - ld a, SFX_PLACE_PUZZLE_PIECE_DOWN - call Slots_PlaySFX - ret - -.roll ; 93289 (24:7289) - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld a, [hl] - inc [hl] - inc [hl] - cp 9 * 8 - jr nc, .restart - and $3 - ret nz - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - xor $ff - inc a - ld [hl], a - ld [hSCY], a - ret - -.restart - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - xor a - ld [hl], a - ld [hSCY], a - ret - -Slots_AnimateChansey: ; 932ac (24:72ac) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.Jumptable: ; 932bc (24:72bc) - dw .walk - dw .one - dw .two - -.walk ; 932c2 (24:72c2) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - inc [hl] - cp 13 * 8 - jr z, .limit - and $f - ret nz - ld de, SFX_JUMP_OVER_LEDGE - call PlaySFX - ret - -.limit - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld a, 1 - ld [wSlotsDelay], a - -.one ; 932e0 (24:72e0) - ld a, [wSlotsDelay] - cp $2 - jr z, .retain - cp $5 - ret nz - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -.retain - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $8 -.two ; 932fc (24:72fc) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .spawn_egg - dec [hl] - ret - -.spawn_egg - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - dec [hl] - push bc - depixel 12, 13, 0, 4 - ld a, SPRITE_ANIM_INDEX_SLOTS_EGG - call _InitSpriteAnimStruct - pop bc - ret - -; 93316 (24:7316) - -Slots_WaitSFX: ; 93316 - push bc - ld c, 16 - call DelayFrames - pop bc - ret - -; 9331e - -Slots_PlaySFX: ; 9331e (24:731e) - push de - ld e, a - ld d, 0 - call PlaySFX - pop de - ret - -; 93327 (24:7327) - -; The first three positions are repeated to -; avoid needing to check indices when copying. -Reel1Tilemap: ; 93327 - db SLOTS_SEVEN ; 0 - db SLOTS_CHERRY ; 1 - db SLOTS_STARYU ; 2 - db SLOTS_PIKACHU ; 3 - db SLOTS_SQUIRTLE ; 4 - db SLOTS_SEVEN ; 5 - db SLOTS_CHERRY ; 6 - db SLOTS_STARYU ; 7 - db SLOTS_PIKACHU ; 8 - db SLOTS_SQUIRTLE ; 9 - db SLOTS_POKEBALL ; 10 - db SLOTS_CHERRY ; 11 - db SLOTS_STARYU ; 12 - db SLOTS_PIKACHU ; 13 - db SLOTS_SQUIRTLE ; 14 - db SLOTS_SEVEN ; 0 - db SLOTS_CHERRY ; 1 - db SLOTS_STARYU ; 2 - -Reel2Tilemap: ; 93339 - db SLOTS_SEVEN ; 0 - db SLOTS_PIKACHU ; 1 - db SLOTS_CHERRY ; 2 - db SLOTS_SQUIRTLE ; 3 - db SLOTS_STARYU ; 4 - db SLOTS_POKEBALL ; 5 - db SLOTS_PIKACHU ; 6 - db SLOTS_CHERRY ; 7 - db SLOTS_SQUIRTLE ; 8 - db SLOTS_STARYU ; 9 - db SLOTS_POKEBALL ; 10 - db SLOTS_PIKACHU ; 11 - db SLOTS_CHERRY ; 12 - db SLOTS_SQUIRTLE ; 13 - db SLOTS_STARYU ; 14 - db SLOTS_SEVEN ; 0 - db SLOTS_PIKACHU ; 1 - db SLOTS_CHERRY ; 2 - -Reel3Tilemap: ; 9334b - db SLOTS_SEVEN ; 0 - db SLOTS_PIKACHU ; 1 - db SLOTS_CHERRY ; 2 - db SLOTS_SQUIRTLE ; 3 - db SLOTS_STARYU ; 4 - db SLOTS_PIKACHU ; 5 - db SLOTS_CHERRY ; 6 - db SLOTS_SQUIRTLE ; 7 - db SLOTS_STARYU ; 8 - db SLOTS_PIKACHU ; 9 - db SLOTS_POKEBALL ; 10 - db SLOTS_CHERRY ; 11 - db SLOTS_SQUIRTLE ; 12 - db SLOTS_STARYU ; 13 - db SLOTS_PIKACHU ; 14 - db SLOTS_SEVEN ; 0 - db SLOTS_PIKACHU ; 1 - db SLOTS_CHERRY ; 2 -; 9335d - -SlotsTilemap: ; 9335d -INCBIN "gfx/slots/slots.tilemap" -; 9344d - -Slots1LZ: ; 9344d -INCBIN "gfx/slots/slots_1.2bpp.lz" -; 935cd - -Slots2LZ: ; 935cd -INCBIN "gfx/slots/slots_2.2bpp.lz" -; 9382d - -Slots3LZ: ; 9382d -INCBIN "gfx/slots/slots_3.2bpp.lz" -; 93a3d diff --git a/engine/spawn_points.asm b/engine/spawn_points.asm deleted file mode 100644 index 1a3d12441..000000000 --- a/engine/spawn_points.asm +++ /dev/null @@ -1,62 +0,0 @@ -INCLUDE "data/maps/spawn_points.asm" - - -LoadSpawnPoint: ; 1531f - ; loads the spawn point in wDefaultSpawnpoint - push hl - push de - ld a, [wDefaultSpawnpoint] - cp SPAWN_N_A - jr z, .spawn_n_a - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld de, SpawnPoints - add hl, de - ld a, [hli] - ld [wMapGroup], a - ld a, [hli] - ld [wMapNumber], a - ld a, [hli] - ld [wXCoord], a - ld a, [hli] - ld [wYCoord], a -.spawn_n_a - pop de - pop hl - ret -; 15344 - - -IsSpawnPoint: ; 15344 -; Checks if the map loaded in de is a spawn point. Returns carry if it's a spawn point. - ld hl, SpawnPoints - ld c, 0 -.loop - ld a, [hl] - cp SPAWN_N_A - jr z, .nope - cp d - jr nz, .next - inc hl - ld a, [hld] - cp e - jr z, .yes - -.next - push bc - ld bc, 4 ; length of a spawn table entry - add hl, bc - pop bc - inc c - jr .loop - -.nope - and a - ret - -.yes - scf - ret -; 15363 diff --git a/engine/sprite_anims.asm b/engine/sprite_anims.asm deleted file mode 100755 index 9353b71c9..000000000 --- a/engine/sprite_anims.asm +++ /dev/null @@ -1,889 +0,0 @@ -DoAnimFrame: ; 8d24b - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 8d25b - -.Jumptable: ; 8d25b (23:525b) -; entries correspond to SPRITE_ANIM_SEQ_* constants - dw .Null - dw .PartyMon - dw .PartyMonSwitch - dw .PartyMonSelected - dw .GSTitleTrail - dw .NamingScreenCursor - dw .GameFreakLogo - dw .GSIntroStar - dw .GSIntroSparkle - dw .SlotsGolem - dw .SlotsChansey - dw .SlotsChanseyEgg - dw .MailCursor - dw .UnusedCursor - dw .DummyGameCursor - dw .PokegearArrow - dw .TradePokeBall - dw .TradeTubeBulge - dw .TrademonInTube - dw .RevealNewMon - dw .RadioTuningKnob - dw .CutLeaves - dw .FlyFrom - dw .FlyLeaf - dw .FlyTo - dw .GSIntroHoOh - dw .EZChatCursor - dw .MobileTradeSentPulse - dw .MobileTradeOTPulse - dw .IntroSuicune - dw .IntroPichuWooper - dw .Celebi - dw .IntroUnown - dw .IntroUnownF - dw .IntroSuicuneAway - -.Null: ; 8d2a1 (23:52a1) - ret - -.PartyMon ; 8d2a2 (23:52a2) - ld a, [wMenuCursorY] - - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - cp [hl] - jr z, .PartyMonSwitch - - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld [hl], 8 * 2 - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], $0 - ret - -.PartyMonSwitch ; 8d2b9 (23:52b9) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld [hl], 8 * 3 - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - ld d, a - inc [hl] - and $f - ret nz - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld e, [hl] - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld a, d - and $10 ; bit 4 - jr z, .load_zero - ld a, e - and a - jr z, .load_minus_two - cp $1 - jr z, .load_minus_one -.load_zero - xor a - ld [hl], a - ret - -.load_minus_one - ld a, -1 - ld [hl], a - ret - -.load_minus_two - ld a, -2 - ld [hl], a - ret - -.PartyMonSelected ; 8d2ea (23:52ea) - ld a, [wMenuCursorY] - - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - cp [hl] - jr z, .three_offset_right - - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld [hl], 8 * 2 - ret - -.three_offset_right - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld [hl], 8 * 3 - ret - -.GSTitleTrail ; 8d302 (23:5302) - call .AnonymousJumptable - jp hl -; 8d306 (23:5306) - -; Anonymous dw (see .AnonymousJumptable) - dw .four_zero - dw .four_one -; 8d30a - -.four_zero ; 8d30a - call .IncrementJumptableIndex - - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld a, [hl] - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - and $3 - ld [hl], a - inc [hl] - swap a - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - -.four_one ; 8d321 - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - cp $a4 - jr nc, .asm_8d356 - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - add $4 - - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld [hl], a - - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - inc [hl] - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - sla a - sla a - ld d, $2 - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - add $3 - ld [hl], a - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - ret - -.asm_8d356 - call DeinitializeSprite - ret -; 8d35a - -.GSIntroHoOh ; 8d35a (23:535a) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - inc a - ld [hl], a - ld d, $2 - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - ret - -.NamingScreenCursor ; 8d36c (23:536c) - callfar NamingScreen_AnimateCursor - ret - -.MailCursor ; 8d373 (23:5373) - callfar ComposeMail_AnimateCursor - ret - -.GameFreakLogo: ; 8d37a (23:537a) - callfar GameFreakLogoJumper - ret - -.GSIntroStar ; 8d381 (23:5381) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .asm_8d3ba - dec [hl] - dec [hl] - ld d, a - and $1f - jr nz, .asm_8d395 - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - dec [hl] -.asm_8d395 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld a, [hl] - push af - push de - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - pop de - pop af - call .Sprites_Cosine - - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - add [hl] - ld [hl], a - ret - -.asm_8d3ba - ld a, $1 - ld [wcf64], a - call DeinitializeSprite - ret - -.GSIntroSparkle ; 8d3c3 (23:53c3) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hli] - or [hl] - jr z, .asm_8d41e - - ld hl, SPRITEANIMSTRUCT_0F - add hl, bc - ld d, [hl] - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld a, [hl] - push af - push de - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - pop de - pop af - call .Sprites_Cosine - - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - add hl, de - ld e, l - ld d, h - - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld [hl], e - inc hl - ld [hl], d - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld de, -$10 - add hl, de - ld e, l - ld d, h - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], e - inc hl - ld [hl], d - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld a, [hl] - xor $20 - ld [hl], a - ret - -.asm_8d41e - call DeinitializeSprite - ret - -.SlotsGolem: ; 8d422 (23:5422) - callfar Slots_AnimateGolem - ret - -.SlotsChansey: ; 8d429 (23:5429) - callfar Slots_AnimateChansey - ld hl, wcf64 - ld a, [hl] - cp $2 - ret nz - ld [hl], $3 - ld a, SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY_2 - call _ReinitSpriteAnimFrame - ret - -.SlotsChanseyEgg: ; 8d43e (23:543e) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld a, [hl] - dec [hl] - ld e, a - and $1 - jr z, .move_vertical - - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - cp 15 * 8 - jr c, .move_right - call DeinitializeSprite - ld a, $4 - ld [wcf64], a - ld de, SFX_PLACE_PUZZLE_PIECE_DOWN - call PlaySFX - ret - -.move_right - inc [hl] -.move_vertical - ld a, e - ld d, $20 - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - ret - -.UnusedCursor ; 8d46e (23:546e) - callfar ret_e00ed - ret - -.PokegearArrow ; 8d475 (23:5475) - callfar AnimatePokegearModeIndicatorArrow - ret - -.DummyGameCursor ; 8d47c (23:547c) - callfar DummyGame_InterpretJoypad_AnimateCursor - ret - -.TradePokeBall ; 8d483 (23:5483) - call .AnonymousJumptable - jp hl -; 8d487 (23:5487) - -; Anonymous dw (see .AnonymousJumptable) - dw .TradePokeBall_zero - dw .TradePokeBall_one - dw .TradePokeBall_two - dw .TradePokeBall_three - dw .TradePokeBall_four - dw .TradePokeBall_five -; 8d493 - -.TradePokeBall_zero ; 8d493 - ld a, SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL_WOBBLE - call _ReinitSpriteAnimFrame - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld [hl], $2 - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $20 - ret -; 8d4a5 - -.TradePokeBall_two ; 8d4a5 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .asm_8d4af - dec [hl] - ret - -.asm_8d4af - call .IncrementJumptableIndex - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $40 - -.TradePokeBall_three ; 8d4b8 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $30 - jr c, .asm_8d4cd - dec [hl] - ld d, $28 - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - ret - -.asm_8d4cd - ld de, SFX_GOT_SAFARI_BALLS - call PlaySFX - jr .TradePokeBall_five -; 8d4d5 - -.TradePokeBall_one ; 8d4d5 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld [hl], $4 - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $30 - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $24 - ret -; 8d4e8 - -.TradePokeBall_four ; 8d4e8 - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - and a - jr z, .asm_8d51c - ld d, a - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - call Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - inc [hl] - ld a, [hl] - and $3f - ret nz - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $20 - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - sub $c - ld [hl], a - ld de, SFX_SWITCH_POKEMON - call PlaySFX - ret - -.asm_8d51c - xor a - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - call .IncrementJumptableIndex - ret - -.TradePokeBall_five ; 8d526 - call DeinitializeSprite - ret -; 8d52a - -.TradeTubeBulge ; 8d52a (23:552a) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - inc [hl] - inc [hl] - cp $b0 - jr nc, .delete - and $3 - ret nz - ld de, SFX_POKEBALLS_PLACED_ON_TABLE - call PlaySFX - ret - -.delete - call DeinitializeSprite - ret - -.TrademonInTube ; 8d543 (23:5543) - callfar TradeAnim_AnimateTrademonInTube - ret - -.RevealNewMon: ; 8d54a (23:554a) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $80 - jr nc, .finish_EggShell - ld d, a - add $8 - ld [hl], a - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld a, [hl] - xor $20 - ld [hl], a - - push af - push de - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - - pop de - pop af - call .Sprites_Cosine - - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -.finish_EggShell - call DeinitializeSprite - ret - -.RadioTuningKnob: ; 8d578 (23:5578) - callfar AnimateTuningKnob - ret - -.CutLeaves ; 8d57f (23:557f) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $80 - add hl, de - ld e, l - ld d, h - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], e - inc hl - ld [hl], d - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - inc [hl] - inc [hl] - inc [hl] - push af - push de - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - pop de - pop af - call .Sprites_Cosine - - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -.FlyFrom: ; 8d5b0 (23:55b0) - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, [hl] - and a - ret z - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - inc [hl] - cp $40 - ret c - - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - dec [hl] - dec [hl] - - ld hl, SPRITEANIMSTRUCT_0F - add hl, bc - ld a, [hl] - ld d, a - cp $40 - jr nc, .skip - add $8 - ld [hl], a -.skip - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld a, [hl] - inc [hl] - call .Sprites_Cosine - - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -.FlyLeaf: ; 8d5e2 (23:55e2) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - cp -9 * 8 - jr nc, .delete_leaf - inc [hl] - inc [hl] - - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - dec [hl] - - ld d, $40 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - inc [hl] - call .Sprites_Cosine - - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -.delete_leaf - call DeinitializeSprite - ret - -.FlyTo: ; 8d607 (23:5607) - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, [hl] - cp 10 * 8 + 4 - ret z - - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - inc [hl] - inc [hl] - - ld hl, SPRITEANIMSTRUCT_0F - add hl, bc - ld a, [hl] - ld d, a - and a - jr z, .asm_8d621 - sub $2 - ld [hl], a -.asm_8d621 - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld a, [hl] - inc [hl] - call .Sprites_Cosine - - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -.MobileTradeSentPulse ; 8d630 (23:5630) - farcall Function108bc7 - ret - -.MobileTradeOTPulse ; 8d637 (23:5637) - farcall Function108be0 - ret - -.IntroSuicune ; 8d63e (23:563e) - ld a, [wcf65] - and a - jr nz, .asm_8d645 - ret -.asm_8d645 - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], $0 - - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - add $2 - ld [hl], a - xor $ff - inc a - ld d, $20 - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - ld a, SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_2 - call _ReinitSpriteAnimFrame - ret - -.IntroPichuWooper ; 8d666 (23:5666) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $14 - jr nc, .asm_8d67f - add $2 - ld [hl], a - xor $ff - inc a - ld d, $20 - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a -.asm_8d67f - ret - -.IntroUnown ; 8d680 (23:5680) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld d, [hl] - inc [hl] - inc [hl] - inc [hl] - - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - push af - push de - call .Sprites_Sine - - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - pop de - pop af - call .Sprites_Cosine - - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -.IntroUnownF ; 8d6a2 (23:56a2) - ld a, [wcf64] - cp $40 - ret nz - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F_2 - call _ReinitSpriteAnimFrame - ret - -.IntroSuicuneAway ; 8d6ae (23:56ae) - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, [hl] - add $10 - ld [hl], a - ret - -.EZChatCursor ; 8d6b7 (23:56b7) - farcall AnimateEZChatCursor - ret - -.Celebi ; 8d6be (23:56be) - farcall UpdateCelebiPosition - ret - -.AnonymousJumptable: ; 8d6c5 (23:56c5) - ld hl, sp+$0 - ld e, [hl] - inc hl - ld d, [hl] - inc de - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld l, [hl] - ld h, $0 - add hl, hl - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret -; 8d6d8 (23:56d8) - -.IncrementJumptableIndex: ; 8d6d8 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ret -; 8d6de - -.Sprites_Sine: ; 8d6de (23:56de) - call Sprites_Sine - ret - -.Sprites_Cosine: ; 8d6e2 (23:56e2) - call Sprites_Cosine - ret -; 8d6e6 (23:56e6) diff --git a/engine/sprites.asm b/engine/sprites.asm deleted file mode 100755 index 99d1d2ae4..000000000 --- a/engine/sprites.asm +++ /dev/null @@ -1,677 +0,0 @@ -ClearSpriteAnims: ; 8cf53 - ld hl, wSpriteAnimDict - ld bc, wSpriteAnimsEnd - wSpriteAnimDict -.loop - ld [hl], $0 - inc hl - dec bc - ld a, c - or b - jr nz, .loop - ret -; 8cf62 - -PlaySpriteAnimationsAndDelayFrame: ; 8cf62 - call PlaySpriteAnimations - call DelayFrame - ret -; 8cf69 - -PlaySpriteAnimations: ; 8cf69 - push hl - push de - push bc - push af - - ld a, LOW(wVirtualOAM) - ld [wCurrSpriteOAMAddr], a - call DoNextFrameForAllSprites - - pop af - pop bc - pop de - pop hl - ret -; 8cf7a - -DoNextFrameForAllSprites: ; 8cf7a - ld hl, wSpriteAnimationStructs - ld e, NUM_SPRITE_ANIM_STRUCTS - -.loop - ld a, [hl] - and a - jr z, .next ; This struct is deinitialized. - ld c, l - ld b, h - push hl - push de - call DoAnimFrame ; Uses a massive dw - call UpdateAnimFrame - pop de - pop hl - jr c, .done - -.next - ld bc, SPRITEANIMSTRUCT_LENGTH - add hl, bc - dec e - jr nz, .loop - - ld a, [wCurrSpriteOAMAddr] - ld l, a - ld h, HIGH(wVirtualOAM) - -.loop2 ; Clear (wVirtualOAM + [wCurrSpriteOAMAddr] --> wVirtualOAMEnd) - ld a, l - cp LOW(wVirtualOAMEnd) - jr nc, .done - xor a - ld [hli], a - jr .loop2 - -.done - ret -; 8cfa8 - -DoNextFrameForFirst16Sprites: ; 8cfa8 (23:4fa8) - ld hl, wSpriteAnimationStructs - ld e, NUM_SPRITE_ANIM_STRUCTS - -.loop - ld a, [hl] - and a - jr z, .next - ld c, l - ld b, h - push hl - push de - call DoAnimFrame ; Uses a massive dw - call UpdateAnimFrame - pop de - pop hl - jr c, .done - -.next - ld bc, SPRITEANIMSTRUCT_LENGTH - add hl, bc - dec e - jr nz, .loop - - ld a, [wCurrSpriteOAMAddr] - ld l, a - ld h, HIGH(wVirtualOAMSprite16) - -.loop2 ; Clear (wVirtualOAM + [wCurrSpriteOAMAddr] --> Sprites + $40) - ld a, l - cp LOW(wVirtualOAMSprite16) - jr nc, .done - xor a - ld [hli], a - jr .loop2 - -.done - ret - -InitSpriteAnimStruct:: ; 8cfd6 -; Initialize animation a at pixel x=e, y=d -; Find if there's any room in the wSpriteAnimationStructs array, which is 10x16 - push de - push af - ld hl, wSpriteAnimationStructs - ld e, NUM_SPRITE_ANIM_STRUCTS -.loop - ld a, [hl] - and a - jr z, .found - ld bc, SPRITEANIMSTRUCT_LENGTH - add hl, bc - dec e - jr nz, .loop -; We've reached the end. There is no more room here. -; Return carry. - pop af - pop de - scf - ret - -.found -; Back up the structure address to bc. - ld c, l - ld b, h -; Value [wSpriteAnimCount] is initially set to -1. Set it to -; the number of objects loaded into this array. - ld hl, wSpriteAnimCount - inc [hl] - ld a, [hl] - and a - jr nz, .initialized - inc [hl] - -.initialized -; Get row a of SpriteAnimSeqData, copy the pointer into de - pop af - ld e, a - ld d, 0 - ld hl, SpriteAnimSeqData - add hl, de - add hl, de - add hl, de - ld e, l - ld d, h -; Set hl to the first field (field 0) in the current structure. - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc -; Load the index. - ld a, [wSpriteAnimCount] - ld [hli], a -; Copy the table entry to the next two fields. - ld a, [de] - ld [hli], a - inc de - ld a, [de] - ld [hli], a - inc de -; Look up the third field from the table in the wSpriteAnimDict array (10x2). -; Take the value and load it in - ld a, [de] - call GetSpriteAnimVTile - ld [hli], a - pop de -; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here. - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc -; Load the original value of de into here. - ld a, e - ld [hli], a - ld a, d - ld [hli], a -; load 0 into the next four fields - xor a - ld [hli], a - ld [hli], a - xor a - ld [hli], a - ld [hli], a -; load -1 into the next field - dec a - ld [hli], a -; load 0 into the last five fields - xor a -rept 4 - ld [hli], a -endr - ld [hl], a -; back up the address of the first field to wSpriteAnimAddrBackup - ld a, c - ld [wSpriteAnimAddrBackup], a - ld a, b - ld [wSpriteAnimAddrBackup + 1], a - ret -; 8d036 - -DeinitializeSprite: ; 8d036 -; Clear the index field of the struct in bc. - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret -; 8d03d - - -DeinitializeAllSprites: ; 8d03d (23:503d) -; Clear the index field of every struct in the wSpriteAnimationStructs array. - ld hl, wSpriteAnimationStructs - ld bc, SPRITEANIMSTRUCT_LENGTH - ld e, NUM_SPRITE_ANIM_STRUCTS - xor a -.loop - ld [hl], a - add hl, bc - dec e - jr nz, .loop - ret - - -UpdateAnimFrame: ; 8d04c - call InitSpriteAnimBuffer ; init WRAM - call GetSpriteAnimFrame ; read from a memory array - cp -3 - jr z, .done - cp -4 - jr z, .delete - call GetFrameOAMPointer - ; add byte to [wCurrAnimVTile] - ld a, [wCurrAnimVTile] - add [hl] - ld [wCurrAnimVTile], a - inc hl - ; load pointer into hl - ld a, [hli] - ld h, [hl] - ld l, a - push bc - ld a, [wCurrSpriteOAMAddr] - ld e, a - ld d, HIGH(wVirtualOAM) - ld a, [hli] - ld c, a ; number of objects -.loop - ; first byte: y (px) - ; [de] = [wCurrAnimYCoord] + [wCurrAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl]) - ld a, [wCurrAnimYCoord] - ld b, a - ld a, [wCurrAnimYOffset] - add b - ld b, a - ld a, [wGlobalAnimYOffset] - add b - ld b, a - call AddOrSubtractY - add b - ld [de], a - inc hl - inc de - ; second byte: x (px) - ; [de] = [wCurrAnimXCoord] + [wCurrAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl]) - ld a, [wCurrAnimXCoord] - ld b, a - ld a, [wCurrAnimXOffset] - add b - ld b, a - ld a, [wGlobalAnimXOffset] - add b - ld b, a - call AddOrSubtractX - add b - ld [de], a - inc hl - inc de - ; third byte: vtile - ; [de] = [wCurrAnimVTile] + [hl] - ld a, [wCurrAnimVTile] - add [hl] - ld [de], a - inc hl - inc de - ; fourth byte: attributes - ; [de] = GetSpriteOAMAttr([hl]) - call GetSpriteOAMAttr - ld [de], a - inc hl - inc de - ld a, e - ld [wCurrSpriteOAMAddr], a - cp LOW(wVirtualOAMEnd) - jr nc, .reached_the_end - dec c - jr nz, .loop - pop bc - jr .done - -.delete - call DeinitializeSprite -.done - and a - ret - -.reached_the_end - pop bc - scf - ret -; 8d0be - -AddOrSubtractY: ; 8d0be - push hl - ld a, [hl] - ld hl, wCurrSpriteAddSubFlags - bit 6, [hl] - jr z, .ok - ; 8 - a - add $8 - xor $ff - inc a - -.ok - pop hl - ret -; 8d0ce - -AddOrSubtractX: ; 8d0ce - push hl - ld a, [hl] - ld hl, wCurrSpriteAddSubFlags - bit 5, [hl] ; x flip - jr z, .ok - ; 8 - a - add $8 - xor $ff - inc a - -.ok - pop hl - ret -; 8d0de - -GetSpriteOAMAttr: ; 8d0de - ld a, [wCurrSpriteAddSubFlags] - ld b, a - ld a, [hl] - xor b - and $e0 - ld b, a - ld a, [hl] - and $1f - or b - ret -; 8d0ec - -InitSpriteAnimBuffer: ; 8d0ec - xor a - ld [wCurrSpriteAddSubFlags], a - ld hl, SPRITEANIMSTRUCT_TILE_ID - add hl, bc - ld a, [hli] - ld [wCurrAnimVTile], a - ld a, [hli] - ld [wCurrAnimXCoord], a - ld a, [hli] - ld [wCurrAnimYCoord], a - ld a, [hli] - ld [wCurrAnimXOffset], a - ld a, [hli] - ld [wCurrAnimYOffset], a - ret -; 8d109 - -GetSpriteAnimVTile: ; 8d109 -; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else 0 -; vTiles offset - push hl - push bc - ld hl, wSpriteAnimDict - ld b, a - ld c, NUM_SPRITE_ANIM_STRUCTS -.loop - ld a, [hli] - cp b - jr z, .ok - inc hl - dec c - jr nz, .loop - xor a - jr .done - -.ok - ld a, [hl] - -.done - pop bc - pop hl - ret -; 8d120 - -_ReinitSpriteAnimFrame:: ; 8d120 - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], a - ld hl, SPRITEANIMSTRUCT_DURATION - add hl, bc - ld [hl], 0 - ld hl, SPRITEANIMSTRUCT_FRAME - add hl, bc - ld [hl], -1 - ret -; 8d132 - - -GetSpriteAnimFrame: ; 8d132 -.loop - ld hl, SPRITEANIMSTRUCT_DURATION - add hl, bc - ld a, [hl] - and a - jr z, .next_frame ; finished the current sequence - dec [hl] - call .GetPointer ; load pointer from SpriteAnimFrameData - ld a, [hli] - push af - jr .okay - -.next_frame - ld hl, SPRITEANIMSTRUCT_FRAME - add hl, bc - inc [hl] - call .GetPointer ; load pointer from SpriteAnimFrameData - ld a, [hli] - cp dorestart_command - jr z, .restart - cp endanim_command - jr z, .repeat_last - - push af - ld a, [hl] - push hl - and $3f - ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET - add hl, bc - add [hl] - ld hl, SPRITEANIMSTRUCT_DURATION - add hl, bc - ld [hl], a - pop hl -.okay - ld a, [hl] - and $c0 - srl a - ld [wCurrSpriteAddSubFlags], a - pop af - ret - -.repeat_last - xor a - ld hl, SPRITEANIMSTRUCT_DURATION - add hl, bc - ld [hl], a - - ld hl, SPRITEANIMSTRUCT_FRAME - add hl, bc - dec [hl] - dec [hl] - jr .loop - -.restart - xor a - ld hl, SPRITEANIMSTRUCT_DURATION - add hl, bc - ld [hl], a - - dec a - ld hl, SPRITEANIMSTRUCT_FRAME - add hl, bc - ld [hl], a - jr .loop -; 8d189 - -.GetPointer: ; 8d189 - ; Get the data for the current frame for the current animation sequence - - ; SpriteAnimFrameData[SpriteAnim[SPRITEANIMSTRUCT_FRAMESET_ID]][SpriteAnim[SPRITEANIMSTRUCT_FRAME]] - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, SpriteAnimFrameData - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, SPRITEANIMSTRUCT_FRAME - add hl, bc - ld l, [hl] - ld h, 0 - add hl, hl - add hl, de - ret -; 8d1a2 - -GetFrameOAMPointer: ; 8d1a2 -; Load OAM data pointer - ld e, a - ld d, 0 - ld hl, SpriteAnimOAMData - add hl, de - add hl, de - add hl, de - ret -; 8d1ac - -Unreferenced_BrokenGetStdGraphics: ; 8d1ac - push hl - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld de, BrokenStdGFXPointers ; broken 2bpp pointers - add hl, de - ld c, [hl] - inc hl - ld b, [hl] - inc hl - ld e, [hl] - inc hl - ld d, [hl] - pop hl - push bc - call Request2bpp - pop bc - ret -; 8d1c4 - - -INCLUDE "data/sprite_anims/sequences.asm" - -INCLUDE "engine/sprite_anims.asm" - -INCLUDE "data/sprite_anims/framesets.asm" - -INCLUDE "data/sprite_anims/oam.asm" - - -BrokenStdGFXPointers: - ; tile count, bank, pointer - ; (all pointers were dummied out to .deleted) - dbbw 128, $01, .deleted - dbbw 128, $01, .deleted - dbbw 128, $01, .deleted - dbbw 128, $01, .deleted - dbbw 16, $37, .deleted - dbbw 16, $11, .deleted - dbbw 16, $39, .deleted - dbbw 16, $24, .deleted - dbbw 16, $21, .deleted - -.deleted -; 8e72a (23:672a) - - -Sprites_Cosine: ; 8e72a -; a = d * cos(a * pi/32) - add %010000 ; cos(x) = sin(x + pi/2) - ; fallthrough -Sprites_Sine: ; 8e72c -; a = d * sin(a * pi/32) - calc_sine_wave - - -AnimateEndOfExpBar: ; 8e79d - ld a, [hSGB] - ld de, EndOfExpBarGFX - and a - jr z, .load - ld de, SGBEndOfExpBarGFX - -.load - ld hl, vTiles0 tile $00 - lb bc, BANK(EndOfExpBarGFX), 1 - call Request2bpp - ld c, 8 - ld d, 0 -.loop - push bc - call .AnimateFrame - call DelayFrame - pop bc - inc d - inc d - dec c - jr nz, .loop - call ClearSprites - ret -; 8e7c6 - -.AnimateFrame: ; 8e7c6 - ld hl, wVirtualOAMSprite00 - ld c, 8 ; number of animated circles -.anim_loop - ld a, c - and a - ret z - dec c - ld a, c -; multiply by 8 - sla a - sla a - sla a - push af - - push de - push hl - call Sprites_Sine - pop hl - pop de - add 13 * TILE_WIDTH - ld [hli], a ; y - - pop af - push de - push hl - call Sprites_Cosine - pop hl - pop de - add 10 * TILE_WIDTH + 4 - ld [hli], a ; x - - ld a, $0 - ld [hli], a ; tile id - ld a, PAL_BATTLE_OB_BLUE - ld [hli], a ; attributes - jr .anim_loop -; 8e7f4 - -EndOfExpBarGFX: ; 8e7f4 -INCBIN "gfx/battle/expbarend.2bpp" -SGBEndOfExpBarGFX: ; 8e804 -INCBIN "gfx/battle/expbarend_sgb.2bpp" - -ClearSpriteAnims2: ; 8e814 - push hl - push de - push bc - push af - ld hl, wSpriteAnimDict - ld bc, wSpriteAnimsEnd - wSpriteAnimDict -.loop - ld [hl], 0 - inc hl - dec bc - ld a, c - or b - jr nz, .loop - pop af - pop bc - pop de - pop hl - ret -; 8e82b diff --git a/engine/start_menu.asm b/engine/start_menu.asm deleted file mode 100755 index 037efd947..000000000 --- a/engine/start_menu.asm +++ /dev/null @@ -1,1993 +0,0 @@ -; StartMenu.Items indexes - const_def - const STARTMENUITEM_POKEDEX ; 0 - const STARTMENUITEM_POKEMON ; 1 - const STARTMENUITEM_PACK ; 2 - const STARTMENUITEM_STATUS ; 3 - const STARTMENUITEM_SAVE ; 4 - const STARTMENUITEM_OPTION ; 5 - const STARTMENUITEM_EXIT ; 6 - const STARTMENUITEM_POKEGEAR ; 7 - const STARTMENUITEM_QUIT ; 8 - - -StartMenu:: ; 125cd - - call ClearWindowData - - ld de, SFX_MENU - call PlaySFX - - farcall ReanchorBGMap_NoOAMUpdate - - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - ld hl, .MenuHeader - jr z, .GotMenuData - ld hl, .ContestMenuHeader -.GotMenuData: - - call LoadMenuHeader - call .SetUpMenuItems - ld a, [wBattleMenuCursorBuffer] - ld [wMenuCursorBuffer], a - call .DrawMenuAccount_ - call DrawVariableLengthMenuBox - call .DrawBugContestStatusBox - call SafeUpdateSprites - call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap - farcall LoadFonts_NoOAMUpdate - call .DrawBugContestStatus - call UpdateTimePals - jr .Select - -.Reopen: - call UpdateSprites - call UpdateTimePals - call .SetUpMenuItems - ld a, [wBattleMenuCursorBuffer] - ld [wMenuCursorBuffer], a - -.Select: - call .GetInput - jr c, .Exit - call .DrawMenuAccount - ld a, [wMenuCursorBuffer] - ld [wBattleMenuCursorBuffer], a - call PlayClickSFX - call PlaceHollowCursor - call .OpenMenu - -; Menu items have different return functions. -; For example, saving exits the menu. - ld hl, .MenuReturns - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.MenuReturns: - dw .Reopen - dw .Exit - dw .ExitMenuCallFuncCloseText - dw .ExitMenuRunScriptCloseText - dw .ExitMenuRunScript - dw .ReturnEnd - dw .ReturnRedraw - -.Exit: - ld a, [hOAMUpdate] - push af - ld a, 1 - ld [hOAMUpdate], a - call LoadFontsExtra - pop af - ld [hOAMUpdate], a -.ReturnEnd: - call ExitMenu -.ReturnEnd2: - call CloseText - call UpdateTimePals - ret - -.GetInput: -; Return carry on exit, and no-carry on selection. - xor a - ld [hBGMapMode], a - call .DrawMenuAccount - call SetUpMenu - ld a, $ff - ld [wMenuSelection], a -.loop - call .PrintMenuAccount - call GetScrollingMenuJoypad - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .b - cp A_BUTTON - jr z, .a - jr .loop -.a - call PlayClickSFX - and a - ret -.b - scf - ret -; 12691 - -.ExitMenuRunScript: ; 12691 - call ExitMenu - ld a, HMENURETURN_SCRIPT - ld [hMenuReturn], a - ret -; 12699 - -.ExitMenuRunScriptCloseText: ; 12699 - call ExitMenu - ld a, HMENURETURN_SCRIPT - ld [hMenuReturn], a - jr .ReturnEnd2 -; 126a2 - -.ExitMenuCallFuncCloseText: ; 126a2 - call ExitMenu - ld hl, wQueuedScriptAddr - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wQueuedScriptBank] - rst FarCall - jr .ReturnEnd2 -; 126b1 - -.ReturnRedraw: ; 126b1 - call .Clear - jp .Reopen -; 126b7 - -.Clear: ; 126b7 - call ClearBGPalettes - call Call_ExitMenu - call ReloadTilesetAndPalettes - call .DrawMenuAccount_ - call DrawVariableLengthMenuBox - call .DrawBugContestStatus - call UpdateSprites - call ret_d90 - call FinishExitMenu - ret -; 126d3 - - -.MenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 10, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default selection - -.ContestMenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 10, 2, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default selection - -.MenuData: - db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_ENABLE_START ; flags - dn 0, 0 ; rows, columns - dw wMenuItemsList - dw .MenuString - dw .Items - -.Items: -; entries correspond to STARTMENUITEM_* constants - dw StartMenu_Pokedex, .PokedexString, .PokedexDesc - dw StartMenu_Pokemon, .PartyString, .PartyDesc - dw StartMenu_Pack, .PackString, .PackDesc - dw StartMenu_Status, .StatusString, .StatusDesc - dw StartMenu_Save, .SaveString, .SaveDesc - dw StartMenu_Option, .OptionString, .OptionDesc - dw StartMenu_Exit, .ExitString, .ExitDesc - dw StartMenu_Pokegear, .PokegearString, .PokegearDesc - dw StartMenu_Quit, .QuitString, .QuitDesc - -.PokedexString: db "#DEX@" -.PartyString: db "#MON@" -.PackString: db "PACK@" -.StatusString: db "@" -.SaveString: db "SAVE@" -.OptionString: db "OPTION@" -.ExitString: db "EXIT@" -.PokegearString: db "GEAR@" -.QuitString: db "QUIT@" - -.PokedexDesc: - db "#MON" - next "database@" - -.PartyDesc: - db "Party " - next "status@" - -.PackDesc: - db "Contains" - next "items@" - -.PokegearDesc: - db "Trainer's" - next "key device@" - -.StatusDesc: - db "Your own" - next "status@" - -.SaveDesc: - db "Save your" - next "progress@" - -.OptionDesc: - db "Change" - next "settings@" - -.ExitDesc: - db "Close this" - next "menu@" - -.QuitDesc: - db "Quit and" - next "be judged.@" - - -.OpenMenu: ; 127e5 - ld a, [wMenuSelection] - call .GetMenuAccountTextPointer - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 127ef - -.MenuString: ; 127ef - push de - ld a, [wMenuSelection] - call .GetMenuAccountTextPointer - inc hl - inc hl - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - call PlaceString - ret -; 12800 - -.MenuDesc: ; 12800 - push de - ld a, [wMenuSelection] - cp $ff - jr z, .none - call .GetMenuAccountTextPointer -rept 4 - inc hl -endr - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - call PlaceString - ret -.none - pop de - ret -; 12819 - - -.GetMenuAccountTextPointer: ; 12819 - ld e, a - ld d, 0 - ld hl, wMenuDataPointerTableAddr - ld a, [hli] - ld h, [hl] - ld l, a -rept 6 - add hl, de -endr - ret -; 12829 - - -.SetUpMenuItems: ; 12829 - xor a - ld [wWhichIndexSet], a - call .FillMenuList - - ld hl, wStatusFlags - bit STATUSFLAGS_POKEDEX_F, [hl] - jr z, .no_pokedex - ld a, STARTMENUITEM_POKEDEX - call .AppendMenuList -.no_pokedex - - ld a, [wPartyCount] - and a - jr z, .no_pokemon - ld a, STARTMENUITEM_POKEMON - call .AppendMenuList -.no_pokemon - - ld a, [wLinkMode] - and a - jr nz, .no_pack - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - jr nz, .no_pack - ld a, STARTMENUITEM_PACK - call .AppendMenuList -.no_pack - - ld hl, wPokegearFlags - bit POKEGEAR_OBTAINED_F, [hl] - jr z, .no_pokegear - ld a, STARTMENUITEM_POKEGEAR - call .AppendMenuList -.no_pokegear - - ld a, STARTMENUITEM_STATUS - call .AppendMenuList - - ld a, [wLinkMode] - and a - jr nz, .no_save - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - ld a, STARTMENUITEM_QUIT - jr nz, .write - ld a, STARTMENUITEM_SAVE -.write - call .AppendMenuList -.no_save - - ld a, STARTMENUITEM_OPTION - call .AppendMenuList - ld a, STARTMENUITEM_EXIT - call .AppendMenuList - ld a, c - ld [wMenuItemsList], a - ret -; 1288d - - -.FillMenuList: ; 1288d - xor a - ld hl, wMenuItemsList - ld [hli], a - ld a, -1 - ld bc, wMenuItemsListEnd - (wMenuItemsList + 1) - call ByteFill - ld de, wMenuItemsList + 1 - ld c, 0 - ret -; 128a0 - -.AppendMenuList: ; 128a0 - ld [de], a - inc de - inc c - ret -; 128a4 - -.DrawMenuAccount_: ; 128a4 - jp .DrawMenuAccount -; 128a7 - -.PrintMenuAccount: ; 128a7 - call .IsMenuAccountOn - ret z - call .DrawMenuAccount - decoord 0, 14 - jp .MenuDesc -; 128b4 - -.DrawMenuAccount: ; 128b4 - call .IsMenuAccountOn - ret z - hlcoord 0, 13 - lb bc, 5, 10 - call ClearBox - hlcoord 0, 13 - ld b, 3 - ld c, 8 - jp TextBoxPalette -; 128cb - -.IsMenuAccountOn: ; 128cb - ld a, [wOptions2] - and 1 << MENU_ACCOUNT - ret -; 128d1 - -.DrawBugContestStatusBox: ; 128d1 - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - ret z - farcall StartMenu_DrawBugContestStatusBox - ret -; 128de - -.DrawBugContestStatus: ; 128de - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - jr nz, .contest - ret -.contest - farcall StartMenu_PrintBugContestStatus - ret -; 128ed - - -StartMenu_Exit: ; 128ed -; Exit the menu. - - ld a, 1 - ret -; 128f0 - - -StartMenu_Quit: ; 128f0 -; Retire from the bug catching contest. - - ld hl, .EndTheContestText - call StartMenuYesNo - jr c, .DontEndContest - ld a, BANK(BugCatchingContestReturnToGateScript) - ld hl, BugCatchingContestReturnToGateScript - call FarQueueScript - ld a, 4 - ret - -.DontEndContest: - ld a, 0 - ret - -.EndTheContestText: - text_jump UnknownText_0x1c1a6c - db "@" -; 1290b - - -StartMenu_Save: ; 1290b -; Save the game. - - call BufferScreen - farcall SaveMenu - jr nc, .asm_12919 - ld a, 0 - ret -.asm_12919 - ld a, 1 - ret -; 1291c - - -StartMenu_Option: ; 1291c -; Game options. - - call FadeToMenu - farcall OptionsMenu - ld a, 6 - ret -; 12928 - - -StartMenu_Status: ; 12928 -; Player status. - - call FadeToMenu - farcall TrainerCard - call CloseSubmenu - ld a, 0 - ret -; 12937 - - -StartMenu_Pokedex: ; 12937 - - ld a, [wPartyCount] - and a - jr z, .asm_12949 - - call FadeToMenu - farcall Pokedex - call CloseSubmenu - -.asm_12949 - ld a, 0 - ret -; 1294c - - -StartMenu_Pokegear: ; 1294c - - call FadeToMenu - farcall PokeGear - call CloseSubmenu - ld a, 0 - ret -; 1295b - - -StartMenu_Pack: ; 1295b - - call FadeToMenu - farcall Pack - ld a, [wPackUsedItem] - and a - jr nz, .used_item - call CloseSubmenu - ld a, 0 - ret - -.used_item - call ExitAllMenus - ld a, 4 - ret -; 12976 - - -StartMenu_Pokemon: ; 12976 - - ld a, [wPartyCount] - and a - jr z, .return - - call FadeToMenu - -.choosemenu - xor a - ld [wPartyMenuActionText], a ; Choose a POKéMON. - call ClearBGPalettes - -.menu - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX - -.menunoreload - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes ; load regular palettes? - call DelayFrame - farcall PartyMenuSelect - jr c, .return ; if cancelled or pressed B - - call PokemonActionSubmenu - cp 3 - jr z, .menu - cp 0 - jr z, .choosemenu - cp 1 - jr z, .menunoreload - cp 2 - jr z, .quit - -.return - call CloseSubmenu - ld a, 0 - ret - -.quit - ld a, b - push af - call ExitAllMenus - pop af - ret -; 129d5 - -HasNoItems: ; 129d5 - ld a, [wNumItems] - and a - ret nz - ld a, [wNumKeyItems] - and a - ret nz - ld a, [wNumBalls] - and a - ret nz - ld hl, wTMsHMs - ld b, NUM_TMS + NUM_HMS -.loop - ld a, [hli] - and a - jr nz, .done - dec b - jr nz, .loop - scf - ret -.done - and a - ret - -TossItemFromPC: ; 129f4 - push de - call PartyMonItemName - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .key_item - ld hl, .TossHowMany - call MenuTextBox - farcall SelectQuantityToToss - push af - call CloseWindow - call ExitMenu - pop af - jr c, .quit - ld hl, .ConfirmToss - call MenuTextBox - call YesNoBox - push af - call ExitMenu - pop af - jr c, .quit - pop hl - ld a, [wCurItemQuantity] - call TossItem - call PartyMonItemName - ld hl, .TossedThisMany - call MenuTextBox - call ExitMenu - and a - ret - -.key_item - call .CantToss -.quit - pop hl - scf - ret - -.TossHowMany: - ; Toss out how many @ (S)? - text_jump UnknownText_0x1c1a90 - db "@" - -.ConfirmToss: - ; Throw away @ @ (S)? - text_jump UnknownText_0x1c1aad - db "@" - -.TossedThisMany: - ; Discarded @ (S). - text_jump UnknownText_0x1c1aca - db "@" - -.CantToss: - ld hl, .TooImportantToToss - call MenuTextBoxBackup - ret - -.TooImportantToToss: - ; That's too impor- tant to toss out! - text_jump UnknownText_0x1c1adf - db "@" -; 0x12a60 - -CantUseItem: ; 12a60 - ld hl, CantUseItemText - call MenuTextBoxWaitButton - ret -; 12a67 - -CantUseItemText: ; 12a67 - text_jump UnknownText_0x1c1b03 - db "@" -; 12a6c - - -PartyMonItemName: ; 12a6c - ld a, [wCurItem] - ld [wd265], a - call GetItemName - call CopyName1 - ret -; 12a79 - - -CancelPokemonAction: ; 12a79 - farcall InitPartyMenuWithCancel - farcall UnfreezeMonIcons - ld a, 1 - ret -; 12a88 - - -PokemonActionSubmenu: ; 12a88 - hlcoord 1, 15 - lb bc, 2, 18 - call ClearBox - farcall MonSubmenu - call GetCurNick - ld a, [wMenuSelection] - ld hl, .Actions - ld de, 3 - call IsInArray - jr nc, .nothing - - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.nothing - ld a, 0 - ret - -.Actions: - dbw MONMENUITEM_CUT, MonMenu_Cut - dbw MONMENUITEM_FLY, MonMenu_Fly - dbw MONMENUITEM_SURF, MonMenu_Surf - dbw MONMENUITEM_STRENGTH, MonMenu_Strength - dbw MONMENUITEM_FLASH, MonMenu_Flash - dbw MONMENUITEM_WHIRLPOOL, MonMenu_Whirlpool - dbw MONMENUITEM_DIG, MonMenu_Dig - dbw MONMENUITEM_TELEPORT, MonMenu_Teleport - dbw MONMENUITEM_SOFTBOILED, MonMenu_Softboiled_MilkDrink - dbw MONMENUITEM_MILKDRINK, MonMenu_Softboiled_MilkDrink - dbw MONMENUITEM_HEADBUTT, MonMenu_Headbutt - dbw MONMENUITEM_WATERFALL, MonMenu_Waterfall - dbw MONMENUITEM_ROCKSMASH, MonMenu_RockSmash - dbw MONMENUITEM_SWEETSCENT, MonMenu_SweetScent - dbw MONMENUITEM_STATS, OpenPartyStats - dbw MONMENUITEM_SWITCH, SwitchPartyMons - dbw MONMENUITEM_ITEM, GiveTakePartyMonItem - dbw MONMENUITEM_CANCEL, CancelPokemonAction - dbw MONMENUITEM_MOVE, ManagePokemonMoves - dbw MONMENUITEM_MAIL, MonMailAction -; 12aec - - -SwitchPartyMons: ; 12aec - -; Don't try if there's nothing to switch! - ld a, [wPartyCount] - cp 2 - jr c, .DontSwitch - - ld a, [wCurPartyMon] - inc a - ld [wSwitchMon], a - - farcall HoldSwitchmonIcon - farcall InitPartyMenuNoCancel - - ld a, PARTYMENUACTION_MOVE - ld [wPartyMenuActionText], a - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - - hlcoord 0, 1 - ld bc, SCREEN_WIDTH * 2 - ld a, [wSwitchMon] - dec a - call AddNTimes - ld [hl], "▷" - call WaitBGMap - call SetPalettes - call DelayFrame - - farcall PartyMenuSelect - bit 1, b - jr c, .DontSwitch - - farcall _SwitchPartyMons - - xor a - ld [wPartyMenuActionText], a - - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX - - ld a, 1 - ret - -.DontSwitch: - xor a - ld [wPartyMenuActionText], a - call CancelPokemonAction - ret -; 12b60 - - -GiveTakePartyMonItem: ; 12b60 - -; Eggs can't hold items! - ld a, [wCurPartySpecies] - cp EGG - jr z, .cancel - - ld hl, GiveTakeItemMenuData - call LoadMenuHeader - call VerticalMenu - call ExitMenu - jr c, .cancel - - call GetCurNick - ld hl, wStringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - ld a, [wMenuCursorY] - cp 1 - jr nz, .take - - call LoadStandardMenuHeader - call ClearPalettes - call .GiveItem - call ClearPalettes - call LoadFontsBattleExtra - call ExitMenu - ld a, 0 - ret - -.take - call TakePartyItem - ld a, 3 - ret - -.cancel - ld a, 3 - ret -; 12ba9 - - -.GiveItem: - - farcall DepositSellInitPackBuffers - -.loop - farcall DepositSellPack - - ld a, [wcf66] - and a - jr z, .quit - - ld a, [wcf65] - cp 2 - jr z, .next - - call CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .next - - call TryGiveItemToPartymon - jr .quit - -.next - ld hl, CantBeHeldText - call MenuTextBoxBackup - jr .loop - -.quit - ret -; 12bd9 - - -TryGiveItemToPartymon: ; 12bd9 - - call SpeechTextBox - call PartyMonItemName - call GetPartyItemLocation - ld a, [hl] - and a - jr z, .give_item_to_mon - - push hl - ld d, a - farcall ItemIsMail - pop hl - jr c, .please_remove_mail - ld a, [hl] - jr .already_holding_item - -.give_item_to_mon - call GiveItemToPokemon - ld hl, MadeHoldText - call MenuTextBoxBackup - call GivePartyItem - ret - -.please_remove_mail - ld hl, PleaseRemoveMailText - call MenuTextBoxBackup - ret - -.already_holding_item - ld [wd265], a - call GetItemName - ld hl, SwitchAlreadyHoldingText - call StartMenuYesNo - jr c, .abort - - call GiveItemToPokemon - ld a, [wd265] - push af - ld a, [wCurItem] - ld [wd265], a - pop af - ld [wCurItem], a - call ReceiveItemFromPokemon - jr nc, .bag_full - - ld hl, TookAndMadeHoldText - call MenuTextBoxBackup - ld a, [wd265] - ld [wCurItem], a - call GivePartyItem - ret - -.bag_full - ld a, [wd265] - ld [wCurItem], a - call ReceiveItemFromPokemon - ld hl, ItemStorageIsFullText - call MenuTextBoxBackup - -.abort - ret -; 12c4c - - -GivePartyItem: ; 12c4c - - call GetPartyItemLocation - ld a, [wCurItem] - ld [hl], a - ld d, a - farcall ItemIsMail - jr nc, .done - call ComposeMailMessage - -.done - ret -; 12c60 - - -TakePartyItem: ; 12c60 - - call SpeechTextBox - call GetPartyItemLocation - ld a, [hl] - and a - jr z, .asm_12c8c - - ld [wCurItem], a - call ReceiveItemFromPokemon - jr nc, .asm_12c94 - - farcall ItemIsMail - call GetPartyItemLocation - ld a, [hl] - ld [wd265], a - ld [hl], NO_ITEM - call GetItemName - ld hl, TookFromText - call MenuTextBoxBackup - jr .asm_12c9a - -.asm_12c8c - ld hl, IsntHoldingAnythingText - call MenuTextBoxBackup - jr .asm_12c9a - -.asm_12c94 - ld hl, ItemStorageIsFullText - call MenuTextBoxBackup - -.asm_12c9a - ret -; 12c9b - - -GiveTakeItemMenuData: ; 12c9b - db MENU_SPRITE_ANIMS | MENU_BACKUP_TILES ; flags - menu_coords 12, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .Items - db 1 ; default option - -.Items: - db STATICMENU_CURSOR ; flags - db 2 ; # items - db "GIVE@" - db "TAKE@" -; 12caf - - -TookAndMadeHoldText: ; 12caf - text_jump UnknownText_0x1c1b2c - db "@" -; 12cb4 - -MadeHoldText: ; 12cb4 - text_jump UnknownText_0x1c1b57 - db "@" -; 12cb9 - -PleaseRemoveMailText: ; 12cb9 - text_jump UnknownText_0x1c1b6f - db "@" -; 12cbe - -IsntHoldingAnythingText: ; 12cbe - text_jump UnknownText_0x1c1b8e - db "@" -; 12cc3 - -ItemStorageIsFullText: ; 12cc3 - text_jump UnknownText_0x1c1baa - db "@" -; 12cc8 - -TookFromText: ; 12cc8 - text_jump UnknownText_0x1c1bc4 - db "@" -; 12ccd - -SwitchAlreadyHoldingText: ; 12ccd - text_jump UnknownText_0x1c1bdc - db "@" -; 12cd2 - -CantBeHeldText: ; 12cd2 - text_jump UnknownText_0x1c1c09 - db "@" -; 12cd7 - - -GetPartyItemLocation: ; 12cd7 - push af - ld a, MON_ITEM - call GetPartyParamLocation - pop af - ret -; 12cdf - - -ReceiveItemFromPokemon: ; 12cdf - ld a, 1 - ld [wItemQuantityChangeBuffer], a - ld hl, wNumItems - jp ReceiveItem -; 12cea - - -GiveItemToPokemon: ; 12cea (4:6cea) - ld a, 1 - ld [wItemQuantityChangeBuffer], a - ld hl, wNumItems - jp TossItem - -StartMenuYesNo: ; 12cf5 - call MenuTextBox - call YesNoBox - jp ExitMenu -; 12cfe - - -ComposeMailMessage: ; 12cfe (4:6cfe) - ld de, wTempMailMessage - farcall _ComposeMailMessage - ld hl, wPlayerName - ld de, wTempMailAuthor - ld bc, NAME_LENGTH - 1 - call CopyBytes - ld hl, wPlayerID - ld bc, 2 - call CopyBytes - ld a, [wCurPartySpecies] - ld [de], a - inc de - ld a, [wCurItem] - ld [de], a - ld a, [wCurPartyMon] - ld hl, sPartyMail - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - ld hl, wTempMail - ld bc, MAIL_STRUCT_LENGTH - ld a, BANK(sPartyMail) - call GetSRAMBank - call CopyBytes - call CloseSRAM - ret - -MonMailAction: ; 12d45 -; If in the time capsule or trade center, -; selecting the mail only allows you to -; read the mail. - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jr z, .read - cp LINK_TRADECENTER - jr z, .read - -; Show the READ/TAKE/QUIT menu. - ld hl, .MenuHeader - call LoadMenuHeader - call VerticalMenu - call ExitMenu - -; Interpret the menu. - jp c, .done - ld a, [wMenuCursorY] - cp $1 - jr z, .read - cp $2 - jr z, .take - jp .done - -.read - farcall ReadPartyMonMail - ld a, $0 - ret - -.take - ld hl, .sendmailtopctext - call StartMenuYesNo - jr c, .RemoveMailToBag - ld a, [wCurPartyMon] - ld b, a - farcall SendMailToPC - jr c, .MailboxFull - ld hl, .sentmailtopctext - call MenuTextBoxBackup - jr .done - -.MailboxFull: - ld hl, .mailboxfulltext - call MenuTextBoxBackup - jr .done - -.RemoveMailToBag: - ld hl, .mailwilllosemessagetext - call StartMenuYesNo - jr c, .done - call GetPartyItemLocation - ld a, [hl] - ld [wCurItem], a - call ReceiveItemFromPokemon - jr nc, .BagIsFull - call GetPartyItemLocation - ld [hl], $0 - call GetCurNick - ld hl, .tookmailfrommontext - call MenuTextBoxBackup - jr .done - -.BagIsFull: - ld hl, .bagfulltext - call MenuTextBoxBackup - jr .done - -.done - ld a, $3 - ret -; 12dc9 - - -.MenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 12, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default option -; 0x12dd1 - -.MenuData: - db STATICMENU_CURSOR ; flags - db 3 ; items - db "READ@" - db "TAKE@" - db "QUIT@" -; 0x12de2 - - -.mailwilllosemessagetext -; The MAIL will lose its message. OK? - text_jump UnknownText_0x1c1c22 - db "@" -; 0x12de7 - -.tookmailfrommontext -; MAIL detached from . - text_jump UnknownText_0x1c1c47 - db "@" -; 0x12dec - -.bagfulltext -; There's no space for removing MAIL. - text_jump UnknownText_0x1c1c62 - db "@" -; 0x12df1 - -.sendmailtopctext -; Send the removed MAIL to your PC? - text_jump UnknownText_0x1c1c86 - db "@" -; 0x12df6 - -.mailboxfulltext -; Your PC's MAILBOX is full. - text_jump UnknownText_0x1c1ca9 - db "@" -; 0x12dfb - -.sentmailtopctext -; The MAIL was sent to your PC. - text_jump UnknownText_0x1c1cc4 - db "@" -; 0x12e00 - - -OpenPartyStats: ; 12e00 - call LoadStandardMenuHeader - call ClearSprites -; PartyMon - xor a - ld [wMonType], a - call LowVolume - predef StatsScreenInit - call MaxVolume - call Call_ExitMenu - ld a, 0 - ret -; 12e1b - - -MonMenu_Cut: ; 12e1b - farcall CutFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12e30 - - -MonMenu_Fly: ; 12e30 - farcall FlyFunction - ld a, [wFieldMoveSucceeded] - cp $2 - jr z, .Fail - cp $0 - jr z, .Error - farcall StubbedTrainerRankings_Fly - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret - -.Error: - ld a, $0 - ret - -.Unreferenced: - ld a, $1 - ret -; 12e55 - -MonMenu_Flash: ; 12e55 - farcall OWFlash - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12e6a - -MonMenu_Strength: ; 12e6a - farcall StrengthFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12e7f - -MonMenu_Whirlpool: ; 12e7f - farcall WhirlpoolFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12e94 - -MonMenu_Waterfall: ; 12e94 - farcall WaterfallFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12ea9 - -MonMenu_Teleport: ; 12ea9 - farcall TeleportFunction - ld a, [wFieldMoveSucceeded] - and a - jr z, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12ebd - -MonMenu_Surf: ; 12ebd - farcall SurfFunction - ld a, [wFieldMoveSucceeded] - and a - jr z, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12ed1 - -MonMenu_Dig: ; 12ed1 - farcall DigFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12ee6 - -MonMenu_Softboiled_MilkDrink: ; 12ee6 - call .CheckMonHasEnoughHP - jr nc, .NotEnoughHP - farcall Softboiled_MilkDrinkFunction - jr .finish - -.NotEnoughHP: - ld hl, .Text_NotEnoughHP - call PrintText - -.finish - xor a - ld [wPartyMenuActionText], a - ld a, $3 - ret -; 12f00 - -.Text_NotEnoughHP: - ; Not enough HP! - text_jump UnknownText_0x1c1ce3 - db "@" -; 0x12f05 - -.CheckMonHasEnoughHP: -; Need to have at least (MaxHP / 5) HP left. - ld a, MON_MAXHP - call GetPartyParamLocation - ld a, [hli] - ld [hDividend + 0], a - ld a, [hl] - ld [hDividend + 1], a - ld a, 5 - ld [hDivisor], a - ld b, 2 - call Divide - ld a, MON_HP + 1 - call GetPartyParamLocation - ld a, [hQuotient + 2] - sub [hl] - dec hl - ld a, [hQuotient + 1] - sbc [hl] - ret -; 12f26 - -MonMenu_Headbutt: ; 12f26 - farcall HeadbuttFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12f3b - -MonMenu_RockSmash: ; 12f3b - farcall RockSmashFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12f50 - -MonMenu_SweetScent: ; 12f50 - farcall SweetScentFromMenu - ld b, $4 - ld a, $2 - ret -; 12f5b - -ChooseMoveToDelete: ; 12f5b - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call LoadFontsBattleExtra - call .ChooseMoveToDelete - pop bc - ld a, b - ld [wOptions], a - push af - call ClearBGPalettes - pop af - ret -; 12f73 - -.ChooseMoveToDelete - call SetUpMoveScreenBG - ld de, DeleteMoveScreenAttrs - call SetMenuAttributes - call SetUpMoveList - ld hl, w2DMenuFlags1 - set 6, [hl] - jr .enter_loop - -.loop - call ScrollingMenuJoypad - bit B_BUTTON_F, a - jp nz, .b_button - bit A_BUTTON_F, a - jp nz, .a_button - -.enter_loop - call PrepareToPlaceMoveData - call PlaceMoveData - jp .loop -; 12f9c - -.a_button - and a - jr .finish - -.b_button - scf - -.finish - push af - xor a - ld [wSwitchMon], a - ld hl, w2DMenuFlags1 - res 6, [hl] - call ClearSprites - call ClearTileMap - pop af - ret -; 12fb2 - -DeleteMoveScreenAttrs: ; 12fb2 - db 3, 1 - db 3, 1 - db $40, $00 - dn 2, 0 - db D_UP | D_DOWN | A_BUTTON | B_BUTTON -; 12fba - -ManagePokemonMoves: ; 12fba - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call MoveScreenLoop - pop af - ld [wOptions], a - call ClearBGPalettes - -.egg - ld a, $0 - ret -; 12fd5 - -MoveScreenLoop: ; 12fd5 - ld a, [wCurPartyMon] - inc a - ld [wPartyMenuCursor], a - call SetUpMoveScreenBG - call Function132d3 - ld de, MoveScreenAttributes - call SetMenuAttributes -.loop - call SetUpMoveList - ld hl, w2DMenuFlags1 - set 6, [hl] - jr .skip_joy - -.joy_loop - call ScrollingMenuJoypad - bit 1, a - jp nz, .b_button - bit 0, a - jp nz, .a_button - bit 4, a - jp nz, .d_right - bit 5, a - jp nz, .d_left - -.skip_joy - call PrepareToPlaceMoveData - ld a, [wMoveSwapBuffer] - and a - jr nz, .moving_move - call PlaceMoveData - jp .joy_loop - -.moving_move - ld a, " " - hlcoord 1, 11 - ld bc, 5 - call ByteFill - hlcoord 1, 12 - lb bc, 5, SCREEN_WIDTH - 2 - call ClearBox - hlcoord 1, 12 - ld de, String_MoveWhere - call PlaceString - jp .joy_loop -.b_button - call PlayClickSFX - call WaitSFX - ld a, [wMoveSwapBuffer] - and a - jp z, .exit - - ld a, [wMoveSwapBuffer] - ld [wMenuCursorY], a - xor a - ld [wMoveSwapBuffer], a - hlcoord 1, 2 - lb bc, 8, SCREEN_WIDTH - 2 - call ClearBox - jp .loop -; 1305b - -.d_right - ld a, [wMoveSwapBuffer] - and a - jp nz, .joy_loop - - ld a, [wCurPartyMon] - ld b, a - push bc - call .cycle_right - pop bc - ld a, [wCurPartyMon] - cp b - jp z, .joy_loop - jp MoveScreenLoop - -.d_left - ld a, [wMoveSwapBuffer] - and a - jp nz, .joy_loop - ld a, [wCurPartyMon] - ld b, a - push bc - call .cycle_left - pop bc - ld a, [wCurPartyMon] - cp b - jp z, .joy_loop - jp MoveScreenLoop - -.cycle_right - ld a, [wCurPartyMon] - inc a - ld [wCurPartyMon], a - ld c, a - ld b, 0 - ld hl, wPartySpecies - add hl, bc - ld a, [hl] - cp -1 - jr z, .cycle_left - cp EGG - ret nz - jr .cycle_right - -.cycle_left - ld a, [wCurPartyMon] - and a - ret z -.cycle_left_loop - ld a, [wCurPartyMon] - dec a - ld [wCurPartyMon], a - ld c, a - ld b, 0 - ld hl, wPartySpecies - add hl, bc - ld a, [hl] - cp EGG - ret nz - ld a, [wCurPartyMon] - and a - jr z, .cycle_right - jr .cycle_left_loop -; 130c6 - -.a_button - call PlayClickSFX - call WaitSFX - ld a, [wMoveSwapBuffer] - and a - jr nz, .place_move - ld a, [wMenuCursorY] - ld [wMoveSwapBuffer], a - call PlaceHollowCursor - jp .moving_move - -.place_move - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - push hl - call .copy_move - pop hl - ld bc, $15 - add hl, bc - call .copy_move - ld a, [wBattleMode] - jr z, .swap_moves - ld hl, wBattleMonMoves - ld bc, $20 - ld a, [wCurPartyMon] - call AddNTimes - push hl - call .copy_move - pop hl - ld bc, 6 - add hl, bc - call .copy_move - -.swap_moves - ld de, SFX_SWITCH_POKEMON - call PlaySFX - call WaitSFX - ld de, SFX_SWITCH_POKEMON - call PlaySFX - call WaitSFX - hlcoord 1, 2 - lb bc, 8, 18 - call ClearBox - hlcoord 10, 10 - lb bc, 1, 9 - call ClearBox - jp .loop -; 1313a - -.copy_move - push hl - ld a, [wMenuCursorY] - dec a - ld c, a - ld b, $0 - add hl, bc - ld d, h - ld e, l - pop hl - ld a, [wMoveSwapBuffer] - dec a - ld c, a - ld b, $0 - add hl, bc - ld a, [de] - ld b, [hl] - ld [hl], a - ld a, b - ld [de], a - ret -; 13154 - -.exit - xor a - ld [wMoveSwapBuffer], a - ld hl, w2DMenuFlags1 - res 6, [hl] - call ClearSprites - jp ClearTileMap -; 13163 - -MoveScreenAttributes: ; 13163 - db 3, 1 - db 3, 1 - db $40, $00 - dn 2, 0 - db D_UP | D_DOWN | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON -; 1316b - -String_MoveWhere: ; 1316b - db "Where?@" -; 13172 - -SetUpMoveScreenBG: ; 13172 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - xor a - ld [hBGMapMode], a - farcall LoadStatsScreenPageTilesGFX - farcall ClearSpriteAnims2 - ld a, [wCurPartyMon] - ld e, a - ld d, $0 - ld hl, wPartySpecies - add hl, de - ld a, [hl] - ld [wd265], a - ld e, $2 - farcall LoadMenuMonIcon - hlcoord 0, 1 - ld b, 9 - ld c, 18 - call TextBox - hlcoord 0, 11 - ld b, 5 - ld c, 18 - call TextBox - hlcoord 2, 0 - lb bc, 2, 3 - call ClearBox - xor a - ld [wMonType], a - ld hl, wPartyMonNicknames - ld a, [wCurPartyMon] - call GetNick - hlcoord 5, 1 - call PlaceString - push bc - farcall CopyMonToTempMon - pop hl - call PrintLevel - ld hl, wPlayerHPPal - call SetHPPal - ld b, SCGB_MOVE_LIST - call GetSGBLayout - hlcoord 16, 0 - lb bc, 1, 3 - jp ClearBox -; 131ef - -SetUpMoveList: ; 131ef - xor a - ld [hBGMapMode], a - ld [wMoveSwapBuffer], a - ld [wMonType], a - predef CopyMonToTempMon - ld hl, wTempMonMoves - ld de, wListMoves_MoveIndicesBuffer - ld bc, NUM_MOVES - call CopyBytes - ld a, SCREEN_WIDTH * 2 - ld [wBuffer1], a - hlcoord 2, 3 - predef ListMoves - hlcoord 10, 4 - predef ListMovePP - call WaitBGMap - call SetPalettes - ld a, [wNumMoves] - inc a - ld [w2DMenuNumRows], a - hlcoord 0, 11 - ld b, 5 - ld c, 18 - jp TextBox -; 13235 - -PrepareToPlaceMoveData: ; 13235 - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld a, [wMenuCursorY] - dec a - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - ld [wCurMove], a - hlcoord 1, 12 - lb bc, 5, 18 - jp ClearBox -; 13256 - -PlaceMoveData: ; 13256 - xor a - ld [hBGMapMode], a - hlcoord 0, 10 - ld de, String_MoveType_Top - call PlaceString - hlcoord 0, 11 - ld de, String_MoveType_Bottom - call PlaceString - hlcoord 12, 12 - ld de, String_MoveAtk - call PlaceString - ld a, [wCurMove] - ld b, a - hlcoord 2, 12 - predef PrintMoveType - ld a, [wCurMove] - dec a - ld hl, Moves + MOVE_POWER - ld bc, MOVE_LENGTH - call AddNTimes - ld a, BANK(Moves) - call GetFarByte - hlcoord 16, 12 - cp 2 - jr c, .no_power - ld [wd265], a - ld de, wd265 - lb bc, 1, 3 - call PrintNum - jr .description - -.no_power - ld de, String_MoveNoPower - call PlaceString - -.description - hlcoord 1, 14 - predef PrintMoveDesc - ld a, $1 - ld [hBGMapMode], a - ret -; 132ba - -String_MoveType_Top: ; 132ba - db "┌─────┐@" -; 132c2 -String_MoveType_Bottom: ; 132c2 - db "│TYPE/└@" -; 132ca -String_MoveAtk: ; 132ca - db "ATK/@" -; 132cf -String_MoveNoPower: ; 132cf - db "---@" -; 132d3 - -Function132d3: ; 132d3 - call Function132da - call Function132fe - ret -; 132da - -Function132da: ; 132da - ld a, [wCurPartyMon] - and a - ret z - ld c, a - ld e, a - ld d, 0 - ld hl, wPartyCount - add hl, de -.loop - ld a, [hl] - and a - jr z, .prev - cp EGG - jr z, .prev - cp NUM_POKEMON + 1 - jr c, .legal - -.prev - dec hl - dec c - jr nz, .loop - ret - -.legal - hlcoord 16, 0 - ld [hl], "◀" - ret -; 132fe - -Function132fe: ; 132fe - ld a, [wCurPartyMon] - inc a - ld c, a - ld a, [wPartyCount] - cp c - ret z - ld e, c - ld d, 0 - ld hl, wPartySpecies - add hl, de -.loop - ld a, [hl] - cp -1 - ret z - and a - jr z, .next - cp EGG - jr z, .next - cp NUM_POKEMON + 1 - jr c, .legal - -.next - inc hl - jr .loop - -.legal - hlcoord 18, 0 - ld [hl], "▶" - ret -; 13327 diff --git a/engine/stats_screen.asm b/engine/stats_screen.asm deleted file mode 100755 index 59d96999f..000000000 --- a/engine/stats_screen.asm +++ /dev/null @@ -1,1173 +0,0 @@ - const_def 1 - const PINK_PAGE ; 1 - const GREEN_PAGE ; 2 - const BLUE_PAGE ; 3 -NUM_STAT_PAGES EQU const_value + -1 - -BattleStatsScreenInit: ; 4dc7b (13:5c7b) - ld a, [wLinkMode] - cp LINK_MOBILE - jr nz, StatsScreenInit - - ld a, [wBattleMode] - and a - jr z, StatsScreenInit - jr _MobileStatsScreenInit - -StatsScreenInit: ; 4dc8a - ld hl, StatsScreenMain - jr StatsScreenInit_gotaddress - -_MobileStatsScreenInit: ; 4dc8f - ld hl, StatsScreenMobile - jr StatsScreenInit_gotaddress - -StatsScreenInit_gotaddress: ; 4dc94 - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a ; disable overworld tile animations - ld a, [wBoxAlignment] ; whether sprite is to be mirrorred - push af - ld a, [wJumptableIndex] - ld b, a - ld a, [wcf64] - ld c, a - - push bc - push hl - call ClearBGPalettes - call ClearTileMap - call UpdateSprites - farcall StatsScreen_LoadFont - pop hl - call _hl_ - call ClearBGPalettes - call ClearTileMap - pop bc - - ; restore old values - ld a, b - ld [wJumptableIndex], a - ld a, c - ld [wcf64], a - pop af - ld [wBoxAlignment], a - pop af - ld [hMapAnims], a - ret -; 0x4dcd2 - -StatsScreenMain: ; 0x4dcd2 - xor a - ld [wJumptableIndex], a - ; stupid interns - ld [wcf64], a - ld a, [wcf64] - and %11111100 - or 1 - ld [wcf64], a -.loop ; 4dce3 - ld a, [wJumptableIndex] - and $ff ^ (1 << 7) - ld hl, StatsScreenPointerTable - rst JumpTable - call StatsScreen_WaitAnim ; check for keys? - ld a, [wJumptableIndex] - bit 7, a - jr z, .loop - ret -; 0x4dcf7 - -StatsScreenMobile: ; 4dcf7 - xor a - ld [wJumptableIndex], a - ; stupid interns - ld [wcf64], a - ld a, [wcf64] - and %11111100 - or 1 - ld [wcf64], a -.loop - farcall Mobile_SetOverworldDelay - ld a, [wJumptableIndex] - and $ff ^ (1 << 7) - ld hl, StatsScreenPointerTable - rst JumpTable - call StatsScreen_WaitAnim - farcall MobileComms_CheckInactivityTimer - jr c, .exit - ld a, [wJumptableIndex] - bit 7, a - jr z, .loop - -.exit - ret -; 4dd2a - -StatsScreenPointerTable: ; 4dd2a - dw MonStatsInit ; regular pokémon - dw EggStatsInit ; egg - dw StatsScreenWaitCry - dw EggStatsJoypad - dw StatsScreen_LoadPage - dw StatsScreenWaitCry - dw MonStatsJoypad - dw StatsScreen_Exit -; 4dd3a - - -StatsScreen_WaitAnim: ; 4dd3a (13:5d3a) - ld hl, wcf64 - bit 6, [hl] - jr nz, .try_anim - bit 5, [hl] - jr nz, .finish - call DelayFrame - ret - -.try_anim - farcall SetUpPokeAnim - jr nc, .finish - ld hl, wcf64 - res 6, [hl] -.finish - ld hl, wcf64 - res 5, [hl] - farcall HDMATransferTileMapToWRAMBank3 - ret - -StatsScreen_SetJumptableIndex: ; 4dd62 (13:5d62) - ld a, [wJumptableIndex] - and $80 - or h - ld [wJumptableIndex], a - ret - -StatsScreen_Exit: ; 4dd6c (13:5d6c) - ld hl, wJumptableIndex - set 7, [hl] - ret - -MonStatsInit: ; 4dd72 (13:5d72) - ld hl, wcf64 - res 6, [hl] - call ClearBGPalettes - call ClearTileMap - farcall HDMATransferTileMapToWRAMBank3 - call StatsScreen_CopyToTempMon - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - call StatsScreen_InitUpperHalf - ld hl, wcf64 - set 4, [hl] - ld h, 4 - call StatsScreen_SetJumptableIndex - ret - -.egg - ld h, 1 - call StatsScreen_SetJumptableIndex - ret - -EggStatsInit: ; 4dda1 - call EggStatsScreen - ld a, [wJumptableIndex] - inc a - ld [wJumptableIndex], a - ret -; 0x4ddac - - -EggStatsJoypad: ; 4ddac (13:5dac) - call StatsScreen_GetJoypad - jr nc, .check - ld h, 0 - call StatsScreen_SetJumptableIndex - ret - -.check - bit A_BUTTON_F, a - jr nz, .quit - and D_DOWN | D_UP | A_BUTTON | B_BUTTON - jp StatsScreen_JoypadAction - -.quit - ld h, 7 - call StatsScreen_SetJumptableIndex - ret - -StatsScreen_LoadPage: ; 4ddc6 (13:5dc6) - call StatsScreen_LoadGFX - ld hl, wcf64 - res 4, [hl] - ld a, [wJumptableIndex] - inc a - ld [wJumptableIndex], a - ret - -MonStatsJoypad: ; 4ddd6 (13:5dd6) - call StatsScreen_GetJoypad - jr nc, .next - ld h, 0 - call StatsScreen_SetJumptableIndex - ret - -.next - and D_DOWN | D_UP | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON - jp StatsScreen_JoypadAction - -StatsScreenWaitCry: ; 4dde6 (13:5de6) - call IsSFXPlaying - ret nc - ld a, [wJumptableIndex] - inc a - ld [wJumptableIndex], a - ret - -StatsScreen_CopyToTempMon: ; 4ddf2 (13:5df2) - ld a, [wMonType] - cp TEMPMON - jr nz, .breedmon - ld a, [wBufferMonSpecies] - ld [wCurSpecies], a - call GetBaseData - ld hl, wBufferMon - ld de, wTempMon - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - jr .done - -.breedmon - farcall CopyMonToTempMon - ld a, [wCurPartySpecies] - cp EGG - jr z, .done - ld a, [wMonType] - cp BOXMON - jr c, .done - farcall CalcTempmonStats -.done - and a - ret - -StatsScreen_GetJoypad: ; 4de2c (13:5e2c) - call GetJoypad - ld a, [wMonType] - cp TEMPMON - jr nz, .notbreedmon - push hl - push de - push bc - farcall StatsScreenDPad - pop bc - pop de - pop hl - ld a, [wMenuJoypad] - and D_DOWN | D_UP - jr nz, .set_carry - ld a, [wMenuJoypad] - jr .clear_flags - -.notbreedmon - ld a, [hJoyPressed] -.clear_flags - and a - ret - -.set_carry - scf - ret - -StatsScreen_JoypadAction: ; 4de54 (13:5e54) - push af - ld a, [wcf64] - maskbits NUM_STAT_PAGES - ld c, a - pop af - bit B_BUTTON_F, a - jp nz, .b_button - bit D_LEFT_F, a - jr nz, .d_left - bit D_RIGHT_F, a - jr nz, .d_right - bit A_BUTTON_F, a - jr nz, .a_button - bit D_UP_F, a - jr nz, .d_up - bit D_DOWN_F, a - jr nz, .d_down - jr .done - -.d_down - ld a, [wMonType] - cp BOXMON - jr nc, .done - and a - ld a, [wPartyCount] - jr z, .next_mon - ld a, [wOTPartyCount] -.next_mon - ld b, a - ld a, [wCurPartyMon] - inc a - cp b - jr z, .done - ld [wCurPartyMon], a - ld b, a - ld a, [wMonType] - and a - jr nz, .load_mon - ld a, b - inc a - ld [wPartyMenuCursor], a - jr .load_mon - -.d_up - ld a, [wCurPartyMon] - and a - jr z, .done - dec a - ld [wCurPartyMon], a - ld b, a - ld a, [wMonType] - and a - jr nz, .load_mon - ld a, b - inc a - ld [wPartyMenuCursor], a - jr .load_mon - -.a_button - ld a, c - cp BLUE_PAGE ; last page - jr z, .b_button -.d_right - inc c - ld a, BLUE_PAGE ; last page - cp c - jr nc, .set_page - ld c, PINK_PAGE ; first page - jr .set_page - -.d_left - dec c - jr nz, .set_page - ld c, BLUE_PAGE ; last page - jr .set_page - -.done - ret - -.set_page - ld a, [wcf64] - and %11111100 - or c - ld [wcf64], a - ld h, 4 - call StatsScreen_SetJumptableIndex - ret - -.load_mon - ld h, 0 - call StatsScreen_SetJumptableIndex - ret - -.b_button ; 4dee4 (13:5ee4) - ld h, 7 - call StatsScreen_SetJumptableIndex - ret - -StatsScreen_InitUpperHalf: ; 4deea (13:5eea) - call .PlaceHPBar - xor a - ld [hBGMapMode], a - ld a, [wBaseDexNo] - ld [wd265], a - ld [wCurSpecies], a - hlcoord 8, 0 - ld [hl], "№" - inc hl - ld [hl], "." - inc hl - hlcoord 10, 0 - lb bc, PRINTNUM_LEADINGZEROS | 1, 3 - ld de, wd265 - call PrintNum - hlcoord 14, 0 - call PrintLevel - ld hl, .NicknamePointers - call GetNicknamePointer - call CopyNickname - hlcoord 8, 2 - call PlaceString - hlcoord 18, 0 - call .PlaceGenderChar - hlcoord 9, 4 - ld a, "/" - ld [hli], a - ld a, [wBaseDexNo] - ld [wd265], a - call GetPokemonName - call PlaceString - call StatsScreen_PlaceHorizontalDivider - call StatsScreen_PlacePageSwitchArrows - call StatsScreen_PlaceShinyIcon - ret - -.PlaceHPBar: ; 4df45 (13:5f45) - ld hl, wTempMonHP - ld a, [hli] - ld b, a - ld c, [hl] - ld hl, wTempMonMaxHP - ld a, [hli] - ld d, a - ld e, [hl] - farcall ComputeHPBarPixels - ld hl, wCurHPPal - call SetHPPal - ld b, SCGB_STATS_SCREEN_HP_PALS - call GetSGBLayout - call DelayFrame - ret - -.PlaceGenderChar: ; 4df66 (13:5f66) - push hl - farcall GetGender - pop hl - ret c - ld a, "♂" - jr nz, .got_gender - ld a, "♀" -.got_gender - ld [hl], a - ret -; 4df77 (13:5f77) - -.NicknamePointers: ; 4df77 - dw wPartyMonNicknames - dw wOTPartyMonNicknames - dw sBoxMonNicknames - dw wBufferMonNick -; 4df7f - -Unreferenced_Function4df7f: ; 4df7f - hlcoord 7, 0 - ld bc, SCREEN_WIDTH - ld d, SCREEN_HEIGHT -.loop - ld a, $31 ; vertical divider - ld [hl], a - add hl, bc - dec d - jr nz, .loop - ret -; 4df8f - -StatsScreen_PlaceHorizontalDivider: ; 4df8f (13:5f8f) - hlcoord 0, 7 - ld b, SCREEN_WIDTH - ld a, $62 ; horizontal divider (empty HP/exp bar) -.loop - ld [hli], a - dec b - jr nz, .loop - ret - -StatsScreen_PlacePageSwitchArrows: ; 4df9b (13:5f9b) - hlcoord 12, 6 - ld [hl], "◀" - hlcoord 19, 6 - ld [hl], "▶" - ret - -StatsScreen_PlaceShinyIcon: ; 4dfa6 (13:5fa6) - ld bc, wTempMonDVs - farcall CheckShininess - ret nc - hlcoord 19, 0 - ld [hl], "⁂" - ret - -StatsScreen_LoadGFX: ; 4dfb6 (13:5fb6) - ld a, [wBaseDexNo] - ld [wd265], a - ld [wCurSpecies], a - xor a - ld [hBGMapMode], a - call .ClearBox - call .PageTilemap - call .LoadPals - ld hl, wcf64 - bit 4, [hl] - jr nz, .place_frontpic - call SetPalettes - ret - -.place_frontpic - call StatsScreen_PlaceFrontpic - ret - -.ClearBox: ; 4dfda (13:5fda) - ld a, [wcf64] - maskbits NUM_STAT_PAGES - ld c, a - call StatsScreen_LoadPageIndicators - hlcoord 0, 8 - lb bc, 10, 20 - call ClearBox - ret - -.LoadPals: ; 4dfed (13:5fed) - ld a, [wcf64] - maskbits NUM_STAT_PAGES - ld c, a - farcall LoadStatsScreenPals - call DelayFrame - ld hl, wcf64 - set 5, [hl] - ret - -.PageTilemap: ; 4e002 (13:6002) - ld a, [wcf64] - maskbits NUM_STAT_PAGES - dec a - ld hl, .Jumptable - rst JumpTable - ret - -.Jumptable: ; 4e00d (13:600d) -; entries correspond to *_PAGE constants - dw .PinkPage - dw .GreenPage - dw .BluePage - -.PinkPage: ; 4e013 (13:6013) - hlcoord 0, 9 - ld b, $0 - predef DrawPlayerHP - hlcoord 8, 9 - ld [hl], $41 ; right HP/exp bar end cap - ld de, .Status_Type - hlcoord 0, 12 - call PlaceString - ld a, [wTempMonPokerusStatus] - ld b, a - and $f - jr nz, .HasPokerus - ld a, b - and $f0 - jr z, .NotImmuneToPkrs - hlcoord 8, 8 - ld [hl], "." ; Pokérus immunity dot -.NotImmuneToPkrs: - ld a, [wMonType] - cp BOXMON - jr z, .StatusOK - hlcoord 6, 13 - push hl - ld de, wTempMonStatus - predef PlaceStatusString - pop hl - jr nz, .done_status - jr .StatusOK -.HasPokerus: - ld de, .PkrsStr - hlcoord 1, 13 - call PlaceString - jr .done_status -.StatusOK: - ld de, .OK_str - call PlaceString -.done_status - hlcoord 1, 15 - predef PrintMonTypes - hlcoord 9, 8 - ld de, SCREEN_WIDTH - ld b, 10 - ld a, $31 ; vertical divider -.vertical_divider - ld [hl], a - add hl, de - dec b - jr nz, .vertical_divider - ld de, .ExpPointStr - hlcoord 10, 9 - call PlaceString - hlcoord 17, 14 - call .PrintNextLevel - hlcoord 13, 10 - lb bc, 3, 7 - ld de, wTempMonExp - call PrintNum - call .CalcExpToNextLevel - hlcoord 13, 13 - lb bc, 3, 7 - ld de, wBuffer1 - call PrintNum - ld de, .LevelUpStr - hlcoord 10, 12 - call PlaceString - ld de, .ToStr - hlcoord 14, 14 - call PlaceString - hlcoord 11, 16 - ld a, [wTempMonLevel] - ld b, a - ld de, wTempMonExp + 2 - predef FillInExpBar - hlcoord 10, 16 - ld [hl], $40 ; left exp bar end cap - hlcoord 19, 16 - ld [hl], $41 ; right exp bar end cap - ret - -.PrintNextLevel: ; 4e0d3 (13:60d3) - ld a, [wTempMonLevel] - push af - cp MAX_LEVEL - jr z, .AtMaxLevel - inc a - ld [wTempMonLevel], a -.AtMaxLevel: - call PrintLevel - pop af - ld [wTempMonLevel], a - ret - -.CalcExpToNextLevel: ; 4e0e7 (13:60e7) - ld a, [wTempMonLevel] - cp MAX_LEVEL - jr z, .AlreadyAtMaxLevel - inc a - ld d, a - farcall CalcExpAtLevel - ld hl, wTempMonExp + 2 - ld hl, wTempMonExp + 2 - ld a, [hQuotient + 2] - sub [hl] - dec hl - ld [wBuffer3], a - ld a, [hQuotient + 1] - sbc [hl] - dec hl - ld [wBuffer2], a - ld a, [hQuotient] - sbc [hl] - ld [wBuffer1], a - ret - -.AlreadyAtMaxLevel: - ld hl, wBuffer1 - xor a - ld [hli], a - ld [hli], a - ld [hl], a - ret -; 4e119 (13:6119) - -.Status_Type: ; 4e119 - db "STATUS/" - next "TYPE/@" -; 4e127 - -.OK_str: ; 4e127 - db "OK @" -; 4e12b - -.ExpPointStr: ; 4e12b - db "EXP POINTS@" -; 4e136 - -.LevelUpStr: ; 4e136 - db "LEVEL UP@" -; 4e13f - -.ToStr: ; 4e13f - db "TO@" -; 4e142 - -.PkrsStr: ; 4e142 - db "#RUS@" -; 4e147 - -.GreenPage: ; 4e147 (13:6147) - ld de, .Item - hlcoord 0, 8 - call PlaceString - call .GetItemName - hlcoord 8, 8 - call PlaceString - ld de, .Move - hlcoord 0, 10 - call PlaceString - ld hl, wTempMonMoves - ld de, wListMoves_MoveIndicesBuffer - ld bc, NUM_MOVES - call CopyBytes - hlcoord 8, 10 - ld a, SCREEN_WIDTH * 2 - ld [wBuffer1], a - predef ListMoves - hlcoord 12, 11 - ld a, SCREEN_WIDTH * 2 - ld [wBuffer1], a - predef ListMovePP - ret - -.GetItemName: ; 4e189 (13:6189) - ld de, .ThreeDashes - ld a, [wTempMonItem] - and a - ret z - ld b, a - farcall TimeCapsule_ReplaceTeruSama - ld a, b - ld [wd265], a - call GetItemName - ret -; 4e1a0 (13:61a0) - -.Item: ; 4e1a0 - db "ITEM@" -; 4e1a5 - -.ThreeDashes: ; 4e1a5 - db "---@" -; 4e1a9 - -.Move: ; 4e1a9 - db "MOVE@" -; 4e1ae - -.BluePage: ; 4e1ae (13:61ae) - call .PlaceOTInfo - hlcoord 10, 8 - ld de, SCREEN_WIDTH - ld b, 10 - ld a, $31 ; vertical divider -.BluePageVerticalDivider: - ld [hl], a - add hl, de - dec b - jr nz, .BluePageVerticalDivider - hlcoord 11, 8 - ld bc, 6 - predef PrintTempMonStats - ret - -.PlaceOTInfo: ; 4e1cc (13:61cc) - ld de, IDNoString - hlcoord 0, 9 - call PlaceString - ld de, OTString - hlcoord 0, 12 - call PlaceString - hlcoord 2, 10 - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - ld de, wTempMonID - call PrintNum - ld hl, .OTNamePointers - call GetNicknamePointer - call CopyNickname - farcall CheckNickErrors - hlcoord 2, 13 - call PlaceString - ld a, [wTempMonCaughtGender] - and a - jr z, .done - cp $7f - jr z, .done - and $80 - ld a, "♂" - jr z, .got_gender - ld a, "♀" -.got_gender - hlcoord 9, 13 - ld [hl], a -.done - ret -; 4e216 (13:6216) - -.OTNamePointers: ; 4e216 - dw wPartyMonOT - dw wOTPartyMonOT - dw sBoxMonOT - dw wBufferMonOT -; 4e21e - -IDNoString: ; 4e21e - db "№.@" - -OTString: ; 4e222 - db "OT/@" -; 4e226 - - -StatsScreen_PlaceFrontpic: ; 4e226 (13:6226) - ld hl, wTempMonDVs - predef GetUnownLetter - call StatsScreen_GetAnimationParam - jr c, .egg - and a - jr z, .no_cry - jr .cry - -.egg - call .AnimateEgg - call SetPalettes - ret - -.no_cry - call .AnimateMon - call SetPalettes - ret - -.cry - call SetPalettes - call .AnimateMon - ld a, [wCurPartySpecies] - call PlayMonCry2 - ret - -.AnimateMon: ; 4e253 (13:6253) - ld hl, wcf64 - set 5, [hl] - ld a, [wCurPartySpecies] - cp UNOWN - jr z, .unown - hlcoord 0, 0 - call PrepMonFrontpic - ret - -.unown - xor a - ld [wBoxAlignment], a - hlcoord 0, 0 - call _PrepMonFrontpic - ret - -.AnimateEgg: ; 4e271 (13:6271) - ld a, [wCurPartySpecies] - cp UNOWN - jr z, .unownegg - ld a, TRUE - ld [wBoxAlignment], a - call .get_animation - ret - -.unownegg - xor a - ld [wBoxAlignment], a - call .get_animation - ret - -.get_animation ; 4e289 (13:6289) - ld a, [wCurPartySpecies] - call IsAPokemon - ret c - call StatsScreen_LoadTextBoxSpaceGFX - ld de, vTiles2 tile $00 - predef GetAnimatedFrontpic - hlcoord 0, 0 - ld d, $0 - ld e, ANIM_MON_MENU - predef LoadMonAnimation - ld hl, wcf64 - set 6, [hl] - ret - -StatsScreen_GetAnimationParam: ; 4e2ad (13:62ad) - ld a, [wMonType] - ld hl, .Jumptable - rst JumpTable - ret - -.Jumptable: ; 4e2b5 (13:62b5) - dw .PartyMon - dw .OTPartyMon - dw .BoxMon - dw .Tempmon - dw .Wildmon - -.PartyMon: ; 4e2bf (13:62bf) - ld a, [wCurPartyMon] - ld hl, wPartyMon1 - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld b, h - ld c, l - jr .CheckEggFaintedFrzSlp - -.OTPartyMon: ; 4e2cf (13:62cf) - xor a - ret - -.BoxMon: ; 4e2d1 (13:62d1) - ld hl, sBoxMons - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld b, h - ld c, l - ld a, BANK(sBoxMons) - call GetSRAMBank - call .CheckEggFaintedFrzSlp - push af - call CloseSRAM - pop af - ret - -.Tempmon: ; 4e2ed (13:62ed) - ld bc, wTempMonSpecies - jr .CheckEggFaintedFrzSlp ; utterly pointless - -.CheckEggFaintedFrzSlp: ; 4e2f2 (13:62f2) - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - call CheckFaintedFrzSlp - jr c, .FaintedFrzSlp -.egg - xor a - scf - ret - -.Wildmon: ; 4e301 (13:6301) - ld a, $1 - and a - ret - -.FaintedFrzSlp: ; 4e305 (13:6305) - xor a - ret - -StatsScreen_LoadTextBoxSpaceGFX: ; 4e307 (13:6307) - nop - push hl - push de - push bc - push af - call DelayFrame - ld a, [rVBK] - push af - ld a, $1 - ld [rVBK], a - ld de, TextBoxSpaceGFX - lb bc, BANK(TextBoxSpaceGFX), 1 - ld hl, vTiles2 tile " " - call Get2bpp - pop af - ld [rVBK], a - pop af - pop bc - pop de - pop hl - ret -; 4e32a (13:632a) - -Unreferenced_4e32a: ; 4e32a -; A blank space tile? - ds 16 -; 4e33a - -EggStatsScreen: ; 4e33a - xor a - ld [hBGMapMode], a - ld hl, wCurHPPal - call SetHPPal - ld b, SCGB_STATS_SCREEN_HP_PALS - call GetSGBLayout - call StatsScreen_PlaceHorizontalDivider - ld de, EggString - hlcoord 8, 1 - call PlaceString - ld de, IDNoString - hlcoord 8, 3 - call PlaceString - ld de, OTString - hlcoord 8, 5 - call PlaceString - ld de, FiveQMarkString - hlcoord 11, 3 - call PlaceString - ld de, FiveQMarkString - hlcoord 11, 5 - call PlaceString - ld a, [wTempMonHappiness] ; egg status - ld de, EggSoonString - cp $6 - jr c, .picked - ld de, EggCloseString - cp $b - jr c, .picked - ld de, EggMoreTimeString - cp $29 - jr c, .picked - ld de, EggALotMoreTimeString -.picked - hlcoord 1, 9 - call PlaceString - ld hl, wcf64 - set 5, [hl] - call SetPalettes ; pals - call DelayFrame - hlcoord 0, 0 - call PrepMonFrontpic - farcall HDMATransferTileMapToWRAMBank3 - call StatsScreen_AnimateEgg - - ld a, [wTempMonHappiness] - cp 6 - ret nc - ld de, SFX_2_BOOPS - call PlaySFX - ret -; 0x4e3c0 - -EggString: ; 4e3c0 - db "EGG@" - -FiveQMarkString: ; 4e3c4 - db "?????@" - -EggSoonString: ; 0x4e3ca - db "It's making sounds" - next "inside. It's going" - next "to hatch soon!@" - -EggCloseString: ; 0x4e3fd - db "It moves around" - next "inside sometimes." - next "It must be close" - next "to hatching.@" - -EggMoreTimeString: ; 0x4e43d - db "Wonder what's" - next "inside? It needs" - next "more time, though.@" - -EggALotMoreTimeString: ; 0x4e46e - db "This EGG needs a" - next "lot more time to" - next "hatch.@" -; 0x4e497 - - -StatsScreen_AnimateEgg: ; 4e497 (13:6497) - call StatsScreen_GetAnimationParam - ret nc - ld a, [wTempMonHappiness] - ld e, $7 - cp 6 - jr c, .animate - ld e, $8 - cp 11 - jr c, .animate - ret - -.animate - push de - ld a, $1 - ld [wBoxAlignment], a - call StatsScreen_LoadTextBoxSpaceGFX - ld de, vTiles2 tile $00 - predef GetAnimatedFrontpic - pop de - hlcoord 0, 0 - ld d, $0 - predef LoadMonAnimation - ld hl, wcf64 - set 6, [hl] - ret - -StatsScreen_LoadPageIndicators: ; 4e4cd (13:64cd) - hlcoord 13, 5 - ld a, $36 ; first of 4 small square tiles - call .load_square - hlcoord 15, 5 - ld a, $36 ; " " " " - call .load_square - hlcoord 17, 5 - ld a, $36 ; " " " " - call .load_square - ld a, c - cp GREEN_PAGE - ld a, $3a ; first of 4 large square tiles - hlcoord 13, 5 ; PINK_PAGE (< GREEN_PAGE) - jr c, .load_square - hlcoord 15, 5 ; GREEN_PAGE (= GREEN_PAGE) - jr z, .load_square - hlcoord 17, 5 ; BLUE_PAGE (> GREEN_PAGE) -.load_square ; 4e4f7 (13:64f7) - push bc - ld [hli], a - inc a - ld [hld], a - ld bc, SCREEN_WIDTH - add hl, bc - inc a - ld [hli], a - inc a - ld [hl], a - pop bc - ret - -CopyNickname: ; 4e505 (13:6505) - ld de, wStringBuffer1 - ld bc, MON_NAME_LENGTH - jr .okay ; utterly pointless -.okay - ld a, [wMonType] - cp BOXMON - jr nz, .partymon - ld a, BANK(sBoxMonNicknames) - call GetSRAMBank - push de - call CopyBytes - pop de - call CloseSRAM - ret - -.partymon - push de - call CopyBytes - pop de - ret - -GetNicknamePointer: ; 4e528 (13:6528) - ld a, [wMonType] - add a - ld c, a - ld b, 0 - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wMonType] - cp TEMPMON - ret z - ld a, [wCurPartyMon] - jp SkipNames - - -CheckFaintedFrzSlp: ; 4e53f - ld hl, MON_HP - add hl, bc - ld a, [hli] - or [hl] - jr z, .fainted_frz_slp - ld hl, MON_STATUS - add hl, bc - ld a, [hl] - and 1 << FRZ | SLP - jr nz, .fainted_frz_slp - and a - ret - -.fainted_frz_slp - scf - ret -; 4e554 diff --git a/engine/switch_items.asm b/engine/switch_items.asm deleted file mode 100755 index 77b635246..000000000 --- a/engine/switch_items.asm +++ /dev/null @@ -1,274 +0,0 @@ -SwitchItemsInBag: ; 2490c (9:490c) - ld a, [wSwitchItem] - and a - jr z, .init - ld b, a - ld a, [wScrollingMenuCursorPosition] - inc a - cp b - jr z, .trivial - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - ld a, [hl] - cp -1 - ret z - ld a, [wSwitchItem] - dec a - ld [wSwitchItem], a - call Function249a7 - jp c, Function249d1 - ld a, [wScrollingMenuCursorPosition] - ld c, a - ld a, [wSwitchItem] - cp c - jr c, .asm_2497a - jr .asm_2494a - -.init - ld a, [wScrollingMenuCursorPosition] - inc a - ld [wSwitchItem], a - ret - -.trivial - xor a - ld [wSwitchItem], a - ret - -.asm_2494a - ld a, [wSwitchItem] - call Function24a40 - ld a, [wScrollingMenuCursorPosition] - ld d, a - ld a, [wSwitchItem] - ld e, a - call Function24a6c - push bc - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - dec hl - push hl - call ItemSwitch_ConvertSpacingToDW - add hl, bc - ld d, h - ld e, l - pop hl - pop bc - call Function24aab - ld a, [wScrollingMenuCursorPosition] - call Function24a4d - xor a - ld [wSwitchItem], a - ret - -.asm_2497a - ld a, [wSwitchItem] - call Function24a40 - ld a, [wScrollingMenuCursorPosition] - ld d, a - ld a, [wSwitchItem] - ld e, a - call Function24a6c - push bc - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - ld d, h - ld e, l - call ItemSwitch_ConvertSpacingToDW - add hl, bc - pop bc - call CopyBytes - ld a, [wScrollingMenuCursorPosition] - call Function24a4d - xor a - ld [wSwitchItem], a - ret - -Function249a7: ; 249a7 (9:49a7) - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - ld d, h - ld e, l - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - ld a, [de] - cp [hl] - jr nz, .asm_249cd - ld a, [wScrollingMenuCursorPosition] - call Function24a97 - cp 99 - jr z, .asm_249cd - ld a, [wSwitchItem] - call Function24a97 - cp 99 - jr nz, .asm_249cf -.asm_249cd - and a - ret - -.asm_249cf - scf - ret - -Function249d1: ; 249d1 (9:49d1) - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - inc hl - push hl - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - inc hl - ld a, [hl] - pop hl - add [hl] - cp 100 - jr c, .asm_24a01 - sub 99 - push af - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - inc hl - ld [hl], 99 - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - inc hl - pop af - ld [hl], a - xor a - ld [wSwitchItem], a - ret - -.asm_24a01 - push af - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - inc hl - pop af - ld [hl], a - ld hl, wMenuData_ItemsPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wSwitchItem] - cp [hl] - jr nz, .asm_24a25 - dec [hl] - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - ld [hl], $ff - xor a - ld [wSwitchItem], a - ret - -.asm_24a25 - dec [hl] - call ItemSwitch_ConvertSpacingToDW - push bc - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - pop bc - push hl - add hl, bc - pop de -.asm_24a34 - ld a, [hli] - ld [de], a - inc de - cp $ff - jr nz, .asm_24a34 - xor a - ld [wSwitchItem], a - ret - -Function24a40: ; 24a40 (9:4a40) - call ItemSwitch_GetNthItem - ld de, wd002 - call ItemSwitch_ConvertSpacingToDW - call CopyBytes - ret - -Function24a4d: ; 24a4d (9:4a4d) - call ItemSwitch_GetNthItem - ld d, h - ld e, l - ld hl, wd002 - call ItemSwitch_ConvertSpacingToDW - call CopyBytes - ret - -ItemSwitch_GetNthItem: ; 24a5c (9:4a5c) - push af - call ItemSwitch_ConvertSpacingToDW - ld hl, wMenuData_ItemsPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - inc hl - pop af - call AddNTimes - ret - -Function24a6c: ; 24a6c (9:4a6c) - push hl - call ItemSwitch_ConvertSpacingToDW - ld a, d - sub e - jr nc, .dont_negate - dec a - cpl -.dont_negate - ld hl, 0 - call AddNTimes - ld b, h - ld c, l - pop hl - ret - -ItemSwitch_ConvertSpacingToDW: ; 24a80 (9:4a80) -; This function is absolutely idiotic. - push hl - ld a, [wMenuData_ScrollingMenuSpacing] - ld c, a - ld b, 0 - ld hl, .spacing_dws - add hl, bc - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - pop hl - ret - -; 24a91 (9:4a91) - -.spacing_dws ; 24a91 - dw 0, 1, 2 -; 24a97 - -Function24a97: ; 24a97 (9:4a97) - push af - call ItemSwitch_ConvertSpacingToDW - ld a, c - cp 2 - jr nz, .not_2 - pop af - call ItemSwitch_GetNthItem - inc hl - ld a, [hl] - ret - -.not_2 - pop af - ld a, $1 - ret - -Function24aab: ; 24aab (9:4aab) -.loop - ld a, [hld] - ld [de], a - dec de - dec bc - ld a, b - or c - jr nz, .loop - ret diff --git a/engine/tempmon.asm b/engine/tempmon.asm deleted file mode 100644 index 723bfb1dd..000000000 --- a/engine/tempmon.asm +++ /dev/null @@ -1,127 +0,0 @@ -CopyMonToTempMon: ; 5084a -; gets the BaseData of a mon -; and copies the party_struct to wTempMon - - ld a, [wCurPartyMon] - ld e, a - call GetMonSpecies - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - call GetBaseData - - ld a, [wMonType] - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - and a - jr z, .copywholestruct - ld hl, wOTPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - cp OTPARTYMON - jr z, .copywholestruct - ld bc, BOXMON_STRUCT_LENGTH - callfar CopyBoxmonToTempMon - jr .done - -.copywholestruct - ld a, [wCurPartyMon] - call AddNTimes - ld de, wTempMon - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - -.done - ret - -CalcBufferMonStats: ; 5088b - ld bc, wBufferMon - jr _TempMonStatsCalculation - -CalcTempmonStats: ; 50890 - ld bc, wTempMon -_TempMonStatsCalculation: ; 50893 - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - ld [wCurPartyLevel], a - ld hl, MON_MAXHP - add hl, bc - ld d, h - ld e, l - ld hl, MON_STAT_EXP - 1 - add hl, bc - push bc - ld b, TRUE - predef CalcMonStats - pop bc - ld hl, MON_HP - add hl, bc - ld d, h - ld e, l - ld a, [wCurPartySpecies] - cp EGG - jr nz, .not_egg - xor a - ld [de], a - inc de - ld [de], a - jr .zero_status - -.not_egg - push bc - ld hl, MON_MAXHP - add hl, bc - ld bc, 2 - call CopyBytes - pop bc - -.zero_status - ld hl, MON_STATUS - add hl, bc - xor a - ld [hli], a - ld [hl], a - ret - -GetMonSpecies: ; 508d5 -; [wMonType] has the type of the mon -; e = Nr. of mon (i.e. [wCurPartyMon]) - - ld a, [wMonType] - and a ; PARTYMON - jr z, .partymon - cp OTPARTYMON - jr z, .otpartymon - cp BOXMON - jr z, .boxmon - cp TEMPMON - jr z, .breedmon - ; WILDMON - -.partymon - ld hl, wPartySpecies - jr .done - -.otpartymon - ld hl, wOTPartySpecies - jr .done - -.boxmon - ld a, BANK(sBoxSpecies) - call GetSRAMBank - ld hl, sBoxSpecies - call .done - call CloseSRAM - ret - -.breedmon - ld a, [wBreedMon1Species] - jr .done2 - -.done - ld d, 0 - add hl, de - ld a, [hl] - -.done2 - ld [wCurPartySpecies], a - ret diff --git a/engine/tile_events.asm b/engine/tile_events.asm deleted file mode 100755 index 705c0e427..000000000 --- a/engine/tile_events.asm +++ /dev/null @@ -1,110 +0,0 @@ -CheckWarpCollision:: ; 1499a -; Is this tile a warp? - ld a, [wPlayerStandingTile] - cp COLL_PIT - jr z, .warp - cp COLL_PIT_68 - jr z, .warp - and $f0 - cp HI_NYBBLE_WARPS - jr z, .warp - and a - ret - -.warp - scf - ret -; 149af - -CheckDirectionalWarp:: ; 149af -; If this is a directional warp, clear carry (press the designated button to warp). -; Else, set carry (immediate warp). - ld a, [wPlayerStandingTile] - cp COLL_WARP_CARPET_DOWN - jr z, .directional - cp COLL_WARP_CARPET_LEFT - jr z, .directional - cp COLL_WARP_CARPET_UP - jr z, .directional - cp COLL_WARP_CARPET_RIGHT - jr z, .directional - scf - ret - -.directional - xor a - ret -; 149c6 - -CheckWarpFacingDown: ; 149c6 - ld de, 1 - ld hl, .blocks - ld a, [wPlayerStandingTile] - call IsInArray - ret -; 149d3 - -.blocks ; 149d3 - db COLL_DOOR - db COLL_DOOR_79 - db COLL_STAIRCASE - db COLL_STAIRCASE_73 - db COLL_CAVE - db COLL_CAVE_74 - db COLL_WARP_PANEL - db COLL_DOOR_75 - db COLL_DOOR_7D - db -1 -; 149dd - -CheckGrassCollision:: ; 149dd - ld a, [wPlayerStandingTile] - ld hl, .blocks - ld de, 1 - call IsInArray - ret -; 149ea - -.blocks ; 149ea - db COLL_CUT_08 - db COLL_TALL_GRASS - db COLL_LONG_GRASS - db COLL_CUT_28 - db COLL_WATER - db COLL_GRASS_48 - db COLL_GRASS_49 - db COLL_GRASS_4A - db COLL_GRASS_4B - db COLL_GRASS_4C - db -1 -; 149f5 - -CheckCutCollision: ; 149f5 - ld a, c - ld hl, .blocks - ld de, 1 - call IsInArray - ret -; 14a00 - -.blocks ; 14a00 - db COLL_CUT_TREE - db COLL_CUT_TREE_1A - db COLL_TALL_GRASS_10 - db COLL_TALL_GRASS - db COLL_LONG_GRASS - db COLL_LONG_GRASS_1C - db -1 -; 14a07 - -GetWarpSFX:: ; 14a07 - ld a, [wPlayerStandingTile] - ld de, SFX_ENTER_DOOR - cp COLL_DOOR - ret z - ld de, SFX_WARP_TO - cp COLL_WARP_PANEL - ret z - ld de, SFX_EXIT_BUILDING - ret -; 14a1a diff --git a/engine/tileset_anims.asm b/engine/tileset_anims.asm deleted file mode 100644 index bf0037e65..000000000 --- a/engine/tileset_anims.asm +++ /dev/null @@ -1,1060 +0,0 @@ -_AnimateTileset:: ; fc000 -; Iterate over a given pointer array of -; animation functions (one per frame). - -; Typically in wra1, vra0 - - ld a, [wTilesetAnim] - ld e, a - ld a, [wTilesetAnim + 1] - ld d, a - - ld a, [hTileAnimFrame] - ld l, a - inc a - ld [hTileAnimFrame], a - - ld h, 0 - add hl, hl - add hl, hl - add hl, de - -; 2-byte parameter -; All functions take input de. - ld e, [hl] - inc hl - ld d, [hl] - inc hl - -; Function address - ld a, [hli] - ld h, [hl] - ld l, a - - jp hl -; fc01b - -Tileset0Anim: ; 0xfc01b -TilesetJohtoModernAnim: ; 0xfc01b -TilesetKantoAnim: ; 0xfc01b - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, TileAnimationPalette - dw NULL, WaitTileAnimation - dw NULL, AnimateFlowerTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc047 - -TilesetParkAnim: ; 0xfc047 - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, WaitTileAnimation - dw vTiles2 tile $5f, AnimateFountain - dw NULL, WaitTileAnimation - dw NULL, TileAnimationPalette - dw NULL, WaitTileAnimation - dw NULL, AnimateFlowerTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc073 - -TilesetForestAnim: ; 0xfc073 - dw NULL, ForestTreeLeftAnimation - dw NULL, ForestTreeRightAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, ForestTreeLeftAnimation2 - dw NULL, ForestTreeRightAnimation2 - dw NULL, AnimateFlowerTile - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, TileAnimationPalette - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc0a3 - -TilesetJohtoAnim: ; 0xfc0a3 - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, TileAnimationPalette - dw NULL, WaitTileAnimation - dw NULL, AnimateFlowerTile - dw WhirlpoolFrames1, AnimateWhirlpoolTile - dw WhirlpoolFrames2, AnimateWhirlpoolTile - dw WhirlpoolFrames3, AnimateWhirlpoolTile - dw WhirlpoolFrames4, AnimateWhirlpoolTile - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc0d7 - -UnusedTilesetAnim_fc0d7: ; 0xfc0d7 - dw vTiles2 tile $03, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $03, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, AnimateFlowerTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc103 - -UnusedTilesetAnim_fc103: ; 0xfc103 - dw vTiles2 tile $14, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $14, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc12f - -TilesetPortAnim: ; 0xfc12f - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, TileAnimationPalette - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc15f - -TilesetEliteFourRoomAnim: ; 0xfc15f - dw NULL, LavaBubbleAnim2 - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, LavaBubbleAnim1 - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc17f - -UnusedTilesetAnim_fc17f: ; 0xfc17f - dw vTiles2 tile $53, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileDown - dw wTileAnimBuffer, ScrollTileDown - dw vTiles2 tile $53, WriteTileFromBuffer - dw vTiles2 tile $03, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $03, WriteTileFromBuffer - dw vTiles2 tile $53, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileDown - dw wTileAnimBuffer, ScrollTileDown - dw vTiles2 tile $53, WriteTileFromBuffer - dw NULL, DoneTileAnimation -; 0xfc1af - -UnusedTilesetAnim_fc1af: ; 0xfc1af - dw vTiles2 tile $54, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileDown - dw wTileAnimBuffer, ScrollTileDown - dw vTiles2 tile $54, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw vTiles2 tile $03, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $03, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw vTiles2 tile $54, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileDown - dw wTileAnimBuffer, ScrollTileDown - dw vTiles2 tile $54, WriteTileFromBuffer - dw NULL, DoneTileAnimation -; 0xfc1e7 - -TilesetCaveAnim: ; 0xfc1e7 -TilesetDarkCaveAnim: ; 0xfc1e7 - dw vTiles2 tile $14, WriteTileToBuffer - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileRightLeft - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $14, WriteTileFromBuffer - dw NULL, FlickeringCaveEntrancePalette - dw NULL, TileAnimationPalette - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $40, WriteTileToBuffer - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $40, WriteTileFromBuffer - dw NULL, FlickeringCaveEntrancePalette - dw NULL, DoneTileAnimation -; 0xfc233 - -TilesetIcePathAnim: ; 0xfc233 - dw vTiles2 tile $35, WriteTileToBuffer - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileRightLeft - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $35, WriteTileFromBuffer - dw NULL, FlickeringCaveEntrancePalette - dw NULL, TileAnimationPalette - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $31, WriteTileToBuffer - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $31, WriteTileFromBuffer - dw NULL, FlickeringCaveEntrancePalette - dw NULL, DoneTileAnimation -; 0xfc27f - -TilesetTowerAnim: ; 0xfc27f - dw TowerPillarTilePointer9, AnimateTowerPillarTile - dw TowerPillarTilePointer10, AnimateTowerPillarTile - dw TowerPillarTilePointer7, AnimateTowerPillarTile - dw TowerPillarTilePointer8, AnimateTowerPillarTile - dw TowerPillarTilePointer5, AnimateTowerPillarTile - dw TowerPillarTilePointer6, AnimateTowerPillarTile - dw TowerPillarTilePointer3, AnimateTowerPillarTile - dw TowerPillarTilePointer4, AnimateTowerPillarTile - dw TowerPillarTilePointer1, AnimateTowerPillarTile - dw TowerPillarTilePointer2, AnimateTowerPillarTile - dw NULL, StandingTileFrame - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc2bf - -UnusedTilesetAnim_fc2bf: ; 0xfc2bf - dw vTiles2 tile $4f, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $4f, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc2e7 - -TilesetBattleTowerOutsideAnim: ; 0xfc2e7 -TilesetHouseAnim: ; 0xfc2e7 -TilesetPlayersHouseAnim: ; 0xfc2e7 -TilesetPokecenterAnim: ; 0xfc2e7 -TilesetGateAnim: ; 0xfc2e7 -TilesetLabAnim: ; 0xfc2e7 -TilesetFacilityAnim: ; 0xfc2e7 -TilesetMartAnim: ; 0xfc2e7 -TilesetMansionAnim: ; 0xfc2e7 -TilesetGameCornerAnim: ; 0xfc2e7 -TilesetTraditionalHouseAnim: ; 0xfc2e7 -TilesetTrainStationAnim: ; 0xfc2e7 -TilesetChampionsRoomAnim: ; 0xfc2e7 -TilesetLighthouseAnim: ; 0xfc2e7 -TilesetPlayersRoomAnim: ; 0xfc2e7 -TilesetPokeComCenterAnim: ; 0xfc2e7 -TilesetBattleTowerAnim: ; 0xfc2e7 -TilesetRuinsOfAlphAnim: ; 0xfc2e7 -TilesetRadioTowerAnim: ; 0xfc2e7 -TilesetUndergroundAnim: ; 0xfc2e7 -TilesetBetaWordRoomAnim: ; 0xfc2e7 -TilesetHoOhWordRoomAnim: ; 0xfc2e7 -TilesetKabutoWordRoomAnim: ; 0xfc2e7 -TilesetOmanyteWordRoomAnim: ; 0xfc2e7 -TilesetAerodactylWordRoomAnim: ; 0xfc2e7 - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc2fb - -DoneTileAnimation: ; fc2fb -; Reset the animation command loop. - xor a - ld [hTileAnimFrame], a - -WaitTileAnimation: ; fc2fe -; Do nothing this frame. - ret -; fc2ff - -StandingTileFrame8: ; fc2ff - ld a, [wTileAnimationTimer] - inc a - and %111 - ld [wTileAnimationTimer], a - ret -; fc309 - - -ScrollTileRightLeft: ; fc309 -; Scroll right for 4 ticks, then left for 4 ticks. - ld a, [wTileAnimationTimer] - inc a - and %111 - ld [wTileAnimationTimer], a - and %100 - jr nz, ScrollTileLeft - jr ScrollTileRight -; fc318 - -ScrollTileUpDown: ; fc318 -; Scroll up for 4 ticks, then down for 4 ticks. - ld a, [wTileAnimationTimer] - inc a - and %111 - ld [wTileAnimationTimer], a - and %100 - jr nz, ScrollTileDown - jr ScrollTileUp -; fc327 - -ScrollTileLeft: ; fc327 - ld h, d - ld l, e - ld c, 4 -.loop -rept 4 - ld a, [hl] - rlca - ld [hli], a -endr - dec c - jr nz, .loop - ret -; fc33b - -ScrollTileRight: ; fc33b - ld h, d - ld l, e - ld c, 4 -.loop -rept 4 - ld a, [hl] - rrca - ld [hli], a -endr - dec c - jr nz, .loop - ret -; fc34f - -ScrollTileUp: ; fc34f - ld h, d - ld l, e - ld d, [hl] - inc hl - ld e, [hl] - ld bc, TILE_WIDTH * 2 - 2 - add hl, bc - ld a, TILE_WIDTH / 2 -.loop - ld c, [hl] - ld [hl], e - dec hl - ld b, [hl] - ld [hl], d - dec hl - ld e, [hl] - ld [hl], c - dec hl - ld d, [hl] - ld [hl], b - dec hl - dec a - jr nz, .loop - ret -; fc36a - -ScrollTileDown: ; fc36a - ld h, d - ld l, e - ld de, TILE_WIDTH * 2 - 2 - push hl - add hl, de - ld d, [hl] - inc hl - ld e, [hl] - pop hl - ld a, TILE_WIDTH / 2 -.loop - ld b, [hl] - ld [hl], d - inc hl - ld c, [hl] - ld [hl], e - inc hl - ld d, [hl] - ld [hl], b - inc hl - ld e, [hl] - ld [hl], c - inc hl - dec a - jr nz, .loop - ret -; fc387 - - -AnimateFountain: ; fc387 - ld hl, sp+0 - ld b, h - ld c, l - ld hl, .frames - ld a, [wTileAnimationTimer] - and %111 - add a - add l - ld l, a - jr nc, .okay - inc h -.okay - ld a, [hli] - ld h, [hl] - ld l, a - ld sp, hl - ld l, e - ld h, d - jp WriteTile - -.frames - dw .frame1 - dw .frame2 - dw .frame3 - dw .frame4 - dw .frame3 - dw .frame4 - dw .frame5 - dw .frame1 - -.frame1 INCBIN "gfx/tilesets/fountain/1.2bpp" -.frame2 INCBIN "gfx/tilesets/fountain/2.2bpp" -.frame3 INCBIN "gfx/tilesets/fountain/3.2bpp" -.frame4 INCBIN "gfx/tilesets/fountain/4.2bpp" -.frame5 INCBIN "gfx/tilesets/fountain/5.2bpp" -; fc402 - - -AnimateWaterTile: ; fc402 -; Draw a water tile for the current frame in VRAM tile at de. - -; Save sp in bc (see WriteTile). - ld hl, sp+0 - ld b, h - ld c, l - - ld a, [wTileAnimationTimer] - -; 4 tile graphics, updated every other frame. - and %110 - -; 2 x 8 = 16 bytes per tile - add a - add a - add a - - add LOW(WaterTileFrames) - ld l, a - ld a, 0 - adc HIGH(WaterTileFrames) - ld h, a - -; The stack now points to the start of the tile for this frame. - ld sp, hl - - ld l, e - ld h, d - - jp WriteTile -; fc41c - -WaterTileFrames: ; fc41c - INCBIN "gfx/tilesets/water/water.2bpp" -; fc45c - - -ForestTreeLeftAnimation: ; fc45c - ld hl, sp+0 - ld b, h - ld c, l - -; Only during the Celebi event. - ld a, [wCelebiEvent] - bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a - jr nz, .asm_fc46c - ld hl, ForestTreeLeftFrames - jr .asm_fc47d - -.asm_fc46c - ld a, [wTileAnimationTimer] - call GetForestTreeFrame - add a - add a - add a - add LOW(ForestTreeLeftFrames) - ld l, a - ld a, 0 - adc HIGH(ForestTreeLeftFrames) - ld h, a - -.asm_fc47d - ld sp, hl - ld hl, vTiles2 tile $0c - jp WriteTile -; fc484 - - -ForestTreeLeftFrames: ; fc484 - INCBIN "gfx/tilesets/forest-tree/1.2bpp" - INCBIN "gfx/tilesets/forest-tree/2.2bpp" -; fc4a4 - -ForestTreeRightFrames: ; fc4a4 - INCBIN "gfx/tilesets/forest-tree/3.2bpp" - INCBIN "gfx/tilesets/forest-tree/4.2bpp" -; fc4c4 - - -ForestTreeRightAnimation: ; fc4c4 - ld hl, sp+0 - ld b, h - ld c, l - -; Only during the Celebi event. - ld a, [wCelebiEvent] - bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a - jr nz, .asm_fc4d4 - ld hl, ForestTreeRightFrames - jr .asm_fc4eb - -.asm_fc4d4 - ld a, [wTileAnimationTimer] - call GetForestTreeFrame - add a - add a - add a - add LOW(ForestTreeLeftFrames) - ld l, a - ld a, 0 - adc HIGH(ForestTreeLeftFrames) - ld h, a - push bc - ld bc, ForestTreeRightFrames - ForestTreeLeftFrames - add hl, bc - pop bc - -.asm_fc4eb - ld sp, hl - ld hl, vTiles2 tile $0f - jp WriteTile -; fc4f2 - - -ForestTreeLeftAnimation2: ; fc4f2 - ld hl, sp+0 - ld b, h - ld c, l - -; Only during the Celebi event. - ld a, [wCelebiEvent] - bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a - jr nz, .asm_fc502 - ld hl, ForestTreeLeftFrames - jr .asm_fc515 - -.asm_fc502 - ld a, [wTileAnimationTimer] - call GetForestTreeFrame - xor 2 - add a - add a - add a - add LOW(ForestTreeLeftFrames) - ld l, a - ld a, 0 - adc HIGH(ForestTreeLeftFrames) - ld h, a - -.asm_fc515 - ld sp, hl - ld hl, vTiles2 tile $0c - jp WriteTile -; fc51c - - -ForestTreeRightAnimation2: ; fc51c - ld hl, sp+0 - ld b, h - ld c, l - -; Only during the Celebi event. - ld a, [wCelebiEvent] - bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a - jr nz, .asm_fc52c - ld hl, ForestTreeRightFrames - jr .asm_fc545 - -.asm_fc52c - ld a, [wTileAnimationTimer] - call GetForestTreeFrame - xor 2 - add a - add a - add a - add LOW(ForestTreeLeftFrames) - ld l, a - ld a, 0 - adc HIGH(ForestTreeLeftFrames) - ld h, a - push bc - ld bc, ForestTreeRightFrames - ForestTreeLeftFrames - add hl, bc - pop bc - -.asm_fc545 - ld sp, hl - ld hl, vTiles2 tile $0f - jp WriteTile -; fc54c - - -GetForestTreeFrame: ; fc54c -; Return 0 if a is even, or 2 if odd. - and a - jr z, .even - cp 1 - jr z, .odd - cp 2 - jr z, .even - cp 3 - jr z, .odd - cp 4 - jr z, .even - cp 5 - jr z, .odd - cp 6 - jr z, .even -.odd - ld a, 2 - scf - ret -.even - xor a - ret -; fc56d - - -AnimateFlowerTile: ; fc56d -; No parameters. - -; Save sp in bc (see WriteTile). - ld hl, sp+0 - ld b, h - ld c, l - -; Alternate tile graphic every other frame - ld a, [wTileAnimationTimer] - and %10 - ld e, a - -; CGB has different color mappings for flowers. - ld a, [hCGB] - and 1 - - add e - swap a - ld e, a - ld d, 0 - ld hl, FlowerTileFrames - add hl, de - ld sp, hl - - ld hl, vTiles2 tile $03 - - jp WriteTile -; fc58c - -FlowerTileFrames: ; fc58c - INCBIN "gfx/tilesets/flower/dmg_1.2bpp" - INCBIN "gfx/tilesets/flower/cgb_1.2bpp" - INCBIN "gfx/tilesets/flower/dmg_2.2bpp" - INCBIN "gfx/tilesets/flower/cgb_2.2bpp" -; fc5cc - - -LavaBubbleAnim1: ; fc5cc -; Splash in the bottom-right corner of the fountain. - ld hl, sp+0 - ld b, h - ld c, l - ld a, [wTileAnimationTimer] - and %110 - srl a - inc a - inc a - and %011 - swap a - ld e, a - ld d, 0 - ld hl, LavaBubbleFrames - add hl, de - ld sp, hl - ld hl, vTiles2 tile $5b - jp WriteTile -; fc5eb - - -LavaBubbleAnim2: ; fc5eb -; Splash in the top-left corner of the fountain. - ld hl, sp+0 - ld b, h - ld c, l - ld a, [wTileAnimationTimer] - and %110 - add a - add a - add a - ld e, a - ld d, 0 - ld hl, LavaBubbleFrames - add hl, de - ld sp, hl - ld hl, vTiles2 tile $38 - jp WriteTile -; fc605 - - -LavaBubbleFrames: ; fc605 - INCBIN "gfx/tilesets/lava/1.2bpp" - INCBIN "gfx/tilesets/lava/2.2bpp" - INCBIN "gfx/tilesets/lava/3.2bpp" - INCBIN "gfx/tilesets/lava/4.2bpp" -; fc645 - - -AnimateTowerPillarTile: ; fc645 -; Read from struct at de: -; Destination (VRAM) -; Address of the first tile in the frame array - - ld hl, sp+0 - ld b, h - ld c, l - - ld a, [wTileAnimationTimer] - and %111 - -; Get frame index a - ld hl, .frames - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, [hl] - -; Destination - ld l, e - ld h, d - ld e, [hl] - inc hl - ld d, [hl] - inc hl - -; Add the frame index to the starting address - add [hl] - inc hl - ld h, [hl] - ld l, a - ld a, 0 - adc h - ld h, a - - ld sp, hl - ld l, e - ld h, d - jr WriteTile - -.frames - db $00, $10, $20, $30, $40, $30, $20, $10 -; fc673 - - -StandingTileFrame: ; fc673 - ld hl, wTileAnimationTimer - inc [hl] - ret -; fc678 - - -AnimateWhirlpoolTile: ; fc678 -; Update whirlpool tile using struct at de. - -; Struct: -; VRAM address -; Address of the first tile - -; Only does one of 4 tiles at a time. - -; Save sp in bc (see WriteTile). - ld hl, sp+0 - ld b, h - ld c, l - -; de = VRAM address - ld l, e - ld h, d - ld e, [hl] - inc hl - ld d, [hl] - inc hl -; Tile address is now at hl. - -; Get the tile for this frame. - ld a, [wTileAnimationTimer] - and %11 ; 4 frames x2 - swap a ; * 16 bytes per tile - - add [hl] - inc hl - ld h, [hl] - ld l, a - ld a, 0 - adc h - ld h, a - -; The stack now points to the desired frame. - ld sp, hl - - ld l, e - ld h, d - - jr WriteTile -; fc696 - - -WriteTileFromBuffer: ; fc696 -; Write tiledata at wTileAnimBuffer to de. -; wTileAnimBuffer is loaded to sp for WriteTile. - - ld hl, sp+0 - ld b, h - ld c, l - - ld hl, wTileAnimBuffer - ld sp, hl - - ld h, d - ld l, e - jr WriteTile -; fc6a2 - - -WriteTileToBuffer: ; fc6a2 -; Write tiledata de to wTileAnimBuffer. -; de is loaded to sp for WriteTile. - - ld hl, sp+0 - ld b, h - ld c, l - - ld h, d - ld l, e - ld sp, hl - - ld hl, wTileAnimBuffer - - ; fallthrough - -WriteTile: ; fc6ac -; Write one 8x8 tile ($10 bytes) from sp to hl. - -; Warning: sp is saved in bc so we can abuse pop. -; sp is restored to address bc. Save sp in bc before calling. - - pop de - ld [hl], e - inc hl - ld [hl], d - -rept 7 - pop de - inc hl - ld [hl], e - inc hl - ld [hl], d -endr - -; restore sp - ld h, b - ld l, c - ld sp, hl - ret -; fc6d7 - - -TileAnimationPalette: ; fc6d7 -; Transition between color values 0-2 for color 0 in palette 3. - -; No palette changes on DMG. - ld a, [hCGB] - and a - ret z - -; We don't want to mess with non-standard palettes. - ld a, [rBGP] ; BGP - cp %11100100 - ret nz - -; Only update on even frames. - ld a, [wTileAnimationTimer] - ld l, a - and 1 ; odd - ret nz - -; Ready for BGPD input... - - ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_WATER - ld [rBGPI], a - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - -; Update color 0 in order 0 1 2 1 - ld a, l - and %110 ; frames 0 2 4 6 - jr z, .color0 - cp %100 ; frame 4 - jr z, .color2 - -.color1 - ld hl, wBGPals1 palette PAL_BG_WATER color 1 - ld a, [hli] - ld [rBGPD], a - ld a, [hli] - ld [rBGPD], a - jr .end - -.color0 - ld hl, wBGPals1 palette PAL_BG_WATER color 0 - ld a, [hli] - ld [rBGPD], a - ld a, [hli] - ld [rBGPD], a - jr .end - -.color2 - ld hl, wBGPals1 palette PAL_BG_WATER color 2 - ld a, [hli] - ld [rBGPD], a - ld a, [hli] - ld [rBGPD], a - -.end - pop af - ld [rSVBK], a - ret -; fc71e - - -FlickeringCaveEntrancePalette: ; fc71e -; No palette changes on DMG. - ld a, [hCGB] - and a - ret z -; We don't want to mess with non-standard palettes. - ld a, [rBGP] - cp %11100100 - ret nz -; We only want to be here if we're in a dark cave. - ld a, [wTimeOfDayPalset] - cp %11111111 ; 3,3,3,3 - ret nz - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a -; Ready for BGPD input... - ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_YELLOW - ld [rBGPI], a - ld a, [hVBlankCounter] - and %10 - jr nz, .bit1set - ld hl, wBGPals1 palette PAL_BG_YELLOW - jr .okay - -.bit1set - ld hl, wBGPals1 palette PAL_BG_YELLOW color 1 - -.okay - ld a, [hli] - ld [rBGPD], a - ld a, [hli] - ld [rBGPD], a - - pop af - ld [rSVBK], a - ret -; fc750 - - -TowerPillarTilePointer1: dw vTiles2 tile $2d, TowerPillarTile1 -TowerPillarTilePointer2: dw vTiles2 tile $2f, TowerPillarTile2 -TowerPillarTilePointer3: dw vTiles2 tile $3d, TowerPillarTile3 -TowerPillarTilePointer4: dw vTiles2 tile $3f, TowerPillarTile4 -TowerPillarTilePointer5: dw vTiles2 tile $3c, TowerPillarTile5 -TowerPillarTilePointer6: dw vTiles2 tile $2c, TowerPillarTile6 -TowerPillarTilePointer7: dw vTiles2 tile $4d, TowerPillarTile7 -TowerPillarTilePointer8: dw vTiles2 tile $4f, TowerPillarTile8 -TowerPillarTilePointer9: dw vTiles2 tile $5d, TowerPillarTile9 -TowerPillarTilePointer10: dw vTiles2 tile $5f, TowerPillarTile10 - -TowerPillarTile1: INCBIN "gfx/tilesets/tower-pillar/1.2bpp" -TowerPillarTile2: INCBIN "gfx/tilesets/tower-pillar/2.2bpp" -TowerPillarTile3: INCBIN "gfx/tilesets/tower-pillar/3.2bpp" -TowerPillarTile4: INCBIN "gfx/tilesets/tower-pillar/4.2bpp" -TowerPillarTile5: INCBIN "gfx/tilesets/tower-pillar/5.2bpp" -TowerPillarTile6: INCBIN "gfx/tilesets/tower-pillar/6.2bpp" -TowerPillarTile7: INCBIN "gfx/tilesets/tower-pillar/7.2bpp" -TowerPillarTile8: INCBIN "gfx/tilesets/tower-pillar/8.2bpp" -TowerPillarTile9: INCBIN "gfx/tilesets/tower-pillar/9.2bpp" -TowerPillarTile10: INCBIN "gfx/tilesets/tower-pillar/10.2bpp" -; fca98 - - -WhirlpoolFrames1: dw vTiles2 tile $32, WhirlpoolTiles1 -WhirlpoolFrames2: dw vTiles2 tile $33, WhirlpoolTiles2 -WhirlpoolFrames3: dw vTiles2 tile $42, WhirlpoolTiles3 -WhirlpoolFrames4: dw vTiles2 tile $43, WhirlpoolTiles4 -; fcaa8 - -WhirlpoolTiles1: INCBIN "gfx/tilesets/whirlpool/1.2bpp" -WhirlpoolTiles2: INCBIN "gfx/tilesets/whirlpool/2.2bpp" -WhirlpoolTiles3: INCBIN "gfx/tilesets/whirlpool/3.2bpp" -WhirlpoolTiles4: INCBIN "gfx/tilesets/whirlpool/4.2bpp" -; fcba8 diff --git a/engine/tileset_palettes.asm b/engine/tileset_palettes.asm deleted file mode 100644 index e2c39c0ab..000000000 --- a/engine/tileset_palettes.asm +++ /dev/null @@ -1,151 +0,0 @@ -LoadSpecialMapPalette: ; 494ac - ld a, [wMapTileset] - cp TILESET_POKECOM_CENTER - jr z, .pokecom_2f - cp TILESET_BATTLE_TOWER - jr z, .battle_tower - cp TILESET_ICE_PATH - jr z, .ice_path - cp TILESET_HOUSE - jr z, .house - cp TILESET_RADIO_TOWER - jr z, .radio_tower - cp TILESET_MANSION - jr z, .mansion_mobile - jr .do_nothing - -.pokecom_2f - call LoadPokeComPalette - scf - ret - -.battle_tower - call LoadBattleTowerPalette - scf - ret - -.ice_path - ld a, [wEnvironment] - and $7 - cp INDOOR ; Hall of Fame - jr z, .do_nothing - call LoadIcePathPalette - scf - ret - -.house - call LoadHousePalette - scf - ret - -.radio_tower - call LoadRadioTowerPalette - scf - ret - -.mansion_mobile - call LoadMansionPalette - scf - ret - -.do_nothing - and a - ret -; 494f2 - -LoadPokeComPalette: ; 494f2 - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, PokeComPalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 49501 - -PokeComPalette: ; 49501 -INCLUDE "gfx/tilesets/pokecom_center.pal" -; 49541 - -LoadBattleTowerPalette: ; 49541 - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, BattleTowerPalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 49550 - -BattleTowerPalette: ; 49550 -INCLUDE "gfx/tilesets/battle_tower.pal" -; 49590 - -LoadIcePathPalette: ; 49590 - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, IcePathPalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 4959f - -IcePathPalette: ; 4959f -INCLUDE "gfx/tilesets/ice_path.pal" -; 495df - -LoadHousePalette: ; 495df - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, HousePalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 495ee - -HousePalette: ; 495ee -INCLUDE "gfx/tilesets/house.pal" -; 4962e - -LoadRadioTowerPalette: ; 4962e - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, RadioTowerPalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 4963d - -RadioTowerPalette: ; 4963d -INCLUDE "gfx/tilesets/radio_tower.pal" -; 4967d - -MansionPalette1: ; 4967d -INCLUDE "gfx/tilesets/mansion_1.pal" -; 496c5 - -LoadMansionPalette: ; 496c5 - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, MansionPalette1 - ld bc, 8 palettes - call FarCopyWRAM - ld a, BANK(wBGPals1) - ld de, wBGPals1 palette PAL_BG_YELLOW - ld hl, MansionPalette2 - ld bc, 1 palettes - call FarCopyWRAM - ld a, BANK(wBGPals1) - ld de, wBGPals1 palette PAL_BG_WATER - ld hl, MansionPalette1 + 6 palettes - ld bc, 1 palettes - call FarCopyWRAM - ld a, BANK(wBGPals1) - ld de, wBGPals1 palette PAL_BG_ROOF - ld hl, MansionPalette1 + 8 palettes - ld bc, 1 palettes - call FarCopyWRAM - ret -; 496fe - -MansionPalette2: ; 496fe -INCLUDE "gfx/tilesets/mansion_2.pal" -; 49706 diff --git a/engine/time.asm b/engine/time.asm deleted file mode 100755 index 0f83447cc..000000000 --- a/engine/time.asm +++ /dev/null @@ -1,465 +0,0 @@ -_InitializeStartDay: ; 113d6 - call InitializeStartDay - ret -; 113da - -ClearDailyTimers: ; 113da - xor a - ld [wLuckyNumberDayBuffer], a - ld [wUnusedTwoDayTimer], a - ld [wDailyResetTimer], a - ret -; 113e5 - -InitCallReceiveDelay:: ; 113e5 - xor a - ld [wTimeCyclesSinceLastCall], a - -NextCallReceiveDelay: ; 113e9 - ld a, [wTimeCyclesSinceLastCall] - cp 3 - jr c, .okay - ld a, 3 - -.okay - ld e, a - ld d, 0 - ld hl, .ReceiveCallDelays - add hl, de - ld a, [hl] - jp RestartReceiveCallDelay -; 113fd - -.ReceiveCallDelays: - db 20, 10, 5, 3 -; 11401 - -CheckReceiveCallTimer: ; 11401 - call CheckReceiveCallDelay ; check timer - ret nc - ld hl, wTimeCyclesSinceLastCall - ld a, [hl] - cp 3 - jr nc, .ok - inc [hl] - -.ok - call NextCallReceiveDelay ; restart timer - scf - ret -; 11413 - -InitOneDayCountdown: ; 11413 - ld a, 1 - -InitNDaysCountdown: ; 11415 - ld [hl], a - push hl - call UpdateTime - pop hl - inc hl - call CopyDayToHL - ret -; 11420 - -CheckDayDependentEventHL: ; 11420 - inc hl - push hl - call CalcDaysSince - call GetDaysSince - pop hl - dec hl - call UpdateTimeRemaining - ret -; 1142e - -RestartReceiveCallDelay: ; 1142e - ld hl, wReceiveCallDelay_MinsRemaining - ld [hl], a - call UpdateTime - ld hl, wReceiveCallDelay_StartTime - call CopyDayHourMinToHL - ret -; 1143c - -CheckReceiveCallDelay: ; 1143c - ld hl, wReceiveCallDelay_StartTime - call CalcMinsHoursDaysSince - call GetMinutesSinceIfLessThan60 - ld hl, wReceiveCallDelay_MinsRemaining - call UpdateTimeRemaining - ret -; 1144c - -RestartDailyResetTimer: ; 1144c - ld hl, wDailyResetTimer - jp InitOneDayCountdown -; 11452 - -CheckDailyResetTimer:: ; 11452 - ld hl, wDailyResetTimer - call CheckDayDependentEventHL - ret nc - xor a - ld hl, wDailyFlags - ld [hli], a ; wDailyFlags - ld [hli], a ; wWeeklyFlags - ld [hli], a ; wSwarmFlags - ld [hl], a ; wSwarmFlags + 1 - ld hl, wDailyRematchFlags -rept 4 - ld [hli], a -endr - ld hl, wDailyPhoneItemFlags -rept 4 - ld [hli], a -endr - ld hl, wDailyPhoneTimeOfDayFlags -rept 4 - ld [hli], a -endr - ld hl, wKenjiBreakTimer - ld a, [hl] - and a - jr z, .RestartKenjiBreakCountdown - dec [hl] - jr nz, .DontRestartKenjiBreakCountdown -.RestartKenjiBreakCountdown: - call SampleKenjiBreakCountdown -.DontRestartKenjiBreakCountdown: - jr RestartDailyResetTimer -; 11485 - -SampleKenjiBreakCountdown: ; 11485 -; Generate a random number between 3 and 6 - call Random - and %11 - add 3 - ld [wKenjiBreakTimer], a - ret -; 11490 - -StartBugContestTimer: ; 11490 - ld a, BUG_CONTEST_MINUTES - ld [wBugContestMinsRemaining], a - ld a, BUG_CONTEST_SECONDS - ld [wBugContestSecsRemaining], a - call UpdateTime - ld hl, wBugContestStartTime - call CopyDayHourMinSecToHL - ret -; 114a4 - - -CheckBugContestTimer:: ; 114a4 (4:54a4) - ld hl, wBugContestStartTime - call CalcSecsMinsHoursDaysSince - ld a, [wDaysSince] - and a - jr nz, .timed_out - ld a, [wHoursSince] - and a - jr nz, .timed_out - ld a, [wSecondsSince] - ld b, a - ld a, [wBugContestSecsRemaining] - sub b - jr nc, .okay - add 60 - -.okay - ld [wBugContestSecsRemaining], a - ld a, [wMinutesSince] - ld b, a - ld a, [wBugContestMinsRemaining] - sbc b - ld [wBugContestMinsRemaining], a - jr c, .timed_out - and a - ret - -.timed_out - xor a - ld [wBugContestMinsRemaining], a - ld [wBugContestSecsRemaining], a - scf - ret - - -InitializeStartDay: ; 114dd - call UpdateTime - ld hl, wTimerEventStartDay - call CopyDayToHL - ret -; 114e7 - -CheckPokerusTick:: ; 114e7 - ld hl, wTimerEventStartDay - call CalcDaysSince - call GetDaysSince - and a - jr z, .done ; not even a day has passed since game start - ld b, a - farcall ApplyPokerusTick -.done - xor a - ret -; 114fc - -SetUnusedTwoDayTimer: ; 114fc - ld a, 2 - ld hl, wUnusedTwoDayTimer - ld [hl], a - call UpdateTime - ld hl, wUnusedTwoDayTimerStartDate - call CopyDayToHL - ret -; 1150c - -CheckUnusedTwoDayTimer: ; 1150c - ld hl, wUnusedTwoDayTimerStartDate - call CalcDaysSince - call GetDaysSince - ld hl, wUnusedTwoDayTimer - call UpdateTimeRemaining - ret -; 1151c - -; unused - ld hl, wDailyFlags - set DAILYFLAGS_FISH_SWARM_F, [hl] - ret -; 11522 - -; unused - and a - ld hl, wDailyFlags - bit DAILYFLAGS_FISH_SWARM_F, [hl] - ret nz - scf - ret -; 1152b - -RestartLuckyNumberCountdown: ; 1152b - call .GetDaysUntilNextFriday - ld hl, wLuckyNumberDayBuffer - jp InitNDaysCountdown -; 11534 - -.GetDaysUntilNextFriday: ; 11534 - call GetWeekday - ld c, a - ld a, FRIDAY - sub c - jr z, .friday_saturday - jr nc, .earlier ; could have done "ret nc" - -.friday_saturday - add 7 - -.earlier - ret -; 11542 - -_CheckLuckyNumberShowFlag: ; 11542 - ld hl, wLuckyNumberDayBuffer - jp CheckDayDependentEventHL -; 11548 - -DoMysteryGiftIfDayHasPassed: ; 11548 - ld a, BANK(sMysteryGiftTimer) - call GetSRAMBank - ld hl, sMysteryGiftTimer - ld a, [hli] - ld [wBuffer1], a - ld a, [hl] - ld [wBuffer2], a - call CloseSRAM - - ld hl, wBuffer1 - call CheckDayDependentEventHL - jr nc, .not_timed_out - ld hl, wBuffer1 - call InitOneDayCountdown - call CloseSRAM - farcall Function1050c8 - -.not_timed_out - ld a, BANK(sMysteryGiftTimer) - call GetSRAMBank - ld hl, wBuffer1 - ld a, [hli] - ld [sMysteryGiftTimer], a - ld a, [hl] - ld [sMysteryGiftTimer + 1], a - call CloseSRAM - ret -; 11586 - -UpdateTimeRemaining: ; 11586 -; If the amount of time elapsed exceeds the capacity of its -; unit, skip this part. - cp -1 - jr z, .set_carry - ld c, a - ld a, [hl] ; time remaining - sub c - jr nc, .ok - xor a - -.ok - ld [hl], a - jr z, .set_carry - xor a - ret - -.set_carry - xor a - ld [hl], a - scf - ret -; 11599 - -GetSecondsSinceIfLessThan60: ; 11599 - ld a, [wDaysSince] - and a - jr nz, GetTimeElapsed_ExceedsUnitLimit - ld a, [wHoursSince] - and a - jr nz, GetTimeElapsed_ExceedsUnitLimit - ld a, [wMinutesSince] - jr nz, GetTimeElapsed_ExceedsUnitLimit - ld a, [wSecondsSince] - ret -; 115ae - -GetMinutesSinceIfLessThan60: ; 115ae - ld a, [wDaysSince] - and a - jr nz, GetTimeElapsed_ExceedsUnitLimit - ld a, [wHoursSince] - and a - jr nz, GetTimeElapsed_ExceedsUnitLimit - ld a, [wMinutesSince] - ret -; 115be - -GetHoursSinceIfLessThan24: ; 115be - ld a, [wDaysSince] - and a - jr nz, GetTimeElapsed_ExceedsUnitLimit - ld a, [wHoursSince] - ret -; 115c8 - -GetDaysSince: ; 115c8 - ld a, [wDaysSince] - ret -; 115cc - -GetTimeElapsed_ExceedsUnitLimit: ; 115cc - ld a, -1 - ret -; 115cf - -CalcDaysSince: ; 115cf - xor a - jr _CalcDaysSince -; 115d2 - -CalcHoursDaysSince: ; 115d2 - inc hl - xor a - jr _CalcHoursDaysSince -; 115d6 - -CalcMinsHoursDaysSince: ; 115d6 - inc hl - inc hl - xor a - jr _CalcMinsHoursDaysSince -; 115db - -CalcSecsMinsHoursDaysSince: ; 115db - inc hl - inc hl - inc hl - ld a, [hSeconds] - ld c, a - sub [hl] - jr nc, .skip - add 60 -.skip - ld [hl], c ; current seconds - dec hl - ld [wSecondsSince], a ; seconds since - -_CalcMinsHoursDaysSince: ; 115eb - ld a, [hMinutes] - ld c, a - sbc [hl] - jr nc, .skip - add 60 -.skip - ld [hl], c ; current minutes - dec hl - ld [wMinutesSince], a ; minutes since - -_CalcHoursDaysSince: ; 115f8 - ld a, [hHours] - ld c, a - sbc [hl] - jr nc, .skip - add 24 -.skip - ld [hl], c ; current hours - dec hl - ld [wHoursSince], a ; hours since - -_CalcDaysSince: - ld a, [wCurDay] - ld c, a - sbc [hl] - jr nc, .skip - add 20 * 7 -.skip - ld [hl], c ; current days - ld [wDaysSince], a ; days since - ret -; 11613 - -CopyDayHourMinSecToHL: ; 11613 - ld a, [wCurDay] - ld [hli], a - ld a, [hHours] - ld [hli], a - ld a, [hMinutes] - ld [hli], a - ld a, [hSeconds] - ld [hli], a - ret -; 11621 - -CopyDayToHL: ; 11621 - ld a, [wCurDay] - ld [hl], a - ret -; 11626 - -CopyDayHourToHL: ; 11626 - ld a, [wCurDay] - ld [hli], a - ld a, [hHours] - ld [hli], a - ret -; 1162e - -CopyDayHourMinToHL: ; 1162e - ld a, [wCurDay] - ld [hli], a - ld a, [hHours] - ld [hli], a - ld a, [hMinutes] - ld [hli], a - ret -; 11639 diff --git a/engine/time_capsule.asm b/engine/time_capsule.asm deleted file mode 100755 index f90b7e249..000000000 --- a/engine/time_capsule.asm +++ /dev/null @@ -1,147 +0,0 @@ -; These functions seem to be related to backwards compatibility - -ValidateOTTrademon: ; fb57e - ld a, [wd003] - ld hl, wOTPartyMon1Species - call GetPartyLocation - push hl - ld a, [wd003] - inc a - ld c, a - ld b, 0 - ld hl, wOTPartyCount - add hl, bc - ld a, [hl] - pop hl - cp EGG - jr z, .matching_or_egg - cp [hl] - jr nz, .abnormal - -.matching_or_egg - ld b, h - ld c, l - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - cp MAX_LEVEL + 1 - jr nc, .abnormal - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jr nz, .normal - ld hl, wOTPartySpecies - ld a, [wd003] - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - - ; Magnemite and Magneton's types changed - ; from Electric to Electric/Steel. - cp MAGNEMITE - jr z, .normal - cp MAGNETON - jr z, .normal - - ld [wCurSpecies], a - call GetBaseData - ld hl, wLinkOTPartyMonTypes - add hl, bc - add hl, bc - ld a, [wBaseType1] - cp [hl] - jr nz, .abnormal - inc hl - ld a, [wBaseType2] - cp [hl] - jr nz, .abnormal - -.normal - and a - ret - -.abnormal - scf - ret -; fb5dd - -Functionfb5dd: ; fb5dd - ld a, [wd002] - ld d, a - ld a, [wPartyCount] - ld b, a - ld c, $0 -.loop - ld a, c - cp d - jr z, .next - push bc - ld a, c - ld hl, wPartyMon1HP - call GetPartyLocation - pop bc - ld a, [hli] - or [hl] - jr nz, .done - -.next - inc c - dec b - jr nz, .loop - ld a, [wd003] - ld hl, wOTPartyMon1HP - call GetPartyLocation - ld a, [hli] - or [hl] - jr nz, .done - scf - ret - -.done - and a - ret -; fb60d - -PlaceTradePartnerNamesAndParty: ; fb60d - hlcoord 4, 0 - ld de, wPlayerName - call PlaceString - ld a, $14 - ld [bc], a - hlcoord 4, 8 - ld de, wOTPlayerName - call PlaceString - ld a, $14 - ld [bc], a - hlcoord 7, 1 - ld de, wPartySpecies - call .PlaceSpeciesNames - hlcoord 7, 9 - ld de, wOTPartySpecies -.PlaceSpeciesNames: ; fb634 - ld c, $0 -.loop - ld a, [de] - cp -1 - ret z - ld [wd265], a - push bc - push hl - push de - push hl - ld a, c - ld [hProduct], a - call GetPokemonName - pop hl - call PlaceString - pop de - inc de - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - inc c - jr .loop -; fb656 - -INCLUDE "data/pokemon/gen1_base_special.asm" diff --git a/engine/time_capsule_2.asm b/engine/time_capsule_2.asm deleted file mode 100644 index a56e51785..000000000 --- a/engine/time_capsule_2.asm +++ /dev/null @@ -1,39 +0,0 @@ -ConvertMon_2to1: ; fb8f1 -; Takes the Gen-2 Pokemon number stored in wd265, finds it in the Pokered_MonIndices table, and returns its index in wd265. - push bc - push hl - ld a, [wd265] - ld b, a - ld c, 0 - ld hl, Pokered_MonIndices -.loop - inc c - ld a, [hli] - cp b - jr nz, .loop - ld a, c - ld [wd265], a - pop hl - pop bc - ret -; fb908 - -ConvertMon_1to2: ; fb908 -; Takes the Gen-1 Pokemon number stored in wd265 and returns the corresponding value from Pokered_MonIndices in wd265. - push bc - push hl - ld a, [wd265] - dec a - ld hl, Pokered_MonIndices - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - ld [wd265], a - pop hl - pop bc - ret -; fb91c - - -INCLUDE "data/pokemon/gen1_order.asm" diff --git a/engine/timeofdaypals.asm b/engine/timeofdaypals.asm deleted file mode 100644 index b8d43d252..000000000 --- a/engine/timeofdaypals.asm +++ /dev/null @@ -1,415 +0,0 @@ -DummyPredef35: ; 8c000 -DummyPredef36: - ret - -UpdateTimeOfDayPal:: ; 8c001 - call UpdateTime - ld a, [wTimeOfDay] - ld [wCurTimeOfDay], a - call GetTimePalette - ld [wTimeOfDayPal], a - ret -; 8c011 - - -_TimeOfDayPals:: ; 8c011 -; return carry if pals are changed - -; forced pals? - ld hl, wTimeOfDayPalFlags - bit 7, [hl] - jr nz, .dontchange - -; do we need to bother updating? - ld a, [wTimeOfDay] - ld hl, wCurTimeOfDay - cp [hl] - jr z, .dontchange - -; if so, the time of day has changed - ld a, [wTimeOfDay] - ld [wCurTimeOfDay], a - -; get palette id - call GetTimePalette - -; same palette as before? - ld hl, wTimeOfDayPal - cp [hl] - jr z, .dontchange - -; update palette id - ld [wTimeOfDayPal], a - -; save bg palette 7 - ld hl, wBGPals1 palette PAL_BG_TEXT - -; save wram bank - ld a, [rSVBK] - ld b, a - - ld a, BANK(wBGPals1) - ld [rSVBK], a - -; push palette - ld c, NUM_PAL_COLORS -.push - ld d, [hl] - inc hl - ld e, [hl] - inc hl - push de - dec c - jr nz, .push - -; restore wram bank - ld a, b - ld [rSVBK], a - - -; update sgb pals - ld b, SCGB_MAPPALS - call GetSGBLayout - - -; restore bg palette 7 - ld hl, wOBPals1 - 1 ; last byte in wBGPals1 - -; save wram bank - ld a, [rSVBK] - ld d, a - - ld a, BANK(wOBPals1) - ld [rSVBK], a - -; pop palette - ld e, NUM_PAL_COLORS -.pop - pop bc - ld [hl], c - dec hl - ld [hl], b - dec hl - dec e - jr nz, .pop - -; restore wram bank - ld a, d - ld [rSVBK], a - -; update palettes - call _UpdateTimePals - call DelayFrame - -; successful change - scf - ret - -.dontchange -; no change occurred - and a - ret -; 8c070 - - -_UpdateTimePals:: ; 8c070 - ld c, $9 ; normal - call GetTimePalFade - call DmgToCgbTimePals - ret -; 8c079 - -FadeInPalettes:: ; 8c079 - ld c, $12 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsDecHL - ret -; 8c084 - -FadeOutPalettes:: ; 8c084 - call FillWhiteBGColor - ld c, $9 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsIncHL - ret -; 8c092 - -BattleTowerFade: ; 8c092 - call FillWhiteBGColor - ld c, $9 - call GetTimePalFade - ld b, $4 -.asm_8c09c - call DmgToCgbTimePals - inc hl - inc hl - inc hl - ld c, $7 - call DelayFrames - dec b - jr nz, .asm_8c09c - ret -; 8c0ab - -FadeInQuickly: ; 8c0ab - ld c, $0 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsIncHL - ret -; 8c0b6 - -FadeBlackQuickly: ; 8c0b6 - ld c, $9 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsDecHL - ret -; 8c0c1 - - -FillWhiteBGColor: ; 8c0c1 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld hl, wBGPals1 - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - ld hl, wBGPals1 + 1 palettes - ld c, 6 -.loop - ld a, e - ld [hli], a - ld a, d - ld [hli], a -rept 6 - inc hl -endr - dec c - jr nz, .loop - - pop af - ld [rSVBK], a - ret -; 8c0e5 - -ReplaceTimeOfDayPals: ; 8c0e5 - ld hl, .BrightnessLevels - ld a, [wMapTimeOfDay] - cp $4 ; Dark cave, needs Flash - jr z, .DarkCave - and $7 - add l - ld l, a - ld a, $0 - adc h - ld h, a - ld a, [hl] - ld [wTimeOfDayPalset], a - ret - -.DarkCave: - ld a, [wStatusFlags] - bit STATUSFLAGS_FLASH_F, a - jr nz, .UsedFlash - ld a, %11111111 ; 3, 3, 3, 3 - ld [wTimeOfDayPalset], a - ret - -.UsedFlash: - ld a, %10101010 ; 2, 2, 2, 2 - ld [wTimeOfDayPalset], a - ret -; 8c10f (23:410f) - -.BrightnessLevels: ; 8c10f - dc 3, 2, 1, 0 - dc 1, 1, 1, 1 - dc 2, 2, 2, 2 - dc 0, 0, 0, 0 - dc 3, 3, 3, 3 - dc 3, 2, 1, 0 - dc 3, 2, 1, 0 - dc 3, 2, 1, 0 -; 8c117 - -GetTimePalette: ; 8c117 - ld a, [wTimeOfDay] - ld e, a - ld d, 0 - ld hl, .TimePalettes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 8c126 - -.TimePalettes: - dw .MorningPalette - dw .DayPalette - dw .NitePalette - dw .DarknessPalette - -.MorningPalette: - ld a, [wTimeOfDayPalset] - and %00000011 ; 0 - ret - -.DayPalette: - ld a, [wTimeOfDayPalset] - and %00001100 ; 1 - srl a - srl a - ret - -.NitePalette: - ld a, [wTimeOfDayPalset] - and %00110000 ; 2 - swap a - ret - -.DarknessPalette: - ld a, [wTimeOfDayPalset] - and %11000000 ; 3 - rlca - rlca - ret -; 8c14e - - -DmgToCgbTimePals: ; 8c14e - push hl - push de - ld a, [hli] - call DmgToCgbBGPals - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - call DmgToCgbObjPals - pop de - pop hl - ret -; 8c15e - -ConvertTimePalsIncHL: ; 8c15e -.loop - call DmgToCgbTimePals - inc hl - inc hl - inc hl - ld c, 2 - call DelayFrames - dec b - jr nz, .loop - ret -; 8c16d - -ConvertTimePalsDecHL: ; 8c16d -.loop - call DmgToCgbTimePals - dec hl - dec hl - dec hl - ld c, 2 - call DelayFrames - dec b - jr nz, .loop - ret -; 8c17c - - -GetTimePalFade: ; 8c17c -; check cgb - ld a, [hCGB] - and a - jr nz, .cgb - -; else: dmg - -; index - ld a, [wTimeOfDayPal] - and %11 - -; get fade table - push bc - ld c, a - ld b, $0 - ld hl, .dmgfades - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - pop bc - -; get place in fade table - ld b, $0 - add hl, bc - ret - -.cgb - ld hl, .cgbfade - ld b, $0 - add hl, bc - ret - -.dmgfades - dw .morn - dw .day - dw .nite - dw .darkness - -.morn - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11100100, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.day - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11100100, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.nite - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11101001, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.darkness - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111111 - db %11111110, %11100100, %11111111 - db %11111101, %11010000, %11111111 - db %11111101, %10000000, %11111111 - db %00000000, %01000000, %00000000 - db %00000000, %00000000, %00000000 - -.cgbfade - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11111001, %11111001 - db %11100100, %11100100, %11100100 - db %10010000, %10010000, %10010000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 -; 8c20f diff --git a/engine/timeset.asm b/engine/timeset.asm deleted file mode 100755 index eda3094e1..000000000 --- a/engine/timeset.asm +++ /dev/null @@ -1,773 +0,0 @@ -TIMESET_UP_ARROW EQUS "\"♂\"" ; $ef -TIMESET_DOWN_ARROW EQUS "\"♀\"" ; $f5 - -InitClock: ; 90672 (24:4672) -; Ask the player to set the time. - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - - ld a, $0 - ld [wSpriteUpdatesEnabled], a - ld a, $10 - ld [wMusicFade], a - ld a, LOW(MUSIC_NONE) - ld [wMusicFadeID], a - ld a, HIGH(MUSIC_NONE) - ld [wMusicFadeID + 1], a - ld c, 8 - call DelayFrames - call RotateFourPalettesLeft - call ClearTileMap - call ClearSprites - ld b, SCGB_DIPLOMA - call GetSGBLayout - xor a - ld [hBGMapMode], a - call LoadStandardFont - ld de, TimeSetBackgroundGFX - ld hl, vTiles2 tile $00 - lb bc, BANK(TimeSetBackgroundGFX), 1 - call Request1bpp - ld de, TimeSetUpArrowGFX - ld hl, vTiles2 tile $01 - lb bc, BANK(TimeSetUpArrowGFX), 1 - call Request1bpp - ld de, TimeSetDownArrowGFX - ld hl, vTiles2 tile $02 - lb bc, BANK(TimeSetDownArrowGFX), 1 - call Request1bpp - call .ClearScreen - call WaitBGMap - call RotateFourPalettesRight - ld hl, Text_WokeUpOak - call PrintText - ld hl, wTimeSetBuffer - ld bc, 50 - xor a - call ByteFill - ld a, 10 ; default hour = 10 AM - ld [wInitHourBuffer], a - -.loop - ld hl, Text_WhatTimeIsIt - call PrintText - hlcoord 3, 7 - ld b, 2 - ld c, 15 - call TextBox - hlcoord 11, 7 - ld [hl], $1 - hlcoord 11, 10 - ld [hl], $2 - hlcoord 4, 9 - call DisplayHourOClock - ld c, 10 - call DelayFrames - -.SetHourLoop: - call JoyTextDelay - call SetHour - jr nc, .SetHourLoop - - ld a, [wInitHourBuffer] - ld [wStringBuffer2 + 1], a - call .ClearScreen - ld hl, Text_WhatHrs - call PrintText - call YesNoBox - jr nc, .HourIsSet - call .ClearScreen - jr .loop - -.HourIsSet: - ld hl, Text_HowManyMinutes - call PrintText - hlcoord 11, 7 - lb bc, 2, 7 - call TextBox - hlcoord 15, 7 - ld [hl], $1 - hlcoord 15, 10 - ld [hl], $2 - hlcoord 12, 9 - call DisplayMinutesWithMinString - ld c, 10 - call DelayFrames - -.SetMinutesLoop: - call JoyTextDelay - call SetMinutes - jr nc, .SetMinutesLoop - - ld a, [wInitMinuteBuffer] - ld [wStringBuffer2 + 2], a - call .ClearScreen - ld hl, Text_WhoaMins - call PrintText - call YesNoBox - jr nc, .MinutesAreSet - call .ClearScreen - jr .HourIsSet - -.MinutesAreSet: - call InitTimeOfDay - ld hl, OakText_ResponseToSetTime - call PrintText - call WaitPressAorB_BlinkCursor - pop af - ld [hInMenu], a - ret - -.ClearScreen: ; 90783 (24:4783) - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - xor a - call ByteFill - ld a, $1 - ld [hBGMapMode], a - ret - -SetHour: ; 90795 (24:4795) - ld a, [hJoyPressed] - and A_BUTTON - jr nz, .Confirm - - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .up - ld a, [hl] - and D_DOWN - jr nz, .down - call DelayFrame - and a - ret - -.down - ld hl, wInitHourBuffer - ld a, [hl] - and a - jr nz, .DecreaseThroughMidnight - ld a, 23 + 1 -.DecreaseThroughMidnight: - dec a - ld [hl], a - jr .okay - -.up - ld hl, wInitHourBuffer - ld a, [hl] - cp 23 - jr c, .AdvanceThroughMidnight - ld a, -1 -.AdvanceThroughMidnight: - inc a - ld [hl], a - -.okay - hlcoord 4, 9 - ld a, " " - ld bc, 15 - call ByteFill - hlcoord 4, 9 - call DisplayHourOClock - call WaitBGMap - and a - ret - -.Confirm: - scf - ret - -DisplayHourOClock: ; 907de (24:47de) - push hl - ld a, [wInitHourBuffer] - ld c, a - ld e, l - ld d, h - call PrintHour - inc hl - ld de, String_oclock - call PlaceString - pop hl - ret -; 907f1 (24:47f1) - -UnreferencedFunction907f1: ; 907f1 - ld h, d - ld l, e - push hl - call DisplayHourOClock - pop de - inc de - inc de - ld a, ":" - ld [de], a - inc de - push de - ld hl, 3 - add hl, de - ld a, [de] - inc de - ld [hli], a - ld a, [de] - ld [hl], a - pop hl - call DisplayMinutesWithMinString - inc hl - inc hl - inc hl - ret -; 90810 - -SetMinutes: ; 90810 (24:4810) - ld a, [hJoyPressed] - and A_BUTTON - jr nz, .a_button - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .d_up - ld a, [hl] - and D_DOWN - jr nz, .d_down - call DelayFrame - and a - ret - -.d_down - ld hl, wInitMinuteBuffer - ld a, [hl] - and a - jr nz, .decrease - ld a, 59 + 1 -.decrease - dec a - ld [hl], a - jr .finish_dpad - -.d_up - ld hl, wInitMinuteBuffer - ld a, [hl] - cp 59 - jr c, .increase - ld a, -1 -.increase - inc a - ld [hl], a -.finish_dpad - hlcoord 12, 9 - ld a, " " - ld bc, 7 - call ByteFill - hlcoord 12, 9 - call DisplayMinutesWithMinString - call WaitBGMap - and a - ret -.a_button - scf - ret - -DisplayMinutesWithMinString: ; 90859 (24:4859) - ld de, wInitMinuteBuffer - call PrintTwoDigitNumberRightAlign - inc hl - ld de, String_min - call PlaceString - ret - -PrintTwoDigitNumberRightAlign: ; 90867 (24:4867) - push hl - ld a, " " - ld [hli], a - ld [hl], a - pop hl - lb bc, PRINTNUM_RIGHTALIGN | 1, 2 - call PrintNum - ret -; 90874 (24:4874) - -Text_WokeUpOak: ; 0x90874 - ; Zzz… Hm? Wha…? You woke me up! Will you check the clock for me? - text_jump UnknownText_0x1bc29c - db "@" -; 0x90879 - -Text_WhatTimeIsIt: ; 0x90879 - ; What time is it? - text_jump UnknownText_0x1bc2eb - db "@" -; 0x9087e - -String_oclock: - db "o'clock@" -; 90886 - -Text_WhatHrs: ; 0x90886 - ; What?@ @ - text_jump UnknownText_0x1bc2fd - start_asm - hlcoord 1, 16 - call DisplayHourOClock - ld hl, .QuestionMark - ret -; 90895 (24:4895) - -.QuestionMark: ; 0x90895 - ; ? - text_jump UnknownText_0x1bc305 - db "@" -; 0x9089a - -Text_HowManyMinutes: ; 0x9089a - ; How many minutes? - text_jump UnknownText_0x1bc308 - db "@" -; 0x9089f - -String_min: - db "min.@" -; 908a4 - -Text_WhoaMins: ; 0x908a4 - ; Whoa!@ @ - text_jump UnknownText_0x1bc31b - start_asm - hlcoord 7, 14 - call DisplayMinutesWithMinString - ld hl, .QuestionMark - ret -; 908b3 (24:48b3) - -.QuestionMark: ; 0x908b3 - ; ? - text_jump UnknownText_0x1bc323 - db "@" -; 0x908b8 - -OakText_ResponseToSetTime: ; 0x908b8 - start_asm - decoord 1, 14 - ld a, [wInitHourBuffer] - ld c, a - call PrintHour - ld [hl], ":" - inc hl - ld de, wInitMinuteBuffer - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ld b, h - ld c, l - ld a, [wInitHourBuffer] - cp MORN_HOUR - jr c, .nite - cp DAY_HOUR + 1 - jr c, .morn - cp NITE_HOUR - jr c, .day -.nite: - ld hl, .sodark - ret -.morn: - ld hl, .overslept - ret -.day: - ld hl, .yikes - ret -; 908ec (24:48ec) - -.overslept ; 0x908ec - ; ! I overslept! - text_jump UnknownText_0x1bc326 - db "@" -; 0x908f1 - -.yikes ; 0x908f1 - ; ! Yikes! I over- slept! - text_jump UnknownText_0x1bc336 - db "@" -; 0x908f6 - -.sodark ; 0x908f6 - ; ! No wonder it's so dark! - text_jump UnknownText_0x1bc34f - db "@" -; 0x908fb - -TimeSetBackgroundGFX: ; 908fb -INCBIN "gfx/new_game/timeset_bg.1bpp" -TimeSetUpArrowGFX: ; 90903 -INCBIN "gfx/new_game/up_arrow.1bpp" -TimeSetDownArrowGFX: ; 9090b -INCBIN "gfx/new_game/down_arrow.1bpp" -; 90913 - -SetDayOfWeek: ; 90913 - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - ld de, TimeSetUpArrowGFX - ld hl, vTiles0 tile TIMESET_UP_ARROW - lb bc, BANK(TimeSetUpArrowGFX), 1 - call Request1bpp - ld de, TimeSetDownArrowGFX - ld hl, vTiles0 tile TIMESET_DOWN_ARROW - lb bc, BANK(TimeSetDownArrowGFX), 1 - call Request1bpp - xor a - ld [wTempDayOfWeek], a -.loop - hlcoord 0, 12 - lb bc, 4, 18 - call TextBox - call LoadStandardMenuHeader - ld hl, .WhatDayIsItText - call PrintText - hlcoord 9, 3 - ld b, 2 - ld c, 9 - call TextBox - hlcoord 14, 3 - ld [hl], TIMESET_UP_ARROW - hlcoord 14, 6 - ld [hl], TIMESET_DOWN_ARROW - hlcoord 10, 5 - call .PlaceWeekdayString - call ApplyTilemap - ld c, 10 - call DelayFrames -.loop2 - call JoyTextDelay - call .GetJoypadAction - jr nc, .loop2 - call ExitMenu - call UpdateSprites - ld hl, .ConfirmWeekdayText - call PrintText - call YesNoBox - jr c, .loop - ld a, [wTempDayOfWeek] - ld [wStringBuffer2], a - call InitDayOfWeek - call LoadStandardFont - pop af - ld [hInMenu], a - ret -; 90993 - -.GetJoypadAction: ; 90993 - ld a, [hJoyPressed] - and A_BUTTON - jr z, .not_A - scf - ret - -.not_A - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .d_up - ld a, [hl] - and D_DOWN - jr nz, .d_down - call DelayFrame - and a - ret - -.d_down - ld hl, wTempDayOfWeek - ld a, [hl] - and a - jr nz, .decrease - ld a, SATURDAY + 1 - -.decrease - dec a - ld [hl], a - jr .finish_dpad - -.d_up - ld hl, wTempDayOfWeek - ld a, [hl] - cp 6 - jr c, .increase - ld a, SUNDAY - 1 - -.increase - inc a - ld [hl], a - -.finish_dpad - xor a - ld [hBGMapMode], a - hlcoord 10, 4 - ld b, 2 - ld c, 9 - call ClearBox - hlcoord 10, 5 - call .PlaceWeekdayString - call WaitBGMap - and a - ret -; 909de - -.PlaceWeekdayString: ; 909de - push hl - ld a, [wTempDayOfWeek] - ld e, a - ld d, 0 - ld hl, .WeekdayStrings - add hl, de - add hl, de - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - call PlaceString - ret -; 909f2 - -.WeekdayStrings: ; 909f2 -; entries correspond to wCurDay constants (see constants/wram_constants.asm) - dw .Sunday - dw .Monday - dw .Tuesday - dw .Wednesday - dw .Thursday - dw .Friday - dw .Saturday - dw .Sunday - -.Sunday: db " SUNDAY@" -.Monday: db " MONDAY@" -.Tuesday: db " TUESDAY@" -.Wednesday: db "WEDNESDAY@" -.Thursday: db "THURSDAY@" -.Friday: db " FRIDAY@" -.Saturday: db "SATURDAY@" - - -.WhatDayIsItText: ; 0x90a3f - ; What day is it? - text_jump UnknownText_0x1bc369 - db "@" -; 0x90a44 - -.ConfirmWeekdayText: ; 0x90a44 - start_asm - hlcoord 1, 14 - call .PlaceWeekdayString - ld hl, .IsIt - ret -; 90a4f (24:4a4f) - -.IsIt: ; 0x90a4f - ; , is it? - text_jump UnknownText_0x1bc37a - db "@" -; 0x90a54 - -InitialSetDSTFlag: ; 90a54 - ld a, [wDST] - set 7, a - ld [wDST], a - hlcoord 1, 14 - lb bc, 3, 18 - call ClearBox - ld hl, .Text - call PlaceHLTextAtBC - ret -; 90a6c - -.Text: ; 90a6c - start_asm - call UpdateTime - ld a, [hHours] - ld b, a - ld a, [hMinutes] - ld c, a - decoord 1, 14 - farcall PrintHoursMins - ld hl, .DSTIsThatOK - ret -; 90a83 (24:4a83) - -.DSTIsThatOK: ; 0x90a83 - ; DST, is that OK? - text_jump Text_DSTIsThatOK - db "@" -; 0x90a88 - -InitialClearDSTFlag: ; 90a88 - ld a, [wDST] - res 7, a - ld [wDST], a - hlcoord 1, 14 - lb bc, 3, 18 - call ClearBox - ld hl, .Text - call PlaceHLTextAtBC - ret -; 90aa0 - -.Text: ; 90aa0 - start_asm - call UpdateTime - ld a, [hHours] - ld b, a - ld a, [hMinutes] - ld c, a - decoord 1, 14 - farcall PrintHoursMins - ld hl, .IsThatOK - ret -; 90ab7 - -.IsThatOK: ; 0x90ab7 - ; , is that OK? - text_jump UnknownText_0x1c5ff1 - db "@" -; 0x90abc - -DebugDisplayTime: ; 90abc - hlcoord 1, 14 - lb bc, 3, SCREEN_WIDTH - 2 - call ClearBox - ld hl, .Text - call PlaceHLTextAtBC - ret -; 90acc - -.Text: ; 0x90acc - start_asm - call UpdateTime - - hlcoord 1, 14 - ld [hl], "R" - inc hl - ld [hl], "T" - inc hl - ld [hl], " " - inc hl - - ld de, hRTCDayLo - call .PrintTime - - hlcoord 1, 16 - ld [hl], "D" - inc hl - ld [hl], "F" - inc hl - ld [hl], " " - inc hl - - ld de, wStartDay - call .PrintTime - - ld [hl], " " - inc hl - - ld a, [wDST] - bit 7, a - jr z, .off - - ld [hl], "O" - inc hl - ld [hl], "N" - inc hl - jr .done - -.off - ld [hl], "O" - inc hl - ld [hl], "F" - inc hl - ld [hl], "F" - inc hl - -.done - ld hl, .NowOnDebug - ret -; 90b13 - -.NowOnDebug: ; 0x90b13 - text "Now on DEBUG…" - prompt -; 0x90b23 - -.PrintTime: ; 90b23 - lb bc, 1, 3 - call PrintNum - ld [hl], "." - inc hl - inc de - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ld [hl], ":" - inc hl - inc de - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ret -; 90b3e - -PrintHour: ; 90b3e (24:4b3e) - ld l, e - ld h, d - push bc - call GetTimeOfDayString - call PlaceString - ld l, c - ld h, b - inc hl - pop bc - call AdjustHourForAMorPM - ld [wd265], a - ld de, wd265 - call PrintTwoDigitNumberRightAlign - ret - -GetTimeOfDayString: ; 90b58 (24:4b58) - ld a, c - cp MORN_HOUR - jr c, .nite - cp DAY_HOUR - jr c, .morn - cp NITE_HOUR - jr c, .day -.nite - ld de, .nite_string - ret -.morn - ld de, .morn_string - ret -.day - ld de, .day_string - ret -; 90b71 (24:4b71) - -.nite_string: db "NITE@" -.morn_string: db "MORN@" -.day_string: db "DAY@" -; 90b7f - -AdjustHourForAMorPM: -; Convert the hour stored in c (0-23) to a 1-12 value - ld a, c - or a - jr z, .midnight - cp NOON_HOUR - ret c - ret z - sub NOON_HOUR - ret - -.midnight - ld a, NOON_HOUR - ret diff --git a/engine/title.asm b/engine/title.asm deleted file mode 100644 index f311f2342..000000000 --- a/engine/title.asm +++ /dev/null @@ -1,402 +0,0 @@ -_TitleScreen: ; 10ed67 - - call ClearBGPalettes - call ClearSprites - call ClearTileMap - -; Turn BG Map update off - xor a - ld [hBGMapMode], a - -; Reset timing variables - ld hl, wJumptableIndex - ld [hli], a ; wJumptableIndex - ld [hli], a ; wIntroSceneFrameCounter - ld [hli], a ; wTitleScreenTimer - ld [hl], a ; wTitleScreenTimer + 1 - -; Turn LCD off - call DisableLCD - - -; VRAM bank 1 - ld a, 1 - ld [rVBK], a - - -; Decompress running Suicune gfx - ld hl, TitleSuicuneGFX - ld de, vTiles1 - call Decompress - - -; Clear screen palettes - hlbgcoord 0, 0 - ld bc, 20 * BG_MAP_WIDTH - xor a - call ByteFill - - -; Fill tile palettes: - -; BG Map 1: - -; line 0 (copyright) - hlbgcoord 0, 0, vBGMap1 - ld bc, BG_MAP_WIDTH - ld a, 7 ; palette - call ByteFill - - -; BG Map 0: - -; Apply logo gradient: - -; lines 3-4 - hlbgcoord 0, 3 - ld bc, 2 * BG_MAP_WIDTH - ld a, 2 - call ByteFill -; line 5 - hlbgcoord 0, 5 - ld bc, BG_MAP_WIDTH - ld a, 3 - call ByteFill -; line 6 - hlbgcoord 0, 6 - ld bc, BG_MAP_WIDTH - ld a, 4 - call ByteFill -; line 7 - hlbgcoord 0, 7 - ld bc, BG_MAP_WIDTH - ld a, 5 - call ByteFill -; lines 8-9 - hlbgcoord 0, 8 - ld bc, 2 * BG_MAP_WIDTH - ld a, 6 - call ByteFill - - -; 'CRYSTAL VERSION' - hlbgcoord 5, 9 - ld bc, NAME_LENGTH ; length of version text - ld a, 1 - call ByteFill - -; Suicune gfx - hlbgcoord 0, 12 - ld bc, 6 * BG_MAP_WIDTH ; the rest of the screen - ld a, 0 | VRAM_BANK_1 - call ByteFill - - -; Back to VRAM bank 0 - ld a, $0 - ld [rVBK], a - - -; Decompress logo - ld hl, TitleLogoGFX - ld de, vTiles1 - call Decompress - -; Decompress background crystal - ld hl, TitleCrystalGFX - ld de, vTiles0 - call Decompress - - -; Clear screen tiles - hlbgcoord 0, 0 - ld bc, 64 * BG_MAP_WIDTH - ld a, " " - call ByteFill - -; Draw Pokemon logo - hlcoord 0, 3 - lb bc, 7, 20 - ld d, $80 - ld e, $14 - call DrawTitleGraphic - -; Draw copyright text - hlbgcoord 3, 0, vBGMap1 - lb bc, 1, 13 - ld d, $c - ld e, $10 - call DrawTitleGraphic - -; Initialize running Suicune? - ld d, $0 - call LoadSuicuneFrame - -; Initialize background crystal - call InitializeBackground - -; Save WRAM bank - ld a, [rSVBK] - push af -; WRAM bank 5 - ld a, BANK(wBGPals1) - ld [rSVBK], a - -; Update palette colors - ld hl, TitleScreenPalettes - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - - ld hl, TitleScreenPalettes - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - -; Restore WRAM bank - pop af - ld [rSVBK], a - - -; LY/SCX trickery starts here - - ld a, [rSVBK] - push af - ld a, BANK(wLYOverrides) - ld [rSVBK], a - -; Make alternating lines come in from opposite sides - -; (This part is actually totally pointless, you can't -; see anything until these values are overwritten!) - - ld b, 80 / 2 ; alternate for 80 lines - ld hl, wLYOverrides -.loop -; $00 is the middle position - ld [hl], +112 ; coming from the left - inc hl - ld [hl], -112 ; coming from the right - inc hl - dec b - jr nz, .loop - -; Make sure the rest of the buffer is empty - ld hl, wLYOverrides + 80 - xor a - ld bc, wLYOverridesEnd - (wLYOverrides + 80) - call ByteFill - -; Let LCD Stat know we're messing around with SCX - ld a, rSCX - $ff00 - ld [hLCDCPointer], a - - pop af - ld [rSVBK], a - - -; Reset audio - call ChannelsOff - call EnableLCD - -; Set sprite size to 8x16 - ld a, [rLCDC] - set rLCDC_SPRITE_SIZE, a - ld [rLCDC], a - - ld a, +112 - ld [hSCX], a - ld a, 8 - ld [hSCY], a - ld a, 7 - ld [hWX], a - ld a, -112 - ld [hWY], a - - ld a, $1 - ld [hCGBPalUpdate], a - -; Update BG Map 0 (bank 0) - ld [hBGMapMode], a - - xor a - ld [wBGPals1 + 2], a - -; Play starting sound effect - call SFXChannelsOff - ld de, SFX_TITLE_SCREEN_ENTRANCE - call PlaySFX - - ret -; 10eea7 - -SuicuneFrameIterator: ; 10eea7 - ld hl, wBGPals1 + 2 - ld a, [hl] - ld c, a - inc [hl] - -; Only do this once every eight frames - and %111 - ret nz - - ld a, c - and %11000 - sla a - swap a - ld e, a - ld d, $0 - ld hl, .Frames - add hl, de - ld d, [hl] - xor a - ld [hBGMapMode], a - call LoadSuicuneFrame - ld a, $1 - ld [hBGMapMode], a - ld a, $3 - ld [hBGMapThird], a - ret -; 10eece - -.Frames: ; 10eece - db $80 ; vTiles4 tile $00 - db $88 ; vTiles4 tile $08 - db $00 ; vTiles5 tile $00 - db $08 ; vTiles5 tile $08 -; 10eed2 - - -LoadSuicuneFrame: ; 10eed2 - hlcoord 6, 12 - ld b, 6 -.bgrows - ld c, 8 -.col - ld a, d - ld [hli], a - inc d - dec c - jr nz, .col - ld a, SCREEN_WIDTH - 8 - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, 8 - add d - ld d, a - dec b - jr nz, .bgrows - ret -; 10eeef - -DrawTitleGraphic: ; 10eeef -; input: -; hl: draw location -; b: height -; c: width -; d: tile to start drawing from -; e: number of tiles to advance for each bgrows -.bgrows - push de - push bc - push hl -.col - ld a, d - ld [hli], a - inc d - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - pop de - ld a, e - add d - ld d, a - dec b - jr nz, .bgrows - ret -; 10ef06 - -InitializeBackground: ; 10ef06 - ld hl, wVirtualOAMSprite00 - ld d, -$22 - ld e, $0 - ld c, 5 -.loop - push bc - call .InitColumn - pop bc - ld a, $10 - add d - ld d, a - dec c - jr nz, .loop - ret -; 10ef1c - -.InitColumn: ; 10ef1c - ld c, $6 - ld b, $40 -.loop2 - ld a, d - ld [hli], a ; y - ld a, b - ld [hli], a ; x - add $8 - ld b, a - ld a, e - ld [hli], a ; tile id - inc e - inc e - ld a, 0 | PRIORITY - ld [hli], a ; attributes - dec c - jr nz, .loop2 - ret -; 10ef32 - - -AnimateTitleCrystal: ; 10ef32 -; Move the title screen crystal downward until it's fully visible - -; Stop at y=6 -; y is really from the bottom of the sprite, which is two tiles high - ld hl, wVirtualOAMSprite00YCoord - ld a, [hl] - cp 6 + 2 * TILE_WIDTH - ret z - -; Move all 30 parts of the crystal down by 2 - ld c, 30 -.loop - ld a, [hl] - add 2 - ld [hli], a ; y -rept SPRITEOAMSTRUCT_LENGTH + -1 - inc hl -endr - dec c - jr nz, .loop - - ret -; 10ef46 - -TitleSuicuneGFX: ; 10ef46 -INCBIN "gfx/title/suicune.2bpp.lz" -; 10f326 - -TitleLogoGFX: ; 10f326 -INCBIN "gfx/title/logo.2bpp.lz" -; 10fcee - -TitleCrystalGFX: ; 10fcee -INCBIN "gfx/title/crystal.2bpp.lz" -; 10fede - -TitleScreenPalettes: -INCLUDE "gfx/title/title.pal" diff --git a/engine/title/credits.asm b/engine/title/credits.asm new file mode 100644 index 000000000..1aaecf64a --- /dev/null +++ b/engine/title/credits.asm @@ -0,0 +1,621 @@ +INCLUDE "constants.asm" + + +SECTION "Credits", ROMX + +Credits:: ; 109847 + bit 6, b ; Hall Of Fame + ld a, $0 + jr z, .okay + ld a, $40 +.okay + ld [wJumptableIndex], a + + ld a, [rSVBK] + push af + ld a, BANK(wGBCPalettes) + ld [rSVBK], a + + call ClearBGPalettes + call ClearTileMap + call ClearSprites + + ld hl, wCreditsFaux2bpp + ld c, $80 + ld de, $ff00 + +.load_loop + ld a, e + ld [hli], a + ld a, d + ld [hli], a + dec c + jr nz, .load_loop + + ld de, CreditsBorderGFX + ld hl, vTiles2 tile $20 + lb bc, BANK(CreditsBorderGFX), 9 + call Request2bpp + + ld de, CopyrightGFX + ld hl, vTiles2 tile $60 + lb bc, BANK(CopyrightGFX), 29 + call Request2bpp + + ld de, TheEndGFX + ld hl, vTiles2 tile $40 + lb bc, BANK(TheEndGFX), 16 + call Request2bpp + + ld a, $ff + ld [wCreditsBorderFrame], a + xor a + ld [wCreditsBorderMon], a + + call Credits_LoadBorderGFX + ld e, l + ld d, h + ld hl, vTiles2 + lb bc, BANK(CreditsMonsGFX), 16 + call Request2bpp + + call ConstructCreditsTilemap + xor a + ld [wCreditsLYOverride], a + + ld hl, wLYOverrides + ld bc, $100 + xor a + call ByteFill + + ld a, rSCX - $ff00 + ld [hLCDCPointer], a + + call GetCreditsPalette + call SetPalettes + ld a, [hVBlank] + push af + ld a, $5 + ld [hVBlank], a + ld a, $1 + ld [hInMenu], a + xor a + ld [hBGMapMode], a + ld [wCreditsPos], a + ld [wCreditsUnusedCD21], a + ld [wCreditsTimer], a + +.execution_loop + call Credits_HandleBButton + call Credits_HandleAButton + jr nz, .exit_credits + + call Credits_Jumptable + call DelayFrame + jr .execution_loop + +.exit_credits + call ClearBGPalettes + xor a + ld [hLCDCPointer], a + ld [hBGMapAddress], a + pop af + ld [hVBlank], a + pop af + ld [rSVBK], a + ret +; 1098fd + +Credits_HandleAButton: ; 1098fd + ld a, [hJoypadDown] + and A_BUTTON + ret z + ld a, [wJumptableIndex] + bit 7, a + ret +; 109908 + +Credits_HandleBButton: ; 109908 + ld a, [hJoypadDown] + and B_BUTTON + ret z + ld a, [wJumptableIndex] + bit 6, a + ret z + ld hl, wCreditsPos + ld a, [hli] + cp $d + jr nc, .okay + ld a, [hli] + and a + ret z +.okay + ld hl, wCreditsTimer + ld a, [hl] + and a + ret z + dec [hl] + ret +; 109926 + +Credits_Jumptable: ; 109926 + ld a, [wJumptableIndex] + and $f + 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 +; 109937 + +.Jumptable: ; 109937 (42:5937) + dw ParseCredits + dw Credits_Next + dw Credits_Next + dw Credits_PrepBGMapUpdate + dw Credits_UpdateGFXRequestPath + dw Credits_RequestGFX + dw Credits_LYOverride + dw Credits_Next + dw Credits_Next + dw Credits_Next + dw Credits_UpdateGFXRequestPath + dw Credits_RequestGFX + dw Credits_LoopBack + +Credits_Next: ; 109951 (42:5951) + ld hl, wJumptableIndex + inc [hl] + ret + +Credits_LoopBack: ; 109956 (42:5956) + ld hl, wJumptableIndex + ld a, [hl] + and $f0 + ld [hl], a + ret + +Credits_PrepBGMapUpdate: ; 10995e (42:595e) + xor a + ld [hBGMapMode], a + jp Credits_Next + +Credits_UpdateGFXRequestPath: ; 109964 (42:5964) + call Credits_LoadBorderGFX + ld a, l + ld [wRequested2bppSource], a + ld a, h + ld [wRequested2bppSource + 1], a + ld a, LOW(vTiles2) + ld [wRequested2bppDest], a + ld a, HIGH(vTiles2) + ld [wRequested2bppDest + 1], a + jr Credits_RequestGFX + +Credits_RequestGFX: ; 10997b (42:597b) + xor a + ld [hBGMapMode], a + ld a, $8 + ld [wRequested2bpp], a + jp Credits_Next + +Credits_LYOverride: ; 109986 (42:5986) + ld a, [rLY] + cp $30 + jr c, Credits_LYOverride + ld a, [wCreditsLYOverride] + dec a + dec a + ld [wCreditsLYOverride], a + ld hl, wLYOverrides + $1f + call .Fill + ld hl, wLYOverrides + $87 + call .Fill + jp Credits_Next + +.Fill: ; 1099a3 (42:59a3) + ld c, $8 +.loop + ld [hli], a + dec c + jr nz, .loop + ret +; 1099aa + + +ParseCredits: ; 1099aa + ld hl, wJumptableIndex + bit 7, [hl] + jp nz, .done + +; Wait until the timer has run out to parse the next command. + ld hl, wCreditsTimer + ld a, [hl] + and a + jr z, .parse + +; One tick has passed. + dec [hl] + jp .done + +.parse +; First, let's clear the current text display, +; starting from line 5. + xor a + ld [hBGMapMode], a + hlcoord 0, 5 + ld bc, 20 * 12 + ld a, " " + call ByteFill + +; Then read the script. + +.loop + call .get + +; Commands: + cp CREDITS_END + jp z, .end + cp CREDITS_WAIT + jr z, .wait + cp CREDITS_SCENE + jr z, .scene + cp CREDITS_CLEAR + jr z, .clear + cp CREDITS_MUSIC + jr z, .music + cp CREDITS_WAIT2 + jr z, .wait2 + cp CREDITS_THEEND + jr z, .theend + +; If it's not a command, it's a string identifier. + + push af + ld e, a + ld d, 0 + ld hl, CreditsStrings + add hl, de + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a + pop af + +; Strings spanning multiple lines have special cases. + + cp COPYRIGHT + jr z, .copyright + + cp STAFF + jr c, .staff + +; The rest start from line 6. + + hlcoord 0, 6 + jr .print + +.copyright + hlcoord 2, 6 + jr .print + +.staff + hlcoord 0, 6 + +.print +; Print strings spaced every two lines. + call .get + ld bc, 20 * 2 + call AddNTimes + call PlaceString + jr .loop + +.theend +; Display "The End" graphic. + call Credits_TheEnd + jr .loop + +.scene +; Update the scene number and corresponding palette. + call .get + ld [wCreditsBorderMon], a ; scene + xor a + ld [wCreditsBorderFrame], a ; frame + call GetCreditsPalette + call SetPalettes ; update hw pal registers + jr .loop + +.clear +; Clear the banner. + ld a, $ff + ld [wCreditsBorderFrame], a ; frame + jr .loop + +.music +; Play the credits music. + ld de, MUSIC_CREDITS + push de + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + pop de + call PlayMusic + jp .loop + +.wait2 +; Wait for some amount of ticks. + call .get + ld [wCreditsTimer], a + jr .done + +.wait +; Wait for some amount of ticks, and do something else. + call .get + ld [wCreditsTimer], a + + xor a + ld [hBGMapThird], a + ld a, 1 + ld [hBGMapMode], a + +.done + jp Credits_Next + +.end +; Stop execution. + ld hl, wJumptableIndex + set 7, [hl] + ld a, 32 + ld [wMusicFade], a + ld a, LOW(MUSIC_POST_CREDITS) + ld [wMusicFadeID], a + ld a, HIGH(MUSIC_POST_CREDITS) + ld [wMusicFadeID + 1], a + ret + +.get +; Get byte wCreditsPos from CreditsScript + push hl + push de + ld a, [wCreditsPos] + ld e, a + ld a, [wCreditsPos+1] + ld d, a + ld hl, CreditsScript + add hl, de + + inc de + ld a, e + ld [wCreditsPos], a + ld a, d + ld [wCreditsPos+1], a + ld a, [hl] + pop de + pop hl + ret +; 109a95 + + +ConstructCreditsTilemap: ; 109a95 (42:5a95) + xor a + ld [hBGMapMode], a + ld a, $c + ld [hBGMapAddress], a + + ld a, $28 + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + call ByteFill + + ld a, $7f + hlcoord 0, 4 + ld bc, (SCREEN_HEIGHT - 4) * SCREEN_WIDTH + call ByteFill + + hlcoord 0, 4 + ld a, $24 + call DrawCreditsBorder + + hlcoord 0, 17 + ld a, $20 + call DrawCreditsBorder + + hlcoord 0, 0, wAttrMap + ld bc, 4 * SCREEN_WIDTH + xor a + call ByteFill + + hlcoord 0, 4, wAttrMap + ld bc, SCREEN_WIDTH + ld a, $1 + call ByteFill + + hlcoord 0, 5, wAttrMap + ld bc, 12 * SCREEN_WIDTH + ld a, $2 + call ByteFill + + hlcoord 0, 17, wAttrMap + ld bc, SCREEN_WIDTH + ld a, $1 + call ByteFill + + call WaitBGMap2 + xor a + ld [hBGMapMode], a + ld [hBGMapAddress], a + hlcoord 0, 0 + call .InitTopPortion + call WaitBGMap2 + ret + +.InitTopPortion: ; 109aff (42:5aff) + ld b, 5 +.outer_loop + push hl + ld de, SCREEN_WIDTH - 3 + ld c, 4 + xor a +.inner_loop +rept 3 + ld [hli], a + inc a +endr + ld [hl], a + inc a + add hl, de + dec c + jr nz, .inner_loop + pop hl +rept 4 + inc hl +endr + dec b + jr nz, .outer_loop + ret + +DrawCreditsBorder: ; 109b1d (42:5b1d) + ld c, SCREEN_WIDTH / 4 +.loop + push af +rept 3 + ld [hli], a + inc a +endr + ld [hli], a + pop af + dec c + jr nz, .loop + ret + +GetCreditsPalette: ; 109b2c + call .GetPalAddress + + push hl + ld a, 0 + call .UpdatePals + pop hl + ret + +.GetPalAddress: +; Each set of palette data is 24 bytes long. + ld a, [wCreditsBorderMon] ; scene + and %11 + add a + add a ; * 8 + add a + ld e, a + ld d, 0 + ld hl, CreditsPalettes + add hl, de + add hl, de ; * 3 + add hl, de + ret + +.UpdatePals: +; Update the first three colors in both palette buffers. + push af + push hl + add LOW(wBGPals1) + ld e, a + ld a, 0 + adc HIGH(wBGPals1) + ld d, a + ld bc, 24 + call CopyBytes + + pop hl + pop af + add LOW(wBGPals2) + ld e, a + ld a, 0 + adc HIGH(wBGPals2) + ld d, a + ld bc, 24 + call CopyBytes + ret + +CreditsPalettes: +INCLUDE "gfx/credits/credits.pal" +; 109bca + +Credits_LoadBorderGFX: ; 109bca (42:5bca) + ld hl, wCreditsBorderFrame + ld a, [hl] + cp $ff + jr z, .init + + and %11 + ld e, a + inc a + and %11 + ld [hl], a + ld a, [wCreditsBorderMon] + and %11 + add a + add a + add e + add a + ld e, a + ld d, 0 + ld hl, .Frames + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +.init + ld hl, wCreditsFaux2bpp + ret +; 109bf1 (42:5bf1) + +.Frames: ; 109bf1 + dw CreditsPichuGFX + dw CreditsPichuGFX + 16 tiles + dw CreditsPichuGFX + 32 tiles + dw CreditsPichuGFX + 48 tiles + dw CreditsSmoochumGFX + dw CreditsSmoochumGFX + 16 tiles + dw CreditsSmoochumGFX + 32 tiles + dw CreditsSmoochumGFX + 48 tiles + dw CreditsDittoGFX + dw CreditsDittoGFX + 16 tiles + dw CreditsDittoGFX + 32 tiles + dw CreditsDittoGFX + 48 tiles + dw CreditsIgglybuffGFX + dw CreditsIgglybuffGFX + 16 tiles + dw CreditsIgglybuffGFX + 32 tiles + dw CreditsIgglybuffGFX + 48 tiles +; 109c11 + +Credits_TheEnd: ; 109c11 (42:5c11) + ld a, $40 + hlcoord 6, 9 + call .Load + hlcoord 6, 10 +.Load: ; 109c1c (42:5c1c) + ld c, 8 +.loop + ld [hli], a + inc a + dec c + jr nz, .loop + ret +; 109c24 (42:5c24) + + +CreditsBorderGFX: INCBIN "gfx/credits/border.2bpp" + +CreditsMonsGFX: +CreditsPichuGFX: INCBIN "gfx/credits/pichu.2bpp" +CreditsSmoochumGFX: INCBIN "gfx/credits/smoochum.2bpp" +CreditsDittoGFX: INCBIN "gfx/credits/ditto.2bpp" +CreditsIgglybuffGFX: INCBIN "gfx/credits/igglybuff.2bpp" + +INCLUDE "data/credits_script.asm" +INCLUDE "data/credits_strings.asm" diff --git a/engine/title/crystal_intro.asm b/engine/title/crystal_intro.asm new file mode 100755 index 000000000..56bb02750 --- /dev/null +++ b/engine/title/crystal_intro.asm @@ -0,0 +1,2199 @@ +Copyright_GFPresents: ; e4579 + ld de, MUSIC_NONE + call PlayMusic + call ClearBGPalettes + call ClearTileMap + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + xor a ; LOW(vBGMap0) + ld [hBGMapAddress], a + ld [hJoyDown], a + ld [hSCX], a + ld [hSCY], a + ld a, $90 + ld [hWY], a + call WaitBGMap + ld b, SCGB_GAMEFREAK_LOGO + call GetSGBLayout + call SetPalettes + ld c, 10 + call DelayFrames + callfar Copyright + call WaitBGMap + ld c, 100 + call DelayFrames + call ClearTileMap + farcall GBCOnlyScreen + call .GetGFLogoGFX +.joy_loop + call JoyTextDelay + ld a, [hJoyLast] + and BUTTONS + jr nz, .pressed_button + ld a, [wJumptableIndex] + bit 7, a + jr nz, .finish + call PlaceGameFreakPresents + farcall PlaySpriteAnimations + call DelayFrame + jr .joy_loop + +.pressed_button + call .StopGamefreakAnim + scf + ret + +.finish + call .StopGamefreakAnim + and a + ret +; e45e8 + +.GetGFLogoGFX: ; e45e8 + ld de, GameFreakLogo + ld hl, vTiles2 + lb bc, BANK(GameFreakLogo), 28 + call Get1bpp + + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + ld hl, IntroLogoGFX + ld de, wDecompressScratch + ld a, BANK(IntroLogoGFX) + call FarDecompress + + ld hl, vTiles0 + ld de, wDecompressScratch + lb bc, 1, 8 tiles + call Request2bpp + + ld hl, vTiles1 + ld de, wDecompressScratch + $80 tiles + lb bc, 1, 8 tiles + call Request2bpp + + pop af + ld [rSVBK], a + + farcall ClearSpriteAnims + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_GAMEFREAK_LOGO + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $a0 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $60 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + xor a + ld [wJumptableIndex], a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + ld [hSCX], a + ld [hSCY], a + ld a, $1 + ld [hBGMapMode], a + ld a, $90 + ld [hWY], a + lb de, %11100100, %11100100 + call DmgToCgbObjPals + ret +; e465e + +.StopGamefreakAnim: ; e465e + farcall ClearSpriteAnims + call ClearTileMap + call ClearSprites + ld c, 16 + call DelayFrames + ret +; e4670 + +PlaceGameFreakPresents: ; e4670 + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e467f + +.dw ; e467f + dw PlaceGameFreakPresents_0 + dw PlaceGameFreakPresents_1 + dw PlaceGameFreakPresents_2 + dw PlaceGameFreakPresents_3 +; e4687 + +PlaceGameFreakPresents_AdvanceIndex: ; e4687 + ld hl, wJumptableIndex + inc [hl] + ret +; e468c + +PlaceGameFreakPresents_0: ; e468c + ret +; e468d + +PlaceGameFreakPresents_1: ; e468d + ld hl, wIntroSceneTimer + ld a, [hl] + cp $20 + jr nc, .PlaceGameFreak + inc [hl] + ret + +.PlaceGameFreak: + ld [hl], 0 + ld hl, .GAME_FREAK + decoord 5, 10 + ld bc, .end - .GAME_FREAK + call CopyBytes + call PlaceGameFreakPresents_AdvanceIndex + ld de, SFX_GAME_FREAK_PRESENTS + call PlaySFX + ret +; e46af + +.GAME_FREAK: + ; G A M E _ F R E A K + db 0, 1, 2, 3, 13, 4, 5, 3, 1, 6 +.end + db "@" +; e46ba + +PlaceGameFreakPresents_2: ; e46ba + ld hl, wIntroSceneTimer + ld a, [hl] + cp $40 + jr nc, .place_presents + inc [hl] + ret + +.place_presents + ld [hl], 0 + ld hl, .presents + decoord 7, 11 + ld bc, .end - .presents + call CopyBytes + call PlaceGameFreakPresents_AdvanceIndex + ret +; e46d6 + +.presents + db 7, 8, 9, 10, 11, 12 +.end + db "@" +; e46dd + +PlaceGameFreakPresents_3: ; e46dd + ld hl, wIntroSceneTimer + ld a, [hl] + cp $80 + jr nc, .finish + inc [hl] + ret + +.finish + ld hl, wJumptableIndex + set 7, [hl] + ret +; e46ed + + +GameFreakLogoJumper: ; e46ed (39:46ed) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, GameFreakLogoScenes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +GameFreakLogoScenes: ; e46fd (39:46fd) + dw GameFreakLogoScene1 + dw GameFreakLogoScene2 + dw GameFreakLogoScene3 + dw GameFreakLogoScene4 + dw GameFreakLogoScene5 + +GameFreakLogoScene1: ; e4707 (39:4707) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +GameFreakLogoScene2: ; e470d (39:470d) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_e4747 + ld d, a + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and %111111 + cp %100000 + jr nc, .asm_e4723 + add %100000 +.asm_e4723 + ld e, a + farcall BattleAnim_Sine_e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], e + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + dec [hl] + and $1f + ret nz + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + sub $30 + ld [hl], a + ld de, SFX_DITTO_BOUNCE + call PlaySFX + ret + +.asm_e4747 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $0 + ld de, SFX_DITTO_POP_UP + call PlaySFX + ret + +GameFreakLogoScene3: ; e4759 (39:4759) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $20 + jr nc, .asm_e4764 + inc [hl] + ret + +.asm_e4764 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $0 + ld de, SFX_DITTO_TRANSFORM + call PlaySFX + ret + +GameFreakLogoScene4: ; e4776 (39:4776) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $40 + jr z, .asm_e47a3 + inc [hl] + srl a + srl a + ld e, a + ld d, $0 + ld hl, GameFreakLogoPalettes + add hl, de + add hl, de + ld a, [rSVBK] + push af + ld a, BANK(wOBPals2) + ld [rSVBK], a + ld a, [hli] + ld [wOBPals2 + 12], a + ld a, [hli] + ld [wOBPals2 + 13], a + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret + +.asm_e47a3 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + call PlaceGameFreakPresents_AdvanceIndex +GameFreakLogoScene5: ; e47ab (39:47ab) + ret +; e47ac (39:47ac) + +GameFreakLogoPalettes: ; e47ac +INCLUDE "gfx/intro/gamefreak_logo.pal" +; e47cc + +GameFreakLogo: ; e47cc +INCBIN "gfx/splash/logo1.1bpp" +INCBIN "gfx/splash/logo2.1bpp" +; e48ac + +CrystalIntro: ; e48ac + ld a, [rSVBK] + push af + ld a, BANK(wGBCPalettes) + ld [rSVBK], a + ld a, [hInMenu] + push af + ld a, [hVBlank] + push af + call .InitRAMAddrs +.loop ; e48bc + call JoyTextDelay + ld a, [hJoyLast] + and BUTTONS + jr nz, .ShutOffMusic + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call IntroSceneJumper + farcall PlaySpriteAnimations + call DelayFrame + jp .loop + +.ShutOffMusic: + ld de, MUSIC_NONE + call PlayMusic + +.done + call ClearBGPalettes + call ClearSprites + call ClearTileMap + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + pop af + ld [hVBlank], a + pop af + ld [hInMenu], a + pop af + ld [rSVBK], a + ret +; e4901 + +.InitRAMAddrs: ; e4901 + xor a + ld [hVBlank], a + ld a, $1 + ld [hInMenu], a + xor a + ld [hMapAnims], a + ld [wJumptableIndex], a + ret +; e490f + +IntroSceneJumper: ; e490f + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, IntroScenes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e491e + +IntroScenes: ; e491e (39:491e) + dw IntroScene1 + dw IntroScene2 + dw IntroScene3 + dw IntroScene4 + dw IntroScene5 + dw IntroScene6 + dw IntroScene7 + dw IntroScene8 + dw IntroScene9 + dw IntroScene10 + dw IntroScene11 + dw IntroScene12 + dw IntroScene13 + dw IntroScene14 + dw IntroScene15 + dw IntroScene16 + dw IntroScene17 + dw IntroScene18 + dw IntroScene19 + dw IntroScene20 + dw IntroScene21 + dw IntroScene22 + dw IntroScene23 + dw IntroScene24 + dw IntroScene25 + dw IntroScene26 + dw IntroScene27 + dw IntroScene28 + +NextIntroScene: ; e4956 (39:4956) + ld hl, wJumptableIndex + inc [hl] + ret + +IntroScene1: ; e495b (39:495b) +; Setup the next scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap001 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroPulseGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap002 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette2 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette2 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene2: ; e49d6 (39:49d6) +; First Unown (A) fades in, pulses, then fades out. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .endscene + cp $60 + jr nz, .DontPlaySound + push af + depixel 11, 11 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_1 + call PlaySFX + pop af +.DontPlaySound: + ld [wIntroSceneTimer], a + xor a + call CrystalIntro_UnownFade + ret +.endscene + call NextIntroScene + ret + +IntroScene3: ; e49fd (39:49fd) +; More setup. Transition to the outdoor scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap003 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap004 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette1 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette1 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + call Intro_ResetLYOverrides + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene4: ; e4a69 (39:4a69) +; Scroll the outdoor panorama for a bit. + call Intro_PerspectiveScrollBG + ld hl, wIntroSceneFrameCounter + ld a, [hl] + cp $80 + jr z, .endscene + inc [hl] + ret + +.endscene + call NextIntroScene + ret + +IntroScene5: ; e4a7a (39:4a7a) +; Go back to the Unown. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld [hLCDCPointer], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap005 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroPulseGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap006 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette2 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette2 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene6: ; e4af7 (39:4af7) +; Two more Unown (I, H) fade in. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .endscene + cp $60 + jr z, .SecondUnown + cp $40 + jr nc, .StopUnown + cp $20 + jr z, .FirstUnown + jr .NoUnown + +.FirstUnown: + push af + depixel 7, 15 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_2 + call PlaySFX + pop af +.NoUnown: + ld [wIntroSceneTimer], a + xor a + call CrystalIntro_UnownFade + ret + +.SecondUnown: + push af + depixel 14, 6 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_1 + call PlaySFX + pop af +.StopUnown: + ld [wIntroSceneTimer], a + ld a, $1 + call CrystalIntro_UnownFade + ret + +.endscene + call NextIntroScene + ret + +IntroScene7: ; e4b3f (39:4b3f) +; Back to the outdoor scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap003 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + + ld hl, IntroPichuWooperGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneRunGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + + ld hl, IntroTilemap004 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld hl, IntroPalette1 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + + ld hl, IntroPalette1 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + + pop af + ld [rSVBK], a + + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + call Intro_ResetLYOverrides + farcall ClearSpriteAnims + depixel 13, 27, 4, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE + call _InitSpriteAnimStruct + ld a, $f0 + ld [wGlobalAnimXOffset], a + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene8: ; e4bd3 (39:4bd3) +; Scroll the scene, then show Suicune running across the screen. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $40 + jr z, .suicune_sound + jr nc, .animate_suicune + call Intro_PerspectiveScrollBG + ret + +.suicune_sound + ld de, SFX_INTRO_SUICUNE_3 + call PlaySFX +.animate_suicune + ld a, [wGlobalAnimXOffset] + and a + jr z, .finish + sub $8 + ld [wGlobalAnimXOffset], a + ret + +.finish + ld de, SFX_INTRO_SUICUNE_2 + call PlaySFX + farcall DeinitializeAllSprites + call NextIntroScene + ret + +IntroScene9: ; e4c04 (39:4c04) +; Set up the next scene (same bg). + xor a + ld [hLCDCPointer], a + call ClearSprites + hlcoord 0, 0, wAttrMap + ; first 12 rows have palette 1 + ld bc, 12 * SCREEN_WIDTH + ld a, $1 + call ByteFill + ; middle 3 rows have palette 2 + ld bc, 3 * SCREEN_WIDTH + ld a, $2 + call ByteFill + ; last three rows have palette 3 + ld bc, 3 * SCREEN_WIDTH + ld a, $3 + call ByteFill + ld a, $2 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + ld a, $c ; $980c + ld [hBGMapAddress], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ld [hBGMapMode], a + ld [hBGMapAddress], a + ld [wGlobalAnimXOffset], a + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene10: ; e4c4f (39:4c4f) +; Wooper and Pichu enter. + call Intro_RustleGrass + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $c0 + jr z, .done + cp $20 + jr z, .wooper + cp $40 + jr z, .pichu + ret + +.pichu + depixel 21, 16, 1, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_PICHU + call _InitSpriteAnimStruct + ld de, SFX_INTRO_PICHU + call PlaySFX + ret + +.wooper + depixel 22, 6 + ld a, SPRITE_ANIM_INDEX_INTRO_WOOPER + call _InitSpriteAnimStruct + ld de, SFX_INTRO_PICHU + call PlaySFX + ret +.done + call NextIntroScene + ret + +IntroScene11: ; e4c86 (39:4c86) +; Back to Unown again. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld [hLCDCPointer], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap007 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap008 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette2 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette2 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene12: ; e4cfa (39:4cfa) +; Even more Unown. + call .PlayUnownSound + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $c0 + jr nc, .done + cp $80 + jr nc, .second_half +; first half + ld c, a + and $1f + sla a + ld [wIntroSceneTimer], a + ld a, c + and $e0 + srl a + swap a + call CrystalIntro_UnownFade + ret + +.second_half +; double speed + ld c, a + and $f + sla a + sla a + ld [wIntroSceneTimer], a + ld a, c + and $70 + or $40 + swap a + call CrystalIntro_UnownFade + ret + +.done + call NextIntroScene + ret + +.PlayUnownSound: ; e4d36 (39:4d36) + ld a, [wIntroSceneFrameCounter] + ld c, a + ld hl, .UnownSounds +.loop + ld a, [hli] + cp -1 + ret z + cp c + jr z, .playsound + inc hl + inc hl + jr .loop +.playsound + ld a, [hli] + ld d, [hl] + ld e, a + push de + call SFXChannelsOff + pop de + call PlaySFX + ret +; e4d54 (39:4d54) + +.UnownSounds: ; e4d54 + dbw $00, SFX_INTRO_UNOWN_3 + dbw $20, SFX_INTRO_UNOWN_2 + dbw $40, SFX_INTRO_UNOWN_1 + dbw $60, SFX_INTRO_UNOWN_2 + dbw $80, SFX_INTRO_UNOWN_3 + dbw $90, SFX_INTRO_UNOWN_2 + dbw $a0, SFX_INTRO_UNOWN_1 + dbw $b0, SFX_INTRO_UNOWN_2 + db -1 ; e4d6d + +IntroScene13: ; e4d6d (39:4d6d) +; Switch scenes again. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap003 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneRunGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap004 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette1 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette1 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + depixel 13, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE + call _InitSpriteAnimStruct + ld de, MUSIC_CRYSTAL_OPENING + call PlayMusic + xor a + ld [wGlobalAnimXOffset], a + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene14: ; e4dfa (39:4dfa) +; Suicune runs then jumps. + ld a, [hSCX] + sub 10 + ld [hSCX], a + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr z, .done + cp $60 + jr z, .jump + jr nc, .asm_e4e1a + cp $40 + jr nc, .asm_e4e33 + ret + +.jump + ld de, SFX_INTRO_SUICUNE_4 + call PlaySFX + +.asm_e4e1a + ld a, $1 + ld [wIntroSceneTimer], a + ld a, [wGlobalAnimXOffset] + cp $88 + jr c, .asm_e4e2c + sub $8 + ld [wGlobalAnimXOffset], a + ret + +.asm_e4e2c + farcall DeinitializeAllSprites + ret + +.asm_e4e33 + ld a, [wGlobalAnimXOffset] + sub $2 + ld [wGlobalAnimXOffset], a + ret + +.done + call NextIntroScene + ret + +IntroScene15: ; e4e40 (39:4e40) +; Transition to a new scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap009 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneJumpGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownBackGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld de, IntroGrass4GFX + ld hl, vTiles1 tile $00 + lb bc, BANK(IntroGrass4GFX), 1 + call Request2bpp + ld hl, IntroTilemap010 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + call Intro_LoadTilemap + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette5 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette5 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld a, $90 + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + depixel 8, 5 + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN_F + call _InitSpriteAnimStruct + depixel 12, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY + call _InitSpriteAnimStruct + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene16: ; e4edc (39:4edc) +; Suicune shows its face. An Unown appears in front. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .done + call Intro_Scene16_AnimateSuicune + ld a, [hSCY] + and a + ret z + add 8 + ld [hSCY], a + ret +.done + call NextIntroScene + ret + +IntroScene17: ; e4ef5 (39:4ef5) +; ... + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap011 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneCloseGFX + ld de, vTiles1 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + ld hl, IntroTilemap012 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette4 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette4 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene18: ; e4f67 (39:4f67) +; Suicune close up. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $60 + jr nc, .done + ld a, [hSCX] + cp $60 + ret z + add 8 + ld [hSCX], a + ret +.done + call NextIntroScene + ret + +IntroScene19: ; e4f7e (39:4f7e) +; More setup. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap013 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneBackGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownsGFX + ld de, vTiles1 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld de, IntroGrass4GFX + ld hl, vTiles1 tile $7f + lb bc, BANK(IntroGrass4GFX), 1 + call Request2bpp + ld hl, IntroTilemap014 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + call Intro_LoadTilemap + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette5 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette5 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld a, $d8 + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + ld hl, wSpriteAnimDict + xor a + ld [hli], a + ld [hl], $7f + call Intro_SetCGBPalUpdate + depixel 12, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY + call _InitSpriteAnimStruct + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene20: ; e5019 (39:5019) +; Suicune running away. A bunch of Unown appear. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $98 + jr nc, .finished + cp $58 + ret nc + cp $40 + jr nc, .AppearUnown + cp $28 + ret nc + ld a, [hSCY] + inc a + ld [hSCY], a + ret + +.AppearUnown: + sub $18 + ld c, a + and $3 + cp $3 + ret nz + ld a, c + and $1c + srl a + srl a + ld [wIntroSceneTimer], a + xor a + call Intro_Scene20_AppearUnown + ret +; e5049 (39:5049) +; unused + ld a, c + and $1c + srl a + srl a + ld [wIntroSceneTimer], a + ld a, 1 + call Intro_Scene20_AppearUnown + ret + +.finished + call NextIntroScene + ret + +IntroScene21: ; e505d (39:505d) +; Suicune gets more distant and turns black. + call Intro_ColoredSuicuneFrameSwap + ld c, 3 + call DelayFrames + xor a + ld [hBGMapMode], a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene22: ; e5072 (39:5072) + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $8 + jr nc, .done + ret +.done + farcall DeinitializeAllSprites + call NextIntroScene + ret + +IntroScene23: ; e5086 (39:5086) + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene24: ; e508e (39:508e) +; Fade to white. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $20 + jr nc, .done + + ld c, a + and $3 + ret nz + + ld a, c + and $1c + sla a + call Intro_Scene24_ApplyPaletteFade + ret + +.done + ld a, $40 + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene25: ; e50ad (39:50ad) +; Wait around a bit. + ld a, [wIntroSceneFrameCounter] + dec a + jr z, .done + ld [wIntroSceneFrameCounter], a + ret + +.done + call NextIntroScene + ret + +IntroScene26: ; e50bb (39:50bb) +; Load the final scene. + call ClearBGPalettes + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap015 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroCrystalUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap017 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette3 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette3 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene27: ; e512d (39:512d) +; Spell out C R Y S T A L with Unown. + ld hl, wIntroSceneTimer + inc [hl] + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .done + + ld c, a + and $f + ld [wIntroSceneTimer], a + ld a, c + and $70 + swap a + call Intro_FadeUnownWordPals + ret + +.done + call NextIntroScene + ld a, $80 + ld [wIntroSceneFrameCounter], a + ret + +IntroScene28: ; e5152 (39:5152) +; Cut out when the music ends, and lead into the title screen. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + cp $18 + jr z, .clear + cp $8 + ret nz + + ld de, SFX_UNKNOWN_CB + call PlaySFX + ret + +.clear + call ClearBGPalettes + ret + +.done + ld hl, wJumptableIndex + set 7, [hl] + ret + +Intro_Scene24_ApplyPaletteFade: ; e5172 (39:5172) +; load the (a)th palette from .FadePals to all wBGPals2 + ld hl, .FadePals + add l + ld l, a + ld a, $0 + adc h + ld h, a + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld de, wBGPals2 + ld b, 8 ; number of BG pals +.loop1 + push hl + ld c, 1 palettes +.loop2 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop2 + pop hl + dec b + jr nz, .loop1 + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret +; e519c (39:519c) + +.FadePals: ; e519c +INCLUDE "gfx/intro/fade.pal" +; e51dc + +CrystalIntro_InitUnownAnim: ; e51dc (39:51dc) + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $8 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_4 + call ReinitSpriteAnimFrame + pop de + + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $18 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_3 + call ReinitSpriteAnimFrame + pop de + + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $28 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1 + call ReinitSpriteAnimFrame + pop de + + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $38 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_2 + call ReinitSpriteAnimFrame + ret + +CrystalIntro_UnownFade: ; e5223 (39:5223) + add a + add a + add a + ld e, a + ld d, $0 + ld hl, wBGPals2 + add hl, de + inc hl + inc hl + ld a, [wIntroSceneTimer] + and %111111 + cp %011111 + jr z, .okay + jr c, .okay + ld c, a + ld a, %111111 + sub c +.okay + + ld c, a + ld b, $0 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + + push hl + push bc + ld hl, wBGPals2 + ld bc, 8 palettes + xor a + call ByteFill + pop bc + pop hl + + push hl + ld hl, .BWFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .BlackLBlueFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .BlackBlueFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret +; e5288 (39:5288) + +.BWFade: ; e5288 +; Fade between black and white. +hue = 0 +rept 32 + RGB hue, hue, hue +hue = hue + 1 +endr +; e52c8 + +.BlackLBlueFade: ; e52c8 +; Fade between black and light blue. +hue = 0 +rept 32 + RGB 0, hue / 2, hue +hue = hue + 1 +endr +; e5308 + +.BlackBlueFade: ; e5308 +; Fade between black and blue. +hue = 0 +rept 32 + RGB 0, 0, hue +hue = hue + 1 +endr +; e5348 + +Intro_Scene20_AppearUnown: ; e5348 (39:5348) +; Spawn the palette for the nth Unown + and a + jr nz, .load_pal_2 + + ld hl, .pal1 + jr .got_pointer + +.load_pal_2 + ld hl, .pal2 + +.got_pointer + ld a, [wIntroSceneTimer] + and $7 + add a + add a + add a + ld c, a + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + + push bc + ld de, wBGPals2 + + ld a, c + add e + ld e, a + ld a, $0 + adc d + ld d, a + + ld bc, 1 palettes + call CopyBytes + pop bc + + ld de, wBGPals1 + ld a, c + add e + ld e, a + ld a, $0 + adc d + ld d, a + + ld bc, 1 palettes + call CopyBytes + + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret +; e538d (39:538d) + +.pal1 ; e538d + RGB 24, 12, 09 + RGB 31, 31, 31 + RGB 12, 00, 31 + RGB 00, 00, 00 + +; e5395 + +.pal2 ; e5395 + RGB 24, 12, 09 + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 31, 31 + +; e539d + +Intro_FadeUnownWordPals: ; e539d (39:539d) + add a + add a + add a + ld e, a + ld d, $0 + ld hl, wBGPals2 + add hl, de +rept 4 + inc hl +endr + ld a, [wIntroSceneTimer] + add a + ld c, a + ld b, $0 + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + + push hl + ld hl, .FastFadePalettes + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .SlowFadePalettes + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret +; e53db (39:53db) + +.FastFadePalettes: ; e53db +hue = 31 +rept 8 + RGB hue, hue, hue +hue = hue + -1 + RGB hue, hue, hue +hue = hue + -2 +endr +; e53fb + +.SlowFadePalettes: ; e53fb +hue = 31 +rept 16 + RGB hue, hue, hue +hue = hue + -1 +endr +; e541b + +Intro_LoadTilemap: ; e541b (39:541b) + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + ld hl, wDecompressScratch + decoord 0, 0 + ld b, SCREEN_HEIGHT +.row + ld c, SCREEN_WIDTH +.col + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .col + ld a, BG_MAP_WIDTH - SCREEN_WIDTH + add l + ld l, a + ld a, 0 + adc h + ld h, a + dec b + jr nz, .row + + pop af + ld [rSVBK], a + ret + +Intro_Scene16_AnimateSuicune: ; e5441 (39:5441) + ld a, [wIntroSceneFrameCounter] + and $3 + jr z, Intro_ColoredSuicuneFrameSwap + cp $3 + jr z, .PrepareForSuicuneSwap + ret + +.PrepareForSuicuneSwap: + xor a + ld [hBGMapMode], a + ret + +Intro_ColoredSuicuneFrameSwap: ; e5451 (39:5451) + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH +.loop + ld a, [hl] + and a + jr z, .skip + cp $80 + jr nc, .skip + xor $8 + ld [hl], a +.skip + inc hl + dec bc + ld a, c + or b + jr nz, .loop + ld a, $1 + ld [hBGMapMode], a + ret + +Intro_RustleGrass: ; e546d (39:546d) + ld a, [wIntroSceneFrameCounter] + cp 36 + ret nc + and $c + srl a + ld e, a + ld d, $0 + ld hl, .RustlingGrassPointers + add hl, de + ld a, [hli] + ld [wRequested2bppSource], a + ld a, [hli] + ld [wRequested2bppSource + 1], a + ld a, LOW(vTiles2 tile $09) + ld [wRequested2bppDest], a + ld a, HIGH(vTiles2 tile $09) + ld [wRequested2bppDest + 1], a + ld a, 4 + ld [wRequested2bppSize], a + ret +; e5496 (39:5496) + +.RustlingGrassPointers: ; e5496 + dw IntroGrass1GFX + dw IntroGrass2GFX + dw IntroGrass3GFX + dw IntroGrass2GFX +; e549e + +Intro_SetCGBPalUpdate: ; e549e (39:549e) + ld a, $1 + ld [hCGBPalUpdate], a + ret + +Intro_ClearBGPals: ; e54a3 (39:54a3) + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + + ld hl, wBGPals2 + ld bc, 16 palettes + xor a + call ByteFill + + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + call DelayFrame + call DelayFrame + ret + +Intro_DecompressRequest2bpp_128Tiles: ; e54c2 (39:54c2) + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $80 + call Request2bpp + + pop af + ld [rSVBK], a + ret + +Intro_DecompressRequest2bpp_255Tiles: ; e54de (39:54de) + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $ff + call Request2bpp + + pop af + ld [rSVBK], a + ret + +Intro_DecompressRequest2bpp_64Tiles: ; e54fa (39:54fa) + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $40 + call Request2bpp + + pop af + ld [rSVBK], a + ret + +Intro_ResetLYOverrides: ; e5516 (39:5516) + ld a, [rSVBK] + push af + ld a, BANK(wLYOverrides) + ld [rSVBK], a + + ld hl, wLYOverrides + ld bc, wLYOverridesEnd - wLYOverrides + xor a + call ByteFill + + pop af + ld [rSVBK], a + ld a, rSCX - $ff00 + ld [hLCDCPointer], a + ret + +Intro_PerspectiveScrollBG: ; e552f (39:552f) + ld a, [rSVBK] + push af + ld a, BANK(wLYOverrides) + ld [rSVBK], a + ; Scroll the grass every frame. + ; Scroll the trees every other frame and at half speed. + ; This creates an illusion of perspective. + ld a, [wIntroSceneFrameCounter] + and $1 + jr z, .skip + ; trees in the back + ld hl, wLYOverrides + ld a, [hl] + inc a + ld bc, $5f + call ByteFill +.skip + ; grass in the front + ld hl, wLYOverrides + $5f + ld a, [hl] + inc a + inc a + ld bc, $31 + call ByteFill + ld a, [wLYOverrides + 0] + ld [hSCX], a + pop af + ld [rSVBK], a + ret + +IntroSuicuneRunGFX: ; e555d +INCBIN "gfx/intro/suicune_run.2bpp.lz" +; e592d + +IntroPichuWooperGFX: ; e592d +INCBIN "gfx/intro/pichu_wooper.2bpp.lz" +; e5c7d + +IntroBackgroundGFX: ; e5c7d +INCBIN "gfx/intro/background.2bpp.lz" +; e5e6d + +IntroTilemap004: ; e5e6d +INCBIN "gfx/intro/004.tilemap.lz" +; e5ecd + +IntroTilemap003: ; e5ecd +INCBIN "gfx/intro/003.tilemap.lz" +; e5edd + +IntroPalette1: ; e5edd +INCLUDE "gfx/intro/intro_1.pal" +; e5f5d + +IntroUnownsGFX: ; e5f5d +INCBIN "gfx/intro/unowns.2bpp.lz" +; e634d + +IntroPulseGFX: ; e634d +INCBIN "gfx/intro/pulse.2bpp.lz" +; e63dd + +IntroTilemap002: ; e63dd +INCBIN "gfx/intro/002.tilemap.lz" +; e641d + +IntroTilemap001: ; e641d +INCBIN "gfx/intro/001.tilemap.lz" +; e642d + +IntroTilemap006: ; e642d +INCBIN "gfx/intro/006.tilemap.lz" +; e647d + +IntroTilemap005: ; e647d +INCBIN "gfx/intro/005.tilemap.lz" +; e649d + +IntroTilemap008: ; e649d +INCBIN "gfx/intro/008.tilemap.lz" +; e655d + +IntroTilemap007: ; e655d +INCBIN "gfx/intro/007.tilemap.lz" +; e65ad + +IntroPalette2: ; e65ad +INCLUDE "gfx/intro/intro_2.pal" +; e662d + +IntroCrystalUnownsGFX: ; e662d +INCBIN "gfx/intro/crystal_unowns.2bpp.lz" +; e672d + +IntroTilemap017: ; e672d +INCBIN "gfx/intro/017.tilemap.lz" +; e676d + +IntroTilemap015: ; e676d +INCBIN "gfx/intro/015.tilemap.lz" +; e679d + +IntroPalette3: ; e679d +INCLUDE "gfx/intro/intro_3.pal" +; e681d + +IntroSuicuneCloseGFX: ; e681d +INCBIN "gfx/intro/suicune_close.2bpp.lz" +; e6c3d + +IntroTilemap012: ; e6c3d +INCBIN "gfx/intro/012.tilemap.lz" +; e6d0d + +IntroTilemap011: ; e6d0d +INCBIN "gfx/intro/011.tilemap.lz" +; e6d6d + +IntroPalette4: ; e6d6d +INCLUDE "gfx/intro/intro_4.pal" +; e6ded + +IntroSuicuneJumpGFX: ; e6ded +INCBIN "gfx/intro/suicune_jump.2bpp.lz" +; e72ad + +IntroSuicuneBackGFX: ; e72ad +INCBIN "gfx/intro/suicune_back.2bpp.lz" +; e764d + +IntroTilemap010: ; e764d +INCBIN "gfx/intro/010.tilemap.lz" +; e76ad + +IntroTilemap009: ; e76ad +INCBIN "gfx/intro/009.tilemap.lz" +; e76bd + +IntroTilemap014: ; e76bd +INCBIN "gfx/intro/014.tilemap.lz" +; e778d + +IntroTilemap013: ; e778d +INCBIN "gfx/intro/013.tilemap.lz" +; e77dd + +IntroPalette5: ; e77dd +INCLUDE "gfx/intro/intro_5.pal" + +IntroUnownBackGFX: ; e785d +INCBIN "gfx/intro/unown_back.2bpp.lz" +; e799d + +IntroGrass1GFX: ; e799d +INCBIN "gfx/intro/grass1.2bpp" +IntroGrass2GFX: ; e79dd +INCBIN "gfx/intro/grass2.2bpp" +IntroGrass3GFX: ; e7a1d +INCBIN "gfx/intro/grass3.2bpp" +IntroGrass4GFX: ; e7a5d +INCBIN "gfx/intro/grass4.2bpp" diff --git a/engine/title/init_hof_credits.asm b/engine/title/init_hof_credits.asm new file mode 100644 index 000000000..e8e98a0e1 --- /dev/null +++ b/engine/title/init_hof_credits.asm @@ -0,0 +1,79 @@ +InitDisplayForHallOfFame: ; 4e881 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + call LoadStandardFont + call LoadFontsBattleExtra + hlbgcoord 0, 0 + ld bc, vBGMap1 - vBGMap0 + ld a, " " + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + xor a + ld [hSCY], a + ld [hSCX], a + call EnableLCD + ld hl, .SavingRecordDontTurnOff + call PrintText + call WaitBGMap2 + call SetPalettes + ret + +.SavingRecordDontTurnOff: ; 0x4e8bd + ; SAVING RECORD… DON'T TURN OFF! + text_jump UnknownText_0x1bd39e + db "@" + +InitDisplayForRedCredits: ; 4e8c2 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + call LoadStandardFont + call LoadFontsBattleExtra + hlbgcoord 0, 0 + ld bc, vBGMap1 - vBGMap0 + ld a, " " + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + ld hl, wBGPals1 + ld c, 4 tiles +.load_white_palettes + ld a, LOW(PALRGB_WHITE) + ld [hli], a + ld a, HIGH(PALRGB_WHITE) + ld [hli], a + dec c + jr nz, .load_white_palettes + xor a + ld [hSCY], a + ld [hSCX], a + call EnableLCD + call WaitBGMap2 + call SetPalettes + ret + +ResetDisplayBetweenHallOfFameMons: ; 4e906 + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + ld hl, wDecompressScratch + ld bc, wScratchAttrMap - wDecompressScratch + ld a, " " + call ByteFill + hlbgcoord 0, 0 + ld de, wDecompressScratch + ld b, 0 + ld c, 4 tiles + call Request2bpp + pop af + ld [rSVBK], a + ret diff --git a/engine/title/title.asm b/engine/title/title.asm new file mode 100644 index 000000000..f311f2342 --- /dev/null +++ b/engine/title/title.asm @@ -0,0 +1,402 @@ +_TitleScreen: ; 10ed67 + + call ClearBGPalettes + call ClearSprites + call ClearTileMap + +; Turn BG Map update off + xor a + ld [hBGMapMode], a + +; Reset timing variables + ld hl, wJumptableIndex + ld [hli], a ; wJumptableIndex + ld [hli], a ; wIntroSceneFrameCounter + ld [hli], a ; wTitleScreenTimer + ld [hl], a ; wTitleScreenTimer + 1 + +; Turn LCD off + call DisableLCD + + +; VRAM bank 1 + ld a, 1 + ld [rVBK], a + + +; Decompress running Suicune gfx + ld hl, TitleSuicuneGFX + ld de, vTiles1 + call Decompress + + +; Clear screen palettes + hlbgcoord 0, 0 + ld bc, 20 * BG_MAP_WIDTH + xor a + call ByteFill + + +; Fill tile palettes: + +; BG Map 1: + +; line 0 (copyright) + hlbgcoord 0, 0, vBGMap1 + ld bc, BG_MAP_WIDTH + ld a, 7 ; palette + call ByteFill + + +; BG Map 0: + +; Apply logo gradient: + +; lines 3-4 + hlbgcoord 0, 3 + ld bc, 2 * BG_MAP_WIDTH + ld a, 2 + call ByteFill +; line 5 + hlbgcoord 0, 5 + ld bc, BG_MAP_WIDTH + ld a, 3 + call ByteFill +; line 6 + hlbgcoord 0, 6 + ld bc, BG_MAP_WIDTH + ld a, 4 + call ByteFill +; line 7 + hlbgcoord 0, 7 + ld bc, BG_MAP_WIDTH + ld a, 5 + call ByteFill +; lines 8-9 + hlbgcoord 0, 8 + ld bc, 2 * BG_MAP_WIDTH + ld a, 6 + call ByteFill + + +; 'CRYSTAL VERSION' + hlbgcoord 5, 9 + ld bc, NAME_LENGTH ; length of version text + ld a, 1 + call ByteFill + +; Suicune gfx + hlbgcoord 0, 12 + ld bc, 6 * BG_MAP_WIDTH ; the rest of the screen + ld a, 0 | VRAM_BANK_1 + call ByteFill + + +; Back to VRAM bank 0 + ld a, $0 + ld [rVBK], a + + +; Decompress logo + ld hl, TitleLogoGFX + ld de, vTiles1 + call Decompress + +; Decompress background crystal + ld hl, TitleCrystalGFX + ld de, vTiles0 + call Decompress + + +; Clear screen tiles + hlbgcoord 0, 0 + ld bc, 64 * BG_MAP_WIDTH + ld a, " " + call ByteFill + +; Draw Pokemon logo + hlcoord 0, 3 + lb bc, 7, 20 + ld d, $80 + ld e, $14 + call DrawTitleGraphic + +; Draw copyright text + hlbgcoord 3, 0, vBGMap1 + lb bc, 1, 13 + ld d, $c + ld e, $10 + call DrawTitleGraphic + +; Initialize running Suicune? + ld d, $0 + call LoadSuicuneFrame + +; Initialize background crystal + call InitializeBackground + +; Save WRAM bank + ld a, [rSVBK] + push af +; WRAM bank 5 + ld a, BANK(wBGPals1) + ld [rSVBK], a + +; Update palette colors + ld hl, TitleScreenPalettes + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + + ld hl, TitleScreenPalettes + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + +; Restore WRAM bank + pop af + ld [rSVBK], a + + +; LY/SCX trickery starts here + + ld a, [rSVBK] + push af + ld a, BANK(wLYOverrides) + ld [rSVBK], a + +; Make alternating lines come in from opposite sides + +; (This part is actually totally pointless, you can't +; see anything until these values are overwritten!) + + ld b, 80 / 2 ; alternate for 80 lines + ld hl, wLYOverrides +.loop +; $00 is the middle position + ld [hl], +112 ; coming from the left + inc hl + ld [hl], -112 ; coming from the right + inc hl + dec b + jr nz, .loop + +; Make sure the rest of the buffer is empty + ld hl, wLYOverrides + 80 + xor a + ld bc, wLYOverridesEnd - (wLYOverrides + 80) + call ByteFill + +; Let LCD Stat know we're messing around with SCX + ld a, rSCX - $ff00 + ld [hLCDCPointer], a + + pop af + ld [rSVBK], a + + +; Reset audio + call ChannelsOff + call EnableLCD + +; Set sprite size to 8x16 + ld a, [rLCDC] + set rLCDC_SPRITE_SIZE, a + ld [rLCDC], a + + ld a, +112 + ld [hSCX], a + ld a, 8 + ld [hSCY], a + ld a, 7 + ld [hWX], a + ld a, -112 + ld [hWY], a + + ld a, $1 + ld [hCGBPalUpdate], a + +; Update BG Map 0 (bank 0) + ld [hBGMapMode], a + + xor a + ld [wBGPals1 + 2], a + +; Play starting sound effect + call SFXChannelsOff + ld de, SFX_TITLE_SCREEN_ENTRANCE + call PlaySFX + + ret +; 10eea7 + +SuicuneFrameIterator: ; 10eea7 + ld hl, wBGPals1 + 2 + ld a, [hl] + ld c, a + inc [hl] + +; Only do this once every eight frames + and %111 + ret nz + + ld a, c + and %11000 + sla a + swap a + ld e, a + ld d, $0 + ld hl, .Frames + add hl, de + ld d, [hl] + xor a + ld [hBGMapMode], a + call LoadSuicuneFrame + ld a, $1 + ld [hBGMapMode], a + ld a, $3 + ld [hBGMapThird], a + ret +; 10eece + +.Frames: ; 10eece + db $80 ; vTiles4 tile $00 + db $88 ; vTiles4 tile $08 + db $00 ; vTiles5 tile $00 + db $08 ; vTiles5 tile $08 +; 10eed2 + + +LoadSuicuneFrame: ; 10eed2 + hlcoord 6, 12 + ld b, 6 +.bgrows + ld c, 8 +.col + ld a, d + ld [hli], a + inc d + dec c + jr nz, .col + ld a, SCREEN_WIDTH - 8 + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, 8 + add d + ld d, a + dec b + jr nz, .bgrows + ret +; 10eeef + +DrawTitleGraphic: ; 10eeef +; input: +; hl: draw location +; b: height +; c: width +; d: tile to start drawing from +; e: number of tiles to advance for each bgrows +.bgrows + push de + push bc + push hl +.col + ld a, d + ld [hli], a + inc d + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + pop de + ld a, e + add d + ld d, a + dec b + jr nz, .bgrows + ret +; 10ef06 + +InitializeBackground: ; 10ef06 + ld hl, wVirtualOAMSprite00 + ld d, -$22 + ld e, $0 + ld c, 5 +.loop + push bc + call .InitColumn + pop bc + ld a, $10 + add d + ld d, a + dec c + jr nz, .loop + ret +; 10ef1c + +.InitColumn: ; 10ef1c + ld c, $6 + ld b, $40 +.loop2 + ld a, d + ld [hli], a ; y + ld a, b + ld [hli], a ; x + add $8 + ld b, a + ld a, e + ld [hli], a ; tile id + inc e + inc e + ld a, 0 | PRIORITY + ld [hli], a ; attributes + dec c + jr nz, .loop2 + ret +; 10ef32 + + +AnimateTitleCrystal: ; 10ef32 +; Move the title screen crystal downward until it's fully visible + +; Stop at y=6 +; y is really from the bottom of the sprite, which is two tiles high + ld hl, wVirtualOAMSprite00YCoord + ld a, [hl] + cp 6 + 2 * TILE_WIDTH + ret z + +; Move all 30 parts of the crystal down by 2 + ld c, 30 +.loop + ld a, [hl] + add 2 + ld [hli], a ; y +rept SPRITEOAMSTRUCT_LENGTH + -1 + inc hl +endr + dec c + jr nz, .loop + + ret +; 10ef46 + +TitleSuicuneGFX: ; 10ef46 +INCBIN "gfx/title/suicune.2bpp.lz" +; 10f326 + +TitleLogoGFX: ; 10f326 +INCBIN "gfx/title/logo.2bpp.lz" +; 10fcee + +TitleCrystalGFX: ; 10fcee +INCBIN "gfx/title/crystal.2bpp.lz" +; 10fede + +TitleScreenPalettes: +INCLUDE "gfx/title/title.pal" diff --git a/engine/title/unused_title.asm b/engine/title/unused_title.asm new file mode 100644 index 000000000..8e52a71bb --- /dev/null +++ b/engine/title/unused_title.asm @@ -0,0 +1,178 @@ +UnusedTitleScreen: ; 10c000 + + call ClearBGPalettes + call ClearTileMap + call DisableLCD + +; Turn BG Map update off + xor a + ld [hBGMapMode], a + +; Reset timing variables + ld hl, wJumptableIndex + ld [hli], a ; wJumptableIndex + ld [hli], a ; wIntroSceneFrameCounter + ld [hli], a ; wTitleScreenTimer + ld [hl], a ; wTitleScreenTimer + 1 + + ld hl, UnusedTitleBG_GFX + ld de, vTiles2 + ld bc, vBGMap0 - vTiles2 + call CopyBytes + + ld hl, UnusedTitleBG_GFX + $80 tiles + ld de, vTiles1 + ld bc, vTiles2 - vTiles1 + call CopyBytes + + ld hl, UnusedTitleFG_GFX + ld de, vTiles0 + ld bc, vTiles1 - vTiles0 + call CopyBytes + + ld hl, UnusedTitleBG_Tilemap + debgcoord 0, 0 + ld bc, BG_MAP_WIDTH * BG_MAP_HEIGHT +.copy + ld a, 0 + ld [rVBK], a + ld a, [hli] + ld [de], a + ld a, 1 + ld [rVBK], a + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .copy + + ld hl, UnusedTitleFG_OAM + ld de, wVirtualOAMSprite00 + ld bc, SPRITEOAMSTRUCT_LENGTH * NUM_SPRITE_OAM_STRUCTS + call CopyBytes + + call EnableLCD + ld a, [rLCDC] + set rLCDC_SPRITES_ENABLE, a + set rLCDC_SPRITE_SIZE, a + ld [rLCDC], a + + call DelayFrame + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld hl, UnusedTitleBG_Palettes + ld de, wBGPals1 + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleFG_Palettes + ld de, wOBPals1 + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleBG_Palettes + ld de, wBGPals2 + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleFG_Palettes + ld de, wOBPals2 + ld bc, 8 palettes + call CopyBytes + + pop af + ld [rSVBK], a + + ld a, $1 + ld [hCGBPalUpdate], a + + ld de, MUSIC_TITLE + call PlayMusic + + ret +; 10c0b1 + +UnusedTitleBG_GFX: ; 10c0b1 +INCBIN "gfx/title/old_bg.2bpp" +; 10d0b1 + +UnusedTitleBG_Tilemap: ; 10d0b1 +; 32x32 (alternating tiles and attributes) +INCBIN "gfx/title/old_bg.tilemap" +; 10d8b1 + +UnusedTitleBG_Palettes: ; 10d8b1 +INCLUDE "gfx/title/old_bg.pal" +; 10dab1 + +UnusedTitleFG_GFX: ; 10dab1 +INCBIN "gfx/title/old_fg.2bpp" +; 10eab1 + +UnusedTitleFG_Palettes: ; 10eab1 +INCLUDE "gfx/title/old_fg.pal" +; 10ecb1 + +UnusedTitleFG_OAM: ; 10ecb1 + dsprite 3, 0, 7, 0, $00, 1 + dsprite 3, 0, 8, 0, $02, 1 + dsprite 3, 0, 9, 0, $04, 1 + dsprite 3, 0, 10, 0, $06, 1 + dsprite 3, 0, 11, 0, $08, 1 + dsprite 3, 0, 12, 0, $0a, 1 + dsprite 3, 0, 13, 0, $0c, 1 + dsprite 3, 0, 14, 0, $0e, 1 + dsprite 5, 0, 7, 0, $10, 0 + dsprite 5, 0, 8, 0, $12, 0 + dsprite 5, 0, 9, 0, $14, 0 + dsprite 5, 0, 10, 0, $16, 0 + dsprite 5, 0, 11, 0, $18, 0 + dsprite 5, 0, 12, 0, $1a, 0 + dsprite 5, 0, 13, 0, $1c, 0 + dsprite 5, 0, 14, 0, $1e, 0 + dsprite 7, 0, 7, 0, $20, 0 + dsprite 7, 0, 8, 0, $22, 0 + dsprite 7, 0, 9, 0, $24, 0 + dsprite 7, 0, 10, 0, $26, 0 + dsprite 7, 0, 11, 0, $28, 0 + dsprite 7, 0, 12, 0, $2a, 0 + dsprite 7, 0, 13, 0, $2c, 0 + dsprite 7, 0, 14, 0, $2e, 0 + dsprite 9, 0, 7, 0, $30, 2 + dsprite 9, 0, 8, 0, $32, 2 + dsprite 9, 0, 9, 0, $34, 2 + dsprite 9, 0, 10, 0, $36, 2 + dsprite 9, 0, 11, 0, $38, 2 + dsprite 9, 0, 12, 0, $3a, 2 + dsprite 9, 0, 13, 0, $3c, 2 + dsprite 9, 0, 14, 0, $3e, 2 + dsprite 11, 0, 7, 0, $40, 1 + dsprite 11, 0, 8, 0, $42, 1 + dsprite 11, 0, 9, 0, $44, 1 + dsprite 11, 0, 10, 0, $46, 1 + dsprite 11, 0, 11, 0, $48, 1 + dsprite 11, 0, 12, 0, $4a, 1 + dsprite 11, 0, 13, 0, $4c, 1 + dsprite 11, 0, 14, 0, $4e, 1 +; 10ed51 + +Function10ed51: ; 10ed51 + call _TitleScreen +.loop + call JoyTextDelay + ld a, [hJoyLast] + ld b, a + and 1 + jr nz, .done + call SuicuneFrameIterator + call DelayFrame + jr .loop +.done + ret +; 10ed67 diff --git a/engine/tmhm.asm b/engine/tmhm.asm deleted file mode 100755 index 9db3dc291..000000000 --- a/engine/tmhm.asm +++ /dev/null @@ -1,49 +0,0 @@ -CanLearnTMHMMove: ; 11639 - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - call GetBaseData - ld hl, wBaseTMHM - push hl - - ld a, [wPutativeTMHMMove] - ld b, a - ld c, 0 - ld hl, TMHMMoves -.loop - ld a, [hli] - and a - jr z, .end - cp b - jr z, .asm_11659 - inc c - jr .loop - -.asm_11659 - pop hl - ld b, CHECK_FLAG - push de - ld d, 0 - predef SmallFarFlagAction - pop de - ret - -.end - pop hl - ld c, 0 - ret -; 1166a - -GetTMHMMove: ; 1166a - ld a, [wd265] - dec a - ld hl, TMHMMoves - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - ld [wd265], a - ret -; 1167a - - -INCLUDE "data/moves/tmhm_moves.asm" diff --git a/engine/tmhm2.asm b/engine/tmhm2.asm deleted file mode 100755 index 442f73cfa..000000000 --- a/engine/tmhm2.asm +++ /dev/null @@ -1,589 +0,0 @@ -TMHMPocket: ; 2c76f (b:476f) - ld a, $1 - ld [hInMenu], a - call TMHM_PocketLoop - ld a, $0 - ld [hInMenu], a - ret nc - call PlaceHollowCursor - call WaitBGMap - ld a, [wCurItem] - dec a - ld [wCurItemQuantity], a - ld hl, wTMsHMs - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - ld [wItemQuantityBuffer], a - call .ConvertItemToTMHMNumber - scf - ret - -.ConvertItemToTMHMNumber: ; 2c798 (b:4798) - ld a, [wCurItem] - ld c, a - callfar GetNumberedTMHM - ld a, c - ld [wCurItem], a - ret - -ConvertCurItemIntoCurTMHM: ; 2c7a7 (b:47a7) - ld a, [wCurItem] - ld c, a - callfar GetTMHMNumber - ld a, c - ld [wCurTMHM], a - ret - -GetTMHMItemMove: ; 2c7b6 (b:47b6) - call ConvertCurItemIntoCurTMHM - predef GetTMHMMove - ret - -AskTeachTMHM: ; 2c7bf (b:47bf) - ld hl, wOptions - ld a, [hl] - push af - res NO_TEXT_SCROLL, [hl] - ld a, [wCurItem] - cp TM01 - jr c, .NotTMHM - call GetTMHMItemMove - ld a, [wCurTMHM] - ld [wPutativeTMHMMove], a - call GetMoveName - call CopyName1 - ld hl, Text_BootedTM ; Booted up a TM - ld a, [wCurItem] - cp HM01 - jr c, .TM - ld hl, Text_BootedHM ; Booted up an HM -.TM: - call PrintText - ld hl, Text_ItContained - call PrintText - call YesNoBox -.NotTMHM: - pop bc - ld a, b - ld [wOptions], a - ret - -ChooseMonToLearnTMHM: ; 2c7fb - ld hl, wStringBuffer2 - ld de, wTMHMMoveNameBackup - ld bc, 12 - call CopyBytes - call ClearBGPalettes -ChooseMonToLearnTMHM_NoRefresh: ; 2c80a - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX - ld a, PARTYMENUACTION_TEACH_TMHM - ld [wPartyMenuActionText], a -.loopback - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes - call DelayFrame - farcall PartyMenuSelect - push af - ld a, [wCurPartySpecies] - cp EGG - pop bc ; now contains the former contents of af - jr z, .egg - push bc - ld hl, wTMHMMoveNameBackup - ld de, wStringBuffer2 - ld bc, 12 - call CopyBytes - pop af ; now contains the original contents of af - ret - -.egg - push hl - push de - push bc - push af - ld de, SFX_WRONG - call PlaySFX - call WaitSFX - pop af - pop bc - pop de - pop hl - jr .loopback -; 2c867 - -TeachTMHM: ; 2c867 - predef CanLearnTMHMMove - - push bc - ld a, [wCurPartyMon] - ld hl, wPartyMonNicknames - call GetNick - pop bc - - ld a, c - and a - jr nz, .compatible - push de - ld de, SFX_WRONG - call PlaySFX - pop de - ld hl, Text_TMHMNotCompatible - call PrintText - jr .nope - -.compatible - callfar KnowsMove - jr c, .nope - - predef LearnMove - ld a, b - and a - jr z, .nope - - farcall StubbedTrainerRankings_TMsHMsTaught - ld a, [wCurItem] - call IsHM - ret c - - ld c, HAPPINESS_LEARNMOVE - callfar ChangeHappiness - call ConsumeTM - jr .learned_move - -.nope - and a - ret - -.unused - ld a, 2 - ld [wItemEffectSucceeded], a -.learned_move - scf - ret -; 2c8bf (b:48bf) - -Text_BootedTM: ; 0x2c8bf - ; Booted up a TM. - text_jump UnknownText_0x1c0373 - db "@" -; 0x2c8c4 - -Text_BootedHM: ; 0x2c8c4 - ; Booted up an HM. - text_jump UnknownText_0x1c0384 - db "@" -; 0x2c8c9 - -Text_ItContained: ; 0x2c8c9 - ; It contained @ . Teach @ to a #MON? - text_jump UnknownText_0x1c0396 - db "@" -; 0x2c8ce - -Text_TMHMNotCompatible: ; 0x2c8ce - ; is not compatible with @ . It can't learn @ . - text_jump UnknownText_0x1c03c2 - db "@" -; 0x2c8d3 - -TMHM_PocketLoop: ; 2c8d3 (b:48d3) - xor a - ld [hBGMapMode], a - call TMHM_DisplayPocketItems - ld a, 2 - ld [w2DMenuCursorInitY], a - ld a, 7 - ld [w2DMenuCursorInitX], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, 5 - sub d - inc a - cp 6 - jr nz, .okay - dec a -.okay - ld [w2DMenuNumRows], a - ld a, $c - ld [w2DMenuFlags1], a - xor a - ld [w2DMenuFlags2], a - ld a, $20 - ld [w2DMenuCursorOffsets], a - ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN | D_LEFT | D_RIGHT - ld [wMenuJoypadFilter], a - ld a, [wTMHMPocketCursor] - inc a - ld [wMenuCursorY], a - ld a, $1 - ld [wMenuCursorX], a - jr TMHM_ShowTMMoveDescription - -TMHM_JoypadLoop: ; 2c915 (b:4915) - call TMHM_DisplayPocketItems - call StaticMenuJoypad - ld b, a - ld a, [wMenuCursorY] - dec a - ld [wTMHMPocketCursor], a - xor a - ld [hBGMapMode], a - ld a, [w2DMenuFlags2] - bit 7, a - jp nz, TMHM_ScrollPocket - ld a, b - ld [wMenuJoypad], a - bit A_BUTTON_F, a - jp nz, TMHM_ChooseTMorHM - bit B_BUTTON_F, a - jp nz, TMHM_ExitPack - bit D_RIGHT_F, a - jp nz, TMHM_ExitPocket - bit D_LEFT_F, a - jp nz, TMHM_ExitPocket -TMHM_ShowTMMoveDescription: ; 2c946 (b:4946) - call TMHM_CheckHoveringOverCancel - jp nc, TMHM_ExitPocket - hlcoord 0, 12 - ld b, 4 - ld c, SCREEN_WIDTH - 2 - call TextBox - ld a, [wCurItem] - cp NUM_TMS + NUM_HMS + 1 - jr nc, TMHM_JoypadLoop - ld [wd265], a - predef GetTMHMMove - ld a, [wd265] - ld [wCurSpecies], a - hlcoord 1, 14 - call PrintMoveDesc - jp TMHM_JoypadLoop - -TMHM_ChooseTMorHM: ; 2c974 (b:4974) - call TMHM_PlaySFX_ReadText2 - call CountTMsHMs ; This stores the count to wd265. - ld a, [wMenuCursorY] - dec a - ld b, a - ld a, [wTMHMPocketScrollPosition] - add b - ld b, a - ld a, [wd265] - cp b - jr z, _TMHM_ExitPack ; our cursor was hovering over CANCEL -TMHM_CheckHoveringOverCancel: ; 2c98a (b:498a) - call TMHM_GetCurrentPocketPosition - ld a, [wMenuCursorY] - ld b, a -.loop - inc c - ld a, c - cp NUM_TMS + NUM_HMS + 1 - jr nc, .okay - ld a, [hli] - and a - jr z, .loop - dec b - jr nz, .loop - ld a, c -.okay - ld [wCurItem], a - cp -1 - ret - -TMHM_ExitPack: ; 2c9a5 (b:49a5) - call TMHM_PlaySFX_ReadText2 -_TMHM_ExitPack: ; 2c9a8 (b:49a8) - ld a, $2 - ld [wMenuJoypad], a - and a - ret - -TMHM_ExitPocket: ; 2c9af (b:49af) - and a - ret - -TMHM_ScrollPocket: ; 2c9b1 (b:49b1) - ld a, b - bit 7, a - jr nz, .skip - ld hl, wTMHMPocketScrollPosition - ld a, [hl] - and a - jp z, TMHM_JoypadLoop - dec [hl] - call TMHM_DisplayPocketItems - jp TMHM_ShowTMMoveDescription - -.skip - call TMHM_GetCurrentPocketPosition - ld b, 5 -.loop - inc c - ld a, c - cp NUM_TMS + NUM_HMS + 1 - jp nc, TMHM_JoypadLoop - ld a, [hli] - and a - jr z, .loop - dec b - jr nz, .loop - ld hl, wTMHMPocketScrollPosition - inc [hl] - call TMHM_DisplayPocketItems - jp TMHM_ShowTMMoveDescription - -TMHM_DisplayPocketItems: ; 2c9e2 (b:49e2) - ld a, [wBattleType] - cp BATTLETYPE_TUTORIAL - jp z, Tutorial_TMHMPocket - - hlcoord 5, 2 - lb bc, 10, 15 - ld a, " " - call ClearBox - call TMHM_GetCurrentPocketPosition - ld d, $5 -.loop2 - inc c - ld a, c - cp NUM_TMS + NUM_HMS + 1 - jr nc, .NotTMHM - ld a, [hli] - and a - jr z, .loop2 - ld b, a - ld a, c - ld [wd265], a - push hl - push de - push bc - call TMHMPocket_GetCurrentLineCoord - push hl - ld a, [wd265] - cp NUM_TMS + 1 - jr nc, .HM - ld de, wd265 - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - jr .okay - -.HM: - push af - sub NUM_TMS - ld [wd265], a - ld [hl], "H" - inc hl - ld de, wd265 - lb bc, PRINTNUM_RIGHTALIGN | 1, 2 - call PrintNum - pop af - ld [wd265], a -.okay - predef GetTMHMMove - ld a, [wd265] - ld [wPutativeTMHMMove], a - call GetMoveName - pop hl - ld bc, 3 - add hl, bc - push hl - call PlaceString - pop hl - pop bc - ld a, c - push bc - cp NUM_TMS + 1 - jr nc, .hm2 - ld bc, SCREEN_WIDTH + 9 - add hl, bc - ld [hl], "×" - inc hl - ld a, "0" ; why are we doing this? - pop bc - push bc - ld a, b - ld [wd265], a - ld de, wd265 - lb bc, 1, 2 - call PrintNum -.hm2 - pop bc - pop de - pop hl - dec d - jr nz, .loop2 - jr .done - -.NotTMHM: - call TMHMPocket_GetCurrentLineCoord - inc hl - inc hl - inc hl - push de - ld de, TMHM_String_Cancel - call PlaceString - pop de -.done - ret - -TMHMPocket_GetCurrentLineCoord: ; 2ca86 (b:4a86) - hlcoord 5, 0 - ld bc, 2 * SCREEN_WIDTH - ld a, 6 - sub d - ld e, a - ; AddNTimes -.loop - add hl, bc - dec e - jr nz, .loop - ret -; 2ca95 (b:4a95) - -Unreferenced_Function2ca95: ; 2ca95 - pop hl - ld bc, 3 - add hl, bc - predef GetTMHMMove - ld a, [wd265] - ld [wPutativeTMHMMove], a - call GetMoveName - push hl - call PlaceString - pop hl - ret -; 2caae - -TMHM_String_Cancel: ; 2caae - db "CANCEL@" -; 2cab5 - -TMHM_GetCurrentPocketPosition: ; 2cab5 (b:4ab5) - ld hl, wTMsHMs - ld a, [wTMHMPocketScrollPosition] - ld b, a - inc b - ld c, 0 -.loop - inc c - ld a, [hli] - and a - jr z, .loop - dec b - jr nz, .loop - dec hl - dec c - ret - -Tutorial_TMHMPocket: ; 2caca (b:4aca) - hlcoord 9, 3 - push de - ld de, TMHM_String_Cancel - call PlaceString - pop de - ret - -TMHM_PlaySFX_ReadText2: ; 2cad6 (b:4ad6) - push de - ld de, SFX_READ_TEXT_2 - call PlaySFX - pop de - ret -; 2cadf (b:4adf) - -Unreferenced_Function2cadf: ; 2cadf - call ConvertCurItemIntoCurTMHM - call .CheckHaveRoomForTMHM - ld hl, .NoRoomText - jr nc, .print - ld hl, .ReceivedText -.print - jp PrintText -; 2caf0 - -.NoRoomText: ; 0x2caf0 - ; You have no room for any more @ S. - text_jump UnknownText_0x1c03fa - db "@" -; 0x2caf5 - -.ReceivedText: ; 0x2caf5 - ; You received @ ! - text_jump UnknownText_0x1c0421 - db "@" -; 0x2cafa - -.CheckHaveRoomForTMHM: ; 2cafa - ld a, [wd265] - dec a - ld hl, wTMsHMs - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - inc a - cp NUM_TMS * 2 - ret nc - ld [hl], a - ret -; 2cb0c - -ConsumeTM: ; 2cb0c (b:4b0c) - call ConvertCurItemIntoCurTMHM - ld a, [wd265] - dec a - ld hl, wTMsHMs - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - and a - ret z - dec a - ld [hl], a - ret nz - ld a, [wTMHMPocketScrollPosition] - and a - ret z - dec a - ld [wTMHMPocketScrollPosition], a - ret - -CountTMsHMs: ; 2cb2a (b:4b2a) - ld b, 0 - ld c, NUM_TMS + NUM_HMS - ld hl, wTMsHMs -.loop - ld a, [hli] - and a - jr z, .skip - inc b -.skip - dec c - jr nz, .loop - ld a, b - ld [wd265], a - ret - -PrintMoveDesc: ; 2cb3e - push hl - ld hl, MoveDescriptions - ld a, [wCurSpecies] - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld a, [hli] - ld e, a - ld d, [hl] - pop hl - jp PlaceString -; 2cb52 diff --git a/engine/trade_animation.asm b/engine/trade_animation.asm deleted file mode 100755 index 04c31df80..000000000 --- a/engine/trade_animation.asm +++ /dev/null @@ -1,1646 +0,0 @@ -TRADEANIM_RIGHT_ARROW EQU $ed -TRADEANIM_LEFT_ARROW EQU $ee - -; TradeAnim_TubeAnimJumptable.Jumptable indexes - const_def - const TRADEANIMSTATE_0 ; 0 - const TRADEANIMSTATE_1 ; 1 - const TRADEANIMSTATE_2 ; 2 - const TRADEANIMSTATE_3 ; 3 -TRADEANIMJUMPTABLE_LENGTH EQU const_value - -TradeAnimation: ; 28f24 - xor a - ld [wcf66], a - ld hl, wPlayerTrademonSenderName - ld de, wOTTrademonSenderName - call LinkTradeAnim_LoadTradePlayerNames - ld hl, wPlayerTrademonSpecies - ld de, wOTTrademonSpecies - call LinkTradeAnim_LoadTradeMonSpecies - ld de, .script - jr RunTradeAnimScript - -.script - tradeanim_setup_givemon_scroll - tradeanim_show_givemon_data - tradeanim_do_givemon_scroll - tradeanim_wait_80 - tradeanim_wait_96 - tradeanim_poof - tradeanim_rocking_ball - tradeanim_enter_link_tube - tradeanim_wait_anim - tradeanim_bulge_through_tube - tradeanim_wait_anim - tradeanim_textbox_scroll - tradeanim_give_trademon_sfx - tradeanim_tube_to_ot - tradeanim_sent_to_ot_text - tradeanim_scroll_out_right - - tradeanim_ot_sends_text_1 - tradeanim_ot_bids_farewell - tradeanim_wait_40 - tradeanim_scroll_out_right - tradeanim_get_trademon_sfx - tradeanim_tube_to_player - tradeanim_enter_link_tube - tradeanim_drop_ball - tradeanim_exit_link_tube - tradeanim_wait_anim - tradeanim_show_getmon_data - tradeanim_poof - tradeanim_wait_anim - tradeanim_frontpic_scroll - tradeanim_animate_frontpic - tradeanim_wait_80_if_ot_egg - tradeanim_textbox_scroll - tradeanim_take_care_of_text - tradeanim_scroll_out_right - tradeanim_end - -TradeAnimationPlayer2: ; 28f63 - xor a - ld [wcf66], a - ld hl, wOTTrademonSenderName - ld de, wPlayerTrademonSenderName - call LinkTradeAnim_LoadTradePlayerNames - ld hl, wOTTrademonSpecies - ld de, wPlayerTrademonSpecies - call LinkTradeAnim_LoadTradeMonSpecies - ld de, .script - jr RunTradeAnimScript - -.script - tradeanim_ot_sends_text_2 - tradeanim_ot_bids_farewell - tradeanim_wait_40 - tradeanim_scroll_out_right - tradeanim_get_trademon_sfx - tradeanim_tube_to_ot - tradeanim_enter_link_tube - tradeanim_drop_ball - tradeanim_exit_link_tube - tradeanim_wait_anim - tradeanim_show_getmon_data - tradeanim_poof - tradeanim_wait_anim - tradeanim_frontpic_scroll - tradeanim_animate_frontpic - tradeanim_wait_180_if_ot_egg - tradeanim_textbox_scroll - tradeanim_take_care_of_text - tradeanim_scroll_out_right - - tradeanim_setup_givemon_scroll - tradeanim_show_givemon_data - tradeanim_do_givemon_scroll - tradeanim_wait_40 - tradeanim_poof - tradeanim_rocking_ball - tradeanim_enter_link_tube - tradeanim_wait_anim - tradeanim_bulge_through_tube - tradeanim_wait_anim - tradeanim_textbox_scroll - tradeanim_give_trademon_sfx - tradeanim_tube_to_player - tradeanim_sent_to_ot_text - tradeanim_scroll_out_right - tradeanim_end - -RunTradeAnimScript: ; 28fa1 - ld hl, wTradeAnimAddress - ld [hl], e - inc hl - ld [hl], d - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a - ld hl, wVramState - ld a, [hl] - push af - res 0, [hl] - ld hl, wOptions - ld a, [hl] - push af - set 4, [hl] - call .TradeAnimLayout - ld a, [wcf66] - and a - jr nz, .anim_loop - ld de, MUSIC_EVOLUTION - call PlayMusic2 -.anim_loop - call DoTradeAnimation - jr nc, .anim_loop - pop af - ld [wOptions], a - pop af - ld [wVramState], a - pop af - ld [hMapAnims], a - ret - -; 28fdb - -.TradeAnimLayout: ; 28fdb - xor a - ld [wJumptableIndex], a - call ClearBGPalettes - call ClearSprites - call ClearTileMap - call DisableLCD - call LoadFontsBattleExtra - callfar ClearSpriteAnims - ld a, [hCGB] - and a - jr z, .NotCGB - ld a, $1 - ld [rVBK], a - ld hl, vTiles0 - ld bc, sScratch - vTiles0 - xor a - call ByteFill - ld a, $0 - ld [rVBK], a - -.NotCGB: - hlbgcoord 0, 0 - ld bc, sScratch - vBGMap0 - ld a, " " - call ByteFill - ld hl, TradeGameBoyLZ - ld de, vTiles2 tile $31 - call Decompress - ld hl, TradeArrowGFX - ld de, vTiles0 tile TRADEANIM_RIGHT_ARROW - ld bc, 1 tiles - ld a, BANK(TradeArrowGFX) - call FarCopyBytes - ld hl, TradeArrowGFX + 1 tiles - ld de, vTiles0 tile TRADEANIM_LEFT_ARROW - ld bc, 1 tiles - ld a, BANK(TradeArrowGFX) - call FarCopyBytes - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall GetTrademonFrontpic - call EnableLCD - call LoadTradeBallAndCableGFX - ld a, [wPlayerTrademonSpecies] - ld hl, wPlayerTrademonDVs - ld de, vTiles0 - call TradeAnim_GetFrontpic - ld a, [wOTTrademonSpecies] - ld hl, wOTTrademonDVs - ld de, vTiles0 tile $31 - call TradeAnim_GetFrontpic - ld a, [wPlayerTrademonSpecies] - ld de, wPlayerTrademonSpeciesName - call TradeAnim_GetNickname - ld a, [wOTTrademonSpecies] - ld de, wOTTrademonSpeciesName - call TradeAnim_GetNickname - call TradeAnim_NormalPals - ret - -; 29082 - -DoTradeAnimation: ; 29082 - ld a, [wJumptableIndex] - bit 7, a - jr nz, .finished - call .DoTradeAnimCommand - callfar PlaySpriteAnimations - ld hl, wcf65 - inc [hl] - call DelayFrame - and a - ret - -.finished - call LoadStandardFont - scf - ret - -; 290a0 - -.DoTradeAnimCommand: ; 290a0 - 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 -; 290af - -.JumpTable: ; 290af -; entries correspond to macros/scripts/trade_anims.asm enumeration - dw TradeAnim_AdvanceScriptPointer ; 00 - dw TradeAnim_ShowGivemonData ; 01 - dw TradeAnim_ShowGetmonData ; 02 - dw TradeAnim_EnterLinkTube1 ; 03 - dw TradeAnim_EnterLinkTube2 ; 04 - dw TradeAnim_ExitLinkTube ; 05 - dw TradeAnim_TubeToOT1 ; 06 - dw TradeAnim_TubeToOT2 ; 07 - dw TradeAnim_TubeToOT3 ; 08 - dw TradeAnim_TubeToOT4 ; 09 - dw TradeAnim_TubeToOT5 ; 0a - dw TradeAnim_TubeToOT6 ; 0b - dw TradeAnim_TubeToOT7 ; 0c - dw TradeAnim_TubeToOT8 ; 0d - dw TradeAnim_TubeToPlayer1 ; 0e - dw TradeAnim_TubeToPlayer2 ; 0f - dw TradeAnim_TubeToPlayer3 ; 10 - dw TradeAnim_TubeToPlayer4 ; 11 - dw TradeAnim_TubeToPlayer5 ; 12 - dw TradeAnim_TubeToPlayer6 ; 13 - dw TradeAnim_TubeToPlayer7 ; 14 - dw TradeAnim_TubeToPlayer8 ; 15 - dw TradeAnim_SentToOTText ; 16 - dw TradeAnim_OTBidsFarewell ; 17 - dw TradeAnim_TakeCareOfText ; 18 - dw TradeAnim_OTSendsText1 ; 19 - dw TradeAnim_OTSendsText2 ; 1a - dw TradeAnim_SetupGivemonScroll ; 1b - dw TradeAnim_DoGivemonScroll ; 1c - dw TradeAnim_FrontpicScrollStart ; 1d - dw TradeAnim_TextboxScrollStart ; 1e - dw TradeAnim_ScrollOutRight ; 1f - dw TradeAnim_ScrollOutRight2 ; 20 - dw TraideAnim_Wait80 ; 21 - dw TraideAnim_Wait40 ; 22 - dw TradeAnim_RockingBall ; 23 - dw TradeAnim_DropBall ; 24 - dw TradeAnim_WaitAnim ; 25 - dw TradeAnim_WaitAnim2 ; 26 - dw TradeAnim_Poof ; 27 - dw TradeAnim_BulgeThroughTube ; 28 - dw TradeAnim_GiveTrademonSFX ; 29 - dw TradeAnim_GetTrademonSFX ; 2a - dw TradeAnim_End ; 2b - dw TradeAnim_AnimateFrontpic ; 2c - dw TraideAnim_Wait96 ; 2d - dw TraideAnim_Wait80IfOTEgg ; 2e - dw TraideAnim_Wait180IfOTEgg ; 2f -; 2910f - -TradeAnim_IncrementJumptableIndex: ; 2910f - ld hl, wJumptableIndex - inc [hl] - ret - -; 29114 - -TradeAnim_AdvanceScriptPointer: ; 29114 - ld hl, wTradeAnimAddress - ld e, [hl] - inc hl - ld d, [hl] - ld a, [de] - ld [wJumptableIndex], a - inc de - ld [hl], d - dec hl - ld [hl], e - ret - -; 29123 - -TradeAnim_End: ; 29123 - ld hl, wJumptableIndex - set 7, [hl] - ret - -; 29129 - -TradeAnim_TubeToOT1: ; 29129 - ld a, TRADEANIM_RIGHT_ARROW - call TradeAnim_PlaceTrademonStatsOnTubeAnim - ld a, [wLinkTradeSendmonSpecies] - ld [wd265], a - xor a - depixel 5, 11, 4, 0 - ld b, $0 - jr TradeAnim_InitTubeAnim - -TradeAnim_TubeToPlayer1: ; 2913c - ld a, TRADEANIM_LEFT_ARROW - call TradeAnim_PlaceTrademonStatsOnTubeAnim - ld a, [wLinkTradeGetmonSpecies] - ld [wd265], a - ld a, TRADEANIMSTATE_2 - depixel 9, 18, 4, 4 - ld b, $4 -TradeAnim_InitTubeAnim: ; 2914e - push bc - push de - push bc - push de - - push af - call DisableLCD - callfar ClearSpriteAnims - hlbgcoord 20, 3 - ld bc, 12 - ld a, $60 - call ByteFill - pop af - - call TradeAnim_TubeAnimJumptable - - xor a - ld [hSCX], a - ld a, $7 - ld [hWX], a - ld a, $70 - ld [hWY], a - call EnableLCD - call LoadTradeBubbleGFX - - pop de - ld a, SPRITE_ANIM_INDEX_TRADEMON_ICON - call _InitSpriteAnimStruct - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - pop bc - ld [hl], b - - pop de - ld a, SPRITE_ANIM_INDEX_TRADEMON_BUBBLE - call _InitSpriteAnimStruct - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - pop bc - ld [hl], b - - call WaitBGMap - ld b, SCGB_TRADE_TUBE - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - ld a, %11010000 - call DmgToCgbObjPal0 - - call TradeAnim_IncrementJumptableIndex - ld a, 92 - ld [wFrameCounter], a - ret - -; 291af - -TradeAnim_TubeToOT2: ; 291af - call TradeAnim_FlashBGPals - ld a, [hSCX] - add $2 - ld [hSCX], a - cp $50 - ret nz - ld a, TRADEANIMSTATE_1 - call TradeAnim_TubeAnimJumptable - call TradeAnim_IncrementJumptableIndex - ret - -; 291c4 - -TradeAnim_TubeToOT3: ; 291c4 - call TradeAnim_FlashBGPals - ld a, [hSCX] - add $2 - ld [hSCX], a - cp $a0 - ret nz - ld a, TRADEANIMSTATE_2 - call TradeAnim_TubeAnimJumptable - call TradeAnim_IncrementJumptableIndex - ret - -; 291d9 - -TradeAnim_TubeToOT4: ; 291d9 - call TradeAnim_FlashBGPals - ld a, [hSCX] - add $2 - ld [hSCX], a - and a - ret nz - call TradeAnim_IncrementJumptableIndex - ret - -; 291e8 - -TradeAnim_TubeToPlayer3: ; 291e8 - call TradeAnim_FlashBGPals - ld a, [hSCX] - sub $2 - ld [hSCX], a - cp $b0 - ret nz - ld a, TRADEANIMSTATE_1 - call TradeAnim_TubeAnimJumptable - call TradeAnim_IncrementJumptableIndex - ret - -; 291fd - -TradeAnim_TubeToPlayer4: ; 291fd - call TradeAnim_FlashBGPals - ld a, [hSCX] - sub $2 - ld [hSCX], a - cp $60 - ret nz - xor a ; TRADEANIMSTATE_0 - call TradeAnim_TubeAnimJumptable - call TradeAnim_IncrementJumptableIndex - ret - -; 29211 - -TradeAnim_TubeToPlayer5: ; 29211 - call TradeAnim_FlashBGPals - ld a, [hSCX] - sub $2 - ld [hSCX], a - and a - ret nz - call TradeAnim_IncrementJumptableIndex - ret - -; 29220 - -TradeAnim_TubeToOT6: -TradeAnim_TubeToPlayer6: ; 29220 - ld a, 128 - ld [wFrameCounter], a - call TradeAnim_IncrementJumptableIndex - ret - -; 29229 - -TradeAnim_TubeToOT8: -TradeAnim_TubeToPlayer8: ; 29229 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - callfar ClearSpriteAnims - hlbgcoord 0, 0 - ld bc, sScratch - vBGMap0 - ld a, " " - call ByteFill - xor a - ld [hSCX], a - ld a, $90 - ld [hWY], a - call EnableLCD - call LoadTradeBallAndCableGFX - call WaitBGMap - call TradeAnim_NormalPals - call TradeAnim_AdvanceScriptPointer - ret - -; 2925d - -TradeAnim_TubeToOT5: -TradeAnim_TubeToOT7: -TradeAnim_TubeToPlayer2: -TradeAnim_TubeToPlayer7: ; 2925d - call TradeAnim_FlashBGPals - ld hl, wFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - ret - -.done - call TradeAnim_IncrementJumptableIndex - ret - -; 2926d - -TradeAnim_GiveTrademonSFX: ; 2926d - call TradeAnim_AdvanceScriptPointer - ld de, SFX_GIVE_TRADEMON - call PlaySFX - ret - -; 29277 - -TradeAnim_GetTrademonSFX: ; 29277 - call TradeAnim_AdvanceScriptPointer - ld de, SFX_GET_TRADEMON - call PlaySFX - ret - -; 29281 - -TradeAnim_TubeAnimJumptable: ; 29281 - maskbits TRADEANIMJUMPTABLE_LENGTH - 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 -; 2928f - -.Jumptable: ; 2928f -; entries correspond to TRADEANIMSTATE_* constants - dw .Zero - dw .One - dw .Two - dw .Three -; 29297 - -.Zero: ; 29297 -.Three: ; 29297 - call TradeAnim_BlankTileMap - hlcoord 9, 3 - ld [hl], $5b - inc hl - ld bc, 10 - ld a, $60 - call ByteFill - hlcoord 3, 2 - call TradeAnim_CopyTradeGameBoyTilemap - ret - -; 292af - -.One: ; 292af - call TradeAnim_BlankTileMap - hlcoord 0, 3 - ld bc, SCREEN_WIDTH - ld a, $60 - call ByteFill - ret - -; 292be - -.Two: ; 292be - call TradeAnim_BlankTileMap - hlcoord 0, 3 - ld bc, $11 - ld a, $60 - call ByteFill - hlcoord 17, 3 - ld a, $5d - ld [hl], a - - ld a, $61 - ld de, SCREEN_WIDTH - ld c, $3 -.loop - add hl, de - ld [hl], a - dec c - jr nz, .loop - - add hl, de - ld a, $5f - ld [hld], a - ld a, $5b - ld [hl], a - hlcoord 10, 6 - call TradeAnim_CopyTradeGameBoyTilemap - ret - -; 292ec - -TradeAnim_CopyTradeGameBoyTilemap: ; 292ec - ld de, TradeGameBoyTilemap - lb bc, 8, 6 - call TradeAnim_CopyBoxFromDEtoHL - ret - -; 292f6 - -TradeAnim_PlaceTrademonStatsOnTubeAnim: ; 292f6 - push af - call ClearBGPalettes - call WaitTop - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - call ClearTileMap - hlcoord 0, 0 - ld bc, SCREEN_WIDTH - ld a, "─" - call ByteFill - hlcoord 0, 1 - ld de, wLinkPlayer1Name - call PlaceString - ld hl, wLinkPlayer2Name - ld de, 0 -.find_name_end_loop - ld a, [hli] - cp "@" - jr z, .done - dec de - jr .find_name_end_loop - -.done - hlcoord 0, 4 - add hl, de - ld de, wLinkPlayer2Name - call PlaceString - hlcoord 7, 2 - ld bc, 6 - pop af - call ByteFill - call WaitBGMap - call WaitTop - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - call ClearTileMap - ret - -; 29348 - -TradeAnim_EnterLinkTube1: ; 29348 - call ClearTileMap - call WaitTop - ld a, $a0 - ld [hSCX], a - call DelayFrame - hlcoord 8, 2 - ld de, TradeLinkTubeTilemap - lb bc, 3, 12 - call TradeAnim_CopyBoxFromDEtoHL - call WaitBGMap - ld b, SCGB_TRADE_TUBE - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - lb de, %11100100, %11100100 ; 3,2,1,0, 3,2,1,0 - call DmgToCgbObjPals - ld de, SFX_POTION - call PlaySFX - call TradeAnim_IncrementJumptableIndex - ret - -; 2937e - -TradeAnim_EnterLinkTube2: ; 2937e - ld a, [hSCX] - and a - jr z, .done - add $4 - ld [hSCX], a - ret - -.done - ld c, 80 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 29391 - -TradeAnim_ExitLinkTube: ; 29391 - ld a, [hSCX] - cp $a0 - jr z, .done - sub $4 - ld [hSCX], a - ret - -.done - call ClearTileMap - xor a - ld [hSCX], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293a6 - -TradeAnim_SetupGivemonScroll: ; 293a6 - ld a, $8f - ld [hWX], a - ld a, $88 - ld [hSCX], a - ld a, $50 - ld [hWY], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293b6 - -TradeAnim_DoGivemonScroll: ; 293b6 - ld a, [hWX] - cp $7 - jr z, .done - sub $4 - ld [hWX], a - ld a, [hSCX] - sub $4 - ld [hSCX], a - ret - -.done - ld a, $7 - ld [hWX], a - xor a - ld [hSCX], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293d2 - -TradeAnim_FrontpicScrollStart: ; 293d2 - ld a, $7 - ld [hWX], a - ld a, $50 - ld [hWY], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293de - -TradeAnim_TextboxScrollStart: ; 293de - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293ea - -TradeAnim_ScrollOutRight: ; 293ea - call WaitTop - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - call WaitBGMap - ld a, $7 - ld [hWX], a - xor a - ld [hWY], a - call DelayFrame - call WaitTop - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - call ClearTileMap - call TradeAnim_IncrementJumptableIndex - ret - -; 2940c - -TradeAnim_ScrollOutRight2: ; 2940c - ld a, [hWX] - cp $a1 - jr nc, .done - add $4 - ld [hWX], a - ret - -.done - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - call WaitBGMap - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - call TradeAnim_AdvanceScriptPointer - ret - -; 2942e - -TradeAnim_ShowGivemonData: ; 2942e - call ShowPlayerTrademonStats - ld a, [wPlayerTrademonSpecies] - ld [wCurPartySpecies], a - ld a, [wPlayerTrademonDVs] - ld [wTempMonDVs], a - ld a, [wPlayerTrademonDVs + 1] - ld [wTempMonDVs + 1], a - ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - call TradeAnim_ShowGivemonFrontpic - - ld a, [wPlayerTrademonSpecies] - call GetCryIndex - jr c, .skip_cry - ld e, c - ld d, b - call PlayCry -.skip_cry - - call TradeAnim_AdvanceScriptPointer - ret - -; 29461 - -TradeAnim_ShowGetmonData: ; 29461 - call ShowOTTrademonStats - ld a, [wOTTrademonSpecies] - ld [wCurPartySpecies], a - ld a, [wOTTrademonDVs] - ld [wTempMonDVs], a - ld a, [wOTTrademonDVs + 1] - ld [wTempMonDVs + 1], a - ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - call TradeAnim_ShowGetmonFrontpic - call TradeAnim_AdvanceScriptPointer - ret - -; 29487 - -TradeAnim_AnimateFrontpic: ; 29487 - farcall AnimateTrademonFrontpic - call TradeAnim_AdvanceScriptPointer - ret - -; 29491 - -TradeAnim_GetFrontpic: ; 29491 - push de - push af - predef GetUnownLetter - pop af - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call GetBaseData - pop de - predef GetMonFrontpic - ret - -; 294a9 - -TradeAnim_GetNickname: ; 294a9 - push de - ld [wd265], a - call GetPokemonName - ld hl, wStringBuffer1 - pop de - ld bc, NAME_LENGTH - call CopyBytes - ret - -; 294bb - -TradeAnim_ShowGivemonFrontpic: ; 294bb - ld de, vTiles0 - jr TradeAnim_ShowFrontpic - -TradeAnim_ShowGetmonFrontpic: ; 294c0 - ld de, vTiles0 tile $31 -TradeAnim_ShowFrontpic: ; 294c3 - call DelayFrame - ld hl, vTiles2 - lb bc, 10, $31 - call Request2bpp - call WaitTop - call TradeAnim_BlankTileMap - hlcoord 7, 2 - xor a - ld [hGraphicStartTile], a - lb bc, 7, 7 - predef PlaceGraphic - call WaitBGMap - ret - -; 294e7 - -TraideAnim_Wait80: ; 294e7 - ld c, 80 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 294f0 - -TraideAnim_Wait40: ; 294f0 - ld c, 40 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 294f9 - -TraideAnim_Wait96: ; 294f9 - ld c, 96 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 29502 - -TraideAnim_Wait80IfOTEgg: ; 29502 - call IsOTTrademonEgg - ret nz - ld c, 80 - call DelayFrames - ret - -; 2950c - -TraideAnim_Wait180IfOTEgg: ; 2950c - call IsOTTrademonEgg - ret nz - ld c, 180 - call DelayFrames - ret - -; 29516 - -IsOTTrademonEgg: ; 29516 - call TradeAnim_AdvanceScriptPointer - ld a, [wOTTrademonSpecies] - cp EGG - ret - -; 2951f -ShowPlayerTrademonStats: ; 2951f - ld de, wPlayerTrademonSpecies - ld a, [de] - cp EGG - jr z, TrademonStats_Egg - call TrademonStats_MonTemplate - ld de, wPlayerTrademonSpecies - call TrademonStats_PrintSpeciesNumber - ld de, wPlayerTrademonSpeciesName - call TrademonStats_PrintSpeciesName - ld a, [wPlayerTrademonCaughtData] - ld de, wPlayerTrademonOTName - call TrademonStats_PrintOTName - ld de, wPlayerTrademonID - call TrademonStats_PrintTrademonID - call TrademonStats_WaitBGMap - ret - -; 29549 - -ShowOTTrademonStats: ; 29549 - ld de, wOTTrademonSpecies - ld a, [de] - cp EGG - jr z, TrademonStats_Egg - call TrademonStats_MonTemplate - ld de, wOTTrademonSpecies - call TrademonStats_PrintSpeciesNumber - ld de, wOTTrademonSpeciesName - call TrademonStats_PrintSpeciesName - ld a, [wOTTrademonCaughtData] - ld de, wOTTrademonOTName - call TrademonStats_PrintOTName - ld de, wOTTrademonID - call TrademonStats_PrintTrademonID - call TrademonStats_WaitBGMap - ret - -; 29573 - -TrademonStats_MonTemplate: ; 29573 - call WaitTop - call TradeAnim_BlankTileMap - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - hlcoord 3, 0 - ld b, $6 - ld c, $d - call TextBox - hlcoord 4, 0 - ld de, .OTMonData - call PlaceString - ret - -; 29591 - -.OTMonData: ; 29591 - db "─── №." - next "" - next "OT/" - next "№.@" -; 295a1 - -TrademonStats_Egg: ; 295a1 - call WaitTop - call TradeAnim_BlankTileMap - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - hlcoord 3, 0 - ld b, 6 - ld c, 13 - call TextBox - hlcoord 4, 2 - ld de, .EggData - call PlaceString - call TrademonStats_WaitBGMap - ret - -; 295c2 - -.EggData: ; 295c2 - db "EGG" - next "OT/?????" - next "№.?????@" -; 295d8 - -TrademonStats_WaitBGMap: ; 295d8 - call WaitBGMap - call WaitTop - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - ret - -; 295e3 - -TrademonStats_PrintSpeciesNumber: ; 295e3 - hlcoord 10, 0 - lb bc, PRINTNUM_LEADINGZEROS | 1, 3 - call PrintNum - ld [hl], " " - ret - -; 295ef - -TrademonStats_PrintSpeciesName: ; 295ef - hlcoord 4, 2 - call PlaceString - ret - -; 295f6 - -TrademonStats_PrintOTName: ; 295f6 - cp 3 - jr c, .caught_gender_okay - xor a -.caught_gender_okay - push af - hlcoord 7, 4 - call PlaceString - inc bc - pop af - ld hl, .Gender - ld d, 0 - ld e, a - add hl, de - ld a, [hl] - ld [bc], a - ret - -; 2960e - -.Gender: ; 2960e - db " ", "♂", "♀" -; 29611 - -TrademonStats_PrintTrademonID: ; 29611 - hlcoord 7, 6 - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - ret - -; 2961b - -TradeAnim_RockingBall: ; 2961b - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_TRADE_POKE_BALL - call _InitSpriteAnimStruct - call TradeAnim_AdvanceScriptPointer - ld a, 32 - ld [wFrameCounter], a - ret - -; 2962c - -TradeAnim_DropBall: ; 2962c - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_TRADE_POKE_BALL - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld [hl], $1 - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], $dc - call TradeAnim_AdvanceScriptPointer - ld a, 56 - ld [wFrameCounter], a - ret - -; 29649 - -TradeAnim_Poof: ; 29649 - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_TRADE_POOF - call _InitSpriteAnimStruct - call TradeAnim_AdvanceScriptPointer - ld a, 16 - ld [wFrameCounter], a - ld de, SFX_BALL_POOF - call PlaySFX - ret - -; 29660 - -TradeAnim_BulgeThroughTube: ; 29660 - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbObjPal0 - depixel 5, 11 - ld a, SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE - call _InitSpriteAnimStruct - call TradeAnim_AdvanceScriptPointer - ld a, 64 - ld [wFrameCounter], a - ret - -; 29676 - -TradeAnim_AnimateTrademonInTube: ; 29676 (a:5676) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 29686 - -.Jumptable: ; 29686 (a:5686) - dw .InitTimer - dw .WaitTimer1 - dw .MoveRight - dw .MoveDown - dw .MoveUp - dw .MoveLeft - dw .WaitTimer2 -; 2969a - -.JumptableNext: ; 29694 (a:5694) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ret - -.InitTimer: ; 2969a (a:569a) - call .JumptableNext - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $80 - ret - -.WaitTimer1: ; 296a4 (a:56a4) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - dec [hl] - and a - ret nz - call .JumptableNext - -.MoveRight: ; 296af (a:56af) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - cp $94 - jr nc, .done_move_right - inc [hl] - ret - -.done_move_right - call .JumptableNext - -.MoveDown: ; 296bd (a:56bd) - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, [hl] - cp $4c - jr nc, .done_move_down - inc [hl] - ret - -.done_move_down - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -.MoveUp: ; 296cf (a:56cf) - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, [hl] - cp $2c - jr z, .done_move_up - dec [hl] - ret - -.done_move_up - call .JumptableNext - -.MoveLeft: ; 296dd (a:56dd) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - cp $58 - jr z, .done_move_left - dec [hl] - ret - -.done_move_left - call .JumptableNext - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $80 - ret - -.WaitTimer2: ; 296f2 (a:56f2) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - dec [hl] - and a - ret nz - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -; 29701 (a:5701) - -TradeAnim_SentToOTText: ; 29701 - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jr z, .time_capsule - ld hl, .Text_MonName - call PrintText - ld c, 189 - call DelayFrames - ld hl, .Text_WasSentTo - call PrintText - call TradeAnim_Wait80Frames - ld c, 128 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -.time_capsule - ld hl, .Text_WasSentTo - call PrintText - call TradeAnim_Wait80Frames - call TradeAnim_AdvanceScriptPointer - ret - -; 29732 - -.Text_WasSentTo: ; 0x29732 - ; was sent to @ . - text_jump UnknownText_0x1bc6e9 - db "@" -; 0x29737 - -.Text_MonName: ; 0x29737 - ; - text_jump UnknownText_0x1bc701 - db "@" -; 0x2973c - -TradeAnim_OTBidsFarewell: ; 2973c - ld hl, .Text_BidsFarewellToMon - call PrintText - call TradeAnim_Wait80Frames - ld hl, .Text_MonName - call PrintText - call TradeAnim_Wait80Frames - call TradeAnim_AdvanceScriptPointer - ret - -; 29752 - -.Text_BidsFarewellToMon: ; 0x29752 - ; bids farewell to - text_jump UnknownText_0x1bc703 - db "@" -; 0x29757 - -.Text_MonName: ; 0x29757 - ; . - text_jump UnknownText_0x1bc719 - db "@" -; 0x2975c - -TradeAnim_TakeCareOfText: ; 2975c - call WaitTop - hlcoord 0, 10 - ld bc, 8 * SCREEN_WIDTH - ld a, " " - call ByteFill - call WaitBGMap - ld hl, .Text_TakeGoodCareOfMon - call PrintText - call TradeAnim_Wait80Frames - call TradeAnim_AdvanceScriptPointer - ret - -; 2977a - -.Text_TakeGoodCareOfMon: ; 0x2977a - ; Take good care of @ . - text_jump UnknownText_0x1bc71f - db "@" -; 0x2977f - -TradeAnim_OTSendsText1: ; 2977f - ld hl, .Text_ForYourMon - call PrintText - call TradeAnim_Wait80Frames - ld hl, .Text_OTSends - call PrintText - call TradeAnim_Wait80Frames - ld c, 14 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 2979a - -.Text_ForYourMon: ; 0x2979a - ; For @ 's @ , - text_jump UnknownText_0x1bc739 - db "@" -; 0x2979f - -.Text_OTSends: ; 0x2979f - ; sends @ . - text_jump UnknownText_0x1bc74c - db "@" -; 0x297a4 - -TradeAnim_OTSendsText2: ; 297a4 - ld hl, .Text_WillTrade - call PrintText - call TradeAnim_Wait80Frames - ld hl, .Text_ForYourMon - call PrintText - call TradeAnim_Wait80Frames - ld c, 14 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 297bf - -.Text_WillTrade: ; 0x297bf - ; will trade @ @ - text_jump UnknownText_0x1bc75e - db "@" -; 0x297c4 - -.Text_ForYourMon: ; 0x297c4 - ; for @ 's @ . - text_jump UnknownText_0x1bc774 - db "@" -; 0x297c9 - -TradeAnim_Wait80Frames: ; 297c9 - ld c, 80 - call DelayFrames - ret - -; 297cf - -TradeAnim_BlankTileMap: ; 297cf - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, " " - call ByteFill - ret - -; 297db - -TradeAnim_CopyBoxFromDEtoHL: ; 297db -.row - push bc - push hl -.col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret - -; 297ed - -TradeAnim_NormalPals: ; 297ed - ld a, [hSGB] - and a - ld a, %11100100 ; 3,2,1,0 - jr z, .not_sgb - ld a, $f0 - -.not_sgb - call DmgToCgbObjPal0 - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - ret - -; 297ff - -LinkTradeAnim_LoadTradePlayerNames: ; 297ff - push de - ld de, wLinkPlayer1Name - ld bc, NAME_LENGTH - call CopyBytes - pop hl - ld de, wLinkPlayer2Name - ld bc, NAME_LENGTH - call CopyBytes - ret - -; 29814 - -LinkTradeAnim_LoadTradeMonSpecies: ; 29814 - ld a, [hl] - ld [wLinkTradeSendmonSpecies], a - ld a, [de] - ld [wLinkTradeGetmonSpecies], a - ret - -; 2981d - -TradeAnim_FlashBGPals: ; 2981d - ld a, [wcf65] - and $7 - ret nz - ld a, [rBGP] - xor %00111100 - call DmgToCgbBGPals - ret - -; 2982b - -LoadTradeBallAndCableGFX: ; 2982b - call DelayFrame - ld de, TradeBallGFX - ld hl, vTiles0 tile $62 - lb bc, BANK(TradeBallGFX), 6 - call Request2bpp - ld de, TradePoofGFX - ld hl, vTiles0 tile $68 - lb bc, BANK(TradePoofGFX), 12 - call Request2bpp - ld de, TradeCableGFX - ld hl, vTiles0 tile $74 - lb bc, BANK(TradeCableGFX), 4 - call Request2bpp - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], $62 - ret - -; 2985a - -LoadTradeBubbleGFX: ; 2985a - call DelayFrame - ld e, $3 - callfar LoadMenuMonIcon - ld de, TradeBubbleGFX - ld hl, vTiles0 tile $72 - lb bc, BANK(TradeBubbleGFX), 4 - call Request2bpp - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], $62 - ret - -; 29879 - -TradeAnim_WaitAnim: ; 29879 - ld hl, wFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - ret - -.done - call TradeAnim_AdvanceScriptPointer - ret - -; 29886 - -TradeAnim_WaitAnim2: ; 29886 - ld hl, wFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - ret - -.done - call TradeAnim_AdvanceScriptPointer - ret - -; 29893 - - -Unreferenced_DebugTrade: ; 29893 -; This function is not referenced. -; It was meant for use in Japanese versions, so the -; constant used for copy length was changed by accident. - - ld hl, .DebugTradeData - - ld a, [hli] - ld [wPlayerTrademonSpecies], a - ld de, wPlayerTrademonSenderName - ld c, NAME_LENGTH + 2 ; JP: NAME_LENGTH_JAPANESE + 2 -.loop1 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop1 - - ld a, [hli] - ld [wOTTrademonSpecies], a - ld de, wOTTrademonSenderName - ld c, NAME_LENGTH + 2 ; JP: NAME_LENGTH_JAPANESE + 2 -.loop2 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop2 - ret - -; 298b5 - -debugtrade: MACRO -; species, ot name, ot id (?) - db \1, \2 - dw \3 -ENDM - -.DebugTradeData: ; 298b5 - debugtrade VENUSAUR, "ゲーフり@@", $0123 ; GAME FREAK - debugtrade CHARIZARD, "クりーチャ@", $0456 ; Creatures Inc. -; 298c7 - - -TradeGameBoyTilemap: ; 298c7 -; 6x8 - db $31, $32, $32, $32, $32, $33 - db $34, $35, $36, $36, $37, $38 - db $34, $39, $3a, $3a, $3b, $38 - db $3c, $3d, $3e, $3e, $3f, $40 - db $41, $42, $43, $43, $44, $45 - db $46, $47, $43, $48, $49, $4a - db $41, $43, $4b, $4c, $4d, $4e - db $4f, $50, $50, $50, $51, $52 -; 297f7 - -TradeLinkTubeTilemap: ; 297f7 -; 12x3 - db $43, $55, $56, $53, $53, $53, $53, $53, $53, $53, $53, $53 - db $43, $57, $58, $54, $54, $54, $54, $54, $54, $54, $54, $54 - db $43, $59, $5a, $43, $43, $43, $43, $43, $43, $43, $43, $43 -; 2991b - -TradeArrowGFX: INCBIN "gfx/trade/arrow.2bpp" -TradeCableGFX: INCBIN "gfx/trade/cable.2bpp" -TradeBubbleGFX: INCBIN "gfx/trade/bubble.2bpp" -TradeGameBoyLZ: INCBIN "gfx/trade/game_boy.2bpp.lz" -TradeBallGFX: INCBIN "gfx/trade/ball.2bpp" -TradePoofGFX: INCBIN "gfx/trade/poof.2bpp" diff --git a/engine/trainer_card.asm b/engine/trainer_card.asm deleted file mode 100755 index e84c1c9f3..000000000 --- a/engine/trainer_card.asm +++ /dev/null @@ -1,623 +0,0 @@ -; TrainerCard.Jumptable indexes - const_def - const TRAINERCARDSTATE_PAGE1_LOADGFX ; 0 - const TRAINERCARDSTATE_PAGE1_JOYPAD ; 1 - const TRAINERCARDSTATE_PAGE2_LOADGFX ; 2 - const TRAINERCARDSTATE_PAGE2_JOYPAD ; 3 - const TRAINERCARDSTATE_PAGE3_LOADGFX ; 4 - const TRAINERCARDSTATE_PAGE3_JOYPAD ; 5 - const TRAINERCARDSTATE_QUIT ; 6 - -TrainerCard: ; 25105 - ld a, [wVramState] - push af - xor a - ld [wVramState], a - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call .InitRAM -.loop - call UpdateTime - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .quit - ld a, [hJoyLast] - and B_BUTTON - jr nz, .quit - call .RunJumptable - call DelayFrame - jr .loop - -.quit - pop af - ld [wOptions], a - pop af - ld [wVramState], a - ret - -.InitRAM: ; 2513b (9:513b) - call ClearBGPalettes - call ClearSprites - call ClearTileMap - call DisableLCD - - farcall GetCardPic - - ld hl, CardRightCornerGFX - ld de, vTiles2 tile $1c - ld bc, 1 tiles - ld a, BANK(CardRightCornerGFX) - call FarCopyBytes - - ld hl, CardStatusGFX - ld de, vTiles2 tile $29 - ld bc, 86 tiles - ld a, BANK(CardStatusGFX) - call FarCopyBytes - - call TrainerCard_PrintTopHalfOfCard - - hlcoord 0, 8 - ld d, 6 - call TrainerCard_InitBorder - - call EnableLCD - call WaitBGMap - ld b, SCGB_TRAINER_CARD - call GetSGBLayout - call SetPalettes - call WaitBGMap - ld hl, wJumptableIndex - xor a ; TRAINERCARDSTATE_PAGE1_LOADGFX - ld [hli], a ; wJumptableIndex - ld [hli], a ; wTrainerCardBadgeFrameCounter - ld [hli], a ; wTrainerCardBadgeTileID - ld [hl], a ; wTrainerCardBadgeAttributes - ret - -.RunJumptable: ; 2518e (9:518e) - jumptable .Jumptable, wJumptableIndex - -.Jumptable: ; 2519d (9:519d) -; entries correspond to TRAINERCARDSTATE_* constants - dw TrainerCard_Page1_LoadGFX - dw TrainerCard_Page1_Joypad - dw TrainerCard_Page2_LoadGFX - dw TrainerCard_Page2_Joypad - dw TrainerCard_Page3_LoadGFX - dw TrainerCard_Page3_Joypad - dw TrainerCard_Quit - -TrainerCard_IncrementJumptable: ; 251ab (9:51ab) - ld hl, wJumptableIndex - inc [hl] - ret - -TrainerCard_Quit: ; 251b0 (9:51b0) - ld hl, wJumptableIndex - set 7, [hl] - ret - -TrainerCard_Page1_LoadGFX: ; 251b6 (9:51b6) - call ClearSprites - hlcoord 0, 8 - ld d, 6 - call TrainerCard_InitBorder - call WaitBGMap - ld de, CardStatusGFX - ld hl, vTiles2 tile $29 - lb bc, BANK(CardStatusGFX), 86 - call Request2bpp - call TrainerCard_Page1_PrintDexCaught_GameTime - call TrainerCard_IncrementJumptable - ret - -TrainerCard_Page1_Joypad: ; 251d7 (9:51d7) - call TrainerCard_Page1_PrintGameTime - ld hl, hJoyLast - ld a, [hl] - and D_RIGHT | A_BUTTON - jr nz, .pressed_right_a - ret - -.pressed_right_a - ld a, TRAINERCARDSTATE_PAGE2_LOADGFX - ld [wJumptableIndex], a - ret - -.Unreferenced_KantoCheck: - ld a, [wKantoBadges] - and a - ret z - ld a, TRAINERCARDSTATE_PAGE3_LOADGFX - ld [wJumptableIndex], a - ret - -; 251f4 - -TrainerCard_Page2_LoadGFX: ; 251f4 (9:51f4) - call ClearSprites - hlcoord 0, 8 - ld d, 6 - call TrainerCard_InitBorder - call WaitBGMap - ld de, LeaderGFX - ld hl, vTiles2 tile $29 - lb bc, BANK(LeaderGFX), 86 - call Request2bpp - ld de, BadgeGFX - ld hl, vTiles0 tile $00 - lb bc, BANK(BadgeGFX), 44 - call Request2bpp - call TrainerCard_Page2_3_InitObjectsAndStrings - call TrainerCard_IncrementJumptable - ret - -TrainerCard_Page2_Joypad: ; 25221 (9:5221) - ld hl, TrainerCard_JohtoBadgesOAM - call TrainerCard_Page2_3_AnimateBadges - ld hl, hJoyLast - ld a, [hl] - and A_BUTTON - jr nz, .Quit - ld a, [hl] - and D_LEFT - jr nz, .d_left - ret - -.d_left - ld a, TRAINERCARDSTATE_PAGE1_LOADGFX - ld [wJumptableIndex], a - ret - -.Unreferenced_KantoCheck: - ld a, [wKantoBadges] - and a - ret z - ld a, TRAINERCARDSTATE_PAGE3_LOADGFX - ld [wJumptableIndex], a - ret - -.Quit: - ld a, TRAINERCARDSTATE_QUIT - ld [wJumptableIndex], a - ret - -TrainerCard_Page3_LoadGFX: ; 2524c (9:524c) - call ClearSprites - hlcoord 0, 8 - ld d, 6 - call TrainerCard_InitBorder - call WaitBGMap - ld de, LeaderGFX2 - ld hl, vTiles2 tile $29 - lb bc, BANK(LeaderGFX2), 86 - call Request2bpp - ld de, BadgeGFX2 - ld hl, vTiles0 tile $00 - lb bc, BANK(BadgeGFX2), 44 - call Request2bpp - call TrainerCard_Page2_3_InitObjectsAndStrings - call TrainerCard_IncrementJumptable - ret - -TrainerCard_Page3_Joypad: ; 25279 (9:5279) - ld hl, TrainerCard_JohtoBadgesOAM - call TrainerCard_Page2_3_AnimateBadges - ld hl, hJoyLast - ld a, [hl] - and D_LEFT - jr nz, .left - ld a, [hl] - and D_RIGHT - jr nz, .right - ret - -.left - ld a, TRAINERCARDSTATE_PAGE2_LOADGFX - ld [wJumptableIndex], a - ret - -.right - ld a, TRAINERCARDSTATE_PAGE1_LOADGFX - ld [wJumptableIndex], a - ret - -TrainerCard_PrintTopHalfOfCard: ; 25299 (9:5299) - hlcoord 0, 0 - ld d, 5 - call TrainerCard_InitBorder - hlcoord 2, 2 - ld de, .Name_Money - call PlaceString - hlcoord 2, 4 - ld de, .ID_No - call TrainerCardSetup_PlaceTilemapString - hlcoord 7, 2 - ld de, wPlayerName - call PlaceString - hlcoord 5, 4 - ld de, wPlayerID - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - hlcoord 7, 6 - ld de, wMoney - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - hlcoord 1, 3 - ld de, .HorizontalDivider - call TrainerCardSetup_PlaceTilemapString - hlcoord 14, 1 - lb bc, 5, 7 - xor a - ld [hGraphicStartTile], a - predef PlaceGraphic - ret - -; 252ec (9:52ec) - -.Name_Money: ; 252ec - db "NAME/" - next "" - next "MONEY@" - -.ID_No: ; 252f9 - db $27, $28, -1 ; ID NO - -.HorizontalDivider: ; 252fc - db $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $26, -1 ; ____________> -; 2530a - -TrainerCard_Page1_PrintDexCaught_GameTime: ; 2530a (9:530a) - hlcoord 2, 10 - ld de, .Dex_PlayTime - call PlaceString - hlcoord 10, 15 - ld de, .Badges - call PlaceString - ld hl, wPokedexCaught - ld b, wEndPokedexCaught - wPokedexCaught - call CountSetBits - ld de, wd265 - hlcoord 15, 10 - lb bc, 1, 3 - call PrintNum - call TrainerCard_Page1_PrintGameTime - hlcoord 2, 8 - ld de, .StatusTilemap - call TrainerCardSetup_PlaceTilemapString - ld a, [wStatusFlags] - bit STATUSFLAGS_POKEDEX_F, a - ret nz - hlcoord 1, 9 - lb bc, 2, 17 - call ClearBox - ret - -.Dex_PlayTime: - db "#DEX" - next "PLAY TIME@@" - -.Badges: - db " BADGES▶@" - -.StatusTilemap: ; 25366 - db $29, $2a, $2b, $2c, $2d, -1 -; 2536c - -TrainerCard_Page2_3_InitObjectsAndStrings: ; 2536c (9:536c) - hlcoord 2, 8 - ld de, .BadgesTilemap - call TrainerCardSetup_PlaceTilemapString - hlcoord 2, 10 - ld a, $29 - ld c, 4 -.loop - call TrainerCard_Page2_3_PlaceLeadersFaces -rept 4 - inc hl -endr - dec c - jr nz, .loop - hlcoord 2, 13 - ld a, $51 - ld c, 4 -.loop2 - call TrainerCard_Page2_3_PlaceLeadersFaces -rept 4 - inc hl -endr - dec c - jr nz, .loop2 - xor a - ld [wTrainerCardBadgeFrameCounter], a - ld hl, TrainerCard_JohtoBadgesOAM - call TrainerCard_Page2_3_OAMUpdate - ret - -; 253a2 (9:53a2) - -.BadgesTilemap: ; 253a2 - db $79, $7a, $7b, $7c, $7d, -1 ; "BADGES" -; 253a8 - -TrainerCardSetup_PlaceTilemapString: ; 253a8 (9:53a8) -.loop - ld a, [de] - cp -1 - ret z - ld [hli], a - inc de - jr .loop - -TrainerCard_InitBorder: ; 253b0 (9:53b0) - ld e, SCREEN_WIDTH -.loop1 - ld a, $23 - ld [hli], a - dec e - jr nz, .loop1 - - ld a, $23 - ld [hli], a - ld e, SCREEN_HEIGHT - 1 - ld a, " " -.loop2 - ld [hli], a - dec e - jr nz, .loop2 - - ld a, $1c - ld [hli], a - ld a, $23 - ld [hli], a -.loop3 - ld a, $23 - ld [hli], a - - ld e, SCREEN_HEIGHT - ld a, " " -.loop4 - ld [hli], a - dec e - jr nz, .loop4 - - ld a, $23 - ld [hli], a - dec d - jr nz, .loop3 - - ld a, $23 - ld [hli], a - ld a, $24 - ld [hli], a - - ld e, SCREEN_HEIGHT - 1 - ld a, " " -.loop5 - ld [hli], a - dec e - jr nz, .loop5 - ld a, $23 - ld [hli], a - ld e, SCREEN_WIDTH -.loop6 - ld a, $23 - ld [hli], a - dec e - jr nz, .loop6 - ret - -TrainerCard_Page2_3_PlaceLeadersFaces: ; 253f4 (9:53f4) - push de - push hl - ld [hli], a - inc a - ld [hli], a - inc a - ld [hli], a - inc a - ld [hli], a - inc a - ld de, SCREEN_WIDTH - 3 - add hl, de - ld [hli], a - inc a - ld [hli], a - inc a - ld [hli], a - inc a - ld de, SCREEN_WIDTH - 3 - add hl, de - ld [hli], a - inc a - ld [hli], a - inc a - ld [hli], a - inc a - pop hl - pop de - ret - -TrainerCard_Page1_PrintGameTime: ; 25415 (9:5415) - hlcoord 11, 12 - ld de, wGameTimeHours - lb bc, 2, 4 - call PrintNum - inc hl - ld de, wGameTimeMinutes - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ld a, [hVBlankCounter] - and $1f - ret nz - hlcoord 15, 12 - ld a, [hl] - xor " " ^ $2e ; alternate between space and small colon ($2e) tiles - ld [hl], a - ret - -TrainerCard_Page2_3_AnimateBadges: ; 25438 (9:5438) - ld a, [hVBlankCounter] - and %111 - ret nz - ld a, [wTrainerCardBadgeFrameCounter] - inc a - and %111 - ld [wTrainerCardBadgeFrameCounter], a - jr TrainerCard_Page2_3_OAMUpdate - -TrainerCard_Page2_3_OAMUpdate: ; 25448 (9:5448) -; copy flag array pointer - ld a, [hli] - ld e, a - ld a, [hli] -; get flag array - ld d, a - ld a, [de] - ld c, a - ld de, wVirtualOAMSprite00 - ld b, NUM_JOHTO_BADGES -.loop - srl c - push bc - jr nc, .skip_badge - push hl - ld a, [hli] ; y - ld b, a - ld a, [hli] ; x - ld c, a - ld a, [hli] ; pal - ld [wTrainerCardBadgeAttributes], a - ld a, [wTrainerCardBadgeFrameCounter] - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, [hl] - ld [wTrainerCardBadgeTileID], a - call .PrepOAM - pop hl -.skip_badge - ld bc, $b ; 3 + 2 * 4 - add hl, bc - pop bc - dec b - jr nz, .loop - ret - -.PrepOAM: ; 2547b (9:547b) - ld a, [wTrainerCardBadgeTileID] - and 1 << 7 - jr nz, .xflip - ld hl, .facing1 - jr .loop2 - -.xflip - ld hl, .facing2 -.loop2 - ld a, [hli] - cp -1 - ret z - add b - ld [de], a ; y - inc de - - ld a, [hli] - add c - ld [de], a ; x - inc de - - ld a, [wTrainerCardBadgeTileID] - and $ff ^ (1 << 7) - add [hl] - ld [de], a ; tile id - inc hl - inc de - - ld a, [wTrainerCardBadgeAttributes] - add [hl] - ld [de], a ; attributes - inc hl - inc de - jr .loop2 - -; 254a7 (9:54a7) - -.facing1 ; 254a7 - dsprite 0, 0, 0, 0, $00, 0 - dsprite 0, 0, 1, 0, $01, 0 - dsprite 1, 0, 0, 0, $02, 0 - dsprite 1, 0, 1, 0, $03, 0 - db -1 - -.facing2 ; 254b8 - dsprite 0, 0, 0, 0, $01, 0 | X_FLIP - dsprite 0, 0, 1, 0, $00, 0 | X_FLIP - dsprite 1, 0, 0, 0, $03, 0 | X_FLIP - dsprite 1, 0, 1, 0, $02, 0 | X_FLIP - db -1 - -TrainerCard_JohtoBadgesOAM: ; 254c9 -; Template OAM data for each badge on the trainer card. -; Format: - ; y, x, palette - ; cycle 1: face tile, in1 tile, in2 tile, in3 tile - ; cycle 2: face tile, in1 tile, in2 tile, in3 tile - - dw wJohtoBadges - - ; Zephyrbadge - db $68, $18, 0 - db $00, $20, $24, $20 | (1 << 7) - db $00, $20, $24, $20 | (1 << 7) - - ; Hivebadge - db $68, $38, 0 - db $04, $20, $24, $20 | (1 << 7) - db $04, $20, $24, $20 | (1 << 7) - - ; Plainbadge - db $68, $58, 0 - db $08, $20, $24, $20 | (1 << 7) - db $08, $20, $24, $20 | (1 << 7) - - ; Fogbadge - db $68, $78, 0 - db $0c, $20, $24, $20 | (1 << 7) - db $0c, $20, $24, $20 | (1 << 7) - - ; Mineralbadge - db $80, $38, 0 - db $10, $20, $24, $20 | (1 << 7) - db $10, $20, $24, $20 | (1 << 7) - - ; Stormbadge - db $80, $18, 0 - db $14, $20, $24, $20 | (1 << 7) - db $14, $20, $24, $20 | (1 << 7) - - ; Glacierbadge - db $80, $58, 0 - db $18, $20, $24, $20 | (1 << 7) - db $18, $20, $24, $20 | (1 << 7) - - ; Risingbadge - ; X-flips on alternate cycles. - db $80, $78, 0 - db $1c, $20, $24, $20 | (1 << 7) - db $1c | (1 << 7), $20, $24, $20 | (1 << 7) -; 25523 - -CardStatusGFX: INCBIN "gfx/trainer_card/card_status.2bpp" - -LeaderGFX: INCBIN "gfx/trainer_card/leaders.2bpp" -LeaderGFX2: INCBIN "gfx/trainer_card/leaders.2bpp" -BadgeGFX: INCBIN "gfx/trainer_card/badges.2bpp" -BadgeGFX2: INCBIN "gfx/trainer_card/badges.2bpp" - -CardRightCornerGFX: INCBIN "gfx/trainer_card/card_right_corner.2bpp" diff --git a/engine/types.asm b/engine/types.asm deleted file mode 100644 index dc0df61ae..000000000 --- a/engine/types.asm +++ /dev/null @@ -1,99 +0,0 @@ -PrintMonTypes: ; 5090d -; Print one or both types of [wCurSpecies] -; on the stats screen at hl. - - push hl - call GetBaseData - pop hl - - push hl - ld a, [wBaseType1] - call .Print - - ; Single-typed monsters really - ; have two of the same type. - ld a, [wBaseType1] - ld b, a - ld a, [wBaseType2] - cp b - pop hl - jr z, .hide_type_2 - - ld bc, SCREEN_WIDTH - add hl, bc - -.Print: - ld b, a - jr PrintType - -.hide_type_2 - ; Erase any type name that was here before. - ; Seems to be pointless in localized versions. - ld a, " " - ld bc, SCREEN_WIDTH - 3 - add hl, bc - ld [hl], a - inc bc - add hl, bc - ld bc, NAME_LENGTH_JAPANESE - 1 - jp ByteFill -; 5093a - - -PrintMoveType: ; 5093a -; Print the type of move b at hl. - - push hl - ld a, b - dec a - ld bc, MOVE_LENGTH - ld hl, Moves - call AddNTimes - ld de, wStringBuffer1 - ld a, BANK(Moves) - call FarCopyBytes - ld a, [wStringBuffer1 + MOVE_TYPE] - pop hl - - ld b, a - - -PrintType: ; 50953 -; Print type b at hl. - - ld a, b - - push hl - add a - ld hl, TypeNames - ld e, a - ld d, 0 - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - pop hl - - jp PlaceString -; 50964 - - -GetTypeName: ; 50964 -; Copy the name of type [wd265] to wStringBuffer1. - - ld a, [wd265] - ld hl, TypeNames - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wStringBuffer1 - ld bc, MOVE_NAME_LENGTH - jp CopyBytes -; 5097b - - -INCLUDE "data/types/names.asm" diff --git a/engine/unown_puzzle.asm b/engine/unown_puzzle.asm deleted file mode 100755 index 83527ea69..000000000 --- a/engine/unown_puzzle.asm +++ /dev/null @@ -1,877 +0,0 @@ -PUZZLE_BORDER EQU $ee -PUZZLE_VOID EQU $ef - -puzcoord EQUS "* 6 +" - -_UnownPuzzle: ; e1190 - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - call ClearBGPalettes - call ClearTileMap - call ClearSprites - xor a - ld [hBGMapMode], a - call DisableLCD - ld hl, wMisc ; includes wPuzzlePieces - ld bc, wMiscEnd - wMisc - xor a - call ByteFill - ld hl, UnownPuzzleCursorGFX - ld de, vTiles1 tile $60 - ld bc, 4 tiles - call CopyBytes - ld hl, UnownPuzzleStartCancelLZ - ld de, vTiles1 tile $6d - call Decompress - call LoadUnownPuzzlePiecesGFX - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, PUZZLE_BORDER - call ByteFill - hlcoord 4, 3 - lb bc, 12, 12 - ld a, PUZZLE_VOID - call UnownPuzzle_FillBox - call InitUnownPuzzlePiecePositions - call UnownPuzzle_UpdateTilemap - call PlaceStartCancelBox - xor a - ld [hSCY], a - ld [hSCX], a - ld [rWY], a - ld [wJumptableIndex], a - ld [wHoldingUnownPuzzlePiece], a - ld [wUnownPuzzleCursorPosition], a - ld [wUnownPuzzleHeldPiece], a - ld a, %10010011 - ld [rLCDC], a - call WaitBGMap - ld b, SCGB_UNOWN_PUZZLE - call GetSGBLayout - ld a, $e4 - call DmgToCgbBGPals - ld a, $24 - call DmgToCgbObjPal0 - xor a - ld [wSolvedUnownPuzzle], a - call DelayFrame -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .quit - call UnownPuzzleJumptable - ld a, [wHoldingUnownPuzzlePiece] - and a - jr nz, .holding_piece - ld a, [hVBlankCounter] - and $10 - jr z, .clear -.holding_piece - call RedrawUnownPuzzlePieces - jr .next - -.clear - call ClearSprites -.next - call DelayFrame - jr .loop - -.quit - pop af - ld [hInMenu], a - call ClearBGPalettes - call ClearTileMap - call ClearSprites - ld a, LCDC_DEFAULT - ld [rLCDC], a - ret -; e124e - -InitUnownPuzzlePiecePositions: ; e124e - ld c, 1 - ld b, 16 -.load_loop - call Random - and $f - ld hl, .PuzzlePieceInitialPositions - ld e, a - ld d, $0 - add hl, de - ld e, [hl] - ld hl, wPuzzlePieces - add hl, de - ld a, [hl] - and a - jr nz, .load_loop - ld [hl], c - inc c - dec b - jr nz, .load_loop - ret -; e126d - -.PuzzlePieceInitialPositions: ; e126d -initpuzcoord: MACRO -rept _NARG / 2 - db \1 puzcoord \2 - shift - shift -endr -ENDM - initpuzcoord 0,0, 0,1, 0,2, 0,3, 0,4, 0,5 - initpuzcoord 1,0, 1,5 - initpuzcoord 2,0, 2,5 - initpuzcoord 3,0, 3,5 - initpuzcoord 4,0, 4,5 - initpuzcoord 5,0, 5,5 - ; START > CANCEL -; e127d - -PlaceStartCancelBox: ; e127d - call PlaceStartCancelBoxBorder - hlcoord 5, 16 - ld a, $f6 - ld c, 10 -.loop - ld [hli], a - inc a - dec c - jr nz, .loop - ret -; e128d - -PlaceStartCancelBoxBorder: ; e128d - hlcoord 4, 15 - ld a, $f0 - ld [hli], a - ld bc, 10 - ld a, $f1 - call ByteFill - hlcoord 15, 15 - ld a, $f2 - ld [hli], a - hlcoord 4, 16 - ld a, $f3 - ld [hli], a - ld bc, 10 - ld a, PUZZLE_VOID - call ByteFill - hlcoord 15, 16 - ld a, $f3 - ld [hli], a - hlcoord 4, 17 - ld a, $f4 - ld [hli], a - ld bc, 10 - ld a, $f1 - call ByteFill - hlcoord 15, 17 - ld a, $f5 - ld [hl], a - ret -; e12ca - -UnownPuzzleJumptable: ; e12ca - 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 -; e12d9 - -.Jumptable: ; e12d9 - dw .Function -; e12db - -.Function: ; e12db - ld a, [hJoyPressed] - and START - jp nz, UnownPuzzle_Quit - ld a, [hJoyPressed] - and A_BUTTON - jp nz, UnownPuzzle_A - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .d_up - ld a, [hl] - and D_DOWN - jr nz, .d_down - ld a, [hl] - and D_LEFT - jr nz, .d_left - ld a, [hl] - and D_RIGHT - jr nz, .d_right - ret - -.d_up - ld hl, wUnownPuzzleCursorPosition - ld a, [hl] - cp 1 puzcoord 0 - ret c - sub 6 - ld [hl], a - jr .done_joypad - -.d_down - ld hl, wUnownPuzzleCursorPosition - ld a, [hl] - cp 4 puzcoord 1 - ret z - cp 4 puzcoord 2 - ret z - cp 4 puzcoord 3 - ret z - cp 4 puzcoord 4 - ret z - cp 5 puzcoord 0 - ret nc - add 6 - ld [hl], a - jr .done_joypad - -.d_left - ld hl, wUnownPuzzleCursorPosition - ld a, [hl] - and a - ret z - cp 1 puzcoord 0 - ret z - cp 2 puzcoord 0 - ret z - cp 3 puzcoord 0 - ret z - cp 4 puzcoord 0 - ret z - cp 5 puzcoord 0 - ret z - cp 5 puzcoord 5 - jr z, .left_overflow - dec [hl] - jr .done_joypad - -.left_overflow - ld [hl], 5 puzcoord 0 - jr .done_joypad - -.d_right - ld hl, wUnownPuzzleCursorPosition - ld a, [hl] - cp 0 puzcoord 5 - ret z - cp 1 puzcoord 5 - ret z - cp 2 puzcoord 5 - ret z - cp 3 puzcoord 5 - ret z - cp 4 puzcoord 5 - ret z - cp 5 puzcoord 5 - ret z - cp 5 puzcoord 0 - jr z, .right_overflow - inc [hl] - jr .done_joypad - -.right_overflow - ld [hl], 5 puzcoord 5 - -.done_joypad - ld a, [wHoldingUnownPuzzlePiece] - and a - jr nz, .holding_piece - ld de, SFX_POUND - jr .play_sfx - -.holding_piece - ld de, SFX_MOVE_PUZZLE_PIECE - -.play_sfx - call PlaySFX - ret -; e1376 - -UnownPuzzle_A: ; e1376 - ld a, [wHoldingUnownPuzzlePiece] - and a - jr nz, .TryPlacePiece - call UnownPuzzle_CheckCurrentTileOccupancy - and a - jr z, UnownPuzzle_InvalidAction - ld de, SFX_MEGA_KICK - call PlaySFX - ld [hl], 0 - ld [wUnownPuzzleHeldPiece], a - call RedrawUnownPuzzlePieces - call FillUnoccupiedPuzzleSpace - call WaitBGMap - call WaitSFX - ld a, TRUE - ld [wHoldingUnownPuzzlePiece], a - ret - -.TryPlacePiece: - call UnownPuzzle_CheckCurrentTileOccupancy - and a - jr nz, UnownPuzzle_InvalidAction - ld de, SFX_PLACE_PUZZLE_PIECE_DOWN - call PlaySFX - ld a, [wUnownPuzzleHeldPiece] - ld [hl], a - call PlaceUnownPuzzlePieceGFX - call WaitBGMap - xor a - ld [wUnownPuzzleHeldPiece], a - call RedrawUnownPuzzlePieces - xor a - ld [wHoldingUnownPuzzlePiece], a - call WaitSFX - call CheckSolvedUnownPuzzle - ret nc - -; You solved the puzzle! - call PlaceStartCancelBoxBorder - call ClearSprites - ld de, SFX_1ST_PLACE - call PlaySFX - call WaitSFX - call SimpleWaitPressAorB - ld a, TRUE - ld [wSolvedUnownPuzzle], a -UnownPuzzle_Quit: ; e13de - ld hl, wJumptableIndex - set 7, [hl] - ret - -UnownPuzzle_InvalidAction: ; e13e4 - ld de, SFX_WRONG - call PlaySFX - call WaitSFX - ret -; e13ee - -UnownPuzzle_FillBox: ; e13ee - ld de, SCREEN_WIDTH -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - add hl, de - pop bc - dec b - jr nz, .row - ret -; e13fe - -UnownPuzzle_UpdateTilemap: ; e13fe - xor a - ld [wUnownPuzzleCursorPosition], a - ld c, 6 * 6 -.loop - push bc - call UnownPuzzle_CheckCurrentTileOccupancy - ld [wUnownPuzzleHeldPiece], a - and a - jr z, .not_holding_piece - call PlaceUnownPuzzlePieceGFX - jr .next - -.not_holding_piece - call FillUnoccupiedPuzzleSpace - -.next - ld hl, wUnownPuzzleCursorPosition - inc [hl] - pop bc - dec c - jr nz, .loop - ret -; e141f - -PlaceUnownPuzzlePieceGFX: ; e141f - ld a, $2 ; tilemap coords - call GetUnownPuzzleCoordData - ld a, [hli] - ld h, [hl] - ld l, a - push hl - call GetCurrentPuzzlePieceVTileCorner - pop hl - ld de, SCREEN_WIDTH - ld b, 3 -.row - ld c, 3 - push hl -.col - ld [hli], a - inc a - dec c - jr nz, .col - add 9 - pop hl - add hl, de - dec b - jr nz, .row - ret -; e1441 - -FillUnoccupiedPuzzleSpace: ; e1441 - ld a, 2 ; tilemap coords - call GetUnownPuzzleCoordData - ld a, [hli] - ld h, [hl] - ld l, a - push hl - ld a, 4 ; tile - call GetUnownPuzzleCoordData - ld a, [hl] - pop hl - ld de, SCREEN_WIDTH - ld b, 3 -.row - ld c, 3 - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - add hl, de - dec b - jr nz, .row - ret -; e1463 - -GetUnownPuzzleCoordData: ; e1463 - ld e, a - ld d, 0 - ld hl, UnownPuzzleCoordData - add hl, de - ld a, [wUnownPuzzleCursorPosition] - ld e, a -rept 6 - add hl, de -endr - ret -; e1475 - -UnownPuzzle_CheckCurrentTileOccupancy: ; e1475 - ld hl, wPuzzlePieces - ld a, [wUnownPuzzleCursorPosition] - ld e, a - ld d, $0 - add hl, de - ld a, [hl] - ret -; e1481 - -GetCurrentPuzzlePieceVTileCorner: ; e1481 - ld a, [wUnownPuzzleHeldPiece] - ld hl, .Corners - add l - ld l, a - ld a, $0 - adc h - ld h, a - ld a, [hl] - ret -; e148f - -.Corners: ; e148f -; 00, 01, 02 -; 0c, 0d, 0e -; 18, 19, 1a - db $e0 ; no piece selected - db $00, $03, $06, $09 - db $24, $27, $2a, $2d - db $48, $4b, $4e, $51 - db $6c, $6f, $72, $75 -; e14a0 - -CheckSolvedUnownPuzzle: ; e14a0 - ld hl, .SolvedPuzzleConfiguration - ld de, wPuzzlePieces - ld c, 6 * 6 -.loop - ld a, [de] - cp [hl] - jr nz, .not_solved - inc de - inc hl - dec c - jr nz, .loop - scf - ret - -.not_solved - and a - ret -; e14b5 - -.SolvedPuzzleConfiguration: ; e14b5 - db $00, $00, $00, $00, $00, $00 - db $00, $01, $02, $03, $04, $00 - db $00, $05, $06, $07, $08, $00 - db $00, $09, $0a, $0b, $0c, $00 - db $00, $0d, $0e, $0f, $10, $00 - db $00, $00, $00, $00, $00, $00 -; e14d9 - -RedrawUnownPuzzlePieces: ; e14d9 - call GetCurrentPuzzlePieceVTileCorner - ld [wd002], a - xor a - call GetUnownPuzzleCoordData ; get pixel positions - ld a, [hli] - ld b, [hl] - ld c, a - ld a, [wd002] - cp $e0 - jr z, .NoPiece - ld hl, .OAM_HoldingPiece - jr .load - -.NoPiece: - ld hl, .OAM_NotHoldingPiece - -.load - ld de, wVirtualOAMSprite00 -.loop - ld a, [hli] - cp -1 - ret z - add b - ld [de], a ; y - inc de - ld a, [hli] - add c - ld [de], a ; x - inc de - ld a, [wd002] - add [hl] - ld [de], a ; tile id - inc hl - inc de - ld a, [hli] - ld [de], a ; attributes - inc de - jr .loop -; e150f - -.OAM_HoldingPiece: ; e150f - dsprite -1, -4, -1, -4, $00, 0 - dsprite -1, -4, 0, -4, $01, 0 - dsprite -1, -4, 0, 4, $02, 0 - dsprite 0, -4, -1, -4, $0c, 0 - dsprite 0, -4, 0, -4, $0d, 0 - dsprite 0, -4, 0, 4, $0e, 0 - dsprite 0, 4, -1, -4, $18, 0 - dsprite 0, 4, 0, -4, $19, 0 - dsprite 0, 4, 0, 4, $1a, 0 - db -1 - -.OAM_NotHoldingPiece: ; e1534 - dsprite -1, -4, -1, -4, $00, 0 - dsprite -1, -4, 0, -4, $01, 0 - dsprite -1, -4, 0, 4, $00, 0 | X_FLIP - dsprite 0, -4, -1, -4, $02, 0 - dsprite 0, -4, 0, -4, $03, 0 - dsprite 0, -4, 0, 4, $02, 0 | X_FLIP - dsprite 0, 4, -1, -4, $00, 0 | Y_FLIP - dsprite 0, 4, 0, -4, $01, 0 | Y_FLIP - dsprite 0, 4, 0, 4, $00, 0 | X_FLIP | Y_FLIP - db -1 - -UnownPuzzleCoordData: ; e1559 - -puzzle_coords: MACRO - dbpixel \1, \2, \3, \4 - dwcoord \5, \6 - db \7, \8 -ENDM -; OAM coords, tilemap coords, vacant tile, filler - puzzle_coords 3, 3, 4, 4, 1, 0, PUZZLE_BORDER, 0 - puzzle_coords 6, 3, 4, 4, 4, 0, PUZZLE_BORDER, 0 - puzzle_coords 9, 3, 4, 4, 7, 0, PUZZLE_BORDER, 0 - puzzle_coords 12, 3, 4, 4, 10, 0, PUZZLE_BORDER, 0 - puzzle_coords 15, 3, 4, 4, 13, 0, PUZZLE_BORDER, 0 - puzzle_coords 18, 3, 4, 4, 16, 0, PUZZLE_BORDER, 0 - - puzzle_coords 3, 6, 4, 4, 1, 3, PUZZLE_BORDER, 0 - puzzle_coords 6, 6, 4, 4, 4, 3, PUZZLE_VOID, 0 - puzzle_coords 9, 6, 4, 4, 7, 3, PUZZLE_VOID, 0 - puzzle_coords 12, 6, 4, 4, 10, 3, PUZZLE_VOID, 0 - puzzle_coords 15, 6, 4, 4, 13, 3, PUZZLE_VOID, 0 - puzzle_coords 18, 6, 4, 4, 16, 3, PUZZLE_BORDER, 0 - - puzzle_coords 3, 9, 4, 4, 1, 6, PUZZLE_BORDER, 0 - puzzle_coords 6, 9, 4, 4, 4, 6, PUZZLE_VOID, 0 - puzzle_coords 9, 9, 4, 4, 7, 6, PUZZLE_VOID, 0 - puzzle_coords 12, 9, 4, 4, 10, 6, PUZZLE_VOID, 0 - puzzle_coords 15, 9, 4, 4, 13, 6, PUZZLE_VOID, 0 - puzzle_coords 18, 9, 4, 4, 16, 6, PUZZLE_BORDER, 0 - - puzzle_coords 3, 12, 4, 4, 1, 9, PUZZLE_BORDER, 0 - puzzle_coords 6, 12, 4, 4, 4, 9, PUZZLE_VOID, 0 - puzzle_coords 9, 12, 4, 4, 7, 9, PUZZLE_VOID, 0 - puzzle_coords 12, 12, 4, 4, 10, 9, PUZZLE_VOID, 0 - puzzle_coords 15, 12, 4, 4, 13, 9, PUZZLE_VOID, 0 - puzzle_coords 18, 12, 4, 4, 16, 9, PUZZLE_BORDER, 0 - - puzzle_coords 3, 15, 4, 4, 1, 12, PUZZLE_BORDER, 0 - puzzle_coords 6, 15, 4, 4, 4, 12, PUZZLE_VOID, 0 - puzzle_coords 9, 15, 4, 4, 7, 12, PUZZLE_VOID, 0 - puzzle_coords 12, 15, 4, 4, 10, 12, PUZZLE_VOID, 0 - puzzle_coords 15, 15, 4, 4, 13, 12, PUZZLE_VOID, 0 - puzzle_coords 18, 15, 4, 4, 16, 12, PUZZLE_BORDER, 0 - - puzzle_coords 3, 18, 4, 4, 1, 15, PUZZLE_BORDER, 0 - puzzle_coords 6, 18, 4, 4, 4, 15, PUZZLE_BORDER, 0 - puzzle_coords 9, 18, 4, 4, 7, 15, PUZZLE_BORDER, 0 - puzzle_coords 12, 18, 4, 4, 10, 15, PUZZLE_BORDER, 0 - puzzle_coords 15, 18, 4, 4, 13, 15, PUZZLE_BORDER, 0 - puzzle_coords 18, 18, 4, 4, 16, 15, PUZZLE_BORDER, 0 - -ConvertLoadedPuzzlePieces: ; e1631 - ld hl, vTiles2 - ld de, vTiles0 - ld b, 6 -.loop - push bc - push hl - push hl - call .EnlargePuzzlePieceTiles - pop hl - ld bc, 1 tiles / 2 - add hl, bc - call .EnlargePuzzlePieceTiles - pop hl - ld bc, 6 tiles - add hl, bc - pop bc - dec b - jr nz, .loop - call UnownPuzzle_AddPuzzlePieceBorders - ret -; e1654 - -.EnlargePuzzlePieceTiles: ; e1654 -; double size - ld c, 6 -.loop1 - push bc - push hl - push hl - ld c, 4 -.loop2 - push bc - ld a, [hli] - and $f0 - swap a - call .GetEnlargedTile - ld c, a - ld a, [hli] - and $f0 - swap a - call .GetEnlargedTile - ld b, a - ld a, c - ld [de], a - inc de - ld a, b - ld [de], a - inc de - ld a, c - ld [de], a - inc de - ld a, b - ld [de], a - inc de - pop bc - dec c - jr nz, .loop2 - pop hl - ld c, 4 -.loop3 - push bc - ld a, [hli] - and $f - call .GetEnlargedTile - ld c, a - ld a, [hli] - and $f - call .GetEnlargedTile - ld b, a - ld a, c - ld [de], a - inc de - ld a, b - ld [de], a - inc de - ld a, c - ld [de], a - inc de - ld a, b - ld [de], a - inc de - pop bc - dec c - jr nz, .loop3 - pop hl - ld bc, 1 tiles - add hl, bc - pop bc - dec c - jr nz, .loop1 - ret -; e16aa - -.GetEnlargedTile: ; e16aa - push hl - ld hl, .EnlargedTiles - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, [hl] - pop hl - ret -; e16b7 - -.EnlargedTiles: ; e16b7 - -x = 0 -rept 16 - db ((x & %1000) * %11000) + ((x & %0100) * %1100) + ((x & %0010) * %110) + ((x & %0001) * %11) -x = x + 1 -endr -; e16c7 - -UnownPuzzle_AddPuzzlePieceBorders: ; e16c7 - ld hl, PuzzlePieceBorderData - ld a, 8 -.loop - push af - push hl - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - ld a, [hli] - ld h, [hl] - ld l, a - call .LoadGFX - pop hl -rept 4 - inc hl -endr - pop af - dec a - jr nz, .loop - ret -; e16e2 - -.LoadGFX: ; e16e2 - lb bc, 4, 4 -.loop1 - push bc - -.loop2 - push de - push hl - - ld b, 1 tiles -.loop3 - ld a, [de] - or [hl] - ld [hli], a - inc de - dec b - jr nz, .loop3 - - pop hl - ld de, 3 tiles - add hl, de - pop de - dec c - jr nz, .loop2 - - ld bc, 24 tiles - add hl, bc - pop bc - dec b - jr nz, .loop1 - ret -; e1703 - -PuzzlePieceBorderData: ; e1703 - dw .TileBordersGFX + 0 tiles, vTiles0 tile $00 - dw .TileBordersGFX + 1 tiles, vTiles0 tile $01 - dw .TileBordersGFX + 2 tiles, vTiles0 tile $02 - dw .TileBordersGFX + 3 tiles, vTiles0 tile $0c - dw .TileBordersGFX + 4 tiles, vTiles0 tile $0e - dw .TileBordersGFX + 5 tiles, vTiles0 tile $18 - dw .TileBordersGFX + 6 tiles, vTiles0 tile $19 - dw .TileBordersGFX + 7 tiles, vTiles0 tile $1a -; e1723 - -.TileBordersGFX: ; e1723 -INCBIN "gfx/unown_puzzle/tile_borders.2bpp" - -LoadUnownPuzzlePiecesGFX: ; e17a3 - ld a, [wScriptVar] - maskbits NUM_UNOWN_PUZZLES - ld e, a - ld d, 0 - ld hl, .LZPointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, vTiles2 - call Decompress - call ConvertLoadedPuzzlePieces - ret -; e17bd - -.LZPointers: ; e17bd -; entries correspond to UNOWNPUZZLE_* constants - dw KabutoPuzzleLZ - dw OmanytePuzzleLZ - dw AerodactylPuzzleLZ - dw HoOhPuzzleLZ -; e17c5 - -UnownPuzzleCursorGFX: ; e17c5 -INCBIN "gfx/unown_puzzle/cursor.2bpp" - -UnownPuzzleStartCancelLZ: ; e1805 -INCBIN "gfx/unown_puzzle/start_cancel.2bpp.lz" - -HoOhPuzzleLZ: ; e18ab -INCBIN "gfx/unown_puzzle/hooh.2bpp.lz" - -AerodactylPuzzleLZ: ; e19fb -INCBIN "gfx/unown_puzzle/aerodactyl.2bpp.lz" - -KabutoPuzzleLZ: ; e1bab -INCBIN "gfx/unown_puzzle/kabuto.2bpp.lz" - -OmanytePuzzleLZ: ; e1c9b -INCBIN "gfx/unown_puzzle/omanyte.2bpp.lz" diff --git a/engine/unused_title.asm b/engine/unused_title.asm deleted file mode 100644 index 8e52a71bb..000000000 --- a/engine/unused_title.asm +++ /dev/null @@ -1,178 +0,0 @@ -UnusedTitleScreen: ; 10c000 - - call ClearBGPalettes - call ClearTileMap - call DisableLCD - -; Turn BG Map update off - xor a - ld [hBGMapMode], a - -; Reset timing variables - ld hl, wJumptableIndex - ld [hli], a ; wJumptableIndex - ld [hli], a ; wIntroSceneFrameCounter - ld [hli], a ; wTitleScreenTimer - ld [hl], a ; wTitleScreenTimer + 1 - - ld hl, UnusedTitleBG_GFX - ld de, vTiles2 - ld bc, vBGMap0 - vTiles2 - call CopyBytes - - ld hl, UnusedTitleBG_GFX + $80 tiles - ld de, vTiles1 - ld bc, vTiles2 - vTiles1 - call CopyBytes - - ld hl, UnusedTitleFG_GFX - ld de, vTiles0 - ld bc, vTiles1 - vTiles0 - call CopyBytes - - ld hl, UnusedTitleBG_Tilemap - debgcoord 0, 0 - ld bc, BG_MAP_WIDTH * BG_MAP_HEIGHT -.copy - ld a, 0 - ld [rVBK], a - ld a, [hli] - ld [de], a - ld a, 1 - ld [rVBK], a - ld a, [hli] - ld [de], a - inc de - dec bc - ld a, b - or c - jr nz, .copy - - ld hl, UnusedTitleFG_OAM - ld de, wVirtualOAMSprite00 - ld bc, SPRITEOAMSTRUCT_LENGTH * NUM_SPRITE_OAM_STRUCTS - call CopyBytes - - call EnableLCD - ld a, [rLCDC] - set rLCDC_SPRITES_ENABLE, a - set rLCDC_SPRITE_SIZE, a - ld [rLCDC], a - - call DelayFrame - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld hl, UnusedTitleBG_Palettes - ld de, wBGPals1 - ld bc, 8 palettes - call CopyBytes - - ld hl, UnusedTitleFG_Palettes - ld de, wOBPals1 - ld bc, 8 palettes - call CopyBytes - - ld hl, UnusedTitleBG_Palettes - ld de, wBGPals2 - ld bc, 8 palettes - call CopyBytes - - ld hl, UnusedTitleFG_Palettes - ld de, wOBPals2 - ld bc, 8 palettes - call CopyBytes - - pop af - ld [rSVBK], a - - ld a, $1 - ld [hCGBPalUpdate], a - - ld de, MUSIC_TITLE - call PlayMusic - - ret -; 10c0b1 - -UnusedTitleBG_GFX: ; 10c0b1 -INCBIN "gfx/title/old_bg.2bpp" -; 10d0b1 - -UnusedTitleBG_Tilemap: ; 10d0b1 -; 32x32 (alternating tiles and attributes) -INCBIN "gfx/title/old_bg.tilemap" -; 10d8b1 - -UnusedTitleBG_Palettes: ; 10d8b1 -INCLUDE "gfx/title/old_bg.pal" -; 10dab1 - -UnusedTitleFG_GFX: ; 10dab1 -INCBIN "gfx/title/old_fg.2bpp" -; 10eab1 - -UnusedTitleFG_Palettes: ; 10eab1 -INCLUDE "gfx/title/old_fg.pal" -; 10ecb1 - -UnusedTitleFG_OAM: ; 10ecb1 - dsprite 3, 0, 7, 0, $00, 1 - dsprite 3, 0, 8, 0, $02, 1 - dsprite 3, 0, 9, 0, $04, 1 - dsprite 3, 0, 10, 0, $06, 1 - dsprite 3, 0, 11, 0, $08, 1 - dsprite 3, 0, 12, 0, $0a, 1 - dsprite 3, 0, 13, 0, $0c, 1 - dsprite 3, 0, 14, 0, $0e, 1 - dsprite 5, 0, 7, 0, $10, 0 - dsprite 5, 0, 8, 0, $12, 0 - dsprite 5, 0, 9, 0, $14, 0 - dsprite 5, 0, 10, 0, $16, 0 - dsprite 5, 0, 11, 0, $18, 0 - dsprite 5, 0, 12, 0, $1a, 0 - dsprite 5, 0, 13, 0, $1c, 0 - dsprite 5, 0, 14, 0, $1e, 0 - dsprite 7, 0, 7, 0, $20, 0 - dsprite 7, 0, 8, 0, $22, 0 - dsprite 7, 0, 9, 0, $24, 0 - dsprite 7, 0, 10, 0, $26, 0 - dsprite 7, 0, 11, 0, $28, 0 - dsprite 7, 0, 12, 0, $2a, 0 - dsprite 7, 0, 13, 0, $2c, 0 - dsprite 7, 0, 14, 0, $2e, 0 - dsprite 9, 0, 7, 0, $30, 2 - dsprite 9, 0, 8, 0, $32, 2 - dsprite 9, 0, 9, 0, $34, 2 - dsprite 9, 0, 10, 0, $36, 2 - dsprite 9, 0, 11, 0, $38, 2 - dsprite 9, 0, 12, 0, $3a, 2 - dsprite 9, 0, 13, 0, $3c, 2 - dsprite 9, 0, 14, 0, $3e, 2 - dsprite 11, 0, 7, 0, $40, 1 - dsprite 11, 0, 8, 0, $42, 1 - dsprite 11, 0, 9, 0, $44, 1 - dsprite 11, 0, 10, 0, $46, 1 - dsprite 11, 0, 11, 0, $48, 1 - dsprite 11, 0, 12, 0, $4a, 1 - dsprite 11, 0, 13, 0, $4c, 1 - dsprite 11, 0, 14, 0, $4e, 1 -; 10ed51 - -Function10ed51: ; 10ed51 - call _TitleScreen -.loop - call JoyTextDelay - ld a, [hJoyLast] - ld b, a - and 1 - jr nz, .done - call SuicuneFrameIterator - call DelayFrame - jr .loop -.done - ret -; 10ed67 diff --git a/engine/variables.asm b/engine/variables.asm deleted file mode 100755 index 89026fdba..000000000 --- a/engine/variables.asm +++ /dev/null @@ -1,151 +0,0 @@ -_GetVarAction:: ; 80648 (20:4648) - ld a, c - cp NUM_VARS - jr c, .valid - xor a -.valid - ld c, a - ld b, 0 - ld hl, .VarActionTable - add hl, bc - add hl, bc - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - inc hl - ld b, [hl] - ld a, b - and RETVAR_EXECUTE - jr nz, .call - ld a, b - and RETVAR_ADDR_DE - ret nz - ld a, [de] - jr .loadstringbuffer2 - -.call - call _de_ - ret - -.loadstringbuffer2 ; 8066c (20:466c) - ld de, wStringBuffer2 - ld [de], a - ret -; 80671 (20:4671) - -.VarActionTable: ; 80671 -; entries correspond to VAR_* constants - ; RETVAR_STRBUF2: copy [de] to wStringBuffer2 - ; RETVAR_ADDR_DE: return address in de - ; RETVAR_EXECUTE: call function - dwb wStringBuffer2, RETVAR_STRBUF2 - dwb wPartyCount, RETVAR_STRBUF2 - dwb .BattleResult, RETVAR_EXECUTE - dwb wBattleType, RETVAR_ADDR_DE - dwb wTimeOfDay, RETVAR_STRBUF2 - dwb .CountCaughtMons, RETVAR_EXECUTE - dwb .CountSeenMons, RETVAR_EXECUTE - dwb .CountBadges, RETVAR_EXECUTE - dwb wPlayerState, RETVAR_ADDR_DE - dwb .PlayerFacing, RETVAR_EXECUTE - dwb hHours, RETVAR_STRBUF2 - dwb .DayOfWeek, RETVAR_EXECUTE - dwb wMapGroup, RETVAR_STRBUF2 - dwb wMapNumber, RETVAR_STRBUF2 - dwb .UnownCaught, RETVAR_EXECUTE - dwb wEnvironment, RETVAR_STRBUF2 - dwb .BoxFreeSpace, RETVAR_EXECUTE - dwb wBugContestMinsRemaining, RETVAR_STRBUF2 - dwb wXCoord, RETVAR_STRBUF2 - dwb wYCoord, RETVAR_STRBUF2 - dwb wSpecialPhoneCallID, RETVAR_STRBUF2 - dwb wNrOfBeatenBattleTowerTrainers, RETVAR_STRBUF2 - dwb wKurtApricornQuantity, RETVAR_STRBUF2 - dwb wCurrentCaller, RETVAR_ADDR_DE - dwb wBlueCardBalance, RETVAR_ADDR_DE - dwb wBuenasPassword, RETVAR_ADDR_DE - dwb wKenjiBreakTimer, RETVAR_STRBUF2 - dwb NULL, RETVAR_STRBUF2 -; 806c5 - -.CountCaughtMons: ; 806c5 -; Caught mons. - ld hl, wPokedexCaught - ld b, wEndPokedexCaught - wPokedexCaught - call CountSetBits - ld a, [wd265] - jp .loadstringbuffer2 -; 806d3 - -.CountSeenMons: ; 806d3 -; Seen mons. - ld hl, wPokedexSeen - ld b, wEndPokedexSeen - wPokedexSeen - call CountSetBits - ld a, [wd265] - jp .loadstringbuffer2 -; 806e1 - -.CountBadges: ; 806e1 -; Number of owned badges. - ld hl, wBadges - ld b, 2 - call CountSetBits - ld a, [wd265] - jp .loadstringbuffer2 -; 806ef - -.PlayerFacing: ; 806ef -; The direction the player is facing. - ld a, [wPlayerDirection] - and $c - rrca - rrca - jp .loadstringbuffer2 -; 806f9 - -.DayOfWeek: ; 806f9 -; The day of the week. - call GetWeekday - jp .loadstringbuffer2 -; 806ff - -.UnownCaught: ; 806ff -; Number of unique Unown caught. - call .count - ld a, b - jp .loadstringbuffer2 - -.count - ld hl, wUnownDex - ld b, 0 -.loop - ld a, [hli] - and a - ret z - inc b - ld a, b - cp NUM_UNOWN - jr c, .loop - ret -; 80715 - -.BoxFreeSpace: ; 80715 -; Remaining slots in the current box. - ld a, BANK(sBoxCount) - call GetSRAMBank - ld hl, sBoxCount - ld a, MONS_PER_BOX - sub [hl] - ld b, a - call CloseSRAM - ld a, b - jp .loadstringbuffer2 -; 80728 - -.BattleResult: ; 80728 - ld a, [wBattleResult] - and $3f - jp .loadstringbuffer2 -; 80730 diff --git a/engine/warp_connection.asm b/engine/warp_connection.asm deleted file mode 100755 index 069b72234..000000000 --- a/engine/warp_connection.asm +++ /dev/null @@ -1,439 +0,0 @@ - -HandleNewMap: ; 1045b0 - call Clearwc7e8 - call ResetMapBufferEventFlags - call ResetFlashIfOutOfCave - call GetCurrentMapSceneID - call ResetBikeFlags - ld a, MAPCALLBACK_NEWMAP - call RunMapCallback -InitCommandQueue: ; 1045c4 - farcall ClearCmdQueue - ld a, MAPCALLBACK_CMDQUEUE - call RunMapCallback - call GetMapTimeOfDay - ld [wMapTimeOfDay], a - ret - - -EnterMapConnection: ; 1045d6 -; Return carry if a connection has been entered. - ld a, [wPlayerStepDirection] - and a - jp z, .south - cp UP - jp z, .north - cp LEFT - jp z, .west - cp RIGHT - jp z, .east - ret - -.west - ld a, [wWestConnectedMapGroup] - ld [wMapGroup], a - ld a, [wWestConnectedMapNumber] - ld [wMapNumber], a - ld a, [wWestConnectionStripXOffset] - ld [wXCoord], a - ld a, [wWestConnectionStripYOffset] - ld hl, wYCoord - add [hl] - ld [hl], a - ld c, a - ld hl, wWestConnectionWindow - ld a, [hli] - ld h, [hl] - ld l, a - srl c - jr z, .skip_to_load - ld a, [wWestConnectedMapWidth] - add 6 - ld e, a - ld d, 0 - -.loop - add hl, de - dec c - jr nz, .loop - -.skip_to_load - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a - jp .done - -.east - ld a, [wEastConnectedMapGroup] - ld [wMapGroup], a - ld a, [wEastConnectedMapNumber] - ld [wMapNumber], a - ld a, [wEastConnectionStripXOffset] - ld [wXCoord], a - ld a, [wEastConnectionStripYOffset] - ld hl, wYCoord - add [hl] - ld [hl], a - ld c, a - ld hl, wEastConnectionWindow - ld a, [hli] - ld h, [hl] - ld l, a - srl c - jr z, .skip_to_load2 - ld a, [wEastConnectedMapWidth] - add 6 - ld e, a - ld d, 0 - -.loop2 - add hl, de - dec c - jr nz, .loop2 - -.skip_to_load2 - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a - jp .done - -.north - ld a, [wNorthConnectedMapGroup] - ld [wMapGroup], a - ld a, [wNorthConnectedMapNumber] - ld [wMapNumber], a - ld a, [wNorthConnectionStripYOffset] - ld [wYCoord], a - ld a, [wNorthConnectionStripXOffset] - ld hl, wXCoord - add [hl] - ld [hl], a - ld c, a - ld hl, wNorthConnectionWindow - ld a, [hli] - ld h, [hl] - ld l, a - ld b, 0 - srl c - add hl, bc - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a - jp .done - -.south - ld a, [wSouthConnectedMapGroup] - ld [wMapGroup], a - ld a, [wSouthConnectedMapNumber] - ld [wMapNumber], a - ld a, [wSouthConnectionStripYOffset] - ld [wYCoord], a - ld a, [wSouthConnectionStripXOffset] - ld hl, wXCoord - add [hl] - ld [hl], a - ld c, a - ld hl, wSouthConnectionWindow - ld a, [hli] - ld h, [hl] - ld l, a - ld b, 0 - srl c - add hl, bc - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a -.done - scf - ret -; 1046c6 - -LoadWarpData: ; 1046c6 - call .SaveDigWarp - call .SetSpawn - ld a, [wNextWarp] - ld [wWarpNumber], a - ld a, [wNextMapGroup] - ld [wMapGroup], a - ld a, [wNextMapNumber] - ld [wMapNumber], a - ret - -.SaveDigWarp: ; 1046df (41:46df) - call GetMapEnvironment - call CheckOutdoorMap - ret nz - ld a, [wNextMapGroup] - ld b, a - ld a, [wNextMapNumber] - ld c, a - call GetAnyMapEnvironment - call CheckIndoorMap - ret nz - -; MOUNT_MOON_SQUARE and TIN_TOWER_ROOF are outdoor maps within indoor maps. -; Dig and Escape Rope should not take you to them. - ld a, [wPrevMapGroup] - cp GROUP_MOUNT_MOON_SQUARE ; GROUP_TIN_TOWER_ROOF - jr nz, .not_mt_moon_or_tin_tower - ld a, [wPrevMapNumber] - cp MAP_MOUNT_MOON_SQUARE - ret z - cp MAP_TIN_TOWER_ROOF - ret z -.not_mt_moon_or_tin_tower - - ld a, [wPrevWarp] - ld [wDigWarpNumber], a - ld a, [wPrevMapGroup] - ld [wDigMapGroup], a - ld a, [wPrevMapNumber] - ld [wDigMapNumber], a - ret - -.SetSpawn: ; 104718 (41:4718) - call GetMapEnvironment - call CheckOutdoorMap - ret nz - ld a, [wNextMapGroup] - ld b, a - ld a, [wNextMapNumber] - ld c, a - call GetAnyMapEnvironment - call CheckIndoorMap - ret nz - ld a, [wNextMapGroup] - ld b, a - ld a, [wNextMapNumber] - ld c, a - -; Respawn in Pokémon Centers. - call GetAnyMapTileset - ld a, c - cp TILESET_POKECENTER - jr z, .pokecenter_pokecom - cp TILESET_POKECOM_CENTER - jr z, .pokecenter_pokecom - ret -.pokecenter_pokecom - - ld a, [wPrevMapGroup] - ld [wLastSpawnMapGroup], a - ld a, [wPrevMapNumber] - ld [wLastSpawnMapNumber], a - ret - -LoadMapTimeOfDay: ; 104750 - ld hl, wVramState - res 6, [hl] - ld a, $1 - ld [wSpriteUpdatesEnabled], a - farcall ReplaceTimeOfDayPals - farcall UpdateTimeOfDayPal - call OverworldTextModeSwitch - call .ClearBGMap - call .PushAttrMap - ret - -.ClearBGMap: ; 104770 (41:4770) - ld a, HIGH(vBGMap0) - ld [wBGMapAnchor + 1], a - xor a ; LOW(vBGMap0) - ld [wBGMapAnchor], a - ld [hSCY], a - ld [hSCX], a - farcall ApplyBGMapAnchorToObjects - - ld a, [rVBK] - push af - ld a, $1 - ld [rVBK], a - - xor a - ld bc, vBGMap1 - vBGMap0 - hlbgcoord 0, 0 - call ByteFill - - pop af - ld [rVBK], a - - ld a, "■" - ld bc, vBGMap1 - vBGMap0 - hlbgcoord 0, 0 - call ByteFill - ret - -.PushAttrMap: ; 1047a3 (41:47a3) - decoord 0, 0 - call .copy - ld a, [hCGB] - and a - ret z - - decoord 0, 0, wAttrMap - ld a, $1 - ld [rVBK], a -.copy - hlbgcoord 0, 0 - ld c, SCREEN_WIDTH - ld b, SCREEN_HEIGHT -.row - push bc -.column - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .column - ld bc, BG_MAP_WIDTH - SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ld a, $0 - ld [rVBK], a - ret - -LoadGraphics: ; 1047cf - call LoadTileset - call LoadTilesetGFX - xor a - ld [hMapAnims], a - xor a - ld [hTileAnimFrame], a - farcall RefreshSprites - call LoadFontsExtra - farcall LoadOverworldFont - ret - -LoadMapPalettes: ; 1047eb - ld b, SCGB_MAPPALS - jp GetSGBLayout -; 1047f0 - -RefreshMapSprites: ; 1047f0 - call ClearSprites - farcall ReturnFromMapSetupScript - call GetMovementPermissions - farcall RefreshPlayerSprite - farcall CheckReplaceKrisSprite - ld hl, wPlayerSpriteSetupFlags - bit PLAYERSPRITESETUP_SKIP_RELOAD_GFX_F, [hl] - jr nz, .skip - ld hl, wVramState - set 0, [hl] - call SafeUpdateSprites -.skip - ld a, [wPlayerSpriteSetupFlags] - and %00011100 - ld [wPlayerSpriteSetupFlags], a - ret - -CheckMovingOffEdgeOfMap:: ; 104820 (41:4820) - ld a, [wPlayerStepDirection] - cp STANDING - ret z - and a ; DOWN - jr z, .down - cp UP - jr z, .up - cp LEFT - jr z, .left - cp RIGHT - jr z, .right - and a - ret - -.down - ld a, [wPlayerStandingMapY] - sub 4 - ld b, a - ld a, [wMapHeight] - add a - cp b - jr z, .ok - and a - ret - -.up - ld a, [wPlayerStandingMapY] - sub 4 - cp -1 - jr z, .ok - and a - ret - -.left - ld a, [wPlayerStandingMapX] - sub 4 - cp -1 - jr z, .ok - and a - ret - -.right - ld a, [wPlayerStandingMapX] - sub 4 - ld b, a - ld a, [wMapWidth] - add a - cp b - jr z, .ok - and a - ret - -.ok - scf - ret - - -GetCoordOfUpperLeftCorner:: ; 10486d - ld hl, wOverworldMap - ld a, [wXCoord] - bit 0, a - jr nz, .increment_then_halve1 - srl a - add $1 - jr .resume - -.increment_then_halve1 - add $1 - srl a - -.resume - ld c, a - ld b, $0 - add hl, bc - ld a, [wMapWidth] - add $6 - ld c, a - ld b, $0 - ld a, [wYCoord] - bit 0, a - jr nz, .increment_then_halve2 - srl a - add $1 - jr .resume2 - -.increment_then_halve2 - add $1 - srl a - -.resume2 - call AddNTimes - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a - ld a, [wYCoord] - and $1 - ld [wMetatileStandingY], a - ld a, [wXCoord] - and $1 - ld [wMetatileStandingX], a - ret -; 1048ba diff --git a/engine/wildmons.asm b/engine/wildmons.asm deleted file mode 100755 index 494e8d2a4..000000000 --- a/engine/wildmons.asm +++ /dev/null @@ -1,1000 +0,0 @@ -LoadWildMonData: ; 29ff8 - call _GrassWildmonLookup - jr c, .copy - ld hl, wMornEncounterRate - xor a - ld [hli], a - ld [hli], a - ld [hl], a - jr .done_copy - -.copy - inc hl - inc hl - ld de, wMornEncounterRate - ld bc, 3 - call CopyBytes -.done_copy - call _WaterWildmonLookup - ld a, 0 - jr nc, .no_copy - inc hl - inc hl - ld a, [hl] -.no_copy - ld [wWaterEncounterRate], a - ret - -FindNest: ; 2a01f -; Parameters: -; e: 0 = Johto, 1 = Kanto -; wNamedObjectIndexBuffer: species - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - ld a, e - and a - jr nz, .kanto - decoord 0, 0 - ld hl, JohtoGrassWildMons - call .FindGrass - ld hl, JohtoWaterWildMons - call .FindWater - call .RoamMon1 - call .RoamMon2 - ret - -.kanto - decoord 0, 0 - ld hl, KantoGrassWildMons - call .FindGrass - ld hl, KantoWaterWildMons - jp .FindWater -; 2a052 - -.FindGrass: ; 2a052 - ld a, [hl] - cp -1 - ret z - push hl - ld a, [hli] - ld b, a - ld a, [hli] - ld c, a - inc hl - inc hl - inc hl - ld a, NUM_GRASSMON * 3 - call .SearchMapForMon - jr nc, .next_grass - ld [de], a - inc de - -.next_grass - pop hl - ld bc, GRASS_WILDDATA_LENGTH - add hl, bc - jr .FindGrass -; 2a06e - -.FindWater: ; 2a06e - ld a, [hl] - cp -1 - ret z - push hl - ld a, [hli] - ld b, a - ld a, [hli] - ld c, a - inc hl - ld a, 3 - call .SearchMapForMon - jr nc, .next_water - ld [de], a - inc de - -.next_water - pop hl - ld bc, 3 * 3 - add hl, bc - jr .FindWater -; 2a088 - -.SearchMapForMon: ; 2a088 - inc hl -.ScanMapLoop: - push af - ld a, [wNamedObjectIndexBuffer] - cp [hl] - jr z, .found - inc hl - inc hl - pop af - dec a - jr nz, .ScanMapLoop - and a - ret - -.found - pop af - jp .AppendNest -; 2a09c - -.AppendNest: ; 2a09c - push de - call GetWorldMapLocation - ld c, a - hlcoord 0, 0 - ld de, SCREEN_WIDTH * SCREEN_HEIGHT -.AppendNestLoop: - ld a, [hli] - cp c - jr z, .found_nest - dec de - ld a, e - or d - jr nz, .AppendNestLoop - ld a, c - pop de - scf - ret - -.found_nest - pop de - and a - ret -; 2a0b7 - -.RoamMon1: ; 2a0b7 - ld a, [wRoamMon1Species] - ld b, a - ld a, [wNamedObjectIndexBuffer] - cp b - ret nz - ld a, [wRoamMon1MapGroup] - ld b, a - ld a, [wRoamMon1MapNumber] - ld c, a - call .AppendNest - ret nc - ld [de], a - inc de - ret -; 2a0cf - -.RoamMon2: ; 2a0cf - ld a, [wRoamMon2Species] - ld b, a - ld a, [wNamedObjectIndexBuffer] - cp b - ret nz - ld a, [wRoamMon2MapGroup] - ld b, a - ld a, [wRoamMon2MapNumber] - ld c, a - call .AppendNest - ret nc - ld [de], a - inc de - ret -; 2a0e7 - -TryWildEncounter:: ; 2a0e7 -; Try to trigger a wild encounter. - call .EncounterRate - jr nc, .no_battle - call ChooseWildEncounter - jr nz, .no_battle - call CheckRepelEffect - jr nc, .no_battle - xor a - ret - -.no_battle - xor a ; BATTLETYPE_NORMAL - ld [wTempWildMonSpecies], a - ld [wBattleType], a - ld a, 1 - and a - ret -; 2a103 - -.EncounterRate: ; 2a103 - call GetMapEncounterRate - call ApplyMusicEffectOnEncounterRate - call ApplyCleanseTagEffectOnEncounterRate - call Random - cp b - ret -; 2a111 - -GetMapEncounterRate: ; 2a111 - ld hl, wMornEncounterRate - call CheckOnWater - ld a, wWaterEncounterRate - wMornEncounterRate - jr z, .ok - ld a, [wTimeOfDay] -.ok - ld c, a - ld b, 0 - add hl, bc - ld b, [hl] - ret -; 2a124 - -ApplyMusicEffectOnEncounterRate:: ; 2a124 -; Pokemon March and Ruins of Alph signal double encounter rate. -; Pokemon Lullaby halves encounter rate. - ld a, [wMapMusic] - cp MUSIC_POKEMON_MARCH - jr z, .double - cp MUSIC_RUINS_OF_ALPH_RADIO - jr z, .double - cp MUSIC_POKEMON_LULLABY - ret nz - srl b - ret - -.double - sla b - ret -; 2a138 - -ApplyCleanseTagEffectOnEncounterRate:: ; 2a138 -; Cleanse Tag halves encounter rate. - ld hl, wPartyMon1Item - ld de, PARTYMON_STRUCT_LENGTH - ld a, [wPartyCount] - ld c, a -.loop - ld a, [hl] - cp CLEANSE_TAG - jr z, .cleansetag - add hl, de - dec c - jr nz, .loop - ret - -.cleansetag - srl b - ret -; 2a14f - -ChooseWildEncounter: ; 2a14f - call LoadWildMonDataPointer - jp nc, .nowildbattle - call CheckEncounterRoamMon - jp c, .startwildbattle - - inc hl - inc hl - inc hl - call CheckOnWater - ld de, WaterMonProbTable - jr z, .watermon - inc hl - inc hl - ld a, [wTimeOfDay] - ld bc, $e - call AddNTimes - ld de, GrassMonProbTable - -.watermon -; hl contains the pointer to the wild mon data, let's save that to the stack - push hl -.randomloop - call Random - cp 100 - jr nc, .randomloop - inc a ; 1 <= a <= 100 - ld b, a - ld h, d - ld l, e -; This next loop chooses which mon to load up. -.prob_bracket_loop - ld a, [hli] - cp b - jr nc, .got_it - inc hl - jr .prob_bracket_loop - -.got_it - ld c, [hl] - ld b, 0 - pop hl - add hl, bc ; this selects our mon - ld a, [hli] - ld b, a -; If the Pokemon is encountered by surfing, we need to give the levels some variety. - call CheckOnWater - jr nz, .ok -; Check if we buff the wild mon, and by how much. - call Random - cp 35 percent - jr c, .ok - inc b - cp 65 percent - jr c, .ok - inc b - cp 85 percent - jr c, .ok - inc b - cp 95 percent - jr c, .ok - inc b -; Store the level -.ok - ld a, b - ld [wCurPartyLevel], a - ld b, [hl] - ; ld a, b - call ValidateTempWildMonSpecies - jr c, .nowildbattle - - ld a, b ; This is in the wrong place. - cp UNOWN - jr nz, .done - - ld a, [wUnlockedUnowns] - and a - jr z, .nowildbattle - -.done - jr .loadwildmon - -.nowildbattle - ld a, 1 - and a - ret - -.loadwildmon - ld a, b - ld [wTempWildMonSpecies], a - -.startwildbattle - xor a - ret -; 2a1cb - -INCLUDE "data/wild/probabilities.asm" - -CheckRepelEffect:: ; 2a1df -; If there is no active Repel, there's no need to be here. - ld a, [wRepelEffect] - and a - jr z, .encounter -; Get the first Pokemon in your party that isn't fainted. - ld hl, wPartyMon1HP - ld bc, PARTYMON_STRUCT_LENGTH - 1 -.loop - ld a, [hli] - or [hl] - jr nz, .ok - add hl, bc - jr .loop - -.ok -; to PartyMonLevel -rept 4 - dec hl -endr - - ld a, [wCurPartyLevel] - cp [hl] - jr nc, .encounter - and a - ret - -.encounter - scf - ret -; 2a200 - -LoadWildMonDataPointer: ; 2a200 - call CheckOnWater - jr z, _WaterWildmonLookup - -_GrassWildmonLookup: ; 2a205 - ld hl, SwarmGrassWildMons - ld bc, GRASS_WILDDATA_LENGTH - call _SwarmWildmonCheck - ret c - ld hl, JohtoGrassWildMons - ld de, KantoGrassWildMons - call _JohtoWildmonCheck - ld bc, GRASS_WILDDATA_LENGTH - jr _NormalWildmonOK - -_WaterWildmonLookup: ; 2a21d - ld hl, SwarmWaterWildMons - ld bc, WATER_WILDDATA_LENGTH - call _SwarmWildmonCheck - ret c - ld hl, JohtoWaterWildMons - ld de, KantoWaterWildMons - call _JohtoWildmonCheck - ld bc, WATER_WILDDATA_LENGTH - jr _NormalWildmonOK - -_JohtoWildmonCheck - call IsInJohto - and a - ret z - ld h, d - ld l, e - ret - -_SwarmWildmonCheck - call CopyCurrMapDE - push hl - ld hl, wSwarmFlags - bit SWARMFLAGS_DUNSPARCE_SWARM_F, [hl] - pop hl - jr z, .CheckYanma - ld a, [wDunsparceMapGroup] - cp d - jr nz, .CheckYanma - ld a, [wDunsparceMapNumber] - cp e - jr nz, .CheckYanma - call LookUpWildmonsForMapDE - jr nc, _NoSwarmWildmon - scf - ret - -.CheckYanma: - push hl - ld hl, wSwarmFlags - bit SWARMFLAGS_YANMA_SWARM_F, [hl] - pop hl - jr z, _NoSwarmWildmon - ld a, [wYanmaMapGroup] - cp d - jr nz, _NoSwarmWildmon - ld a, [wYanmaMapNumber] - cp e - jr nz, _NoSwarmWildmon - call LookUpWildmonsForMapDE - jr nc, _NoSwarmWildmon - scf - ret - -_NoSwarmWildmon - and a - ret - -_NormalWildmonOK - call CopyCurrMapDE - jr LookUpWildmonsForMapDE -; 2a27f - -CopyCurrMapDE: ; 2a27f - ld a, [wMapGroup] - ld d, a - ld a, [wMapNumber] - ld e, a - ret -; 2a288 - -LookUpWildmonsForMapDE: ; 2a288 -.loop - push hl - ld a, [hl] - inc a - jr z, .nope - ld a, d - cp [hl] - jr nz, .next - inc hl - ld a, e - cp [hl] - jr z, .yup - -.next - pop hl - add hl, bc - jr .loop - -.nope - pop hl - and a - ret - -.yup - pop hl - scf - ret -; 2a2a0 - - -InitRoamMons: ; 2a2a0 -; initialize wRoamMon structs - -; species - ld a, RAIKOU - ld [wRoamMon1Species], a - ld a, ENTEI - ld [wRoamMon2Species], a - -; level - ld a, 40 - ld [wRoamMon1Level], a - ld [wRoamMon2Level], a - -; raikou starting map - ld a, GROUP_ROUTE_42 - ld [wRoamMon1MapGroup], a - ld a, MAP_ROUTE_42 - ld [wRoamMon1MapNumber], a - -; entei starting map - ld a, GROUP_ROUTE_37 - ld [wRoamMon2MapGroup], a - ld a, MAP_ROUTE_37 - ld [wRoamMon2MapNumber], a - -; hp - xor a ; generate new stats - ld [wRoamMon1HP], a - ld [wRoamMon2HP], a - - ret -; 2a2ce - - -CheckEncounterRoamMon: ; 2a2ce - push hl -; Don't trigger an encounter if we're on water. - call CheckOnWater - jr z, .DontEncounterRoamMon -; Load the current map group and number to de - call CopyCurrMapDE -; Randomly select a beast. - call Random - cp 100 ; 25/64 chance - jr nc, .DontEncounterRoamMon - and %00000011 ; Of that, a 3/4 chance. Running total: 75/256, or around 29.3%. - jr z, .DontEncounterRoamMon - dec a ; 1/3 chance that it's Entei, 1/3 chance that it's Raikou -; Compare its current location with yours - ld hl, wRoamMon1MapGroup - ld c, a - ld b, 0 - ld a, 7 ; length of the roam_struct - call AddNTimes - ld a, d - cp [hl] - jr nz, .DontEncounterRoamMon - inc hl - ld a, e - cp [hl] - jr nz, .DontEncounterRoamMon -; We've decided to take on a beast, so stage its information for battle. - dec hl - dec hl - dec hl - ld a, [hli] - ld [wTempWildMonSpecies], a - ld a, [hl] - ld [wCurPartyLevel], a - ld a, BATTLETYPE_ROAMING - ld [wBattleType], a - - pop hl - scf - ret - -.DontEncounterRoamMon: - pop hl - and a - ret -; 2a30d - - -UpdateRoamMons: ; 2a30d - ld a, [wRoamMon1MapGroup] - cp GROUP_N_A - jr z, .SkipRaikou - ld b, a - ld a, [wRoamMon1MapNumber] - ld c, a - call .Update - ld a, b - ld [wRoamMon1MapGroup], a - ld a, c - ld [wRoamMon1MapNumber], a - -.SkipRaikou: - ld a, [wRoamMon2MapGroup] - cp GROUP_N_A - jr z, .SkipEntei - ld b, a - ld a, [wRoamMon2MapNumber] - ld c, a - call .Update - ld a, b - ld [wRoamMon2MapGroup], a - ld a, c - ld [wRoamMon2MapNumber], a - -.SkipEntei: - ld a, [wRoamMon3MapGroup] - cp GROUP_N_A - jr z, .Finished - ld b, a - ld a, [wRoamMon3MapNumber] - ld c, a - call .Update - ld a, b - ld [wRoamMon3MapGroup], a - ld a, c - ld [wRoamMon3MapNumber], a - -.Finished: - jp _BackUpMapIndices -; 2a355 - - -.Update: ; 2a355 - ld hl, RoamMaps -.loop -; Are we at the end of the table? - ld a, [hl] - cp -1 - ret z -; Is this the correct entry? - ld a, b - cp [hl] - jr nz, .next - inc hl - ld a, c - cp [hl] - jr z, .yes -; We don't have the correct entry yet, so let's continue. A 0 terminates each entry. -.next - ld a, [hli] - and a - jr nz, .next - jr .loop - -; We have the correct entry now, so let's choose a random map from it. -.yes - inc hl - ld d, h - ld e, l -.update_loop - ld h, d - ld l, e -; Choose which map to warp to. - call Random - and %00011111 ; 1/8n chance it moves to a completely random map, where n is the number of roaming connections from the current map. - jr z, JumpRoamMon - and %11 - cp [hl] - jr nc, .update_loop ; invalid index, try again - inc hl - ld c, a - ld b, $0 - add hl, bc - add hl, bc - ld a, [wRoamMons_LastMapGroup] - cp [hl] - jr nz, .done - inc hl - ld a, [wRoamMons_LastMapNumber] - cp [hl] - jr z, .update_loop - dec hl - -.done - ld a, [hli] - ld b, a - ld c, [hl] - ret - -JumpRoamMons: ; 2a394 - ld a, [wRoamMon1MapGroup] - cp GROUP_N_A - jr z, .SkipRaikou - call JumpRoamMon - ld a, b - ld [wRoamMon1MapGroup], a - ld a, c - ld [wRoamMon1MapNumber], a - -.SkipRaikou: - ld a, [wRoamMon2MapGroup] - cp GROUP_N_A - jr z, .SkipEntei - call JumpRoamMon - ld a, b - ld [wRoamMon2MapGroup], a - ld a, c - ld [wRoamMon2MapNumber], a - -.SkipEntei: - ld a, [wRoamMon3MapGroup] - cp GROUP_N_A - jr z, .Finished - call JumpRoamMon - ld a, b - ld [wRoamMon3MapGroup], a - ld a, c - ld [wRoamMon3MapNumber], a - -.Finished: - jp _BackUpMapIndices - -JumpRoamMon: ; 2a3cd -.loop - ld hl, RoamMaps -.innerloop1 ; This loop happens to be unnecessary. - call Random ; Choose a random number. - maskbits NUM_ROAMMON_MAPS ; Mask the number to limit it between 0 and 15. - cp NUM_ROAMMON_MAPS ; If the number is not less than 16, try again. - jr nc, .innerloop1 ; I'm sure you can guess why this check is bogus. - inc a - ld b, a -.innerloop2 ; Loop to get hl to the address of the chosen roam map. - dec b - jr z, .ok -.innerloop3 ; Loop to skip the current roam map, which is terminated by a 0. - ld a, [hli] - and a - jr nz, .innerloop3 - jr .innerloop2 -; Check to see if the selected map is the one the player is currently in. If so, try again. -.ok - ld a, [wMapGroup] - cp [hl] - jr nz, .done - inc hl - ld a, [wMapNumber] - cp [hl] - jr z, .loop - dec hl -; Return the map group and number in bc. -.done - ld a, [hli] - ld b, a - ld c, [hl] - ret -; 2a3f6 - -_BackUpMapIndices: ; 2a3f6 - ld a, [wRoamMons_CurrentMapNumber] - ld [wRoamMons_LastMapNumber], a - ld a, [wRoamMons_CurrentMapGroup] - ld [wRoamMons_LastMapGroup], a - ld a, [wMapNumber] - ld [wRoamMons_CurrentMapNumber], a - ld a, [wMapGroup] - ld [wRoamMons_CurrentMapGroup], a - ret -; 2a40f - - -INCLUDE "data/wild/roammon_maps.asm" - - -ValidateTempWildMonSpecies: ; 2a4a0 -; Due to a development oversight, this function is called with the wild Pokemon's level, not its species, in a. - and a - jr z, .nowildmon ; = 0 - cp NUM_POKEMON + 1 ; 252 - jr nc, .nowildmon ; >= 252 - and a ; 1 <= Species <= 251 - ret - -.nowildmon - scf - ret -; 2a4ab - -; Finds a rare wild Pokemon in the route of the trainer calling, then checks if it's been Seen already. -; The trainer will then tell you about the Pokemon if you haven't seen it. -RandomUnseenWildMon: ; 2a4ab - farcall GetCallerLocation - ld d, b - ld e, c - ld hl, JohtoGrassWildMons - ld bc, GRASS_WILDDATA_LENGTH - call LookUpWildmonsForMapDE - jr c, .GetGrassmon - ld hl, KantoGrassWildMons - call LookUpWildmonsForMapDE - jr nc, .done - -.GetGrassmon: - push hl - ld bc, 5 + 4 * 2 ; Location of the level of the 5th wild Pokemon in that map - add hl, bc - ld a, [wTimeOfDay] - ld bc, NUM_GRASSMON * 2 - call AddNTimes -.randloop1 - call Random - and %11 - jr z, .randloop1 - dec a - ld c, a - ld b, $0 - add hl, bc - add hl, bc -; We now have the pointer to one of the last (rarest) three wild Pokemon found in that area. - inc hl - ld c, [hl] ; Contains the species index of this rare Pokemon - pop hl - ld de, 5 + 0 * 2 - add hl, de - inc hl ; Species index of the most common Pokemon on that route - ld b, 4 -.loop2 - ld a, [hli] - cp c ; Compare this most common Pokemon with the rare one stored in c. - jr z, .done - inc hl - dec b - jr nz, .loop2 -; This Pokemon truly is rare. - push bc - dec c - ld a, c - call CheckSeenMon - pop bc - jr nz, .done -; Since we haven't seen it, have the caller tell us about it. - ld de, wStringBuffer1 - call CopyName1 - ld a, c - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - ld hl, .SawRareMonText - call PrintText - xor a - ld [wScriptVar], a - ret - -.done - ld a, $1 - ld [wScriptVar], a - ret - -.SawRareMonText: - ; I just saw some rare @ in @ . I'll call you if I see another rare #MON, OK? - text_jump UnknownText_0x1bd34b - db "@" -; 0x2a51f - -RandomPhoneWildMon: ; 2a51f - farcall GetCallerLocation - ld d, b - ld e, c - ld hl, JohtoGrassWildMons - ld bc, GRASS_WILDDATA_LENGTH - call LookUpWildmonsForMapDE - jr c, .ok - ld hl, KantoGrassWildMons - call LookUpWildmonsForMapDE - -.ok - ld bc, 5 + 0 * 2 - add hl, bc - ld a, [wTimeOfDay] - inc a - ld bc, NUM_GRASSMON * 2 -.loop - dec a - jr z, .done - add hl, bc - jr .loop - -.done - call Random - and %11 - ld c, a - ld b, $0 - add hl, bc - add hl, bc - inc hl - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - ld hl, wStringBuffer1 - ld de, wStringBuffer4 - ld bc, MON_NAME_LENGTH - jp CopyBytes -; 2a567 - -RandomPhoneMon: ; 2a567 -; Get a random monster owned by the trainer who's calling. - farcall GetCallerLocation - ld hl, TrainerGroups - ld a, d - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld a, BANK(TrainerGroups) - call GetFarHalfword - -.skip_trainer - dec e - jr z, .skipped -.skip - ld a, BANK(Trainers) - call GetFarByte - inc hl - cp -1 - jr nz, .skip - jr .skip_trainer -.skipped - -.skip_name - ld a, BANK(Trainers) - call GetFarByte - inc hl - cp "@" - jr nz, .skip_name - - ld a, BANK(Trainers) - call GetFarByte - inc hl - ld bc, 2 ; level, species - cp TRAINERTYPE_NORMAL - jr z, .got_mon_length - ld bc, 2 + NUM_MOVES ; level, species, moves - cp TRAINERTYPE_MOVES - jr z, .got_mon_length - ld bc, 2 + 1 ; level, species, item - cp TRAINERTYPE_ITEM - jr z, .got_mon_length - ; TRAINERTYPE_ITEM_MOVES - ld bc, 2 + 1 + NUM_MOVES ; level, species, item, moves -.got_mon_length - - ld e, 0 - push hl -.count_mon - inc e - add hl, bc - ld a, BANK(Trainers) - call GetFarByte - cp -1 - jr nz, .count_mon - pop hl - -.rand - call Random - maskbits PARTY_LENGTH - cp e - jr nc, .rand - - inc a -.get_mon - dec a - jr z, .got_mon - add hl, bc - jr .get_mon -.got_mon - - inc hl ; species - ld a, BANK(Trainers) - call GetFarByte - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - ld hl, wStringBuffer1 - ld de, wStringBuffer4 - ld bc, MON_NAME_LENGTH - jp CopyBytes -; 2a5e9 - - -INCLUDE "data/wild/johto_grass.asm" -INCLUDE "data/wild/johto_water.asm" -INCLUDE "data/wild/kanto_grass.asm" -INCLUDE "data/wild/kanto_water.asm" -INCLUDE "data/wild/swarm_grass.asm" -INCLUDE "data/wild/swarm_water.asm" diff --git a/main.asm b/main.asm index 64be1ded4..af4b61b75 100644 --- a/main.asm +++ b/main.asm @@ -5,38 +5,38 @@ SECTION "bank1", ROMX INCLUDE "engine/routines/placewaitingtext.asm" INCLUDE "engine/routines/loadpushoam.asm" -INCLUDE "engine/map_objects.asm" +INCLUDE "engine/overworld/map_objects.asm" INCLUDE "engine/intro_menu.asm" -INCLUDE "engine/init_map.asm" -INCLUDE "engine/learn.asm" +INCLUDE "engine/overworld/init_map.asm" +INCLUDE "engine/pokemon/learn.asm" INCLUDE "engine/routines/checknickerrors.asm" -INCLUDE "engine/math.asm" +INCLUDE "engine/routines/math.asm" INCLUDE "data/items/attributes.asm" -INCLUDE "engine/npc_movement.asm" +INCLUDE "engine/overworld/npc_movement.asm" INCLUDE "engine/events/happiness_egg.asm" INCLUDE "engine/events/specials_2.asm" SECTION "bank2", ROMX -INCLUDE "engine/player_object.asm" +INCLUDE "engine/overworld/player_object.asm" INCLUDE "engine/routines/sine.asm" INCLUDE "engine/predef.asm" -INCLUDE "engine/color.asm" +INCLUDE "engine/gfx/color.asm" SECTION "bank3", ROMX INCLUDE "engine/routines/checktime.asm" INCLUDE "engine/events/specials.asm" -INCLUDE "engine/printnum.asm" -INCLUDE "engine/health.asm" +INCLUDE "engine/routines/printnum.asm" +INCLUDE "engine/pokemon/health.asm" INCLUDE "engine/events/overworld.asm" INCLUDE "engine/items.asm" -INCLUDE "engine/player_step.asm" +INCLUDE "engine/overworld/player_step.asm" INCLUDE "engine/battle/anim_hp_bar.asm" -INCLUDE "engine/move_mon.asm" -INCLUDE "engine/billspctop.asm" +INCLUDE "engine/pokemon/move_mon.asm" +INCLUDE "engine/pokemon/billspctop.asm" INCLUDE "engine/routines/getbreedmonlevelgrowth.asm" INCLUDE "engine/events/bug_contest/caught_mon.asm" INCLUDE "engine/item_effects.asm" @@ -46,17 +46,17 @@ INCLUDE "engine/routines/knowsmove.asm" SECTION "bank4", ROMX -INCLUDE "engine/pack.asm" -INCLUDE "engine/time.asm" -INCLUDE "engine/tmhm.asm" -INCLUDE "engine/naming_screen.asm" +INCLUDE "engine/menu/pack.asm" +INCLUDE "engine/overworld/time.asm" +INCLUDE "engine/menu/tmhm.asm" +INCLUDE "engine/menu/naming_screen.asm" INCLUDE "engine/events/misc_scripts.asm" INCLUDE "engine/events/heal_machine_anim.asm" INCLUDE "engine/events/whiteout.asm" INCLUDE "engine/events/forced_movement.asm" INCLUDE "engine/events/itemfinder.asm" -INCLUDE "engine/start_menu.asm" -INCLUDE "engine/select_menu.asm" +INCLUDE "engine/menu/start_menu.asm" +INCLUDE "engine/overworld/select_menu.asm" INCLUDE "engine/events/elevator.asm" INCLUDE "engine/events/bug_contest/contest.asm" INCLUDE "engine/events/misc_scripts_2.asm" @@ -71,49 +71,49 @@ INCLUDE "engine/routines/getsquareroot.asm" SECTION "bank5", ROMX INCLUDE "engine/rtc.asm" -INCLUDE "engine/overworld.asm" -INCLUDE "engine/tile_events.asm" +INCLUDE "engine/overworld/overworld.asm" +INCLUDE "engine/overworld/tile_events.asm" INCLUDE "engine/save.asm" -INCLUDE "engine/spawn_points.asm" -INCLUDE "engine/map_setup.asm" +INCLUDE "engine/overworld/spawn_points.asm" +INCLUDE "engine/overworld/map_setup.asm" INCLUDE "engine/events/pokecenter_pc.asm" -INCLUDE "engine/mart.asm" +INCLUDE "engine/menu/mart.asm" INCLUDE "engine/money.asm" INCLUDE "data/items/marts.asm" INCLUDE "engine/events/mom.asm" INCLUDE "engine/events/daycare.asm" INCLUDE "engine/events/print_unown.asm" INCLUDE "engine/events/print_photo.asm" -INCLUDE "engine/breeding.asm" +INCLUDE "engine/pokemon/breeding.asm" INCLUDE "gfx/tilesets.asm" SECTION "Roofs", ROMX -INCLUDE "engine/mapgroup_roofs.asm" +INCLUDE "engine/gfx/mapgroup_roofs.asm" SECTION "Clock Reset", ROMX -INCLUDE "engine/clock_reset.asm" +INCLUDE "engine/menu/clock_reset.asm" SECTION "bank9", ROMX INCLUDE "data/text_buffers.asm" -INCLUDE "engine/menu.asm" +INCLUDE "engine/menu/menu.asm" INCLUDE "engine/routines/updateitemdescription.asm" INCLUDE "engine/events/pokepic.asm" -INCLUDE "engine/map_objects_2.asm" -INCLUDE "engine/scrolling_menu.asm" -INCLUDE "engine/switch_items.asm" -INCLUDE "engine/menu_2.asm" -INCLUDE "engine/mon_menu.asm" +INCLUDE "engine/overworld/map_objects_2.asm" +INCLUDE "engine/menu/scrolling_menu.asm" +INCLUDE "engine/menu/switch_items.asm" +INCLUDE "engine/menu/menu_2.asm" +INCLUDE "engine/menu/mon_menu.asm" INCLUDE "engine/battle/menu.asm" -INCLUDE "engine/buy_sell_toss.asm" -INCLUDE "engine/trainer_card.asm" +INCLUDE "engine/menu/buy_sell_toss.asm" +INCLUDE "engine/menu/trainer_card.asm" INCLUDE "engine/events/prof_oaks_pc.asm" -INCLUDE "engine/decorations.asm" +INCLUDE "engine/overworld/decorations.asm" INCLUDE "engine/routines/leveluphappinessmod.asm" INCLUDE "engine/battle/read_trainer_dvs.asm" INCLUDE "data/trainers/dvs.asm" @@ -126,8 +126,8 @@ INCLUDE "engine/events/kurt_selectquantity_interpretjoypad.asm" SECTION "bankA", ROMX -INCLUDE "engine/link.asm" -INCLUDE "engine/wildmons.asm" +INCLUDE "engine/link/link.asm" +INCLUDE "engine/overworld/wildmons.asm" INCLUDE "engine/battle/link_result.asm" ChrisBackpic: ; 2ba1a @@ -143,8 +143,8 @@ INCLUDE "engine/battle/trainer_huds.asm" INCLUDE "data/trainers/class_names.asm" INCLUDE "engine/battle/ai/redundant.asm" INCLUDE "engine/events/move_deleter.asm" -INCLUDE "engine/mystery_gift_2.asm" -INCLUDE "engine/tmhm2.asm" +INCLUDE "engine/link/mystery_gift_2.asm" +INCLUDE "engine/pokemon/tmhm.asm" INCLUDE "data/moves/descriptions.asm" INCLUDE "engine/events/pokerus/pokerus.asm" INCLUDE "engine/battle/start_battle.asm" @@ -177,7 +177,7 @@ SECTION "bank10", ROMX INCLUDE "engine/pokedex/pokedex.asm" INCLUDE "data/moves/moves.asm" -INCLUDE "engine/evolve.asm" +INCLUDE "engine/pokemon/evolve.asm" SECTION "bank11", ROMX @@ -186,7 +186,7 @@ INCLUDE "engine/events/fruit_trees.asm" INCLUDE "engine/battle/ai/move.asm" INCLUDE "engine/pokedex/pokedex_2.asm" INCLUDE "data/pokemon/dex_entry_pointers.asm" -INCLUDE "engine/mail.asm" +INCLUDE "engine/pokemon/mail.asm" SECTION "Crystal Features 1", ROMX @@ -194,18 +194,18 @@ SECTION "Crystal Features 1", ROMX INCLUDE "engine/init_gender.asm" INCLUDE "engine/routines/drawkrispackgfx.asm" INCLUDE "engine/events/move_tutor.asm" -INCLUDE "engine/crystal_layouts.asm" +INCLUDE "engine/gfx/crystal_layouts.asm" INCLUDE "engine/events/celebi.asm" -INCLUDE "engine/main_menu.asm" +INCLUDE "engine/menu/main_menu.asm" INCLUDE "mobile/mobile_menu.asm" -INCLUDE "engine/search.asm" +INCLUDE "engine/pokemon/search.asm" INCLUDE "mobile/mobile_12_2.asm" INCLUDE "engine/events/buena_menu.asm" SECTION "bank13", ROMX -INCLUDE "engine/map_palettes.asm" +INCLUDE "engine/gfx/map_palettes.asm" INCLUDE "gfx/tileset_palette_maps.asm" INCLUDE "data/collision_permissions.asm" INCLUDE "engine/routines/emptyallsrambanks.asm" @@ -221,45 +221,45 @@ INCBIN "gfx/new_game/shrink1.2bpp.lz" Shrink2Pic: ; 4d2d9 INCBIN "gfx/new_game/shrink2.2bpp.lz" -INCLUDE "engine/link_2.asm" -INCLUDE "engine/delete_save_change_clock.asm" +INCLUDE "engine/link/link_2.asm" +INCLUDE "engine/menu/delete_save_change_clock.asm" INCLUDE "data/tilesets.asm" INCLUDE "engine/routines/flagpredef.asm" INCLUDE "engine/routines/trademonfrontpic.asm" INCLUDE "engine/events/pokerus/check_pokerus.asm" INCLUDE "engine/events/lucky_number.asm" -INCLUDE "engine/caught_data.asm" -INCLUDE "engine/search2.asm" -INCLUDE "engine/stats_screen.asm" +INCLUDE "engine/pokemon/caught_data.asm" +INCLUDE "engine/pokemon/search2.asm" +INCLUDE "engine/pokemon/stats_screen.asm" INCLUDE "engine/events/catch_tutorial.asm" -INCLUDE "engine/evolution_animation.asm" -INCLUDE "engine/init_hof_credits.asm" +INCLUDE "engine/gfx/evolution_animation.asm" +INCLUDE "engine/title/init_hof_credits.asm" INCLUDE "engine/events/battle_tower/get_trainer_class.asm" INCLUDE "engine/battle/sliding_intro.asm" INCLUDE "mobile/print_opp_message.asm" INCLUDE "engine/battle/checkbattlescene.asm" -INCLUDE "engine/gbc_only.asm" +INCLUDE "engine/gfx/gbc_only.asm" INCLUDE "engine/events/poke_seer.asm" SECTION "bank14", ROMX -INCLUDE "engine/party_menu.asm" +INCLUDE "engine/pokemon/party_menu.asm" INCLUDE "engine/events/poisonstep.asm" INCLUDE "engine/events/sweet_scent.asm" INCLUDE "engine/events/squirtbottle.asm" INCLUDE "engine/events/card_key.asm" INCLUDE "engine/events/basement_key.asm" INCLUDE "engine/events/sacred_ash.asm" -INCLUDE "engine/tempmon.asm" -INCLUDE "engine/types.asm" +INCLUDE "engine/pokemon/tempmon.asm" +INCLUDE "engine/pokemon/types.asm" INCLUDE "engine/routines/unreferenced_getgen1trainerclassname.asm" -INCLUDE "engine/mon_stats.asm" +INCLUDE "engine/pokemon/mon_stats.asm" INCLUDE "engine/routines/initlist.asm" -INCLUDE "engine/experience.asm" +INCLUDE "engine/pokemon/experience.asm" INCLUDE "engine/routines/switchpartymons.asm" -INCLUDE "engine/load_pics.asm" -INCLUDE "engine/move_mon_wo_mail.asm" +INCLUDE "engine/gfx/load_pics.asm" +INCLUDE "engine/pokemon/move_mon_wo_mail.asm" INCLUDE "data/pokemon/base_stats.asm" INCLUDE "data/pokemon/names.asm" INCLUDE "data/unused_53d84.asm" @@ -276,16 +276,16 @@ INCLUDE "data/phone/text/extra.asm" SECTION "bank20", ROMX -INCLUDE "engine/player_movement.asm" +INCLUDE "engine/overworld/player_movement.asm" INCLUDE "engine/engine_flags.asm" -INCLUDE "engine/variables.asm" +INCLUDE "engine/overworld/variables.asm" INCLUDE "data/text/battle.asm" INCLUDE "engine/debug.asm" SECTION "bank21", ROMX -INCLUDE "engine/printer.asm" +INCLUDE "engine/printer/printer.asm" INCLUDE "gfx/battle_anims.asm" INCLUDE "engine/events/halloffame.asm" @@ -293,7 +293,7 @@ INCLUDE "engine/events/halloffame.asm" SECTION "Crystal Features 2", ROMX INCLUDE "engine/events/kurt.asm" -INCLUDE "engine/player_gfx.asm" +INCLUDE "engine/gfx/player_gfx.asm" INCLUDE "mobile/mobile_22.asm" INCLUDE "engine/events/unown_walls.asm" INCLUDE "engine/events/buena.asm" @@ -304,22 +304,22 @@ INCLUDE "mobile/mobile_22_2.asm" SECTION "bank23", ROMX -INCLUDE "engine/timeofdaypals.asm" +INCLUDE "engine/gfx/timeofdaypals.asm" INCLUDE "engine/battle/battle_transition.asm" INCLUDE "engine/events/field_moves.asm" INCLUDE "engine/events/magnet_train.asm" INCLUDE "engine/battle/battlestart_copytilemapatonce.asm" -INCLUDE "engine/sprites.asm" -INCLUDE "engine/mon_icons.asm" +INCLUDE "engine/gfx/sprites.asm" +INCLUDE "engine/gfx/mon_icons.asm" SECTION "bank24", ROMX INCLUDE "engine/phone/phone.asm" -INCLUDE "engine/timeset.asm" -INCLUDE "engine/pokegear.asm" +INCLUDE "engine/menu/timeset.asm" +INCLUDE "engine/pokegear/pokegear.asm" INCLUDE "engine/events/fish.asm" -INCLUDE "engine/slot_machine.asm" +INCLUDE "engine/game/slot_machine.asm" SECTION "Phone Engine", ROMX @@ -356,8 +356,8 @@ INCLUDE "engine/events/map_name_sign.asm" INCLUDE "engine/events/checkforhiddenitems.asm" INCLUDE "engine/events/treemons.asm" INCLUDE "engine/events/loadfishinggfx.asm" -INCLUDE "engine/radio.asm" -INCLUDE "engine/mail_2.asm" +INCLUDE "engine/pokegear/radio.asm" +INCLUDE "engine/pokemon/mail_2.asm" SECTION "bank2F", ROMX @@ -393,7 +393,7 @@ INCLUDE "data/battle_anims/object_gfx.asm" SECTION "Pic Animations 1", ROMX -INCLUDE "engine/pic_animation.asm" +INCLUDE "engine/gfx/pic_animation.asm" INCLUDE "gfx/pokemon/anim_pointers.asm" INCLUDE "gfx/pokemon/anims.asm" INCLUDE "gfx/pokemon/idle_pointers.asm" @@ -430,10 +430,10 @@ INCLUDE "gfx/pokemon/unown_frames.asm" SECTION "bank38", ROMX INCLUDE "engine/events/print_unown_2.asm" -INCLUDE "engine/card_flip.asm" -INCLUDE "engine/unown_puzzle.asm" -INCLUDE "engine/dummy_game.asm" -INCLUDE "engine/billspc.asm" +INCLUDE "engine/game/card_flip.asm" +INCLUDE "engine/game/unown_puzzle.asm" +INCLUDE "engine/game/dummy_game.asm" +INCLUDE "engine/pokemon/billspc.asm" SECTION "bank39", ROMX @@ -441,18 +441,18 @@ SECTION "bank39", ROMX CopyrightGFX:: ; e4000 INCBIN "gfx/splash/copyright.2bpp" -INCLUDE "engine/options_menu.asm" -INCLUDE "engine/crystal_intro.asm" +INCLUDE "engine/menu/options_menu.asm" +INCLUDE "engine/title/crystal_intro.asm" SECTION "bank3E", ROMX -INCLUDE "engine/load_font.asm" -INCLUDE "engine/time_capsule.asm" +INCLUDE "engine/gfx/load_font.asm" +INCLUDE "engine/link/time_capsule.asm" INCLUDE "engine/events/name_rater.asm" INCLUDE "engine/routines/playslowcry.asm" INCLUDE "engine/pokedex/newpokedexentry.asm" -INCLUDE "engine/time_capsule_2.asm" +INCLUDE "engine/link/time_capsule_2.asm" INCLUDE "engine/pokedex/unown_dex.asm" INCLUDE "engine/events/magikarp.asm" INCLUDE "engine/battle/hidden_power.asm" @@ -461,7 +461,7 @@ INCLUDE "engine/battle/misc.asm" SECTION "bank3F", ROMX -INCLUDE "engine/tileset_anims.asm" +INCLUDE "engine/gfx/tileset_anims.asm" INCLUDE "engine/events/npc_trade.asm" INCLUDE "engine/events/mom_phone.asm" @@ -473,8 +473,8 @@ SECTION "bank41", ROMX INCLUDE "engine/dma_transfer.asm" INCLUDE "gfx/emotes.asm" -INCLUDE "engine/warp_connection.asm" -INCLUDE "engine/mystery_gift.asm" +INCLUDE "engine/overworld/warp_connection.asm" +INCLUDE "engine/link/mystery_gift.asm" INCLUDE "engine/battle/used_move_text.asm" INCLUDE "mobile/mobile_41.asm" INCLUDE "engine/routines/loadoverworldfont.asm" @@ -493,8 +493,8 @@ INCBIN "gfx/intro/logo.2bpp.lz" SECTION "Title", ROMX -INCLUDE "engine/unused_title.asm" -INCLUDE "engine/title.asm" +INCLUDE "engine/title/unused_title.asm" +INCLUDE "engine/title/title.asm" INCLUDE "mobile/mobile_45.asm" @@ -511,7 +511,7 @@ INCLUDE "engine/events/battle_tower/trainer_text.asm" SECTION "bank5B", ROMX INCLUDE "mobile/mobile_5b.asm" -INCLUDE "engine/link_trade.asm" +INCLUDE "engine/link/link_trade.asm" SECTION "Mobile 5C", ROMX @@ -569,7 +569,7 @@ INCLUDE "data/items/names.asm" INCLUDE "engine/routines/printitemdescription.asm" INCLUDE "data/items/descriptions.asm" INCLUDE "data/moves/names.asm" -INCLUDE "engine/landmarks.asm" +INCLUDE "engine/overworld/landmarks.asm" SECTION "bank77", ROMX @@ -577,13 +577,13 @@ SECTION "bank77", ROMX UnownFont: ; 1dc000 INCBIN "gfx/font/unown_font.2bpp" -INCLUDE "engine/print_party.asm" +INCLUDE "engine/printer/print_party.asm" SECTION "bank77_2", ROMX INCLUDE "engine/routines/printhoursmins.asm" -INCLUDE "engine/diploma.asm" +INCLUDE "engine/events/diploma.asm" INCLUDE "engine/pokedex/pokedex_3.asm" INCLUDE "engine/events/catch_tutorial_input.asm" INCLUDE "engine/routines/townmap_convertlinebreakcharacters.asm" @@ -591,7 +591,7 @@ INCLUDE "engine/routines/townmap_convertlinebreakcharacters.asm" PokegearGFX: ; 1de2e4 INCBIN "gfx/pokegear/pokegear.2bpp.lz" -INCLUDE "engine/european_mail.asm" +INCLUDE "engine/pokemon/european_mail.asm" SECTION "Battle Tower Text", ROMX -- cgit v1.2.3 From 97c511cd2f271252cbc9e9746668081422231ca5 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Wed, 14 Mar 2018 13:28:36 +0100 Subject: Organize the engine/ directory, take 2 Renamed `game` to `games` and `menu` to `menus`. Moved some functions from `engine/routines/` to their fitting subdirectories. Made two new subdirectories: * engine/rtc: Contains all RTC-related things. Menus, hardware, misc functions. * engine/items: Contains all item-related things. Pack, item effects, other item handlers. --- engine/game/card_flip.asm | 1692 --------------- engine/game/dummy_game.asm | 612 ------ engine/game/slot_machine.asm | 2352 --------------------- engine/game/unown_puzzle.asm | 877 -------- engine/games/card_flip.asm | 1692 +++++++++++++++ engine/games/dummy_game.asm | 612 ++++++ engine/games/slot_machine.asm | 2352 +++++++++++++++++++++ engine/games/unown_puzzle.asm | 877 ++++++++ engine/gfx/drawkrispackgfx.asm | 20 + engine/gfx/loadoverworldfont.asm | 17 + engine/gfx/placegraphic.asm | 55 + engine/gfx/trademonfrontpic.asm | 38 + engine/item_effects.asm | 3118 ---------------------------- engine/items.asm | 581 ------ engine/items/buy_sell_toss.asm | 235 +++ engine/items/item_effects.asm | 3118 ++++++++++++++++++++++++++++ engine/items/items.asm | 581 ++++++ engine/items/mart.asm | 970 +++++++++ engine/items/pack.asm | 1711 +++++++++++++++ engine/items/printitemdescription.asm | 31 + engine/items/switch_items.asm | 274 +++ engine/items/tmhm.asm | 49 + engine/items/updateitemdescription.asm | 13 + engine/menu/buy_sell_toss.asm | 235 --- engine/menu/clock_reset.asm | 254 --- engine/menu/delete_save_change_clock.asm | 296 --- engine/menu/main_menu.asm | 361 ---- engine/menu/mart.asm | 970 --------- engine/menu/menu.asm | 841 -------- engine/menu/menu_2.asm | 253 --- engine/menu/mon_menu.asm | 304 --- engine/menu/naming_screen.asm | 1467 ------------- engine/menu/options_menu.asm | 583 ------ engine/menu/pack.asm | 1711 --------------- engine/menu/scrolling_menu.asm | 543 ----- engine/menu/start_menu.asm | 1993 ------------------ engine/menu/switch_items.asm | 274 --- engine/menu/timeset.asm | 773 ------- engine/menu/tmhm.asm | 49 - engine/menu/trainer_card.asm | 623 ------ engine/menus/main_menu.asm | 361 ++++ engine/menus/menu.asm | 841 ++++++++ engine/menus/menu_2.asm | 253 +++ engine/menus/naming_screen.asm | 1467 +++++++++++++ engine/menus/options_menu.asm | 583 ++++++ engine/menus/scrolling_menu.asm | 543 +++++ engine/menus/start_menu.asm | 1993 ++++++++++++++++++ engine/menus/trainer_card.asm | 623 ++++++ engine/overworld/loadmappart.asm | 36 + engine/pokemon/getbreedmonlevelgrowth.asm | 27 + engine/pokemon/knowsmove.asm | 25 + engine/pokemon/leveluphappinessmod.asm | 20 + engine/pokemon/mon_menu.asm | 304 +++ engine/pokemon/switchpartymons.asm | 145 ++ engine/routines/drawkrispackgfx.asm | 20 - engine/routines/getbreedmonlevelgrowth.asm | 27 - engine/routines/knowsmove.asm | 25 - engine/routines/leveluphappinessmod.asm | 20 - engine/routines/loadmappart.asm | 36 - engine/routines/loadoverworldfont.asm | 17 - engine/routines/placegraphic.asm | 55 - engine/routines/printhoursmins.asm | 63 - engine/routines/printitemdescription.asm | 31 - engine/routines/switchpartymons.asm | 145 -- engine/routines/trademonfrontpic.asm | 38 - engine/routines/updateitemdescription.asm | 13 - engine/rtc.asm | 209 -- engine/rtc/clock_reset.asm | 254 +++ engine/rtc/delete_save_change_clock.asm | 296 +++ engine/rtc/printhoursmins.asm | 63 + engine/rtc/rtc.asm | 209 ++ engine/rtc/timeset.asm | 773 +++++++ main.asm | 72 +- 73 files changed, 21497 insertions(+), 21497 deletions(-) delete mode 100755 engine/game/card_flip.asm delete mode 100755 engine/game/dummy_game.asm delete mode 100755 engine/game/slot_machine.asm delete mode 100755 engine/game/unown_puzzle.asm create mode 100755 engine/games/card_flip.asm create mode 100755 engine/games/dummy_game.asm create mode 100755 engine/games/slot_machine.asm create mode 100755 engine/games/unown_puzzle.asm create mode 100644 engine/gfx/drawkrispackgfx.asm create mode 100644 engine/gfx/loadoverworldfont.asm create mode 100644 engine/gfx/placegraphic.asm create mode 100644 engine/gfx/trademonfrontpic.asm delete mode 100644 engine/item_effects.asm delete mode 100755 engine/items.asm create mode 100755 engine/items/buy_sell_toss.asm create mode 100644 engine/items/item_effects.asm create mode 100755 engine/items/items.asm create mode 100755 engine/items/mart.asm create mode 100644 engine/items/pack.asm create mode 100644 engine/items/printitemdescription.asm create mode 100755 engine/items/switch_items.asm create mode 100755 engine/items/tmhm.asm create mode 100644 engine/items/updateitemdescription.asm delete mode 100755 engine/menu/buy_sell_toss.asm delete mode 100755 engine/menu/clock_reset.asm delete mode 100755 engine/menu/delete_save_change_clock.asm delete mode 100755 engine/menu/main_menu.asm delete mode 100755 engine/menu/mart.asm delete mode 100755 engine/menu/menu.asm delete mode 100644 engine/menu/menu_2.asm delete mode 100755 engine/menu/mon_menu.asm delete mode 100755 engine/menu/naming_screen.asm delete mode 100755 engine/menu/options_menu.asm delete mode 100644 engine/menu/pack.asm delete mode 100755 engine/menu/scrolling_menu.asm delete mode 100755 engine/menu/start_menu.asm delete mode 100755 engine/menu/switch_items.asm delete mode 100755 engine/menu/timeset.asm delete mode 100755 engine/menu/tmhm.asm delete mode 100755 engine/menu/trainer_card.asm create mode 100755 engine/menus/main_menu.asm create mode 100755 engine/menus/menu.asm create mode 100644 engine/menus/menu_2.asm create mode 100755 engine/menus/naming_screen.asm create mode 100755 engine/menus/options_menu.asm create mode 100755 engine/menus/scrolling_menu.asm create mode 100755 engine/menus/start_menu.asm create mode 100755 engine/menus/trainer_card.asm create mode 100644 engine/overworld/loadmappart.asm create mode 100644 engine/pokemon/getbreedmonlevelgrowth.asm create mode 100644 engine/pokemon/knowsmove.asm create mode 100644 engine/pokemon/leveluphappinessmod.asm create mode 100755 engine/pokemon/mon_menu.asm create mode 100644 engine/pokemon/switchpartymons.asm delete mode 100644 engine/routines/drawkrispackgfx.asm delete mode 100644 engine/routines/getbreedmonlevelgrowth.asm delete mode 100644 engine/routines/knowsmove.asm delete mode 100644 engine/routines/leveluphappinessmod.asm delete mode 100644 engine/routines/loadmappart.asm delete mode 100644 engine/routines/loadoverworldfont.asm delete mode 100644 engine/routines/placegraphic.asm delete mode 100644 engine/routines/printhoursmins.asm delete mode 100644 engine/routines/printitemdescription.asm delete mode 100644 engine/routines/switchpartymons.asm delete mode 100644 engine/routines/trademonfrontpic.asm delete mode 100644 engine/routines/updateitemdescription.asm delete mode 100755 engine/rtc.asm create mode 100755 engine/rtc/clock_reset.asm create mode 100755 engine/rtc/delete_save_change_clock.asm create mode 100644 engine/rtc/printhoursmins.asm create mode 100755 engine/rtc/rtc.asm create mode 100755 engine/rtc/timeset.asm diff --git a/engine/game/card_flip.asm b/engine/game/card_flip.asm deleted file mode 100755 index fbeb3e3b6..000000000 --- a/engine/game/card_flip.asm +++ /dev/null @@ -1,1692 +0,0 @@ -CARDFLIP_LIGHT_OFF EQU $ef -CARDFLIP_LIGHT_ON EQU $f5 - -CARDFLIP_DECK_SIZE EQU 4 * 6 - -; two labels below called from inside ./dummy_game.asm -Unknown_e00ed: ; e00ed (38:40ed) -; Graphics for an unused Game Corner -; game were meant to be here. -ret_e00ed: ; e00ed (38:40ed) - ret - -_CardFlip: ; e00ee (38:40ee) - ld hl, wOptions - set 4, [hl] - call ClearBGPalettes - call ClearTileMap - call ClearSprites - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - call DisableLCD - call LoadStandardFont - call LoadFontsExtra - - ld hl, CardFlipLZ01 - ld de, vTiles2 tile $00 - call Decompress - ld hl, CardFlipLZ02 - ld de, vTiles2 tile $3e - call Decompress - ld hl, CardFlipLZ03 - ld de, vTiles0 tile $00 - call Decompress - ld hl, CardFlipOffButtonGFX - ld de, vTiles0 tile CARDFLIP_LIGHT_OFF - ld bc, 1 tiles - call CopyBytes - ld hl, CardFlipOnButtonGFX - ld de, vTiles0 tile CARDFLIP_LIGHT_ON - ld bc, 1 tiles - call CopyBytes - - call CardFlip_ShiftDigitsLeftTwoPixels - call CardFlip_InitTilemap - call CardFlip_InitAttrPals - call EnableLCD - call WaitBGMap2 - ld a, $e4 - call DmgToCgbBGPals - ld de, $e4e4 - call DmgToCgbObjPals - call DelayFrame - xor a - ld [wJumptableIndex], a - ld a, $2 - ld [wCardFlipCursorY], a - ld [wCardFlipCursorX], a - ld de, MUSIC_GAME_CORNER - call PlayMusic -.MasterLoop: - ld a, [wJumptableIndex] - bit 7, a - jr nz, .leavethegame - call .CardFlip - jr .MasterLoop -.leavethegame - call WaitSFX - ld de, SFX_QUIT_SLOTS - call PlaySFX - call WaitSFX - call ClearBGPalettes - ld hl, wOptions - res 4, [hl] - ret - -.CardFlip: ; e0191 (38:4191) - 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 -; e01a0 (38:41a0) - -.Jumptable: ; e01a0 - dw .AskPlayWithThree - dw .DeductCoins - dw .ChooseACard - dw .PlaceYourBet - dw .CheckTheCard - dw .TabulateTheResult - dw .PlayAgain - dw .Quit -; e01b0 - -.Increment: ; e01b0 - ld hl, wJumptableIndex - inc [hl] - ret -; e01b5 - -.AskPlayWithThree: ; e01b5 - ld hl, .PlayWithThreeCoinsText - call CardFlip_UpdateCoinBalanceDisplay - call YesNoBox - jr c, .SaidNo - call CardFlip_ShuffleDeck - call .Increment - ret - -.SaidNo: - ld a, 7 - ld [wJumptableIndex], a - ret -; e01cd - -.PlayWithThreeCoinsText: ; 0xe01cd - ; Play with three coins? - text_jump UnknownText_0x1c5793 - db "@" -; 0xe01d2 - -.DeductCoins: ; e01d2 - ld a, [wCoins] - ld h, a - ld a, [wCoins + 1] - ld l, a - ld a, h - and a - jr nz, .deduct ; You have at least 256 coins. - ld a, l - cp 3 - jr nc, .deduct ; You have at least 3 coins. - ld hl, .NotEnoughCoinsText - call CardFlip_UpdateCoinBalanceDisplay - ld a, 7 - ld [wJumptableIndex], a - ret - -.deduct - ld de, -3 - add hl, de - ld a, h - ld [wCoins], a - ld a, l - ld [wCoins + 1], a - ld de, SFX_TRANSACTION - call PlaySFX - xor a - ld [hBGMapMode], a - call CardFlip_PrintCoinBalance - ld a, $1 - ld [hBGMapMode], a - call WaitSFX - call .Increment - ret -; e0212 - -.NotEnoughCoinsText: ; 0xe0212 - ; Not enough coins… - text_jump UnknownText_0x1c57ab - db "@" -; 0xe0217 - -.ChooseACard: ; e0217 - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - lb bc, 12, 9 - call CardFlip_FillGreenBox - hlcoord 9, 0 - ld bc, SCREEN_WIDTH - ld a, [wCardFlipNumCardsPlayed] - call AddNTimes - ld [hl], CARDFLIP_LIGHT_ON - ld a, $1 - ld [hBGMapMode], a - ld c, 20 - call DelayFrames - hlcoord 2, 0 - call PlaceCardFaceDown - ld a, $1 - ld [hBGMapMode], a - ld c, 20 - call DelayFrames - hlcoord 2, 6 - call PlaceCardFaceDown - call WaitBGMap - ld hl, .ChooseACardText - call CardFlip_UpdateCoinBalanceDisplay - xor a - ld [wCardFlipWhichCard], a -.loop - call JoyTextDelay - ld a, [hJoyLast] - and A_BUTTON - jr nz, .next - ld de, SFX_KINESIS - call PlaySFX - call PlaceOAMCardBorder - ld c, 4 - call DelayFrames - ld hl, wCardFlipWhichCard - ld a, [hl] - xor $1 - ld [hl], a - jr .loop - -.next - ld de, SFX_SLOT_MACHINE_START - call PlaySFX - ld a, $3 -.loop2 - push af - call PlaceOAMCardBorder - ld c, 4 - call DelayFrames - call ClearSprites - ld c, 4 - call DelayFrames - pop af - dec a - jr nz, .loop2 - ld hl, wCardFlipWhichCard - ld a, [hl] - push af - xor $1 - ld [hl], a - call GetCoordsOfChosenCard - lb bc, 6, 5 - call CardFlip_FillGreenBox - pop af - ld [wCardFlipWhichCard], a - call .Increment - ret -; e02b2 - -.ChooseACardText: ; 0xe02b2 - ; Choose a card. - text_jump UnknownText_0x1c57be - db "@" -; 0xe02b7 - -.PlaceYourBet: ; e02b7 - ld hl, .PlaceYourBetText - call CardFlip_UpdateCoinBalanceDisplay -.betloop - call JoyTextDelay - ld a, [hJoyLast] - and A_BUTTON - jr nz, .betdone - call ChooseCard_HandleJoypad - call CardFlip_UpdateCursorOAM - call DelayFrame - jr .betloop - -.betdone - call .Increment - ret -; e02d5 - -.PlaceYourBetText: ; 0xe02d5 - ; Place your bet. - text_jump UnknownText_0x1c57ce - db "@" -; 0xe02da - -.CheckTheCard: ; e02da - xor a - ld [hVBlankCounter], a - call CardFlip_UpdateCursorOAM - call WaitSFX - ld de, SFX_CHOOSE_A_CARD - call PlaySFX - call WaitSFX - ld a, [wCardFlipNumCardsPlayed] - ld e, a - ld d, 0 - ld hl, wDeck - add hl, de - add hl, de - ld a, [wCardFlipWhichCard] - ld e, a - add hl, de - ld a, [hl] - ld [wCardFlipFaceUpCard], a - ld e, a - ld hl, wDiscardPile - add hl, de - ld [hl], TRUE - call GetCoordsOfChosenCard - call CardFlip_DisplayCardFaceUp - call WaitBGMap2 - call .Increment - ret -; e0314 - -.TabulateTheResult: ; e0314 - call CardFlip_CheckWinCondition - call WaitPressAorB_BlinkCursor - call .Increment - ret -; e031e - -.PlayAgain: ; e031e - call ClearSprites - ld hl, .PlayAgainText - call CardFlip_UpdateCoinBalanceDisplay - call YesNoBox - jr nc, .Continue - call .Increment - ret - -.Continue: - ld a, [wCardFlipNumCardsPlayed] - inc a - ld [wCardFlipNumCardsPlayed], a - cp 12 - jr c, .KeepTheCurrentDeck - call CardFlip_InitTilemap - ld a, $1 - ld [hBGMapMode], a - call CardFlip_ShuffleDeck - ld hl, .CardsShuffledText - call PrintText - jr .LoopAround - -.KeepTheCurrentDeck: - call CardFlip_BlankDiscardedCardSlot - -.LoopAround: - ld a, 1 - ld [wJumptableIndex], a - ret -; e0356 - -.PlayAgainText: ; 0xe0356 - ; Want to play again? - text_jump UnknownText_0x1c57df - db "@" -; 0xe035b - -.CardsShuffledText: ; 0xe035b - ; The cards have been shuffled. - text_jump UnknownText_0x1c57f4 - db "@" -; 0xe0360 - -.Quit: ; e0360 - ld hl, wJumptableIndex - set 7, [hl] - ret -; e0366 - -CardFlip_ShuffleDeck: ; e0366 - ld hl, wDeck - ld bc, CARDFLIP_DECK_SIZE - xor a - call ByteFill - ld de, wDeck - ld c, CARDFLIP_DECK_SIZE - 1 -.loop - call Random - and $1f - cp CARDFLIP_DECK_SIZE - jr nc, .loop - ld l, a - ld h, $0 - add hl, de - ld a, [hl] - and a - jr nz, .loop - ld [hl], c - dec c - jr nz, .loop - xor a - ld [wCardFlipNumCardsPlayed], a - ld hl, wDiscardPile - ld bc, CARDFLIP_DECK_SIZE - call ByteFill - ret -; e0398 - -CollapseCursorPosition: ; e0398 - ld hl, 0 - ld bc, 6 - ld a, [wCardFlipCursorY] - call AddNTimes - ld b, $0 - ld a, [wCardFlipCursorX] - ld c, a - add hl, bc - ret -; e03ac - -GetCoordsOfChosenCard: ; e03ac - ld a, [wCardFlipWhichCard] - and a - jr nz, .BottomCard - hlcoord 2, 0 - bcpixel 2, 3 - jr .done - -.BottomCard: - hlcoord 2, 6 - bcpixel 8, 3 - -.done - ret -; e03c1 - -PlaceCardFaceDown: ; e03c1 - xor a - ld [hBGMapMode], a - ld de, .FaceDownCardTilemap - lb bc, 6, 5 - call CardFlip_CopyToBox - ret -; e03ce - -.FaceDownCardTilemap: ; e03ce - db $08, $09, $09, $09, $0a - db $0b, $28, $2b, $28, $0c - db $0b, $2c, $2d, $2e, $0c - db $0b, $2f, $30, $31, $0c - db $0b, $32, $33, $34, $0c - db $0d, $0e, $0e, $0e, $0f -; e03ec - -CardFlip_DisplayCardFaceUp: ; e03ec - xor a - ld [hBGMapMode], a - push hl - push hl - ; Flip the card face up. - ld de, .FaceUpCardTilemap - lb bc, 6, 5 - call CardFlip_CopyToBox - - ; Get the level and species of the upturned card. - ld a, [wCardFlipFaceUpCard] - ld e, a - ld d, 0 - ld hl, .Deck - add hl, de - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - - ; Place the level. - pop hl - ld bc, 3 + SCREEN_WIDTH - add hl, bc - ld [hl], e - - ; Place the Pokepic. - ld bc, SCREEN_HEIGHT - add hl, bc - ld a, d - ld de, SCREEN_WIDTH - ld b, 3 -.row - push hl - ld c, 3 -.col - ld [hli], a - inc a - dec c - jr nz, .col - pop hl - add hl, de - dec b - jr nz, .row - pop hl - - ; Pointless CGB check - ld a, [hCGB] - and a - ret z - - ; Set the attributes - ld de, wAttrMap - wTileMap - add hl, de - ld a, [wCardFlipFaceUpCard] - and 3 - inc a - lb bc, 6, 5 - call CardFlip_FillBox - ret -; e043b - -.FaceUpCardTilemap: ; e043b - db $18, $19, $19, $19, $1a - db $1b, $35, $7f, $7f, $1c - db $0b, $28, $28, $28, $0c - db $0b, $28, $28, $28, $0c - db $0b, $28, $28, $28, $0c - db $1d, $1e, $1e, $1e, $1f -; e0459 - -.Deck: ; e0459 - ; level, pic anchor (3x3) - db "1", $4e, "1", $57, "1", $69, "1", $60 - db "2", $4e, "2", $57, "2", $69, "2", $60 - db "3", $4e, "3", $57, "3", $69, "3", $60 - db "4", $4e, "4", $57, "4", $69, "4", $60 - db "5", $4e, "5", $57, "5", $69, "5", $60 - db "6", $4e, "6", $57, "6", $69, "6", $60 -; e0489 - -CardFlip_UpdateCoinBalanceDisplay: ; e0489 - push hl - hlcoord 0, 12 - ld b, 4 - ld c, SCREEN_WIDTH - 2 - call TextBox - pop hl - call PrintTextBoxText - call CardFlip_PrintCoinBalance - ret -; e049c - -CardFlip_PrintCoinBalance: ; e049c - hlcoord 9, 15 - ld b, 1 - ld c, 9 - call TextBox - hlcoord 10, 16 - ld de, .CoinStr - call PlaceString - hlcoord 15, 16 - ld de, wCoins - lb bc, PRINTNUM_LEADINGZEROS | 2, 4 - call PrintNum - ret -; e04bc - -.CoinStr: - db "COIN@" -; e04c1 - -CardFlip_InitTilemap: ; e04c1 (38:44c1) - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, $29 - call ByteFill - hlcoord 9, 0 - ld de, CardFlipTilemap - lb bc, 12, 11 - call CardFlip_CopyToBox - hlcoord 0, 12 - lb bc, 4, 18 - call TextBox - ret -; e04e5 (38:44e5) - -CardFlip_FillGreenBox: ; e04e5 - ld a, $29 - -CardFlip_FillBox: ; e04e7 (38:44e7) -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret - -CardFlip_CopyToBox: ; e04f7 (38:44f7) -.row - push bc - push hl -.col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret -; e0509 (38:4509) - -CardFlip_CopyOAM: ; e0509 - ld de, wVirtualOAMSprite00 - ld a, [hli] -.loop - push af - ld a, [hli] - add b - ld [de], a ; y - inc de - ld a, [hli] - add c - ld [de], a ; x - inc de - ld a, [hli] - ld [de], a ; tile id - inc de - ld a, [hli] - ld [de], a ; attributes - inc de - pop af - dec a - jr nz, .loop - ret -; e0521 - -CardFlip_ShiftDigitsLeftTwoPixels: ; e0521 (38:4521) - ld de, vTiles0 tile "0" - ld hl, vTiles0 tile "0" + 2 - ld bc, 10 tiles - 2 - call CopyBytes - ld hl, vTiles0 tile "9" + 1 tiles - 2 - xor a - ld [hli], a - ld [hl], a - ret -; e0534 (38:4534) - -CardFlip_BlankDiscardedCardSlot: ; e0534 - xor a - ld [hBGMapMode], a - ld a, [wCardFlipFaceUpCard] - ld e, a - ld d, 0 - - and 3 ; get mon - ld c, a - ld b, 0 - - ld a, e - and $1c ; get level - srl a - add LOW(.Jumptable) - ld l, a - ld a, 0 - adc HIGH(.Jumptable) - ld h, a - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e0553 - -.Jumptable: ; e0553 - dw .Level1 - dw .Level2 - dw .Level3 - dw .Level4 - dw .Level5 - dw .Level6 -; e055f - -.Level1: ; e055f - ld hl, wDiscardPile + 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded2 - hlcoord 13, 3 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $37 - ret - -.discarded2 - hlcoord 13, 3 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3d - ret -; e0583 - -.Level2: ; e0583 - ld hl, wDiscardPile - 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded1 - hlcoord 13, 4 - add hl, bc - add hl, bc - ld [hl], $3b - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret - -.discarded1 - hlcoord 13, 4 - add hl, bc - add hl, bc - ld [hl], $3d - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret -; e05a7 - -.Level3: ; e05a7 - ld hl, wDiscardPile + 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded4 - hlcoord 13, 6 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $38 - ret - -.discarded4 - hlcoord 13, 6 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3d - ret -; e05cb - -.Level4: ; e05cb - ld hl, wDiscardPile - 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded3 - hlcoord 13, 7 - add hl, bc - add hl, bc - ld [hl], $3c - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret - -.discarded3 - hlcoord 13, 7 - add hl, bc - add hl, bc - ld [hl], $3d - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret -; e05ef - -.Level5: ; e05ef - ld hl, wDiscardPile + 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded6 - hlcoord 13, 9 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $39 - ret - -.discarded6 - hlcoord 13, 9 - add hl, bc - add hl, bc - ld [hl], $36 - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3d - ret -; e0613 - -.Level6: ; e0613 - ld hl, wDiscardPile - 4 - add hl, de - ld a, [hl] - and a - jr nz, .discarded5 - hlcoord 13, 10 - add hl, bc - add hl, bc - ld [hl], $3c - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret - -.discarded5 - hlcoord 13, 10 - add hl, bc - add hl, bc - ld [hl], $3d - ld bc, SCREEN_WIDTH - add hl, bc - ld [hl], $3a - ret -; e0637 - -CardFlip_CheckWinCondition: ; e0637 - call CollapseCursorPosition - add hl, hl - ld de, .Jumptable - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e0643 - -.Jumptable: ; e0643 - dw .Impossible - dw .Impossible - dw .PikaJiggly - dw .PikaJiggly - dw .PoliOddish - dw .PoliOddish - - dw .Impossible - dw .Impossible - dw .Pikachu - dw .Jigglypuff - dw .Poliwag - dw .Oddish - - dw .OneTwo - dw .One - dw .PikaOne - dw .JigglyOne - dw .PoliOne - dw .OddOne - - dw .OneTwo - dw .Two - dw .PikaTwo - dw .JigglyTwo - dw .PoliTwo - dw .OddTwo - - dw .ThreeFour - dw .Three - dw .PikaThree - dw .JigglyThree - dw .PoliThree - dw .OddThree - - dw .ThreeFour - dw .Four - dw .PikaFour - dw .JigglyFour - dw .PoliFour - dw .OddFour - - dw .FiveSix - dw .Five - dw .PikaFive - dw .JigglyFive - dw .PoliFive - dw .OddFive - - dw .FiveSix - dw .Six - dw .PikaSix - dw .JigglySix - dw .PoliSix - dw .OddSix -; e06a3 - -.Impossible: ; e06a3 - jp .Lose -; e06a6 - -.PikaJiggly: ; e06a6 - ld a, [wCardFlipFaceUpCard] - and $2 - jp nz, .Lose - jr .WinSix - -.PoliOddish: ; e06b0 - ld a, [wCardFlipFaceUpCard] - and $2 - jr nz, .WinSix - jp .Lose - -.WinSix: ; e06ba - ld c, $6 - ld de, SFX_2ND_PLACE - jp .Payout -; e06c2 - -.OneTwo: ; e06c2 - ld a, [wCardFlipFaceUpCard] - and $18 - jr z, .WinNine - jp .Lose - -.ThreeFour: ; e06cc - ld a, [wCardFlipFaceUpCard] - and $18 - cp $8 - jr z, .WinNine - jp .Lose - -.FiveSix: ; e06d8 - ld a, [wCardFlipFaceUpCard] - and $18 - cp $10 - jr z, .WinNine - jp .Lose - -.WinNine: ; e06e4 - ld c, $9 - ld de, SFX_2ND_PLACE - jp .Payout -; e06ec - -.Pikachu: ; e06ec - ld a, [wCardFlipFaceUpCard] - and $3 - jr z, .WinTwelve - jp .Lose - -.Jigglypuff: ; e06f6 - ld a, [wCardFlipFaceUpCard] - and $3 - cp $1 - jr z, .WinTwelve - jp .Lose - -.Poliwag: ; e0702 - ld a, [wCardFlipFaceUpCard] - and $3 - cp $2 - jr z, .WinTwelve - jp .Lose - -.Oddish: ; e070e - ld a, [wCardFlipFaceUpCard] - and $3 - cp $3 - jr z, .WinTwelve - jp .Lose - -.WinTwelve: ; e071a - ld c, $c - ld de, SFX_2ND_PLACE - jp .Payout -; e0722 - -.One: ; e0722 - ld a, [wCardFlipFaceUpCard] - and $1c - jr z, .WinEighteen - jp .Lose - -.Two: ; e072c - ld a, [wCardFlipFaceUpCard] - and $1c - cp $4 - jr z, .WinEighteen - jp .Lose - -.Three: ; e0738 - ld a, [wCardFlipFaceUpCard] - and $1c - cp $8 - jr z, .WinEighteen - jp .Lose - -.Four: ; e0744 - ld a, [wCardFlipFaceUpCard] - and $1c - cp $c - jr z, .WinEighteen - jp .Lose - -.Five: ; e0750 - ld a, [wCardFlipFaceUpCard] - and $1c - cp $10 - jr z, .WinEighteen - jp .Lose - -.Six: ; e075c - ld a, [wCardFlipFaceUpCard] - and $1c - cp $14 - jr z, .WinEighteen - jp .Lose - -.WinEighteen: ; e0768 - ld c, $12 - ld de, SFX_2ND_PLACE - jp .Payout -; e0770 - - -.PikaOne: ; e0770 - ld e, $0 - jr .CheckWin72 - -.JigglyOne: ; e0774 - ld e, $1 - jr .CheckWin72 - -.PoliOne: ; e0778 - ld e, $2 - jr .CheckWin72 - -.OddOne: ; e077c - ld e, $3 - jr .CheckWin72 - -.PikaTwo: ; e0780 - ld e, $4 - jr .CheckWin72 - -.JigglyTwo: ; e0784 - ld e, $5 - jr .CheckWin72 - -.PoliTwo: ; e0788 - ld e, $6 - jr .CheckWin72 - -.OddTwo: ; e078c - ld e, $7 - jr .CheckWin72 - -.PikaThree: ; e0790 - ld e, $8 - jr .CheckWin72 - -.JigglyThree: ; e0794 - ld e, $9 - jr .CheckWin72 - -.PoliThree: ; e0798 - ld e, $a - jr .CheckWin72 - -.OddThree: ; e079c - ld e, $b - jr .CheckWin72 - -.PikaFour: ; e07a0 - ld e, $c - jr .CheckWin72 - -.JigglyFour: ; e07a4 - ld e, $d - jr .CheckWin72 - -.PoliFour: ; e07a8 - ld e, $e - jr .CheckWin72 - -.OddFour: ; e07ac - ld e, $f - jr .CheckWin72 - -.PikaFive: ; e07b0 - ld e, $10 - jr .CheckWin72 - -.JigglyFive: ; e07b4 - ld e, $11 - jr .CheckWin72 - -.PoliFive: ; e07b8 - ld e, $12 - jr .CheckWin72 - -.OddFive: ; e07bc - ld e, $13 - jr .CheckWin72 - -.PikaSix: ; e07c0 - ld e, $14 - jr .CheckWin72 - -.JigglySix: ; e07c4 - ld e, $15 - jr .CheckWin72 - -.PoliSix: ; e07c8 - ld e, $16 - jr .CheckWin72 - -.OddSix: ; e07cc - ld e, $17 - -.CheckWin72: ; e07ce - ld a, [wCardFlipFaceUpCard] - cp e - jr nz, .Lose - ld c, 72 - ld de, SFX_2ND_PLACE - jr .Payout - -.Lose: ; e07db - ld de, SFX_WRONG - call PlaySFX - ld hl, .Text_Darn - call CardFlip_UpdateCoinBalanceDisplay - call WaitSFX - ret - -.Payout: ; e07eb - push bc - push de - ld hl, .Text_Yeah - call CardFlip_UpdateCoinBalanceDisplay - pop de - call PlaySFX - call WaitSFX - pop bc -.loop - push bc - call .IsCoinCaseFull - jr c, .full - call .AddCoinPlaySFX - -.full - call CardFlip_PrintCoinBalance - ld c, 2 - call DelayFrames - pop bc - dec c - jr nz, .loop - ret -; e0811 - -.Text_Yeah: ; 0xe0811 - ; Yeah! - text_jump UnknownText_0x1c5813 - db "@" -; 0xe0816 - -.Text_Darn: ; 0xe0816 - ; Darn… - text_jump UnknownText_0x1c581a - db "@" -; 0xe081b - -.AddCoinPlaySFX: ; e081b - ld a, [wCoins] - ld h, a - ld a, [wCoins + 1] - ld l, a - inc hl - ld a, h - ld [wCoins], a - ld a, l - ld [wCoins + 1], a - ld de, SFX_PAY_DAY - call PlaySFX - ret -; e0833 - -.IsCoinCaseFull: ; e0833 - ld a, [wCoins] - cp HIGH(MAX_COINS) - jr c, .less - jr z, .check_low - jr .more - -.check_low - ld a, [wCoins + 1] - cp LOW(MAX_COINS) - jr c, .less - -.more - scf - ret - -.less - and a - ret -; e0849 - -PlaceOAMCardBorder: ; e0849 - call GetCoordsOfChosenCard - ld hl, .SpriteData - call CardFlip_CopyOAM - ret -; e0853 - -.SpriteData: ; e0853 - db 18 - dsprite 0, 0, 0, 0, $04, 0 - dsprite 0, 0, 1, 0, $06, 0 - dsprite 0, 0, 2, 0, $06, 0 - dsprite 0, 0, 3, 0, $06, 0 - dsprite 0, 0, 4, 0, $04, 0 | X_FLIP - - dsprite 1, 0, 0, 0, $05, 0 - dsprite 1, 0, 4, 0, $05, 0 | X_FLIP - - dsprite 2, 0, 0, 0, $05, 0 - dsprite 2, 0, 4, 0, $05, 0 | X_FLIP - - dsprite 3, 0, 0, 0, $05, 0 - dsprite 3, 0, 4, 0, $05, 0 | X_FLIP - - dsprite 4, 0, 0, 0, $05, $00 - dsprite 4, 0, 4, 0, $05, 0 | X_FLIP - - dsprite 5, 0, 0, 0, $04, 0 | Y_FLIP - dsprite 5, 0, 1, 0, $06, 0 | Y_FLIP - dsprite 5, 0, 2, 0, $06, 0 | Y_FLIP - dsprite 5, 0, 3, 0, $06, 0 | Y_FLIP - dsprite 5, 0, 4, 0, $04, 0 | X_FLIP | Y_FLIP -; e089c - -ChooseCard_HandleJoypad: ; e089c - ld hl, hJoyLast - ld a, [hl] - and D_LEFT - jp nz, .d_left - ld a, [hl] - and D_RIGHT - jp nz, .d_right - ld a, [hl] - and D_UP - jp nz, .d_up - ld a, [hl] - and D_DOWN - jp nz, .d_down - ret -; e08b8 - -.d_left ; e08b8 - ld hl, wCardFlipCursorX - ld a, [wCardFlipCursorY] - and a - jr z, .mon_pair_left - cp $1 - jr z, .mon_group_left - ld a, [hl] - and a - ret z - dec [hl] - jp .play_sound - -.mon_group_left - ld a, [hl] - cp $3 - jr c, .left_to_number_gp - dec [hl] - jp .play_sound - -.mon_pair_left - ld a, [hl] - and $e - ld [hl], a - cp $3 - jr c, .left_to_number_gp - dec [hl] - dec [hl] - jp .play_sound - -.left_to_number_gp - ld a, $2 - ld [wCardFlipCursorY], a - ld a, $1 - ld [wCardFlipCursorX], a - jp .play_sound -; e08ef - -.d_right ; e08ef - ld hl, wCardFlipCursorX - ld a, [wCardFlipCursorY] - and a - jr z, .mon_pair_right - ld a, [hl] - cp $5 - ret nc - inc [hl] - jr .play_sound - -.mon_pair_right - ld a, [hl] - and $e - ld [hl], a - cp $4 - ret nc - inc [hl] - inc [hl] - jr .play_sound - -.d_up ; e090a - ld hl, wCardFlipCursorY - ld a, [wCardFlipCursorX] - and a - jr z, .num_pair_up - cp $1 - jr z, .num_gp_up - ld a, [hl] - and a - ret z - dec [hl] - jr .play_sound - -.num_gp_up - ld a, [hl] - cp $3 - jr c, .up_to_mon_group - dec [hl] - jr .play_sound - -.num_pair_up - ld a, [hl] - and $e - ld [hl], a - cp $3 - jr c, .up_to_mon_group - dec [hl] - dec [hl] - jr .play_sound - -.up_to_mon_group - ld a, $1 - ld [wCardFlipCursorY], a - ld a, $2 - ld [wCardFlipCursorX], a - jr .play_sound - -.d_down ; e093d - ld hl, wCardFlipCursorY - ld a, [wCardFlipCursorX] - and a - jr z, .num_pair_down - ld hl, wCardFlipCursorY - ld a, [hl] - cp $7 - ret nc - inc [hl] - jr .play_sound - -.num_pair_down - ld a, [hl] - and $e - ld [hl], a - cp $6 - ret nc - inc [hl] - inc [hl] - -.play_sound ; e0959 - ld de, SFX_POKEBALLS_PLACED_ON_TABLE - call PlaySFX - ret -; e0960 - -CardFlip_UpdateCursorOAM: ; e0960 - call ClearSprites - ld a, [hCGB] - and a - jr nz, .skip - ld a, [hVBlankCounter] - and $4 - ret nz - -.skip - call CollapseCursorPosition - add hl, hl - add hl, hl - ld de, .OAMData - add hl, de - ld a, [hli] - ld c, a - ld a, [hli] - ld b, a - ld a, [hli] - ld h, [hl] - ld l, a - call CardFlip_CopyOAM - ret -; e0981 - -.OAMData: ; e0981 -cardflip_cursor: MACRO -if _NARG >= 5 - dbpixel \1, \2, \3, \4 - dw \5 -else - dbpixel \1, \2 - dw \3 -endc -ENDM - - cardflip_cursor 11, 2, .Impossible - cardflip_cursor 12, 2, .Impossible - cardflip_cursor 13, 2, .PokeGroupPair - cardflip_cursor 13, 2, .PokeGroupPair - cardflip_cursor 17, 2, .PokeGroupPair - cardflip_cursor 17, 2, .PokeGroupPair - - cardflip_cursor 11, 3, .Impossible - cardflip_cursor 12, 3, .Impossible - cardflip_cursor 13, 3, .PokeGroup - cardflip_cursor 15, 3, .PokeGroup - cardflip_cursor 17, 3, .PokeGroup - cardflip_cursor 19, 3, .PokeGroup - - cardflip_cursor 11, 5, .NumGroupPair - cardflip_cursor 12, 5, .NumGroup - cardflip_cursor 13, 5, .SingleTile - cardflip_cursor 15, 5, .SingleTile - cardflip_cursor 17, 5, .SingleTile - cardflip_cursor 19, 5, .SingleTile - - cardflip_cursor 11, 5, .NumGroupPair - cardflip_cursor 12, 6, 0, 4, .NumGroup - cardflip_cursor 13, 6, 0, 4, .SingleTile - cardflip_cursor 15, 6, 0, 4, .SingleTile - cardflip_cursor 17, 6, 0, 4, .SingleTile - cardflip_cursor 19, 6, 0, 4, .SingleTile - - cardflip_cursor 11, 8, .NumGroupPair - cardflip_cursor 12, 8, .NumGroup - cardflip_cursor 13, 8, .SingleTile - cardflip_cursor 15, 8, .SingleTile - cardflip_cursor 17, 8, .SingleTile - cardflip_cursor 19, 8, .SingleTile - - cardflip_cursor 11, 8, .NumGroupPair - cardflip_cursor 12, 9, 0, 4, .NumGroup - cardflip_cursor 13, 9, 0, 4, .SingleTile - cardflip_cursor 15, 9, 0, 4, .SingleTile - cardflip_cursor 17, 9, 0, 4, .SingleTile - cardflip_cursor 19, 9, 0, 4, .SingleTile - - cardflip_cursor 11, 11, .NumGroupPair - cardflip_cursor 12, 11, .NumGroup - cardflip_cursor 13, 11, .SingleTile - cardflip_cursor 15, 11, .SingleTile - cardflip_cursor 17, 11, .SingleTile - cardflip_cursor 19, 11, .SingleTile - - cardflip_cursor 11, 11, .NumGroupPair - cardflip_cursor 12, 12, 0, 4, .NumGroup - cardflip_cursor 13, 12, 0, 4, .SingleTile - cardflip_cursor 15, 12, 0, 4, .SingleTile - cardflip_cursor 17, 12, 0, 4, .SingleTile - cardflip_cursor 19, 12, 0, 4, .SingleTile -; e0a41 - -.SingleTile: ; e0a41 - db 6 - dsprite 0, 0, -1, 7, $00, 0 | PRIORITY - dsprite 0, 0, 0, 0, $02, 0 | PRIORITY - dsprite 0, 0, 1, 0, $03, 0 | PRIORITY - dsprite 0, 5, -1, 7, $00, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 0, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 1, 0, $03, 0 | PRIORITY - -.PokeGroup: ; e0a5a - db 26 - dsprite 0, 0, -1, 7, $00, 0 | PRIORITY - dsprite 0, 0, 0, 0, $02, 0 | PRIORITY - dsprite 0, 0, 1, 0, $00, 0 | X_FLIP | PRIORITY - dsprite 1, 0, -1, 7, $01, 0 | PRIORITY - dsprite 1, 0, 1, 0, $01, 0 | X_FLIP | PRIORITY - dsprite 2, 0, -1, 7, $01, 0 | PRIORITY - dsprite 2, 0, 1, 0, $03, 0 | PRIORITY - dsprite 3, 0, -1, 7, $01, 0 | PRIORITY - dsprite 3, 0, 1, 0, $03, 0 | PRIORITY - dsprite 4, 0, -1, 7, $01, 0 | PRIORITY - dsprite 4, 0, 1, 0, $03, 0 | PRIORITY - dsprite 5, 0, -1, 7, $01, 0 | PRIORITY - dsprite 5, 0, 1, 0, $03, 0 | PRIORITY - dsprite 6, 0, -1, 7, $01, 0 | PRIORITY - dsprite 6, 0, 1, 0, $03, 0 | PRIORITY - dsprite 7, 0, -1, 7, $01, 0 | PRIORITY - dsprite 7, 0, 1, 0, $03, 0 | PRIORITY - dsprite 8, 0, -1, 7, $01, 0 | PRIORITY - dsprite 8, 0, 1, 0, $03, 0 | PRIORITY - dsprite 9, 0, -1, 7, $01, 0 | PRIORITY - dsprite 9, 0, 1, 0, $03, 0 | PRIORITY - dsprite 10, 0, -1, 7, $01, 0 | PRIORITY - dsprite 10, 0, 1, 0, $03, 0 | PRIORITY - dsprite 10, 1, -1, 7, $00, 0 | Y_FLIP | PRIORITY - dsprite 10, 1, 0, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 10, 1, 1, 0, $03, 0 | PRIORITY - -.NumGroup: ; e0ac3 - db 20 - dsprite 0, 0, -1, 7, $00, 0 | PRIORITY - dsprite 0, 0, 0, 0, $02, 0 | PRIORITY - dsprite 0, 0, 1, 0, $02, 0 | PRIORITY - dsprite 0, 0, 2, 0, $03, 0 | PRIORITY - dsprite 0, 0, 3, 0, $02, 0 | PRIORITY - dsprite 0, 0, 4, 0, $03, 0 | PRIORITY - dsprite 0, 0, 5, 0, $02, 0 | PRIORITY - dsprite 0, 0, 6, 0, $03, 0 | PRIORITY - dsprite 0, 0, 7, 0, $02, 0 | PRIORITY - dsprite 0, 0, 8, 0, $03, 0 | PRIORITY - dsprite 0, 5, -1, 7, $00, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 0, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 1, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 2, 0, $03, 0 | PRIORITY - dsprite 0, 5, 3, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 4, 0, $03, 0 | PRIORITY - dsprite 0, 5, 5, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 6, 0, $03, 0 | PRIORITY - dsprite 0, 5, 7, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 0, 5, 8, 0, $03, 0 | PRIORITY - -.NumGroupPair: ; e0b14 - db 30 - dsprite 0, 0, 0, 0, $00, 0 | PRIORITY - dsprite 0, 0, 1, 0, $02, 0 | PRIORITY - dsprite 0, 0, 2, 0, $02, 0 | PRIORITY - dsprite 0, 0, 3, 0, $03, 0 | PRIORITY - dsprite 0, 0, 4, 0, $02, 0 | PRIORITY - dsprite 0, 0, 5, 0, $03, 0 | PRIORITY - dsprite 0, 0, 6, 0, $02, 0 | PRIORITY - dsprite 0, 0, 7, 0, $03, 0 | PRIORITY - dsprite 0, 0, 8, 0, $02, 0 | PRIORITY - dsprite 0, 0, 9, 0, $03, 0 | PRIORITY - dsprite 1, 0, 0, 0, $01, 0 | PRIORITY - dsprite 1, 0, 3, 0, $03, 0 | PRIORITY - dsprite 1, 0, 5, 0, $03, 0 | PRIORITY - dsprite 1, 0, 7, 0, $03, 0 | PRIORITY - dsprite 1, 0, 9, 0, $03, 0 | PRIORITY - dsprite 2, 0, 0, 0, $01, 0 | PRIORITY - dsprite 2, 0, 3, 0, $03, 0 | PRIORITY - dsprite 2, 0, 5, 0, $03, 0 | PRIORITY - dsprite 2, 0, 7, 0, $03, 0 | PRIORITY - dsprite 2, 0, 9, 0, $03, 0 | PRIORITY - dsprite 2, 1, 0, 0, $00, 0 | Y_FLIP | PRIORITY - dsprite 2, 1, 1, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 2, 1, 2, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 2, 1, 3, 0, $03, 0 | PRIORITY - dsprite 2, 1, 4, 0, $03, 0 | PRIORITY - dsprite 2, 1, 5, 0, $03, 0 | PRIORITY - dsprite 2, 1, 6, 0, $03, 0 | PRIORITY - dsprite 2, 1, 7, 0, $03, 0 | PRIORITY - dsprite 2, 1, 8, 0, $03, 0 | PRIORITY - dsprite 2, 1, 9, 0, $03, 0 | PRIORITY - -.PokeGroupPair: ; e0b8d - db 38 - dsprite 0, 0, -1, 7, $00, 0 | PRIORITY - dsprite 0, 0, 3, 0, $00, 0 | X_FLIP | PRIORITY - dsprite 1, 0, -1, 7, $01, 0 | PRIORITY - dsprite 1, 0, 3, 0, $01, 0 | X_FLIP | PRIORITY - dsprite 2, 0, -1, 7, $01, 0 | PRIORITY - dsprite 2, 0, 3, 0, $01, 0 | X_FLIP | PRIORITY - dsprite 3, 0, -1, 7, $01, 0 | PRIORITY - dsprite 3, 0, 1, 0, $03, 0 | PRIORITY - dsprite 3, 0, 3, 0, $03, 0 | PRIORITY - dsprite 4, 0, -1, 7, $01, 0 | PRIORITY - dsprite 4, 0, 1, 0, $03, 0 | PRIORITY - dsprite 4, 0, 3, 0, $03, 0 | PRIORITY - dsprite 5, 0, -1, 7, $01, 0 | PRIORITY - dsprite 5, 0, 1, 0, $03, 0 | PRIORITY - dsprite 5, 0, 3, 0, $03, 0 | PRIORITY - dsprite 6, 0, -1, 7, $01, 0 | PRIORITY - dsprite 6, 0, 1, 0, $03, 0 | PRIORITY - dsprite 6, 0, 3, 0, $03, 0 | PRIORITY - dsprite 7, 0, -1, 7, $01, 0 | PRIORITY - dsprite 7, 0, 1, 0, $03, 0 | PRIORITY - dsprite 7, 0, 3, 0, $03, 0 | PRIORITY - dsprite 8, 0, -1, 7, $01, 0 | PRIORITY - dsprite 8, 0, 1, 0, $03, 0 | PRIORITY - dsprite 8, 0, 3, 0, $03, 0 | PRIORITY - dsprite 9, 0, -1, 7, $01, 0 | PRIORITY - dsprite 9, 0, 1, 0, $03, 0 | PRIORITY - dsprite 9, 0, 3, 0, $03, 0 | PRIORITY - dsprite 10, 0, -1, 7, $01, 0 | PRIORITY - dsprite 10, 0, 1, 0, $03, 0 | PRIORITY - dsprite 10, 0, 3, 0, $03, 0 | PRIORITY - dsprite 11, 0, -1, 7, $01, 0 | PRIORITY - dsprite 11, 0, 1, 0, $03, 0 | PRIORITY - dsprite 11, 0, 3, 0, $03, 0 | PRIORITY - dsprite 11, 1, -1, 7, $00, 0 | Y_FLIP | PRIORITY - dsprite 11, 1, 0, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 11, 1, 1, 0, $03, 0 | Y_FLIP | PRIORITY - dsprite 11, 1, 2, 0, $02, 0 | Y_FLIP | PRIORITY - dsprite 11, 1, 3, 0, $03, 0 | X_FLIP | Y_FLIP | PRIORITY - -.Impossible: ; e0c26 - db 4 - dsprite 0, 0, 0, 0, $00, 0 | PRIORITY - dsprite 0, 0, 1, 0, $00, 0 | X_FLIP | PRIORITY - dsprite 1, 0, 0, 0, $00, 0 | Y_FLIP | PRIORITY - dsprite 1, 0, 1, 0, $00, 0 | X_FLIP | Y_FLIP | PRIORITY -; e0c37 - -CardFlip_InitAttrPals: ; e0c37 (38:4c37) - ld a, [hCGB] - and a - ret z - - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - xor a - call ByteFill - - hlcoord 12, 1, wAttrMap - lb bc, 2, 2 - ld a, $1 - call CardFlip_FillBox - - hlcoord 14, 1, wAttrMap - lb bc, 2, 2 - ld a, $2 - call CardFlip_FillBox - - hlcoord 16, 1, wAttrMap - lb bc, 2, 2 - ld a, $3 - call CardFlip_FillBox - - hlcoord 18, 1, wAttrMap - lb bc, 2, 2 - ld a, $4 - call CardFlip_FillBox - - hlcoord 9, 0, wAttrMap - lb bc, 12, 1 - ld a, $1 - call CardFlip_FillBox - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, .palettes - ld de, wBGPals1 - ld bc, 9 palettes - call CopyBytes - pop af - ld [rSVBK], a - ret -; e0c93 (38:4c93) - -.palettes ; e0c93 -INCLUDE "gfx/card_flip/card_flip.pal" -; e0cdb - -CardFlipLZ03: ; e0cdb -INCBIN "gfx/card_flip/card_flip_3.2bpp.lz" - -CardFlipOffButtonGFX: ; e0cf6 -INCBIN "gfx/card_flip/off.2bpp" - -CardFlipOnButtonGFX: ; e0d06 -INCBIN "gfx/card_flip/on.2bpp" - -CardFlipLZ01: ; e0d16 -INCBIN "gfx/card_flip/card_flip_1.2bpp.lz" - -CardFlipLZ02: ; e0ea8 -INCBIN "gfx/card_flip/card_flip_2.2bpp.lz" - -CardFlipTilemap: ; e110c -INCBIN "gfx/card_flip/card_flip.tilemap" -; e1190 diff --git a/engine/game/dummy_game.asm b/engine/game/dummy_game.asm deleted file mode 100755 index 6d7e12196..000000000 --- a/engine/game/dummy_game.asm +++ /dev/null @@ -1,612 +0,0 @@ -_DummyGame: ; e1e5b (38:5e5b) - call .LoadGFXAndPals - call DelayFrame -.loop - call .JumptableLoop - jr nc, .loop - ret - -.LoadGFXAndPals: - call DisableLCD - ld b, SCGB_DIPLOMA - call GetSGBLayout - callfar ClearSpriteAnims - ld hl, LZ_e2221 - ld de, vTiles2 tile $00 - call Decompress - ld hl, Unknown_e00ed - ld de, vTiles0 tile $00 - ld bc, 4 tiles - ld a, BANK(Unknown_e00ed) - call FarCopyBytes - ld a, $8 - ld hl, wc300 - ld [hli], a - ld [hl], $0 - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - xor a - call ByteFill - xor a - ld [hSCY], a - ld [hSCX], a - ld [rWY], a - ld [wJumptableIndex], a - ld a, $1 - ld [hBGMapMode], a - ld a, LCDC_DEFAULT - ld [rLCDC], a - ld a, $e4 - call DmgToCgbBGPals - ld a, $e0 - call DmgToCgbObjPal0 - ret - -.JumptableLoop: - ld a, [wJumptableIndex] - bit 7, a - jr nz, .quit - call .ExecuteJumptable - callfar PlaySpriteAnimations - call DelayFrame - and a - ret - -.quit - scf - ret - -.ExecuteJumptable: - jumptable .Jumptable, wJumptableIndex - -.Jumptable: - dw .RestartGame - dw .ResetBoard - dw .InitBoardTilemapAndCursorObject - dw .CheckTriesRemaining - dw .PickCard1 - dw .PickCard2 - dw .DelayPickAgain - dw .RevealAll - dw .AskPlayAgain - -.RestartGame: - call DummyGame_InitStrings - ld hl, wJumptableIndex - inc [hl] - ret - -.ResetBoard: - call ret_e00ed - jr nc, .proceed - ld hl, wJumptableIndex - set 7, [hl] - ret - -.proceed - call DummyGame_InitBoard - ld hl, wJumptableIndex - inc [hl] - xor a - ld [wDummyGameCounter], a - ld hl, wDummyGameLastMatches -rept 4 - ld [hli], a -endr - ld [hl], a - ld [wDummyGameNumCardsMatched], a -.InitBoardTilemapAndCursorObject: - ld hl, wDummyGameCounter - ld a, [hl] - cp 45 - jr nc, .spawn_object - inc [hl] - call DummyGame_Card2Coord - xor a - ld [wDummyGameLastCardPicked], a - call DummyGame_PlaceCard - ret - -.spawn_object - depixel 6, 3, 4, 4 - ld a, SPRITE_ANIM_INDEX_DUMMY_GAME - call _InitSpriteAnimStruct - ld a, 5 - ld [wDummyGameNumberTriesRemaining], a - ld hl, wJumptableIndex - inc [hl] - ret - -.CheckTriesRemaining: - ld a, [wDummyGameNumberTriesRemaining] - hlcoord 17, 0 - add "0" - ld [hl], a - ld hl, wDummyGameNumberTriesRemaining - ld a, [hl] - and a - jr nz, .next_try - ld a, $7 - ld [wJumptableIndex], a - ret - -.next_try - dec [hl] - xor a - ld [wcf64], a - ld hl, wJumptableIndex - inc [hl] -.PickCard1: - ld a, [wcf64] - and a - ret z - dec a - ld e, a - ld d, 0 - ld hl, wDummyGameCards - add hl, de - ld a, [hl] - cp -1 - ret z - ld [wDummyGameLastCardPicked], a - ld [wDummyGameCard1], a - ld a, e - ld [wDummyGameCard1Location], a - call DummyGame_Card2Coord - call DummyGame_PlaceCard - xor a - ld [wcf64], a - ld hl, wJumptableIndex - inc [hl] - ret - -.PickCard2: - ld a, [wcf64] - and a - ret z - dec a - ld hl, wDummyGameCard1Location - cp [hl] - ret z - ld e, a - ld d, 0 - ld hl, wDummyGameCards - add hl, de - ld a, [hl] - cp -1 - ret z - ld [wDummyGameLastCardPicked], a - ld [wDummyGameCard2], a - ld a, e - ld [wDummyGameCard2Location], a - call DummyGame_Card2Coord - call DummyGame_PlaceCard - ld a, 64 - ld [wDummyGameCounter], a - ld hl, wJumptableIndex - inc [hl] -.DelayPickAgain: - ld hl, wDummyGameCounter - ld a, [hl] - and a - jr z, .PickAgain - dec [hl] - ret - -.PickAgain: - call DummyGame_CheckMatch - ld a, $3 - ld [wJumptableIndex], a - ret - -.RevealAll: - ld a, [hJoypadPressed] - and A_BUTTON - ret z - xor a - ld [wDummyGameCounter], a -.RevelationLoop: - ld hl, wDummyGameCounter - ld a, [hl] - cp 45 - jr nc, .finish_round - inc [hl] - push af - call DummyGame_Card2Coord - pop af - push hl - ld e, a - ld d, $0 - ld hl, wDummyGameCards - add hl, de - ld a, [hl] - pop hl - cp -1 - jr z, .RevelationLoop - ld [wDummyGameLastCardPicked], a - call DummyGame_PlaceCard - jr .RevelationLoop - -.finish_round - call WaitPressAorB_BlinkCursor - ld hl, wJumptableIndex - inc [hl] -.AskPlayAgain: - call ret_e00ed - jr nc, .restart - ld hl, wJumptableIndex - set 7, [hl] - ret - -.restart - xor a - ld [wJumptableIndex], a - ret - -; e2010 - -DummyGame_CheckMatch: ; e2010 - ld hl, wDummyGameCard1 - ld a, [hli] - cp [hl] - jr nz, .no_match - - ld a, [wDummyGameCard1Location] - call DummyGame_Card2Coord - call DummyGame_DeleteCard - - ld a, [wDummyGameCard2Location] - call DummyGame_Card2Coord - call DummyGame_DeleteCard - - ld a, [wDummyGameCard1Location] - ld e, a - ld d, $0 - ld hl, wDummyGameCards - add hl, de - ld [hl], -1 - - ld a, [wDummyGameCard2Location] - ld e, a - ld d, 0 - ld hl, wDummyGameCards - add hl, de - ld [hl], -1 - - ld hl, wDummyGameLastMatches -.find_empty_slot - ld a, [hli] - and a - jr nz, .find_empty_slot - dec hl - ld a, [wDummyGameCard1] - ld [hl], a - ld [wDummyGameLastCardPicked], a - ld hl, wDummyGameNumCardsMatched - ld e, [hl] - inc [hl] - inc [hl] - ld d, 0 - hlcoord 5, 0 - add hl, de - call DummyGame_PlaceCard - ld hl, .VictoryText - call PrintText - ret - -.no_match - xor a - ld [wDummyGameLastCardPicked], a - - ld a, [wDummyGameCard1Location] - call DummyGame_Card2Coord - call DummyGame_PlaceCard - - ld a, [wDummyGameCard2Location] - call DummyGame_Card2Coord - call DummyGame_PlaceCard - - ld hl, DummyGameText_Darn - call PrintText - ret - -.VictoryText: - start_asm - push bc - hlcoord 2, 13 - call DummyGame_PlaceCard - ld hl, DummyGameText_Yeah - pop bc - inc bc - inc bc - inc bc - ret - -; e2093 - -DummyGameText_Yeah: ; 0xe2093 - ; , yeah! - text_jump UnknownText_0x1c1a5b - db "@" -; 0xe2098 - -DummyGameText_Darn: ; 0xe2098 - ; Darn… - text_jump UnknownText_0x1c1a65 - db "@" -; 0xe209d - -DummyGame_InitBoard: ; e209d - ld hl, wDummyGameCards - ld bc, wDummyGameCardsEnd - wDummyGameCards - xor a - call ByteFill - call DummyGame_GetDistributionOfTiles - - ld c, 2 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 8 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 4 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 7 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 3 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 6 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 1 - ld b, [hl] - call DummyGame_SampleTilePlacement - - ld c, 5 - ld hl, wDummyGameCards - ld b, wDummyGameCardsEnd - wDummyGameCards -.loop - ld a, [hl] - and a - jr nz, .no_load - ld [hl], c -.no_load - inc hl - dec b - jr nz, .loop - ret - -; e20e5 - -DummyGame_SampleTilePlacement: ; e20e5 - push hl - ld de, wDummyGameCards -.loop - call Random - and %00111111 - cp 45 - jr nc, .loop - ld l, a - ld h, 0 - add hl, de - ld a, [hl] - and a - jr nz, .loop - ld [hl], c - dec b - jr nz, .loop - pop hl - inc hl - ret - -; e2101 - -DummyGame_GetDistributionOfTiles: ; e2101 - ld a, [wMenuCursorY] - dec a - ld l, a - ld h, 0 - add hl, hl - add hl, hl - add hl, hl - ld de, .distributions - add hl, de - ret - -.distributions - db $02, $03, $06, $06, $06, $08, $08, $06 - db $02, $02, $04, $06, $06, $08, $08, $09 - db $02, $02, $02, $04, $07, $08, $08, $0c -; e2128 - -DummyGame_PlaceCard: ; e2128 - ld a, [wDummyGameLastCardPicked] - sla a - sla a - add 4 - ld [hli], a - inc a - ld [hld], a - inc a - ld bc, SCREEN_WIDTH - add hl, bc - ld [hli], a - inc a - ld [hl], a - ld c, 3 - call DelayFrames - ret - -; e2142 - -DummyGame_DeleteCard: ; e2142 - ld a, $1 - ld [hli], a - ld [hld], a - ld bc, SCREEN_WIDTH - add hl, bc - ld [hli], a - ld [hl], a - ld c, 3 - call DelayFrames - ret - -; e2152 - -DummyGame_InitStrings: ; e2152 - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $1 - call ByteFill - hlcoord 0, 0 - ld de, .japstr1 - call PlaceString - hlcoord 15, 0 - ld de, .japstr2 - call PlaceString - ld hl, .dummy_text - call PrintText - ret - -.dummy_text - db "@" -.japstr1 - db "とったもの@" -.japstr2 - db "あと かい@" -; e2183 - -DummyGame_Card2Coord: ; e2183 - ld d, 0 -.find_row - sub 9 - jr c, .found_row - inc d - jr .find_row - -.found_row - add 9 - ld e, a - hlcoord 1, 2 - ld bc, 2 * SCREEN_WIDTH -.loop2 - ld a, d - and a - jr z, .done - add hl, bc - dec d - jr .loop2 - -.done - sla e - add hl, de - ret - -; e21a1 - -DummyGame_InterpretJoypad_AnimateCursor: ; e21a1 (38:61a1) - ld a, [wJumptableIndex] - cp $7 - jr nc, .quit - call JoyTextDelay - ld hl, hJoypadPressed ; $ffa3 - ld a, [hl] - and A_BUTTON - jr nz, .pressed_a - ld a, [hl] - and D_LEFT - jr nz, .pressed_left - ld a, [hl] - and D_RIGHT - jr nz, .pressed_right - ld a, [hl] - and D_UP - jr nz, .pressed_up - ld a, [hl] - and D_DOWN - jr nz, .pressed_down - ret - -.quit - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -.pressed_a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - inc a - ld [wcf64], a - ret - -.pressed_left - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld a, [hl] - and a - ret z - sub 1 tiles - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - dec [hl] - ret - -.pressed_right - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld a, [hl] - cp (9 - 1) tiles - ret z - add 1 tiles - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - inc [hl] - ret - -.pressed_up - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld a, [hl] - and a - ret z - sub 1 tiles - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - sub 9 - ld [hl], a - ret - -.pressed_down - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld a, [hl] - cp (5 - 1) tiles - ret z - add 1 tiles - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - add 9 - ld [hl], a - ret - -; e2221 (38:6221) - -LZ_e2221: ; e2221 -INCBIN "gfx/dummy_game/dummy_game.2bpp.lz" diff --git a/engine/game/slot_machine.asm b/engine/game/slot_machine.asm deleted file mode 100755 index 924c78924..000000000 --- a/engine/game/slot_machine.asm +++ /dev/null @@ -1,2352 +0,0 @@ -SLOTS_NO_BIAS EQU -1 -SLOTS_NO_MATCH EQU -1 - -SLOTS_SEVEN EQU $00 -SLOTS_POKEBALL EQU $04 -SLOTS_CHERRY EQU $08 -SLOTS_PIKACHU EQU $0c -SLOTS_SQUIRTLE EQU $10 -SLOTS_STARYU EQU $14 - -REEL_SIZE EQU 15 - -; Constants for slot_reel offsets (see macros/wram.asm) -REEL_ACTION EQUS "(wReel1ReelAction - wReel1)" -REEL_TILEMAP_ADDR EQUS "(wReel1TilemapAddr - wReel1)" -REEL_POSITION EQUS "(wReel1Position - wReel1)" -REEL_SPIN_DISTANCE EQUS "(wReel1SpinDistance - wReel1)" -REEL_SPIN_RATE EQUS "(wReel1SpinRate - wReel1)" -REEL_OAM_ADDR EQUS "(wReel1OAMAddr - wReel1)" -REEL_X_COORD EQUS "(wReel1XCoord - wReel1)" -REEL_MANIP_COUNTER EQUS "(wReel1ManipCounter - wReel1)" -REEL_MANIP_DELAY EQUS "(wReel1ManipDelay - wReel1)" -REEL_FIELD_0B EQUS "(wReel1Field0b - wReel1)" -REEL_STOP_DELAY EQUS "(wReel1StopDelay - wReel1)" - -; SlotsJumptable constants - const_def - const SLOTS_INIT - const SLOTS_BET_AND_START - const SLOTS_WAIT_START - const SLOTS_WAIT_REEL1 - const SLOTS_WAIT_STOP_REEL1 - const SLOTS_WAIT_REEL2 - const SLOTS_WAIT_STOP_REEL2 - const SLOTS_WAIT_REEL3 - const SLOTS_WAIT_STOP_REEL3 - const SLOTS_NEXT_09 - const SLOTS_NEXT_0A - const SLOTS_NEXT_0B - const SLOTS_FLASH_IF_WIN - const SLOTS_FLASH_SCREEN - const SLOTS_GIVE_EARNED_COINS - const SLOTS_PAYOUT_TEXT_AND_ANIM - const SLOTS_PAYOUT_ANIM - const SLOTS_RESTART_OF_QUIT - const SLOTS_QUIT -SLOTS_END_LOOP_F EQU 7 - -; ReelActionJumptable constants - const_def - const REEL_ACTION_DO_NOTHING - const REEL_ACTION_STOP_REEL_IGNORE_JOYPAD - const REEL_ACTION_QUADRUPLE_RATE - const REEL_ACTION_DOUBLE_RATE - const REEL_ACTION_NORMAL_RATE - const REEL_ACTION_HALF_RATE - const REEL_ACTION_QUARTER_RATE - const REEL_ACTION_STOP_REEL1 - const REEL_ACTION_STOP_REEL2 - const REEL_ACTION_STOP_REEL3 - const REEL_ACTION_SET_UP_REEL2_SKIP_TO_7 - const REEL_ACTION_WAIT_REEL2_SKIP_TO_7 - const REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S - const REEL_ACTION_UNUSED - const REEL_ACTION_CHECK_DROP_REEL - const REEL_ACTION_WAIT_DROP_REEL - const REEL_ACTION_START_SLOW_ADVANCE_REEL3 - const REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3 - const REEL_ACTION_INIT_GOLEM - const REEL_ACTION_WAIT_GOLEM - const REEL_ACTION_END_GOLEM - const REEL_ACTION_INIT_CHANSEY - const REEL_ACTION_WAIT_CHANSEY - const REEL_ACTION_WAIT_EGG - const REEL_ACTION_DROP_REEL - -_SlotMachine: - ld hl, wOptions - set NO_TEXT_SCROLL, [hl] - call .InitGFX - call DelayFrame -.loop - call SlotsLoop - jr nc, .loop - call WaitSFX - ld de, SFX_QUIT_SLOTS - call PlaySFX - call WaitSFX - call ClearBGPalettes - farcall StubbedTrainerRankings_EndSlotsWinStreak - ld hl, wOptions - res NO_TEXT_SCROLL, [hl] - ld hl, rLCDC - res rLCDC_SPRITE_SIZE, [hl] ; 8x8 - ret - -.InitGFX: ; 926f7 (24:66f7) - call ClearBGPalettes - call ClearTileMap - call ClearSprites - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - call DisableLCD - hlbgcoord 0, 0 - ld bc, vBGMap1 - vBGMap0 - ld a, " " - call ByteFill - ld b, SCGB_SLOT_MACHINE - call GetSGBLayout - callfar ClearSpriteAnims - ld hl, wSlots - ld bc, wSlotsDataEnd - wSlots - xor a - call ByteFill - - ld hl, Slots2LZ - ld de, vTiles0 tile $00 - call Decompress - - ld hl, Slots3LZ - ld de, vTiles0 tile $40 - call Decompress - - ld hl, Slots1LZ - ld de, vTiles2 tile $00 - call Decompress - - ld hl, Slots2LZ - ld de, vTiles2 tile $25 - call Decompress - - ld hl, SlotsTilemap - decoord 0, 0 - ld bc, SCREEN_WIDTH * 12 - call CopyBytes - - ld hl, rLCDC - set rLCDC_SPRITE_SIZE, [hl] ; 8x16 - call EnableLCD - ld hl, wSlots - ld bc, wSlotsEnd - wSlots - xor a - call ByteFill - call Slots_InitReelTiles - call Slots_GetPals - ld a, $7 - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], $40 - xor a ; SLOTS_INIT - ld [wJumptableIndex], a - ld a, SLOTS_NO_BIAS - ld [wSlotBias], a - ld de, MUSIC_GAME_CORNER - call PlayMusic - xor a - ld [wKeepSevenBiasChance], a ; 87.5% chance - call Random - and %00101010 - ret nz - ld a, 1 - ld [wKeepSevenBiasChance], a ; 12.5% chance - ret - -Slots_GetPals: ; 9279b (24:679b) - ld a, %11100100 - call DmgToCgbBGPals - lb de, %11100100, %11100100 - ld a, [hCGB] - and a - jr nz, .cgb - lb de, %11000000, %11100100 -.cgb - call DmgToCgbObjPals - ret - -SlotsLoop: ; 927af (24:67af) - ld a, [wJumptableIndex] - bit SLOTS_END_LOOP_F, a - jr nz, .stop - call SlotsJumptable - call Slots_SpinReels - xor a - ld [wCurrSpriteOAMAddr], a - callfar DoNextFrameForFirst16Sprites - call .PrintCoinsAndPayout - call .Stubbed_Function927d3 - call DelayFrame - and a - ret - -.stop - scf - ret - -.Stubbed_Function927d3: ; 927d3 (24:67d3) -; dummied out - ret - ld a, [wReel1ReelAction] - and a - ret nz - ld a, [wReel2ReelAction] - and a - ret nz - ld a, [wFirstTwoReelsMatchingSevens] - and a - jr nz, .matching_sevens - ld a, %11100100 - call DmgToCgbBGPals - ret - -.matching_sevens - ld a, [wTextDelayFrames] - and $7 - ret nz - ld a, [rBGP] - xor %00001100 - call DmgToCgbBGPals - ret - -; 927f8 - -.PrintCoinsAndPayout: ; 927f8 (24:67f8) - hlcoord 5, 1 - ld de, wCoins - lb bc, PRINTNUM_LEADINGZEROS | 2, 4 - call PrintNum - hlcoord 11, 1 - ld de, wPayout - lb bc, PRINTNUM_LEADINGZEROS | 2, 4 - call PrintNum - ret - -; 92811 (24:6811) - -Unreferenced_Function92811: ; 92811 -; debug function? - ld a, [wSlotBias] - add 0 - daa - ld e, a - and $f - add "0" - hlcoord 1, 0 - ld [hl], a - ld a, e - swap a - and $f - add "0" - hlcoord 0, 0 - ld [hl], a - ret - -; 9282c - -Unreferenced_Function9282c: ; 9282c -; animate OAM tiles? - ld hl, wcf66 - ld a, [hl] - inc [hl] - and $7 - ret nz - ld hl, wVirtualOAMSprite16TileID - ld c, NUM_SPRITE_OAM_STRUCTS - 16 -.loop - ld a, [hl] - xor %00100000 - ld [hli], a ; tile id -rept SPRITEOAMSTRUCT_LENGTH + -1 - inc hl -endr - dec c - jr nz, .loop - ret - -; 92844 - -SlotsJumptable: ; 92844 (24:6844) - jumptable .Jumptable, wJumptableIndex - -.Jumptable: - dw SlotsAction_Init ; 00 - dw SlotsAction_BetAndStart ; 01 - dw SlotsAction_WaitStart ; 02 - dw SlotsAction_WaitReel1 ; 03 - dw SlotsAction_WaitStopReel1 ; 04 - dw SlotsAction_WaitReel2 ; 05 - dw SlotsAction_WaitStopReel2 ; 06 - dw SlotsAction_WaitReel3 ; 07 - dw SlotsAction_WaitStopReel3 ; 08 - dw SlotsAction_Next ; 09 - dw SlotsAction_Next ; 0a - dw SlotsAction_Next ; 0b - dw SlotsAction_FlashIfWin ; 0c - dw SlotsAction_FlashScreen ; 0d - dw SlotsAction_GiveEarnedCoins ; 0e - dw SlotsAction_PayoutTextAndAnim ; 0f - dw SlotsAction_PayoutAnim ; 10 - dw SlotsAction_RestartOrQuit ; 11 - dw SlotsAction_Quit ; 12 - -SlotsAction_Next: ; 92879 (24:6879) - ld hl, wJumptableIndex - inc [hl] - ret - -SlotsAction_Init: ; 9287e (24:687e) - call SlotsAction_Next - xor a - ld [wFirstTwoReelsMatching], a - ld [wFirstTwoReelsMatchingSevens], a - ld a, SLOTS_NO_MATCH - ld [wSlotMatched], a - ret - -SlotsAction_BetAndStart: ; 9288e (24:688e) - call Slots_AskBet - jr nc, .proceed - ld a, SLOTS_QUIT - ld [wJumptableIndex], a - ret - -.proceed - call SlotsAction_Next - call Slots_IlluminateBetLights - call Slots_InitBias - ld a, 32 - ld [wSlotsDelay], a - ld a, REEL_ACTION_NORMAL_RATE - ld [wReel1ReelAction], a - ld [wReel2ReelAction], a - ld [wReel3ReelAction], a - ld a, 4 - ld [wReel1ManipCounter], a - ld [wReel2ManipCounter], a - ld [wReel3ManipCounter], a - call WaitSFX - ld a, SFX_SLOT_MACHINE_START - call Slots_PlaySFX - ret - -SlotsAction_WaitStart: ; 928c6 (24:68c6) - ld hl, wSlotsDelay - ld a, [hl] - and a - jr z, .proceed - dec [hl] - ret - -.proceed - call SlotsAction_Next - xor a - ld [hJoypadSum], a - ret - -SlotsAction_WaitReel1: ; 928d6 (24:68d6) - ld hl, hJoypadSum - ld a, [hl] - and A_BUTTON - ret z - call SlotsAction_Next - call Slots_StopReel1 - ld [wReel1ReelAction], a -SlotsAction_WaitStopReel1: ; 928e6 (24:68e6) - ld a, [wReel1ReelAction] - cp REEL_ACTION_DO_NOTHING - ret nz - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - ld bc, wReel1 - ld de, wReel1Stopped - call Slots_LoadReelState - call SlotsAction_Next - xor a - ld [hJoypadSum], a -SlotsAction_WaitReel2: ; 92900 (24:6900) - ld hl, hJoypadSum - ld a, [hl] - and A_BUTTON - ret z - call SlotsAction_Next - call Slots_StopReel2 - ld [wReel2ReelAction], a -SlotsAction_WaitStopReel2: ; 92910 (24:6910) - ld a, [wReel2ReelAction] - cp REEL_ACTION_DO_NOTHING - ret nz - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - ld bc, wReel2 - ld de, wReel2Stopped - call Slots_LoadReelState - call SlotsAction_Next - xor a - ld [hJoypadSum], a -SlotsAction_WaitReel3: ; 9292a (24:692a) - ld hl, hJoypadSum - ld a, [hl] - and A_BUTTON - ret z - call SlotsAction_Next - call Slots_StopReel3 - ld [wReel3ReelAction], a -SlotsAction_WaitStopReel3: ; 9293a (24:693a) - ld a, [wReel3ReelAction] - cp REEL_ACTION_DO_NOTHING - ret nz - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - ld bc, wReel3 - ld de, wReel3Stopped - call Slots_LoadReelState - call SlotsAction_Next - xor a - ld [hJoypadSum], a - ret - -SlotsAction_FlashIfWin: ; 92955 (24:6955) - ld a, [wSlotMatched] - cp SLOTS_NO_MATCH - jr nz, .GotIt - call SlotsAction_Next - call SlotsAction_Next - ret - -.GotIt: - call SlotsAction_Next - ld a, 16 - ld [wSlotsDelay], a -SlotsAction_FlashScreen: ; 9296b (24:696b) - ld hl, wSlotsDelay - ld a, [hl] - and a - jr z, .done - dec [hl] - srl a - ret z - - ld a, [rOBP0] - xor $ff - ld e, a - ld d, a - call DmgToCgbObjPals - ret - -.done - call Slots_GetPals - call SlotsAction_Next - ret - -SlotsAction_GiveEarnedCoins: ; 92987 (24:6987) - xor a - ld [wFirstTwoReelsMatching], a - ld [wFirstTwoReelsMatchingSevens], a - ld a, %11100100 - call DmgToCgbBGPals - call Slots_GetPayout - xor a - ld [wSlotsDelay], a - call SlotsAction_Next - ret - -SlotsAction_PayoutTextAndAnim: ; 9299e (24:699e) - call Slots_PayoutText - call SlotsAction_Next -SlotsAction_PayoutAnim: ; 929a4 (24:69a4) - ld hl, wSlotsDelay - ld a, [hl] - inc [hl] - and $1 - ret z - ld hl, wPayout - ld a, [hli] - ld d, a - or [hl] - jr z, .done - ld e, [hl] - dec de - ld [hl], e - dec hl - ld [hl], d - ld hl, wCoins - ld d, [hl] - inc hl - ld e, [hl] - call Slots_CheckCoinCaseFull - jr c, .okay - inc de -.okay - ld [hl], e - dec hl - ld [hl], d - ld a, [wSlotsDelay] - and $7 - ret z ; ret nz would be more appropriate - ld de, SFX_GET_COIN_FROM_SLOTS - call PlaySFX - ret - -.done - call SlotsAction_Next - ret - -SlotsAction_RestartOrQuit: ; 929d9 (24:69d9) - call Slots_DeilluminateBetLights - call WaitPressAorB_BlinkCursor - call Slots_AskPlayAgain - jr c, .exit_slots - ld a, SLOTS_INIT - ld [wJumptableIndex], a - ret - -.exit_slots - ld a, SLOTS_QUIT - ld [wJumptableIndex], a - ret - -SlotsAction_Quit: ; 929f0 (24:69f0) - ld hl, wJumptableIndex - set SLOTS_END_LOOP_F, [hl] - ret - -Slots_LoadReelState: ; 929f6 (24:69f6) - push de - call Slots_GetCurrentReelState - pop de - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - ret - -Slots_CheckCoinCaseFull: ; 92a04 (24:6a04) - ld a, d - cp HIGH(MAX_COINS) - jr c, .not_full - ld a, e - cp LOW(MAX_COINS) - jr c, .not_full - scf - ret - -.not_full - and a - ret - -Slots_GetCurrentReelState: ; 92a12 (24:6a12) - ld hl, REEL_POSITION - add hl, bc - ld a, [hl] - and a - jr nz, .okay - ld a, $f -.okay - dec a - and $f - ld e, a - ld d, $0 - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - add hl, de - ret - -Slots_StopReel1: ; 92a2b (24:6a2b) -; Always set the REEL_ACTION_STOP_REEL1 action. - ld a, REEL_ACTION_STOP_REEL1 - ret - -Slots_StopReel2: ; 92a2e (24:6a2e) -; As long as, the following three meet, there's a 31.25% chance -; to set action REEL_ACTION_SET_UP_REEL2_SKIP_TO_7: -; - Bet is >= 2 coins -; - There's a 7 symbol visible in reel #1 -; - Current spin isn't biased or is biased towards SEVEN -; In any other case, REEL_ACTION_STOP_REEL2 is set. - - ld a, [wSlotBet] - cp $2 - jr c, .dont_jump - ld a, [wSlotBias] - and a - jr z, .skip - cp SLOTS_NO_BIAS - jr nz, .dont_jump -.skip - call .CheckReel1ForASeven - jr nz, .dont_jump - call Random - cp $50 ; 32% - jr nc, .dont_jump - ld a, REEL_ACTION_SET_UP_REEL2_SKIP_TO_7 - ret - -.dont_jump - ld a, REEL_ACTION_STOP_REEL2 - ret - -.CheckReel1ForASeven: ; 92a51 (24:6a51) - ld a, [wReel1Stopped] - and a - ret z - ld a, [wReel1Stopped + 1] - and a - ret z - ld a, [wReel1Stopped + 2] - and a - ret - -Slots_StopReel3: ; 92a60 (24:6a60) -; If no matching SEVEN symbols in reels #1 and #2: -; - REEL_ACTION_STOP_REEL3, 100% - -; If matching SEVEN symbols and NO bias to SEVEN: -; - REEL_ACTION_STOP_REEL3, 37.5% -; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 31.3% -; - REEL_ACTION_INIT_GOLEM, 31.3% -; - REEL_ACTION_INIT_CHANSEY, 0% - -; If matching SEVEN symbols and bias to SEVEN: -; - REEL_ACTION_STOP_REEL3, 29.7% -; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 23.4% -; - REEL_ACTION_INIT_GOLEM, 23.4% -; - REEL_ACTION_INIT_CHANSEY, 23.4% - - ld a, [wFirstTwoReelsMatching] - and a - jr z, .stop - ld a, [wFirstTwoReelsMatchingSevens] - and a - jr z, .stop - ld a, [wSlotBias] - and a - jr nz, .biased - call Random - cp 180 - jr nc, .stop - cp 120 - jr nc, .slow_advance - cp 60 - jr nc, .golem - ld a, REEL_ACTION_INIT_CHANSEY - ret - -.biased - call Random - cp 160 - jr nc, .stop - cp 80 - jr nc, .slow_advance -.golem - ld a, REEL_ACTION_INIT_GOLEM - ret - -.slow_advance - ld a, REEL_ACTION_START_SLOW_ADVANCE_REEL3 - ret - -.stop - ld a, REEL_ACTION_STOP_REEL3 - ret - -Slots_InitReelTiles: ; 92a98 (24:6a98) - ld bc, wReel1 - ld hl, REEL_OAM_ADDR - add hl, bc - ld de, wVirtualOAMSprite16 - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld de, Reel1Tilemap - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_X_COORD - add hl, bc - ld [hl], 6 * 8 - call .OAM - - ld bc, wReel2 - ld hl, REEL_OAM_ADDR - add hl, bc - ld de, wVirtualOAMSprite24 - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld de, Reel2Tilemap - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_X_COORD - add hl, bc - ld [hl], 10 * 8 - call .OAM - - ld bc, wReel3 - ld hl, REEL_OAM_ADDR - add hl, bc - ld de, wVirtualOAMSprite32 - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld de, Reel3Tilemap - ld [hl], e - inc hl - ld [hl], d - ld hl, REEL_X_COORD - add hl, bc - ld [hl], 14 * 8 - call .OAM - ret - -.OAM: ; 92af9 (24:6af9) - ld hl, REEL_ACTION - add hl, bc - ld [hl], REEL_ACTION_DO_NOTHING - ld hl, REEL_POSITION - add hl, bc - ld [hl], REEL_SIZE - 1 - ld hl, REEL_SPIN_DISTANCE - add hl, bc - ld [hl], REEL_ACTION_DO_NOTHING - call Slots_UpdateReelPositionAndOAM - ret - -Slots_SpinReels: ; 92b0f (24:6b0f) - ld bc, wReel1 - call .SpinReel - ld bc, wReel2 - call .SpinReel - ld bc, wReel3 - call .SpinReel - ret - -.SpinReel: ; 92b22 (24:6b22) - ld hl, REEL_SPIN_DISTANCE - add hl, bc - ld a, [hl] - and $f - jr nz, .skip - call ReelActionJumptable -.skip - ld hl, REEL_SPIN_RATE - add hl, bc - ld a, [hl] - and a - ret z - ld d, a - ld hl, REEL_SPIN_DISTANCE - add hl, bc - add [hl] - ld [hl], a - and $f - jr z, Slots_UpdateReelPositionAndOAM - ld hl, REEL_OAM_ADDR - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld e, $8 -.loop - ld a, [hl] - add d - ld [hli], a - inc hl - inc hl - inc hl - dec e - jr nz, .loop - ret - -Slots_UpdateReelPositionAndOAM: ; 92b53 (24:6b53) - ld hl, REEL_X_COORD - add hl, bc - ld a, [hl] - ld [wCurrReelXCoord], a - ld a, 10 * 8 - ld [wCurrReelYCoord], a - ld hl, REEL_POSITION - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, REEL_TILEMAP_ADDR - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - add hl, de - ld e, l - ld d, h - call .LoadOAM - ld hl, REEL_POSITION - add hl, bc - ld a, [hl] - inc a - and $f - cp REEL_SIZE - jr nz, .load - xor a -.load - ld [hl], a - ret - -.LoadOAM: ; 92b83 (24:6b83) - ld hl, REEL_OAM_ADDR - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a -.loop - ld a, [wCurrReelYCoord] - ld [hli], a ; y - ld a, [wCurrReelXCoord] - ld [hli], a ; x - ld a, [de] - ld [hli], a ; tile id - srl a - srl a - set OAM_PRIORITY, a - ld [hli], a ; attributes - - ld a, [wCurrReelYCoord] - ld [hli], a ; y - ld a, [wCurrReelXCoord] - add 1 * TILE_WIDTH - ld [hli], a ; x - ld a, [de] - inc a - inc a - ld [hli], a ; tile id - srl a - srl a - set OAM_PRIORITY, a - ld [hli], a ; attributes - inc de - ld a, [wCurrReelYCoord] - sub 2 * TILE_WIDTH - ld [wCurrReelYCoord], a - cp 2 * TILE_WIDTH - jr nz, .loop - ret - -; 92bbe (24:6bbe) - -Unreferenced_Function92bbe: ; 92bbe - push hl - srl a - srl a - add LOW(.Unknown_92bce) - ld l, a - ld a, 0 - adc HIGH(.Unknown_92bce) - ld h, a - ld a, [hl] - pop hl - ret - -; 92bce - -.Unknown_92bce: ; 92bce - db 0, 1, 2, 3, 4, 5 -; 92bd4 - -ReelActionJumptable: ; 92bd4 (24:6bd4) - ld hl, REEL_ACTION - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -; 92be4 (24:6be4) - -.Jumptable: ; 92be4 - dw ReelAction_DoNothing ; 00 - dw ReelAction_StopReelIgnoreJoypad ; 01 - dw ReelAction_QuadrupleRate ; 02 - dw ReelAction_DoubleRate ; 03 - dw ReelAction_NormalRate ; 04 - dw ReelAction_HalfRate ; 05 - dw ReelAction_QuarterRate ; 06 - dw ReelAction_StopReel1 ; 07 - dw ReelAction_StopReel2 ; 08 - dw ReelAction_StopReel3 ; 09 - dw ReelAction_SetUpReel2SkipTo7 ; 0a - dw ReelAction_WaitReel2SkipTo7 ; 0b - dw ReelAction_FastSpinReel2UntilLinedUp7s ; 0c - dw ReelAction_Unused ; 0d - dw ReelAction_CheckDropReel ; 0e - dw ReelAction_WaitDropReel ; 0f - dw ReelAction_StartSlowAdvanceReel3 ; 10 - dw ReelAction_WaitSlowAdvanceReel3 ; 11 - dw ReelAction_InitGolem ; 12 - dw ReelAction_WaitGolem ; 13 - dw ReelAction_EndGolem ; 14 - dw ReelAction_InitChansey ; 15 - dw ReelAction_WaitChansey ; 16 - dw ReelAction_WaitEgg ; 17 - dw ReelAction_DropReel ; 18 -; 92c16 - -ReelAction_DoNothing: ; 92c16 - ret - -; 92c17 - -ReelAction_QuadrupleRate: ; 92c17 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 16 - ret - -; 92c1e - -ReelAction_DoubleRate: ; 92c1e - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 8 - ret - -; 92c25 - -ReelAction_NormalRate: ; 92c25 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 4 - ret - -; 92c2c - -ReelAction_HalfRate: ; 92c2c - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 2 - ret - -; 92c33 - -ReelAction_QuarterRate: ; 92c33 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 1 - ret - -; 92c3a - -Slots_StopReel: ; 92c3a - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - ld hl, REEL_ACTION - add hl, bc - ld [hl], REEL_ACTION_STOP_REEL_IGNORE_JOYPAD - ld hl, REEL_STOP_DELAY - add hl, bc - ld [hl], 3 -ReelAction_StopReelIgnoreJoypad: ; 92c4c - ld hl, REEL_STOP_DELAY - add hl, bc - ld a, [hl] - and a - jr z, .EndReel - dec [hl] - ret - -.EndReel: - ld hl, REEL_ACTION - add hl, bc - ld a, REEL_ACTION_DO_NOTHING - ld [hl], a - ret - -; 92c5e - -ReelAction_StopReel1: ; 92c5e -; If no bias: don't manipulate reel. -; If bias: manipulate reel up to wReel1ManipCounter (i.e. 4) slots, -; stoping early if the biased symbol shows up anywhere in reel #1, -; even if the current bet won't allow lining it up. - - ld a, [wSlotBias] - cp SLOTS_NO_BIAS - jr z, .NoBias - ld hl, REEL_MANIP_COUNTER - add hl, bc - ld a, [hl] - and a - jr z, .NoBias - dec [hl] - call .CheckForBias - ret nz -.NoBias: - call Slots_StopReel - ret - -; 92c76 - -.CheckForBias: ; 92c76 - call Slots_GetCurrentReelState - ld a, [wSlotBias] - ld e, a - ld a, [hli] - cp e - ret z - ld a, [hli] - cp e - ret z - ld a, [hl] - cp e - ret - -; 92c86 - -ReelAction_StopReel2: ; 92c86 -; If no bias: don't manipulate reel. -; If bias: manipulate reel up to wReel2ManipCounter (i.e. 4) slots, -; stoping early if the biased symbol is lined up in the first two -; reels, according to the lines that the current bet allows. - - call Slots_CheckMatchedFirstTwoReels - jr nc, .nope - ld a, [wSlotBuildingMatch] - ld hl, wSlotBias - cp [hl] - jr z, .NoBias -.nope - ld a, [wSlotBias] - cp SLOTS_NO_BIAS - jr z, .NoBias - ld hl, REEL_MANIP_COUNTER - add hl, bc - ld a, [hl] - and a - jr z, .NoBias - dec [hl] - ret - -.NoBias: - call Slots_StopReel - ret - -; 92ca9 - -ReelAction_StopReel3: ; 92ca9 -; Manipulate the reel up to wReel3ManipCounter (i.e. 4) slots, -; stopping early if the bias symbol is lined up for a win. -; If not biased to any symbols, stop as soon as nothing is lined up. - - call Slots_CheckMatchedAllThreeReels - jr nc, .NoMatch - ld hl, wSlotBias - cp [hl] - jr z, .NoBias - ld hl, REEL_MANIP_COUNTER - add hl, bc - ld a, [hl] - and a - ret z - dec [hl] - ret - -.NoMatch: - ld a, [wSlotBias] - cp SLOTS_NO_BIAS - jr z, .NoBias - ld hl, REEL_MANIP_COUNTER - add hl, bc - ld a, [hl] - and a - jr z, .NoBias - dec [hl] - ret - -.NoBias: - call Slots_StopReel - ret - -; 92cd2 - -ReelAction_SetUpReel2SkipTo7: ; 92cd2 -; Unique reel 2 action (see Slots_StopReel2) -; Ensures that 7 symbols become lined up in the first two reels, -; but more often than not, this is only a way to get our hopes up, as -; it makes exciting reel #3 modes with no success hope more common. - - call Slots_CheckMatchedFirstTwoReels - jr nc, .no_match - ld a, [wFirstTwoReelsMatchingSevens] - and a - jr z, .no_match - call Slots_StopReel - ret - -.no_match - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_REEL2_SKIP_TO_7 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld [hl], 32 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - ret - -; 92cf8 - -ReelAction_WaitReel2SkipTo7: ; 92cf8 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld a, [hl] - and a - jr z, .asm_92d02 - dec [hl] - ret - -.asm_92d02 - ld a, SFX_THROW_BALL - call Slots_PlaySFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 8 - ret - -; 92d13 - -ReelAction_FastSpinReel2UntilLinedUp7s: ; 92d13 - call Slots_CheckMatchedFirstTwoReels - ret nc - ld a, [wFirstTwoReelsMatchingSevens] - and a - ret z - call Slots_StopReel - ret - -; 92d20 - -ReelAction_InitGolem: ; 92d20 -; Ensures SEVENs are lined up if there's bias to SEVEN. -; Ensures nothing is lined up if there's no bias symbols. -; No other bias symbols are compatible with this mode. - -; This is achieved by throwing Golem until the desired result -; is produced. The amount of Golem thrown can be anywhere from -; 1 to 14 for SEVEN bias, and 4-8 for no bias. - - call Slots_CheckMatchedAllThreeReels - ret c - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - call Slots_WaitSFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_GOLEM - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - call Slots_GetNumberOfGolems - push bc - push af - depixel 12, 13 - ld a, SPRITE_ANIM_INDEX_SLOTS_GOLEM - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - pop af - ld [hl], a - pop bc - xor a - ld [wSlotsDelay], a -ReelAction_WaitGolem: ; 92d4f - ld a, [wSlotsDelay] - cp 2 - jr z, .two - cp 1 - jr z, .one - ret - -.two - call Slots_CheckMatchedAllThreeReels - call Slots_StopReel - ret - -.one - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_END_GOLEM - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 8 - ret - -; 92d6e - -ReelAction_EndGolem: ; 92d6e - xor a - ld [wSlotsDelay], a - ld hl, REEL_ACTION - add hl, bc - dec [hl] ; REEL_ACTION_WAIT_GOLEM - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - ret - -; 92d7e - -ReelAction_InitChansey: ; 92d7e -; Ensures the lining up of SEVEN symbols, but this mode is only possible -; when there is bias to SEVEN symbols (and even then, it's still rare). -; Chansey releases and egg and reel #3 is made to advance 17 slots very -; quickly as many times as necessary for the match to SEVENs to show up. - - call Slots_CheckMatchedAllThreeReels - ret c - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - call Slots_WaitSFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_CHANSEY - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - push bc - depixel 12, 0 - ld a, SPRITE_ANIM_INDEX_SLOTS_CHANSEY - call _InitSpriteAnimStruct - pop bc - xor a - ld [wSlotsDelay], a - ret - -; 92da4 - -ReelAction_WaitChansey: ; 92da4 - ld a, [wSlotsDelay] - and a - ret z - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_EGG - ld a, 2 - ld [wSlotsDelay], a -ReelAction_WaitEgg: ; 92db3 - ld a, [wSlotsDelay] - cp $4 - ret c - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_DROP_REEL - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 16 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld [hl], 17 -ReelAction_DropReel: ; 92dca - ld hl, REEL_MANIP_DELAY - add hl, bc - ld a, [hl] - and a - jr z, .check_match - dec [hl] - ret - -.check_match - call Slots_CheckMatchedAllThreeReels - jr nc, .EggAgain - and a - jr nz, .EggAgain - ld a, 5 - ld [wSlotsDelay], a - call Slots_StopReel - ret - -.EggAgain: - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 - ld hl, REEL_ACTION - add hl, bc - dec [hl] - dec [hl] ; REEL_ACTION_WAIT_CHANSEY - ld a, 1 - ld [wSlotsDelay], a - ret - -; 92df7 - -ReelAction_Unused: ; 92df7 - call Slots_CheckMatchedAllThreeReels - ret c - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - call Slots_WaitSFX - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_CHECK_DROP_REEL - call Slots_GetNumberOfGolems - ld hl, REEL_MANIP_DELAY - add hl, bc - ld [hl], a -ReelAction_CheckDropReel: ; 92e10 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld a, [hl] - and a - jr nz, .spin - call Slots_CheckMatchedAllThreeReels - call Slots_StopReel - ret - -.spin - dec [hl] - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_DROP_REEL - ld hl, REEL_FIELD_0B - add hl, bc - ld [hl], 32 - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 0 -ReelAction_WaitDropReel: ; 92e31 - ld hl, REEL_FIELD_0B - add hl, bc - ld a, [hl] - and a - jr z, .DropReel - dec [hl] - ret - -.DropReel: - ld hl, REEL_ACTION - add hl, bc - dec [hl] - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 8 - ret - -; 92e47 - -ReelAction_StartSlowAdvanceReel3: ; 92e47 -; Ensures SEVENs are lined up if there's bias to SEVEN. -; Ensures nothing is lined up if there's no bias symbols. -; No other bias symbols are compatible with this mode. - -; This is achieved by slowly advancing the reel a full round, -; plus any necessary slot until the desired result is produced. - - call Slots_CheckMatchedAllThreeReels - ret c - ld a, SFX_STOP_SLOT - call Slots_PlaySFX - call Slots_WaitSFX - ld hl, REEL_SPIN_RATE - add hl, bc - ld [hl], 1 - ld hl, REEL_ACTION - add hl, bc - inc [hl] ; REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld [hl], 16 -ReelAction_WaitSlowAdvanceReel3: ; 92e64 - ld hl, REEL_MANIP_DELAY - add hl, bc - ld a, [hl] - and a - jr z, .check1 - dec [hl] -.play_sfx - ld a, SFX_GOT_SAFARI_BALLS - call Slots_PlaySFX - ret - -.check1 - ld a, [wSlotBias] - and a - jr nz, .check2 - call Slots_CheckMatchedAllThreeReels - jr nc, .play_sfx - and a - jr nz, .play_sfx - call Slots_StopReel - call WaitSFX - ret - -.check2 - call Slots_CheckMatchedAllThreeReels - jr c, .play_sfx - call Slots_StopReel - call WaitSFX - ret - -; 92e94 - -Slots_CheckMatchedFirstTwoReels: ; 92e94 - xor a - ld [wFirstTwoReelsMatching], a - ld [wFirstTwoReelsMatchingSevens], a - call Slots_GetCurrentReelState - call Slots_CopyReelState - ld a, [wSlotBet] - and 3 - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .return - push de - jp hl - -.return - ld a, [wFirstTwoReelsMatching] - and a - ret z - scf - ret - -; 92ebd - -.Jumptable: ; 92ebd - dw .zero - dw .one - dw .two - dw .three -; 92ec5 - -.three ; 92ec5 - call .CheckUpwardsDiag - call .CheckDownwardsDiag - -.two ; 92ecb - call .CheckBottomRow - call .CheckTopRow - -.one ; 92ed1 - call .CheckMiddleRow - -.zero ; 92ed4 - ret - -; 92ed5 - -.CheckBottomRow: ; 92ed5 - ld hl, wCurrReelStopped - ld a, [wReel1Stopped] - cp [hl] - call z, .StoreResult - ret - -; 92ee0 - -.CheckUpwardsDiag: ; 92ee0 - ld hl, wCurrReelStopped + 1 - ld a, [wReel1Stopped] - cp [hl] - call z, .StoreResult - ret - -; 92eeb - -.CheckMiddleRow: ; 92eeb - ld hl, wCurrReelStopped + 1 - ld a, [wReel1Stopped + 1] - cp [hl] - call z, .StoreResult - ret - -; 92ef6 - -.CheckDownwardsDiag: ; 92ef6 - ld hl, wCurrReelStopped + 1 - ld a, [wReel1Stopped + 2] - cp [hl] - call z, .StoreResult - ret - -; 92f01 - -.CheckTopRow: ; 92f01 - ld hl, wCurrReelStopped + 2 - ld a, [wReel1Stopped + 2] - cp [hl] - call z, .StoreResult - ret - -; 92f0c - -.StoreResult: ; 92f0c - ld [wSlotBuildingMatch], a - and a - jr nz, .matching_sevens - ld a, 1 - ld [wFirstTwoReelsMatchingSevens], a - -.matching_sevens - ld a, 1 - ld [wFirstTwoReelsMatching], a - ret - -; 92f1d - -Slots_CheckMatchedAllThreeReels: ; 92f1d - ld a, SLOTS_NO_MATCH - ld [wSlotMatched], a - call Slots_GetCurrentReelState - call Slots_CopyReelState - ld a, [wSlotBet] - and 3 - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .return - push de - jp hl - -.return - ld a, [wSlotMatched] - cp SLOTS_NO_MATCH - jr nz, .matched_nontrivial - and a - ret - -.matched_nontrivial - scf - ret - -; 92f48 - -.Jumptable: ; 92f48 - dw .zero - dw .one - dw .two - dw .three -; 92f50 - -.three ; 92f50 - call .CheckUpwardsDiag - call .CheckDownwardsDiag - -.two ; 92f56 - call .CheckBottomRow - call .CheckTopRow - -.one ; 92f5c - call .CheckMiddleRow - -.zero ; 92f5f - ret - -; 92f60 - -.CheckBottomRow: ; 92f60 - ld hl, wCurrReelStopped - ld a, [wReel1Stopped] - cp [hl] - ret nz - ld hl, wReel2Stopped - cp [hl] - call z, .StoreResult - ret - -; 92f70 - -.CheckUpwardsDiag: ; 92f70 - ld hl, wCurrReelStopped + 2 - ld a, [wReel1Stopped] - cp [hl] - ret nz - ld hl, wReel2Stopped + 1 - cp [hl] - call z, .StoreResult - ret - -; 92f80 - -.CheckMiddleRow: ; 92f80 - ld hl, wCurrReelStopped + 1 - ld a, [wReel1Stopped + 1] - cp [hl] - ret nz - ld hl, wReel2Stopped + 1 - cp [hl] - call z, .StoreResult - ret - -; 92f90 - -.CheckDownwardsDiag: ; 92f90 - ld hl, wCurrReelStopped - ld a, [wReel1Stopped + 2] - cp [hl] - ret nz - ld hl, wReel2Stopped + 1 - cp [hl] - call z, .StoreResult - ret - -; 92fa0 - -.CheckTopRow: ; 92fa0 - ld hl, wCurrReelStopped + 2 - ld a, [wReel1Stopped + 2] - cp [hl] - ret nz - ld hl, wReel2Stopped + 2 - cp [hl] - call z, .StoreResult - ret - -; 92fb0 - -.StoreResult: ; 92fb0 - ld [wSlotMatched], a - ret - -; 92fb4 - -Slots_CopyReelState: ; 92fb4 - ld de, wCurrReelStopped - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - ret - -; 92fc0 - -Slots_GetNumberOfGolems: ; 92fc0 - ld hl, REEL_POSITION - add hl, bc - ld a, [hl] - push af - push hl - call .Check7Bias - pop hl - pop af - ld [hl], a - ld a, e - ret - -; 92fcf - -.Check7Bias: ; 92fcf - ld a, [wSlotBias] - and a - jr nz, .not_biased_to_seven - ld e, $0 -.loop1 - ld hl, REEL_POSITION - add hl, bc - inc [hl] - inc e - push de - call Slots_CheckMatchedAllThreeReels - pop de - jr nc, .loop1 - and a - jr nz, .loop1 - ret - -.not_biased_to_seven - call Random - and $7 - cp $4 ; ((50 percent) & 7) + 1 - jr c, .not_biased_to_seven - ld e, a -.loop2 - ld a, e - inc e - ld hl, REEL_POSITION - add hl, bc - add [hl] - ld [hl], a - push de - call Slots_CheckMatchedAllThreeReels - pop de - jr c, .loop2 - ret - -; 93002 - -Slots_InitBias: ; 93002 (24:7002) - ld a, [wSlotBias] - and a - ret z - ld hl, .Normal - ld a, [wScriptVar] - and a - jr z, .okay - ld hl, .Lucky -.okay - call Random - ld c, a -.loop - ld a, [hli] - cp c - jr nc, .done - inc hl - jr .loop - -.done - ld a, [hl] - ld [wSlotBias], a - ret - -; 93023 (24:7023) - -.Normal: ; 93023 - db $01, SLOTS_SEVEN ; 1/256 - db $03, SLOTS_POKEBALL ; 1/128 - db $0a, SLOTS_STARYU ; 7/256 - db $14, SLOTS_SQUIRTLE ; 5/128 - db $28, SLOTS_PIKACHU ; 5/64 - db $30, SLOTS_CHERRY ; 1/32 - db $ff, SLOTS_NO_BIAS ; everything else -; 93031 - -.Lucky: ; 93031 - db $02, SLOTS_SEVEN ; 1/128 - db $03, SLOTS_POKEBALL ; 1/256 - db $08, SLOTS_STARYU ; 5/256 - db $10, SLOTS_SQUIRTLE ; 1/32 - db $1e, SLOTS_PIKACHU ; 7/128 - db $50, SLOTS_CHERRY ; 25/128 - db $ff, SLOTS_NO_BIAS ; everything else -; 9303f - -Slots_IlluminateBetLights: ; 9303f (24:703f) - ld b, $14 ; turned on - ld a, [wSlotBet] - dec a - jr z, Slots_Lights1OnOff - dec a - jr z, Slots_Lights2OnOff - jr Slots_Lights3OnOff - -Slots_DeilluminateBetLights: ; 9304c (24:704c) - ld b, $23 ; turned off -Slots_Lights3OnOff: ; 9304e (24:704e) - hlcoord 3, 2 - call Slots_TurnLightsOnOrOff - hlcoord 3, 10 - call Slots_TurnLightsOnOrOff -Slots_Lights2OnOff: ; 9305a (24:705a) - hlcoord 3, 4 - call Slots_TurnLightsOnOrOff - hlcoord 3, 8 - call Slots_TurnLightsOnOrOff -Slots_Lights1OnOff: ; 93066 (24:7066) - hlcoord 3, 6 - -Slots_TurnLightsOnOrOff: ; 93069 (24:7069) - ld a, b - ld [hl], a - ld de, SCREEN_WIDTH / 2 + 3 - add hl, de - ld [hl], a - ld de, SCREEN_WIDTH / 2 - 3 - add hl, de - inc a - ld [hl], a - ld de, SCREEN_WIDTH / 2 + 3 - add hl, de - ld [hl], a - ret - -Slots_AskBet: ; 9307c (24:707c) -.loop - ld hl, .Text_BetHowManyCoins - call PrintText - ld hl, .MenuHeader - call LoadMenuHeader - call VerticalMenu - call CloseWindow - ret c - ld a, [wMenuCursorY] - ld b, a - ld a, 4 - sub b - ld [wSlotBet], a - ld hl, wCoins - ld c, a - ld a, [hli] - and a - jr nz, .Start - ld a, [hl] - cp c - jr nc, .Start - ld hl, .Text_NotEnoughCoins - call PrintText - jr .loop - -.Start: - ld hl, wCoins + 1 - ld a, [hl] - sub c - ld [hld], a - jr nc, .ok - dec [hl] -.ok - call WaitSFX - ld de, SFX_PAY_DAY - call PlaySFX - ld hl, .Text_Start - call PrintText - and a - ret - -; 930c7 (24:70c7) - -.Text_BetHowManyCoins: ; 0x930c7 - ; Bet how many coins? - text_jump UnknownText_0x1c5049 - db "@" -; 0x930cc - -.Text_Start: ; 0x930cc - ; Start! - text_jump UnknownText_0x1c505e - db "@" -; 0x930d1 - -.Text_NotEnoughCoins: ; 0x930d1 - ; Not enough coins. - text_jump UnknownText_0x1c5066 - db "@" -; 0x930d6 - -.MenuHeader: ; 0x930d6 - db MENU_BACKUP_TILES ; flags - menu_coords 14, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default option -; 0x930de - -.MenuData: ; 0x930de - db STATICMENU_CURSOR ; flags - db 3 ; items - db " 3@" - db " 2@" - db " 1@" -; 0x930e9 - -Slots_AskPlayAgain: ; 930e9 (24:70e9) - ld hl, wCoins - ld a, [hli] - or [hl] - jr nz, .you_have_coins - ld hl, .Text_OutOfCoins - call PrintText - ld c, 60 - call DelayFrames - jr .exit_slots - -.you_have_coins - ld hl, .Text_PlayAgain - call PrintText - call LoadMenuTextBox - lb bc, 14, 12 - call PlaceYesNoBox - ld a, [wMenuCursorY] - dec a - call CloseWindow - and a - jr nz, .exit_slots - and a - ret - -.exit_slots - scf - ret - -; 9311a (24:711a) - -.Text_OutOfCoins: ; 9311a - text_jump UnknownText_0x1c5079 - db "@" - -.Text_PlayAgain: ; 9311f - text_jump UnknownText_0x1c5092 - db "@" - -Slots_GetPayout: ; 93124 (24:7124) - ld a, [wSlotMatched] - cp SLOTS_NO_MATCH - jr z, .no_win - srl a - ld e, a - ld d, 0 - ld hl, .PayoutTable - add hl, de - ld a, [hli] - ld [wPayout + 1], a - ld e, a - ld a, [hl] - ld [wPayout], a - ld d, a - farcall StubbedTrainerRankings_AddToSlotsPayouts - ret - -.PayoutTable: - dw 300 - dw 50 - dw 6 - dw 8 - dw 10 - dw 15 - -.no_win - ld hl, wPayout - xor a - ld [hli], a - ld [hl], a - ret - -Slots_PayoutText: ; 93158 (24:7158) - ld a, [wSlotMatched] - cp SLOTS_NO_MATCH - jr nz, .MatchedSomething - ld hl, .Text_Darn - call PrintText - farcall StubbedTrainerRankings_EndSlotsWinStreak - ret - -.MatchedSomething: - srl a - ld e, a - ld d, 0 - ld hl, .PayoutStrings - add hl, de - add hl, de - add hl, de - ld de, wStringBuffer2 - ld bc, 4 - call CopyBytes - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .return - push de - jp hl - -.return - ld hl, .Text_PrintPayout - call PrintText - farcall StubbedTrainerRankings_AddToSlotsWinStreak - ret - -; 93195 (24:7195) - -.PayoutStrings: ; 93195 - dbw "300@", .LinedUpSevens - dbw "50@@", .LinedUpPokeballs - dbw "6@@@", .LinedUpMonOrCherry - dbw "8@@@", .LinedUpMonOrCherry - dbw "10@@", .LinedUpMonOrCherry - dbw "15@@", .LinedUpMonOrCherry -; 931b9 - -.Text_PrintPayout: ; 0x931b9 - start_asm - ld a, [wSlotMatched] - add $25 - ldcoord_a 2, 13 - inc a - ldcoord_a 2, 14 - inc a - ldcoord_a 3, 13 - inc a - ldcoord_a 3, 14 - hlcoord 18, 17 - ld [hl], "▼" - ld hl, .Text_LinedUpWonCoins -rept 4 - inc bc -endr - ret - -; 931db - -.Text_LinedUpWonCoins: ; 0x931db - ; lined up! Won @ coins! - text_jump UnknownText_0x1c509f - db "@" -; 0x931e0 - -.Text_Darn: ; 0x931e0 - ; Darn! - text_jump UnknownText_0x1c50bb - db "@" -; 0x931e5 - -.LinedUpSevens: ; 931e5 - ld a, SFX_2ND_PLACE - call Slots_PlaySFX - call WaitSFX - -; Oddly, the rarest mode (wKeepSevenBiasChance = 1) is the one with -; the worse odds to favor seven symbol streaks (12.5% vs 25%). -; it's possible that either the wKeepSevenBiasChance initialization -; or this code was intended to lead to flipped percentages. - ld a, [wKeepSevenBiasChance] - and a - jr nz, .lower_seven_streak_odds - call Random - and %0010100 - ret z ; 25% chance to stick with seven symbol bias - ld a, SLOTS_NO_BIAS - ld [wSlotBias], a - ret - -.lower_seven_streak_odds - call Random - and %0011100 - ret z ; 12.5% chance to stick with seven symbol bias - ld a, SLOTS_NO_BIAS - ld [wSlotBias], a - ret - -; 9320b - -.LinedUpPokeballs: ; 9320b - ld a, SFX_3RD_PLACE - call Slots_PlaySFX - call WaitSFX - ret - -; 93214 - -.LinedUpMonOrCherry: ; 93214 - ld a, SFX_PRESENT - call Slots_PlaySFX - call WaitSFX - ret - -; 9321d - -Slots_AnimateGolem: ; 9321d (24:721d) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.Jumptable: ; 9322d (24:722d) - dw .init - dw .fall - dw .roll - -.init ; 93233 (24:7233) - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld a, [hl] - and a - jr nz, .retain - ld a, 2 - ld [wSlotsDelay], a - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -.retain - dec [hl] - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $30 - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], $0 - -.fall ; 93259 (24:7259) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $20 - jr c, .play_sound - dec [hl] - ld e, a - ld d, 14 * 8 - farcall BattleAnim_Sine_e - ld a, e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], a - ret - -.play_sound - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $2 - ld a, 1 - ld [wSlotsDelay], a - ld a, SFX_PLACE_PUZZLE_PIECE_DOWN - call Slots_PlaySFX - ret - -.roll ; 93289 (24:7289) - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld a, [hl] - inc [hl] - inc [hl] - cp 9 * 8 - jr nc, .restart - and $3 - ret nz - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - xor $ff - inc a - ld [hl], a - ld [hSCY], a - ret - -.restart - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - xor a - ld [hl], a - ld [hSCY], a - ret - -Slots_AnimateChansey: ; 932ac (24:72ac) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.Jumptable: ; 932bc (24:72bc) - dw .walk - dw .one - dw .two - -.walk ; 932c2 (24:72c2) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - inc [hl] - cp 13 * 8 - jr z, .limit - and $f - ret nz - ld de, SFX_JUMP_OVER_LEDGE - call PlaySFX - ret - -.limit - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld a, 1 - ld [wSlotsDelay], a - -.one ; 932e0 (24:72e0) - ld a, [wSlotsDelay] - cp $2 - jr z, .retain - cp $5 - ret nz - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -.retain - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $8 -.two ; 932fc (24:72fc) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .spawn_egg - dec [hl] - ret - -.spawn_egg - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - dec [hl] - push bc - depixel 12, 13, 0, 4 - ld a, SPRITE_ANIM_INDEX_SLOTS_EGG - call _InitSpriteAnimStruct - pop bc - ret - -; 93316 (24:7316) - -Slots_WaitSFX: ; 93316 - push bc - ld c, 16 - call DelayFrames - pop bc - ret - -; 9331e - -Slots_PlaySFX: ; 9331e (24:731e) - push de - ld e, a - ld d, 0 - call PlaySFX - pop de - ret - -; 93327 (24:7327) - -; The first three positions are repeated to -; avoid needing to check indices when copying. -Reel1Tilemap: ; 93327 - db SLOTS_SEVEN ; 0 - db SLOTS_CHERRY ; 1 - db SLOTS_STARYU ; 2 - db SLOTS_PIKACHU ; 3 - db SLOTS_SQUIRTLE ; 4 - db SLOTS_SEVEN ; 5 - db SLOTS_CHERRY ; 6 - db SLOTS_STARYU ; 7 - db SLOTS_PIKACHU ; 8 - db SLOTS_SQUIRTLE ; 9 - db SLOTS_POKEBALL ; 10 - db SLOTS_CHERRY ; 11 - db SLOTS_STARYU ; 12 - db SLOTS_PIKACHU ; 13 - db SLOTS_SQUIRTLE ; 14 - db SLOTS_SEVEN ; 0 - db SLOTS_CHERRY ; 1 - db SLOTS_STARYU ; 2 - -Reel2Tilemap: ; 93339 - db SLOTS_SEVEN ; 0 - db SLOTS_PIKACHU ; 1 - db SLOTS_CHERRY ; 2 - db SLOTS_SQUIRTLE ; 3 - db SLOTS_STARYU ; 4 - db SLOTS_POKEBALL ; 5 - db SLOTS_PIKACHU ; 6 - db SLOTS_CHERRY ; 7 - db SLOTS_SQUIRTLE ; 8 - db SLOTS_STARYU ; 9 - db SLOTS_POKEBALL ; 10 - db SLOTS_PIKACHU ; 11 - db SLOTS_CHERRY ; 12 - db SLOTS_SQUIRTLE ; 13 - db SLOTS_STARYU ; 14 - db SLOTS_SEVEN ; 0 - db SLOTS_PIKACHU ; 1 - db SLOTS_CHERRY ; 2 - -Reel3Tilemap: ; 9334b - db SLOTS_SEVEN ; 0 - db SLOTS_PIKACHU ; 1 - db SLOTS_CHERRY ; 2 - db SLOTS_SQUIRTLE ; 3 - db SLOTS_STARYU ; 4 - db SLOTS_PIKACHU ; 5 - db SLOTS_CHERRY ; 6 - db SLOTS_SQUIRTLE ; 7 - db SLOTS_STARYU ; 8 - db SLOTS_PIKACHU ; 9 - db SLOTS_POKEBALL ; 10 - db SLOTS_CHERRY ; 11 - db SLOTS_SQUIRTLE ; 12 - db SLOTS_STARYU ; 13 - db SLOTS_PIKACHU ; 14 - db SLOTS_SEVEN ; 0 - db SLOTS_PIKACHU ; 1 - db SLOTS_CHERRY ; 2 -; 9335d - -SlotsTilemap: ; 9335d -INCBIN "gfx/slots/slots.tilemap" -; 9344d - -Slots1LZ: ; 9344d -INCBIN "gfx/slots/slots_1.2bpp.lz" -; 935cd - -Slots2LZ: ; 935cd -INCBIN "gfx/slots/slots_2.2bpp.lz" -; 9382d - -Slots3LZ: ; 9382d -INCBIN "gfx/slots/slots_3.2bpp.lz" -; 93a3d diff --git a/engine/game/unown_puzzle.asm b/engine/game/unown_puzzle.asm deleted file mode 100755 index 83527ea69..000000000 --- a/engine/game/unown_puzzle.asm +++ /dev/null @@ -1,877 +0,0 @@ -PUZZLE_BORDER EQU $ee -PUZZLE_VOID EQU $ef - -puzcoord EQUS "* 6 +" - -_UnownPuzzle: ; e1190 - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - call ClearBGPalettes - call ClearTileMap - call ClearSprites - xor a - ld [hBGMapMode], a - call DisableLCD - ld hl, wMisc ; includes wPuzzlePieces - ld bc, wMiscEnd - wMisc - xor a - call ByteFill - ld hl, UnownPuzzleCursorGFX - ld de, vTiles1 tile $60 - ld bc, 4 tiles - call CopyBytes - ld hl, UnownPuzzleStartCancelLZ - ld de, vTiles1 tile $6d - call Decompress - call LoadUnownPuzzlePiecesGFX - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, PUZZLE_BORDER - call ByteFill - hlcoord 4, 3 - lb bc, 12, 12 - ld a, PUZZLE_VOID - call UnownPuzzle_FillBox - call InitUnownPuzzlePiecePositions - call UnownPuzzle_UpdateTilemap - call PlaceStartCancelBox - xor a - ld [hSCY], a - ld [hSCX], a - ld [rWY], a - ld [wJumptableIndex], a - ld [wHoldingUnownPuzzlePiece], a - ld [wUnownPuzzleCursorPosition], a - ld [wUnownPuzzleHeldPiece], a - ld a, %10010011 - ld [rLCDC], a - call WaitBGMap - ld b, SCGB_UNOWN_PUZZLE - call GetSGBLayout - ld a, $e4 - call DmgToCgbBGPals - ld a, $24 - call DmgToCgbObjPal0 - xor a - ld [wSolvedUnownPuzzle], a - call DelayFrame -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .quit - call UnownPuzzleJumptable - ld a, [wHoldingUnownPuzzlePiece] - and a - jr nz, .holding_piece - ld a, [hVBlankCounter] - and $10 - jr z, .clear -.holding_piece - call RedrawUnownPuzzlePieces - jr .next - -.clear - call ClearSprites -.next - call DelayFrame - jr .loop - -.quit - pop af - ld [hInMenu], a - call ClearBGPalettes - call ClearTileMap - call ClearSprites - ld a, LCDC_DEFAULT - ld [rLCDC], a - ret -; e124e - -InitUnownPuzzlePiecePositions: ; e124e - ld c, 1 - ld b, 16 -.load_loop - call Random - and $f - ld hl, .PuzzlePieceInitialPositions - ld e, a - ld d, $0 - add hl, de - ld e, [hl] - ld hl, wPuzzlePieces - add hl, de - ld a, [hl] - and a - jr nz, .load_loop - ld [hl], c - inc c - dec b - jr nz, .load_loop - ret -; e126d - -.PuzzlePieceInitialPositions: ; e126d -initpuzcoord: MACRO -rept _NARG / 2 - db \1 puzcoord \2 - shift - shift -endr -ENDM - initpuzcoord 0,0, 0,1, 0,2, 0,3, 0,4, 0,5 - initpuzcoord 1,0, 1,5 - initpuzcoord 2,0, 2,5 - initpuzcoord 3,0, 3,5 - initpuzcoord 4,0, 4,5 - initpuzcoord 5,0, 5,5 - ; START > CANCEL -; e127d - -PlaceStartCancelBox: ; e127d - call PlaceStartCancelBoxBorder - hlcoord 5, 16 - ld a, $f6 - ld c, 10 -.loop - ld [hli], a - inc a - dec c - jr nz, .loop - ret -; e128d - -PlaceStartCancelBoxBorder: ; e128d - hlcoord 4, 15 - ld a, $f0 - ld [hli], a - ld bc, 10 - ld a, $f1 - call ByteFill - hlcoord 15, 15 - ld a, $f2 - ld [hli], a - hlcoord 4, 16 - ld a, $f3 - ld [hli], a - ld bc, 10 - ld a, PUZZLE_VOID - call ByteFill - hlcoord 15, 16 - ld a, $f3 - ld [hli], a - hlcoord 4, 17 - ld a, $f4 - ld [hli], a - ld bc, 10 - ld a, $f1 - call ByteFill - hlcoord 15, 17 - ld a, $f5 - ld [hl], a - ret -; e12ca - -UnownPuzzleJumptable: ; e12ca - 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 -; e12d9 - -.Jumptable: ; e12d9 - dw .Function -; e12db - -.Function: ; e12db - ld a, [hJoyPressed] - and START - jp nz, UnownPuzzle_Quit - ld a, [hJoyPressed] - and A_BUTTON - jp nz, UnownPuzzle_A - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .d_up - ld a, [hl] - and D_DOWN - jr nz, .d_down - ld a, [hl] - and D_LEFT - jr nz, .d_left - ld a, [hl] - and D_RIGHT - jr nz, .d_right - ret - -.d_up - ld hl, wUnownPuzzleCursorPosition - ld a, [hl] - cp 1 puzcoord 0 - ret c - sub 6 - ld [hl], a - jr .done_joypad - -.d_down - ld hl, wUnownPuzzleCursorPosition - ld a, [hl] - cp 4 puzcoord 1 - ret z - cp 4 puzcoord 2 - ret z - cp 4 puzcoord 3 - ret z - cp 4 puzcoord 4 - ret z - cp 5 puzcoord 0 - ret nc - add 6 - ld [hl], a - jr .done_joypad - -.d_left - ld hl, wUnownPuzzleCursorPosition - ld a, [hl] - and a - ret z - cp 1 puzcoord 0 - ret z - cp 2 puzcoord 0 - ret z - cp 3 puzcoord 0 - ret z - cp 4 puzcoord 0 - ret z - cp 5 puzcoord 0 - ret z - cp 5 puzcoord 5 - jr z, .left_overflow - dec [hl] - jr .done_joypad - -.left_overflow - ld [hl], 5 puzcoord 0 - jr .done_joypad - -.d_right - ld hl, wUnownPuzzleCursorPosition - ld a, [hl] - cp 0 puzcoord 5 - ret z - cp 1 puzcoord 5 - ret z - cp 2 puzcoord 5 - ret z - cp 3 puzcoord 5 - ret z - cp 4 puzcoord 5 - ret z - cp 5 puzcoord 5 - ret z - cp 5 puzcoord 0 - jr z, .right_overflow - inc [hl] - jr .done_joypad - -.right_overflow - ld [hl], 5 puzcoord 5 - -.done_joypad - ld a, [wHoldingUnownPuzzlePiece] - and a - jr nz, .holding_piece - ld de, SFX_POUND - jr .play_sfx - -.holding_piece - ld de, SFX_MOVE_PUZZLE_PIECE - -.play_sfx - call PlaySFX - ret -; e1376 - -UnownPuzzle_A: ; e1376 - ld a, [wHoldingUnownPuzzlePiece] - and a - jr nz, .TryPlacePiece - call UnownPuzzle_CheckCurrentTileOccupancy - and a - jr z, UnownPuzzle_InvalidAction - ld de, SFX_MEGA_KICK - call PlaySFX - ld [hl], 0 - ld [wUnownPuzzleHeldPiece], a - call RedrawUnownPuzzlePieces - call FillUnoccupiedPuzzleSpace - call WaitBGMap - call WaitSFX - ld a, TRUE - ld [wHoldingUnownPuzzlePiece], a - ret - -.TryPlacePiece: - call UnownPuzzle_CheckCurrentTileOccupancy - and a - jr nz, UnownPuzzle_InvalidAction - ld de, SFX_PLACE_PUZZLE_PIECE_DOWN - call PlaySFX - ld a, [wUnownPuzzleHeldPiece] - ld [hl], a - call PlaceUnownPuzzlePieceGFX - call WaitBGMap - xor a - ld [wUnownPuzzleHeldPiece], a - call RedrawUnownPuzzlePieces - xor a - ld [wHoldingUnownPuzzlePiece], a - call WaitSFX - call CheckSolvedUnownPuzzle - ret nc - -; You solved the puzzle! - call PlaceStartCancelBoxBorder - call ClearSprites - ld de, SFX_1ST_PLACE - call PlaySFX - call WaitSFX - call SimpleWaitPressAorB - ld a, TRUE - ld [wSolvedUnownPuzzle], a -UnownPuzzle_Quit: ; e13de - ld hl, wJumptableIndex - set 7, [hl] - ret - -UnownPuzzle_InvalidAction: ; e13e4 - ld de, SFX_WRONG - call PlaySFX - call WaitSFX - ret -; e13ee - -UnownPuzzle_FillBox: ; e13ee - ld de, SCREEN_WIDTH -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - add hl, de - pop bc - dec b - jr nz, .row - ret -; e13fe - -UnownPuzzle_UpdateTilemap: ; e13fe - xor a - ld [wUnownPuzzleCursorPosition], a - ld c, 6 * 6 -.loop - push bc - call UnownPuzzle_CheckCurrentTileOccupancy - ld [wUnownPuzzleHeldPiece], a - and a - jr z, .not_holding_piece - call PlaceUnownPuzzlePieceGFX - jr .next - -.not_holding_piece - call FillUnoccupiedPuzzleSpace - -.next - ld hl, wUnownPuzzleCursorPosition - inc [hl] - pop bc - dec c - jr nz, .loop - ret -; e141f - -PlaceUnownPuzzlePieceGFX: ; e141f - ld a, $2 ; tilemap coords - call GetUnownPuzzleCoordData - ld a, [hli] - ld h, [hl] - ld l, a - push hl - call GetCurrentPuzzlePieceVTileCorner - pop hl - ld de, SCREEN_WIDTH - ld b, 3 -.row - ld c, 3 - push hl -.col - ld [hli], a - inc a - dec c - jr nz, .col - add 9 - pop hl - add hl, de - dec b - jr nz, .row - ret -; e1441 - -FillUnoccupiedPuzzleSpace: ; e1441 - ld a, 2 ; tilemap coords - call GetUnownPuzzleCoordData - ld a, [hli] - ld h, [hl] - ld l, a - push hl - ld a, 4 ; tile - call GetUnownPuzzleCoordData - ld a, [hl] - pop hl - ld de, SCREEN_WIDTH - ld b, 3 -.row - ld c, 3 - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - add hl, de - dec b - jr nz, .row - ret -; e1463 - -GetUnownPuzzleCoordData: ; e1463 - ld e, a - ld d, 0 - ld hl, UnownPuzzleCoordData - add hl, de - ld a, [wUnownPuzzleCursorPosition] - ld e, a -rept 6 - add hl, de -endr - ret -; e1475 - -UnownPuzzle_CheckCurrentTileOccupancy: ; e1475 - ld hl, wPuzzlePieces - ld a, [wUnownPuzzleCursorPosition] - ld e, a - ld d, $0 - add hl, de - ld a, [hl] - ret -; e1481 - -GetCurrentPuzzlePieceVTileCorner: ; e1481 - ld a, [wUnownPuzzleHeldPiece] - ld hl, .Corners - add l - ld l, a - ld a, $0 - adc h - ld h, a - ld a, [hl] - ret -; e148f - -.Corners: ; e148f -; 00, 01, 02 -; 0c, 0d, 0e -; 18, 19, 1a - db $e0 ; no piece selected - db $00, $03, $06, $09 - db $24, $27, $2a, $2d - db $48, $4b, $4e, $51 - db $6c, $6f, $72, $75 -; e14a0 - -CheckSolvedUnownPuzzle: ; e14a0 - ld hl, .SolvedPuzzleConfiguration - ld de, wPuzzlePieces - ld c, 6 * 6 -.loop - ld a, [de] - cp [hl] - jr nz, .not_solved - inc de - inc hl - dec c - jr nz, .loop - scf - ret - -.not_solved - and a - ret -; e14b5 - -.SolvedPuzzleConfiguration: ; e14b5 - db $00, $00, $00, $00, $00, $00 - db $00, $01, $02, $03, $04, $00 - db $00, $05, $06, $07, $08, $00 - db $00, $09, $0a, $0b, $0c, $00 - db $00, $0d, $0e, $0f, $10, $00 - db $00, $00, $00, $00, $00, $00 -; e14d9 - -RedrawUnownPuzzlePieces: ; e14d9 - call GetCurrentPuzzlePieceVTileCorner - ld [wd002], a - xor a - call GetUnownPuzzleCoordData ; get pixel positions - ld a, [hli] - ld b, [hl] - ld c, a - ld a, [wd002] - cp $e0 - jr z, .NoPiece - ld hl, .OAM_HoldingPiece - jr .load - -.NoPiece: - ld hl, .OAM_NotHoldingPiece - -.load - ld de, wVirtualOAMSprite00 -.loop - ld a, [hli] - cp -1 - ret z - add b - ld [de], a ; y - inc de - ld a, [hli] - add c - ld [de], a ; x - inc de - ld a, [wd002] - add [hl] - ld [de], a ; tile id - inc hl - inc de - ld a, [hli] - ld [de], a ; attributes - inc de - jr .loop -; e150f - -.OAM_HoldingPiece: ; e150f - dsprite -1, -4, -1, -4, $00, 0 - dsprite -1, -4, 0, -4, $01, 0 - dsprite -1, -4, 0, 4, $02, 0 - dsprite 0, -4, -1, -4, $0c, 0 - dsprite 0, -4, 0, -4, $0d, 0 - dsprite 0, -4, 0, 4, $0e, 0 - dsprite 0, 4, -1, -4, $18, 0 - dsprite 0, 4, 0, -4, $19, 0 - dsprite 0, 4, 0, 4, $1a, 0 - db -1 - -.OAM_NotHoldingPiece: ; e1534 - dsprite -1, -4, -1, -4, $00, 0 - dsprite -1, -4, 0, -4, $01, 0 - dsprite -1, -4, 0, 4, $00, 0 | X_FLIP - dsprite 0, -4, -1, -4, $02, 0 - dsprite 0, -4, 0, -4, $03, 0 - dsprite 0, -4, 0, 4, $02, 0 | X_FLIP - dsprite 0, 4, -1, -4, $00, 0 | Y_FLIP - dsprite 0, 4, 0, -4, $01, 0 | Y_FLIP - dsprite 0, 4, 0, 4, $00, 0 | X_FLIP | Y_FLIP - db -1 - -UnownPuzzleCoordData: ; e1559 - -puzzle_coords: MACRO - dbpixel \1, \2, \3, \4 - dwcoord \5, \6 - db \7, \8 -ENDM -; OAM coords, tilemap coords, vacant tile, filler - puzzle_coords 3, 3, 4, 4, 1, 0, PUZZLE_BORDER, 0 - puzzle_coords 6, 3, 4, 4, 4, 0, PUZZLE_BORDER, 0 - puzzle_coords 9, 3, 4, 4, 7, 0, PUZZLE_BORDER, 0 - puzzle_coords 12, 3, 4, 4, 10, 0, PUZZLE_BORDER, 0 - puzzle_coords 15, 3, 4, 4, 13, 0, PUZZLE_BORDER, 0 - puzzle_coords 18, 3, 4, 4, 16, 0, PUZZLE_BORDER, 0 - - puzzle_coords 3, 6, 4, 4, 1, 3, PUZZLE_BORDER, 0 - puzzle_coords 6, 6, 4, 4, 4, 3, PUZZLE_VOID, 0 - puzzle_coords 9, 6, 4, 4, 7, 3, PUZZLE_VOID, 0 - puzzle_coords 12, 6, 4, 4, 10, 3, PUZZLE_VOID, 0 - puzzle_coords 15, 6, 4, 4, 13, 3, PUZZLE_VOID, 0 - puzzle_coords 18, 6, 4, 4, 16, 3, PUZZLE_BORDER, 0 - - puzzle_coords 3, 9, 4, 4, 1, 6, PUZZLE_BORDER, 0 - puzzle_coords 6, 9, 4, 4, 4, 6, PUZZLE_VOID, 0 - puzzle_coords 9, 9, 4, 4, 7, 6, PUZZLE_VOID, 0 - puzzle_coords 12, 9, 4, 4, 10, 6, PUZZLE_VOID, 0 - puzzle_coords 15, 9, 4, 4, 13, 6, PUZZLE_VOID, 0 - puzzle_coords 18, 9, 4, 4, 16, 6, PUZZLE_BORDER, 0 - - puzzle_coords 3, 12, 4, 4, 1, 9, PUZZLE_BORDER, 0 - puzzle_coords 6, 12, 4, 4, 4, 9, PUZZLE_VOID, 0 - puzzle_coords 9, 12, 4, 4, 7, 9, PUZZLE_VOID, 0 - puzzle_coords 12, 12, 4, 4, 10, 9, PUZZLE_VOID, 0 - puzzle_coords 15, 12, 4, 4, 13, 9, PUZZLE_VOID, 0 - puzzle_coords 18, 12, 4, 4, 16, 9, PUZZLE_BORDER, 0 - - puzzle_coords 3, 15, 4, 4, 1, 12, PUZZLE_BORDER, 0 - puzzle_coords 6, 15, 4, 4, 4, 12, PUZZLE_VOID, 0 - puzzle_coords 9, 15, 4, 4, 7, 12, PUZZLE_VOID, 0 - puzzle_coords 12, 15, 4, 4, 10, 12, PUZZLE_VOID, 0 - puzzle_coords 15, 15, 4, 4, 13, 12, PUZZLE_VOID, 0 - puzzle_coords 18, 15, 4, 4, 16, 12, PUZZLE_BORDER, 0 - - puzzle_coords 3, 18, 4, 4, 1, 15, PUZZLE_BORDER, 0 - puzzle_coords 6, 18, 4, 4, 4, 15, PUZZLE_BORDER, 0 - puzzle_coords 9, 18, 4, 4, 7, 15, PUZZLE_BORDER, 0 - puzzle_coords 12, 18, 4, 4, 10, 15, PUZZLE_BORDER, 0 - puzzle_coords 15, 18, 4, 4, 13, 15, PUZZLE_BORDER, 0 - puzzle_coords 18, 18, 4, 4, 16, 15, PUZZLE_BORDER, 0 - -ConvertLoadedPuzzlePieces: ; e1631 - ld hl, vTiles2 - ld de, vTiles0 - ld b, 6 -.loop - push bc - push hl - push hl - call .EnlargePuzzlePieceTiles - pop hl - ld bc, 1 tiles / 2 - add hl, bc - call .EnlargePuzzlePieceTiles - pop hl - ld bc, 6 tiles - add hl, bc - pop bc - dec b - jr nz, .loop - call UnownPuzzle_AddPuzzlePieceBorders - ret -; e1654 - -.EnlargePuzzlePieceTiles: ; e1654 -; double size - ld c, 6 -.loop1 - push bc - push hl - push hl - ld c, 4 -.loop2 - push bc - ld a, [hli] - and $f0 - swap a - call .GetEnlargedTile - ld c, a - ld a, [hli] - and $f0 - swap a - call .GetEnlargedTile - ld b, a - ld a, c - ld [de], a - inc de - ld a, b - ld [de], a - inc de - ld a, c - ld [de], a - inc de - ld a, b - ld [de], a - inc de - pop bc - dec c - jr nz, .loop2 - pop hl - ld c, 4 -.loop3 - push bc - ld a, [hli] - and $f - call .GetEnlargedTile - ld c, a - ld a, [hli] - and $f - call .GetEnlargedTile - ld b, a - ld a, c - ld [de], a - inc de - ld a, b - ld [de], a - inc de - ld a, c - ld [de], a - inc de - ld a, b - ld [de], a - inc de - pop bc - dec c - jr nz, .loop3 - pop hl - ld bc, 1 tiles - add hl, bc - pop bc - dec c - jr nz, .loop1 - ret -; e16aa - -.GetEnlargedTile: ; e16aa - push hl - ld hl, .EnlargedTiles - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, [hl] - pop hl - ret -; e16b7 - -.EnlargedTiles: ; e16b7 - -x = 0 -rept 16 - db ((x & %1000) * %11000) + ((x & %0100) * %1100) + ((x & %0010) * %110) + ((x & %0001) * %11) -x = x + 1 -endr -; e16c7 - -UnownPuzzle_AddPuzzlePieceBorders: ; e16c7 - ld hl, PuzzlePieceBorderData - ld a, 8 -.loop - push af - push hl - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - ld a, [hli] - ld h, [hl] - ld l, a - call .LoadGFX - pop hl -rept 4 - inc hl -endr - pop af - dec a - jr nz, .loop - ret -; e16e2 - -.LoadGFX: ; e16e2 - lb bc, 4, 4 -.loop1 - push bc - -.loop2 - push de - push hl - - ld b, 1 tiles -.loop3 - ld a, [de] - or [hl] - ld [hli], a - inc de - dec b - jr nz, .loop3 - - pop hl - ld de, 3 tiles - add hl, de - pop de - dec c - jr nz, .loop2 - - ld bc, 24 tiles - add hl, bc - pop bc - dec b - jr nz, .loop1 - ret -; e1703 - -PuzzlePieceBorderData: ; e1703 - dw .TileBordersGFX + 0 tiles, vTiles0 tile $00 - dw .TileBordersGFX + 1 tiles, vTiles0 tile $01 - dw .TileBordersGFX + 2 tiles, vTiles0 tile $02 - dw .TileBordersGFX + 3 tiles, vTiles0 tile $0c - dw .TileBordersGFX + 4 tiles, vTiles0 tile $0e - dw .TileBordersGFX + 5 tiles, vTiles0 tile $18 - dw .TileBordersGFX + 6 tiles, vTiles0 tile $19 - dw .TileBordersGFX + 7 tiles, vTiles0 tile $1a -; e1723 - -.TileBordersGFX: ; e1723 -INCBIN "gfx/unown_puzzle/tile_borders.2bpp" - -LoadUnownPuzzlePiecesGFX: ; e17a3 - ld a, [wScriptVar] - maskbits NUM_UNOWN_PUZZLES - ld e, a - ld d, 0 - ld hl, .LZPointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, vTiles2 - call Decompress - call ConvertLoadedPuzzlePieces - ret -; e17bd - -.LZPointers: ; e17bd -; entries correspond to UNOWNPUZZLE_* constants - dw KabutoPuzzleLZ - dw OmanytePuzzleLZ - dw AerodactylPuzzleLZ - dw HoOhPuzzleLZ -; e17c5 - -UnownPuzzleCursorGFX: ; e17c5 -INCBIN "gfx/unown_puzzle/cursor.2bpp" - -UnownPuzzleStartCancelLZ: ; e1805 -INCBIN "gfx/unown_puzzle/start_cancel.2bpp.lz" - -HoOhPuzzleLZ: ; e18ab -INCBIN "gfx/unown_puzzle/hooh.2bpp.lz" - -AerodactylPuzzleLZ: ; e19fb -INCBIN "gfx/unown_puzzle/aerodactyl.2bpp.lz" - -KabutoPuzzleLZ: ; e1bab -INCBIN "gfx/unown_puzzle/kabuto.2bpp.lz" - -OmanytePuzzleLZ: ; e1c9b -INCBIN "gfx/unown_puzzle/omanyte.2bpp.lz" diff --git a/engine/games/card_flip.asm b/engine/games/card_flip.asm new file mode 100755 index 000000000..fbeb3e3b6 --- /dev/null +++ b/engine/games/card_flip.asm @@ -0,0 +1,1692 @@ +CARDFLIP_LIGHT_OFF EQU $ef +CARDFLIP_LIGHT_ON EQU $f5 + +CARDFLIP_DECK_SIZE EQU 4 * 6 + +; two labels below called from inside ./dummy_game.asm +Unknown_e00ed: ; e00ed (38:40ed) +; Graphics for an unused Game Corner +; game were meant to be here. +ret_e00ed: ; e00ed (38:40ed) + ret + +_CardFlip: ; e00ee (38:40ee) + ld hl, wOptions + set 4, [hl] + call ClearBGPalettes + call ClearTileMap + call ClearSprites + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + call DisableLCD + call LoadStandardFont + call LoadFontsExtra + + ld hl, CardFlipLZ01 + ld de, vTiles2 tile $00 + call Decompress + ld hl, CardFlipLZ02 + ld de, vTiles2 tile $3e + call Decompress + ld hl, CardFlipLZ03 + ld de, vTiles0 tile $00 + call Decompress + ld hl, CardFlipOffButtonGFX + ld de, vTiles0 tile CARDFLIP_LIGHT_OFF + ld bc, 1 tiles + call CopyBytes + ld hl, CardFlipOnButtonGFX + ld de, vTiles0 tile CARDFLIP_LIGHT_ON + ld bc, 1 tiles + call CopyBytes + + call CardFlip_ShiftDigitsLeftTwoPixels + call CardFlip_InitTilemap + call CardFlip_InitAttrPals + call EnableLCD + call WaitBGMap2 + ld a, $e4 + call DmgToCgbBGPals + ld de, $e4e4 + call DmgToCgbObjPals + call DelayFrame + xor a + ld [wJumptableIndex], a + ld a, $2 + ld [wCardFlipCursorY], a + ld [wCardFlipCursorX], a + ld de, MUSIC_GAME_CORNER + call PlayMusic +.MasterLoop: + ld a, [wJumptableIndex] + bit 7, a + jr nz, .leavethegame + call .CardFlip + jr .MasterLoop +.leavethegame + call WaitSFX + ld de, SFX_QUIT_SLOTS + call PlaySFX + call WaitSFX + call ClearBGPalettes + ld hl, wOptions + res 4, [hl] + ret + +.CardFlip: ; e0191 (38:4191) + 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 +; e01a0 (38:41a0) + +.Jumptable: ; e01a0 + dw .AskPlayWithThree + dw .DeductCoins + dw .ChooseACard + dw .PlaceYourBet + dw .CheckTheCard + dw .TabulateTheResult + dw .PlayAgain + dw .Quit +; e01b0 + +.Increment: ; e01b0 + ld hl, wJumptableIndex + inc [hl] + ret +; e01b5 + +.AskPlayWithThree: ; e01b5 + ld hl, .PlayWithThreeCoinsText + call CardFlip_UpdateCoinBalanceDisplay + call YesNoBox + jr c, .SaidNo + call CardFlip_ShuffleDeck + call .Increment + ret + +.SaidNo: + ld a, 7 + ld [wJumptableIndex], a + ret +; e01cd + +.PlayWithThreeCoinsText: ; 0xe01cd + ; Play with three coins? + text_jump UnknownText_0x1c5793 + db "@" +; 0xe01d2 + +.DeductCoins: ; e01d2 + ld a, [wCoins] + ld h, a + ld a, [wCoins + 1] + ld l, a + ld a, h + and a + jr nz, .deduct ; You have at least 256 coins. + ld a, l + cp 3 + jr nc, .deduct ; You have at least 3 coins. + ld hl, .NotEnoughCoinsText + call CardFlip_UpdateCoinBalanceDisplay + ld a, 7 + ld [wJumptableIndex], a + ret + +.deduct + ld de, -3 + add hl, de + ld a, h + ld [wCoins], a + ld a, l + ld [wCoins + 1], a + ld de, SFX_TRANSACTION + call PlaySFX + xor a + ld [hBGMapMode], a + call CardFlip_PrintCoinBalance + ld a, $1 + ld [hBGMapMode], a + call WaitSFX + call .Increment + ret +; e0212 + +.NotEnoughCoinsText: ; 0xe0212 + ; Not enough coins… + text_jump UnknownText_0x1c57ab + db "@" +; 0xe0217 + +.ChooseACard: ; e0217 + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + lb bc, 12, 9 + call CardFlip_FillGreenBox + hlcoord 9, 0 + ld bc, SCREEN_WIDTH + ld a, [wCardFlipNumCardsPlayed] + call AddNTimes + ld [hl], CARDFLIP_LIGHT_ON + ld a, $1 + ld [hBGMapMode], a + ld c, 20 + call DelayFrames + hlcoord 2, 0 + call PlaceCardFaceDown + ld a, $1 + ld [hBGMapMode], a + ld c, 20 + call DelayFrames + hlcoord 2, 6 + call PlaceCardFaceDown + call WaitBGMap + ld hl, .ChooseACardText + call CardFlip_UpdateCoinBalanceDisplay + xor a + ld [wCardFlipWhichCard], a +.loop + call JoyTextDelay + ld a, [hJoyLast] + and A_BUTTON + jr nz, .next + ld de, SFX_KINESIS + call PlaySFX + call PlaceOAMCardBorder + ld c, 4 + call DelayFrames + ld hl, wCardFlipWhichCard + ld a, [hl] + xor $1 + ld [hl], a + jr .loop + +.next + ld de, SFX_SLOT_MACHINE_START + call PlaySFX + ld a, $3 +.loop2 + push af + call PlaceOAMCardBorder + ld c, 4 + call DelayFrames + call ClearSprites + ld c, 4 + call DelayFrames + pop af + dec a + jr nz, .loop2 + ld hl, wCardFlipWhichCard + ld a, [hl] + push af + xor $1 + ld [hl], a + call GetCoordsOfChosenCard + lb bc, 6, 5 + call CardFlip_FillGreenBox + pop af + ld [wCardFlipWhichCard], a + call .Increment + ret +; e02b2 + +.ChooseACardText: ; 0xe02b2 + ; Choose a card. + text_jump UnknownText_0x1c57be + db "@" +; 0xe02b7 + +.PlaceYourBet: ; e02b7 + ld hl, .PlaceYourBetText + call CardFlip_UpdateCoinBalanceDisplay +.betloop + call JoyTextDelay + ld a, [hJoyLast] + and A_BUTTON + jr nz, .betdone + call ChooseCard_HandleJoypad + call CardFlip_UpdateCursorOAM + call DelayFrame + jr .betloop + +.betdone + call .Increment + ret +; e02d5 + +.PlaceYourBetText: ; 0xe02d5 + ; Place your bet. + text_jump UnknownText_0x1c57ce + db "@" +; 0xe02da + +.CheckTheCard: ; e02da + xor a + ld [hVBlankCounter], a + call CardFlip_UpdateCursorOAM + call WaitSFX + ld de, SFX_CHOOSE_A_CARD + call PlaySFX + call WaitSFX + ld a, [wCardFlipNumCardsPlayed] + ld e, a + ld d, 0 + ld hl, wDeck + add hl, de + add hl, de + ld a, [wCardFlipWhichCard] + ld e, a + add hl, de + ld a, [hl] + ld [wCardFlipFaceUpCard], a + ld e, a + ld hl, wDiscardPile + add hl, de + ld [hl], TRUE + call GetCoordsOfChosenCard + call CardFlip_DisplayCardFaceUp + call WaitBGMap2 + call .Increment + ret +; e0314 + +.TabulateTheResult: ; e0314 + call CardFlip_CheckWinCondition + call WaitPressAorB_BlinkCursor + call .Increment + ret +; e031e + +.PlayAgain: ; e031e + call ClearSprites + ld hl, .PlayAgainText + call CardFlip_UpdateCoinBalanceDisplay + call YesNoBox + jr nc, .Continue + call .Increment + ret + +.Continue: + ld a, [wCardFlipNumCardsPlayed] + inc a + ld [wCardFlipNumCardsPlayed], a + cp 12 + jr c, .KeepTheCurrentDeck + call CardFlip_InitTilemap + ld a, $1 + ld [hBGMapMode], a + call CardFlip_ShuffleDeck + ld hl, .CardsShuffledText + call PrintText + jr .LoopAround + +.KeepTheCurrentDeck: + call CardFlip_BlankDiscardedCardSlot + +.LoopAround: + ld a, 1 + ld [wJumptableIndex], a + ret +; e0356 + +.PlayAgainText: ; 0xe0356 + ; Want to play again? + text_jump UnknownText_0x1c57df + db "@" +; 0xe035b + +.CardsShuffledText: ; 0xe035b + ; The cards have been shuffled. + text_jump UnknownText_0x1c57f4 + db "@" +; 0xe0360 + +.Quit: ; e0360 + ld hl, wJumptableIndex + set 7, [hl] + ret +; e0366 + +CardFlip_ShuffleDeck: ; e0366 + ld hl, wDeck + ld bc, CARDFLIP_DECK_SIZE + xor a + call ByteFill + ld de, wDeck + ld c, CARDFLIP_DECK_SIZE - 1 +.loop + call Random + and $1f + cp CARDFLIP_DECK_SIZE + jr nc, .loop + ld l, a + ld h, $0 + add hl, de + ld a, [hl] + and a + jr nz, .loop + ld [hl], c + dec c + jr nz, .loop + xor a + ld [wCardFlipNumCardsPlayed], a + ld hl, wDiscardPile + ld bc, CARDFLIP_DECK_SIZE + call ByteFill + ret +; e0398 + +CollapseCursorPosition: ; e0398 + ld hl, 0 + ld bc, 6 + ld a, [wCardFlipCursorY] + call AddNTimes + ld b, $0 + ld a, [wCardFlipCursorX] + ld c, a + add hl, bc + ret +; e03ac + +GetCoordsOfChosenCard: ; e03ac + ld a, [wCardFlipWhichCard] + and a + jr nz, .BottomCard + hlcoord 2, 0 + bcpixel 2, 3 + jr .done + +.BottomCard: + hlcoord 2, 6 + bcpixel 8, 3 + +.done + ret +; e03c1 + +PlaceCardFaceDown: ; e03c1 + xor a + ld [hBGMapMode], a + ld de, .FaceDownCardTilemap + lb bc, 6, 5 + call CardFlip_CopyToBox + ret +; e03ce + +.FaceDownCardTilemap: ; e03ce + db $08, $09, $09, $09, $0a + db $0b, $28, $2b, $28, $0c + db $0b, $2c, $2d, $2e, $0c + db $0b, $2f, $30, $31, $0c + db $0b, $32, $33, $34, $0c + db $0d, $0e, $0e, $0e, $0f +; e03ec + +CardFlip_DisplayCardFaceUp: ; e03ec + xor a + ld [hBGMapMode], a + push hl + push hl + ; Flip the card face up. + ld de, .FaceUpCardTilemap + lb bc, 6, 5 + call CardFlip_CopyToBox + + ; Get the level and species of the upturned card. + ld a, [wCardFlipFaceUpCard] + ld e, a + ld d, 0 + ld hl, .Deck + add hl, de + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + + ; Place the level. + pop hl + ld bc, 3 + SCREEN_WIDTH + add hl, bc + ld [hl], e + + ; Place the Pokepic. + ld bc, SCREEN_HEIGHT + add hl, bc + ld a, d + ld de, SCREEN_WIDTH + ld b, 3 +.row + push hl + ld c, 3 +.col + ld [hli], a + inc a + dec c + jr nz, .col + pop hl + add hl, de + dec b + jr nz, .row + pop hl + + ; Pointless CGB check + ld a, [hCGB] + and a + ret z + + ; Set the attributes + ld de, wAttrMap - wTileMap + add hl, de + ld a, [wCardFlipFaceUpCard] + and 3 + inc a + lb bc, 6, 5 + call CardFlip_FillBox + ret +; e043b + +.FaceUpCardTilemap: ; e043b + db $18, $19, $19, $19, $1a + db $1b, $35, $7f, $7f, $1c + db $0b, $28, $28, $28, $0c + db $0b, $28, $28, $28, $0c + db $0b, $28, $28, $28, $0c + db $1d, $1e, $1e, $1e, $1f +; e0459 + +.Deck: ; e0459 + ; level, pic anchor (3x3) + db "1", $4e, "1", $57, "1", $69, "1", $60 + db "2", $4e, "2", $57, "2", $69, "2", $60 + db "3", $4e, "3", $57, "3", $69, "3", $60 + db "4", $4e, "4", $57, "4", $69, "4", $60 + db "5", $4e, "5", $57, "5", $69, "5", $60 + db "6", $4e, "6", $57, "6", $69, "6", $60 +; e0489 + +CardFlip_UpdateCoinBalanceDisplay: ; e0489 + push hl + hlcoord 0, 12 + ld b, 4 + ld c, SCREEN_WIDTH - 2 + call TextBox + pop hl + call PrintTextBoxText + call CardFlip_PrintCoinBalance + ret +; e049c + +CardFlip_PrintCoinBalance: ; e049c + hlcoord 9, 15 + ld b, 1 + ld c, 9 + call TextBox + hlcoord 10, 16 + ld de, .CoinStr + call PlaceString + hlcoord 15, 16 + ld de, wCoins + lb bc, PRINTNUM_LEADINGZEROS | 2, 4 + call PrintNum + ret +; e04bc + +.CoinStr: + db "COIN@" +; e04c1 + +CardFlip_InitTilemap: ; e04c1 (38:44c1) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, $29 + call ByteFill + hlcoord 9, 0 + ld de, CardFlipTilemap + lb bc, 12, 11 + call CardFlip_CopyToBox + hlcoord 0, 12 + lb bc, 4, 18 + call TextBox + ret +; e04e5 (38:44e5) + +CardFlip_FillGreenBox: ; e04e5 + ld a, $29 + +CardFlip_FillBox: ; e04e7 (38:44e7) +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret + +CardFlip_CopyToBox: ; e04f7 (38:44f7) +.row + push bc + push hl +.col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; e0509 (38:4509) + +CardFlip_CopyOAM: ; e0509 + ld de, wVirtualOAMSprite00 + ld a, [hli] +.loop + push af + ld a, [hli] + add b + ld [de], a ; y + inc de + ld a, [hli] + add c + ld [de], a ; x + inc de + ld a, [hli] + ld [de], a ; tile id + inc de + ld a, [hli] + ld [de], a ; attributes + inc de + pop af + dec a + jr nz, .loop + ret +; e0521 + +CardFlip_ShiftDigitsLeftTwoPixels: ; e0521 (38:4521) + ld de, vTiles0 tile "0" + ld hl, vTiles0 tile "0" + 2 + ld bc, 10 tiles - 2 + call CopyBytes + ld hl, vTiles0 tile "9" + 1 tiles - 2 + xor a + ld [hli], a + ld [hl], a + ret +; e0534 (38:4534) + +CardFlip_BlankDiscardedCardSlot: ; e0534 + xor a + ld [hBGMapMode], a + ld a, [wCardFlipFaceUpCard] + ld e, a + ld d, 0 + + and 3 ; get mon + ld c, a + ld b, 0 + + ld a, e + and $1c ; get level + srl a + add LOW(.Jumptable) + ld l, a + ld a, 0 + adc HIGH(.Jumptable) + ld h, a + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e0553 + +.Jumptable: ; e0553 + dw .Level1 + dw .Level2 + dw .Level3 + dw .Level4 + dw .Level5 + dw .Level6 +; e055f + +.Level1: ; e055f + ld hl, wDiscardPile + 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded2 + hlcoord 13, 3 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $37 + ret + +.discarded2 + hlcoord 13, 3 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3d + ret +; e0583 + +.Level2: ; e0583 + ld hl, wDiscardPile - 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded1 + hlcoord 13, 4 + add hl, bc + add hl, bc + ld [hl], $3b + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret + +.discarded1 + hlcoord 13, 4 + add hl, bc + add hl, bc + ld [hl], $3d + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret +; e05a7 + +.Level3: ; e05a7 + ld hl, wDiscardPile + 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded4 + hlcoord 13, 6 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $38 + ret + +.discarded4 + hlcoord 13, 6 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3d + ret +; e05cb + +.Level4: ; e05cb + ld hl, wDiscardPile - 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded3 + hlcoord 13, 7 + add hl, bc + add hl, bc + ld [hl], $3c + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret + +.discarded3 + hlcoord 13, 7 + add hl, bc + add hl, bc + ld [hl], $3d + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret +; e05ef + +.Level5: ; e05ef + ld hl, wDiscardPile + 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded6 + hlcoord 13, 9 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $39 + ret + +.discarded6 + hlcoord 13, 9 + add hl, bc + add hl, bc + ld [hl], $36 + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3d + ret +; e0613 + +.Level6: ; e0613 + ld hl, wDiscardPile - 4 + add hl, de + ld a, [hl] + and a + jr nz, .discarded5 + hlcoord 13, 10 + add hl, bc + add hl, bc + ld [hl], $3c + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret + +.discarded5 + hlcoord 13, 10 + add hl, bc + add hl, bc + ld [hl], $3d + ld bc, SCREEN_WIDTH + add hl, bc + ld [hl], $3a + ret +; e0637 + +CardFlip_CheckWinCondition: ; e0637 + call CollapseCursorPosition + add hl, hl + ld de, .Jumptable + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e0643 + +.Jumptable: ; e0643 + dw .Impossible + dw .Impossible + dw .PikaJiggly + dw .PikaJiggly + dw .PoliOddish + dw .PoliOddish + + dw .Impossible + dw .Impossible + dw .Pikachu + dw .Jigglypuff + dw .Poliwag + dw .Oddish + + dw .OneTwo + dw .One + dw .PikaOne + dw .JigglyOne + dw .PoliOne + dw .OddOne + + dw .OneTwo + dw .Two + dw .PikaTwo + dw .JigglyTwo + dw .PoliTwo + dw .OddTwo + + dw .ThreeFour + dw .Three + dw .PikaThree + dw .JigglyThree + dw .PoliThree + dw .OddThree + + dw .ThreeFour + dw .Four + dw .PikaFour + dw .JigglyFour + dw .PoliFour + dw .OddFour + + dw .FiveSix + dw .Five + dw .PikaFive + dw .JigglyFive + dw .PoliFive + dw .OddFive + + dw .FiveSix + dw .Six + dw .PikaSix + dw .JigglySix + dw .PoliSix + dw .OddSix +; e06a3 + +.Impossible: ; e06a3 + jp .Lose +; e06a6 + +.PikaJiggly: ; e06a6 + ld a, [wCardFlipFaceUpCard] + and $2 + jp nz, .Lose + jr .WinSix + +.PoliOddish: ; e06b0 + ld a, [wCardFlipFaceUpCard] + and $2 + jr nz, .WinSix + jp .Lose + +.WinSix: ; e06ba + ld c, $6 + ld de, SFX_2ND_PLACE + jp .Payout +; e06c2 + +.OneTwo: ; e06c2 + ld a, [wCardFlipFaceUpCard] + and $18 + jr z, .WinNine + jp .Lose + +.ThreeFour: ; e06cc + ld a, [wCardFlipFaceUpCard] + and $18 + cp $8 + jr z, .WinNine + jp .Lose + +.FiveSix: ; e06d8 + ld a, [wCardFlipFaceUpCard] + and $18 + cp $10 + jr z, .WinNine + jp .Lose + +.WinNine: ; e06e4 + ld c, $9 + ld de, SFX_2ND_PLACE + jp .Payout +; e06ec + +.Pikachu: ; e06ec + ld a, [wCardFlipFaceUpCard] + and $3 + jr z, .WinTwelve + jp .Lose + +.Jigglypuff: ; e06f6 + ld a, [wCardFlipFaceUpCard] + and $3 + cp $1 + jr z, .WinTwelve + jp .Lose + +.Poliwag: ; e0702 + ld a, [wCardFlipFaceUpCard] + and $3 + cp $2 + jr z, .WinTwelve + jp .Lose + +.Oddish: ; e070e + ld a, [wCardFlipFaceUpCard] + and $3 + cp $3 + jr z, .WinTwelve + jp .Lose + +.WinTwelve: ; e071a + ld c, $c + ld de, SFX_2ND_PLACE + jp .Payout +; e0722 + +.One: ; e0722 + ld a, [wCardFlipFaceUpCard] + and $1c + jr z, .WinEighteen + jp .Lose + +.Two: ; e072c + ld a, [wCardFlipFaceUpCard] + and $1c + cp $4 + jr z, .WinEighteen + jp .Lose + +.Three: ; e0738 + ld a, [wCardFlipFaceUpCard] + and $1c + cp $8 + jr z, .WinEighteen + jp .Lose + +.Four: ; e0744 + ld a, [wCardFlipFaceUpCard] + and $1c + cp $c + jr z, .WinEighteen + jp .Lose + +.Five: ; e0750 + ld a, [wCardFlipFaceUpCard] + and $1c + cp $10 + jr z, .WinEighteen + jp .Lose + +.Six: ; e075c + ld a, [wCardFlipFaceUpCard] + and $1c + cp $14 + jr z, .WinEighteen + jp .Lose + +.WinEighteen: ; e0768 + ld c, $12 + ld de, SFX_2ND_PLACE + jp .Payout +; e0770 + + +.PikaOne: ; e0770 + ld e, $0 + jr .CheckWin72 + +.JigglyOne: ; e0774 + ld e, $1 + jr .CheckWin72 + +.PoliOne: ; e0778 + ld e, $2 + jr .CheckWin72 + +.OddOne: ; e077c + ld e, $3 + jr .CheckWin72 + +.PikaTwo: ; e0780 + ld e, $4 + jr .CheckWin72 + +.JigglyTwo: ; e0784 + ld e, $5 + jr .CheckWin72 + +.PoliTwo: ; e0788 + ld e, $6 + jr .CheckWin72 + +.OddTwo: ; e078c + ld e, $7 + jr .CheckWin72 + +.PikaThree: ; e0790 + ld e, $8 + jr .CheckWin72 + +.JigglyThree: ; e0794 + ld e, $9 + jr .CheckWin72 + +.PoliThree: ; e0798 + ld e, $a + jr .CheckWin72 + +.OddThree: ; e079c + ld e, $b + jr .CheckWin72 + +.PikaFour: ; e07a0 + ld e, $c + jr .CheckWin72 + +.JigglyFour: ; e07a4 + ld e, $d + jr .CheckWin72 + +.PoliFour: ; e07a8 + ld e, $e + jr .CheckWin72 + +.OddFour: ; e07ac + ld e, $f + jr .CheckWin72 + +.PikaFive: ; e07b0 + ld e, $10 + jr .CheckWin72 + +.JigglyFive: ; e07b4 + ld e, $11 + jr .CheckWin72 + +.PoliFive: ; e07b8 + ld e, $12 + jr .CheckWin72 + +.OddFive: ; e07bc + ld e, $13 + jr .CheckWin72 + +.PikaSix: ; e07c0 + ld e, $14 + jr .CheckWin72 + +.JigglySix: ; e07c4 + ld e, $15 + jr .CheckWin72 + +.PoliSix: ; e07c8 + ld e, $16 + jr .CheckWin72 + +.OddSix: ; e07cc + ld e, $17 + +.CheckWin72: ; e07ce + ld a, [wCardFlipFaceUpCard] + cp e + jr nz, .Lose + ld c, 72 + ld de, SFX_2ND_PLACE + jr .Payout + +.Lose: ; e07db + ld de, SFX_WRONG + call PlaySFX + ld hl, .Text_Darn + call CardFlip_UpdateCoinBalanceDisplay + call WaitSFX + ret + +.Payout: ; e07eb + push bc + push de + ld hl, .Text_Yeah + call CardFlip_UpdateCoinBalanceDisplay + pop de + call PlaySFX + call WaitSFX + pop bc +.loop + push bc + call .IsCoinCaseFull + jr c, .full + call .AddCoinPlaySFX + +.full + call CardFlip_PrintCoinBalance + ld c, 2 + call DelayFrames + pop bc + dec c + jr nz, .loop + ret +; e0811 + +.Text_Yeah: ; 0xe0811 + ; Yeah! + text_jump UnknownText_0x1c5813 + db "@" +; 0xe0816 + +.Text_Darn: ; 0xe0816 + ; Darn… + text_jump UnknownText_0x1c581a + db "@" +; 0xe081b + +.AddCoinPlaySFX: ; e081b + ld a, [wCoins] + ld h, a + ld a, [wCoins + 1] + ld l, a + inc hl + ld a, h + ld [wCoins], a + ld a, l + ld [wCoins + 1], a + ld de, SFX_PAY_DAY + call PlaySFX + ret +; e0833 + +.IsCoinCaseFull: ; e0833 + ld a, [wCoins] + cp HIGH(MAX_COINS) + jr c, .less + jr z, .check_low + jr .more + +.check_low + ld a, [wCoins + 1] + cp LOW(MAX_COINS) + jr c, .less + +.more + scf + ret + +.less + and a + ret +; e0849 + +PlaceOAMCardBorder: ; e0849 + call GetCoordsOfChosenCard + ld hl, .SpriteData + call CardFlip_CopyOAM + ret +; e0853 + +.SpriteData: ; e0853 + db 18 + dsprite 0, 0, 0, 0, $04, 0 + dsprite 0, 0, 1, 0, $06, 0 + dsprite 0, 0, 2, 0, $06, 0 + dsprite 0, 0, 3, 0, $06, 0 + dsprite 0, 0, 4, 0, $04, 0 | X_FLIP + + dsprite 1, 0, 0, 0, $05, 0 + dsprite 1, 0, 4, 0, $05, 0 | X_FLIP + + dsprite 2, 0, 0, 0, $05, 0 + dsprite 2, 0, 4, 0, $05, 0 | X_FLIP + + dsprite 3, 0, 0, 0, $05, 0 + dsprite 3, 0, 4, 0, $05, 0 | X_FLIP + + dsprite 4, 0, 0, 0, $05, $00 + dsprite 4, 0, 4, 0, $05, 0 | X_FLIP + + dsprite 5, 0, 0, 0, $04, 0 | Y_FLIP + dsprite 5, 0, 1, 0, $06, 0 | Y_FLIP + dsprite 5, 0, 2, 0, $06, 0 | Y_FLIP + dsprite 5, 0, 3, 0, $06, 0 | Y_FLIP + dsprite 5, 0, 4, 0, $04, 0 | X_FLIP | Y_FLIP +; e089c + +ChooseCard_HandleJoypad: ; e089c + ld hl, hJoyLast + ld a, [hl] + and D_LEFT + jp nz, .d_left + ld a, [hl] + and D_RIGHT + jp nz, .d_right + ld a, [hl] + and D_UP + jp nz, .d_up + ld a, [hl] + and D_DOWN + jp nz, .d_down + ret +; e08b8 + +.d_left ; e08b8 + ld hl, wCardFlipCursorX + ld a, [wCardFlipCursorY] + and a + jr z, .mon_pair_left + cp $1 + jr z, .mon_group_left + ld a, [hl] + and a + ret z + dec [hl] + jp .play_sound + +.mon_group_left + ld a, [hl] + cp $3 + jr c, .left_to_number_gp + dec [hl] + jp .play_sound + +.mon_pair_left + ld a, [hl] + and $e + ld [hl], a + cp $3 + jr c, .left_to_number_gp + dec [hl] + dec [hl] + jp .play_sound + +.left_to_number_gp + ld a, $2 + ld [wCardFlipCursorY], a + ld a, $1 + ld [wCardFlipCursorX], a + jp .play_sound +; e08ef + +.d_right ; e08ef + ld hl, wCardFlipCursorX + ld a, [wCardFlipCursorY] + and a + jr z, .mon_pair_right + ld a, [hl] + cp $5 + ret nc + inc [hl] + jr .play_sound + +.mon_pair_right + ld a, [hl] + and $e + ld [hl], a + cp $4 + ret nc + inc [hl] + inc [hl] + jr .play_sound + +.d_up ; e090a + ld hl, wCardFlipCursorY + ld a, [wCardFlipCursorX] + and a + jr z, .num_pair_up + cp $1 + jr z, .num_gp_up + ld a, [hl] + and a + ret z + dec [hl] + jr .play_sound + +.num_gp_up + ld a, [hl] + cp $3 + jr c, .up_to_mon_group + dec [hl] + jr .play_sound + +.num_pair_up + ld a, [hl] + and $e + ld [hl], a + cp $3 + jr c, .up_to_mon_group + dec [hl] + dec [hl] + jr .play_sound + +.up_to_mon_group + ld a, $1 + ld [wCardFlipCursorY], a + ld a, $2 + ld [wCardFlipCursorX], a + jr .play_sound + +.d_down ; e093d + ld hl, wCardFlipCursorY + ld a, [wCardFlipCursorX] + and a + jr z, .num_pair_down + ld hl, wCardFlipCursorY + ld a, [hl] + cp $7 + ret nc + inc [hl] + jr .play_sound + +.num_pair_down + ld a, [hl] + and $e + ld [hl], a + cp $6 + ret nc + inc [hl] + inc [hl] + +.play_sound ; e0959 + ld de, SFX_POKEBALLS_PLACED_ON_TABLE + call PlaySFX + ret +; e0960 + +CardFlip_UpdateCursorOAM: ; e0960 + call ClearSprites + ld a, [hCGB] + and a + jr nz, .skip + ld a, [hVBlankCounter] + and $4 + ret nz + +.skip + call CollapseCursorPosition + add hl, hl + add hl, hl + ld de, .OAMData + add hl, de + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a + call CardFlip_CopyOAM + ret +; e0981 + +.OAMData: ; e0981 +cardflip_cursor: MACRO +if _NARG >= 5 + dbpixel \1, \2, \3, \4 + dw \5 +else + dbpixel \1, \2 + dw \3 +endc +ENDM + + cardflip_cursor 11, 2, .Impossible + cardflip_cursor 12, 2, .Impossible + cardflip_cursor 13, 2, .PokeGroupPair + cardflip_cursor 13, 2, .PokeGroupPair + cardflip_cursor 17, 2, .PokeGroupPair + cardflip_cursor 17, 2, .PokeGroupPair + + cardflip_cursor 11, 3, .Impossible + cardflip_cursor 12, 3, .Impossible + cardflip_cursor 13, 3, .PokeGroup + cardflip_cursor 15, 3, .PokeGroup + cardflip_cursor 17, 3, .PokeGroup + cardflip_cursor 19, 3, .PokeGroup + + cardflip_cursor 11, 5, .NumGroupPair + cardflip_cursor 12, 5, .NumGroup + cardflip_cursor 13, 5, .SingleTile + cardflip_cursor 15, 5, .SingleTile + cardflip_cursor 17, 5, .SingleTile + cardflip_cursor 19, 5, .SingleTile + + cardflip_cursor 11, 5, .NumGroupPair + cardflip_cursor 12, 6, 0, 4, .NumGroup + cardflip_cursor 13, 6, 0, 4, .SingleTile + cardflip_cursor 15, 6, 0, 4, .SingleTile + cardflip_cursor 17, 6, 0, 4, .SingleTile + cardflip_cursor 19, 6, 0, 4, .SingleTile + + cardflip_cursor 11, 8, .NumGroupPair + cardflip_cursor 12, 8, .NumGroup + cardflip_cursor 13, 8, .SingleTile + cardflip_cursor 15, 8, .SingleTile + cardflip_cursor 17, 8, .SingleTile + cardflip_cursor 19, 8, .SingleTile + + cardflip_cursor 11, 8, .NumGroupPair + cardflip_cursor 12, 9, 0, 4, .NumGroup + cardflip_cursor 13, 9, 0, 4, .SingleTile + cardflip_cursor 15, 9, 0, 4, .SingleTile + cardflip_cursor 17, 9, 0, 4, .SingleTile + cardflip_cursor 19, 9, 0, 4, .SingleTile + + cardflip_cursor 11, 11, .NumGroupPair + cardflip_cursor 12, 11, .NumGroup + cardflip_cursor 13, 11, .SingleTile + cardflip_cursor 15, 11, .SingleTile + cardflip_cursor 17, 11, .SingleTile + cardflip_cursor 19, 11, .SingleTile + + cardflip_cursor 11, 11, .NumGroupPair + cardflip_cursor 12, 12, 0, 4, .NumGroup + cardflip_cursor 13, 12, 0, 4, .SingleTile + cardflip_cursor 15, 12, 0, 4, .SingleTile + cardflip_cursor 17, 12, 0, 4, .SingleTile + cardflip_cursor 19, 12, 0, 4, .SingleTile +; e0a41 + +.SingleTile: ; e0a41 + db 6 + dsprite 0, 0, -1, 7, $00, 0 | PRIORITY + dsprite 0, 0, 0, 0, $02, 0 | PRIORITY + dsprite 0, 0, 1, 0, $03, 0 | PRIORITY + dsprite 0, 5, -1, 7, $00, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 0, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 1, 0, $03, 0 | PRIORITY + +.PokeGroup: ; e0a5a + db 26 + dsprite 0, 0, -1, 7, $00, 0 | PRIORITY + dsprite 0, 0, 0, 0, $02, 0 | PRIORITY + dsprite 0, 0, 1, 0, $00, 0 | X_FLIP | PRIORITY + dsprite 1, 0, -1, 7, $01, 0 | PRIORITY + dsprite 1, 0, 1, 0, $01, 0 | X_FLIP | PRIORITY + dsprite 2, 0, -1, 7, $01, 0 | PRIORITY + dsprite 2, 0, 1, 0, $03, 0 | PRIORITY + dsprite 3, 0, -1, 7, $01, 0 | PRIORITY + dsprite 3, 0, 1, 0, $03, 0 | PRIORITY + dsprite 4, 0, -1, 7, $01, 0 | PRIORITY + dsprite 4, 0, 1, 0, $03, 0 | PRIORITY + dsprite 5, 0, -1, 7, $01, 0 | PRIORITY + dsprite 5, 0, 1, 0, $03, 0 | PRIORITY + dsprite 6, 0, -1, 7, $01, 0 | PRIORITY + dsprite 6, 0, 1, 0, $03, 0 | PRIORITY + dsprite 7, 0, -1, 7, $01, 0 | PRIORITY + dsprite 7, 0, 1, 0, $03, 0 | PRIORITY + dsprite 8, 0, -1, 7, $01, 0 | PRIORITY + dsprite 8, 0, 1, 0, $03, 0 | PRIORITY + dsprite 9, 0, -1, 7, $01, 0 | PRIORITY + dsprite 9, 0, 1, 0, $03, 0 | PRIORITY + dsprite 10, 0, -1, 7, $01, 0 | PRIORITY + dsprite 10, 0, 1, 0, $03, 0 | PRIORITY + dsprite 10, 1, -1, 7, $00, 0 | Y_FLIP | PRIORITY + dsprite 10, 1, 0, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 10, 1, 1, 0, $03, 0 | PRIORITY + +.NumGroup: ; e0ac3 + db 20 + dsprite 0, 0, -1, 7, $00, 0 | PRIORITY + dsprite 0, 0, 0, 0, $02, 0 | PRIORITY + dsprite 0, 0, 1, 0, $02, 0 | PRIORITY + dsprite 0, 0, 2, 0, $03, 0 | PRIORITY + dsprite 0, 0, 3, 0, $02, 0 | PRIORITY + dsprite 0, 0, 4, 0, $03, 0 | PRIORITY + dsprite 0, 0, 5, 0, $02, 0 | PRIORITY + dsprite 0, 0, 6, 0, $03, 0 | PRIORITY + dsprite 0, 0, 7, 0, $02, 0 | PRIORITY + dsprite 0, 0, 8, 0, $03, 0 | PRIORITY + dsprite 0, 5, -1, 7, $00, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 0, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 1, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 2, 0, $03, 0 | PRIORITY + dsprite 0, 5, 3, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 4, 0, $03, 0 | PRIORITY + dsprite 0, 5, 5, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 6, 0, $03, 0 | PRIORITY + dsprite 0, 5, 7, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 0, 5, 8, 0, $03, 0 | PRIORITY + +.NumGroupPair: ; e0b14 + db 30 + dsprite 0, 0, 0, 0, $00, 0 | PRIORITY + dsprite 0, 0, 1, 0, $02, 0 | PRIORITY + dsprite 0, 0, 2, 0, $02, 0 | PRIORITY + dsprite 0, 0, 3, 0, $03, 0 | PRIORITY + dsprite 0, 0, 4, 0, $02, 0 | PRIORITY + dsprite 0, 0, 5, 0, $03, 0 | PRIORITY + dsprite 0, 0, 6, 0, $02, 0 | PRIORITY + dsprite 0, 0, 7, 0, $03, 0 | PRIORITY + dsprite 0, 0, 8, 0, $02, 0 | PRIORITY + dsprite 0, 0, 9, 0, $03, 0 | PRIORITY + dsprite 1, 0, 0, 0, $01, 0 | PRIORITY + dsprite 1, 0, 3, 0, $03, 0 | PRIORITY + dsprite 1, 0, 5, 0, $03, 0 | PRIORITY + dsprite 1, 0, 7, 0, $03, 0 | PRIORITY + dsprite 1, 0, 9, 0, $03, 0 | PRIORITY + dsprite 2, 0, 0, 0, $01, 0 | PRIORITY + dsprite 2, 0, 3, 0, $03, 0 | PRIORITY + dsprite 2, 0, 5, 0, $03, 0 | PRIORITY + dsprite 2, 0, 7, 0, $03, 0 | PRIORITY + dsprite 2, 0, 9, 0, $03, 0 | PRIORITY + dsprite 2, 1, 0, 0, $00, 0 | Y_FLIP | PRIORITY + dsprite 2, 1, 1, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 2, 1, 2, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 2, 1, 3, 0, $03, 0 | PRIORITY + dsprite 2, 1, 4, 0, $03, 0 | PRIORITY + dsprite 2, 1, 5, 0, $03, 0 | PRIORITY + dsprite 2, 1, 6, 0, $03, 0 | PRIORITY + dsprite 2, 1, 7, 0, $03, 0 | PRIORITY + dsprite 2, 1, 8, 0, $03, 0 | PRIORITY + dsprite 2, 1, 9, 0, $03, 0 | PRIORITY + +.PokeGroupPair: ; e0b8d + db 38 + dsprite 0, 0, -1, 7, $00, 0 | PRIORITY + dsprite 0, 0, 3, 0, $00, 0 | X_FLIP | PRIORITY + dsprite 1, 0, -1, 7, $01, 0 | PRIORITY + dsprite 1, 0, 3, 0, $01, 0 | X_FLIP | PRIORITY + dsprite 2, 0, -1, 7, $01, 0 | PRIORITY + dsprite 2, 0, 3, 0, $01, 0 | X_FLIP | PRIORITY + dsprite 3, 0, -1, 7, $01, 0 | PRIORITY + dsprite 3, 0, 1, 0, $03, 0 | PRIORITY + dsprite 3, 0, 3, 0, $03, 0 | PRIORITY + dsprite 4, 0, -1, 7, $01, 0 | PRIORITY + dsprite 4, 0, 1, 0, $03, 0 | PRIORITY + dsprite 4, 0, 3, 0, $03, 0 | PRIORITY + dsprite 5, 0, -1, 7, $01, 0 | PRIORITY + dsprite 5, 0, 1, 0, $03, 0 | PRIORITY + dsprite 5, 0, 3, 0, $03, 0 | PRIORITY + dsprite 6, 0, -1, 7, $01, 0 | PRIORITY + dsprite 6, 0, 1, 0, $03, 0 | PRIORITY + dsprite 6, 0, 3, 0, $03, 0 | PRIORITY + dsprite 7, 0, -1, 7, $01, 0 | PRIORITY + dsprite 7, 0, 1, 0, $03, 0 | PRIORITY + dsprite 7, 0, 3, 0, $03, 0 | PRIORITY + dsprite 8, 0, -1, 7, $01, 0 | PRIORITY + dsprite 8, 0, 1, 0, $03, 0 | PRIORITY + dsprite 8, 0, 3, 0, $03, 0 | PRIORITY + dsprite 9, 0, -1, 7, $01, 0 | PRIORITY + dsprite 9, 0, 1, 0, $03, 0 | PRIORITY + dsprite 9, 0, 3, 0, $03, 0 | PRIORITY + dsprite 10, 0, -1, 7, $01, 0 | PRIORITY + dsprite 10, 0, 1, 0, $03, 0 | PRIORITY + dsprite 10, 0, 3, 0, $03, 0 | PRIORITY + dsprite 11, 0, -1, 7, $01, 0 | PRIORITY + dsprite 11, 0, 1, 0, $03, 0 | PRIORITY + dsprite 11, 0, 3, 0, $03, 0 | PRIORITY + dsprite 11, 1, -1, 7, $00, 0 | Y_FLIP | PRIORITY + dsprite 11, 1, 0, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 11, 1, 1, 0, $03, 0 | Y_FLIP | PRIORITY + dsprite 11, 1, 2, 0, $02, 0 | Y_FLIP | PRIORITY + dsprite 11, 1, 3, 0, $03, 0 | X_FLIP | Y_FLIP | PRIORITY + +.Impossible: ; e0c26 + db 4 + dsprite 0, 0, 0, 0, $00, 0 | PRIORITY + dsprite 0, 0, 1, 0, $00, 0 | X_FLIP | PRIORITY + dsprite 1, 0, 0, 0, $00, 0 | Y_FLIP | PRIORITY + dsprite 1, 0, 1, 0, $00, 0 | X_FLIP | Y_FLIP | PRIORITY +; e0c37 + +CardFlip_InitAttrPals: ; e0c37 (38:4c37) + ld a, [hCGB] + and a + ret z + + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + + hlcoord 12, 1, wAttrMap + lb bc, 2, 2 + ld a, $1 + call CardFlip_FillBox + + hlcoord 14, 1, wAttrMap + lb bc, 2, 2 + ld a, $2 + call CardFlip_FillBox + + hlcoord 16, 1, wAttrMap + lb bc, 2, 2 + ld a, $3 + call CardFlip_FillBox + + hlcoord 18, 1, wAttrMap + lb bc, 2, 2 + ld a, $4 + call CardFlip_FillBox + + hlcoord 9, 0, wAttrMap + lb bc, 12, 1 + ld a, $1 + call CardFlip_FillBox + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, .palettes + ld de, wBGPals1 + ld bc, 9 palettes + call CopyBytes + pop af + ld [rSVBK], a + ret +; e0c93 (38:4c93) + +.palettes ; e0c93 +INCLUDE "gfx/card_flip/card_flip.pal" +; e0cdb + +CardFlipLZ03: ; e0cdb +INCBIN "gfx/card_flip/card_flip_3.2bpp.lz" + +CardFlipOffButtonGFX: ; e0cf6 +INCBIN "gfx/card_flip/off.2bpp" + +CardFlipOnButtonGFX: ; e0d06 +INCBIN "gfx/card_flip/on.2bpp" + +CardFlipLZ01: ; e0d16 +INCBIN "gfx/card_flip/card_flip_1.2bpp.lz" + +CardFlipLZ02: ; e0ea8 +INCBIN "gfx/card_flip/card_flip_2.2bpp.lz" + +CardFlipTilemap: ; e110c +INCBIN "gfx/card_flip/card_flip.tilemap" +; e1190 diff --git a/engine/games/dummy_game.asm b/engine/games/dummy_game.asm new file mode 100755 index 000000000..6d7e12196 --- /dev/null +++ b/engine/games/dummy_game.asm @@ -0,0 +1,612 @@ +_DummyGame: ; e1e5b (38:5e5b) + call .LoadGFXAndPals + call DelayFrame +.loop + call .JumptableLoop + jr nc, .loop + ret + +.LoadGFXAndPals: + call DisableLCD + ld b, SCGB_DIPLOMA + call GetSGBLayout + callfar ClearSpriteAnims + ld hl, LZ_e2221 + ld de, vTiles2 tile $00 + call Decompress + ld hl, Unknown_e00ed + ld de, vTiles0 tile $00 + ld bc, 4 tiles + ld a, BANK(Unknown_e00ed) + call FarCopyBytes + ld a, $8 + ld hl, wc300 + ld [hli], a + ld [hl], $0 + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + xor a + ld [hSCY], a + ld [hSCX], a + ld [rWY], a + ld [wJumptableIndex], a + ld a, $1 + ld [hBGMapMode], a + ld a, LCDC_DEFAULT + ld [rLCDC], a + ld a, $e4 + call DmgToCgbBGPals + ld a, $e0 + call DmgToCgbObjPal0 + ret + +.JumptableLoop: + ld a, [wJumptableIndex] + bit 7, a + jr nz, .quit + call .ExecuteJumptable + callfar PlaySpriteAnimations + call DelayFrame + and a + ret + +.quit + scf + ret + +.ExecuteJumptable: + jumptable .Jumptable, wJumptableIndex + +.Jumptable: + dw .RestartGame + dw .ResetBoard + dw .InitBoardTilemapAndCursorObject + dw .CheckTriesRemaining + dw .PickCard1 + dw .PickCard2 + dw .DelayPickAgain + dw .RevealAll + dw .AskPlayAgain + +.RestartGame: + call DummyGame_InitStrings + ld hl, wJumptableIndex + inc [hl] + ret + +.ResetBoard: + call ret_e00ed + jr nc, .proceed + ld hl, wJumptableIndex + set 7, [hl] + ret + +.proceed + call DummyGame_InitBoard + ld hl, wJumptableIndex + inc [hl] + xor a + ld [wDummyGameCounter], a + ld hl, wDummyGameLastMatches +rept 4 + ld [hli], a +endr + ld [hl], a + ld [wDummyGameNumCardsMatched], a +.InitBoardTilemapAndCursorObject: + ld hl, wDummyGameCounter + ld a, [hl] + cp 45 + jr nc, .spawn_object + inc [hl] + call DummyGame_Card2Coord + xor a + ld [wDummyGameLastCardPicked], a + call DummyGame_PlaceCard + ret + +.spawn_object + depixel 6, 3, 4, 4 + ld a, SPRITE_ANIM_INDEX_DUMMY_GAME + call _InitSpriteAnimStruct + ld a, 5 + ld [wDummyGameNumberTriesRemaining], a + ld hl, wJumptableIndex + inc [hl] + ret + +.CheckTriesRemaining: + ld a, [wDummyGameNumberTriesRemaining] + hlcoord 17, 0 + add "0" + ld [hl], a + ld hl, wDummyGameNumberTriesRemaining + ld a, [hl] + and a + jr nz, .next_try + ld a, $7 + ld [wJumptableIndex], a + ret + +.next_try + dec [hl] + xor a + ld [wcf64], a + ld hl, wJumptableIndex + inc [hl] +.PickCard1: + ld a, [wcf64] + and a + ret z + dec a + ld e, a + ld d, 0 + ld hl, wDummyGameCards + add hl, de + ld a, [hl] + cp -1 + ret z + ld [wDummyGameLastCardPicked], a + ld [wDummyGameCard1], a + ld a, e + ld [wDummyGameCard1Location], a + call DummyGame_Card2Coord + call DummyGame_PlaceCard + xor a + ld [wcf64], a + ld hl, wJumptableIndex + inc [hl] + ret + +.PickCard2: + ld a, [wcf64] + and a + ret z + dec a + ld hl, wDummyGameCard1Location + cp [hl] + ret z + ld e, a + ld d, 0 + ld hl, wDummyGameCards + add hl, de + ld a, [hl] + cp -1 + ret z + ld [wDummyGameLastCardPicked], a + ld [wDummyGameCard2], a + ld a, e + ld [wDummyGameCard2Location], a + call DummyGame_Card2Coord + call DummyGame_PlaceCard + ld a, 64 + ld [wDummyGameCounter], a + ld hl, wJumptableIndex + inc [hl] +.DelayPickAgain: + ld hl, wDummyGameCounter + ld a, [hl] + and a + jr z, .PickAgain + dec [hl] + ret + +.PickAgain: + call DummyGame_CheckMatch + ld a, $3 + ld [wJumptableIndex], a + ret + +.RevealAll: + ld a, [hJoypadPressed] + and A_BUTTON + ret z + xor a + ld [wDummyGameCounter], a +.RevelationLoop: + ld hl, wDummyGameCounter + ld a, [hl] + cp 45 + jr nc, .finish_round + inc [hl] + push af + call DummyGame_Card2Coord + pop af + push hl + ld e, a + ld d, $0 + ld hl, wDummyGameCards + add hl, de + ld a, [hl] + pop hl + cp -1 + jr z, .RevelationLoop + ld [wDummyGameLastCardPicked], a + call DummyGame_PlaceCard + jr .RevelationLoop + +.finish_round + call WaitPressAorB_BlinkCursor + ld hl, wJumptableIndex + inc [hl] +.AskPlayAgain: + call ret_e00ed + jr nc, .restart + ld hl, wJumptableIndex + set 7, [hl] + ret + +.restart + xor a + ld [wJumptableIndex], a + ret + +; e2010 + +DummyGame_CheckMatch: ; e2010 + ld hl, wDummyGameCard1 + ld a, [hli] + cp [hl] + jr nz, .no_match + + ld a, [wDummyGameCard1Location] + call DummyGame_Card2Coord + call DummyGame_DeleteCard + + ld a, [wDummyGameCard2Location] + call DummyGame_Card2Coord + call DummyGame_DeleteCard + + ld a, [wDummyGameCard1Location] + ld e, a + ld d, $0 + ld hl, wDummyGameCards + add hl, de + ld [hl], -1 + + ld a, [wDummyGameCard2Location] + ld e, a + ld d, 0 + ld hl, wDummyGameCards + add hl, de + ld [hl], -1 + + ld hl, wDummyGameLastMatches +.find_empty_slot + ld a, [hli] + and a + jr nz, .find_empty_slot + dec hl + ld a, [wDummyGameCard1] + ld [hl], a + ld [wDummyGameLastCardPicked], a + ld hl, wDummyGameNumCardsMatched + ld e, [hl] + inc [hl] + inc [hl] + ld d, 0 + hlcoord 5, 0 + add hl, de + call DummyGame_PlaceCard + ld hl, .VictoryText + call PrintText + ret + +.no_match + xor a + ld [wDummyGameLastCardPicked], a + + ld a, [wDummyGameCard1Location] + call DummyGame_Card2Coord + call DummyGame_PlaceCard + + ld a, [wDummyGameCard2Location] + call DummyGame_Card2Coord + call DummyGame_PlaceCard + + ld hl, DummyGameText_Darn + call PrintText + ret + +.VictoryText: + start_asm + push bc + hlcoord 2, 13 + call DummyGame_PlaceCard + ld hl, DummyGameText_Yeah + pop bc + inc bc + inc bc + inc bc + ret + +; e2093 + +DummyGameText_Yeah: ; 0xe2093 + ; , yeah! + text_jump UnknownText_0x1c1a5b + db "@" +; 0xe2098 + +DummyGameText_Darn: ; 0xe2098 + ; Darn… + text_jump UnknownText_0x1c1a65 + db "@" +; 0xe209d + +DummyGame_InitBoard: ; e209d + ld hl, wDummyGameCards + ld bc, wDummyGameCardsEnd - wDummyGameCards + xor a + call ByteFill + call DummyGame_GetDistributionOfTiles + + ld c, 2 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 8 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 4 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 7 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 3 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 6 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 1 + ld b, [hl] + call DummyGame_SampleTilePlacement + + ld c, 5 + ld hl, wDummyGameCards + ld b, wDummyGameCardsEnd - wDummyGameCards +.loop + ld a, [hl] + and a + jr nz, .no_load + ld [hl], c +.no_load + inc hl + dec b + jr nz, .loop + ret + +; e20e5 + +DummyGame_SampleTilePlacement: ; e20e5 + push hl + ld de, wDummyGameCards +.loop + call Random + and %00111111 + cp 45 + jr nc, .loop + ld l, a + ld h, 0 + add hl, de + ld a, [hl] + and a + jr nz, .loop + ld [hl], c + dec b + jr nz, .loop + pop hl + inc hl + ret + +; e2101 + +DummyGame_GetDistributionOfTiles: ; e2101 + ld a, [wMenuCursorY] + dec a + ld l, a + ld h, 0 + add hl, hl + add hl, hl + add hl, hl + ld de, .distributions + add hl, de + ret + +.distributions + db $02, $03, $06, $06, $06, $08, $08, $06 + db $02, $02, $04, $06, $06, $08, $08, $09 + db $02, $02, $02, $04, $07, $08, $08, $0c +; e2128 + +DummyGame_PlaceCard: ; e2128 + ld a, [wDummyGameLastCardPicked] + sla a + sla a + add 4 + ld [hli], a + inc a + ld [hld], a + inc a + ld bc, SCREEN_WIDTH + add hl, bc + ld [hli], a + inc a + ld [hl], a + ld c, 3 + call DelayFrames + ret + +; e2142 + +DummyGame_DeleteCard: ; e2142 + ld a, $1 + ld [hli], a + ld [hld], a + ld bc, SCREEN_WIDTH + add hl, bc + ld [hli], a + ld [hl], a + ld c, 3 + call DelayFrames + ret + +; e2152 + +DummyGame_InitStrings: ; e2152 + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $1 + call ByteFill + hlcoord 0, 0 + ld de, .japstr1 + call PlaceString + hlcoord 15, 0 + ld de, .japstr2 + call PlaceString + ld hl, .dummy_text + call PrintText + ret + +.dummy_text + db "@" +.japstr1 + db "とったもの@" +.japstr2 + db "あと かい@" +; e2183 + +DummyGame_Card2Coord: ; e2183 + ld d, 0 +.find_row + sub 9 + jr c, .found_row + inc d + jr .find_row + +.found_row + add 9 + ld e, a + hlcoord 1, 2 + ld bc, 2 * SCREEN_WIDTH +.loop2 + ld a, d + and a + jr z, .done + add hl, bc + dec d + jr .loop2 + +.done + sla e + add hl, de + ret + +; e21a1 + +DummyGame_InterpretJoypad_AnimateCursor: ; e21a1 (38:61a1) + ld a, [wJumptableIndex] + cp $7 + jr nc, .quit + call JoyTextDelay + ld hl, hJoypadPressed ; $ffa3 + ld a, [hl] + and A_BUTTON + jr nz, .pressed_a + ld a, [hl] + and D_LEFT + jr nz, .pressed_left + ld a, [hl] + and D_RIGHT + jr nz, .pressed_right + ld a, [hl] + and D_UP + jr nz, .pressed_up + ld a, [hl] + and D_DOWN + jr nz, .pressed_down + ret + +.quit + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +.pressed_a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + inc a + ld [wcf64], a + ret + +.pressed_left + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + and a + ret z + sub 1 tiles + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + dec [hl] + ret + +.pressed_right + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + cp (9 - 1) tiles + ret z + add 1 tiles + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + inc [hl] + ret + +.pressed_up + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + and a + ret z + sub 1 tiles + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + sub 9 + ld [hl], a + ret + +.pressed_down + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + cp (5 - 1) tiles + ret z + add 1 tiles + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + add 9 + ld [hl], a + ret + +; e2221 (38:6221) + +LZ_e2221: ; e2221 +INCBIN "gfx/dummy_game/dummy_game.2bpp.lz" diff --git a/engine/games/slot_machine.asm b/engine/games/slot_machine.asm new file mode 100755 index 000000000..924c78924 --- /dev/null +++ b/engine/games/slot_machine.asm @@ -0,0 +1,2352 @@ +SLOTS_NO_BIAS EQU -1 +SLOTS_NO_MATCH EQU -1 + +SLOTS_SEVEN EQU $00 +SLOTS_POKEBALL EQU $04 +SLOTS_CHERRY EQU $08 +SLOTS_PIKACHU EQU $0c +SLOTS_SQUIRTLE EQU $10 +SLOTS_STARYU EQU $14 + +REEL_SIZE EQU 15 + +; Constants for slot_reel offsets (see macros/wram.asm) +REEL_ACTION EQUS "(wReel1ReelAction - wReel1)" +REEL_TILEMAP_ADDR EQUS "(wReel1TilemapAddr - wReel1)" +REEL_POSITION EQUS "(wReel1Position - wReel1)" +REEL_SPIN_DISTANCE EQUS "(wReel1SpinDistance - wReel1)" +REEL_SPIN_RATE EQUS "(wReel1SpinRate - wReel1)" +REEL_OAM_ADDR EQUS "(wReel1OAMAddr - wReel1)" +REEL_X_COORD EQUS "(wReel1XCoord - wReel1)" +REEL_MANIP_COUNTER EQUS "(wReel1ManipCounter - wReel1)" +REEL_MANIP_DELAY EQUS "(wReel1ManipDelay - wReel1)" +REEL_FIELD_0B EQUS "(wReel1Field0b - wReel1)" +REEL_STOP_DELAY EQUS "(wReel1StopDelay - wReel1)" + +; SlotsJumptable constants + const_def + const SLOTS_INIT + const SLOTS_BET_AND_START + const SLOTS_WAIT_START + const SLOTS_WAIT_REEL1 + const SLOTS_WAIT_STOP_REEL1 + const SLOTS_WAIT_REEL2 + const SLOTS_WAIT_STOP_REEL2 + const SLOTS_WAIT_REEL3 + const SLOTS_WAIT_STOP_REEL3 + const SLOTS_NEXT_09 + const SLOTS_NEXT_0A + const SLOTS_NEXT_0B + const SLOTS_FLASH_IF_WIN + const SLOTS_FLASH_SCREEN + const SLOTS_GIVE_EARNED_COINS + const SLOTS_PAYOUT_TEXT_AND_ANIM + const SLOTS_PAYOUT_ANIM + const SLOTS_RESTART_OF_QUIT + const SLOTS_QUIT +SLOTS_END_LOOP_F EQU 7 + +; ReelActionJumptable constants + const_def + const REEL_ACTION_DO_NOTHING + const REEL_ACTION_STOP_REEL_IGNORE_JOYPAD + const REEL_ACTION_QUADRUPLE_RATE + const REEL_ACTION_DOUBLE_RATE + const REEL_ACTION_NORMAL_RATE + const REEL_ACTION_HALF_RATE + const REEL_ACTION_QUARTER_RATE + const REEL_ACTION_STOP_REEL1 + const REEL_ACTION_STOP_REEL2 + const REEL_ACTION_STOP_REEL3 + const REEL_ACTION_SET_UP_REEL2_SKIP_TO_7 + const REEL_ACTION_WAIT_REEL2_SKIP_TO_7 + const REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S + const REEL_ACTION_UNUSED + const REEL_ACTION_CHECK_DROP_REEL + const REEL_ACTION_WAIT_DROP_REEL + const REEL_ACTION_START_SLOW_ADVANCE_REEL3 + const REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3 + const REEL_ACTION_INIT_GOLEM + const REEL_ACTION_WAIT_GOLEM + const REEL_ACTION_END_GOLEM + const REEL_ACTION_INIT_CHANSEY + const REEL_ACTION_WAIT_CHANSEY + const REEL_ACTION_WAIT_EGG + const REEL_ACTION_DROP_REEL + +_SlotMachine: + ld hl, wOptions + set NO_TEXT_SCROLL, [hl] + call .InitGFX + call DelayFrame +.loop + call SlotsLoop + jr nc, .loop + call WaitSFX + ld de, SFX_QUIT_SLOTS + call PlaySFX + call WaitSFX + call ClearBGPalettes + farcall StubbedTrainerRankings_EndSlotsWinStreak + ld hl, wOptions + res NO_TEXT_SCROLL, [hl] + ld hl, rLCDC + res rLCDC_SPRITE_SIZE, [hl] ; 8x8 + ret + +.InitGFX: ; 926f7 (24:66f7) + call ClearBGPalettes + call ClearTileMap + call ClearSprites + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + call DisableLCD + hlbgcoord 0, 0 + ld bc, vBGMap1 - vBGMap0 + ld a, " " + call ByteFill + ld b, SCGB_SLOT_MACHINE + call GetSGBLayout + callfar ClearSpriteAnims + ld hl, wSlots + ld bc, wSlotsDataEnd - wSlots + xor a + call ByteFill + + ld hl, Slots2LZ + ld de, vTiles0 tile $00 + call Decompress + + ld hl, Slots3LZ + ld de, vTiles0 tile $40 + call Decompress + + ld hl, Slots1LZ + ld de, vTiles2 tile $00 + call Decompress + + ld hl, Slots2LZ + ld de, vTiles2 tile $25 + call Decompress + + ld hl, SlotsTilemap + decoord 0, 0 + ld bc, SCREEN_WIDTH * 12 + call CopyBytes + + ld hl, rLCDC + set rLCDC_SPRITE_SIZE, [hl] ; 8x16 + call EnableLCD + ld hl, wSlots + ld bc, wSlotsEnd - wSlots + xor a + call ByteFill + call Slots_InitReelTiles + call Slots_GetPals + ld a, $7 + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], $40 + xor a ; SLOTS_INIT + ld [wJumptableIndex], a + ld a, SLOTS_NO_BIAS + ld [wSlotBias], a + ld de, MUSIC_GAME_CORNER + call PlayMusic + xor a + ld [wKeepSevenBiasChance], a ; 87.5% chance + call Random + and %00101010 + ret nz + ld a, 1 + ld [wKeepSevenBiasChance], a ; 12.5% chance + ret + +Slots_GetPals: ; 9279b (24:679b) + ld a, %11100100 + call DmgToCgbBGPals + lb de, %11100100, %11100100 + ld a, [hCGB] + and a + jr nz, .cgb + lb de, %11000000, %11100100 +.cgb + call DmgToCgbObjPals + ret + +SlotsLoop: ; 927af (24:67af) + ld a, [wJumptableIndex] + bit SLOTS_END_LOOP_F, a + jr nz, .stop + call SlotsJumptable + call Slots_SpinReels + xor a + ld [wCurrSpriteOAMAddr], a + callfar DoNextFrameForFirst16Sprites + call .PrintCoinsAndPayout + call .Stubbed_Function927d3 + call DelayFrame + and a + ret + +.stop + scf + ret + +.Stubbed_Function927d3: ; 927d3 (24:67d3) +; dummied out + ret + ld a, [wReel1ReelAction] + and a + ret nz + ld a, [wReel2ReelAction] + and a + ret nz + ld a, [wFirstTwoReelsMatchingSevens] + and a + jr nz, .matching_sevens + ld a, %11100100 + call DmgToCgbBGPals + ret + +.matching_sevens + ld a, [wTextDelayFrames] + and $7 + ret nz + ld a, [rBGP] + xor %00001100 + call DmgToCgbBGPals + ret + +; 927f8 + +.PrintCoinsAndPayout: ; 927f8 (24:67f8) + hlcoord 5, 1 + ld de, wCoins + lb bc, PRINTNUM_LEADINGZEROS | 2, 4 + call PrintNum + hlcoord 11, 1 + ld de, wPayout + lb bc, PRINTNUM_LEADINGZEROS | 2, 4 + call PrintNum + ret + +; 92811 (24:6811) + +Unreferenced_Function92811: ; 92811 +; debug function? + ld a, [wSlotBias] + add 0 + daa + ld e, a + and $f + add "0" + hlcoord 1, 0 + ld [hl], a + ld a, e + swap a + and $f + add "0" + hlcoord 0, 0 + ld [hl], a + ret + +; 9282c + +Unreferenced_Function9282c: ; 9282c +; animate OAM tiles? + ld hl, wcf66 + ld a, [hl] + inc [hl] + and $7 + ret nz + ld hl, wVirtualOAMSprite16TileID + ld c, NUM_SPRITE_OAM_STRUCTS - 16 +.loop + ld a, [hl] + xor %00100000 + ld [hli], a ; tile id +rept SPRITEOAMSTRUCT_LENGTH + -1 + inc hl +endr + dec c + jr nz, .loop + ret + +; 92844 + +SlotsJumptable: ; 92844 (24:6844) + jumptable .Jumptable, wJumptableIndex + +.Jumptable: + dw SlotsAction_Init ; 00 + dw SlotsAction_BetAndStart ; 01 + dw SlotsAction_WaitStart ; 02 + dw SlotsAction_WaitReel1 ; 03 + dw SlotsAction_WaitStopReel1 ; 04 + dw SlotsAction_WaitReel2 ; 05 + dw SlotsAction_WaitStopReel2 ; 06 + dw SlotsAction_WaitReel3 ; 07 + dw SlotsAction_WaitStopReel3 ; 08 + dw SlotsAction_Next ; 09 + dw SlotsAction_Next ; 0a + dw SlotsAction_Next ; 0b + dw SlotsAction_FlashIfWin ; 0c + dw SlotsAction_FlashScreen ; 0d + dw SlotsAction_GiveEarnedCoins ; 0e + dw SlotsAction_PayoutTextAndAnim ; 0f + dw SlotsAction_PayoutAnim ; 10 + dw SlotsAction_RestartOrQuit ; 11 + dw SlotsAction_Quit ; 12 + +SlotsAction_Next: ; 92879 (24:6879) + ld hl, wJumptableIndex + inc [hl] + ret + +SlotsAction_Init: ; 9287e (24:687e) + call SlotsAction_Next + xor a + ld [wFirstTwoReelsMatching], a + ld [wFirstTwoReelsMatchingSevens], a + ld a, SLOTS_NO_MATCH + ld [wSlotMatched], a + ret + +SlotsAction_BetAndStart: ; 9288e (24:688e) + call Slots_AskBet + jr nc, .proceed + ld a, SLOTS_QUIT + ld [wJumptableIndex], a + ret + +.proceed + call SlotsAction_Next + call Slots_IlluminateBetLights + call Slots_InitBias + ld a, 32 + ld [wSlotsDelay], a + ld a, REEL_ACTION_NORMAL_RATE + ld [wReel1ReelAction], a + ld [wReel2ReelAction], a + ld [wReel3ReelAction], a + ld a, 4 + ld [wReel1ManipCounter], a + ld [wReel2ManipCounter], a + ld [wReel3ManipCounter], a + call WaitSFX + ld a, SFX_SLOT_MACHINE_START + call Slots_PlaySFX + ret + +SlotsAction_WaitStart: ; 928c6 (24:68c6) + ld hl, wSlotsDelay + ld a, [hl] + and a + jr z, .proceed + dec [hl] + ret + +.proceed + call SlotsAction_Next + xor a + ld [hJoypadSum], a + ret + +SlotsAction_WaitReel1: ; 928d6 (24:68d6) + ld hl, hJoypadSum + ld a, [hl] + and A_BUTTON + ret z + call SlotsAction_Next + call Slots_StopReel1 + ld [wReel1ReelAction], a +SlotsAction_WaitStopReel1: ; 928e6 (24:68e6) + ld a, [wReel1ReelAction] + cp REEL_ACTION_DO_NOTHING + ret nz + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + ld bc, wReel1 + ld de, wReel1Stopped + call Slots_LoadReelState + call SlotsAction_Next + xor a + ld [hJoypadSum], a +SlotsAction_WaitReel2: ; 92900 (24:6900) + ld hl, hJoypadSum + ld a, [hl] + and A_BUTTON + ret z + call SlotsAction_Next + call Slots_StopReel2 + ld [wReel2ReelAction], a +SlotsAction_WaitStopReel2: ; 92910 (24:6910) + ld a, [wReel2ReelAction] + cp REEL_ACTION_DO_NOTHING + ret nz + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + ld bc, wReel2 + ld de, wReel2Stopped + call Slots_LoadReelState + call SlotsAction_Next + xor a + ld [hJoypadSum], a +SlotsAction_WaitReel3: ; 9292a (24:692a) + ld hl, hJoypadSum + ld a, [hl] + and A_BUTTON + ret z + call SlotsAction_Next + call Slots_StopReel3 + ld [wReel3ReelAction], a +SlotsAction_WaitStopReel3: ; 9293a (24:693a) + ld a, [wReel3ReelAction] + cp REEL_ACTION_DO_NOTHING + ret nz + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + ld bc, wReel3 + ld de, wReel3Stopped + call Slots_LoadReelState + call SlotsAction_Next + xor a + ld [hJoypadSum], a + ret + +SlotsAction_FlashIfWin: ; 92955 (24:6955) + ld a, [wSlotMatched] + cp SLOTS_NO_MATCH + jr nz, .GotIt + call SlotsAction_Next + call SlotsAction_Next + ret + +.GotIt: + call SlotsAction_Next + ld a, 16 + ld [wSlotsDelay], a +SlotsAction_FlashScreen: ; 9296b (24:696b) + ld hl, wSlotsDelay + ld a, [hl] + and a + jr z, .done + dec [hl] + srl a + ret z + + ld a, [rOBP0] + xor $ff + ld e, a + ld d, a + call DmgToCgbObjPals + ret + +.done + call Slots_GetPals + call SlotsAction_Next + ret + +SlotsAction_GiveEarnedCoins: ; 92987 (24:6987) + xor a + ld [wFirstTwoReelsMatching], a + ld [wFirstTwoReelsMatchingSevens], a + ld a, %11100100 + call DmgToCgbBGPals + call Slots_GetPayout + xor a + ld [wSlotsDelay], a + call SlotsAction_Next + ret + +SlotsAction_PayoutTextAndAnim: ; 9299e (24:699e) + call Slots_PayoutText + call SlotsAction_Next +SlotsAction_PayoutAnim: ; 929a4 (24:69a4) + ld hl, wSlotsDelay + ld a, [hl] + inc [hl] + and $1 + ret z + ld hl, wPayout + ld a, [hli] + ld d, a + or [hl] + jr z, .done + ld e, [hl] + dec de + ld [hl], e + dec hl + ld [hl], d + ld hl, wCoins + ld d, [hl] + inc hl + ld e, [hl] + call Slots_CheckCoinCaseFull + jr c, .okay + inc de +.okay + ld [hl], e + dec hl + ld [hl], d + ld a, [wSlotsDelay] + and $7 + ret z ; ret nz would be more appropriate + ld de, SFX_GET_COIN_FROM_SLOTS + call PlaySFX + ret + +.done + call SlotsAction_Next + ret + +SlotsAction_RestartOrQuit: ; 929d9 (24:69d9) + call Slots_DeilluminateBetLights + call WaitPressAorB_BlinkCursor + call Slots_AskPlayAgain + jr c, .exit_slots + ld a, SLOTS_INIT + ld [wJumptableIndex], a + ret + +.exit_slots + ld a, SLOTS_QUIT + ld [wJumptableIndex], a + ret + +SlotsAction_Quit: ; 929f0 (24:69f0) + ld hl, wJumptableIndex + set SLOTS_END_LOOP_F, [hl] + ret + +Slots_LoadReelState: ; 929f6 (24:69f6) + push de + call Slots_GetCurrentReelState + pop de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + ret + +Slots_CheckCoinCaseFull: ; 92a04 (24:6a04) + ld a, d + cp HIGH(MAX_COINS) + jr c, .not_full + ld a, e + cp LOW(MAX_COINS) + jr c, .not_full + scf + ret + +.not_full + and a + ret + +Slots_GetCurrentReelState: ; 92a12 (24:6a12) + ld hl, REEL_POSITION + add hl, bc + ld a, [hl] + and a + jr nz, .okay + ld a, $f +.okay + dec a + and $f + ld e, a + ld d, $0 + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ret + +Slots_StopReel1: ; 92a2b (24:6a2b) +; Always set the REEL_ACTION_STOP_REEL1 action. + ld a, REEL_ACTION_STOP_REEL1 + ret + +Slots_StopReel2: ; 92a2e (24:6a2e) +; As long as, the following three meet, there's a 31.25% chance +; to set action REEL_ACTION_SET_UP_REEL2_SKIP_TO_7: +; - Bet is >= 2 coins +; - There's a 7 symbol visible in reel #1 +; - Current spin isn't biased or is biased towards SEVEN +; In any other case, REEL_ACTION_STOP_REEL2 is set. + + ld a, [wSlotBet] + cp $2 + jr c, .dont_jump + ld a, [wSlotBias] + and a + jr z, .skip + cp SLOTS_NO_BIAS + jr nz, .dont_jump +.skip + call .CheckReel1ForASeven + jr nz, .dont_jump + call Random + cp $50 ; 32% + jr nc, .dont_jump + ld a, REEL_ACTION_SET_UP_REEL2_SKIP_TO_7 + ret + +.dont_jump + ld a, REEL_ACTION_STOP_REEL2 + ret + +.CheckReel1ForASeven: ; 92a51 (24:6a51) + ld a, [wReel1Stopped] + and a + ret z + ld a, [wReel1Stopped + 1] + and a + ret z + ld a, [wReel1Stopped + 2] + and a + ret + +Slots_StopReel3: ; 92a60 (24:6a60) +; If no matching SEVEN symbols in reels #1 and #2: +; - REEL_ACTION_STOP_REEL3, 100% + +; If matching SEVEN symbols and NO bias to SEVEN: +; - REEL_ACTION_STOP_REEL3, 37.5% +; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 31.3% +; - REEL_ACTION_INIT_GOLEM, 31.3% +; - REEL_ACTION_INIT_CHANSEY, 0% + +; If matching SEVEN symbols and bias to SEVEN: +; - REEL_ACTION_STOP_REEL3, 29.7% +; - REEL_ACTION_START_SLOW_ADVANCE_REEL3, 23.4% +; - REEL_ACTION_INIT_GOLEM, 23.4% +; - REEL_ACTION_INIT_CHANSEY, 23.4% + + ld a, [wFirstTwoReelsMatching] + and a + jr z, .stop + ld a, [wFirstTwoReelsMatchingSevens] + and a + jr z, .stop + ld a, [wSlotBias] + and a + jr nz, .biased + call Random + cp 180 + jr nc, .stop + cp 120 + jr nc, .slow_advance + cp 60 + jr nc, .golem + ld a, REEL_ACTION_INIT_CHANSEY + ret + +.biased + call Random + cp 160 + jr nc, .stop + cp 80 + jr nc, .slow_advance +.golem + ld a, REEL_ACTION_INIT_GOLEM + ret + +.slow_advance + ld a, REEL_ACTION_START_SLOW_ADVANCE_REEL3 + ret + +.stop + ld a, REEL_ACTION_STOP_REEL3 + ret + +Slots_InitReelTiles: ; 92a98 (24:6a98) + ld bc, wReel1 + ld hl, REEL_OAM_ADDR + add hl, bc + ld de, wVirtualOAMSprite16 + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld de, Reel1Tilemap + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_X_COORD + add hl, bc + ld [hl], 6 * 8 + call .OAM + + ld bc, wReel2 + ld hl, REEL_OAM_ADDR + add hl, bc + ld de, wVirtualOAMSprite24 + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld de, Reel2Tilemap + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_X_COORD + add hl, bc + ld [hl], 10 * 8 + call .OAM + + ld bc, wReel3 + ld hl, REEL_OAM_ADDR + add hl, bc + ld de, wVirtualOAMSprite32 + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld de, Reel3Tilemap + ld [hl], e + inc hl + ld [hl], d + ld hl, REEL_X_COORD + add hl, bc + ld [hl], 14 * 8 + call .OAM + ret + +.OAM: ; 92af9 (24:6af9) + ld hl, REEL_ACTION + add hl, bc + ld [hl], REEL_ACTION_DO_NOTHING + ld hl, REEL_POSITION + add hl, bc + ld [hl], REEL_SIZE - 1 + ld hl, REEL_SPIN_DISTANCE + add hl, bc + ld [hl], REEL_ACTION_DO_NOTHING + call Slots_UpdateReelPositionAndOAM + ret + +Slots_SpinReels: ; 92b0f (24:6b0f) + ld bc, wReel1 + call .SpinReel + ld bc, wReel2 + call .SpinReel + ld bc, wReel3 + call .SpinReel + ret + +.SpinReel: ; 92b22 (24:6b22) + ld hl, REEL_SPIN_DISTANCE + add hl, bc + ld a, [hl] + and $f + jr nz, .skip + call ReelActionJumptable +.skip + ld hl, REEL_SPIN_RATE + add hl, bc + ld a, [hl] + and a + ret z + ld d, a + ld hl, REEL_SPIN_DISTANCE + add hl, bc + add [hl] + ld [hl], a + and $f + jr z, Slots_UpdateReelPositionAndOAM + ld hl, REEL_OAM_ADDR + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld e, $8 +.loop + ld a, [hl] + add d + ld [hli], a + inc hl + inc hl + inc hl + dec e + jr nz, .loop + ret + +Slots_UpdateReelPositionAndOAM: ; 92b53 (24:6b53) + ld hl, REEL_X_COORD + add hl, bc + ld a, [hl] + ld [wCurrReelXCoord], a + ld a, 10 * 8 + ld [wCurrReelYCoord], a + ld hl, REEL_POSITION + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, REEL_TILEMAP_ADDR + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + ld e, l + ld d, h + call .LoadOAM + ld hl, REEL_POSITION + add hl, bc + ld a, [hl] + inc a + and $f + cp REEL_SIZE + jr nz, .load + xor a +.load + ld [hl], a + ret + +.LoadOAM: ; 92b83 (24:6b83) + ld hl, REEL_OAM_ADDR + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a +.loop + ld a, [wCurrReelYCoord] + ld [hli], a ; y + ld a, [wCurrReelXCoord] + ld [hli], a ; x + ld a, [de] + ld [hli], a ; tile id + srl a + srl a + set OAM_PRIORITY, a + ld [hli], a ; attributes + + ld a, [wCurrReelYCoord] + ld [hli], a ; y + ld a, [wCurrReelXCoord] + add 1 * TILE_WIDTH + ld [hli], a ; x + ld a, [de] + inc a + inc a + ld [hli], a ; tile id + srl a + srl a + set OAM_PRIORITY, a + ld [hli], a ; attributes + inc de + ld a, [wCurrReelYCoord] + sub 2 * TILE_WIDTH + ld [wCurrReelYCoord], a + cp 2 * TILE_WIDTH + jr nz, .loop + ret + +; 92bbe (24:6bbe) + +Unreferenced_Function92bbe: ; 92bbe + push hl + srl a + srl a + add LOW(.Unknown_92bce) + ld l, a + ld a, 0 + adc HIGH(.Unknown_92bce) + ld h, a + ld a, [hl] + pop hl + ret + +; 92bce + +.Unknown_92bce: ; 92bce + db 0, 1, 2, 3, 4, 5 +; 92bd4 + +ReelActionJumptable: ; 92bd4 (24:6bd4) + ld hl, REEL_ACTION + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +; 92be4 (24:6be4) + +.Jumptable: ; 92be4 + dw ReelAction_DoNothing ; 00 + dw ReelAction_StopReelIgnoreJoypad ; 01 + dw ReelAction_QuadrupleRate ; 02 + dw ReelAction_DoubleRate ; 03 + dw ReelAction_NormalRate ; 04 + dw ReelAction_HalfRate ; 05 + dw ReelAction_QuarterRate ; 06 + dw ReelAction_StopReel1 ; 07 + dw ReelAction_StopReel2 ; 08 + dw ReelAction_StopReel3 ; 09 + dw ReelAction_SetUpReel2SkipTo7 ; 0a + dw ReelAction_WaitReel2SkipTo7 ; 0b + dw ReelAction_FastSpinReel2UntilLinedUp7s ; 0c + dw ReelAction_Unused ; 0d + dw ReelAction_CheckDropReel ; 0e + dw ReelAction_WaitDropReel ; 0f + dw ReelAction_StartSlowAdvanceReel3 ; 10 + dw ReelAction_WaitSlowAdvanceReel3 ; 11 + dw ReelAction_InitGolem ; 12 + dw ReelAction_WaitGolem ; 13 + dw ReelAction_EndGolem ; 14 + dw ReelAction_InitChansey ; 15 + dw ReelAction_WaitChansey ; 16 + dw ReelAction_WaitEgg ; 17 + dw ReelAction_DropReel ; 18 +; 92c16 + +ReelAction_DoNothing: ; 92c16 + ret + +; 92c17 + +ReelAction_QuadrupleRate: ; 92c17 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 16 + ret + +; 92c1e + +ReelAction_DoubleRate: ; 92c1e + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 8 + ret + +; 92c25 + +ReelAction_NormalRate: ; 92c25 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 4 + ret + +; 92c2c + +ReelAction_HalfRate: ; 92c2c + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 2 + ret + +; 92c33 + +ReelAction_QuarterRate: ; 92c33 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 1 + ret + +; 92c3a + +Slots_StopReel: ; 92c3a + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + ld hl, REEL_ACTION + add hl, bc + ld [hl], REEL_ACTION_STOP_REEL_IGNORE_JOYPAD + ld hl, REEL_STOP_DELAY + add hl, bc + ld [hl], 3 +ReelAction_StopReelIgnoreJoypad: ; 92c4c + ld hl, REEL_STOP_DELAY + add hl, bc + ld a, [hl] + and a + jr z, .EndReel + dec [hl] + ret + +.EndReel: + ld hl, REEL_ACTION + add hl, bc + ld a, REEL_ACTION_DO_NOTHING + ld [hl], a + ret + +; 92c5e + +ReelAction_StopReel1: ; 92c5e +; If no bias: don't manipulate reel. +; If bias: manipulate reel up to wReel1ManipCounter (i.e. 4) slots, +; stoping early if the biased symbol shows up anywhere in reel #1, +; even if the current bet won't allow lining it up. + + ld a, [wSlotBias] + cp SLOTS_NO_BIAS + jr z, .NoBias + ld hl, REEL_MANIP_COUNTER + add hl, bc + ld a, [hl] + and a + jr z, .NoBias + dec [hl] + call .CheckForBias + ret nz +.NoBias: + call Slots_StopReel + ret + +; 92c76 + +.CheckForBias: ; 92c76 + call Slots_GetCurrentReelState + ld a, [wSlotBias] + ld e, a + ld a, [hli] + cp e + ret z + ld a, [hli] + cp e + ret z + ld a, [hl] + cp e + ret + +; 92c86 + +ReelAction_StopReel2: ; 92c86 +; If no bias: don't manipulate reel. +; If bias: manipulate reel up to wReel2ManipCounter (i.e. 4) slots, +; stoping early if the biased symbol is lined up in the first two +; reels, according to the lines that the current bet allows. + + call Slots_CheckMatchedFirstTwoReels + jr nc, .nope + ld a, [wSlotBuildingMatch] + ld hl, wSlotBias + cp [hl] + jr z, .NoBias +.nope + ld a, [wSlotBias] + cp SLOTS_NO_BIAS + jr z, .NoBias + ld hl, REEL_MANIP_COUNTER + add hl, bc + ld a, [hl] + and a + jr z, .NoBias + dec [hl] + ret + +.NoBias: + call Slots_StopReel + ret + +; 92ca9 + +ReelAction_StopReel3: ; 92ca9 +; Manipulate the reel up to wReel3ManipCounter (i.e. 4) slots, +; stopping early if the bias symbol is lined up for a win. +; If not biased to any symbols, stop as soon as nothing is lined up. + + call Slots_CheckMatchedAllThreeReels + jr nc, .NoMatch + ld hl, wSlotBias + cp [hl] + jr z, .NoBias + ld hl, REEL_MANIP_COUNTER + add hl, bc + ld a, [hl] + and a + ret z + dec [hl] + ret + +.NoMatch: + ld a, [wSlotBias] + cp SLOTS_NO_BIAS + jr z, .NoBias + ld hl, REEL_MANIP_COUNTER + add hl, bc + ld a, [hl] + and a + jr z, .NoBias + dec [hl] + ret + +.NoBias: + call Slots_StopReel + ret + +; 92cd2 + +ReelAction_SetUpReel2SkipTo7: ; 92cd2 +; Unique reel 2 action (see Slots_StopReel2) +; Ensures that 7 symbols become lined up in the first two reels, +; but more often than not, this is only a way to get our hopes up, as +; it makes exciting reel #3 modes with no success hope more common. + + call Slots_CheckMatchedFirstTwoReels + jr nc, .no_match + ld a, [wFirstTwoReelsMatchingSevens] + and a + jr z, .no_match + call Slots_StopReel + ret + +.no_match + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_REEL2_SKIP_TO_7 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld [hl], 32 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + ret + +; 92cf8 + +ReelAction_WaitReel2SkipTo7: ; 92cf8 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld a, [hl] + and a + jr z, .asm_92d02 + dec [hl] + ret + +.asm_92d02 + ld a, SFX_THROW_BALL + call Slots_PlaySFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_FAST_SPIN_REEL2_UNTIL_LINED_UP_7S + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 8 + ret + +; 92d13 + +ReelAction_FastSpinReel2UntilLinedUp7s: ; 92d13 + call Slots_CheckMatchedFirstTwoReels + ret nc + ld a, [wFirstTwoReelsMatchingSevens] + and a + ret z + call Slots_StopReel + ret + +; 92d20 + +ReelAction_InitGolem: ; 92d20 +; Ensures SEVENs are lined up if there's bias to SEVEN. +; Ensures nothing is lined up if there's no bias symbols. +; No other bias symbols are compatible with this mode. + +; This is achieved by throwing Golem until the desired result +; is produced. The amount of Golem thrown can be anywhere from +; 1 to 14 for SEVEN bias, and 4-8 for no bias. + + call Slots_CheckMatchedAllThreeReels + ret c + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + call Slots_WaitSFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_GOLEM + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + call Slots_GetNumberOfGolems + push bc + push af + depixel 12, 13 + ld a, SPRITE_ANIM_INDEX_SLOTS_GOLEM + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + pop af + ld [hl], a + pop bc + xor a + ld [wSlotsDelay], a +ReelAction_WaitGolem: ; 92d4f + ld a, [wSlotsDelay] + cp 2 + jr z, .two + cp 1 + jr z, .one + ret + +.two + call Slots_CheckMatchedAllThreeReels + call Slots_StopReel + ret + +.one + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_END_GOLEM + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 8 + ret + +; 92d6e + +ReelAction_EndGolem: ; 92d6e + xor a + ld [wSlotsDelay], a + ld hl, REEL_ACTION + add hl, bc + dec [hl] ; REEL_ACTION_WAIT_GOLEM + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + ret + +; 92d7e + +ReelAction_InitChansey: ; 92d7e +; Ensures the lining up of SEVEN symbols, but this mode is only possible +; when there is bias to SEVEN symbols (and even then, it's still rare). +; Chansey releases and egg and reel #3 is made to advance 17 slots very +; quickly as many times as necessary for the match to SEVENs to show up. + + call Slots_CheckMatchedAllThreeReels + ret c + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + call Slots_WaitSFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_CHANSEY + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + push bc + depixel 12, 0 + ld a, SPRITE_ANIM_INDEX_SLOTS_CHANSEY + call _InitSpriteAnimStruct + pop bc + xor a + ld [wSlotsDelay], a + ret + +; 92da4 + +ReelAction_WaitChansey: ; 92da4 + ld a, [wSlotsDelay] + and a + ret z + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_EGG + ld a, 2 + ld [wSlotsDelay], a +ReelAction_WaitEgg: ; 92db3 + ld a, [wSlotsDelay] + cp $4 + ret c + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_DROP_REEL + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 16 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld [hl], 17 +ReelAction_DropReel: ; 92dca + ld hl, REEL_MANIP_DELAY + add hl, bc + ld a, [hl] + and a + jr z, .check_match + dec [hl] + ret + +.check_match + call Slots_CheckMatchedAllThreeReels + jr nc, .EggAgain + and a + jr nz, .EggAgain + ld a, 5 + ld [wSlotsDelay], a + call Slots_StopReel + ret + +.EggAgain: + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 + ld hl, REEL_ACTION + add hl, bc + dec [hl] + dec [hl] ; REEL_ACTION_WAIT_CHANSEY + ld a, 1 + ld [wSlotsDelay], a + ret + +; 92df7 + +ReelAction_Unused: ; 92df7 + call Slots_CheckMatchedAllThreeReels + ret c + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + call Slots_WaitSFX + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_CHECK_DROP_REEL + call Slots_GetNumberOfGolems + ld hl, REEL_MANIP_DELAY + add hl, bc + ld [hl], a +ReelAction_CheckDropReel: ; 92e10 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld a, [hl] + and a + jr nz, .spin + call Slots_CheckMatchedAllThreeReels + call Slots_StopReel + ret + +.spin + dec [hl] + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_DROP_REEL + ld hl, REEL_FIELD_0B + add hl, bc + ld [hl], 32 + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 0 +ReelAction_WaitDropReel: ; 92e31 + ld hl, REEL_FIELD_0B + add hl, bc + ld a, [hl] + and a + jr z, .DropReel + dec [hl] + ret + +.DropReel: + ld hl, REEL_ACTION + add hl, bc + dec [hl] + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 8 + ret + +; 92e47 + +ReelAction_StartSlowAdvanceReel3: ; 92e47 +; Ensures SEVENs are lined up if there's bias to SEVEN. +; Ensures nothing is lined up if there's no bias symbols. +; No other bias symbols are compatible with this mode. + +; This is achieved by slowly advancing the reel a full round, +; plus any necessary slot until the desired result is produced. + + call Slots_CheckMatchedAllThreeReels + ret c + ld a, SFX_STOP_SLOT + call Slots_PlaySFX + call Slots_WaitSFX + ld hl, REEL_SPIN_RATE + add hl, bc + ld [hl], 1 + ld hl, REEL_ACTION + add hl, bc + inc [hl] ; REEL_ACTION_WAIT_SLOW_ADVANCE_REEL3 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld [hl], 16 +ReelAction_WaitSlowAdvanceReel3: ; 92e64 + ld hl, REEL_MANIP_DELAY + add hl, bc + ld a, [hl] + and a + jr z, .check1 + dec [hl] +.play_sfx + ld a, SFX_GOT_SAFARI_BALLS + call Slots_PlaySFX + ret + +.check1 + ld a, [wSlotBias] + and a + jr nz, .check2 + call Slots_CheckMatchedAllThreeReels + jr nc, .play_sfx + and a + jr nz, .play_sfx + call Slots_StopReel + call WaitSFX + ret + +.check2 + call Slots_CheckMatchedAllThreeReels + jr c, .play_sfx + call Slots_StopReel + call WaitSFX + ret + +; 92e94 + +Slots_CheckMatchedFirstTwoReels: ; 92e94 + xor a + ld [wFirstTwoReelsMatching], a + ld [wFirstTwoReelsMatchingSevens], a + call Slots_GetCurrentReelState + call Slots_CopyReelState + ld a, [wSlotBet] + and 3 + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .return + push de + jp hl + +.return + ld a, [wFirstTwoReelsMatching] + and a + ret z + scf + ret + +; 92ebd + +.Jumptable: ; 92ebd + dw .zero + dw .one + dw .two + dw .three +; 92ec5 + +.three ; 92ec5 + call .CheckUpwardsDiag + call .CheckDownwardsDiag + +.two ; 92ecb + call .CheckBottomRow + call .CheckTopRow + +.one ; 92ed1 + call .CheckMiddleRow + +.zero ; 92ed4 + ret + +; 92ed5 + +.CheckBottomRow: ; 92ed5 + ld hl, wCurrReelStopped + ld a, [wReel1Stopped] + cp [hl] + call z, .StoreResult + ret + +; 92ee0 + +.CheckUpwardsDiag: ; 92ee0 + ld hl, wCurrReelStopped + 1 + ld a, [wReel1Stopped] + cp [hl] + call z, .StoreResult + ret + +; 92eeb + +.CheckMiddleRow: ; 92eeb + ld hl, wCurrReelStopped + 1 + ld a, [wReel1Stopped + 1] + cp [hl] + call z, .StoreResult + ret + +; 92ef6 + +.CheckDownwardsDiag: ; 92ef6 + ld hl, wCurrReelStopped + 1 + ld a, [wReel1Stopped + 2] + cp [hl] + call z, .StoreResult + ret + +; 92f01 + +.CheckTopRow: ; 92f01 + ld hl, wCurrReelStopped + 2 + ld a, [wReel1Stopped + 2] + cp [hl] + call z, .StoreResult + ret + +; 92f0c + +.StoreResult: ; 92f0c + ld [wSlotBuildingMatch], a + and a + jr nz, .matching_sevens + ld a, 1 + ld [wFirstTwoReelsMatchingSevens], a + +.matching_sevens + ld a, 1 + ld [wFirstTwoReelsMatching], a + ret + +; 92f1d + +Slots_CheckMatchedAllThreeReels: ; 92f1d + ld a, SLOTS_NO_MATCH + ld [wSlotMatched], a + call Slots_GetCurrentReelState + call Slots_CopyReelState + ld a, [wSlotBet] + and 3 + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .return + push de + jp hl + +.return + ld a, [wSlotMatched] + cp SLOTS_NO_MATCH + jr nz, .matched_nontrivial + and a + ret + +.matched_nontrivial + scf + ret + +; 92f48 + +.Jumptable: ; 92f48 + dw .zero + dw .one + dw .two + dw .three +; 92f50 + +.three ; 92f50 + call .CheckUpwardsDiag + call .CheckDownwardsDiag + +.two ; 92f56 + call .CheckBottomRow + call .CheckTopRow + +.one ; 92f5c + call .CheckMiddleRow + +.zero ; 92f5f + ret + +; 92f60 + +.CheckBottomRow: ; 92f60 + ld hl, wCurrReelStopped + ld a, [wReel1Stopped] + cp [hl] + ret nz + ld hl, wReel2Stopped + cp [hl] + call z, .StoreResult + ret + +; 92f70 + +.CheckUpwardsDiag: ; 92f70 + ld hl, wCurrReelStopped + 2 + ld a, [wReel1Stopped] + cp [hl] + ret nz + ld hl, wReel2Stopped + 1 + cp [hl] + call z, .StoreResult + ret + +; 92f80 + +.CheckMiddleRow: ; 92f80 + ld hl, wCurrReelStopped + 1 + ld a, [wReel1Stopped + 1] + cp [hl] + ret nz + ld hl, wReel2Stopped + 1 + cp [hl] + call z, .StoreResult + ret + +; 92f90 + +.CheckDownwardsDiag: ; 92f90 + ld hl, wCurrReelStopped + ld a, [wReel1Stopped + 2] + cp [hl] + ret nz + ld hl, wReel2Stopped + 1 + cp [hl] + call z, .StoreResult + ret + +; 92fa0 + +.CheckTopRow: ; 92fa0 + ld hl, wCurrReelStopped + 2 + ld a, [wReel1Stopped + 2] + cp [hl] + ret nz + ld hl, wReel2Stopped + 2 + cp [hl] + call z, .StoreResult + ret + +; 92fb0 + +.StoreResult: ; 92fb0 + ld [wSlotMatched], a + ret + +; 92fb4 + +Slots_CopyReelState: ; 92fb4 + ld de, wCurrReelStopped + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ret + +; 92fc0 + +Slots_GetNumberOfGolems: ; 92fc0 + ld hl, REEL_POSITION + add hl, bc + ld a, [hl] + push af + push hl + call .Check7Bias + pop hl + pop af + ld [hl], a + ld a, e + ret + +; 92fcf + +.Check7Bias: ; 92fcf + ld a, [wSlotBias] + and a + jr nz, .not_biased_to_seven + ld e, $0 +.loop1 + ld hl, REEL_POSITION + add hl, bc + inc [hl] + inc e + push de + call Slots_CheckMatchedAllThreeReels + pop de + jr nc, .loop1 + and a + jr nz, .loop1 + ret + +.not_biased_to_seven + call Random + and $7 + cp $4 ; ((50 percent) & 7) + 1 + jr c, .not_biased_to_seven + ld e, a +.loop2 + ld a, e + inc e + ld hl, REEL_POSITION + add hl, bc + add [hl] + ld [hl], a + push de + call Slots_CheckMatchedAllThreeReels + pop de + jr c, .loop2 + ret + +; 93002 + +Slots_InitBias: ; 93002 (24:7002) + ld a, [wSlotBias] + and a + ret z + ld hl, .Normal + ld a, [wScriptVar] + and a + jr z, .okay + ld hl, .Lucky +.okay + call Random + ld c, a +.loop + ld a, [hli] + cp c + jr nc, .done + inc hl + jr .loop + +.done + ld a, [hl] + ld [wSlotBias], a + ret + +; 93023 (24:7023) + +.Normal: ; 93023 + db $01, SLOTS_SEVEN ; 1/256 + db $03, SLOTS_POKEBALL ; 1/128 + db $0a, SLOTS_STARYU ; 7/256 + db $14, SLOTS_SQUIRTLE ; 5/128 + db $28, SLOTS_PIKACHU ; 5/64 + db $30, SLOTS_CHERRY ; 1/32 + db $ff, SLOTS_NO_BIAS ; everything else +; 93031 + +.Lucky: ; 93031 + db $02, SLOTS_SEVEN ; 1/128 + db $03, SLOTS_POKEBALL ; 1/256 + db $08, SLOTS_STARYU ; 5/256 + db $10, SLOTS_SQUIRTLE ; 1/32 + db $1e, SLOTS_PIKACHU ; 7/128 + db $50, SLOTS_CHERRY ; 25/128 + db $ff, SLOTS_NO_BIAS ; everything else +; 9303f + +Slots_IlluminateBetLights: ; 9303f (24:703f) + ld b, $14 ; turned on + ld a, [wSlotBet] + dec a + jr z, Slots_Lights1OnOff + dec a + jr z, Slots_Lights2OnOff + jr Slots_Lights3OnOff + +Slots_DeilluminateBetLights: ; 9304c (24:704c) + ld b, $23 ; turned off +Slots_Lights3OnOff: ; 9304e (24:704e) + hlcoord 3, 2 + call Slots_TurnLightsOnOrOff + hlcoord 3, 10 + call Slots_TurnLightsOnOrOff +Slots_Lights2OnOff: ; 9305a (24:705a) + hlcoord 3, 4 + call Slots_TurnLightsOnOrOff + hlcoord 3, 8 + call Slots_TurnLightsOnOrOff +Slots_Lights1OnOff: ; 93066 (24:7066) + hlcoord 3, 6 + +Slots_TurnLightsOnOrOff: ; 93069 (24:7069) + ld a, b + ld [hl], a + ld de, SCREEN_WIDTH / 2 + 3 + add hl, de + ld [hl], a + ld de, SCREEN_WIDTH / 2 - 3 + add hl, de + inc a + ld [hl], a + ld de, SCREEN_WIDTH / 2 + 3 + add hl, de + ld [hl], a + ret + +Slots_AskBet: ; 9307c (24:707c) +.loop + ld hl, .Text_BetHowManyCoins + call PrintText + ld hl, .MenuHeader + call LoadMenuHeader + call VerticalMenu + call CloseWindow + ret c + ld a, [wMenuCursorY] + ld b, a + ld a, 4 + sub b + ld [wSlotBet], a + ld hl, wCoins + ld c, a + ld a, [hli] + and a + jr nz, .Start + ld a, [hl] + cp c + jr nc, .Start + ld hl, .Text_NotEnoughCoins + call PrintText + jr .loop + +.Start: + ld hl, wCoins + 1 + ld a, [hl] + sub c + ld [hld], a + jr nc, .ok + dec [hl] +.ok + call WaitSFX + ld de, SFX_PAY_DAY + call PlaySFX + ld hl, .Text_Start + call PrintText + and a + ret + +; 930c7 (24:70c7) + +.Text_BetHowManyCoins: ; 0x930c7 + ; Bet how many coins? + text_jump UnknownText_0x1c5049 + db "@" +; 0x930cc + +.Text_Start: ; 0x930cc + ; Start! + text_jump UnknownText_0x1c505e + db "@" +; 0x930d1 + +.Text_NotEnoughCoins: ; 0x930d1 + ; Not enough coins. + text_jump UnknownText_0x1c5066 + db "@" +; 0x930d6 + +.MenuHeader: ; 0x930d6 + db MENU_BACKUP_TILES ; flags + menu_coords 14, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option +; 0x930de + +.MenuData: ; 0x930de + db STATICMENU_CURSOR ; flags + db 3 ; items + db " 3@" + db " 2@" + db " 1@" +; 0x930e9 + +Slots_AskPlayAgain: ; 930e9 (24:70e9) + ld hl, wCoins + ld a, [hli] + or [hl] + jr nz, .you_have_coins + ld hl, .Text_OutOfCoins + call PrintText + ld c, 60 + call DelayFrames + jr .exit_slots + +.you_have_coins + ld hl, .Text_PlayAgain + call PrintText + call LoadMenuTextBox + lb bc, 14, 12 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call CloseWindow + and a + jr nz, .exit_slots + and a + ret + +.exit_slots + scf + ret + +; 9311a (24:711a) + +.Text_OutOfCoins: ; 9311a + text_jump UnknownText_0x1c5079 + db "@" + +.Text_PlayAgain: ; 9311f + text_jump UnknownText_0x1c5092 + db "@" + +Slots_GetPayout: ; 93124 (24:7124) + ld a, [wSlotMatched] + cp SLOTS_NO_MATCH + jr z, .no_win + srl a + ld e, a + ld d, 0 + ld hl, .PayoutTable + add hl, de + ld a, [hli] + ld [wPayout + 1], a + ld e, a + ld a, [hl] + ld [wPayout], a + ld d, a + farcall StubbedTrainerRankings_AddToSlotsPayouts + ret + +.PayoutTable: + dw 300 + dw 50 + dw 6 + dw 8 + dw 10 + dw 15 + +.no_win + ld hl, wPayout + xor a + ld [hli], a + ld [hl], a + ret + +Slots_PayoutText: ; 93158 (24:7158) + ld a, [wSlotMatched] + cp SLOTS_NO_MATCH + jr nz, .MatchedSomething + ld hl, .Text_Darn + call PrintText + farcall StubbedTrainerRankings_EndSlotsWinStreak + ret + +.MatchedSomething: + srl a + ld e, a + ld d, 0 + ld hl, .PayoutStrings + add hl, de + add hl, de + add hl, de + ld de, wStringBuffer2 + ld bc, 4 + call CopyBytes + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .return + push de + jp hl + +.return + ld hl, .Text_PrintPayout + call PrintText + farcall StubbedTrainerRankings_AddToSlotsWinStreak + ret + +; 93195 (24:7195) + +.PayoutStrings: ; 93195 + dbw "300@", .LinedUpSevens + dbw "50@@", .LinedUpPokeballs + dbw "6@@@", .LinedUpMonOrCherry + dbw "8@@@", .LinedUpMonOrCherry + dbw "10@@", .LinedUpMonOrCherry + dbw "15@@", .LinedUpMonOrCherry +; 931b9 + +.Text_PrintPayout: ; 0x931b9 + start_asm + ld a, [wSlotMatched] + add $25 + ldcoord_a 2, 13 + inc a + ldcoord_a 2, 14 + inc a + ldcoord_a 3, 13 + inc a + ldcoord_a 3, 14 + hlcoord 18, 17 + ld [hl], "▼" + ld hl, .Text_LinedUpWonCoins +rept 4 + inc bc +endr + ret + +; 931db + +.Text_LinedUpWonCoins: ; 0x931db + ; lined up! Won @ coins! + text_jump UnknownText_0x1c509f + db "@" +; 0x931e0 + +.Text_Darn: ; 0x931e0 + ; Darn! + text_jump UnknownText_0x1c50bb + db "@" +; 0x931e5 + +.LinedUpSevens: ; 931e5 + ld a, SFX_2ND_PLACE + call Slots_PlaySFX + call WaitSFX + +; Oddly, the rarest mode (wKeepSevenBiasChance = 1) is the one with +; the worse odds to favor seven symbol streaks (12.5% vs 25%). +; it's possible that either the wKeepSevenBiasChance initialization +; or this code was intended to lead to flipped percentages. + ld a, [wKeepSevenBiasChance] + and a + jr nz, .lower_seven_streak_odds + call Random + and %0010100 + ret z ; 25% chance to stick with seven symbol bias + ld a, SLOTS_NO_BIAS + ld [wSlotBias], a + ret + +.lower_seven_streak_odds + call Random + and %0011100 + ret z ; 12.5% chance to stick with seven symbol bias + ld a, SLOTS_NO_BIAS + ld [wSlotBias], a + ret + +; 9320b + +.LinedUpPokeballs: ; 9320b + ld a, SFX_3RD_PLACE + call Slots_PlaySFX + call WaitSFX + ret + +; 93214 + +.LinedUpMonOrCherry: ; 93214 + ld a, SFX_PRESENT + call Slots_PlaySFX + call WaitSFX + ret + +; 9321d + +Slots_AnimateGolem: ; 9321d (24:721d) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: ; 9322d (24:722d) + dw .init + dw .fall + dw .roll + +.init ; 93233 (24:7233) + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld a, [hl] + and a + jr nz, .retain + ld a, 2 + ld [wSlotsDelay], a + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +.retain + dec [hl] + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $30 + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], $0 + +.fall ; 93259 (24:7259) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $20 + jr c, .play_sound + dec [hl] + ld e, a + ld d, 14 * 8 + farcall BattleAnim_Sine_e + ld a, e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], a + ret + +.play_sound + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $2 + ld a, 1 + ld [wSlotsDelay], a + ld a, SFX_PLACE_PUZZLE_PIECE_DOWN + call Slots_PlaySFX + ret + +.roll ; 93289 (24:7289) + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + cp 9 * 8 + jr nc, .restart + and $3 + ret nz + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + xor $ff + inc a + ld [hl], a + ld [hSCY], a + ret + +.restart + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + xor a + ld [hl], a + ld [hSCY], a + ret + +Slots_AnimateChansey: ; 932ac (24:72ac) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: ; 932bc (24:72bc) + dw .walk + dw .one + dw .two + +.walk ; 932c2 (24:72c2) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + inc [hl] + cp 13 * 8 + jr z, .limit + and $f + ret nz + ld de, SFX_JUMP_OVER_LEDGE + call PlaySFX + ret + +.limit + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld a, 1 + ld [wSlotsDelay], a + +.one ; 932e0 (24:72e0) + ld a, [wSlotsDelay] + cp $2 + jr z, .retain + cp $5 + ret nz + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +.retain + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $8 +.two ; 932fc (24:72fc) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .spawn_egg + dec [hl] + ret + +.spawn_egg + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + dec [hl] + push bc + depixel 12, 13, 0, 4 + ld a, SPRITE_ANIM_INDEX_SLOTS_EGG + call _InitSpriteAnimStruct + pop bc + ret + +; 93316 (24:7316) + +Slots_WaitSFX: ; 93316 + push bc + ld c, 16 + call DelayFrames + pop bc + ret + +; 9331e + +Slots_PlaySFX: ; 9331e (24:731e) + push de + ld e, a + ld d, 0 + call PlaySFX + pop de + ret + +; 93327 (24:7327) + +; The first three positions are repeated to +; avoid needing to check indices when copying. +Reel1Tilemap: ; 93327 + db SLOTS_SEVEN ; 0 + db SLOTS_CHERRY ; 1 + db SLOTS_STARYU ; 2 + db SLOTS_PIKACHU ; 3 + db SLOTS_SQUIRTLE ; 4 + db SLOTS_SEVEN ; 5 + db SLOTS_CHERRY ; 6 + db SLOTS_STARYU ; 7 + db SLOTS_PIKACHU ; 8 + db SLOTS_SQUIRTLE ; 9 + db SLOTS_POKEBALL ; 10 + db SLOTS_CHERRY ; 11 + db SLOTS_STARYU ; 12 + db SLOTS_PIKACHU ; 13 + db SLOTS_SQUIRTLE ; 14 + db SLOTS_SEVEN ; 0 + db SLOTS_CHERRY ; 1 + db SLOTS_STARYU ; 2 + +Reel2Tilemap: ; 93339 + db SLOTS_SEVEN ; 0 + db SLOTS_PIKACHU ; 1 + db SLOTS_CHERRY ; 2 + db SLOTS_SQUIRTLE ; 3 + db SLOTS_STARYU ; 4 + db SLOTS_POKEBALL ; 5 + db SLOTS_PIKACHU ; 6 + db SLOTS_CHERRY ; 7 + db SLOTS_SQUIRTLE ; 8 + db SLOTS_STARYU ; 9 + db SLOTS_POKEBALL ; 10 + db SLOTS_PIKACHU ; 11 + db SLOTS_CHERRY ; 12 + db SLOTS_SQUIRTLE ; 13 + db SLOTS_STARYU ; 14 + db SLOTS_SEVEN ; 0 + db SLOTS_PIKACHU ; 1 + db SLOTS_CHERRY ; 2 + +Reel3Tilemap: ; 9334b + db SLOTS_SEVEN ; 0 + db SLOTS_PIKACHU ; 1 + db SLOTS_CHERRY ; 2 + db SLOTS_SQUIRTLE ; 3 + db SLOTS_STARYU ; 4 + db SLOTS_PIKACHU ; 5 + db SLOTS_CHERRY ; 6 + db SLOTS_SQUIRTLE ; 7 + db SLOTS_STARYU ; 8 + db SLOTS_PIKACHU ; 9 + db SLOTS_POKEBALL ; 10 + db SLOTS_CHERRY ; 11 + db SLOTS_SQUIRTLE ; 12 + db SLOTS_STARYU ; 13 + db SLOTS_PIKACHU ; 14 + db SLOTS_SEVEN ; 0 + db SLOTS_PIKACHU ; 1 + db SLOTS_CHERRY ; 2 +; 9335d + +SlotsTilemap: ; 9335d +INCBIN "gfx/slots/slots.tilemap" +; 9344d + +Slots1LZ: ; 9344d +INCBIN "gfx/slots/slots_1.2bpp.lz" +; 935cd + +Slots2LZ: ; 935cd +INCBIN "gfx/slots/slots_2.2bpp.lz" +; 9382d + +Slots3LZ: ; 9382d +INCBIN "gfx/slots/slots_3.2bpp.lz" +; 93a3d diff --git a/engine/games/unown_puzzle.asm b/engine/games/unown_puzzle.asm new file mode 100755 index 000000000..83527ea69 --- /dev/null +++ b/engine/games/unown_puzzle.asm @@ -0,0 +1,877 @@ +PUZZLE_BORDER EQU $ee +PUZZLE_VOID EQU $ef + +puzcoord EQUS "* 6 +" + +_UnownPuzzle: ; e1190 + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + call ClearBGPalettes + call ClearTileMap + call ClearSprites + xor a + ld [hBGMapMode], a + call DisableLCD + ld hl, wMisc ; includes wPuzzlePieces + ld bc, wMiscEnd - wMisc + xor a + call ByteFill + ld hl, UnownPuzzleCursorGFX + ld de, vTiles1 tile $60 + ld bc, 4 tiles + call CopyBytes + ld hl, UnownPuzzleStartCancelLZ + ld de, vTiles1 tile $6d + call Decompress + call LoadUnownPuzzlePiecesGFX + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, PUZZLE_BORDER + call ByteFill + hlcoord 4, 3 + lb bc, 12, 12 + ld a, PUZZLE_VOID + call UnownPuzzle_FillBox + call InitUnownPuzzlePiecePositions + call UnownPuzzle_UpdateTilemap + call PlaceStartCancelBox + xor a + ld [hSCY], a + ld [hSCX], a + ld [rWY], a + ld [wJumptableIndex], a + ld [wHoldingUnownPuzzlePiece], a + ld [wUnownPuzzleCursorPosition], a + ld [wUnownPuzzleHeldPiece], a + ld a, %10010011 + ld [rLCDC], a + call WaitBGMap + ld b, SCGB_UNOWN_PUZZLE + call GetSGBLayout + ld a, $e4 + call DmgToCgbBGPals + ld a, $24 + call DmgToCgbObjPal0 + xor a + ld [wSolvedUnownPuzzle], a + call DelayFrame +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .quit + call UnownPuzzleJumptable + ld a, [wHoldingUnownPuzzlePiece] + and a + jr nz, .holding_piece + ld a, [hVBlankCounter] + and $10 + jr z, .clear +.holding_piece + call RedrawUnownPuzzlePieces + jr .next + +.clear + call ClearSprites +.next + call DelayFrame + jr .loop + +.quit + pop af + ld [hInMenu], a + call ClearBGPalettes + call ClearTileMap + call ClearSprites + ld a, LCDC_DEFAULT + ld [rLCDC], a + ret +; e124e + +InitUnownPuzzlePiecePositions: ; e124e + ld c, 1 + ld b, 16 +.load_loop + call Random + and $f + ld hl, .PuzzlePieceInitialPositions + ld e, a + ld d, $0 + add hl, de + ld e, [hl] + ld hl, wPuzzlePieces + add hl, de + ld a, [hl] + and a + jr nz, .load_loop + ld [hl], c + inc c + dec b + jr nz, .load_loop + ret +; e126d + +.PuzzlePieceInitialPositions: ; e126d +initpuzcoord: MACRO +rept _NARG / 2 + db \1 puzcoord \2 + shift + shift +endr +ENDM + initpuzcoord 0,0, 0,1, 0,2, 0,3, 0,4, 0,5 + initpuzcoord 1,0, 1,5 + initpuzcoord 2,0, 2,5 + initpuzcoord 3,0, 3,5 + initpuzcoord 4,0, 4,5 + initpuzcoord 5,0, 5,5 + ; START > CANCEL +; e127d + +PlaceStartCancelBox: ; e127d + call PlaceStartCancelBoxBorder + hlcoord 5, 16 + ld a, $f6 + ld c, 10 +.loop + ld [hli], a + inc a + dec c + jr nz, .loop + ret +; e128d + +PlaceStartCancelBoxBorder: ; e128d + hlcoord 4, 15 + ld a, $f0 + ld [hli], a + ld bc, 10 + ld a, $f1 + call ByteFill + hlcoord 15, 15 + ld a, $f2 + ld [hli], a + hlcoord 4, 16 + ld a, $f3 + ld [hli], a + ld bc, 10 + ld a, PUZZLE_VOID + call ByteFill + hlcoord 15, 16 + ld a, $f3 + ld [hli], a + hlcoord 4, 17 + ld a, $f4 + ld [hli], a + ld bc, 10 + ld a, $f1 + call ByteFill + hlcoord 15, 17 + ld a, $f5 + ld [hl], a + ret +; e12ca + +UnownPuzzleJumptable: ; e12ca + 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 +; e12d9 + +.Jumptable: ; e12d9 + dw .Function +; e12db + +.Function: ; e12db + ld a, [hJoyPressed] + and START + jp nz, UnownPuzzle_Quit + ld a, [hJoyPressed] + and A_BUTTON + jp nz, UnownPuzzle_A + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .d_up + ld a, [hl] + and D_DOWN + jr nz, .d_down + ld a, [hl] + and D_LEFT + jr nz, .d_left + ld a, [hl] + and D_RIGHT + jr nz, .d_right + ret + +.d_up + ld hl, wUnownPuzzleCursorPosition + ld a, [hl] + cp 1 puzcoord 0 + ret c + sub 6 + ld [hl], a + jr .done_joypad + +.d_down + ld hl, wUnownPuzzleCursorPosition + ld a, [hl] + cp 4 puzcoord 1 + ret z + cp 4 puzcoord 2 + ret z + cp 4 puzcoord 3 + ret z + cp 4 puzcoord 4 + ret z + cp 5 puzcoord 0 + ret nc + add 6 + ld [hl], a + jr .done_joypad + +.d_left + ld hl, wUnownPuzzleCursorPosition + ld a, [hl] + and a + ret z + cp 1 puzcoord 0 + ret z + cp 2 puzcoord 0 + ret z + cp 3 puzcoord 0 + ret z + cp 4 puzcoord 0 + ret z + cp 5 puzcoord 0 + ret z + cp 5 puzcoord 5 + jr z, .left_overflow + dec [hl] + jr .done_joypad + +.left_overflow + ld [hl], 5 puzcoord 0 + jr .done_joypad + +.d_right + ld hl, wUnownPuzzleCursorPosition + ld a, [hl] + cp 0 puzcoord 5 + ret z + cp 1 puzcoord 5 + ret z + cp 2 puzcoord 5 + ret z + cp 3 puzcoord 5 + ret z + cp 4 puzcoord 5 + ret z + cp 5 puzcoord 5 + ret z + cp 5 puzcoord 0 + jr z, .right_overflow + inc [hl] + jr .done_joypad + +.right_overflow + ld [hl], 5 puzcoord 5 + +.done_joypad + ld a, [wHoldingUnownPuzzlePiece] + and a + jr nz, .holding_piece + ld de, SFX_POUND + jr .play_sfx + +.holding_piece + ld de, SFX_MOVE_PUZZLE_PIECE + +.play_sfx + call PlaySFX + ret +; e1376 + +UnownPuzzle_A: ; e1376 + ld a, [wHoldingUnownPuzzlePiece] + and a + jr nz, .TryPlacePiece + call UnownPuzzle_CheckCurrentTileOccupancy + and a + jr z, UnownPuzzle_InvalidAction + ld de, SFX_MEGA_KICK + call PlaySFX + ld [hl], 0 + ld [wUnownPuzzleHeldPiece], a + call RedrawUnownPuzzlePieces + call FillUnoccupiedPuzzleSpace + call WaitBGMap + call WaitSFX + ld a, TRUE + ld [wHoldingUnownPuzzlePiece], a + ret + +.TryPlacePiece: + call UnownPuzzle_CheckCurrentTileOccupancy + and a + jr nz, UnownPuzzle_InvalidAction + ld de, SFX_PLACE_PUZZLE_PIECE_DOWN + call PlaySFX + ld a, [wUnownPuzzleHeldPiece] + ld [hl], a + call PlaceUnownPuzzlePieceGFX + call WaitBGMap + xor a + ld [wUnownPuzzleHeldPiece], a + call RedrawUnownPuzzlePieces + xor a + ld [wHoldingUnownPuzzlePiece], a + call WaitSFX + call CheckSolvedUnownPuzzle + ret nc + +; You solved the puzzle! + call PlaceStartCancelBoxBorder + call ClearSprites + ld de, SFX_1ST_PLACE + call PlaySFX + call WaitSFX + call SimpleWaitPressAorB + ld a, TRUE + ld [wSolvedUnownPuzzle], a +UnownPuzzle_Quit: ; e13de + ld hl, wJumptableIndex + set 7, [hl] + ret + +UnownPuzzle_InvalidAction: ; e13e4 + ld de, SFX_WRONG + call PlaySFX + call WaitSFX + ret +; e13ee + +UnownPuzzle_FillBox: ; e13ee + ld de, SCREEN_WIDTH +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + add hl, de + pop bc + dec b + jr nz, .row + ret +; e13fe + +UnownPuzzle_UpdateTilemap: ; e13fe + xor a + ld [wUnownPuzzleCursorPosition], a + ld c, 6 * 6 +.loop + push bc + call UnownPuzzle_CheckCurrentTileOccupancy + ld [wUnownPuzzleHeldPiece], a + and a + jr z, .not_holding_piece + call PlaceUnownPuzzlePieceGFX + jr .next + +.not_holding_piece + call FillUnoccupiedPuzzleSpace + +.next + ld hl, wUnownPuzzleCursorPosition + inc [hl] + pop bc + dec c + jr nz, .loop + ret +; e141f + +PlaceUnownPuzzlePieceGFX: ; e141f + ld a, $2 ; tilemap coords + call GetUnownPuzzleCoordData + ld a, [hli] + ld h, [hl] + ld l, a + push hl + call GetCurrentPuzzlePieceVTileCorner + pop hl + ld de, SCREEN_WIDTH + ld b, 3 +.row + ld c, 3 + push hl +.col + ld [hli], a + inc a + dec c + jr nz, .col + add 9 + pop hl + add hl, de + dec b + jr nz, .row + ret +; e1441 + +FillUnoccupiedPuzzleSpace: ; e1441 + ld a, 2 ; tilemap coords + call GetUnownPuzzleCoordData + ld a, [hli] + ld h, [hl] + ld l, a + push hl + ld a, 4 ; tile + call GetUnownPuzzleCoordData + ld a, [hl] + pop hl + ld de, SCREEN_WIDTH + ld b, 3 +.row + ld c, 3 + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + add hl, de + dec b + jr nz, .row + ret +; e1463 + +GetUnownPuzzleCoordData: ; e1463 + ld e, a + ld d, 0 + ld hl, UnownPuzzleCoordData + add hl, de + ld a, [wUnownPuzzleCursorPosition] + ld e, a +rept 6 + add hl, de +endr + ret +; e1475 + +UnownPuzzle_CheckCurrentTileOccupancy: ; e1475 + ld hl, wPuzzlePieces + ld a, [wUnownPuzzleCursorPosition] + ld e, a + ld d, $0 + add hl, de + ld a, [hl] + ret +; e1481 + +GetCurrentPuzzlePieceVTileCorner: ; e1481 + ld a, [wUnownPuzzleHeldPiece] + ld hl, .Corners + add l + ld l, a + ld a, $0 + adc h + ld h, a + ld a, [hl] + ret +; e148f + +.Corners: ; e148f +; 00, 01, 02 +; 0c, 0d, 0e +; 18, 19, 1a + db $e0 ; no piece selected + db $00, $03, $06, $09 + db $24, $27, $2a, $2d + db $48, $4b, $4e, $51 + db $6c, $6f, $72, $75 +; e14a0 + +CheckSolvedUnownPuzzle: ; e14a0 + ld hl, .SolvedPuzzleConfiguration + ld de, wPuzzlePieces + ld c, 6 * 6 +.loop + ld a, [de] + cp [hl] + jr nz, .not_solved + inc de + inc hl + dec c + jr nz, .loop + scf + ret + +.not_solved + and a + ret +; e14b5 + +.SolvedPuzzleConfiguration: ; e14b5 + db $00, $00, $00, $00, $00, $00 + db $00, $01, $02, $03, $04, $00 + db $00, $05, $06, $07, $08, $00 + db $00, $09, $0a, $0b, $0c, $00 + db $00, $0d, $0e, $0f, $10, $00 + db $00, $00, $00, $00, $00, $00 +; e14d9 + +RedrawUnownPuzzlePieces: ; e14d9 + call GetCurrentPuzzlePieceVTileCorner + ld [wd002], a + xor a + call GetUnownPuzzleCoordData ; get pixel positions + ld a, [hli] + ld b, [hl] + ld c, a + ld a, [wd002] + cp $e0 + jr z, .NoPiece + ld hl, .OAM_HoldingPiece + jr .load + +.NoPiece: + ld hl, .OAM_NotHoldingPiece + +.load + ld de, wVirtualOAMSprite00 +.loop + ld a, [hli] + cp -1 + ret z + add b + ld [de], a ; y + inc de + ld a, [hli] + add c + ld [de], a ; x + inc de + ld a, [wd002] + add [hl] + ld [de], a ; tile id + inc hl + inc de + ld a, [hli] + ld [de], a ; attributes + inc de + jr .loop +; e150f + +.OAM_HoldingPiece: ; e150f + dsprite -1, -4, -1, -4, $00, 0 + dsprite -1, -4, 0, -4, $01, 0 + dsprite -1, -4, 0, 4, $02, 0 + dsprite 0, -4, -1, -4, $0c, 0 + dsprite 0, -4, 0, -4, $0d, 0 + dsprite 0, -4, 0, 4, $0e, 0 + dsprite 0, 4, -1, -4, $18, 0 + dsprite 0, 4, 0, -4, $19, 0 + dsprite 0, 4, 0, 4, $1a, 0 + db -1 + +.OAM_NotHoldingPiece: ; e1534 + dsprite -1, -4, -1, -4, $00, 0 + dsprite -1, -4, 0, -4, $01, 0 + dsprite -1, -4, 0, 4, $00, 0 | X_FLIP + dsprite 0, -4, -1, -4, $02, 0 + dsprite 0, -4, 0, -4, $03, 0 + dsprite 0, -4, 0, 4, $02, 0 | X_FLIP + dsprite 0, 4, -1, -4, $00, 0 | Y_FLIP + dsprite 0, 4, 0, -4, $01, 0 | Y_FLIP + dsprite 0, 4, 0, 4, $00, 0 | X_FLIP | Y_FLIP + db -1 + +UnownPuzzleCoordData: ; e1559 + +puzzle_coords: MACRO + dbpixel \1, \2, \3, \4 + dwcoord \5, \6 + db \7, \8 +ENDM +; OAM coords, tilemap coords, vacant tile, filler + puzzle_coords 3, 3, 4, 4, 1, 0, PUZZLE_BORDER, 0 + puzzle_coords 6, 3, 4, 4, 4, 0, PUZZLE_BORDER, 0 + puzzle_coords 9, 3, 4, 4, 7, 0, PUZZLE_BORDER, 0 + puzzle_coords 12, 3, 4, 4, 10, 0, PUZZLE_BORDER, 0 + puzzle_coords 15, 3, 4, 4, 13, 0, PUZZLE_BORDER, 0 + puzzle_coords 18, 3, 4, 4, 16, 0, PUZZLE_BORDER, 0 + + puzzle_coords 3, 6, 4, 4, 1, 3, PUZZLE_BORDER, 0 + puzzle_coords 6, 6, 4, 4, 4, 3, PUZZLE_VOID, 0 + puzzle_coords 9, 6, 4, 4, 7, 3, PUZZLE_VOID, 0 + puzzle_coords 12, 6, 4, 4, 10, 3, PUZZLE_VOID, 0 + puzzle_coords 15, 6, 4, 4, 13, 3, PUZZLE_VOID, 0 + puzzle_coords 18, 6, 4, 4, 16, 3, PUZZLE_BORDER, 0 + + puzzle_coords 3, 9, 4, 4, 1, 6, PUZZLE_BORDER, 0 + puzzle_coords 6, 9, 4, 4, 4, 6, PUZZLE_VOID, 0 + puzzle_coords 9, 9, 4, 4, 7, 6, PUZZLE_VOID, 0 + puzzle_coords 12, 9, 4, 4, 10, 6, PUZZLE_VOID, 0 + puzzle_coords 15, 9, 4, 4, 13, 6, PUZZLE_VOID, 0 + puzzle_coords 18, 9, 4, 4, 16, 6, PUZZLE_BORDER, 0 + + puzzle_coords 3, 12, 4, 4, 1, 9, PUZZLE_BORDER, 0 + puzzle_coords 6, 12, 4, 4, 4, 9, PUZZLE_VOID, 0 + puzzle_coords 9, 12, 4, 4, 7, 9, PUZZLE_VOID, 0 + puzzle_coords 12, 12, 4, 4, 10, 9, PUZZLE_VOID, 0 + puzzle_coords 15, 12, 4, 4, 13, 9, PUZZLE_VOID, 0 + puzzle_coords 18, 12, 4, 4, 16, 9, PUZZLE_BORDER, 0 + + puzzle_coords 3, 15, 4, 4, 1, 12, PUZZLE_BORDER, 0 + puzzle_coords 6, 15, 4, 4, 4, 12, PUZZLE_VOID, 0 + puzzle_coords 9, 15, 4, 4, 7, 12, PUZZLE_VOID, 0 + puzzle_coords 12, 15, 4, 4, 10, 12, PUZZLE_VOID, 0 + puzzle_coords 15, 15, 4, 4, 13, 12, PUZZLE_VOID, 0 + puzzle_coords 18, 15, 4, 4, 16, 12, PUZZLE_BORDER, 0 + + puzzle_coords 3, 18, 4, 4, 1, 15, PUZZLE_BORDER, 0 + puzzle_coords 6, 18, 4, 4, 4, 15, PUZZLE_BORDER, 0 + puzzle_coords 9, 18, 4, 4, 7, 15, PUZZLE_BORDER, 0 + puzzle_coords 12, 18, 4, 4, 10, 15, PUZZLE_BORDER, 0 + puzzle_coords 15, 18, 4, 4, 13, 15, PUZZLE_BORDER, 0 + puzzle_coords 18, 18, 4, 4, 16, 15, PUZZLE_BORDER, 0 + +ConvertLoadedPuzzlePieces: ; e1631 + ld hl, vTiles2 + ld de, vTiles0 + ld b, 6 +.loop + push bc + push hl + push hl + call .EnlargePuzzlePieceTiles + pop hl + ld bc, 1 tiles / 2 + add hl, bc + call .EnlargePuzzlePieceTiles + pop hl + ld bc, 6 tiles + add hl, bc + pop bc + dec b + jr nz, .loop + call UnownPuzzle_AddPuzzlePieceBorders + ret +; e1654 + +.EnlargePuzzlePieceTiles: ; e1654 +; double size + ld c, 6 +.loop1 + push bc + push hl + push hl + ld c, 4 +.loop2 + push bc + ld a, [hli] + and $f0 + swap a + call .GetEnlargedTile + ld c, a + ld a, [hli] + and $f0 + swap a + call .GetEnlargedTile + ld b, a + ld a, c + ld [de], a + inc de + ld a, b + ld [de], a + inc de + ld a, c + ld [de], a + inc de + ld a, b + ld [de], a + inc de + pop bc + dec c + jr nz, .loop2 + pop hl + ld c, 4 +.loop3 + push bc + ld a, [hli] + and $f + call .GetEnlargedTile + ld c, a + ld a, [hli] + and $f + call .GetEnlargedTile + ld b, a + ld a, c + ld [de], a + inc de + ld a, b + ld [de], a + inc de + ld a, c + ld [de], a + inc de + ld a, b + ld [de], a + inc de + pop bc + dec c + jr nz, .loop3 + pop hl + ld bc, 1 tiles + add hl, bc + pop bc + dec c + jr nz, .loop1 + ret +; e16aa + +.GetEnlargedTile: ; e16aa + push hl + ld hl, .EnlargedTiles + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, [hl] + pop hl + ret +; e16b7 + +.EnlargedTiles: ; e16b7 + +x = 0 +rept 16 + db ((x & %1000) * %11000) + ((x & %0100) * %1100) + ((x & %0010) * %110) + ((x & %0001) * %11) +x = x + 1 +endr +; e16c7 + +UnownPuzzle_AddPuzzlePieceBorders: ; e16c7 + ld hl, PuzzlePieceBorderData + ld a, 8 +.loop + push af + push hl + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld h, [hl] + ld l, a + call .LoadGFX + pop hl +rept 4 + inc hl +endr + pop af + dec a + jr nz, .loop + ret +; e16e2 + +.LoadGFX: ; e16e2 + lb bc, 4, 4 +.loop1 + push bc + +.loop2 + push de + push hl + + ld b, 1 tiles +.loop3 + ld a, [de] + or [hl] + ld [hli], a + inc de + dec b + jr nz, .loop3 + + pop hl + ld de, 3 tiles + add hl, de + pop de + dec c + jr nz, .loop2 + + ld bc, 24 tiles + add hl, bc + pop bc + dec b + jr nz, .loop1 + ret +; e1703 + +PuzzlePieceBorderData: ; e1703 + dw .TileBordersGFX + 0 tiles, vTiles0 tile $00 + dw .TileBordersGFX + 1 tiles, vTiles0 tile $01 + dw .TileBordersGFX + 2 tiles, vTiles0 tile $02 + dw .TileBordersGFX + 3 tiles, vTiles0 tile $0c + dw .TileBordersGFX + 4 tiles, vTiles0 tile $0e + dw .TileBordersGFX + 5 tiles, vTiles0 tile $18 + dw .TileBordersGFX + 6 tiles, vTiles0 tile $19 + dw .TileBordersGFX + 7 tiles, vTiles0 tile $1a +; e1723 + +.TileBordersGFX: ; e1723 +INCBIN "gfx/unown_puzzle/tile_borders.2bpp" + +LoadUnownPuzzlePiecesGFX: ; e17a3 + ld a, [wScriptVar] + maskbits NUM_UNOWN_PUZZLES + ld e, a + ld d, 0 + ld hl, .LZPointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, vTiles2 + call Decompress + call ConvertLoadedPuzzlePieces + ret +; e17bd + +.LZPointers: ; e17bd +; entries correspond to UNOWNPUZZLE_* constants + dw KabutoPuzzleLZ + dw OmanytePuzzleLZ + dw AerodactylPuzzleLZ + dw HoOhPuzzleLZ +; e17c5 + +UnownPuzzleCursorGFX: ; e17c5 +INCBIN "gfx/unown_puzzle/cursor.2bpp" + +UnownPuzzleStartCancelLZ: ; e1805 +INCBIN "gfx/unown_puzzle/start_cancel.2bpp.lz" + +HoOhPuzzleLZ: ; e18ab +INCBIN "gfx/unown_puzzle/hooh.2bpp.lz" + +AerodactylPuzzleLZ: ; e19fb +INCBIN "gfx/unown_puzzle/aerodactyl.2bpp.lz" + +KabutoPuzzleLZ: ; e1bab +INCBIN "gfx/unown_puzzle/kabuto.2bpp.lz" + +OmanytePuzzleLZ: ; e1c9b +INCBIN "gfx/unown_puzzle/omanyte.2bpp.lz" diff --git a/engine/gfx/drawkrispackgfx.asm b/engine/gfx/drawkrispackgfx.asm new file mode 100644 index 000000000..54a21e447 --- /dev/null +++ b/engine/gfx/drawkrispackgfx.asm @@ -0,0 +1,20 @@ +DrawKrisPackGFX: ; 48e81 + ld hl, PackFGFXPointers + add hl, de + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + ld hl, vTiles2 tile $50 + lb bc, BANK(PackFGFX), 15 + call Request2bpp + ret + +PackFGFXPointers: ; 48e93 + dw PackFGFX + (15 tiles) * 1 ; ITEM_POCKET + dw PackFGFX + (15 tiles) * 3 ; BALL_POCKET + dw PackFGFX + (15 tiles) * 0 ; KEY_ITEM_POCKET + dw PackFGFX + (15 tiles) * 2 ; TM_HM_POCKET + +PackFGFX: ; 48e9b +INCBIN "gfx/pack/pack_f.2bpp" diff --git a/engine/gfx/loadoverworldfont.asm b/engine/gfx/loadoverworldfont.asm new file mode 100644 index 000000000..f23f01c4e --- /dev/null +++ b/engine/gfx/loadoverworldfont.asm @@ -0,0 +1,17 @@ +LoadOverworldFont:: ; 106594 + ld de, .OverworldFontGFX + ld hl, vTiles1 + lb bc, BANK(.OverworldFontGFX), $80 + call Get2bpp + ld de, .OverworldFontSpaceGFX + ld hl, vTiles2 tile " " + lb bc, BANK(.OverworldFontSpaceGFX), 1 + call Get2bpp + ret +; 1065ad + +.OverworldFontGFX: +INCBIN "gfx/font/overworld.2bpp" + +.OverworldFontSpaceGFX: +INCBIN "gfx/font/overworld_space.2bpp" diff --git a/engine/gfx/placegraphic.asm b/engine/gfx/placegraphic.asm new file mode 100644 index 000000000..21b914950 --- /dev/null +++ b/engine/gfx/placegraphic.asm @@ -0,0 +1,55 @@ +PlaceGraphic: ; 2ef6e +; Fill wBoxAlignment-aligned box width b height c +; with iterating tile starting from hGraphicStartTile at hl. + + ld de, SCREEN_WIDTH + + ld a, [wBoxAlignment] + and a + jr nz, .right + + ld a, [hGraphicStartTile] +.x1 + push bc + push hl + +.y1 + ld [hl], a + add hl, de + inc a + dec c + jr nz, .y1 + + pop hl + inc hl + pop bc + dec b + jr nz, .x1 + ret + +.right +; Right-aligned. + push bc + ld b, 0 + dec c + add hl, bc + pop bc + + ld a, [hGraphicStartTile] +.x2 + push bc + push hl + +.y2 + ld [hl], a + add hl, de + inc a + dec c + jr nz, .y2 + + pop hl + dec hl + pop bc + dec b + jr nz, .x2 + ret diff --git a/engine/gfx/trademonfrontpic.asm b/engine/gfx/trademonfrontpic.asm new file mode 100644 index 000000000..d5f7b55de --- /dev/null +++ b/engine/gfx/trademonfrontpic.asm @@ -0,0 +1,38 @@ +GetTrademonFrontpic: ; 4d7fd + ld a, [wOTTrademonSpecies] + ld hl, wOTTrademonDVs + ld de, vTiles2 + push de + push af + predef GetUnownLetter + pop af + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + pop de + predef GetAnimatedFrontpic + ret + +AnimateTrademonFrontpic: ; 4d81e + ld a, [wOTTrademonSpecies] + call IsAPokemon + ret c + farcall ShowOTTrademonStats + ld a, [wOTTrademonSpecies] + ld [wCurPartySpecies], a + ld a, [wOTTrademonDVs] + ld [wTempMonDVs], a + ld a, [wOTTrademonDVs + 1] + ld [wTempMonDVs + 1], a + ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + farcall TradeAnim_ShowGetmonFrontpic + ld a, [wOTTrademonSpecies] + ld [wCurPartySpecies], a + hlcoord 7, 2 + ld d, $0 + ld e, ANIM_MON_TRADE + predef AnimateFrontpic + ret diff --git a/engine/item_effects.asm b/engine/item_effects.asm deleted file mode 100644 index 0b5285608..000000000 --- a/engine/item_effects.asm +++ /dev/null @@ -1,3118 +0,0 @@ -_DoItemEffect:: ; e722 - ld a, [wCurItem] - ld [wd265], a - call GetItemName - call CopyName1 - ld a, 1 - ld [wItemEffectSucceeded], a - ld a, [wCurItem] - dec a - ld hl, ItemEffects - rst JumpTable - ret -; e73c - - -ItemEffects: ; e73c -; entries correspond to item ids - dw PokeBallEffect ; MASTER_BALL - dw PokeBallEffect ; ULTRA_BALL - dw NoEffect ; BRIGHTPOWDER - dw PokeBallEffect ; GREAT_BALL - dw PokeBallEffect ; POKE_BALL - dw TownMapEffect ; TOWN_MAP - dw BicycleEffect ; BICYCLE - dw EvoStoneEffect ; MOON_STONE - dw StatusHealingEffect ; ANTIDOTE - dw StatusHealingEffect ; BURN_HEAL - dw StatusHealingEffect ; ICE_HEAL - dw StatusHealingEffect ; AWAKENING - dw StatusHealingEffect ; PARLYZ_HEAL - dw FullRestoreEffect ; FULL_RESTORE - dw RestoreHPEffect ; MAX_POTION - dw RestoreHPEffect ; HYPER_POTION - dw RestoreHPEffect ; SUPER_POTION - dw RestoreHPEffect ; POTION - dw EscapeRopeEffect ; ESCAPE_ROPE - dw RepelEffect ; REPEL - dw RestorePPEffect ; MAX_ELIXER - dw EvoStoneEffect ; FIRE_STONE - dw EvoStoneEffect ; THUNDERSTONE - dw EvoStoneEffect ; WATER_STONE - dw NoEffect ; ITEM_19 - dw VitaminEffect ; HP_UP - dw VitaminEffect ; PROTEIN - dw VitaminEffect ; IRON - dw VitaminEffect ; CARBOS - dw NoEffect ; LUCKY_PUNCH - dw VitaminEffect ; CALCIUM - dw RareCandyEffect ; RARE_CANDY - dw XAccuracyEffect ; X_ACCURACY - dw EvoStoneEffect ; LEAF_STONE - dw NoEffect ; METAL_POWDER - dw NoEffect ; NUGGET - dw PokeDollEffect ; POKE_DOLL - dw StatusHealingEffect ; FULL_HEAL - dw ReviveEffect ; REVIVE - dw ReviveEffect ; MAX_REVIVE - dw GuardSpecEffect ; GUARD_SPEC - dw SuperRepelEffect ; SUPER_REPEL - dw MaxRepelEffect ; MAX_REPEL - dw DireHitEffect ; DIRE_HIT - dw NoEffect ; ITEM_2D - dw RestoreHPEffect ; FRESH_WATER - dw RestoreHPEffect ; SODA_POP - dw RestoreHPEffect ; LEMONADE - dw XItemEffect ; X_ATTACK - dw NoEffect ; ITEM_32 - dw XItemEffect ; X_DEFEND - dw XItemEffect ; X_SPEED - dw XItemEffect ; X_SPECIAL - dw CoinCaseEffect ; COIN_CASE - dw ItemfinderEffect ; ITEMFINDER - dw PokeFluteEffect ; POKE_FLUTE - dw NoEffect ; EXP_SHARE - dw OldRodEffect ; OLD_ROD - dw GoodRodEffect ; GOOD_ROD - dw NoEffect ; SILVER_LEAF - dw SuperRodEffect ; SUPER_ROD - dw RestorePPEffect ; PP_UP - dw RestorePPEffect ; ETHER - dw RestorePPEffect ; MAX_ETHER - dw RestorePPEffect ; ELIXER - dw NoEffect ; RED_SCALE - dw NoEffect ; SECRETPOTION - dw NoEffect ; S_S_TICKET - dw NoEffect ; MYSTERY_EGG - dw NoEffect ; CLEAR_BELL - dw NoEffect ; SILVER_WING - dw RestoreHPEffect ; MOOMOO_MILK - dw NoEffect ; QUICK_CLAW - dw StatusHealingEffect ; PSNCUREBERRY - dw NoEffect ; GOLD_LEAF - dw NoEffect ; SOFT_SAND - dw NoEffect ; SHARP_BEAK - dw StatusHealingEffect ; PRZCUREBERRY - dw StatusHealingEffect ; BURNT_BERRY - dw StatusHealingEffect ; ICE_BERRY - dw NoEffect ; POISON_BARB - dw NoEffect ; KINGS_ROCK - dw BitterBerryEffect ; BITTER_BERRY - dw StatusHealingEffect ; MINT_BERRY - dw NoEffect ; RED_APRICORN - dw NoEffect ; TINYMUSHROOM - dw NoEffect ; BIG_MUSHROOM - dw NoEffect ; SILVERPOWDER - dw NoEffect ; BLU_APRICORN - dw NoEffect ; ITEM_5A - dw NoEffect ; AMULET_COIN - dw NoEffect ; YLW_APRICORN - dw NoEffect ; GRN_APRICORN - dw NoEffect ; CLEANSE_TAG - dw NoEffect ; MYSTIC_WATER - dw NoEffect ; TWISTEDSPOON - dw NoEffect ; WHT_APRICORN - dw NoEffect ; BLACKBELT - dw NoEffect ; BLK_APRICORN - dw NoEffect ; ITEM_64 - dw NoEffect ; PNK_APRICORN - dw NoEffect ; BLACKGLASSES - dw NoEffect ; SLOWPOKETAIL - dw NoEffect ; PINK_BOW - dw NoEffect ; STICK - dw NoEffect ; SMOKE_BALL - dw NoEffect ; NEVERMELTICE - dw NoEffect ; MAGNET - dw StatusHealingEffect ; MIRACLEBERRY - dw NoEffect ; PEARL - dw NoEffect ; BIG_PEARL - dw NoEffect ; EVERSTONE - dw NoEffect ; SPELL_TAG - dw RestoreHPEffect ; RAGECANDYBAR - dw NoEffect ; GS_BALL - dw BlueCardEffect ; BLUE_CARD - dw NoEffect ; MIRACLE_SEED - dw NoEffect ; THICK_CLUB - dw NoEffect ; FOCUS_BAND - dw NoEffect ; ITEM_78 - dw EnergypowderEffect ; ENERGYPOWDER - dw EnergyRootEffect ; ENERGY_ROOT - dw HealPowderEffect ; HEAL_POWDER - dw RevivalHerbEffect ; REVIVAL_HERB - dw NoEffect ; HARD_STONE - dw NoEffect ; LUCKY_EGG - dw CardKeyEffect ; CARD_KEY - dw NoEffect ; MACHINE_PART - dw NoEffect ; EGG_TICKET - dw NoEffect ; LOST_ITEM - dw NoEffect ; STARDUST - dw NoEffect ; STAR_PIECE - dw BasementKeyEffect ; BASEMENT_KEY - dw NoEffect ; PASS - dw NoEffect ; ITEM_87 - dw NoEffect ; ITEM_88 - dw NoEffect ; ITEM_89 - dw NoEffect ; CHARCOAL - dw RestoreHPEffect ; BERRY_JUICE - dw NoEffect ; SCOPE_LENS - dw NoEffect ; ITEM_8D - dw NoEffect ; ITEM_8E - dw NoEffect ; METAL_COAT - dw NoEffect ; DRAGON_FANG - dw NoEffect ; ITEM_91 - dw NoEffect ; LEFTOVERS - dw NoEffect ; ITEM_93 - dw NoEffect ; ITEM_94 - dw NoEffect ; ITEM_95 - dw RestorePPEffect ; MYSTERYBERRY - dw NoEffect ; DRAGON_SCALE - dw NoEffect ; BERSERK_GENE - dw NoEffect ; ITEM_99 - dw NoEffect ; ITEM_9A - dw NoEffect ; ITEM_9B - dw SacredAshEffect ; SACRED_ASH - dw PokeBallEffect ; HEAVY_BALL - dw NoEffect ; FLOWER_MAIL - dw PokeBallEffect ; LEVEL_BALL - dw PokeBallEffect ; LURE_BALL - dw PokeBallEffect ; FAST_BALL - dw NoEffect ; ITEM_A2 - dw NoEffect ; LIGHT_BALL - dw PokeBallEffect ; FRIEND_BALL - dw PokeBallEffect ; MOON_BALL - dw PokeBallEffect ; LOVE_BALL - dw NormalBoxEffect ; NORMAL_BOX - dw GorgeousBoxEffect ; GORGEOUS_BOX - dw EvoStoneEffect ; SUN_STONE - dw NoEffect ; POLKADOT_BOW - dw NoEffect ; ITEM_AB - dw NoEffect ; UP_GRADE - dw RestoreHPEffect ; BERRY - dw RestoreHPEffect ; GOLD_BERRY - dw SquirtbottleEffect ; SQUIRTBOTTLE - dw NoEffect ; ITEM_B0 - dw PokeBallEffect ; PARK_BALL - dw NoEffect ; RAINBOW_WING - dw NoEffect ; ITEM_B3 -; e8a2 - - -PokeBallEffect: ; e8a2 - ld a, [wBattleMode] - dec a - jp nz, UseBallInTrainerBattle - - ld a, [wPartyCount] - cp PARTY_LENGTH - jr nz, .room_in_party - - ld a, BANK(sBoxCount) - call GetSRAMBank - ld a, [sBoxCount] - cp MONS_PER_BOX - call CloseSRAM - jp z, Ball_BoxIsFullMessage - -.room_in_party - xor a - ld [wWildMon], a - ld a, [wCurItem] - cp PARK_BALL - call nz, ReturnToBattle_UseBall - - ld hl, wOptions - res NO_TEXT_SCROLL, [hl] - ld hl, UsedItemText - call PrintText - - ld a, [wEnemyMonCatchRate] - ld b, a - ld a, [wBattleType] - cp BATTLETYPE_TUTORIAL - jp z, .catch_without_fail - ld a, [wCurItem] - cp MASTER_BALL - jp z, .catch_without_fail - ld a, [wCurItem] - ld c, a - ld hl, BallMultiplierFunctionTable - -.get_multiplier_loop - ld a, [hli] - cp $ff - jr z, .skip_or_return_from_ball_fn - cp c - jr z, .call_ball_function - inc hl - inc hl - jr .get_multiplier_loop - -.call_ball_function - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .skip_or_return_from_ball_fn - push de - jp hl - -.skip_or_return_from_ball_fn - ld a, [wCurItem] - cp LEVEL_BALL - ld a, b - jp z, .skip_hp_calc - - ld a, b - ld [hMultiplicand + 2], a - - ld hl, wEnemyMonHP - ld b, [hl] - inc hl - ld c, [hl] - inc hl - ld d, [hl] - inc hl - ld e, [hl] - sla c - rl b - - ld h, d - ld l, e - add hl, de - add hl, de - ld d, h - ld e, l - ld a, d - and a - jr z, .okay_1 - - srl d - rr e - srl d - rr e - srl b - rr c - srl b - rr c - - ld a, c - and a - jr nz, .okay_1 - ld c, $1 -.okay_1 - ld b, e - - push bc - ld a, b - sub c - ld [hMultiplier], a - xor a - ld [hDividend + 0], a - ld [hMultiplicand + 0], a - ld [hMultiplicand + 1], a - call Multiply - pop bc - - ld a, b - ld [hDivisor], a - ld b, $4 - call Divide - - ld a, [hQuotient + 2] - and a - jr nz, .statuscheck - ld a, 1 -.statuscheck -; This routine is buggy. It was intended that SLP and FRZ provide a higher -; catch rate than BRN/PSN/PAR, which in turn provide a higher catch rate than -; no status effect at all. But instead, it makes BRN/PSN/PAR provide no -; benefit. -; Uncomment the line below to fix this. - ld b, a - ld a, [wEnemyMonStatus] - and 1 << FRZ | SLP - ld c, 10 - jr nz, .addstatus - ; ld a, [wEnemyMonStatus] - and a - ld c, 5 - jr nz, .addstatus - ld c, 0 -.addstatus - ld a, b - add c - jr nc, .max_1 - ld a, $ff -.max_1 - - ; BUG: farcall overwrites a, and GetItemHeldEffect takes b anyway. - ; This is probably the reason the HELD_CATCH_CHANCE effect is never used. - ; Uncomment the line below to fix. - ld d, a - push de - ld a, [wBattleMonItem] - ; ld b, a - farcall GetItemHeldEffect - ld a, b - cp HELD_CATCH_CHANCE - pop de - ld a, d - jr nz, .max_2 - add c - jr nc, .max_2 - ld a, $ff -.max_2 - -.skip_hp_calc - ld b, a - ld [wBuffer1], a - call Random - - cp b - ld a, 0 - jr z, .catch_without_fail - jr nc, .fail_to_catch - -.catch_without_fail - ld a, [wEnemyMonSpecies] - -.fail_to_catch - ld [wWildMon], a - ld c, 20 - call DelayFrames - - ld a, [wCurItem] - cp POKE_BALL + 1 ; Assumes Master/Ultra/Great come before - jr c, .not_kurt_ball - ld a, POKE_BALL -.not_kurt_ball - ld [wBattleAnimParam], a - - ld de, ANIM_THROW_POKE_BALL - ld a, e - ld [wFXAnimID], a - ld a, d - ld [wFXAnimID + 1], a - xor a - ld [hBattleTurn], a - ld [wBuffer2], a - ld [wNumHits], a - predef PlayBattleAnim - - ld a, [wWildMon] - and a - jr nz, .caught - ld a, [wBuffer2] - cp $1 - ld hl, Text_NoShake - jp z, .shake_and_break_free - cp $2 - ld hl, Text_OneShake - jp z, .shake_and_break_free - cp $3 - ld hl, Text_TwoShakes - jp z, .shake_and_break_free - cp $4 - ld hl, Text_ThreeShakes - jp z, .shake_and_break_free -.caught - - ld hl, wEnemyMonStatus - ld a, [hli] - push af - inc hl - ld a, [hli] - push af - ld a, [hl] - push af - push hl - ld hl, wEnemyMonItem - ld a, [hl] - push af - push hl - ld hl, wEnemySubStatus5 - ld a, [hl] - push af - set SUBSTATUS_TRANSFORMED, [hl] - -; This code is buggy. Any wild Pokémon that has Transformed will be -; caught as a Ditto, even if it was something else like Mew. -; To fix, do not set [wTempEnemyMonSpecies] to DITTO. - bit SUBSTATUS_TRANSFORMED, a - jr nz, .ditto - jr .not_ditto - -.ditto - ld a, DITTO - ld [wTempEnemyMonSpecies], a - jr .load_data - -.not_ditto - set SUBSTATUS_TRANSFORMED, [hl] - ld hl, wEnemyBackupDVs - ld a, [wEnemyMonDVs] - ld [hli], a - ld a, [wEnemyMonDVs + 1] - ld [hl], a - -.load_data - ld a, [wTempEnemyMonSpecies] - ld [wCurPartySpecies], a - ld a, [wEnemyMonLevel] - ld [wCurPartyLevel], a - farcall LoadEnemyMon - - pop af - ld [wEnemySubStatus5], a - - pop hl - pop af - ld [hl], a - pop hl - pop af - ld [hld], a - pop af - ld [hld], a - dec hl - pop af - ld [hl], a - - ld hl, wEnemySubStatus5 - bit SUBSTATUS_TRANSFORMED, [hl] - jr nz, .Transformed - ld hl, wWildMonMoves - ld de, wEnemyMonMoves - ld bc, NUM_MOVES - call CopyBytes - - ld hl, wWildMonPP - ld de, wEnemyMonPP - ld bc, NUM_MOVES - call CopyBytes -.Transformed: - - ld a, [wEnemyMonSpecies] - ld [wWildMon], a - ld [wCurPartySpecies], a - ld [wd265], a - ld a, [wBattleType] - cp BATTLETYPE_TUTORIAL - jp z, .FinishTutorial - - farcall StubbedTrainerRankings_WildMonsCaught - - ld hl, Text_GotchaMonWasCaught - call PrintText - - call ClearSprites - - ld a, [wd265] - dec a - call CheckCaughtMon - - ld a, c - push af - ld a, [wd265] - dec a - call SetSeenAndCaughtMon - pop af - and a - jr nz, .skip_pokedex - - call CheckReceivedDex - jr z, .skip_pokedex - - ld hl, Text_AddedToPokedex - call PrintText - - call ClearSprites - - ld a, [wEnemyMonSpecies] - ld [wd265], a - predef NewPokedexEntry - -.skip_pokedex - ld a, [wBattleType] - cp BATTLETYPE_CONTEST - jp z, .catch_bug_contest_mon - cp BATTLETYPE_CELEBI - jr nz, .not_celebi - ld hl, wBattleResult - set 6, [hl] -.not_celebi - - ld a, [wPartyCount] - cp PARTY_LENGTH - jr z, .SendToPC - - xor a ; PARTYMON - ld [wMonType], a - call ClearSprites - - predef TryAddMonToParty - - farcall SetCaughtData - - ld a, [wCurItem] - cp FRIEND_BALL - jr nz, .SkipPartyMonFriendBall - - ld a, [wPartyCount] - dec a - ld hl, wPartyMon1Happiness - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - - ld a, FRIEND_BALL_HAPPINESS - ld [hl], a -.SkipPartyMonFriendBall: - - ld hl, Text_AskNicknameNewlyCaughtMon - call PrintText - - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - - call YesNoBox - jp c, .return_from_capture - - ld a, [wPartyCount] - dec a - ld [wCurPartyMon], a - ld hl, wPartyMonNicknames - ld bc, MON_NAME_LENGTH - call AddNTimes - - ld d, h - ld e, l - push de - xor a ; PARTYMON - ld [wMonType], a - ld b, 0 - farcall NamingScreen - - call RotateThreePalettesRight - - call LoadStandardFont - - pop hl - ld de, wStringBuffer1 - call InitName - - jp .return_from_capture - -.SendToPC: - call ClearSprites - - predef SendMonIntoBox - - farcall SetBoxMonCaughtData - - ld a, BANK(sBoxCount) - call GetSRAMBank - - ld a, [sBoxCount] - cp MONS_PER_BOX - jr nz, .BoxNotFullYet - ld hl, wBattleResult - set 7, [hl] -.BoxNotFullYet: - ld a, [wCurItem] - cp FRIEND_BALL - jr nz, .SkipBoxMonFriendBall - ; The captured mon is now first in the box - ld a, FRIEND_BALL_HAPPINESS - ld [sBoxMon1Happiness], a -.SkipBoxMonFriendBall: - call CloseSRAM - - ld hl, Text_AskNicknameNewlyCaughtMon - call PrintText - - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - - call YesNoBox - jr c, .SkipBoxMonNickname - - xor a - ld [wCurPartyMon], a - ld a, BOXMON - ld [wMonType], a - ld de, wMonOrItemNameBuffer - ld b, $0 - farcall NamingScreen - - ld a, BANK(sBoxMonNicknames) - call GetSRAMBank - - ld hl, wMonOrItemNameBuffer - ld de, sBoxMonNicknames - ld bc, MON_NAME_LENGTH - call CopyBytes - - ld hl, sBoxMonNicknames - ld de, wStringBuffer1 - call InitName - - call CloseSRAM - -.SkipBoxMonNickname: - ld a, BANK(sBoxMonNicknames) - call GetSRAMBank - - ld hl, sBoxMonNicknames - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - - call CloseSRAM - - ld hl, Text_SentToBillsPC - call PrintText - - call RotateThreePalettesRight - call LoadStandardFont - jr .return_from_capture - -.catch_bug_contest_mon - farcall BugContest_SetCaughtContestMon - jr .return_from_capture - -.FinishTutorial: - ld hl, Text_GotchaMonWasCaught - -.shake_and_break_free - call PrintText - call ClearSprites - -.return_from_capture - ld a, [wBattleType] - cp BATTLETYPE_TUTORIAL - ret z - cp BATTLETYPE_DEBUG - ret z - cp BATTLETYPE_CONTEST - jr z, .used_park_ball - - ld a, [wWildMon] - and a - jr z, .toss - - call ClearBGPalettes - call ClearTileMap - -.toss - ld hl, wNumItems - inc a - ld [wItemQuantityChangeBuffer], a - jp TossItem - -.used_park_ball - ld hl, wParkBallsRemaining - dec [hl] - ret -; ec0a - - -BallMultiplierFunctionTable: -; table of routines that increase or decrease the catch rate based on -; which ball is used in a certain situation. - dbw ULTRA_BALL, UltraBallMultiplier - dbw GREAT_BALL, GreatBallMultiplier - dbw SAFARI_BALL, SafariBallMultiplier ; Safari Ball, leftover from RBY - dbw HEAVY_BALL, HeavyBallMultiplier - dbw LEVEL_BALL, LevelBallMultiplier - dbw LURE_BALL, LureBallMultiplier - dbw FAST_BALL, FastBallMultiplier - dbw MOON_BALL, MoonBallMultiplier - dbw LOVE_BALL, LoveBallMultiplier - dbw PARK_BALL, ParkBallMultiplier - db -1 ; end - -UltraBallMultiplier: -; multiply catch rate by 2 - sla b - ret nc - ld b, $ff - ret - -SafariBallMultiplier: -GreatBallMultiplier: -ParkBallMultiplier: -; multiply catch rate by 1.5 - ld a, b - srl a - add b - ld b, a - ret nc - ld b, $ff - ret - -GetPokedexEntryBank: - push hl - push de - ld a, [wEnemyMonSpecies] - rlca - rlca - maskbits NUM_DEX_ENTRY_BANKS - ld hl, .PokedexEntryBanks - ld d, 0 - ld e, a - add hl, de - ld a, [hl] - pop de - pop hl - ret - -.PokedexEntryBanks: - db BANK(PokedexEntries1) - db BANK(PokedexEntries2) - db BANK(PokedexEntries3) - db BANK(PokedexEntries4) - -HeavyBallMultiplier: -; subtract 20 from catch rate if weight < 102.4 kg -; else add 0 to catch rate if weight < 204.8 kg -; else add 20 to catch rate if weight < 307.2 kg -; else add 30 to catch rate if weight < 409.6 kg -; else add 40 to catch rate (never happens) - ld a, [wEnemyMonSpecies] - ld hl, PokedexDataPointerTable - dec a - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, BANK(PokedexDataPointerTable) - call GetFarHalfword - -.SkipText: - call GetPokedexEntryBank - call GetFarByte - inc hl - cp "@" - jr nz, .SkipText - - call GetPokedexEntryBank - push bc - inc hl - inc hl - call GetFarHalfword - - srl h - rr l - ld b, h - ld c, l - - rept 4 - srl b - rr c - endr - call .subbc - - srl b - rr c - call .subbc - - ld a, h - pop bc - jr .compare - -.subbc - ; subtract bc from hl - push bc - ld a, b - cpl - ld b, a - ld a, c - cpl - ld c, a - inc bc - add hl, bc - pop bc - ret - -.compare - ld c, a - cp HIGH(1024) ; 102.4 kg - jr c, .lightmon - - ld hl, .WeightsTable -.lookup - ld a, c - cp [hl] - jr c, .heavymon - inc hl - inc hl - jr .lookup - -.heavymon - inc hl - ld a, b - add [hl] - ld b, a - ret nc - ld b, $ff - ret - -.lightmon - ld a, b - sub 20 - ld b, a - ret nc - ld b, $1 - ret - -.WeightsTable: -; weight factor, boost - db HIGH(2048), 0 - db HIGH(3072), 20 - db HIGH(4096), 30 - db HIGH(65280), 40 - -LureBallMultiplier: -; multiply catch rate by 3 if this is a fishing rod battle - ld a, [wBattleType] - cp BATTLETYPE_FISH - ret nz - - ld a, b - add a - jr c, .max - - add b - jr nc, .done -.max - ld a, $ff -.done - ld b, a - ret - -MoonBallMultiplier: -; This function is buggy. -; Intent: multiply catch rate by 4 if mon evolves with moon stone -; Reality: no boost - push bc - ld a, [wTempEnemyMonSpecies] - dec a - ld c, a - ld b, 0 - ld hl, EvosAttacksPointers - add hl, bc - add hl, bc - ld a, BANK(EvosAttacksPointers) - call GetFarHalfword - pop bc - - push bc - ld a, BANK(EvosAttacks) - call GetFarByte - cp EVOLVE_ITEM - pop bc - ret nz - - inc hl - inc hl - inc hl - -; Moon Stone's constant from Pokémon Red is used. -; No Pokémon evolve with Burn Heal, -; so Moon Balls always have a catch rate of 1×. - push bc - ld a, BANK(EvosAttacks) - call GetFarByte - cp MOON_STONE_RED ; BURN_HEAL - pop bc - ret nz - - sla b - jr c, .max - sla b - jr nc, .done -.max - ld b, $ff -.done - ret - -LoveBallMultiplier: -; This function is buggy. -; Intent: multiply catch rate by 8 if mons are of same species, different sex -; Reality: multiply catch rate by 8 if mons are of same species, same sex - - ; does species match? - ld a, [wTempEnemyMonSpecies] - ld c, a - ld a, [wTempBattleMonSpecies] - cp c - ret nz - - ; check player mon species - push bc - ld a, [wTempBattleMonSpecies] - ld [wCurPartySpecies], a - xor a ; PARTYMON - ld [wMonType], a - ld a, [wCurBattleMon] - ld [wCurPartyMon], a - farcall GetGender - jr c, .done1 ; no effect on genderless - - ld d, 0 ; male - jr nz, .playermale - inc d ; female -.playermale - - ; check wild mon species - push de - ld a, [wTempEnemyMonSpecies] - ld [wCurPartySpecies], a - ld a, WILDMON - ld [wMonType], a - farcall GetGender - jr c, .done2 ; no effect on genderless - - ld d, 0 ; male - jr nz, .wildmale - inc d ; female -.wildmale - - ld a, d - pop de - cp d - pop bc - ret nz ; for the intended effect, this should be "ret z" - - sla b - jr c, .max - sla b - jr c, .max - sla b - ret nc -.max - ld b, $ff - ret - -.done2 - pop de - -.done1 - pop bc - ret - -FastBallMultiplier: -; This function is buggy. -; Intent: multiply catch rate by 4 if enemy mon is in one of the three -; FleeMons tables. -; Reality: multiply catch rate by 4 if enemy mon is one of the first three in -; the first FleeMons table. - ld a, [wTempEnemyMonSpecies] - ld c, a - ld hl, FleeMons - ld d, 3 - -.loop - ld a, BANK(FleeMons) - call GetFarByte - - inc hl - cp -1 - jr z, .next - cp c - jr nz, .next ; for the intended effect, this should be "jr nz, .loop" - sla b - jr c, .max - - sla b - ret nc - -.max - ld b, $ff - ret - -.next - dec d - jr nz, .loop - ret - -LevelBallMultiplier: -; multiply catch rate by 8 if player mon level / 4 > enemy mon level -; multiply catch rate by 4 if player mon level / 2 > enemy mon level -; multiply catch rate by 2 if player mon level > enemy mon level - ld a, [wBattleMonLevel] - ld c, a - ld a, [wEnemyMonLevel] - cp c - ret nc ; if player is lower level, we're done here - sla b - jr c, .max - - srl c - cp c - ret nc ; if player/2 is lower level, we're done here - sla b - jr c, .max - - srl c - cp c - ret nc ; if player/4 is lower level, we're done here - sla b - ret nc - -.max - ld b, $ff - ret - -; These two texts were carried over from gen 1. -; They are not used in gen 2, and are dummied out. - -Text_RBY_CatchMarowak: ; 0xedab - ; It dodged the thrown BALL! This #MON can't be caught! - text_jump UnknownText_0x1c5a5a - db "@" -; 0xedb0 - -Text_RBY_NoShake: ; 0xedb0 - ; You missed the #MON! - text_jump UnknownText_0x1c5a90 - db "@" -; 0xedb5 - -Text_NoShake: ; 0xedb5 - ; Oh no! The #MON broke free! - text_jump UnknownText_0x1c5aa6 - db "@" -; 0xedba - -Text_OneShake: ; 0xedba - ; Aww! It appeared to be caught! - text_jump UnknownText_0x1c5ac3 - db "@" -; 0xedbf - -Text_TwoShakes: ; 0xedbf - ; Aargh! Almost had it! - text_jump UnknownText_0x1c5ae3 - db "@" -; 0xedc4 - -Text_ThreeShakes: ; 0xedc4 - ; Shoot! It was so close too! - text_jump UnknownText_0x1c5afa - db "@" -; 0xedc9 - -Text_GotchaMonWasCaught: ; 0xedc9 - ; Gotcha! @ was caught!@ @ - text_jump UnknownText_0x1c5b17 - start_asm - call WaitSFX - push bc - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - ld de, MUSIC_CAPTURE - call PlayMusic - pop bc - ld hl, TextJump_Waitbutton - ret -; ede6 - -TextJump_Waitbutton: ; 0xede6 - ; @ - text_jump Text_Waitbutton_2 - db "@" -; 0xedeb - -Text_SentToBillsPC: ; 0xedeb - ; was sent to BILL's PC. - text_jump UnknownText_0x1c5b38 - db "@" -; 0xedf0 - -Text_AddedToPokedex: ; 0xedf0 - ; 's data was newly added to the #DEX.@ @ - text_jump UnknownText_0x1c5b53 - db "@" -; 0xedf5 - -Text_AskNicknameNewlyCaughtMon: ; 0xedf5 - ; Give a nickname to @ ? - text_jump UnknownText_0x1c5b7f - db "@" -; 0xedfa - -ReturnToBattle_UseBall: ; edfa (3:6dfa) - farcall _ReturnToBattle_UseBall - ret - -TownMapEffect: ; ee01 - farcall PokegearMap - ret -; ee08 - - -BicycleEffect: ; ee08 - farcall BikeFunction - ret -; ee0f - - -EvoStoneEffect: ; ee0f - ld b, PARTYMENUACTION_EVO_STONE - call UseItem_SelectMon - - jp c, .DecidedNotToUse - - ld a, MON_ITEM - call GetPartyParamLocation - - ld a, [hl] - cp EVERSTONE - jr z, .NoEffect - - ld a, $1 - ld [wForceEvolution], a - farcall EvolvePokemon - - ld a, [wMonTriedToEvolve] - and a - jr z, .NoEffect - - jp UseDisposableItem - -.NoEffect: - call WontHaveAnyEffectMessage - -.DecidedNotToUse: - xor a - ld [wItemEffectSucceeded], a - ret -; ee3d - - -VitaminEffect: ; ee3d - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - - jp c, RareCandy_StatBooster_ExitMenu - - call RareCandy_StatBooster_GetParameters - - call GetStatExpRelativePointer - - ld a, MON_STAT_EXP - call GetPartyParamLocation - - add hl, bc - ld a, [hl] - cp 100 - jr nc, NoEffectMessage - - add 10 - ld [hl], a - call UpdateStatsAfterItem - - call GetStatExpRelativePointer - - ld hl, StatStrings - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wStringBuffer2 - ld bc, ITEM_NAME_LENGTH - call CopyBytes - - call Play_SFX_FULL_HEAL - - ld hl, Text_StatRose - call PrintText - - ld c, HAPPINESS_USEDITEM - farcall ChangeHappiness - - jp UseDisposableItem - - -NoEffectMessage: ; ee83 - ld hl, WontHaveAnyEffectText - call PrintText - jp ClearPalettes -; ee8c - - -UpdateStatsAfterItem: ; ee8c - ld a, MON_MAXHP - call GetPartyParamLocation - ld d, h - ld e, l - ld a, MON_STAT_EXP - 1 - call GetPartyParamLocation - ld b, TRUE - predef_jump CalcMonStats -; ee9f - -RareCandy_StatBooster_ExitMenu: ; ee9f - xor a - ld [wItemEffectSucceeded], a - jp ClearPalettes -; eea6 - - -Text_StatRose: ; 0xeea6 - ; 's @ rose. - text_jump UnknownText_0x1c5b9a - db "@" -; 0xeeab - - -StatStrings: ; eeab - dw .health - dw .attack - dw .defense - dw .speed - dw .special - -.health db "HEALTH@" -.attack db "ATTACK@" -.defense db "DEFENSE@" -.speed db "SPEED@" -.special db "SPECIAL@" -; eed9 - - -GetStatExpRelativePointer: ; eed9 - ld a, [wCurItem] - ld hl, Table_eeeb -.next - cp [hl] - inc hl - jr z, .got_it - inc hl - jr .next - -.got_it - ld a, [hl] - ld c, a - ld b, 0 - ret -; eeeb - -Table_eeeb: ; eeeb - db HP_UP, MON_HP_EXP - MON_STAT_EXP - db PROTEIN, MON_ATK_EXP - MON_STAT_EXP - db IRON, MON_DEF_EXP - MON_STAT_EXP - db CARBOS, MON_SPD_EXP - MON_STAT_EXP - db CALCIUM, MON_SPC_EXP - MON_STAT_EXP -; eef5 - - -RareCandy_StatBooster_GetParameters: ; eef5 - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - ld [wd265], a - ld a, MON_LEVEL - call GetPartyParamLocation - ld a, [hl] - ld [wCurPartyLevel], a - call GetBaseData - ld a, [wCurPartyMon] - ld hl, wPartyMonNicknames - call GetNick - ret -; 0xef14 - - -RareCandyEffect: ; ef14 - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - - jp c, RareCandy_StatBooster_ExitMenu - - call RareCandy_StatBooster_GetParameters - - ld a, MON_LEVEL - call GetPartyParamLocation - - ld a, [hl] - cp MAX_LEVEL - jp nc, NoEffectMessage - - inc a - ld [hl], a - ld [wCurPartyLevel], a - push de - ld d, a - farcall CalcExpAtLevel - - pop de - ld a, MON_EXP - call GetPartyParamLocation - - ld a, [hMultiplicand] - ld [hli], a - ld a, [hMultiplicand + 1] - ld [hli], a - ld a, [hMultiplicand + 2] - ld [hl], a - - ld a, MON_MAXHP - call GetPartyParamLocation - ld a, [hli] - ld b, a - ld c, [hl] - push bc - call UpdateStatsAfterItem - - ld a, MON_MAXHP + 1 - call GetPartyParamLocation - - pop bc - ld a, [hld] - sub c - ld c, a - ld a, [hl] - sbc b - ld b, a - dec hl - ld a, [hl] - add c - ld [hld], a - ld a, [hl] - adc b - ld [hl], a - farcall LevelUpHappinessMod - - ld a, PARTYMENUTEXT_LEVEL_UP - call ItemActionText - - xor a ; PARTYMON - ld [wMonType], a - predef CopyMonToTempMon - - hlcoord 9, 0 - ld b, 10 - ld c, 9 - call TextBox - - hlcoord 11, 1 - ld bc, 4 - predef PrintTempMonStats - - call WaitPressAorB_BlinkCursor - - xor a ; PARTYMON - ld [wMonType], a - ld a, [wCurPartySpecies] - ld [wd265], a - predef LearnLevelMoves - - xor a - ld [wForceEvolution], a - farcall EvolvePokemon - - jp UseDisposableItem -; efad - - -HealPowderEffect: ; efad - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - - jp c, StatusHealer_ExitMenu - - call UseStatusHealer - - cp $0 - jr nz, .asm_efc9 - ld c, HAPPINESS_BITTERPOWDER - farcall ChangeHappiness - - call LooksBitterMessage - - ld a, $0 - -.asm_efc9 - jp StatusHealer_Jumptable -; efcc - - -StatusHealingEffect: ; efcc - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - jp c, StatusHealer_ExitMenu - -FullyHealStatus: ; efd4 - call UseStatusHealer - jp StatusHealer_Jumptable -; efda - - -UseStatusHealer: ; efda (3:6fda) - call IsMonFainted - ld a, $1 - ret z - call GetItemHealingAction - ld a, MON_STATUS - call GetPartyParamLocation - ld a, [hl] - and c - jr nz, .good - call IsItemUsedOnConfusedMon - ld a, $1 - ret nc - ld b, PARTYMENUTEXT_HEAL_CONFUSION -.good - xor a - ld [hl], a - ld a, b - ld [wPartyMenuActionText], a - call HealStatus - call Play_SFX_FULL_HEAL - call ItemActionTextWaitButton - call UseDisposableItem - ld a, $0 - ret - -IsItemUsedOnConfusedMon: ; f009 (3:7009) - call IsItemUsedOnBattleMon - jr nc, .nope - ld a, [wPlayerSubStatus3] - bit SUBSTATUS_CONFUSED, a - jr z, .nope - ld a, c - cp $ff - jr nz, .nope - scf - ret - -.nope - and a - ret - -BattlemonRestoreHealth: ; f01e (3:701e) - call IsItemUsedOnBattleMon - ret nc - ld a, MON_HP - call GetPartyParamLocation - ld a, [hli] - ld [wBattleMonHP], a - ld a, [hld] - ld [wBattleMonHP + 1], a - ret - -HealStatus: ; f030 (3:7030) - call IsItemUsedOnBattleMon - ret nc - xor a - ld [wBattleMonStatus], a - ld hl, wPlayerSubStatus5 - res SUBSTATUS_TOXIC, [hl] - ld hl, wPlayerSubStatus1 - res SUBSTATUS_NIGHTMARE, [hl] - call GetItemHealingAction - ld a, c - cp %11111111 - jr nz, .not_full_heal - ld hl, wPlayerSubStatus3 - res SUBSTATUS_CONFUSED, [hl] -.not_full_heal - push bc - farcall CalcPlayerStats - pop bc - ret - -GetItemHealingAction: ; f058 (3:7058) - push hl - ld a, [wCurItem] - ld hl, StatusHealingActions - ld bc, 3 -.next - cp [hl] - jr z, .found_it - add hl, bc - jr .next - -.found_it - inc hl - ld b, [hl] - inc hl - ld a, [hl] - ld c, a - cp %11111111 - pop hl - ret -; f071 (3:7071) - -INCLUDE "data/items/heal_status.asm" - -StatusHealer_Jumptable: ; f09e (3:709e) - ld hl, .dw - rst JumpTable - ret - -.dw ; f0a3 (3:70a3) - dw StatusHealer_ClearPalettes - dw StatusHealer_NoEffect - dw StatusHealer_ExitMenu - - -RevivalHerbEffect: ; f0a9 - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - jp c, StatusHealer_ExitMenu - - call RevivePokemon - cp 0 - jr nz, .asm_f0c5 - - ld c, HAPPINESS_REVIVALHERB - farcall ChangeHappiness - call LooksBitterMessage - ld a, 0 - -.asm_f0c5 - jp StatusHealer_Jumptable -; f0c8 - - -ReviveEffect: ; f0c8 - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - jp c, StatusHealer_ExitMenu - - call RevivePokemon - jp StatusHealer_Jumptable -; f0d6 - - -RevivePokemon: ; f0d6 - call IsMonFainted - ld a, 1 - ret nz - ld a, [wBattleMode] - and a - jr z, .skip_to_revive - - ld a, [wCurPartyMon] - ld c, a - ld d, 0 - ld hl, wBattleParticipantsIncludingFainted - ld b, CHECK_FLAG - predef SmallFarFlagAction - ld a, c - and a - jr z, .skip_to_revive - - ld a, [wCurPartyMon] - ld c, a - ld hl, wBattleParticipantsNotFainted - ld b, SET_FLAG - predef SmallFarFlagAction - -.skip_to_revive - xor a - ld [wLowHealthAlarm], a - ld a, [wCurItem] - cp REVIVE - jr z, .revive_half_hp - - call ReviveFullHP - jr .finish_revive - -.revive_half_hp - call ReviveHalfHP - -.finish_revive - call HealHP_SFX_GFX - ld a, PARTYMENUTEXT_REVIVE - ld [wPartyMenuActionText], a - call ItemActionTextWaitButton - call UseDisposableItem - ld a, 0 - ret -; f128 - - -FullRestoreEffect: ; f128 - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - jp c, StatusHealer_ExitMenu - - call IsMonFainted - jp z, StatusHealer_NoEffect - - call IsMonAtFullHealth - jr c, .NotAtFullHealth - - jp FullyHealStatus - -.NotAtFullHealth: - call .FullRestore - jp StatusHealer_Jumptable -; f144 - - -.FullRestore: ; f144 - xor a - ld [wLowHealthAlarm], a - call ReviveFullHP - ld a, MON_STATUS - call GetPartyParamLocation - xor a - ld [hli], a - ld [hl], a - call HealStatus - call BattlemonRestoreHealth - call HealHP_SFX_GFX - ld a, PARTYMENUTEXT_HEAL_HP - ld [wPartyMenuActionText], a - call ItemActionTextWaitButton - call UseDisposableItem - ld a, 0 - ret -; f16a - - -BitterBerryEffect: ; f16a - ld hl, wPlayerSubStatus3 - bit SUBSTATUS_CONFUSED, [hl] - ld a, 1 - jr z, .done - - res SUBSTATUS_CONFUSED, [hl] - xor a - ld [hBattleTurn], a - call UseItemText - - ld hl, ConfusedNoMoreText - call StdBattleTextBox - - ld a, 0 - -.done - jp StatusHealer_Jumptable -; f186 - - -RestoreHPEffect: ; f186 - call ItemRestoreHP - jp StatusHealer_Jumptable -; f18c - - -EnergypowderEffect: ; f18c - ld c, HAPPINESS_BITTERPOWDER - jr EnergypowderEnergyRootCommon -; f190 - -EnergyRootEffect: ; f190 - ld c, HAPPINESS_ENERGYROOT -; f192 - -EnergypowderEnergyRootCommon: ; f192 - push bc - call ItemRestoreHP - pop bc - cp 0 - jr nz, .skip_happiness - - farcall ChangeHappiness - call LooksBitterMessage - ld a, 0 - -.skip_happiness - jp StatusHealer_Jumptable -; f1a9 - - -ItemRestoreHP: ; f1a9 (3:71a9) - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - ld a, 2 - ret c - - call IsMonFainted - ld a, 1 - ret z - - call IsMonAtFullHealth - ld a, 1 - ret nc - - xor a - ld [wLowHealthAlarm], a - call GetHealingItemAmount - call RestoreHealth - call BattlemonRestoreHealth - call HealHP_SFX_GFX - ld a, PARTYMENUTEXT_HEAL_HP - ld [wPartyMenuActionText], a - call ItemActionTextWaitButton - call UseDisposableItem - ld a, 0 - ret - -HealHP_SFX_GFX: ; f1db (3:71db) - push de - ld de, SFX_POTION - call WaitPlaySFX - pop de - ld a, [wCurPartyMon] - hlcoord 11, 0 - ld bc, SCREEN_WIDTH * 2 - call AddNTimes - ld a, $2 - ld [wWhichHPBar], a - predef_jump AnimateHPBar - -UseItem_SelectMon: ; f1f9 (3:71f9) - call .SelectMon - ret c - - ld a, [wCurPartySpecies] - cp EGG - jr nz, .not_egg - - call CantUseOnEggMessage - scf - ret - -.not_egg - and a - ret - -.SelectMon: ; f20b (3:720b) - ld a, b - ld [wPartyMenuActionText], a - push hl - push de - push bc - call ClearBGPalettes - call ChooseMonToUseItemOn - pop bc - pop de - pop hl - ret - -ChooseMonToUseItemOn: ; f21c (3:721c) - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes - call DelayFrame - farcall PartyMenuSelect - ret - -ItemActionText: ; f24a (3:724a) - ld [wPartyMenuActionText], a - ld a, [wCurPartySpecies] - push af - ld a, [wCurPartyMon] - push af - push hl - push de - push bc - farcall WritePartyMenuTilemap - farcall PrintPartyMenuActionText - call WaitBGMap - call SetPalettes - call DelayFrame - pop bc - pop de - pop hl - pop af - ld [wCurPartyMon], a - pop af - ld [wCurPartySpecies], a - ret - -ItemActionTextWaitButton: ; f279 (3:7279) - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, wTileMapEnd - wTileMap - ld a, " " - call ByteFill - ld a, [wPartyMenuActionText] - call ItemActionText - ld a, $1 - ld [hBGMapMode], a - ld c, 50 - call DelayFrames - jp WaitPressAorB_BlinkCursor - -StatusHealer_NoEffect: ; f299 (3:7299) - call WontHaveAnyEffectMessage - jr StatusHealer_ClearPalettes - -StatusHealer_ExitMenu: ; f29e (3:729e) - xor a - ld [wItemEffectSucceeded], a -StatusHealer_ClearPalettes: ; f2a2 (3:72a2) - call ClearPalettes - ret - -IsItemUsedOnBattleMon: ; f2a6 (3:72a6) - ld a, [wBattleMode] - and a - ret z - ld a, [wCurPartyMon] - push hl - ld hl, wCurBattleMon - cp [hl] - pop hl - jr nz, .nope - scf - ret - -.nope - xor a - ret - -ReviveHalfHP: ; f2ba (3:72ba) - call LoadHPFromBuffer1 - srl d - rr e - jr ContinueRevive - -ReviveFullHP: ; f2c3 (3:72c3) - call LoadHPFromBuffer1 -ContinueRevive: ; f2c6 (3:72c6) - ld a, MON_HP - call GetPartyParamLocation - ld [hl], d - inc hl - ld [hl], e - jp LoadCurHPIntoBuffer5 - -RestoreHealth: ; f2d1 (3:72d1) - ld a, MON_HP + 1 - call GetPartyParamLocation - ld a, [hl] - add e - ld [hld], a - ld a, [hl] - adc d - ld [hl], a - jr c, .full_hp - call LoadCurHPIntoBuffer5 - ld a, MON_HP + 1 - call GetPartyParamLocation - ld d, h - ld e, l - ld a, MON_MAXHP + 1 - call GetPartyParamLocation - ld a, [de] - sub [hl] - dec de - dec hl - ld a, [de] - sbc [hl] - jr c, .finish -.full_hp - call ReviveFullHP -.finish - ret - -RemoveHP: ; f2f9 (3:72f9) - ld a, MON_HP + 1 - call GetPartyParamLocation - ld a, [hl] - sub e - ld [hld], a - ld a, [hl] - sbc d - ld [hl], a - jr nc, .okay - xor a - ld [hld], a - ld [hl], a -.okay - call LoadCurHPIntoBuffer5 - ret - -IsMonFainted: ; f30d (3:730d) - push de - call LoadMaxHPToBuffer1 - call LoadCurHPToBuffer3 - call LoadHPFromBuffer3 - ld a, d - or e - pop de - ret - -IsMonAtFullHealth: ; f31b (3:731b) - call LoadHPFromBuffer3 - ld h, d - ld l, e - call LoadHPFromBuffer1 - ld a, l - sub e - ld a, h - sbc d - ret - -LoadCurHPIntoBuffer5: ; f328 (3:7328) - ld a, MON_HP - call GetPartyParamLocation - ld a, [hli] - ld [wBuffer6], a - ld a, [hl] - ld [wBuffer5], a - ret -; f336 (3:7336) - -LoadHPIntoBuffer5: ; f336 - ld a, d - ld [wBuffer6], a - ld a, e - ld [wBuffer5], a - ret -; f33f - -LoadHPFromBuffer5: ; f33f - ld a, [wBuffer6] - ld d, a - ld a, [wBuffer5] - ld e, a - ret -; f348 - -LoadCurHPToBuffer3: ; f348 (3:7348) - ld a, MON_HP - call GetPartyParamLocation - ld a, [hli] - ld [wBuffer4], a - ld a, [hl] - ld [wBuffer3], a - ret - -LoadHPFromBuffer3: ; f356 (3:7356) - ld a, [wBuffer4] - ld d, a - ld a, [wBuffer3] - ld e, a - ret - -LoadMaxHPToBuffer1: ; f35f (3:735f) - push hl - ld a, MON_MAXHP - call GetPartyParamLocation - ld a, [hli] - ld [wBuffer2], a - ld a, [hl] - ld [wBuffer1], a - pop hl - ret - -LoadHPFromBuffer1: ; f36f (3:736f) - ld a, [wBuffer2] - ld d, a - ld a, [wBuffer1] - ld e, a - ret - -GetOneFifthMaxHP: ; f378 (3:7378) - push bc - ld a, MON_MAXHP - call GetPartyParamLocation - ld a, [hli] - ld [hDividend + 0], a - ld a, [hl] - ld [hDividend + 1], a - ld a, 5 - ld [hDivisor], a - ld b, 2 - call Divide - ld a, [hQuotient + 1] - ld d, a - ld a, [hQuotient + 2] - ld e, a - pop bc - ret - -GetHealingItemAmount: ; f395 (3:7395) - push hl - ld a, [wCurItem] - ld hl, HealingHPAmounts - ld d, a -.next - ld a, [hli] - cp -1 - jr z, .NotFound - cp d - jr z, .done - inc hl - inc hl - jr .next - -.NotFound: - scf -.done - ld e, [hl] - inc hl - ld d, [hl] - pop hl - ret -; f3af (3:73af) - -INCLUDE "data/items/heal_hp.asm" - -Softboiled_MilkDrinkFunction: ; f3df (3:73df) -; Softboiled/Milk Drink in the field - ld a, [wPartyMenuCursor] - dec a - ld b, a - call .SelectMilkDrinkRecipient ; select pokemon - jr c, .skip - ld a, b - ld [wCurPartyMon], a - call IsMonFainted - call GetOneFifthMaxHP - call RemoveHP - push bc - call HealHP_SFX_GFX - pop bc - call GetOneFifthMaxHP - ld a, c - ld [wCurPartyMon], a - call IsMonFainted - call RestoreHealth - call HealHP_SFX_GFX - ld a, PARTYMENUTEXT_HEAL_HP - call ItemActionText - call JoyWaitAorB -.skip - ld a, b - inc a - ld [wPartyMenuCursor], a - ret - -.SelectMilkDrinkRecipient: ; f419 (3:7419) -.loop - push bc - ld a, PARTYMENUACTION_HEALING_ITEM - ld [wPartyMenuActionText], a - call ChooseMonToUseItemOn - pop bc - jr c, .set_carry - ld a, [wPartyMenuCursor] - dec a - ld c, a - ld a, b - cp c - jr z, .cant_use ; chose the same mon as user - ld a, c - ld [wCurPartyMon], a - call IsMonFainted - jr z, .cant_use - call IsMonAtFullHealth - jr nc, .cant_use - xor a - ret - -.set_carry - scf - ret - -.cant_use - push bc - ld hl, .Text_CantBeUsed - call MenuTextBoxBackup - pop bc - jr .loop -; f44a (3:744a) - -.Text_CantBeUsed: ; 0xf44a - ; That can't be used on this #MON. - text_jump UnknownText_0x1c5bac - db "@" -; 0xf44f - - -EscapeRopeEffect: ; f44f - xor a - ld [wItemEffectSucceeded], a - farcall EscapeRopeFunction - - ld a, [wItemEffectSucceeded] - cp 1 - call z, UseDisposableItem - ret -; f462 - - -SuperRepelEffect: ; f462 - ld b, 200 - jr UseRepel -; f466 - -MaxRepelEffect: ; f466 - ld b, 250 - jr UseRepel -; f466 - -RepelEffect: ; f46a - ld b, 100 -; f46c - -UseRepel: ; f46c - ld a, [wRepelEffect] - and a - ld hl, TextJump_RepelUsedEarlierIsStillInEffect - jp nz, PrintText - - ld a, b - ld [wRepelEffect], a - jp UseItemText - - -TextJump_RepelUsedEarlierIsStillInEffect: ; 0xf47d - ; The REPEL used earlier is still in effect. - text_jump Text_RepelUsedEarlierIsStillInEffect - db "@" -; 0xf482 - - -XAccuracyEffect: ; f482 - ld hl, wPlayerSubStatus4 - bit SUBSTATUS_X_ACCURACY, [hl] - jp nz, WontHaveAnyEffect_NotUsedMessage - set SUBSTATUS_X_ACCURACY, [hl] - jp UseItemText -; f48f - - -PokeDollEffect: ; f48f - ld a, [wBattleMode] - dec a - jr nz, .asm_f4a6 - inc a - ld [wForcedSwitch], a - ld a, [wBattleResult] - and $c0 - or $2 - ld [wBattleResult], a - jp UseItemText - -.asm_f4a6 - xor a - ld [wItemEffectSucceeded], a - ret -; f4ab - - -GuardSpecEffect: ; f4ab - ld hl, wPlayerSubStatus4 - bit SUBSTATUS_MIST, [hl] - jp nz, WontHaveAnyEffect_NotUsedMessage - set SUBSTATUS_MIST, [hl] - jp UseItemText -; f4b8 - - -DireHitEffect: ; f4b8 - ld hl, wPlayerSubStatus4 - bit SUBSTATUS_FOCUS_ENERGY, [hl] - jp nz, WontHaveAnyEffect_NotUsedMessage - set SUBSTATUS_FOCUS_ENERGY, [hl] - jp UseItemText -; f4c5 - - -XItemEffect: ; f4c5 - call UseItemText - - ld a, [wCurItem] - ld hl, XItemStats - -.loop - cp [hl] - jr z, .got_it - inc hl - inc hl - jr .loop - -.got_it - inc hl - ld b, [hl] - xor a - ld [hBattleTurn], a - ld [wAttackMissed], a - ld [wEffectFailed], a - farcall CheckIfStatCanBeRaised - call WaitSFX - - farcall BattleCommand_StatUpMessage - farcall BattleCommand_StatUpFailText - - ld a, [wCurBattleMon] - ld [wCurPartyMon], a - ld c, HAPPINESS_USEDXITEM - farcall ChangeHappiness - ret -; f504 - -INCLUDE "data/items/x_stats.asm" - - -PokeFluteEffect: ; f50c - ld a, [wBattleMode] - and a - jr nz, .dummy -.dummy - - xor a - ld [wd002], a - - ld b, $ff ^ SLP - - ld hl, wPartyMon1Status - call .CureSleep - - ld a, [wBattleMode] - cp WILD_BATTLE - jr z, .skip_otrainer - ld hl, wOTPartyMon1Status - call .CureSleep -.skip_otrainer - - ld hl, wBattleMonStatus - ld a, [hl] - and b - ld [hl], a - ld hl, wEnemyMonStatus - ld a, [hl] - and b - ld [hl], a - - ld a, [wd002] - and a - ld hl, .CatchyTune - jp z, PrintText - ld hl, .PlayedTheFlute - call PrintText - - ld a, [wLowHealthAlarm] - and 1 << DANGER_ON_F - jr nz, .dummy2 -.dummy2 - ld hl, .AllSleepingMonWokeUp - jp PrintText - - -.CureSleep: - ld de, PARTYMON_STRUCT_LENGTH - ld c, PARTY_LENGTH - -.loop - ld a, [hl] - push af - and SLP - jr z, .not_asleep - ld a, 1 - ld [wd002], a -.not_asleep - pop af - and b - ld [hl], a - add hl, de - dec c - jr nz, .loop - ret -; f56c - - -.CatchyTune: ; 0xf56c - ; Played the # FLUTE. Now, that's a catchy tune! - text_jump UnknownText_0x1c5bf9 - db "@" -; 0xf571 - -.AllSleepingMonWokeUp: ; 0xf571 - ; All sleeping #MON woke up. - text_jump UnknownText_0x1c5c28 - db "@" -; 0xf576 - -.PlayedTheFlute: ; 0xf576 - ; played the # FLUTE.@ @ - text_jump UnknownText_0x1c5c44 - start_asm - ld a, [wBattleMode] - and a - jr nz, .battle - - push de - ld de, SFX_POKEFLUTE - call WaitPlaySFX - call WaitSFX - pop de - -.battle - jp PokeFluteTerminatorCharacter -; f58f - - -BlueCardEffect: ; f58f - ld hl, .bluecardtext - jp MenuTextBoxWaitButton - -.bluecardtext - text_jump UnknownText_0x1c5c5e - db "@" -; f59a - - -CoinCaseEffect: ; f59a - ld hl, .coincasetext - jp MenuTextBoxWaitButton - -.coincasetext - text_jump UnknownText_0x1c5c7b - db "@" -; f5a5 - - -OldRodEffect: ; f5a5 - ld e, $0 - jr UseRod -; f5a9 - -GoodRodEffect: ; f5a9 - ld e, $1 - jr UseRod -; f5ad - -SuperRodEffect: ; f5ad - ld e, $2 - jr UseRod -; f5b1 - -UseRod: ; f5b1 - farcall FishFunction - ret -; f5b8 - - -ItemfinderEffect: ; f5b8 - farcall ItemFinder - ret -; f5bf - - -RestorePPEffect: ; f5bf - ld a, [wCurItem] - ld [wd002], a - -.loop - ; Party Screen opens to choose on which mon to use the Item - ld b, PARTYMENUACTION_HEALING_ITEM - call UseItem_SelectMon - jp c, PPRestoreItem_Cancel - -.loop2 - ld a, [wd002] - cp MAX_ELIXER - jp z, Elixer_RestorePPofAllMoves - cp ELIXER - jp z, Elixer_RestorePPofAllMoves - - ld hl, TextJump_RaiseThePPOfWhichMove - ld a, [wd002] - cp PP_UP - jr z, .ppup - ld hl, TextJump_RestoreThePPOfWhichMove - -.ppup - call PrintText - - ld a, [wCurMoveNum] - push af - xor a - ld [wCurMoveNum], a - ld a, $2 - ld [wMoveSelectionMenuType], a - farcall MoveSelectionScreen - pop bc - - ld a, b - ld [wCurMoveNum], a - jr nz, .loop - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - call GetMthMoveOfNthPartymon - - push hl - ld a, [hl] - ld [wd265], a - call GetMoveName - call CopyName1 - pop hl - - ld a, [wd002] - cp PP_UP - jp nz, Not_PP_Up - - ld a, [hl] - cp SKETCH - jr z, .CantUsePPUpOnSketch - - ld bc, MON_PP - MON_MOVES - add hl, bc - ld a, [hl] - cp PP_UP_MASK - jr c, .do_ppup - -.CantUsePPUpOnSketch: -.pp_is_maxed_out - ld hl, TextJump_PPIsMaxedOut - call PrintText - jr .loop2 - -.do_ppup - ld a, [hl] - add PP_UP_ONE - ld [hl], a - ld a, $1 - ld [wd265], a - call ApplyPPUp - call Play_SFX_FULL_HEAL - - ld hl, TextJump_PPsIncreased - call PrintText - -FinishPPRestore: ; f64c - call ClearPalettes - jp UseDisposableItem -; f652 - -BattleRestorePP: ; f652 - ld a, [wBattleMode] - and a - jr z, .not_in_battle - ld a, [wCurPartyMon] - ld b, a - ld a, [wCurBattleMon] - cp b - jr nz, .not_in_battle - ld a, [wPlayerSubStatus5] - bit SUBSTATUS_TRANSFORMED, a - jr nz, .not_in_battle - call .UpdateBattleMonPP - -.not_in_battle - call Play_SFX_FULL_HEAL - ld hl, UnknownText_0xf739 - call PrintText - jr FinishPPRestore - -.UpdateBattleMonPP: - ld a, [wCurPartyMon] - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld de, wBattleMonMoves - ld b, NUM_MOVES -.loop - ld a, [de] - and a - jr z, .done - cp [hl] - jr nz, .next - push hl - push de - push bc - rept NUM_MOVES + 2 ; wBattleMonPP - wBattleMonMoves - inc de - endr - ld bc, MON_PP - MON_MOVES - add hl, bc - ld a, [hl] - ld [de], a - pop bc - pop de - pop hl - -.next - inc hl - inc de - dec b - jr nz, .loop - -.done - ret -; f6a7 - -Not_PP_Up: ; f6a7 - call RestorePP - jr nz, BattleRestorePP - jp PPRestoreItem_NoEffect -; f6af - -Elixer_RestorePPofAllMoves: ; f6af - xor a - ld hl, wMenuCursorY - ld [hli], a - ld [hl], a - ld b, NUM_MOVES -.moveLoop - push bc - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - call GetMthMoveOfNthPartymon - ld a, [hl] - and a - jr z, .next - - call RestorePP - jr z, .next - ld hl, wMenuCursorX - inc [hl] - -.next - ld hl, wMenuCursorY - inc [hl] - pop bc - dec b - jr nz, .moveLoop - ld a, [wMenuCursorX] - and a - jp nz, BattleRestorePP - -PPRestoreItem_NoEffect: ; f6dd - call WontHaveAnyEffectMessage - -PPRestoreItem_Cancel: ; f6e0 - call ClearPalettes - xor a - ld [wItemEffectSucceeded], a - ret -; f6e8 - -RestorePP: ; f6e8 - xor a ; PARTYMON - ld [wMonType], a - call GetMaxPPOfMove - ld hl, wPartyMon1PP - ld bc, PARTYMON_STRUCT_LENGTH - call GetMthMoveOfNthPartymon - ld a, [wd265] - ld b, a - ld a, [hl] - and PP_MASK - cp b - jr nc, .dont_restore - - ld a, [wd002] - cp MAX_ELIXER - jr z, .restore_all - cp MAX_ETHER - jr z, .restore_all - - ld c, 5 - cp MYSTERYBERRY - jr z, .restore_some - - ld c, 10 - -.restore_some - ld a, [hl] - and PP_MASK - add c - cp b - jr nc, .restore_all - ld b, a - -.restore_all - ld a, [hl] - and PP_UP_MASK - or b - ld [hl], a - ret - -.dont_restore - xor a - ret -; f725 - -TextJump_RaiseThePPOfWhichMove: ; 0xf725 - ; Raise the PP of which move? - text_jump Text_RaiseThePPOfWhichMove - db "@" -; 0xf72a - -TextJump_RestoreThePPOfWhichMove: ; 0xf72a - ; Restore the PP of which move? - text_jump Text_RestoreThePPOfWhichMove - db "@" -; 0xf72f - -TextJump_PPIsMaxedOut: ; 0xf72f - ; 's PP is maxed out. - text_jump Text_PPIsMaxedOut - db "@" -; 0xf734 - -TextJump_PPsIncreased: ; 0xf734 - ; 's PP increased. - text_jump Text_PPsIncreased - db "@" -; 0xf739 - -UnknownText_0xf739: ; 0xf739 - ; PP was restored. - text_jump UnknownText_0x1c5cf1 - db "@" -; 0xf73e - - -SquirtbottleEffect: ; f73e - farcall _Squirtbottle - ret -; f745 - - -CardKeyEffect: ; f745 - farcall _CardKey - ret -; f74c - - -BasementKeyEffect: ; f74c - farcall _BasementKey - ret -; f753 - - -SacredAshEffect: ; f753 - farcall _SacredAsh - ld a, [wItemEffectSucceeded] - cp $1 - ret nz - call UseDisposableItem - ret -; f763 - - -NormalBoxEffect: ; f763 - ld c, DECOFLAG_SILVER_TROPHY_DOLL - jr OpenBox -; f767 - -GorgeousBoxEffect: ; f767 - ld c, DECOFLAG_GOLD_TROPHY_DOLL -OpenBox: ; f769 - farcall SetSpecificDecorationFlag - - ld hl, .text - call PrintText - - jp UseDisposableItem -; f778 - -.text ; 0xf778 - ; There was a trophy inside! - text_jump UnknownText_0x1c5d03 - db "@" -; 0xf77d - -NoEffect: ; f77d - jp IsntTheTimeMessage -; f780 - - -Play_SFX_FULL_HEAL: ; f780 - push de - ld de, SFX_FULL_HEAL - call WaitPlaySFX - pop de - ret -; f789 - -UseItemText: ; f789 - ld hl, UsedItemText - call PrintText - call Play_SFX_FULL_HEAL - call WaitPressAorB_BlinkCursor -UseDisposableItem: ; f795 - ld hl, wNumItems - ld a, 1 - ld [wItemQuantityChangeBuffer], a - jp TossItem -; f7a0 - -UseBallInTrainerBattle: ; f7a0 - call ReturnToBattle_UseBall - ld de, ANIM_THROW_POKE_BALL - ld a, e - ld [wFXAnimID], a - ld a, d - ld [wFXAnimID + 1], a - xor a - ld [wBattleAnimParam], a - ld [hBattleTurn], a - ld [wNumHits], a - predef PlayBattleAnim - ld hl, BlockedTheBallText - call PrintText - ld hl, DontBeAThiefText - call PrintText - jr UseDisposableItem -; f7ca - -WontHaveAnyEffect_NotUsedMessage: ; f7ca - ld hl, WontHaveAnyEffectText - call PrintText - - ; Item wasn't used. - ld a, $2 - ld [wItemEffectSucceeded], a - ret -; f7d6 - -LooksBitterMessage: ; f7d6 - ld hl, LooksBitterText - jp PrintText -; f7dc - -Ball_BoxIsFullMessage: ; f7dc - ld hl, Ball_BoxIsFullText - call PrintText - - ; Item wasn't used. - ld a, $2 - ld [wItemEffectSucceeded], a - ret -; f7e8 - -CantUseOnEggMessage: ; f7e8 - ld hl, CantUseOnEggText - jr CantUseItemMessage - -IsntTheTimeMessage: ; f7ed - ld hl, IsntTheTimeText - jr CantUseItemMessage - -WontHaveAnyEffectMessage: ; f7f2 - ld hl, WontHaveAnyEffectText - jr CantUseItemMessage - -BelongsToSomeoneElseMessage: ; f7f7 - ld hl, BelongsToSomeoneElseText - jr CantUseItemMessage - -CyclingIsntAllowedMessage: ; f7fc - ld hl, CyclingIsntAllowedText - jr CantUseItemMessage - -CantGetOnYourBikeMessage: ; f801 - ld hl, CantGetOnYourBikeText - -CantUseItemMessage: ; f804 -; Item couldn't be used. - xor a - ld [wItemEffectSucceeded], a - jp PrintText -; f80b - -LooksBitterText: ; 0xf80b - ; It looks bitter… - text_jump UnknownText_0x1c5d3e - db "@" -; 0xf810 - -CantUseOnEggText: ; 0xf810 - ; That can't be used on an EGG. - text_jump UnknownText_0x1c5d50 - db "@" -; 0xf815 - -IsntTheTimeText: ; 0xf815 - ; OAK: ! This isn't the time to use that! - text_jump UnknownText_0x1c5d6e - db "@" -; 0xf81a - -BelongsToSomeoneElseText: ; 0xf81a - ; That belongs to someone else! - text_jump UnknownText_0x1c5d97 - db "@" -; 0xf81f - -WontHaveAnyEffectText: ; 0xf81f - ; It won't have any effect. - text_jump UnknownText_0x1c5db6 - db "@" -; 0xf824 - -BlockedTheBallText: ; 0xf824 - ; The trainer blocked the BALL! - text_jump UnknownText_0x1c5dd0 - db "@" -; 0xf829 - -DontBeAThiefText: ; 0xf829 - ; Don't be a thief! - text_jump UnknownText_0x1c5def - db "@" -; 0xf82e - -CyclingIsntAllowedText: ; 0xf82e - ; Cycling isn't allowed here. - text_jump UnknownText_0x1c5e01 - db "@" -; 0xf833 - -CantGetOnYourBikeText: ; 0xf833 - ; Can't get on your @ now. - text_jump UnknownText_0x1c5e1d - db "@" -; 0xf838 - -Ball_BoxIsFullText: ; 0xf838 - ; The #MON BOX is full. That can't be used now. - text_jump UnknownText_0x1c5e3a - db "@" -; 0xf83d - -UsedItemText: ; 0xf83d - ; used the@ . - text_jump UnknownText_0x1c5e68 - db "@" -; 0xf842 - -GotOnTheItemText: ; 0xf842 - ; got on the@ . - text_jump UnknownText_0x1c5e7b - db "@" -; 0xf847 - -GotOffTheItemText: ; 0xf847 - ; got off@ the @ . - text_jump UnknownText_0x1c5e90 - db "@" -; 0xf84c - - -ApplyPPUp: ; f84c - ld a, MON_MOVES - call GetPartyParamLocation - push hl - ld de, wBuffer1 - predef FillPP - pop hl - ld bc, MON_PP - MON_MOVES - add hl, bc - ld de, wBuffer1 - ld b, 0 -.loop - inc b - ld a, b - cp NUM_MOVES + 1 - ret z - ld a, [wd265] - dec a - jr nz, .use - ld a, [wMenuCursorY] - inc a - cp b - jr nz, .skip - -.use - ld a, [hl] - and PP_UP_MASK - ld a, [de] ; wasted cycle - call nz, ComputeMaxPP - -.skip - inc hl - inc de - jr .loop -; f881 - - - -ComputeMaxPP: ; f881 - push bc - ; Divide the base PP by 5. - ld a, [de] - ld [hDividend + 3], a - xor a - ld [hDividend], a - ld [hDividend + 1], a - ld [hDividend + 2], a - ld a, 5 - ld [hDivisor], a - ld b, 4 - call Divide - ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM. - ld a, [hl] - ld b, a - swap a - and $f - srl a - srl a - ld c, a - ; If this value is 0, we are done - and a - jr z, .NoPPUp - -.loop - ; Normally, a move with 40 PP would have 64 PP with three PP Ups. - ; Since this would overflow into bit 6, we prevent that from happening - ; by decreasing the extra amount of PP each PP Up provides, resulting - ; in a maximum of 61. - ld a, [hQuotient + 2] - cp $8 - jr c, .okay - ld a, $7 - -.okay - add b - ld b, a - ld a, [wd265] - dec a - jr z, .NoPPUp - dec c - jr nz, .loop - -.NoPPUp: - ld [hl], b - pop bc - ret -; f8b9 - -RestoreAllPP: ; f8b9 - ld a, MON_PP - call GetPartyParamLocation - push hl - ld a, MON_MOVES - call GetPartyParamLocation - pop de - xor a ; PARTYMON - ld [wMenuCursorY], a - ld [wMonType], a - ld c, NUM_MOVES -.loop - ld a, [hli] - and a - ret z - push hl - push de - push bc - call GetMaxPPOfMove - pop bc - pop de - ld a, [de] - and PP_UP_MASK - ld b, a - ld a, [wd265] - add b - ld [de], a - inc de - ld hl, wMenuCursorY - inc [hl] - pop hl - dec c - jr nz, .loop - ret -; f8ec - - -GetMaxPPOfMove: ; f8ec - ld a, [wStringBuffer1 + 0] - push af - ld a, [wStringBuffer1 + 1] - push af - - ld a, [wMonType] - and a - - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - jr z, .got_partymon ; PARTYMON - - ld hl, wOTPartyMon1Moves - dec a - jr z, .got_partymon ; OTPARTYMON - - ld hl, wTempMonMoves - dec a - jr z, .got_nonpartymon ; BOXMON - - ld hl, wTempMonMoves ; Wasted cycles - dec a - jr z, .got_nonpartymon ; TEMPMON - - ld hl, wBattleMonMoves ; WILDMON - -.got_nonpartymon ; BOXMON, TEMPMON, WILDMON - call GetMthMoveOfCurrentMon - jr .gotdatmove - -.got_partymon ; PARTYMON, OTPARTYMON - call GetMthMoveOfNthPartymon - -.gotdatmove - ld a, [hl] - dec a - - push hl - ld hl, Moves + MOVE_PP - ld bc, MOVE_LENGTH - call AddNTimes - ld a, BANK(Moves) - call GetFarByte - ld b, a - ld de, wStringBuffer1 - ld [de], a - pop hl - - push bc - ld bc, MON_PP - MON_MOVES - ld a, [wMonType] - cp WILDMON - jr nz, .notwild - ld bc, wEnemyMonPP - wEnemyMonMoves -.notwild - add hl, bc - ld a, [hl] - and PP_UP_MASK - pop bc - - or b - ld hl, wStringBuffer1 + 1 - ld [hl], a - xor a - ld [wd265], a - ld a, b ; this gets lost anyway - call ComputeMaxPP - ld a, [hl] - and PP_MASK - ld [wd265], a - - pop af - ld [wStringBuffer1 + 1], a - pop af - ld [wStringBuffer1 + 0], a - ret -; f963 - -GetMthMoveOfNthPartymon: ; f963 - ld a, [wCurPartyMon] - call AddNTimes - -GetMthMoveOfCurrentMon: ; f969 - ld a, [wMenuCursorY] - ld c, a - ld b, 0 - add hl, bc - ret -; f971 diff --git a/engine/items.asm b/engine/items.asm deleted file mode 100755 index c07042aed..000000000 --- a/engine/items.asm +++ /dev/null @@ -1,581 +0,0 @@ -_ReceiveItem:: ; d1d5 - call DoesHLEqualNumItems - jp nz, PutItemInPocket - push hl - call CheckItemPocket - pop de - ld a, [wItemAttributeParamBuffer] - dec a - ld hl, .Pockets - rst JumpTable - ret - -.Pockets: ; d1e9 -; entries correspond to item types - dw .Item - dw .KeyItem - dw .Ball - dw .TMHM - -.Item: ; d1f1 - ld h, d - ld l, e - jp PutItemInPocket - -.KeyItem: ; d1f6 - ld h, d - ld l, e - jp ReceiveKeyItem - -.Ball: ; d1fb - ld hl, wNumBalls - jp PutItemInPocket - -.TMHM: ; d201 - ld h, d - ld l, e - ld a, [wCurItem] - ld c, a - call GetTMHMNumber - jp ReceiveTMHM - -_TossItem:: ; d20d - call DoesHLEqualNumItems - jr nz, .remove - push hl - call CheckItemPocket - pop de - ld a, [wItemAttributeParamBuffer] - dec a - ld hl, .Pockets - rst JumpTable - ret - -.Pockets: -; entries correspond to item types - dw .Item - dw .KeyItem - dw .Ball - dw .TMHM - -.Ball: ; d228 - ld hl, wNumBalls - jp RemoveItemFromPocket - -.TMHM: ; d22e - ld h, d - ld l, e - ld a, [wCurItem] - ld c, a - call GetTMHMNumber - jp TossTMHM - -.KeyItem: ; d23a - ld h, d - ld l, e - jp TossKeyItem - -.Item: ; d23f - ld h, d - ld l, e - -.remove - jp RemoveItemFromPocket - -_CheckItem:: ; d244 - call DoesHLEqualNumItems - jr nz, .nope - push hl - call CheckItemPocket - pop de - ld a, [wItemAttributeParamBuffer] - dec a - ld hl, .Pockets - rst JumpTable - ret - -.Pockets: -; entries correspond to item types - dw .Item - dw .KeyItem - dw .Ball - dw .TMHM - -.Ball: ; d25f - ld hl, wNumBalls - jp CheckTheItem - -.TMHM: ; d265 - ld h, d - ld l, e - ld a, [wCurItem] - ld c, a - call GetTMHMNumber - jp CheckTMHM - -.KeyItem: ; d271 - ld h, d - ld l, e - jp CheckKeyItems - -.Item: ; d276 - ld h, d - ld l, e - -.nope - jp CheckTheItem - -DoesHLEqualNumItems: ; d27b - ld a, l - cp LOW(wNumItems) - ret nz - ld a, h - cp HIGH(wNumItems) - ret - -GetPocketCapacity: ; d283 - ld c, MAX_ITEMS - ld a, e - cp LOW(wNumItems) - jr nz, .not_bag - ld a, d - cp HIGH(wNumItems) - ret z - -.not_bag - ld c, MAX_PC_ITEMS - ld a, e - cp LOW(wPCItems) - jr nz, .not_pc - ld a, d - cp HIGH(wPCItems) - ret z - -.not_pc - ld c, MAX_BALLS - ret - -PutItemInPocket: ; d29c - ld d, h - ld e, l - inc hl - ld a, [wCurItem] - ld c, a - ld b, 0 -.loop - ld a, [hli] - cp -1 - jr z, .terminator - cp c - jr nz, .next - ld a, 99 - sub [hl] - add b - ld b, a - ld a, [wItemQuantityChangeBuffer] - cp b - jr z, .ok - jr c, .ok - -.next - inc hl - jr .loop - -.terminator - call GetPocketCapacity - ld a, [de] - cp c - jr c, .ok - and a - ret - -.ok - ld h, d - ld l, e - ld a, [wCurItem] - ld c, a - ld a, [wItemQuantityChangeBuffer] - ld [wItemQuantityBuffer], a -.loop2 - inc hl - ld a, [hli] - cp -1 - jr z, .terminator2 - cp c - jr nz, .loop2 - ld a, [wItemQuantityBuffer] - add [hl] - cp 100 - jr nc, .newstack - ld [hl], a - jr .done - -.newstack - ld [hl], 99 - sub 99 - ld [wItemQuantityBuffer], a - jr .loop2 - -.terminator2 - dec hl - ld a, [wCurItem] - ld [hli], a - ld a, [wItemQuantityBuffer] - ld [hli], a - ld [hl], -1 - ld h, d - ld l, e - inc [hl] - -.done - scf - ret - -RemoveItemFromPocket: ; d2ff - ld d, h - ld e, l - ld a, [hli] - ld c, a - ld a, [wCurItemQuantity] - cp c - jr nc, .ok ; memory - ld c, a - ld b, $0 - add hl, bc - add hl, bc - ld a, [wCurItem] - cp [hl] - inc hl - jr z, .skip - ld h, d - ld l, e - inc hl - -.ok - ld a, [wCurItem] - ld b, a -.loop - ld a, [hli] - cp b - jr z, .skip - cp -1 - jr z, .nope - inc hl - jr .loop - -.skip - ld a, [wItemQuantityChangeBuffer] - ld b, a - ld a, [hl] - sub b - jr c, .nope - ld [hl], a - ld [wItemQuantityBuffer], a - and a - jr nz, .yup - dec hl - ld b, h - ld c, l - inc hl - inc hl -.loop2 - ld a, [hli] - ld [bc], a - inc bc - cp -1 - jr nz, .loop2 - ld h, d - ld l, e - dec [hl] - -.yup - scf - ret - -.nope - and a - ret - -CheckTheItem: ; d349 - ld a, [wCurItem] - ld c, a -.loop - inc hl - ld a, [hli] - cp -1 - jr z, .done - cp c - jr nz, .loop - scf - ret - -.done - and a - ret - -ReceiveKeyItem: ; d35a - ld hl, wNumKeyItems - ld a, [hli] - cp MAX_KEY_ITEMS - jr nc, .nope - ld c, a - ld b, 0 - add hl, bc - ld a, [wCurItem] - ld [hli], a - ld [hl], -1 - ld hl, wNumKeyItems - inc [hl] - scf - ret - -.nope - and a - ret - -TossKeyItem: ; d374 - ld a, [wCurItemQuantity] - ld e, a - ld d, 0 - ld hl, wNumKeyItems - ld a, [hl] - cp e - jr nc, .ok - call .Toss - ret nc - jr .ok2 - -.ok - dec [hl] - inc hl - add hl, de - -.ok2 - ld d, h - ld e, l - inc hl -.loop - ld a, [hli] - ld [de], a - inc de - cp -1 - jr nz, .loop - scf - ret - -.Toss: ; d396 - ld hl, wNumKeyItems - ld a, [wCurItem] - ld c, a -.loop3 - inc hl - ld a, [hl] - cp c - jr z, .ok3 - cp -1 - jr nz, .loop3 - xor a - ret - -.ok3 - ld a, [wNumKeyItems] - dec a - ld [wNumKeyItems], a - scf - ret - -CheckKeyItems: ; d3b1 - ld a, [wCurItem] - ld c, a - ld hl, wKeyItems -.loop - ld a, [hli] - cp c - jr z, .done - cp -1 - jr nz, .loop - and a - ret - -.done - scf - ret - -ReceiveTMHM: ; d3c4 - dec c - ld b, 0 - ld hl, wTMsHMs - add hl, bc - ld a, [wItemQuantityChangeBuffer] - add [hl] - cp 100 - jr nc, .toomany - ld [hl], a - scf - ret - -.toomany - and a - ret - -TossTMHM: ; d3d8 - dec c - ld b, 0 - ld hl, wTMsHMs - add hl, bc - ld a, [wItemQuantityChangeBuffer] - ld b, a - ld a, [hl] - sub b - jr c, .nope - ld [hl], a - ld [wItemQuantityBuffer], a - jr nz, .yup - ld a, [wTMHMPocketScrollPosition] - and a - jr z, .yup - dec a - ld [wTMHMPocketScrollPosition], a - -.yup - scf - ret - -.nope - and a - ret - -CheckTMHM: ; d3fb - dec c - ld b, $0 - ld hl, wTMsHMs - add hl, bc - ld a, [hl] - and a - ret z - scf - ret - -GetTMHMNumber:: ; d407 -; Return the number of a TM/HM by item id c. - ld a, c -; Skip any dummy items. - cp ITEM_C3 ; TM04-05 - jr c, .done - cp ITEM_DC ; TM28-29 - jr c, .skip - dec a -.skip - dec a -.done - sub TM01 - inc a - ld c, a - ret - -GetNumberedTMHM: ; d417 -; Return the item id of a TM/HM by number c. - ld a, c -; Skip any gaps. - cp ITEM_C3 - (TM01 - 1) - jr c, .done - cp ITEM_DC - (TM01 - 1) - 1 - jr c, .skip_one -.skip_two - inc a -.skip_one - inc a -.done - add TM01 - dec a - ld c, a - ret - -_CheckTossableItem:: ; d427 -; Return 1 in wItemAttributeParamBuffer and carry if wCurItem can't be removed from the bag. - ld a, ITEMATTR_PERMISSIONS - call GetItemAttr - bit CANT_TOSS_F, a - jr nz, ItemAttr_ReturnCarry - and a - ret - -CheckSelectableItem: ; d432 -; Return 1 in wItemAttributeParamBuffer and carry if wCurItem can't be selected. - ld a, ITEMATTR_PERMISSIONS - call GetItemAttr - bit CANT_SELECT_F, a - jr nz, ItemAttr_ReturnCarry - and a - ret - -CheckItemPocket:: ; d43d -; Return the pocket for wCurItem in wItemAttributeParamBuffer. - ld a, ITEMATTR_POCKET - call GetItemAttr - and $f - ld [wItemAttributeParamBuffer], a - ret - -CheckItemContext: ; d448 -; Return the context for wCurItem in wItemAttributeParamBuffer. - ld a, ITEMATTR_HELP - call GetItemAttr - and $f - ld [wItemAttributeParamBuffer], a - ret - -CheckItemMenu: ; d453 -; Return the menu for wCurItem in wItemAttributeParamBuffer. - ld a, ITEMATTR_HELP - call GetItemAttr - swap a - and $f - ld [wItemAttributeParamBuffer], a - ret - -GetItemAttr: ; d460 -; Get attribute a of wCurItem. - - push hl - push bc - - ld hl, ItemAttributes - ld c, a - ld b, 0 - add hl, bc - - xor a - ld [wItemAttributeParamBuffer], a - - ld a, [wCurItem] - dec a - ld c, a - ld a, ITEMATTR_STRUCT_LENGTH - call AddNTimes - ld a, BANK(ItemAttributes) - call GetFarByte - - pop bc - pop hl - ret - -ItemAttr_ReturnCarry: ; d47f - ld a, 1 - ld [wItemAttributeParamBuffer], a - scf - ret - -GetItemPrice: ; d486 -; Return the price of wCurItem in de. - push hl - push bc - ld a, ITEMATTR_PRICE - call GetItemAttr - ld e, a - ld a, ITEMATTR_PRICE_HI - call GetItemAttr - ld d, a - pop bc - pop hl - ret diff --git a/engine/items/buy_sell_toss.asm b/engine/items/buy_sell_toss.asm new file mode 100755 index 000000000..84481d030 --- /dev/null +++ b/engine/items/buy_sell_toss.asm @@ -0,0 +1,235 @@ +SelectQuantityToToss: ; 24fbf + ld hl, TossItem_MenuHeader + call LoadMenuHeader + call Toss_Sell_Loop + ret +; 24fc9 + +SelectQuantityToBuy: ; 24fc9 + farcall GetItemPrice +RooftopSale_SelectQuantityToBuy: ; 24fcf + ld a, d + ld [wBuffer1], a + ld a, e + ld [wBuffer2], a + ld hl, BuyItem_MenuHeader + call LoadMenuHeader + call Toss_Sell_Loop + ret +; 24fe1 + +SelectQuantityToSell: ; 24fe1 + farcall GetItemPrice + ld a, d + ld [wBuffer1], a + ld a, e + ld [wBuffer2], a + ld hl, SellItem_MenuHeader + call LoadMenuHeader + call Toss_Sell_Loop + ret +; 24ff9 + +Toss_Sell_Loop: ; 24ff9 + ld a, 1 + ld [wItemQuantityChangeBuffer], a +.loop + call BuySellToss_UpdateQuantityDisplay ; update display + call BuySellToss_InterpretJoypad ; joy action + jr nc, .loop + cp -1 + jr nz, .nope ; pressed B + scf + ret + +.nope + and a + ret +; 2500e + +BuySellToss_InterpretJoypad: ; 2500e + call JoyTextDelay_ForcehJoyDown ; get joypad + bit B_BUTTON_F, c + jr nz, .b + bit A_BUTTON_F, c + jr nz, .a + bit D_DOWN_F, c + jr nz, .down + bit D_UP_F, c + jr nz, .up + bit D_LEFT_F, c + jr nz, .left + bit D_RIGHT_F, c + jr nz, .right + and a + ret + +.b + ld a, -1 + scf + ret + +.a + ld a, 0 + scf + ret + +.down + ld hl, wItemQuantityChangeBuffer + dec [hl] + jr nz, .finish_down + ld a, [wItemQuantityBuffer] + ld [hl], a + +.finish_down + and a + ret + +.up + ld hl, wItemQuantityChangeBuffer + inc [hl] + ld a, [wItemQuantityBuffer] + cp [hl] + jr nc, .finish_up + ld [hl], 1 + +.finish_up + and a + ret + +.left + ld a, [wItemQuantityChangeBuffer] + sub 10 + jr c, .load_1 + jr z, .load_1 + jr .finish_left + +.load_1 + ld a, 1 + +.finish_left + ld [wItemQuantityChangeBuffer], a + and a + ret + +.right + ld a, [wItemQuantityChangeBuffer] + add 10 + ld b, a + ld a, [wItemQuantityBuffer] + cp b + jr nc, .finish_right + ld b, a + +.finish_right + ld a, b + ld [wItemQuantityChangeBuffer], a + and a + ret +; 25072 + +BuySellToss_UpdateQuantityDisplay: ; 25072 + call MenuBox + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + 1 + add hl, de + ld [hl], "×" + inc hl + ld de, wItemQuantityChangeBuffer + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld a, [wMenuDataPointer] + ld e, a + ld a, [wMenuDataPointer + 1] + ld d, a + ld a, [wMenuDataBank] + call FarCall_de + ret +; 25097 + +ret_25097: ; 25097 + ret +; 25098 + +DisplayPurchasePrice: ; 25098 + call BuySell_MultiplyPrice + call BuySell_DisplaySubtotal + ret +; 2509f + +DisplaySellingPrice: ; 2509f + call BuySell_MultiplyPrice + call Sell_HalvePrice + call BuySell_DisplaySubtotal + ret +; 250a9 + +BuySell_MultiplyPrice: ; 250a9 + xor a + ld [hMultiplicand + 0], a + ld a, [wBuffer1] + ld [hMultiplicand + 1], a + ld a, [wBuffer2] + ld [hMultiplicand + 2], a + ld a, [wItemQuantityChangeBuffer] + ld [hMultiplier], a + push hl + call Multiply + pop hl + ret +; 250c1 + +Sell_HalvePrice: ; 250c1 + push hl + ld hl, hProduct + 1 + ld a, [hl] + srl a + ld [hli], a + ld a, [hl] + rra + ld [hli], a + ld a, [hl] + rra + ld [hl], a + pop hl + ret +; 250d1 + +BuySell_DisplaySubtotal: ; 250d1 + push hl + ld hl, hMoneyTemp + ld a, [hProduct + 1] + ld [hli], a + ld a, [hProduct + 2] + ld [hli], a + ld a, [hProduct + 3] + ld [hl], a + pop hl + inc hl + ld de, hMoneyTemp + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + call WaitBGMap + ret +; 250ed + +TossItem_MenuHeader: ; 0x250ed + db MENU_BACKUP_TILES ; flags + menu_coords 15, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw ret_25097 + db 0 ; default option +; 0x250f5 + +BuyItem_MenuHeader: ; 0x250f5 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw DisplayPurchasePrice + db -1 ; default option +; 0x250fd + +SellItem_MenuHeader: ; 0x250fd + db MENU_BACKUP_TILES ; flags + menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw DisplaySellingPrice + db 0 ; default option +; 0x25105 diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm new file mode 100644 index 000000000..0b5285608 --- /dev/null +++ b/engine/items/item_effects.asm @@ -0,0 +1,3118 @@ +_DoItemEffect:: ; e722 + ld a, [wCurItem] + ld [wd265], a + call GetItemName + call CopyName1 + ld a, 1 + ld [wItemEffectSucceeded], a + ld a, [wCurItem] + dec a + ld hl, ItemEffects + rst JumpTable + ret +; e73c + + +ItemEffects: ; e73c +; entries correspond to item ids + dw PokeBallEffect ; MASTER_BALL + dw PokeBallEffect ; ULTRA_BALL + dw NoEffect ; BRIGHTPOWDER + dw PokeBallEffect ; GREAT_BALL + dw PokeBallEffect ; POKE_BALL + dw TownMapEffect ; TOWN_MAP + dw BicycleEffect ; BICYCLE + dw EvoStoneEffect ; MOON_STONE + dw StatusHealingEffect ; ANTIDOTE + dw StatusHealingEffect ; BURN_HEAL + dw StatusHealingEffect ; ICE_HEAL + dw StatusHealingEffect ; AWAKENING + dw StatusHealingEffect ; PARLYZ_HEAL + dw FullRestoreEffect ; FULL_RESTORE + dw RestoreHPEffect ; MAX_POTION + dw RestoreHPEffect ; HYPER_POTION + dw RestoreHPEffect ; SUPER_POTION + dw RestoreHPEffect ; POTION + dw EscapeRopeEffect ; ESCAPE_ROPE + dw RepelEffect ; REPEL + dw RestorePPEffect ; MAX_ELIXER + dw EvoStoneEffect ; FIRE_STONE + dw EvoStoneEffect ; THUNDERSTONE + dw EvoStoneEffect ; WATER_STONE + dw NoEffect ; ITEM_19 + dw VitaminEffect ; HP_UP + dw VitaminEffect ; PROTEIN + dw VitaminEffect ; IRON + dw VitaminEffect ; CARBOS + dw NoEffect ; LUCKY_PUNCH + dw VitaminEffect ; CALCIUM + dw RareCandyEffect ; RARE_CANDY + dw XAccuracyEffect ; X_ACCURACY + dw EvoStoneEffect ; LEAF_STONE + dw NoEffect ; METAL_POWDER + dw NoEffect ; NUGGET + dw PokeDollEffect ; POKE_DOLL + dw StatusHealingEffect ; FULL_HEAL + dw ReviveEffect ; REVIVE + dw ReviveEffect ; MAX_REVIVE + dw GuardSpecEffect ; GUARD_SPEC + dw SuperRepelEffect ; SUPER_REPEL + dw MaxRepelEffect ; MAX_REPEL + dw DireHitEffect ; DIRE_HIT + dw NoEffect ; ITEM_2D + dw RestoreHPEffect ; FRESH_WATER + dw RestoreHPEffect ; SODA_POP + dw RestoreHPEffect ; LEMONADE + dw XItemEffect ; X_ATTACK + dw NoEffect ; ITEM_32 + dw XItemEffect ; X_DEFEND + dw XItemEffect ; X_SPEED + dw XItemEffect ; X_SPECIAL + dw CoinCaseEffect ; COIN_CASE + dw ItemfinderEffect ; ITEMFINDER + dw PokeFluteEffect ; POKE_FLUTE + dw NoEffect ; EXP_SHARE + dw OldRodEffect ; OLD_ROD + dw GoodRodEffect ; GOOD_ROD + dw NoEffect ; SILVER_LEAF + dw SuperRodEffect ; SUPER_ROD + dw RestorePPEffect ; PP_UP + dw RestorePPEffect ; ETHER + dw RestorePPEffect ; MAX_ETHER + dw RestorePPEffect ; ELIXER + dw NoEffect ; RED_SCALE + dw NoEffect ; SECRETPOTION + dw NoEffect ; S_S_TICKET + dw NoEffect ; MYSTERY_EGG + dw NoEffect ; CLEAR_BELL + dw NoEffect ; SILVER_WING + dw RestoreHPEffect ; MOOMOO_MILK + dw NoEffect ; QUICK_CLAW + dw StatusHealingEffect ; PSNCUREBERRY + dw NoEffect ; GOLD_LEAF + dw NoEffect ; SOFT_SAND + dw NoEffect ; SHARP_BEAK + dw StatusHealingEffect ; PRZCUREBERRY + dw StatusHealingEffect ; BURNT_BERRY + dw StatusHealingEffect ; ICE_BERRY + dw NoEffect ; POISON_BARB + dw NoEffect ; KINGS_ROCK + dw BitterBerryEffect ; BITTER_BERRY + dw StatusHealingEffect ; MINT_BERRY + dw NoEffect ; RED_APRICORN + dw NoEffect ; TINYMUSHROOM + dw NoEffect ; BIG_MUSHROOM + dw NoEffect ; SILVERPOWDER + dw NoEffect ; BLU_APRICORN + dw NoEffect ; ITEM_5A + dw NoEffect ; AMULET_COIN + dw NoEffect ; YLW_APRICORN + dw NoEffect ; GRN_APRICORN + dw NoEffect ; CLEANSE_TAG + dw NoEffect ; MYSTIC_WATER + dw NoEffect ; TWISTEDSPOON + dw NoEffect ; WHT_APRICORN + dw NoEffect ; BLACKBELT + dw NoEffect ; BLK_APRICORN + dw NoEffect ; ITEM_64 + dw NoEffect ; PNK_APRICORN + dw NoEffect ; BLACKGLASSES + dw NoEffect ; SLOWPOKETAIL + dw NoEffect ; PINK_BOW + dw NoEffect ; STICK + dw NoEffect ; SMOKE_BALL + dw NoEffect ; NEVERMELTICE + dw NoEffect ; MAGNET + dw StatusHealingEffect ; MIRACLEBERRY + dw NoEffect ; PEARL + dw NoEffect ; BIG_PEARL + dw NoEffect ; EVERSTONE + dw NoEffect ; SPELL_TAG + dw RestoreHPEffect ; RAGECANDYBAR + dw NoEffect ; GS_BALL + dw BlueCardEffect ; BLUE_CARD + dw NoEffect ; MIRACLE_SEED + dw NoEffect ; THICK_CLUB + dw NoEffect ; FOCUS_BAND + dw NoEffect ; ITEM_78 + dw EnergypowderEffect ; ENERGYPOWDER + dw EnergyRootEffect ; ENERGY_ROOT + dw HealPowderEffect ; HEAL_POWDER + dw RevivalHerbEffect ; REVIVAL_HERB + dw NoEffect ; HARD_STONE + dw NoEffect ; LUCKY_EGG + dw CardKeyEffect ; CARD_KEY + dw NoEffect ; MACHINE_PART + dw NoEffect ; EGG_TICKET + dw NoEffect ; LOST_ITEM + dw NoEffect ; STARDUST + dw NoEffect ; STAR_PIECE + dw BasementKeyEffect ; BASEMENT_KEY + dw NoEffect ; PASS + dw NoEffect ; ITEM_87 + dw NoEffect ; ITEM_88 + dw NoEffect ; ITEM_89 + dw NoEffect ; CHARCOAL + dw RestoreHPEffect ; BERRY_JUICE + dw NoEffect ; SCOPE_LENS + dw NoEffect ; ITEM_8D + dw NoEffect ; ITEM_8E + dw NoEffect ; METAL_COAT + dw NoEffect ; DRAGON_FANG + dw NoEffect ; ITEM_91 + dw NoEffect ; LEFTOVERS + dw NoEffect ; ITEM_93 + dw NoEffect ; ITEM_94 + dw NoEffect ; ITEM_95 + dw RestorePPEffect ; MYSTERYBERRY + dw NoEffect ; DRAGON_SCALE + dw NoEffect ; BERSERK_GENE + dw NoEffect ; ITEM_99 + dw NoEffect ; ITEM_9A + dw NoEffect ; ITEM_9B + dw SacredAshEffect ; SACRED_ASH + dw PokeBallEffect ; HEAVY_BALL + dw NoEffect ; FLOWER_MAIL + dw PokeBallEffect ; LEVEL_BALL + dw PokeBallEffect ; LURE_BALL + dw PokeBallEffect ; FAST_BALL + dw NoEffect ; ITEM_A2 + dw NoEffect ; LIGHT_BALL + dw PokeBallEffect ; FRIEND_BALL + dw PokeBallEffect ; MOON_BALL + dw PokeBallEffect ; LOVE_BALL + dw NormalBoxEffect ; NORMAL_BOX + dw GorgeousBoxEffect ; GORGEOUS_BOX + dw EvoStoneEffect ; SUN_STONE + dw NoEffect ; POLKADOT_BOW + dw NoEffect ; ITEM_AB + dw NoEffect ; UP_GRADE + dw RestoreHPEffect ; BERRY + dw RestoreHPEffect ; GOLD_BERRY + dw SquirtbottleEffect ; SQUIRTBOTTLE + dw NoEffect ; ITEM_B0 + dw PokeBallEffect ; PARK_BALL + dw NoEffect ; RAINBOW_WING + dw NoEffect ; ITEM_B3 +; e8a2 + + +PokeBallEffect: ; e8a2 + ld a, [wBattleMode] + dec a + jp nz, UseBallInTrainerBattle + + ld a, [wPartyCount] + cp PARTY_LENGTH + jr nz, .room_in_party + + ld a, BANK(sBoxCount) + call GetSRAMBank + ld a, [sBoxCount] + cp MONS_PER_BOX + call CloseSRAM + jp z, Ball_BoxIsFullMessage + +.room_in_party + xor a + ld [wWildMon], a + ld a, [wCurItem] + cp PARK_BALL + call nz, ReturnToBattle_UseBall + + ld hl, wOptions + res NO_TEXT_SCROLL, [hl] + ld hl, UsedItemText + call PrintText + + ld a, [wEnemyMonCatchRate] + ld b, a + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jp z, .catch_without_fail + ld a, [wCurItem] + cp MASTER_BALL + jp z, .catch_without_fail + ld a, [wCurItem] + ld c, a + ld hl, BallMultiplierFunctionTable + +.get_multiplier_loop + ld a, [hli] + cp $ff + jr z, .skip_or_return_from_ball_fn + cp c + jr z, .call_ball_function + inc hl + inc hl + jr .get_multiplier_loop + +.call_ball_function + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .skip_or_return_from_ball_fn + push de + jp hl + +.skip_or_return_from_ball_fn + ld a, [wCurItem] + cp LEVEL_BALL + ld a, b + jp z, .skip_hp_calc + + ld a, b + ld [hMultiplicand + 2], a + + ld hl, wEnemyMonHP + ld b, [hl] + inc hl + ld c, [hl] + inc hl + ld d, [hl] + inc hl + ld e, [hl] + sla c + rl b + + ld h, d + ld l, e + add hl, de + add hl, de + ld d, h + ld e, l + ld a, d + and a + jr z, .okay_1 + + srl d + rr e + srl d + rr e + srl b + rr c + srl b + rr c + + ld a, c + and a + jr nz, .okay_1 + ld c, $1 +.okay_1 + ld b, e + + push bc + ld a, b + sub c + ld [hMultiplier], a + xor a + ld [hDividend + 0], a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + call Multiply + pop bc + + ld a, b + ld [hDivisor], a + ld b, $4 + call Divide + + ld a, [hQuotient + 2] + and a + jr nz, .statuscheck + ld a, 1 +.statuscheck +; This routine is buggy. It was intended that SLP and FRZ provide a higher +; catch rate than BRN/PSN/PAR, which in turn provide a higher catch rate than +; no status effect at all. But instead, it makes BRN/PSN/PAR provide no +; benefit. +; Uncomment the line below to fix this. + ld b, a + ld a, [wEnemyMonStatus] + and 1 << FRZ | SLP + ld c, 10 + jr nz, .addstatus + ; ld a, [wEnemyMonStatus] + and a + ld c, 5 + jr nz, .addstatus + ld c, 0 +.addstatus + ld a, b + add c + jr nc, .max_1 + ld a, $ff +.max_1 + + ; BUG: farcall overwrites a, and GetItemHeldEffect takes b anyway. + ; This is probably the reason the HELD_CATCH_CHANCE effect is never used. + ; Uncomment the line below to fix. + ld d, a + push de + ld a, [wBattleMonItem] + ; ld b, a + farcall GetItemHeldEffect + ld a, b + cp HELD_CATCH_CHANCE + pop de + ld a, d + jr nz, .max_2 + add c + jr nc, .max_2 + ld a, $ff +.max_2 + +.skip_hp_calc + ld b, a + ld [wBuffer1], a + call Random + + cp b + ld a, 0 + jr z, .catch_without_fail + jr nc, .fail_to_catch + +.catch_without_fail + ld a, [wEnemyMonSpecies] + +.fail_to_catch + ld [wWildMon], a + ld c, 20 + call DelayFrames + + ld a, [wCurItem] + cp POKE_BALL + 1 ; Assumes Master/Ultra/Great come before + jr c, .not_kurt_ball + ld a, POKE_BALL +.not_kurt_ball + ld [wBattleAnimParam], a + + ld de, ANIM_THROW_POKE_BALL + ld a, e + ld [wFXAnimID], a + ld a, d + ld [wFXAnimID + 1], a + xor a + ld [hBattleTurn], a + ld [wBuffer2], a + ld [wNumHits], a + predef PlayBattleAnim + + ld a, [wWildMon] + and a + jr nz, .caught + ld a, [wBuffer2] + cp $1 + ld hl, Text_NoShake + jp z, .shake_and_break_free + cp $2 + ld hl, Text_OneShake + jp z, .shake_and_break_free + cp $3 + ld hl, Text_TwoShakes + jp z, .shake_and_break_free + cp $4 + ld hl, Text_ThreeShakes + jp z, .shake_and_break_free +.caught + + ld hl, wEnemyMonStatus + ld a, [hli] + push af + inc hl + ld a, [hli] + push af + ld a, [hl] + push af + push hl + ld hl, wEnemyMonItem + ld a, [hl] + push af + push hl + ld hl, wEnemySubStatus5 + ld a, [hl] + push af + set SUBSTATUS_TRANSFORMED, [hl] + +; This code is buggy. Any wild Pokémon that has Transformed will be +; caught as a Ditto, even if it was something else like Mew. +; To fix, do not set [wTempEnemyMonSpecies] to DITTO. + bit SUBSTATUS_TRANSFORMED, a + jr nz, .ditto + jr .not_ditto + +.ditto + ld a, DITTO + ld [wTempEnemyMonSpecies], a + jr .load_data + +.not_ditto + set SUBSTATUS_TRANSFORMED, [hl] + ld hl, wEnemyBackupDVs + ld a, [wEnemyMonDVs] + ld [hli], a + ld a, [wEnemyMonDVs + 1] + ld [hl], a + +.load_data + ld a, [wTempEnemyMonSpecies] + ld [wCurPartySpecies], a + ld a, [wEnemyMonLevel] + ld [wCurPartyLevel], a + farcall LoadEnemyMon + + pop af + ld [wEnemySubStatus5], a + + pop hl + pop af + ld [hl], a + pop hl + pop af + ld [hld], a + pop af + ld [hld], a + dec hl + pop af + ld [hl], a + + ld hl, wEnemySubStatus5 + bit SUBSTATUS_TRANSFORMED, [hl] + jr nz, .Transformed + ld hl, wWildMonMoves + ld de, wEnemyMonMoves + ld bc, NUM_MOVES + call CopyBytes + + ld hl, wWildMonPP + ld de, wEnemyMonPP + ld bc, NUM_MOVES + call CopyBytes +.Transformed: + + ld a, [wEnemyMonSpecies] + ld [wWildMon], a + ld [wCurPartySpecies], a + ld [wd265], a + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jp z, .FinishTutorial + + farcall StubbedTrainerRankings_WildMonsCaught + + ld hl, Text_GotchaMonWasCaught + call PrintText + + call ClearSprites + + ld a, [wd265] + dec a + call CheckCaughtMon + + ld a, c + push af + ld a, [wd265] + dec a + call SetSeenAndCaughtMon + pop af + and a + jr nz, .skip_pokedex + + call CheckReceivedDex + jr z, .skip_pokedex + + ld hl, Text_AddedToPokedex + call PrintText + + call ClearSprites + + ld a, [wEnemyMonSpecies] + ld [wd265], a + predef NewPokedexEntry + +.skip_pokedex + ld a, [wBattleType] + cp BATTLETYPE_CONTEST + jp z, .catch_bug_contest_mon + cp BATTLETYPE_CELEBI + jr nz, .not_celebi + ld hl, wBattleResult + set 6, [hl] +.not_celebi + + ld a, [wPartyCount] + cp PARTY_LENGTH + jr z, .SendToPC + + xor a ; PARTYMON + ld [wMonType], a + call ClearSprites + + predef TryAddMonToParty + + farcall SetCaughtData + + ld a, [wCurItem] + cp FRIEND_BALL + jr nz, .SkipPartyMonFriendBall + + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + + ld a, FRIEND_BALL_HAPPINESS + ld [hl], a +.SkipPartyMonFriendBall: + + ld hl, Text_AskNicknameNewlyCaughtMon + call PrintText + + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + + call YesNoBox + jp c, .return_from_capture + + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + ld hl, wPartyMonNicknames + ld bc, MON_NAME_LENGTH + call AddNTimes + + ld d, h + ld e, l + push de + xor a ; PARTYMON + ld [wMonType], a + ld b, 0 + farcall NamingScreen + + call RotateThreePalettesRight + + call LoadStandardFont + + pop hl + ld de, wStringBuffer1 + call InitName + + jp .return_from_capture + +.SendToPC: + call ClearSprites + + predef SendMonIntoBox + + farcall SetBoxMonCaughtData + + ld a, BANK(sBoxCount) + call GetSRAMBank + + ld a, [sBoxCount] + cp MONS_PER_BOX + jr nz, .BoxNotFullYet + ld hl, wBattleResult + set 7, [hl] +.BoxNotFullYet: + ld a, [wCurItem] + cp FRIEND_BALL + jr nz, .SkipBoxMonFriendBall + ; The captured mon is now first in the box + ld a, FRIEND_BALL_HAPPINESS + ld [sBoxMon1Happiness], a +.SkipBoxMonFriendBall: + call CloseSRAM + + ld hl, Text_AskNicknameNewlyCaughtMon + call PrintText + + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + + call YesNoBox + jr c, .SkipBoxMonNickname + + xor a + ld [wCurPartyMon], a + ld a, BOXMON + ld [wMonType], a + ld de, wMonOrItemNameBuffer + ld b, $0 + farcall NamingScreen + + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + + ld hl, wMonOrItemNameBuffer + ld de, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + call CopyBytes + + ld hl, sBoxMonNicknames + ld de, wStringBuffer1 + call InitName + + call CloseSRAM + +.SkipBoxMonNickname: + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + + ld hl, sBoxMonNicknames + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + + call CloseSRAM + + ld hl, Text_SentToBillsPC + call PrintText + + call RotateThreePalettesRight + call LoadStandardFont + jr .return_from_capture + +.catch_bug_contest_mon + farcall BugContest_SetCaughtContestMon + jr .return_from_capture + +.FinishTutorial: + ld hl, Text_GotchaMonWasCaught + +.shake_and_break_free + call PrintText + call ClearSprites + +.return_from_capture + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + ret z + cp BATTLETYPE_DEBUG + ret z + cp BATTLETYPE_CONTEST + jr z, .used_park_ball + + ld a, [wWildMon] + and a + jr z, .toss + + call ClearBGPalettes + call ClearTileMap + +.toss + ld hl, wNumItems + inc a + ld [wItemQuantityChangeBuffer], a + jp TossItem + +.used_park_ball + ld hl, wParkBallsRemaining + dec [hl] + ret +; ec0a + + +BallMultiplierFunctionTable: +; table of routines that increase or decrease the catch rate based on +; which ball is used in a certain situation. + dbw ULTRA_BALL, UltraBallMultiplier + dbw GREAT_BALL, GreatBallMultiplier + dbw SAFARI_BALL, SafariBallMultiplier ; Safari Ball, leftover from RBY + dbw HEAVY_BALL, HeavyBallMultiplier + dbw LEVEL_BALL, LevelBallMultiplier + dbw LURE_BALL, LureBallMultiplier + dbw FAST_BALL, FastBallMultiplier + dbw MOON_BALL, MoonBallMultiplier + dbw LOVE_BALL, LoveBallMultiplier + dbw PARK_BALL, ParkBallMultiplier + db -1 ; end + +UltraBallMultiplier: +; multiply catch rate by 2 + sla b + ret nc + ld b, $ff + ret + +SafariBallMultiplier: +GreatBallMultiplier: +ParkBallMultiplier: +; multiply catch rate by 1.5 + ld a, b + srl a + add b + ld b, a + ret nc + ld b, $ff + ret + +GetPokedexEntryBank: + push hl + push de + ld a, [wEnemyMonSpecies] + rlca + rlca + maskbits NUM_DEX_ENTRY_BANKS + ld hl, .PokedexEntryBanks + ld d, 0 + ld e, a + add hl, de + ld a, [hl] + pop de + pop hl + ret + +.PokedexEntryBanks: + db BANK(PokedexEntries1) + db BANK(PokedexEntries2) + db BANK(PokedexEntries3) + db BANK(PokedexEntries4) + +HeavyBallMultiplier: +; subtract 20 from catch rate if weight < 102.4 kg +; else add 0 to catch rate if weight < 204.8 kg +; else add 20 to catch rate if weight < 307.2 kg +; else add 30 to catch rate if weight < 409.6 kg +; else add 40 to catch rate (never happens) + ld a, [wEnemyMonSpecies] + ld hl, PokedexDataPointerTable + dec a + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, BANK(PokedexDataPointerTable) + call GetFarHalfword + +.SkipText: + call GetPokedexEntryBank + call GetFarByte + inc hl + cp "@" + jr nz, .SkipText + + call GetPokedexEntryBank + push bc + inc hl + inc hl + call GetFarHalfword + + srl h + rr l + ld b, h + ld c, l + + rept 4 + srl b + rr c + endr + call .subbc + + srl b + rr c + call .subbc + + ld a, h + pop bc + jr .compare + +.subbc + ; subtract bc from hl + push bc + ld a, b + cpl + ld b, a + ld a, c + cpl + ld c, a + inc bc + add hl, bc + pop bc + ret + +.compare + ld c, a + cp HIGH(1024) ; 102.4 kg + jr c, .lightmon + + ld hl, .WeightsTable +.lookup + ld a, c + cp [hl] + jr c, .heavymon + inc hl + inc hl + jr .lookup + +.heavymon + inc hl + ld a, b + add [hl] + ld b, a + ret nc + ld b, $ff + ret + +.lightmon + ld a, b + sub 20 + ld b, a + ret nc + ld b, $1 + ret + +.WeightsTable: +; weight factor, boost + db HIGH(2048), 0 + db HIGH(3072), 20 + db HIGH(4096), 30 + db HIGH(65280), 40 + +LureBallMultiplier: +; multiply catch rate by 3 if this is a fishing rod battle + ld a, [wBattleType] + cp BATTLETYPE_FISH + ret nz + + ld a, b + add a + jr c, .max + + add b + jr nc, .done +.max + ld a, $ff +.done + ld b, a + ret + +MoonBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 4 if mon evolves with moon stone +; Reality: no boost + push bc + ld a, [wTempEnemyMonSpecies] + dec a + ld c, a + ld b, 0 + ld hl, EvosAttacksPointers + add hl, bc + add hl, bc + ld a, BANK(EvosAttacksPointers) + call GetFarHalfword + pop bc + + push bc + ld a, BANK(EvosAttacks) + call GetFarByte + cp EVOLVE_ITEM + pop bc + ret nz + + inc hl + inc hl + inc hl + +; Moon Stone's constant from Pokémon Red is used. +; No Pokémon evolve with Burn Heal, +; so Moon Balls always have a catch rate of 1×. + push bc + ld a, BANK(EvosAttacks) + call GetFarByte + cp MOON_STONE_RED ; BURN_HEAL + pop bc + ret nz + + sla b + jr c, .max + sla b + jr nc, .done +.max + ld b, $ff +.done + ret + +LoveBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 8 if mons are of same species, different sex +; Reality: multiply catch rate by 8 if mons are of same species, same sex + + ; does species match? + ld a, [wTempEnemyMonSpecies] + ld c, a + ld a, [wTempBattleMonSpecies] + cp c + ret nz + + ; check player mon species + push bc + ld a, [wTempBattleMonSpecies] + ld [wCurPartySpecies], a + xor a ; PARTYMON + ld [wMonType], a + ld a, [wCurBattleMon] + ld [wCurPartyMon], a + farcall GetGender + jr c, .done1 ; no effect on genderless + + ld d, 0 ; male + jr nz, .playermale + inc d ; female +.playermale + + ; check wild mon species + push de + ld a, [wTempEnemyMonSpecies] + ld [wCurPartySpecies], a + ld a, WILDMON + ld [wMonType], a + farcall GetGender + jr c, .done2 ; no effect on genderless + + ld d, 0 ; male + jr nz, .wildmale + inc d ; female +.wildmale + + ld a, d + pop de + cp d + pop bc + ret nz ; for the intended effect, this should be "ret z" + + sla b + jr c, .max + sla b + jr c, .max + sla b + ret nc +.max + ld b, $ff + ret + +.done2 + pop de + +.done1 + pop bc + ret + +FastBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 4 if enemy mon is in one of the three +; FleeMons tables. +; Reality: multiply catch rate by 4 if enemy mon is one of the first three in +; the first FleeMons table. + ld a, [wTempEnemyMonSpecies] + ld c, a + ld hl, FleeMons + ld d, 3 + +.loop + ld a, BANK(FleeMons) + call GetFarByte + + inc hl + cp -1 + jr z, .next + cp c + jr nz, .next ; for the intended effect, this should be "jr nz, .loop" + sla b + jr c, .max + + sla b + ret nc + +.max + ld b, $ff + ret + +.next + dec d + jr nz, .loop + ret + +LevelBallMultiplier: +; multiply catch rate by 8 if player mon level / 4 > enemy mon level +; multiply catch rate by 4 if player mon level / 2 > enemy mon level +; multiply catch rate by 2 if player mon level > enemy mon level + ld a, [wBattleMonLevel] + ld c, a + ld a, [wEnemyMonLevel] + cp c + ret nc ; if player is lower level, we're done here + sla b + jr c, .max + + srl c + cp c + ret nc ; if player/2 is lower level, we're done here + sla b + jr c, .max + + srl c + cp c + ret nc ; if player/4 is lower level, we're done here + sla b + ret nc + +.max + ld b, $ff + ret + +; These two texts were carried over from gen 1. +; They are not used in gen 2, and are dummied out. + +Text_RBY_CatchMarowak: ; 0xedab + ; It dodged the thrown BALL! This #MON can't be caught! + text_jump UnknownText_0x1c5a5a + db "@" +; 0xedb0 + +Text_RBY_NoShake: ; 0xedb0 + ; You missed the #MON! + text_jump UnknownText_0x1c5a90 + db "@" +; 0xedb5 + +Text_NoShake: ; 0xedb5 + ; Oh no! The #MON broke free! + text_jump UnknownText_0x1c5aa6 + db "@" +; 0xedba + +Text_OneShake: ; 0xedba + ; Aww! It appeared to be caught! + text_jump UnknownText_0x1c5ac3 + db "@" +; 0xedbf + +Text_TwoShakes: ; 0xedbf + ; Aargh! Almost had it! + text_jump UnknownText_0x1c5ae3 + db "@" +; 0xedc4 + +Text_ThreeShakes: ; 0xedc4 + ; Shoot! It was so close too! + text_jump UnknownText_0x1c5afa + db "@" +; 0xedc9 + +Text_GotchaMonWasCaught: ; 0xedc9 + ; Gotcha! @ was caught!@ @ + text_jump UnknownText_0x1c5b17 + start_asm + call WaitSFX + push bc + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + ld de, MUSIC_CAPTURE + call PlayMusic + pop bc + ld hl, TextJump_Waitbutton + ret +; ede6 + +TextJump_Waitbutton: ; 0xede6 + ; @ + text_jump Text_Waitbutton_2 + db "@" +; 0xedeb + +Text_SentToBillsPC: ; 0xedeb + ; was sent to BILL's PC. + text_jump UnknownText_0x1c5b38 + db "@" +; 0xedf0 + +Text_AddedToPokedex: ; 0xedf0 + ; 's data was newly added to the #DEX.@ @ + text_jump UnknownText_0x1c5b53 + db "@" +; 0xedf5 + +Text_AskNicknameNewlyCaughtMon: ; 0xedf5 + ; Give a nickname to @ ? + text_jump UnknownText_0x1c5b7f + db "@" +; 0xedfa + +ReturnToBattle_UseBall: ; edfa (3:6dfa) + farcall _ReturnToBattle_UseBall + ret + +TownMapEffect: ; ee01 + farcall PokegearMap + ret +; ee08 + + +BicycleEffect: ; ee08 + farcall BikeFunction + ret +; ee0f + + +EvoStoneEffect: ; ee0f + ld b, PARTYMENUACTION_EVO_STONE + call UseItem_SelectMon + + jp c, .DecidedNotToUse + + ld a, MON_ITEM + call GetPartyParamLocation + + ld a, [hl] + cp EVERSTONE + jr z, .NoEffect + + ld a, $1 + ld [wForceEvolution], a + farcall EvolvePokemon + + ld a, [wMonTriedToEvolve] + and a + jr z, .NoEffect + + jp UseDisposableItem + +.NoEffect: + call WontHaveAnyEffectMessage + +.DecidedNotToUse: + xor a + ld [wItemEffectSucceeded], a + ret +; ee3d + + +VitaminEffect: ; ee3d + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + + jp c, RareCandy_StatBooster_ExitMenu + + call RareCandy_StatBooster_GetParameters + + call GetStatExpRelativePointer + + ld a, MON_STAT_EXP + call GetPartyParamLocation + + add hl, bc + ld a, [hl] + cp 100 + jr nc, NoEffectMessage + + add 10 + ld [hl], a + call UpdateStatsAfterItem + + call GetStatExpRelativePointer + + ld hl, StatStrings + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wStringBuffer2 + ld bc, ITEM_NAME_LENGTH + call CopyBytes + + call Play_SFX_FULL_HEAL + + ld hl, Text_StatRose + call PrintText + + ld c, HAPPINESS_USEDITEM + farcall ChangeHappiness + + jp UseDisposableItem + + +NoEffectMessage: ; ee83 + ld hl, WontHaveAnyEffectText + call PrintText + jp ClearPalettes +; ee8c + + +UpdateStatsAfterItem: ; ee8c + ld a, MON_MAXHP + call GetPartyParamLocation + ld d, h + ld e, l + ld a, MON_STAT_EXP - 1 + call GetPartyParamLocation + ld b, TRUE + predef_jump CalcMonStats +; ee9f + +RareCandy_StatBooster_ExitMenu: ; ee9f + xor a + ld [wItemEffectSucceeded], a + jp ClearPalettes +; eea6 + + +Text_StatRose: ; 0xeea6 + ; 's @ rose. + text_jump UnknownText_0x1c5b9a + db "@" +; 0xeeab + + +StatStrings: ; eeab + dw .health + dw .attack + dw .defense + dw .speed + dw .special + +.health db "HEALTH@" +.attack db "ATTACK@" +.defense db "DEFENSE@" +.speed db "SPEED@" +.special db "SPECIAL@" +; eed9 + + +GetStatExpRelativePointer: ; eed9 + ld a, [wCurItem] + ld hl, Table_eeeb +.next + cp [hl] + inc hl + jr z, .got_it + inc hl + jr .next + +.got_it + ld a, [hl] + ld c, a + ld b, 0 + ret +; eeeb + +Table_eeeb: ; eeeb + db HP_UP, MON_HP_EXP - MON_STAT_EXP + db PROTEIN, MON_ATK_EXP - MON_STAT_EXP + db IRON, MON_DEF_EXP - MON_STAT_EXP + db CARBOS, MON_SPD_EXP - MON_STAT_EXP + db CALCIUM, MON_SPC_EXP - MON_STAT_EXP +; eef5 + + +RareCandy_StatBooster_GetParameters: ; eef5 + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + ld [wd265], a + ld a, MON_LEVEL + call GetPartyParamLocation + ld a, [hl] + ld [wCurPartyLevel], a + call GetBaseData + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + ret +; 0xef14 + + +RareCandyEffect: ; ef14 + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + + jp c, RareCandy_StatBooster_ExitMenu + + call RareCandy_StatBooster_GetParameters + + ld a, MON_LEVEL + call GetPartyParamLocation + + ld a, [hl] + cp MAX_LEVEL + jp nc, NoEffectMessage + + inc a + ld [hl], a + ld [wCurPartyLevel], a + push de + ld d, a + farcall CalcExpAtLevel + + pop de + ld a, MON_EXP + call GetPartyParamLocation + + ld a, [hMultiplicand] + ld [hli], a + ld a, [hMultiplicand + 1] + ld [hli], a + ld a, [hMultiplicand + 2] + ld [hl], a + + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld b, a + ld c, [hl] + push bc + call UpdateStatsAfterItem + + ld a, MON_MAXHP + 1 + call GetPartyParamLocation + + pop bc + ld a, [hld] + sub c + ld c, a + ld a, [hl] + sbc b + ld b, a + dec hl + ld a, [hl] + add c + ld [hld], a + ld a, [hl] + adc b + ld [hl], a + farcall LevelUpHappinessMod + + ld a, PARTYMENUTEXT_LEVEL_UP + call ItemActionText + + xor a ; PARTYMON + ld [wMonType], a + predef CopyMonToTempMon + + hlcoord 9, 0 + ld b, 10 + ld c, 9 + call TextBox + + hlcoord 11, 1 + ld bc, 4 + predef PrintTempMonStats + + call WaitPressAorB_BlinkCursor + + xor a ; PARTYMON + ld [wMonType], a + ld a, [wCurPartySpecies] + ld [wd265], a + predef LearnLevelMoves + + xor a + ld [wForceEvolution], a + farcall EvolvePokemon + + jp UseDisposableItem +; efad + + +HealPowderEffect: ; efad + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + + jp c, StatusHealer_ExitMenu + + call UseStatusHealer + + cp $0 + jr nz, .asm_efc9 + ld c, HAPPINESS_BITTERPOWDER + farcall ChangeHappiness + + call LooksBitterMessage + + ld a, $0 + +.asm_efc9 + jp StatusHealer_Jumptable +; efcc + + +StatusHealingEffect: ; efcc + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + +FullyHealStatus: ; efd4 + call UseStatusHealer + jp StatusHealer_Jumptable +; efda + + +UseStatusHealer: ; efda (3:6fda) + call IsMonFainted + ld a, $1 + ret z + call GetItemHealingAction + ld a, MON_STATUS + call GetPartyParamLocation + ld a, [hl] + and c + jr nz, .good + call IsItemUsedOnConfusedMon + ld a, $1 + ret nc + ld b, PARTYMENUTEXT_HEAL_CONFUSION +.good + xor a + ld [hl], a + ld a, b + ld [wPartyMenuActionText], a + call HealStatus + call Play_SFX_FULL_HEAL + call ItemActionTextWaitButton + call UseDisposableItem + ld a, $0 + ret + +IsItemUsedOnConfusedMon: ; f009 (3:7009) + call IsItemUsedOnBattleMon + jr nc, .nope + ld a, [wPlayerSubStatus3] + bit SUBSTATUS_CONFUSED, a + jr z, .nope + ld a, c + cp $ff + jr nz, .nope + scf + ret + +.nope + and a + ret + +BattlemonRestoreHealth: ; f01e (3:701e) + call IsItemUsedOnBattleMon + ret nc + ld a, MON_HP + call GetPartyParamLocation + ld a, [hli] + ld [wBattleMonHP], a + ld a, [hld] + ld [wBattleMonHP + 1], a + ret + +HealStatus: ; f030 (3:7030) + call IsItemUsedOnBattleMon + ret nc + xor a + ld [wBattleMonStatus], a + ld hl, wPlayerSubStatus5 + res SUBSTATUS_TOXIC, [hl] + ld hl, wPlayerSubStatus1 + res SUBSTATUS_NIGHTMARE, [hl] + call GetItemHealingAction + ld a, c + cp %11111111 + jr nz, .not_full_heal + ld hl, wPlayerSubStatus3 + res SUBSTATUS_CONFUSED, [hl] +.not_full_heal + push bc + farcall CalcPlayerStats + pop bc + ret + +GetItemHealingAction: ; f058 (3:7058) + push hl + ld a, [wCurItem] + ld hl, StatusHealingActions + ld bc, 3 +.next + cp [hl] + jr z, .found_it + add hl, bc + jr .next + +.found_it + inc hl + ld b, [hl] + inc hl + ld a, [hl] + ld c, a + cp %11111111 + pop hl + ret +; f071 (3:7071) + +INCLUDE "data/items/heal_status.asm" + +StatusHealer_Jumptable: ; f09e (3:709e) + ld hl, .dw + rst JumpTable + ret + +.dw ; f0a3 (3:70a3) + dw StatusHealer_ClearPalettes + dw StatusHealer_NoEffect + dw StatusHealer_ExitMenu + + +RevivalHerbEffect: ; f0a9 + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + + call RevivePokemon + cp 0 + jr nz, .asm_f0c5 + + ld c, HAPPINESS_REVIVALHERB + farcall ChangeHappiness + call LooksBitterMessage + ld a, 0 + +.asm_f0c5 + jp StatusHealer_Jumptable +; f0c8 + + +ReviveEffect: ; f0c8 + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + + call RevivePokemon + jp StatusHealer_Jumptable +; f0d6 + + +RevivePokemon: ; f0d6 + call IsMonFainted + ld a, 1 + ret nz + ld a, [wBattleMode] + and a + jr z, .skip_to_revive + + ld a, [wCurPartyMon] + ld c, a + ld d, 0 + ld hl, wBattleParticipantsIncludingFainted + ld b, CHECK_FLAG + predef SmallFarFlagAction + ld a, c + and a + jr z, .skip_to_revive + + ld a, [wCurPartyMon] + ld c, a + ld hl, wBattleParticipantsNotFainted + ld b, SET_FLAG + predef SmallFarFlagAction + +.skip_to_revive + xor a + ld [wLowHealthAlarm], a + ld a, [wCurItem] + cp REVIVE + jr z, .revive_half_hp + + call ReviveFullHP + jr .finish_revive + +.revive_half_hp + call ReviveHalfHP + +.finish_revive + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_REVIVE + ld [wPartyMenuActionText], a + call ItemActionTextWaitButton + call UseDisposableItem + ld a, 0 + ret +; f128 + + +FullRestoreEffect: ; f128 + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + + call IsMonFainted + jp z, StatusHealer_NoEffect + + call IsMonAtFullHealth + jr c, .NotAtFullHealth + + jp FullyHealStatus + +.NotAtFullHealth: + call .FullRestore + jp StatusHealer_Jumptable +; f144 + + +.FullRestore: ; f144 + xor a + ld [wLowHealthAlarm], a + call ReviveFullHP + ld a, MON_STATUS + call GetPartyParamLocation + xor a + ld [hli], a + ld [hl], a + call HealStatus + call BattlemonRestoreHealth + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_HEAL_HP + ld [wPartyMenuActionText], a + call ItemActionTextWaitButton + call UseDisposableItem + ld a, 0 + ret +; f16a + + +BitterBerryEffect: ; f16a + ld hl, wPlayerSubStatus3 + bit SUBSTATUS_CONFUSED, [hl] + ld a, 1 + jr z, .done + + res SUBSTATUS_CONFUSED, [hl] + xor a + ld [hBattleTurn], a + call UseItemText + + ld hl, ConfusedNoMoreText + call StdBattleTextBox + + ld a, 0 + +.done + jp StatusHealer_Jumptable +; f186 + + +RestoreHPEffect: ; f186 + call ItemRestoreHP + jp StatusHealer_Jumptable +; f18c + + +EnergypowderEffect: ; f18c + ld c, HAPPINESS_BITTERPOWDER + jr EnergypowderEnergyRootCommon +; f190 + +EnergyRootEffect: ; f190 + ld c, HAPPINESS_ENERGYROOT +; f192 + +EnergypowderEnergyRootCommon: ; f192 + push bc + call ItemRestoreHP + pop bc + cp 0 + jr nz, .skip_happiness + + farcall ChangeHappiness + call LooksBitterMessage + ld a, 0 + +.skip_happiness + jp StatusHealer_Jumptable +; f1a9 + + +ItemRestoreHP: ; f1a9 (3:71a9) + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + ld a, 2 + ret c + + call IsMonFainted + ld a, 1 + ret z + + call IsMonAtFullHealth + ld a, 1 + ret nc + + xor a + ld [wLowHealthAlarm], a + call GetHealingItemAmount + call RestoreHealth + call BattlemonRestoreHealth + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_HEAL_HP + ld [wPartyMenuActionText], a + call ItemActionTextWaitButton + call UseDisposableItem + ld a, 0 + ret + +HealHP_SFX_GFX: ; f1db (3:71db) + push de + ld de, SFX_POTION + call WaitPlaySFX + pop de + ld a, [wCurPartyMon] + hlcoord 11, 0 + ld bc, SCREEN_WIDTH * 2 + call AddNTimes + ld a, $2 + ld [wWhichHPBar], a + predef_jump AnimateHPBar + +UseItem_SelectMon: ; f1f9 (3:71f9) + call .SelectMon + ret c + + ld a, [wCurPartySpecies] + cp EGG + jr nz, .not_egg + + call CantUseOnEggMessage + scf + ret + +.not_egg + and a + ret + +.SelectMon: ; f20b (3:720b) + ld a, b + ld [wPartyMenuActionText], a + push hl + push de + push bc + call ClearBGPalettes + call ChooseMonToUseItemOn + pop bc + pop de + pop hl + ret + +ChooseMonToUseItemOn: ; f21c (3:721c) + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + ret + +ItemActionText: ; f24a (3:724a) + ld [wPartyMenuActionText], a + ld a, [wCurPartySpecies] + push af + ld a, [wCurPartyMon] + push af + push hl + push de + push bc + farcall WritePartyMenuTilemap + farcall PrintPartyMenuActionText + call WaitBGMap + call SetPalettes + call DelayFrame + pop bc + pop de + pop hl + pop af + ld [wCurPartyMon], a + pop af + ld [wCurPartySpecies], a + ret + +ItemActionTextWaitButton: ; f279 (3:7279) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, wTileMapEnd - wTileMap + ld a, " " + call ByteFill + ld a, [wPartyMenuActionText] + call ItemActionText + ld a, $1 + ld [hBGMapMode], a + ld c, 50 + call DelayFrames + jp WaitPressAorB_BlinkCursor + +StatusHealer_NoEffect: ; f299 (3:7299) + call WontHaveAnyEffectMessage + jr StatusHealer_ClearPalettes + +StatusHealer_ExitMenu: ; f29e (3:729e) + xor a + ld [wItemEffectSucceeded], a +StatusHealer_ClearPalettes: ; f2a2 (3:72a2) + call ClearPalettes + ret + +IsItemUsedOnBattleMon: ; f2a6 (3:72a6) + ld a, [wBattleMode] + and a + ret z + ld a, [wCurPartyMon] + push hl + ld hl, wCurBattleMon + cp [hl] + pop hl + jr nz, .nope + scf + ret + +.nope + xor a + ret + +ReviveHalfHP: ; f2ba (3:72ba) + call LoadHPFromBuffer1 + srl d + rr e + jr ContinueRevive + +ReviveFullHP: ; f2c3 (3:72c3) + call LoadHPFromBuffer1 +ContinueRevive: ; f2c6 (3:72c6) + ld a, MON_HP + call GetPartyParamLocation + ld [hl], d + inc hl + ld [hl], e + jp LoadCurHPIntoBuffer5 + +RestoreHealth: ; f2d1 (3:72d1) + ld a, MON_HP + 1 + call GetPartyParamLocation + ld a, [hl] + add e + ld [hld], a + ld a, [hl] + adc d + ld [hl], a + jr c, .full_hp + call LoadCurHPIntoBuffer5 + ld a, MON_HP + 1 + call GetPartyParamLocation + ld d, h + ld e, l + ld a, MON_MAXHP + 1 + call GetPartyParamLocation + ld a, [de] + sub [hl] + dec de + dec hl + ld a, [de] + sbc [hl] + jr c, .finish +.full_hp + call ReviveFullHP +.finish + ret + +RemoveHP: ; f2f9 (3:72f9) + ld a, MON_HP + 1 + call GetPartyParamLocation + ld a, [hl] + sub e + ld [hld], a + ld a, [hl] + sbc d + ld [hl], a + jr nc, .okay + xor a + ld [hld], a + ld [hl], a +.okay + call LoadCurHPIntoBuffer5 + ret + +IsMonFainted: ; f30d (3:730d) + push de + call LoadMaxHPToBuffer1 + call LoadCurHPToBuffer3 + call LoadHPFromBuffer3 + ld a, d + or e + pop de + ret + +IsMonAtFullHealth: ; f31b (3:731b) + call LoadHPFromBuffer3 + ld h, d + ld l, e + call LoadHPFromBuffer1 + ld a, l + sub e + ld a, h + sbc d + ret + +LoadCurHPIntoBuffer5: ; f328 (3:7328) + ld a, MON_HP + call GetPartyParamLocation + ld a, [hli] + ld [wBuffer6], a + ld a, [hl] + ld [wBuffer5], a + ret +; f336 (3:7336) + +LoadHPIntoBuffer5: ; f336 + ld a, d + ld [wBuffer6], a + ld a, e + ld [wBuffer5], a + ret +; f33f + +LoadHPFromBuffer5: ; f33f + ld a, [wBuffer6] + ld d, a + ld a, [wBuffer5] + ld e, a + ret +; f348 + +LoadCurHPToBuffer3: ; f348 (3:7348) + ld a, MON_HP + call GetPartyParamLocation + ld a, [hli] + ld [wBuffer4], a + ld a, [hl] + ld [wBuffer3], a + ret + +LoadHPFromBuffer3: ; f356 (3:7356) + ld a, [wBuffer4] + ld d, a + ld a, [wBuffer3] + ld e, a + ret + +LoadMaxHPToBuffer1: ; f35f (3:735f) + push hl + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld [wBuffer2], a + ld a, [hl] + ld [wBuffer1], a + pop hl + ret + +LoadHPFromBuffer1: ; f36f (3:736f) + ld a, [wBuffer2] + ld d, a + ld a, [wBuffer1] + ld e, a + ret + +GetOneFifthMaxHP: ; f378 (3:7378) + push bc + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld [hDividend + 0], a + ld a, [hl] + ld [hDividend + 1], a + ld a, 5 + ld [hDivisor], a + ld b, 2 + call Divide + ld a, [hQuotient + 1] + ld d, a + ld a, [hQuotient + 2] + ld e, a + pop bc + ret + +GetHealingItemAmount: ; f395 (3:7395) + push hl + ld a, [wCurItem] + ld hl, HealingHPAmounts + ld d, a +.next + ld a, [hli] + cp -1 + jr z, .NotFound + cp d + jr z, .done + inc hl + inc hl + jr .next + +.NotFound: + scf +.done + ld e, [hl] + inc hl + ld d, [hl] + pop hl + ret +; f3af (3:73af) + +INCLUDE "data/items/heal_hp.asm" + +Softboiled_MilkDrinkFunction: ; f3df (3:73df) +; Softboiled/Milk Drink in the field + ld a, [wPartyMenuCursor] + dec a + ld b, a + call .SelectMilkDrinkRecipient ; select pokemon + jr c, .skip + ld a, b + ld [wCurPartyMon], a + call IsMonFainted + call GetOneFifthMaxHP + call RemoveHP + push bc + call HealHP_SFX_GFX + pop bc + call GetOneFifthMaxHP + ld a, c + ld [wCurPartyMon], a + call IsMonFainted + call RestoreHealth + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_HEAL_HP + call ItemActionText + call JoyWaitAorB +.skip + ld a, b + inc a + ld [wPartyMenuCursor], a + ret + +.SelectMilkDrinkRecipient: ; f419 (3:7419) +.loop + push bc + ld a, PARTYMENUACTION_HEALING_ITEM + ld [wPartyMenuActionText], a + call ChooseMonToUseItemOn + pop bc + jr c, .set_carry + ld a, [wPartyMenuCursor] + dec a + ld c, a + ld a, b + cp c + jr z, .cant_use ; chose the same mon as user + ld a, c + ld [wCurPartyMon], a + call IsMonFainted + jr z, .cant_use + call IsMonAtFullHealth + jr nc, .cant_use + xor a + ret + +.set_carry + scf + ret + +.cant_use + push bc + ld hl, .Text_CantBeUsed + call MenuTextBoxBackup + pop bc + jr .loop +; f44a (3:744a) + +.Text_CantBeUsed: ; 0xf44a + ; That can't be used on this #MON. + text_jump UnknownText_0x1c5bac + db "@" +; 0xf44f + + +EscapeRopeEffect: ; f44f + xor a + ld [wItemEffectSucceeded], a + farcall EscapeRopeFunction + + ld a, [wItemEffectSucceeded] + cp 1 + call z, UseDisposableItem + ret +; f462 + + +SuperRepelEffect: ; f462 + ld b, 200 + jr UseRepel +; f466 + +MaxRepelEffect: ; f466 + ld b, 250 + jr UseRepel +; f466 + +RepelEffect: ; f46a + ld b, 100 +; f46c + +UseRepel: ; f46c + ld a, [wRepelEffect] + and a + ld hl, TextJump_RepelUsedEarlierIsStillInEffect + jp nz, PrintText + + ld a, b + ld [wRepelEffect], a + jp UseItemText + + +TextJump_RepelUsedEarlierIsStillInEffect: ; 0xf47d + ; The REPEL used earlier is still in effect. + text_jump Text_RepelUsedEarlierIsStillInEffect + db "@" +; 0xf482 + + +XAccuracyEffect: ; f482 + ld hl, wPlayerSubStatus4 + bit SUBSTATUS_X_ACCURACY, [hl] + jp nz, WontHaveAnyEffect_NotUsedMessage + set SUBSTATUS_X_ACCURACY, [hl] + jp UseItemText +; f48f + + +PokeDollEffect: ; f48f + ld a, [wBattleMode] + dec a + jr nz, .asm_f4a6 + inc a + ld [wForcedSwitch], a + ld a, [wBattleResult] + and $c0 + or $2 + ld [wBattleResult], a + jp UseItemText + +.asm_f4a6 + xor a + ld [wItemEffectSucceeded], a + ret +; f4ab + + +GuardSpecEffect: ; f4ab + ld hl, wPlayerSubStatus4 + bit SUBSTATUS_MIST, [hl] + jp nz, WontHaveAnyEffect_NotUsedMessage + set SUBSTATUS_MIST, [hl] + jp UseItemText +; f4b8 + + +DireHitEffect: ; f4b8 + ld hl, wPlayerSubStatus4 + bit SUBSTATUS_FOCUS_ENERGY, [hl] + jp nz, WontHaveAnyEffect_NotUsedMessage + set SUBSTATUS_FOCUS_ENERGY, [hl] + jp UseItemText +; f4c5 + + +XItemEffect: ; f4c5 + call UseItemText + + ld a, [wCurItem] + ld hl, XItemStats + +.loop + cp [hl] + jr z, .got_it + inc hl + inc hl + jr .loop + +.got_it + inc hl + ld b, [hl] + xor a + ld [hBattleTurn], a + ld [wAttackMissed], a + ld [wEffectFailed], a + farcall CheckIfStatCanBeRaised + call WaitSFX + + farcall BattleCommand_StatUpMessage + farcall BattleCommand_StatUpFailText + + ld a, [wCurBattleMon] + ld [wCurPartyMon], a + ld c, HAPPINESS_USEDXITEM + farcall ChangeHappiness + ret +; f504 + +INCLUDE "data/items/x_stats.asm" + + +PokeFluteEffect: ; f50c + ld a, [wBattleMode] + and a + jr nz, .dummy +.dummy + + xor a + ld [wd002], a + + ld b, $ff ^ SLP + + ld hl, wPartyMon1Status + call .CureSleep + + ld a, [wBattleMode] + cp WILD_BATTLE + jr z, .skip_otrainer + ld hl, wOTPartyMon1Status + call .CureSleep +.skip_otrainer + + ld hl, wBattleMonStatus + ld a, [hl] + and b + ld [hl], a + ld hl, wEnemyMonStatus + ld a, [hl] + and b + ld [hl], a + + ld a, [wd002] + and a + ld hl, .CatchyTune + jp z, PrintText + ld hl, .PlayedTheFlute + call PrintText + + ld a, [wLowHealthAlarm] + and 1 << DANGER_ON_F + jr nz, .dummy2 +.dummy2 + ld hl, .AllSleepingMonWokeUp + jp PrintText + + +.CureSleep: + ld de, PARTYMON_STRUCT_LENGTH + ld c, PARTY_LENGTH + +.loop + ld a, [hl] + push af + and SLP + jr z, .not_asleep + ld a, 1 + ld [wd002], a +.not_asleep + pop af + and b + ld [hl], a + add hl, de + dec c + jr nz, .loop + ret +; f56c + + +.CatchyTune: ; 0xf56c + ; Played the # FLUTE. Now, that's a catchy tune! + text_jump UnknownText_0x1c5bf9 + db "@" +; 0xf571 + +.AllSleepingMonWokeUp: ; 0xf571 + ; All sleeping #MON woke up. + text_jump UnknownText_0x1c5c28 + db "@" +; 0xf576 + +.PlayedTheFlute: ; 0xf576 + ; played the # FLUTE.@ @ + text_jump UnknownText_0x1c5c44 + start_asm + ld a, [wBattleMode] + and a + jr nz, .battle + + push de + ld de, SFX_POKEFLUTE + call WaitPlaySFX + call WaitSFX + pop de + +.battle + jp PokeFluteTerminatorCharacter +; f58f + + +BlueCardEffect: ; f58f + ld hl, .bluecardtext + jp MenuTextBoxWaitButton + +.bluecardtext + text_jump UnknownText_0x1c5c5e + db "@" +; f59a + + +CoinCaseEffect: ; f59a + ld hl, .coincasetext + jp MenuTextBoxWaitButton + +.coincasetext + text_jump UnknownText_0x1c5c7b + db "@" +; f5a5 + + +OldRodEffect: ; f5a5 + ld e, $0 + jr UseRod +; f5a9 + +GoodRodEffect: ; f5a9 + ld e, $1 + jr UseRod +; f5ad + +SuperRodEffect: ; f5ad + ld e, $2 + jr UseRod +; f5b1 + +UseRod: ; f5b1 + farcall FishFunction + ret +; f5b8 + + +ItemfinderEffect: ; f5b8 + farcall ItemFinder + ret +; f5bf + + +RestorePPEffect: ; f5bf + ld a, [wCurItem] + ld [wd002], a + +.loop + ; Party Screen opens to choose on which mon to use the Item + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, PPRestoreItem_Cancel + +.loop2 + ld a, [wd002] + cp MAX_ELIXER + jp z, Elixer_RestorePPofAllMoves + cp ELIXER + jp z, Elixer_RestorePPofAllMoves + + ld hl, TextJump_RaiseThePPOfWhichMove + ld a, [wd002] + cp PP_UP + jr z, .ppup + ld hl, TextJump_RestoreThePPOfWhichMove + +.ppup + call PrintText + + ld a, [wCurMoveNum] + push af + xor a + ld [wCurMoveNum], a + ld a, $2 + ld [wMoveSelectionMenuType], a + farcall MoveSelectionScreen + pop bc + + ld a, b + ld [wCurMoveNum], a + jr nz, .loop + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon + + push hl + ld a, [hl] + ld [wd265], a + call GetMoveName + call CopyName1 + pop hl + + ld a, [wd002] + cp PP_UP + jp nz, Not_PP_Up + + ld a, [hl] + cp SKETCH + jr z, .CantUsePPUpOnSketch + + ld bc, MON_PP - MON_MOVES + add hl, bc + ld a, [hl] + cp PP_UP_MASK + jr c, .do_ppup + +.CantUsePPUpOnSketch: +.pp_is_maxed_out + ld hl, TextJump_PPIsMaxedOut + call PrintText + jr .loop2 + +.do_ppup + ld a, [hl] + add PP_UP_ONE + ld [hl], a + ld a, $1 + ld [wd265], a + call ApplyPPUp + call Play_SFX_FULL_HEAL + + ld hl, TextJump_PPsIncreased + call PrintText + +FinishPPRestore: ; f64c + call ClearPalettes + jp UseDisposableItem +; f652 + +BattleRestorePP: ; f652 + ld a, [wBattleMode] + and a + jr z, .not_in_battle + ld a, [wCurPartyMon] + ld b, a + ld a, [wCurBattleMon] + cp b + jr nz, .not_in_battle + ld a, [wPlayerSubStatus5] + bit SUBSTATUS_TRANSFORMED, a + jr nz, .not_in_battle + call .UpdateBattleMonPP + +.not_in_battle + call Play_SFX_FULL_HEAL + ld hl, UnknownText_0xf739 + call PrintText + jr FinishPPRestore + +.UpdateBattleMonPP: + ld a, [wCurPartyMon] + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld de, wBattleMonMoves + ld b, NUM_MOVES +.loop + ld a, [de] + and a + jr z, .done + cp [hl] + jr nz, .next + push hl + push de + push bc + rept NUM_MOVES + 2 ; wBattleMonPP - wBattleMonMoves + inc de + endr + ld bc, MON_PP - MON_MOVES + add hl, bc + ld a, [hl] + ld [de], a + pop bc + pop de + pop hl + +.next + inc hl + inc de + dec b + jr nz, .loop + +.done + ret +; f6a7 + +Not_PP_Up: ; f6a7 + call RestorePP + jr nz, BattleRestorePP + jp PPRestoreItem_NoEffect +; f6af + +Elixer_RestorePPofAllMoves: ; f6af + xor a + ld hl, wMenuCursorY + ld [hli], a + ld [hl], a + ld b, NUM_MOVES +.moveLoop + push bc + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon + ld a, [hl] + and a + jr z, .next + + call RestorePP + jr z, .next + ld hl, wMenuCursorX + inc [hl] + +.next + ld hl, wMenuCursorY + inc [hl] + pop bc + dec b + jr nz, .moveLoop + ld a, [wMenuCursorX] + and a + jp nz, BattleRestorePP + +PPRestoreItem_NoEffect: ; f6dd + call WontHaveAnyEffectMessage + +PPRestoreItem_Cancel: ; f6e0 + call ClearPalettes + xor a + ld [wItemEffectSucceeded], a + ret +; f6e8 + +RestorePP: ; f6e8 + xor a ; PARTYMON + ld [wMonType], a + call GetMaxPPOfMove + ld hl, wPartyMon1PP + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon + ld a, [wd265] + ld b, a + ld a, [hl] + and PP_MASK + cp b + jr nc, .dont_restore + + ld a, [wd002] + cp MAX_ELIXER + jr z, .restore_all + cp MAX_ETHER + jr z, .restore_all + + ld c, 5 + cp MYSTERYBERRY + jr z, .restore_some + + ld c, 10 + +.restore_some + ld a, [hl] + and PP_MASK + add c + cp b + jr nc, .restore_all + ld b, a + +.restore_all + ld a, [hl] + and PP_UP_MASK + or b + ld [hl], a + ret + +.dont_restore + xor a + ret +; f725 + +TextJump_RaiseThePPOfWhichMove: ; 0xf725 + ; Raise the PP of which move? + text_jump Text_RaiseThePPOfWhichMove + db "@" +; 0xf72a + +TextJump_RestoreThePPOfWhichMove: ; 0xf72a + ; Restore the PP of which move? + text_jump Text_RestoreThePPOfWhichMove + db "@" +; 0xf72f + +TextJump_PPIsMaxedOut: ; 0xf72f + ; 's PP is maxed out. + text_jump Text_PPIsMaxedOut + db "@" +; 0xf734 + +TextJump_PPsIncreased: ; 0xf734 + ; 's PP increased. + text_jump Text_PPsIncreased + db "@" +; 0xf739 + +UnknownText_0xf739: ; 0xf739 + ; PP was restored. + text_jump UnknownText_0x1c5cf1 + db "@" +; 0xf73e + + +SquirtbottleEffect: ; f73e + farcall _Squirtbottle + ret +; f745 + + +CardKeyEffect: ; f745 + farcall _CardKey + ret +; f74c + + +BasementKeyEffect: ; f74c + farcall _BasementKey + ret +; f753 + + +SacredAshEffect: ; f753 + farcall _SacredAsh + ld a, [wItemEffectSucceeded] + cp $1 + ret nz + call UseDisposableItem + ret +; f763 + + +NormalBoxEffect: ; f763 + ld c, DECOFLAG_SILVER_TROPHY_DOLL + jr OpenBox +; f767 + +GorgeousBoxEffect: ; f767 + ld c, DECOFLAG_GOLD_TROPHY_DOLL +OpenBox: ; f769 + farcall SetSpecificDecorationFlag + + ld hl, .text + call PrintText + + jp UseDisposableItem +; f778 + +.text ; 0xf778 + ; There was a trophy inside! + text_jump UnknownText_0x1c5d03 + db "@" +; 0xf77d + +NoEffect: ; f77d + jp IsntTheTimeMessage +; f780 + + +Play_SFX_FULL_HEAL: ; f780 + push de + ld de, SFX_FULL_HEAL + call WaitPlaySFX + pop de + ret +; f789 + +UseItemText: ; f789 + ld hl, UsedItemText + call PrintText + call Play_SFX_FULL_HEAL + call WaitPressAorB_BlinkCursor +UseDisposableItem: ; f795 + ld hl, wNumItems + ld a, 1 + ld [wItemQuantityChangeBuffer], a + jp TossItem +; f7a0 + +UseBallInTrainerBattle: ; f7a0 + call ReturnToBattle_UseBall + ld de, ANIM_THROW_POKE_BALL + ld a, e + ld [wFXAnimID], a + ld a, d + ld [wFXAnimID + 1], a + xor a + ld [wBattleAnimParam], a + ld [hBattleTurn], a + ld [wNumHits], a + predef PlayBattleAnim + ld hl, BlockedTheBallText + call PrintText + ld hl, DontBeAThiefText + call PrintText + jr UseDisposableItem +; f7ca + +WontHaveAnyEffect_NotUsedMessage: ; f7ca + ld hl, WontHaveAnyEffectText + call PrintText + + ; Item wasn't used. + ld a, $2 + ld [wItemEffectSucceeded], a + ret +; f7d6 + +LooksBitterMessage: ; f7d6 + ld hl, LooksBitterText + jp PrintText +; f7dc + +Ball_BoxIsFullMessage: ; f7dc + ld hl, Ball_BoxIsFullText + call PrintText + + ; Item wasn't used. + ld a, $2 + ld [wItemEffectSucceeded], a + ret +; f7e8 + +CantUseOnEggMessage: ; f7e8 + ld hl, CantUseOnEggText + jr CantUseItemMessage + +IsntTheTimeMessage: ; f7ed + ld hl, IsntTheTimeText + jr CantUseItemMessage + +WontHaveAnyEffectMessage: ; f7f2 + ld hl, WontHaveAnyEffectText + jr CantUseItemMessage + +BelongsToSomeoneElseMessage: ; f7f7 + ld hl, BelongsToSomeoneElseText + jr CantUseItemMessage + +CyclingIsntAllowedMessage: ; f7fc + ld hl, CyclingIsntAllowedText + jr CantUseItemMessage + +CantGetOnYourBikeMessage: ; f801 + ld hl, CantGetOnYourBikeText + +CantUseItemMessage: ; f804 +; Item couldn't be used. + xor a + ld [wItemEffectSucceeded], a + jp PrintText +; f80b + +LooksBitterText: ; 0xf80b + ; It looks bitter… + text_jump UnknownText_0x1c5d3e + db "@" +; 0xf810 + +CantUseOnEggText: ; 0xf810 + ; That can't be used on an EGG. + text_jump UnknownText_0x1c5d50 + db "@" +; 0xf815 + +IsntTheTimeText: ; 0xf815 + ; OAK: ! This isn't the time to use that! + text_jump UnknownText_0x1c5d6e + db "@" +; 0xf81a + +BelongsToSomeoneElseText: ; 0xf81a + ; That belongs to someone else! + text_jump UnknownText_0x1c5d97 + db "@" +; 0xf81f + +WontHaveAnyEffectText: ; 0xf81f + ; It won't have any effect. + text_jump UnknownText_0x1c5db6 + db "@" +; 0xf824 + +BlockedTheBallText: ; 0xf824 + ; The trainer blocked the BALL! + text_jump UnknownText_0x1c5dd0 + db "@" +; 0xf829 + +DontBeAThiefText: ; 0xf829 + ; Don't be a thief! + text_jump UnknownText_0x1c5def + db "@" +; 0xf82e + +CyclingIsntAllowedText: ; 0xf82e + ; Cycling isn't allowed here. + text_jump UnknownText_0x1c5e01 + db "@" +; 0xf833 + +CantGetOnYourBikeText: ; 0xf833 + ; Can't get on your @ now. + text_jump UnknownText_0x1c5e1d + db "@" +; 0xf838 + +Ball_BoxIsFullText: ; 0xf838 + ; The #MON BOX is full. That can't be used now. + text_jump UnknownText_0x1c5e3a + db "@" +; 0xf83d + +UsedItemText: ; 0xf83d + ; used the@ . + text_jump UnknownText_0x1c5e68 + db "@" +; 0xf842 + +GotOnTheItemText: ; 0xf842 + ; got on the@ . + text_jump UnknownText_0x1c5e7b + db "@" +; 0xf847 + +GotOffTheItemText: ; 0xf847 + ; got off@ the @ . + text_jump UnknownText_0x1c5e90 + db "@" +; 0xf84c + + +ApplyPPUp: ; f84c + ld a, MON_MOVES + call GetPartyParamLocation + push hl + ld de, wBuffer1 + predef FillPP + pop hl + ld bc, MON_PP - MON_MOVES + add hl, bc + ld de, wBuffer1 + ld b, 0 +.loop + inc b + ld a, b + cp NUM_MOVES + 1 + ret z + ld a, [wd265] + dec a + jr nz, .use + ld a, [wMenuCursorY] + inc a + cp b + jr nz, .skip + +.use + ld a, [hl] + and PP_UP_MASK + ld a, [de] ; wasted cycle + call nz, ComputeMaxPP + +.skip + inc hl + inc de + jr .loop +; f881 + + + +ComputeMaxPP: ; f881 + push bc + ; Divide the base PP by 5. + ld a, [de] + ld [hDividend + 3], a + xor a + ld [hDividend], a + ld [hDividend + 1], a + ld [hDividend + 2], a + ld a, 5 + ld [hDivisor], a + ld b, 4 + call Divide + ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM. + ld a, [hl] + ld b, a + swap a + and $f + srl a + srl a + ld c, a + ; If this value is 0, we are done + and a + jr z, .NoPPUp + +.loop + ; Normally, a move with 40 PP would have 64 PP with three PP Ups. + ; Since this would overflow into bit 6, we prevent that from happening + ; by decreasing the extra amount of PP each PP Up provides, resulting + ; in a maximum of 61. + ld a, [hQuotient + 2] + cp $8 + jr c, .okay + ld a, $7 + +.okay + add b + ld b, a + ld a, [wd265] + dec a + jr z, .NoPPUp + dec c + jr nz, .loop + +.NoPPUp: + ld [hl], b + pop bc + ret +; f8b9 + +RestoreAllPP: ; f8b9 + ld a, MON_PP + call GetPartyParamLocation + push hl + ld a, MON_MOVES + call GetPartyParamLocation + pop de + xor a ; PARTYMON + ld [wMenuCursorY], a + ld [wMonType], a + ld c, NUM_MOVES +.loop + ld a, [hli] + and a + ret z + push hl + push de + push bc + call GetMaxPPOfMove + pop bc + pop de + ld a, [de] + and PP_UP_MASK + ld b, a + ld a, [wd265] + add b + ld [de], a + inc de + ld hl, wMenuCursorY + inc [hl] + pop hl + dec c + jr nz, .loop + ret +; f8ec + + +GetMaxPPOfMove: ; f8ec + ld a, [wStringBuffer1 + 0] + push af + ld a, [wStringBuffer1 + 1] + push af + + ld a, [wMonType] + and a + + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + jr z, .got_partymon ; PARTYMON + + ld hl, wOTPartyMon1Moves + dec a + jr z, .got_partymon ; OTPARTYMON + + ld hl, wTempMonMoves + dec a + jr z, .got_nonpartymon ; BOXMON + + ld hl, wTempMonMoves ; Wasted cycles + dec a + jr z, .got_nonpartymon ; TEMPMON + + ld hl, wBattleMonMoves ; WILDMON + +.got_nonpartymon ; BOXMON, TEMPMON, WILDMON + call GetMthMoveOfCurrentMon + jr .gotdatmove + +.got_partymon ; PARTYMON, OTPARTYMON + call GetMthMoveOfNthPartymon + +.gotdatmove + ld a, [hl] + dec a + + push hl + ld hl, Moves + MOVE_PP + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + ld b, a + ld de, wStringBuffer1 + ld [de], a + pop hl + + push bc + ld bc, MON_PP - MON_MOVES + ld a, [wMonType] + cp WILDMON + jr nz, .notwild + ld bc, wEnemyMonPP - wEnemyMonMoves +.notwild + add hl, bc + ld a, [hl] + and PP_UP_MASK + pop bc + + or b + ld hl, wStringBuffer1 + 1 + ld [hl], a + xor a + ld [wd265], a + ld a, b ; this gets lost anyway + call ComputeMaxPP + ld a, [hl] + and PP_MASK + ld [wd265], a + + pop af + ld [wStringBuffer1 + 1], a + pop af + ld [wStringBuffer1 + 0], a + ret +; f963 + +GetMthMoveOfNthPartymon: ; f963 + ld a, [wCurPartyMon] + call AddNTimes + +GetMthMoveOfCurrentMon: ; f969 + ld a, [wMenuCursorY] + ld c, a + ld b, 0 + add hl, bc + ret +; f971 diff --git a/engine/items/items.asm b/engine/items/items.asm new file mode 100755 index 000000000..c07042aed --- /dev/null +++ b/engine/items/items.asm @@ -0,0 +1,581 @@ +_ReceiveItem:: ; d1d5 + call DoesHLEqualNumItems + jp nz, PutItemInPocket + push hl + call CheckItemPocket + pop de + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + rst JumpTable + ret + +.Pockets: ; d1e9 +; entries correspond to item types + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Item: ; d1f1 + ld h, d + ld l, e + jp PutItemInPocket + +.KeyItem: ; d1f6 + ld h, d + ld l, e + jp ReceiveKeyItem + +.Ball: ; d1fb + ld hl, wNumBalls + jp PutItemInPocket + +.TMHM: ; d201 + ld h, d + ld l, e + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp ReceiveTMHM + +_TossItem:: ; d20d + call DoesHLEqualNumItems + jr nz, .remove + push hl + call CheckItemPocket + pop de + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + rst JumpTable + ret + +.Pockets: +; entries correspond to item types + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Ball: ; d228 + ld hl, wNumBalls + jp RemoveItemFromPocket + +.TMHM: ; d22e + ld h, d + ld l, e + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp TossTMHM + +.KeyItem: ; d23a + ld h, d + ld l, e + jp TossKeyItem + +.Item: ; d23f + ld h, d + ld l, e + +.remove + jp RemoveItemFromPocket + +_CheckItem:: ; d244 + call DoesHLEqualNumItems + jr nz, .nope + push hl + call CheckItemPocket + pop de + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + rst JumpTable + ret + +.Pockets: +; entries correspond to item types + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Ball: ; d25f + ld hl, wNumBalls + jp CheckTheItem + +.TMHM: ; d265 + ld h, d + ld l, e + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp CheckTMHM + +.KeyItem: ; d271 + ld h, d + ld l, e + jp CheckKeyItems + +.Item: ; d276 + ld h, d + ld l, e + +.nope + jp CheckTheItem + +DoesHLEqualNumItems: ; d27b + ld a, l + cp LOW(wNumItems) + ret nz + ld a, h + cp HIGH(wNumItems) + ret + +GetPocketCapacity: ; d283 + ld c, MAX_ITEMS + ld a, e + cp LOW(wNumItems) + jr nz, .not_bag + ld a, d + cp HIGH(wNumItems) + ret z + +.not_bag + ld c, MAX_PC_ITEMS + ld a, e + cp LOW(wPCItems) + jr nz, .not_pc + ld a, d + cp HIGH(wPCItems) + ret z + +.not_pc + ld c, MAX_BALLS + ret + +PutItemInPocket: ; d29c + ld d, h + ld e, l + inc hl + ld a, [wCurItem] + ld c, a + ld b, 0 +.loop + ld a, [hli] + cp -1 + jr z, .terminator + cp c + jr nz, .next + ld a, 99 + sub [hl] + add b + ld b, a + ld a, [wItemQuantityChangeBuffer] + cp b + jr z, .ok + jr c, .ok + +.next + inc hl + jr .loop + +.terminator + call GetPocketCapacity + ld a, [de] + cp c + jr c, .ok + and a + ret + +.ok + ld h, d + ld l, e + ld a, [wCurItem] + ld c, a + ld a, [wItemQuantityChangeBuffer] + ld [wItemQuantityBuffer], a +.loop2 + inc hl + ld a, [hli] + cp -1 + jr z, .terminator2 + cp c + jr nz, .loop2 + ld a, [wItemQuantityBuffer] + add [hl] + cp 100 + jr nc, .newstack + ld [hl], a + jr .done + +.newstack + ld [hl], 99 + sub 99 + ld [wItemQuantityBuffer], a + jr .loop2 + +.terminator2 + dec hl + ld a, [wCurItem] + ld [hli], a + ld a, [wItemQuantityBuffer] + ld [hli], a + ld [hl], -1 + ld h, d + ld l, e + inc [hl] + +.done + scf + ret + +RemoveItemFromPocket: ; d2ff + ld d, h + ld e, l + ld a, [hli] + ld c, a + ld a, [wCurItemQuantity] + cp c + jr nc, .ok ; memory + ld c, a + ld b, $0 + add hl, bc + add hl, bc + ld a, [wCurItem] + cp [hl] + inc hl + jr z, .skip + ld h, d + ld l, e + inc hl + +.ok + ld a, [wCurItem] + ld b, a +.loop + ld a, [hli] + cp b + jr z, .skip + cp -1 + jr z, .nope + inc hl + jr .loop + +.skip + ld a, [wItemQuantityChangeBuffer] + ld b, a + ld a, [hl] + sub b + jr c, .nope + ld [hl], a + ld [wItemQuantityBuffer], a + and a + jr nz, .yup + dec hl + ld b, h + ld c, l + inc hl + inc hl +.loop2 + ld a, [hli] + ld [bc], a + inc bc + cp -1 + jr nz, .loop2 + ld h, d + ld l, e + dec [hl] + +.yup + scf + ret + +.nope + and a + ret + +CheckTheItem: ; d349 + ld a, [wCurItem] + ld c, a +.loop + inc hl + ld a, [hli] + cp -1 + jr z, .done + cp c + jr nz, .loop + scf + ret + +.done + and a + ret + +ReceiveKeyItem: ; d35a + ld hl, wNumKeyItems + ld a, [hli] + cp MAX_KEY_ITEMS + jr nc, .nope + ld c, a + ld b, 0 + add hl, bc + ld a, [wCurItem] + ld [hli], a + ld [hl], -1 + ld hl, wNumKeyItems + inc [hl] + scf + ret + +.nope + and a + ret + +TossKeyItem: ; d374 + ld a, [wCurItemQuantity] + ld e, a + ld d, 0 + ld hl, wNumKeyItems + ld a, [hl] + cp e + jr nc, .ok + call .Toss + ret nc + jr .ok2 + +.ok + dec [hl] + inc hl + add hl, de + +.ok2 + ld d, h + ld e, l + inc hl +.loop + ld a, [hli] + ld [de], a + inc de + cp -1 + jr nz, .loop + scf + ret + +.Toss: ; d396 + ld hl, wNumKeyItems + ld a, [wCurItem] + ld c, a +.loop3 + inc hl + ld a, [hl] + cp c + jr z, .ok3 + cp -1 + jr nz, .loop3 + xor a + ret + +.ok3 + ld a, [wNumKeyItems] + dec a + ld [wNumKeyItems], a + scf + ret + +CheckKeyItems: ; d3b1 + ld a, [wCurItem] + ld c, a + ld hl, wKeyItems +.loop + ld a, [hli] + cp c + jr z, .done + cp -1 + jr nz, .loop + and a + ret + +.done + scf + ret + +ReceiveTMHM: ; d3c4 + dec c + ld b, 0 + ld hl, wTMsHMs + add hl, bc + ld a, [wItemQuantityChangeBuffer] + add [hl] + cp 100 + jr nc, .toomany + ld [hl], a + scf + ret + +.toomany + and a + ret + +TossTMHM: ; d3d8 + dec c + ld b, 0 + ld hl, wTMsHMs + add hl, bc + ld a, [wItemQuantityChangeBuffer] + ld b, a + ld a, [hl] + sub b + jr c, .nope + ld [hl], a + ld [wItemQuantityBuffer], a + jr nz, .yup + ld a, [wTMHMPocketScrollPosition] + and a + jr z, .yup + dec a + ld [wTMHMPocketScrollPosition], a + +.yup + scf + ret + +.nope + and a + ret + +CheckTMHM: ; d3fb + dec c + ld b, $0 + ld hl, wTMsHMs + add hl, bc + ld a, [hl] + and a + ret z + scf + ret + +GetTMHMNumber:: ; d407 +; Return the number of a TM/HM by item id c. + ld a, c +; Skip any dummy items. + cp ITEM_C3 ; TM04-05 + jr c, .done + cp ITEM_DC ; TM28-29 + jr c, .skip + dec a +.skip + dec a +.done + sub TM01 + inc a + ld c, a + ret + +GetNumberedTMHM: ; d417 +; Return the item id of a TM/HM by number c. + ld a, c +; Skip any gaps. + cp ITEM_C3 - (TM01 - 1) + jr c, .done + cp ITEM_DC - (TM01 - 1) - 1 + jr c, .skip_one +.skip_two + inc a +.skip_one + inc a +.done + add TM01 + dec a + ld c, a + ret + +_CheckTossableItem:: ; d427 +; Return 1 in wItemAttributeParamBuffer and carry if wCurItem can't be removed from the bag. + ld a, ITEMATTR_PERMISSIONS + call GetItemAttr + bit CANT_TOSS_F, a + jr nz, ItemAttr_ReturnCarry + and a + ret + +CheckSelectableItem: ; d432 +; Return 1 in wItemAttributeParamBuffer and carry if wCurItem can't be selected. + ld a, ITEMATTR_PERMISSIONS + call GetItemAttr + bit CANT_SELECT_F, a + jr nz, ItemAttr_ReturnCarry + and a + ret + +CheckItemPocket:: ; d43d +; Return the pocket for wCurItem in wItemAttributeParamBuffer. + ld a, ITEMATTR_POCKET + call GetItemAttr + and $f + ld [wItemAttributeParamBuffer], a + ret + +CheckItemContext: ; d448 +; Return the context for wCurItem in wItemAttributeParamBuffer. + ld a, ITEMATTR_HELP + call GetItemAttr + and $f + ld [wItemAttributeParamBuffer], a + ret + +CheckItemMenu: ; d453 +; Return the menu for wCurItem in wItemAttributeParamBuffer. + ld a, ITEMATTR_HELP + call GetItemAttr + swap a + and $f + ld [wItemAttributeParamBuffer], a + ret + +GetItemAttr: ; d460 +; Get attribute a of wCurItem. + + push hl + push bc + + ld hl, ItemAttributes + ld c, a + ld b, 0 + add hl, bc + + xor a + ld [wItemAttributeParamBuffer], a + + ld a, [wCurItem] + dec a + ld c, a + ld a, ITEMATTR_STRUCT_LENGTH + call AddNTimes + ld a, BANK(ItemAttributes) + call GetFarByte + + pop bc + pop hl + ret + +ItemAttr_ReturnCarry: ; d47f + ld a, 1 + ld [wItemAttributeParamBuffer], a + scf + ret + +GetItemPrice: ; d486 +; Return the price of wCurItem in de. + push hl + push bc + ld a, ITEMATTR_PRICE + call GetItemAttr + ld e, a + ld a, ITEMATTR_PRICE_HI + call GetItemAttr + ld d, a + pop bc + pop hl + ret diff --git a/engine/items/mart.asm b/engine/items/mart.asm new file mode 100755 index 000000000..911251f65 --- /dev/null +++ b/engine/items/mart.asm @@ -0,0 +1,970 @@ + const_def + const MARTTEXT_HOW_MANY + const MARTTEXT_COSTS_THIS_MUCH + const MARTTEXT_NOT_ENOUGH_MONEY + const MARTTEXT_BAG_FULL + const MARTTEXT_HERE_YOU_GO + const MARTTEXT_SOLD_OUT + +OpenMartDialog:: ; 15a45 + call GetMart + ld a, c + ld [wEngineBuffer1], a + call LoadMartPointer + ld a, [wEngineBuffer1] + ld hl, .dialogs + rst JumpTable + ret +; 15a57 + +.dialogs + dw MartDialog + dw HerbShop + dw BargainShop + dw Pharmacist + dw RooftopSale +; 15a61 + +MartDialog: ; 15a61 + ld a, 0 + ld [wEngineBuffer1], a + xor a + ld [wEngineBuffer5], a + call StandardMart + ret +; 15a6e + +HerbShop: ; 15a6e + call FarReadMart + call LoadStandardMenuHeader + ld hl, Text_HerbShop_Intro + call MartTextBox + call BuyMenu + ld hl, Text_HerbShop_ComeAgain + call MartTextBox + ret +; 15a84 + +BargainShop: ; 15a84 + ld b, BANK(BargainShopData) + ld de, BargainShopData + call LoadMartPointer + call ReadMart + call LoadStandardMenuHeader + ld hl, Text_BargainShop_Intro + call MartTextBox + call BuyMenu + ld hl, wBargainShopFlags + ld a, [hli] + or [hl] + jr z, .skip_set + ld hl, wDailyFlags + set DAILYFLAGS_GOLDENROD_UNDERGROUND_BARGAIN_F, [hl] + +.skip_set + ld hl, Text_BargainShop_ComeAgain + call MartTextBox + ret +; 15aae + +Pharmacist: ; 15aae + call FarReadMart + call LoadStandardMenuHeader + ld hl, Text_Pharmacist_Intro + call MartTextBox + call BuyMenu + ld hl, Text_Pharmacist_ComeAgain + call MartTextBox + ret +; 15ac4 + +RooftopSale: ; 15ac4 + ld b, BANK(RooftopSaleMart1) + ld de, RooftopSaleMart1 + ld hl, wStatusFlags + bit STATUSFLAGS_HALL_OF_FAME_F, [hl] + jr z, .ok + ld b, BANK(RooftopSaleMart2) + ld de, RooftopSaleMart2 + +.ok + call LoadMartPointer + call ReadMart + call LoadStandardMenuHeader + ld hl, Text_Mart_HowMayIHelpYou + call MartTextBox + call BuyMenu + ld hl, Text_Mart_ComeAgain + call MartTextBox + ret +; 15aee + +INCLUDE "data/items/rooftop_sale.asm" + +LoadMartPointer: ; 15b10 + ld a, b + ld [wMartPointerBank], a + ld a, e + ld [wMartPointer], a + ld a, d + ld [wMartPointer + 1], a + ld hl, wCurMart + xor a + ld bc, 16 + call ByteFill + xor a + ld [wEngineBuffer5], a + ld [wBargainShopFlags], a + ld [wFacingDirection], a + ret +; 15b31 + +GetMart: ; 15b31 + ld a, e + cp (Marts.End - Marts) / 2 + jr c, .IsAMart + ld b, BANK(DefaultMart) + ld de, DefaultMart + ret + +.IsAMart: + ld hl, Marts + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld b, BANK(Marts) + ret +; 15b47 + +StandardMart: ; 15b47 +.loop + ld a, [wEngineBuffer5] + ld hl, .MartFunctions + rst JumpTable + ld [wEngineBuffer5], a + cp $ff + jr nz, .loop + ret + +.MartFunctions: + dw .HowMayIHelpYou + dw .TopMenu + dw .Buy + dw .Sell + dw .Quit + dw .AnythingElse +; 15b62 + +.HowMayIHelpYou: ; 15b62 + call LoadStandardMenuHeader + ld hl, Text_Mart_HowMayIHelpYou + call PrintText + ld a, $1 ; top menu + ret +; 15b6e + +.TopMenu: ; 15b6e + ld hl, MenuHeader_BuySell + call CopyMenuHeader + call VerticalMenu + jr c, .quit + ld a, [wMenuCursorY] + cp $1 + jr z, .buy + cp $2 + jr z, .sell +.quit + ld a, $4 ; Come again! + ret +.buy + ld a, $2 ; buy + ret +.sell + ld a, $3 ; sell + ret +; 15b8d + +.Buy: ; 15b8d + call ExitMenu + call FarReadMart + call BuyMenu + and a + ld a, $5 ; Anything else? + ret +; 15b9a + +.Sell: ; 15b9a + call ExitMenu + call SellMenu + ld a, $5 ; Anything else? + ret +; 15ba3 + +.Quit: ; 15ba3 + call ExitMenu + ld hl, Text_Mart_ComeAgain + call MartTextBox + ld a, $ff ; exit + ret +; 15baf + +.AnythingElse: ; 15baf + call LoadStandardMenuHeader + ld hl, Text_Mart_AnythingElse + call PrintText + ld a, $1 ; top menu + ret +; 15bbb + +FarReadMart: ; 15bbb + ld hl, wMartPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wCurMart +.CopyMart: + ld a, [wMartPointerBank] + call GetFarByte + ld [de], a + inc hl + inc de + cp -1 + jr nz, .CopyMart + ld hl, wMartItem1BCD + ld de, wCurMart + 1 +.ReadMartItem: + ld a, [de] + inc de + cp -1 + jr z, .done + push de + call GetMartItemPrice + pop de + jr .ReadMartItem + +.done + ret +; 15be5 + +GetMartItemPrice: ; 15be5 +; Return the price of item a in BCD at hl and in tiles at wStringBuffer1. + push hl + ld [wCurItem], a + farcall GetItemPrice + pop hl + +GetMartPrice: ; 15bf0 +; Return price de in BCD at hl and in tiles at wStringBuffer1. + push hl + ld a, d + ld [wStringBuffer2], a + ld a, e + ld [wStringBuffer2 + 1], a + ld hl, wStringBuffer1 + ld de, wStringBuffer2 + lb bc, PRINTNUM_LEADINGZEROS | 2, 6 ; 6 digits + call PrintNum + pop hl + + ld de, wStringBuffer1 + ld c, 6 / 2 ; 6 digits +.loop + call .CharToNybble + swap a + ld b, a + call .CharToNybble + or b + ld [hli], a + dec c + jr nz, .loop + ret +; 15c1a + +.CharToNybble: ; 15c1a + ld a, [de] + inc de + cp " " + jr nz, .not_space + ld a, "0" + +.not_space + sub "0" + ret +; 15c25 + +ReadMart: ; 15c25 +; Load the mart pointer. Mart data is local (no need for bank). + ld hl, wMartPointer + ld a, [hli] + ld h, [hl] + ld l, a + push hl +; set hl to the first item + inc hl + ld bc, wMartItem1BCD + ld de, wCurMart + 1 +.loop +; copy the item to wCurMart + (ItemIndex) + ld a, [hli] + ld [de], a + inc de +; -1 is the terminator + cp -1 + jr z, .done + + push de +; copy the price to de + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a +; convert the price to 3-byte BCD at [bc] + push hl + ld h, b + ld l, c + call GetMartPrice + ld b, h + ld c, l + pop hl + + pop de + jr .loop + +.done + pop hl + ld a, [hl] + ld [wCurMart], a + ret +; 15c51 + +INCLUDE "data/items/bargain_shop.asm" + + +BuyMenu: ; 15c62 + call FadeToMenu + farcall BlankScreen + xor a + ld [wMenuScrollPositionBackup], a + ld a, 1 + ld [wMenuCursorBufferBackup], a +.loop + call BuyMenuLoop ; menu loop + jr nc, .loop + call CloseSubmenu + ret +; 15c7d + +LoadBuyMenuText: ; 15c7d +; load text from a nested table +; which table is in wEngineBuffer1 +; which entry is in register a + push af + call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers + ld a, [hli] + ld h, [hl] + ld l, a + pop af + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call PrintText + ret +; 15c91 + +MartAskPurchaseQuantity: ; 15c91 + call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers + inc hl + inc hl + ld a, [hl] + and a + jp z, StandardMartAskPurchaseQuantity + cp 1 + jp z, BargainShopAskPurchaseQuantity + jp RooftopSaleAskPurchaseQuantity +; 15ca3 + +GetMartDialogGroup: ; 15ca3 + ld a, [wEngineBuffer1] + ld e, a + ld d, 0 + ld hl, .MartTextFunctionPointers + add hl, de + add hl, de + add hl, de + ret +; 15cb0 + +.MartTextFunctionPointers: ; 15cb0 + dwb .StandardMartPointers, 0 + dwb .HerbShopPointers, 0 + dwb .BargainShopPointers, 1 + dwb .PharmacyPointers, 0 + dwb .StandardMartPointers, 2 +; 15cbf + +.StandardMartPointers: ; 15cbf + dw Text_Mart_HowMany + dw Text_Mart_CostsThisMuch + dw Text_Mart_InsufficientFunds + dw Text_Mart_BagFull + dw Text_Mart_HereYouGo + dw BuyMenuLoop + +.HerbShopPointers: ; 15ccb + dw Text_HerbShop_HowMany + dw Text_HerbShop_CostsThisMuch + dw Text_HerbShop_InsufficientFunds + dw Text_HerbShop_BagFull + dw Text_HerbShop_HereYouGo + dw BuyMenuLoop + +.BargainShopPointers: ; 15cd7 + dw BuyMenuLoop + dw Text_BargainShop_CostsThisMuch + dw Text_BargainShop_InsufficientFunds + dw Text_BargainShop_BagFull + dw Text_BargainShop_HereYouGo + dw Text_BargainShop_SoldOut + +.PharmacyPointers: ; 15ce3 + dw Text_Pharmacy_HowMany + dw Text_Pharmacy_CostsThisMuch + dw Text_Pharmacy_InsufficientFunds + dw Text_Pharmacy_BagFull + dw Text_Pharmacy_HereYouGo + dw BuyMenuLoop +; 15cef + + +BuyMenuLoop: ; 15cef + farcall PlaceMoneyTopRight + call UpdateSprites + ld hl, MenuHeader_Buy + call CopyMenuHeader + ld a, [wMenuCursorBufferBackup] + ld [wMenuCursorBuffer], a + ld a, [wMenuScrollPositionBackup] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wMenuScrollPositionBackup], a + ld a, [wMenuCursorY] + ld [wMenuCursorBufferBackup], a + call SpeechTextBox + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .set_carry + cp A_BUTTON + jr z, .useless_pointer + +.useless_pointer + call MartAskPurchaseQuantity + jr c, .cancel + call MartConfirmPurchase + jr c, .cancel + ld de, wMoney + ld bc, hMoneyTemp + ld a, $3 ; useless load + call CompareMoney + jr c, .insufficient_funds + ld hl, wNumItems + call ReceiveItem + jr nc, .insufficient_bag_space + ld a, [wMartItemID] + ld e, a + ld d, $0 + ld b, SET_FLAG + ld hl, wBargainShopFlags + call FlagAction + call PlayTransactionSound + ld de, wMoney + ld bc, hMoneyTemp + call TakeMoney + ld a, MARTTEXT_HERE_YOU_GO + call LoadBuyMenuText + call JoyWaitAorB + +.cancel + call SpeechTextBox + and a + ret + +.set_carry + scf + ret + +.insufficient_bag_space + ld a, MARTTEXT_BAG_FULL + call LoadBuyMenuText + call JoyWaitAorB + and a + ret + +.insufficient_funds + ld a, MARTTEXT_NOT_ENOUGH_MONEY + call LoadBuyMenuText + call JoyWaitAorB + and a + ret +; 15d83 + +StandardMartAskPurchaseQuantity: + ld a, 99 + ld [wItemQuantityBuffer], a + ld a, MARTTEXT_HOW_MANY + call LoadBuyMenuText + farcall SelectQuantityToBuy + call ExitMenu + ret +; 15d97 + +MartConfirmPurchase: ; 15d97 + predef PartyMonItemName + ld a, MARTTEXT_COSTS_THIS_MUCH + call LoadBuyMenuText + call YesNoBox + ret +; 15da5 + +BargainShopAskPurchaseQuantity: + ld a, 1 + ld [wItemQuantityChangeBuffer], a + ld a, [wMartItemID] + ld e, a + ld d, $0 + ld b, CHECK_FLAG + ld hl, wBargainShopFlags + call FlagAction + ld a, c + and a + jr nz, .SoldOut + ld a, [wMartItemID] + ld e, a + ld d, $0 + ld hl, wMartPointer + ld a, [hli] + ld h, [hl] + ld l, a + inc hl + add hl, de + add hl, de + add hl, de + inc hl + ld a, [hli] + ld [hMoneyTemp + 2], a + ld a, [hl] + ld [hMoneyTemp + 1], a + xor a + ld [hMoneyTemp], a + and a + ret + +.SoldOut: + ld a, MARTTEXT_SOLD_OUT + call LoadBuyMenuText + call JoyWaitAorB + scf + ret +; 15de2 + +RooftopSaleAskPurchaseQuantity: + ld a, MARTTEXT_HOW_MANY + call LoadBuyMenuText + call .GetSalePrice + ld a, 99 + ld [wItemQuantityBuffer], a + farcall RooftopSale_SelectQuantityToBuy + call ExitMenu + ret +; 15df9 + +.GetSalePrice: ; 15df9 + ld a, [wMartItemID] + ld e, a + ld d, 0 + ld hl, wMartPointer + ld a, [hli] + ld h, [hl] + ld l, a + inc hl + add hl, de + add hl, de + add hl, de + inc hl + ld e, [hl] + inc hl + ld d, [hl] + ret +; 15e0e + + +Text_Mart_HowMany: ; 0x15e0e + ; How many? + text_jump UnknownText_0x1c4bfd + db "@" +; 0x15e13 + +Text_Mart_CostsThisMuch: ; 0x15e13 + ; @ (S) will be ¥@ . + text_jump UnknownText_0x1c4c08 + db "@" +; 0x15e18 + +MenuHeader_Buy: ; 0x15e18 + db MENU_BACKUP_TILES ; flags + menu_coords 1, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x15e20 + +.MenuData ; 0x15e20 + db SCROLLINGMENU_DISPLAY_ARROWS | SCROLLINGMENU_ENABLE_FUNCTION3 ; flags + db 4, 8 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wCurMart + dba PlaceMenuItemName + dba .PrintBCDPrices + dba UpdateItemDescription +; 15e30 + +.PrintBCDPrices: ; 15e30 + ld a, [wScrollingMenuCursorPosition] + ld c, a + ld b, 0 + ld hl, wMartItem1BCD + add hl, bc + add hl, bc + add hl, bc + push de + ld d, h + ld e, l + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + ld c, PRINTNUM_LEADINGZEROS | PRINTNUM_MONEY | 3 + call PrintBCDNumber + ret +; 15e4a (5:5e4a) + +Text_HerbShop_Intro: ; 0x15e4a + ; Hello, dear. I sell inexpensive herbal medicine. They're good, but a trifle bitter. Your #MON may not like them. Hehehehe… + text_jump UnknownText_0x1c4c28 + db "@" +; 0x15e4f + +Text_HerbShop_HowMany: ; 0x15e4f + ; How many? + text_jump UnknownText_0x1c4ca3 + db "@" +; 0x15e54 + +Text_HerbShop_CostsThisMuch: ; 0x15e54 + ; @ (S) will be ¥@ . + text_jump UnknownText_0x1c4cae + db "@" +; 0x15e59 + +Text_HerbShop_HereYouGo: ; 0x15e59 + ; Thank you, dear. Hehehehe… + text_jump UnknownText_0x1c4cce + db "@" +; 0x15e5e + +Text_HerbShop_BagFull: ; 0x15e5e + ; Oh? Your PACK is full, dear. + text_jump UnknownText_0x1c4cea + db "@" +; 0x15e63 + +Text_HerbShop_InsufficientFunds: ; 0x15e63 + ; Hehehe… You don't have the money. + text_jump UnknownText_0x1c4d08 + db "@" +; 0x15e68 + +Text_HerbShop_ComeAgain: ; 0x15e68 + ; Come again, dear. Hehehehe… + text_jump UnknownText_0x1c4d2a + db "@" +; 0x15e6d + +Text_BargainShop_Intro: ; 0x15e6d + ; Hiya! Care to see some bargains? I sell rare items that nobody else carries--but only one of each item. + text_jump UnknownText_0x1c4d47 + db "@" +; 0x15e72 + +Text_BargainShop_CostsThisMuch: ; 0x15e72 + ; costs ¥@ . Want it? + text_jump UnknownText_0x1c4db0 + db "@" +; 0x15e77 + +Text_BargainShop_HereYouGo: ; 0x15e77 + ; Thanks. + text_jump UnknownText_0x1c4dcd + db "@" +; 0x15e7c + +Text_BargainShop_BagFull: ; 0x15e7c + ; Uh-oh, your PACK is chock-full. + text_jump UnknownText_0x1c4dd6 + db "@" +; 0x15e81 + +Text_BargainShop_SoldOut: ; 0x15e81 + ; You bought that already. I'm all sold out of it. + text_jump UnknownText_0x1c4df7 + db "@" +; 0x15e86 + +Text_BargainShop_InsufficientFunds: ; 0x15e86 + ; Uh-oh, you're short on funds. + text_jump UnknownText_0x1c4e28 + db "@" +; 0x15e8b + +Text_BargainShop_ComeAgain: ; 0x15e8b + ; Come by again sometime. + text_jump UnknownText_0x1c4e46 + db "@" +; 0x15e90 + +Text_Pharmacist_Intro: ; 0x15e90 + ; What's up? Need some medicine? + text_jump UnknownText_0x1c4e5f + db "@" +; 0x15e95 + +Text_Pharmacy_HowMany: ; 0x15e95 + ; How many? + text_jump UnknownText_0x1c4e7e + db "@" +; 0x15e9a + +Text_Pharmacy_CostsThisMuch: ; 0x15e9a + ; @ (S) will cost ¥@ . + text_jump UnknownText_0x1c4e89 + db "@" +; 0x15e9f + +Text_Pharmacy_HereYouGo: ; 0x15e9f + ; Thanks much! + text_jump UnknownText_0x1c4eab + db "@" +; 0x15ea4 + +Text_Pharmacy_BagFull: ; 0x15ea4 + ; You don't have any more space. + text_jump UnknownText_0x1c4eb9 + db "@" +; 0x15ea9 + +Text_Pharmacy_InsufficientFunds: ; 0x15ea9 + ; Huh? That's not enough money. + text_jump UnknownText_0x1c4ed8 + db "@" +; 0x15eae + +Text_Pharmacist_ComeAgain: ; 0x15eae + ; All right. See you around. + text_jump UnknownText_0x1c4ef6 + db "@" +; 0x15eb3 + + +SellMenu: ; 15eb3 + call DisableSpriteUpdates + farcall DepositSellInitPackBuffers +.loop + farcall DepositSellPack + ld a, [wPackUsedItem] + and a + jp z, .quit + call .TryToSellItem + jr .loop + +.quit + call ReturnToMapWithSpeechTextbox + and a + ret +; 15ed3 + +.Unreferenced_NothingToSell: + ld hl, .NothingToSellText + call MenuTextBoxBackup + and a + ret +; 15edb + +.NothingToSellText: ; 0x15edb + ; You don't have anything to sell. + text_jump UnknownText_0x1c4f12 + db "@" +; 0x15ee0 + + +.TryToSellItem: ; 15ee0 + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + ld hl, .dw + rst JumpTable + ret +; 15eee + +.dw ; 15eee + dw .try_sell + dw .cant_buy + dw .cant_buy + dw .cant_buy + dw .try_sell + dw .try_sell + dw .try_sell +; 15efc + +.cant_buy ; 15efc + ret +; 15efd + + +.try_sell ; 15efd + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr z, .okay_to_sell + ld hl, TextMart_CantBuyFromYou + call PrintText + and a + ret + +.okay_to_sell + ld hl, Text_Mart_SellHowMany + call PrintText + farcall PlaceMoneyAtTopLeftOfTextbox + farcall SelectQuantityToSell + call ExitMenu + jr c, .declined + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ld hl, Text_Mart_ICanPayThisMuch + call PrintTextBoxText + call YesNoBox + jr c, .declined + ld de, wMoney + ld bc, hMoneyTemp + call GiveMoney + ld a, [wMartItemID] + ld hl, wNumItems + call TossItem + predef PartyMonItemName + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ld hl, Text_Mart_SoldForAmount + call PrintTextBoxText + call PlayTransactionSound + farcall PlaceMoneyBottomLeft + call JoyWaitAorB + +.declined + call ExitMenu + and a + ret +; 15f73 + +Text_Mart_SellHowMany: ; 0x15f73 + ; How many? + text_jump UnknownText_0x1c4f33 + db "@" +; 0x15f78 + +Text_Mart_ICanPayThisMuch: ; 0x15f78 + ; I can pay you ¥@ . Is that OK? + text_jump UnknownText_0x1c4f3e + db "@" +; 0x15f7d + +.UnusedString15f7d: ; 15f7d + db "!ダミー!@" + +Text_Mart_HowMayIHelpYou: ; 0x15f83 + ; Welcome! How may I help you? + text_jump UnknownText_0x1c4f62 + db "@" +; 0x15f88 + +MenuHeader_BuySell: ; 0x15f88 + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 7, 8 + dw .MenuData + db 1 ; default option +; 0x15f90 + +.MenuData ; 0x15f90 + db STATICMENU_CURSOR ; strings + db 3 ; items + db "BUY@" + db "SELL@" + db "QUIT@" +; 0x15f96 + +Text_Mart_HereYouGo: ; 0x15fa0 + ; Here you are. Thank you! + text_jump UnknownText_0x1c4f80 + db "@" +; 0x15fa5 + +Text_Mart_InsufficientFunds: ; 0x15fa5 + ; You don't have enough money. + text_jump UnknownText_0x1c4f9a + db "@" +; 0x15faa + +Text_Mart_BagFull: ; 0x15faa + ; You can't carry any more items. + text_jump UnknownText_0x1c4fb7 + db "@" +; 0x15faf + +TextMart_CantBuyFromYou: ; 0x15faf + ; Sorry, I can't buy that from you. + text_jump UnknownText_0x1c4fd7 + db "@" +; 0x15fb4 + +Text_Mart_ComeAgain: ; 0x15fb4 + ; Please come again! + text_jump UnknownText_0x1c4ff9 + db "@" +; 0x15fb9 + +Text_Mart_AnythingElse: ; 0x15fb9 + text_jump UnknownText_0x1c500d + db "@" +; 0x15fbe + +Text_Mart_SoldForAmount: ; 0x15fbe + text_jump UnknownText_0x1c502e + db "@" +; 0x15fc3 + +PlayTransactionSound: ; 15fc3 + call WaitSFX + ld de, SFX_TRANSACTION + call PlaySFX + ret +; 15fcd + +MartTextBox: ; 15fcd + call MenuTextBox + call JoyWaitAorB + call ExitMenu + ret +; 15fd7 diff --git a/engine/items/pack.asm b/engine/items/pack.asm new file mode 100644 index 000000000..ea3a051ac --- /dev/null +++ b/engine/items/pack.asm @@ -0,0 +1,1711 @@ +; Pack.Jumptable and BattlePack.Jumptable indexes + const_def + const PACKSTATE_INITGFX ; 0 + const PACKSTATE_INITITEMSPOCKET ; 1 + const PACKSTATE_ITEMSPOCKETMENU ; 2 + const PACKSTATE_INITBALLSPOCKET ; 3 + const PACKSTATE_BALLSPOCKETMENU ; 4 + const PACKSTATE_INITKEYITEMSPOCKET ; 5 + const PACKSTATE_KEYITEMSPOCKETMENU ; 6 + const PACKSTATE_INITTMHMPOCKET ; 7 + const PACKSTATE_TMHMPOCKETMENU ; 8 + const PACKSTATE_QUITNOSCRIPT ; 9 + const PACKSTATE_QUITRUNSCRIPT ; 10 + +Pack: ; 10000 + ld hl, wOptions + set NO_TEXT_SCROLL, [hl] + call InitPackBuffers +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call .RunJumptable + call DelayFrame + jr .loop + +.done + ld a, [wCurrPocket] + ld [wLastPocket], a + ld hl, wOptions + res NO_TEXT_SCROLL, [hl] + ret +; 10026 + +.RunJumptable: ; 10026 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call Pack_GetJumptablePointer + jp hl + +; 10030 + +.Jumptable: ; 10030 (4:4030) +; entries correspond to PACKSTATE_* constants + dw .InitGFX ; 0 + dw .InitItemsPocket ; 1 + dw .ItemsPocketMenu ; 2 + dw .InitBallsPocket ; 3 + dw .BallsPocketMenu ; 4 + dw .InitKeyItemsPocket ; 5 + dw .KeyItemsPocketMenu ; 6 + dw .InitTMHMPocket ; 7 + dw .TMHMPocketMenu ; 8 + dw Pack_QuitNoScript ; 9 + dw Pack_QuitRunScript ; 10 + +.InitGFX: ; 10046 (4:4046) + xor a + ld [hBGMapMode], a + call Pack_InitGFX + ld a, [wPackJumptableIndex] + ld [wJumptableIndex], a + call Pack_InitColors + ret + +.InitItemsPocket: ; 10056 (4:4056) + xor a ; ITEM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.ItemsPocketMenu: ; 10067 (4:4067) + ld hl, ItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wItemsPocketCursor], a + ld b, PACKSTATE_INITTMHMPOCKET ; left + ld c, PACKSTATE_INITBALLSPOCKET ; right + call Pack_InterpretJoypad + ret c + call .ItemBallsKey_LoadSubmenu + ret + +.InitKeyItemsPocket: ; 10094 (4:4094) + ld a, KEY_ITEM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.KeyItemsPocketMenu: ; 100a6 (4:40a6) + ld hl, KeyItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wKeyItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wKeyItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wKeyItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wKeyItemsPocketCursor], a + ld b, PACKSTATE_INITBALLSPOCKET ; left + ld c, PACKSTATE_INITTMHMPOCKET ; right + call Pack_InterpretJoypad + ret c + call .ItemBallsKey_LoadSubmenu + ret + +.InitTMHMPocket: ; 100d3 (4:40d3) + ld a, TM_HM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + xor a + ld [hBGMapMode], a + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.TMHMPocketMenu: ; 100e8 (4:40e8) + farcall TMHMPocket + ld b, PACKSTATE_INITKEYITEMSPOCKET ; left + ld c, PACKSTATE_INITITEMSPOCKET ; right + call Pack_InterpretJoypad + ret c + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .use_quit + ld hl, .MenuHeader2 + ld de, .Jumptable2 + jr .load_jump + +.use_quit + ld hl, .MenuHeader1 + ld de, .Jumptable1 +.load_jump + push de + call LoadMenuHeader + call VerticalMenu + call ExitMenu + pop hl + ret c + ld a, [wMenuCursorY] + dec a + call Pack_GetJumptablePointer + jp hl + +; 10124 (4:4124) +.MenuHeader1: ; 0x10124 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData_1 + db 1 ; default option +; 0x1012c + +.MenuData_1: ; 0x1012c + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "USE@" + db "QUIT@" +; 0x10137 + +.Jumptable1: ; 10137 + dw .UseItem + dw QuitItemSubmenu + +; 1013b + +.MenuHeader2: ; 0x1013b + db MENU_BACKUP_TILES ; flags + menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData_2 + db 1 ; default option +; 0x10143 + +.MenuData_2: ; 0x10143 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 3 ; items + db "USE@" + db "GIVE@" + db "QUIT@" +; 0x10153 + +.Jumptable2: ; 10153 + dw .UseItem + dw GiveItem + dw QuitItemSubmenu +; 10159 + +.UseItem: ; 10159 + farcall AskTeachTMHM + ret c + farcall ChooseMonToLearnTMHM + jr c, .declined + ld hl, wOptions + ld a, [hl] + push af + res NO_TEXT_SCROLL, [hl] + farcall TeachTMHM + pop af + ld [wOptions], a +.declined + xor a + ld [hBGMapMode], a + call Pack_InitGFX + call WaitBGMap_DrawPackGFX + call Pack_InitColors + ret + +.InitBallsPocket: ; 10186 (4:4186) + ld a, BALL_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.BallsPocketMenu: ; 10198 (4:4198) + ld hl, BallsPocketMenuHeader + call CopyMenuHeader + ld a, [wBallsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wBallsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wBallsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wBallsPocketCursor], a + ld b, PACKSTATE_INITITEMSPOCKET ; left + ld c, PACKSTATE_INITKEYITEMSPOCKET ; right + call Pack_InterpretJoypad + ret c + call .ItemBallsKey_LoadSubmenu + ret + +.ItemBallsKey_LoadSubmenu: ; 101c5 (4:41c5) + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .tossable + farcall CheckSelectableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .selectable + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .usable + jr .unusable + +.selectable + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .selectable_usable + jr .selectable_unusable + +.tossable + farcall CheckSelectableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .tossable_selectable + jr .tossable_unselectable + +.usable + ld hl, MenuHeader_UsableKeyItem + ld de, Jumptable_UseGiveTossRegisterQuit + jr .build_menu + +.selectable_usable + ld hl, MenuHeader_UsableItem + ld de, Jumptable_UseGiveTossQuit + jr .build_menu + +.tossable_selectable + ld hl, MenuHeader_UnusableItem + ld de, Jumptable_UseQuit + jr .build_menu + +.tossable_unselectable + ld hl, MenuHeader_UnusableKeyItem + ld de, Jumptable_UseRegisterQuit + jr .build_menu + +.unusable + ld hl, MenuHeader_HoldableKeyItem + ld de, Jumptable_GiveTossRegisterQuit + jr .build_menu + +.selectable_unusable + ld hl, MenuHeader_HoldableItem + ld de, Jumptable_GiveTossQuit +.build_menu + push de + call LoadMenuHeader + call VerticalMenu + call ExitMenu + pop hl + ret c + ld a, [wMenuCursorY] + dec a + call Pack_GetJumptablePointer + jp hl + +; 10249 (4:4249) +MenuHeader_UsableKeyItem: ; 0x10249 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10251 + +.MenuData: ; 0x10251 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 5 ; items + db "USE@" + db "GIVE@" + db "TOSS@" + db "SEL@" + db "QUIT@" +; 0x1026a + +Jumptable_UseGiveTossRegisterQuit: ; 1026a + dw UseItem + dw GiveItem + dw TossMenu + dw RegisterItem + dw QuitItemSubmenu +; 10274 + +MenuHeader_UsableItem: ; 0x10274 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x1027c + +.MenuData: ; 0x1027c + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 4 ; items + db "USE@" + db "GIVE@" + db "TOSS@" + db "QUIT@" +; 0x10291 + +Jumptable_UseGiveTossQuit: ; 10291 + dw UseItem + dw GiveItem + dw TossMenu + dw QuitItemSubmenu +; 10299 + +MenuHeader_UnusableItem: ; 0x10299 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x102a1 + +.MenuData: ; 0x102a1 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "USE@" + db "QUIT@" +; 0x102ac + +Jumptable_UseQuit: ; 102ac + dw UseItem + dw QuitItemSubmenu +; 102b0 + +MenuHeader_UnusableKeyItem: ; 0x102b0 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x102b8 + +.MenuData: ; 0x102b8 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 3 ; items + db "USE@" + db "SEL@" + db "QUIT@" +; 0x102c7 + +Jumptable_UseRegisterQuit: ; 102c7 + dw UseItem + dw RegisterItem + dw QuitItemSubmenu +; 102cd + +MenuHeader_HoldableKeyItem: ; 0x102cd + db MENU_BACKUP_TILES ; flags + menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x102d5 + +.MenuData: ; 0x102d5 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 4 ; items + db "GIVE@" + db "TOSS@" + db "SEL@" + db "QUIT@" +; 0x102ea + +Jumptable_GiveTossRegisterQuit: ; 102ea + dw GiveItem + dw TossMenu + dw RegisterItem + dw QuitItemSubmenu +; 102f2 + +MenuHeader_HoldableItem: ; 0x102f2 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x102fa + +.MenuData: ; 0x102fa + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 3 ; items + db "GIVE@" + db "TOSS@" + db "QUIT@" +; 0x1030b + +Jumptable_GiveTossQuit: ; 1030b + dw GiveItem + dw TossMenu + dw QuitItemSubmenu + +; 10311 + +UseItem: ; 10311 + farcall CheckItemMenu + ld a, [wItemAttributeParamBuffer] + ld hl, .dw + rst JumpTable + ret +; 1031f + +.dw ; 1031f (4:431f) +; entries correspond to ITEMMENU_* constants + dw .Oak ; ITEMMENU_NOUSE + dw .Oak + dw .Oak + dw .Oak + dw .Current ; ITEMMENU_CURRENT + dw .Party ; ITEMMENU_PARTY + dw .Field ; ITEMMENU_CLOSE +; 1035c + +.Oak: ; 1032d (4:432d) + ld hl, Text_ThisIsntTheTime + call Pack_PrintTextNoScroll + ret + +.Current: ; 10334 (4:4334) + call DoItemEffect + ret + +.Party: ; 10338 (4:4338) + ld a, [wPartyCount] + and a + jr z, .NoPokemon + call DoItemEffect + xor a + ld [hBGMapMode], a + call Pack_InitGFX + call WaitBGMap_DrawPackGFX + call Pack_InitColors + ret + +.NoPokemon: + ld hl, TextJump_YouDontHaveAMon + call Pack_PrintTextNoScroll + ret + +.Field: ; 10355 (4:4355) + call DoItemEffect + ld a, [wItemEffectSucceeded] + and a + jr z, .Oak + ld a, PACKSTATE_QUITRUNSCRIPT + ld [wJumptableIndex], a + ret +; 10364 (4:4364) + +TossMenu: ; 10364 + ld hl, Text_ThrowAwayHowMany + call Pack_PrintTextNoScroll + farcall SelectQuantityToToss + push af + call ExitMenu + pop af + jr c, .finish + call Pack_GetItemName + ld hl, Text_ConfirmThrowAway + call MenuTextBox + call YesNoBox + push af + call ExitMenu + pop af + jr c, .finish + ld hl, wNumItems + ld a, [wCurItemQuantity] + call TossItem + call Pack_GetItemName + ld hl, Text_ThrewAway + call Pack_PrintTextNoScroll +.finish + ret +; 1039d + +Unreferenced_ResetPocketCursorPositions: ; 1039d + ld a, [wCurrPocket] + and a ; ITEM_POCKET + jr z, .items + dec a ; BALL_POCKET + jr z, .balls + dec a ; KEY_ITEM_POCKET + jr z, .key + ret + +.balls + xor a + ld [wBallsPocketCursor], a + ld [wBallsPocketScrollPosition], a + ret + +.items + xor a + ld [wItemsPocketCursor], a + ld [wItemsPocketScrollPosition], a + ret + +.key + xor a + ld [wKeyItemsPocketCursor], a + ld [wKeyItemsPocketScrollPosition], a + ret +; 103c2 + +RegisterItem: ; 103c2 + farcall CheckSelectableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .cant_register + ld a, [wCurrPocket] + rrca + rrca + and $c0 + ld b, a + ld a, [wCurItemQuantity] + inc a + and $3f + or b + ld [wWhichRegisteredItem], a + ld a, [wCurItem] + ld [wRegisteredItem], a + call Pack_GetItemName + ld de, SFX_FULL_HEAL + call WaitPlaySFX + ld hl, Text_RegisteredItem + call Pack_PrintTextNoScroll + ret + +.cant_register + ld hl, Text_CantRegister + call Pack_PrintTextNoScroll + ret +; 103fd + +GiveItem: ; 103fd + ld a, [wPartyCount] + and a + jp z, .NoPokemon + ld a, [wOptions] + push af + res NO_TEXT_SCROLL, a + ld [wOptions], a + ld a, PARTYMENUACTION_GIVE_ITEM + ld [wPartyMenuActionText], a + call ClearBGPalettes + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX +.loop + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + jr c, .finish + ld a, [wCurPartySpecies] + cp EGG + jr nz, .give + ld hl, .Egg + call PrintText + jr .loop + +.give + ld a, [wJumptableIndex] + push af + ld a, [wPackJumptableIndex] + push af + call GetCurNick + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + call TryGiveItemToPartymon + pop af + ld [wPackJumptableIndex], a + pop af + ld [wJumptableIndex], a +.finish + pop af + ld [wOptions], a + xor a + ld [hBGMapMode], a + call Pack_InitGFX + call WaitBGMap_DrawPackGFX + call Pack_InitColors + ret + +.NoPokemon: ; 10486 (4:4486) + ld hl, TextJump_YouDontHaveAMon + call Pack_PrintTextNoScroll + ret +; 1048d (4:448d) +.Egg: ; 0x1048d + ; An EGG can't hold an item. + text_jump Text_AnEGGCantHoldAnItem + db "@" +; 0x10492 + +QuitItemSubmenu: ; 10492 + ret +; 10493 + +BattlePack: ; 10493 + ld hl, wOptions + set NO_TEXT_SCROLL, [hl] + call InitPackBuffers +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .end + call .RunJumptable + call DelayFrame + jr .loop + +.end + ld a, [wCurrPocket] + ld [wLastPocket], a + ld hl, wOptions + res NO_TEXT_SCROLL, [hl] + ret +; 104b9 + +.RunJumptable: ; 104b9 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call Pack_GetJumptablePointer + jp hl + +; 104c3 + +.Jumptable: ; 104c3 (4:44c3) +; entries correspond to PACKSTATE_* constants + dw .InitGFX ; 0 + dw .InitItemsPocket ; 1 + dw .ItemsPocketMenu ; 2 + dw .InitBallsPocket ; 3 + dw .BallsPocketMenu ; 4 + dw .InitKeyItemsPocket ; 5 + dw .KeyItemsPocketMenu ; 6 + dw .InitTMHMPocket ; 7 + dw .TMHMPocketMenu ; 8 + dw Pack_QuitNoScript ; 9 + dw Pack_QuitRunScript ; 10 + +.InitGFX: ; 104d9 (4:44d9) + xor a + ld [hBGMapMode], a + call Pack_InitGFX + ld a, [wPackJumptableIndex] + ld [wJumptableIndex], a + call Pack_InitColors + ret + +.InitItemsPocket: ; 104e9 (4:44e9) + xor a ; ITEM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.ItemsPocketMenu: ; 104fa (4:44fa) + ld hl, ItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wItemsPocketCursor], a + ld b, PACKSTATE_INITTMHMPOCKET ; left + ld c, PACKSTATE_INITBALLSPOCKET ; right + call Pack_InterpretJoypad + ret c + call ItemSubmenu + ret + +.InitKeyItemsPocket: ; 10527 (4:4527) + ld a, KEY_ITEM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.KeyItemsPocketMenu: ; 10539 (4:4539) + ld hl, KeyItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wKeyItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wKeyItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wKeyItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wKeyItemsPocketCursor], a + ld b, PACKSTATE_INITBALLSPOCKET ; left + ld c, PACKSTATE_INITTMHMPOCKET ; right + call Pack_InterpretJoypad + ret c + call ItemSubmenu + ret + +.InitTMHMPocket: ; 10566 (4:4566) + ld a, TM_HM_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + xor a + ld [hBGMapMode], a + call WaitBGMap_DrawPackGFX + ld hl, Text_PackEmptyString + call Pack_PrintTextNoScroll + call Pack_JumptableNext + ret + +.TMHMPocketMenu: ; 10581 (4:4581) + farcall TMHMPocket + ld b, PACKSTATE_INITKEYITEMSPOCKET ; left + ld c, PACKSTATE_INITITEMSPOCKET ; right + call Pack_InterpretJoypad + ret c + xor a + call TMHMSubmenu + ret + +.InitBallsPocket: ; 10594 (4:4594) + ld a, BALL_POCKET + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + call Pack_JumptableNext + ret + +.BallsPocketMenu: ; 105a6 (4:45a6) + ld hl, BallsPocketMenuHeader + call CopyMenuHeader + ld a, [wBallsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wBallsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wBallsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wBallsPocketCursor], a + ld b, PACKSTATE_INITITEMSPOCKET ; left + ld c, PACKSTATE_INITKEYITEMSPOCKET ; right + call Pack_InterpretJoypad + ret c + call ItemSubmenu + ret + +ItemSubmenu: ; 105d3 (4:45d3) + farcall CheckItemContext + ld a, [wItemAttributeParamBuffer] +TMHMSubmenu: ; 105dc (4:45dc) + and a + jr z, .NoUse + ld hl, .UsableMenuHeader + ld de, .UsableJumptable + jr .proceed + +.NoUse: + ld hl, .UnusableMenuHeader + ld de, .UnusableJumptable +.proceed + push de + call LoadMenuHeader + call VerticalMenu + call ExitMenu + pop hl + ret c + ld a, [wMenuCursorY] + dec a + call Pack_GetJumptablePointer + jp hl + +; 10601 (4:4601) +.UsableMenuHeader: ; 0x10601 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .UsableMenuData + db 1 ; default option +; 0x10609 + +.UsableMenuData: ; 0x10609 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "USE@" + db "QUIT@" +; 0x10614 + +.UsableJumptable: ; 10614 + dw .Use + dw .Quit +; 10618 + +.UnusableMenuHeader: ; 0x10618 + db MENU_BACKUP_TILES ; flags + menu_coords 13, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .UnusableMenuData + db 1 ; default option +; 0x10620 + +.UnusableMenuData: ; 0x10620 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 1 ; items + db "QUIT@" +; 0x10627 + +.UnusableJumptable: ; 10627 + dw .Quit +; 10629 + +.Use: ; 10629 + farcall CheckItemContext + ld a, [wItemAttributeParamBuffer] + ld hl, .ItemFunctionJumptable + rst JumpTable + ret + +.ItemFunctionJumptable: ; 10637 (4:4637) +; entries correspond to ITEMMENU_* constants + dw .Oak ; ITEMMENU_NOUSE + dw .Oak + dw .Oak + dw .Oak + dw .Unused ; ITEMMENU_CURRENT + dw .BattleField ; ITEMMENU_PARTY + dw .BattleOnly ; ITEMMENU_CLOSE + +.Oak: ; 10645 (4:4645) + ld hl, Text_ThisIsntTheTime + call Pack_PrintTextNoScroll + ret + +.Unused: ; 1064c (4:464c) + call DoItemEffect + ld a, [wItemEffectSucceeded] + and a + jr nz, .ReturnToBattle + ret + +.BattleField: ; 10656 (4:4656) + call DoItemEffect + ld a, [wItemEffectSucceeded] + and a + jr nz, .quit_run_script + xor a + ld [hBGMapMode], a + call Pack_InitGFX + call WaitBGMap_DrawPackGFX + call Pack_InitColors + ret + +.ReturnToBattle: ; 1066c (4:466c) + call ClearBGPalettes + jr .quit_run_script + +.BattleOnly: ; 10671 (4:4671) + call DoItemEffect + ld a, [wItemEffectSucceeded] + and a + jr z, .Oak + cp $2 + jr z, .didnt_use_item +.quit_run_script ; 1067e (4:467e) + ld a, PACKSTATE_QUITRUNSCRIPT + ld [wJumptableIndex], a + ret + +.didnt_use_item ; 10684 (4:4684) + xor a + ld [wItemEffectSucceeded], a + ret +; 10689 (4:4689) +.Quit: ; 10689 + ret +; 1068a + +InitPackBuffers: ; 1068a + xor a + ld [wJumptableIndex], a + ; pocket id -> jumptable index + ld a, [wLastPocket] + maskbits NUM_POCKETS + ld [wCurrPocket], a + inc a + add a + dec a + ld [wPackJumptableIndex], a + xor a ; FALSE + ld [wPackUsedItem], a + xor a + ld [wSwitchItem], a + ret +; 106a5 + +DepositSellInitPackBuffers: ; 106a5 + xor a + ld [hBGMapMode], a + ld [wJumptableIndex], a ; PACKSTATE_INITGFX + ld [wPackJumptableIndex], a ; PACKSTATE_INITGFX + ld [wCurrPocket], a ; ITEM_POCKET + ld [wPackUsedItem], a + ld [wSwitchItem], a + call Pack_InitGFX + call Pack_InitColors + ret +; 106be + +DepositSellPack: ; 106be +.loop + call .RunJumptable + call DepositSellTutorial_InterpretJoypad + jr c, .loop + ret +; 106c7 + +.RunJumptable: ; 106c7 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call Pack_GetJumptablePointer + jp hl + +; 106d1 + +.Jumptable: ; 106d1 (4:46d1) +; entries correspond to *_POCKET constants + dw .ItemsPocket + dw .BallsPocket + dw .KeyItemsPocket + dw .TMHMPocket + +.ItemsPocket: ; 106d9 (4:46d9) + xor a ; ITEM_POCKET + call InitPocket + ld hl, PC_Mart_ItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wItemsPocketCursor], a + ret + +.KeyItemsPocket: ; 106ff (4:46ff) + ld a, KEY_ITEM_POCKET + call InitPocket + ld hl, PC_Mart_KeyItemsPocketMenuHeader + call CopyMenuHeader + ld a, [wKeyItemsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wKeyItemsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wKeyItemsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wKeyItemsPocketCursor], a + ret + +.TMHMPocket: ; 10726 (4:4726) + ld a, TM_HM_POCKET + call InitPocket + call WaitBGMap_DrawPackGFX + farcall TMHMPocket + ld a, [wCurItem] + ld [wCurItem], a + ret + +.BallsPocket: ; 1073b (4:473b) + ld a, BALL_POCKET + call InitPocket + ld hl, PC_Mart_BallsPocketMenuHeader + call CopyMenuHeader + ld a, [wBallsPocketCursor] + ld [wMenuCursorBuffer], a + ld a, [wBallsPocketScrollPosition] + ld [wMenuScrollPosition], a + call ScrollingMenu + ld a, [wMenuScrollPosition] + ld [wBallsPocketScrollPosition], a + ld a, [wMenuCursorY] + ld [wBallsPocketCursor], a + ret + +InitPocket: ; 10762 (4:4762) + ld [wCurrPocket], a + call ClearPocketList + call DrawPocketName + call WaitBGMap_DrawPackGFX + ret + +DepositSellTutorial_InterpretJoypad: ; 1076f + ld hl, wMenuJoypad + ld a, [hl] + and A_BUTTON + jr nz, .a_button + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and D_LEFT + jr nz, .d_left + ld a, [hl] + and D_RIGHT + jr nz, .d_right + scf + ret + +.a_button + ld a, TRUE + ld [wPackUsedItem], a + and a + ret + +.b_button + xor a ; FALSE + ld [wPackUsedItem], a + and a + ret + +.d_left + ld a, [wJumptableIndex] + dec a + maskbits NUM_POCKETS + ld [wJumptableIndex], a + push de + ld de, SFX_SWITCH_POCKETS + call PlaySFX + pop de + scf + ret + +.d_right + ld a, [wJumptableIndex] + inc a + maskbits NUM_POCKETS + ld [wJumptableIndex], a + push de + ld de, SFX_SWITCH_POCKETS + call PlaySFX + pop de + scf + ret +; 107bb + +TutorialPack: ; 107bb + call DepositSellInitPackBuffers + ld a, [wInputType] + or a + jr z, .loop + farcall _DudeAutoInput_RightA +.loop + call .RunJumptable + call DepositSellTutorial_InterpretJoypad + jr c, .loop + xor a ; FALSE + ld [wPackUsedItem], a + ret +; 107d7 + +.RunJumptable: ; 107d7 + ld a, [wJumptableIndex] + ld hl, .dw + call Pack_GetJumptablePointer + jp hl + +; 107e1 + +.dw ; 107e1 (4:47e1) +; entries correspond to *_POCKET constants + dw .Items + dw .Balls + dw .KeyItems + dw .TMHM + +.Items: ; 107e9 (4:47e9) + xor a ; ITEM_POCKET + ld hl, .ItemsMenuHeader + jr .DisplayPocket + +; 107ef (4:47ef) +.ItemsMenuHeader: ; 0x107ef + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .ItemsMenuData + db 1 ; default option +; 0x107f7 + +.ItemsMenuData: ; 0x107f7 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wDudeNumItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10807 + +.KeyItems: ; 10807 (4:4807) + ld a, KEY_ITEM_POCKET + ld hl, .KeyItemsMenuHeader + jr .DisplayPocket + +; 1080e (4:480e) +.KeyItemsMenuHeader: ; 0x1080e + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .KeyItemsMenuData + db 1 ; default option +; 0x10816 + +.KeyItemsMenuData: ; 0x10816 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wDudeNumKeyItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10826 + +.TMHM: ; 10826 (4:4826) + ld a, TM_HM_POCKET + call InitPocket + call WaitBGMap_DrawPackGFX + farcall TMHMPocket + ld a, [wCurItem] + ld [wCurItem], a + ret + +.Balls: ; 1083b (4:483b) + ld a, BALL_POCKET + ld hl, .BallsMenuHeader + jr .DisplayPocket + +; 10842 (4:4842) +.BallsMenuHeader: ; 0x10842 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .BallsMenuData + db 1 ; default option +; 0x1084a + +.BallsMenuData: ; 0x1084a + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wDudeNumBalls + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 1085a + +.DisplayPocket: ; 1085a (4:485a) + push hl + call InitPocket + pop hl + call CopyMenuHeader + call ScrollingMenu + ret + +Pack_JumptableNext: ; 10866 (4:4866) + ld hl, wJumptableIndex + inc [hl] + ret + +Pack_GetJumptablePointer: ; 1086b + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret +; 10874 + +Pack_QuitNoScript: ; 10874 (4:4874) + ld hl, wJumptableIndex + set 7, [hl] + xor a ; FALSE + ld [wPackUsedItem], a + ret + +Pack_QuitRunScript: ; 1087e (4:487e) + ld hl, wJumptableIndex + set 7, [hl] + ld a, TRUE + ld [wPackUsedItem], a + ret + +Pack_PrintTextNoScroll: ; 10889 (4:4889) + ld a, [wOptions] + push af + set NO_TEXT_SCROLL, a + ld [wOptions], a + call PrintText + pop af + ld [wOptions], a + ret + +WaitBGMap_DrawPackGFX: ; 1089a (4:489a) + call WaitBGMap +DrawPackGFX: ; 1089d + ld a, [wCurrPocket] + maskbits NUM_POCKETS + ld e, a + ld d, $0 + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jr z, .male_dude + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr nz, .female +.male_dude + ld hl, PackGFXPointers + add hl, de + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + ld hl, vTiles2 tile $50 + lb bc, BANK(PackGFX), 15 + call Request2bpp + ret + +.female + farcall DrawKrisPackGFX + ret +; 108cc + +PackGFXPointers: ; 108cc + dw PackGFX + (15 tiles) * 1 ; ITEM_POCKET + dw PackGFX + (15 tiles) * 3 ; BALL_POCKET + dw PackGFX + (15 tiles) * 0 ; KEY_ITEM_POCKET + dw PackGFX + (15 tiles) * 2 ; TM_HM_POCKET +; 108d4 + +Pack_InterpretJoypad: ; 108d4 (4:48d4) + ld hl, wMenuJoypad + ld a, [wSwitchItem] + and a + jr nz, .switching_item + ld a, [hl] + and A_BUTTON + jr nz, .a_button + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and D_LEFT + jr nz, .d_left + ld a, [hl] + and D_RIGHT + jr nz, .d_right + ld a, [hl] + and SELECT + jr nz, .select + scf + ret + +.a_button + and a + ret + +.b_button + ld a, PACKSTATE_QUITNOSCRIPT + ld [wJumptableIndex], a + scf + ret + +.d_left + ld a, b + ld [wJumptableIndex], a + ld [wPackJumptableIndex], a + push de + ld de, SFX_SWITCH_POCKETS + call PlaySFX + pop de + scf + ret + +.d_right + ld a, c + ld [wJumptableIndex], a + ld [wPackJumptableIndex], a + push de + ld de, SFX_SWITCH_POCKETS + call PlaySFX + pop de + scf + ret + +.select + farcall SwitchItemsInBag + ld hl, Text_MoveItemWhere + call Pack_PrintTextNoScroll + scf + ret + +.switching_item + ld a, [hl] + and A_BUTTON | SELECT + jr nz, .place_insert + ld a, [hl] + and B_BUTTON + jr nz, .end_switch + scf + ret + +.place_insert + farcall SwitchItemsInBag + ld de, SFX_SWITCH_POKEMON + call WaitPlaySFX + ld de, SFX_SWITCH_POKEMON + call WaitPlaySFX +.end_switch + xor a + ld [wSwitchItem], a + scf + ret + +Pack_InitGFX: ; 10955 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + ld hl, PackMenuGFX + ld de, vTiles2 + ld bc, $60 tiles + ld a, BANK(PackMenuGFX) + call FarCopyBytes +; Background (blue if male, pink if female) + hlcoord 0, 1 + ld bc, 11 * SCREEN_WIDTH + ld a, $24 + call ByteFill +; This is where the items themselves will be listed. + hlcoord 5, 1 + lb bc, 11, 15 + call ClearBox +; ◀▶ POCKET ▼▲ ITEMS + hlcoord 0, 0 + ld a, $28 + ld c, SCREEN_WIDTH +.loop + ld [hli], a + inc a + dec c + jr nz, .loop + call DrawPocketName + call PlacePackGFX +; Place the textbox for displaying the item description + hlcoord 0, SCREEN_HEIGHT - 4 - 2 + lb bc, 4, SCREEN_WIDTH - 2 + call TextBox + call EnableLCD + call DrawPackGFX + ret +; 109a5 + +PlacePackGFX: ; 109a5 + hlcoord 0, 3 + ld a, $50 + ld de, SCREEN_WIDTH - 5 + ld b, 3 +.row + ld c, 5 +.column + ld [hli], a + inc a + dec c + jr nz, .column + add hl, de + dec b + jr nz, .row + ret +; 109bb + +DrawPocketName: ; 109bb + ld a, [wCurrPocket] + ; * 15 + ld d, a + swap a + sub d + ld d, 0 + ld e, a + ld hl, .tilemap + add hl, de + ld d, h + ld e, l + hlcoord 0, 7 + ld c, 3 +.row + ld b, 5 +.col + ld a, [de] + inc de + ld [hli], a + dec b + jr nz, .col + ld a, c + ld c, SCREEN_WIDTH - 5 + add hl, bc + ld c, a + dec c + jr nz, .row + ret +; 109e1 + +.tilemap ; 109e1 +; ITEM_POCKET + db $00, $04, $04, $04, $01 ; top border + db $06, $07, $08, $09, $0a ; Items + db $02, $05, $05, $05, $03 ; bottom border +; BALL_POCKET + db $00, $04, $04, $04, $01 ; top border + db $15, $16, $17, $18, $19 ; Balls + db $02, $05, $05, $05, $03 ; bottom border +; KEY_ITEM_POCKET + db $00, $04, $04, $04, $01 ; top border + db $0b, $0c, $0d, $0e, $0f ; Key Items + db $02, $05, $05, $05, $03 ; bottom border +; TM_HM_POCKET + db $00, $04, $04, $04, $01 ; top border + db $10, $11, $12, $13, $14 ; TM/HM + db $02, $05, $05, $05, $03 ; bottom border +; 10a1d + +Pack_GetItemName: ; 10a1d + ld a, [wCurItem] + ld [wNamedObjectIndexBuffer], a + call GetItemName + call CopyName1 + ret +; 10a2a + +Unreferenced_Pack_ClearTilemap: ; 10a2a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill + ret +; 10a36 + +ClearPocketList: ; 10a36 (4:4a36) + hlcoord 5, 2 + lb bc, 10, SCREEN_WIDTH - 5 + call ClearBox + ret + +Pack_InitColors: ; 10a40 + call WaitBGMap + ld b, SCGB_PACKPALS + call GetSGBLayout + call SetPalettes + call DelayFrame + ret +; 10a4f + +ItemsPocketMenuHeader: ; 0x10a4f + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10a57 + +.MenuData: ; 0x10a57 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wNumItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10a67 + +PC_Mart_ItemsPocketMenuHeader: ; 0x10a67 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10a6f + +.MenuData: ; 0x10a6f + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wNumItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10a7f + +KeyItemsPocketMenuHeader: ; 0x10a7f + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10a87 + +.MenuData: ; 0x10a87 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wNumKeyItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10a97 + +PC_Mart_KeyItemsPocketMenuHeader: ; 0x10a97 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10a9f + +.MenuData: ; 0x10a9f + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags + db 5, 8 ; rows, columns + db 1 ; horizontal spacing + dbw 0, wNumKeyItems + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10aaf + +BallsPocketMenuHeader: ; 0x10aaf + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10ab7 + +.MenuData: ; 0x10ab7 + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wNumBalls + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10ac7 + +PC_Mart_BallsPocketMenuHeader: ; 0x10ac7 + db MENU_BACKUP_TILES ; flags + menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option +; 0x10acf + +.MenuData: ; 0x10acf + db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags + db 5, 8 ; rows, columns + db 2 ; horizontal spacing + dbw 0, wNumBalls + dba PlaceMenuItemName + dba PlaceMenuItemQuantity + dba UpdateItemDescription +; 10adf + +Text_PackNoItems: ; 0x10adf + ; No items. + text_jump UnknownText_0x1c0b9a + db "@" +; 0x10ae4 + +Text_ThrowAwayHowMany: ; 0x10ae4 + ; Throw away how many? + text_jump UnknownText_0x1c0ba5 + db "@" +; 0x10ae9 + +Text_ConfirmThrowAway: ; 0x10ae9 + ; Throw away @ @ (S)? + text_jump UnknownText_0x1c0bbb + db "@" +; 0x10aee + +Text_ThrewAway: ; 0x10aee + ; Threw away @ (S). + text_jump UnknownText_0x1c0bd8 + db "@" +; 0x10af3 + +Text_ThisIsntTheTime: ; 0x10af3 + ; OAK: ! This isn't the time to use that! + text_jump UnknownText_0x1c0bee + db "@" +; 0x10af8 + +TextJump_YouDontHaveAMon: ; 0x10af8 + ; You don't have a #MON! + text_jump Text_YouDontHaveAMon + db "@" +; 0x10afd + +Text_RegisteredItem: ; 0x10afd + ; Registered the @ . + text_jump UnknownText_0x1c0c2e + db "@" +; 0x10b02 + +Text_CantRegister: ; 0x10b02 + ; You can't register that item. + text_jump UnknownText_0x1c0c45 + db "@" +; 0x10b07 + +Text_MoveItemWhere: ; 0x10b07 + ; Where should this be moved to? + text_jump UnknownText_0x1c0c63 + db "@" +; 0x10b0c + +Text_PackEmptyString: ; 0x10b0c + ; + text_jump UnknownText_0x1c0c83 + db "@" +; 0x10b11 + +TextJump_YouCantUseItInABattle: ; 0x10b11 + ; Doesn't seem to be used anywhere + ; "You can't use it in a battle." + text_jump Text_YouCantUseItInABattle + db "@" +; 0x10b16 + +PackMenuGFX: +INCBIN "gfx/pack/pack_menu.2bpp" +PackGFX: +INCBIN "gfx/pack/pack.2bpp" diff --git a/engine/items/printitemdescription.asm b/engine/items/printitemdescription.asm new file mode 100644 index 000000000..2a9007b97 --- /dev/null +++ b/engine/items/printitemdescription.asm @@ -0,0 +1,31 @@ +PrintItemDescription: ; 0x1c8955 +; Print the description for item [wCurSpecies] at de. + + ld a, [wCurSpecies] + cp TM01 + jr c, .not_a_tm + + ld [wCurItem], a + push de + farcall GetTMHMItemMove + pop hl + ld a, [wd265] + ld [wCurSpecies], a + predef PrintMoveDesc + ret + +.not_a_tm + push de + ld hl, ItemDescriptions + ld a, [wCurSpecies] + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + pop hl + jp PlaceString +; 0x1c8987 diff --git a/engine/items/switch_items.asm b/engine/items/switch_items.asm new file mode 100755 index 000000000..77b635246 --- /dev/null +++ b/engine/items/switch_items.asm @@ -0,0 +1,274 @@ +SwitchItemsInBag: ; 2490c (9:490c) + ld a, [wSwitchItem] + and a + jr z, .init + ld b, a + ld a, [wScrollingMenuCursorPosition] + inc a + cp b + jr z, .trivial + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + ld a, [hl] + cp -1 + ret z + ld a, [wSwitchItem] + dec a + ld [wSwitchItem], a + call Function249a7 + jp c, Function249d1 + ld a, [wScrollingMenuCursorPosition] + ld c, a + ld a, [wSwitchItem] + cp c + jr c, .asm_2497a + jr .asm_2494a + +.init + ld a, [wScrollingMenuCursorPosition] + inc a + ld [wSwitchItem], a + ret + +.trivial + xor a + ld [wSwitchItem], a + ret + +.asm_2494a + ld a, [wSwitchItem] + call Function24a40 + ld a, [wScrollingMenuCursorPosition] + ld d, a + ld a, [wSwitchItem] + ld e, a + call Function24a6c + push bc + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + dec hl + push hl + call ItemSwitch_ConvertSpacingToDW + add hl, bc + ld d, h + ld e, l + pop hl + pop bc + call Function24aab + ld a, [wScrollingMenuCursorPosition] + call Function24a4d + xor a + ld [wSwitchItem], a + ret + +.asm_2497a + ld a, [wSwitchItem] + call Function24a40 + ld a, [wScrollingMenuCursorPosition] + ld d, a + ld a, [wSwitchItem] + ld e, a + call Function24a6c + push bc + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + ld d, h + ld e, l + call ItemSwitch_ConvertSpacingToDW + add hl, bc + pop bc + call CopyBytes + ld a, [wScrollingMenuCursorPosition] + call Function24a4d + xor a + ld [wSwitchItem], a + ret + +Function249a7: ; 249a7 (9:49a7) + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + ld d, h + ld e, l + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + ld a, [de] + cp [hl] + jr nz, .asm_249cd + ld a, [wScrollingMenuCursorPosition] + call Function24a97 + cp 99 + jr z, .asm_249cd + ld a, [wSwitchItem] + call Function24a97 + cp 99 + jr nz, .asm_249cf +.asm_249cd + and a + ret + +.asm_249cf + scf + ret + +Function249d1: ; 249d1 (9:49d1) + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + inc hl + push hl + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + inc hl + ld a, [hl] + pop hl + add [hl] + cp 100 + jr c, .asm_24a01 + sub 99 + push af + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + inc hl + ld [hl], 99 + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + inc hl + pop af + ld [hl], a + xor a + ld [wSwitchItem], a + ret + +.asm_24a01 + push af + ld a, [wScrollingMenuCursorPosition] + call ItemSwitch_GetNthItem + inc hl + pop af + ld [hl], a + ld hl, wMenuData_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wSwitchItem] + cp [hl] + jr nz, .asm_24a25 + dec [hl] + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + ld [hl], $ff + xor a + ld [wSwitchItem], a + ret + +.asm_24a25 + dec [hl] + call ItemSwitch_ConvertSpacingToDW + push bc + ld a, [wSwitchItem] + call ItemSwitch_GetNthItem + pop bc + push hl + add hl, bc + pop de +.asm_24a34 + ld a, [hli] + ld [de], a + inc de + cp $ff + jr nz, .asm_24a34 + xor a + ld [wSwitchItem], a + ret + +Function24a40: ; 24a40 (9:4a40) + call ItemSwitch_GetNthItem + ld de, wd002 + call ItemSwitch_ConvertSpacingToDW + call CopyBytes + ret + +Function24a4d: ; 24a4d (9:4a4d) + call ItemSwitch_GetNthItem + ld d, h + ld e, l + ld hl, wd002 + call ItemSwitch_ConvertSpacingToDW + call CopyBytes + ret + +ItemSwitch_GetNthItem: ; 24a5c (9:4a5c) + push af + call ItemSwitch_ConvertSpacingToDW + ld hl, wMenuData_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + inc hl + pop af + call AddNTimes + ret + +Function24a6c: ; 24a6c (9:4a6c) + push hl + call ItemSwitch_ConvertSpacingToDW + ld a, d + sub e + jr nc, .dont_negate + dec a + cpl +.dont_negate + ld hl, 0 + call AddNTimes + ld b, h + ld c, l + pop hl + ret + +ItemSwitch_ConvertSpacingToDW: ; 24a80 (9:4a80) +; This function is absolutely idiotic. + push hl + ld a, [wMenuData_ScrollingMenuSpacing] + ld c, a + ld b, 0 + ld hl, .spacing_dws + add hl, bc + add hl, bc + ld c, [hl] + inc hl + ld b, [hl] + pop hl + ret + +; 24a91 (9:4a91) + +.spacing_dws ; 24a91 + dw 0, 1, 2 +; 24a97 + +Function24a97: ; 24a97 (9:4a97) + push af + call ItemSwitch_ConvertSpacingToDW + ld a, c + cp 2 + jr nz, .not_2 + pop af + call ItemSwitch_GetNthItem + inc hl + ld a, [hl] + ret + +.not_2 + pop af + ld a, $1 + ret + +Function24aab: ; 24aab (9:4aab) +.loop + ld a, [hld] + ld [de], a + dec de + dec bc + ld a, b + or c + jr nz, .loop + ret diff --git a/engine/items/tmhm.asm b/engine/items/tmhm.asm new file mode 100755 index 000000000..9db3dc291 --- /dev/null +++ b/engine/items/tmhm.asm @@ -0,0 +1,49 @@ +CanLearnTMHMMove: ; 11639 + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call GetBaseData + ld hl, wBaseTMHM + push hl + + ld a, [wPutativeTMHMMove] + ld b, a + ld c, 0 + ld hl, TMHMMoves +.loop + ld a, [hli] + and a + jr z, .end + cp b + jr z, .asm_11659 + inc c + jr .loop + +.asm_11659 + pop hl + ld b, CHECK_FLAG + push de + ld d, 0 + predef SmallFarFlagAction + pop de + ret + +.end + pop hl + ld c, 0 + ret +; 1166a + +GetTMHMMove: ; 1166a + ld a, [wd265] + dec a + ld hl, TMHMMoves + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wd265], a + ret +; 1167a + + +INCLUDE "data/moves/tmhm_moves.asm" diff --git a/engine/items/updateitemdescription.asm b/engine/items/updateitemdescription.asm new file mode 100644 index 000000000..fdb1e864d --- /dev/null +++ b/engine/items/updateitemdescription.asm @@ -0,0 +1,13 @@ +UpdateItemDescription: ; 0x244c3 + ld a, [wMenuSelection] + ld [wCurSpecies], a + hlcoord 0, 12 + ld b, 4 + ld c, SCREEN_WIDTH - 2 + call TextBox + ld a, [wMenuSelection] + cp -1 + ret z + decoord 1, 14 + farcall PrintItemDescription + ret diff --git a/engine/menu/buy_sell_toss.asm b/engine/menu/buy_sell_toss.asm deleted file mode 100755 index 84481d030..000000000 --- a/engine/menu/buy_sell_toss.asm +++ /dev/null @@ -1,235 +0,0 @@ -SelectQuantityToToss: ; 24fbf - ld hl, TossItem_MenuHeader - call LoadMenuHeader - call Toss_Sell_Loop - ret -; 24fc9 - -SelectQuantityToBuy: ; 24fc9 - farcall GetItemPrice -RooftopSale_SelectQuantityToBuy: ; 24fcf - ld a, d - ld [wBuffer1], a - ld a, e - ld [wBuffer2], a - ld hl, BuyItem_MenuHeader - call LoadMenuHeader - call Toss_Sell_Loop - ret -; 24fe1 - -SelectQuantityToSell: ; 24fe1 - farcall GetItemPrice - ld a, d - ld [wBuffer1], a - ld a, e - ld [wBuffer2], a - ld hl, SellItem_MenuHeader - call LoadMenuHeader - call Toss_Sell_Loop - ret -; 24ff9 - -Toss_Sell_Loop: ; 24ff9 - ld a, 1 - ld [wItemQuantityChangeBuffer], a -.loop - call BuySellToss_UpdateQuantityDisplay ; update display - call BuySellToss_InterpretJoypad ; joy action - jr nc, .loop - cp -1 - jr nz, .nope ; pressed B - scf - ret - -.nope - and a - ret -; 2500e - -BuySellToss_InterpretJoypad: ; 2500e - call JoyTextDelay_ForcehJoyDown ; get joypad - bit B_BUTTON_F, c - jr nz, .b - bit A_BUTTON_F, c - jr nz, .a - bit D_DOWN_F, c - jr nz, .down - bit D_UP_F, c - jr nz, .up - bit D_LEFT_F, c - jr nz, .left - bit D_RIGHT_F, c - jr nz, .right - and a - ret - -.b - ld a, -1 - scf - ret - -.a - ld a, 0 - scf - ret - -.down - ld hl, wItemQuantityChangeBuffer - dec [hl] - jr nz, .finish_down - ld a, [wItemQuantityBuffer] - ld [hl], a - -.finish_down - and a - ret - -.up - ld hl, wItemQuantityChangeBuffer - inc [hl] - ld a, [wItemQuantityBuffer] - cp [hl] - jr nc, .finish_up - ld [hl], 1 - -.finish_up - and a - ret - -.left - ld a, [wItemQuantityChangeBuffer] - sub 10 - jr c, .load_1 - jr z, .load_1 - jr .finish_left - -.load_1 - ld a, 1 - -.finish_left - ld [wItemQuantityChangeBuffer], a - and a - ret - -.right - ld a, [wItemQuantityChangeBuffer] - add 10 - ld b, a - ld a, [wItemQuantityBuffer] - cp b - jr nc, .finish_right - ld b, a - -.finish_right - ld a, b - ld [wItemQuantityChangeBuffer], a - and a - ret -; 25072 - -BuySellToss_UpdateQuantityDisplay: ; 25072 - call MenuBox - call MenuBoxCoord2Tile - ld de, SCREEN_WIDTH + 1 - add hl, de - ld [hl], "×" - inc hl - ld de, wItemQuantityChangeBuffer - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ld a, [wMenuDataPointer] - ld e, a - ld a, [wMenuDataPointer + 1] - ld d, a - ld a, [wMenuDataBank] - call FarCall_de - ret -; 25097 - -ret_25097: ; 25097 - ret -; 25098 - -DisplayPurchasePrice: ; 25098 - call BuySell_MultiplyPrice - call BuySell_DisplaySubtotal - ret -; 2509f - -DisplaySellingPrice: ; 2509f - call BuySell_MultiplyPrice - call Sell_HalvePrice - call BuySell_DisplaySubtotal - ret -; 250a9 - -BuySell_MultiplyPrice: ; 250a9 - xor a - ld [hMultiplicand + 0], a - ld a, [wBuffer1] - ld [hMultiplicand + 1], a - ld a, [wBuffer2] - ld [hMultiplicand + 2], a - ld a, [wItemQuantityChangeBuffer] - ld [hMultiplier], a - push hl - call Multiply - pop hl - ret -; 250c1 - -Sell_HalvePrice: ; 250c1 - push hl - ld hl, hProduct + 1 - ld a, [hl] - srl a - ld [hli], a - ld a, [hl] - rra - ld [hli], a - ld a, [hl] - rra - ld [hl], a - pop hl - ret -; 250d1 - -BuySell_DisplaySubtotal: ; 250d1 - push hl - ld hl, hMoneyTemp - ld a, [hProduct + 1] - ld [hli], a - ld a, [hProduct + 2] - ld [hli], a - ld a, [hProduct + 3] - ld [hl], a - pop hl - inc hl - ld de, hMoneyTemp - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - call WaitBGMap - ret -; 250ed - -TossItem_MenuHeader: ; 0x250ed - db MENU_BACKUP_TILES ; flags - menu_coords 15, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw ret_25097 - db 0 ; default option -; 0x250f5 - -BuyItem_MenuHeader: ; 0x250f5 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw DisplayPurchasePrice - db -1 ; default option -; 0x250fd - -SellItem_MenuHeader: ; 0x250fd - db MENU_BACKUP_TILES ; flags - menu_coords 7, 15, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw DisplaySellingPrice - db 0 ; default option -; 0x25105 diff --git a/engine/menu/clock_reset.asm b/engine/menu/clock_reset.asm deleted file mode 100755 index c05129349..000000000 --- a/engine/menu/clock_reset.asm +++ /dev/null @@ -1,254 +0,0 @@ - -ResetClock_GetWraparoundTime: ; 20000 (8:4000) - push hl - dec a - ld e, a - ld d, 0 - ld hl, .WrapAroundTimes -rept 4 - add hl, de -endr - ld e, [hl] - inc hl - ld d, [hl] - inc hl - ld b, [hl] - inc hl - ld c, [hl] - pop hl - ret -; 20015 (8:4015) - -.WrapAroundTimes: ; 20015 - dw wBuffer4 - db 7, 4 - - dw wBuffer5 - db 24, 12 - - dw wBuffer6 - db 60, 15 -; 20021 - -RestartClock: ; 20021 (8:4021) -; If we're here, we had an RTC overflow. - ld hl, .Text_ClockTimeMayBeWrong - call PrintText - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call LoadStandardMenuHeader - call ClearTileMap - ld hl, .Text_SetWithControlPad - call PrintText - call .SetClock - call ExitMenu - pop bc - ld hl, wOptions - ld [hl], b - ld c, a - ret -; 20047 (8:4047) - -.Text_ClockTimeMayBeWrong: ; 0x20047 - ; The clock's time may be wrong. Please reset the time. - text_jump UnknownText_0x1c40e6 - db "@" -; 0x2004c - -.Text_SetWithControlPad: ; 0x2004c - ; Set with the Control Pad. Confirm: A Button Cancel: B Button - text_jump UnknownText_0x1c411c - db "@" -; 0x20051 - -.SetClock: ; 20051 (8:4051) - ld a, 1 - ld [wBuffer1], a ; which digit - ld [wBuffer2], a - ld a, 8 - ld [wBuffer3], a - call UpdateTime - call GetWeekday - ld [wBuffer4], a - ld a, [hHours] - ld [wBuffer5], a - ld a, [hMinutes] - ld [wBuffer6], a - -.loop - call .joy_loop - jr nc, .loop - and a - ret nz - call .PrintTime - ld hl, .Text_IsThisOK - call PrintText - call YesNoBox - jr c, .cancel - ld a, [wBuffer4] - ld [wStringBuffer2], a - ld a, [wBuffer5] - ld [wStringBuffer2 + 1], a - ld a, [wBuffer6] - ld [wStringBuffer2 + 2], a - xor a - ld [wStringBuffer2 + 3], a - call InitTime - call .PrintTime - ld hl, .Text_ClockReset - call PrintText - call WaitPressAorB_BlinkCursor - xor a - ret - -.cancel - ld a, $1 - ret -; 200b0 (8:40b0) - -.Text_IsThisOK: ; 0x200b0 - ; Is this OK? - text_jump UnknownText_0x1c415b - db "@" -; 0x200b5 - -.Text_ClockReset: ; 0x200b5 - ; The clock has been reset. - text_jump UnknownText_0x1c4168 - db "@" -; 0x200ba - -.joy_loop - call JoyTextDelay_ForcehJoyDown - ld c, a - push af - call .PrintTime - pop af - bit 0, a - jr nz, .press_A - bit 1, a - jr nz, .press_B - bit 6, a - jr nz, .pressed_up - bit 7, a - jr nz, .pressed_down - bit 5, a - jr nz, .pressed_left - bit 4, a - jr nz, .pressed_right - jr .joy_loop - -.press_A - ld a, $0 - scf - ret - -.press_B - ld a, $1 - scf - ret - -.pressed_up - ld a, [wBuffer1] - call ResetClock_GetWraparoundTime - ld a, [de] - inc a - ld [de], a - cp b - jr c, .done_scroll - ld a, $0 - ld [de], a - jr .done_scroll - -.pressed_down - ld a, [wBuffer1] - call ResetClock_GetWraparoundTime - ld a, [de] - dec a - ld [de], a - cp -1 - jr nz, .done_scroll - ld a, b - dec a - ld [de], a - jr .done_scroll - -.pressed_left - ld hl, wBuffer1 - dec [hl] - jr nz, .done_scroll - ld [hl], $3 - jr .done_scroll - -.pressed_right - ld hl, wBuffer1 - inc [hl] - ld a, [hl] - cp $4 - jr c, .done_scroll - ld [hl], $1 - -.done_scroll - xor a - ret - -.PrintTime: ; 2011f (8:411f) - hlcoord 0, 5 - ld b, 5 - ld c, 18 - call TextBox - decoord 1, 8 - ld a, [wBuffer4] - ld b, a - farcall PrintDayOfWeek - ld a, [wBuffer5] - ld b, a - ld a, [wBuffer6] - ld c, a - decoord 11, 8 - farcall PrintHoursMins - ld a, [wBuffer2] - lb de, " ", " " - call .PlaceChars - ld a, [wBuffer1] - lb de, "▲", "▼" - call .PlaceChars - ld a, [wBuffer1] - ld [wBuffer2], a - ret -; 20160 (8:4160) - -.unreferenced ; 20160 -; unused - ld a, [wBuffer3] - ld b, a - call Coord2Tile - ret -; 20168 - -.PlaceChars: ; 20168 (8:4168) - push de - call ResetClock_GetWraparoundTime - ld a, [wBuffer3] - dec a - ld b, a - call Coord2Tile - pop de - ld [hl], d - ld bc, 2 * SCREEN_WIDTH - add hl, bc - ld [hl], e - ret -; 2017c (8:417c) - -UnreferencedString_HourJP: ; 2017c -; unused - db "じ@" ; HR -; 2017e - -UnreferencedString_MinuteJP: ; 2017e -; unused - db "ふん@" ; MIN -; 20181 diff --git a/engine/menu/delete_save_change_clock.asm b/engine/menu/delete_save_change_clock.asm deleted file mode 100755 index 431dc6034..000000000 --- a/engine/menu/delete_save_change_clock.asm +++ /dev/null @@ -1,296 +0,0 @@ -_ResetClock: ; 4d3b1 - farcall BlankScreen - ld b, SCGB_DIPLOMA - call GetSGBLayout - call LoadStandardFont - call LoadFontsExtra - ld de, MUSIC_MAIN_MENU - call PlayMusic - ld hl, .text_askreset - call PrintText - ld hl, .NoYes_MenuHeader - call CopyMenuHeader - call VerticalMenu - ret c - ld a, [wMenuCursorY] - cp $1 - ret z - call ClockResetPassword - jr c, .wrongpassword - ld a, BANK(sRTCStatusFlags) - call GetSRAMBank - ld a, $80 - ld [sRTCStatusFlags], a - call CloseSRAM - ld hl, .text_okay - call PrintText - ret - -.wrongpassword - ld hl, .text_wrong - call PrintText - ret - -.text_okay ; 0x4d3fe - ; Password OK. Select CONTINUE & reset settings. - text_jump UnknownText_0x1c55db - db "@" - -.text_wrong ; 0x4d403 - ; Wrong password! - text_jump UnknownText_0x1c560b - db "@" - -.text_askreset ; 0x4d408 - ; Reset the clock? - text_jump UnknownText_0x1c561c - db "@" - -.NoYes_MenuHeader: ; 0x4d40d - db 0 ; flags - menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .NoYes_MenuData - db 1 ; default option - -.NoYes_MenuData: ; 0x4d415 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "NO@" - db "YES@" - -ClockResetPassword: ; 4d41e - call .CalculatePassword - push de - ld hl, wStringBuffer2 - ld bc, 5 - xor a - call ByteFill - ld a, $4 - ld [wStringBuffer2 + 5], a - ld hl, .pleaseenterpasswordtext - call PrintText -.loop - call .updateIDdisplay -.loop2 - call JoyTextDelay - ld a, [hJoyLast] - ld b, a - and A_BUTTON - jr nz, .confirm - ld a, b - and D_PAD - jr z, .loop2 - call .dpadinput - ld c, 3 - call DelayFrames - jr .loop - -.confirm - call .ConvertDecIDToBytes - pop de - ld a, e - cp l - jr nz, .nope - ld a, d - cp h - jr nz, .nope - and a - ret - -.nope - scf - ret - -.pleaseenterpasswordtext ; 0x4d463 - ; Please enter the password. - text_jump UnknownText_0x1c562e - db "@" - -.updateIDdisplay ; 4d468 - hlcoord 14, 15 - ld de, wStringBuffer2 - ld c, 5 -.loop3 - ld a, [de] - add "0" - ld [hli], a - inc de - dec c - jr nz, .loop3 - hlcoord 14, 16 - ld bc, 5 - ld a, " " - call ByteFill - hlcoord 14, 16 - ld a, [wStringBuffer2 + 5] - ld e, a - ld d, $0 - add hl, de - ld [hl], "▲" - ret - -.dpadinput ; 4d490 - ld a, b - and D_LEFT - jr nz, .left - ld a, b - and D_RIGHT - jr nz, .right - ld a, b - and D_UP - jr nz, .up - ld a, b - and D_DOWN - jr nz, .down - ret - -.left - ld a, [wStringBuffer2 + 5] - and a - ret z - dec a - ld [wStringBuffer2 + 5], a - ret - -.right - ld a, [wStringBuffer2 + 5] - cp $4 - ret z - inc a - ld [wStringBuffer2 + 5], a - ret - -.up - call .getcurrentdigit - ld a, [hl] - cp 9 - jr z, .wraparound_up - inc a - ld [hl], a - ret - -.wraparound_up - ld [hl], $0 - ret - -.down - call .getcurrentdigit - ld a, [hl] - and a - jr z, .wraparound_down - dec a - ld [hl], a - ret - -.wraparound_down - ld [hl], 9 - ret - -.getcurrentdigit ; 4d4d5 - ld a, [wStringBuffer2 + 5] - ld e, a - ld d, $0 - ld hl, wStringBuffer2 - add hl, de - ret - -.ConvertDecIDToBytes: ; 4d4e0 - ld hl, 0 - ld de, wStringBuffer2 + 4 - ld bc, 1 - call .ConvertToBytes - ld bc, 10 - call .ConvertToBytes - ld bc, 100 - call .ConvertToBytes - ld bc, 1000 - call .ConvertToBytes - ld bc, 10000 -.ConvertToBytes: ; 4d501 - ld a, [de] - dec de - push hl - ld hl, 0 - call AddNTimes - ld c, l - ld b, h - pop hl - add hl, bc - ret - -.CalculatePassword: ; 4d50f - ld a, BANK(sPlayerData) - call GetSRAMBank - ld de, 0 - ld hl, sPlayerData + (wPlayerID - wPlayerData) - ld c, $2 - call .ComponentFromNumber - ld hl, sPlayerData + (wPlayerName - wPlayerData) - ld c, NAME_LENGTH_JAPANESE - 1 - call .ComponentFromString - ld hl, sPlayerData + (wMoney - wPlayerData) - ld c, $3 - call .ComponentFromNumber - call CloseSRAM - ret - -.ComponentFromNumber: ; 4d533 - ld a, [hli] - add e - ld e, a - ld a, $0 - adc d - ld d, a - dec c - jr nz, .ComponentFromNumber - ret - -.ComponentFromString: ; 4d53e - ld a, [hli] - cp "@" - ret z - add e - ld e, a - ld a, $0 - adc d - ld d, a - dec c - jr nz, .ComponentFromString - ret - -_DeleteSaveData: ; 4d54c - farcall BlankScreen - ld b, SCGB_DIPLOMA - call GetSGBLayout - call LoadStandardFont - call LoadFontsExtra - ld de, MUSIC_MAIN_MENU - call PlayMusic - ld hl, .Text_ClearAllSaveData - call PrintText - ld hl, .NoYesMenuHeader - call CopyMenuHeader - call VerticalMenu - ret c - ld a, [wMenuCursorY] - cp $1 - ret z - farcall EmptyAllSRAMBanks - ret - -.Text_ClearAllSaveData: ; 0x4d580 - ; Clear all save data? - text_jump UnknownText_0x1c564a - db "@" - -.NoYesMenuHeader: ; 0x4d585 - db 0 ; flags - menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option - -.MenuData: ; 0x4d58d - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "NO@" - db "YES@" diff --git a/engine/menu/main_menu.asm b/engine/menu/main_menu.asm deleted file mode 100755 index d83ce873b..000000000 --- a/engine/menu/main_menu.asm +++ /dev/null @@ -1,361 +0,0 @@ -GFX_49c0c: ; 49c0c -INCBIN "gfx/unknown/049c0c.2bpp" -; 49cdc - -MainMenu: ; 49cdc - xor a - ld [wDisableTextAcceleration], a - call Function49ed0 - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - ld hl, wGameTimerPause - res GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] - call MainMenu_GetWhichMenu - ld [wWhichIndexSet], a - call MainMenu_PrintCurrentTimeAndDay - ld hl, .MenuHeader - call LoadMenuHeader - call MainMenuJoypadLoop - call CloseWindow - jr c, .quit - call ClearTileMap - ld a, [wMenuSelection] - ld hl, .Jumptable - rst JumpTable - jr MainMenu - -.quit - ret -; 49d14 - -.MenuHeader: ; 49d14 - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, 16, 7 - dw .MenuData - db 1 ; default option -; 49d1c - -.MenuData: ; 49d1c - db STATICMENU_CURSOR ; flags - db 0 ; items - dw MainMenuItems - dw PlaceMenuStrings - dw .Strings -; 49d20 - -.Strings: ; 49d24 - db "CONTINUE@" - db "NEW GAME@" - db "OPTION@" - db "MYSTERY GIFT@" - db "MOBILE@" - db "MOBILE STUDIUM@" - -.Jumptable: ; 0x49d60 - dw MainMenu_Continue - dw MainMenu_NewGame - dw MainMenu_Options - dw MainMenu_MysteryGift - dw MainMenu_Mobile - dw MainMenu_MobileStudium -; 0x49d6c - -CONTINUE EQU 0 -NEW_GAME EQU 1 -OPTION EQU 2 -MYSTERY_GIFT EQU 3 -MOBILE EQU 4 -MOBILE_STUDIUM EQU 5 - -MainMenuItems: - -NewGameMenu: ; 0x49d6c - db 2 - db NEW_GAME - db OPTION - db -1 - -ContinueMenu: ; 0x49d70 - db 3 - db CONTINUE - db NEW_GAME - db OPTION - db -1 - -MobileMysteryMenu: ; 0x49d75 - db 5 - db CONTINUE - db NEW_GAME - db OPTION - db MYSTERY_GIFT - db MOBILE - db -1 - -MobileMenu: ; 0x49d7c - db 4 - db CONTINUE - db NEW_GAME - db OPTION - db MOBILE - db -1 - -MobileStudiumMenu: ; 0x49d82 - db 5 - db CONTINUE - db NEW_GAME - db OPTION - db MOBILE - db MOBILE_STUDIUM - db -1 - -MysteryMobileStudiumMenu: ; 0x49d89 - db 6 - db CONTINUE - db NEW_GAME - db OPTION - db MYSTERY_GIFT - db MOBILE - db MOBILE_STUDIUM - db -1 - -MysteryMenu: ; 0x49d91 - db 4 - db CONTINUE - db NEW_GAME - db OPTION - db MYSTERY_GIFT - db -1 - -MysteryStudiumMenu: ; 0x49d97 - db 5 - db CONTINUE - db NEW_GAME - db OPTION - db MYSTERY_GIFT - db MOBILE_STUDIUM - db -1 - -StudiumMenu: ; 0x49d9e - db 4 - db CONTINUE - db NEW_GAME - db OPTION - db MOBILE_STUDIUM - db -1 - - -MainMenu_GetWhichMenu: ; 49da4 - nop - nop - nop - ld a, [wSaveFileExists] - and a - jr nz, .next - ld a, $0 ; New Game - ret - -.next - ld a, [hCGB] - cp $1 - ld a, $1 - ret nz - ld a, BANK(sNumDailyMysteryGiftPartnerIDs) - call GetSRAMBank - ld a, [sNumDailyMysteryGiftPartnerIDs] - cp -1 - call CloseSRAM - jr nz, .mystery_gift - ; This check makes no difference. - ld a, [wStatusFlags] - bit STATUSFLAGS_MAIN_MENU_MOBILE_CHOICES_F, a - ld a, $1 ; Continue - jr z, .ok - jr .ok - -.ok - jr .ok2 - -.ok2 - ld a, $1 ; Continue - ret - -.mystery_gift - ; This check makes no difference. - ld a, [wStatusFlags] - bit STATUSFLAGS_MAIN_MENU_MOBILE_CHOICES_F, a - jr z, .ok3 - jr .ok3 - -.ok3 - jr .ok4 - -.ok4 - ld a, $6 ; Mystery Gift - ret -; 49de4 - -MainMenuJoypadLoop: ; 49de4 - call SetUpMenu -.loop - call MainMenu_PrintCurrentTimeAndDay - ld a, [w2DMenuFlags1] - set 5, a - ld [w2DMenuFlags1], a - call GetScrollingMenuJoypad - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .b_button - cp A_BUTTON - jr z, .a_button - jr .loop - -.a_button - call PlayClickSFX - and a - ret - -.b_button - scf - ret -; 49e09 - -MainMenu_PrintCurrentTimeAndDay: ; 49e09 - ld a, [wSaveFileExists] - and a - ret z - xor a - ld [hBGMapMode], a - call .PlaceBox - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call .PlaceTime - pop af - ld [wOptions], a - ld a, $1 - ld [hBGMapMode], a - ret -; 49e27 - - -.PlaceBox: ; 49e27 - call CheckRTCStatus - and $80 - jr nz, .TimeFail - hlcoord 0, 14 - ld b, 2 - ld c, 18 - call TextBox - ret - -.TimeFail: - call SpeechTextBox - ret -; 49e3d - - -.PlaceTime: ; 49e3d - ld a, [wSaveFileExists] - and a - ret z - call CheckRTCStatus - and $80 - jp nz, .PrintTimeNotSet - call UpdateTime - call GetWeekday - ld b, a - decoord 1, 15 - call .PlaceCurrentDay - decoord 4, 16 - ld a, [hHours] - ld c, a - farcall PrintHour - ld [hl], ":" - inc hl - ld de, hMinutes - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ret - -.min -; unused - db "min.@" -; 49e75 - -.PrintTimeNotSet: ; 49e75 - hlcoord 1, 14 - ld de, .TimeNotSet - call PlaceString - ret -; 49e7f - -.TimeNotSet: ; 49e7f - db "TIME NOT SET@" -; 49e8c - -.UnusedText: ; 49e8c - ; Clock time unknown - text_jump UnknownText_0x1c5182 - db "@" -; 49e91 - -.PlaceCurrentDay: ; 49e91 - push de - ld hl, .Days - ld a, b - call GetNthString - ld d, h - ld e, l - pop hl - call PlaceString - ld h, b - ld l, c - ld de, .Day - call PlaceString - ret -; 49ea8 - -.Days: - db "SUN@" - db "MON@" - db "TUES@" - db "WEDNES@" - db "THURS@" - db "FRI@" - db "SATUR@" -.Day: - db "DAY@" -; 49ed0 - -Function49ed0: ; 49ed0 - xor a - ld [hMapAnims], a - call ClearTileMap - call LoadFontsExtra - call LoadStandardFont - call ClearWindowData - ret -; 49ee0 - - -MainMenu_NewGame: ; 49ee0 - farcall NewGame - ret -; 49ee7 - -MainMenu_Options: ; 49ee7 - farcall OptionsMenu - ret -; 49eee - -MainMenu_Continue: ; 49eee - farcall Continue - ret -; 49ef5 - -MainMenu_MysteryGift: ; 49ef5 - farcall MysteryGift - ret -; 49efc diff --git a/engine/menu/mart.asm b/engine/menu/mart.asm deleted file mode 100755 index 911251f65..000000000 --- a/engine/menu/mart.asm +++ /dev/null @@ -1,970 +0,0 @@ - const_def - const MARTTEXT_HOW_MANY - const MARTTEXT_COSTS_THIS_MUCH - const MARTTEXT_NOT_ENOUGH_MONEY - const MARTTEXT_BAG_FULL - const MARTTEXT_HERE_YOU_GO - const MARTTEXT_SOLD_OUT - -OpenMartDialog:: ; 15a45 - call GetMart - ld a, c - ld [wEngineBuffer1], a - call LoadMartPointer - ld a, [wEngineBuffer1] - ld hl, .dialogs - rst JumpTable - ret -; 15a57 - -.dialogs - dw MartDialog - dw HerbShop - dw BargainShop - dw Pharmacist - dw RooftopSale -; 15a61 - -MartDialog: ; 15a61 - ld a, 0 - ld [wEngineBuffer1], a - xor a - ld [wEngineBuffer5], a - call StandardMart - ret -; 15a6e - -HerbShop: ; 15a6e - call FarReadMart - call LoadStandardMenuHeader - ld hl, Text_HerbShop_Intro - call MartTextBox - call BuyMenu - ld hl, Text_HerbShop_ComeAgain - call MartTextBox - ret -; 15a84 - -BargainShop: ; 15a84 - ld b, BANK(BargainShopData) - ld de, BargainShopData - call LoadMartPointer - call ReadMart - call LoadStandardMenuHeader - ld hl, Text_BargainShop_Intro - call MartTextBox - call BuyMenu - ld hl, wBargainShopFlags - ld a, [hli] - or [hl] - jr z, .skip_set - ld hl, wDailyFlags - set DAILYFLAGS_GOLDENROD_UNDERGROUND_BARGAIN_F, [hl] - -.skip_set - ld hl, Text_BargainShop_ComeAgain - call MartTextBox - ret -; 15aae - -Pharmacist: ; 15aae - call FarReadMart - call LoadStandardMenuHeader - ld hl, Text_Pharmacist_Intro - call MartTextBox - call BuyMenu - ld hl, Text_Pharmacist_ComeAgain - call MartTextBox - ret -; 15ac4 - -RooftopSale: ; 15ac4 - ld b, BANK(RooftopSaleMart1) - ld de, RooftopSaleMart1 - ld hl, wStatusFlags - bit STATUSFLAGS_HALL_OF_FAME_F, [hl] - jr z, .ok - ld b, BANK(RooftopSaleMart2) - ld de, RooftopSaleMart2 - -.ok - call LoadMartPointer - call ReadMart - call LoadStandardMenuHeader - ld hl, Text_Mart_HowMayIHelpYou - call MartTextBox - call BuyMenu - ld hl, Text_Mart_ComeAgain - call MartTextBox - ret -; 15aee - -INCLUDE "data/items/rooftop_sale.asm" - -LoadMartPointer: ; 15b10 - ld a, b - ld [wMartPointerBank], a - ld a, e - ld [wMartPointer], a - ld a, d - ld [wMartPointer + 1], a - ld hl, wCurMart - xor a - ld bc, 16 - call ByteFill - xor a - ld [wEngineBuffer5], a - ld [wBargainShopFlags], a - ld [wFacingDirection], a - ret -; 15b31 - -GetMart: ; 15b31 - ld a, e - cp (Marts.End - Marts) / 2 - jr c, .IsAMart - ld b, BANK(DefaultMart) - ld de, DefaultMart - ret - -.IsAMart: - ld hl, Marts - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld b, BANK(Marts) - ret -; 15b47 - -StandardMart: ; 15b47 -.loop - ld a, [wEngineBuffer5] - ld hl, .MartFunctions - rst JumpTable - ld [wEngineBuffer5], a - cp $ff - jr nz, .loop - ret - -.MartFunctions: - dw .HowMayIHelpYou - dw .TopMenu - dw .Buy - dw .Sell - dw .Quit - dw .AnythingElse -; 15b62 - -.HowMayIHelpYou: ; 15b62 - call LoadStandardMenuHeader - ld hl, Text_Mart_HowMayIHelpYou - call PrintText - ld a, $1 ; top menu - ret -; 15b6e - -.TopMenu: ; 15b6e - ld hl, MenuHeader_BuySell - call CopyMenuHeader - call VerticalMenu - jr c, .quit - ld a, [wMenuCursorY] - cp $1 - jr z, .buy - cp $2 - jr z, .sell -.quit - ld a, $4 ; Come again! - ret -.buy - ld a, $2 ; buy - ret -.sell - ld a, $3 ; sell - ret -; 15b8d - -.Buy: ; 15b8d - call ExitMenu - call FarReadMart - call BuyMenu - and a - ld a, $5 ; Anything else? - ret -; 15b9a - -.Sell: ; 15b9a - call ExitMenu - call SellMenu - ld a, $5 ; Anything else? - ret -; 15ba3 - -.Quit: ; 15ba3 - call ExitMenu - ld hl, Text_Mart_ComeAgain - call MartTextBox - ld a, $ff ; exit - ret -; 15baf - -.AnythingElse: ; 15baf - call LoadStandardMenuHeader - ld hl, Text_Mart_AnythingElse - call PrintText - ld a, $1 ; top menu - ret -; 15bbb - -FarReadMart: ; 15bbb - ld hl, wMartPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wCurMart -.CopyMart: - ld a, [wMartPointerBank] - call GetFarByte - ld [de], a - inc hl - inc de - cp -1 - jr nz, .CopyMart - ld hl, wMartItem1BCD - ld de, wCurMart + 1 -.ReadMartItem: - ld a, [de] - inc de - cp -1 - jr z, .done - push de - call GetMartItemPrice - pop de - jr .ReadMartItem - -.done - ret -; 15be5 - -GetMartItemPrice: ; 15be5 -; Return the price of item a in BCD at hl and in tiles at wStringBuffer1. - push hl - ld [wCurItem], a - farcall GetItemPrice - pop hl - -GetMartPrice: ; 15bf0 -; Return price de in BCD at hl and in tiles at wStringBuffer1. - push hl - ld a, d - ld [wStringBuffer2], a - ld a, e - ld [wStringBuffer2 + 1], a - ld hl, wStringBuffer1 - ld de, wStringBuffer2 - lb bc, PRINTNUM_LEADINGZEROS | 2, 6 ; 6 digits - call PrintNum - pop hl - - ld de, wStringBuffer1 - ld c, 6 / 2 ; 6 digits -.loop - call .CharToNybble - swap a - ld b, a - call .CharToNybble - or b - ld [hli], a - dec c - jr nz, .loop - ret -; 15c1a - -.CharToNybble: ; 15c1a - ld a, [de] - inc de - cp " " - jr nz, .not_space - ld a, "0" - -.not_space - sub "0" - ret -; 15c25 - -ReadMart: ; 15c25 -; Load the mart pointer. Mart data is local (no need for bank). - ld hl, wMartPointer - ld a, [hli] - ld h, [hl] - ld l, a - push hl -; set hl to the first item - inc hl - ld bc, wMartItem1BCD - ld de, wCurMart + 1 -.loop -; copy the item to wCurMart + (ItemIndex) - ld a, [hli] - ld [de], a - inc de -; -1 is the terminator - cp -1 - jr z, .done - - push de -; copy the price to de - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a -; convert the price to 3-byte BCD at [bc] - push hl - ld h, b - ld l, c - call GetMartPrice - ld b, h - ld c, l - pop hl - - pop de - jr .loop - -.done - pop hl - ld a, [hl] - ld [wCurMart], a - ret -; 15c51 - -INCLUDE "data/items/bargain_shop.asm" - - -BuyMenu: ; 15c62 - call FadeToMenu - farcall BlankScreen - xor a - ld [wMenuScrollPositionBackup], a - ld a, 1 - ld [wMenuCursorBufferBackup], a -.loop - call BuyMenuLoop ; menu loop - jr nc, .loop - call CloseSubmenu - ret -; 15c7d - -LoadBuyMenuText: ; 15c7d -; load text from a nested table -; which table is in wEngineBuffer1 -; which entry is in register a - push af - call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers - ld a, [hli] - ld h, [hl] - ld l, a - pop af - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call PrintText - ret -; 15c91 - -MartAskPurchaseQuantity: ; 15c91 - call GetMartDialogGroup ; gets a pointer from GetMartDialogGroup.MartTextFunctionPointers - inc hl - inc hl - ld a, [hl] - and a - jp z, StandardMartAskPurchaseQuantity - cp 1 - jp z, BargainShopAskPurchaseQuantity - jp RooftopSaleAskPurchaseQuantity -; 15ca3 - -GetMartDialogGroup: ; 15ca3 - ld a, [wEngineBuffer1] - ld e, a - ld d, 0 - ld hl, .MartTextFunctionPointers - add hl, de - add hl, de - add hl, de - ret -; 15cb0 - -.MartTextFunctionPointers: ; 15cb0 - dwb .StandardMartPointers, 0 - dwb .HerbShopPointers, 0 - dwb .BargainShopPointers, 1 - dwb .PharmacyPointers, 0 - dwb .StandardMartPointers, 2 -; 15cbf - -.StandardMartPointers: ; 15cbf - dw Text_Mart_HowMany - dw Text_Mart_CostsThisMuch - dw Text_Mart_InsufficientFunds - dw Text_Mart_BagFull - dw Text_Mart_HereYouGo - dw BuyMenuLoop - -.HerbShopPointers: ; 15ccb - dw Text_HerbShop_HowMany - dw Text_HerbShop_CostsThisMuch - dw Text_HerbShop_InsufficientFunds - dw Text_HerbShop_BagFull - dw Text_HerbShop_HereYouGo - dw BuyMenuLoop - -.BargainShopPointers: ; 15cd7 - dw BuyMenuLoop - dw Text_BargainShop_CostsThisMuch - dw Text_BargainShop_InsufficientFunds - dw Text_BargainShop_BagFull - dw Text_BargainShop_HereYouGo - dw Text_BargainShop_SoldOut - -.PharmacyPointers: ; 15ce3 - dw Text_Pharmacy_HowMany - dw Text_Pharmacy_CostsThisMuch - dw Text_Pharmacy_InsufficientFunds - dw Text_Pharmacy_BagFull - dw Text_Pharmacy_HereYouGo - dw BuyMenuLoop -; 15cef - - -BuyMenuLoop: ; 15cef - farcall PlaceMoneyTopRight - call UpdateSprites - ld hl, MenuHeader_Buy - call CopyMenuHeader - ld a, [wMenuCursorBufferBackup] - ld [wMenuCursorBuffer], a - ld a, [wMenuScrollPositionBackup] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wMenuScrollPositionBackup], a - ld a, [wMenuCursorY] - ld [wMenuCursorBufferBackup], a - call SpeechTextBox - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .set_carry - cp A_BUTTON - jr z, .useless_pointer - -.useless_pointer - call MartAskPurchaseQuantity - jr c, .cancel - call MartConfirmPurchase - jr c, .cancel - ld de, wMoney - ld bc, hMoneyTemp - ld a, $3 ; useless load - call CompareMoney - jr c, .insufficient_funds - ld hl, wNumItems - call ReceiveItem - jr nc, .insufficient_bag_space - ld a, [wMartItemID] - ld e, a - ld d, $0 - ld b, SET_FLAG - ld hl, wBargainShopFlags - call FlagAction - call PlayTransactionSound - ld de, wMoney - ld bc, hMoneyTemp - call TakeMoney - ld a, MARTTEXT_HERE_YOU_GO - call LoadBuyMenuText - call JoyWaitAorB - -.cancel - call SpeechTextBox - and a - ret - -.set_carry - scf - ret - -.insufficient_bag_space - ld a, MARTTEXT_BAG_FULL - call LoadBuyMenuText - call JoyWaitAorB - and a - ret - -.insufficient_funds - ld a, MARTTEXT_NOT_ENOUGH_MONEY - call LoadBuyMenuText - call JoyWaitAorB - and a - ret -; 15d83 - -StandardMartAskPurchaseQuantity: - ld a, 99 - ld [wItemQuantityBuffer], a - ld a, MARTTEXT_HOW_MANY - call LoadBuyMenuText - farcall SelectQuantityToBuy - call ExitMenu - ret -; 15d97 - -MartConfirmPurchase: ; 15d97 - predef PartyMonItemName - ld a, MARTTEXT_COSTS_THIS_MUCH - call LoadBuyMenuText - call YesNoBox - ret -; 15da5 - -BargainShopAskPurchaseQuantity: - ld a, 1 - ld [wItemQuantityChangeBuffer], a - ld a, [wMartItemID] - ld e, a - ld d, $0 - ld b, CHECK_FLAG - ld hl, wBargainShopFlags - call FlagAction - ld a, c - and a - jr nz, .SoldOut - ld a, [wMartItemID] - ld e, a - ld d, $0 - ld hl, wMartPointer - ld a, [hli] - ld h, [hl] - ld l, a - inc hl - add hl, de - add hl, de - add hl, de - inc hl - ld a, [hli] - ld [hMoneyTemp + 2], a - ld a, [hl] - ld [hMoneyTemp + 1], a - xor a - ld [hMoneyTemp], a - and a - ret - -.SoldOut: - ld a, MARTTEXT_SOLD_OUT - call LoadBuyMenuText - call JoyWaitAorB - scf - ret -; 15de2 - -RooftopSaleAskPurchaseQuantity: - ld a, MARTTEXT_HOW_MANY - call LoadBuyMenuText - call .GetSalePrice - ld a, 99 - ld [wItemQuantityBuffer], a - farcall RooftopSale_SelectQuantityToBuy - call ExitMenu - ret -; 15df9 - -.GetSalePrice: ; 15df9 - ld a, [wMartItemID] - ld e, a - ld d, 0 - ld hl, wMartPointer - ld a, [hli] - ld h, [hl] - ld l, a - inc hl - add hl, de - add hl, de - add hl, de - inc hl - ld e, [hl] - inc hl - ld d, [hl] - ret -; 15e0e - - -Text_Mart_HowMany: ; 0x15e0e - ; How many? - text_jump UnknownText_0x1c4bfd - db "@" -; 0x15e13 - -Text_Mart_CostsThisMuch: ; 0x15e13 - ; @ (S) will be ¥@ . - text_jump UnknownText_0x1c4c08 - db "@" -; 0x15e18 - -MenuHeader_Buy: ; 0x15e18 - db MENU_BACKUP_TILES ; flags - menu_coords 1, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x15e20 - -.MenuData ; 0x15e20 - db SCROLLINGMENU_DISPLAY_ARROWS | SCROLLINGMENU_ENABLE_FUNCTION3 ; flags - db 4, 8 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wCurMart - dba PlaceMenuItemName - dba .PrintBCDPrices - dba UpdateItemDescription -; 15e30 - -.PrintBCDPrices: ; 15e30 - ld a, [wScrollingMenuCursorPosition] - ld c, a - ld b, 0 - ld hl, wMartItem1BCD - add hl, bc - add hl, bc - add hl, bc - push de - ld d, h - ld e, l - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - ld c, PRINTNUM_LEADINGZEROS | PRINTNUM_MONEY | 3 - call PrintBCDNumber - ret -; 15e4a (5:5e4a) - -Text_HerbShop_Intro: ; 0x15e4a - ; Hello, dear. I sell inexpensive herbal medicine. They're good, but a trifle bitter. Your #MON may not like them. Hehehehe… - text_jump UnknownText_0x1c4c28 - db "@" -; 0x15e4f - -Text_HerbShop_HowMany: ; 0x15e4f - ; How many? - text_jump UnknownText_0x1c4ca3 - db "@" -; 0x15e54 - -Text_HerbShop_CostsThisMuch: ; 0x15e54 - ; @ (S) will be ¥@ . - text_jump UnknownText_0x1c4cae - db "@" -; 0x15e59 - -Text_HerbShop_HereYouGo: ; 0x15e59 - ; Thank you, dear. Hehehehe… - text_jump UnknownText_0x1c4cce - db "@" -; 0x15e5e - -Text_HerbShop_BagFull: ; 0x15e5e - ; Oh? Your PACK is full, dear. - text_jump UnknownText_0x1c4cea - db "@" -; 0x15e63 - -Text_HerbShop_InsufficientFunds: ; 0x15e63 - ; Hehehe… You don't have the money. - text_jump UnknownText_0x1c4d08 - db "@" -; 0x15e68 - -Text_HerbShop_ComeAgain: ; 0x15e68 - ; Come again, dear. Hehehehe… - text_jump UnknownText_0x1c4d2a - db "@" -; 0x15e6d - -Text_BargainShop_Intro: ; 0x15e6d - ; Hiya! Care to see some bargains? I sell rare items that nobody else carries--but only one of each item. - text_jump UnknownText_0x1c4d47 - db "@" -; 0x15e72 - -Text_BargainShop_CostsThisMuch: ; 0x15e72 - ; costs ¥@ . Want it? - text_jump UnknownText_0x1c4db0 - db "@" -; 0x15e77 - -Text_BargainShop_HereYouGo: ; 0x15e77 - ; Thanks. - text_jump UnknownText_0x1c4dcd - db "@" -; 0x15e7c - -Text_BargainShop_BagFull: ; 0x15e7c - ; Uh-oh, your PACK is chock-full. - text_jump UnknownText_0x1c4dd6 - db "@" -; 0x15e81 - -Text_BargainShop_SoldOut: ; 0x15e81 - ; You bought that already. I'm all sold out of it. - text_jump UnknownText_0x1c4df7 - db "@" -; 0x15e86 - -Text_BargainShop_InsufficientFunds: ; 0x15e86 - ; Uh-oh, you're short on funds. - text_jump UnknownText_0x1c4e28 - db "@" -; 0x15e8b - -Text_BargainShop_ComeAgain: ; 0x15e8b - ; Come by again sometime. - text_jump UnknownText_0x1c4e46 - db "@" -; 0x15e90 - -Text_Pharmacist_Intro: ; 0x15e90 - ; What's up? Need some medicine? - text_jump UnknownText_0x1c4e5f - db "@" -; 0x15e95 - -Text_Pharmacy_HowMany: ; 0x15e95 - ; How many? - text_jump UnknownText_0x1c4e7e - db "@" -; 0x15e9a - -Text_Pharmacy_CostsThisMuch: ; 0x15e9a - ; @ (S) will cost ¥@ . - text_jump UnknownText_0x1c4e89 - db "@" -; 0x15e9f - -Text_Pharmacy_HereYouGo: ; 0x15e9f - ; Thanks much! - text_jump UnknownText_0x1c4eab - db "@" -; 0x15ea4 - -Text_Pharmacy_BagFull: ; 0x15ea4 - ; You don't have any more space. - text_jump UnknownText_0x1c4eb9 - db "@" -; 0x15ea9 - -Text_Pharmacy_InsufficientFunds: ; 0x15ea9 - ; Huh? That's not enough money. - text_jump UnknownText_0x1c4ed8 - db "@" -; 0x15eae - -Text_Pharmacist_ComeAgain: ; 0x15eae - ; All right. See you around. - text_jump UnknownText_0x1c4ef6 - db "@" -; 0x15eb3 - - -SellMenu: ; 15eb3 - call DisableSpriteUpdates - farcall DepositSellInitPackBuffers -.loop - farcall DepositSellPack - ld a, [wPackUsedItem] - and a - jp z, .quit - call .TryToSellItem - jr .loop - -.quit - call ReturnToMapWithSpeechTextbox - and a - ret -; 15ed3 - -.Unreferenced_NothingToSell: - ld hl, .NothingToSellText - call MenuTextBoxBackup - and a - ret -; 15edb - -.NothingToSellText: ; 0x15edb - ; You don't have anything to sell. - text_jump UnknownText_0x1c4f12 - db "@" -; 0x15ee0 - - -.TryToSellItem: ; 15ee0 - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - ld hl, .dw - rst JumpTable - ret -; 15eee - -.dw ; 15eee - dw .try_sell - dw .cant_buy - dw .cant_buy - dw .cant_buy - dw .try_sell - dw .try_sell - dw .try_sell -; 15efc - -.cant_buy ; 15efc - ret -; 15efd - - -.try_sell ; 15efd - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr z, .okay_to_sell - ld hl, TextMart_CantBuyFromYou - call PrintText - and a - ret - -.okay_to_sell - ld hl, Text_Mart_SellHowMany - call PrintText - farcall PlaceMoneyAtTopLeftOfTextbox - farcall SelectQuantityToSell - call ExitMenu - jr c, .declined - hlcoord 1, 14 - lb bc, 3, 18 - call ClearBox - ld hl, Text_Mart_ICanPayThisMuch - call PrintTextBoxText - call YesNoBox - jr c, .declined - ld de, wMoney - ld bc, hMoneyTemp - call GiveMoney - ld a, [wMartItemID] - ld hl, wNumItems - call TossItem - predef PartyMonItemName - hlcoord 1, 14 - lb bc, 3, 18 - call ClearBox - ld hl, Text_Mart_SoldForAmount - call PrintTextBoxText - call PlayTransactionSound - farcall PlaceMoneyBottomLeft - call JoyWaitAorB - -.declined - call ExitMenu - and a - ret -; 15f73 - -Text_Mart_SellHowMany: ; 0x15f73 - ; How many? - text_jump UnknownText_0x1c4f33 - db "@" -; 0x15f78 - -Text_Mart_ICanPayThisMuch: ; 0x15f78 - ; I can pay you ¥@ . Is that OK? - text_jump UnknownText_0x1c4f3e - db "@" -; 0x15f7d - -.UnusedString15f7d: ; 15f7d - db "!ダミー!@" - -Text_Mart_HowMayIHelpYou: ; 0x15f83 - ; Welcome! How may I help you? - text_jump UnknownText_0x1c4f62 - db "@" -; 0x15f88 - -MenuHeader_BuySell: ; 0x15f88 - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, 7, 8 - dw .MenuData - db 1 ; default option -; 0x15f90 - -.MenuData ; 0x15f90 - db STATICMENU_CURSOR ; strings - db 3 ; items - db "BUY@" - db "SELL@" - db "QUIT@" -; 0x15f96 - -Text_Mart_HereYouGo: ; 0x15fa0 - ; Here you are. Thank you! - text_jump UnknownText_0x1c4f80 - db "@" -; 0x15fa5 - -Text_Mart_InsufficientFunds: ; 0x15fa5 - ; You don't have enough money. - text_jump UnknownText_0x1c4f9a - db "@" -; 0x15faa - -Text_Mart_BagFull: ; 0x15faa - ; You can't carry any more items. - text_jump UnknownText_0x1c4fb7 - db "@" -; 0x15faf - -TextMart_CantBuyFromYou: ; 0x15faf - ; Sorry, I can't buy that from you. - text_jump UnknownText_0x1c4fd7 - db "@" -; 0x15fb4 - -Text_Mart_ComeAgain: ; 0x15fb4 - ; Please come again! - text_jump UnknownText_0x1c4ff9 - db "@" -; 0x15fb9 - -Text_Mart_AnythingElse: ; 0x15fb9 - text_jump UnknownText_0x1c500d - db "@" -; 0x15fbe - -Text_Mart_SoldForAmount: ; 0x15fbe - text_jump UnknownText_0x1c502e - db "@" -; 0x15fc3 - -PlayTransactionSound: ; 15fc3 - call WaitSFX - ld de, SFX_TRANSACTION - call PlaySFX - ret -; 15fcd - -MartTextBox: ; 15fcd - call MenuTextBox - call JoyWaitAorB - call ExitMenu - ret -; 15fd7 diff --git a/engine/menu/menu.asm b/engine/menu/menu.asm deleted file mode 100755 index 51de2e1a4..000000000 --- a/engine/menu/menu.asm +++ /dev/null @@ -1,841 +0,0 @@ -_2DMenu_:: ; 2400e - ld hl, CopyMenuData - ld a, [wMenuData_2DMenuItemStringsBank] - rst FarCall - - call Draw2DMenu - call UpdateSprites - call ApplyTilemap - call Get2DMenuSelection - ret -; 24022 - -_InterpretBattleMenu:: ; 24022 - ld hl, CopyMenuData - ld a, [wMenuData_2DMenuItemStringsBank] - rst FarCall - - call Draw2DMenu - farcall MobileTextBorder - call UpdateSprites - call ApplyTilemap - call Get2DMenuSelection - ret -; 2403c - -_InterpretMobileMenu:: ; 2403c - ld hl, CopyMenuData - ld a, [wMenuData_2DMenuItemStringsBank] - rst FarCall - - call Draw2DMenu - farcall MobileTextBorder - call UpdateSprites - call ApplyTilemap - call Init2DMenuCursorPosition - ld hl, w2DMenuFlags1 - set 7, [hl] -.loop - call DelayFrame - farcall Function10032e - ld a, [wcd2b] - and a - jr nz, .quit - call MobileMenuJoypad - ld a, [wMenuJoypadFilter] - and c - jr z, .loop - call Mobile_GetMenuSelection - ret - -.quit - ld a, [w2DMenuNumCols] - ld c, a - ld a, [w2DMenuNumRows] - call SimpleMultiply - ld [wMenuCursorBuffer], a - and a - ret -; 24085 - - - -Draw2DMenu: ; 24085 - xor a - ld [hBGMapMode], a - call MenuBox - call Place2DMenuItemStrings - ret -; 2408f - -Get2DMenuSelection: ; 2408f - call Init2DMenuCursorPosition - call StaticMenuJoypad - call MenuClickSound -Mobile_GetMenuSelection: ; 24098 - ld a, [wMenuDataFlags] - bit 1, a - jr z, .skip - call GetMenuJoypad - bit SELECT_F, a - jr nz, .quit1 - -.skip - ld a, [wMenuDataFlags] - bit 0, a - jr nz, .skip2 - call GetMenuJoypad - bit B_BUTTON_F, a - jr nz, .quit2 - -.skip2 - ld a, [w2DMenuNumCols] - ld c, a - ld a, [wMenuCursorY] - dec a - call SimpleMultiply - ld c, a - ld a, [wMenuCursorX] - add c - ld [wMenuCursorBuffer], a - and a - ret - -.quit1 - scf - ret - -.quit2 - scf - ret -; 240cd - -Get2DMenuNumberOfColumns: ; 240cd - ld a, [wMenuData_2DMenuDimensions] - and $f - ret -; 240d3 - -Get2DMenuNumberOfRows: ; 240d3 - ld a, [wMenuData_2DMenuDimensions] - swap a - and $f - ret -; 240db - -Place2DMenuItemStrings: ; 240db - ld hl, wMenuData_2DMenuItemStringsAddr - ld e, [hl] - inc hl - ld d, [hl] - call GetMenuTextStartCoord - call Coord2Tile - call Get2DMenuNumberOfRows - ld b, a -.row - push bc - push hl - call Get2DMenuNumberOfColumns - ld c, a -.col - push bc - ld a, [wMenuData_2DMenuItemStringsBank] - call Place2DMenuItemName - inc de - ld a, [wMenuData_2DMenuSpacing] - ld c, a - ld b, 0 - add hl, bc - pop bc - dec c - jr nz, .col - pop hl - ld bc, 2 * SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ld hl, wMenuData_2DMenuFunctionAddr - ld a, [hli] - ld h, [hl] - ld l, a - or h - ret z - ld a, [wMenuData_2DMenuFunctionBank] - rst FarCall - ret -; 2411a - - -Init2DMenuCursorPosition: ; 2411a (9:411a) - call GetMenuTextStartCoord - ld a, b - ld [w2DMenuCursorInitY], a - dec c - ld a, c - ld [w2DMenuCursorInitX], a - call Get2DMenuNumberOfRows - ld [w2DMenuNumRows], a - call Get2DMenuNumberOfColumns - ld [w2DMenuNumCols], a - call .InitFlags_a - call .InitFlags_b - call .InitFlags_c - ld a, [w2DMenuNumCols] - ld e, a - ld a, [wMenuCursorBuffer] - ld b, a - xor a - ld d, 0 -.loop - inc d - add e - cp b - jr c, .loop - sub e - ld c, a - ld a, b - sub c - and a - jr z, .reset1 - cp e - jr z, .okay1 - jr c, .okay1 -.reset1 - ld a, 1 -.okay1 - ld [wMenuCursorX], a - ld a, [w2DMenuNumRows] - ld e, a - ld a, d - and a - jr z, .reset2 - cp e - jr z, .okay2 - jr c, .okay2 -.reset2 - ld a, 1 -.okay2 - ld [wMenuCursorY], a - xor a - ld [wCursorOffCharacter], a - ld [wCursorCurrentTile], a - ld [wCursorCurrentTile + 1], a - ret -; 24179 - -.InitFlags_a: ; 24179 - xor a - ld hl, w2DMenuFlags1 - ld [hli], a - ld [hld], a - ld a, [wMenuDataFlags] - bit 5, a - ret z - set 5, [hl] - set 4, [hl] - ret -; 2418a - -.InitFlags_b: ; 2418a - ld a, [wMenuData_2DMenuSpacing] - or $20 - ld [w2DMenuCursorOffsets], a - ret -; 24193 - -.InitFlags_c: ; 24193 - ld hl, wMenuDataFlags - ld a, A_BUTTON - bit 0, [hl] - jr nz, .skip - or B_BUTTON -.skip - bit 1, [hl] - jr z, .skip2 - or SELECT -.skip2 - ld [wMenuJoypadFilter], a - ret -; 241a8 - - -_StaticMenuJoypad:: ; 241a8 - call Place2DMenuCursor -_ScrollingMenuJoypad:: ; 241ab - ld hl, w2DMenuFlags2 - res 7, [hl] - ld a, [hBGMapMode] - push af - call MenuJoypadLoop - pop af - ld [hBGMapMode], a - ret -; 241ba - -MobileMenuJoypad: ; 241ba - ld hl, w2DMenuFlags2 - res 7, [hl] - ld a, [hBGMapMode] - push af - call Move2DMenuCursor - call Do2DMenuRTCJoypad - jr nc, .skip_joypad - call _2DMenuInterpretJoypad -.skip_joypad - pop af - ld [hBGMapMode], a - call GetMenuJoypad - ld c, a - ret -; 241d5 - - -Unreferenced_Function241d5: ; 241d5 - call Place2DMenuCursor -.loop - call Move2DMenuCursor - call HDMATransferTileMapToWRAMBank3 ; BUG: This function is in another bank. - ; Pointer in current bank (9) is bogus. - call .loop2 - jr nc, .done - call _2DMenuInterpretJoypad - jr c, .done - ld a, [w2DMenuFlags1] - bit 7, a - jr nz, .done - call GetMenuJoypad - ld c, a - ld a, [wMenuJoypadFilter] - and c - jr z, .loop - -.done - ret - -.loop2 - call Menu_WasButtonPressed - ret c - ld c, 1 - ld b, 3 - call AdvanceMobileInactivityTimerAndCheckExpired ; BUG: This function is in another bank. - ; Pointer in current bank (9) is bogus. - ret c - farcall Function100337 - ret c - ld a, [w2DMenuFlags1] - bit 7, a - jr z, .loop2 - and a - ret -; 24216 - - -MenuJoypadLoop: ; 24216 -.loop - call Move2DMenuCursor - call .BGMap_OAM - call Do2DMenuRTCJoypad - jr nc, .done - call _2DMenuInterpretJoypad - jr c, .done - ld a, [w2DMenuFlags1] - bit 7, a - jr nz, .done - call GetMenuJoypad - ld b, a - ld a, [wMenuJoypadFilter] - and b - jr z, .loop - -.done - ret -; 24238 - -.BGMap_OAM: ; 24238 - ld a, [hOAMUpdate] - push af - ld a, $1 - ld [hOAMUpdate], a - call WaitBGMap - pop af - ld [hOAMUpdate], a - xor a - ld [hBGMapMode], a - ret -; 24249 - -Do2DMenuRTCJoypad: ; 24249 -.loopRTC - call RTC - call Menu_WasButtonPressed - ret c - ld a, [w2DMenuFlags1] - bit 7, a - jr z, .loopRTC - and a - ret -; 24259 - -Menu_WasButtonPressed: ; 24259 - ld a, [w2DMenuFlags1] - bit 6, a - jr z, .skip_to_joypad - callfar PlaySpriteAnimationsAndDelayFrame - -.skip_to_joypad - call JoyTextDelay - call GetMenuJoypad - and a - ret z - scf - ret -; 24270 - -_2DMenuInterpretJoypad: ; 24270 - call GetMenuJoypad - bit A_BUTTON_F, a - jp nz, .a_b_start_select - bit B_BUTTON_F, a - jp nz, .a_b_start_select - bit SELECT_F, a - jp nz, .a_b_start_select - bit START_F, a - jp nz, .a_b_start_select - bit D_RIGHT_F, a - jr nz, .d_right - bit D_LEFT_F, a - jr nz, .d_left - bit D_UP_F, a - jr nz, .d_up - bit D_DOWN_F, a - jr nz, .d_down - and a - ret - -.set_bit_7 ; 24299 - ld hl, w2DMenuFlags2 - set 7, [hl] - scf - ret - -.d_down - ld hl, wMenuCursorY - ld a, [w2DMenuNumRows] - cp [hl] - jr z, .check_wrap_around_down - inc [hl] - xor a - ret - -.check_wrap_around_down - ld a, [w2DMenuFlags1] - bit 5, a - jr nz, .wrap_around_down - bit 3, a - jp nz, .set_bit_7 - xor a - ret - -.wrap_around_down - ld [hl], $1 - xor a - ret - -.d_up - ld hl, wMenuCursorY - ld a, [hl] - dec a - jr z, .check_wrap_around_up - ld [hl], a - xor a - ret - -.check_wrap_around_up - ld a, [w2DMenuFlags1] - bit 5, a - jr nz, .wrap_around_up - bit 2, a - jp nz, .set_bit_7 - xor a - ret - -.wrap_around_up - ld a, [w2DMenuNumRows] - ld [hl], a - xor a - ret - -.d_left - ld hl, wMenuCursorX - ld a, [hl] - dec a - jr z, .check_wrap_around_left - ld [hl], a - xor a - ret - -.check_wrap_around_left - ld a, [w2DMenuFlags1] - bit 4, a - jr nz, .wrap_around_left - bit 1, a - jp nz, .set_bit_7 - xor a - ret - -.wrap_around_left - ld a, [w2DMenuNumCols] - ld [hl], a - xor a - ret - -.d_right - ld hl, wMenuCursorX - ld a, [w2DMenuNumCols] - cp [hl] - jr z, .check_wrap_around_right - inc [hl] - xor a - ret - -.check_wrap_around_right - ld a, [w2DMenuFlags1] - bit 4, a - jr nz, .wrap_around_right - bit 0, a - jp nz, .set_bit_7 - xor a - ret - -.wrap_around_right - ld [hl], $1 - xor a - ret -; 24318 - -.a_b_start_select ; 24318 - xor a - ret -; 2431a - -Move2DMenuCursor: ; 2431a - ld hl, wCursorCurrentTile - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [hl] - cp "▶" - jr nz, Place2DMenuCursor - ld a, [wCursorOffCharacter] - ld [hl], a -Place2DMenuCursor: ; 24329 - ld a, [w2DMenuCursorInitY] - ld b, a - ld a, [w2DMenuCursorInitX] - ld c, a - call Coord2Tile - ld a, [w2DMenuCursorOffsets] - swap a - and $f - ld c, a - ld a, [wMenuCursorY] - ld b, a - xor a - dec b - jr z, .got_row -.row_loop - add c - dec b - jr nz, .row_loop - -.got_row - ld c, SCREEN_WIDTH - call AddNTimes - ld a, [w2DMenuCursorOffsets] - and $f - ld c, a - ld a, [wMenuCursorX] - ld b, a - xor a - dec b - jr z, .got_col -.col_loop - add c - dec b - jr nz, .col_loop - -.got_col - ld c, a - add hl, bc - ld a, [hl] - cp "▶" - jr z, .cursor_on - ld [wCursorOffCharacter], a - ld [hl], "▶" - -.cursor_on - ld a, l - ld [wCursorCurrentTile], a - ld a, h - ld [wCursorCurrentTile + 1], a - ret -; 24374 - -_PushWindow:: ; 24374 - ld a, [rSVBK] - push af - ld a, BANK(wWindowStack) - ld [rSVBK], a - - ld hl, wWindowStackPointer - ld e, [hl] - inc hl - ld d, [hl] - push de - - ld b, $10 - ld hl, wMenuFlags -.loop - ld a, [hli] - ld [de], a - dec de - dec b - jr nz, .loop - -; If bit 6 or 7 of the menu flags is set, set bit 0 of the address -; at 7:[wWindowStackPointer], and draw the menu using the coordinates from the header. -; Otherwise, reset bit 0 of 7:[wWindowStackPointer]. - ld a, [wMenuFlags] - bit 6, a - jr nz, .bit_6 - bit 7, a - jr z, .not_bit_7 - -.bit_6 - ld hl, wWindowStackPointer - ld a, [hli] - ld h, [hl] - ld l, a - set 0, [hl] - call MenuBoxCoord2Tile - call .copy - call MenuBoxCoord2Attr - call .copy - jr .done - -.not_bit_7 - pop hl ; last-pushed register was de - push hl - ld a, [hld] - ld l, [hl] - ld h, a - res 0, [hl] - -.done - pop hl - call .ret ; empty function - ld a, h - ld [de], a - dec de - ld a, l - ld [de], a - dec de - ld hl, wWindowStackPointer - ld [hl], e - inc hl - ld [hl], d - - pop af - ld [rSVBK], a - ld hl, wWindowStackSize - inc [hl] - ret -; 243cd - -.copy ; 243cd - call GetMenuBoxDims - inc b - inc c - call .ret ; empty function - -.row - push bc - push hl - -.col - ld a, [hli] - ld [de], a - dec de - dec c - jr nz, .col - - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - - ret -; 243e7 - -.ret ; 243e7 - ret -; 243e8 - -_ExitMenu:: ; 243e8 - xor a - ld [hBGMapMode], a - - ld a, [rSVBK] - push af - ld a, BANK(wWindowStack) - ld [rSVBK], a - - call GetWindowStackTop - ld a, l - or h - jp z, Error_Cant_ExitMenu - ld a, l - ld [wWindowStackPointer], a - ld a, h - ld [wWindowStackPointer + 1], a - call PopWindow - ld a, [wMenuFlags] - bit 0, a - jr z, .loop - ld d, h - ld e, l - call RestoreTileBackup - -.loop - call GetWindowStackTop - ld a, h - or l - jr z, .done - call PopWindow - -.done - pop af - ld [rSVBK], a - ld hl, wWindowStackSize - dec [hl] - ret -; 24423 - -Unreferenced_Function24423: ; 24423 - ld a, [wVramState] - bit 0, a - ret z - xor a ; sScratch - call GetSRAMBank - hlcoord 0, 0 - ld de, sScratch - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - call CopyBytes - call CloseSRAM - call OverworldTextModeSwitch - xor a ; sScratch - call GetSRAMBank - ld hl, sScratch - decoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT -.loop - ld a, [hl] - cp $61 - jr c, .next - ld [de], a -.next - inc hl - inc de - dec bc - ld a, c - or b - jr nz, .loop - call CloseSRAM - ret -; 2445d - -Error_Cant_ExitMenu: ; 2445d - ld hl, .Text_NoWindowsAvailableForPopping - call PrintText - call WaitBGMap -.InfiniteLoop: - jr .InfiniteLoop -; 24468 - -.Text_NoWindowsAvailableForPopping: ; 24468 - text_jump UnknownText_0x1c46b7 - db "@" -; 2446d - -_InitVerticalMenuCursor:: ; 2446d - ld a, [wMenuDataFlags] - ld b, a - ld hl, w2DMenuCursorInitY - ld a, [wMenuBorderTopCoord] - inc a - bit 6, b - jr nz, .skip_offset - inc a -.skip_offset - ld [hli], a -; w2DMenuCursorInitX - ld a, [wMenuBorderLeftCoord] - inc a - ld [hli], a -; w2DMenuNumRows - ld a, [wMenuDataItems] - ld [hli], a -; w2DMenuNumCols - ld a, 1 - ld [hli], a -; w2DMenuFlags1 - ld [hl], $0 - bit 5, b - jr z, .skip_bit_5 - set 5, [hl] -.skip_bit_5 - ld a, [wMenuFlags] - bit 4, a - jr z, .skip_bit_6 - set 6, [hl] -.skip_bit_6 - inc hl -; w2DMenuFlags2 - xor a - ld [hli], a -; w2DMenuCursorOffsets - ln a, 2, 0 - ld [hli], a -; wMenuJoypadFilter - ld a, A_BUTTON - bit 0, b - jr nz, .skip_bit_1 - add B_BUTTON -.skip_bit_1 - ld [hli], a -; wMenuCursorY - ld a, [wMenuCursorBuffer] - and a - jr z, .load_at_the_top - ld c, a - ld a, [wMenuDataItems] - cp c - jr nc, .load_position -.load_at_the_top - ld c, 1 -.load_position - ld [hl], c - inc hl -; wMenuCursorX - ld a, 1 - ld [hli], a -; wCursorOffCharacter, wCursorCurrentTile - xor a - ld [hli], a - ld [hli], a - ld [hli], a - ret -; 244c3 diff --git a/engine/menu/menu_2.asm b/engine/menu/menu_2.asm deleted file mode 100644 index 16cce5348..000000000 --- a/engine/menu/menu_2.asm +++ /dev/null @@ -1,253 +0,0 @@ -PlaceMenuItemName: ; 0x24ab4 - push de - ld a, [wMenuSelection] - ld [wNamedObjectIndexBuffer], a - call GetItemName - pop hl - call PlaceString - ret - -PlaceMenuItemQuantity: ; 0x24ac3 - push de - ld a, [wMenuSelection] - ld [wCurItem], a - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - pop hl - and a - jr nz, .done - ld de, $15 - add hl, de - ld [hl], "×" - inc hl - ld de, wMenuSelectionQuantity - lb bc, 1, 2 - call PrintNum - -.done - ret - -PlaceMoneyTopRight: ; 24ae8 - ld hl, MenuHeader_0x24b15 - call CopyMenuHeader - jr PlaceMoneyTextBox - -PlaceMoneyBottomLeft: ; 24af0 - ld hl, MenuHeader_0x24b1d - call CopyMenuHeader - jr PlaceMoneyTextBox - -PlaceMoneyAtTopLeftOfTextbox: ; 24af8 - ld hl, MenuHeader_0x24b15 - lb de, 0, 11 - call OffsetMenuHeader - -PlaceMoneyTextBox: ; 24b01 - call MenuBox - call MenuBoxCoord2Tile - ld de, SCREEN_WIDTH + 1 - add hl, de - ld de, wMoney - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - ret - -MenuHeader_0x24b15: ; 0x24b15 - db MENU_BACKUP_TILES ; flags - menu_coords 11, 0, SCREEN_WIDTH - 1, 2 - dw NULL - db 1 ; default option - -MenuHeader_0x24b1d: ; 0x24b1d - db MENU_BACKUP_TILES ; flags - menu_coords 0, 11, 8, 13 - dw NULL - db 1 ; default option - -DisplayCoinCaseBalance: ; 24b25 - ; Place a text box of size 1x7 at 11, 0. - hlcoord 11, 0 - ld b, 1 - ld c, 7 - call TextBox - hlcoord 12, 0 - ld de, CoinString - call PlaceString - hlcoord 17, 1 - ld de, ShowMoney_TerminatorString - call PlaceString - ld de, wCoins - lb bc, 2, 4 - hlcoord 13, 1 - call PrintNum - ret - -DisplayMoneyAndCoinBalance: ; 24b4e - hlcoord 5, 0 - ld b, 3 - ld c, 13 - call TextBox - hlcoord 6, 1 - ld de, MoneyString - call PlaceString - hlcoord 12, 1 - ld de, wMoney - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - hlcoord 6, 3 - ld de, CoinString - call PlaceString - hlcoord 15, 3 - ld de, wCoins - lb bc, 2, 4 - call PrintNum - ret - -MoneyString: ; 24b83 - db "MONEY@" -CoinString: ; 24b89 - db "COIN@" -ShowMoney_TerminatorString: ; 24b8e - db "@" - -Unreferenced_Function24b8f: ; 24b8f -; related to safari? - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - hlcoord 0, 0 - ld b, 3 - ld c, 7 - call TextBox - hlcoord 1, 1 - ld de, wSafariTimeRemaining - lb bc, 2, 3 - call PrintNum - hlcoord 4, 1 - ld de, .slash_500 - call PlaceString - hlcoord 1, 3 - ld de, .booru_ko - call PlaceString - hlcoord 5, 3 - ld de, wSafariBallsRemaining - lb bc, 1, 2 - call PrintNum - pop af - ld [wOptions], a - ret - -.slash_500 ; 24bcf - db "/500@" -.booru_ko ; 24bd4 - db "ボール   こ@" - -StartMenu_DrawBugContestStatusBox: ; 24bdc - hlcoord 0, 0 - ld b, 5 - ld c, 17 - call TextBox - ret - -StartMenu_PrintBugContestStatus: ; 24be7 - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call StartMenu_DrawBugContestStatusBox - hlcoord 1, 5 - ld de, .Balls_EN - call PlaceString - hlcoord 8, 5 - ld de, wParkBallsRemaining - lb bc, PRINTNUM_RIGHTALIGN | 1, 2 - call PrintNum - hlcoord 1, 1 - ld de, .CAUGHT - call PlaceString - ld a, [wContestMon] - and a - ld de, .None - jr z, .no_contest_mon - ld [wd265], a - call GetPokemonName - -.no_contest_mon - hlcoord 8, 1 - call PlaceString - ld a, [wContestMon] - and a - jr z, .skip_level - hlcoord 1, 3 - ld de, .LEVEL - call PlaceString - ld a, [wContestMonLevel] - ld h, b - ld l, c - inc hl - ld c, 3 - call Print8BitNumRightAlign - -.skip_level - pop af - ld [wOptions], a - ret - -.Balls_JP: ; 24c43 - db "ボール   こ@" -.CAUGHT: ; 24c4b - db "CAUGHT@" -.Balls_EN: ; 24c52 - db "BALLS:@" -.None: ; 24c59 - db "None@" -.LEVEL: ; 24c5e - db "LEVEL@" - -FindApricornsInBag: ; 24c64 -; Checks the bag for Apricorns. - ld hl, wBuffer1 - xor a - ld [hli], a - dec a - ld bc, 10 - call ByteFill - - ld hl, ApricornBalls -.loop - ld a, [hl] - cp -1 - jr z, .done - push hl - ld [wCurItem], a - ld hl, wNumItems - call CheckItem - pop hl - jr nc, .nope - ld a, [hl] - call .addtobuffer -.nope - inc hl - inc hl - jr .loop - -.done - ld a, [wBuffer1] - and a - ret nz - scf - ret - -.addtobuffer ; 24c94 - push hl - ld hl, wBuffer1 - inc [hl] - ld e, [hl] - ld d, 0 - add hl, de - ld [hl], a - pop hl - ret - -INCLUDE "data/items/apricorn_balls.asm" diff --git a/engine/menu/mon_menu.asm b/engine/menu/mon_menu.asm deleted file mode 100755 index 088b1b1a3..000000000 --- a/engine/menu/mon_menu.asm +++ /dev/null @@ -1,304 +0,0 @@ -INCLUDE "data/mon_menu.asm" - -MonSubmenu: ; 24d19 - xor a - ld [hBGMapMode], a - call GetMonSubmenuItems - farcall FreezeMonIcons - ld hl, .MenuHeader - call LoadMenuHeader - call .GetTopCoord - call PopulateMonMenu - - ld a, 1 - ld [hBGMapMode], a - call MonMenuLoop - ld [wMenuSelection], a - - call ExitMenu - ret -; 24d3f - -.MenuHeader: ; 24d3f - db MENU_BACKUP_TILES ; flags - menu_coords 6, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw 0 - db 1 ; default option -; 24d47 - -.GetTopCoord: ; 24d47 -; TopCoord = 1 + BottomCoord - 2 * (NumSubmenuItems + 1) - ld a, [wBuffer1] - inc a - add a - ld b, a - ld a, [wMenuBorderBottomCoord] - sub b - inc a - ld [wMenuBorderTopCoord], a - call MenuBox - ret -; 24d59 - -MonMenuLoop: ; 24d59 -.loop - ld a, MENU_UNUSED_3 | MENU_BACKUP_TILES_2 ; flags - ld [wMenuDataFlags], a - ld a, [wBuffer1] ; items - ld [wMenuDataItems], a - call InitVerticalMenuCursor - ld hl, w2DMenuFlags1 - set 6, [hl] - call StaticMenuJoypad - ld de, SFX_READ_TEXT_2 - call PlaySFX - ld a, [hJoyPressed] - bit A_BUTTON_F, a - jr nz, .select - bit B_BUTTON_F, a - jr nz, .cancel - jr .loop - -.cancel - ld a, MONMENUITEM_CANCEL - ret - -.select - ld a, [wMenuCursorY] - dec a - ld c, a - ld b, 0 - ld hl, wBuffer2 - add hl, bc - ld a, [hl] - ret -; 24d91 - -PopulateMonMenu: ; 24d91 - call MenuBoxCoord2Tile - ld bc, 2 * SCREEN_WIDTH + 2 - add hl, bc - ld de, wBuffer2 -.loop - ld a, [de] - inc de - cp -1 - ret z - push de - push hl - call GetMonMenuString - pop hl - call PlaceString - ld bc, 2 * SCREEN_WIDTH - add hl, bc - pop de - jr .loop -; 24db0 - -GetMonMenuString: ; 24db0 - ld hl, MonMenuOptions + 1 - ld de, 3 - call IsInArray - dec hl - ld a, [hli] - cp MONMENU_MENUOPTION - jr z, .NotMove - inc hl - ld a, [hl] - ld [wd265], a - call GetMoveName - ret - -.NotMove: - inc hl - ld a, [hl] - dec a - ld hl, MonMenuOptionStrings - call GetNthString - ld d, h - ld e, l - ret -; 24dd4 - -GetMonSubmenuItems: ; 24dd4 - call ResetMonSubmenu - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - ld a, [wLinkMode] - and a - jr nz, .skip_moves - ld a, MON_MOVES - call GetPartyParamLocation - ld d, h - ld e, l - ld c, NUM_MOVES -.loop - push bc - push de - ld a, [de] - and a - jr z, .next - push hl - call IsFieldMove - pop hl - jr nc, .next - call AddMonMenuItem - -.next - pop de - inc de - pop bc - dec c - jr nz, .loop - -.skip_moves - ld a, MONMENUITEM_STATS - call AddMonMenuItem - ld a, MONMENUITEM_SWITCH - call AddMonMenuItem - ld a, MONMENUITEM_MOVE - call AddMonMenuItem - ld a, [wLinkMode] - and a - jr nz, .skip2 - push hl - ld a, MON_ITEM - call GetPartyParamLocation - ld d, [hl] - farcall ItemIsMail - pop hl - ld a, MONMENUITEM_MAIL - jr c, .ok - ld a, MONMENUITEM_ITEM - -.ok - call AddMonMenuItem - -.skip2 - ld a, [wBuffer1] - cp NUM_MONMENU_ITEMS - jr z, .ok2 - ld a, MONMENUITEM_CANCEL - call AddMonMenuItem - -.ok2 - call TerminateMonSubmenu - ret - -.egg - ld a, MONMENUITEM_STATS - call AddMonMenuItem - ld a, MONMENUITEM_SWITCH - call AddMonMenuItem - ld a, MONMENUITEM_CANCEL - call AddMonMenuItem - call TerminateMonSubmenu - ret -; 24e52 - -IsFieldMove: ; 24e52 - ld b, a - ld hl, MonMenuOptions -.next - ld a, [hli] - cp -1 - jr z, .nope - cp MONMENU_MENUOPTION - jr z, .nope - ld d, [hl] - inc hl - ld a, [hli] - cp b - jr nz, .next - ld a, d - scf - -.nope - ret -; 24e68 - -ResetMonSubmenu: ; 24e68 - xor a - ld [wBuffer1], a - ld hl, wBuffer2 - ld bc, NUM_MONMENU_ITEMS + 1 - call ByteFill - ret -; 24e76 - -TerminateMonSubmenu: ; 24e76 - ld a, [wBuffer1] - ld e, a - ld d, 0 - ld hl, wBuffer2 - add hl, de - ld [hl], -1 - ret -; 24e83 - -AddMonMenuItem: ; 24e83 - push hl - push de - push af - ld a, [wBuffer1] - ld e, a - inc a - ld [wBuffer1], a - ld d, 0 - ld hl, wBuffer2 - add hl, de - pop af - ld [hl], a - pop de - pop hl - ret -; 24e99 - -BattleMonMenu: ; 24e99 - ld hl, MenuHeader_0x24ed4 - call CopyMenuHeader - xor a - ld [hBGMapMode], a - call MenuBox - call UpdateSprites - call PlaceVerticalMenuItems - call WaitBGMap - call CopyMenuData - ld a, [wMenuDataFlags] - bit 7, a - jr z, .set_carry - call InitVerticalMenuCursor - ld hl, w2DMenuFlags1 - set 6, [hl] - call StaticMenuJoypad - ld de, SFX_READ_TEXT_2 - call PlaySFX - ld a, [hJoyPressed] - bit B_BUTTON_F, a - jr z, .clear_carry - ret z - -.set_carry - scf - ret - -.clear_carry - and a - ret -; 24ed4 - -MenuHeader_0x24ed4: ; 24ed4 - db 0 ; flags - menu_coords 11, 11, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw MenuData_0x24edc - db 1 ; default option -; 24edc - -MenuData_0x24edc: ; 24edc - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 3 ; items - db "SWITCH@" - db "STATS@" - db "CANCEL@" -; 24ef2 diff --git a/engine/menu/naming_screen.asm b/engine/menu/naming_screen.asm deleted file mode 100755 index a958e10eb..000000000 --- a/engine/menu/naming_screen.asm +++ /dev/null @@ -1,1467 +0,0 @@ -NAMINGSCREEN_CURSOR EQU $7e - -NAMINGSCREEN_BORDER EQUS "\"■\"" ; $60 -NAMINGSCREEN_MIDDLELINE EQUS "\"→\"" ; $eb -NAMINGSCREEN_UNDERLINE EQUS "\"\"" ; $f2 - -_NamingScreen: ; 0x116b7 - call DisableSpriteUpdates - call NamingScreen - call ReturnToMapWithSpeechTextbox - ret - -; 0x116c1 - -NamingScreen: ; 116c1 - ld hl, wNamingScreenDestinationPointer - ld [hl], e - inc hl - ld [hl], d - ld hl, wNamingScreenType - ld [hl], b - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - call .SetUpNamingScreen - call DelayFrame -.loop - call NamingScreenJoypadLoop - jr nc, .loop - pop af - ld [hInMenu], a - pop af - ld [hMapAnims], a - pop af - ld [wOptions], a - call ClearJoypad - ret - -; 116f8 - -.SetUpNamingScreen: ; 116f8 - call ClearBGPalettes - ld b, SCGB_DIPLOMA - call GetSGBLayout - call DisableLCD - call LoadNamingScreenGFX - call NamingScreen_InitText - ld a, LCDC_DEFAULT - ld [rLCDC], a - call .GetNamingScreenSetup - call WaitBGMap - call WaitTop - call SetPalettes - call NamingScreen_InitNameEntry - ret - -; 1171d - -.GetNamingScreenSetup: ; 1171d - ld a, [wNamingScreenType] - and 7 - 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 - -; 1172e - -.Jumptable: ; 1172e (4:572e) - dw .Pokemon - dw .Player - dw .Rival - dw .Mom - dw .Box - dw .Tomodachi - dw .Pokemon - dw .Pokemon - -.Pokemon: ; 1173e (4:573e) - ld a, [wCurPartySpecies] - ld [wd265], a - ld hl, LoadMenuMonIcon - ld a, BANK(LoadMenuMonIcon) - ld e, $1 - rst FarCall ; ; indirect jump to LoadMenuMonIcon (8e83f (23:683f)) - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - hlcoord 5, 2 - call PlaceString - ld l, c - ld h, b - ld de, .NicknameStrings - call PlaceString - inc de - hlcoord 5, 4 - call PlaceString - farcall GetGender - jr c, .genderless - ld a, "♂" - jr nz, .place_gender - ld a, "♀" -.place_gender - hlcoord 1, 2 - ld [hl], a -.genderless - call .StoreMonIconParams - ret - -; 11780 (4:5780) - -.NicknameStrings: ; 11780 - db "'S@" - db "NICKNAME?@" - -; 1178d - -.Player: ; 1178d (4:578d) - farcall GetPlayerIcon - call .LoadSprite - hlcoord 5, 2 - ld de, .PlayerNameString - call PlaceString - call .StoreSpriteIconParams - ret - -; 117a3 (4:57a3) - -.PlayerNameString: ; 117a3 - db "YOUR NAME?@" - -; 117ae - -.Rival: ; 117ae (4:57ae) - ld de, SilverSpriteGFX - ld b, BANK(SilverSpriteGFX) - call .LoadSprite - hlcoord 5, 2 - ld de, .RivalNameString - call PlaceString - call .StoreSpriteIconParams - ret - -; 117c3 (4:57c3) - -.RivalNameString: ; 117c3 - db "RIVAL'S NAME?@" - -; 117d1 - -.Mom: ; 117d1 (4:57d1) - ld de, MomSpriteGFX - ld b, BANK(MomSpriteGFX) - call .LoadSprite - hlcoord 5, 2 - ld de, .MomNameString - call PlaceString - call .StoreSpriteIconParams - ret - -; 117e6 (4:57e6) - -.MomNameString: ; 117e6 - db "MOTHER'S NAME?@" - -; 117f5 - -.Box: ; 117f5 (4:57f5) - ld de, PokeBallSpriteGFX - ld hl, vTiles0 tile $00 - lb bc, BANK(PokeBallSpriteGFX), 4 - call Request2bpp - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], a - depixel 4, 4, 4, 0 - ld a, SPRITE_ANIM_INDEX_RED_WALK - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], $0 - hlcoord 5, 2 - ld de, .BoxNameString - call PlaceString - call .StoreBoxIconParams - ret - -; 11822 (4:5822) - -.BoxNameString: ; 11822 - db "BOX NAME?@" - -; 1182c - -.Tomodachi: ; 1182c (4:582c) - hlcoord 3, 2 - ld de, .oTomodachi_no_namae_sutoringu - call PlaceString - call .StoreSpriteIconParams - ret - -; 11839 (4:5839) - -.oTomodachi_no_namae_sutoringu ; 11839 - db "おともだち の なまえは?@" - -; 11847 - -.LoadSprite: ; 11847 (4:5847) - push de - ld hl, vTiles0 tile $00 - ld c, $4 - push bc - call Request2bpp - pop bc - ld hl, 12 tiles - add hl, de - ld e, l - ld d, h - ld hl, vTiles0 tile $04 - call Request2bpp - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], a - pop de - ld b, SPRITE_ANIM_INDEX_RED_WALK - ld a, d - cp HIGH(KrisSpriteGFX) - jr nz, .not_kris - ld a, e - cp LOW(KrisSpriteGFX) - jr nz, .not_kris - ld b, SPRITE_ANIM_INDEX_BLUE_WALK -.not_kris - ld a, b - depixel 4, 4, 4, 0 - call _InitSpriteAnimStruct - ret - -.StoreMonIconParams: ; 1187b (4:587b) - ld a, MON_NAME_LENGTH - 1 - hlcoord 5, 6 - jr .StoreParams - -.StoreSpriteIconParams: ; 11882 (4:5882) - ld a, PLAYER_NAME_LENGTH - 1 - hlcoord 5, 6 - jr .StoreParams - -.StoreBoxIconParams: ; 11889 (4:5889) - ld a, BOX_NAME_LENGTH - 1 - hlcoord 5, 4 - jr .StoreParams - -.StoreParams: ; 11890 (4:5890) - ld [wNamingScreenMaxNameLength], a - ld a, l - ld [wNamingScreenStringEntryCoord], a - ld a, h - ld [wNamingScreenStringEntryCoord + 1], a - ret - -NamingScreen_IsTargetBox: ; 1189c - push bc - push af - ld a, [wNamingScreenType] - sub $3 - ld b, a - pop af - dec b - pop bc - ret - -; 118a8 - -NamingScreen_InitText: ; 118a8 - call WaitTop - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, NAMINGSCREEN_BORDER - call ByteFill - hlcoord 1, 1 - lb bc, 6, 18 - call NamingScreen_IsTargetBox - jr nz, .not_box - lb bc, 4, 18 - -.not_box - call ClearBox - ld de, NameInputUpper -NamingScreen_ApplyTextInputMode: ; 118ca - call NamingScreen_IsTargetBox - jr nz, .not_box - ld hl, BoxNameInputLower - NameInputLower - add hl, de - ld d, h - ld e, l - -.not_box - push de - hlcoord 1, 8 - lb bc, 7, 18 - call NamingScreen_IsTargetBox - jr nz, .not_box_2 - hlcoord 1, 6 - lb bc, 9, 18 - -.not_box_2 - call ClearBox - hlcoord 1, 16 - lb bc, 1, 18 - call ClearBox - pop de - hlcoord 2, 8 - ld b, $5 - call NamingScreen_IsTargetBox - jr nz, .row - hlcoord 2, 6 - ld b, $6 - -.row - ld c, $11 -.col - ld a, [de] - ld [hli], a - inc de - dec c - jr nz, .col - push de - ld de, 2 * SCREEN_WIDTH - $11 - add hl, de - pop de - dec b - jr nz, .row - ret - -; 11915 - -NamingScreenJoypadLoop: ; 11915 - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .quit - call .RunJumptable - farcall PlaySpriteAnimationsAndDelayFrame - call .UpdateStringEntry - call DelayFrame - and a - ret - -.quit - callfar ClearSpriteAnims - call ClearSprites - xor a - ld [hSCX], a - ld [hSCY], a - scf - ret - -; 11940 - -.UpdateStringEntry: ; 11940 - xor a - ld [hBGMapMode], a - hlcoord 1, 5 - call NamingScreen_IsTargetBox - jr nz, .got_coords - hlcoord 1, 3 - -.got_coords - lb bc, 1, 18 - call ClearBox - ld hl, wNamingScreenDestinationPointer - ld e, [hl] - inc hl - ld d, [hl] - ld hl, wNamingScreenStringEntryCoord - ld a, [hli] - ld h, [hl] - ld l, a - call PlaceString - ld a, $1 - ld [hBGMapMode], a - ret - -; 11968 - -.RunJumptable: ; 11968 - 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 - -; 11977 - -.Jumptable: ; 11977 (4:5977) - dw .InitCursor - dw .ReadButtons - -.InitCursor: ; 1197b (4:597b) - depixel 10, 3 - call NamingScreen_IsTargetBox - jr nz, .got_cursor_position - ld d, 8 * 8 -.got_cursor_position - ld a, SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR - call _InitSpriteAnimStruct - ld a, c - ld [wNamingScreenCursorObjectPointer], a - ld a, b - ld [wNamingScreenCursorObjectPointer + 1], a - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld [hl], a - ld hl, wJumptableIndex - inc [hl] - ret - -.ReadButtons: ; 119a1 (4:59a1) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and A_BUTTON - jr nz, .a - ld a, [hl] - and B_BUTTON - jr nz, .b - ld a, [hl] - and START - jr nz, .start - ld a, [hl] - and SELECT - jr nz, .select - ret - -.a - call .GetCursorPosition - cp $1 - jr z, .select - cp $2 - jr z, .b - cp $3 - jr z, .end - call NamingScreen_GetLastCharacter - call NamingScreen_TryAddCharacter - ret nc - -.start - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $8 - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $4 - call NamingScreen_IsTargetBox - ret nz - inc [hl] - ret - -.b - call NamingScreen_DeleteCharacter - ret - -.end - call NamingScreen_StoreEntry - ld hl, wJumptableIndex - set 7, [hl] - ret - -.select - ld hl, wNamingScreenLetterCase - ld a, [hl] - xor 1 - ld [hl], a - jr z, .upper - ld de, NameInputLower - call NamingScreen_ApplyTextInputMode - ret - -.upper - ld de, NameInputUpper - call NamingScreen_ApplyTextInputMode - ret - -.GetCursorPosition: ; 11a0b (4:5a0b) - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - -NamingScreen_GetCursorPosition: ; 11a11 (4:5a11) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - push bc - ld b, $4 - call NamingScreen_IsTargetBox - jr nz, .not_box - inc b -.not_box - cp b - pop bc - jr nz, .not_bottom_row - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $3 - jr c, .case_switch - cp $6 - jr c, .delete - ld a, $3 - ret - -.case_switch - ld a, $1 - ret - -.delete - ld a, $2 - ret - -.not_bottom_row - xor a - ret - -NamingScreen_AnimateCursor: ; 11a3b (4:5a3b) - call .GetDPad - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - ld e, a - swap e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], e - ld d, $4 - call NamingScreen_IsTargetBox - jr nz, .ok - inc d -.ok - cp d - ld de, .LetterEntries - ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 0 - jr nz, .ok2 - ld de, .CaseDelEnd - ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR_BIG - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 1 -.ok2 - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - add [hl] ; default SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld l, [hl] - ld h, $0 - add hl, de - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -; 11a79 (4:5a79) - -.LetterEntries: ; 11a79 - db $00, $10, $20, $30, $40, $50, $60, $70, $80 - -.CaseDelEnd: ; 11a82 - db $00, $00, $00, $30, $30, $30, $60, $60, $60 - -; 11a8b - -.GetDPad: ; 11a8b (4:5a8b) - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .up - ld a, [hl] - and D_DOWN - jr nz, .down - ld a, [hl] - and D_LEFT - jr nz, .left - ld a, [hl] - and D_RIGHT - jr nz, .right - ret - -.right - call NamingScreen_GetCursorPosition - and a - jr nz, .asm_11ab7 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $8 - jr nc, .asm_11ab4 - inc [hl] - ret - -.asm_11ab4 - ld [hl], $0 - ret - -.asm_11ab7 - cp $3 - jr nz, .asm_11abc - xor a -.asm_11abc - ld e, a - add a - add e - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - ret - -.left - call NamingScreen_GetCursorPosition - and a - jr nz, .asm_11ad8 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .asm_11ad5 - dec [hl] - ret - -.asm_11ad5 - ld [hl], $8 - ret - -.asm_11ad8 - cp $1 - jr nz, .asm_11ade - ld a, $4 -.asm_11ade - dec a - dec a - ld e, a - add a - add e - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - ret - -.down - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - call NamingScreen_IsTargetBox - jr nz, .asm_11af9 - cp $5 - jr nc, .asm_11aff - inc [hl] - ret - -.asm_11af9 - cp $4 - jr nc, .asm_11aff - inc [hl] - ret - -.asm_11aff - ld [hl], $0 - ret - -.up - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - and a - jr z, .asm_11b0c - dec [hl] - ret - -.asm_11b0c - ld [hl], $4 - call NamingScreen_IsTargetBox - ret nz - inc [hl] - ret - -NamingScreen_TryAddCharacter: ; 11b14 (4:5b14) - ld a, [wNamingScreenLastCharacter] ; lost -MailComposition_TryAddCharacter: ; 11b17 (4:5b17) - ld a, [wNamingScreenMaxNameLength] - ld c, a - ld a, [wNamingScreenCurrNameLength] - cp c - ret nc - - ld a, [wNamingScreenLastCharacter] - -NamingScreen_LoadNextCharacter: ; 11b23 - call NamingScreen_GetTextCursorPosition - ld [hl], a - -NamingScreen_AdvanceCursor_CheckEndOfString: ; 11b27 - ld hl, wNamingScreenCurrNameLength - inc [hl] - call NamingScreen_GetTextCursorPosition - ld a, [hl] - cp "@" - jr z, .end_of_string - ld [hl], NAMINGSCREEN_UNDERLINE - and a - ret - -.end_of_string - scf - ret - -; 11b39 (4:5b39) - -; unused - ld a, [wNamingScreenCurrNameLength] - and a - ret z - push hl - ld hl, wNamingScreenCurrNameLength - dec [hl] - call NamingScreen_GetTextCursorPosition - ld c, [hl] - pop hl - -.loop - ld a, [hli] - cp $ff - jr z, NamingScreen_AdvanceCursor_CheckEndOfString - cp c - jr z, .done - inc hl - jr .loop - -.done - ld a, [hl] - jr NamingScreen_LoadNextCharacter - -; 11b56 - -INCLUDE "data/text/unused_dakutens.asm" - -; 11bbc - -NamingScreen_DeleteCharacter: ; 11bbc (4:5bbc) - ld hl, wNamingScreenCurrNameLength - ld a, [hl] - and a - ret z - dec [hl] - call NamingScreen_GetTextCursorPosition - ld [hl], NAMINGSCREEN_UNDERLINE - inc hl - ld a, [hl] - cp NAMINGSCREEN_UNDERLINE - ret nz - ld [hl], NAMINGSCREEN_MIDDLELINE - ret - -NamingScreen_GetTextCursorPosition: ; 11bd0 (4:5bd0) - push af - ld hl, wNamingScreenDestinationPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wNamingScreenCurrNameLength] - ld e, a - ld d, 0 - add hl, de - pop af - ret - -; 11be0 - -NamingScreen_InitNameEntry: ; 11be0 -; load NAMINGSCREEN_UNDERLINE, (NAMINGSCREEN_MIDDLELINE * [wNamingScreenMaxNameLength]), "@" into the dw address at wNamingScreenDestinationPointer - ld hl, wNamingScreenDestinationPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld [hl], NAMINGSCREEN_UNDERLINE - inc hl - ld a, [wNamingScreenMaxNameLength] - dec a - ld c, a - ld a, NAMINGSCREEN_MIDDLELINE -.loop - ld [hli], a - dec c - jr nz, .loop - ld [hl], "@" - ret - -; 11bf7 - -NamingScreen_StoreEntry: ; 11bf7 (4:5bf7) - ld hl, wNamingScreenDestinationPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wNamingScreenMaxNameLength] - ld c, a -.loop - ld a, [hl] - cp NAMINGSCREEN_MIDDLELINE - jr z, .terminator - cp NAMINGSCREEN_UNDERLINE - jr nz, .not_terminator -.terminator - ld [hl], "@" -.not_terminator - inc hl - dec c - jr nz, .loop - ret - -NamingScreen_GetLastCharacter: ; 11c11 (4:5c11) - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - add [hl] - sub $8 - srl a - srl a - srl a - ld e, a - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - add [hl] - sub $10 - srl a - srl a - srl a - ld d, a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH -.loop - ld a, d - and a - jr z, .done - add hl, bc - dec d - jr .loop - -.done - add hl, de - ld a, [hl] - ld [wNamingScreenLastCharacter], a - ret - -LoadNamingScreenGFX: ; 11c51 - call ClearSprites - callfar ClearSpriteAnims - call LoadStandardFont - call LoadFontsExtra - - ld de, NamingScreenGFX_MiddleLine - ld hl, vTiles0 tile NAMINGSCREEN_MIDDLELINE - lb bc, BANK(NamingScreenGFX_MiddleLine), 1 - call Get1bpp - - ld de, NamingScreenGFX_UnderLine - ld hl, vTiles0 tile NAMINGSCREEN_UNDERLINE - lb bc, BANK(NamingScreenGFX_UnderLine), 1 - call Get1bpp - - ld de, vTiles2 tile NAMINGSCREEN_BORDER - ld hl, NamingScreenGFX_Border - ld bc, 1 tiles - ld a, BANK(NamingScreenGFX_Border) - call FarCopyBytes - - ld de, vTiles0 tile NAMINGSCREEN_CURSOR - ld hl, NamingScreenGFX_Cursor - ld bc, 2 tiles - ld a, BANK(NamingScreenGFX_Cursor) - call FarCopyBytes - - ld a, $5 - ld hl, wSpriteAnimDict + 9 * 2 - ld [hli], a - ld [hl], NAMINGSCREEN_CURSOR - xor a - ld [hSCY], a - ld [wGlobalAnimYOffset], a - ld [hSCX], a - ld [wGlobalAnimXOffset], a - ld [wJumptableIndex], a - ld [wNamingScreenLetterCase], a - ld [hBGMapMode], a - ld [wNamingScreenCurrNameLength], a - ld a, $7 - ld [hWX], a - ret - -; 11cb7 - -NamingScreenGFX_Border: ; 11cb7 -INCBIN "gfx/naming_screen/border.2bpp" -; 11cc7 - -NamingScreenGFX_Cursor: ; 11cc7 -INCBIN "gfx/naming_screen/cursor.2bpp" -; 11ce7 - -INCLUDE "data/text/name_input_chars.asm" -; 11e5d - -NamingScreenGFX_End: ; unused -INCBIN "gfx/naming_screen/end.1bpp" -; 11e6d - -NamingScreenGFX_MiddleLine: -INCBIN "gfx/naming_screen/middle_line.1bpp" -; 11e6d - -NamingScreenGFX_UnderLine: ; 11e6d -INCBIN "gfx/naming_screen/underline.1bpp" -; 11e75 - -_ComposeMailMessage: ; 11e75 (mail?) - ld hl, wNamingScreenDestinationPointer - ld [hl], e - inc hl - ld [hl], d - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - call .InitBlankMail - call DelayFrame - -.loop - call .DoMailEntry - jr nc, .loop - - pop af - ld [hInMenu], a - pop af - ld [hMapAnims], a - ret - -.InitBlankMail: ; 11e9a (4:5e9a) - call ClearBGPalettes - call DisableLCD - call LoadNamingScreenGFX - ld de, vTiles0 tile $00 - ld hl, .MailIcon - ld bc, 8 tiles - ld a, BANK(.MailIcon) - call FarCopyBytes - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], a - - ; init mail icon - depixel 3, 2 - ld a, SPRITE_ANIM_INDEX_PARTY_MON - call _InitSpriteAnimStruct - - ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID - add hl, bc - ld [hl], $0 - call .InitCharset - ld a, LCDC_DEFAULT - ld [rLCDC], a - call .initwNamingScreenMaxNameLength - ld b, SCGB_DIPLOMA - call GetSGBLayout - call WaitBGMap - call WaitTop - ld a, %11100100 - call DmgToCgbBGPals - ld a, %11100100 - call DmgToCgbObjPal0 - call NamingScreen_InitNameEntry - ld hl, wNamingScreenDestinationPointer - ld e, [hl] - inc hl - ld d, [hl] - ld hl, MAIL_LINE_LENGTH - add hl, de - ld [hl], "" - ret - -; 11ef4 (4:5ef4) - -.MailIcon: ; 11ef4 -INCBIN "gfx/icons/mail_big.2bpp" -; 11f74 - -.initwNamingScreenMaxNameLength ; 11f74 (4:5f74) - ld a, MAIL_MSG_LENGTH + 1 - ld [wNamingScreenMaxNameLength], a - ret - -; 11f7a (4:5f7a) - -.UnusedString11f7a: - db "メールを かいてね@" - -; 11f84 - -.InitCharset: ; 11f84 (4:5f84) - call WaitTop - hlcoord 0, 0 - ld bc, 6 * SCREEN_WIDTH - ld a, NAMINGSCREEN_BORDER - call ByteFill - hlcoord 0, 6 - ld bc, 12 * SCREEN_WIDTH - ld a, " " - call ByteFill - hlcoord 1, 1 - lb bc, 4, SCREEN_WIDTH - 2 - call ClearBox - ld de, MailEntry_Uppercase - -.PlaceMailCharset: ; 11fa9 (4:5fa9) - hlcoord 1, 7 - ld b, 6 -.next - ld c, SCREEN_WIDTH - 1 -.loop_ - ld a, [de] - ld [hli], a - inc de - dec c - jr nz, .loop_ - push de - ld de, SCREEN_WIDTH + 1 - add hl, de - pop de - dec b - jr nz, .next - ret - -.DoMailEntry: ; 11fc0 (4:5fc0) - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .exit_mail - call .DoJumptable - farcall PlaySpriteAnimationsAndDelayFrame - call .Update - call DelayFrame - and a - ret - -.exit_mail - callfar ClearSpriteAnims - call ClearSprites - xor a - ld [hSCX], a - ld [hSCY], a - scf - ret - -.Update: ; 11feb (4:5feb) - xor a - ld [hBGMapMode], a - hlcoord 1, 1 - lb bc, 4, 18 - call ClearBox - ld hl, wNamingScreenDestinationPointer - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 2, 2 - call PlaceString - ld a, $1 - ld [hBGMapMode], a - ret - -.DoJumptable: ; 12008 (4:6008) - 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: ; 12017 (4:6017) - dw .init_blinking_cursor - dw .process_joypad - -.init_blinking_cursor ; 1201b (4:601b) - depixel 9, 2 - ld a, SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR - call _InitSpriteAnimStruct - ld a, c - ld [wNamingScreenCursorObjectPointer], a - ld a, b - ld [wNamingScreenCursorObjectPointer + 1], a - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - ld [hl], a - ld hl, wJumptableIndex - inc [hl] - ret - -.process_joypad ; 1203a (4:603a) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and A_BUTTON - jr nz, .a - ld a, [hl] - and B_BUTTON - jr nz, .b - ld a, [hl] - and START - jr nz, .start - ld a, [hl] - and SELECT - jr nz, .select - ret - -.a - call NamingScreen_PressedA_GetCursorCommand - cp $1 - jr z, .select - cp $2 - jr z, .b - cp $3 - jr z, .finished - call NamingScreen_GetLastCharacter - call MailComposition_TryAddLastCharacter - jr c, .start - ld hl, wNamingScreenCurrNameLength - ld a, [hl] - cp MAIL_LINE_LENGTH - ret nz - inc [hl] - call NamingScreen_GetTextCursorPosition - ld [hl], NAMINGSCREEN_UNDERLINE - dec hl - ld [hl], "" - ret - -.start - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $9 - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $5 - ret - -.b - call NamingScreen_DeleteCharacter - ld hl, wNamingScreenCurrNameLength - ld a, [hl] - cp MAIL_LINE_LENGTH - ret nz - dec [hl] - call NamingScreen_GetTextCursorPosition - ld [hl], NAMINGSCREEN_UNDERLINE - inc hl - ld [hl], "" - ret - -.finished - call NamingScreen_StoreEntry - ld hl, wJumptableIndex - set 7, [hl] - ret - -.select - ld hl, wNamingScreenLetterCase - ld a, [hl] - xor 1 - ld [hl], a - jr nz, .switch_to_lowercase - ld de, MailEntry_Uppercase - call .PlaceMailCharset - ret - -.switch_to_lowercase - ld de, MailEntry_Lowercase - call .PlaceMailCharset - ret - -; called from engine/sprite_anims.asm - -ComposeMail_AnimateCursor: ; 120c1 (4:60c1) - call .GetDPad - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - ld e, a - swap e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], e - cp $5 - ld de, .LetterEntries - ld a, 0 - jr nz, .got_pointer - ld de, .CaseDelEnd - ld a, 1 -.got_pointer - ld hl, SPRITEANIMSTRUCT_0E - add hl, bc - add [hl] - ld hl, SPRITEANIMSTRUCT_FRAMESET_ID - add hl, bc - ld [hl], a - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld l, [hl] - ld h, 0 - add hl, de - ld a, [hl] - ld hl, SPRITEANIMSTRUCT_XOFFSET - add hl, bc - ld [hl], a - ret - -; 120f8 (4:60f8) - -.LetterEntries: ; 120f8 - db $00, $10, $20, $30, $40, $50, $60, $70, $80, $90 - -.CaseDelEnd: ; 12102 - db $00, $00, $00, $30, $30, $30, $60, $60, $60, $60 - -; 1210c - -.GetDPad: ; 1210c (4:610c) - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .up - ld a, [hl] - and D_DOWN - jr nz, .down - ld a, [hl] - and D_LEFT - jr nz, .left - ld a, [hl] - and D_RIGHT - jr nz, .right - ret - -.right - call ComposeMail_GetCursorPosition - and a - jr nz, .case_del_done_right - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $9 - jr nc, .wrap_around_letter_right - inc [hl] - ret - -.wrap_around_letter_right - ld [hl], $0 - ret - -.case_del_done_right - cp $3 - jr nz, .wrap_around_command_right - xor a -.wrap_around_command_right - ld e, a - add a - add e - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - ret - -.left - call ComposeMail_GetCursorPosition - and a - jr nz, .caps_del_done_left - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .wrap_around_letter_left - dec [hl] - ret - -.wrap_around_letter_left - ld [hl], $9 - ret - -.caps_del_done_left - cp $1 - jr nz, .wrap_around_command_left - ld a, $4 -.wrap_around_command_left - dec a - dec a - ld e, a - add a - add e - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], a - ret - -.down - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $5 - jr nc, .wrap_around_down - inc [hl] - ret - -.wrap_around_down - ld [hl], $0 - ret - -.up - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - and a - jr z, .wrap_around_up - dec [hl] - ret - -.wrap_around_up - ld [hl], $5 - ret - -NamingScreen_PressedA_GetCursorCommand: ; 12185 (4:6185) - ld hl, wNamingScreenCursorObjectPointer - ld c, [hl] - inc hl - ld b, [hl] - -ComposeMail_GetCursorPosition: ; 1218b (4:618b) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $5 - jr nz, .letter - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - cp $3 - jr c, .case - cp $6 - jr c, .del - ld a, $3 - ret - -.case - ld a, $1 - ret - -.del - ld a, $2 - ret - -.letter - xor a - ret - -MailComposition_TryAddLastCharacter: ; 121ac (4:61ac) - ld a, [wNamingScreenLastCharacter] - jp MailComposition_TryAddCharacter - -; 121b2 (4:61b2) - -; unused - ld a, [wNamingScreenCurrNameLength] - and a - ret z - cp $11 - jr nz, .asm_121c3 - push hl - ld hl, wNamingScreenCurrNameLength - dec [hl] - dec [hl] - jr .asm_121c8 - -.asm_121c3 - push hl - ld hl, wNamingScreenCurrNameLength - dec [hl] - -.asm_121c8 - call NamingScreen_GetTextCursorPosition - ld c, [hl] - pop hl -.asm_121cd - ld a, [hli] - cp $ff - jp z, NamingScreen_AdvanceCursor_CheckEndOfString - cp c - jr z, .asm_121d9 - inc hl - jr .asm_121cd - -.asm_121d9 - ld a, [hl] - jp NamingScreen_LoadNextCharacter - -; 121dd - -INCLUDE "data/text/mail_input_chars.asm" - -; 122c1 diff --git a/engine/menu/options_menu.asm b/engine/menu/options_menu.asm deleted file mode 100755 index c0a255cb0..000000000 --- a/engine/menu/options_menu.asm +++ /dev/null @@ -1,583 +0,0 @@ -_OptionsMenu: ; e41d0 - ld hl, hInMenu - ld a, [hl] - push af - ld [hl], $1 - call ClearBGPalettes - hlcoord 0, 0 - ld b, 16 - ld c, 18 - call TextBox - hlcoord 2, 2 - ld de, StringOptions - call PlaceString - xor a - ld [wJumptableIndex], a - ld c, $6 ; number of items on the menu minus 1 (for cancel) - -.print_text_loop ; this next will display the settings of each option when the menu is opened - push bc - xor a - ld [hJoyLast], a - call GetOptionPointer - pop bc - ld hl, wJumptableIndex - inc [hl] - dec c - jr nz, .print_text_loop - - call UpdateFrame - xor a - ld [wJumptableIndex], a - inc a - ld [hBGMapMode], a - call WaitBGMap - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - -.joypad_loop - call JoyTextDelay - ld a, [hJoyPressed] - and START | B_BUTTON - jr nz, .ExitOptions - call OptionsControl - jr c, .dpad - call GetOptionPointer - jr c, .ExitOptions - -.dpad - call Options_UpdateCursorPosition - ld c, 3 - call DelayFrames - jr .joypad_loop - -.ExitOptions: - ld de, SFX_TRANSACTION - call PlaySFX - call WaitSFX - pop af - ld [hInMenu], a - ret -; e4241 - -StringOptions: ; e4241 - db "TEXT SPEED" - db " :" - db "BATTLE SCENE" - db " :" - db "BATTLE STYLE" - db " :" - db "SOUND" - db " :" - db "PRINT" - db " :" - db "MENU ACCOUNT" - db " :" - db "FRAME" - db " :TYPE" - db "CANCEL@" -; e42d6 - - -GetOptionPointer: ; e42d6 - ld a, [wJumptableIndex] ; load the cursor position to a - ld e, a ; copy it to de - ld d, 0 - ld hl, .Pointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl ; jump to the code of the current highlighted item -; e42e5 - -.Pointers: - dw Options_TextSpeed - dw Options_BattleScene - dw Options_BattleStyle - dw Options_Sound - dw Options_Print - dw Options_MenuAccount - dw Options_Frame - dw Options_Cancel -; e42f5 - - - const_def - const OPT_TEXT_SPEED_FAST ; 0 - const OPT_TEXT_SPEED_MED ; 1 - const OPT_TEXT_SPEED_SLOW ; 2 - -Options_TextSpeed: ; e42f5 - call GetTextSpeed - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - ld a, c ; right pressed - cp OPT_TEXT_SPEED_SLOW - jr c, .Increase - ld c, OPT_TEXT_SPEED_FAST + -1 - -.Increase: - inc c - ld a, e - jr .Save - -.LeftPressed: - ld a, c - and a - jr nz, .Decrease - ld c, OPT_TEXT_SPEED_SLOW + 1 - -.Decrease: - dec c - ld a, d - -.Save: - ld b, a - ld a, [wOptions] - and $f0 - or b - ld [wOptions], a - -.NonePressed: - ld b, 0 - ld hl, .Strings - add hl, bc - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 11, 3 - call PlaceString - and a - ret -; e4331 - -.Strings: -; entries correspond to OPT_TEXT_SPEED_* constants - dw .Fast - dw .Mid - dw .Slow - -.Fast: db "FAST@" -.Mid: db "MID @" -.Slow: db "SLOW@" -; e4346 - - -GetTextSpeed: ; e4346 -; converts TEXT_DELAY_* value in a to OPT_TEXT_SPEED_* value in c, -; with previous/next TEXT_DELAY_* values in d/e - ld a, [wOptions] - and $7 - cp TEXT_DELAY_SLOW - jr z, .slow - cp TEXT_DELAY_FAST - jr z, .fast - ; none of the above - ld c, OPT_TEXT_SPEED_MED - lb de, TEXT_DELAY_FAST, TEXT_DELAY_SLOW - ret - -.slow - ld c, OPT_TEXT_SPEED_SLOW - lb de, TEXT_DELAY_MED, TEXT_DELAY_FAST - ret - -.fast - ld c, OPT_TEXT_SPEED_FAST - lb de, TEXT_DELAY_SLOW, TEXT_DELAY_MED - ret -; e4365 - - -Options_BattleScene: ; e4365 - ld hl, wOptions - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - bit BATTLE_SCENE, [hl] - jr nz, .ToggleOn - jr .ToggleOff - -.LeftPressed: - bit BATTLE_SCENE, [hl] - jr z, .ToggleOff - jr .ToggleOn - -.NonePressed: - bit BATTLE_SCENE, [hl] - jr z, .ToggleOn - jr .ToggleOff - -.ToggleOn: - res BATTLE_SCENE, [hl] - ld de, .On - jr .Display - -.ToggleOff: - set BATTLE_SCENE, [hl] - ld de, .Off - -.Display: - hlcoord 11, 5 - call PlaceString - and a - ret -; e4398 - -.On: db "ON @" -.Off: db "OFF@" -; e43a0 - - -Options_BattleStyle: ; e43a0 - ld hl, wOptions - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - bit BATTLE_SHIFT, [hl] - jr nz, .ToggleShift - jr .ToggleSet - -.LeftPressed: - bit BATTLE_SHIFT, [hl] - jr z, .ToggleSet - jr .ToggleShift - -.NonePressed: - bit BATTLE_SHIFT, [hl] - jr nz, .ToggleSet - -.ToggleShift: - res BATTLE_SHIFT, [hl] - ld de, .Shift - jr .Display - -.ToggleSet: - set BATTLE_SHIFT, [hl] - ld de, .Set - -.Display: - hlcoord 11, 7 - call PlaceString - and a - ret -; e43d1 - -.Shift: db "SHIFT@" -.Set: db "SET @" -; e43dd - - -Options_Sound: ; e43dd - ld hl, wOptions - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - bit STEREO, [hl] - jr nz, .SetMono - jr .SetStereo - -.LeftPressed: - bit STEREO, [hl] - jr z, .SetStereo - jr .SetMono - -.NonePressed: - bit STEREO, [hl] - jr nz, .ToggleStereo - jr .ToggleMono - -.SetMono: - res STEREO, [hl] - call RestartMapMusic - -.ToggleMono: - ld de, .Mono - jr .Display - -.SetStereo: - set STEREO, [hl] - call RestartMapMusic - -.ToggleStereo: - ld de, .Stereo - -.Display: - hlcoord 11, 9 - call PlaceString - and a - ret -; e4416 - -.Mono: db "MONO @" -.Stereo: db "STEREO@" -; e4424 - - - const_def - const OPT_PRINT_LIGHTEST ; 0 - const OPT_PRINT_LIGHTER ; 1 - const OPT_PRINT_NORMAL ; 2 - const OPT_PRINT_DARKER ; 3 - const OPT_PRINT_DARKEST ; 4 - -Options_Print: ; e4424 - call GetPrinterSetting - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - ld a, c - cp OPT_PRINT_DARKEST - jr c, .Increase - ld c, OPT_PRINT_LIGHTEST - 1 - -.Increase: - inc c - ld a, e - jr .Save - -.LeftPressed: - ld a, c - and a - jr nz, .Decrease - ld c, OPT_PRINT_DARKEST + 1 - -.Decrease: - dec c - ld a, d - -.Save: - ld b, a - ld [wGBPrinter], a - -.NonePressed: - ld b, $0 - ld hl, .Strings - add hl, bc - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 11, 11 - call PlaceString - and a - ret -; e445a - -.Strings: -; entries correspond to OPT_PRINT_* constants - dw .Lightest - dw .Lighter - dw .Normal - dw .Darker - dw .Darkest - -.Lightest: db "LIGHTEST@" -.Lighter: db "LIGHTER @" -.Normal: db "NORMAL @" -.Darker: db "DARKER @" -.Darkest: db "DARKEST @" -; e4491 - - -GetPrinterSetting: ; e4491 -; converts GBPRINTER_* value in a to OPT_PRINT_* value in c, -; with previous/next GBPRINTER_* values in d/e - ld a, [wGBPrinter] - and a - jr z, .IsLightest - cp GBPRINTER_LIGHTER - jr z, .IsLight - cp GBPRINTER_DARKER - jr z, .IsDark - cp GBPRINTER_DARKEST - jr z, .IsDarkest - ; none of the above - ld c, OPT_PRINT_NORMAL - lb de, GBPRINTER_LIGHTER, GBPRINTER_DARKER - ret - -.IsLightest: - ld c, OPT_PRINT_LIGHTEST - lb de, GBPRINTER_DARKEST, GBPRINTER_LIGHTER - ret - -.IsLight: - ld c, OPT_PRINT_LIGHTER - lb de, GBPRINTER_LIGHTEST, GBPRINTER_NORMAL - ret - -.IsDark: - ld c, OPT_PRINT_DARKER - lb de, GBPRINTER_NORMAL, GBPRINTER_DARKEST - ret - -.IsDarkest: - ld c, OPT_PRINT_DARKEST - lb de, GBPRINTER_DARKER, GBPRINTER_LIGHTEST - ret -; e44c1 - -Options_MenuAccount: ; e44c1 - ld hl, wOptions2 - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr z, .NonePressed - bit MENU_ACCOUNT, [hl] - jr nz, .ToggleOff - jr .ToggleOn - -.LeftPressed: - bit MENU_ACCOUNT, [hl] - jr z, .ToggleOn - jr .ToggleOff - -.NonePressed: - bit MENU_ACCOUNT, [hl] - jr nz, .ToggleOn - -.ToggleOff: - res MENU_ACCOUNT, [hl] - ld de, .Off - jr .Display - -.ToggleOn: - set MENU_ACCOUNT, [hl] - ld de, .On - -.Display: - hlcoord 11, 13 - call PlaceString - and a - ret -; e44f2 - -.Off: db "OFF@" -.On: db "ON @" -; e44fa - - -Options_Frame: ; e44fa - ld hl, wTextBoxFrame - ld a, [hJoyPressed] - bit D_LEFT_F, a - jr nz, .LeftPressed - bit D_RIGHT_F, a - jr nz, .RightPressed - and a - ret - -.RightPressed: - ld a, [hl] - inc a - jr .Save - -.LeftPressed: - ld a, [hl] - dec a - -.Save: - and $7 - ld [hl], a -UpdateFrame: ; e4512 - ld a, [wTextBoxFrame] - hlcoord 16, 15 ; where on the screen the number is drawn - add "1" - ld [hl], a - call LoadFontsExtra - and a - ret -; e4520 - -Options_Cancel: ; e4520 - ld a, [hJoyPressed] - and A_BUTTON - jr nz, .Exit - and a - ret - -.Exit: - scf - ret -; e452a - -OptionsControl: ; e452a - ld hl, wJumptableIndex - ld a, [hJoyLast] - cp D_DOWN - jr z, .DownPressed - cp D_UP - jr z, .UpPressed - and a - ret - -.DownPressed: - ld a, [hl] ; load the cursor position to a - cp $7 ; maximum number of items in option menu - jr nz, .CheckFive - ld [hl], $0 - scf - ret - -.CheckFive: ; I have no idea why this exists... - cp $5 - jr nz, .Increase - ld [hl], $5 - -.Increase: - inc [hl] - scf - ret - -.UpPressed: - ld a, [hl] - cp $6 - jr nz, .NotSix - ld [hl], $5 ; Another thing where I'm not sure why it exists - scf - ret - -.NotSix: - and a - jr nz, .Decrease - ld [hl], $8 ; number of option items +1 - -.Decrease: - dec [hl] - scf - ret -; e455c - -Options_UpdateCursorPosition: ; e455c - hlcoord 1, 1 - ld de, SCREEN_WIDTH - ld c, $10 -.loop - ld [hl], " " - add hl, de - dec c - jr nz, .loop - hlcoord 1, 2 - ld bc, 2 * SCREEN_WIDTH - ld a, [wJumptableIndex] - call AddNTimes - ld [hl], "▶" - ret -; e4579 diff --git a/engine/menu/pack.asm b/engine/menu/pack.asm deleted file mode 100644 index ea3a051ac..000000000 --- a/engine/menu/pack.asm +++ /dev/null @@ -1,1711 +0,0 @@ -; Pack.Jumptable and BattlePack.Jumptable indexes - const_def - const PACKSTATE_INITGFX ; 0 - const PACKSTATE_INITITEMSPOCKET ; 1 - const PACKSTATE_ITEMSPOCKETMENU ; 2 - const PACKSTATE_INITBALLSPOCKET ; 3 - const PACKSTATE_BALLSPOCKETMENU ; 4 - const PACKSTATE_INITKEYITEMSPOCKET ; 5 - const PACKSTATE_KEYITEMSPOCKETMENU ; 6 - const PACKSTATE_INITTMHMPOCKET ; 7 - const PACKSTATE_TMHMPOCKETMENU ; 8 - const PACKSTATE_QUITNOSCRIPT ; 9 - const PACKSTATE_QUITRUNSCRIPT ; 10 - -Pack: ; 10000 - ld hl, wOptions - set NO_TEXT_SCROLL, [hl] - call InitPackBuffers -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call .RunJumptable - call DelayFrame - jr .loop - -.done - ld a, [wCurrPocket] - ld [wLastPocket], a - ld hl, wOptions - res NO_TEXT_SCROLL, [hl] - ret -; 10026 - -.RunJumptable: ; 10026 - ld a, [wJumptableIndex] - ld hl, .Jumptable - call Pack_GetJumptablePointer - jp hl - -; 10030 - -.Jumptable: ; 10030 (4:4030) -; entries correspond to PACKSTATE_* constants - dw .InitGFX ; 0 - dw .InitItemsPocket ; 1 - dw .ItemsPocketMenu ; 2 - dw .InitBallsPocket ; 3 - dw .BallsPocketMenu ; 4 - dw .InitKeyItemsPocket ; 5 - dw .KeyItemsPocketMenu ; 6 - dw .InitTMHMPocket ; 7 - dw .TMHMPocketMenu ; 8 - dw Pack_QuitNoScript ; 9 - dw Pack_QuitRunScript ; 10 - -.InitGFX: ; 10046 (4:4046) - xor a - ld [hBGMapMode], a - call Pack_InitGFX - ld a, [wPackJumptableIndex] - ld [wJumptableIndex], a - call Pack_InitColors - ret - -.InitItemsPocket: ; 10056 (4:4056) - xor a ; ITEM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.ItemsPocketMenu: ; 10067 (4:4067) - ld hl, ItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wItemsPocketCursor], a - ld b, PACKSTATE_INITTMHMPOCKET ; left - ld c, PACKSTATE_INITBALLSPOCKET ; right - call Pack_InterpretJoypad - ret c - call .ItemBallsKey_LoadSubmenu - ret - -.InitKeyItemsPocket: ; 10094 (4:4094) - ld a, KEY_ITEM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.KeyItemsPocketMenu: ; 100a6 (4:40a6) - ld hl, KeyItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wKeyItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wKeyItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wKeyItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wKeyItemsPocketCursor], a - ld b, PACKSTATE_INITBALLSPOCKET ; left - ld c, PACKSTATE_INITTMHMPOCKET ; right - call Pack_InterpretJoypad - ret c - call .ItemBallsKey_LoadSubmenu - ret - -.InitTMHMPocket: ; 100d3 (4:40d3) - ld a, TM_HM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - xor a - ld [hBGMapMode], a - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.TMHMPocketMenu: ; 100e8 (4:40e8) - farcall TMHMPocket - ld b, PACKSTATE_INITKEYITEMSPOCKET ; left - ld c, PACKSTATE_INITITEMSPOCKET ; right - call Pack_InterpretJoypad - ret c - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .use_quit - ld hl, .MenuHeader2 - ld de, .Jumptable2 - jr .load_jump - -.use_quit - ld hl, .MenuHeader1 - ld de, .Jumptable1 -.load_jump - push de - call LoadMenuHeader - call VerticalMenu - call ExitMenu - pop hl - ret c - ld a, [wMenuCursorY] - dec a - call Pack_GetJumptablePointer - jp hl - -; 10124 (4:4124) -.MenuHeader1: ; 0x10124 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData_1 - db 1 ; default option -; 0x1012c - -.MenuData_1: ; 0x1012c - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "USE@" - db "QUIT@" -; 0x10137 - -.Jumptable1: ; 10137 - dw .UseItem - dw QuitItemSubmenu - -; 1013b - -.MenuHeader2: ; 0x1013b - db MENU_BACKUP_TILES ; flags - menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData_2 - db 1 ; default option -; 0x10143 - -.MenuData_2: ; 0x10143 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 3 ; items - db "USE@" - db "GIVE@" - db "QUIT@" -; 0x10153 - -.Jumptable2: ; 10153 - dw .UseItem - dw GiveItem - dw QuitItemSubmenu -; 10159 - -.UseItem: ; 10159 - farcall AskTeachTMHM - ret c - farcall ChooseMonToLearnTMHM - jr c, .declined - ld hl, wOptions - ld a, [hl] - push af - res NO_TEXT_SCROLL, [hl] - farcall TeachTMHM - pop af - ld [wOptions], a -.declined - xor a - ld [hBGMapMode], a - call Pack_InitGFX - call WaitBGMap_DrawPackGFX - call Pack_InitColors - ret - -.InitBallsPocket: ; 10186 (4:4186) - ld a, BALL_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.BallsPocketMenu: ; 10198 (4:4198) - ld hl, BallsPocketMenuHeader - call CopyMenuHeader - ld a, [wBallsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wBallsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wBallsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wBallsPocketCursor], a - ld b, PACKSTATE_INITITEMSPOCKET ; left - ld c, PACKSTATE_INITKEYITEMSPOCKET ; right - call Pack_InterpretJoypad - ret c - call .ItemBallsKey_LoadSubmenu - ret - -.ItemBallsKey_LoadSubmenu: ; 101c5 (4:41c5) - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .tossable - farcall CheckSelectableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .selectable - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .usable - jr .unusable - -.selectable - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .selectable_usable - jr .selectable_unusable - -.tossable - farcall CheckSelectableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .tossable_selectable - jr .tossable_unselectable - -.usable - ld hl, MenuHeader_UsableKeyItem - ld de, Jumptable_UseGiveTossRegisterQuit - jr .build_menu - -.selectable_usable - ld hl, MenuHeader_UsableItem - ld de, Jumptable_UseGiveTossQuit - jr .build_menu - -.tossable_selectable - ld hl, MenuHeader_UnusableItem - ld de, Jumptable_UseQuit - jr .build_menu - -.tossable_unselectable - ld hl, MenuHeader_UnusableKeyItem - ld de, Jumptable_UseRegisterQuit - jr .build_menu - -.unusable - ld hl, MenuHeader_HoldableKeyItem - ld de, Jumptable_GiveTossRegisterQuit - jr .build_menu - -.selectable_unusable - ld hl, MenuHeader_HoldableItem - ld de, Jumptable_GiveTossQuit -.build_menu - push de - call LoadMenuHeader - call VerticalMenu - call ExitMenu - pop hl - ret c - ld a, [wMenuCursorY] - dec a - call Pack_GetJumptablePointer - jp hl - -; 10249 (4:4249) -MenuHeader_UsableKeyItem: ; 0x10249 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10251 - -.MenuData: ; 0x10251 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 5 ; items - db "USE@" - db "GIVE@" - db "TOSS@" - db "SEL@" - db "QUIT@" -; 0x1026a - -Jumptable_UseGiveTossRegisterQuit: ; 1026a - dw UseItem - dw GiveItem - dw TossMenu - dw RegisterItem - dw QuitItemSubmenu -; 10274 - -MenuHeader_UsableItem: ; 0x10274 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x1027c - -.MenuData: ; 0x1027c - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 4 ; items - db "USE@" - db "GIVE@" - db "TOSS@" - db "QUIT@" -; 0x10291 - -Jumptable_UseGiveTossQuit: ; 10291 - dw UseItem - dw GiveItem - dw TossMenu - dw QuitItemSubmenu -; 10299 - -MenuHeader_UnusableItem: ; 0x10299 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x102a1 - -.MenuData: ; 0x102a1 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "USE@" - db "QUIT@" -; 0x102ac - -Jumptable_UseQuit: ; 102ac - dw UseItem - dw QuitItemSubmenu -; 102b0 - -MenuHeader_UnusableKeyItem: ; 0x102b0 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x102b8 - -.MenuData: ; 0x102b8 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 3 ; items - db "USE@" - db "SEL@" - db "QUIT@" -; 0x102c7 - -Jumptable_UseRegisterQuit: ; 102c7 - dw UseItem - dw RegisterItem - dw QuitItemSubmenu -; 102cd - -MenuHeader_HoldableKeyItem: ; 0x102cd - db MENU_BACKUP_TILES ; flags - menu_coords 13, 3, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x102d5 - -.MenuData: ; 0x102d5 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 4 ; items - db "GIVE@" - db "TOSS@" - db "SEL@" - db "QUIT@" -; 0x102ea - -Jumptable_GiveTossRegisterQuit: ; 102ea - dw GiveItem - dw TossMenu - dw RegisterItem - dw QuitItemSubmenu -; 102f2 - -MenuHeader_HoldableItem: ; 0x102f2 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 5, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x102fa - -.MenuData: ; 0x102fa - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 3 ; items - db "GIVE@" - db "TOSS@" - db "QUIT@" -; 0x1030b - -Jumptable_GiveTossQuit: ; 1030b - dw GiveItem - dw TossMenu - dw QuitItemSubmenu - -; 10311 - -UseItem: ; 10311 - farcall CheckItemMenu - ld a, [wItemAttributeParamBuffer] - ld hl, .dw - rst JumpTable - ret -; 1031f - -.dw ; 1031f (4:431f) -; entries correspond to ITEMMENU_* constants - dw .Oak ; ITEMMENU_NOUSE - dw .Oak - dw .Oak - dw .Oak - dw .Current ; ITEMMENU_CURRENT - dw .Party ; ITEMMENU_PARTY - dw .Field ; ITEMMENU_CLOSE -; 1035c - -.Oak: ; 1032d (4:432d) - ld hl, Text_ThisIsntTheTime - call Pack_PrintTextNoScroll - ret - -.Current: ; 10334 (4:4334) - call DoItemEffect - ret - -.Party: ; 10338 (4:4338) - ld a, [wPartyCount] - and a - jr z, .NoPokemon - call DoItemEffect - xor a - ld [hBGMapMode], a - call Pack_InitGFX - call WaitBGMap_DrawPackGFX - call Pack_InitColors - ret - -.NoPokemon: - ld hl, TextJump_YouDontHaveAMon - call Pack_PrintTextNoScroll - ret - -.Field: ; 10355 (4:4355) - call DoItemEffect - ld a, [wItemEffectSucceeded] - and a - jr z, .Oak - ld a, PACKSTATE_QUITRUNSCRIPT - ld [wJumptableIndex], a - ret -; 10364 (4:4364) - -TossMenu: ; 10364 - ld hl, Text_ThrowAwayHowMany - call Pack_PrintTextNoScroll - farcall SelectQuantityToToss - push af - call ExitMenu - pop af - jr c, .finish - call Pack_GetItemName - ld hl, Text_ConfirmThrowAway - call MenuTextBox - call YesNoBox - push af - call ExitMenu - pop af - jr c, .finish - ld hl, wNumItems - ld a, [wCurItemQuantity] - call TossItem - call Pack_GetItemName - ld hl, Text_ThrewAway - call Pack_PrintTextNoScroll -.finish - ret -; 1039d - -Unreferenced_ResetPocketCursorPositions: ; 1039d - ld a, [wCurrPocket] - and a ; ITEM_POCKET - jr z, .items - dec a ; BALL_POCKET - jr z, .balls - dec a ; KEY_ITEM_POCKET - jr z, .key - ret - -.balls - xor a - ld [wBallsPocketCursor], a - ld [wBallsPocketScrollPosition], a - ret - -.items - xor a - ld [wItemsPocketCursor], a - ld [wItemsPocketScrollPosition], a - ret - -.key - xor a - ld [wKeyItemsPocketCursor], a - ld [wKeyItemsPocketScrollPosition], a - ret -; 103c2 - -RegisterItem: ; 103c2 - farcall CheckSelectableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .cant_register - ld a, [wCurrPocket] - rrca - rrca - and $c0 - ld b, a - ld a, [wCurItemQuantity] - inc a - and $3f - or b - ld [wWhichRegisteredItem], a - ld a, [wCurItem] - ld [wRegisteredItem], a - call Pack_GetItemName - ld de, SFX_FULL_HEAL - call WaitPlaySFX - ld hl, Text_RegisteredItem - call Pack_PrintTextNoScroll - ret - -.cant_register - ld hl, Text_CantRegister - call Pack_PrintTextNoScroll - ret -; 103fd - -GiveItem: ; 103fd - ld a, [wPartyCount] - and a - jp z, .NoPokemon - ld a, [wOptions] - push af - res NO_TEXT_SCROLL, a - ld [wOptions], a - ld a, PARTYMENUACTION_GIVE_ITEM - ld [wPartyMenuActionText], a - call ClearBGPalettes - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX -.loop - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes - call DelayFrame - farcall PartyMenuSelect - jr c, .finish - ld a, [wCurPartySpecies] - cp EGG - jr nz, .give - ld hl, .Egg - call PrintText - jr .loop - -.give - ld a, [wJumptableIndex] - push af - ld a, [wPackJumptableIndex] - push af - call GetCurNick - ld hl, wStringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - call TryGiveItemToPartymon - pop af - ld [wPackJumptableIndex], a - pop af - ld [wJumptableIndex], a -.finish - pop af - ld [wOptions], a - xor a - ld [hBGMapMode], a - call Pack_InitGFX - call WaitBGMap_DrawPackGFX - call Pack_InitColors - ret - -.NoPokemon: ; 10486 (4:4486) - ld hl, TextJump_YouDontHaveAMon - call Pack_PrintTextNoScroll - ret -; 1048d (4:448d) -.Egg: ; 0x1048d - ; An EGG can't hold an item. - text_jump Text_AnEGGCantHoldAnItem - db "@" -; 0x10492 - -QuitItemSubmenu: ; 10492 - ret -; 10493 - -BattlePack: ; 10493 - ld hl, wOptions - set NO_TEXT_SCROLL, [hl] - call InitPackBuffers -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .end - call .RunJumptable - call DelayFrame - jr .loop - -.end - ld a, [wCurrPocket] - ld [wLastPocket], a - ld hl, wOptions - res NO_TEXT_SCROLL, [hl] - ret -; 104b9 - -.RunJumptable: ; 104b9 - ld a, [wJumptableIndex] - ld hl, .Jumptable - call Pack_GetJumptablePointer - jp hl - -; 104c3 - -.Jumptable: ; 104c3 (4:44c3) -; entries correspond to PACKSTATE_* constants - dw .InitGFX ; 0 - dw .InitItemsPocket ; 1 - dw .ItemsPocketMenu ; 2 - dw .InitBallsPocket ; 3 - dw .BallsPocketMenu ; 4 - dw .InitKeyItemsPocket ; 5 - dw .KeyItemsPocketMenu ; 6 - dw .InitTMHMPocket ; 7 - dw .TMHMPocketMenu ; 8 - dw Pack_QuitNoScript ; 9 - dw Pack_QuitRunScript ; 10 - -.InitGFX: ; 104d9 (4:44d9) - xor a - ld [hBGMapMode], a - call Pack_InitGFX - ld a, [wPackJumptableIndex] - ld [wJumptableIndex], a - call Pack_InitColors - ret - -.InitItemsPocket: ; 104e9 (4:44e9) - xor a ; ITEM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.ItemsPocketMenu: ; 104fa (4:44fa) - ld hl, ItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wItemsPocketCursor], a - ld b, PACKSTATE_INITTMHMPOCKET ; left - ld c, PACKSTATE_INITBALLSPOCKET ; right - call Pack_InterpretJoypad - ret c - call ItemSubmenu - ret - -.InitKeyItemsPocket: ; 10527 (4:4527) - ld a, KEY_ITEM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.KeyItemsPocketMenu: ; 10539 (4:4539) - ld hl, KeyItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wKeyItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wKeyItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wKeyItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wKeyItemsPocketCursor], a - ld b, PACKSTATE_INITBALLSPOCKET ; left - ld c, PACKSTATE_INITTMHMPOCKET ; right - call Pack_InterpretJoypad - ret c - call ItemSubmenu - ret - -.InitTMHMPocket: ; 10566 (4:4566) - ld a, TM_HM_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - xor a - ld [hBGMapMode], a - call WaitBGMap_DrawPackGFX - ld hl, Text_PackEmptyString - call Pack_PrintTextNoScroll - call Pack_JumptableNext - ret - -.TMHMPocketMenu: ; 10581 (4:4581) - farcall TMHMPocket - ld b, PACKSTATE_INITKEYITEMSPOCKET ; left - ld c, PACKSTATE_INITITEMSPOCKET ; right - call Pack_InterpretJoypad - ret c - xor a - call TMHMSubmenu - ret - -.InitBallsPocket: ; 10594 (4:4594) - ld a, BALL_POCKET - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - call Pack_JumptableNext - ret - -.BallsPocketMenu: ; 105a6 (4:45a6) - ld hl, BallsPocketMenuHeader - call CopyMenuHeader - ld a, [wBallsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wBallsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wBallsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wBallsPocketCursor], a - ld b, PACKSTATE_INITITEMSPOCKET ; left - ld c, PACKSTATE_INITKEYITEMSPOCKET ; right - call Pack_InterpretJoypad - ret c - call ItemSubmenu - ret - -ItemSubmenu: ; 105d3 (4:45d3) - farcall CheckItemContext - ld a, [wItemAttributeParamBuffer] -TMHMSubmenu: ; 105dc (4:45dc) - and a - jr z, .NoUse - ld hl, .UsableMenuHeader - ld de, .UsableJumptable - jr .proceed - -.NoUse: - ld hl, .UnusableMenuHeader - ld de, .UnusableJumptable -.proceed - push de - call LoadMenuHeader - call VerticalMenu - call ExitMenu - pop hl - ret c - ld a, [wMenuCursorY] - dec a - call Pack_GetJumptablePointer - jp hl - -; 10601 (4:4601) -.UsableMenuHeader: ; 0x10601 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .UsableMenuData - db 1 ; default option -; 0x10609 - -.UsableMenuData: ; 0x10609 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "USE@" - db "QUIT@" -; 0x10614 - -.UsableJumptable: ; 10614 - dw .Use - dw .Quit -; 10618 - -.UnusableMenuHeader: ; 0x10618 - db MENU_BACKUP_TILES ; flags - menu_coords 13, 9, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .UnusableMenuData - db 1 ; default option -; 0x10620 - -.UnusableMenuData: ; 0x10620 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 1 ; items - db "QUIT@" -; 0x10627 - -.UnusableJumptable: ; 10627 - dw .Quit -; 10629 - -.Use: ; 10629 - farcall CheckItemContext - ld a, [wItemAttributeParamBuffer] - ld hl, .ItemFunctionJumptable - rst JumpTable - ret - -.ItemFunctionJumptable: ; 10637 (4:4637) -; entries correspond to ITEMMENU_* constants - dw .Oak ; ITEMMENU_NOUSE - dw .Oak - dw .Oak - dw .Oak - dw .Unused ; ITEMMENU_CURRENT - dw .BattleField ; ITEMMENU_PARTY - dw .BattleOnly ; ITEMMENU_CLOSE - -.Oak: ; 10645 (4:4645) - ld hl, Text_ThisIsntTheTime - call Pack_PrintTextNoScroll - ret - -.Unused: ; 1064c (4:464c) - call DoItemEffect - ld a, [wItemEffectSucceeded] - and a - jr nz, .ReturnToBattle - ret - -.BattleField: ; 10656 (4:4656) - call DoItemEffect - ld a, [wItemEffectSucceeded] - and a - jr nz, .quit_run_script - xor a - ld [hBGMapMode], a - call Pack_InitGFX - call WaitBGMap_DrawPackGFX - call Pack_InitColors - ret - -.ReturnToBattle: ; 1066c (4:466c) - call ClearBGPalettes - jr .quit_run_script - -.BattleOnly: ; 10671 (4:4671) - call DoItemEffect - ld a, [wItemEffectSucceeded] - and a - jr z, .Oak - cp $2 - jr z, .didnt_use_item -.quit_run_script ; 1067e (4:467e) - ld a, PACKSTATE_QUITRUNSCRIPT - ld [wJumptableIndex], a - ret - -.didnt_use_item ; 10684 (4:4684) - xor a - ld [wItemEffectSucceeded], a - ret -; 10689 (4:4689) -.Quit: ; 10689 - ret -; 1068a - -InitPackBuffers: ; 1068a - xor a - ld [wJumptableIndex], a - ; pocket id -> jumptable index - ld a, [wLastPocket] - maskbits NUM_POCKETS - ld [wCurrPocket], a - inc a - add a - dec a - ld [wPackJumptableIndex], a - xor a ; FALSE - ld [wPackUsedItem], a - xor a - ld [wSwitchItem], a - ret -; 106a5 - -DepositSellInitPackBuffers: ; 106a5 - xor a - ld [hBGMapMode], a - ld [wJumptableIndex], a ; PACKSTATE_INITGFX - ld [wPackJumptableIndex], a ; PACKSTATE_INITGFX - ld [wCurrPocket], a ; ITEM_POCKET - ld [wPackUsedItem], a - ld [wSwitchItem], a - call Pack_InitGFX - call Pack_InitColors - ret -; 106be - -DepositSellPack: ; 106be -.loop - call .RunJumptable - call DepositSellTutorial_InterpretJoypad - jr c, .loop - ret -; 106c7 - -.RunJumptable: ; 106c7 - ld a, [wJumptableIndex] - ld hl, .Jumptable - call Pack_GetJumptablePointer - jp hl - -; 106d1 - -.Jumptable: ; 106d1 (4:46d1) -; entries correspond to *_POCKET constants - dw .ItemsPocket - dw .BallsPocket - dw .KeyItemsPocket - dw .TMHMPocket - -.ItemsPocket: ; 106d9 (4:46d9) - xor a ; ITEM_POCKET - call InitPocket - ld hl, PC_Mart_ItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wItemsPocketCursor], a - ret - -.KeyItemsPocket: ; 106ff (4:46ff) - ld a, KEY_ITEM_POCKET - call InitPocket - ld hl, PC_Mart_KeyItemsPocketMenuHeader - call CopyMenuHeader - ld a, [wKeyItemsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wKeyItemsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wKeyItemsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wKeyItemsPocketCursor], a - ret - -.TMHMPocket: ; 10726 (4:4726) - ld a, TM_HM_POCKET - call InitPocket - call WaitBGMap_DrawPackGFX - farcall TMHMPocket - ld a, [wCurItem] - ld [wCurItem], a - ret - -.BallsPocket: ; 1073b (4:473b) - ld a, BALL_POCKET - call InitPocket - ld hl, PC_Mart_BallsPocketMenuHeader - call CopyMenuHeader - ld a, [wBallsPocketCursor] - ld [wMenuCursorBuffer], a - ld a, [wBallsPocketScrollPosition] - ld [wMenuScrollPosition], a - call ScrollingMenu - ld a, [wMenuScrollPosition] - ld [wBallsPocketScrollPosition], a - ld a, [wMenuCursorY] - ld [wBallsPocketCursor], a - ret - -InitPocket: ; 10762 (4:4762) - ld [wCurrPocket], a - call ClearPocketList - call DrawPocketName - call WaitBGMap_DrawPackGFX - ret - -DepositSellTutorial_InterpretJoypad: ; 1076f - ld hl, wMenuJoypad - ld a, [hl] - and A_BUTTON - jr nz, .a_button - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and D_LEFT - jr nz, .d_left - ld a, [hl] - and D_RIGHT - jr nz, .d_right - scf - ret - -.a_button - ld a, TRUE - ld [wPackUsedItem], a - and a - ret - -.b_button - xor a ; FALSE - ld [wPackUsedItem], a - and a - ret - -.d_left - ld a, [wJumptableIndex] - dec a - maskbits NUM_POCKETS - ld [wJumptableIndex], a - push de - ld de, SFX_SWITCH_POCKETS - call PlaySFX - pop de - scf - ret - -.d_right - ld a, [wJumptableIndex] - inc a - maskbits NUM_POCKETS - ld [wJumptableIndex], a - push de - ld de, SFX_SWITCH_POCKETS - call PlaySFX - pop de - scf - ret -; 107bb - -TutorialPack: ; 107bb - call DepositSellInitPackBuffers - ld a, [wInputType] - or a - jr z, .loop - farcall _DudeAutoInput_RightA -.loop - call .RunJumptable - call DepositSellTutorial_InterpretJoypad - jr c, .loop - xor a ; FALSE - ld [wPackUsedItem], a - ret -; 107d7 - -.RunJumptable: ; 107d7 - ld a, [wJumptableIndex] - ld hl, .dw - call Pack_GetJumptablePointer - jp hl - -; 107e1 - -.dw ; 107e1 (4:47e1) -; entries correspond to *_POCKET constants - dw .Items - dw .Balls - dw .KeyItems - dw .TMHM - -.Items: ; 107e9 (4:47e9) - xor a ; ITEM_POCKET - ld hl, .ItemsMenuHeader - jr .DisplayPocket - -; 107ef (4:47ef) -.ItemsMenuHeader: ; 0x107ef - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .ItemsMenuData - db 1 ; default option -; 0x107f7 - -.ItemsMenuData: ; 0x107f7 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wDudeNumItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10807 - -.KeyItems: ; 10807 (4:4807) - ld a, KEY_ITEM_POCKET - ld hl, .KeyItemsMenuHeader - jr .DisplayPocket - -; 1080e (4:480e) -.KeyItemsMenuHeader: ; 0x1080e - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .KeyItemsMenuData - db 1 ; default option -; 0x10816 - -.KeyItemsMenuData: ; 0x10816 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wDudeNumKeyItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10826 - -.TMHM: ; 10826 (4:4826) - ld a, TM_HM_POCKET - call InitPocket - call WaitBGMap_DrawPackGFX - farcall TMHMPocket - ld a, [wCurItem] - ld [wCurItem], a - ret - -.Balls: ; 1083b (4:483b) - ld a, BALL_POCKET - ld hl, .BallsMenuHeader - jr .DisplayPocket - -; 10842 (4:4842) -.BallsMenuHeader: ; 0x10842 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .BallsMenuData - db 1 ; default option -; 0x1084a - -.BallsMenuData: ; 0x1084a - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wDudeNumBalls - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 1085a - -.DisplayPocket: ; 1085a (4:485a) - push hl - call InitPocket - pop hl - call CopyMenuHeader - call ScrollingMenu - ret - -Pack_JumptableNext: ; 10866 (4:4866) - ld hl, wJumptableIndex - inc [hl] - ret - -Pack_GetJumptablePointer: ; 1086b - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret -; 10874 - -Pack_QuitNoScript: ; 10874 (4:4874) - ld hl, wJumptableIndex - set 7, [hl] - xor a ; FALSE - ld [wPackUsedItem], a - ret - -Pack_QuitRunScript: ; 1087e (4:487e) - ld hl, wJumptableIndex - set 7, [hl] - ld a, TRUE - ld [wPackUsedItem], a - ret - -Pack_PrintTextNoScroll: ; 10889 (4:4889) - ld a, [wOptions] - push af - set NO_TEXT_SCROLL, a - ld [wOptions], a - call PrintText - pop af - ld [wOptions], a - ret - -WaitBGMap_DrawPackGFX: ; 1089a (4:489a) - call WaitBGMap -DrawPackGFX: ; 1089d - ld a, [wCurrPocket] - maskbits NUM_POCKETS - ld e, a - ld d, $0 - ld a, [wBattleType] - cp BATTLETYPE_TUTORIAL - jr z, .male_dude - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr nz, .female -.male_dude - ld hl, PackGFXPointers - add hl, de - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - ld hl, vTiles2 tile $50 - lb bc, BANK(PackGFX), 15 - call Request2bpp - ret - -.female - farcall DrawKrisPackGFX - ret -; 108cc - -PackGFXPointers: ; 108cc - dw PackGFX + (15 tiles) * 1 ; ITEM_POCKET - dw PackGFX + (15 tiles) * 3 ; BALL_POCKET - dw PackGFX + (15 tiles) * 0 ; KEY_ITEM_POCKET - dw PackGFX + (15 tiles) * 2 ; TM_HM_POCKET -; 108d4 - -Pack_InterpretJoypad: ; 108d4 (4:48d4) - ld hl, wMenuJoypad - ld a, [wSwitchItem] - and a - jr nz, .switching_item - ld a, [hl] - and A_BUTTON - jr nz, .a_button - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and D_LEFT - jr nz, .d_left - ld a, [hl] - and D_RIGHT - jr nz, .d_right - ld a, [hl] - and SELECT - jr nz, .select - scf - ret - -.a_button - and a - ret - -.b_button - ld a, PACKSTATE_QUITNOSCRIPT - ld [wJumptableIndex], a - scf - ret - -.d_left - ld a, b - ld [wJumptableIndex], a - ld [wPackJumptableIndex], a - push de - ld de, SFX_SWITCH_POCKETS - call PlaySFX - pop de - scf - ret - -.d_right - ld a, c - ld [wJumptableIndex], a - ld [wPackJumptableIndex], a - push de - ld de, SFX_SWITCH_POCKETS - call PlaySFX - pop de - scf - ret - -.select - farcall SwitchItemsInBag - ld hl, Text_MoveItemWhere - call Pack_PrintTextNoScroll - scf - ret - -.switching_item - ld a, [hl] - and A_BUTTON | SELECT - jr nz, .place_insert - ld a, [hl] - and B_BUTTON - jr nz, .end_switch - scf - ret - -.place_insert - farcall SwitchItemsInBag - ld de, SFX_SWITCH_POKEMON - call WaitPlaySFX - ld de, SFX_SWITCH_POKEMON - call WaitPlaySFX -.end_switch - xor a - ld [wSwitchItem], a - scf - ret - -Pack_InitGFX: ; 10955 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - ld hl, PackMenuGFX - ld de, vTiles2 - ld bc, $60 tiles - ld a, BANK(PackMenuGFX) - call FarCopyBytes -; Background (blue if male, pink if female) - hlcoord 0, 1 - ld bc, 11 * SCREEN_WIDTH - ld a, $24 - call ByteFill -; This is where the items themselves will be listed. - hlcoord 5, 1 - lb bc, 11, 15 - call ClearBox -; ◀▶ POCKET ▼▲ ITEMS - hlcoord 0, 0 - ld a, $28 - ld c, SCREEN_WIDTH -.loop - ld [hli], a - inc a - dec c - jr nz, .loop - call DrawPocketName - call PlacePackGFX -; Place the textbox for displaying the item description - hlcoord 0, SCREEN_HEIGHT - 4 - 2 - lb bc, 4, SCREEN_WIDTH - 2 - call TextBox - call EnableLCD - call DrawPackGFX - ret -; 109a5 - -PlacePackGFX: ; 109a5 - hlcoord 0, 3 - ld a, $50 - ld de, SCREEN_WIDTH - 5 - ld b, 3 -.row - ld c, 5 -.column - ld [hli], a - inc a - dec c - jr nz, .column - add hl, de - dec b - jr nz, .row - ret -; 109bb - -DrawPocketName: ; 109bb - ld a, [wCurrPocket] - ; * 15 - ld d, a - swap a - sub d - ld d, 0 - ld e, a - ld hl, .tilemap - add hl, de - ld d, h - ld e, l - hlcoord 0, 7 - ld c, 3 -.row - ld b, 5 -.col - ld a, [de] - inc de - ld [hli], a - dec b - jr nz, .col - ld a, c - ld c, SCREEN_WIDTH - 5 - add hl, bc - ld c, a - dec c - jr nz, .row - ret -; 109e1 - -.tilemap ; 109e1 -; ITEM_POCKET - db $00, $04, $04, $04, $01 ; top border - db $06, $07, $08, $09, $0a ; Items - db $02, $05, $05, $05, $03 ; bottom border -; BALL_POCKET - db $00, $04, $04, $04, $01 ; top border - db $15, $16, $17, $18, $19 ; Balls - db $02, $05, $05, $05, $03 ; bottom border -; KEY_ITEM_POCKET - db $00, $04, $04, $04, $01 ; top border - db $0b, $0c, $0d, $0e, $0f ; Key Items - db $02, $05, $05, $05, $03 ; bottom border -; TM_HM_POCKET - db $00, $04, $04, $04, $01 ; top border - db $10, $11, $12, $13, $14 ; TM/HM - db $02, $05, $05, $05, $03 ; bottom border -; 10a1d - -Pack_GetItemName: ; 10a1d - ld a, [wCurItem] - ld [wNamedObjectIndexBuffer], a - call GetItemName - call CopyName1 - ret -; 10a2a - -Unreferenced_Pack_ClearTilemap: ; 10a2a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, " " - call ByteFill - ret -; 10a36 - -ClearPocketList: ; 10a36 (4:4a36) - hlcoord 5, 2 - lb bc, 10, SCREEN_WIDTH - 5 - call ClearBox - ret - -Pack_InitColors: ; 10a40 - call WaitBGMap - ld b, SCGB_PACKPALS - call GetSGBLayout - call SetPalettes - call DelayFrame - ret -; 10a4f - -ItemsPocketMenuHeader: ; 0x10a4f - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10a57 - -.MenuData: ; 0x10a57 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wNumItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10a67 - -PC_Mart_ItemsPocketMenuHeader: ; 0x10a67 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10a6f - -.MenuData: ; 0x10a6f - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wNumItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10a7f - -KeyItemsPocketMenuHeader: ; 0x10a7f - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10a87 - -.MenuData: ; 0x10a87 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wNumKeyItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10a97 - -PC_Mart_KeyItemsPocketMenuHeader: ; 0x10a97 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10a9f - -.MenuData: ; 0x10a9f - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags - db 5, 8 ; rows, columns - db 1 ; horizontal spacing - dbw 0, wNumKeyItems - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10aaf - -BallsPocketMenuHeader: ; 0x10aaf - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10ab7 - -.MenuData: ; 0x10ab7 - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP | STATICMENU_CURSOR ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wNumBalls - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10ac7 - -PC_Mart_BallsPocketMenuHeader: ; 0x10ac7 - db MENU_BACKUP_TILES ; flags - menu_coords 7, 1, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option -; 0x10acf - -.MenuData: ; 0x10acf - db STATICMENU_ENABLE_SELECT | STATICMENU_ENABLE_LEFT_RIGHT | STATICMENU_ENABLE_START | STATICMENU_WRAP ; flags - db 5, 8 ; rows, columns - db 2 ; horizontal spacing - dbw 0, wNumBalls - dba PlaceMenuItemName - dba PlaceMenuItemQuantity - dba UpdateItemDescription -; 10adf - -Text_PackNoItems: ; 0x10adf - ; No items. - text_jump UnknownText_0x1c0b9a - db "@" -; 0x10ae4 - -Text_ThrowAwayHowMany: ; 0x10ae4 - ; Throw away how many? - text_jump UnknownText_0x1c0ba5 - db "@" -; 0x10ae9 - -Text_ConfirmThrowAway: ; 0x10ae9 - ; Throw away @ @ (S)? - text_jump UnknownText_0x1c0bbb - db "@" -; 0x10aee - -Text_ThrewAway: ; 0x10aee - ; Threw away @ (S). - text_jump UnknownText_0x1c0bd8 - db "@" -; 0x10af3 - -Text_ThisIsntTheTime: ; 0x10af3 - ; OAK: ! This isn't the time to use that! - text_jump UnknownText_0x1c0bee - db "@" -; 0x10af8 - -TextJump_YouDontHaveAMon: ; 0x10af8 - ; You don't have a #MON! - text_jump Text_YouDontHaveAMon - db "@" -; 0x10afd - -Text_RegisteredItem: ; 0x10afd - ; Registered the @ . - text_jump UnknownText_0x1c0c2e - db "@" -; 0x10b02 - -Text_CantRegister: ; 0x10b02 - ; You can't register that item. - text_jump UnknownText_0x1c0c45 - db "@" -; 0x10b07 - -Text_MoveItemWhere: ; 0x10b07 - ; Where should this be moved to? - text_jump UnknownText_0x1c0c63 - db "@" -; 0x10b0c - -Text_PackEmptyString: ; 0x10b0c - ; - text_jump UnknownText_0x1c0c83 - db "@" -; 0x10b11 - -TextJump_YouCantUseItInABattle: ; 0x10b11 - ; Doesn't seem to be used anywhere - ; "You can't use it in a battle." - text_jump Text_YouCantUseItInABattle - db "@" -; 0x10b16 - -PackMenuGFX: -INCBIN "gfx/pack/pack_menu.2bpp" -PackGFX: -INCBIN "gfx/pack/pack.2bpp" diff --git a/engine/menu/scrolling_menu.asm b/engine/menu/scrolling_menu.asm deleted file mode 100755 index 3be3d839c..000000000 --- a/engine/menu/scrolling_menu.asm +++ /dev/null @@ -1,543 +0,0 @@ -_InitScrollingMenu:: ; 245af - xor a - ld [wMenuJoypad], a - ld [hBGMapMode], a - inc a - ld [hInMenu], a - call InitScrollingMenuCursor - call ScrollingMenu_InitFlags - call ScrollingMenu_ValidateSwitchItem - call ScrollingMenu_InitDisplay - call ApplyTilemap - xor a - ld [hBGMapMode], a - ret -; 245cb - -_ScrollingMenu:: ; 245cb -.loop - call ScrollingMenuJoyAction - jp c, .exit - call z, .zero - jr .loop -; 245d6 - -.exit ; 245d6 - call MenuClickSound - ld [wMenuJoypad], a - ld a, 0 - ld [hInMenu], a - ret -; 245e1 - -.zero ; 245e1 - call ScrollingMenu_InitDisplay - ld a, 1 - ld [hBGMapMode], a - ld c, 3 - call DelayFrames - xor a - ld [hBGMapMode], a - ret -; 245f1 - -ScrollingMenu_InitDisplay: ; 245f1 - xor a - ld [hBGMapMode], a - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call ScrollingMenu_UpdateDisplay - call ScrollingMenu_PlaceCursor - call ScrollingMenu_CheckCallFunction3 - pop af - ld [wOptions], a - ret -; 24609 - -ScrollingMenuJoyAction: ; 24609 -.loop - call ScrollingMenuJoypad - ld a, [hJoyLast] - and D_PAD - ld b, a - ld a, [hJoyPressed] - and BUTTONS - or b - bit A_BUTTON_F, a - jp nz, .a_button - bit B_BUTTON_F, a - jp nz, .b_button - bit SELECT_F, a - jp nz, .select - bit START_F, a - jp nz, .start - bit D_RIGHT_F, a - jp nz, .d_right - bit D_LEFT_F, a - jp nz, .d_left - bit D_UP_F, a - jp nz, .d_up - bit D_DOWN_F, a - jp nz, .d_down - jr .loop -; 24640 - -.unreferenced ; unused - ld a, -1 - and a - ret -; 24644 - -.a_button ; 24644 - call PlaceHollowCursor - ld a, [wMenuCursorY] - dec a - call ScrollingMenu_GetListItemCoordAndFunctionArgs - ld a, [wMenuSelection] - ld [wCurItem], a - ld a, [wMenuSelectionQuantity] - ld [wItemQuantityBuffer], a - call ScrollingMenu_GetCursorPosition - dec a - ld [wScrollingMenuCursorPosition], a - ld [wCurItemQuantity], a - ld a, [wMenuSelection] - cp -1 - jr z, .b_button - ld a, A_BUTTON - scf - ret -; 2466f - -.b_button ; 2466f - ld a, B_BUTTON - scf - ret -; 24673 - -.select ; 24673 - ld a, [wMenuDataFlags] - bit 7, a - jp z, xor_a_dec_a - ld a, [wMenuCursorY] - dec a - call ScrollingMenu_GetListItemCoordAndFunctionArgs - ld a, [wMenuSelection] - cp -1 - jp z, xor_a_dec_a - call ScrollingMenu_GetCursorPosition - dec a - ld [wScrollingMenuCursorPosition], a - ld a, SELECT - scf - ret -; 24695 - -.start ; 24695 - ld a, [wMenuDataFlags] - bit 6, a - jp z, xor_a_dec_a - ld a, START - scf - ret -; 246a1 - -.d_left ; 246a1 - ld hl, w2DMenuFlags2 - bit 7, [hl] - jp z, xor_a_dec_a - ld a, [wMenuDataFlags] - bit 3, a - jp z, xor_a_dec_a - ld a, D_LEFT - scf - ret -; 246b5 - -.d_right ; 246b5 - ld hl, w2DMenuFlags2 - bit 7, [hl] - jp z, xor_a_dec_a - ld a, [wMenuDataFlags] - bit 2, a - jp z, xor_a_dec_a - ld a, D_RIGHT - scf - ret -; 246c9 - -.d_up ; 246c9 - ld hl, w2DMenuFlags2 - bit 7, [hl] - jp z, xor_a - ld hl, wMenuScrollPosition - ld a, [hl] - and a - jr z, .xor_dec_up - dec [hl] - jp xor_a - -.xor_dec_up - jp xor_a_dec_a -; 246df - -.d_down ; 246df - ld hl, w2DMenuFlags2 - bit 7, [hl] - jp z, xor_a - ld hl, wMenuScrollPosition - ld a, [wMenuData_ScrollingMenuHeight] - add [hl] - ld b, a - ld a, [wScrollingMenuListSize] - cp b - jr c, .xor_dec_down - inc [hl] - jp xor_a - -.xor_dec_down - jp xor_a_dec_a -; 246fc - -ScrollingMenu_GetCursorPosition: ; 246fc - ld a, [wMenuScrollPosition] - ld c, a - ld a, [wMenuCursorY] - add c - ld c, a - ret -; 24706 - -ScrollingMenu_ClearLeftColumn: ; 24706 (9:4706) - call MenuBoxCoord2Tile - ld de, SCREEN_WIDTH - add hl, de - ld de, 2 * SCREEN_WIDTH - ld a, [wMenuData_ScrollingMenuHeight] -.loop - ld [hl], " " - add hl, de - dec a - jr nz, .loop - ret - -InitScrollingMenuCursor: ; 2471a - ld hl, wMenuData_ItemsPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wMenuData_ItemsPointerBank] - call GetFarByte - ld [wScrollingMenuListSize], a - ld a, [wMenuData_ScrollingMenuHeight] - ld c, a - ld a, [wMenuScrollPosition] - add c - ld c, a - ld a, [wScrollingMenuListSize] - inc a - cp c - jr nc, .skip - ld a, [wMenuData_ScrollingMenuHeight] - ld c, a - ld a, [wScrollingMenuListSize] - inc a - sub c - jr nc, .store - xor a - -.store - ld [wMenuScrollPosition], a - -.skip - ld a, [wMenuScrollPosition] - ld c, a - ld a, [wMenuCursorBuffer] - add c - ld b, a - ld a, [wScrollingMenuListSize] - inc a - cp b - jr c, .asm_2475a - jr nc, .asm_24763 - -.asm_2475a - xor a - ld [wMenuScrollPosition], a - ld a, $1 - ld [wMenuCursorBuffer], a - -.asm_24763 - ret -; 24764 - -ScrollingMenu_InitFlags: ; 24764 - ld a, [wMenuDataFlags] - ld c, a - ld a, [wScrollingMenuListSize] - ld b, a - ld a, [wMenuBorderTopCoord] - add 1 - ld [w2DMenuCursorInitY], a - ld a, [wMenuBorderLeftCoord] - add 0 - ld [w2DMenuCursorInitX], a - ld a, [wMenuData_ScrollingMenuHeight] - cp b - jr c, .no_extra_row - jr z, .no_extra_row - ld a, b - inc a -.no_extra_row - ld [w2DMenuNumRows], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, $8c - bit 2, c - jr z, .skip_set_0 - set 0, a - -.skip_set_0 - bit 3, c - jr z, .skip_set_1 - set 1, a - -.skip_set_1 - ld [w2DMenuFlags1], a - xor a - ld [w2DMenuFlags2], a - ld a, $20 - ld [w2DMenuCursorOffsets], a - ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN - bit 7, c - jr z, .disallow_select - add SELECT - -.disallow_select - bit 6, c - jr z, .disallow_start - add START - -.disallow_start - ld [wMenuJoypadFilter], a - ld a, [w2DMenuNumRows] - ld b, a - ld a, [wMenuCursorBuffer] - and a - jr z, .reset_cursor - cp b - jr z, .cursor_okay - jr c, .cursor_okay - -.reset_cursor - ld a, 1 - -.cursor_okay - ld [wMenuCursorY], a - ld a, 1 - ld [wMenuCursorX], a - xor a - ld [wCursorCurrentTile], a - ld [wCursorCurrentTile + 1], a - ld [wCursorOffCharacter], a - ret -; 247dd - -ScrollingMenu_ValidateSwitchItem: ; 247dd - ld a, [wScrollingMenuListSize] - ld c, a - ld a, [wSwitchItem] - and a - jr z, .done - dec a - cp c - jr c, .done - xor a - ld [wSwitchItem], a - -.done - ret -; 247f0 - -ScrollingMenu_UpdateDisplay: ; 247f0 - call ClearWholeMenuBox - ld a, [wMenuDataFlags] - bit 4, a ; place arrows - jr z, .okay - ld a, [wMenuScrollPosition] - and a - jr z, .okay - ld a, [wMenuBorderTopCoord] - ld b, a - ld a, [wMenuBorderRightCoord] - ld c, a - call Coord2Tile - ld [hl], "▲" - -.okay - call MenuBoxCoord2Tile - ld bc, SCREEN_WIDTH + 1 - add hl, bc - ld a, [wMenuData_ScrollingMenuHeight] - ld b, a - ld c, $0 -.loop - ld a, [wMenuScrollPosition] - add c - ld [wScrollingMenuCursorPosition], a - ld a, c - call ScrollingMenu_GetListItemCoordAndFunctionArgs - ld a, [wMenuSelection] - cp -1 - jr z, .cancel - push bc - push hl - call ScrollingMenu_CallFunctions1and2 - pop hl - ld bc, 2 * SCREEN_WIDTH - add hl, bc - pop bc - inc c - ld a, c - cp b - jr nz, .loop - ld a, [wMenuDataFlags] - bit 4, a ; place arrows - jr z, .done - ld a, [wMenuBorderBottomCoord] - ld b, a - ld a, [wMenuBorderRightCoord] - ld c, a - call Coord2Tile - ld [hl], "▼" - -.done - ret - -.cancel - ld a, [wMenuDataFlags] - bit 0, a ; call function on cancel - jr nz, .call_function - ld de, .string_2485f - call PlaceString - ret - -.string_2485f - db "CANCEL@" - -.call_function - ld d, h - ld e, l - ld hl, wMenuData_ScrollingMenuFunction1 - jp CallPointerAt -; 2486e - -ScrollingMenu_CallFunctions1and2: ; 2486e - push hl - ld d, h - ld e, l - ld hl, wMenuData_ScrollingMenuFunction1 - call CallPointerAt - pop hl - ld a, [wMenuData_ScrollingMenuWidth] - and a - jr z, .done - ld e, a - ld d, $0 - add hl, de - ld d, h - ld e, l - ld hl, wMenuData_ScrollingMenuFunction2 - call CallPointerAt - -.done - ret -; 2488b - -ScrollingMenu_PlaceCursor: ; 2488b - ld a, [wSwitchItem] - and a - jr z, .done - ld b, a - ld a, [wMenuScrollPosition] - cp b - jr nc, .done - ld c, a - ld a, [wMenuData_ScrollingMenuHeight] - add c - cp b - jr c, .done - ld a, b - sub c - dec a - add a - add $1 - ld c, a - ld a, [wMenuBorderTopCoord] - add c - ld b, a - ld a, [wMenuBorderLeftCoord] - add $0 - ld c, a - call Coord2Tile - ld [hl], "▷" - -.done - ret -; 248b8 - -ScrollingMenu_CheckCallFunction3: ; 248b8 - ld a, [wMenuDataFlags] - bit 5, a ; call function 3 - ret z - bit 1, a ; call function 3 if not switching items - jr z, .call - ld a, [wSwitchItem] - and a - ret nz - -.call - ld a, [wMenuCursorY] - dec a - call ScrollingMenu_GetListItemCoordAndFunctionArgs - ld hl, wMenuData_ScrollingMenuFunction3 - call CallPointerAt - ret -; 248d5 - -ScrollingMenu_GetListItemCoordAndFunctionArgs: ; 248d5 - push de - push hl - ld e, a - ld a, [wMenuScrollPosition] - add e - ld e, a - ld d, $0 - ld hl, wMenuData_ItemsPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - inc hl ; items - ld a, [wMenuData_ScrollingMenuSpacing] - cp 1 - jr z, .got_spacing - cp 2 - jr z, .pointless_jump -.pointless_jump - add hl, de -.got_spacing - add hl, de - ld a, [wMenuData_ItemsPointerBank] - call GetFarByte - ld [wMenuSelection], a - ld [wCurItem], a - inc hl - ld a, [wMenuData_ItemsPointerBank] - call GetFarByte - ld [wMenuSelectionQuantity], a - pop hl - pop de - ret -; 2490c diff --git a/engine/menu/start_menu.asm b/engine/menu/start_menu.asm deleted file mode 100755 index 037efd947..000000000 --- a/engine/menu/start_menu.asm +++ /dev/null @@ -1,1993 +0,0 @@ -; StartMenu.Items indexes - const_def - const STARTMENUITEM_POKEDEX ; 0 - const STARTMENUITEM_POKEMON ; 1 - const STARTMENUITEM_PACK ; 2 - const STARTMENUITEM_STATUS ; 3 - const STARTMENUITEM_SAVE ; 4 - const STARTMENUITEM_OPTION ; 5 - const STARTMENUITEM_EXIT ; 6 - const STARTMENUITEM_POKEGEAR ; 7 - const STARTMENUITEM_QUIT ; 8 - - -StartMenu:: ; 125cd - - call ClearWindowData - - ld de, SFX_MENU - call PlaySFX - - farcall ReanchorBGMap_NoOAMUpdate - - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - ld hl, .MenuHeader - jr z, .GotMenuData - ld hl, .ContestMenuHeader -.GotMenuData: - - call LoadMenuHeader - call .SetUpMenuItems - ld a, [wBattleMenuCursorBuffer] - ld [wMenuCursorBuffer], a - call .DrawMenuAccount_ - call DrawVariableLengthMenuBox - call .DrawBugContestStatusBox - call SafeUpdateSprites - call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap - farcall LoadFonts_NoOAMUpdate - call .DrawBugContestStatus - call UpdateTimePals - jr .Select - -.Reopen: - call UpdateSprites - call UpdateTimePals - call .SetUpMenuItems - ld a, [wBattleMenuCursorBuffer] - ld [wMenuCursorBuffer], a - -.Select: - call .GetInput - jr c, .Exit - call .DrawMenuAccount - ld a, [wMenuCursorBuffer] - ld [wBattleMenuCursorBuffer], a - call PlayClickSFX - call PlaceHollowCursor - call .OpenMenu - -; Menu items have different return functions. -; For example, saving exits the menu. - ld hl, .MenuReturns - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.MenuReturns: - dw .Reopen - dw .Exit - dw .ExitMenuCallFuncCloseText - dw .ExitMenuRunScriptCloseText - dw .ExitMenuRunScript - dw .ReturnEnd - dw .ReturnRedraw - -.Exit: - ld a, [hOAMUpdate] - push af - ld a, 1 - ld [hOAMUpdate], a - call LoadFontsExtra - pop af - ld [hOAMUpdate], a -.ReturnEnd: - call ExitMenu -.ReturnEnd2: - call CloseText - call UpdateTimePals - ret - -.GetInput: -; Return carry on exit, and no-carry on selection. - xor a - ld [hBGMapMode], a - call .DrawMenuAccount - call SetUpMenu - ld a, $ff - ld [wMenuSelection], a -.loop - call .PrintMenuAccount - call GetScrollingMenuJoypad - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .b - cp A_BUTTON - jr z, .a - jr .loop -.a - call PlayClickSFX - and a - ret -.b - scf - ret -; 12691 - -.ExitMenuRunScript: ; 12691 - call ExitMenu - ld a, HMENURETURN_SCRIPT - ld [hMenuReturn], a - ret -; 12699 - -.ExitMenuRunScriptCloseText: ; 12699 - call ExitMenu - ld a, HMENURETURN_SCRIPT - ld [hMenuReturn], a - jr .ReturnEnd2 -; 126a2 - -.ExitMenuCallFuncCloseText: ; 126a2 - call ExitMenu - ld hl, wQueuedScriptAddr - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wQueuedScriptBank] - rst FarCall - jr .ReturnEnd2 -; 126b1 - -.ReturnRedraw: ; 126b1 - call .Clear - jp .Reopen -; 126b7 - -.Clear: ; 126b7 - call ClearBGPalettes - call Call_ExitMenu - call ReloadTilesetAndPalettes - call .DrawMenuAccount_ - call DrawVariableLengthMenuBox - call .DrawBugContestStatus - call UpdateSprites - call ret_d90 - call FinishExitMenu - ret -; 126d3 - - -.MenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 10, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default selection - -.ContestMenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 10, 2, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default selection - -.MenuData: - db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_ENABLE_START ; flags - dn 0, 0 ; rows, columns - dw wMenuItemsList - dw .MenuString - dw .Items - -.Items: -; entries correspond to STARTMENUITEM_* constants - dw StartMenu_Pokedex, .PokedexString, .PokedexDesc - dw StartMenu_Pokemon, .PartyString, .PartyDesc - dw StartMenu_Pack, .PackString, .PackDesc - dw StartMenu_Status, .StatusString, .StatusDesc - dw StartMenu_Save, .SaveString, .SaveDesc - dw StartMenu_Option, .OptionString, .OptionDesc - dw StartMenu_Exit, .ExitString, .ExitDesc - dw StartMenu_Pokegear, .PokegearString, .PokegearDesc - dw StartMenu_Quit, .QuitString, .QuitDesc - -.PokedexString: db "#DEX@" -.PartyString: db "#MON@" -.PackString: db "PACK@" -.StatusString: db "@" -.SaveString: db "SAVE@" -.OptionString: db "OPTION@" -.ExitString: db "EXIT@" -.PokegearString: db "GEAR@" -.QuitString: db "QUIT@" - -.PokedexDesc: - db "#MON" - next "database@" - -.PartyDesc: - db "Party " - next "status@" - -.PackDesc: - db "Contains" - next "items@" - -.PokegearDesc: - db "Trainer's" - next "key device@" - -.StatusDesc: - db "Your own" - next "status@" - -.SaveDesc: - db "Save your" - next "progress@" - -.OptionDesc: - db "Change" - next "settings@" - -.ExitDesc: - db "Close this" - next "menu@" - -.QuitDesc: - db "Quit and" - next "be judged.@" - - -.OpenMenu: ; 127e5 - ld a, [wMenuSelection] - call .GetMenuAccountTextPointer - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 127ef - -.MenuString: ; 127ef - push de - ld a, [wMenuSelection] - call .GetMenuAccountTextPointer - inc hl - inc hl - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - call PlaceString - ret -; 12800 - -.MenuDesc: ; 12800 - push de - ld a, [wMenuSelection] - cp $ff - jr z, .none - call .GetMenuAccountTextPointer -rept 4 - inc hl -endr - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - call PlaceString - ret -.none - pop de - ret -; 12819 - - -.GetMenuAccountTextPointer: ; 12819 - ld e, a - ld d, 0 - ld hl, wMenuDataPointerTableAddr - ld a, [hli] - ld h, [hl] - ld l, a -rept 6 - add hl, de -endr - ret -; 12829 - - -.SetUpMenuItems: ; 12829 - xor a - ld [wWhichIndexSet], a - call .FillMenuList - - ld hl, wStatusFlags - bit STATUSFLAGS_POKEDEX_F, [hl] - jr z, .no_pokedex - ld a, STARTMENUITEM_POKEDEX - call .AppendMenuList -.no_pokedex - - ld a, [wPartyCount] - and a - jr z, .no_pokemon - ld a, STARTMENUITEM_POKEMON - call .AppendMenuList -.no_pokemon - - ld a, [wLinkMode] - and a - jr nz, .no_pack - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - jr nz, .no_pack - ld a, STARTMENUITEM_PACK - call .AppendMenuList -.no_pack - - ld hl, wPokegearFlags - bit POKEGEAR_OBTAINED_F, [hl] - jr z, .no_pokegear - ld a, STARTMENUITEM_POKEGEAR - call .AppendMenuList -.no_pokegear - - ld a, STARTMENUITEM_STATUS - call .AppendMenuList - - ld a, [wLinkMode] - and a - jr nz, .no_save - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - ld a, STARTMENUITEM_QUIT - jr nz, .write - ld a, STARTMENUITEM_SAVE -.write - call .AppendMenuList -.no_save - - ld a, STARTMENUITEM_OPTION - call .AppendMenuList - ld a, STARTMENUITEM_EXIT - call .AppendMenuList - ld a, c - ld [wMenuItemsList], a - ret -; 1288d - - -.FillMenuList: ; 1288d - xor a - ld hl, wMenuItemsList - ld [hli], a - ld a, -1 - ld bc, wMenuItemsListEnd - (wMenuItemsList + 1) - call ByteFill - ld de, wMenuItemsList + 1 - ld c, 0 - ret -; 128a0 - -.AppendMenuList: ; 128a0 - ld [de], a - inc de - inc c - ret -; 128a4 - -.DrawMenuAccount_: ; 128a4 - jp .DrawMenuAccount -; 128a7 - -.PrintMenuAccount: ; 128a7 - call .IsMenuAccountOn - ret z - call .DrawMenuAccount - decoord 0, 14 - jp .MenuDesc -; 128b4 - -.DrawMenuAccount: ; 128b4 - call .IsMenuAccountOn - ret z - hlcoord 0, 13 - lb bc, 5, 10 - call ClearBox - hlcoord 0, 13 - ld b, 3 - ld c, 8 - jp TextBoxPalette -; 128cb - -.IsMenuAccountOn: ; 128cb - ld a, [wOptions2] - and 1 << MENU_ACCOUNT - ret -; 128d1 - -.DrawBugContestStatusBox: ; 128d1 - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - ret z - farcall StartMenu_DrawBugContestStatusBox - ret -; 128de - -.DrawBugContestStatus: ; 128de - ld hl, wStatusFlags2 - bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] - jr nz, .contest - ret -.contest - farcall StartMenu_PrintBugContestStatus - ret -; 128ed - - -StartMenu_Exit: ; 128ed -; Exit the menu. - - ld a, 1 - ret -; 128f0 - - -StartMenu_Quit: ; 128f0 -; Retire from the bug catching contest. - - ld hl, .EndTheContestText - call StartMenuYesNo - jr c, .DontEndContest - ld a, BANK(BugCatchingContestReturnToGateScript) - ld hl, BugCatchingContestReturnToGateScript - call FarQueueScript - ld a, 4 - ret - -.DontEndContest: - ld a, 0 - ret - -.EndTheContestText: - text_jump UnknownText_0x1c1a6c - db "@" -; 1290b - - -StartMenu_Save: ; 1290b -; Save the game. - - call BufferScreen - farcall SaveMenu - jr nc, .asm_12919 - ld a, 0 - ret -.asm_12919 - ld a, 1 - ret -; 1291c - - -StartMenu_Option: ; 1291c -; Game options. - - call FadeToMenu - farcall OptionsMenu - ld a, 6 - ret -; 12928 - - -StartMenu_Status: ; 12928 -; Player status. - - call FadeToMenu - farcall TrainerCard - call CloseSubmenu - ld a, 0 - ret -; 12937 - - -StartMenu_Pokedex: ; 12937 - - ld a, [wPartyCount] - and a - jr z, .asm_12949 - - call FadeToMenu - farcall Pokedex - call CloseSubmenu - -.asm_12949 - ld a, 0 - ret -; 1294c - - -StartMenu_Pokegear: ; 1294c - - call FadeToMenu - farcall PokeGear - call CloseSubmenu - ld a, 0 - ret -; 1295b - - -StartMenu_Pack: ; 1295b - - call FadeToMenu - farcall Pack - ld a, [wPackUsedItem] - and a - jr nz, .used_item - call CloseSubmenu - ld a, 0 - ret - -.used_item - call ExitAllMenus - ld a, 4 - ret -; 12976 - - -StartMenu_Pokemon: ; 12976 - - ld a, [wPartyCount] - and a - jr z, .return - - call FadeToMenu - -.choosemenu - xor a - ld [wPartyMenuActionText], a ; Choose a POKéMON. - call ClearBGPalettes - -.menu - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX - -.menunoreload - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes ; load regular palettes? - call DelayFrame - farcall PartyMenuSelect - jr c, .return ; if cancelled or pressed B - - call PokemonActionSubmenu - cp 3 - jr z, .menu - cp 0 - jr z, .choosemenu - cp 1 - jr z, .menunoreload - cp 2 - jr z, .quit - -.return - call CloseSubmenu - ld a, 0 - ret - -.quit - ld a, b - push af - call ExitAllMenus - pop af - ret -; 129d5 - -HasNoItems: ; 129d5 - ld a, [wNumItems] - and a - ret nz - ld a, [wNumKeyItems] - and a - ret nz - ld a, [wNumBalls] - and a - ret nz - ld hl, wTMsHMs - ld b, NUM_TMS + NUM_HMS -.loop - ld a, [hli] - and a - jr nz, .done - dec b - jr nz, .loop - scf - ret -.done - and a - ret - -TossItemFromPC: ; 129f4 - push de - call PartyMonItemName - farcall _CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .key_item - ld hl, .TossHowMany - call MenuTextBox - farcall SelectQuantityToToss - push af - call CloseWindow - call ExitMenu - pop af - jr c, .quit - ld hl, .ConfirmToss - call MenuTextBox - call YesNoBox - push af - call ExitMenu - pop af - jr c, .quit - pop hl - ld a, [wCurItemQuantity] - call TossItem - call PartyMonItemName - ld hl, .TossedThisMany - call MenuTextBox - call ExitMenu - and a - ret - -.key_item - call .CantToss -.quit - pop hl - scf - ret - -.TossHowMany: - ; Toss out how many @ (S)? - text_jump UnknownText_0x1c1a90 - db "@" - -.ConfirmToss: - ; Throw away @ @ (S)? - text_jump UnknownText_0x1c1aad - db "@" - -.TossedThisMany: - ; Discarded @ (S). - text_jump UnknownText_0x1c1aca - db "@" - -.CantToss: - ld hl, .TooImportantToToss - call MenuTextBoxBackup - ret - -.TooImportantToToss: - ; That's too impor- tant to toss out! - text_jump UnknownText_0x1c1adf - db "@" -; 0x12a60 - -CantUseItem: ; 12a60 - ld hl, CantUseItemText - call MenuTextBoxWaitButton - ret -; 12a67 - -CantUseItemText: ; 12a67 - text_jump UnknownText_0x1c1b03 - db "@" -; 12a6c - - -PartyMonItemName: ; 12a6c - ld a, [wCurItem] - ld [wd265], a - call GetItemName - call CopyName1 - ret -; 12a79 - - -CancelPokemonAction: ; 12a79 - farcall InitPartyMenuWithCancel - farcall UnfreezeMonIcons - ld a, 1 - ret -; 12a88 - - -PokemonActionSubmenu: ; 12a88 - hlcoord 1, 15 - lb bc, 2, 18 - call ClearBox - farcall MonSubmenu - call GetCurNick - ld a, [wMenuSelection] - ld hl, .Actions - ld de, 3 - call IsInArray - jr nc, .nothing - - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.nothing - ld a, 0 - ret - -.Actions: - dbw MONMENUITEM_CUT, MonMenu_Cut - dbw MONMENUITEM_FLY, MonMenu_Fly - dbw MONMENUITEM_SURF, MonMenu_Surf - dbw MONMENUITEM_STRENGTH, MonMenu_Strength - dbw MONMENUITEM_FLASH, MonMenu_Flash - dbw MONMENUITEM_WHIRLPOOL, MonMenu_Whirlpool - dbw MONMENUITEM_DIG, MonMenu_Dig - dbw MONMENUITEM_TELEPORT, MonMenu_Teleport - dbw MONMENUITEM_SOFTBOILED, MonMenu_Softboiled_MilkDrink - dbw MONMENUITEM_MILKDRINK, MonMenu_Softboiled_MilkDrink - dbw MONMENUITEM_HEADBUTT, MonMenu_Headbutt - dbw MONMENUITEM_WATERFALL, MonMenu_Waterfall - dbw MONMENUITEM_ROCKSMASH, MonMenu_RockSmash - dbw MONMENUITEM_SWEETSCENT, MonMenu_SweetScent - dbw MONMENUITEM_STATS, OpenPartyStats - dbw MONMENUITEM_SWITCH, SwitchPartyMons - dbw MONMENUITEM_ITEM, GiveTakePartyMonItem - dbw MONMENUITEM_CANCEL, CancelPokemonAction - dbw MONMENUITEM_MOVE, ManagePokemonMoves - dbw MONMENUITEM_MAIL, MonMailAction -; 12aec - - -SwitchPartyMons: ; 12aec - -; Don't try if there's nothing to switch! - ld a, [wPartyCount] - cp 2 - jr c, .DontSwitch - - ld a, [wCurPartyMon] - inc a - ld [wSwitchMon], a - - farcall HoldSwitchmonIcon - farcall InitPartyMenuNoCancel - - ld a, PARTYMENUACTION_MOVE - ld [wPartyMenuActionText], a - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - - hlcoord 0, 1 - ld bc, SCREEN_WIDTH * 2 - ld a, [wSwitchMon] - dec a - call AddNTimes - ld [hl], "▷" - call WaitBGMap - call SetPalettes - call DelayFrame - - farcall PartyMenuSelect - bit 1, b - jr c, .DontSwitch - - farcall _SwitchPartyMons - - xor a - ld [wPartyMenuActionText], a - - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX - - ld a, 1 - ret - -.DontSwitch: - xor a - ld [wPartyMenuActionText], a - call CancelPokemonAction - ret -; 12b60 - - -GiveTakePartyMonItem: ; 12b60 - -; Eggs can't hold items! - ld a, [wCurPartySpecies] - cp EGG - jr z, .cancel - - ld hl, GiveTakeItemMenuData - call LoadMenuHeader - call VerticalMenu - call ExitMenu - jr c, .cancel - - call GetCurNick - ld hl, wStringBuffer1 - ld de, wMonOrItemNameBuffer - ld bc, MON_NAME_LENGTH - call CopyBytes - ld a, [wMenuCursorY] - cp 1 - jr nz, .take - - call LoadStandardMenuHeader - call ClearPalettes - call .GiveItem - call ClearPalettes - call LoadFontsBattleExtra - call ExitMenu - ld a, 0 - ret - -.take - call TakePartyItem - ld a, 3 - ret - -.cancel - ld a, 3 - ret -; 12ba9 - - -.GiveItem: - - farcall DepositSellInitPackBuffers - -.loop - farcall DepositSellPack - - ld a, [wcf66] - and a - jr z, .quit - - ld a, [wcf65] - cp 2 - jr z, .next - - call CheckTossableItem - ld a, [wItemAttributeParamBuffer] - and a - jr nz, .next - - call TryGiveItemToPartymon - jr .quit - -.next - ld hl, CantBeHeldText - call MenuTextBoxBackup - jr .loop - -.quit - ret -; 12bd9 - - -TryGiveItemToPartymon: ; 12bd9 - - call SpeechTextBox - call PartyMonItemName - call GetPartyItemLocation - ld a, [hl] - and a - jr z, .give_item_to_mon - - push hl - ld d, a - farcall ItemIsMail - pop hl - jr c, .please_remove_mail - ld a, [hl] - jr .already_holding_item - -.give_item_to_mon - call GiveItemToPokemon - ld hl, MadeHoldText - call MenuTextBoxBackup - call GivePartyItem - ret - -.please_remove_mail - ld hl, PleaseRemoveMailText - call MenuTextBoxBackup - ret - -.already_holding_item - ld [wd265], a - call GetItemName - ld hl, SwitchAlreadyHoldingText - call StartMenuYesNo - jr c, .abort - - call GiveItemToPokemon - ld a, [wd265] - push af - ld a, [wCurItem] - ld [wd265], a - pop af - ld [wCurItem], a - call ReceiveItemFromPokemon - jr nc, .bag_full - - ld hl, TookAndMadeHoldText - call MenuTextBoxBackup - ld a, [wd265] - ld [wCurItem], a - call GivePartyItem - ret - -.bag_full - ld a, [wd265] - ld [wCurItem], a - call ReceiveItemFromPokemon - ld hl, ItemStorageIsFullText - call MenuTextBoxBackup - -.abort - ret -; 12c4c - - -GivePartyItem: ; 12c4c - - call GetPartyItemLocation - ld a, [wCurItem] - ld [hl], a - ld d, a - farcall ItemIsMail - jr nc, .done - call ComposeMailMessage - -.done - ret -; 12c60 - - -TakePartyItem: ; 12c60 - - call SpeechTextBox - call GetPartyItemLocation - ld a, [hl] - and a - jr z, .asm_12c8c - - ld [wCurItem], a - call ReceiveItemFromPokemon - jr nc, .asm_12c94 - - farcall ItemIsMail - call GetPartyItemLocation - ld a, [hl] - ld [wd265], a - ld [hl], NO_ITEM - call GetItemName - ld hl, TookFromText - call MenuTextBoxBackup - jr .asm_12c9a - -.asm_12c8c - ld hl, IsntHoldingAnythingText - call MenuTextBoxBackup - jr .asm_12c9a - -.asm_12c94 - ld hl, ItemStorageIsFullText - call MenuTextBoxBackup - -.asm_12c9a - ret -; 12c9b - - -GiveTakeItemMenuData: ; 12c9b - db MENU_SPRITE_ANIMS | MENU_BACKUP_TILES ; flags - menu_coords 12, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .Items - db 1 ; default option - -.Items: - db STATICMENU_CURSOR ; flags - db 2 ; # items - db "GIVE@" - db "TAKE@" -; 12caf - - -TookAndMadeHoldText: ; 12caf - text_jump UnknownText_0x1c1b2c - db "@" -; 12cb4 - -MadeHoldText: ; 12cb4 - text_jump UnknownText_0x1c1b57 - db "@" -; 12cb9 - -PleaseRemoveMailText: ; 12cb9 - text_jump UnknownText_0x1c1b6f - db "@" -; 12cbe - -IsntHoldingAnythingText: ; 12cbe - text_jump UnknownText_0x1c1b8e - db "@" -; 12cc3 - -ItemStorageIsFullText: ; 12cc3 - text_jump UnknownText_0x1c1baa - db "@" -; 12cc8 - -TookFromText: ; 12cc8 - text_jump UnknownText_0x1c1bc4 - db "@" -; 12ccd - -SwitchAlreadyHoldingText: ; 12ccd - text_jump UnknownText_0x1c1bdc - db "@" -; 12cd2 - -CantBeHeldText: ; 12cd2 - text_jump UnknownText_0x1c1c09 - db "@" -; 12cd7 - - -GetPartyItemLocation: ; 12cd7 - push af - ld a, MON_ITEM - call GetPartyParamLocation - pop af - ret -; 12cdf - - -ReceiveItemFromPokemon: ; 12cdf - ld a, 1 - ld [wItemQuantityChangeBuffer], a - ld hl, wNumItems - jp ReceiveItem -; 12cea - - -GiveItemToPokemon: ; 12cea (4:6cea) - ld a, 1 - ld [wItemQuantityChangeBuffer], a - ld hl, wNumItems - jp TossItem - -StartMenuYesNo: ; 12cf5 - call MenuTextBox - call YesNoBox - jp ExitMenu -; 12cfe - - -ComposeMailMessage: ; 12cfe (4:6cfe) - ld de, wTempMailMessage - farcall _ComposeMailMessage - ld hl, wPlayerName - ld de, wTempMailAuthor - ld bc, NAME_LENGTH - 1 - call CopyBytes - ld hl, wPlayerID - ld bc, 2 - call CopyBytes - ld a, [wCurPartySpecies] - ld [de], a - inc de - ld a, [wCurItem] - ld [de], a - ld a, [wCurPartyMon] - ld hl, sPartyMail - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - ld d, h - ld e, l - ld hl, wTempMail - ld bc, MAIL_STRUCT_LENGTH - ld a, BANK(sPartyMail) - call GetSRAMBank - call CopyBytes - call CloseSRAM - ret - -MonMailAction: ; 12d45 -; If in the time capsule or trade center, -; selecting the mail only allows you to -; read the mail. - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jr z, .read - cp LINK_TRADECENTER - jr z, .read - -; Show the READ/TAKE/QUIT menu. - ld hl, .MenuHeader - call LoadMenuHeader - call VerticalMenu - call ExitMenu - -; Interpret the menu. - jp c, .done - ld a, [wMenuCursorY] - cp $1 - jr z, .read - cp $2 - jr z, .take - jp .done - -.read - farcall ReadPartyMonMail - ld a, $0 - ret - -.take - ld hl, .sendmailtopctext - call StartMenuYesNo - jr c, .RemoveMailToBag - ld a, [wCurPartyMon] - ld b, a - farcall SendMailToPC - jr c, .MailboxFull - ld hl, .sentmailtopctext - call MenuTextBoxBackup - jr .done - -.MailboxFull: - ld hl, .mailboxfulltext - call MenuTextBoxBackup - jr .done - -.RemoveMailToBag: - ld hl, .mailwilllosemessagetext - call StartMenuYesNo - jr c, .done - call GetPartyItemLocation - ld a, [hl] - ld [wCurItem], a - call ReceiveItemFromPokemon - jr nc, .BagIsFull - call GetPartyItemLocation - ld [hl], $0 - call GetCurNick - ld hl, .tookmailfrommontext - call MenuTextBoxBackup - jr .done - -.BagIsFull: - ld hl, .bagfulltext - call MenuTextBoxBackup - jr .done - -.done - ld a, $3 - ret -; 12dc9 - - -.MenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 12, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default option -; 0x12dd1 - -.MenuData: - db STATICMENU_CURSOR ; flags - db 3 ; items - db "READ@" - db "TAKE@" - db "QUIT@" -; 0x12de2 - - -.mailwilllosemessagetext -; The MAIL will lose its message. OK? - text_jump UnknownText_0x1c1c22 - db "@" -; 0x12de7 - -.tookmailfrommontext -; MAIL detached from . - text_jump UnknownText_0x1c1c47 - db "@" -; 0x12dec - -.bagfulltext -; There's no space for removing MAIL. - text_jump UnknownText_0x1c1c62 - db "@" -; 0x12df1 - -.sendmailtopctext -; Send the removed MAIL to your PC? - text_jump UnknownText_0x1c1c86 - db "@" -; 0x12df6 - -.mailboxfulltext -; Your PC's MAILBOX is full. - text_jump UnknownText_0x1c1ca9 - db "@" -; 0x12dfb - -.sentmailtopctext -; The MAIL was sent to your PC. - text_jump UnknownText_0x1c1cc4 - db "@" -; 0x12e00 - - -OpenPartyStats: ; 12e00 - call LoadStandardMenuHeader - call ClearSprites -; PartyMon - xor a - ld [wMonType], a - call LowVolume - predef StatsScreenInit - call MaxVolume - call Call_ExitMenu - ld a, 0 - ret -; 12e1b - - -MonMenu_Cut: ; 12e1b - farcall CutFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12e30 - - -MonMenu_Fly: ; 12e30 - farcall FlyFunction - ld a, [wFieldMoveSucceeded] - cp $2 - jr z, .Fail - cp $0 - jr z, .Error - farcall StubbedTrainerRankings_Fly - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret - -.Error: - ld a, $0 - ret - -.Unreferenced: - ld a, $1 - ret -; 12e55 - -MonMenu_Flash: ; 12e55 - farcall OWFlash - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12e6a - -MonMenu_Strength: ; 12e6a - farcall StrengthFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12e7f - -MonMenu_Whirlpool: ; 12e7f - farcall WhirlpoolFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12e94 - -MonMenu_Waterfall: ; 12e94 - farcall WaterfallFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12ea9 - -MonMenu_Teleport: ; 12ea9 - farcall TeleportFunction - ld a, [wFieldMoveSucceeded] - and a - jr z, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12ebd - -MonMenu_Surf: ; 12ebd - farcall SurfFunction - ld a, [wFieldMoveSucceeded] - and a - jr z, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12ed1 - -MonMenu_Dig: ; 12ed1 - farcall DigFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12ee6 - -MonMenu_Softboiled_MilkDrink: ; 12ee6 - call .CheckMonHasEnoughHP - jr nc, .NotEnoughHP - farcall Softboiled_MilkDrinkFunction - jr .finish - -.NotEnoughHP: - ld hl, .Text_NotEnoughHP - call PrintText - -.finish - xor a - ld [wPartyMenuActionText], a - ld a, $3 - ret -; 12f00 - -.Text_NotEnoughHP: - ; Not enough HP! - text_jump UnknownText_0x1c1ce3 - db "@" -; 0x12f05 - -.CheckMonHasEnoughHP: -; Need to have at least (MaxHP / 5) HP left. - ld a, MON_MAXHP - call GetPartyParamLocation - ld a, [hli] - ld [hDividend + 0], a - ld a, [hl] - ld [hDividend + 1], a - ld a, 5 - ld [hDivisor], a - ld b, 2 - call Divide - ld a, MON_HP + 1 - call GetPartyParamLocation - ld a, [hQuotient + 2] - sub [hl] - dec hl - ld a, [hQuotient + 1] - sbc [hl] - ret -; 12f26 - -MonMenu_Headbutt: ; 12f26 - farcall HeadbuttFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12f3b - -MonMenu_RockSmash: ; 12f3b - farcall RockSmashFunction - ld a, [wFieldMoveSucceeded] - cp $1 - jr nz, .Fail - ld b, $4 - ld a, $2 - ret - -.Fail: - ld a, $3 - ret -; 12f50 - -MonMenu_SweetScent: ; 12f50 - farcall SweetScentFromMenu - ld b, $4 - ld a, $2 - ret -; 12f5b - -ChooseMoveToDelete: ; 12f5b - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call LoadFontsBattleExtra - call .ChooseMoveToDelete - pop bc - ld a, b - ld [wOptions], a - push af - call ClearBGPalettes - pop af - ret -; 12f73 - -.ChooseMoveToDelete - call SetUpMoveScreenBG - ld de, DeleteMoveScreenAttrs - call SetMenuAttributes - call SetUpMoveList - ld hl, w2DMenuFlags1 - set 6, [hl] - jr .enter_loop - -.loop - call ScrollingMenuJoypad - bit B_BUTTON_F, a - jp nz, .b_button - bit A_BUTTON_F, a - jp nz, .a_button - -.enter_loop - call PrepareToPlaceMoveData - call PlaceMoveData - jp .loop -; 12f9c - -.a_button - and a - jr .finish - -.b_button - scf - -.finish - push af - xor a - ld [wSwitchMon], a - ld hl, w2DMenuFlags1 - res 6, [hl] - call ClearSprites - call ClearTileMap - pop af - ret -; 12fb2 - -DeleteMoveScreenAttrs: ; 12fb2 - db 3, 1 - db 3, 1 - db $40, $00 - dn 2, 0 - db D_UP | D_DOWN | A_BUTTON | B_BUTTON -; 12fba - -ManagePokemonMoves: ; 12fba - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call MoveScreenLoop - pop af - ld [wOptions], a - call ClearBGPalettes - -.egg - ld a, $0 - ret -; 12fd5 - -MoveScreenLoop: ; 12fd5 - ld a, [wCurPartyMon] - inc a - ld [wPartyMenuCursor], a - call SetUpMoveScreenBG - call Function132d3 - ld de, MoveScreenAttributes - call SetMenuAttributes -.loop - call SetUpMoveList - ld hl, w2DMenuFlags1 - set 6, [hl] - jr .skip_joy - -.joy_loop - call ScrollingMenuJoypad - bit 1, a - jp nz, .b_button - bit 0, a - jp nz, .a_button - bit 4, a - jp nz, .d_right - bit 5, a - jp nz, .d_left - -.skip_joy - call PrepareToPlaceMoveData - ld a, [wMoveSwapBuffer] - and a - jr nz, .moving_move - call PlaceMoveData - jp .joy_loop - -.moving_move - ld a, " " - hlcoord 1, 11 - ld bc, 5 - call ByteFill - hlcoord 1, 12 - lb bc, 5, SCREEN_WIDTH - 2 - call ClearBox - hlcoord 1, 12 - ld de, String_MoveWhere - call PlaceString - jp .joy_loop -.b_button - call PlayClickSFX - call WaitSFX - ld a, [wMoveSwapBuffer] - and a - jp z, .exit - - ld a, [wMoveSwapBuffer] - ld [wMenuCursorY], a - xor a - ld [wMoveSwapBuffer], a - hlcoord 1, 2 - lb bc, 8, SCREEN_WIDTH - 2 - call ClearBox - jp .loop -; 1305b - -.d_right - ld a, [wMoveSwapBuffer] - and a - jp nz, .joy_loop - - ld a, [wCurPartyMon] - ld b, a - push bc - call .cycle_right - pop bc - ld a, [wCurPartyMon] - cp b - jp z, .joy_loop - jp MoveScreenLoop - -.d_left - ld a, [wMoveSwapBuffer] - and a - jp nz, .joy_loop - ld a, [wCurPartyMon] - ld b, a - push bc - call .cycle_left - pop bc - ld a, [wCurPartyMon] - cp b - jp z, .joy_loop - jp MoveScreenLoop - -.cycle_right - ld a, [wCurPartyMon] - inc a - ld [wCurPartyMon], a - ld c, a - ld b, 0 - ld hl, wPartySpecies - add hl, bc - ld a, [hl] - cp -1 - jr z, .cycle_left - cp EGG - ret nz - jr .cycle_right - -.cycle_left - ld a, [wCurPartyMon] - and a - ret z -.cycle_left_loop - ld a, [wCurPartyMon] - dec a - ld [wCurPartyMon], a - ld c, a - ld b, 0 - ld hl, wPartySpecies - add hl, bc - ld a, [hl] - cp EGG - ret nz - ld a, [wCurPartyMon] - and a - jr z, .cycle_right - jr .cycle_left_loop -; 130c6 - -.a_button - call PlayClickSFX - call WaitSFX - ld a, [wMoveSwapBuffer] - and a - jr nz, .place_move - ld a, [wMenuCursorY] - ld [wMoveSwapBuffer], a - call PlaceHollowCursor - jp .moving_move - -.place_move - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - push hl - call .copy_move - pop hl - ld bc, $15 - add hl, bc - call .copy_move - ld a, [wBattleMode] - jr z, .swap_moves - ld hl, wBattleMonMoves - ld bc, $20 - ld a, [wCurPartyMon] - call AddNTimes - push hl - call .copy_move - pop hl - ld bc, 6 - add hl, bc - call .copy_move - -.swap_moves - ld de, SFX_SWITCH_POKEMON - call PlaySFX - call WaitSFX - ld de, SFX_SWITCH_POKEMON - call PlaySFX - call WaitSFX - hlcoord 1, 2 - lb bc, 8, 18 - call ClearBox - hlcoord 10, 10 - lb bc, 1, 9 - call ClearBox - jp .loop -; 1313a - -.copy_move - push hl - ld a, [wMenuCursorY] - dec a - ld c, a - ld b, $0 - add hl, bc - ld d, h - ld e, l - pop hl - ld a, [wMoveSwapBuffer] - dec a - ld c, a - ld b, $0 - add hl, bc - ld a, [de] - ld b, [hl] - ld [hl], a - ld a, b - ld [de], a - ret -; 13154 - -.exit - xor a - ld [wMoveSwapBuffer], a - ld hl, w2DMenuFlags1 - res 6, [hl] - call ClearSprites - jp ClearTileMap -; 13163 - -MoveScreenAttributes: ; 13163 - db 3, 1 - db 3, 1 - db $40, $00 - dn 2, 0 - db D_UP | D_DOWN | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON -; 1316b - -String_MoveWhere: ; 1316b - db "Where?@" -; 13172 - -SetUpMoveScreenBG: ; 13172 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - xor a - ld [hBGMapMode], a - farcall LoadStatsScreenPageTilesGFX - farcall ClearSpriteAnims2 - ld a, [wCurPartyMon] - ld e, a - ld d, $0 - ld hl, wPartySpecies - add hl, de - ld a, [hl] - ld [wd265], a - ld e, $2 - farcall LoadMenuMonIcon - hlcoord 0, 1 - ld b, 9 - ld c, 18 - call TextBox - hlcoord 0, 11 - ld b, 5 - ld c, 18 - call TextBox - hlcoord 2, 0 - lb bc, 2, 3 - call ClearBox - xor a - ld [wMonType], a - ld hl, wPartyMonNicknames - ld a, [wCurPartyMon] - call GetNick - hlcoord 5, 1 - call PlaceString - push bc - farcall CopyMonToTempMon - pop hl - call PrintLevel - ld hl, wPlayerHPPal - call SetHPPal - ld b, SCGB_MOVE_LIST - call GetSGBLayout - hlcoord 16, 0 - lb bc, 1, 3 - jp ClearBox -; 131ef - -SetUpMoveList: ; 131ef - xor a - ld [hBGMapMode], a - ld [wMoveSwapBuffer], a - ld [wMonType], a - predef CopyMonToTempMon - ld hl, wTempMonMoves - ld de, wListMoves_MoveIndicesBuffer - ld bc, NUM_MOVES - call CopyBytes - ld a, SCREEN_WIDTH * 2 - ld [wBuffer1], a - hlcoord 2, 3 - predef ListMoves - hlcoord 10, 4 - predef ListMovePP - call WaitBGMap - call SetPalettes - ld a, [wNumMoves] - inc a - ld [w2DMenuNumRows], a - hlcoord 0, 11 - ld b, 5 - ld c, 18 - jp TextBox -; 13235 - -PrepareToPlaceMoveData: ; 13235 - ld hl, wPartyMon1Moves - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld a, [wMenuCursorY] - dec a - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - ld [wCurMove], a - hlcoord 1, 12 - lb bc, 5, 18 - jp ClearBox -; 13256 - -PlaceMoveData: ; 13256 - xor a - ld [hBGMapMode], a - hlcoord 0, 10 - ld de, String_MoveType_Top - call PlaceString - hlcoord 0, 11 - ld de, String_MoveType_Bottom - call PlaceString - hlcoord 12, 12 - ld de, String_MoveAtk - call PlaceString - ld a, [wCurMove] - ld b, a - hlcoord 2, 12 - predef PrintMoveType - ld a, [wCurMove] - dec a - ld hl, Moves + MOVE_POWER - ld bc, MOVE_LENGTH - call AddNTimes - ld a, BANK(Moves) - call GetFarByte - hlcoord 16, 12 - cp 2 - jr c, .no_power - ld [wd265], a - ld de, wd265 - lb bc, 1, 3 - call PrintNum - jr .description - -.no_power - ld de, String_MoveNoPower - call PlaceString - -.description - hlcoord 1, 14 - predef PrintMoveDesc - ld a, $1 - ld [hBGMapMode], a - ret -; 132ba - -String_MoveType_Top: ; 132ba - db "┌─────┐@" -; 132c2 -String_MoveType_Bottom: ; 132c2 - db "│TYPE/└@" -; 132ca -String_MoveAtk: ; 132ca - db "ATK/@" -; 132cf -String_MoveNoPower: ; 132cf - db "---@" -; 132d3 - -Function132d3: ; 132d3 - call Function132da - call Function132fe - ret -; 132da - -Function132da: ; 132da - ld a, [wCurPartyMon] - and a - ret z - ld c, a - ld e, a - ld d, 0 - ld hl, wPartyCount - add hl, de -.loop - ld a, [hl] - and a - jr z, .prev - cp EGG - jr z, .prev - cp NUM_POKEMON + 1 - jr c, .legal - -.prev - dec hl - dec c - jr nz, .loop - ret - -.legal - hlcoord 16, 0 - ld [hl], "◀" - ret -; 132fe - -Function132fe: ; 132fe - ld a, [wCurPartyMon] - inc a - ld c, a - ld a, [wPartyCount] - cp c - ret z - ld e, c - ld d, 0 - ld hl, wPartySpecies - add hl, de -.loop - ld a, [hl] - cp -1 - ret z - and a - jr z, .next - cp EGG - jr z, .next - cp NUM_POKEMON + 1 - jr c, .legal - -.next - inc hl - jr .loop - -.legal - hlcoord 18, 0 - ld [hl], "▶" - ret -; 13327 diff --git a/engine/menu/switch_items.asm b/engine/menu/switch_items.asm deleted file mode 100755 index 77b635246..000000000 --- a/engine/menu/switch_items.asm +++ /dev/null @@ -1,274 +0,0 @@ -SwitchItemsInBag: ; 2490c (9:490c) - ld a, [wSwitchItem] - and a - jr z, .init - ld b, a - ld a, [wScrollingMenuCursorPosition] - inc a - cp b - jr z, .trivial - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - ld a, [hl] - cp -1 - ret z - ld a, [wSwitchItem] - dec a - ld [wSwitchItem], a - call Function249a7 - jp c, Function249d1 - ld a, [wScrollingMenuCursorPosition] - ld c, a - ld a, [wSwitchItem] - cp c - jr c, .asm_2497a - jr .asm_2494a - -.init - ld a, [wScrollingMenuCursorPosition] - inc a - ld [wSwitchItem], a - ret - -.trivial - xor a - ld [wSwitchItem], a - ret - -.asm_2494a - ld a, [wSwitchItem] - call Function24a40 - ld a, [wScrollingMenuCursorPosition] - ld d, a - ld a, [wSwitchItem] - ld e, a - call Function24a6c - push bc - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - dec hl - push hl - call ItemSwitch_ConvertSpacingToDW - add hl, bc - ld d, h - ld e, l - pop hl - pop bc - call Function24aab - ld a, [wScrollingMenuCursorPosition] - call Function24a4d - xor a - ld [wSwitchItem], a - ret - -.asm_2497a - ld a, [wSwitchItem] - call Function24a40 - ld a, [wScrollingMenuCursorPosition] - ld d, a - ld a, [wSwitchItem] - ld e, a - call Function24a6c - push bc - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - ld d, h - ld e, l - call ItemSwitch_ConvertSpacingToDW - add hl, bc - pop bc - call CopyBytes - ld a, [wScrollingMenuCursorPosition] - call Function24a4d - xor a - ld [wSwitchItem], a - ret - -Function249a7: ; 249a7 (9:49a7) - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - ld d, h - ld e, l - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - ld a, [de] - cp [hl] - jr nz, .asm_249cd - ld a, [wScrollingMenuCursorPosition] - call Function24a97 - cp 99 - jr z, .asm_249cd - ld a, [wSwitchItem] - call Function24a97 - cp 99 - jr nz, .asm_249cf -.asm_249cd - and a - ret - -.asm_249cf - scf - ret - -Function249d1: ; 249d1 (9:49d1) - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - inc hl - push hl - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - inc hl - ld a, [hl] - pop hl - add [hl] - cp 100 - jr c, .asm_24a01 - sub 99 - push af - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - inc hl - ld [hl], 99 - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - inc hl - pop af - ld [hl], a - xor a - ld [wSwitchItem], a - ret - -.asm_24a01 - push af - ld a, [wScrollingMenuCursorPosition] - call ItemSwitch_GetNthItem - inc hl - pop af - ld [hl], a - ld hl, wMenuData_ItemsPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wSwitchItem] - cp [hl] - jr nz, .asm_24a25 - dec [hl] - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - ld [hl], $ff - xor a - ld [wSwitchItem], a - ret - -.asm_24a25 - dec [hl] - call ItemSwitch_ConvertSpacingToDW - push bc - ld a, [wSwitchItem] - call ItemSwitch_GetNthItem - pop bc - push hl - add hl, bc - pop de -.asm_24a34 - ld a, [hli] - ld [de], a - inc de - cp $ff - jr nz, .asm_24a34 - xor a - ld [wSwitchItem], a - ret - -Function24a40: ; 24a40 (9:4a40) - call ItemSwitch_GetNthItem - ld de, wd002 - call ItemSwitch_ConvertSpacingToDW - call CopyBytes - ret - -Function24a4d: ; 24a4d (9:4a4d) - call ItemSwitch_GetNthItem - ld d, h - ld e, l - ld hl, wd002 - call ItemSwitch_ConvertSpacingToDW - call CopyBytes - ret - -ItemSwitch_GetNthItem: ; 24a5c (9:4a5c) - push af - call ItemSwitch_ConvertSpacingToDW - ld hl, wMenuData_ItemsPointerAddr - ld a, [hli] - ld h, [hl] - ld l, a - inc hl - pop af - call AddNTimes - ret - -Function24a6c: ; 24a6c (9:4a6c) - push hl - call ItemSwitch_ConvertSpacingToDW - ld a, d - sub e - jr nc, .dont_negate - dec a - cpl -.dont_negate - ld hl, 0 - call AddNTimes - ld b, h - ld c, l - pop hl - ret - -ItemSwitch_ConvertSpacingToDW: ; 24a80 (9:4a80) -; This function is absolutely idiotic. - push hl - ld a, [wMenuData_ScrollingMenuSpacing] - ld c, a - ld b, 0 - ld hl, .spacing_dws - add hl, bc - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - pop hl - ret - -; 24a91 (9:4a91) - -.spacing_dws ; 24a91 - dw 0, 1, 2 -; 24a97 - -Function24a97: ; 24a97 (9:4a97) - push af - call ItemSwitch_ConvertSpacingToDW - ld a, c - cp 2 - jr nz, .not_2 - pop af - call ItemSwitch_GetNthItem - inc hl - ld a, [hl] - ret - -.not_2 - pop af - ld a, $1 - ret - -Function24aab: ; 24aab (9:4aab) -.loop - ld a, [hld] - ld [de], a - dec de - dec bc - ld a, b - or c - jr nz, .loop - ret diff --git a/engine/menu/timeset.asm b/engine/menu/timeset.asm deleted file mode 100755 index eda3094e1..000000000 --- a/engine/menu/timeset.asm +++ /dev/null @@ -1,773 +0,0 @@ -TIMESET_UP_ARROW EQUS "\"♂\"" ; $ef -TIMESET_DOWN_ARROW EQUS "\"♀\"" ; $f5 - -InitClock: ; 90672 (24:4672) -; Ask the player to set the time. - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - - ld a, $0 - ld [wSpriteUpdatesEnabled], a - ld a, $10 - ld [wMusicFade], a - ld a, LOW(MUSIC_NONE) - ld [wMusicFadeID], a - ld a, HIGH(MUSIC_NONE) - ld [wMusicFadeID + 1], a - ld c, 8 - call DelayFrames - call RotateFourPalettesLeft - call ClearTileMap - call ClearSprites - ld b, SCGB_DIPLOMA - call GetSGBLayout - xor a - ld [hBGMapMode], a - call LoadStandardFont - ld de, TimeSetBackgroundGFX - ld hl, vTiles2 tile $00 - lb bc, BANK(TimeSetBackgroundGFX), 1 - call Request1bpp - ld de, TimeSetUpArrowGFX - ld hl, vTiles2 tile $01 - lb bc, BANK(TimeSetUpArrowGFX), 1 - call Request1bpp - ld de, TimeSetDownArrowGFX - ld hl, vTiles2 tile $02 - lb bc, BANK(TimeSetDownArrowGFX), 1 - call Request1bpp - call .ClearScreen - call WaitBGMap - call RotateFourPalettesRight - ld hl, Text_WokeUpOak - call PrintText - ld hl, wTimeSetBuffer - ld bc, 50 - xor a - call ByteFill - ld a, 10 ; default hour = 10 AM - ld [wInitHourBuffer], a - -.loop - ld hl, Text_WhatTimeIsIt - call PrintText - hlcoord 3, 7 - ld b, 2 - ld c, 15 - call TextBox - hlcoord 11, 7 - ld [hl], $1 - hlcoord 11, 10 - ld [hl], $2 - hlcoord 4, 9 - call DisplayHourOClock - ld c, 10 - call DelayFrames - -.SetHourLoop: - call JoyTextDelay - call SetHour - jr nc, .SetHourLoop - - ld a, [wInitHourBuffer] - ld [wStringBuffer2 + 1], a - call .ClearScreen - ld hl, Text_WhatHrs - call PrintText - call YesNoBox - jr nc, .HourIsSet - call .ClearScreen - jr .loop - -.HourIsSet: - ld hl, Text_HowManyMinutes - call PrintText - hlcoord 11, 7 - lb bc, 2, 7 - call TextBox - hlcoord 15, 7 - ld [hl], $1 - hlcoord 15, 10 - ld [hl], $2 - hlcoord 12, 9 - call DisplayMinutesWithMinString - ld c, 10 - call DelayFrames - -.SetMinutesLoop: - call JoyTextDelay - call SetMinutes - jr nc, .SetMinutesLoop - - ld a, [wInitMinuteBuffer] - ld [wStringBuffer2 + 2], a - call .ClearScreen - ld hl, Text_WhoaMins - call PrintText - call YesNoBox - jr nc, .MinutesAreSet - call .ClearScreen - jr .HourIsSet - -.MinutesAreSet: - call InitTimeOfDay - ld hl, OakText_ResponseToSetTime - call PrintText - call WaitPressAorB_BlinkCursor - pop af - ld [hInMenu], a - ret - -.ClearScreen: ; 90783 (24:4783) - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - xor a - call ByteFill - ld a, $1 - ld [hBGMapMode], a - ret - -SetHour: ; 90795 (24:4795) - ld a, [hJoyPressed] - and A_BUTTON - jr nz, .Confirm - - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .up - ld a, [hl] - and D_DOWN - jr nz, .down - call DelayFrame - and a - ret - -.down - ld hl, wInitHourBuffer - ld a, [hl] - and a - jr nz, .DecreaseThroughMidnight - ld a, 23 + 1 -.DecreaseThroughMidnight: - dec a - ld [hl], a - jr .okay - -.up - ld hl, wInitHourBuffer - ld a, [hl] - cp 23 - jr c, .AdvanceThroughMidnight - ld a, -1 -.AdvanceThroughMidnight: - inc a - ld [hl], a - -.okay - hlcoord 4, 9 - ld a, " " - ld bc, 15 - call ByteFill - hlcoord 4, 9 - call DisplayHourOClock - call WaitBGMap - and a - ret - -.Confirm: - scf - ret - -DisplayHourOClock: ; 907de (24:47de) - push hl - ld a, [wInitHourBuffer] - ld c, a - ld e, l - ld d, h - call PrintHour - inc hl - ld de, String_oclock - call PlaceString - pop hl - ret -; 907f1 (24:47f1) - -UnreferencedFunction907f1: ; 907f1 - ld h, d - ld l, e - push hl - call DisplayHourOClock - pop de - inc de - inc de - ld a, ":" - ld [de], a - inc de - push de - ld hl, 3 - add hl, de - ld a, [de] - inc de - ld [hli], a - ld a, [de] - ld [hl], a - pop hl - call DisplayMinutesWithMinString - inc hl - inc hl - inc hl - ret -; 90810 - -SetMinutes: ; 90810 (24:4810) - ld a, [hJoyPressed] - and A_BUTTON - jr nz, .a_button - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .d_up - ld a, [hl] - and D_DOWN - jr nz, .d_down - call DelayFrame - and a - ret - -.d_down - ld hl, wInitMinuteBuffer - ld a, [hl] - and a - jr nz, .decrease - ld a, 59 + 1 -.decrease - dec a - ld [hl], a - jr .finish_dpad - -.d_up - ld hl, wInitMinuteBuffer - ld a, [hl] - cp 59 - jr c, .increase - ld a, -1 -.increase - inc a - ld [hl], a -.finish_dpad - hlcoord 12, 9 - ld a, " " - ld bc, 7 - call ByteFill - hlcoord 12, 9 - call DisplayMinutesWithMinString - call WaitBGMap - and a - ret -.a_button - scf - ret - -DisplayMinutesWithMinString: ; 90859 (24:4859) - ld de, wInitMinuteBuffer - call PrintTwoDigitNumberRightAlign - inc hl - ld de, String_min - call PlaceString - ret - -PrintTwoDigitNumberRightAlign: ; 90867 (24:4867) - push hl - ld a, " " - ld [hli], a - ld [hl], a - pop hl - lb bc, PRINTNUM_RIGHTALIGN | 1, 2 - call PrintNum - ret -; 90874 (24:4874) - -Text_WokeUpOak: ; 0x90874 - ; Zzz… Hm? Wha…? You woke me up! Will you check the clock for me? - text_jump UnknownText_0x1bc29c - db "@" -; 0x90879 - -Text_WhatTimeIsIt: ; 0x90879 - ; What time is it? - text_jump UnknownText_0x1bc2eb - db "@" -; 0x9087e - -String_oclock: - db "o'clock@" -; 90886 - -Text_WhatHrs: ; 0x90886 - ; What?@ @ - text_jump UnknownText_0x1bc2fd - start_asm - hlcoord 1, 16 - call DisplayHourOClock - ld hl, .QuestionMark - ret -; 90895 (24:4895) - -.QuestionMark: ; 0x90895 - ; ? - text_jump UnknownText_0x1bc305 - db "@" -; 0x9089a - -Text_HowManyMinutes: ; 0x9089a - ; How many minutes? - text_jump UnknownText_0x1bc308 - db "@" -; 0x9089f - -String_min: - db "min.@" -; 908a4 - -Text_WhoaMins: ; 0x908a4 - ; Whoa!@ @ - text_jump UnknownText_0x1bc31b - start_asm - hlcoord 7, 14 - call DisplayMinutesWithMinString - ld hl, .QuestionMark - ret -; 908b3 (24:48b3) - -.QuestionMark: ; 0x908b3 - ; ? - text_jump UnknownText_0x1bc323 - db "@" -; 0x908b8 - -OakText_ResponseToSetTime: ; 0x908b8 - start_asm - decoord 1, 14 - ld a, [wInitHourBuffer] - ld c, a - call PrintHour - ld [hl], ":" - inc hl - ld de, wInitMinuteBuffer - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ld b, h - ld c, l - ld a, [wInitHourBuffer] - cp MORN_HOUR - jr c, .nite - cp DAY_HOUR + 1 - jr c, .morn - cp NITE_HOUR - jr c, .day -.nite: - ld hl, .sodark - ret -.morn: - ld hl, .overslept - ret -.day: - ld hl, .yikes - ret -; 908ec (24:48ec) - -.overslept ; 0x908ec - ; ! I overslept! - text_jump UnknownText_0x1bc326 - db "@" -; 0x908f1 - -.yikes ; 0x908f1 - ; ! Yikes! I over- slept! - text_jump UnknownText_0x1bc336 - db "@" -; 0x908f6 - -.sodark ; 0x908f6 - ; ! No wonder it's so dark! - text_jump UnknownText_0x1bc34f - db "@" -; 0x908fb - -TimeSetBackgroundGFX: ; 908fb -INCBIN "gfx/new_game/timeset_bg.1bpp" -TimeSetUpArrowGFX: ; 90903 -INCBIN "gfx/new_game/up_arrow.1bpp" -TimeSetDownArrowGFX: ; 9090b -INCBIN "gfx/new_game/down_arrow.1bpp" -; 90913 - -SetDayOfWeek: ; 90913 - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - ld de, TimeSetUpArrowGFX - ld hl, vTiles0 tile TIMESET_UP_ARROW - lb bc, BANK(TimeSetUpArrowGFX), 1 - call Request1bpp - ld de, TimeSetDownArrowGFX - ld hl, vTiles0 tile TIMESET_DOWN_ARROW - lb bc, BANK(TimeSetDownArrowGFX), 1 - call Request1bpp - xor a - ld [wTempDayOfWeek], a -.loop - hlcoord 0, 12 - lb bc, 4, 18 - call TextBox - call LoadStandardMenuHeader - ld hl, .WhatDayIsItText - call PrintText - hlcoord 9, 3 - ld b, 2 - ld c, 9 - call TextBox - hlcoord 14, 3 - ld [hl], TIMESET_UP_ARROW - hlcoord 14, 6 - ld [hl], TIMESET_DOWN_ARROW - hlcoord 10, 5 - call .PlaceWeekdayString - call ApplyTilemap - ld c, 10 - call DelayFrames -.loop2 - call JoyTextDelay - call .GetJoypadAction - jr nc, .loop2 - call ExitMenu - call UpdateSprites - ld hl, .ConfirmWeekdayText - call PrintText - call YesNoBox - jr c, .loop - ld a, [wTempDayOfWeek] - ld [wStringBuffer2], a - call InitDayOfWeek - call LoadStandardFont - pop af - ld [hInMenu], a - ret -; 90993 - -.GetJoypadAction: ; 90993 - ld a, [hJoyPressed] - and A_BUTTON - jr z, .not_A - scf - ret - -.not_A - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .d_up - ld a, [hl] - and D_DOWN - jr nz, .d_down - call DelayFrame - and a - ret - -.d_down - ld hl, wTempDayOfWeek - ld a, [hl] - and a - jr nz, .decrease - ld a, SATURDAY + 1 - -.decrease - dec a - ld [hl], a - jr .finish_dpad - -.d_up - ld hl, wTempDayOfWeek - ld a, [hl] - cp 6 - jr c, .increase - ld a, SUNDAY - 1 - -.increase - inc a - ld [hl], a - -.finish_dpad - xor a - ld [hBGMapMode], a - hlcoord 10, 4 - ld b, 2 - ld c, 9 - call ClearBox - hlcoord 10, 5 - call .PlaceWeekdayString - call WaitBGMap - and a - ret -; 909de - -.PlaceWeekdayString: ; 909de - push hl - ld a, [wTempDayOfWeek] - ld e, a - ld d, 0 - ld hl, .WeekdayStrings - add hl, de - add hl, de - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - call PlaceString - ret -; 909f2 - -.WeekdayStrings: ; 909f2 -; entries correspond to wCurDay constants (see constants/wram_constants.asm) - dw .Sunday - dw .Monday - dw .Tuesday - dw .Wednesday - dw .Thursday - dw .Friday - dw .Saturday - dw .Sunday - -.Sunday: db " SUNDAY@" -.Monday: db " MONDAY@" -.Tuesday: db " TUESDAY@" -.Wednesday: db "WEDNESDAY@" -.Thursday: db "THURSDAY@" -.Friday: db " FRIDAY@" -.Saturday: db "SATURDAY@" - - -.WhatDayIsItText: ; 0x90a3f - ; What day is it? - text_jump UnknownText_0x1bc369 - db "@" -; 0x90a44 - -.ConfirmWeekdayText: ; 0x90a44 - start_asm - hlcoord 1, 14 - call .PlaceWeekdayString - ld hl, .IsIt - ret -; 90a4f (24:4a4f) - -.IsIt: ; 0x90a4f - ; , is it? - text_jump UnknownText_0x1bc37a - db "@" -; 0x90a54 - -InitialSetDSTFlag: ; 90a54 - ld a, [wDST] - set 7, a - ld [wDST], a - hlcoord 1, 14 - lb bc, 3, 18 - call ClearBox - ld hl, .Text - call PlaceHLTextAtBC - ret -; 90a6c - -.Text: ; 90a6c - start_asm - call UpdateTime - ld a, [hHours] - ld b, a - ld a, [hMinutes] - ld c, a - decoord 1, 14 - farcall PrintHoursMins - ld hl, .DSTIsThatOK - ret -; 90a83 (24:4a83) - -.DSTIsThatOK: ; 0x90a83 - ; DST, is that OK? - text_jump Text_DSTIsThatOK - db "@" -; 0x90a88 - -InitialClearDSTFlag: ; 90a88 - ld a, [wDST] - res 7, a - ld [wDST], a - hlcoord 1, 14 - lb bc, 3, 18 - call ClearBox - ld hl, .Text - call PlaceHLTextAtBC - ret -; 90aa0 - -.Text: ; 90aa0 - start_asm - call UpdateTime - ld a, [hHours] - ld b, a - ld a, [hMinutes] - ld c, a - decoord 1, 14 - farcall PrintHoursMins - ld hl, .IsThatOK - ret -; 90ab7 - -.IsThatOK: ; 0x90ab7 - ; , is that OK? - text_jump UnknownText_0x1c5ff1 - db "@" -; 0x90abc - -DebugDisplayTime: ; 90abc - hlcoord 1, 14 - lb bc, 3, SCREEN_WIDTH - 2 - call ClearBox - ld hl, .Text - call PlaceHLTextAtBC - ret -; 90acc - -.Text: ; 0x90acc - start_asm - call UpdateTime - - hlcoord 1, 14 - ld [hl], "R" - inc hl - ld [hl], "T" - inc hl - ld [hl], " " - inc hl - - ld de, hRTCDayLo - call .PrintTime - - hlcoord 1, 16 - ld [hl], "D" - inc hl - ld [hl], "F" - inc hl - ld [hl], " " - inc hl - - ld de, wStartDay - call .PrintTime - - ld [hl], " " - inc hl - - ld a, [wDST] - bit 7, a - jr z, .off - - ld [hl], "O" - inc hl - ld [hl], "N" - inc hl - jr .done - -.off - ld [hl], "O" - inc hl - ld [hl], "F" - inc hl - ld [hl], "F" - inc hl - -.done - ld hl, .NowOnDebug - ret -; 90b13 - -.NowOnDebug: ; 0x90b13 - text "Now on DEBUG…" - prompt -; 0x90b23 - -.PrintTime: ; 90b23 - lb bc, 1, 3 - call PrintNum - ld [hl], "." - inc hl - inc de - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ld [hl], ":" - inc hl - inc de - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ret -; 90b3e - -PrintHour: ; 90b3e (24:4b3e) - ld l, e - ld h, d - push bc - call GetTimeOfDayString - call PlaceString - ld l, c - ld h, b - inc hl - pop bc - call AdjustHourForAMorPM - ld [wd265], a - ld de, wd265 - call PrintTwoDigitNumberRightAlign - ret - -GetTimeOfDayString: ; 90b58 (24:4b58) - ld a, c - cp MORN_HOUR - jr c, .nite - cp DAY_HOUR - jr c, .morn - cp NITE_HOUR - jr c, .day -.nite - ld de, .nite_string - ret -.morn - ld de, .morn_string - ret -.day - ld de, .day_string - ret -; 90b71 (24:4b71) - -.nite_string: db "NITE@" -.morn_string: db "MORN@" -.day_string: db "DAY@" -; 90b7f - -AdjustHourForAMorPM: -; Convert the hour stored in c (0-23) to a 1-12 value - ld a, c - or a - jr z, .midnight - cp NOON_HOUR - ret c - ret z - sub NOON_HOUR - ret - -.midnight - ld a, NOON_HOUR - ret diff --git a/engine/menu/tmhm.asm b/engine/menu/tmhm.asm deleted file mode 100755 index 9db3dc291..000000000 --- a/engine/menu/tmhm.asm +++ /dev/null @@ -1,49 +0,0 @@ -CanLearnTMHMMove: ; 11639 - ld a, [wCurPartySpecies] - ld [wCurSpecies], a - call GetBaseData - ld hl, wBaseTMHM - push hl - - ld a, [wPutativeTMHMMove] - ld b, a - ld c, 0 - ld hl, TMHMMoves -.loop - ld a, [hli] - and a - jr z, .end - cp b - jr z, .asm_11659 - inc c - jr .loop - -.asm_11659 - pop hl - ld b, CHECK_FLAG - push de - ld d, 0 - predef SmallFarFlagAction - pop de - ret - -.end - pop hl - ld c, 0 - ret -; 1166a - -GetTMHMMove: ; 1166a - ld a, [wd265] - dec a - ld hl, TMHMMoves - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - ld [wd265], a - ret -; 1167a - - -INCLUDE "data/moves/tmhm_moves.asm" diff --git a/engine/menu/trainer_card.asm b/engine/menu/trainer_card.asm deleted file mode 100755 index e84c1c9f3..000000000 --- a/engine/menu/trainer_card.asm +++ /dev/null @@ -1,623 +0,0 @@ -; TrainerCard.Jumptable indexes - const_def - const TRAINERCARDSTATE_PAGE1_LOADGFX ; 0 - const TRAINERCARDSTATE_PAGE1_JOYPAD ; 1 - const TRAINERCARDSTATE_PAGE2_LOADGFX ; 2 - const TRAINERCARDSTATE_PAGE2_JOYPAD ; 3 - const TRAINERCARDSTATE_PAGE3_LOADGFX ; 4 - const TRAINERCARDSTATE_PAGE3_JOYPAD ; 5 - const TRAINERCARDSTATE_QUIT ; 6 - -TrainerCard: ; 25105 - ld a, [wVramState] - push af - xor a - ld [wVramState], a - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call .InitRAM -.loop - call UpdateTime - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .quit - ld a, [hJoyLast] - and B_BUTTON - jr nz, .quit - call .RunJumptable - call DelayFrame - jr .loop - -.quit - pop af - ld [wOptions], a - pop af - ld [wVramState], a - ret - -.InitRAM: ; 2513b (9:513b) - call ClearBGPalettes - call ClearSprites - call ClearTileMap - call DisableLCD - - farcall GetCardPic - - ld hl, CardRightCornerGFX - ld de, vTiles2 tile $1c - ld bc, 1 tiles - ld a, BANK(CardRightCornerGFX) - call FarCopyBytes - - ld hl, CardStatusGFX - ld de, vTiles2 tile $29 - ld bc, 86 tiles - ld a, BANK(CardStatusGFX) - call FarCopyBytes - - call TrainerCard_PrintTopHalfOfCard - - hlcoord 0, 8 - ld d, 6 - call TrainerCard_InitBorder - - call EnableLCD - call WaitBGMap - ld b, SCGB_TRAINER_CARD - call GetSGBLayout - call SetPalettes - call WaitBGMap - ld hl, wJumptableIndex - xor a ; TRAINERCARDSTATE_PAGE1_LOADGFX - ld [hli], a ; wJumptableIndex - ld [hli], a ; wTrainerCardBadgeFrameCounter - ld [hli], a ; wTrainerCardBadgeTileID - ld [hl], a ; wTrainerCardBadgeAttributes - ret - -.RunJumptable: ; 2518e (9:518e) - jumptable .Jumptable, wJumptableIndex - -.Jumptable: ; 2519d (9:519d) -; entries correspond to TRAINERCARDSTATE_* constants - dw TrainerCard_Page1_LoadGFX - dw TrainerCard_Page1_Joypad - dw TrainerCard_Page2_LoadGFX - dw TrainerCard_Page2_Joypad - dw TrainerCard_Page3_LoadGFX - dw TrainerCard_Page3_Joypad - dw TrainerCard_Quit - -TrainerCard_IncrementJumptable: ; 251ab (9:51ab) - ld hl, wJumptableIndex - inc [hl] - ret - -TrainerCard_Quit: ; 251b0 (9:51b0) - ld hl, wJumptableIndex - set 7, [hl] - ret - -TrainerCard_Page1_LoadGFX: ; 251b6 (9:51b6) - call ClearSprites - hlcoord 0, 8 - ld d, 6 - call TrainerCard_InitBorder - call WaitBGMap - ld de, CardStatusGFX - ld hl, vTiles2 tile $29 - lb bc, BANK(CardStatusGFX), 86 - call Request2bpp - call TrainerCard_Page1_PrintDexCaught_GameTime - call TrainerCard_IncrementJumptable - ret - -TrainerCard_Page1_Joypad: ; 251d7 (9:51d7) - call TrainerCard_Page1_PrintGameTime - ld hl, hJoyLast - ld a, [hl] - and D_RIGHT | A_BUTTON - jr nz, .pressed_right_a - ret - -.pressed_right_a - ld a, TRAINERCARDSTATE_PAGE2_LOADGFX - ld [wJumptableIndex], a - ret - -.Unreferenced_KantoCheck: - ld a, [wKantoBadges] - and a - ret z - ld a, TRAINERCARDSTATE_PAGE3_LOADGFX - ld [wJumptableIndex], a - ret - -; 251f4 - -TrainerCard_Page2_LoadGFX: ; 251f4 (9:51f4) - call ClearSprites - hlcoord 0, 8 - ld d, 6 - call TrainerCard_InitBorder - call WaitBGMap - ld de, LeaderGFX - ld hl, vTiles2 tile $29 - lb bc, BANK(LeaderGFX), 86 - call Request2bpp - ld de, BadgeGFX - ld hl, vTiles0 tile $00 - lb bc, BANK(BadgeGFX), 44 - call Request2bpp - call TrainerCard_Page2_3_InitObjectsAndStrings - call TrainerCard_IncrementJumptable - ret - -TrainerCard_Page2_Joypad: ; 25221 (9:5221) - ld hl, TrainerCard_JohtoBadgesOAM - call TrainerCard_Page2_3_AnimateBadges - ld hl, hJoyLast - ld a, [hl] - and A_BUTTON - jr nz, .Quit - ld a, [hl] - and D_LEFT - jr nz, .d_left - ret - -.d_left - ld a, TRAINERCARDSTATE_PAGE1_LOADGFX - ld [wJumptableIndex], a - ret - -.Unreferenced_KantoCheck: - ld a, [wKantoBadges] - and a - ret z - ld a, TRAINERCARDSTATE_PAGE3_LOADGFX - ld [wJumptableIndex], a - ret - -.Quit: - ld a, TRAINERCARDSTATE_QUIT - ld [wJumptableIndex], a - ret - -TrainerCard_Page3_LoadGFX: ; 2524c (9:524c) - call ClearSprites - hlcoord 0, 8 - ld d, 6 - call TrainerCard_InitBorder - call WaitBGMap - ld de, LeaderGFX2 - ld hl, vTiles2 tile $29 - lb bc, BANK(LeaderGFX2), 86 - call Request2bpp - ld de, BadgeGFX2 - ld hl, vTiles0 tile $00 - lb bc, BANK(BadgeGFX2), 44 - call Request2bpp - call TrainerCard_Page2_3_InitObjectsAndStrings - call TrainerCard_IncrementJumptable - ret - -TrainerCard_Page3_Joypad: ; 25279 (9:5279) - ld hl, TrainerCard_JohtoBadgesOAM - call TrainerCard_Page2_3_AnimateBadges - ld hl, hJoyLast - ld a, [hl] - and D_LEFT - jr nz, .left - ld a, [hl] - and D_RIGHT - jr nz, .right - ret - -.left - ld a, TRAINERCARDSTATE_PAGE2_LOADGFX - ld [wJumptableIndex], a - ret - -.right - ld a, TRAINERCARDSTATE_PAGE1_LOADGFX - ld [wJumptableIndex], a - ret - -TrainerCard_PrintTopHalfOfCard: ; 25299 (9:5299) - hlcoord 0, 0 - ld d, 5 - call TrainerCard_InitBorder - hlcoord 2, 2 - ld de, .Name_Money - call PlaceString - hlcoord 2, 4 - ld de, .ID_No - call TrainerCardSetup_PlaceTilemapString - hlcoord 7, 2 - ld de, wPlayerName - call PlaceString - hlcoord 5, 4 - ld de, wPlayerID - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - hlcoord 7, 6 - ld de, wMoney - lb bc, PRINTNUM_MONEY | 3, 6 - call PrintNum - hlcoord 1, 3 - ld de, .HorizontalDivider - call TrainerCardSetup_PlaceTilemapString - hlcoord 14, 1 - lb bc, 5, 7 - xor a - ld [hGraphicStartTile], a - predef PlaceGraphic - ret - -; 252ec (9:52ec) - -.Name_Money: ; 252ec - db "NAME/" - next "" - next "MONEY@" - -.ID_No: ; 252f9 - db $27, $28, -1 ; ID NO - -.HorizontalDivider: ; 252fc - db $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $26, -1 ; ____________> -; 2530a - -TrainerCard_Page1_PrintDexCaught_GameTime: ; 2530a (9:530a) - hlcoord 2, 10 - ld de, .Dex_PlayTime - call PlaceString - hlcoord 10, 15 - ld de, .Badges - call PlaceString - ld hl, wPokedexCaught - ld b, wEndPokedexCaught - wPokedexCaught - call CountSetBits - ld de, wd265 - hlcoord 15, 10 - lb bc, 1, 3 - call PrintNum - call TrainerCard_Page1_PrintGameTime - hlcoord 2, 8 - ld de, .StatusTilemap - call TrainerCardSetup_PlaceTilemapString - ld a, [wStatusFlags] - bit STATUSFLAGS_POKEDEX_F, a - ret nz - hlcoord 1, 9 - lb bc, 2, 17 - call ClearBox - ret - -.Dex_PlayTime: - db "#DEX" - next "PLAY TIME@@" - -.Badges: - db " BADGES▶@" - -.StatusTilemap: ; 25366 - db $29, $2a, $2b, $2c, $2d, -1 -; 2536c - -TrainerCard_Page2_3_InitObjectsAndStrings: ; 2536c (9:536c) - hlcoord 2, 8 - ld de, .BadgesTilemap - call TrainerCardSetup_PlaceTilemapString - hlcoord 2, 10 - ld a, $29 - ld c, 4 -.loop - call TrainerCard_Page2_3_PlaceLeadersFaces -rept 4 - inc hl -endr - dec c - jr nz, .loop - hlcoord 2, 13 - ld a, $51 - ld c, 4 -.loop2 - call TrainerCard_Page2_3_PlaceLeadersFaces -rept 4 - inc hl -endr - dec c - jr nz, .loop2 - xor a - ld [wTrainerCardBadgeFrameCounter], a - ld hl, TrainerCard_JohtoBadgesOAM - call TrainerCard_Page2_3_OAMUpdate - ret - -; 253a2 (9:53a2) - -.BadgesTilemap: ; 253a2 - db $79, $7a, $7b, $7c, $7d, -1 ; "BADGES" -; 253a8 - -TrainerCardSetup_PlaceTilemapString: ; 253a8 (9:53a8) -.loop - ld a, [de] - cp -1 - ret z - ld [hli], a - inc de - jr .loop - -TrainerCard_InitBorder: ; 253b0 (9:53b0) - ld e, SCREEN_WIDTH -.loop1 - ld a, $23 - ld [hli], a - dec e - jr nz, .loop1 - - ld a, $23 - ld [hli], a - ld e, SCREEN_HEIGHT - 1 - ld a, " " -.loop2 - ld [hli], a - dec e - jr nz, .loop2 - - ld a, $1c - ld [hli], a - ld a, $23 - ld [hli], a -.loop3 - ld a, $23 - ld [hli], a - - ld e, SCREEN_HEIGHT - ld a, " " -.loop4 - ld [hli], a - dec e - jr nz, .loop4 - - ld a, $23 - ld [hli], a - dec d - jr nz, .loop3 - - ld a, $23 - ld [hli], a - ld a, $24 - ld [hli], a - - ld e, SCREEN_HEIGHT - 1 - ld a, " " -.loop5 - ld [hli], a - dec e - jr nz, .loop5 - ld a, $23 - ld [hli], a - ld e, SCREEN_WIDTH -.loop6 - ld a, $23 - ld [hli], a - dec e - jr nz, .loop6 - ret - -TrainerCard_Page2_3_PlaceLeadersFaces: ; 253f4 (9:53f4) - push de - push hl - ld [hli], a - inc a - ld [hli], a - inc a - ld [hli], a - inc a - ld [hli], a - inc a - ld de, SCREEN_WIDTH - 3 - add hl, de - ld [hli], a - inc a - ld [hli], a - inc a - ld [hli], a - inc a - ld de, SCREEN_WIDTH - 3 - add hl, de - ld [hli], a - inc a - ld [hli], a - inc a - ld [hli], a - inc a - pop hl - pop de - ret - -TrainerCard_Page1_PrintGameTime: ; 25415 (9:5415) - hlcoord 11, 12 - ld de, wGameTimeHours - lb bc, 2, 4 - call PrintNum - inc hl - ld de, wGameTimeMinutes - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - ld a, [hVBlankCounter] - and $1f - ret nz - hlcoord 15, 12 - ld a, [hl] - xor " " ^ $2e ; alternate between space and small colon ($2e) tiles - ld [hl], a - ret - -TrainerCard_Page2_3_AnimateBadges: ; 25438 (9:5438) - ld a, [hVBlankCounter] - and %111 - ret nz - ld a, [wTrainerCardBadgeFrameCounter] - inc a - and %111 - ld [wTrainerCardBadgeFrameCounter], a - jr TrainerCard_Page2_3_OAMUpdate - -TrainerCard_Page2_3_OAMUpdate: ; 25448 (9:5448) -; copy flag array pointer - ld a, [hli] - ld e, a - ld a, [hli] -; get flag array - ld d, a - ld a, [de] - ld c, a - ld de, wVirtualOAMSprite00 - ld b, NUM_JOHTO_BADGES -.loop - srl c - push bc - jr nc, .skip_badge - push hl - ld a, [hli] ; y - ld b, a - ld a, [hli] ; x - ld c, a - ld a, [hli] ; pal - ld [wTrainerCardBadgeAttributes], a - ld a, [wTrainerCardBadgeFrameCounter] - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, [hl] - ld [wTrainerCardBadgeTileID], a - call .PrepOAM - pop hl -.skip_badge - ld bc, $b ; 3 + 2 * 4 - add hl, bc - pop bc - dec b - jr nz, .loop - ret - -.PrepOAM: ; 2547b (9:547b) - ld a, [wTrainerCardBadgeTileID] - and 1 << 7 - jr nz, .xflip - ld hl, .facing1 - jr .loop2 - -.xflip - ld hl, .facing2 -.loop2 - ld a, [hli] - cp -1 - ret z - add b - ld [de], a ; y - inc de - - ld a, [hli] - add c - ld [de], a ; x - inc de - - ld a, [wTrainerCardBadgeTileID] - and $ff ^ (1 << 7) - add [hl] - ld [de], a ; tile id - inc hl - inc de - - ld a, [wTrainerCardBadgeAttributes] - add [hl] - ld [de], a ; attributes - inc hl - inc de - jr .loop2 - -; 254a7 (9:54a7) - -.facing1 ; 254a7 - dsprite 0, 0, 0, 0, $00, 0 - dsprite 0, 0, 1, 0, $01, 0 - dsprite 1, 0, 0, 0, $02, 0 - dsprite 1, 0, 1, 0, $03, 0 - db -1 - -.facing2 ; 254b8 - dsprite 0, 0, 0, 0, $01, 0 | X_FLIP - dsprite 0, 0, 1, 0, $00, 0 | X_FLIP - dsprite 1, 0, 0, 0, $03, 0 | X_FLIP - dsprite 1, 0, 1, 0, $02, 0 | X_FLIP - db -1 - -TrainerCard_JohtoBadgesOAM: ; 254c9 -; Template OAM data for each badge on the trainer card. -; Format: - ; y, x, palette - ; cycle 1: face tile, in1 tile, in2 tile, in3 tile - ; cycle 2: face tile, in1 tile, in2 tile, in3 tile - - dw wJohtoBadges - - ; Zephyrbadge - db $68, $18, 0 - db $00, $20, $24, $20 | (1 << 7) - db $00, $20, $24, $20 | (1 << 7) - - ; Hivebadge - db $68, $38, 0 - db $04, $20, $24, $20 | (1 << 7) - db $04, $20, $24, $20 | (1 << 7) - - ; Plainbadge - db $68, $58, 0 - db $08, $20, $24, $20 | (1 << 7) - db $08, $20, $24, $20 | (1 << 7) - - ; Fogbadge - db $68, $78, 0 - db $0c, $20, $24, $20 | (1 << 7) - db $0c, $20, $24, $20 | (1 << 7) - - ; Mineralbadge - db $80, $38, 0 - db $10, $20, $24, $20 | (1 << 7) - db $10, $20, $24, $20 | (1 << 7) - - ; Stormbadge - db $80, $18, 0 - db $14, $20, $24, $20 | (1 << 7) - db $14, $20, $24, $20 | (1 << 7) - - ; Glacierbadge - db $80, $58, 0 - db $18, $20, $24, $20 | (1 << 7) - db $18, $20, $24, $20 | (1 << 7) - - ; Risingbadge - ; X-flips on alternate cycles. - db $80, $78, 0 - db $1c, $20, $24, $20 | (1 << 7) - db $1c | (1 << 7), $20, $24, $20 | (1 << 7) -; 25523 - -CardStatusGFX: INCBIN "gfx/trainer_card/card_status.2bpp" - -LeaderGFX: INCBIN "gfx/trainer_card/leaders.2bpp" -LeaderGFX2: INCBIN "gfx/trainer_card/leaders.2bpp" -BadgeGFX: INCBIN "gfx/trainer_card/badges.2bpp" -BadgeGFX2: INCBIN "gfx/trainer_card/badges.2bpp" - -CardRightCornerGFX: INCBIN "gfx/trainer_card/card_right_corner.2bpp" diff --git a/engine/menus/main_menu.asm b/engine/menus/main_menu.asm new file mode 100755 index 000000000..d83ce873b --- /dev/null +++ b/engine/menus/main_menu.asm @@ -0,0 +1,361 @@ +GFX_49c0c: ; 49c0c +INCBIN "gfx/unknown/049c0c.2bpp" +; 49cdc + +MainMenu: ; 49cdc + xor a + ld [wDisableTextAcceleration], a + call Function49ed0 + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + ld hl, wGameTimerPause + res GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] + call MainMenu_GetWhichMenu + ld [wWhichIndexSet], a + call MainMenu_PrintCurrentTimeAndDay + ld hl, .MenuHeader + call LoadMenuHeader + call MainMenuJoypadLoop + call CloseWindow + jr c, .quit + call ClearTileMap + ld a, [wMenuSelection] + ld hl, .Jumptable + rst JumpTable + jr MainMenu + +.quit + ret +; 49d14 + +.MenuHeader: ; 49d14 + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 16, 7 + dw .MenuData + db 1 ; default option +; 49d1c + +.MenuData: ; 49d1c + db STATICMENU_CURSOR ; flags + db 0 ; items + dw MainMenuItems + dw PlaceMenuStrings + dw .Strings +; 49d20 + +.Strings: ; 49d24 + db "CONTINUE@" + db "NEW GAME@" + db "OPTION@" + db "MYSTERY GIFT@" + db "MOBILE@" + db "MOBILE STUDIUM@" + +.Jumptable: ; 0x49d60 + dw MainMenu_Continue + dw MainMenu_NewGame + dw MainMenu_Options + dw MainMenu_MysteryGift + dw MainMenu_Mobile + dw MainMenu_MobileStudium +; 0x49d6c + +CONTINUE EQU 0 +NEW_GAME EQU 1 +OPTION EQU 2 +MYSTERY_GIFT EQU 3 +MOBILE EQU 4 +MOBILE_STUDIUM EQU 5 + +MainMenuItems: + +NewGameMenu: ; 0x49d6c + db 2 + db NEW_GAME + db OPTION + db -1 + +ContinueMenu: ; 0x49d70 + db 3 + db CONTINUE + db NEW_GAME + db OPTION + db -1 + +MobileMysteryMenu: ; 0x49d75 + db 5 + db CONTINUE + db NEW_GAME + db OPTION + db MYSTERY_GIFT + db MOBILE + db -1 + +MobileMenu: ; 0x49d7c + db 4 + db CONTINUE + db NEW_GAME + db OPTION + db MOBILE + db -1 + +MobileStudiumMenu: ; 0x49d82 + db 5 + db CONTINUE + db NEW_GAME + db OPTION + db MOBILE + db MOBILE_STUDIUM + db -1 + +MysteryMobileStudiumMenu: ; 0x49d89 + db 6 + db CONTINUE + db NEW_GAME + db OPTION + db MYSTERY_GIFT + db MOBILE + db MOBILE_STUDIUM + db -1 + +MysteryMenu: ; 0x49d91 + db 4 + db CONTINUE + db NEW_GAME + db OPTION + db MYSTERY_GIFT + db -1 + +MysteryStudiumMenu: ; 0x49d97 + db 5 + db CONTINUE + db NEW_GAME + db OPTION + db MYSTERY_GIFT + db MOBILE_STUDIUM + db -1 + +StudiumMenu: ; 0x49d9e + db 4 + db CONTINUE + db NEW_GAME + db OPTION + db MOBILE_STUDIUM + db -1 + + +MainMenu_GetWhichMenu: ; 49da4 + nop + nop + nop + ld a, [wSaveFileExists] + and a + jr nz, .next + ld a, $0 ; New Game + ret + +.next + ld a, [hCGB] + cp $1 + ld a, $1 + ret nz + ld a, BANK(sNumDailyMysteryGiftPartnerIDs) + call GetSRAMBank + ld a, [sNumDailyMysteryGiftPartnerIDs] + cp -1 + call CloseSRAM + jr nz, .mystery_gift + ; This check makes no difference. + ld a, [wStatusFlags] + bit STATUSFLAGS_MAIN_MENU_MOBILE_CHOICES_F, a + ld a, $1 ; Continue + jr z, .ok + jr .ok + +.ok + jr .ok2 + +.ok2 + ld a, $1 ; Continue + ret + +.mystery_gift + ; This check makes no difference. + ld a, [wStatusFlags] + bit STATUSFLAGS_MAIN_MENU_MOBILE_CHOICES_F, a + jr z, .ok3 + jr .ok3 + +.ok3 + jr .ok4 + +.ok4 + ld a, $6 ; Mystery Gift + ret +; 49de4 + +MainMenuJoypadLoop: ; 49de4 + call SetUpMenu +.loop + call MainMenu_PrintCurrentTimeAndDay + ld a, [w2DMenuFlags1] + set 5, a + ld [w2DMenuFlags1], a + call GetScrollingMenuJoypad + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .b_button + cp A_BUTTON + jr z, .a_button + jr .loop + +.a_button + call PlayClickSFX + and a + ret + +.b_button + scf + ret +; 49e09 + +MainMenu_PrintCurrentTimeAndDay: ; 49e09 + ld a, [wSaveFileExists] + and a + ret z + xor a + ld [hBGMapMode], a + call .PlaceBox + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call .PlaceTime + pop af + ld [wOptions], a + ld a, $1 + ld [hBGMapMode], a + ret +; 49e27 + + +.PlaceBox: ; 49e27 + call CheckRTCStatus + and $80 + jr nz, .TimeFail + hlcoord 0, 14 + ld b, 2 + ld c, 18 + call TextBox + ret + +.TimeFail: + call SpeechTextBox + ret +; 49e3d + + +.PlaceTime: ; 49e3d + ld a, [wSaveFileExists] + and a + ret z + call CheckRTCStatus + and $80 + jp nz, .PrintTimeNotSet + call UpdateTime + call GetWeekday + ld b, a + decoord 1, 15 + call .PlaceCurrentDay + decoord 4, 16 + ld a, [hHours] + ld c, a + farcall PrintHour + ld [hl], ":" + inc hl + ld de, hMinutes + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ret + +.min +; unused + db "min.@" +; 49e75 + +.PrintTimeNotSet: ; 49e75 + hlcoord 1, 14 + ld de, .TimeNotSet + call PlaceString + ret +; 49e7f + +.TimeNotSet: ; 49e7f + db "TIME NOT SET@" +; 49e8c + +.UnusedText: ; 49e8c + ; Clock time unknown + text_jump UnknownText_0x1c5182 + db "@" +; 49e91 + +.PlaceCurrentDay: ; 49e91 + push de + ld hl, .Days + ld a, b + call GetNthString + ld d, h + ld e, l + pop hl + call PlaceString + ld h, b + ld l, c + ld de, .Day + call PlaceString + ret +; 49ea8 + +.Days: + db "SUN@" + db "MON@" + db "TUES@" + db "WEDNES@" + db "THURS@" + db "FRI@" + db "SATUR@" +.Day: + db "DAY@" +; 49ed0 + +Function49ed0: ; 49ed0 + xor a + ld [hMapAnims], a + call ClearTileMap + call LoadFontsExtra + call LoadStandardFont + call ClearWindowData + ret +; 49ee0 + + +MainMenu_NewGame: ; 49ee0 + farcall NewGame + ret +; 49ee7 + +MainMenu_Options: ; 49ee7 + farcall OptionsMenu + ret +; 49eee + +MainMenu_Continue: ; 49eee + farcall Continue + ret +; 49ef5 + +MainMenu_MysteryGift: ; 49ef5 + farcall MysteryGift + ret +; 49efc diff --git a/engine/menus/menu.asm b/engine/menus/menu.asm new file mode 100755 index 000000000..51de2e1a4 --- /dev/null +++ b/engine/menus/menu.asm @@ -0,0 +1,841 @@ +_2DMenu_:: ; 2400e + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + call UpdateSprites + call ApplyTilemap + call Get2DMenuSelection + ret +; 24022 + +_InterpretBattleMenu:: ; 24022 + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + farcall MobileTextBorder + call UpdateSprites + call ApplyTilemap + call Get2DMenuSelection + ret +; 2403c + +_InterpretMobileMenu:: ; 2403c + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + farcall MobileTextBorder + call UpdateSprites + call ApplyTilemap + call Init2DMenuCursorPosition + ld hl, w2DMenuFlags1 + set 7, [hl] +.loop + call DelayFrame + farcall Function10032e + ld a, [wcd2b] + and a + jr nz, .quit + call MobileMenuJoypad + ld a, [wMenuJoypadFilter] + and c + jr z, .loop + call Mobile_GetMenuSelection + ret + +.quit + ld a, [w2DMenuNumCols] + ld c, a + ld a, [w2DMenuNumRows] + call SimpleMultiply + ld [wMenuCursorBuffer], a + and a + ret +; 24085 + + + +Draw2DMenu: ; 24085 + xor a + ld [hBGMapMode], a + call MenuBox + call Place2DMenuItemStrings + ret +; 2408f + +Get2DMenuSelection: ; 2408f + call Init2DMenuCursorPosition + call StaticMenuJoypad + call MenuClickSound +Mobile_GetMenuSelection: ; 24098 + ld a, [wMenuDataFlags] + bit 1, a + jr z, .skip + call GetMenuJoypad + bit SELECT_F, a + jr nz, .quit1 + +.skip + ld a, [wMenuDataFlags] + bit 0, a + jr nz, .skip2 + call GetMenuJoypad + bit B_BUTTON_F, a + jr nz, .quit2 + +.skip2 + ld a, [w2DMenuNumCols] + ld c, a + ld a, [wMenuCursorY] + dec a + call SimpleMultiply + ld c, a + ld a, [wMenuCursorX] + add c + ld [wMenuCursorBuffer], a + and a + ret + +.quit1 + scf + ret + +.quit2 + scf + ret +; 240cd + +Get2DMenuNumberOfColumns: ; 240cd + ld a, [wMenuData_2DMenuDimensions] + and $f + ret +; 240d3 + +Get2DMenuNumberOfRows: ; 240d3 + ld a, [wMenuData_2DMenuDimensions] + swap a + and $f + ret +; 240db + +Place2DMenuItemStrings: ; 240db + ld hl, wMenuData_2DMenuItemStringsAddr + ld e, [hl] + inc hl + ld d, [hl] + call GetMenuTextStartCoord + call Coord2Tile + call Get2DMenuNumberOfRows + ld b, a +.row + push bc + push hl + call Get2DMenuNumberOfColumns + ld c, a +.col + push bc + ld a, [wMenuData_2DMenuItemStringsBank] + call Place2DMenuItemName + inc de + ld a, [wMenuData_2DMenuSpacing] + ld c, a + ld b, 0 + add hl, bc + pop bc + dec c + jr nz, .col + pop hl + ld bc, 2 * SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ld hl, wMenuData_2DMenuFunctionAddr + ld a, [hli] + ld h, [hl] + ld l, a + or h + ret z + ld a, [wMenuData_2DMenuFunctionBank] + rst FarCall + ret +; 2411a + + +Init2DMenuCursorPosition: ; 2411a (9:411a) + call GetMenuTextStartCoord + ld a, b + ld [w2DMenuCursorInitY], a + dec c + ld a, c + ld [w2DMenuCursorInitX], a + call Get2DMenuNumberOfRows + ld [w2DMenuNumRows], a + call Get2DMenuNumberOfColumns + ld [w2DMenuNumCols], a + call .InitFlags_a + call .InitFlags_b + call .InitFlags_c + ld a, [w2DMenuNumCols] + ld e, a + ld a, [wMenuCursorBuffer] + ld b, a + xor a + ld d, 0 +.loop + inc d + add e + cp b + jr c, .loop + sub e + ld c, a + ld a, b + sub c + and a + jr z, .reset1 + cp e + jr z, .okay1 + jr c, .okay1 +.reset1 + ld a, 1 +.okay1 + ld [wMenuCursorX], a + ld a, [w2DMenuNumRows] + ld e, a + ld a, d + and a + jr z, .reset2 + cp e + jr z, .okay2 + jr c, .okay2 +.reset2 + ld a, 1 +.okay2 + ld [wMenuCursorY], a + xor a + ld [wCursorOffCharacter], a + ld [wCursorCurrentTile], a + ld [wCursorCurrentTile + 1], a + ret +; 24179 + +.InitFlags_a: ; 24179 + xor a + ld hl, w2DMenuFlags1 + ld [hli], a + ld [hld], a + ld a, [wMenuDataFlags] + bit 5, a + ret z + set 5, [hl] + set 4, [hl] + ret +; 2418a + +.InitFlags_b: ; 2418a + ld a, [wMenuData_2DMenuSpacing] + or $20 + ld [w2DMenuCursorOffsets], a + ret +; 24193 + +.InitFlags_c: ; 24193 + ld hl, wMenuDataFlags + ld a, A_BUTTON + bit 0, [hl] + jr nz, .skip + or B_BUTTON +.skip + bit 1, [hl] + jr z, .skip2 + or SELECT +.skip2 + ld [wMenuJoypadFilter], a + ret +; 241a8 + + +_StaticMenuJoypad:: ; 241a8 + call Place2DMenuCursor +_ScrollingMenuJoypad:: ; 241ab + ld hl, w2DMenuFlags2 + res 7, [hl] + ld a, [hBGMapMode] + push af + call MenuJoypadLoop + pop af + ld [hBGMapMode], a + ret +; 241ba + +MobileMenuJoypad: ; 241ba + ld hl, w2DMenuFlags2 + res 7, [hl] + ld a, [hBGMapMode] + push af + call Move2DMenuCursor + call Do2DMenuRTCJoypad + jr nc, .skip_joypad + call _2DMenuInterpretJoypad +.skip_joypad + pop af + ld [hBGMapMode], a + call GetMenuJoypad + ld c, a + ret +; 241d5 + + +Unreferenced_Function241d5: ; 241d5 + call Place2DMenuCursor +.loop + call Move2DMenuCursor + call HDMATransferTileMapToWRAMBank3 ; BUG: This function is in another bank. + ; Pointer in current bank (9) is bogus. + call .loop2 + jr nc, .done + call _2DMenuInterpretJoypad + jr c, .done + ld a, [w2DMenuFlags1] + bit 7, a + jr nz, .done + call GetMenuJoypad + ld c, a + ld a, [wMenuJoypadFilter] + and c + jr z, .loop + +.done + ret + +.loop2 + call Menu_WasButtonPressed + ret c + ld c, 1 + ld b, 3 + call AdvanceMobileInactivityTimerAndCheckExpired ; BUG: This function is in another bank. + ; Pointer in current bank (9) is bogus. + ret c + farcall Function100337 + ret c + ld a, [w2DMenuFlags1] + bit 7, a + jr z, .loop2 + and a + ret +; 24216 + + +MenuJoypadLoop: ; 24216 +.loop + call Move2DMenuCursor + call .BGMap_OAM + call Do2DMenuRTCJoypad + jr nc, .done + call _2DMenuInterpretJoypad + jr c, .done + ld a, [w2DMenuFlags1] + bit 7, a + jr nz, .done + call GetMenuJoypad + ld b, a + ld a, [wMenuJoypadFilter] + and b + jr z, .loop + +.done + ret +; 24238 + +.BGMap_OAM: ; 24238 + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + call WaitBGMap + pop af + ld [hOAMUpdate], a + xor a + ld [hBGMapMode], a + ret +; 24249 + +Do2DMenuRTCJoypad: ; 24249 +.loopRTC + call RTC + call Menu_WasButtonPressed + ret c + ld a, [w2DMenuFlags1] + bit 7, a + jr z, .loopRTC + and a + ret +; 24259 + +Menu_WasButtonPressed: ; 24259 + ld a, [w2DMenuFlags1] + bit 6, a + jr z, .skip_to_joypad + callfar PlaySpriteAnimationsAndDelayFrame + +.skip_to_joypad + call JoyTextDelay + call GetMenuJoypad + and a + ret z + scf + ret +; 24270 + +_2DMenuInterpretJoypad: ; 24270 + call GetMenuJoypad + bit A_BUTTON_F, a + jp nz, .a_b_start_select + bit B_BUTTON_F, a + jp nz, .a_b_start_select + bit SELECT_F, a + jp nz, .a_b_start_select + bit START_F, a + jp nz, .a_b_start_select + bit D_RIGHT_F, a + jr nz, .d_right + bit D_LEFT_F, a + jr nz, .d_left + bit D_UP_F, a + jr nz, .d_up + bit D_DOWN_F, a + jr nz, .d_down + and a + ret + +.set_bit_7 ; 24299 + ld hl, w2DMenuFlags2 + set 7, [hl] + scf + ret + +.d_down + ld hl, wMenuCursorY + ld a, [w2DMenuNumRows] + cp [hl] + jr z, .check_wrap_around_down + inc [hl] + xor a + ret + +.check_wrap_around_down + ld a, [w2DMenuFlags1] + bit 5, a + jr nz, .wrap_around_down + bit 3, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_down + ld [hl], $1 + xor a + ret + +.d_up + ld hl, wMenuCursorY + ld a, [hl] + dec a + jr z, .check_wrap_around_up + ld [hl], a + xor a + ret + +.check_wrap_around_up + ld a, [w2DMenuFlags1] + bit 5, a + jr nz, .wrap_around_up + bit 2, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_up + ld a, [w2DMenuNumRows] + ld [hl], a + xor a + ret + +.d_left + ld hl, wMenuCursorX + ld a, [hl] + dec a + jr z, .check_wrap_around_left + ld [hl], a + xor a + ret + +.check_wrap_around_left + ld a, [w2DMenuFlags1] + bit 4, a + jr nz, .wrap_around_left + bit 1, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_left + ld a, [w2DMenuNumCols] + ld [hl], a + xor a + ret + +.d_right + ld hl, wMenuCursorX + ld a, [w2DMenuNumCols] + cp [hl] + jr z, .check_wrap_around_right + inc [hl] + xor a + ret + +.check_wrap_around_right + ld a, [w2DMenuFlags1] + bit 4, a + jr nz, .wrap_around_right + bit 0, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_right + ld [hl], $1 + xor a + ret +; 24318 + +.a_b_start_select ; 24318 + xor a + ret +; 2431a + +Move2DMenuCursor: ; 2431a + ld hl, wCursorCurrentTile + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hl] + cp "▶" + jr nz, Place2DMenuCursor + ld a, [wCursorOffCharacter] + ld [hl], a +Place2DMenuCursor: ; 24329 + ld a, [w2DMenuCursorInitY] + ld b, a + ld a, [w2DMenuCursorInitX] + ld c, a + call Coord2Tile + ld a, [w2DMenuCursorOffsets] + swap a + and $f + ld c, a + ld a, [wMenuCursorY] + ld b, a + xor a + dec b + jr z, .got_row +.row_loop + add c + dec b + jr nz, .row_loop + +.got_row + ld c, SCREEN_WIDTH + call AddNTimes + ld a, [w2DMenuCursorOffsets] + and $f + ld c, a + ld a, [wMenuCursorX] + ld b, a + xor a + dec b + jr z, .got_col +.col_loop + add c + dec b + jr nz, .col_loop + +.got_col + ld c, a + add hl, bc + ld a, [hl] + cp "▶" + jr z, .cursor_on + ld [wCursorOffCharacter], a + ld [hl], "▶" + +.cursor_on + ld a, l + ld [wCursorCurrentTile], a + ld a, h + ld [wCursorCurrentTile + 1], a + ret +; 24374 + +_PushWindow:: ; 24374 + ld a, [rSVBK] + push af + ld a, BANK(wWindowStack) + ld [rSVBK], a + + ld hl, wWindowStackPointer + ld e, [hl] + inc hl + ld d, [hl] + push de + + ld b, $10 + ld hl, wMenuFlags +.loop + ld a, [hli] + ld [de], a + dec de + dec b + jr nz, .loop + +; If bit 6 or 7 of the menu flags is set, set bit 0 of the address +; at 7:[wWindowStackPointer], and draw the menu using the coordinates from the header. +; Otherwise, reset bit 0 of 7:[wWindowStackPointer]. + ld a, [wMenuFlags] + bit 6, a + jr nz, .bit_6 + bit 7, a + jr z, .not_bit_7 + +.bit_6 + ld hl, wWindowStackPointer + ld a, [hli] + ld h, [hl] + ld l, a + set 0, [hl] + call MenuBoxCoord2Tile + call .copy + call MenuBoxCoord2Attr + call .copy + jr .done + +.not_bit_7 + pop hl ; last-pushed register was de + push hl + ld a, [hld] + ld l, [hl] + ld h, a + res 0, [hl] + +.done + pop hl + call .ret ; empty function + ld a, h + ld [de], a + dec de + ld a, l + ld [de], a + dec de + ld hl, wWindowStackPointer + ld [hl], e + inc hl + ld [hl], d + + pop af + ld [rSVBK], a + ld hl, wWindowStackSize + inc [hl] + ret +; 243cd + +.copy ; 243cd + call GetMenuBoxDims + inc b + inc c + call .ret ; empty function + +.row + push bc + push hl + +.col + ld a, [hli] + ld [de], a + dec de + dec c + jr nz, .col + + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + + ret +; 243e7 + +.ret ; 243e7 + ret +; 243e8 + +_ExitMenu:: ; 243e8 + xor a + ld [hBGMapMode], a + + ld a, [rSVBK] + push af + ld a, BANK(wWindowStack) + ld [rSVBK], a + + call GetWindowStackTop + ld a, l + or h + jp z, Error_Cant_ExitMenu + ld a, l + ld [wWindowStackPointer], a + ld a, h + ld [wWindowStackPointer + 1], a + call PopWindow + ld a, [wMenuFlags] + bit 0, a + jr z, .loop + ld d, h + ld e, l + call RestoreTileBackup + +.loop + call GetWindowStackTop + ld a, h + or l + jr z, .done + call PopWindow + +.done + pop af + ld [rSVBK], a + ld hl, wWindowStackSize + dec [hl] + ret +; 24423 + +Unreferenced_Function24423: ; 24423 + ld a, [wVramState] + bit 0, a + ret z + xor a ; sScratch + call GetSRAMBank + hlcoord 0, 0 + ld de, sScratch + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + call CopyBytes + call CloseSRAM + call OverworldTextModeSwitch + xor a ; sScratch + call GetSRAMBank + ld hl, sScratch + decoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT +.loop + ld a, [hl] + cp $61 + jr c, .next + ld [de], a +.next + inc hl + inc de + dec bc + ld a, c + or b + jr nz, .loop + call CloseSRAM + ret +; 2445d + +Error_Cant_ExitMenu: ; 2445d + ld hl, .Text_NoWindowsAvailableForPopping + call PrintText + call WaitBGMap +.InfiniteLoop: + jr .InfiniteLoop +; 24468 + +.Text_NoWindowsAvailableForPopping: ; 24468 + text_jump UnknownText_0x1c46b7 + db "@" +; 2446d + +_InitVerticalMenuCursor:: ; 2446d + ld a, [wMenuDataFlags] + ld b, a + ld hl, w2DMenuCursorInitY + ld a, [wMenuBorderTopCoord] + inc a + bit 6, b + jr nz, .skip_offset + inc a +.skip_offset + ld [hli], a +; w2DMenuCursorInitX + ld a, [wMenuBorderLeftCoord] + inc a + ld [hli], a +; w2DMenuNumRows + ld a, [wMenuDataItems] + ld [hli], a +; w2DMenuNumCols + ld a, 1 + ld [hli], a +; w2DMenuFlags1 + ld [hl], $0 + bit 5, b + jr z, .skip_bit_5 + set 5, [hl] +.skip_bit_5 + ld a, [wMenuFlags] + bit 4, a + jr z, .skip_bit_6 + set 6, [hl] +.skip_bit_6 + inc hl +; w2DMenuFlags2 + xor a + ld [hli], a +; w2DMenuCursorOffsets + ln a, 2, 0 + ld [hli], a +; wMenuJoypadFilter + ld a, A_BUTTON + bit 0, b + jr nz, .skip_bit_1 + add B_BUTTON +.skip_bit_1 + ld [hli], a +; wMenuCursorY + ld a, [wMenuCursorBuffer] + and a + jr z, .load_at_the_top + ld c, a + ld a, [wMenuDataItems] + cp c + jr nc, .load_position +.load_at_the_top + ld c, 1 +.load_position + ld [hl], c + inc hl +; wMenuCursorX + ld a, 1 + ld [hli], a +; wCursorOffCharacter, wCursorCurrentTile + xor a + ld [hli], a + ld [hli], a + ld [hli], a + ret +; 244c3 diff --git a/engine/menus/menu_2.asm b/engine/menus/menu_2.asm new file mode 100644 index 000000000..16cce5348 --- /dev/null +++ b/engine/menus/menu_2.asm @@ -0,0 +1,253 @@ +PlaceMenuItemName: ; 0x24ab4 + push de + ld a, [wMenuSelection] + ld [wNamedObjectIndexBuffer], a + call GetItemName + pop hl + call PlaceString + ret + +PlaceMenuItemQuantity: ; 0x24ac3 + push de + ld a, [wMenuSelection] + ld [wCurItem], a + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + pop hl + and a + jr nz, .done + ld de, $15 + add hl, de + ld [hl], "×" + inc hl + ld de, wMenuSelectionQuantity + lb bc, 1, 2 + call PrintNum + +.done + ret + +PlaceMoneyTopRight: ; 24ae8 + ld hl, MenuHeader_0x24b15 + call CopyMenuHeader + jr PlaceMoneyTextBox + +PlaceMoneyBottomLeft: ; 24af0 + ld hl, MenuHeader_0x24b1d + call CopyMenuHeader + jr PlaceMoneyTextBox + +PlaceMoneyAtTopLeftOfTextbox: ; 24af8 + ld hl, MenuHeader_0x24b15 + lb de, 0, 11 + call OffsetMenuHeader + +PlaceMoneyTextBox: ; 24b01 + call MenuBox + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + 1 + add hl, de + ld de, wMoney + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + ret + +MenuHeader_0x24b15: ; 0x24b15 + db MENU_BACKUP_TILES ; flags + menu_coords 11, 0, SCREEN_WIDTH - 1, 2 + dw NULL + db 1 ; default option + +MenuHeader_0x24b1d: ; 0x24b1d + db MENU_BACKUP_TILES ; flags + menu_coords 0, 11, 8, 13 + dw NULL + db 1 ; default option + +DisplayCoinCaseBalance: ; 24b25 + ; Place a text box of size 1x7 at 11, 0. + hlcoord 11, 0 + ld b, 1 + ld c, 7 + call TextBox + hlcoord 12, 0 + ld de, CoinString + call PlaceString + hlcoord 17, 1 + ld de, ShowMoney_TerminatorString + call PlaceString + ld de, wCoins + lb bc, 2, 4 + hlcoord 13, 1 + call PrintNum + ret + +DisplayMoneyAndCoinBalance: ; 24b4e + hlcoord 5, 0 + ld b, 3 + ld c, 13 + call TextBox + hlcoord 6, 1 + ld de, MoneyString + call PlaceString + hlcoord 12, 1 + ld de, wMoney + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + hlcoord 6, 3 + ld de, CoinString + call PlaceString + hlcoord 15, 3 + ld de, wCoins + lb bc, 2, 4 + call PrintNum + ret + +MoneyString: ; 24b83 + db "MONEY@" +CoinString: ; 24b89 + db "COIN@" +ShowMoney_TerminatorString: ; 24b8e + db "@" + +Unreferenced_Function24b8f: ; 24b8f +; related to safari? + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + hlcoord 0, 0 + ld b, 3 + ld c, 7 + call TextBox + hlcoord 1, 1 + ld de, wSafariTimeRemaining + lb bc, 2, 3 + call PrintNum + hlcoord 4, 1 + ld de, .slash_500 + call PlaceString + hlcoord 1, 3 + ld de, .booru_ko + call PlaceString + hlcoord 5, 3 + ld de, wSafariBallsRemaining + lb bc, 1, 2 + call PrintNum + pop af + ld [wOptions], a + ret + +.slash_500 ; 24bcf + db "/500@" +.booru_ko ; 24bd4 + db "ボール   こ@" + +StartMenu_DrawBugContestStatusBox: ; 24bdc + hlcoord 0, 0 + ld b, 5 + ld c, 17 + call TextBox + ret + +StartMenu_PrintBugContestStatus: ; 24be7 + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call StartMenu_DrawBugContestStatusBox + hlcoord 1, 5 + ld de, .Balls_EN + call PlaceString + hlcoord 8, 5 + ld de, wParkBallsRemaining + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + hlcoord 1, 1 + ld de, .CAUGHT + call PlaceString + ld a, [wContestMon] + and a + ld de, .None + jr z, .no_contest_mon + ld [wd265], a + call GetPokemonName + +.no_contest_mon + hlcoord 8, 1 + call PlaceString + ld a, [wContestMon] + and a + jr z, .skip_level + hlcoord 1, 3 + ld de, .LEVEL + call PlaceString + ld a, [wContestMonLevel] + ld h, b + ld l, c + inc hl + ld c, 3 + call Print8BitNumRightAlign + +.skip_level + pop af + ld [wOptions], a + ret + +.Balls_JP: ; 24c43 + db "ボール   こ@" +.CAUGHT: ; 24c4b + db "CAUGHT@" +.Balls_EN: ; 24c52 + db "BALLS:@" +.None: ; 24c59 + db "None@" +.LEVEL: ; 24c5e + db "LEVEL@" + +FindApricornsInBag: ; 24c64 +; Checks the bag for Apricorns. + ld hl, wBuffer1 + xor a + ld [hli], a + dec a + ld bc, 10 + call ByteFill + + ld hl, ApricornBalls +.loop + ld a, [hl] + cp -1 + jr z, .done + push hl + ld [wCurItem], a + ld hl, wNumItems + call CheckItem + pop hl + jr nc, .nope + ld a, [hl] + call .addtobuffer +.nope + inc hl + inc hl + jr .loop + +.done + ld a, [wBuffer1] + and a + ret nz + scf + ret + +.addtobuffer ; 24c94 + push hl + ld hl, wBuffer1 + inc [hl] + ld e, [hl] + ld d, 0 + add hl, de + ld [hl], a + pop hl + ret + +INCLUDE "data/items/apricorn_balls.asm" diff --git a/engine/menus/naming_screen.asm b/engine/menus/naming_screen.asm new file mode 100755 index 000000000..a958e10eb --- /dev/null +++ b/engine/menus/naming_screen.asm @@ -0,0 +1,1467 @@ +NAMINGSCREEN_CURSOR EQU $7e + +NAMINGSCREEN_BORDER EQUS "\"■\"" ; $60 +NAMINGSCREEN_MIDDLELINE EQUS "\"→\"" ; $eb +NAMINGSCREEN_UNDERLINE EQUS "\"\"" ; $f2 + +_NamingScreen: ; 0x116b7 + call DisableSpriteUpdates + call NamingScreen + call ReturnToMapWithSpeechTextbox + ret + +; 0x116c1 + +NamingScreen: ; 116c1 + ld hl, wNamingScreenDestinationPointer + ld [hl], e + inc hl + ld [hl], d + ld hl, wNamingScreenType + ld [hl], b + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + call .SetUpNamingScreen + call DelayFrame +.loop + call NamingScreenJoypadLoop + jr nc, .loop + pop af + ld [hInMenu], a + pop af + ld [hMapAnims], a + pop af + ld [wOptions], a + call ClearJoypad + ret + +; 116f8 + +.SetUpNamingScreen: ; 116f8 + call ClearBGPalettes + ld b, SCGB_DIPLOMA + call GetSGBLayout + call DisableLCD + call LoadNamingScreenGFX + call NamingScreen_InitText + ld a, LCDC_DEFAULT + ld [rLCDC], a + call .GetNamingScreenSetup + call WaitBGMap + call WaitTop + call SetPalettes + call NamingScreen_InitNameEntry + ret + +; 1171d + +.GetNamingScreenSetup: ; 1171d + ld a, [wNamingScreenType] + and 7 + 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 + +; 1172e + +.Jumptable: ; 1172e (4:572e) + dw .Pokemon + dw .Player + dw .Rival + dw .Mom + dw .Box + dw .Tomodachi + dw .Pokemon + dw .Pokemon + +.Pokemon: ; 1173e (4:573e) + ld a, [wCurPartySpecies] + ld [wd265], a + ld hl, LoadMenuMonIcon + ld a, BANK(LoadMenuMonIcon) + ld e, $1 + rst FarCall ; ; indirect jump to LoadMenuMonIcon (8e83f (23:683f)) + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + hlcoord 5, 2 + call PlaceString + ld l, c + ld h, b + ld de, .NicknameStrings + call PlaceString + inc de + hlcoord 5, 4 + call PlaceString + farcall GetGender + jr c, .genderless + ld a, "♂" + jr nz, .place_gender + ld a, "♀" +.place_gender + hlcoord 1, 2 + ld [hl], a +.genderless + call .StoreMonIconParams + ret + +; 11780 (4:5780) + +.NicknameStrings: ; 11780 + db "'S@" + db "NICKNAME?@" + +; 1178d + +.Player: ; 1178d (4:578d) + farcall GetPlayerIcon + call .LoadSprite + hlcoord 5, 2 + ld de, .PlayerNameString + call PlaceString + call .StoreSpriteIconParams + ret + +; 117a3 (4:57a3) + +.PlayerNameString: ; 117a3 + db "YOUR NAME?@" + +; 117ae + +.Rival: ; 117ae (4:57ae) + ld de, SilverSpriteGFX + ld b, BANK(SilverSpriteGFX) + call .LoadSprite + hlcoord 5, 2 + ld de, .RivalNameString + call PlaceString + call .StoreSpriteIconParams + ret + +; 117c3 (4:57c3) + +.RivalNameString: ; 117c3 + db "RIVAL'S NAME?@" + +; 117d1 + +.Mom: ; 117d1 (4:57d1) + ld de, MomSpriteGFX + ld b, BANK(MomSpriteGFX) + call .LoadSprite + hlcoord 5, 2 + ld de, .MomNameString + call PlaceString + call .StoreSpriteIconParams + ret + +; 117e6 (4:57e6) + +.MomNameString: ; 117e6 + db "MOTHER'S NAME?@" + +; 117f5 + +.Box: ; 117f5 (4:57f5) + ld de, PokeBallSpriteGFX + ld hl, vTiles0 tile $00 + lb bc, BANK(PokeBallSpriteGFX), 4 + call Request2bpp + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], a + depixel 4, 4, 4, 0 + ld a, SPRITE_ANIM_INDEX_RED_WALK + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], $0 + hlcoord 5, 2 + ld de, .BoxNameString + call PlaceString + call .StoreBoxIconParams + ret + +; 11822 (4:5822) + +.BoxNameString: ; 11822 + db "BOX NAME?@" + +; 1182c + +.Tomodachi: ; 1182c (4:582c) + hlcoord 3, 2 + ld de, .oTomodachi_no_namae_sutoringu + call PlaceString + call .StoreSpriteIconParams + ret + +; 11839 (4:5839) + +.oTomodachi_no_namae_sutoringu ; 11839 + db "おともだち の なまえは?@" + +; 11847 + +.LoadSprite: ; 11847 (4:5847) + push de + ld hl, vTiles0 tile $00 + ld c, $4 + push bc + call Request2bpp + pop bc + ld hl, 12 tiles + add hl, de + ld e, l + ld d, h + ld hl, vTiles0 tile $04 + call Request2bpp + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], a + pop de + ld b, SPRITE_ANIM_INDEX_RED_WALK + ld a, d + cp HIGH(KrisSpriteGFX) + jr nz, .not_kris + ld a, e + cp LOW(KrisSpriteGFX) + jr nz, .not_kris + ld b, SPRITE_ANIM_INDEX_BLUE_WALK +.not_kris + ld a, b + depixel 4, 4, 4, 0 + call _InitSpriteAnimStruct + ret + +.StoreMonIconParams: ; 1187b (4:587b) + ld a, MON_NAME_LENGTH - 1 + hlcoord 5, 6 + jr .StoreParams + +.StoreSpriteIconParams: ; 11882 (4:5882) + ld a, PLAYER_NAME_LENGTH - 1 + hlcoord 5, 6 + jr .StoreParams + +.StoreBoxIconParams: ; 11889 (4:5889) + ld a, BOX_NAME_LENGTH - 1 + hlcoord 5, 4 + jr .StoreParams + +.StoreParams: ; 11890 (4:5890) + ld [wNamingScreenMaxNameLength], a + ld a, l + ld [wNamingScreenStringEntryCoord], a + ld a, h + ld [wNamingScreenStringEntryCoord + 1], a + ret + +NamingScreen_IsTargetBox: ; 1189c + push bc + push af + ld a, [wNamingScreenType] + sub $3 + ld b, a + pop af + dec b + pop bc + ret + +; 118a8 + +NamingScreen_InitText: ; 118a8 + call WaitTop + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, NAMINGSCREEN_BORDER + call ByteFill + hlcoord 1, 1 + lb bc, 6, 18 + call NamingScreen_IsTargetBox + jr nz, .not_box + lb bc, 4, 18 + +.not_box + call ClearBox + ld de, NameInputUpper +NamingScreen_ApplyTextInputMode: ; 118ca + call NamingScreen_IsTargetBox + jr nz, .not_box + ld hl, BoxNameInputLower - NameInputLower + add hl, de + ld d, h + ld e, l + +.not_box + push de + hlcoord 1, 8 + lb bc, 7, 18 + call NamingScreen_IsTargetBox + jr nz, .not_box_2 + hlcoord 1, 6 + lb bc, 9, 18 + +.not_box_2 + call ClearBox + hlcoord 1, 16 + lb bc, 1, 18 + call ClearBox + pop de + hlcoord 2, 8 + ld b, $5 + call NamingScreen_IsTargetBox + jr nz, .row + hlcoord 2, 6 + ld b, $6 + +.row + ld c, $11 +.col + ld a, [de] + ld [hli], a + inc de + dec c + jr nz, .col + push de + ld de, 2 * SCREEN_WIDTH - $11 + add hl, de + pop de + dec b + jr nz, .row + ret + +; 11915 + +NamingScreenJoypadLoop: ; 11915 + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .quit + call .RunJumptable + farcall PlaySpriteAnimationsAndDelayFrame + call .UpdateStringEntry + call DelayFrame + and a + ret + +.quit + callfar ClearSpriteAnims + call ClearSprites + xor a + ld [hSCX], a + ld [hSCY], a + scf + ret + +; 11940 + +.UpdateStringEntry: ; 11940 + xor a + ld [hBGMapMode], a + hlcoord 1, 5 + call NamingScreen_IsTargetBox + jr nz, .got_coords + hlcoord 1, 3 + +.got_coords + lb bc, 1, 18 + call ClearBox + ld hl, wNamingScreenDestinationPointer + ld e, [hl] + inc hl + ld d, [hl] + ld hl, wNamingScreenStringEntryCoord + ld a, [hli] + ld h, [hl] + ld l, a + call PlaceString + ld a, $1 + ld [hBGMapMode], a + ret + +; 11968 + +.RunJumptable: ; 11968 + 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 + +; 11977 + +.Jumptable: ; 11977 (4:5977) + dw .InitCursor + dw .ReadButtons + +.InitCursor: ; 1197b (4:597b) + depixel 10, 3 + call NamingScreen_IsTargetBox + jr nz, .got_cursor_position + ld d, 8 * 8 +.got_cursor_position + ld a, SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR + call _InitSpriteAnimStruct + ld a, c + ld [wNamingScreenCursorObjectPointer], a + ld a, b + ld [wNamingScreenCursorObjectPointer + 1], a + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld [hl], a + ld hl, wJumptableIndex + inc [hl] + ret + +.ReadButtons: ; 119a1 (4:59a1) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and A_BUTTON + jr nz, .a + ld a, [hl] + and B_BUTTON + jr nz, .b + ld a, [hl] + and START + jr nz, .start + ld a, [hl] + and SELECT + jr nz, .select + ret + +.a + call .GetCursorPosition + cp $1 + jr z, .select + cp $2 + jr z, .b + cp $3 + jr z, .end + call NamingScreen_GetLastCharacter + call NamingScreen_TryAddCharacter + ret nc + +.start + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $8 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $4 + call NamingScreen_IsTargetBox + ret nz + inc [hl] + ret + +.b + call NamingScreen_DeleteCharacter + ret + +.end + call NamingScreen_StoreEntry + ld hl, wJumptableIndex + set 7, [hl] + ret + +.select + ld hl, wNamingScreenLetterCase + ld a, [hl] + xor 1 + ld [hl], a + jr z, .upper + ld de, NameInputLower + call NamingScreen_ApplyTextInputMode + ret + +.upper + ld de, NameInputUpper + call NamingScreen_ApplyTextInputMode + ret + +.GetCursorPosition: ; 11a0b (4:5a0b) + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + +NamingScreen_GetCursorPosition: ; 11a11 (4:5a11) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + push bc + ld b, $4 + call NamingScreen_IsTargetBox + jr nz, .not_box + inc b +.not_box + cp b + pop bc + jr nz, .not_bottom_row + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $3 + jr c, .case_switch + cp $6 + jr c, .delete + ld a, $3 + ret + +.case_switch + ld a, $1 + ret + +.delete + ld a, $2 + ret + +.not_bottom_row + xor a + ret + +NamingScreen_AnimateCursor: ; 11a3b (4:5a3b) + call .GetDPad + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + ld e, a + swap e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], e + ld d, $4 + call NamingScreen_IsTargetBox + jr nz, .ok + inc d +.ok + cp d + ld de, .LetterEntries + ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 0 + jr nz, .ok2 + ld de, .CaseDelEnd + ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR_BIG - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 1 +.ok2 + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + add [hl] ; default SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld l, [hl] + ld h, $0 + add hl, de + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; 11a79 (4:5a79) + +.LetterEntries: ; 11a79 + db $00, $10, $20, $30, $40, $50, $60, $70, $80 + +.CaseDelEnd: ; 11a82 + db $00, $00, $00, $30, $30, $30, $60, $60, $60 + +; 11a8b + +.GetDPad: ; 11a8b (4:5a8b) + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .up + ld a, [hl] + and D_DOWN + jr nz, .down + ld a, [hl] + and D_LEFT + jr nz, .left + ld a, [hl] + and D_RIGHT + jr nz, .right + ret + +.right + call NamingScreen_GetCursorPosition + and a + jr nz, .asm_11ab7 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $8 + jr nc, .asm_11ab4 + inc [hl] + ret + +.asm_11ab4 + ld [hl], $0 + ret + +.asm_11ab7 + cp $3 + jr nz, .asm_11abc + xor a +.asm_11abc + ld e, a + add a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.left + call NamingScreen_GetCursorPosition + and a + jr nz, .asm_11ad8 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_11ad5 + dec [hl] + ret + +.asm_11ad5 + ld [hl], $8 + ret + +.asm_11ad8 + cp $1 + jr nz, .asm_11ade + ld a, $4 +.asm_11ade + dec a + dec a + ld e, a + add a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.down + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + call NamingScreen_IsTargetBox + jr nz, .asm_11af9 + cp $5 + jr nc, .asm_11aff + inc [hl] + ret + +.asm_11af9 + cp $4 + jr nc, .asm_11aff + inc [hl] + ret + +.asm_11aff + ld [hl], $0 + ret + +.up + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .asm_11b0c + dec [hl] + ret + +.asm_11b0c + ld [hl], $4 + call NamingScreen_IsTargetBox + ret nz + inc [hl] + ret + +NamingScreen_TryAddCharacter: ; 11b14 (4:5b14) + ld a, [wNamingScreenLastCharacter] ; lost +MailComposition_TryAddCharacter: ; 11b17 (4:5b17) + ld a, [wNamingScreenMaxNameLength] + ld c, a + ld a, [wNamingScreenCurrNameLength] + cp c + ret nc + + ld a, [wNamingScreenLastCharacter] + +NamingScreen_LoadNextCharacter: ; 11b23 + call NamingScreen_GetTextCursorPosition + ld [hl], a + +NamingScreen_AdvanceCursor_CheckEndOfString: ; 11b27 + ld hl, wNamingScreenCurrNameLength + inc [hl] + call NamingScreen_GetTextCursorPosition + ld a, [hl] + cp "@" + jr z, .end_of_string + ld [hl], NAMINGSCREEN_UNDERLINE + and a + ret + +.end_of_string + scf + ret + +; 11b39 (4:5b39) + +; unused + ld a, [wNamingScreenCurrNameLength] + and a + ret z + push hl + ld hl, wNamingScreenCurrNameLength + dec [hl] + call NamingScreen_GetTextCursorPosition + ld c, [hl] + pop hl + +.loop + ld a, [hli] + cp $ff + jr z, NamingScreen_AdvanceCursor_CheckEndOfString + cp c + jr z, .done + inc hl + jr .loop + +.done + ld a, [hl] + jr NamingScreen_LoadNextCharacter + +; 11b56 + +INCLUDE "data/text/unused_dakutens.asm" + +; 11bbc + +NamingScreen_DeleteCharacter: ; 11bbc (4:5bbc) + ld hl, wNamingScreenCurrNameLength + ld a, [hl] + and a + ret z + dec [hl] + call NamingScreen_GetTextCursorPosition + ld [hl], NAMINGSCREEN_UNDERLINE + inc hl + ld a, [hl] + cp NAMINGSCREEN_UNDERLINE + ret nz + ld [hl], NAMINGSCREEN_MIDDLELINE + ret + +NamingScreen_GetTextCursorPosition: ; 11bd0 (4:5bd0) + push af + ld hl, wNamingScreenDestinationPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wNamingScreenCurrNameLength] + ld e, a + ld d, 0 + add hl, de + pop af + ret + +; 11be0 + +NamingScreen_InitNameEntry: ; 11be0 +; load NAMINGSCREEN_UNDERLINE, (NAMINGSCREEN_MIDDLELINE * [wNamingScreenMaxNameLength]), "@" into the dw address at wNamingScreenDestinationPointer + ld hl, wNamingScreenDestinationPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld [hl], NAMINGSCREEN_UNDERLINE + inc hl + ld a, [wNamingScreenMaxNameLength] + dec a + ld c, a + ld a, NAMINGSCREEN_MIDDLELINE +.loop + ld [hli], a + dec c + jr nz, .loop + ld [hl], "@" + ret + +; 11bf7 + +NamingScreen_StoreEntry: ; 11bf7 (4:5bf7) + ld hl, wNamingScreenDestinationPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wNamingScreenMaxNameLength] + ld c, a +.loop + ld a, [hl] + cp NAMINGSCREEN_MIDDLELINE + jr z, .terminator + cp NAMINGSCREEN_UNDERLINE + jr nz, .not_terminator +.terminator + ld [hl], "@" +.not_terminator + inc hl + dec c + jr nz, .loop + ret + +NamingScreen_GetLastCharacter: ; 11c11 (4:5c11) + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + add [hl] + sub $8 + srl a + srl a + srl a + ld e, a + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + add [hl] + sub $10 + srl a + srl a + srl a + ld d, a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH +.loop + ld a, d + and a + jr z, .done + add hl, bc + dec d + jr .loop + +.done + add hl, de + ld a, [hl] + ld [wNamingScreenLastCharacter], a + ret + +LoadNamingScreenGFX: ; 11c51 + call ClearSprites + callfar ClearSpriteAnims + call LoadStandardFont + call LoadFontsExtra + + ld de, NamingScreenGFX_MiddleLine + ld hl, vTiles0 tile NAMINGSCREEN_MIDDLELINE + lb bc, BANK(NamingScreenGFX_MiddleLine), 1 + call Get1bpp + + ld de, NamingScreenGFX_UnderLine + ld hl, vTiles0 tile NAMINGSCREEN_UNDERLINE + lb bc, BANK(NamingScreenGFX_UnderLine), 1 + call Get1bpp + + ld de, vTiles2 tile NAMINGSCREEN_BORDER + ld hl, NamingScreenGFX_Border + ld bc, 1 tiles + ld a, BANK(NamingScreenGFX_Border) + call FarCopyBytes + + ld de, vTiles0 tile NAMINGSCREEN_CURSOR + ld hl, NamingScreenGFX_Cursor + ld bc, 2 tiles + ld a, BANK(NamingScreenGFX_Cursor) + call FarCopyBytes + + ld a, $5 + ld hl, wSpriteAnimDict + 9 * 2 + ld [hli], a + ld [hl], NAMINGSCREEN_CURSOR + xor a + ld [hSCY], a + ld [wGlobalAnimYOffset], a + ld [hSCX], a + ld [wGlobalAnimXOffset], a + ld [wJumptableIndex], a + ld [wNamingScreenLetterCase], a + ld [hBGMapMode], a + ld [wNamingScreenCurrNameLength], a + ld a, $7 + ld [hWX], a + ret + +; 11cb7 + +NamingScreenGFX_Border: ; 11cb7 +INCBIN "gfx/naming_screen/border.2bpp" +; 11cc7 + +NamingScreenGFX_Cursor: ; 11cc7 +INCBIN "gfx/naming_screen/cursor.2bpp" +; 11ce7 + +INCLUDE "data/text/name_input_chars.asm" +; 11e5d + +NamingScreenGFX_End: ; unused +INCBIN "gfx/naming_screen/end.1bpp" +; 11e6d + +NamingScreenGFX_MiddleLine: +INCBIN "gfx/naming_screen/middle_line.1bpp" +; 11e6d + +NamingScreenGFX_UnderLine: ; 11e6d +INCBIN "gfx/naming_screen/underline.1bpp" +; 11e75 + +_ComposeMailMessage: ; 11e75 (mail?) + ld hl, wNamingScreenDestinationPointer + ld [hl], e + inc hl + ld [hl], d + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + call .InitBlankMail + call DelayFrame + +.loop + call .DoMailEntry + jr nc, .loop + + pop af + ld [hInMenu], a + pop af + ld [hMapAnims], a + ret + +.InitBlankMail: ; 11e9a (4:5e9a) + call ClearBGPalettes + call DisableLCD + call LoadNamingScreenGFX + ld de, vTiles0 tile $00 + ld hl, .MailIcon + ld bc, 8 tiles + ld a, BANK(.MailIcon) + call FarCopyBytes + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], a + + ; init mail icon + depixel 3, 2 + ld a, SPRITE_ANIM_INDEX_PARTY_MON + call _InitSpriteAnimStruct + + ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID + add hl, bc + ld [hl], $0 + call .InitCharset + ld a, LCDC_DEFAULT + ld [rLCDC], a + call .initwNamingScreenMaxNameLength + ld b, SCGB_DIPLOMA + call GetSGBLayout + call WaitBGMap + call WaitTop + ld a, %11100100 + call DmgToCgbBGPals + ld a, %11100100 + call DmgToCgbObjPal0 + call NamingScreen_InitNameEntry + ld hl, wNamingScreenDestinationPointer + ld e, [hl] + inc hl + ld d, [hl] + ld hl, MAIL_LINE_LENGTH + add hl, de + ld [hl], "" + ret + +; 11ef4 (4:5ef4) + +.MailIcon: ; 11ef4 +INCBIN "gfx/icons/mail_big.2bpp" +; 11f74 + +.initwNamingScreenMaxNameLength ; 11f74 (4:5f74) + ld a, MAIL_MSG_LENGTH + 1 + ld [wNamingScreenMaxNameLength], a + ret + +; 11f7a (4:5f7a) + +.UnusedString11f7a: + db "メールを かいてね@" + +; 11f84 + +.InitCharset: ; 11f84 (4:5f84) + call WaitTop + hlcoord 0, 0 + ld bc, 6 * SCREEN_WIDTH + ld a, NAMINGSCREEN_BORDER + call ByteFill + hlcoord 0, 6 + ld bc, 12 * SCREEN_WIDTH + ld a, " " + call ByteFill + hlcoord 1, 1 + lb bc, 4, SCREEN_WIDTH - 2 + call ClearBox + ld de, MailEntry_Uppercase + +.PlaceMailCharset: ; 11fa9 (4:5fa9) + hlcoord 1, 7 + ld b, 6 +.next + ld c, SCREEN_WIDTH - 1 +.loop_ + ld a, [de] + ld [hli], a + inc de + dec c + jr nz, .loop_ + push de + ld de, SCREEN_WIDTH + 1 + add hl, de + pop de + dec b + jr nz, .next + ret + +.DoMailEntry: ; 11fc0 (4:5fc0) + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .exit_mail + call .DoJumptable + farcall PlaySpriteAnimationsAndDelayFrame + call .Update + call DelayFrame + and a + ret + +.exit_mail + callfar ClearSpriteAnims + call ClearSprites + xor a + ld [hSCX], a + ld [hSCY], a + scf + ret + +.Update: ; 11feb (4:5feb) + xor a + ld [hBGMapMode], a + hlcoord 1, 1 + lb bc, 4, 18 + call ClearBox + ld hl, wNamingScreenDestinationPointer + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 2, 2 + call PlaceString + ld a, $1 + ld [hBGMapMode], a + ret + +.DoJumptable: ; 12008 (4:6008) + 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: ; 12017 (4:6017) + dw .init_blinking_cursor + dw .process_joypad + +.init_blinking_cursor ; 1201b (4:601b) + depixel 9, 2 + ld a, SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR + call _InitSpriteAnimStruct + ld a, c + ld [wNamingScreenCursorObjectPointer], a + ld a, b + ld [wNamingScreenCursorObjectPointer + 1], a + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + ld [hl], a + ld hl, wJumptableIndex + inc [hl] + ret + +.process_joypad ; 1203a (4:603a) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and A_BUTTON + jr nz, .a + ld a, [hl] + and B_BUTTON + jr nz, .b + ld a, [hl] + and START + jr nz, .start + ld a, [hl] + and SELECT + jr nz, .select + ret + +.a + call NamingScreen_PressedA_GetCursorCommand + cp $1 + jr z, .select + cp $2 + jr z, .b + cp $3 + jr z, .finished + call NamingScreen_GetLastCharacter + call MailComposition_TryAddLastCharacter + jr c, .start + ld hl, wNamingScreenCurrNameLength + ld a, [hl] + cp MAIL_LINE_LENGTH + ret nz + inc [hl] + call NamingScreen_GetTextCursorPosition + ld [hl], NAMINGSCREEN_UNDERLINE + dec hl + ld [hl], "" + ret + +.start + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $9 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $5 + ret + +.b + call NamingScreen_DeleteCharacter + ld hl, wNamingScreenCurrNameLength + ld a, [hl] + cp MAIL_LINE_LENGTH + ret nz + dec [hl] + call NamingScreen_GetTextCursorPosition + ld [hl], NAMINGSCREEN_UNDERLINE + inc hl + ld [hl], "" + ret + +.finished + call NamingScreen_StoreEntry + ld hl, wJumptableIndex + set 7, [hl] + ret + +.select + ld hl, wNamingScreenLetterCase + ld a, [hl] + xor 1 + ld [hl], a + jr nz, .switch_to_lowercase + ld de, MailEntry_Uppercase + call .PlaceMailCharset + ret + +.switch_to_lowercase + ld de, MailEntry_Lowercase + call .PlaceMailCharset + ret + +; called from engine/sprite_anims.asm + +ComposeMail_AnimateCursor: ; 120c1 (4:60c1) + call .GetDPad + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + ld e, a + swap e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], e + cp $5 + ld de, .LetterEntries + ld a, 0 + jr nz, .got_pointer + ld de, .CaseDelEnd + ld a, 1 +.got_pointer + ld hl, SPRITEANIMSTRUCT_0E + add hl, bc + add [hl] + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID + add hl, bc + ld [hl], a + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld l, [hl] + ld h, 0 + add hl, de + ld a, [hl] + ld hl, SPRITEANIMSTRUCT_XOFFSET + add hl, bc + ld [hl], a + ret + +; 120f8 (4:60f8) + +.LetterEntries: ; 120f8 + db $00, $10, $20, $30, $40, $50, $60, $70, $80, $90 + +.CaseDelEnd: ; 12102 + db $00, $00, $00, $30, $30, $30, $60, $60, $60, $60 + +; 1210c + +.GetDPad: ; 1210c (4:610c) + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .up + ld a, [hl] + and D_DOWN + jr nz, .down + ld a, [hl] + and D_LEFT + jr nz, .left + ld a, [hl] + and D_RIGHT + jr nz, .right + ret + +.right + call ComposeMail_GetCursorPosition + and a + jr nz, .case_del_done_right + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $9 + jr nc, .wrap_around_letter_right + inc [hl] + ret + +.wrap_around_letter_right + ld [hl], $0 + ret + +.case_del_done_right + cp $3 + jr nz, .wrap_around_command_right + xor a +.wrap_around_command_right + ld e, a + add a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.left + call ComposeMail_GetCursorPosition + and a + jr nz, .caps_del_done_left + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .wrap_around_letter_left + dec [hl] + ret + +.wrap_around_letter_left + ld [hl], $9 + ret + +.caps_del_done_left + cp $1 + jr nz, .wrap_around_command_left + ld a, $4 +.wrap_around_command_left + dec a + dec a + ld e, a + add a + add e + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], a + ret + +.down + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $5 + jr nc, .wrap_around_down + inc [hl] + ret + +.wrap_around_down + ld [hl], $0 + ret + +.up + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and a + jr z, .wrap_around_up + dec [hl] + ret + +.wrap_around_up + ld [hl], $5 + ret + +NamingScreen_PressedA_GetCursorCommand: ; 12185 (4:6185) + ld hl, wNamingScreenCursorObjectPointer + ld c, [hl] + inc hl + ld b, [hl] + +ComposeMail_GetCursorPosition: ; 1218b (4:618b) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $5 + jr nz, .letter + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + cp $3 + jr c, .case + cp $6 + jr c, .del + ld a, $3 + ret + +.case + ld a, $1 + ret + +.del + ld a, $2 + ret + +.letter + xor a + ret + +MailComposition_TryAddLastCharacter: ; 121ac (4:61ac) + ld a, [wNamingScreenLastCharacter] + jp MailComposition_TryAddCharacter + +; 121b2 (4:61b2) + +; unused + ld a, [wNamingScreenCurrNameLength] + and a + ret z + cp $11 + jr nz, .asm_121c3 + push hl + ld hl, wNamingScreenCurrNameLength + dec [hl] + dec [hl] + jr .asm_121c8 + +.asm_121c3 + push hl + ld hl, wNamingScreenCurrNameLength + dec [hl] + +.asm_121c8 + call NamingScreen_GetTextCursorPosition + ld c, [hl] + pop hl +.asm_121cd + ld a, [hli] + cp $ff + jp z, NamingScreen_AdvanceCursor_CheckEndOfString + cp c + jr z, .asm_121d9 + inc hl + jr .asm_121cd + +.asm_121d9 + ld a, [hl] + jp NamingScreen_LoadNextCharacter + +; 121dd + +INCLUDE "data/text/mail_input_chars.asm" + +; 122c1 diff --git a/engine/menus/options_menu.asm b/engine/menus/options_menu.asm new file mode 100755 index 000000000..c0a255cb0 --- /dev/null +++ b/engine/menus/options_menu.asm @@ -0,0 +1,583 @@ +_OptionsMenu: ; e41d0 + ld hl, hInMenu + ld a, [hl] + push af + ld [hl], $1 + call ClearBGPalettes + hlcoord 0, 0 + ld b, 16 + ld c, 18 + call TextBox + hlcoord 2, 2 + ld de, StringOptions + call PlaceString + xor a + ld [wJumptableIndex], a + ld c, $6 ; number of items on the menu minus 1 (for cancel) + +.print_text_loop ; this next will display the settings of each option when the menu is opened + push bc + xor a + ld [hJoyLast], a + call GetOptionPointer + pop bc + ld hl, wJumptableIndex + inc [hl] + dec c + jr nz, .print_text_loop + + call UpdateFrame + xor a + ld [wJumptableIndex], a + inc a + ld [hBGMapMode], a + call WaitBGMap + ld b, SCGB_DIPLOMA + call GetSGBLayout + call SetPalettes + +.joypad_loop + call JoyTextDelay + ld a, [hJoyPressed] + and START | B_BUTTON + jr nz, .ExitOptions + call OptionsControl + jr c, .dpad + call GetOptionPointer + jr c, .ExitOptions + +.dpad + call Options_UpdateCursorPosition + ld c, 3 + call DelayFrames + jr .joypad_loop + +.ExitOptions: + ld de, SFX_TRANSACTION + call PlaySFX + call WaitSFX + pop af + ld [hInMenu], a + ret +; e4241 + +StringOptions: ; e4241 + db "TEXT SPEED" + db " :" + db "BATTLE SCENE" + db " :" + db "BATTLE STYLE" + db " :" + db "SOUND" + db " :" + db "PRINT" + db " :" + db "MENU ACCOUNT" + db " :" + db "FRAME" + db " :TYPE" + db "CANCEL@" +; e42d6 + + +GetOptionPointer: ; e42d6 + ld a, [wJumptableIndex] ; load the cursor position to a + ld e, a ; copy it to de + ld d, 0 + ld hl, .Pointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl ; jump to the code of the current highlighted item +; e42e5 + +.Pointers: + dw Options_TextSpeed + dw Options_BattleScene + dw Options_BattleStyle + dw Options_Sound + dw Options_Print + dw Options_MenuAccount + dw Options_Frame + dw Options_Cancel +; e42f5 + + + const_def + const OPT_TEXT_SPEED_FAST ; 0 + const OPT_TEXT_SPEED_MED ; 1 + const OPT_TEXT_SPEED_SLOW ; 2 + +Options_TextSpeed: ; e42f5 + call GetTextSpeed + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + ld a, c ; right pressed + cp OPT_TEXT_SPEED_SLOW + jr c, .Increase + ld c, OPT_TEXT_SPEED_FAST + -1 + +.Increase: + inc c + ld a, e + jr .Save + +.LeftPressed: + ld a, c + and a + jr nz, .Decrease + ld c, OPT_TEXT_SPEED_SLOW + 1 + +.Decrease: + dec c + ld a, d + +.Save: + ld b, a + ld a, [wOptions] + and $f0 + or b + ld [wOptions], a + +.NonePressed: + ld b, 0 + ld hl, .Strings + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 11, 3 + call PlaceString + and a + ret +; e4331 + +.Strings: +; entries correspond to OPT_TEXT_SPEED_* constants + dw .Fast + dw .Mid + dw .Slow + +.Fast: db "FAST@" +.Mid: db "MID @" +.Slow: db "SLOW@" +; e4346 + + +GetTextSpeed: ; e4346 +; converts TEXT_DELAY_* value in a to OPT_TEXT_SPEED_* value in c, +; with previous/next TEXT_DELAY_* values in d/e + ld a, [wOptions] + and $7 + cp TEXT_DELAY_SLOW + jr z, .slow + cp TEXT_DELAY_FAST + jr z, .fast + ; none of the above + ld c, OPT_TEXT_SPEED_MED + lb de, TEXT_DELAY_FAST, TEXT_DELAY_SLOW + ret + +.slow + ld c, OPT_TEXT_SPEED_SLOW + lb de, TEXT_DELAY_MED, TEXT_DELAY_FAST + ret + +.fast + ld c, OPT_TEXT_SPEED_FAST + lb de, TEXT_DELAY_SLOW, TEXT_DELAY_MED + ret +; e4365 + + +Options_BattleScene: ; e4365 + ld hl, wOptions + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + bit BATTLE_SCENE, [hl] + jr nz, .ToggleOn + jr .ToggleOff + +.LeftPressed: + bit BATTLE_SCENE, [hl] + jr z, .ToggleOff + jr .ToggleOn + +.NonePressed: + bit BATTLE_SCENE, [hl] + jr z, .ToggleOn + jr .ToggleOff + +.ToggleOn: + res BATTLE_SCENE, [hl] + ld de, .On + jr .Display + +.ToggleOff: + set BATTLE_SCENE, [hl] + ld de, .Off + +.Display: + hlcoord 11, 5 + call PlaceString + and a + ret +; e4398 + +.On: db "ON @" +.Off: db "OFF@" +; e43a0 + + +Options_BattleStyle: ; e43a0 + ld hl, wOptions + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + bit BATTLE_SHIFT, [hl] + jr nz, .ToggleShift + jr .ToggleSet + +.LeftPressed: + bit BATTLE_SHIFT, [hl] + jr z, .ToggleSet + jr .ToggleShift + +.NonePressed: + bit BATTLE_SHIFT, [hl] + jr nz, .ToggleSet + +.ToggleShift: + res BATTLE_SHIFT, [hl] + ld de, .Shift + jr .Display + +.ToggleSet: + set BATTLE_SHIFT, [hl] + ld de, .Set + +.Display: + hlcoord 11, 7 + call PlaceString + and a + ret +; e43d1 + +.Shift: db "SHIFT@" +.Set: db "SET @" +; e43dd + + +Options_Sound: ; e43dd + ld hl, wOptions + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + bit STEREO, [hl] + jr nz, .SetMono + jr .SetStereo + +.LeftPressed: + bit STEREO, [hl] + jr z, .SetStereo + jr .SetMono + +.NonePressed: + bit STEREO, [hl] + jr nz, .ToggleStereo + jr .ToggleMono + +.SetMono: + res STEREO, [hl] + call RestartMapMusic + +.ToggleMono: + ld de, .Mono + jr .Display + +.SetStereo: + set STEREO, [hl] + call RestartMapMusic + +.ToggleStereo: + ld de, .Stereo + +.Display: + hlcoord 11, 9 + call PlaceString + and a + ret +; e4416 + +.Mono: db "MONO @" +.Stereo: db "STEREO@" +; e4424 + + + const_def + const OPT_PRINT_LIGHTEST ; 0 + const OPT_PRINT_LIGHTER ; 1 + const OPT_PRINT_NORMAL ; 2 + const OPT_PRINT_DARKER ; 3 + const OPT_PRINT_DARKEST ; 4 + +Options_Print: ; e4424 + call GetPrinterSetting + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + ld a, c + cp OPT_PRINT_DARKEST + jr c, .Increase + ld c, OPT_PRINT_LIGHTEST - 1 + +.Increase: + inc c + ld a, e + jr .Save + +.LeftPressed: + ld a, c + and a + jr nz, .Decrease + ld c, OPT_PRINT_DARKEST + 1 + +.Decrease: + dec c + ld a, d + +.Save: + ld b, a + ld [wGBPrinter], a + +.NonePressed: + ld b, $0 + ld hl, .Strings + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 11, 11 + call PlaceString + and a + ret +; e445a + +.Strings: +; entries correspond to OPT_PRINT_* constants + dw .Lightest + dw .Lighter + dw .Normal + dw .Darker + dw .Darkest + +.Lightest: db "LIGHTEST@" +.Lighter: db "LIGHTER @" +.Normal: db "NORMAL @" +.Darker: db "DARKER @" +.Darkest: db "DARKEST @" +; e4491 + + +GetPrinterSetting: ; e4491 +; converts GBPRINTER_* value in a to OPT_PRINT_* value in c, +; with previous/next GBPRINTER_* values in d/e + ld a, [wGBPrinter] + and a + jr z, .IsLightest + cp GBPRINTER_LIGHTER + jr z, .IsLight + cp GBPRINTER_DARKER + jr z, .IsDark + cp GBPRINTER_DARKEST + jr z, .IsDarkest + ; none of the above + ld c, OPT_PRINT_NORMAL + lb de, GBPRINTER_LIGHTER, GBPRINTER_DARKER + ret + +.IsLightest: + ld c, OPT_PRINT_LIGHTEST + lb de, GBPRINTER_DARKEST, GBPRINTER_LIGHTER + ret + +.IsLight: + ld c, OPT_PRINT_LIGHTER + lb de, GBPRINTER_LIGHTEST, GBPRINTER_NORMAL + ret + +.IsDark: + ld c, OPT_PRINT_DARKER + lb de, GBPRINTER_NORMAL, GBPRINTER_DARKEST + ret + +.IsDarkest: + ld c, OPT_PRINT_DARKEST + lb de, GBPRINTER_DARKER, GBPRINTER_LIGHTEST + ret +; e44c1 + +Options_MenuAccount: ; e44c1 + ld hl, wOptions2 + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr z, .NonePressed + bit MENU_ACCOUNT, [hl] + jr nz, .ToggleOff + jr .ToggleOn + +.LeftPressed: + bit MENU_ACCOUNT, [hl] + jr z, .ToggleOn + jr .ToggleOff + +.NonePressed: + bit MENU_ACCOUNT, [hl] + jr nz, .ToggleOn + +.ToggleOff: + res MENU_ACCOUNT, [hl] + ld de, .Off + jr .Display + +.ToggleOn: + set MENU_ACCOUNT, [hl] + ld de, .On + +.Display: + hlcoord 11, 13 + call PlaceString + and a + ret +; e44f2 + +.Off: db "OFF@" +.On: db "ON @" +; e44fa + + +Options_Frame: ; e44fa + ld hl, wTextBoxFrame + ld a, [hJoyPressed] + bit D_LEFT_F, a + jr nz, .LeftPressed + bit D_RIGHT_F, a + jr nz, .RightPressed + and a + ret + +.RightPressed: + ld a, [hl] + inc a + jr .Save + +.LeftPressed: + ld a, [hl] + dec a + +.Save: + and $7 + ld [hl], a +UpdateFrame: ; e4512 + ld a, [wTextBoxFrame] + hlcoord 16, 15 ; where on the screen the number is drawn + add "1" + ld [hl], a + call LoadFontsExtra + and a + ret +; e4520 + +Options_Cancel: ; e4520 + ld a, [hJoyPressed] + and A_BUTTON + jr nz, .Exit + and a + ret + +.Exit: + scf + ret +; e452a + +OptionsControl: ; e452a + ld hl, wJumptableIndex + ld a, [hJoyLast] + cp D_DOWN + jr z, .DownPressed + cp D_UP + jr z, .UpPressed + and a + ret + +.DownPressed: + ld a, [hl] ; load the cursor position to a + cp $7 ; maximum number of items in option menu + jr nz, .CheckFive + ld [hl], $0 + scf + ret + +.CheckFive: ; I have no idea why this exists... + cp $5 + jr nz, .Increase + ld [hl], $5 + +.Increase: + inc [hl] + scf + ret + +.UpPressed: + ld a, [hl] + cp $6 + jr nz, .NotSix + ld [hl], $5 ; Another thing where I'm not sure why it exists + scf + ret + +.NotSix: + and a + jr nz, .Decrease + ld [hl], $8 ; number of option items +1 + +.Decrease: + dec [hl] + scf + ret +; e455c + +Options_UpdateCursorPosition: ; e455c + hlcoord 1, 1 + ld de, SCREEN_WIDTH + ld c, $10 +.loop + ld [hl], " " + add hl, de + dec c + jr nz, .loop + hlcoord 1, 2 + ld bc, 2 * SCREEN_WIDTH + ld a, [wJumptableIndex] + call AddNTimes + ld [hl], "▶" + ret +; e4579 diff --git a/engine/menus/scrolling_menu.asm b/engine/menus/scrolling_menu.asm new file mode 100755 index 000000000..3be3d839c --- /dev/null +++ b/engine/menus/scrolling_menu.asm @@ -0,0 +1,543 @@ +_InitScrollingMenu:: ; 245af + xor a + ld [wMenuJoypad], a + ld [hBGMapMode], a + inc a + ld [hInMenu], a + call InitScrollingMenuCursor + call ScrollingMenu_InitFlags + call ScrollingMenu_ValidateSwitchItem + call ScrollingMenu_InitDisplay + call ApplyTilemap + xor a + ld [hBGMapMode], a + ret +; 245cb + +_ScrollingMenu:: ; 245cb +.loop + call ScrollingMenuJoyAction + jp c, .exit + call z, .zero + jr .loop +; 245d6 + +.exit ; 245d6 + call MenuClickSound + ld [wMenuJoypad], a + ld a, 0 + ld [hInMenu], a + ret +; 245e1 + +.zero ; 245e1 + call ScrollingMenu_InitDisplay + ld a, 1 + ld [hBGMapMode], a + ld c, 3 + call DelayFrames + xor a + ld [hBGMapMode], a + ret +; 245f1 + +ScrollingMenu_InitDisplay: ; 245f1 + xor a + ld [hBGMapMode], a + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call ScrollingMenu_UpdateDisplay + call ScrollingMenu_PlaceCursor + call ScrollingMenu_CheckCallFunction3 + pop af + ld [wOptions], a + ret +; 24609 + +ScrollingMenuJoyAction: ; 24609 +.loop + call ScrollingMenuJoypad + ld a, [hJoyLast] + and D_PAD + ld b, a + ld a, [hJoyPressed] + and BUTTONS + or b + bit A_BUTTON_F, a + jp nz, .a_button + bit B_BUTTON_F, a + jp nz, .b_button + bit SELECT_F, a + jp nz, .select + bit START_F, a + jp nz, .start + bit D_RIGHT_F, a + jp nz, .d_right + bit D_LEFT_F, a + jp nz, .d_left + bit D_UP_F, a + jp nz, .d_up + bit D_DOWN_F, a + jp nz, .d_down + jr .loop +; 24640 + +.unreferenced ; unused + ld a, -1 + and a + ret +; 24644 + +.a_button ; 24644 + call PlaceHollowCursor + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [wMenuSelection] + ld [wCurItem], a + ld a, [wMenuSelectionQuantity] + ld [wItemQuantityBuffer], a + call ScrollingMenu_GetCursorPosition + dec a + ld [wScrollingMenuCursorPosition], a + ld [wCurItemQuantity], a + ld a, [wMenuSelection] + cp -1 + jr z, .b_button + ld a, A_BUTTON + scf + ret +; 2466f + +.b_button ; 2466f + ld a, B_BUTTON + scf + ret +; 24673 + +.select ; 24673 + ld a, [wMenuDataFlags] + bit 7, a + jp z, xor_a_dec_a + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [wMenuSelection] + cp -1 + jp z, xor_a_dec_a + call ScrollingMenu_GetCursorPosition + dec a + ld [wScrollingMenuCursorPosition], a + ld a, SELECT + scf + ret +; 24695 + +.start ; 24695 + ld a, [wMenuDataFlags] + bit 6, a + jp z, xor_a_dec_a + ld a, START + scf + ret +; 246a1 + +.d_left ; 246a1 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a_dec_a + ld a, [wMenuDataFlags] + bit 3, a + jp z, xor_a_dec_a + ld a, D_LEFT + scf + ret +; 246b5 + +.d_right ; 246b5 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a_dec_a + ld a, [wMenuDataFlags] + bit 2, a + jp z, xor_a_dec_a + ld a, D_RIGHT + scf + ret +; 246c9 + +.d_up ; 246c9 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a + ld hl, wMenuScrollPosition + ld a, [hl] + and a + jr z, .xor_dec_up + dec [hl] + jp xor_a + +.xor_dec_up + jp xor_a_dec_a +; 246df + +.d_down ; 246df + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a + ld hl, wMenuScrollPosition + ld a, [wMenuData_ScrollingMenuHeight] + add [hl] + ld b, a + ld a, [wScrollingMenuListSize] + cp b + jr c, .xor_dec_down + inc [hl] + jp xor_a + +.xor_dec_down + jp xor_a_dec_a +; 246fc + +ScrollingMenu_GetCursorPosition: ; 246fc + ld a, [wMenuScrollPosition] + ld c, a + ld a, [wMenuCursorY] + add c + ld c, a + ret +; 24706 + +ScrollingMenu_ClearLeftColumn: ; 24706 (9:4706) + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + add hl, de + ld de, 2 * SCREEN_WIDTH + ld a, [wMenuData_ScrollingMenuHeight] +.loop + ld [hl], " " + add hl, de + dec a + jr nz, .loop + ret + +InitScrollingMenuCursor: ; 2471a + ld hl, wMenuData_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wMenuData_ItemsPointerBank] + call GetFarByte + ld [wScrollingMenuListSize], a + ld a, [wMenuData_ScrollingMenuHeight] + ld c, a + ld a, [wMenuScrollPosition] + add c + ld c, a + ld a, [wScrollingMenuListSize] + inc a + cp c + jr nc, .skip + ld a, [wMenuData_ScrollingMenuHeight] + ld c, a + ld a, [wScrollingMenuListSize] + inc a + sub c + jr nc, .store + xor a + +.store + ld [wMenuScrollPosition], a + +.skip + ld a, [wMenuScrollPosition] + ld c, a + ld a, [wMenuCursorBuffer] + add c + ld b, a + ld a, [wScrollingMenuListSize] + inc a + cp b + jr c, .asm_2475a + jr nc, .asm_24763 + +.asm_2475a + xor a + ld [wMenuScrollPosition], a + ld a, $1 + ld [wMenuCursorBuffer], a + +.asm_24763 + ret +; 24764 + +ScrollingMenu_InitFlags: ; 24764 + ld a, [wMenuDataFlags] + ld c, a + ld a, [wScrollingMenuListSize] + ld b, a + ld a, [wMenuBorderTopCoord] + add 1 + ld [w2DMenuCursorInitY], a + ld a, [wMenuBorderLeftCoord] + add 0 + ld [w2DMenuCursorInitX], a + ld a, [wMenuData_ScrollingMenuHeight] + cp b + jr c, .no_extra_row + jr z, .no_extra_row + ld a, b + inc a +.no_extra_row + ld [w2DMenuNumRows], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, $8c + bit 2, c + jr z, .skip_set_0 + set 0, a + +.skip_set_0 + bit 3, c + jr z, .skip_set_1 + set 1, a + +.skip_set_1 + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuCursorOffsets], a + ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN + bit 7, c + jr z, .disallow_select + add SELECT + +.disallow_select + bit 6, c + jr z, .disallow_start + add START + +.disallow_start + ld [wMenuJoypadFilter], a + ld a, [w2DMenuNumRows] + ld b, a + ld a, [wMenuCursorBuffer] + and a + jr z, .reset_cursor + cp b + jr z, .cursor_okay + jr c, .cursor_okay + +.reset_cursor + ld a, 1 + +.cursor_okay + ld [wMenuCursorY], a + ld a, 1 + ld [wMenuCursorX], a + xor a + ld [wCursorCurrentTile], a + ld [wCursorCurrentTile + 1], a + ld [wCursorOffCharacter], a + ret +; 247dd + +ScrollingMenu_ValidateSwitchItem: ; 247dd + ld a, [wScrollingMenuListSize] + ld c, a + ld a, [wSwitchItem] + and a + jr z, .done + dec a + cp c + jr c, .done + xor a + ld [wSwitchItem], a + +.done + ret +; 247f0 + +ScrollingMenu_UpdateDisplay: ; 247f0 + call ClearWholeMenuBox + ld a, [wMenuDataFlags] + bit 4, a ; place arrows + jr z, .okay + ld a, [wMenuScrollPosition] + and a + jr z, .okay + ld a, [wMenuBorderTopCoord] + ld b, a + ld a, [wMenuBorderRightCoord] + ld c, a + call Coord2Tile + ld [hl], "▲" + +.okay + call MenuBoxCoord2Tile + ld bc, SCREEN_WIDTH + 1 + add hl, bc + ld a, [wMenuData_ScrollingMenuHeight] + ld b, a + ld c, $0 +.loop + ld a, [wMenuScrollPosition] + add c + ld [wScrollingMenuCursorPosition], a + ld a, c + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [wMenuSelection] + cp -1 + jr z, .cancel + push bc + push hl + call ScrollingMenu_CallFunctions1and2 + pop hl + ld bc, 2 * SCREEN_WIDTH + add hl, bc + pop bc + inc c + ld a, c + cp b + jr nz, .loop + ld a, [wMenuDataFlags] + bit 4, a ; place arrows + jr z, .done + ld a, [wMenuBorderBottomCoord] + ld b, a + ld a, [wMenuBorderRightCoord] + ld c, a + call Coord2Tile + ld [hl], "▼" + +.done + ret + +.cancel + ld a, [wMenuDataFlags] + bit 0, a ; call function on cancel + jr nz, .call_function + ld de, .string_2485f + call PlaceString + ret + +.string_2485f + db "CANCEL@" + +.call_function + ld d, h + ld e, l + ld hl, wMenuData_ScrollingMenuFunction1 + jp CallPointerAt +; 2486e + +ScrollingMenu_CallFunctions1and2: ; 2486e + push hl + ld d, h + ld e, l + ld hl, wMenuData_ScrollingMenuFunction1 + call CallPointerAt + pop hl + ld a, [wMenuData_ScrollingMenuWidth] + and a + jr z, .done + ld e, a + ld d, $0 + add hl, de + ld d, h + ld e, l + ld hl, wMenuData_ScrollingMenuFunction2 + call CallPointerAt + +.done + ret +; 2488b + +ScrollingMenu_PlaceCursor: ; 2488b + ld a, [wSwitchItem] + and a + jr z, .done + ld b, a + ld a, [wMenuScrollPosition] + cp b + jr nc, .done + ld c, a + ld a, [wMenuData_ScrollingMenuHeight] + add c + cp b + jr c, .done + ld a, b + sub c + dec a + add a + add $1 + ld c, a + ld a, [wMenuBorderTopCoord] + add c + ld b, a + ld a, [wMenuBorderLeftCoord] + add $0 + ld c, a + call Coord2Tile + ld [hl], "▷" + +.done + ret +; 248b8 + +ScrollingMenu_CheckCallFunction3: ; 248b8 + ld a, [wMenuDataFlags] + bit 5, a ; call function 3 + ret z + bit 1, a ; call function 3 if not switching items + jr z, .call + ld a, [wSwitchItem] + and a + ret nz + +.call + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld hl, wMenuData_ScrollingMenuFunction3 + call CallPointerAt + ret +; 248d5 + +ScrollingMenu_GetListItemCoordAndFunctionArgs: ; 248d5 + push de + push hl + ld e, a + ld a, [wMenuScrollPosition] + add e + ld e, a + ld d, $0 + ld hl, wMenuData_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + inc hl ; items + ld a, [wMenuData_ScrollingMenuSpacing] + cp 1 + jr z, .got_spacing + cp 2 + jr z, .pointless_jump +.pointless_jump + add hl, de +.got_spacing + add hl, de + ld a, [wMenuData_ItemsPointerBank] + call GetFarByte + ld [wMenuSelection], a + ld [wCurItem], a + inc hl + ld a, [wMenuData_ItemsPointerBank] + call GetFarByte + ld [wMenuSelectionQuantity], a + pop hl + pop de + ret +; 2490c diff --git a/engine/menus/start_menu.asm b/engine/menus/start_menu.asm new file mode 100755 index 000000000..037efd947 --- /dev/null +++ b/engine/menus/start_menu.asm @@ -0,0 +1,1993 @@ +; StartMenu.Items indexes + const_def + const STARTMENUITEM_POKEDEX ; 0 + const STARTMENUITEM_POKEMON ; 1 + const STARTMENUITEM_PACK ; 2 + const STARTMENUITEM_STATUS ; 3 + const STARTMENUITEM_SAVE ; 4 + const STARTMENUITEM_OPTION ; 5 + const STARTMENUITEM_EXIT ; 6 + const STARTMENUITEM_POKEGEAR ; 7 + const STARTMENUITEM_QUIT ; 8 + + +StartMenu:: ; 125cd + + call ClearWindowData + + ld de, SFX_MENU + call PlaySFX + + farcall ReanchorBGMap_NoOAMUpdate + + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + ld hl, .MenuHeader + jr z, .GotMenuData + ld hl, .ContestMenuHeader +.GotMenuData: + + call LoadMenuHeader + call .SetUpMenuItems + ld a, [wBattleMenuCursorBuffer] + ld [wMenuCursorBuffer], a + call .DrawMenuAccount_ + call DrawVariableLengthMenuBox + call .DrawBugContestStatusBox + call SafeUpdateSprites + call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap + farcall LoadFonts_NoOAMUpdate + call .DrawBugContestStatus + call UpdateTimePals + jr .Select + +.Reopen: + call UpdateSprites + call UpdateTimePals + call .SetUpMenuItems + ld a, [wBattleMenuCursorBuffer] + ld [wMenuCursorBuffer], a + +.Select: + call .GetInput + jr c, .Exit + call .DrawMenuAccount + ld a, [wMenuCursorBuffer] + ld [wBattleMenuCursorBuffer], a + call PlayClickSFX + call PlaceHollowCursor + call .OpenMenu + +; Menu items have different return functions. +; For example, saving exits the menu. + ld hl, .MenuReturns + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.MenuReturns: + dw .Reopen + dw .Exit + dw .ExitMenuCallFuncCloseText + dw .ExitMenuRunScriptCloseText + dw .ExitMenuRunScript + dw .ReturnEnd + dw .ReturnRedraw + +.Exit: + ld a, [hOAMUpdate] + push af + ld a, 1 + ld [hOAMUpdate], a + call LoadFontsExtra + pop af + ld [hOAMUpdate], a +.ReturnEnd: + call ExitMenu +.ReturnEnd2: + call CloseText + call UpdateTimePals + ret + +.GetInput: +; Return carry on exit, and no-carry on selection. + xor a + ld [hBGMapMode], a + call .DrawMenuAccount + call SetUpMenu + ld a, $ff + ld [wMenuSelection], a +.loop + call .PrintMenuAccount + call GetScrollingMenuJoypad + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .b + cp A_BUTTON + jr z, .a + jr .loop +.a + call PlayClickSFX + and a + ret +.b + scf + ret +; 12691 + +.ExitMenuRunScript: ; 12691 + call ExitMenu + ld a, HMENURETURN_SCRIPT + ld [hMenuReturn], a + ret +; 12699 + +.ExitMenuRunScriptCloseText: ; 12699 + call ExitMenu + ld a, HMENURETURN_SCRIPT + ld [hMenuReturn], a + jr .ReturnEnd2 +; 126a2 + +.ExitMenuCallFuncCloseText: ; 126a2 + call ExitMenu + ld hl, wQueuedScriptAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wQueuedScriptBank] + rst FarCall + jr .ReturnEnd2 +; 126b1 + +.ReturnRedraw: ; 126b1 + call .Clear + jp .Reopen +; 126b7 + +.Clear: ; 126b7 + call ClearBGPalettes + call Call_ExitMenu + call ReloadTilesetAndPalettes + call .DrawMenuAccount_ + call DrawVariableLengthMenuBox + call .DrawBugContestStatus + call UpdateSprites + call ret_d90 + call FinishExitMenu + ret +; 126d3 + + +.MenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 10, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default selection + +.ContestMenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 10, 2, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default selection + +.MenuData: + db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_ENABLE_START ; flags + dn 0, 0 ; rows, columns + dw wMenuItemsList + dw .MenuString + dw .Items + +.Items: +; entries correspond to STARTMENUITEM_* constants + dw StartMenu_Pokedex, .PokedexString, .PokedexDesc + dw StartMenu_Pokemon, .PartyString, .PartyDesc + dw StartMenu_Pack, .PackString, .PackDesc + dw StartMenu_Status, .StatusString, .StatusDesc + dw StartMenu_Save, .SaveString, .SaveDesc + dw StartMenu_Option, .OptionString, .OptionDesc + dw StartMenu_Exit, .ExitString, .ExitDesc + dw StartMenu_Pokegear, .PokegearString, .PokegearDesc + dw StartMenu_Quit, .QuitString, .QuitDesc + +.PokedexString: db "#DEX@" +.PartyString: db "#MON@" +.PackString: db "PACK@" +.StatusString: db "@" +.SaveString: db "SAVE@" +.OptionString: db "OPTION@" +.ExitString: db "EXIT@" +.PokegearString: db "GEAR@" +.QuitString: db "QUIT@" + +.PokedexDesc: + db "#MON" + next "database@" + +.PartyDesc: + db "Party " + next "status@" + +.PackDesc: + db "Contains" + next "items@" + +.PokegearDesc: + db "Trainer's" + next "key device@" + +.StatusDesc: + db "Your own" + next "status@" + +.SaveDesc: + db "Save your" + next "progress@" + +.OptionDesc: + db "Change" + next "settings@" + +.ExitDesc: + db "Close this" + next "menu@" + +.QuitDesc: + db "Quit and" + next "be judged.@" + + +.OpenMenu: ; 127e5 + ld a, [wMenuSelection] + call .GetMenuAccountTextPointer + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 127ef + +.MenuString: ; 127ef + push de + ld a, [wMenuSelection] + call .GetMenuAccountTextPointer + inc hl + inc hl + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + call PlaceString + ret +; 12800 + +.MenuDesc: ; 12800 + push de + ld a, [wMenuSelection] + cp $ff + jr z, .none + call .GetMenuAccountTextPointer +rept 4 + inc hl +endr + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + call PlaceString + ret +.none + pop de + ret +; 12819 + + +.GetMenuAccountTextPointer: ; 12819 + ld e, a + ld d, 0 + ld hl, wMenuDataPointerTableAddr + ld a, [hli] + ld h, [hl] + ld l, a +rept 6 + add hl, de +endr + ret +; 12829 + + +.SetUpMenuItems: ; 12829 + xor a + ld [wWhichIndexSet], a + call .FillMenuList + + ld hl, wStatusFlags + bit STATUSFLAGS_POKEDEX_F, [hl] + jr z, .no_pokedex + ld a, STARTMENUITEM_POKEDEX + call .AppendMenuList +.no_pokedex + + ld a, [wPartyCount] + and a + jr z, .no_pokemon + ld a, STARTMENUITEM_POKEMON + call .AppendMenuList +.no_pokemon + + ld a, [wLinkMode] + and a + jr nz, .no_pack + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + jr nz, .no_pack + ld a, STARTMENUITEM_PACK + call .AppendMenuList +.no_pack + + ld hl, wPokegearFlags + bit POKEGEAR_OBTAINED_F, [hl] + jr z, .no_pokegear + ld a, STARTMENUITEM_POKEGEAR + call .AppendMenuList +.no_pokegear + + ld a, STARTMENUITEM_STATUS + call .AppendMenuList + + ld a, [wLinkMode] + and a + jr nz, .no_save + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + ld a, STARTMENUITEM_QUIT + jr nz, .write + ld a, STARTMENUITEM_SAVE +.write + call .AppendMenuList +.no_save + + ld a, STARTMENUITEM_OPTION + call .AppendMenuList + ld a, STARTMENUITEM_EXIT + call .AppendMenuList + ld a, c + ld [wMenuItemsList], a + ret +; 1288d + + +.FillMenuList: ; 1288d + xor a + ld hl, wMenuItemsList + ld [hli], a + ld a, -1 + ld bc, wMenuItemsListEnd - (wMenuItemsList + 1) + call ByteFill + ld de, wMenuItemsList + 1 + ld c, 0 + ret +; 128a0 + +.AppendMenuList: ; 128a0 + ld [de], a + inc de + inc c + ret +; 128a4 + +.DrawMenuAccount_: ; 128a4 + jp .DrawMenuAccount +; 128a7 + +.PrintMenuAccount: ; 128a7 + call .IsMenuAccountOn + ret z + call .DrawMenuAccount + decoord 0, 14 + jp .MenuDesc +; 128b4 + +.DrawMenuAccount: ; 128b4 + call .IsMenuAccountOn + ret z + hlcoord 0, 13 + lb bc, 5, 10 + call ClearBox + hlcoord 0, 13 + ld b, 3 + ld c, 8 + jp TextBoxPalette +; 128cb + +.IsMenuAccountOn: ; 128cb + ld a, [wOptions2] + and 1 << MENU_ACCOUNT + ret +; 128d1 + +.DrawBugContestStatusBox: ; 128d1 + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + ret z + farcall StartMenu_DrawBugContestStatusBox + ret +; 128de + +.DrawBugContestStatus: ; 128de + ld hl, wStatusFlags2 + bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] + jr nz, .contest + ret +.contest + farcall StartMenu_PrintBugContestStatus + ret +; 128ed + + +StartMenu_Exit: ; 128ed +; Exit the menu. + + ld a, 1 + ret +; 128f0 + + +StartMenu_Quit: ; 128f0 +; Retire from the bug catching contest. + + ld hl, .EndTheContestText + call StartMenuYesNo + jr c, .DontEndContest + ld a, BANK(BugCatchingContestReturnToGateScript) + ld hl, BugCatchingContestReturnToGateScript + call FarQueueScript + ld a, 4 + ret + +.DontEndContest: + ld a, 0 + ret + +.EndTheContestText: + text_jump UnknownText_0x1c1a6c + db "@" +; 1290b + + +StartMenu_Save: ; 1290b +; Save the game. + + call BufferScreen + farcall SaveMenu + jr nc, .asm_12919 + ld a, 0 + ret +.asm_12919 + ld a, 1 + ret +; 1291c + + +StartMenu_Option: ; 1291c +; Game options. + + call FadeToMenu + farcall OptionsMenu + ld a, 6 + ret +; 12928 + + +StartMenu_Status: ; 12928 +; Player status. + + call FadeToMenu + farcall TrainerCard + call CloseSubmenu + ld a, 0 + ret +; 12937 + + +StartMenu_Pokedex: ; 12937 + + ld a, [wPartyCount] + and a + jr z, .asm_12949 + + call FadeToMenu + farcall Pokedex + call CloseSubmenu + +.asm_12949 + ld a, 0 + ret +; 1294c + + +StartMenu_Pokegear: ; 1294c + + call FadeToMenu + farcall PokeGear + call CloseSubmenu + ld a, 0 + ret +; 1295b + + +StartMenu_Pack: ; 1295b + + call FadeToMenu + farcall Pack + ld a, [wPackUsedItem] + and a + jr nz, .used_item + call CloseSubmenu + ld a, 0 + ret + +.used_item + call ExitAllMenus + ld a, 4 + ret +; 12976 + + +StartMenu_Pokemon: ; 12976 + + ld a, [wPartyCount] + and a + jr z, .return + + call FadeToMenu + +.choosemenu + xor a + ld [wPartyMenuActionText], a ; Choose a POKéMON. + call ClearBGPalettes + +.menu + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + +.menunoreload + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes ; load regular palettes? + call DelayFrame + farcall PartyMenuSelect + jr c, .return ; if cancelled or pressed B + + call PokemonActionSubmenu + cp 3 + jr z, .menu + cp 0 + jr z, .choosemenu + cp 1 + jr z, .menunoreload + cp 2 + jr z, .quit + +.return + call CloseSubmenu + ld a, 0 + ret + +.quit + ld a, b + push af + call ExitAllMenus + pop af + ret +; 129d5 + +HasNoItems: ; 129d5 + ld a, [wNumItems] + and a + ret nz + ld a, [wNumKeyItems] + and a + ret nz + ld a, [wNumBalls] + and a + ret nz + ld hl, wTMsHMs + ld b, NUM_TMS + NUM_HMS +.loop + ld a, [hli] + and a + jr nz, .done + dec b + jr nz, .loop + scf + ret +.done + and a + ret + +TossItemFromPC: ; 129f4 + push de + call PartyMonItemName + farcall _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .key_item + ld hl, .TossHowMany + call MenuTextBox + farcall SelectQuantityToToss + push af + call CloseWindow + call ExitMenu + pop af + jr c, .quit + ld hl, .ConfirmToss + call MenuTextBox + call YesNoBox + push af + call ExitMenu + pop af + jr c, .quit + pop hl + ld a, [wCurItemQuantity] + call TossItem + call PartyMonItemName + ld hl, .TossedThisMany + call MenuTextBox + call ExitMenu + and a + ret + +.key_item + call .CantToss +.quit + pop hl + scf + ret + +.TossHowMany: + ; Toss out how many @ (S)? + text_jump UnknownText_0x1c1a90 + db "@" + +.ConfirmToss: + ; Throw away @ @ (S)? + text_jump UnknownText_0x1c1aad + db "@" + +.TossedThisMany: + ; Discarded @ (S). + text_jump UnknownText_0x1c1aca + db "@" + +.CantToss: + ld hl, .TooImportantToToss + call MenuTextBoxBackup + ret + +.TooImportantToToss: + ; That's too impor- tant to toss out! + text_jump UnknownText_0x1c1adf + db "@" +; 0x12a60 + +CantUseItem: ; 12a60 + ld hl, CantUseItemText + call MenuTextBoxWaitButton + ret +; 12a67 + +CantUseItemText: ; 12a67 + text_jump UnknownText_0x1c1b03 + db "@" +; 12a6c + + +PartyMonItemName: ; 12a6c + ld a, [wCurItem] + ld [wd265], a + call GetItemName + call CopyName1 + ret +; 12a79 + + +CancelPokemonAction: ; 12a79 + farcall InitPartyMenuWithCancel + farcall UnfreezeMonIcons + ld a, 1 + ret +; 12a88 + + +PokemonActionSubmenu: ; 12a88 + hlcoord 1, 15 + lb bc, 2, 18 + call ClearBox + farcall MonSubmenu + call GetCurNick + ld a, [wMenuSelection] + ld hl, .Actions + ld de, 3 + call IsInArray + jr nc, .nothing + + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.nothing + ld a, 0 + ret + +.Actions: + dbw MONMENUITEM_CUT, MonMenu_Cut + dbw MONMENUITEM_FLY, MonMenu_Fly + dbw MONMENUITEM_SURF, MonMenu_Surf + dbw MONMENUITEM_STRENGTH, MonMenu_Strength + dbw MONMENUITEM_FLASH, MonMenu_Flash + dbw MONMENUITEM_WHIRLPOOL, MonMenu_Whirlpool + dbw MONMENUITEM_DIG, MonMenu_Dig + dbw MONMENUITEM_TELEPORT, MonMenu_Teleport + dbw MONMENUITEM_SOFTBOILED, MonMenu_Softboiled_MilkDrink + dbw MONMENUITEM_MILKDRINK, MonMenu_Softboiled_MilkDrink + dbw MONMENUITEM_HEADBUTT, MonMenu_Headbutt + dbw MONMENUITEM_WATERFALL, MonMenu_Waterfall + dbw MONMENUITEM_ROCKSMASH, MonMenu_RockSmash + dbw MONMENUITEM_SWEETSCENT, MonMenu_SweetScent + dbw MONMENUITEM_STATS, OpenPartyStats + dbw MONMENUITEM_SWITCH, SwitchPartyMons + dbw MONMENUITEM_ITEM, GiveTakePartyMonItem + dbw MONMENUITEM_CANCEL, CancelPokemonAction + dbw MONMENUITEM_MOVE, ManagePokemonMoves + dbw MONMENUITEM_MAIL, MonMailAction +; 12aec + + +SwitchPartyMons: ; 12aec + +; Don't try if there's nothing to switch! + ld a, [wPartyCount] + cp 2 + jr c, .DontSwitch + + ld a, [wCurPartyMon] + inc a + ld [wSwitchMon], a + + farcall HoldSwitchmonIcon + farcall InitPartyMenuNoCancel + + ld a, PARTYMENUACTION_MOVE + ld [wPartyMenuActionText], a + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + + hlcoord 0, 1 + ld bc, SCREEN_WIDTH * 2 + ld a, [wSwitchMon] + dec a + call AddNTimes + ld [hl], "▷" + call WaitBGMap + call SetPalettes + call DelayFrame + + farcall PartyMenuSelect + bit 1, b + jr c, .DontSwitch + + farcall _SwitchPartyMons + + xor a + ld [wPartyMenuActionText], a + + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + + ld a, 1 + ret + +.DontSwitch: + xor a + ld [wPartyMenuActionText], a + call CancelPokemonAction + ret +; 12b60 + + +GiveTakePartyMonItem: ; 12b60 + +; Eggs can't hold items! + ld a, [wCurPartySpecies] + cp EGG + jr z, .cancel + + ld hl, GiveTakeItemMenuData + call LoadMenuHeader + call VerticalMenu + call ExitMenu + jr c, .cancel + + call GetCurNick + ld hl, wStringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + ld a, [wMenuCursorY] + cp 1 + jr nz, .take + + call LoadStandardMenuHeader + call ClearPalettes + call .GiveItem + call ClearPalettes + call LoadFontsBattleExtra + call ExitMenu + ld a, 0 + ret + +.take + call TakePartyItem + ld a, 3 + ret + +.cancel + ld a, 3 + ret +; 12ba9 + + +.GiveItem: + + farcall DepositSellInitPackBuffers + +.loop + farcall DepositSellPack + + ld a, [wcf66] + and a + jr z, .quit + + ld a, [wcf65] + cp 2 + jr z, .next + + call CheckTossableItem + ld a, [wItemAttributeParamBuffer] + and a + jr nz, .next + + call TryGiveItemToPartymon + jr .quit + +.next + ld hl, CantBeHeldText + call MenuTextBoxBackup + jr .loop + +.quit + ret +; 12bd9 + + +TryGiveItemToPartymon: ; 12bd9 + + call SpeechTextBox + call PartyMonItemName + call GetPartyItemLocation + ld a, [hl] + and a + jr z, .give_item_to_mon + + push hl + ld d, a + farcall ItemIsMail + pop hl + jr c, .please_remove_mail + ld a, [hl] + jr .already_holding_item + +.give_item_to_mon + call GiveItemToPokemon + ld hl, MadeHoldText + call MenuTextBoxBackup + call GivePartyItem + ret + +.please_remove_mail + ld hl, PleaseRemoveMailText + call MenuTextBoxBackup + ret + +.already_holding_item + ld [wd265], a + call GetItemName + ld hl, SwitchAlreadyHoldingText + call StartMenuYesNo + jr c, .abort + + call GiveItemToPokemon + ld a, [wd265] + push af + ld a, [wCurItem] + ld [wd265], a + pop af + ld [wCurItem], a + call ReceiveItemFromPokemon + jr nc, .bag_full + + ld hl, TookAndMadeHoldText + call MenuTextBoxBackup + ld a, [wd265] + ld [wCurItem], a + call GivePartyItem + ret + +.bag_full + ld a, [wd265] + ld [wCurItem], a + call ReceiveItemFromPokemon + ld hl, ItemStorageIsFullText + call MenuTextBoxBackup + +.abort + ret +; 12c4c + + +GivePartyItem: ; 12c4c + + call GetPartyItemLocation + ld a, [wCurItem] + ld [hl], a + ld d, a + farcall ItemIsMail + jr nc, .done + call ComposeMailMessage + +.done + ret +; 12c60 + + +TakePartyItem: ; 12c60 + + call SpeechTextBox + call GetPartyItemLocation + ld a, [hl] + and a + jr z, .asm_12c8c + + ld [wCurItem], a + call ReceiveItemFromPokemon + jr nc, .asm_12c94 + + farcall ItemIsMail + call GetPartyItemLocation + ld a, [hl] + ld [wd265], a + ld [hl], NO_ITEM + call GetItemName + ld hl, TookFromText + call MenuTextBoxBackup + jr .asm_12c9a + +.asm_12c8c + ld hl, IsntHoldingAnythingText + call MenuTextBoxBackup + jr .asm_12c9a + +.asm_12c94 + ld hl, ItemStorageIsFullText + call MenuTextBoxBackup + +.asm_12c9a + ret +; 12c9b + + +GiveTakeItemMenuData: ; 12c9b + db MENU_SPRITE_ANIMS | MENU_BACKUP_TILES ; flags + menu_coords 12, 12, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .Items + db 1 ; default option + +.Items: + db STATICMENU_CURSOR ; flags + db 2 ; # items + db "GIVE@" + db "TAKE@" +; 12caf + + +TookAndMadeHoldText: ; 12caf + text_jump UnknownText_0x1c1b2c + db "@" +; 12cb4 + +MadeHoldText: ; 12cb4 + text_jump UnknownText_0x1c1b57 + db "@" +; 12cb9 + +PleaseRemoveMailText: ; 12cb9 + text_jump UnknownText_0x1c1b6f + db "@" +; 12cbe + +IsntHoldingAnythingText: ; 12cbe + text_jump UnknownText_0x1c1b8e + db "@" +; 12cc3 + +ItemStorageIsFullText: ; 12cc3 + text_jump UnknownText_0x1c1baa + db "@" +; 12cc8 + +TookFromText: ; 12cc8 + text_jump UnknownText_0x1c1bc4 + db "@" +; 12ccd + +SwitchAlreadyHoldingText: ; 12ccd + text_jump UnknownText_0x1c1bdc + db "@" +; 12cd2 + +CantBeHeldText: ; 12cd2 + text_jump UnknownText_0x1c1c09 + db "@" +; 12cd7 + + +GetPartyItemLocation: ; 12cd7 + push af + ld a, MON_ITEM + call GetPartyParamLocation + pop af + ret +; 12cdf + + +ReceiveItemFromPokemon: ; 12cdf + ld a, 1 + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + jp ReceiveItem +; 12cea + + +GiveItemToPokemon: ; 12cea (4:6cea) + ld a, 1 + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + jp TossItem + +StartMenuYesNo: ; 12cf5 + call MenuTextBox + call YesNoBox + jp ExitMenu +; 12cfe + + +ComposeMailMessage: ; 12cfe (4:6cfe) + ld de, wTempMailMessage + farcall _ComposeMailMessage + ld hl, wPlayerName + ld de, wTempMailAuthor + ld bc, NAME_LENGTH - 1 + call CopyBytes + ld hl, wPlayerID + ld bc, 2 + call CopyBytes + ld a, [wCurPartySpecies] + ld [de], a + inc de + ld a, [wCurItem] + ld [de], a + ld a, [wCurPartyMon] + ld hl, sPartyMail + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wTempMail + ld bc, MAIL_STRUCT_LENGTH + ld a, BANK(sPartyMail) + call GetSRAMBank + call CopyBytes + call CloseSRAM + ret + +MonMailAction: ; 12d45 +; If in the time capsule or trade center, +; selecting the mail only allows you to +; read the mail. + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jr z, .read + cp LINK_TRADECENTER + jr z, .read + +; Show the READ/TAKE/QUIT menu. + ld hl, .MenuHeader + call LoadMenuHeader + call VerticalMenu + call ExitMenu + +; Interpret the menu. + jp c, .done + ld a, [wMenuCursorY] + cp $1 + jr z, .read + cp $2 + jr z, .take + jp .done + +.read + farcall ReadPartyMonMail + ld a, $0 + ret + +.take + ld hl, .sendmailtopctext + call StartMenuYesNo + jr c, .RemoveMailToBag + ld a, [wCurPartyMon] + ld b, a + farcall SendMailToPC + jr c, .MailboxFull + ld hl, .sentmailtopctext + call MenuTextBoxBackup + jr .done + +.MailboxFull: + ld hl, .mailboxfulltext + call MenuTextBoxBackup + jr .done + +.RemoveMailToBag: + ld hl, .mailwilllosemessagetext + call StartMenuYesNo + jr c, .done + call GetPartyItemLocation + ld a, [hl] + ld [wCurItem], a + call ReceiveItemFromPokemon + jr nc, .BagIsFull + call GetPartyItemLocation + ld [hl], $0 + call GetCurNick + ld hl, .tookmailfrommontext + call MenuTextBoxBackup + jr .done + +.BagIsFull: + ld hl, .bagfulltext + call MenuTextBoxBackup + jr .done + +.done + ld a, $3 + ret +; 12dc9 + + +.MenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 12, 10, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option +; 0x12dd1 + +.MenuData: + db STATICMENU_CURSOR ; flags + db 3 ; items + db "READ@" + db "TAKE@" + db "QUIT@" +; 0x12de2 + + +.mailwilllosemessagetext +; The MAIL will lose its message. OK? + text_jump UnknownText_0x1c1c22 + db "@" +; 0x12de7 + +.tookmailfrommontext +; MAIL detached from . + text_jump UnknownText_0x1c1c47 + db "@" +; 0x12dec + +.bagfulltext +; There's no space for removing MAIL. + text_jump UnknownText_0x1c1c62 + db "@" +; 0x12df1 + +.sendmailtopctext +; Send the removed MAIL to your PC? + text_jump UnknownText_0x1c1c86 + db "@" +; 0x12df6 + +.mailboxfulltext +; Your PC's MAILBOX is full. + text_jump UnknownText_0x1c1ca9 + db "@" +; 0x12dfb + +.sentmailtopctext +; The MAIL was sent to your PC. + text_jump UnknownText_0x1c1cc4 + db "@" +; 0x12e00 + + +OpenPartyStats: ; 12e00 + call LoadStandardMenuHeader + call ClearSprites +; PartyMon + xor a + ld [wMonType], a + call LowVolume + predef StatsScreenInit + call MaxVolume + call Call_ExitMenu + ld a, 0 + ret +; 12e1b + + +MonMenu_Cut: ; 12e1b + farcall CutFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12e30 + + +MonMenu_Fly: ; 12e30 + farcall FlyFunction + ld a, [wFieldMoveSucceeded] + cp $2 + jr z, .Fail + cp $0 + jr z, .Error + farcall StubbedTrainerRankings_Fly + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret + +.Error: + ld a, $0 + ret + +.Unreferenced: + ld a, $1 + ret +; 12e55 + +MonMenu_Flash: ; 12e55 + farcall OWFlash + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12e6a + +MonMenu_Strength: ; 12e6a + farcall StrengthFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12e7f + +MonMenu_Whirlpool: ; 12e7f + farcall WhirlpoolFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12e94 + +MonMenu_Waterfall: ; 12e94 + farcall WaterfallFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12ea9 + +MonMenu_Teleport: ; 12ea9 + farcall TeleportFunction + ld a, [wFieldMoveSucceeded] + and a + jr z, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12ebd + +MonMenu_Surf: ; 12ebd + farcall SurfFunction + ld a, [wFieldMoveSucceeded] + and a + jr z, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12ed1 + +MonMenu_Dig: ; 12ed1 + farcall DigFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12ee6 + +MonMenu_Softboiled_MilkDrink: ; 12ee6 + call .CheckMonHasEnoughHP + jr nc, .NotEnoughHP + farcall Softboiled_MilkDrinkFunction + jr .finish + +.NotEnoughHP: + ld hl, .Text_NotEnoughHP + call PrintText + +.finish + xor a + ld [wPartyMenuActionText], a + ld a, $3 + ret +; 12f00 + +.Text_NotEnoughHP: + ; Not enough HP! + text_jump UnknownText_0x1c1ce3 + db "@" +; 0x12f05 + +.CheckMonHasEnoughHP: +; Need to have at least (MaxHP / 5) HP left. + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld [hDividend + 0], a + ld a, [hl] + ld [hDividend + 1], a + ld a, 5 + ld [hDivisor], a + ld b, 2 + call Divide + ld a, MON_HP + 1 + call GetPartyParamLocation + ld a, [hQuotient + 2] + sub [hl] + dec hl + ld a, [hQuotient + 1] + sbc [hl] + ret +; 12f26 + +MonMenu_Headbutt: ; 12f26 + farcall HeadbuttFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12f3b + +MonMenu_RockSmash: ; 12f3b + farcall RockSmashFunction + ld a, [wFieldMoveSucceeded] + cp $1 + jr nz, .Fail + ld b, $4 + ld a, $2 + ret + +.Fail: + ld a, $3 + ret +; 12f50 + +MonMenu_SweetScent: ; 12f50 + farcall SweetScentFromMenu + ld b, $4 + ld a, $2 + ret +; 12f5b + +ChooseMoveToDelete: ; 12f5b + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call LoadFontsBattleExtra + call .ChooseMoveToDelete + pop bc + ld a, b + ld [wOptions], a + push af + call ClearBGPalettes + pop af + ret +; 12f73 + +.ChooseMoveToDelete + call SetUpMoveScreenBG + ld de, DeleteMoveScreenAttrs + call SetMenuAttributes + call SetUpMoveList + ld hl, w2DMenuFlags1 + set 6, [hl] + jr .enter_loop + +.loop + call ScrollingMenuJoypad + bit B_BUTTON_F, a + jp nz, .b_button + bit A_BUTTON_F, a + jp nz, .a_button + +.enter_loop + call PrepareToPlaceMoveData + call PlaceMoveData + jp .loop +; 12f9c + +.a_button + and a + jr .finish + +.b_button + scf + +.finish + push af + xor a + ld [wSwitchMon], a + ld hl, w2DMenuFlags1 + res 6, [hl] + call ClearSprites + call ClearTileMap + pop af + ret +; 12fb2 + +DeleteMoveScreenAttrs: ; 12fb2 + db 3, 1 + db 3, 1 + db $40, $00 + dn 2, 0 + db D_UP | D_DOWN | A_BUTTON | B_BUTTON +; 12fba + +ManagePokemonMoves: ; 12fba + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call MoveScreenLoop + pop af + ld [wOptions], a + call ClearBGPalettes + +.egg + ld a, $0 + ret +; 12fd5 + +MoveScreenLoop: ; 12fd5 + ld a, [wCurPartyMon] + inc a + ld [wPartyMenuCursor], a + call SetUpMoveScreenBG + call Function132d3 + ld de, MoveScreenAttributes + call SetMenuAttributes +.loop + call SetUpMoveList + ld hl, w2DMenuFlags1 + set 6, [hl] + jr .skip_joy + +.joy_loop + call ScrollingMenuJoypad + bit 1, a + jp nz, .b_button + bit 0, a + jp nz, .a_button + bit 4, a + jp nz, .d_right + bit 5, a + jp nz, .d_left + +.skip_joy + call PrepareToPlaceMoveData + ld a, [wMoveSwapBuffer] + and a + jr nz, .moving_move + call PlaceMoveData + jp .joy_loop + +.moving_move + ld a, " " + hlcoord 1, 11 + ld bc, 5 + call ByteFill + hlcoord 1, 12 + lb bc, 5, SCREEN_WIDTH - 2 + call ClearBox + hlcoord 1, 12 + ld de, String_MoveWhere + call PlaceString + jp .joy_loop +.b_button + call PlayClickSFX + call WaitSFX + ld a, [wMoveSwapBuffer] + and a + jp z, .exit + + ld a, [wMoveSwapBuffer] + ld [wMenuCursorY], a + xor a + ld [wMoveSwapBuffer], a + hlcoord 1, 2 + lb bc, 8, SCREEN_WIDTH - 2 + call ClearBox + jp .loop +; 1305b + +.d_right + ld a, [wMoveSwapBuffer] + and a + jp nz, .joy_loop + + ld a, [wCurPartyMon] + ld b, a + push bc + call .cycle_right + pop bc + ld a, [wCurPartyMon] + cp b + jp z, .joy_loop + jp MoveScreenLoop + +.d_left + ld a, [wMoveSwapBuffer] + and a + jp nz, .joy_loop + ld a, [wCurPartyMon] + ld b, a + push bc + call .cycle_left + pop bc + ld a, [wCurPartyMon] + cp b + jp z, .joy_loop + jp MoveScreenLoop + +.cycle_right + ld a, [wCurPartyMon] + inc a + ld [wCurPartyMon], a + ld c, a + ld b, 0 + ld hl, wPartySpecies + add hl, bc + ld a, [hl] + cp -1 + jr z, .cycle_left + cp EGG + ret nz + jr .cycle_right + +.cycle_left + ld a, [wCurPartyMon] + and a + ret z +.cycle_left_loop + ld a, [wCurPartyMon] + dec a + ld [wCurPartyMon], a + ld c, a + ld b, 0 + ld hl, wPartySpecies + add hl, bc + ld a, [hl] + cp EGG + ret nz + ld a, [wCurPartyMon] + and a + jr z, .cycle_right + jr .cycle_left_loop +; 130c6 + +.a_button + call PlayClickSFX + call WaitSFX + ld a, [wMoveSwapBuffer] + and a + jr nz, .place_move + ld a, [wMenuCursorY] + ld [wMoveSwapBuffer], a + call PlaceHollowCursor + jp .moving_move + +.place_move + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + push hl + call .copy_move + pop hl + ld bc, $15 + add hl, bc + call .copy_move + ld a, [wBattleMode] + jr z, .swap_moves + ld hl, wBattleMonMoves + ld bc, $20 + ld a, [wCurPartyMon] + call AddNTimes + push hl + call .copy_move + pop hl + ld bc, 6 + add hl, bc + call .copy_move + +.swap_moves + ld de, SFX_SWITCH_POKEMON + call PlaySFX + call WaitSFX + ld de, SFX_SWITCH_POKEMON + call PlaySFX + call WaitSFX + hlcoord 1, 2 + lb bc, 8, 18 + call ClearBox + hlcoord 10, 10 + lb bc, 1, 9 + call ClearBox + jp .loop +; 1313a + +.copy_move + push hl + ld a, [wMenuCursorY] + dec a + ld c, a + ld b, $0 + add hl, bc + ld d, h + ld e, l + pop hl + ld a, [wMoveSwapBuffer] + dec a + ld c, a + ld b, $0 + add hl, bc + ld a, [de] + ld b, [hl] + ld [hl], a + ld a, b + ld [de], a + ret +; 13154 + +.exit + xor a + ld [wMoveSwapBuffer], a + ld hl, w2DMenuFlags1 + res 6, [hl] + call ClearSprites + jp ClearTileMap +; 13163 + +MoveScreenAttributes: ; 13163 + db 3, 1 + db 3, 1 + db $40, $00 + dn 2, 0 + db D_UP | D_DOWN | D_LEFT | D_RIGHT | A_BUTTON | B_BUTTON +; 1316b + +String_MoveWhere: ; 1316b + db "Where?@" +; 13172 + +SetUpMoveScreenBG: ; 13172 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + xor a + ld [hBGMapMode], a + farcall LoadStatsScreenPageTilesGFX + farcall ClearSpriteAnims2 + ld a, [wCurPartyMon] + ld e, a + ld d, $0 + ld hl, wPartySpecies + add hl, de + ld a, [hl] + ld [wd265], a + ld e, $2 + farcall LoadMenuMonIcon + hlcoord 0, 1 + ld b, 9 + ld c, 18 + call TextBox + hlcoord 0, 11 + ld b, 5 + ld c, 18 + call TextBox + hlcoord 2, 0 + lb bc, 2, 3 + call ClearBox + xor a + ld [wMonType], a + ld hl, wPartyMonNicknames + ld a, [wCurPartyMon] + call GetNick + hlcoord 5, 1 + call PlaceString + push bc + farcall CopyMonToTempMon + pop hl + call PrintLevel + ld hl, wPlayerHPPal + call SetHPPal + ld b, SCGB_MOVE_LIST + call GetSGBLayout + hlcoord 16, 0 + lb bc, 1, 3 + jp ClearBox +; 131ef + +SetUpMoveList: ; 131ef + xor a + ld [hBGMapMode], a + ld [wMoveSwapBuffer], a + ld [wMonType], a + predef CopyMonToTempMon + ld hl, wTempMonMoves + ld de, wListMoves_MoveIndicesBuffer + ld bc, NUM_MOVES + call CopyBytes + ld a, SCREEN_WIDTH * 2 + ld [wBuffer1], a + hlcoord 2, 3 + predef ListMoves + hlcoord 10, 4 + predef ListMovePP + call WaitBGMap + call SetPalettes + ld a, [wNumMoves] + inc a + ld [w2DMenuNumRows], a + hlcoord 0, 11 + ld b, 5 + ld c, 18 + jp TextBox +; 13235 + +PrepareToPlaceMoveData: ; 13235 + ld hl, wPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld a, [wMenuCursorY] + dec a + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + ld [wCurMove], a + hlcoord 1, 12 + lb bc, 5, 18 + jp ClearBox +; 13256 + +PlaceMoveData: ; 13256 + xor a + ld [hBGMapMode], a + hlcoord 0, 10 + ld de, String_MoveType_Top + call PlaceString + hlcoord 0, 11 + ld de, String_MoveType_Bottom + call PlaceString + hlcoord 12, 12 + ld de, String_MoveAtk + call PlaceString + ld a, [wCurMove] + ld b, a + hlcoord 2, 12 + predef PrintMoveType + ld a, [wCurMove] + dec a + ld hl, Moves + MOVE_POWER + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + hlcoord 16, 12 + cp 2 + jr c, .no_power + ld [wd265], a + ld de, wd265 + lb bc, 1, 3 + call PrintNum + jr .description + +.no_power + ld de, String_MoveNoPower + call PlaceString + +.description + hlcoord 1, 14 + predef PrintMoveDesc + ld a, $1 + ld [hBGMapMode], a + ret +; 132ba + +String_MoveType_Top: ; 132ba + db "┌─────┐@" +; 132c2 +String_MoveType_Bottom: ; 132c2 + db "│TYPE/└@" +; 132ca +String_MoveAtk: ; 132ca + db "ATK/@" +; 132cf +String_MoveNoPower: ; 132cf + db "---@" +; 132d3 + +Function132d3: ; 132d3 + call Function132da + call Function132fe + ret +; 132da + +Function132da: ; 132da + ld a, [wCurPartyMon] + and a + ret z + ld c, a + ld e, a + ld d, 0 + ld hl, wPartyCount + add hl, de +.loop + ld a, [hl] + and a + jr z, .prev + cp EGG + jr z, .prev + cp NUM_POKEMON + 1 + jr c, .legal + +.prev + dec hl + dec c + jr nz, .loop + ret + +.legal + hlcoord 16, 0 + ld [hl], "◀" + ret +; 132fe + +Function132fe: ; 132fe + ld a, [wCurPartyMon] + inc a + ld c, a + ld a, [wPartyCount] + cp c + ret z + ld e, c + ld d, 0 + ld hl, wPartySpecies + add hl, de +.loop + ld a, [hl] + cp -1 + ret z + and a + jr z, .next + cp EGG + jr z, .next + cp NUM_POKEMON + 1 + jr c, .legal + +.next + inc hl + jr .loop + +.legal + hlcoord 18, 0 + ld [hl], "▶" + ret +; 13327 diff --git a/engine/menus/trainer_card.asm b/engine/menus/trainer_card.asm new file mode 100755 index 000000000..e84c1c9f3 --- /dev/null +++ b/engine/menus/trainer_card.asm @@ -0,0 +1,623 @@ +; TrainerCard.Jumptable indexes + const_def + const TRAINERCARDSTATE_PAGE1_LOADGFX ; 0 + const TRAINERCARDSTATE_PAGE1_JOYPAD ; 1 + const TRAINERCARDSTATE_PAGE2_LOADGFX ; 2 + const TRAINERCARDSTATE_PAGE2_JOYPAD ; 3 + const TRAINERCARDSTATE_PAGE3_LOADGFX ; 4 + const TRAINERCARDSTATE_PAGE3_JOYPAD ; 5 + const TRAINERCARDSTATE_QUIT ; 6 + +TrainerCard: ; 25105 + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call .InitRAM +.loop + call UpdateTime + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .quit + ld a, [hJoyLast] + and B_BUTTON + jr nz, .quit + call .RunJumptable + call DelayFrame + jr .loop + +.quit + pop af + ld [wOptions], a + pop af + ld [wVramState], a + ret + +.InitRAM: ; 2513b (9:513b) + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call DisableLCD + + farcall GetCardPic + + ld hl, CardRightCornerGFX + ld de, vTiles2 tile $1c + ld bc, 1 tiles + ld a, BANK(CardRightCornerGFX) + call FarCopyBytes + + ld hl, CardStatusGFX + ld de, vTiles2 tile $29 + ld bc, 86 tiles + ld a, BANK(CardStatusGFX) + call FarCopyBytes + + call TrainerCard_PrintTopHalfOfCard + + hlcoord 0, 8 + ld d, 6 + call TrainerCard_InitBorder + + call EnableLCD + call WaitBGMap + ld b, SCGB_TRAINER_CARD + call GetSGBLayout + call SetPalettes + call WaitBGMap + ld hl, wJumptableIndex + xor a ; TRAINERCARDSTATE_PAGE1_LOADGFX + ld [hli], a ; wJumptableIndex + ld [hli], a ; wTrainerCardBadgeFrameCounter + ld [hli], a ; wTrainerCardBadgeTileID + ld [hl], a ; wTrainerCardBadgeAttributes + ret + +.RunJumptable: ; 2518e (9:518e) + jumptable .Jumptable, wJumptableIndex + +.Jumptable: ; 2519d (9:519d) +; entries correspond to TRAINERCARDSTATE_* constants + dw TrainerCard_Page1_LoadGFX + dw TrainerCard_Page1_Joypad + dw TrainerCard_Page2_LoadGFX + dw TrainerCard_Page2_Joypad + dw TrainerCard_Page3_LoadGFX + dw TrainerCard_Page3_Joypad + dw TrainerCard_Quit + +TrainerCard_IncrementJumptable: ; 251ab (9:51ab) + ld hl, wJumptableIndex + inc [hl] + ret + +TrainerCard_Quit: ; 251b0 (9:51b0) + ld hl, wJumptableIndex + set 7, [hl] + ret + +TrainerCard_Page1_LoadGFX: ; 251b6 (9:51b6) + call ClearSprites + hlcoord 0, 8 + ld d, 6 + call TrainerCard_InitBorder + call WaitBGMap + ld de, CardStatusGFX + ld hl, vTiles2 tile $29 + lb bc, BANK(CardStatusGFX), 86 + call Request2bpp + call TrainerCard_Page1_PrintDexCaught_GameTime + call TrainerCard_IncrementJumptable + ret + +TrainerCard_Page1_Joypad: ; 251d7 (9:51d7) + call TrainerCard_Page1_PrintGameTime + ld hl, hJoyLast + ld a, [hl] + and D_RIGHT | A_BUTTON + jr nz, .pressed_right_a + ret + +.pressed_right_a + ld a, TRAINERCARDSTATE_PAGE2_LOADGFX + ld [wJumptableIndex], a + ret + +.Unreferenced_KantoCheck: + ld a, [wKantoBadges] + and a + ret z + ld a, TRAINERCARDSTATE_PAGE3_LOADGFX + ld [wJumptableIndex], a + ret + +; 251f4 + +TrainerCard_Page2_LoadGFX: ; 251f4 (9:51f4) + call ClearSprites + hlcoord 0, 8 + ld d, 6 + call TrainerCard_InitBorder + call WaitBGMap + ld de, LeaderGFX + ld hl, vTiles2 tile $29 + lb bc, BANK(LeaderGFX), 86 + call Request2bpp + ld de, BadgeGFX + ld hl, vTiles0 tile $00 + lb bc, BANK(BadgeGFX), 44 + call Request2bpp + call TrainerCard_Page2_3_InitObjectsAndStrings + call TrainerCard_IncrementJumptable + ret + +TrainerCard_Page2_Joypad: ; 25221 (9:5221) + ld hl, TrainerCard_JohtoBadgesOAM + call TrainerCard_Page2_3_AnimateBadges + ld hl, hJoyLast + ld a, [hl] + and A_BUTTON + jr nz, .Quit + ld a, [hl] + and D_LEFT + jr nz, .d_left + ret + +.d_left + ld a, TRAINERCARDSTATE_PAGE1_LOADGFX + ld [wJumptableIndex], a + ret + +.Unreferenced_KantoCheck: + ld a, [wKantoBadges] + and a + ret z + ld a, TRAINERCARDSTATE_PAGE3_LOADGFX + ld [wJumptableIndex], a + ret + +.Quit: + ld a, TRAINERCARDSTATE_QUIT + ld [wJumptableIndex], a + ret + +TrainerCard_Page3_LoadGFX: ; 2524c (9:524c) + call ClearSprites + hlcoord 0, 8 + ld d, 6 + call TrainerCard_InitBorder + call WaitBGMap + ld de, LeaderGFX2 + ld hl, vTiles2 tile $29 + lb bc, BANK(LeaderGFX2), 86 + call Request2bpp + ld de, BadgeGFX2 + ld hl, vTiles0 tile $00 + lb bc, BANK(BadgeGFX2), 44 + call Request2bpp + call TrainerCard_Page2_3_InitObjectsAndStrings + call TrainerCard_IncrementJumptable + ret + +TrainerCard_Page3_Joypad: ; 25279 (9:5279) + ld hl, TrainerCard_JohtoBadgesOAM + call TrainerCard_Page2_3_AnimateBadges + ld hl, hJoyLast + ld a, [hl] + and D_LEFT + jr nz, .left + ld a, [hl] + and D_RIGHT + jr nz, .right + ret + +.left + ld a, TRAINERCARDSTATE_PAGE2_LOADGFX + ld [wJumptableIndex], a + ret + +.right + ld a, TRAINERCARDSTATE_PAGE1_LOADGFX + ld [wJumptableIndex], a + ret + +TrainerCard_PrintTopHalfOfCard: ; 25299 (9:5299) + hlcoord 0, 0 + ld d, 5 + call TrainerCard_InitBorder + hlcoord 2, 2 + ld de, .Name_Money + call PlaceString + hlcoord 2, 4 + ld de, .ID_No + call TrainerCardSetup_PlaceTilemapString + hlcoord 7, 2 + ld de, wPlayerName + call PlaceString + hlcoord 5, 4 + ld de, wPlayerID + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + hlcoord 7, 6 + ld de, wMoney + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + hlcoord 1, 3 + ld de, .HorizontalDivider + call TrainerCardSetup_PlaceTilemapString + hlcoord 14, 1 + lb bc, 5, 7 + xor a + ld [hGraphicStartTile], a + predef PlaceGraphic + ret + +; 252ec (9:52ec) + +.Name_Money: ; 252ec + db "NAME/" + next "" + next "MONEY@" + +.ID_No: ; 252f9 + db $27, $28, -1 ; ID NO + +.HorizontalDivider: ; 252fc + db $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $25, $26, -1 ; ____________> +; 2530a + +TrainerCard_Page1_PrintDexCaught_GameTime: ; 2530a (9:530a) + hlcoord 2, 10 + ld de, .Dex_PlayTime + call PlaceString + hlcoord 10, 15 + ld de, .Badges + call PlaceString + ld hl, wPokedexCaught + ld b, wEndPokedexCaught - wPokedexCaught + call CountSetBits + ld de, wd265 + hlcoord 15, 10 + lb bc, 1, 3 + call PrintNum + call TrainerCard_Page1_PrintGameTime + hlcoord 2, 8 + ld de, .StatusTilemap + call TrainerCardSetup_PlaceTilemapString + ld a, [wStatusFlags] + bit STATUSFLAGS_POKEDEX_F, a + ret nz + hlcoord 1, 9 + lb bc, 2, 17 + call ClearBox + ret + +.Dex_PlayTime: + db "#DEX" + next "PLAY TIME@@" + +.Badges: + db " BADGES▶@" + +.StatusTilemap: ; 25366 + db $29, $2a, $2b, $2c, $2d, -1 +; 2536c + +TrainerCard_Page2_3_InitObjectsAndStrings: ; 2536c (9:536c) + hlcoord 2, 8 + ld de, .BadgesTilemap + call TrainerCardSetup_PlaceTilemapString + hlcoord 2, 10 + ld a, $29 + ld c, 4 +.loop + call TrainerCard_Page2_3_PlaceLeadersFaces +rept 4 + inc hl +endr + dec c + jr nz, .loop + hlcoord 2, 13 + ld a, $51 + ld c, 4 +.loop2 + call TrainerCard_Page2_3_PlaceLeadersFaces +rept 4 + inc hl +endr + dec c + jr nz, .loop2 + xor a + ld [wTrainerCardBadgeFrameCounter], a + ld hl, TrainerCard_JohtoBadgesOAM + call TrainerCard_Page2_3_OAMUpdate + ret + +; 253a2 (9:53a2) + +.BadgesTilemap: ; 253a2 + db $79, $7a, $7b, $7c, $7d, -1 ; "BADGES" +; 253a8 + +TrainerCardSetup_PlaceTilemapString: ; 253a8 (9:53a8) +.loop + ld a, [de] + cp -1 + ret z + ld [hli], a + inc de + jr .loop + +TrainerCard_InitBorder: ; 253b0 (9:53b0) + ld e, SCREEN_WIDTH +.loop1 + ld a, $23 + ld [hli], a + dec e + jr nz, .loop1 + + ld a, $23 + ld [hli], a + ld e, SCREEN_HEIGHT - 1 + ld a, " " +.loop2 + ld [hli], a + dec e + jr nz, .loop2 + + ld a, $1c + ld [hli], a + ld a, $23 + ld [hli], a +.loop3 + ld a, $23 + ld [hli], a + + ld e, SCREEN_HEIGHT + ld a, " " +.loop4 + ld [hli], a + dec e + jr nz, .loop4 + + ld a, $23 + ld [hli], a + dec d + jr nz, .loop3 + + ld a, $23 + ld [hli], a + ld a, $24 + ld [hli], a + + ld e, SCREEN_HEIGHT - 1 + ld a, " " +.loop5 + ld [hli], a + dec e + jr nz, .loop5 + ld a, $23 + ld [hli], a + ld e, SCREEN_WIDTH +.loop6 + ld a, $23 + ld [hli], a + dec e + jr nz, .loop6 + ret + +TrainerCard_Page2_3_PlaceLeadersFaces: ; 253f4 (9:53f4) + push de + push hl + ld [hli], a + inc a + ld [hli], a + inc a + ld [hli], a + inc a + ld [hli], a + inc a + ld de, SCREEN_WIDTH - 3 + add hl, de + ld [hli], a + inc a + ld [hli], a + inc a + ld [hli], a + inc a + ld de, SCREEN_WIDTH - 3 + add hl, de + ld [hli], a + inc a + ld [hli], a + inc a + ld [hli], a + inc a + pop hl + pop de + ret + +TrainerCard_Page1_PrintGameTime: ; 25415 (9:5415) + hlcoord 11, 12 + ld de, wGameTimeHours + lb bc, 2, 4 + call PrintNum + inc hl + ld de, wGameTimeMinutes + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld a, [hVBlankCounter] + and $1f + ret nz + hlcoord 15, 12 + ld a, [hl] + xor " " ^ $2e ; alternate between space and small colon ($2e) tiles + ld [hl], a + ret + +TrainerCard_Page2_3_AnimateBadges: ; 25438 (9:5438) + ld a, [hVBlankCounter] + and %111 + ret nz + ld a, [wTrainerCardBadgeFrameCounter] + inc a + and %111 + ld [wTrainerCardBadgeFrameCounter], a + jr TrainerCard_Page2_3_OAMUpdate + +TrainerCard_Page2_3_OAMUpdate: ; 25448 (9:5448) +; copy flag array pointer + ld a, [hli] + ld e, a + ld a, [hli] +; get flag array + ld d, a + ld a, [de] + ld c, a + ld de, wVirtualOAMSprite00 + ld b, NUM_JOHTO_BADGES +.loop + srl c + push bc + jr nc, .skip_badge + push hl + ld a, [hli] ; y + ld b, a + ld a, [hli] ; x + ld c, a + ld a, [hli] ; pal + ld [wTrainerCardBadgeAttributes], a + ld a, [wTrainerCardBadgeFrameCounter] + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, [hl] + ld [wTrainerCardBadgeTileID], a + call .PrepOAM + pop hl +.skip_badge + ld bc, $b ; 3 + 2 * 4 + add hl, bc + pop bc + dec b + jr nz, .loop + ret + +.PrepOAM: ; 2547b (9:547b) + ld a, [wTrainerCardBadgeTileID] + and 1 << 7 + jr nz, .xflip + ld hl, .facing1 + jr .loop2 + +.xflip + ld hl, .facing2 +.loop2 + ld a, [hli] + cp -1 + ret z + add b + ld [de], a ; y + inc de + + ld a, [hli] + add c + ld [de], a ; x + inc de + + ld a, [wTrainerCardBadgeTileID] + and $ff ^ (1 << 7) + add [hl] + ld [de], a ; tile id + inc hl + inc de + + ld a, [wTrainerCardBadgeAttributes] + add [hl] + ld [de], a ; attributes + inc hl + inc de + jr .loop2 + +; 254a7 (9:54a7) + +.facing1 ; 254a7 + dsprite 0, 0, 0, 0, $00, 0 + dsprite 0, 0, 1, 0, $01, 0 + dsprite 1, 0, 0, 0, $02, 0 + dsprite 1, 0, 1, 0, $03, 0 + db -1 + +.facing2 ; 254b8 + dsprite 0, 0, 0, 0, $01, 0 | X_FLIP + dsprite 0, 0, 1, 0, $00, 0 | X_FLIP + dsprite 1, 0, 0, 0, $03, 0 | X_FLIP + dsprite 1, 0, 1, 0, $02, 0 | X_FLIP + db -1 + +TrainerCard_JohtoBadgesOAM: ; 254c9 +; Template OAM data for each badge on the trainer card. +; Format: + ; y, x, palette + ; cycle 1: face tile, in1 tile, in2 tile, in3 tile + ; cycle 2: face tile, in1 tile, in2 tile, in3 tile + + dw wJohtoBadges + + ; Zephyrbadge + db $68, $18, 0 + db $00, $20, $24, $20 | (1 << 7) + db $00, $20, $24, $20 | (1 << 7) + + ; Hivebadge + db $68, $38, 0 + db $04, $20, $24, $20 | (1 << 7) + db $04, $20, $24, $20 | (1 << 7) + + ; Plainbadge + db $68, $58, 0 + db $08, $20, $24, $20 | (1 << 7) + db $08, $20, $24, $20 | (1 << 7) + + ; Fogbadge + db $68, $78, 0 + db $0c, $20, $24, $20 | (1 << 7) + db $0c, $20, $24, $20 | (1 << 7) + + ; Mineralbadge + db $80, $38, 0 + db $10, $20, $24, $20 | (1 << 7) + db $10, $20, $24, $20 | (1 << 7) + + ; Stormbadge + db $80, $18, 0 + db $14, $20, $24, $20 | (1 << 7) + db $14, $20, $24, $20 | (1 << 7) + + ; Glacierbadge + db $80, $58, 0 + db $18, $20, $24, $20 | (1 << 7) + db $18, $20, $24, $20 | (1 << 7) + + ; Risingbadge + ; X-flips on alternate cycles. + db $80, $78, 0 + db $1c, $20, $24, $20 | (1 << 7) + db $1c | (1 << 7), $20, $24, $20 | (1 << 7) +; 25523 + +CardStatusGFX: INCBIN "gfx/trainer_card/card_status.2bpp" + +LeaderGFX: INCBIN "gfx/trainer_card/leaders.2bpp" +LeaderGFX2: INCBIN "gfx/trainer_card/leaders.2bpp" +BadgeGFX: INCBIN "gfx/trainer_card/badges.2bpp" +BadgeGFX2: INCBIN "gfx/trainer_card/badges.2bpp" + +CardRightCornerGFX: INCBIN "gfx/trainer_card/card_right_corner.2bpp" diff --git a/engine/overworld/loadmappart.asm b/engine/overworld/loadmappart.asm new file mode 100644 index 000000000..2184ebf7e --- /dev/null +++ b/engine/overworld/loadmappart.asm @@ -0,0 +1,36 @@ +_LoadMapPart:: ; 4d15b + ld hl, wMisc + ld a, [wMetatileStandingY] + and a + jr z, .top_row + ld bc, WMISC_WIDTH * 2 + add hl, bc + +.top_row + ld a, [wMetatileStandingX] + and a + jr z, .left_column + inc hl + inc hl + +.left_column + decoord 0, 0 + ld b, SCREEN_HEIGHT +.loop + ld c, SCREEN_WIDTH +.loop2 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop2 + ld a, l + add 4 + ld l, a + jr nc, .carry + inc h + +.carry + dec b + jr nz, .loop + ret diff --git a/engine/pokemon/getbreedmonlevelgrowth.asm b/engine/pokemon/getbreedmonlevelgrowth.asm new file mode 100644 index 000000000..dc22db798 --- /dev/null +++ b/engine/pokemon/getbreedmonlevelgrowth.asm @@ -0,0 +1,27 @@ +GetBreedMon1LevelGrowth: ; e698 + ld hl, wBreedMon1Stats + ld de, wTempMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + callfar CalcLevel + ld a, [wBreedMon1Level] + ld b, a + ld a, d + ld e, a + sub b + ld d, a + ret + +GetBreedMon2LevelGrowth: ; e6b3 + ld hl, wBreedMon2Stats + ld de, wTempMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + callfar CalcLevel + ld a, [wBreedMon2Level] + ld b, a + ld a, d + ld e, a + sub b + ld d, a + ret diff --git a/engine/pokemon/knowsmove.asm b/engine/pokemon/knowsmove.asm new file mode 100644 index 000000000..4ec3da347 --- /dev/null +++ b/engine/pokemon/knowsmove.asm @@ -0,0 +1,25 @@ +KnowsMove: ; f9ea + ld a, MON_MOVES + call GetPartyParamLocation + ld a, [wPutativeTMHMMove] + ld b, a + ld c, NUM_MOVES +.loop + ld a, [hli] + cp b + jr z, .knows_move + dec c + jr nz, .loop + and a + ret + +.knows_move + ld hl, .Text_knows + call PrintText + scf + ret + +.Text_knows: ; 0xfa06 + ; knows @ . + text_jump UnknownText_0x1c5ea8 + db "@" diff --git a/engine/pokemon/leveluphappinessmod.asm b/engine/pokemon/leveluphappinessmod.asm new file mode 100644 index 000000000..8c6dd92fe --- /dev/null +++ b/engine/pokemon/leveluphappinessmod.asm @@ -0,0 +1,20 @@ +LevelUpHappinessMod: ; 2709e + ld a, [wCurPartyMon] + ld hl, wPartyMon1CaughtLocation + call GetPartyLocation + ld a, [hl] + and $7f + ld d, a + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + call GetWorldMapLocation + cp d + ld c, HAPPINESS_GAINLEVEL + jr nz, .ok + ld c, HAPPINESS_GAINLEVELATHOME + +.ok + callfar ChangeHappiness + ret diff --git a/engine/pokemon/mon_menu.asm b/engine/pokemon/mon_menu.asm new file mode 100755 index 000000000..088b1b1a3 --- /dev/null +++ b/engine/pokemon/mon_menu.asm @@ -0,0 +1,304 @@ +INCLUDE "data/mon_menu.asm" + +MonSubmenu: ; 24d19 + xor a + ld [hBGMapMode], a + call GetMonSubmenuItems + farcall FreezeMonIcons + ld hl, .MenuHeader + call LoadMenuHeader + call .GetTopCoord + call PopulateMonMenu + + ld a, 1 + ld [hBGMapMode], a + call MonMenuLoop + ld [wMenuSelection], a + + call ExitMenu + ret +; 24d3f + +.MenuHeader: ; 24d3f + db MENU_BACKUP_TILES ; flags + menu_coords 6, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw 0 + db 1 ; default option +; 24d47 + +.GetTopCoord: ; 24d47 +; TopCoord = 1 + BottomCoord - 2 * (NumSubmenuItems + 1) + ld a, [wBuffer1] + inc a + add a + ld b, a + ld a, [wMenuBorderBottomCoord] + sub b + inc a + ld [wMenuBorderTopCoord], a + call MenuBox + ret +; 24d59 + +MonMenuLoop: ; 24d59 +.loop + ld a, MENU_UNUSED_3 | MENU_BACKUP_TILES_2 ; flags + ld [wMenuDataFlags], a + ld a, [wBuffer1] ; items + ld [wMenuDataItems], a + call InitVerticalMenuCursor + ld hl, w2DMenuFlags1 + set 6, [hl] + call StaticMenuJoypad + ld de, SFX_READ_TEXT_2 + call PlaySFX + ld a, [hJoyPressed] + bit A_BUTTON_F, a + jr nz, .select + bit B_BUTTON_F, a + jr nz, .cancel + jr .loop + +.cancel + ld a, MONMENUITEM_CANCEL + ret + +.select + ld a, [wMenuCursorY] + dec a + ld c, a + ld b, 0 + ld hl, wBuffer2 + add hl, bc + ld a, [hl] + ret +; 24d91 + +PopulateMonMenu: ; 24d91 + call MenuBoxCoord2Tile + ld bc, 2 * SCREEN_WIDTH + 2 + add hl, bc + ld de, wBuffer2 +.loop + ld a, [de] + inc de + cp -1 + ret z + push de + push hl + call GetMonMenuString + pop hl + call PlaceString + ld bc, 2 * SCREEN_WIDTH + add hl, bc + pop de + jr .loop +; 24db0 + +GetMonMenuString: ; 24db0 + ld hl, MonMenuOptions + 1 + ld de, 3 + call IsInArray + dec hl + ld a, [hli] + cp MONMENU_MENUOPTION + jr z, .NotMove + inc hl + ld a, [hl] + ld [wd265], a + call GetMoveName + ret + +.NotMove: + inc hl + ld a, [hl] + dec a + ld hl, MonMenuOptionStrings + call GetNthString + ld d, h + ld e, l + ret +; 24dd4 + +GetMonSubmenuItems: ; 24dd4 + call ResetMonSubmenu + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + ld a, [wLinkMode] + and a + jr nz, .skip_moves + ld a, MON_MOVES + call GetPartyParamLocation + ld d, h + ld e, l + ld c, NUM_MOVES +.loop + push bc + push de + ld a, [de] + and a + jr z, .next + push hl + call IsFieldMove + pop hl + jr nc, .next + call AddMonMenuItem + +.next + pop de + inc de + pop bc + dec c + jr nz, .loop + +.skip_moves + ld a, MONMENUITEM_STATS + call AddMonMenuItem + ld a, MONMENUITEM_SWITCH + call AddMonMenuItem + ld a, MONMENUITEM_MOVE + call AddMonMenuItem + ld a, [wLinkMode] + and a + jr nz, .skip2 + push hl + ld a, MON_ITEM + call GetPartyParamLocation + ld d, [hl] + farcall ItemIsMail + pop hl + ld a, MONMENUITEM_MAIL + jr c, .ok + ld a, MONMENUITEM_ITEM + +.ok + call AddMonMenuItem + +.skip2 + ld a, [wBuffer1] + cp NUM_MONMENU_ITEMS + jr z, .ok2 + ld a, MONMENUITEM_CANCEL + call AddMonMenuItem + +.ok2 + call TerminateMonSubmenu + ret + +.egg + ld a, MONMENUITEM_STATS + call AddMonMenuItem + ld a, MONMENUITEM_SWITCH + call AddMonMenuItem + ld a, MONMENUITEM_CANCEL + call AddMonMenuItem + call TerminateMonSubmenu + ret +; 24e52 + +IsFieldMove: ; 24e52 + ld b, a + ld hl, MonMenuOptions +.next + ld a, [hli] + cp -1 + jr z, .nope + cp MONMENU_MENUOPTION + jr z, .nope + ld d, [hl] + inc hl + ld a, [hli] + cp b + jr nz, .next + ld a, d + scf + +.nope + ret +; 24e68 + +ResetMonSubmenu: ; 24e68 + xor a + ld [wBuffer1], a + ld hl, wBuffer2 + ld bc, NUM_MONMENU_ITEMS + 1 + call ByteFill + ret +; 24e76 + +TerminateMonSubmenu: ; 24e76 + ld a, [wBuffer1] + ld e, a + ld d, 0 + ld hl, wBuffer2 + add hl, de + ld [hl], -1 + ret +; 24e83 + +AddMonMenuItem: ; 24e83 + push hl + push de + push af + ld a, [wBuffer1] + ld e, a + inc a + ld [wBuffer1], a + ld d, 0 + ld hl, wBuffer2 + add hl, de + pop af + ld [hl], a + pop de + pop hl + ret +; 24e99 + +BattleMonMenu: ; 24e99 + ld hl, MenuHeader_0x24ed4 + call CopyMenuHeader + xor a + ld [hBGMapMode], a + call MenuBox + call UpdateSprites + call PlaceVerticalMenuItems + call WaitBGMap + call CopyMenuData + ld a, [wMenuDataFlags] + bit 7, a + jr z, .set_carry + call InitVerticalMenuCursor + ld hl, w2DMenuFlags1 + set 6, [hl] + call StaticMenuJoypad + ld de, SFX_READ_TEXT_2 + call PlaySFX + ld a, [hJoyPressed] + bit B_BUTTON_F, a + jr z, .clear_carry + ret z + +.set_carry + scf + ret + +.clear_carry + and a + ret +; 24ed4 + +MenuHeader_0x24ed4: ; 24ed4 + db 0 ; flags + menu_coords 11, 11, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw MenuData_0x24edc + db 1 ; default option +; 24edc + +MenuData_0x24edc: ; 24edc + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 3 ; items + db "SWITCH@" + db "STATS@" + db "CANCEL@" +; 24ef2 diff --git a/engine/pokemon/switchpartymons.asm b/engine/pokemon/switchpartymons.asm new file mode 100644 index 000000000..b01178417 --- /dev/null +++ b/engine/pokemon/switchpartymons.asm @@ -0,0 +1,145 @@ +_SwitchPartyMons: + ld a, [wd0e3] + dec a + ld [wBuffer3], a + ld b, a + ld a, [wMenuCursorY] + dec a + ld [wBuffer2], a + cp b + jr z, .skip + call .SwapMonAndMail + ld a, [wBuffer3] + call .ClearSprite + ld a, [wBuffer2] + call .ClearSprite +.skip + ret + +.ClearSprite: ; 50f34 (14:4f34) + push af + hlcoord 0, 1 + ld bc, 2 * SCREEN_WIDTH + call AddNTimes + ld bc, 2 * SCREEN_WIDTH + ld a, " " + call ByteFill + pop af + ld hl, wVirtualOAMSprite00 + ld bc, 4 * SPRITEOAMSTRUCT_LENGTH + call AddNTimes + ld de, SPRITEOAMSTRUCT_LENGTH + ld c, 4 +.gfx_loop + ld [hl], SCREEN_WIDTH_PX ; y (off-screen) + add hl, de + dec c + jr nz, .gfx_loop + ld de, SFX_SWITCH_POKEMON + call WaitPlaySFX + ret + +.SwapMonAndMail: ; 50f62 (14:4f62) + push hl + push de + push bc + ld bc, wPartySpecies + ld a, [wBuffer2] + ld l, a + ld h, $0 + add hl, bc + ld d, h + ld e, l + ld a, [wBuffer3] + ld l, a + ld h, $0 + add hl, bc + ld a, [hl] + push af + ld a, [de] + ld [hl], a + pop af + ld [de], a + ld a, [wBuffer2] + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + push hl + ld de, wd002 + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ld a, [wBuffer3] + ld hl, wPartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop de + push hl + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + pop de + ld hl, wd002 + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ld a, [wBuffer2] + ld hl, wPartyMonOT + call SkipNames + push hl + call .CopyNameTowd002 + ld a, [wBuffer3] + ld hl, wPartyMonOT + call SkipNames + pop de + push hl + call .CopyName + pop de + ld hl, wd002 + call .CopyName + ld hl, wPartyMonNicknames + ld a, [wBuffer2] + call SkipNames + push hl + call .CopyNameTowd002 + ld hl, wPartyMonNicknames + ld a, [wBuffer3] + call SkipNames + pop de + push hl + call .CopyName + pop de + ld hl, wd002 + call .CopyName + ld hl, sPartyMail + ld a, [wBuffer2] + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + push hl + ld de, wd002 + ld bc, MAIL_STRUCT_LENGTH + ld a, BANK(sPartyMail) + call GetSRAMBank + call CopyBytes + ld hl, sPartyMail + ld a, [wBuffer3] + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + pop de + push hl + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop de + ld hl, wd002 + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + call CloseSRAM + pop bc + pop de + pop hl + ret + +.CopyNameTowd002: ; 51036 (14:5036) + ld de, wd002 + +.CopyName: ; 51039 (14:5039) + ld bc, NAME_LENGTH + call CopyBytes + ret diff --git a/engine/routines/drawkrispackgfx.asm b/engine/routines/drawkrispackgfx.asm deleted file mode 100644 index 54a21e447..000000000 --- a/engine/routines/drawkrispackgfx.asm +++ /dev/null @@ -1,20 +0,0 @@ -DrawKrisPackGFX: ; 48e81 - ld hl, PackFGFXPointers - add hl, de - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - ld hl, vTiles2 tile $50 - lb bc, BANK(PackFGFX), 15 - call Request2bpp - ret - -PackFGFXPointers: ; 48e93 - dw PackFGFX + (15 tiles) * 1 ; ITEM_POCKET - dw PackFGFX + (15 tiles) * 3 ; BALL_POCKET - dw PackFGFX + (15 tiles) * 0 ; KEY_ITEM_POCKET - dw PackFGFX + (15 tiles) * 2 ; TM_HM_POCKET - -PackFGFX: ; 48e9b -INCBIN "gfx/pack/pack_f.2bpp" diff --git a/engine/routines/getbreedmonlevelgrowth.asm b/engine/routines/getbreedmonlevelgrowth.asm deleted file mode 100644 index dc22db798..000000000 --- a/engine/routines/getbreedmonlevelgrowth.asm +++ /dev/null @@ -1,27 +0,0 @@ -GetBreedMon1LevelGrowth: ; e698 - ld hl, wBreedMon1Stats - ld de, wTempMon - ld bc, BOXMON_STRUCT_LENGTH - call CopyBytes - callfar CalcLevel - ld a, [wBreedMon1Level] - ld b, a - ld a, d - ld e, a - sub b - ld d, a - ret - -GetBreedMon2LevelGrowth: ; e6b3 - ld hl, wBreedMon2Stats - ld de, wTempMon - ld bc, BOXMON_STRUCT_LENGTH - call CopyBytes - callfar CalcLevel - ld a, [wBreedMon2Level] - ld b, a - ld a, d - ld e, a - sub b - ld d, a - ret diff --git a/engine/routines/knowsmove.asm b/engine/routines/knowsmove.asm deleted file mode 100644 index 4ec3da347..000000000 --- a/engine/routines/knowsmove.asm +++ /dev/null @@ -1,25 +0,0 @@ -KnowsMove: ; f9ea - ld a, MON_MOVES - call GetPartyParamLocation - ld a, [wPutativeTMHMMove] - ld b, a - ld c, NUM_MOVES -.loop - ld a, [hli] - cp b - jr z, .knows_move - dec c - jr nz, .loop - and a - ret - -.knows_move - ld hl, .Text_knows - call PrintText - scf - ret - -.Text_knows: ; 0xfa06 - ; knows @ . - text_jump UnknownText_0x1c5ea8 - db "@" diff --git a/engine/routines/leveluphappinessmod.asm b/engine/routines/leveluphappinessmod.asm deleted file mode 100644 index 8c6dd92fe..000000000 --- a/engine/routines/leveluphappinessmod.asm +++ /dev/null @@ -1,20 +0,0 @@ -LevelUpHappinessMod: ; 2709e - ld a, [wCurPartyMon] - ld hl, wPartyMon1CaughtLocation - call GetPartyLocation - ld a, [hl] - and $7f - ld d, a - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - call GetWorldMapLocation - cp d - ld c, HAPPINESS_GAINLEVEL - jr nz, .ok - ld c, HAPPINESS_GAINLEVELATHOME - -.ok - callfar ChangeHappiness - ret diff --git a/engine/routines/loadmappart.asm b/engine/routines/loadmappart.asm deleted file mode 100644 index 2184ebf7e..000000000 --- a/engine/routines/loadmappart.asm +++ /dev/null @@ -1,36 +0,0 @@ -_LoadMapPart:: ; 4d15b - ld hl, wMisc - ld a, [wMetatileStandingY] - and a - jr z, .top_row - ld bc, WMISC_WIDTH * 2 - add hl, bc - -.top_row - ld a, [wMetatileStandingX] - and a - jr z, .left_column - inc hl - inc hl - -.left_column - decoord 0, 0 - ld b, SCREEN_HEIGHT -.loop - ld c, SCREEN_WIDTH -.loop2 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop2 - ld a, l - add 4 - ld l, a - jr nc, .carry - inc h - -.carry - dec b - jr nz, .loop - ret diff --git a/engine/routines/loadoverworldfont.asm b/engine/routines/loadoverworldfont.asm deleted file mode 100644 index f23f01c4e..000000000 --- a/engine/routines/loadoverworldfont.asm +++ /dev/null @@ -1,17 +0,0 @@ -LoadOverworldFont:: ; 106594 - ld de, .OverworldFontGFX - ld hl, vTiles1 - lb bc, BANK(.OverworldFontGFX), $80 - call Get2bpp - ld de, .OverworldFontSpaceGFX - ld hl, vTiles2 tile " " - lb bc, BANK(.OverworldFontSpaceGFX), 1 - call Get2bpp - ret -; 1065ad - -.OverworldFontGFX: -INCBIN "gfx/font/overworld.2bpp" - -.OverworldFontSpaceGFX: -INCBIN "gfx/font/overworld_space.2bpp" diff --git a/engine/routines/placegraphic.asm b/engine/routines/placegraphic.asm deleted file mode 100644 index 21b914950..000000000 --- a/engine/routines/placegraphic.asm +++ /dev/null @@ -1,55 +0,0 @@ -PlaceGraphic: ; 2ef6e -; Fill wBoxAlignment-aligned box width b height c -; with iterating tile starting from hGraphicStartTile at hl. - - ld de, SCREEN_WIDTH - - ld a, [wBoxAlignment] - and a - jr nz, .right - - ld a, [hGraphicStartTile] -.x1 - push bc - push hl - -.y1 - ld [hl], a - add hl, de - inc a - dec c - jr nz, .y1 - - pop hl - inc hl - pop bc - dec b - jr nz, .x1 - ret - -.right -; Right-aligned. - push bc - ld b, 0 - dec c - add hl, bc - pop bc - - ld a, [hGraphicStartTile] -.x2 - push bc - push hl - -.y2 - ld [hl], a - add hl, de - inc a - dec c - jr nz, .y2 - - pop hl - dec hl - pop bc - dec b - jr nz, .x2 - ret diff --git a/engine/routines/printhoursmins.asm b/engine/routines/printhoursmins.asm deleted file mode 100644 index eb7dc1619..000000000 --- a/engine/routines/printhoursmins.asm +++ /dev/null @@ -1,63 +0,0 @@ -Unreferenced_Function1dd6a9: ; 1dd6a9 - ld a, b - ld b, c - ld c, a - push bc - push de - ld hl, sp+$2 - ld d, h - ld e, l - pop hl - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - pop bc - ret - -PrintHoursMins: ; 1dd6bb (77:56bb) -; Hours in b, minutes in c - ld a, b - cp 12 - push af - jr c, .AM - jr z, .PM - sub 12 - jr .PM -.AM: - or a - jr nz, .PM - ld a, 12 -.PM: - ld b, a -; Crazy stuff happening with the stack - push bc - ld hl, sp+$1 - push de - push hl - pop de - pop hl - ld [hl], " " - lb bc, 1, 2 - call PrintNum - ld [hl], ":" - inc hl - ld d, h - ld e, l - ld hl, sp+$0 - push de - push hl - pop de - pop hl - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - pop bc - ld de, String_AM - pop af - jr c, .place_am_pm - ld de, String_PM -.place_am_pm - inc hl - call PlaceString - ret - -String_AM: db "AM@" ; 1dd6fc -String_PM: db "PM@" ; 1dd6ff diff --git a/engine/routines/printitemdescription.asm b/engine/routines/printitemdescription.asm deleted file mode 100644 index 2a9007b97..000000000 --- a/engine/routines/printitemdescription.asm +++ /dev/null @@ -1,31 +0,0 @@ -PrintItemDescription: ; 0x1c8955 -; Print the description for item [wCurSpecies] at de. - - ld a, [wCurSpecies] - cp TM01 - jr c, .not_a_tm - - ld [wCurItem], a - push de - farcall GetTMHMItemMove - pop hl - ld a, [wd265] - ld [wCurSpecies], a - predef PrintMoveDesc - ret - -.not_a_tm - push de - ld hl, ItemDescriptions - ld a, [wCurSpecies] - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - pop hl - jp PlaceString -; 0x1c8987 diff --git a/engine/routines/switchpartymons.asm b/engine/routines/switchpartymons.asm deleted file mode 100644 index b01178417..000000000 --- a/engine/routines/switchpartymons.asm +++ /dev/null @@ -1,145 +0,0 @@ -_SwitchPartyMons: - ld a, [wd0e3] - dec a - ld [wBuffer3], a - ld b, a - ld a, [wMenuCursorY] - dec a - ld [wBuffer2], a - cp b - jr z, .skip - call .SwapMonAndMail - ld a, [wBuffer3] - call .ClearSprite - ld a, [wBuffer2] - call .ClearSprite -.skip - ret - -.ClearSprite: ; 50f34 (14:4f34) - push af - hlcoord 0, 1 - ld bc, 2 * SCREEN_WIDTH - call AddNTimes - ld bc, 2 * SCREEN_WIDTH - ld a, " " - call ByteFill - pop af - ld hl, wVirtualOAMSprite00 - ld bc, 4 * SPRITEOAMSTRUCT_LENGTH - call AddNTimes - ld de, SPRITEOAMSTRUCT_LENGTH - ld c, 4 -.gfx_loop - ld [hl], SCREEN_WIDTH_PX ; y (off-screen) - add hl, de - dec c - jr nz, .gfx_loop - ld de, SFX_SWITCH_POKEMON - call WaitPlaySFX - ret - -.SwapMonAndMail: ; 50f62 (14:4f62) - push hl - push de - push bc - ld bc, wPartySpecies - ld a, [wBuffer2] - ld l, a - ld h, $0 - add hl, bc - ld d, h - ld e, l - ld a, [wBuffer3] - ld l, a - ld h, $0 - add hl, bc - ld a, [hl] - push af - ld a, [de] - ld [hl], a - pop af - ld [de], a - ld a, [wBuffer2] - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - push hl - ld de, wd002 - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - ld a, [wBuffer3] - ld hl, wPartyMon1 - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - pop de - push hl - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - pop de - ld hl, wd002 - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - ld a, [wBuffer2] - ld hl, wPartyMonOT - call SkipNames - push hl - call .CopyNameTowd002 - ld a, [wBuffer3] - ld hl, wPartyMonOT - call SkipNames - pop de - push hl - call .CopyName - pop de - ld hl, wd002 - call .CopyName - ld hl, wPartyMonNicknames - ld a, [wBuffer2] - call SkipNames - push hl - call .CopyNameTowd002 - ld hl, wPartyMonNicknames - ld a, [wBuffer3] - call SkipNames - pop de - push hl - call .CopyName - pop de - ld hl, wd002 - call .CopyName - ld hl, sPartyMail - ld a, [wBuffer2] - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - push hl - ld de, wd002 - ld bc, MAIL_STRUCT_LENGTH - ld a, BANK(sPartyMail) - call GetSRAMBank - call CopyBytes - ld hl, sPartyMail - ld a, [wBuffer3] - ld bc, MAIL_STRUCT_LENGTH - call AddNTimes - pop de - push hl - ld bc, MAIL_STRUCT_LENGTH - call CopyBytes - pop de - ld hl, wd002 - ld bc, MAIL_STRUCT_LENGTH - call CopyBytes - call CloseSRAM - pop bc - pop de - pop hl - ret - -.CopyNameTowd002: ; 51036 (14:5036) - ld de, wd002 - -.CopyName: ; 51039 (14:5039) - ld bc, NAME_LENGTH - call CopyBytes - ret diff --git a/engine/routines/trademonfrontpic.asm b/engine/routines/trademonfrontpic.asm deleted file mode 100644 index d5f7b55de..000000000 --- a/engine/routines/trademonfrontpic.asm +++ /dev/null @@ -1,38 +0,0 @@ -GetTrademonFrontpic: ; 4d7fd - ld a, [wOTTrademonSpecies] - ld hl, wOTTrademonDVs - ld de, vTiles2 - push de - push af - predef GetUnownLetter - pop af - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call GetBaseData - pop de - predef GetAnimatedFrontpic - ret - -AnimateTrademonFrontpic: ; 4d81e - ld a, [wOTTrademonSpecies] - call IsAPokemon - ret c - farcall ShowOTTrademonStats - ld a, [wOTTrademonSpecies] - ld [wCurPartySpecies], a - ld a, [wOTTrademonDVs] - ld [wTempMonDVs], a - ld a, [wOTTrademonDVs + 1] - ld [wTempMonDVs + 1], a - ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - farcall TradeAnim_ShowGetmonFrontpic - ld a, [wOTTrademonSpecies] - ld [wCurPartySpecies], a - hlcoord 7, 2 - ld d, $0 - ld e, ANIM_MON_TRADE - predef AnimateFrontpic - ret diff --git a/engine/routines/updateitemdescription.asm b/engine/routines/updateitemdescription.asm deleted file mode 100644 index fdb1e864d..000000000 --- a/engine/routines/updateitemdescription.asm +++ /dev/null @@ -1,13 +0,0 @@ -UpdateItemDescription: ; 0x244c3 - ld a, [wMenuSelection] - ld [wCurSpecies], a - hlcoord 0, 12 - ld b, 4 - ld c, SCREEN_WIDTH - 2 - call TextBox - ld a, [wMenuSelection] - cp -1 - ret z - decoord 1, 14 - farcall PrintItemDescription - ret diff --git a/engine/rtc.asm b/engine/rtc.asm deleted file mode 100755 index 37e24c1ed..000000000 --- a/engine/rtc.asm +++ /dev/null @@ -1,209 +0,0 @@ -Unreferenced_StopRTC: - ld a, SRAM_ENABLE - ld [MBC3SRamEnable], a - call LatchClock - ld a, RTC_DH - ld [MBC3SRamBank], a - ld a, [MBC3RTC] - set 6, a ; halt - ld [MBC3RTC], a - call CloseSRAM - ret -; 14019 - -StartRTC: ; 14019 - ld a, SRAM_ENABLE - ld [MBC3SRamEnable], a - call LatchClock - ld a, RTC_DH - ld [MBC3SRamBank], a - ld a, [MBC3RTC] - res 6, a ; halt - ld [MBC3RTC], a - call CloseSRAM - ret -; 14032 - -GetTimeOfDay:: ; 14032 -; get time of day based on the current hour - ld a, [hHours] ; hour - ld hl, TimesOfDay - -.check -; if we're within the given time period, -; get the corresponding time of day - cp [hl] - jr c, .match -; else, get the next entry - inc hl - inc hl -; try again - jr .check - -.match -; get time of day - inc hl - ld a, [hl] - ld [wTimeOfDay], a - ret -; 14044 - -TimesOfDay: ; 14044 -; hours for the time of day -; 0400-0959 morn | 1000-1759 day | 1800-0359 nite - db MORN_HOUR, NITE_F - db DAY_HOUR, MORN_F - db NITE_HOUR, DAY_F - db MAX_HOUR, NITE_F - db -1, MORN_F -; 1404e - -Unreferenced_1404e: - db 20, NITE_F - db 40, MORN_F - db 60, DAY_F - db -1, MORN_F -; 14056 - -StageRTCTimeForSave: ; 14056 - call UpdateTime - ld hl, wRTC - ld a, [wCurDay] - ld [hli], a - ld a, [hHours] - ld [hli], a - ld a, [hMinutes] - ld [hli], a - ld a, [hSeconds] - ld [hli], a - ret -; 1406a - -SaveRTC: ; 1406a - ld a, $a - ld [MBC3SRamEnable], a - call LatchClock - ld hl, MBC3RTC - ld a, $c - ld [MBC3SRamBank], a - res 7, [hl] - ld a, BANK(sRTCStatusFlags) - ld [MBC3SRamBank], a - xor a - ld [sRTCStatusFlags], a - call CloseSRAM - ret -; 14089 - -StartClock:: ; 14089 - call GetClock - call Function1409b - call FixDays - jr nc, .skip_set - ; bit 5: Day count exceeds 139 - ; bit 6: Day count exceeds 255 - call RecordRTCStatus ; set flag on sRTCStatusFlags - -.skip_set - call StartRTC - ret -; 1409b - -Function1409b: ; 1409b - ld hl, hRTCDayHi - bit 7, [hl] - jr nz, .set_bit_7 - bit 6, [hl] - jr nz, .set_bit_7 - xor a - ret - -.set_bit_7 - ; Day count exceeds 16383 - ld a, %10000000 - call RecordRTCStatus ; set bit 7 on sRTCStatusFlags - ret -; 140ae - -Function140ae: ; 140ae - call CheckRTCStatus - ld c, a - and %11000000 ; Day count exceeded 255 or 16383 - jr nz, .time_overflow - - ld a, c - and %00100000 ; Day count exceeded 139 - jr z, .dont_update - - call UpdateTime - ld a, [wRTC + 0] - ld b, a - ld a, [wCurDay] - cp b - jr c, .dont_update - -.time_overflow - farcall ClearDailyTimers - farcall Function170923 -; mobile - ld a, 5 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 - call GetSRAMBank - ld a, [$aa8c] ; address of MBC30 bank - inc a - ld [$aa8c], a ; address of MBC30 bank - ld a, [$b2fa] ; address of MBC30 bank - inc a - ld [$b2fa], a ; address of MBC30 bank - call CloseSRAM - ret - -.dont_update - xor a - ret -; 140ed - -_InitTime:: ; 140ed - call GetClock - call FixDays - ld hl, hRTCSeconds - ld de, wStartSecond - - ld a, [wStringBuffer2 + 3] - sub [hl] - dec hl - jr nc, .okay_secs - add 60 -.okay_secs - ld [de], a - dec de - - ld a, [wStringBuffer2 + 2] - sbc [hl] - dec hl - jr nc, .okay_mins - add 60 -.okay_mins - ld [de], a - dec de - - ld a, [wStringBuffer2 + 1] - sbc [hl] - dec hl - jr nc, .okay_hrs - add 24 -.okay_hrs - ld [de], a - dec de - - ld a, [wStringBuffer2] - sbc [hl] - dec hl - jr nc, .okay_days - add 140 - ld c, 7 - call SimpleDivide - -.okay_days - ld [de], a - ret -; 1412a diff --git a/engine/rtc/clock_reset.asm b/engine/rtc/clock_reset.asm new file mode 100755 index 000000000..c05129349 --- /dev/null +++ b/engine/rtc/clock_reset.asm @@ -0,0 +1,254 @@ + +ResetClock_GetWraparoundTime: ; 20000 (8:4000) + push hl + dec a + ld e, a + ld d, 0 + ld hl, .WrapAroundTimes +rept 4 + add hl, de +endr + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld b, [hl] + inc hl + ld c, [hl] + pop hl + ret +; 20015 (8:4015) + +.WrapAroundTimes: ; 20015 + dw wBuffer4 + db 7, 4 + + dw wBuffer5 + db 24, 12 + + dw wBuffer6 + db 60, 15 +; 20021 + +RestartClock: ; 20021 (8:4021) +; If we're here, we had an RTC overflow. + ld hl, .Text_ClockTimeMayBeWrong + call PrintText + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call LoadStandardMenuHeader + call ClearTileMap + ld hl, .Text_SetWithControlPad + call PrintText + call .SetClock + call ExitMenu + pop bc + ld hl, wOptions + ld [hl], b + ld c, a + ret +; 20047 (8:4047) + +.Text_ClockTimeMayBeWrong: ; 0x20047 + ; The clock's time may be wrong. Please reset the time. + text_jump UnknownText_0x1c40e6 + db "@" +; 0x2004c + +.Text_SetWithControlPad: ; 0x2004c + ; Set with the Control Pad. Confirm: A Button Cancel: B Button + text_jump UnknownText_0x1c411c + db "@" +; 0x20051 + +.SetClock: ; 20051 (8:4051) + ld a, 1 + ld [wBuffer1], a ; which digit + ld [wBuffer2], a + ld a, 8 + ld [wBuffer3], a + call UpdateTime + call GetWeekday + ld [wBuffer4], a + ld a, [hHours] + ld [wBuffer5], a + ld a, [hMinutes] + ld [wBuffer6], a + +.loop + call .joy_loop + jr nc, .loop + and a + ret nz + call .PrintTime + ld hl, .Text_IsThisOK + call PrintText + call YesNoBox + jr c, .cancel + ld a, [wBuffer4] + ld [wStringBuffer2], a + ld a, [wBuffer5] + ld [wStringBuffer2 + 1], a + ld a, [wBuffer6] + ld [wStringBuffer2 + 2], a + xor a + ld [wStringBuffer2 + 3], a + call InitTime + call .PrintTime + ld hl, .Text_ClockReset + call PrintText + call WaitPressAorB_BlinkCursor + xor a + ret + +.cancel + ld a, $1 + ret +; 200b0 (8:40b0) + +.Text_IsThisOK: ; 0x200b0 + ; Is this OK? + text_jump UnknownText_0x1c415b + db "@" +; 0x200b5 + +.Text_ClockReset: ; 0x200b5 + ; The clock has been reset. + text_jump UnknownText_0x1c4168 + db "@" +; 0x200ba + +.joy_loop + call JoyTextDelay_ForcehJoyDown + ld c, a + push af + call .PrintTime + pop af + bit 0, a + jr nz, .press_A + bit 1, a + jr nz, .press_B + bit 6, a + jr nz, .pressed_up + bit 7, a + jr nz, .pressed_down + bit 5, a + jr nz, .pressed_left + bit 4, a + jr nz, .pressed_right + jr .joy_loop + +.press_A + ld a, $0 + scf + ret + +.press_B + ld a, $1 + scf + ret + +.pressed_up + ld a, [wBuffer1] + call ResetClock_GetWraparoundTime + ld a, [de] + inc a + ld [de], a + cp b + jr c, .done_scroll + ld a, $0 + ld [de], a + jr .done_scroll + +.pressed_down + ld a, [wBuffer1] + call ResetClock_GetWraparoundTime + ld a, [de] + dec a + ld [de], a + cp -1 + jr nz, .done_scroll + ld a, b + dec a + ld [de], a + jr .done_scroll + +.pressed_left + ld hl, wBuffer1 + dec [hl] + jr nz, .done_scroll + ld [hl], $3 + jr .done_scroll + +.pressed_right + ld hl, wBuffer1 + inc [hl] + ld a, [hl] + cp $4 + jr c, .done_scroll + ld [hl], $1 + +.done_scroll + xor a + ret + +.PrintTime: ; 2011f (8:411f) + hlcoord 0, 5 + ld b, 5 + ld c, 18 + call TextBox + decoord 1, 8 + ld a, [wBuffer4] + ld b, a + farcall PrintDayOfWeek + ld a, [wBuffer5] + ld b, a + ld a, [wBuffer6] + ld c, a + decoord 11, 8 + farcall PrintHoursMins + ld a, [wBuffer2] + lb de, " ", " " + call .PlaceChars + ld a, [wBuffer1] + lb de, "▲", "▼" + call .PlaceChars + ld a, [wBuffer1] + ld [wBuffer2], a + ret +; 20160 (8:4160) + +.unreferenced ; 20160 +; unused + ld a, [wBuffer3] + ld b, a + call Coord2Tile + ret +; 20168 + +.PlaceChars: ; 20168 (8:4168) + push de + call ResetClock_GetWraparoundTime + ld a, [wBuffer3] + dec a + ld b, a + call Coord2Tile + pop de + ld [hl], d + ld bc, 2 * SCREEN_WIDTH + add hl, bc + ld [hl], e + ret +; 2017c (8:417c) + +UnreferencedString_HourJP: ; 2017c +; unused + db "じ@" ; HR +; 2017e + +UnreferencedString_MinuteJP: ; 2017e +; unused + db "ふん@" ; MIN +; 20181 diff --git a/engine/rtc/delete_save_change_clock.asm b/engine/rtc/delete_save_change_clock.asm new file mode 100755 index 000000000..431dc6034 --- /dev/null +++ b/engine/rtc/delete_save_change_clock.asm @@ -0,0 +1,296 @@ +_ResetClock: ; 4d3b1 + farcall BlankScreen + ld b, SCGB_DIPLOMA + call GetSGBLayout + call LoadStandardFont + call LoadFontsExtra + ld de, MUSIC_MAIN_MENU + call PlayMusic + ld hl, .text_askreset + call PrintText + ld hl, .NoYes_MenuHeader + call CopyMenuHeader + call VerticalMenu + ret c + ld a, [wMenuCursorY] + cp $1 + ret z + call ClockResetPassword + jr c, .wrongpassword + ld a, BANK(sRTCStatusFlags) + call GetSRAMBank + ld a, $80 + ld [sRTCStatusFlags], a + call CloseSRAM + ld hl, .text_okay + call PrintText + ret + +.wrongpassword + ld hl, .text_wrong + call PrintText + ret + +.text_okay ; 0x4d3fe + ; Password OK. Select CONTINUE & reset settings. + text_jump UnknownText_0x1c55db + db "@" + +.text_wrong ; 0x4d403 + ; Wrong password! + text_jump UnknownText_0x1c560b + db "@" + +.text_askreset ; 0x4d408 + ; Reset the clock? + text_jump UnknownText_0x1c561c + db "@" + +.NoYes_MenuHeader: ; 0x4d40d + db 0 ; flags + menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .NoYes_MenuData + db 1 ; default option + +.NoYes_MenuData: ; 0x4d415 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "NO@" + db "YES@" + +ClockResetPassword: ; 4d41e + call .CalculatePassword + push de + ld hl, wStringBuffer2 + ld bc, 5 + xor a + call ByteFill + ld a, $4 + ld [wStringBuffer2 + 5], a + ld hl, .pleaseenterpasswordtext + call PrintText +.loop + call .updateIDdisplay +.loop2 + call JoyTextDelay + ld a, [hJoyLast] + ld b, a + and A_BUTTON + jr nz, .confirm + ld a, b + and D_PAD + jr z, .loop2 + call .dpadinput + ld c, 3 + call DelayFrames + jr .loop + +.confirm + call .ConvertDecIDToBytes + pop de + ld a, e + cp l + jr nz, .nope + ld a, d + cp h + jr nz, .nope + and a + ret + +.nope + scf + ret + +.pleaseenterpasswordtext ; 0x4d463 + ; Please enter the password. + text_jump UnknownText_0x1c562e + db "@" + +.updateIDdisplay ; 4d468 + hlcoord 14, 15 + ld de, wStringBuffer2 + ld c, 5 +.loop3 + ld a, [de] + add "0" + ld [hli], a + inc de + dec c + jr nz, .loop3 + hlcoord 14, 16 + ld bc, 5 + ld a, " " + call ByteFill + hlcoord 14, 16 + ld a, [wStringBuffer2 + 5] + ld e, a + ld d, $0 + add hl, de + ld [hl], "▲" + ret + +.dpadinput ; 4d490 + ld a, b + and D_LEFT + jr nz, .left + ld a, b + and D_RIGHT + jr nz, .right + ld a, b + and D_UP + jr nz, .up + ld a, b + and D_DOWN + jr nz, .down + ret + +.left + ld a, [wStringBuffer2 + 5] + and a + ret z + dec a + ld [wStringBuffer2 + 5], a + ret + +.right + ld a, [wStringBuffer2 + 5] + cp $4 + ret z + inc a + ld [wStringBuffer2 + 5], a + ret + +.up + call .getcurrentdigit + ld a, [hl] + cp 9 + jr z, .wraparound_up + inc a + ld [hl], a + ret + +.wraparound_up + ld [hl], $0 + ret + +.down + call .getcurrentdigit + ld a, [hl] + and a + jr z, .wraparound_down + dec a + ld [hl], a + ret + +.wraparound_down + ld [hl], 9 + ret + +.getcurrentdigit ; 4d4d5 + ld a, [wStringBuffer2 + 5] + ld e, a + ld d, $0 + ld hl, wStringBuffer2 + add hl, de + ret + +.ConvertDecIDToBytes: ; 4d4e0 + ld hl, 0 + ld de, wStringBuffer2 + 4 + ld bc, 1 + call .ConvertToBytes + ld bc, 10 + call .ConvertToBytes + ld bc, 100 + call .ConvertToBytes + ld bc, 1000 + call .ConvertToBytes + ld bc, 10000 +.ConvertToBytes: ; 4d501 + ld a, [de] + dec de + push hl + ld hl, 0 + call AddNTimes + ld c, l + ld b, h + pop hl + add hl, bc + ret + +.CalculatePassword: ; 4d50f + ld a, BANK(sPlayerData) + call GetSRAMBank + ld de, 0 + ld hl, sPlayerData + (wPlayerID - wPlayerData) + ld c, $2 + call .ComponentFromNumber + ld hl, sPlayerData + (wPlayerName - wPlayerData) + ld c, NAME_LENGTH_JAPANESE - 1 + call .ComponentFromString + ld hl, sPlayerData + (wMoney - wPlayerData) + ld c, $3 + call .ComponentFromNumber + call CloseSRAM + ret + +.ComponentFromNumber: ; 4d533 + ld a, [hli] + add e + ld e, a + ld a, $0 + adc d + ld d, a + dec c + jr nz, .ComponentFromNumber + ret + +.ComponentFromString: ; 4d53e + ld a, [hli] + cp "@" + ret z + add e + ld e, a + ld a, $0 + adc d + ld d, a + dec c + jr nz, .ComponentFromString + ret + +_DeleteSaveData: ; 4d54c + farcall BlankScreen + ld b, SCGB_DIPLOMA + call GetSGBLayout + call LoadStandardFont + call LoadFontsExtra + ld de, MUSIC_MAIN_MENU + call PlayMusic + ld hl, .Text_ClearAllSaveData + call PrintText + ld hl, .NoYesMenuHeader + call CopyMenuHeader + call VerticalMenu + ret c + ld a, [wMenuCursorY] + cp $1 + ret z + farcall EmptyAllSRAMBanks + ret + +.Text_ClearAllSaveData: ; 0x4d580 + ; Clear all save data? + text_jump UnknownText_0x1c564a + db "@" + +.NoYesMenuHeader: ; 0x4d585 + db 0 ; flags + menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option + +.MenuData: ; 0x4d58d + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "NO@" + db "YES@" diff --git a/engine/rtc/printhoursmins.asm b/engine/rtc/printhoursmins.asm new file mode 100644 index 000000000..eb7dc1619 --- /dev/null +++ b/engine/rtc/printhoursmins.asm @@ -0,0 +1,63 @@ +Unreferenced_Function1dd6a9: ; 1dd6a9 + ld a, b + ld b, c + ld c, a + push bc + push de + ld hl, sp+$2 + ld d, h + ld e, l + pop hl + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + pop bc + ret + +PrintHoursMins: ; 1dd6bb (77:56bb) +; Hours in b, minutes in c + ld a, b + cp 12 + push af + jr c, .AM + jr z, .PM + sub 12 + jr .PM +.AM: + or a + jr nz, .PM + ld a, 12 +.PM: + ld b, a +; Crazy stuff happening with the stack + push bc + ld hl, sp+$1 + push de + push hl + pop de + pop hl + ld [hl], " " + lb bc, 1, 2 + call PrintNum + ld [hl], ":" + inc hl + ld d, h + ld e, l + ld hl, sp+$0 + push de + push hl + pop de + pop hl + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + pop bc + ld de, String_AM + pop af + jr c, .place_am_pm + ld de, String_PM +.place_am_pm + inc hl + call PlaceString + ret + +String_AM: db "AM@" ; 1dd6fc +String_PM: db "PM@" ; 1dd6ff diff --git a/engine/rtc/rtc.asm b/engine/rtc/rtc.asm new file mode 100755 index 000000000..37e24c1ed --- /dev/null +++ b/engine/rtc/rtc.asm @@ -0,0 +1,209 @@ +Unreferenced_StopRTC: + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + call LatchClock + ld a, RTC_DH + ld [MBC3SRamBank], a + ld a, [MBC3RTC] + set 6, a ; halt + ld [MBC3RTC], a + call CloseSRAM + ret +; 14019 + +StartRTC: ; 14019 + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + call LatchClock + ld a, RTC_DH + ld [MBC3SRamBank], a + ld a, [MBC3RTC] + res 6, a ; halt + ld [MBC3RTC], a + call CloseSRAM + ret +; 14032 + +GetTimeOfDay:: ; 14032 +; get time of day based on the current hour + ld a, [hHours] ; hour + ld hl, TimesOfDay + +.check +; if we're within the given time period, +; get the corresponding time of day + cp [hl] + jr c, .match +; else, get the next entry + inc hl + inc hl +; try again + jr .check + +.match +; get time of day + inc hl + ld a, [hl] + ld [wTimeOfDay], a + ret +; 14044 + +TimesOfDay: ; 14044 +; hours for the time of day +; 0400-0959 morn | 1000-1759 day | 1800-0359 nite + db MORN_HOUR, NITE_F + db DAY_HOUR, MORN_F + db NITE_HOUR, DAY_F + db MAX_HOUR, NITE_F + db -1, MORN_F +; 1404e + +Unreferenced_1404e: + db 20, NITE_F + db 40, MORN_F + db 60, DAY_F + db -1, MORN_F +; 14056 + +StageRTCTimeForSave: ; 14056 + call UpdateTime + ld hl, wRTC + ld a, [wCurDay] + ld [hli], a + ld a, [hHours] + ld [hli], a + ld a, [hMinutes] + ld [hli], a + ld a, [hSeconds] + ld [hli], a + ret +; 1406a + +SaveRTC: ; 1406a + ld a, $a + ld [MBC3SRamEnable], a + call LatchClock + ld hl, MBC3RTC + ld a, $c + ld [MBC3SRamBank], a + res 7, [hl] + ld a, BANK(sRTCStatusFlags) + ld [MBC3SRamBank], a + xor a + ld [sRTCStatusFlags], a + call CloseSRAM + ret +; 14089 + +StartClock:: ; 14089 + call GetClock + call Function1409b + call FixDays + jr nc, .skip_set + ; bit 5: Day count exceeds 139 + ; bit 6: Day count exceeds 255 + call RecordRTCStatus ; set flag on sRTCStatusFlags + +.skip_set + call StartRTC + ret +; 1409b + +Function1409b: ; 1409b + ld hl, hRTCDayHi + bit 7, [hl] + jr nz, .set_bit_7 + bit 6, [hl] + jr nz, .set_bit_7 + xor a + ret + +.set_bit_7 + ; Day count exceeds 16383 + ld a, %10000000 + call RecordRTCStatus ; set bit 7 on sRTCStatusFlags + ret +; 140ae + +Function140ae: ; 140ae + call CheckRTCStatus + ld c, a + and %11000000 ; Day count exceeded 255 or 16383 + jr nz, .time_overflow + + ld a, c + and %00100000 ; Day count exceeded 139 + jr z, .dont_update + + call UpdateTime + ld a, [wRTC + 0] + ld b, a + ld a, [wCurDay] + cp b + jr c, .dont_update + +.time_overflow + farcall ClearDailyTimers + farcall Function170923 +; mobile + ld a, 5 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + ld a, [$aa8c] ; address of MBC30 bank + inc a + ld [$aa8c], a ; address of MBC30 bank + ld a, [$b2fa] ; address of MBC30 bank + inc a + ld [$b2fa], a ; address of MBC30 bank + call CloseSRAM + ret + +.dont_update + xor a + ret +; 140ed + +_InitTime:: ; 140ed + call GetClock + call FixDays + ld hl, hRTCSeconds + ld de, wStartSecond + + ld a, [wStringBuffer2 + 3] + sub [hl] + dec hl + jr nc, .okay_secs + add 60 +.okay_secs + ld [de], a + dec de + + ld a, [wStringBuffer2 + 2] + sbc [hl] + dec hl + jr nc, .okay_mins + add 60 +.okay_mins + ld [de], a + dec de + + ld a, [wStringBuffer2 + 1] + sbc [hl] + dec hl + jr nc, .okay_hrs + add 24 +.okay_hrs + ld [de], a + dec de + + ld a, [wStringBuffer2] + sbc [hl] + dec hl + jr nc, .okay_days + add 140 + ld c, 7 + call SimpleDivide + +.okay_days + ld [de], a + ret +; 1412a diff --git a/engine/rtc/timeset.asm b/engine/rtc/timeset.asm new file mode 100755 index 000000000..eda3094e1 --- /dev/null +++ b/engine/rtc/timeset.asm @@ -0,0 +1,773 @@ +TIMESET_UP_ARROW EQUS "\"♂\"" ; $ef +TIMESET_DOWN_ARROW EQUS "\"♀\"" ; $f5 + +InitClock: ; 90672 (24:4672) +; Ask the player to set the time. + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + + ld a, $0 + ld [wSpriteUpdatesEnabled], a + ld a, $10 + ld [wMusicFade], a + ld a, LOW(MUSIC_NONE) + ld [wMusicFadeID], a + ld a, HIGH(MUSIC_NONE) + ld [wMusicFadeID + 1], a + ld c, 8 + call DelayFrames + call RotateFourPalettesLeft + call ClearTileMap + call ClearSprites + ld b, SCGB_DIPLOMA + call GetSGBLayout + xor a + ld [hBGMapMode], a + call LoadStandardFont + ld de, TimeSetBackgroundGFX + ld hl, vTiles2 tile $00 + lb bc, BANK(TimeSetBackgroundGFX), 1 + call Request1bpp + ld de, TimeSetUpArrowGFX + ld hl, vTiles2 tile $01 + lb bc, BANK(TimeSetUpArrowGFX), 1 + call Request1bpp + ld de, TimeSetDownArrowGFX + ld hl, vTiles2 tile $02 + lb bc, BANK(TimeSetDownArrowGFX), 1 + call Request1bpp + call .ClearScreen + call WaitBGMap + call RotateFourPalettesRight + ld hl, Text_WokeUpOak + call PrintText + ld hl, wTimeSetBuffer + ld bc, 50 + xor a + call ByteFill + ld a, 10 ; default hour = 10 AM + ld [wInitHourBuffer], a + +.loop + ld hl, Text_WhatTimeIsIt + call PrintText + hlcoord 3, 7 + ld b, 2 + ld c, 15 + call TextBox + hlcoord 11, 7 + ld [hl], $1 + hlcoord 11, 10 + ld [hl], $2 + hlcoord 4, 9 + call DisplayHourOClock + ld c, 10 + call DelayFrames + +.SetHourLoop: + call JoyTextDelay + call SetHour + jr nc, .SetHourLoop + + ld a, [wInitHourBuffer] + ld [wStringBuffer2 + 1], a + call .ClearScreen + ld hl, Text_WhatHrs + call PrintText + call YesNoBox + jr nc, .HourIsSet + call .ClearScreen + jr .loop + +.HourIsSet: + ld hl, Text_HowManyMinutes + call PrintText + hlcoord 11, 7 + lb bc, 2, 7 + call TextBox + hlcoord 15, 7 + ld [hl], $1 + hlcoord 15, 10 + ld [hl], $2 + hlcoord 12, 9 + call DisplayMinutesWithMinString + ld c, 10 + call DelayFrames + +.SetMinutesLoop: + call JoyTextDelay + call SetMinutes + jr nc, .SetMinutesLoop + + ld a, [wInitMinuteBuffer] + ld [wStringBuffer2 + 2], a + call .ClearScreen + ld hl, Text_WhoaMins + call PrintText + call YesNoBox + jr nc, .MinutesAreSet + call .ClearScreen + jr .HourIsSet + +.MinutesAreSet: + call InitTimeOfDay + ld hl, OakText_ResponseToSetTime + call PrintText + call WaitPressAorB_BlinkCursor + pop af + ld [hInMenu], a + ret + +.ClearScreen: ; 90783 (24:4783) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + ld a, $1 + ld [hBGMapMode], a + ret + +SetHour: ; 90795 (24:4795) + ld a, [hJoyPressed] + and A_BUTTON + jr nz, .Confirm + + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .up + ld a, [hl] + and D_DOWN + jr nz, .down + call DelayFrame + and a + ret + +.down + ld hl, wInitHourBuffer + ld a, [hl] + and a + jr nz, .DecreaseThroughMidnight + ld a, 23 + 1 +.DecreaseThroughMidnight: + dec a + ld [hl], a + jr .okay + +.up + ld hl, wInitHourBuffer + ld a, [hl] + cp 23 + jr c, .AdvanceThroughMidnight + ld a, -1 +.AdvanceThroughMidnight: + inc a + ld [hl], a + +.okay + hlcoord 4, 9 + ld a, " " + ld bc, 15 + call ByteFill + hlcoord 4, 9 + call DisplayHourOClock + call WaitBGMap + and a + ret + +.Confirm: + scf + ret + +DisplayHourOClock: ; 907de (24:47de) + push hl + ld a, [wInitHourBuffer] + ld c, a + ld e, l + ld d, h + call PrintHour + inc hl + ld de, String_oclock + call PlaceString + pop hl + ret +; 907f1 (24:47f1) + +UnreferencedFunction907f1: ; 907f1 + ld h, d + ld l, e + push hl + call DisplayHourOClock + pop de + inc de + inc de + ld a, ":" + ld [de], a + inc de + push de + ld hl, 3 + add hl, de + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + pop hl + call DisplayMinutesWithMinString + inc hl + inc hl + inc hl + ret +; 90810 + +SetMinutes: ; 90810 (24:4810) + ld a, [hJoyPressed] + and A_BUTTON + jr nz, .a_button + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .d_up + ld a, [hl] + and D_DOWN + jr nz, .d_down + call DelayFrame + and a + ret + +.d_down + ld hl, wInitMinuteBuffer + ld a, [hl] + and a + jr nz, .decrease + ld a, 59 + 1 +.decrease + dec a + ld [hl], a + jr .finish_dpad + +.d_up + ld hl, wInitMinuteBuffer + ld a, [hl] + cp 59 + jr c, .increase + ld a, -1 +.increase + inc a + ld [hl], a +.finish_dpad + hlcoord 12, 9 + ld a, " " + ld bc, 7 + call ByteFill + hlcoord 12, 9 + call DisplayMinutesWithMinString + call WaitBGMap + and a + ret +.a_button + scf + ret + +DisplayMinutesWithMinString: ; 90859 (24:4859) + ld de, wInitMinuteBuffer + call PrintTwoDigitNumberRightAlign + inc hl + ld de, String_min + call PlaceString + ret + +PrintTwoDigitNumberRightAlign: ; 90867 (24:4867) + push hl + ld a, " " + ld [hli], a + ld [hl], a + pop hl + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + ret +; 90874 (24:4874) + +Text_WokeUpOak: ; 0x90874 + ; Zzz… Hm? Wha…? You woke me up! Will you check the clock for me? + text_jump UnknownText_0x1bc29c + db "@" +; 0x90879 + +Text_WhatTimeIsIt: ; 0x90879 + ; What time is it? + text_jump UnknownText_0x1bc2eb + db "@" +; 0x9087e + +String_oclock: + db "o'clock@" +; 90886 + +Text_WhatHrs: ; 0x90886 + ; What?@ @ + text_jump UnknownText_0x1bc2fd + start_asm + hlcoord 1, 16 + call DisplayHourOClock + ld hl, .QuestionMark + ret +; 90895 (24:4895) + +.QuestionMark: ; 0x90895 + ; ? + text_jump UnknownText_0x1bc305 + db "@" +; 0x9089a + +Text_HowManyMinutes: ; 0x9089a + ; How many minutes? + text_jump UnknownText_0x1bc308 + db "@" +; 0x9089f + +String_min: + db "min.@" +; 908a4 + +Text_WhoaMins: ; 0x908a4 + ; Whoa!@ @ + text_jump UnknownText_0x1bc31b + start_asm + hlcoord 7, 14 + call DisplayMinutesWithMinString + ld hl, .QuestionMark + ret +; 908b3 (24:48b3) + +.QuestionMark: ; 0x908b3 + ; ? + text_jump UnknownText_0x1bc323 + db "@" +; 0x908b8 + +OakText_ResponseToSetTime: ; 0x908b8 + start_asm + decoord 1, 14 + ld a, [wInitHourBuffer] + ld c, a + call PrintHour + ld [hl], ":" + inc hl + ld de, wInitMinuteBuffer + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld b, h + ld c, l + ld a, [wInitHourBuffer] + cp MORN_HOUR + jr c, .nite + cp DAY_HOUR + 1 + jr c, .morn + cp NITE_HOUR + jr c, .day +.nite: + ld hl, .sodark + ret +.morn: + ld hl, .overslept + ret +.day: + ld hl, .yikes + ret +; 908ec (24:48ec) + +.overslept ; 0x908ec + ; ! I overslept! + text_jump UnknownText_0x1bc326 + db "@" +; 0x908f1 + +.yikes ; 0x908f1 + ; ! Yikes! I over- slept! + text_jump UnknownText_0x1bc336 + db "@" +; 0x908f6 + +.sodark ; 0x908f6 + ; ! No wonder it's so dark! + text_jump UnknownText_0x1bc34f + db "@" +; 0x908fb + +TimeSetBackgroundGFX: ; 908fb +INCBIN "gfx/new_game/timeset_bg.1bpp" +TimeSetUpArrowGFX: ; 90903 +INCBIN "gfx/new_game/up_arrow.1bpp" +TimeSetDownArrowGFX: ; 9090b +INCBIN "gfx/new_game/down_arrow.1bpp" +; 90913 + +SetDayOfWeek: ; 90913 + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + ld de, TimeSetUpArrowGFX + ld hl, vTiles0 tile TIMESET_UP_ARROW + lb bc, BANK(TimeSetUpArrowGFX), 1 + call Request1bpp + ld de, TimeSetDownArrowGFX + ld hl, vTiles0 tile TIMESET_DOWN_ARROW + lb bc, BANK(TimeSetDownArrowGFX), 1 + call Request1bpp + xor a + ld [wTempDayOfWeek], a +.loop + hlcoord 0, 12 + lb bc, 4, 18 + call TextBox + call LoadStandardMenuHeader + ld hl, .WhatDayIsItText + call PrintText + hlcoord 9, 3 + ld b, 2 + ld c, 9 + call TextBox + hlcoord 14, 3 + ld [hl], TIMESET_UP_ARROW + hlcoord 14, 6 + ld [hl], TIMESET_DOWN_ARROW + hlcoord 10, 5 + call .PlaceWeekdayString + call ApplyTilemap + ld c, 10 + call DelayFrames +.loop2 + call JoyTextDelay + call .GetJoypadAction + jr nc, .loop2 + call ExitMenu + call UpdateSprites + ld hl, .ConfirmWeekdayText + call PrintText + call YesNoBox + jr c, .loop + ld a, [wTempDayOfWeek] + ld [wStringBuffer2], a + call InitDayOfWeek + call LoadStandardFont + pop af + ld [hInMenu], a + ret +; 90993 + +.GetJoypadAction: ; 90993 + ld a, [hJoyPressed] + and A_BUTTON + jr z, .not_A + scf + ret + +.not_A + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .d_up + ld a, [hl] + and D_DOWN + jr nz, .d_down + call DelayFrame + and a + ret + +.d_down + ld hl, wTempDayOfWeek + ld a, [hl] + and a + jr nz, .decrease + ld a, SATURDAY + 1 + +.decrease + dec a + ld [hl], a + jr .finish_dpad + +.d_up + ld hl, wTempDayOfWeek + ld a, [hl] + cp 6 + jr c, .increase + ld a, SUNDAY - 1 + +.increase + inc a + ld [hl], a + +.finish_dpad + xor a + ld [hBGMapMode], a + hlcoord 10, 4 + ld b, 2 + ld c, 9 + call ClearBox + hlcoord 10, 5 + call .PlaceWeekdayString + call WaitBGMap + and a + ret +; 909de + +.PlaceWeekdayString: ; 909de + push hl + ld a, [wTempDayOfWeek] + ld e, a + ld d, 0 + ld hl, .WeekdayStrings + add hl, de + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + call PlaceString + ret +; 909f2 + +.WeekdayStrings: ; 909f2 +; entries correspond to wCurDay constants (see constants/wram_constants.asm) + dw .Sunday + dw .Monday + dw .Tuesday + dw .Wednesday + dw .Thursday + dw .Friday + dw .Saturday + dw .Sunday + +.Sunday: db " SUNDAY@" +.Monday: db " MONDAY@" +.Tuesday: db " TUESDAY@" +.Wednesday: db "WEDNESDAY@" +.Thursday: db "THURSDAY@" +.Friday: db " FRIDAY@" +.Saturday: db "SATURDAY@" + + +.WhatDayIsItText: ; 0x90a3f + ; What day is it? + text_jump UnknownText_0x1bc369 + db "@" +; 0x90a44 + +.ConfirmWeekdayText: ; 0x90a44 + start_asm + hlcoord 1, 14 + call .PlaceWeekdayString + ld hl, .IsIt + ret +; 90a4f (24:4a4f) + +.IsIt: ; 0x90a4f + ; , is it? + text_jump UnknownText_0x1bc37a + db "@" +; 0x90a54 + +InitialSetDSTFlag: ; 90a54 + ld a, [wDST] + set 7, a + ld [wDST], a + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ld hl, .Text + call PlaceHLTextAtBC + ret +; 90a6c + +.Text: ; 90a6c + start_asm + call UpdateTime + ld a, [hHours] + ld b, a + ld a, [hMinutes] + ld c, a + decoord 1, 14 + farcall PrintHoursMins + ld hl, .DSTIsThatOK + ret +; 90a83 (24:4a83) + +.DSTIsThatOK: ; 0x90a83 + ; DST, is that OK? + text_jump Text_DSTIsThatOK + db "@" +; 0x90a88 + +InitialClearDSTFlag: ; 90a88 + ld a, [wDST] + res 7, a + ld [wDST], a + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ld hl, .Text + call PlaceHLTextAtBC + ret +; 90aa0 + +.Text: ; 90aa0 + start_asm + call UpdateTime + ld a, [hHours] + ld b, a + ld a, [hMinutes] + ld c, a + decoord 1, 14 + farcall PrintHoursMins + ld hl, .IsThatOK + ret +; 90ab7 + +.IsThatOK: ; 0x90ab7 + ; , is that OK? + text_jump UnknownText_0x1c5ff1 + db "@" +; 0x90abc + +DebugDisplayTime: ; 90abc + hlcoord 1, 14 + lb bc, 3, SCREEN_WIDTH - 2 + call ClearBox + ld hl, .Text + call PlaceHLTextAtBC + ret +; 90acc + +.Text: ; 0x90acc + start_asm + call UpdateTime + + hlcoord 1, 14 + ld [hl], "R" + inc hl + ld [hl], "T" + inc hl + ld [hl], " " + inc hl + + ld de, hRTCDayLo + call .PrintTime + + hlcoord 1, 16 + ld [hl], "D" + inc hl + ld [hl], "F" + inc hl + ld [hl], " " + inc hl + + ld de, wStartDay + call .PrintTime + + ld [hl], " " + inc hl + + ld a, [wDST] + bit 7, a + jr z, .off + + ld [hl], "O" + inc hl + ld [hl], "N" + inc hl + jr .done + +.off + ld [hl], "O" + inc hl + ld [hl], "F" + inc hl + ld [hl], "F" + inc hl + +.done + ld hl, .NowOnDebug + ret +; 90b13 + +.NowOnDebug: ; 0x90b13 + text "Now on DEBUG…" + prompt +; 0x90b23 + +.PrintTime: ; 90b23 + lb bc, 1, 3 + call PrintNum + ld [hl], "." + inc hl + inc de + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ld [hl], ":" + inc hl + inc de + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + ret +; 90b3e + +PrintHour: ; 90b3e (24:4b3e) + ld l, e + ld h, d + push bc + call GetTimeOfDayString + call PlaceString + ld l, c + ld h, b + inc hl + pop bc + call AdjustHourForAMorPM + ld [wd265], a + ld de, wd265 + call PrintTwoDigitNumberRightAlign + ret + +GetTimeOfDayString: ; 90b58 (24:4b58) + ld a, c + cp MORN_HOUR + jr c, .nite + cp DAY_HOUR + jr c, .morn + cp NITE_HOUR + jr c, .day +.nite + ld de, .nite_string + ret +.morn + ld de, .morn_string + ret +.day + ld de, .day_string + ret +; 90b71 (24:4b71) + +.nite_string: db "NITE@" +.morn_string: db "MORN@" +.day_string: db "DAY@" +; 90b7f + +AdjustHourForAMorPM: +; Convert the hour stored in c (0-23) to a 1-12 value + ld a, c + or a + jr z, .midnight + cp NOON_HOUR + ret c + ret z + sub NOON_HOUR + ret + +.midnight + ld a, NOON_HOUR + ret diff --git a/main.asm b/main.asm index af4b61b75..6a5102545 100644 --- a/main.asm +++ b/main.asm @@ -32,30 +32,30 @@ INCLUDE "engine/events/specials.asm" INCLUDE "engine/routines/printnum.asm" INCLUDE "engine/pokemon/health.asm" INCLUDE "engine/events/overworld.asm" -INCLUDE "engine/items.asm" +INCLUDE "engine/items/items.asm" INCLUDE "engine/overworld/player_step.asm" INCLUDE "engine/battle/anim_hp_bar.asm" INCLUDE "engine/pokemon/move_mon.asm" INCLUDE "engine/pokemon/billspctop.asm" -INCLUDE "engine/routines/getbreedmonlevelgrowth.asm" +INCLUDE "engine/pokemon/getbreedmonlevelgrowth.asm" INCLUDE "engine/events/bug_contest/caught_mon.asm" -INCLUDE "engine/item_effects.asm" +INCLUDE "engine/items/item_effects.asm" INCLUDE "engine/battle_anims/getpokeballwobble.asm" -INCLUDE "engine/routines/knowsmove.asm" +INCLUDE "engine/pokemon/knowsmove.asm" SECTION "bank4", ROMX -INCLUDE "engine/menu/pack.asm" +INCLUDE "engine/items/pack.asm" INCLUDE "engine/overworld/time.asm" -INCLUDE "engine/menu/tmhm.asm" -INCLUDE "engine/menu/naming_screen.asm" +INCLUDE "engine/items/tmhm.asm" +INCLUDE "engine/menus/naming_screen.asm" INCLUDE "engine/events/misc_scripts.asm" INCLUDE "engine/events/heal_machine_anim.asm" INCLUDE "engine/events/whiteout.asm" INCLUDE "engine/events/forced_movement.asm" INCLUDE "engine/events/itemfinder.asm" -INCLUDE "engine/menu/start_menu.asm" +INCLUDE "engine/menus/start_menu.asm" INCLUDE "engine/overworld/select_menu.asm" INCLUDE "engine/events/elevator.asm" INCLUDE "engine/events/bug_contest/contest.asm" @@ -70,14 +70,14 @@ INCLUDE "engine/routines/getsquareroot.asm" SECTION "bank5", ROMX -INCLUDE "engine/rtc.asm" +INCLUDE "engine/rtc/rtc.asm" INCLUDE "engine/overworld/overworld.asm" INCLUDE "engine/overworld/tile_events.asm" INCLUDE "engine/save.asm" INCLUDE "engine/overworld/spawn_points.asm" INCLUDE "engine/overworld/map_setup.asm" INCLUDE "engine/events/pokecenter_pc.asm" -INCLUDE "engine/menu/mart.asm" +INCLUDE "engine/items/mart.asm" INCLUDE "engine/money.asm" INCLUDE "data/items/marts.asm" INCLUDE "engine/events/mom.asm" @@ -95,26 +95,26 @@ INCLUDE "engine/gfx/mapgroup_roofs.asm" SECTION "Clock Reset", ROMX -INCLUDE "engine/menu/clock_reset.asm" +INCLUDE "engine/rtc/clock_reset.asm" SECTION "bank9", ROMX INCLUDE "data/text_buffers.asm" -INCLUDE "engine/menu/menu.asm" -INCLUDE "engine/routines/updateitemdescription.asm" +INCLUDE "engine/menus/menu.asm" +INCLUDE "engine/items/updateitemdescription.asm" INCLUDE "engine/events/pokepic.asm" INCLUDE "engine/overworld/map_objects_2.asm" -INCLUDE "engine/menu/scrolling_menu.asm" -INCLUDE "engine/menu/switch_items.asm" -INCLUDE "engine/menu/menu_2.asm" -INCLUDE "engine/menu/mon_menu.asm" +INCLUDE "engine/menus/scrolling_menu.asm" +INCLUDE "engine/items/switch_items.asm" +INCLUDE "engine/menus/menu_2.asm" +INCLUDE "engine/pokemon/mon_menu.asm" INCLUDE "engine/battle/menu.asm" -INCLUDE "engine/menu/buy_sell_toss.asm" -INCLUDE "engine/menu/trainer_card.asm" +INCLUDE "engine/items/buy_sell_toss.asm" +INCLUDE "engine/menus/trainer_card.asm" INCLUDE "engine/events/prof_oaks_pc.asm" INCLUDE "engine/overworld/decorations.asm" -INCLUDE "engine/routines/leveluphappinessmod.asm" +INCLUDE "engine/pokemon/leveluphappinessmod.asm" INCLUDE "engine/battle/read_trainer_dvs.asm" INCLUDE "data/trainers/dvs.asm" INCLUDE "engine/battle/returntobattle_useball.asm" @@ -148,7 +148,7 @@ INCLUDE "engine/pokemon/tmhm.asm" INCLUDE "data/moves/descriptions.asm" INCLUDE "engine/events/pokerus/pokerus.asm" INCLUDE "engine/battle/start_battle.asm" -INCLUDE "engine/routines/placegraphic.asm" +INCLUDE "engine/gfx/placegraphic.asm" SECTION "Effect Commands", ROMX @@ -192,11 +192,11 @@ INCLUDE "engine/pokemon/mail.asm" SECTION "Crystal Features 1", ROMX INCLUDE "engine/init_gender.asm" -INCLUDE "engine/routines/drawkrispackgfx.asm" +INCLUDE "engine/gfx/drawkrispackgfx.asm" INCLUDE "engine/events/move_tutor.asm" INCLUDE "engine/gfx/crystal_layouts.asm" INCLUDE "engine/events/celebi.asm" -INCLUDE "engine/menu/main_menu.asm" +INCLUDE "engine/menus/main_menu.asm" INCLUDE "mobile/mobile_menu.asm" INCLUDE "engine/pokemon/search.asm" INCLUDE "mobile/mobile_12_2.asm" @@ -212,7 +212,7 @@ INCLUDE "engine/routines/emptyallsrambanks.asm" INCLUDE "engine/routines/savemenu_copytilemapatonce.asm" INCLUDE "engine/routines/checksave.asm" INCLUDE "data/maps/scenes.asm" -INCLUDE "engine/routines/loadmappart.asm" +INCLUDE "engine/overworld/loadmappart.asm" INCLUDE "engine/routines/phonering_copytilemapatonce.asm" Shrink1Pic: ; 4d249 @@ -222,10 +222,10 @@ Shrink2Pic: ; 4d2d9 INCBIN "gfx/new_game/shrink2.2bpp.lz" INCLUDE "engine/link/link_2.asm" -INCLUDE "engine/menu/delete_save_change_clock.asm" +INCLUDE "engine/rtc/delete_save_change_clock.asm" INCLUDE "data/tilesets.asm" INCLUDE "engine/routines/flagpredef.asm" -INCLUDE "engine/routines/trademonfrontpic.asm" +INCLUDE "engine/gfx/trademonfrontpic.asm" INCLUDE "engine/events/pokerus/check_pokerus.asm" INCLUDE "engine/events/lucky_number.asm" INCLUDE "engine/pokemon/caught_data.asm" @@ -257,7 +257,7 @@ INCLUDE "engine/routines/unreferenced_getgen1trainerclassname.asm" INCLUDE "engine/pokemon/mon_stats.asm" INCLUDE "engine/routines/initlist.asm" INCLUDE "engine/pokemon/experience.asm" -INCLUDE "engine/routines/switchpartymons.asm" +INCLUDE "engine/pokemon/switchpartymons.asm" INCLUDE "engine/gfx/load_pics.asm" INCLUDE "engine/pokemon/move_mon_wo_mail.asm" INCLUDE "data/pokemon/base_stats.asm" @@ -316,10 +316,10 @@ INCLUDE "engine/gfx/mon_icons.asm" SECTION "bank24", ROMX INCLUDE "engine/phone/phone.asm" -INCLUDE "engine/menu/timeset.asm" +INCLUDE "engine/rtc/timeset.asm" INCLUDE "engine/pokegear/pokegear.asm" INCLUDE "engine/events/fish.asm" -INCLUDE "engine/game/slot_machine.asm" +INCLUDE "engine/games/slot_machine.asm" SECTION "Phone Engine", ROMX @@ -430,9 +430,9 @@ INCLUDE "gfx/pokemon/unown_frames.asm" SECTION "bank38", ROMX INCLUDE "engine/events/print_unown_2.asm" -INCLUDE "engine/game/card_flip.asm" -INCLUDE "engine/game/unown_puzzle.asm" -INCLUDE "engine/game/dummy_game.asm" +INCLUDE "engine/games/card_flip.asm" +INCLUDE "engine/games/unown_puzzle.asm" +INCLUDE "engine/games/dummy_game.asm" INCLUDE "engine/pokemon/billspc.asm" @@ -441,7 +441,7 @@ SECTION "bank39", ROMX CopyrightGFX:: ; e4000 INCBIN "gfx/splash/copyright.2bpp" -INCLUDE "engine/menu/options_menu.asm" +INCLUDE "engine/menus/options_menu.asm" INCLUDE "engine/title/crystal_intro.asm" @@ -477,7 +477,7 @@ INCLUDE "engine/overworld/warp_connection.asm" INCLUDE "engine/link/mystery_gift.asm" INCLUDE "engine/battle/used_move_text.asm" INCLUDE "mobile/mobile_41.asm" -INCLUDE "engine/routines/loadoverworldfont.asm" +INCLUDE "engine/gfx/loadoverworldfont.asm" SECTION "Mobile 42", ROMX @@ -566,7 +566,7 @@ INCLUDE "data/phone/text/trainers.asm" SECTION "Miscellaneous Text", ROMX INCLUDE "data/items/names.asm" -INCLUDE "engine/routines/printitemdescription.asm" +INCLUDE "engine/items/printitemdescription.asm" INCLUDE "data/items/descriptions.asm" INCLUDE "data/moves/names.asm" INCLUDE "engine/overworld/landmarks.asm" @@ -582,7 +582,7 @@ INCLUDE "engine/printer/print_party.asm" SECTION "bank77_2", ROMX -INCLUDE "engine/routines/printhoursmins.asm" +INCLUDE "engine/rtc/printhoursmins.asm" INCLUDE "engine/events/diploma.asm" INCLUDE "engine/pokedex/pokedex_3.asm" INCLUDE "engine/events/catch_tutorial_input.asm" -- cgit v1.2.3 From 60e21a86638cad5fd25133cda1c545461304d902 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Wed, 14 Mar 2018 13:38:36 +0100 Subject: Move init_gender and intro_menu to menus They are actually some kind of menus, and as such make sense there. --- engine/init_gender.asm | 111 ---- engine/intro_menu.asm | 1418 ------------------------------------------ engine/menus/init_gender.asm | 111 ++++ engine/menus/intro_menu.asm | 1418 ++++++++++++++++++++++++++++++++++++++++++ main.asm | 4 +- 5 files changed, 1531 insertions(+), 1531 deletions(-) delete mode 100755 engine/init_gender.asm delete mode 100755 engine/intro_menu.asm create mode 100755 engine/menus/init_gender.asm create mode 100755 engine/menus/intro_menu.asm diff --git a/engine/init_gender.asm b/engine/init_gender.asm deleted file mode 100755 index 8fd95bc85..000000000 --- a/engine/init_gender.asm +++ /dev/null @@ -1,111 +0,0 @@ -InitCrystalData: ; 48000 - ld a, $1 - ld [wd474], a - xor a - ld [wd473], a - ld [wPlayerGender], a - ld [wd475], a - ld [wd476], a - ld [wd477], a - ld [wd478], a - ld [wd002], a - ld [wd003], a - ; could have done "ld a, [wd479] \ and %11111100", saved four operations - ld a, [wd479] - res 0, a - ld [wd479], a - ld a, [wd479] - res 1, a - ld [wd479], a - ret -; 4802f - -INCLUDE "mobile/mobile_12.asm" - -InitGender: ; 48dcb (12:4dcb) - call InitGenderScreen - call LoadGenderScreenPal - call LoadGenderScreenLightBlueTile - call WaitBGMap2 - call SetPalettes - ld hl, TextJump_AreYouABoyOrAreYouAGirl - call PrintText - ld hl, .MenuHeader - call LoadMenuHeader - call WaitBGMap2 - call VerticalMenu - call CloseWindow - ld a, [wMenuCursorY] - dec a - ld [wPlayerGender], a - ld c, 10 - call DelayFrames - ret -; 48dfc (12:4dfc) - -.MenuHeader: ; 0x48dfc - db MENU_BACKUP_TILES ; flags - menu_coords 6, 4, 12, 9 - dw .MenuData - db 1 ; default option -; 0x48e04 - -.MenuData: ; 0x48e04 - db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_DISABLE_B ; flags - db 2 ; items - db "Boy@" - db "Girl@" -; 0x48e0f - -TextJump_AreYouABoyOrAreYouAGirl: ; 0x48e0f - ; Are you a boy? Or are you a girl? - text_jump Text_AreYouABoyOrAreYouAGirl - db "@" -; 0x48e14 - -InitGenderScreen: ; 48e14 (12:4e14) - ld a, $10 - ld [wMusicFade], a - ld a, MUSIC_NONE - ld [wMusicFadeID], a - ld a, $0 - ld [wMusicFadeID + 1], a - ld c, 8 - call DelayFrames - call ClearBGPalettes - call InitCrystalData - call LoadFontsExtra - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, $0 - call ByteFill - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - xor a - call ByteFill - ret - -LoadGenderScreenPal: ; 48e47 (12:4e47) - ld hl, .Palette - ld de, wBGPals1 - ld bc, 1 palettes - ld a, BANK(wBGPals1) - call FarCopyWRAM - farcall ApplyPals - ret -; 48e5c (12:4e5c) - -.Palette: ; 48e5c -INCLUDE "gfx/new_game/gender_screen.pal" -; 48e64 - -LoadGenderScreenLightBlueTile: ; 48e64 (12:4e64) - ld de, .LightBlueTile - ld hl, vTiles2 tile $00 - lb bc, BANK(.LightBlueTile), 1 - call Get2bpp - ret -; 48e71 (12:4e71) - -.LightBlueTile: ; 48e71 -INCBIN "gfx/new_game/gender_screen.2bpp" diff --git a/engine/intro_menu.asm b/engine/intro_menu.asm deleted file mode 100755 index af6e0c09e..000000000 --- a/engine/intro_menu.asm +++ /dev/null @@ -1,1418 +0,0 @@ -_MainMenu: ; 5ae8 - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - ld de, MUSIC_MAIN_MENU - ld a, e - ld [wMapMusic], a - call PlayMusic - farcall MainMenu - jp StartTitleScreen -; 5b04 - -; unused - ret -; 5b05 - -PrintDayOfWeek: ; 5b05 - push de - ld hl, .Days - ld a, b - call GetNthString - ld d, h - ld e, l - pop hl - call PlaceString - ld h, b - ld l, c - ld de, .Day - call PlaceString - ret -; 5b1c - -.Days: ; 5b1c - db "SUN@" - db "MON@" - db "TUES@" - db "WEDNES@" - db "THURS@" - db "FRI@" - db "SATUR@" -; 5b40 - -.Day: ; 5b40 - db "DAY@" -; 5b44 - -NewGame_ClearTileMapEtc: ; 5b44 - xor a - ld [hMapAnims], a - call ClearTileMap - call LoadFontsExtra - call LoadStandardFont - call ClearWindowData - ret -; 5b54 - -MysteryGift: ; 5b54 - call UpdateTime - farcall DoMysteryGiftIfDayHasPassed - farcall DoMysteryGift - ret -; 5b64 - -OptionsMenu: ; 5b64 - farcall _OptionsMenu - ret -; 5b6b - -NewGame: ; 5b6b - xor a - ld [wMonStatusFlags], a - call ResetWRAM - call NewGame_ClearTileMapEtc - call AreYouABoyOrAreYouAGirl - call OakSpeech - call InitializeWorld - ld a, 1 - ld [wPreviousLandmark], a - - ld a, SPAWN_HOME - ld [wDefaultSpawnpoint], a - - ld a, MAPSETUP_WARP - ld [hMapEntryMethod], a - jp FinishContinueFunction -; 5b8f - -AreYouABoyOrAreYouAGirl: ; 5b8f - farcall Mobile_AlwaysReturnNotCarry ; some mobile stuff - jr c, .ok - farcall InitGender - ret - -.ok - ld c, 0 - farcall InitMobileProfile ; mobile - ret -; 5ba7 - -ResetWRAM: ; 5ba7 - xor a - ld [hBGMapMode], a - call _ResetWRAM - ret -; 5bae - -_ResetWRAM: ; 5bae - - ld hl, wVirtualOAM - ld bc, wOptions - wVirtualOAM - xor a - call ByteFill - - ld hl, WRAM1_Begin - ld bc, wGameData - WRAM1_Begin - xor a - call ByteFill - - ld hl, wGameData - ld bc, wGameDataEnd - wGameData - xor a - call ByteFill - - ld a, [rLY] - ld [hSecondsBackup], a - call DelayFrame - ld a, [hRandomSub] - ld [wPlayerID], a - - ld a, [rLY] - ld [hSecondsBackup], a - call DelayFrame - ld a, [hRandomAdd] - ld [wPlayerID + 1], a - - call Random - ld [wSecretID], a - call DelayFrame - call Random - ld [wSecretID + 1], a - - ld hl, wPartyCount - call .InitList - - xor a - ld [wCurBox], a - ld [wSavedAtLeastOnce], a - - call SetDefaultBoxNames - - ld a, BANK(sBoxCount) - call GetSRAMBank - ld hl, sBoxCount - call .InitList - call CloseSRAM - - ld hl, wNumItems - call .InitList - - ld hl, wNumKeyItems - call .InitList - - ld hl, wNumBalls - call .InitList - - ld hl, wPCItems - call .InitList - - xor a - ld [wRoamMon1Species], a - ld [wRoamMon2Species], a - ld [wRoamMon3Species], a - ld a, -1 - ld [wRoamMon1MapGroup], a - ld [wRoamMon2MapGroup], a - ld [wRoamMon3MapGroup], a - ld [wRoamMon1MapNumber], a - ld [wRoamMon2MapNumber], a - ld [wRoamMon3MapNumber], a - - ld a, BANK(sMysteryGiftItem) - call GetSRAMBank - ld hl, sMysteryGiftItem - xor a - ld [hli], a - dec a - ld [hl], a - call CloseSRAM - - call LoadOrRegenerateLuckyIDNumber - call InitializeMagikarpHouse - - xor a - ld [wMonType], a - - ld [wJohtoBadges], a - ld [wKantoBadges], a - - ld [wCoins], a - ld [wCoins + 1], a - -if START_MONEY >= $10000 - ld a, HIGH(START_MONEY >> 8) -endc - ld [wMoney], a - ld a, HIGH(START_MONEY) ; mid - ld [wMoney + 1], a - ld a, LOW(START_MONEY) - ld [wMoney + 2], a - - xor a - ld [wWhichMomItem], a - - ld hl, wMomItemTriggerBalance - ld [hl], HIGH(MOM_MONEY >> 8) - inc hl - ld [hl], HIGH(MOM_MONEY) ; mid - inc hl - ld [hl], LOW(MOM_MONEY) - - call InitializeNPCNames - - farcall InitDecorations - - farcall DeletePartyMonMail - - farcall DeleteMobileEventIndex - - call ResetGameTime - ret -; 5ca1 - -.InitList: ; 5ca1 -; Loads 0 in the count and -1 in the first item or mon slot. - xor a - ld [hli], a - dec a - ld [hl], a - ret -; 5ca6 - -SetDefaultBoxNames: ; 5ca6 - ld hl, wBoxNames - ld c, 0 -.loop - push hl - ld de, .Box - call CopyName2 - dec hl - ld a, c - inc a - cp 10 - jr c, .less - sub 10 - ld [hl], "1" - inc hl - -.less - add "0" - ld [hli], a - ld [hl], "@" - pop hl - ld de, 9 - add hl, de - inc c - ld a, c - cp NUM_BOXES - jr c, .loop - ret - -.Box: - db "BOX@" -; 5cd3 - -InitializeMagikarpHouse: ; 5cd3 - ld hl, wBestMagikarpLengthFeet - ld a, $3 - ld [hli], a - ld a, $6 - ld [hli], a - ld de, .Ralph - call CopyName2 - ret -; 5ce3 - -.Ralph: ; 5ce3 - db "RALPH@" -; 5ce9 - -InitializeNPCNames: ; 5ce9 - ld hl, .Rival - ld de, wRivalName - call .Copy - - ld hl, .Mom - ld de, wMomsName - call .Copy - - ld hl, .Red - ld de, wRedsName - call .Copy - - ld hl, .Green - ld de, wGreensName - -.Copy: - ld bc, NAME_LENGTH - call CopyBytes - ret - -.Rival: db "???@" -.Red: db "RED@" -.Green: db "GREEN@" -.Mom: db "MOM@" -; 5d23 - -InitializeWorld: ; 5d23 - call ShrinkPlayer - farcall SpawnPlayer - farcall _InitializeStartDay - ret -; 5d33 - -LoadOrRegenerateLuckyIDNumber: ; 5d33 - ld a, BANK(sLuckyIDNumber) - call GetSRAMBank - ld a, [wCurDay] - inc a - ld b, a - ld a, [sLuckyNumberDay] - cp b - ld a, [sLuckyIDNumber + 1] - ld c, a - ld a, [sLuckyIDNumber] - jr z, .skip - ld a, b - ld [sLuckyNumberDay], a - call Random - ld c, a - call Random - -.skip - ld [wLuckyIDNumber], a - ld [sLuckyIDNumber], a - ld a, c - ld [wLuckyIDNumber + 1], a - ld [sLuckyIDNumber + 1], a - jp CloseSRAM -; 5d65 - -Continue: ; 5d65 - farcall TryLoadSaveFile - jr c, .FailToLoad - farcall _LoadData - call LoadStandardMenuHeader - call DisplaySaveInfoOnContinue - ld a, $1 - ld [hBGMapMode], a - ld c, 20 - call DelayFrames - call ConfirmContinue - jr nc, .Check1Pass - call CloseWindow - jr .FailToLoad - -.Check1Pass: - call Continue_CheckRTC_RestartClock - jr nc, .Check2Pass - call CloseWindow - jr .FailToLoad - -.Check2Pass: - ld a, $8 - ld [wMusicFade], a - ld a, LOW(MUSIC_NONE) - ld [wMusicFadeID], a - ld a, HIGH(MUSIC_NONE) - ld [wMusicFadeID + 1], a - call ClearBGPalettes - call Continue_MobileAdapterMenu - call CloseWindow - call ClearTileMap - ld c, 20 - call DelayFrames - farcall JumpRoamMons - farcall MysteryGift_CopyReceivedDecosToPC ; Mystery Gift - farcall Function140ae ; time-related - ld a, [wSpawnAfterChampion] - cp SPAWN_LANCE - jr z, .SpawnAfterE4 - ld a, MAPSETUP_CONTINUE - ld [hMapEntryMethod], a - jp FinishContinueFunction - -.FailToLoad: - ret - -.SpawnAfterE4: - ld a, SPAWN_NEW_BARK - ld [wDefaultSpawnpoint], a - call PostCreditsSpawn - jp FinishContinueFunction -; 5de2 - -SpawnAfterRed: ; 5de2 - ld a, SPAWN_MT_SILVER - ld [wDefaultSpawnpoint], a -; 5de7 - -PostCreditsSpawn: ; 5de7 - xor a - ld [wSpawnAfterChampion], a - ld a, MAPSETUP_WARP - ld [hMapEntryMethod], a - ret -; 5df0 - -Continue_MobileAdapterMenu: ; 5df0 - farcall Mobile_AlwaysReturnNotCarry ; mobile check - ret nc - -; the rest of this stuff is never reached because -; the previous function returns with carry not set - ld hl, wd479 - bit 1, [hl] - ret nz - ld a, 5 - ld [wMusicFade], a - ld a, LOW(MUSIC_MOBILE_ADAPTER_MENU) - ld [wMusicFadeID], a - ld a, HIGH(MUSIC_MOBILE_ADAPTER_MENU) - ld [wMusicFadeID + 1], a - ld c, 20 - call DelayFrames - ld c, $1 - farcall InitMobileProfile ; mobile - farcall _SaveData - ld a, 8 - ld [wMusicFade], a - ld a, LOW(MUSIC_NONE) - ld [wMusicFadeID], a - ld a, HIGH(MUSIC_NONE) - ld [wMusicFadeID + 1], a - ld c, 35 - call DelayFrames - ret -; 5e34 - -ConfirmContinue: ; 5e34 -.loop - call DelayFrame - call GetJoypad - ld hl, hJoyPressed - bit A_BUTTON_F, [hl] - jr nz, .PressA - bit B_BUTTON_F, [hl] - jr z, .loop - scf - ret - -.PressA: - ret -; 5e48 - -Continue_CheckRTC_RestartClock: ; 5e48 - call CheckRTCStatus - and %10000000 ; Day count exceeded 16383 - jr z, .pass - farcall RestartClock - ld a, c - and a - jr z, .pass - scf - ret - -.pass - xor a - ret -; 5e5d - -FinishContinueFunction: ; 5e5d -.loop - xor a - ld [wDontPlayMapMusicOnReload], a - ld [wLinkMode], a - ld hl, wGameTimerPause - set GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] - res GAMETIMERPAUSE_MOBILE_7_F, [hl] - ld hl, wEnteredMapFromContinue - set 1, [hl] - farcall OverworldLoop - ld a, [wSpawnAfterChampion] - cp SPAWN_RED - jr z, .AfterRed - jp Reset - -.AfterRed: - call SpawnAfterRed - jr .loop -; 5e85 - -DisplaySaveInfoOnContinue: ; 5e85 - call CheckRTCStatus - and %10000000 - jr z, .clock_ok - lb de, 4, 8 - call DisplayContinueDataWithRTCError - ret - -.clock_ok - lb de, 4, 8 - call DisplayNormalContinueData - ret -; 5e9a - -DisplaySaveInfoOnSave: ; 5e9a - lb de, 4, 0 - jr DisplayNormalContinueData -; 5e9f - -DisplayNormalContinueData: ; 5e9f - call Continue_LoadMenuHeader - call Continue_DisplayBadgesDexPlayerName - call Continue_PrintGameTime - call LoadFontsExtra - call UpdateSprites - ret -; 5eaf - -DisplayContinueDataWithRTCError: ; 5eaf - call Continue_LoadMenuHeader - call Continue_DisplayBadgesDexPlayerName - call Continue_UnknownGameTime - call LoadFontsExtra - call UpdateSprites - ret -; 5ebf - -Continue_LoadMenuHeader: ; 5ebf - xor a - ld [hBGMapMode], a - ld hl, .MenuHeader_Dex - ld a, [wStatusFlags] - bit STATUSFLAGS_POKEDEX_F, a - jr nz, .show_menu - ld hl, .MenuHeader_NoDex - -.show_menu - call _OffsetMenuHeader - call MenuBox - call PlaceVerticalMenuItems - ret -; 5ed9 - -.MenuHeader_Dex: ; 5ed9 - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, 15, 9 - dw .MenuData_Dex - db 1 ; default option -; 5ee1 - -.MenuData_Dex: ; 5ee1 - db 0 ; flags - db 4 ; items - db "PLAYER@" - db "BADGES@" - db "#DEX@" - db "TIME@" -; 5efb - -.MenuHeader_NoDex: ; 5efb - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, 15, 9 - dw .MenuData_NoDex - db 1 ; default option -; 5f03 - -.MenuData_NoDex: ; 5f03 - db 0 ; flags - db 4 ; items - db "PLAYER @" - db "BADGES@" - db " @" - db "TIME@" -; 5f1c - - -Continue_DisplayBadgesDexPlayerName: ; 5f1c - call MenuBoxCoord2Tile - push hl - decoord 13, 4, 0 - add hl, de - call Continue_DisplayBadgeCount - pop hl - push hl - decoord 12, 6, 0 - add hl, de - call Continue_DisplayPokedexNumCaught - pop hl - push hl - decoord 8, 2, 0 - add hl, de - ld de, .Player - call PlaceString - pop hl - ret - -.Player: - db "@" -; 5f40 - -Continue_PrintGameTime: ; 5f40 - decoord 9, 8, 0 - add hl, de - call Continue_DisplayGameTime - ret -; 5f48 - -Continue_UnknownGameTime: ; 5f48 - decoord 9, 8, 0 - add hl, de - ld de, .three_question_marks - call PlaceString - ret - -.three_question_marks - db " ???@" -; 5f58 - -Continue_DisplayBadgeCount: ; 5f58 - push hl - ld hl, wJohtoBadges - ld b, 2 - call CountSetBits - pop hl - ld de, wd265 - lb bc, 1, 2 - jp PrintNum -; 5f6b - -Continue_DisplayPokedexNumCaught: ; 5f6b - ld a, [wStatusFlags] - bit STATUSFLAGS_POKEDEX_F, a - ret z - push hl - ld hl, wPokedexCaught -if NUM_POKEMON % 8 - ld b, NUM_POKEMON / 8 + 1 -else - ld b, NUM_POKEMON / 8 -endc - call CountSetBits - pop hl - ld de, wd265 - lb bc, 1, 3 - jp PrintNum -; 5f84 - -Continue_DisplayGameTime: ; 5f84 - ld de, wGameTimeHours - lb bc, 2, 3 - call PrintNum - ld [hl], "" - inc hl - ld de, wGameTimeMinutes - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - jp PrintNum -; 5f99 - - -OakSpeech: ; 0x5f99 - farcall InitClock - call RotateFourPalettesLeft - call ClearTileMap - - ld de, MUSIC_ROUTE_30 - call PlayMusic - - call RotateFourPalettesRight - call RotateThreePalettesRight - xor a - ld [wCurPartySpecies], a - ld a, POKEMON_PROF - ld [wTrainerClass], a - call Intro_PrepTrainerPic - - ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - call Intro_RotatePalettesLeftFrontpic - - ld hl, OakText1 - call PrintText - call RotateThreePalettesRight - call ClearTileMap - - ld a, WOOPER - ld [wCurSpecies], a - ld [wCurPartySpecies], a - call GetBaseData - - hlcoord 6, 4 - call PrepMonFrontpic - - xor a - ld [wTempMonDVs], a - ld [wTempMonDVs + 1], a - - ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - call Intro_WipeInFrontpic - - ld hl, OakText2 - call PrintText - ld hl, OakText4 - call PrintText - call RotateThreePalettesRight - call ClearTileMap - - xor a - ld [wCurPartySpecies], a - ld a, POKEMON_PROF - ld [wTrainerClass], a - call Intro_PrepTrainerPic - - ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - call Intro_RotatePalettesLeftFrontpic - - ld hl, OakText5 - call PrintText - call RotateThreePalettesRight - call ClearTileMap - - xor a - ld [wCurPartySpecies], a - farcall DrawIntroPlayerPic - - ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - call Intro_RotatePalettesLeftFrontpic - - ld hl, OakText6 - call PrintText - call NamePlayer - ld hl, OakText7 - call PrintText - ret - -OakText1: ; 0x6045 - text_jump _OakText1 - db "@" - -OakText2: ; 0x604a - text_jump _OakText2 - start_asm - ld a, WOOPER - call PlayMonCry - call WaitSFX - ld hl, OakText3 - ret - -OakText3: ; 0x605b - text_jump _OakText3 - db "@" - -OakText4: ; 0x6060 - text_jump _OakText4 - db "@" - -OakText5: ; 0x6065 - text_jump _OakText5 - db "@" - -OakText6: ; 0x606a - text_jump _OakText6 - db "@" - -OakText7: ; 0x606f - text_jump _OakText7 - db "@" - -NamePlayer: ; 0x6074 - farcall MovePlayerPicRight - farcall ShowPlayerNamingChoices - ld a, [wMenuCursorY] - dec a - jr z, .NewName - call StorePlayerName - farcall ApplyMonOrTrainerPals - farcall MovePlayerPicLeft - ret - -.NewName: - ld b, 1 - ld de, wPlayerName - farcall NamingScreen - - call RotateThreePalettesRight - call ClearTileMap - - call LoadFontsExtra - call WaitBGMap - - xor a - ld [wCurPartySpecies], a - farcall DrawIntroPlayerPic - - ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - call RotateThreePalettesLeft - - ld hl, wPlayerName - ld de, .Chris - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .Male - ld de, .Kris -.Male: - call InitName - ret - -.Chris: - db "CHRIS@@@@@@" -.Kris: - db "KRIS@@@@@@@" -; 60e9 - -Unreferenced_Function60e9: - call LoadMenuHeader - call VerticalMenu - ld a, [wMenuCursorY] - dec a - call CopyNameFromMenu - call CloseWindow - ret -; 60fa - -StorePlayerName: ; 60fa - ld a, "@" - ld bc, NAME_LENGTH - ld hl, wPlayerName - call ByteFill - ld hl, wPlayerName - ld de, wStringBuffer2 - call CopyName2 - ret -; 610f - -ShrinkPlayer: ; 610f - - ld a, [hROMBank] - push af - - ld a, 32 ; fade time - ld [wMusicFade], a - ld de, MUSIC_NONE - ld a, e - ld [wMusicFadeID], a - ld a, d - ld [wMusicFadeID + 1], a - - ld de, SFX_ESCAPE_ROPE - call PlaySFX - pop af - rst Bankswitch - - ld c, 8 - call DelayFrames - - ld hl, Shrink1Pic - ld b, BANK(Shrink1Pic) - call ShrinkFrame - - ld c, 8 - call DelayFrames - - ld hl, Shrink2Pic - ld b, BANK(Shrink2Pic) - call ShrinkFrame - - ld c, 8 - call DelayFrames - - hlcoord 6, 5 - ld b, 7 - ld c, 7 - call ClearBox - - ld c, 3 - call DelayFrames - - call Intro_PlacePlayerSprite - call LoadFontsExtra - - ld c, 50 - call DelayFrames - - call RotateThreePalettesRight - call ClearTileMap - ret -; 616a - -Intro_RotatePalettesLeftFrontpic: ; 616a - ld hl, IntroFadePalettes - ld b, IntroFadePalettes.End - IntroFadePalettes -.loop - ld a, [hli] - call DmgToCgbBGPals - ld c, 10 - call DelayFrames - dec b - jr nz, .loop - ret -; 617c - -IntroFadePalettes: ; 0x617c - db %01010100 - db %10101000 - db %11111100 - db %11111000 - db %11110100 - db %11100100 -.End -; 6182 - -Intro_WipeInFrontpic: ; 6182 - ld a, $77 - ld [hWX], a - call DelayFrame - ld a, %11100100 - call DmgToCgbBGPals -.loop - call DelayFrame - ld a, [hWX] - sub $8 - cp -1 - ret z - ld [hWX], a - jr .loop -; 619c - -Intro_PrepTrainerPic: ; 619c - ld de, vTiles2 - farcall GetTrainerPic - xor a - ld [hGraphicStartTile], a - hlcoord 6, 4 - lb bc, 7, 7 - predef PlaceGraphic - ret -; 61b4 - -ShrinkFrame: ; 61b4 - ld de, vTiles2 - ld c, 7 * 7 - predef DecompressGet2bpp - xor a - ld [hGraphicStartTile], a - hlcoord 6, 4 - lb bc, 7, 7 - predef PlaceGraphic - ret -; 61cd - -Intro_PlacePlayerSprite: ; 61cd - - farcall GetPlayerIcon - ld c, $c - ld hl, vTiles0 - call Request2bpp - - ld hl, wVirtualOAMSprite00 - ld de, .sprites - ld a, [de] - inc de - - ld c, a -.loop - ld a, [de] - inc de - ld [hli], a ; y - ld a, [de] - inc de - ld [hli], a ; x - ld a, [de] - inc de - ld [hli], a ; tile id - - ld b, PAL_OW_RED - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .male - ld b, PAL_OW_BLUE -.male - ld a, b - - ld [hli], a - dec c - jr nz, .loop - ret -; 61fe - -.sprites ; 61fe - db 4 - ; y pxl, x pxl, tile offset - db 9 * 8 + 4, 9 * 8, 0 - db 9 * 8 + 4, 10 * 8, 1 - db 10 * 8 + 4, 9 * 8, 2 - db 10 * 8 + 4, 10 * 8, 3 -; 620b - - -CrystalIntroSequence: ; 620b - callfar Copyright_GFPresents - jr c, StartTitleScreen - farcall CrystalIntro - -StartTitleScreen: ; 6219 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - call .TitleScreen - call DelayFrame -.loop - call RunTitleScreen - jr nc, .loop - - call ClearSprites - call ClearBGPalettes - - pop af - ld [rSVBK], a - - ld hl, rLCDC - res rLCDC_SPRITE_SIZE, [hl] ; 8x8 - call ClearScreen - call WaitBGMap2 - xor a - ld [hLCDCPointer], a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - ld b, SCGB_DIPLOMA - call GetSGBLayout - call UpdateTimePals - ld a, [wIntroSceneFrameCounter] - cp $5 - jr c, .ok - xor a -.ok - ld e, a - ld d, 0 - ld hl, .dw - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 626a - -.dw - dw _MainMenu - dw DeleteSaveData - dw CrystalIntroSequence - dw CrystalIntroSequence - dw ResetClock -; 6274 - - -.TitleScreen: ; 6274 - farcall _TitleScreen - ret -; 627b - -RunTitleScreen: ; 627b - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done_title - call TitleScreenScene - farcall SuicuneFrameIterator - call DelayFrame - and a - ret - -.done_title - scf - ret -; 6292 - -Unreferenced_Function6292: ; 6292 - ld a, [hVBlankCounter] - and $7 - ret nz - ld hl, wLYOverrides + $5f - ld a, [hl] - dec a - ld bc, 2 * SCREEN_WIDTH - call ByteFill - ret -; 62a3 - -TitleScreenScene: ; 62a3 - ld e, a - ld d, 0 - ld hl, .scenes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 62af - -.scenes - dw TitleScreenEntrance - dw TitleScreenTimer - dw TitleScreenMain - dw TitleScreenEnd -; 62b7 - -.Unreferenced_NextScene: - ld hl, wJumptableIndex - inc [hl] - ret -; 62bc - - -TitleScreenEntrance: ; 62bc - -; Animate the logo: -; Move each line by 4 pixels until our count hits 0. - ld a, [hSCX] - and a - jr z, .done - sub 4 - ld [hSCX], a - -; Lay out a base (all lines scrolling together). - ld e, a - ld hl, wLYOverrides - ld bc, 8 * 10 ; logo height - call ByteFill - -; Reversed signage for every other line's position. -; This is responsible for the interlaced effect. - ld a, e - xor $ff - inc a - - ld b, 8 * 10 / 2 ; logo height / 2 - ld hl, wLYOverrides + 1 -.loop - ld [hli], a - inc hl - dec b - jr nz, .loop - - farcall AnimateTitleCrystal - ret - -.done -; Next scene - ld hl, wJumptableIndex - inc [hl] - xor a - ld [hLCDCPointer], a - -; Play the title screen music. - ld de, MUSIC_TITLE - call PlayMusic - - ld a, $88 - ld [hWY], a - ret -; 62f6 - - -TitleScreenTimer: ; 62f6 - -; Next scene - ld hl, wJumptableIndex - inc [hl] - -; Start a timer - ld hl, wTitleScreenTimer - ld de, 73 * 60 + 36 - ld [hl], e - inc hl - ld [hl], d - ret -; 6304 - -TitleScreenMain: ; 6304 - -; Run the timer down. - ld hl, wTitleScreenTimer - ld e, [hl] - inc hl - ld d, [hl] - ld a, e - or d - jr z, .end - - dec de - ld [hl], d - dec hl - ld [hl], e - -; Save data can be deleted by pressing Up + B + Select. - call GetJoypad - ld hl, hJoyDown - ld a, [hl] - and D_UP + B_BUTTON + SELECT - cp D_UP + B_BUTTON + SELECT - jr z, .delete_save_data - -; To bring up the clock reset dialog: - -; Hold Down + B + Select to initiate the sequence. - ld a, [hClockResetTrigger] - cp $34 - jr z, .check_clock_reset - - ld a, [hl] - and D_DOWN + B_BUTTON + SELECT - cp D_DOWN + B_BUTTON + SELECT - jr nz, .check_start - - ld a, $34 - ld [hClockResetTrigger], a - jr .check_start - -; Keep Select pressed, and hold Left + Up. -; Then let go of Select. -.check_clock_reset - bit SELECT_F, [hl] - jr nz, .check_start - - xor a - ld [hClockResetTrigger], a - - ld a, [hl] - and D_LEFT + D_UP - cp D_LEFT + D_UP - jr z, .clock_reset - -; Press Start or A to start the game. -.check_start - ld a, [hl] - and START | A_BUTTON - jr nz, .incave - ret - -.incave - ld a, 0 - jr .done - -.delete_save_data - ld a, 1 - -.done - ld [wIntroSceneFrameCounter], a - -; Return to the intro sequence. - ld hl, wJumptableIndex - set 7, [hl] - ret - -.end -; Next scene - ld hl, wJumptableIndex - inc [hl] - -; Fade out the title screen music - xor a - ld [wMusicFadeID], a - ld [wMusicFadeID + 1], a - ld hl, wMusicFade - ld [hl], 8 ; 1 second - - ld hl, wTitleScreenTimer - inc [hl] - ret - -.clock_reset - ld a, 4 - ld [wIntroSceneFrameCounter], a - -; Return to the intro sequence. - ld hl, wJumptableIndex - set 7, [hl] - ret -; 6375 - -TitleScreenEnd: ; 6375 - -; Wait until the music is done fading. - - ld hl, wTitleScreenTimer - inc [hl] - - ld a, [wMusicFade] - and a - ret nz - - ld a, 2 - ld [wIntroSceneFrameCounter], a - -; Back to the intro. - ld hl, wJumptableIndex - set 7, [hl] - ret -; 6389 - -DeleteSaveData: ; 6389 - farcall _DeleteSaveData - jp Init -; 6392 - -ResetClock: ; 6392 - farcall _ResetClock - jp Init -; 639b - -Unreferenced_Function639b: - ; If bit 0 or 1 of [wTitleScreenTimer] is set, we don't need to be here. - ld a, [wTitleScreenTimer] - and %00000011 - ret nz - ld bc, wSpriteAnim10 - ld hl, SPRITEANIMSTRUCT_FRAME - add hl, bc ; over-the-top compicated way to load wc3ae into hl - ld l, [hl] - ld h, 0 - add hl, hl - add hl, hl - ld de, .Data63ca - add hl, de - ; If bit 2 of [wTitleScreenTimer] is set, get the second dw; else, get the first dw - ld a, [wTitleScreenTimer] - and %00000100 - srl a - srl a - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - and a - ret z - ld e, a - ld d, [hl] - ld a, SPRITE_ANIM_INDEX_GS_TITLE_TRAIL - call _InitSpriteAnimStruct - ret -; 63ca - -.Data63ca: ; 63ca -; frame 0 y, x; frame 1 y, x - db 11 * 8 + 4, 10 * 8, 0 * 8, 0 * 8 - db 11 * 8 + 4, 13 * 8, 11 * 8 + 4, 11 * 8 - db 11 * 8 + 4, 13 * 8, 11 * 8 + 4, 15 * 8 - db 11 * 8 + 4, 17 * 8, 11 * 8 + 4, 15 * 8 - db 0 * 8, 0 * 8, 11 * 8 + 4, 15 * 8 - db 0 * 8, 0 * 8, 11 * 8 + 4, 11 * 8 -; 63e2 - -Copyright: ; 63e2 - call ClearTileMap - call LoadFontsExtra - ld de, CopyrightGFX - ld hl, vTiles2 tile $60 - lb bc, BANK(CopyrightGFX), 29 - call Request2bpp - hlcoord 2, 7 - ld de, CopyrightString - jp PlaceString -; 63fd - -CopyrightString: ; 63fd - ; ©1995-2001 Nintendo - db $60, $61, $62, $63, $64, $65, $66 - db $67, $68, $69, $6a, $6b, $6c - - ; ©1995-2001 Creatures inc. - next $60, $61, $62, $63, $64, $65, $66 - db $6d, $6e, $6f, $70, $71, $72, $7a, $7b, $7c - - ; ©1995-2001 GAME FREAK inc. - next $60, $61, $62, $63, $64, $65, $66 - db $73, $74, $75, $76, $77, $78, $79, $7a, $7b, $7c - - db "@" -; 642e - -GameInit:: ; 642e - farcall TryLoadSaveData - call ClearWindowData - call ClearBGPalettes - call ClearTileMap - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - xor a ; LOW(vBGMap0) - ld [hBGMapAddress], a - ld [hJoyDown], a - ld [hSCX], a - ld [hSCY], a - ld a, $90 - ld [hWY], a - call WaitBGMap - jp CrystalIntroSequence -; 6454 diff --git a/engine/menus/init_gender.asm b/engine/menus/init_gender.asm new file mode 100755 index 000000000..8fd95bc85 --- /dev/null +++ b/engine/menus/init_gender.asm @@ -0,0 +1,111 @@ +InitCrystalData: ; 48000 + ld a, $1 + ld [wd474], a + xor a + ld [wd473], a + ld [wPlayerGender], a + ld [wd475], a + ld [wd476], a + ld [wd477], a + ld [wd478], a + ld [wd002], a + ld [wd003], a + ; could have done "ld a, [wd479] \ and %11111100", saved four operations + ld a, [wd479] + res 0, a + ld [wd479], a + ld a, [wd479] + res 1, a + ld [wd479], a + ret +; 4802f + +INCLUDE "mobile/mobile_12.asm" + +InitGender: ; 48dcb (12:4dcb) + call InitGenderScreen + call LoadGenderScreenPal + call LoadGenderScreenLightBlueTile + call WaitBGMap2 + call SetPalettes + ld hl, TextJump_AreYouABoyOrAreYouAGirl + call PrintText + ld hl, .MenuHeader + call LoadMenuHeader + call WaitBGMap2 + call VerticalMenu + call CloseWindow + ld a, [wMenuCursorY] + dec a + ld [wPlayerGender], a + ld c, 10 + call DelayFrames + ret +; 48dfc (12:4dfc) + +.MenuHeader: ; 0x48dfc + db MENU_BACKUP_TILES ; flags + menu_coords 6, 4, 12, 9 + dw .MenuData + db 1 ; default option +; 0x48e04 + +.MenuData: ; 0x48e04 + db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_DISABLE_B ; flags + db 2 ; items + db "Boy@" + db "Girl@" +; 0x48e0f + +TextJump_AreYouABoyOrAreYouAGirl: ; 0x48e0f + ; Are you a boy? Or are you a girl? + text_jump Text_AreYouABoyOrAreYouAGirl + db "@" +; 0x48e14 + +InitGenderScreen: ; 48e14 (12:4e14) + ld a, $10 + ld [wMusicFade], a + ld a, MUSIC_NONE + ld [wMusicFadeID], a + ld a, $0 + ld [wMusicFadeID + 1], a + ld c, 8 + call DelayFrames + call ClearBGPalettes + call InitCrystalData + call LoadFontsExtra + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, $0 + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + ret + +LoadGenderScreenPal: ; 48e47 (12:4e47) + ld hl, .Palette + ld de, wBGPals1 + ld bc, 1 palettes + ld a, BANK(wBGPals1) + call FarCopyWRAM + farcall ApplyPals + ret +; 48e5c (12:4e5c) + +.Palette: ; 48e5c +INCLUDE "gfx/new_game/gender_screen.pal" +; 48e64 + +LoadGenderScreenLightBlueTile: ; 48e64 (12:4e64) + ld de, .LightBlueTile + ld hl, vTiles2 tile $00 + lb bc, BANK(.LightBlueTile), 1 + call Get2bpp + ret +; 48e71 (12:4e71) + +.LightBlueTile: ; 48e71 +INCBIN "gfx/new_game/gender_screen.2bpp" diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm new file mode 100755 index 000000000..af6e0c09e --- /dev/null +++ b/engine/menus/intro_menu.asm @@ -0,0 +1,1418 @@ +_MainMenu: ; 5ae8 + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + ld de, MUSIC_MAIN_MENU + ld a, e + ld [wMapMusic], a + call PlayMusic + farcall MainMenu + jp StartTitleScreen +; 5b04 + +; unused + ret +; 5b05 + +PrintDayOfWeek: ; 5b05 + push de + ld hl, .Days + ld a, b + call GetNthString + ld d, h + ld e, l + pop hl + call PlaceString + ld h, b + ld l, c + ld de, .Day + call PlaceString + ret +; 5b1c + +.Days: ; 5b1c + db "SUN@" + db "MON@" + db "TUES@" + db "WEDNES@" + db "THURS@" + db "FRI@" + db "SATUR@" +; 5b40 + +.Day: ; 5b40 + db "DAY@" +; 5b44 + +NewGame_ClearTileMapEtc: ; 5b44 + xor a + ld [hMapAnims], a + call ClearTileMap + call LoadFontsExtra + call LoadStandardFont + call ClearWindowData + ret +; 5b54 + +MysteryGift: ; 5b54 + call UpdateTime + farcall DoMysteryGiftIfDayHasPassed + farcall DoMysteryGift + ret +; 5b64 + +OptionsMenu: ; 5b64 + farcall _OptionsMenu + ret +; 5b6b + +NewGame: ; 5b6b + xor a + ld [wMonStatusFlags], a + call ResetWRAM + call NewGame_ClearTileMapEtc + call AreYouABoyOrAreYouAGirl + call OakSpeech + call InitializeWorld + ld a, 1 + ld [wPreviousLandmark], a + + ld a, SPAWN_HOME + ld [wDefaultSpawnpoint], a + + ld a, MAPSETUP_WARP + ld [hMapEntryMethod], a + jp FinishContinueFunction +; 5b8f + +AreYouABoyOrAreYouAGirl: ; 5b8f + farcall Mobile_AlwaysReturnNotCarry ; some mobile stuff + jr c, .ok + farcall InitGender + ret + +.ok + ld c, 0 + farcall InitMobileProfile ; mobile + ret +; 5ba7 + +ResetWRAM: ; 5ba7 + xor a + ld [hBGMapMode], a + call _ResetWRAM + ret +; 5bae + +_ResetWRAM: ; 5bae + + ld hl, wVirtualOAM + ld bc, wOptions - wVirtualOAM + xor a + call ByteFill + + ld hl, WRAM1_Begin + ld bc, wGameData - WRAM1_Begin + xor a + call ByteFill + + ld hl, wGameData + ld bc, wGameDataEnd - wGameData + xor a + call ByteFill + + ld a, [rLY] + ld [hSecondsBackup], a + call DelayFrame + ld a, [hRandomSub] + ld [wPlayerID], a + + ld a, [rLY] + ld [hSecondsBackup], a + call DelayFrame + ld a, [hRandomAdd] + ld [wPlayerID + 1], a + + call Random + ld [wSecretID], a + call DelayFrame + call Random + ld [wSecretID + 1], a + + ld hl, wPartyCount + call .InitList + + xor a + ld [wCurBox], a + ld [wSavedAtLeastOnce], a + + call SetDefaultBoxNames + + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + call .InitList + call CloseSRAM + + ld hl, wNumItems + call .InitList + + ld hl, wNumKeyItems + call .InitList + + ld hl, wNumBalls + call .InitList + + ld hl, wPCItems + call .InitList + + xor a + ld [wRoamMon1Species], a + ld [wRoamMon2Species], a + ld [wRoamMon3Species], a + ld a, -1 + ld [wRoamMon1MapGroup], a + ld [wRoamMon2MapGroup], a + ld [wRoamMon3MapGroup], a + ld [wRoamMon1MapNumber], a + ld [wRoamMon2MapNumber], a + ld [wRoamMon3MapNumber], a + + ld a, BANK(sMysteryGiftItem) + call GetSRAMBank + ld hl, sMysteryGiftItem + xor a + ld [hli], a + dec a + ld [hl], a + call CloseSRAM + + call LoadOrRegenerateLuckyIDNumber + call InitializeMagikarpHouse + + xor a + ld [wMonType], a + + ld [wJohtoBadges], a + ld [wKantoBadges], a + + ld [wCoins], a + ld [wCoins + 1], a + +if START_MONEY >= $10000 + ld a, HIGH(START_MONEY >> 8) +endc + ld [wMoney], a + ld a, HIGH(START_MONEY) ; mid + ld [wMoney + 1], a + ld a, LOW(START_MONEY) + ld [wMoney + 2], a + + xor a + ld [wWhichMomItem], a + + ld hl, wMomItemTriggerBalance + ld [hl], HIGH(MOM_MONEY >> 8) + inc hl + ld [hl], HIGH(MOM_MONEY) ; mid + inc hl + ld [hl], LOW(MOM_MONEY) + + call InitializeNPCNames + + farcall InitDecorations + + farcall DeletePartyMonMail + + farcall DeleteMobileEventIndex + + call ResetGameTime + ret +; 5ca1 + +.InitList: ; 5ca1 +; Loads 0 in the count and -1 in the first item or mon slot. + xor a + ld [hli], a + dec a + ld [hl], a + ret +; 5ca6 + +SetDefaultBoxNames: ; 5ca6 + ld hl, wBoxNames + ld c, 0 +.loop + push hl + ld de, .Box + call CopyName2 + dec hl + ld a, c + inc a + cp 10 + jr c, .less + sub 10 + ld [hl], "1" + inc hl + +.less + add "0" + ld [hli], a + ld [hl], "@" + pop hl + ld de, 9 + add hl, de + inc c + ld a, c + cp NUM_BOXES + jr c, .loop + ret + +.Box: + db "BOX@" +; 5cd3 + +InitializeMagikarpHouse: ; 5cd3 + ld hl, wBestMagikarpLengthFeet + ld a, $3 + ld [hli], a + ld a, $6 + ld [hli], a + ld de, .Ralph + call CopyName2 + ret +; 5ce3 + +.Ralph: ; 5ce3 + db "RALPH@" +; 5ce9 + +InitializeNPCNames: ; 5ce9 + ld hl, .Rival + ld de, wRivalName + call .Copy + + ld hl, .Mom + ld de, wMomsName + call .Copy + + ld hl, .Red + ld de, wRedsName + call .Copy + + ld hl, .Green + ld de, wGreensName + +.Copy: + ld bc, NAME_LENGTH + call CopyBytes + ret + +.Rival: db "???@" +.Red: db "RED@" +.Green: db "GREEN@" +.Mom: db "MOM@" +; 5d23 + +InitializeWorld: ; 5d23 + call ShrinkPlayer + farcall SpawnPlayer + farcall _InitializeStartDay + ret +; 5d33 + +LoadOrRegenerateLuckyIDNumber: ; 5d33 + ld a, BANK(sLuckyIDNumber) + call GetSRAMBank + ld a, [wCurDay] + inc a + ld b, a + ld a, [sLuckyNumberDay] + cp b + ld a, [sLuckyIDNumber + 1] + ld c, a + ld a, [sLuckyIDNumber] + jr z, .skip + ld a, b + ld [sLuckyNumberDay], a + call Random + ld c, a + call Random + +.skip + ld [wLuckyIDNumber], a + ld [sLuckyIDNumber], a + ld a, c + ld [wLuckyIDNumber + 1], a + ld [sLuckyIDNumber + 1], a + jp CloseSRAM +; 5d65 + +Continue: ; 5d65 + farcall TryLoadSaveFile + jr c, .FailToLoad + farcall _LoadData + call LoadStandardMenuHeader + call DisplaySaveInfoOnContinue + ld a, $1 + ld [hBGMapMode], a + ld c, 20 + call DelayFrames + call ConfirmContinue + jr nc, .Check1Pass + call CloseWindow + jr .FailToLoad + +.Check1Pass: + call Continue_CheckRTC_RestartClock + jr nc, .Check2Pass + call CloseWindow + jr .FailToLoad + +.Check2Pass: + ld a, $8 + ld [wMusicFade], a + ld a, LOW(MUSIC_NONE) + ld [wMusicFadeID], a + ld a, HIGH(MUSIC_NONE) + ld [wMusicFadeID + 1], a + call ClearBGPalettes + call Continue_MobileAdapterMenu + call CloseWindow + call ClearTileMap + ld c, 20 + call DelayFrames + farcall JumpRoamMons + farcall MysteryGift_CopyReceivedDecosToPC ; Mystery Gift + farcall Function140ae ; time-related + ld a, [wSpawnAfterChampion] + cp SPAWN_LANCE + jr z, .SpawnAfterE4 + ld a, MAPSETUP_CONTINUE + ld [hMapEntryMethod], a + jp FinishContinueFunction + +.FailToLoad: + ret + +.SpawnAfterE4: + ld a, SPAWN_NEW_BARK + ld [wDefaultSpawnpoint], a + call PostCreditsSpawn + jp FinishContinueFunction +; 5de2 + +SpawnAfterRed: ; 5de2 + ld a, SPAWN_MT_SILVER + ld [wDefaultSpawnpoint], a +; 5de7 + +PostCreditsSpawn: ; 5de7 + xor a + ld [wSpawnAfterChampion], a + ld a, MAPSETUP_WARP + ld [hMapEntryMethod], a + ret +; 5df0 + +Continue_MobileAdapterMenu: ; 5df0 + farcall Mobile_AlwaysReturnNotCarry ; mobile check + ret nc + +; the rest of this stuff is never reached because +; the previous function returns with carry not set + ld hl, wd479 + bit 1, [hl] + ret nz + ld a, 5 + ld [wMusicFade], a + ld a, LOW(MUSIC_MOBILE_ADAPTER_MENU) + ld [wMusicFadeID], a + ld a, HIGH(MUSIC_MOBILE_ADAPTER_MENU) + ld [wMusicFadeID + 1], a + ld c, 20 + call DelayFrames + ld c, $1 + farcall InitMobileProfile ; mobile + farcall _SaveData + ld a, 8 + ld [wMusicFade], a + ld a, LOW(MUSIC_NONE) + ld [wMusicFadeID], a + ld a, HIGH(MUSIC_NONE) + ld [wMusicFadeID + 1], a + ld c, 35 + call DelayFrames + ret +; 5e34 + +ConfirmContinue: ; 5e34 +.loop + call DelayFrame + call GetJoypad + ld hl, hJoyPressed + bit A_BUTTON_F, [hl] + jr nz, .PressA + bit B_BUTTON_F, [hl] + jr z, .loop + scf + ret + +.PressA: + ret +; 5e48 + +Continue_CheckRTC_RestartClock: ; 5e48 + call CheckRTCStatus + and %10000000 ; Day count exceeded 16383 + jr z, .pass + farcall RestartClock + ld a, c + and a + jr z, .pass + scf + ret + +.pass + xor a + ret +; 5e5d + +FinishContinueFunction: ; 5e5d +.loop + xor a + ld [wDontPlayMapMusicOnReload], a + ld [wLinkMode], a + ld hl, wGameTimerPause + set GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] + res GAMETIMERPAUSE_MOBILE_7_F, [hl] + ld hl, wEnteredMapFromContinue + set 1, [hl] + farcall OverworldLoop + ld a, [wSpawnAfterChampion] + cp SPAWN_RED + jr z, .AfterRed + jp Reset + +.AfterRed: + call SpawnAfterRed + jr .loop +; 5e85 + +DisplaySaveInfoOnContinue: ; 5e85 + call CheckRTCStatus + and %10000000 + jr z, .clock_ok + lb de, 4, 8 + call DisplayContinueDataWithRTCError + ret + +.clock_ok + lb de, 4, 8 + call DisplayNormalContinueData + ret +; 5e9a + +DisplaySaveInfoOnSave: ; 5e9a + lb de, 4, 0 + jr DisplayNormalContinueData +; 5e9f + +DisplayNormalContinueData: ; 5e9f + call Continue_LoadMenuHeader + call Continue_DisplayBadgesDexPlayerName + call Continue_PrintGameTime + call LoadFontsExtra + call UpdateSprites + ret +; 5eaf + +DisplayContinueDataWithRTCError: ; 5eaf + call Continue_LoadMenuHeader + call Continue_DisplayBadgesDexPlayerName + call Continue_UnknownGameTime + call LoadFontsExtra + call UpdateSprites + ret +; 5ebf + +Continue_LoadMenuHeader: ; 5ebf + xor a + ld [hBGMapMode], a + ld hl, .MenuHeader_Dex + ld a, [wStatusFlags] + bit STATUSFLAGS_POKEDEX_F, a + jr nz, .show_menu + ld hl, .MenuHeader_NoDex + +.show_menu + call _OffsetMenuHeader + call MenuBox + call PlaceVerticalMenuItems + ret +; 5ed9 + +.MenuHeader_Dex: ; 5ed9 + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 15, 9 + dw .MenuData_Dex + db 1 ; default option +; 5ee1 + +.MenuData_Dex: ; 5ee1 + db 0 ; flags + db 4 ; items + db "PLAYER@" + db "BADGES@" + db "#DEX@" + db "TIME@" +; 5efb + +.MenuHeader_NoDex: ; 5efb + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 15, 9 + dw .MenuData_NoDex + db 1 ; default option +; 5f03 + +.MenuData_NoDex: ; 5f03 + db 0 ; flags + db 4 ; items + db "PLAYER @" + db "BADGES@" + db " @" + db "TIME@" +; 5f1c + + +Continue_DisplayBadgesDexPlayerName: ; 5f1c + call MenuBoxCoord2Tile + push hl + decoord 13, 4, 0 + add hl, de + call Continue_DisplayBadgeCount + pop hl + push hl + decoord 12, 6, 0 + add hl, de + call Continue_DisplayPokedexNumCaught + pop hl + push hl + decoord 8, 2, 0 + add hl, de + ld de, .Player + call PlaceString + pop hl + ret + +.Player: + db "@" +; 5f40 + +Continue_PrintGameTime: ; 5f40 + decoord 9, 8, 0 + add hl, de + call Continue_DisplayGameTime + ret +; 5f48 + +Continue_UnknownGameTime: ; 5f48 + decoord 9, 8, 0 + add hl, de + ld de, .three_question_marks + call PlaceString + ret + +.three_question_marks + db " ???@" +; 5f58 + +Continue_DisplayBadgeCount: ; 5f58 + push hl + ld hl, wJohtoBadges + ld b, 2 + call CountSetBits + pop hl + ld de, wd265 + lb bc, 1, 2 + jp PrintNum +; 5f6b + +Continue_DisplayPokedexNumCaught: ; 5f6b + ld a, [wStatusFlags] + bit STATUSFLAGS_POKEDEX_F, a + ret z + push hl + ld hl, wPokedexCaught +if NUM_POKEMON % 8 + ld b, NUM_POKEMON / 8 + 1 +else + ld b, NUM_POKEMON / 8 +endc + call CountSetBits + pop hl + ld de, wd265 + lb bc, 1, 3 + jp PrintNum +; 5f84 + +Continue_DisplayGameTime: ; 5f84 + ld de, wGameTimeHours + lb bc, 2, 3 + call PrintNum + ld [hl], "" + inc hl + ld de, wGameTimeMinutes + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + jp PrintNum +; 5f99 + + +OakSpeech: ; 0x5f99 + farcall InitClock + call RotateFourPalettesLeft + call ClearTileMap + + ld de, MUSIC_ROUTE_30 + call PlayMusic + + call RotateFourPalettesRight + call RotateThreePalettesRight + xor a + ld [wCurPartySpecies], a + ld a, POKEMON_PROF + ld [wTrainerClass], a + call Intro_PrepTrainerPic + + ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + call Intro_RotatePalettesLeftFrontpic + + ld hl, OakText1 + call PrintText + call RotateThreePalettesRight + call ClearTileMap + + ld a, WOOPER + ld [wCurSpecies], a + ld [wCurPartySpecies], a + call GetBaseData + + hlcoord 6, 4 + call PrepMonFrontpic + + xor a + ld [wTempMonDVs], a + ld [wTempMonDVs + 1], a + + ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + call Intro_WipeInFrontpic + + ld hl, OakText2 + call PrintText + ld hl, OakText4 + call PrintText + call RotateThreePalettesRight + call ClearTileMap + + xor a + ld [wCurPartySpecies], a + ld a, POKEMON_PROF + ld [wTrainerClass], a + call Intro_PrepTrainerPic + + ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + call Intro_RotatePalettesLeftFrontpic + + ld hl, OakText5 + call PrintText + call RotateThreePalettesRight + call ClearTileMap + + xor a + ld [wCurPartySpecies], a + farcall DrawIntroPlayerPic + + ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + call Intro_RotatePalettesLeftFrontpic + + ld hl, OakText6 + call PrintText + call NamePlayer + ld hl, OakText7 + call PrintText + ret + +OakText1: ; 0x6045 + text_jump _OakText1 + db "@" + +OakText2: ; 0x604a + text_jump _OakText2 + start_asm + ld a, WOOPER + call PlayMonCry + call WaitSFX + ld hl, OakText3 + ret + +OakText3: ; 0x605b + text_jump _OakText3 + db "@" + +OakText4: ; 0x6060 + text_jump _OakText4 + db "@" + +OakText5: ; 0x6065 + text_jump _OakText5 + db "@" + +OakText6: ; 0x606a + text_jump _OakText6 + db "@" + +OakText7: ; 0x606f + text_jump _OakText7 + db "@" + +NamePlayer: ; 0x6074 + farcall MovePlayerPicRight + farcall ShowPlayerNamingChoices + ld a, [wMenuCursorY] + dec a + jr z, .NewName + call StorePlayerName + farcall ApplyMonOrTrainerPals + farcall MovePlayerPicLeft + ret + +.NewName: + ld b, 1 + ld de, wPlayerName + farcall NamingScreen + + call RotateThreePalettesRight + call ClearTileMap + + call LoadFontsExtra + call WaitBGMap + + xor a + ld [wCurPartySpecies], a + farcall DrawIntroPlayerPic + + ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + call RotateThreePalettesLeft + + ld hl, wPlayerName + ld de, .Chris + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .Male + ld de, .Kris +.Male: + call InitName + ret + +.Chris: + db "CHRIS@@@@@@" +.Kris: + db "KRIS@@@@@@@" +; 60e9 + +Unreferenced_Function60e9: + call LoadMenuHeader + call VerticalMenu + ld a, [wMenuCursorY] + dec a + call CopyNameFromMenu + call CloseWindow + ret +; 60fa + +StorePlayerName: ; 60fa + ld a, "@" + ld bc, NAME_LENGTH + ld hl, wPlayerName + call ByteFill + ld hl, wPlayerName + ld de, wStringBuffer2 + call CopyName2 + ret +; 610f + +ShrinkPlayer: ; 610f + + ld a, [hROMBank] + push af + + ld a, 32 ; fade time + ld [wMusicFade], a + ld de, MUSIC_NONE + ld a, e + ld [wMusicFadeID], a + ld a, d + ld [wMusicFadeID + 1], a + + ld de, SFX_ESCAPE_ROPE + call PlaySFX + pop af + rst Bankswitch + + ld c, 8 + call DelayFrames + + ld hl, Shrink1Pic + ld b, BANK(Shrink1Pic) + call ShrinkFrame + + ld c, 8 + call DelayFrames + + ld hl, Shrink2Pic + ld b, BANK(Shrink2Pic) + call ShrinkFrame + + ld c, 8 + call DelayFrames + + hlcoord 6, 5 + ld b, 7 + ld c, 7 + call ClearBox + + ld c, 3 + call DelayFrames + + call Intro_PlacePlayerSprite + call LoadFontsExtra + + ld c, 50 + call DelayFrames + + call RotateThreePalettesRight + call ClearTileMap + ret +; 616a + +Intro_RotatePalettesLeftFrontpic: ; 616a + ld hl, IntroFadePalettes + ld b, IntroFadePalettes.End - IntroFadePalettes +.loop + ld a, [hli] + call DmgToCgbBGPals + ld c, 10 + call DelayFrames + dec b + jr nz, .loop + ret +; 617c + +IntroFadePalettes: ; 0x617c + db %01010100 + db %10101000 + db %11111100 + db %11111000 + db %11110100 + db %11100100 +.End +; 6182 + +Intro_WipeInFrontpic: ; 6182 + ld a, $77 + ld [hWX], a + call DelayFrame + ld a, %11100100 + call DmgToCgbBGPals +.loop + call DelayFrame + ld a, [hWX] + sub $8 + cp -1 + ret z + ld [hWX], a + jr .loop +; 619c + +Intro_PrepTrainerPic: ; 619c + ld de, vTiles2 + farcall GetTrainerPic + xor a + ld [hGraphicStartTile], a + hlcoord 6, 4 + lb bc, 7, 7 + predef PlaceGraphic + ret +; 61b4 + +ShrinkFrame: ; 61b4 + ld de, vTiles2 + ld c, 7 * 7 + predef DecompressGet2bpp + xor a + ld [hGraphicStartTile], a + hlcoord 6, 4 + lb bc, 7, 7 + predef PlaceGraphic + ret +; 61cd + +Intro_PlacePlayerSprite: ; 61cd + + farcall GetPlayerIcon + ld c, $c + ld hl, vTiles0 + call Request2bpp + + ld hl, wVirtualOAMSprite00 + ld de, .sprites + ld a, [de] + inc de + + ld c, a +.loop + ld a, [de] + inc de + ld [hli], a ; y + ld a, [de] + inc de + ld [hli], a ; x + ld a, [de] + inc de + ld [hli], a ; tile id + + ld b, PAL_OW_RED + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .male + ld b, PAL_OW_BLUE +.male + ld a, b + + ld [hli], a + dec c + jr nz, .loop + ret +; 61fe + +.sprites ; 61fe + db 4 + ; y pxl, x pxl, tile offset + db 9 * 8 + 4, 9 * 8, 0 + db 9 * 8 + 4, 10 * 8, 1 + db 10 * 8 + 4, 9 * 8, 2 + db 10 * 8 + 4, 10 * 8, 3 +; 620b + + +CrystalIntroSequence: ; 620b + callfar Copyright_GFPresents + jr c, StartTitleScreen + farcall CrystalIntro + +StartTitleScreen: ; 6219 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + call .TitleScreen + call DelayFrame +.loop + call RunTitleScreen + jr nc, .loop + + call ClearSprites + call ClearBGPalettes + + pop af + ld [rSVBK], a + + ld hl, rLCDC + res rLCDC_SPRITE_SIZE, [hl] ; 8x8 + call ClearScreen + call WaitBGMap2 + xor a + ld [hLCDCPointer], a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + ld b, SCGB_DIPLOMA + call GetSGBLayout + call UpdateTimePals + ld a, [wIntroSceneFrameCounter] + cp $5 + jr c, .ok + xor a +.ok + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 626a + +.dw + dw _MainMenu + dw DeleteSaveData + dw CrystalIntroSequence + dw CrystalIntroSequence + dw ResetClock +; 6274 + + +.TitleScreen: ; 6274 + farcall _TitleScreen + ret +; 627b + +RunTitleScreen: ; 627b + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done_title + call TitleScreenScene + farcall SuicuneFrameIterator + call DelayFrame + and a + ret + +.done_title + scf + ret +; 6292 + +Unreferenced_Function6292: ; 6292 + ld a, [hVBlankCounter] + and $7 + ret nz + ld hl, wLYOverrides + $5f + ld a, [hl] + dec a + ld bc, 2 * SCREEN_WIDTH + call ByteFill + ret +; 62a3 + +TitleScreenScene: ; 62a3 + ld e, a + ld d, 0 + ld hl, .scenes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 62af + +.scenes + dw TitleScreenEntrance + dw TitleScreenTimer + dw TitleScreenMain + dw TitleScreenEnd +; 62b7 + +.Unreferenced_NextScene: + ld hl, wJumptableIndex + inc [hl] + ret +; 62bc + + +TitleScreenEntrance: ; 62bc + +; Animate the logo: +; Move each line by 4 pixels until our count hits 0. + ld a, [hSCX] + and a + jr z, .done + sub 4 + ld [hSCX], a + +; Lay out a base (all lines scrolling together). + ld e, a + ld hl, wLYOverrides + ld bc, 8 * 10 ; logo height + call ByteFill + +; Reversed signage for every other line's position. +; This is responsible for the interlaced effect. + ld a, e + xor $ff + inc a + + ld b, 8 * 10 / 2 ; logo height / 2 + ld hl, wLYOverrides + 1 +.loop + ld [hli], a + inc hl + dec b + jr nz, .loop + + farcall AnimateTitleCrystal + ret + +.done +; Next scene + ld hl, wJumptableIndex + inc [hl] + xor a + ld [hLCDCPointer], a + +; Play the title screen music. + ld de, MUSIC_TITLE + call PlayMusic + + ld a, $88 + ld [hWY], a + ret +; 62f6 + + +TitleScreenTimer: ; 62f6 + +; Next scene + ld hl, wJumptableIndex + inc [hl] + +; Start a timer + ld hl, wTitleScreenTimer + ld de, 73 * 60 + 36 + ld [hl], e + inc hl + ld [hl], d + ret +; 6304 + +TitleScreenMain: ; 6304 + +; Run the timer down. + ld hl, wTitleScreenTimer + ld e, [hl] + inc hl + ld d, [hl] + ld a, e + or d + jr z, .end + + dec de + ld [hl], d + dec hl + ld [hl], e + +; Save data can be deleted by pressing Up + B + Select. + call GetJoypad + ld hl, hJoyDown + ld a, [hl] + and D_UP + B_BUTTON + SELECT + cp D_UP + B_BUTTON + SELECT + jr z, .delete_save_data + +; To bring up the clock reset dialog: + +; Hold Down + B + Select to initiate the sequence. + ld a, [hClockResetTrigger] + cp $34 + jr z, .check_clock_reset + + ld a, [hl] + and D_DOWN + B_BUTTON + SELECT + cp D_DOWN + B_BUTTON + SELECT + jr nz, .check_start + + ld a, $34 + ld [hClockResetTrigger], a + jr .check_start + +; Keep Select pressed, and hold Left + Up. +; Then let go of Select. +.check_clock_reset + bit SELECT_F, [hl] + jr nz, .check_start + + xor a + ld [hClockResetTrigger], a + + ld a, [hl] + and D_LEFT + D_UP + cp D_LEFT + D_UP + jr z, .clock_reset + +; Press Start or A to start the game. +.check_start + ld a, [hl] + and START | A_BUTTON + jr nz, .incave + ret + +.incave + ld a, 0 + jr .done + +.delete_save_data + ld a, 1 + +.done + ld [wIntroSceneFrameCounter], a + +; Return to the intro sequence. + ld hl, wJumptableIndex + set 7, [hl] + ret + +.end +; Next scene + ld hl, wJumptableIndex + inc [hl] + +; Fade out the title screen music + xor a + ld [wMusicFadeID], a + ld [wMusicFadeID + 1], a + ld hl, wMusicFade + ld [hl], 8 ; 1 second + + ld hl, wTitleScreenTimer + inc [hl] + ret + +.clock_reset + ld a, 4 + ld [wIntroSceneFrameCounter], a + +; Return to the intro sequence. + ld hl, wJumptableIndex + set 7, [hl] + ret +; 6375 + +TitleScreenEnd: ; 6375 + +; Wait until the music is done fading. + + ld hl, wTitleScreenTimer + inc [hl] + + ld a, [wMusicFade] + and a + ret nz + + ld a, 2 + ld [wIntroSceneFrameCounter], a + +; Back to the intro. + ld hl, wJumptableIndex + set 7, [hl] + ret +; 6389 + +DeleteSaveData: ; 6389 + farcall _DeleteSaveData + jp Init +; 6392 + +ResetClock: ; 6392 + farcall _ResetClock + jp Init +; 639b + +Unreferenced_Function639b: + ; If bit 0 or 1 of [wTitleScreenTimer] is set, we don't need to be here. + ld a, [wTitleScreenTimer] + and %00000011 + ret nz + ld bc, wSpriteAnim10 + ld hl, SPRITEANIMSTRUCT_FRAME + add hl, bc ; over-the-top compicated way to load wc3ae into hl + ld l, [hl] + ld h, 0 + add hl, hl + add hl, hl + ld de, .Data63ca + add hl, de + ; If bit 2 of [wTitleScreenTimer] is set, get the second dw; else, get the first dw + ld a, [wTitleScreenTimer] + and %00000100 + srl a + srl a + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + and a + ret z + ld e, a + ld d, [hl] + ld a, SPRITE_ANIM_INDEX_GS_TITLE_TRAIL + call _InitSpriteAnimStruct + ret +; 63ca + +.Data63ca: ; 63ca +; frame 0 y, x; frame 1 y, x + db 11 * 8 + 4, 10 * 8, 0 * 8, 0 * 8 + db 11 * 8 + 4, 13 * 8, 11 * 8 + 4, 11 * 8 + db 11 * 8 + 4, 13 * 8, 11 * 8 + 4, 15 * 8 + db 11 * 8 + 4, 17 * 8, 11 * 8 + 4, 15 * 8 + db 0 * 8, 0 * 8, 11 * 8 + 4, 15 * 8 + db 0 * 8, 0 * 8, 11 * 8 + 4, 11 * 8 +; 63e2 + +Copyright: ; 63e2 + call ClearTileMap + call LoadFontsExtra + ld de, CopyrightGFX + ld hl, vTiles2 tile $60 + lb bc, BANK(CopyrightGFX), 29 + call Request2bpp + hlcoord 2, 7 + ld de, CopyrightString + jp PlaceString +; 63fd + +CopyrightString: ; 63fd + ; ©1995-2001 Nintendo + db $60, $61, $62, $63, $64, $65, $66 + db $67, $68, $69, $6a, $6b, $6c + + ; ©1995-2001 Creatures inc. + next $60, $61, $62, $63, $64, $65, $66 + db $6d, $6e, $6f, $70, $71, $72, $7a, $7b, $7c + + ; ©1995-2001 GAME FREAK inc. + next $60, $61, $62, $63, $64, $65, $66 + db $73, $74, $75, $76, $77, $78, $79, $7a, $7b, $7c + + db "@" +; 642e + +GameInit:: ; 642e + farcall TryLoadSaveData + call ClearWindowData + call ClearBGPalettes + call ClearTileMap + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + xor a ; LOW(vBGMap0) + ld [hBGMapAddress], a + ld [hJoyDown], a + ld [hSCX], a + ld [hSCY], a + ld a, $90 + ld [hWY], a + call WaitBGMap + jp CrystalIntroSequence +; 6454 diff --git a/main.asm b/main.asm index 6a5102545..7c5610e5f 100644 --- a/main.asm +++ b/main.asm @@ -6,7 +6,7 @@ SECTION "bank1", ROMX INCLUDE "engine/routines/placewaitingtext.asm" INCLUDE "engine/routines/loadpushoam.asm" INCLUDE "engine/overworld/map_objects.asm" -INCLUDE "engine/intro_menu.asm" +INCLUDE "engine/menus/intro_menu.asm" INCLUDE "engine/overworld/init_map.asm" INCLUDE "engine/pokemon/learn.asm" INCLUDE "engine/routines/checknickerrors.asm" @@ -191,7 +191,7 @@ INCLUDE "engine/pokemon/mail.asm" SECTION "Crystal Features 1", ROMX -INCLUDE "engine/init_gender.asm" +INCLUDE "engine/menus/init_gender.asm" INCLUDE "engine/gfx/drawkrispackgfx.asm" INCLUDE "engine/events/move_tutor.asm" INCLUDE "engine/gfx/crystal_layouts.asm" -- cgit v1.2.3 From 0d9241889fc8a2f047b9fd6db25e55de1e721877 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sun, 25 Mar 2018 16:18:33 +0200 Subject: Organize the engine/ directory, take 3 Renamed `title` to `movies`. Moved some functions from `engine/routines/` to their fitting directories, and cleaned up the base `engine/` directory. Moved `engine/pokemon/tmhm.asm` back to `engine/items/`. Made a new subdirectory: * engine/tilesets: Contains all map-related graphics routines. --- Makefile | 2 +- engine/debug.asm | 1447 ------------- engine/dma_transfer.asm | 626 ------ engine/engine_flags.asm | 86 - engine/events/checksave.asm | 20 + engine/events/checktime.asm | 19 + engine/events/engine_flags.asm | 86 + engine/events/money.asm | 221 ++ engine/events/playslowcry.asm | 31 + engine/gfx/crystal_layouts.asm | 2 +- engine/gfx/dma_transfer.asm | 626 ++++++ engine/gfx/evolution_animation.asm | 368 ---- engine/gfx/gbc_only.asm | 149 -- engine/gfx/loadpushoam.asm | 21 + engine/gfx/map_palettes.asm | 86 - engine/gfx/mapgroup_roofs.asm | 20 - engine/gfx/tileset_anims.asm | 1060 ---------- engine/gfx/tileset_palettes.asm | 151 -- engine/gfx/timeofdaypals.asm | 415 ---- engine/gfx/trade_animation.asm | 1646 --------------- engine/items/tmhm.asm | 584 +++++- engine/items/tmhm2.asm | 49 + engine/link/link.asm | 2 +- engine/link/placewaitingtext.asm | 24 + engine/menus/debug.asm | 1447 +++++++++++++ engine/menus/save.asm | 1210 +++++++++++ engine/menus/savemenu_copytilemapatonce.asm | 77 + engine/money.asm | 221 -- engine/movie/credits.asm | 621 ++++++ engine/movie/crystal_intro.asm | 2199 ++++++++++++++++++++ engine/movie/evolution_animation.asm | 368 ++++ engine/movie/gbc_only.asm | 149 ++ engine/movie/init_hof_credits.asm | 79 + engine/movie/title.asm | 402 ++++ engine/movie/trade_animation.asm | 1646 +++++++++++++++ engine/movie/unused_title.asm | 178 ++ engine/phone/phonering_copytilemapatonce.asm | 80 + .../townmap_convertlinebreakcharacters.asm | 21 + engine/pokemon/checknickerrors.asm | 74 + engine/pokemon/correcterrorsinplayerparty.asm | 229 ++ engine/pokemon/tmhm.asm | 589 ------ engine/predef.asm | 29 - engine/routines/checknickerrors.asm | 74 - engine/routines/checksave.asm | 20 - engine/routines/checktime.asm | 19 - engine/routines/correcterrorsinplayerparty.asm | 229 -- engine/routines/loadpushoam.asm | 21 - engine/routines/phonering_copytilemapatonce.asm | 80 - engine/routines/placewaitingtext.asm | 24 - engine/routines/playslowcry.asm | 31 - engine/routines/predef.asm | 29 + engine/routines/savemenu_copytilemapatonce.asm | 77 - .../townmap_convertlinebreakcharacters.asm | 21 - engine/save.asm | 1210 ----------- engine/tilesets/map_palettes.asm | 86 + engine/tilesets/mapgroup_roofs.asm | 20 + engine/tilesets/tileset_anims.asm | 1060 ++++++++++ engine/tilesets/tileset_palettes.asm | 151 ++ engine/tilesets/timeofdaypals.asm | 415 ++++ engine/title/credits.asm | 621 ------ engine/title/crystal_intro.asm | 2199 -------------------- engine/title/init_hof_credits.asm | 79 - engine/title/title.asm | 402 ---- engine/title/unused_title.asm | 178 -- main.asm | 56 +- 65 files changed, 12231 insertions(+), 12231 deletions(-) delete mode 100755 engine/debug.asm delete mode 100755 engine/dma_transfer.asm delete mode 100644 engine/engine_flags.asm create mode 100644 engine/events/checksave.asm create mode 100644 engine/events/checktime.asm create mode 100644 engine/events/engine_flags.asm create mode 100755 engine/events/money.asm create mode 100644 engine/events/playslowcry.asm create mode 100755 engine/gfx/dma_transfer.asm delete mode 100755 engine/gfx/evolution_animation.asm delete mode 100644 engine/gfx/gbc_only.asm create mode 100644 engine/gfx/loadpushoam.asm delete mode 100644 engine/gfx/map_palettes.asm delete mode 100644 engine/gfx/mapgroup_roofs.asm delete mode 100644 engine/gfx/tileset_anims.asm delete mode 100644 engine/gfx/tileset_palettes.asm delete mode 100644 engine/gfx/timeofdaypals.asm delete mode 100755 engine/gfx/trade_animation.asm create mode 100755 engine/items/tmhm2.asm create mode 100644 engine/link/placewaitingtext.asm create mode 100755 engine/menus/debug.asm create mode 100644 engine/menus/save.asm create mode 100644 engine/menus/savemenu_copytilemapatonce.asm delete mode 100755 engine/money.asm create mode 100644 engine/movie/credits.asm create mode 100755 engine/movie/crystal_intro.asm create mode 100755 engine/movie/evolution_animation.asm create mode 100644 engine/movie/gbc_only.asm create mode 100644 engine/movie/init_hof_credits.asm create mode 100644 engine/movie/title.asm create mode 100755 engine/movie/trade_animation.asm create mode 100644 engine/movie/unused_title.asm create mode 100644 engine/phone/phonering_copytilemapatonce.asm create mode 100644 engine/pokegear/townmap_convertlinebreakcharacters.asm create mode 100644 engine/pokemon/checknickerrors.asm create mode 100644 engine/pokemon/correcterrorsinplayerparty.asm delete mode 100755 engine/pokemon/tmhm.asm delete mode 100644 engine/predef.asm delete mode 100644 engine/routines/checknickerrors.asm delete mode 100644 engine/routines/checksave.asm delete mode 100644 engine/routines/checktime.asm delete mode 100644 engine/routines/correcterrorsinplayerparty.asm delete mode 100644 engine/routines/loadpushoam.asm delete mode 100644 engine/routines/phonering_copytilemapatonce.asm delete mode 100644 engine/routines/placewaitingtext.asm delete mode 100644 engine/routines/playslowcry.asm create mode 100644 engine/routines/predef.asm delete mode 100644 engine/routines/savemenu_copytilemapatonce.asm delete mode 100644 engine/routines/townmap_convertlinebreakcharacters.asm delete mode 100644 engine/save.asm create mode 100644 engine/tilesets/map_palettes.asm create mode 100644 engine/tilesets/mapgroup_roofs.asm create mode 100644 engine/tilesets/tileset_anims.asm create mode 100644 engine/tilesets/tileset_palettes.asm create mode 100644 engine/tilesets/timeofdaypals.asm delete mode 100644 engine/title/credits.asm delete mode 100755 engine/title/crystal_intro.asm delete mode 100644 engine/title/init_hof_credits.asm delete mode 100644 engine/title/title.asm delete mode 100644 engine/title/unused_title.asm diff --git a/Makefile b/Makefile index cb2c366d0..14235ff3b 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ data/maps/map_data.o \ data/pokemon/dex_entries.o \ data/pokemon/egg_moves.o \ data/pokemon/evos_attacks.o \ -engine/title/credits.o \ +engine/movie/credits.o \ engine/overworld/events.o \ gfx/pics.o \ gfx/sprites.o \ diff --git a/engine/debug.asm b/engine/debug.asm deleted file mode 100755 index 4c3110fe1..000000000 --- a/engine/debug.asm +++ /dev/null @@ -1,1447 +0,0 @@ - const_def $6a - const DEBUGTEST_UP_ARROW ; $6a - const DEBUGTEST_TICKS ; $6b - const DEBUGTEST_WHITE ; $6c - const DEBUGTEST_LIGHT ; $6d - const DEBUGTEST_DARK ; $6e - const DEBUGTEST_BLACK ; $6f - const DEBUGTEST_0 ; $70 - const DEBUGTEST_1 ; $71 - const DEBUGTEST_2 ; $72 - const DEBUGTEST_3 ; $73 - const DEBUGTEST_4 ; $74 - const DEBUGTEST_5 ; $75 - const DEBUGTEST_6 ; $76 - const DEBUGTEST_7 ; $77 - const DEBUGTEST_8 ; $78 - const DEBUGTEST_9 ; $79 - const DEBUGTEST_A ; $7a - const DEBUGTEST_B ; $7b - const DEBUGTEST_C ; $7c - const DEBUGTEST_D ; $7d - const DEBUGTEST_E ; $7e - const DEBUGTEST_F ; $7f - -ColorTest: ; 818ac -; A debug menu to test monster and trainer palettes at runtime. - - ld a, [hCGB] - and a - jr nz, .asm_818b5 - ld a, [hSGB] - and a - ret z - -.asm_818b5 - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - call DisableLCD - call Function81948 - call Function8197c - call Function819a7 - call Function818f4 - call EnableLCD - ld de, MUSIC_NONE - call PlayMusic - xor a - ld [wJumptableIndex], a - ld [wcf66], a - ld [wd003], a -.asm_818de - ld a, [wJumptableIndex] - bit 7, a - jr nz, .asm_818f0 - call Function81a74 - call Function81f5e - call DelayFrame - jr .asm_818de - -.asm_818f0 - pop af - ld [hInMenu], a - ret -; 818f4 - -Function818f4: ; 818f4 - ld a, [wd002] - and a - jr nz, Function81911 - ld hl, PokemonPalettes - -Function818fd: ; 818fd - ld de, wOverworldMap - ld c, NUM_POKEMON + 1 -.asm_81902 - push bc - push hl - call Function81928 - pop hl - ld bc, 8 - add hl, bc - pop bc - dec c - jr nz, .asm_81902 - ret - -Function81911: ; 81911 - ld hl, TrainerPalettes - ld de, wOverworldMap - ld c, NUM_TRAINER_CLASSES -.asm_81919 - push bc - push hl - call Function81928 - pop hl - ld bc, 4 - add hl, bc - pop bc - dec c - jr nz, .asm_81919 - ret -; 81928 - -Function81928: ; 81928 - ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) - call GetFarByte - ld [de], a - inc de - inc hl - ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) - call GetFarByte - ld [de], a - inc de - inc hl - ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) - call GetFarByte - ld [de], a - inc de - inc hl - ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) - call GetFarByte - ld [de], a - inc de - ret -; 81948 - -Function81948: ; 81948 - ld a, $1 - ld [rVBK], a - ld hl, vTiles0 - ld bc, sScratch - vTiles0 - xor a - call ByteFill - ld a, $0 - ld [rVBK], a - ld hl, vTiles0 - ld bc, sScratch - vTiles0 - xor a - call ByteFill - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - call ClearSprites - ret -; 8197c - -Function8197c: ; 8197c - ld hl, DebugColorTestGFX + 1 tiles - ld de, vTiles2 tile DEBUGTEST_UP_ARROW - ld bc, 22 tiles - call CopyBytes - ld hl, DebugColorTestGFX - ld de, vTiles0 - ld bc, 1 tiles - call CopyBytes - call LoadStandardFont - ld hl, vTiles1 - lb bc, 8, 0 -.asm_8199d - ld a, [hl] - xor $ff - ld [hli], a - dec bc - ld a, c - or b - jr nz, .asm_8199d - ret -; 819a7 - -Function819a7: ; 819a7 - ld a, [hCGB] - and a - ret z - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - ld hl, Palette_DebugBG - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - ld a, 1 << rBGPI_AUTO_INCREMENT - ld [rBGPI], a - ld hl, Palette_DebugBG - ld c, 8 palettes - xor a -.asm_819c8 - ld [rBGPD], a - dec c - jr nz, .asm_819c8 - ld a, 1 << rOBPI_AUTO_INCREMENT - ld [rOBPI], a - ld hl, Palette_DebugOB - ld c, 8 palettes -.asm_819d6 - ld a, [hli] - ld [rOBPD], a - dec c - jr nz, .asm_819d6 - ld a, $94 - ld [wc608], a - ld a, $52 - ld [wc608 + 1], a - ld a, $4a - ld [wc608 + 2], a - ld a, $29 - ld [wc608 + 3], a - pop af - ld [rSVBK], a - ret -; 819f4 - -Palette_DebugBG: ; 819f4 -INCLUDE "gfx/debug/bg.pal" - -Palette_DebugOB: ; 81a34 -INCLUDE "gfx/debug/ob.pal" -; 81a74 - -Function81a74: ; 81a74 - call JoyTextDelay - ld a, [wJumptableIndex] - cp $4 - jr nc, .asm_81a8b - ld hl, hJoyLast - ld a, [hl] - and SELECT - jr nz, .asm_81a9a - ld a, [hl] - and START - jr nz, .asm_81aab - -.asm_81a8b - ld a, [wJumptableIndex] - ld e, a - ld d, 0 - ld hl, Jumptable_81acf - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.asm_81a9a - call Function81eca - call Function81ac3 - ld e, a - ld a, [wcf66] - inc a - cp e - jr c, .asm_81aba - xor a - jr .asm_81aba - -.asm_81aab - call Function81eca - ld a, [wcf66] - dec a - cp $ff - jr nz, .asm_81aba - call Function81ac3 - dec a - -.asm_81aba - ld [wcf66], a - ld a, $0 - ld [wJumptableIndex], a - ret -; 81ac3 - -Function81ac3: ; 81ac3 -; Looping back around the pic set. - ld a, [wd002] - and a - jr nz, .asm_81acc - ld a, NUM_POKEMON ; CELEBI - ret - -.asm_81acc - ld a, NUM_TRAINER_CLASSES - 1 ; MYSTICALMAN - ret -; 81acf - -Jumptable_81acf: ; 81acf - dw Function81adb - dw Function81c18 - dw Function81c33 - dw Function81cc2 - dw Function81d8e - dw Function81daf -; 81adb - -Function81adb: ; 81adb - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, DEBUGTEST_BLACK - call ByteFill - hlcoord 1, 3 - lb bc, 7, 18 - ld a, DEBUGTEST_WHITE - call Bank20_FillBoxWithByte - hlcoord 11, 0 - lb bc, 2, 3 - ld a, DEBUGTEST_LIGHT - call Bank20_FillBoxWithByte - hlcoord 16, 0 - lb bc, 2, 3 - ld a, DEBUGTEST_DARK - call Bank20_FillBoxWithByte - call Function81bc0 - call Function81bf4 - ld a, [wcf66] - inc a - ld [wCurPartySpecies], a - ld [wd265], a - hlcoord 0, 1 - ld de, wd265 - lb bc, PRINTNUM_LEADINGZEROS | 1, 3 - call PrintNum - ld a, [wd002] - and a - jr nz, .asm_81b7a - ld a, $1 - ld [wUnownLetter], a - call GetPokemonName - hlcoord 4, 1 - call PlaceString - xor a - ld [wBoxAlignment], a - hlcoord 12, 3 - call _PrepMonFrontpic - ld de, vTiles2 tile $31 - predef GetMonBackpic - ld a, $31 - ld [hGraphicStartTile], a - hlcoord 2, 4 - lb bc, 6, 6 - predef PlaceGraphic - ld a, [wd003] - and a - jr z, .asm_81b66 - ld de, String_81baf - jr .asm_81b69 - -.asm_81b66 - ld de, String_81bb4 - -.asm_81b69 - hlcoord 7, 17 - call PlaceString - hlcoord 0, 17 - ld de, String_81bb9 - call PlaceString - jr .asm_81ba9 - -.asm_81b7a - ld a, [wd265] - ld [wTrainerClass], a - callfar GetTrainerAttributes - ld de, wStringBuffer1 - hlcoord 4, 1 - call PlaceString - ld de, vTiles2 - callfar GetTrainerPic - xor a - ld [wTempEnemyMonSpecies], a - ld [hGraphicStartTile], a - hlcoord 2, 3 - lb bc, 7, 7 - predef PlaceGraphic - -.asm_81ba9 - ld a, $1 - ld [wJumptableIndex], a - ret -; 81baf - -String_81baf: db "レア", DEBUGTEST_BLACK, DEBUGTEST_BLACK, "@" ; rare (shiny) -String_81bb4: db "ノーマル@" ; normal -String_81bb9: db DEBUGTEST_A, "きりかえ▶@" ; (A) switches -; 81bc0 - -Function81bc0: ; 81bc0 - decoord 0, 11, wAttrMap - hlcoord 2, 11 - ld a, $1 - call Function81bde - decoord 0, 13, wAttrMap - hlcoord 2, 13 - ld a, $2 - call Function81bde - decoord 0, 15, wAttrMap - hlcoord 2, 15 - ld a, $3 - -Function81bde: ; 81bde - push af - ld a, DEBUGTEST_UP_ARROW - ld [hli], a - ld bc, $f - ld a, DEBUGTEST_TICKS - call ByteFill - ld l, e - ld h, d - pop af - ld bc, $28 - call ByteFill - ret -; 81bf4 - -Function81bf4: ; 81bf4 - ld a, [wcf66] - inc a - ld l, a - ld h, $0 - add hl, hl - add hl, hl - ld de, wOverworldMap - add hl, de - ld de, wc608 - ld bc, 4 - call CopyBytes - xor a - ld [wcf64], a - ld [wcf65], a - ld de, wc608 - call Function81ea5 - ret -; 81c18 - -Function81c18: ; 81c18 - ld a, [hCGB] - and a - jr z, .asm_81c2a - ld a, $2 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - call DelayFrame - -.asm_81c2a - call WaitBGMap - ld a, $2 - ld [wJumptableIndex], a - ret -; 81c33 - -Function81c33: ; 81c33 - ld a, [hCGB] - and a - jr z, .asm_81c69 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - ld hl, wBGPals2 - ld de, wc608 - ld c, $1 - call Function81ee3 - hlcoord 10, 2 - ld de, wc608 - call Function81ca7 - hlcoord 15, 2 - ld de, wc608 + 2 - call Function81ca7 - ld a, $1 - ld [hCGBPalUpdate], a - ld a, $3 - ld [wJumptableIndex], a - pop af - ld [rSVBK], a - ret - -.asm_81c69 - ld hl, wSGBPals - ld a, 1 - ld [hli], a - ld a, LOW(PALRGB_WHITE) - ld [hli], a - ld a, HIGH(PALRGB_WHITE) - ld [hli], a - ld a, [wc608] - ld [hli], a - ld a, [wc608 + 1] - ld [hli], a - ld a, [wc608 + 2] - ld [hli], a - ld a, [wc608 + 3] - ld [hli], a - xor a - ld [hli], a - ld [hli], a - ld [hl], a - ld hl, wSGBPals - call Function81f0c - hlcoord 10, 2 - ld de, wc608 - call Function81ca7 - hlcoord 15, 2 - ld de, wc608 + 2 - call Function81ca7 - ld a, $3 - ld [wJumptableIndex], a - ret -; 81ca7 - -Function81ca7: ; 81ca7 - inc hl - inc hl - inc hl - ld a, [de] - call Function81cbc - ld a, [de] - swap a - call Function81cbc - inc de - ld a, [de] - call Function81cbc - ld a, [de] - swap a - -Function81cbc: ; 81cbc - and $f - add DEBUGTEST_0 - ld [hld], a - ret -; 81cc2 - -Function81cc2: ; 81cc2 - ld a, [hJoyLast] - and B_BUTTON - jr nz, .asm_81cdf - ld a, [hJoyLast] - and A_BUTTON - jr nz, .asm_81ce5 - ld a, [wcf64] - and $3 - ld e, a - ld d, 0 - ld hl, Jumptable_81d02 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.asm_81cdf - ld a, $4 - ld [wJumptableIndex], a - ret - -.asm_81ce5 - ld a, [wd002] - and a - ret nz - ld a, [wd003] - xor $4 - ld [wd003], a - ld c, a - ld b, 0 - ld hl, PokemonPalettes - add hl, bc - call Function818fd - ld a, $0 - ld [wJumptableIndex], a - ret -; 81d02 - -Jumptable_81d02: ; 81d02 - dw Function81d0a - dw Function81d34 - dw Function81d46 - dw Function81d58 -; 81d0a - -Function81d0a: ; 81d0a - ld hl, hJoyLast - ld a, [hl] - and D_DOWN - jr nz, Function81d89 - ld a, [hl] - and D_LEFT - jr nz, .asm_81d1d - ld a, [hl] - and D_RIGHT - jr nz, .asm_81d28 - ret - -.asm_81d1d - xor a - ld [wcf65], a - ld de, wc608 - call Function81ea5 - ret - -.asm_81d28 - ld a, $1 - ld [wcf65], a - ld de, wc608 + 2 - call Function81ea5 - ret - -Function81d34: ; 81d34 - ld hl, hJoyLast - ld a, [hl] - and D_DOWN - jr nz, Function81d89 - ld a, [hl] - and D_UP - jr nz, Function81d84 - ld hl, wc608 + 10 - jr Function81d63 - -Function81d46: ; 81d46 - ld hl, hJoyLast - ld a, [hl] - and D_DOWN - jr nz, Function81d89 - ld a, [hl] - and D_UP - jr nz, Function81d84 - ld hl, wc608 + 11 - jr Function81d63 - -Function81d58: ; 81d58 - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, Function81d84 - ld hl, wc608 + 12 - -Function81d63: ; 81d63 - ld a, [hJoyLast] - and D_RIGHT - jr nz, Function81d70 - ld a, [hJoyLast] - and D_LEFT - jr nz, Function81d77 - ret - -Function81d70: ; 81d70 - ld a, [hl] - cp $1f - ret nc - inc [hl] - jr Function81d7b - -Function81d77: ; 81d77 - ld a, [hl] - and a - ret z - dec [hl] - -Function81d7b: ; 81d7b - call Function81e67 - ld a, $2 - ld [wJumptableIndex], a - ret - -Function81d84: ; 81d84 - ld hl, wcf64 - dec [hl] - ret - -Function81d89: ; 81d89 - ld hl, wcf64 - inc [hl] - ret -; 81d8e - -Function81d8e: ; 81d8e - hlcoord 0, 10 - ld bc, $a0 - ld a, DEBUGTEST_BLACK - call ByteFill - hlcoord 2, 12 - ld de, String_81fcd - call PlaceString - xor a - ld [wd004], a - call Function81df4 - ld a, $5 - ld [wJumptableIndex], a - ret -; 81daf - -Function81daf: ; 81daf - ld hl, hJoyPressed - ld a, [hl] - and B_BUTTON - jr nz, .asm_81dbb - call Function81dc7 - ret - -.asm_81dbb - ld a, $0 - ld [wJumptableIndex], a - ret -; 81dc1 - -Function81dc1: ; 81dc1 - ld hl, wJumptableIndex - set 7, [hl] - ret -; 81dc7 - -Function81dc7: ; 81dc7 - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, .asm_81dd5 - ld a, [hl] - and D_DOWN - jr nz, .asm_81de2 - ret - -.asm_81dd5 - ld a, [wd004] - cp $3b - jr z, .asm_81ddf - inc a - jr .asm_81ded - -.asm_81ddf - xor a - jr .asm_81ded - -.asm_81de2 - ld a, [wd004] - and a - jr z, .asm_81deb - dec a - jr .asm_81ded - -.asm_81deb - ld a, $3b - -.asm_81ded - ld [wd004], a - call Function81df4 - ret -; 81df4 - -Function81df4: ; 81df4 - hlcoord 10, 11 - call Function81e5e - hlcoord 10, 12 - call Function81e5e - hlcoord 10, 13 - call Function81e5e - hlcoord 10, 14 - call Function81e5e - ld a, [wd004] - inc a - ld [wd265], a - predef GetTMHMMove - ld a, [wd265] - ld [wPutativeTMHMMove], a - call GetMoveName - hlcoord 10, 12 - call PlaceString - ld a, [wd004] - call Function81e55 - ld [wCurItem], a - predef CanLearnTMHMMove - ld a, c - and a - ld de, String_81e46 - jr nz, .asm_81e3f - ld de, String_81e4d - -.asm_81e3f - hlcoord 10, 14 - call PlaceString - ret -; 81e46 - -String_81e46: db "おぼえられる@" ; can be taught -String_81e4d: db "おぼえられない@" ; cannot be taught -; 81e55 - -Function81e55: ; 81e55 - cp $32 - jr c, .asm_81e5b - inc a - inc a - -.asm_81e5b - add $bf - ret -; 81e5e - -Function81e5e: ; 81e5e - ld bc, 10 - ld a, DEBUGTEST_BLACK - call ByteFill - ret -; 81e67 - -Function81e67: ; 81e67 - ld a, [wc608 + 10] - and $1f - ld e, a - ld a, [wc608 + 11] - and $7 - sla a - swap a - or e - ld e, a - ld a, [wc608 + 11] - and $18 - sla a - swap a - ld d, a - ld a, [wc608 + 12] - and $1f - sla a - sla a - or d - ld d, a - ld a, [wcf65] - and a - jr z, .asm_81e9c - ld a, e - ld [wc608 + 2], a - ld a, d - ld [wc608 + 3], a - ret - -.asm_81e9c - ld a, e - ld [wc608], a - ld a, d - ld [wc608 + 1], a - ret -; 81ea5 - -Function81ea5: ; 81ea5 - ld a, [de] - and $1f - ld [wc608 + 10], a - ld a, [de] - and $e0 - swap a - srl a - ld b, a - inc de - ld a, [de] - and $3 - swap a - srl a - or b - ld [wc608 + 11], a - ld a, [de] - and $7c - srl a - srl a - ld [wc608 + 12], a - ret -; 81eca - -Function81eca: ; 81eca - ld a, [wcf66] - inc a - ld l, a - ld h, $0 - add hl, hl - add hl, hl - ld de, wOverworldMap - add hl, de - ld e, l - ld d, h - ld hl, wc608 - ld bc, 4 - call CopyBytes - ret -; 81ee3 - -Function81ee3: ; 81ee3 -.asm_81ee3 - ld a, LOW(PALRGB_WHITE) - ld [hli], a - ld a, HIGH(PALRGB_WHITE) - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - xor a - ld [hli], a - ld [hli], a - dec c - jr nz, .asm_81ee3 - ret -; 81efc - -Bank20_FillBoxWithByte: ; 81efc -; For some reason, we have another copy of FillBoxWithByte here -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret -; 81f0c - -Function81f0c: ; 81f0c - ld a, [wcfbe] - push af - set 7, a - ld [wcfbe], a - call Function81f1d - pop af - ld [wcfbe], a - ret -; 81f1d - -Function81f1d: ; 81f1d - ld a, [hl] - and $7 - ret z - ld b, a -.asm_81f22 - push bc - xor a - ld [rJOYP], a - ld a, $30 - ld [rJOYP], a - ld b, $10 -.asm_81f2c - ld e, $8 - ld a, [hli] - ld d, a -.asm_81f30 - bit 0, d - ld a, $10 - jr nz, .asm_81f38 - ld a, $20 - -.asm_81f38 - ld [rJOYP], a - ld a, $30 - ld [rJOYP], a - rr d - dec e - jr nz, .asm_81f30 - dec b - jr nz, .asm_81f2c - ld a, $20 - ld [rJOYP], a - ld a, $30 - ld [rJOYP], a - ld de, 7000 -.asm_81f51 - nop - nop - nop - dec de - ld a, d - or e - jr nz, .asm_81f51 - pop bc - dec b - jr nz, .asm_81f22 - ret -; 81f5e - -Function81f5e: ; 81f5e - ld a, DEBUGTEST_BLACK - hlcoord 10, 0 - ld [hl], a - hlcoord 15, 0 - ld [hl], a - hlcoord 1, 11 - ld [hl], a - hlcoord 1, 13 - ld [hl], a - hlcoord 1, 15 - ld [hl], a - ld a, [wJumptableIndex] - cp $3 - jr nz, .asm_81fc9 - ld a, [wcf64] - and a - jr z, .asm_81f8d - dec a - hlcoord 1, 11 - ld bc, 2 * SCREEN_WIDTH - call AddNTimes - ld [hl], $ed - -.asm_81f8d - ld a, [wcf65] - and a - jr z, .asm_81f98 - hlcoord 15, 0 - jr .asm_81f9b - -.asm_81f98 - hlcoord 10, 0 - -.asm_81f9b - ld [hl], $ed - ld b, $70 - ld c, $5 - ld hl, wVirtualOAM - ld de, wc608 + 10 - call .asm_81fb7 - ld de, wc608 + 11 - call .asm_81fb7 - ld de, wc608 + 12 - call .asm_81fb7 - ret - -.asm_81fb7 - ld a, b - ld [hli], a ; y - ld a, [de] - add a - add a - add 3 * TILE_WIDTH - ld [hli], a ; x - xor a - ld [hli], a ; tile id - ld a, c - ld [hli], a ; attributes - ld a, 2 * TILE_WIDTH - add b - ld b, a - inc c - ret - -.asm_81fc9 - call ClearSprites - ret -; 81fcd - -String_81fcd: ; 81fcd - db "おわりますか?" ; Are you finished? - next "はい", DEBUGTEST_A ; YES...(A) - next "いいえ", DEBUGTEST_B ; NO..(B) - db "@" -; 81fe3 - -DebugColorTestGFX: -INCBIN "gfx/debug/color_test.2bpp" - - -TilesetColorTest: - ret - xor a - ld [wJumptableIndex], a - ld [wcf64], a - ld [wcf65], a - ld [wcf66], a - ld [hMapAnims], a - call ClearSprites - call OverworldTextModeSwitch - call WaitBGMap2 - xor a - ld [hBGMapMode], a - ld de, DebugColorTestGFX + 1 tiles - ld hl, vTiles2 tile DEBUGTEST_UP_ARROW - lb bc, BANK(DebugColorTestGFX), 22 - call Request2bpp - ld de, DebugColorTestGFX - ld hl, vTiles1 - lb bc, BANK(DebugColorTestGFX), 1 - call Request2bpp - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, DEBUGTEST_BLACK - call ByteFill - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $7 - call ByteFill - ld de, $15 - ld a, DEBUGTEST_WHITE - call Function821d2 - ld de, $1a - ld a, DEBUGTEST_LIGHT - call Function821d2 - ld de, $1f - ld a, DEBUGTEST_DARK - call Function821d2 - ld de, $24 - ld a, DEBUGTEST_BLACK - call Function821d2 - call Function821f4 - call Function8220f - call WaitBGMap2 - ld [wJumptableIndex], a - ld a, $40 - ld [hWY], a - ret -; 821d2 - -Function821d2: ; 821d2 - hlcoord 0, 0 - call Function821de - -Function821d8: ; 821d8 - ld a, [wcf64] - hlcoord 0, 0, wAttrMap - -Function821de: ; 821de - add hl, de -rept 4 - ld [hli], a -endr - ld bc, $10 - add hl, bc -rept 4 - ld [hli], a -endr - ld bc, $10 - add hl, bc -rept 4 - ld [hli], a -endr - ret -; 821f4 - -Function821f4: ; 821f4 - hlcoord 2, 4 - call Function82203 - hlcoord 2, 6 - call Function82203 - hlcoord 2, 8 - -Function82203: ; 82203 - ld a, DEBUGTEST_UP_ARROW - ld [hli], a - ld bc, $10 - 1 - ld a, DEBUGTEST_TICKS - call ByteFill - ret -; 8220f - -Function8220f: ; 8220f - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld a, [wcf64] - ld l, a - ld h, $0 - add hl, hl - add hl, hl - add hl, hl - ld de, wBGPals1 - add hl, de - ld de, wc608 - ld bc, 8 - call CopyBytes - ld de, wc608 - call Function81ea5 - pop af - ld [rSVBK], a - ret -; 82236 - - -Function82236: ; 82236 - ld hl, hJoyLast - ld a, [hl] - and SELECT - jr nz, .loop7 - ld a, [hl] - and B_BUTTON - jr nz, .asm_82299 - call Function822f0 - ret - -.loop7 - ld hl, wcf64 - ld a, [hl] - inc a - and $7 - cp $7 - jr nz, .asm_82253 - xor a - -.asm_82253 - ld [hl], a - ld de, $15 - call Function821d8 - ld de, $1a - call Function821d8 - ld de, $1f - call Function821d8 - ld de, $24 - call Function821d8 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - ld hl, wBGPals2 - ld a, [wcf64] - ld bc, 1 palettes - call AddNTimes - ld de, wc608 - ld bc, 1 palettes - call CopyBytes - pop af - ld [rSVBK], a - ld a, $2 - ld [hBGMapMode], a - ld c, 3 - call DelayFrames - ld a, $1 - ld [hBGMapMode], a - ret - -.asm_82299 - call ClearSprites - ld a, [hWY] - xor $d0 - ld [hWY], a - ret -; 822a3 - -Function822a3: ; 822a3 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - ld hl, wBGPals2 - ld a, [wcf64] - ld bc, 1 palettes - call AddNTimes - ld e, l - ld d, h - ld hl, wc608 - ld bc, 1 palettes - call CopyBytes - hlcoord 1, 0 - ld de, wc608 - call Function81ca7 - hlcoord 6, 0 - ld de, wc608 + 2 - call Function81ca7 - hlcoord 11, 0 - ld de, wc608 + 4 - call Function81ca7 - hlcoord 16, 0 - ld de, wc608 + 6 - call Function81ca7 - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - call DelayFrame - ret -; 822f0 - -Function822f0: ; 822f0 - ld a, [wcf65] - and 3 - ld e, a - ld d, 0 - ld hl, .dw - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 82301 - -.dw ; 82301 - dw Function82309 - dw Function82339 - dw Function8234b - dw Function8235d -; 82309 - -Function82309: ; 82309 - ld hl, hJoyLast - ld a, [hl] - and D_DOWN - jr nz, Function8238c - ld a, [hl] - and D_LEFT - jr nz, .asm_8231c - ld a, [hl] - and D_RIGHT - jr nz, .asm_82322 - ret - -.asm_8231c - ld a, [wcf66] - dec a - jr .asm_82326 - -.asm_82322 - ld a, [wcf66] - inc a - -.asm_82326 - and $3 - ld [wcf66], a - ld e, a - ld d, $0 - ld hl, wc608 - add hl, de - add hl, de - ld e, l - ld d, h - call Function81ea5 - ret - -Function82339: ; 82338 - ld hl, hJoyLast - ld a, [hl] - and D_DOWN - jr nz, Function8238c - ld a, [hl] - and D_UP - jr nz, Function82387 - ld hl, wc608 + 10 - jr Function82368 - -Function8234b: ; 8234b - ld hl, hJoyLast - ld a, [hl] - and D_DOWN - jr nz, Function8238c - ld a, [hl] - and D_UP - jr nz, Function82387 - ld hl, wc608 + 11 - jr Function82368 - -Function8235d: ; 8235d - ld hl, hJoyLast - ld a, [hl] - and D_UP - jr nz, Function82387 - ld hl, wc608 + 12 - -Function82368: ; 82368 - ld a, [hJoyLast] - and D_RIGHT - jr nz, .asm_82375 - ld a, [hJoyLast] - and D_LEFT - jr nz, .asm_8237c - ret - -.asm_82375 - ld a, [hl] - cp $1f - ret nc - inc [hl] - jr .asm_82380 - -.asm_8237c - ld a, [hl] - and a - ret z - dec [hl] - -.asm_82380 - call Function82391 - call Function822a3 - ret - -Function82387: ; 82387 - ld hl, wcf65 - dec [hl] - ret - -Function8238c: ; 8238c - ld hl, wcf65 - inc [hl] - ret -; 82391 - -Function82391: ; 82391 - ld a, [wc608 + 10] - and $1f - ld e, a - ld a, [wc608 + 11] - and $7 - sla a - swap a - or e - ld e, a - ld a, [wc608 + 11] - and $18 - sla a - swap a - ld d, a - ld a, [wc608 + 12] - and $1f - sla a - sla a - or d - ld d, a - ld a, [wcf66] - ld c, a - ld b, $0 - ld hl, wc608 - add hl, bc - add hl, bc - ld a, e - ld [hli], a - ld [hl], d - ret -; 823c6 - -Function823c6: ; 823c6 - ret - -Function823c7: ; 823c7 - ret -; 823c8 diff --git a/engine/dma_transfer.asm b/engine/dma_transfer.asm deleted file mode 100755 index e22adf69a..000000000 --- a/engine/dma_transfer.asm +++ /dev/null @@ -1,626 +0,0 @@ -HDMATransferAttrMapAndTileMapToWRAMBank3:: ; 104000 - ld hl, .Function - jp CallInSafeGFXMode - -.Function: - decoord 0, 0, wAttrMap - ld hl, wScratchAttrMap - call PadAttrMapForHDMATransfer - decoord 0, 0 - ld hl, wScratchTileMap - call PadTilemapForHDMATransfer - ld a, $0 - ld [rVBK], a - ld hl, wScratchTileMap - call HDMATransferToWRAMBank3 - ld a, $1 - ld [rVBK], a - ld hl, wScratchAttrMap - call HDMATransferToWRAMBank3 - ret -; 10402d - -HDMATransferTileMapToWRAMBank3:: ; 10402d - ld hl, .Function - jp CallInSafeGFXMode - -.Function: - decoord 0, 0 - ld hl, wScratchTileMap - call PadTilemapForHDMATransfer - ld a, $0 - ld [rVBK], a - ld hl, wScratchTileMap - call HDMATransferToWRAMBank3 - ret -; 104047 - -HDMATransferAttrMapToWRAMBank3: ; 104047 - ld hl, .Function - jp CallInSafeGFXMode - -.Function: - decoord 0, 0, wAttrMap - ld hl, wScratchAttrMap - call PadAttrMapForHDMATransfer - ld a, $1 - ld [rVBK], a - ld hl, wScratchAttrMap - call HDMATransferToWRAMBank3 - ret -; 104061 - -ReloadMapPart:: ; 104061 - ld hl, .Function - jp CallInSafeGFXMode - -.Function: - decoord 0, 0, wAttrMap - ld hl, wScratchAttrMap - call PadAttrMapForHDMATransfer - decoord 0, 0 - ld hl, wScratchTileMap - call PadTilemapForHDMATransfer - call DelayFrame - - di - ld a, [rVBK] - push af - ld a, $1 - ld [rVBK], a - ld hl, wScratchAttrMap - call HDMATransfer_Wait127Scanlines_toBGMap - ld a, $0 - ld [rVBK], a - ld hl, wScratchTileMap - call HDMATransfer_Wait127Scanlines_toBGMap - pop af - ld [rVBK], a - ei - - ret - -Mobile_ReloadMapPart: ; 104099 - ld hl, ReloadMapPart ; useless - ld hl, .Function - jp CallInSafeGFXMode - -.Function: - decoord 0, 0, wAttrMap - ld hl, wScratchAttrMap - call PadAttrMapForHDMATransfer - decoord 0, 0 - ld hl, wScratchTileMap - call PadTilemapForHDMATransfer - call DelayFrame - - di - ld a, [rVBK] - push af - ld a, $1 - ld [rVBK], a - ld hl, wScratchAttrMap - call HDMATransfer_NoDI - ld a, $0 - ld [rVBK], a - ld hl, wScratchTileMap - call HDMATransfer_NoDI - pop af - ld [rVBK], a - ei - - ret -; 1040d4 - -; unused - ld hl, .unreferenced_1040da - jp CallInSafeGFXMode - -.unreferenced_1040da - ld a, $1 - ld [rVBK], a - ld a, BANK(w3_d800) - ld [rSVBK], a - ld de, w3_d800 - ld a, [hBGMapAddress + 1] - ld [rHDMA1], a - ld a, [hBGMapAddress] - ld [rHDMA2], a - ld a, d - ld [rHDMA3], a - ld a, e - ld [rHDMA4], a - ld a, $23 - ld [hDMATransfer], a - call WaitDMATransfer - ret -; 1040fb - -; unused - ld hl, .unreferenced_104101 - jp CallInSafeGFXMode - -.unreferenced_104101 - ld a, $1 - ld [rVBK], a - ld a, BANK(w3_d800) - ld [rSVBK], a - ld hl, w3_d800 - call HDMATransferToWRAMBank3 - ret -; 104110 - -OpenAndCloseMenu_HDMATransferTileMapAndAttrMap:: ; 104110 -; OpenText - ld hl, .Function - jp CallInSafeGFXMode - -.Function: - ; Transfer wAttrMap and Tilemap to BGMap - ; Fill vBGAttrs with $00 - ; Fill vBGTiles with " " - decoord 0, 0, wAttrMap - ld hl, wScratchAttrMap - call PadAttrMapForHDMATransfer - decoord 0, 0 - ld hl, wScratchTileMap - call PadTilemapForHDMATransfer - call DelayFrame - - di - ld a, [rVBK] - push af - ld a, $1 - ld [rVBK], a - ld hl, wScratchAttrMap - call HDMATransfer_Wait123Scanlines_toBGMap - ld a, $0 - ld [rVBK], a - ld hl, wScratchTileMap - call HDMATransfer_Wait123Scanlines_toBGMap - pop af - ld [rVBK], a - ei - ret -; 104148 - -Mobile_OpenAndCloseMenu_HDMATransferTileMapAndAttrMap: ; 104148 (41:4148) - ld hl, .Function - jp CallInSafeGFXMode - -.Function: - ; Transfer wAttrMap and Tilemap to BGMap - ; Fill vBGAttrs with $00 - ; Fill vBGTiles with $ff - decoord 0, 0, wAttrMap - ld hl, wScratchAttrMap - call PadAttrMapForHDMATransfer - ld c, $ff - decoord 0, 0 - ld hl, wScratchTileMap - call PadMapForHDMATransfer - - ld a, $1 - ld [rVBK], a - ld hl, wScratchAttrMap - call HDMATransfer_Wait127Scanlines_toBGMap - ld a, $0 - ld [rVBK], a - ld hl, wScratchTileMap - call HDMATransfer_Wait127Scanlines_toBGMap - ret -; 104177 - -CallInSafeGFXMode: ; 104177 - ld a, [hBGMapMode] - push af - ld a, [hMapAnims] - push af - xor a - ld [hBGMapMode], a - ld [hMapAnims], a - ld a, [rSVBK] - push af - ld a, BANK(wScratchTileMap) - ld [rSVBK], a - ld a, [rVBK] - push af - - call ._hl_ - - pop af - ld [rVBK], a - pop af - ld [rSVBK], a - pop af - ld [hMapAnims], a - pop af - ld [hBGMapMode], a - ret -; 10419c - -._hl_ ; 10419c - jp hl -; 10419d - - -HDMATransferToWRAMBank3: ; 10419d (41:419d) - call _LoadHDMAParameters - ld a, $23 - ld [hDMATransfer], a - -WaitDMATransfer: ; 104a14 -.loop - call DelayFrame - ld a, [hDMATransfer] - and a - jr nz, .loop - ret - -HDMATransfer_Wait127Scanlines_toBGMap: ; 1041ad (41:41ad) -; HDMA transfer from hl to [hBGMapAddress] -; hBGMapAddress -> de -; 2 * SCREEN_HEIGHT -> c - ld a, [hBGMapAddress + 1] - ld d, a - ld a, [hBGMapAddress] - ld e, a - ld c, 2 * SCREEN_HEIGHT - jr HDMATransfer_Wait127Scanlines - -HDMATransfer_Wait123Scanlines_toBGMap: ; 1041b7 (41:41b7) -; HDMA transfer from hl to [hBGMapAddress] -; hBGMapAddress -> de -; 2 * SCREEN_HEIGHT -> c -; $7b --> b - ld a, [hBGMapAddress + 1] - ld d, a - ld a, [hBGMapAddress] - ld e, a - ld c, 2 * SCREEN_HEIGHT - jr HDMATransfer_Wait123Scanlines -; 1041c1 (41:41c1) - -HDMATransfer_NoDI: ; 1041c1 -; HDMA transfer from hl to [hBGMapAddress] -; [hBGMapAddress] --> de -; 2 * SCREEN_HEIGHT --> c - ld a, [hBGMapAddress + 1] - ld d, a - ld a, [hBGMapAddress] - ld e, a - ld c, 2 * SCREEN_HEIGHT - - ; [rHDMA1, rHDMA2] = hl & $fff0 - ld a, h - ld [rHDMA1], a - ld a, l - and $f0 - ld [rHDMA2], a - ; [rHDMA3, rHDMA4] = de & $1ff0 - ld a, d - and $1f - ld [rHDMA3], a - ld a, e - and $f0 - ld [rHDMA4], a - ; b = c | %10000000 - ld a, c - dec c - or $80 - ld b, a - ; d = $7f - c + 1 - ld a, $7f - sub c - ld d, a - ; while [rLY] >= d: pass -.loop1 - ld a, [rLY] - cp d - jr nc, .loop1 - ; while not [rSTAT] & 3: pass -.loop2 - ld a, [rSTAT] - and $3 - jr z, .loop2 - ; load the 5th byte of HDMA - ld a, b - ld [rHDMA5], a - ; wait until rLY advances (c + 1) times - ld a, [rLY] - inc c - ld hl, rLY -.loop3 - cp [hl] - jr z, .loop3 - ld a, [hl] - dec c - jr nz, .loop3 - ld hl, rHDMA5 - res 7, [hl] - ret -; 104205 - -HDMATransfer_Wait123Scanlines: - ld b, $7b - jr _continue_HDMATransfer - - -HDMATransfer_Wait127Scanlines: - ld b, $7f -_continue_HDMATransfer: -; a lot of waiting around for hardware registers - ; [rHDMA1, rHDMA2] = hl & $fff0 - ld a, h - ld [rHDMA1], a - ld a, l - and $f0 ; high nybble - ld [rHDMA2], a - ; [rHDMA3, rHDMA4] = de & $1ff0 - ld a, d - and $1f ; lower 5 bits - ld [rHDMA3], a - ld a, e - and $f0 ; high nybble - ld [rHDMA4], a - ; e = c | %10000000 - ld a, c - dec c - or $80 - ld e, a - ; d = b - c + 1 - ld a, b - sub c - ld d, a - ; while [rLY] >= d: pass -.ly_loop - ld a, [rLY] - cp d - jr nc, .ly_loop - - di - ; while [rSTAT] & 3: pass -.rstat_loop_1 - ld a, [rSTAT] - and $3 - jr nz, .rstat_loop_1 - ; while not [rSTAT] & 3: pass -.rstat_loop_2 - ld a, [rSTAT] - and $3 - jr z, .rstat_loop_2 - ; load the 5th byte of HDMA - ld a, e - ld [rHDMA5], a - ; wait until rLY advances (c + 1) times - ld a, [rLY] - inc c - ld hl, rLY -.final_ly_loop - cp [hl] - jr z, .final_ly_loop - ld a, [hl] - dec c - jr nz, .final_ly_loop - ld hl, rHDMA5 - res 7, [hl] - ei - - ret -; 10424e - - -_LoadHDMAParameters: ; 10424e (41:424e) - ld a, h - ld [rHDMA1], a - ld a, l - ld [rHDMA2], a - ld a, [hBGMapAddress + 1] - and $1f - ld [rHDMA3], a - ld a, [hBGMapAddress] - ld [rHDMA4], a - ret - -PadTilemapForHDMATransfer: ; 10425f (41:425f) - ld c, " " - jr PadMapForHDMATransfer - -PadAttrMapForHDMATransfer: ; 104263 (41:4263) - ld c, $0 - -PadMapForHDMATransfer: ; 104265 (41:4265) -; pad a 20x18 map to 32x18 for HDMA transfer -; back up the padding value in c to hMapObjectIndexBuffer - ld a, [hMapObjectIndexBuffer] - push af - ld a, c - ld [hMapObjectIndexBuffer], a - -; for each row on the screen - ld c, SCREEN_HEIGHT -.loop1 -; for each tile in the row - ld b, SCREEN_WIDTH -.loop2 -; copy from de to hl - ld a, [de] - inc de - ld [hli], a - dec b - jr nz, .loop2 - -; load the original padding value of c into hl for 32 - 20 = 12 rows - ld a, [hMapObjectIndexBuffer] - ld b, BG_MAP_WIDTH - SCREEN_WIDTH -.loop3 - ld [hli], a - dec b - jr nz, .loop3 - - dec c - jr nz, .loop1 - -; restore the original value of hMapObjectIndexBuffer - pop af - ld [hMapObjectIndexBuffer], a - ret - - -_Get2bpp:: ; 104284 - ; 2bpp when [rLCDC] & $80 - ; switch to WRAM bank 6 - ld a, [rSVBK] - push af - ld a, BANK(wScratchTileMap) - ld [rSVBK], a - - push bc - push hl - - ; Copy c tiles of the 2bpp from b:de to wScratchTileMap - ld a, b ; bank - ld l, c ; number of tiles - ld h, $0 - ; multiply by 16 (16 bytes of a 2bpp = 8 x 8 tile) - add hl, hl - add hl, hl - add hl, hl - add hl, hl - ld b, h - ld c, l - ld h, d ; address - ld l, e - ld de, wScratchTileMap - call FarCopyBytes - - pop hl - pop bc - - push bc - call DelayFrame - pop bc - - ld d, h - ld e, l - ld hl, wScratchTileMap - call HDMATransfer_Wait127Scanlines - - ; restore the previous bank - pop af - ld [rSVBK], a - ret -; 1042b2 - -_Get1bpp:: ; 1042b2 - ; 1bpp when [rLCDC] & $80 -.loop - ld a, c - cp $10 - jp c, .bankswitch - jp z, .bankswitch - push bc - push hl - push de - ld c, $10 - call .bankswitch - pop de - ld hl, $80 - add hl, de - ld d, h - ld e, l - pop hl - lb bc, 1, 0 - add hl, bc - pop bc - ld a, c - sub $10 - ld c, a - jr .loop -; 1042d6 - -.bankswitch ; 1042d6 - ld a, [rSVBK] - push af - ld a, BANK(wScratchTileMap) - ld [rSVBK], a - - push bc - push hl - - ld a, b - ld l, c - ld h, $0 - add hl, hl ; multiply by 8 - add hl, hl ; multiply by 8 - add hl, hl ; multiply by 8 - ld c, l - ld b, h - ld h, d - ld l, e - ld de, wScratchTileMap - call FarCopyBytesDouble_DoubleBankSwitch - - pop hl - pop bc - - push bc - call DelayFrame - pop bc - - ld d, h - ld e, l - ld hl, wScratchTileMap - call HDMATransfer_Wait127Scanlines - - pop af - ld [rSVBK], a - ret -; 104303 - -HDMATransfer_OnlyTopFourRows: ; 104303 - ld hl, .Function - jp CallInSafeGFXMode -; 104309 - -.Function: - ld hl, wScratchTileMap - decoord 0, 0 - call .Copy - ld hl, wScratchTileMap + $80 - decoord 0, 0, wAttrMap - call .Copy - ld a, $1 - ld [rVBK], a - ld c, $8 - ld hl, wScratchTileMap + $80 - debgcoord 0, 0, vBGMap1 - call HDMATransfer_Wait127Scanlines - ld a, $0 - ld [rVBK], a - ld c, $8 - ld hl, wScratchTileMap - debgcoord 0, 0, vBGMap1 - call HDMATransfer_Wait127Scanlines - ret - -.Copy: ; 10433a (41:433a) - ld b, 4 -.outer_loop - ld c, SCREEN_WIDTH -.inner_loop - ld a, [de] - ld [hli], a - inc de - dec c - jr nz, .inner_loop - ld a, l - add BG_MAP_WIDTH - SCREEN_WIDTH - ld l, a - ld a, h - adc 0 - ld h, a - dec b - jr nz, .outer_loop - ret -; 104350 diff --git a/engine/engine_flags.asm b/engine/engine_flags.asm deleted file mode 100644 index acda9ede7..000000000 --- a/engine/engine_flags.asm +++ /dev/null @@ -1,86 +0,0 @@ -EngineFlagAction:: ; 80430 -; Do action b on engine flag de -; -; b = 0: reset flag -; = 1: set flag -; > 1: check flag, result in c -; -; Setting/resetting does not return a result. - - -; 16-bit flag ids are considered invalid, but it's nice -; to know that the infrastructure is there. - - ld a, d - cp 0 - jr z, .ceiling - jr c, .read ; cp 0 can't set carry! - jr .invalid - -; There are only $a2 engine flags, so -; anything beyond that is invalid too. - -.ceiling - ld a, e - cp NUM_ENGINE_FLAGS - jr c, .read - -; Invalid flags are treated as flag 00. - -.invalid - xor a - ld e, a - ld d, a - -; Get this flag's location. - -.read - ld hl, EngineFlags -; location - add hl, de - add hl, de -; bit - add hl, de - -; location - ld e, [hl] - inc hl - ld d, [hl] - inc hl -; bit - ld c, [hl] - -; What are we doing with this flag? - - ld a, b - cp 1 - jr c, .reset ; b = 0 - jr z, .set ; b = 1 - -; Return the given flag in c. -.check - ld a, [de] - and c - ld c, a - ret - -; Set the given flag. -.set - ld a, [de] - or c - ld [de], a - ret - -; Reset the given flag. -.reset - ld a, c - cpl ; AND all bits except the one in question - ld c, a - ld a, [de] - and c - ld [de], a - ret -; 80462 - - -INCLUDE "data/engine_flags.asm" diff --git a/engine/events/checksave.asm b/engine/events/checksave.asm new file mode 100644 index 000000000..2280f0e53 --- /dev/null +++ b/engine/events/checksave.asm @@ -0,0 +1,20 @@ +CheckSave:: ; 4cffe + ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) + call GetSRAMBank + ld a, [sCheckValue1] + ld b, a + ld a, [sCheckValue2] + ld c, a + call CloseSRAM + ld a, b + cp SAVE_CHECK_VALUE_1 + jr nz, .ok + ld a, c + cp SAVE_CHECK_VALUE_2 + jr nz, .ok + ld c, $1 + ret + +.ok + ld c, $0 + ret diff --git a/engine/events/checktime.asm b/engine/events/checktime.asm new file mode 100644 index 000000000..4c7d033ff --- /dev/null +++ b/engine/events/checktime.asm @@ -0,0 +1,19 @@ +CheckTime:: ; c000 + ld a, [wTimeOfDay] + ld hl, .TimeOfDayTable + ld de, 2 + call IsInArray + inc hl + ld c, [hl] + ret c + + xor a + ld c, a + ret + +.TimeOfDayTable: ; c012 + db MORN_F, MORN + db DAY_F, DAY + db NITE_F, NITE + db NITE_F, NITE + db -1 diff --git a/engine/events/engine_flags.asm b/engine/events/engine_flags.asm new file mode 100644 index 000000000..acda9ede7 --- /dev/null +++ b/engine/events/engine_flags.asm @@ -0,0 +1,86 @@ +EngineFlagAction:: ; 80430 +; Do action b on engine flag de +; +; b = 0: reset flag +; = 1: set flag +; > 1: check flag, result in c +; +; Setting/resetting does not return a result. + + +; 16-bit flag ids are considered invalid, but it's nice +; to know that the infrastructure is there. + + ld a, d + cp 0 + jr z, .ceiling + jr c, .read ; cp 0 can't set carry! + jr .invalid + +; There are only $a2 engine flags, so +; anything beyond that is invalid too. + +.ceiling + ld a, e + cp NUM_ENGINE_FLAGS + jr c, .read + +; Invalid flags are treated as flag 00. + +.invalid + xor a + ld e, a + ld d, a + +; Get this flag's location. + +.read + ld hl, EngineFlags +; location + add hl, de + add hl, de +; bit + add hl, de + +; location + ld e, [hl] + inc hl + ld d, [hl] + inc hl +; bit + ld c, [hl] + +; What are we doing with this flag? + + ld a, b + cp 1 + jr c, .reset ; b = 0 + jr z, .set ; b = 1 + +; Return the given flag in c. +.check + ld a, [de] + and c + ld c, a + ret + +; Set the given flag. +.set + ld a, [de] + or c + ld [de], a + ret + +; Reset the given flag. +.reset + ld a, c + cpl ; AND all bits except the one in question + ld c, a + ld a, [de] + and c + ld [de], a + ret +; 80462 + + +INCLUDE "data/engine_flags.asm" diff --git a/engine/events/money.asm b/engine/events/money.asm new file mode 100755 index 000000000..585c85618 --- /dev/null +++ b/engine/events/money.asm @@ -0,0 +1,221 @@ +GiveMoney:: ; 15fd7 + ld a, 3 + call AddMoney + ld bc, MaxMoney + ld a, 3 + call CompareMoney + jr z, .not_maxed_out + jr c, .not_maxed_out + ld hl, MaxMoney + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + scf + ret + +.not_maxed_out + and a + ret +; 15ff7 + +MaxMoney: ; 15ff7 + dt MAX_MONEY +; 15ffa + + +TakeMoney:: ; 15ffa + ld a, 3 + call SubtractMoney + jr nc, .okay + ; leave with 0 money + xor a + ld [de], a + inc de + ld [de], a + inc de + ld [de], a + scf + ret + +.okay + and a + ret +; 1600b + +CompareMoney:: ; 1600b + ld a, 3 +CompareFunds: ; 1600d +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + ld h, b + ld l, c + ld c, 0 + ld b, a +.loop1 + dec a + jr z, .done + inc de + inc hl + jr .loop1 + +.done + and a +.loop2 + ld a, [de] + sbc [hl] + jr z, .okay + inc c + +.okay + dec de + dec hl + dec b + jr nz, .loop2 + jr c, .set_carry + ld a, c + and a + jr .skip_carry + +.set_carry + ld a, 1 + and a + scf +.skip_carry + pop bc + pop de + pop hl + ret +; 16035 + +SubtractMoney: ; 16035 + ld a, 3 +SubtractFunds: ; 16037 +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + ld h, b + ld l, c + ld b, a + ld c, 0 +.loop + dec a + jr z, .done + inc de + inc hl + jr .loop + +.done + and a +.loop2 + ld a, [de] + sbc [hl] + ld [de], a + dec de + dec hl + dec b + jr nz, .loop2 + pop bc + pop de + pop hl + ret +; 16053 + +AddMoney: ; 16053 + ld a, 3 +AddFunds: ; 16055 +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + + ld h, b + ld l, c + ld b, a +.loop1 + dec a + jr z, .done + inc de + inc hl + jr .loop1 + +.done + and a +.loop2 + ld a, [de] + adc [hl] + ld [de], a + dec de + dec hl + dec b + jr nz, .loop2 + + pop bc + pop de + pop hl + ret +; 1606f + +GiveCoins:: ; 1606f + ld a, 2 + ld de, wCoins + call AddFunds + ld a, 2 + ld bc, .maxcoins + call CompareFunds + jr c, .not_maxed + ld hl, .maxcoins + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + scf + ret + +.not_maxed + and a + ret +; 1608d + +.maxcoins ; 1608d + bigdw MAX_COINS +; 1608f + + +TakeCoins:: ; 1608f + ld a, 2 + ld de, wCoins + call SubtractFunds + jr nc, .okay + ; leave with 0 coins + xor a + ld [de], a + inc de + ld [de], a + scf + ret + +.okay + and a + ret +; 160a1 + +CheckCoins:: ; 160a1 + ld a, 2 + ld de, wCoins + jp CompareFunds +; 160a9 diff --git a/engine/events/playslowcry.asm b/engine/events/playslowcry.asm new file mode 100644 index 000000000..1f27a7ca4 --- /dev/null +++ b/engine/events/playslowcry.asm @@ -0,0 +1,31 @@ +PlaySlowCry: ; fb841 + ld a, [wScriptVar] + call LoadCry + jr c, .done + + ld hl, wCryPitch + ld a, [hli] + ld h, [hl] + ld l, a + ld bc, -$140 + add hl, bc + ld a, l + ld [wCryPitch], a + ld a, h + ld [wCryPitch + 1], a + ld hl, wCryLength + ld a, [hli] + ld h, [hl] + ld l, a + ld bc, $60 + add hl, bc + ld a, l + ld [wCryLength], a + ld a, h + ld [wCryLength + 1], a + farcall _PlayCry + call WaitSFX + +.done + ret +; fb877 diff --git a/engine/gfx/crystal_layouts.asm b/engine/gfx/crystal_layouts.asm index 0133916e5..71e2e4f56 100755 --- a/engine/gfx/crystal_layouts.asm +++ b/engine/gfx/crystal_layouts.asm @@ -203,7 +203,7 @@ Function49496: ; 49496 ret ; 494ac -INCLUDE "engine/gfx/tileset_palettes.asm" +INCLUDE "engine/tilesets/tileset_palettes.asm" MG_Mobile_Layout02: ; 49706 ld hl, .Palette_49732 diff --git a/engine/gfx/dma_transfer.asm b/engine/gfx/dma_transfer.asm new file mode 100755 index 000000000..e22adf69a --- /dev/null +++ b/engine/gfx/dma_transfer.asm @@ -0,0 +1,626 @@ +HDMATransferAttrMapAndTileMapToWRAMBank3:: ; 104000 + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0, wAttrMap + ld hl, wScratchAttrMap + call PadAttrMapForHDMATransfer + decoord 0, 0 + ld hl, wScratchTileMap + call PadTilemapForHDMATransfer + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransferToWRAMBank3 + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransferToWRAMBank3 + ret +; 10402d + +HDMATransferTileMapToWRAMBank3:: ; 10402d + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0 + ld hl, wScratchTileMap + call PadTilemapForHDMATransfer + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransferToWRAMBank3 + ret +; 104047 + +HDMATransferAttrMapToWRAMBank3: ; 104047 + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0, wAttrMap + ld hl, wScratchAttrMap + call PadAttrMapForHDMATransfer + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransferToWRAMBank3 + ret +; 104061 + +ReloadMapPart:: ; 104061 + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0, wAttrMap + ld hl, wScratchAttrMap + call PadAttrMapForHDMATransfer + decoord 0, 0 + ld hl, wScratchTileMap + call PadTilemapForHDMATransfer + call DelayFrame + + di + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransfer_Wait127Scanlines_toBGMap + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransfer_Wait127Scanlines_toBGMap + pop af + ld [rVBK], a + ei + + ret + +Mobile_ReloadMapPart: ; 104099 + ld hl, ReloadMapPart ; useless + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0, wAttrMap + ld hl, wScratchAttrMap + call PadAttrMapForHDMATransfer + decoord 0, 0 + ld hl, wScratchTileMap + call PadTilemapForHDMATransfer + call DelayFrame + + di + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransfer_NoDI + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransfer_NoDI + pop af + ld [rVBK], a + ei + + ret +; 1040d4 + +; unused + ld hl, .unreferenced_1040da + jp CallInSafeGFXMode + +.unreferenced_1040da + ld a, $1 + ld [rVBK], a + ld a, BANK(w3_d800) + ld [rSVBK], a + ld de, w3_d800 + ld a, [hBGMapAddress + 1] + ld [rHDMA1], a + ld a, [hBGMapAddress] + ld [rHDMA2], a + ld a, d + ld [rHDMA3], a + ld a, e + ld [rHDMA4], a + ld a, $23 + ld [hDMATransfer], a + call WaitDMATransfer + ret +; 1040fb + +; unused + ld hl, .unreferenced_104101 + jp CallInSafeGFXMode + +.unreferenced_104101 + ld a, $1 + ld [rVBK], a + ld a, BANK(w3_d800) + ld [rSVBK], a + ld hl, w3_d800 + call HDMATransferToWRAMBank3 + ret +; 104110 + +OpenAndCloseMenu_HDMATransferTileMapAndAttrMap:: ; 104110 +; OpenText + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + ; Transfer wAttrMap and Tilemap to BGMap + ; Fill vBGAttrs with $00 + ; Fill vBGTiles with " " + decoord 0, 0, wAttrMap + ld hl, wScratchAttrMap + call PadAttrMapForHDMATransfer + decoord 0, 0 + ld hl, wScratchTileMap + call PadTilemapForHDMATransfer + call DelayFrame + + di + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransfer_Wait123Scanlines_toBGMap + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransfer_Wait123Scanlines_toBGMap + pop af + ld [rVBK], a + ei + ret +; 104148 + +Mobile_OpenAndCloseMenu_HDMATransferTileMapAndAttrMap: ; 104148 (41:4148) + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + ; Transfer wAttrMap and Tilemap to BGMap + ; Fill vBGAttrs with $00 + ; Fill vBGTiles with $ff + decoord 0, 0, wAttrMap + ld hl, wScratchAttrMap + call PadAttrMapForHDMATransfer + ld c, $ff + decoord 0, 0 + ld hl, wScratchTileMap + call PadMapForHDMATransfer + + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransfer_Wait127Scanlines_toBGMap + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransfer_Wait127Scanlines_toBGMap + ret +; 104177 + +CallInSafeGFXMode: ; 104177 + ld a, [hBGMapMode] + push af + ld a, [hMapAnims] + push af + xor a + ld [hBGMapMode], a + ld [hMapAnims], a + ld a, [rSVBK] + push af + ld a, BANK(wScratchTileMap) + ld [rSVBK], a + ld a, [rVBK] + push af + + call ._hl_ + + pop af + ld [rVBK], a + pop af + ld [rSVBK], a + pop af + ld [hMapAnims], a + pop af + ld [hBGMapMode], a + ret +; 10419c + +._hl_ ; 10419c + jp hl +; 10419d + + +HDMATransferToWRAMBank3: ; 10419d (41:419d) + call _LoadHDMAParameters + ld a, $23 + ld [hDMATransfer], a + +WaitDMATransfer: ; 104a14 +.loop + call DelayFrame + ld a, [hDMATransfer] + and a + jr nz, .loop + ret + +HDMATransfer_Wait127Scanlines_toBGMap: ; 1041ad (41:41ad) +; HDMA transfer from hl to [hBGMapAddress] +; hBGMapAddress -> de +; 2 * SCREEN_HEIGHT -> c + ld a, [hBGMapAddress + 1] + ld d, a + ld a, [hBGMapAddress] + ld e, a + ld c, 2 * SCREEN_HEIGHT + jr HDMATransfer_Wait127Scanlines + +HDMATransfer_Wait123Scanlines_toBGMap: ; 1041b7 (41:41b7) +; HDMA transfer from hl to [hBGMapAddress] +; hBGMapAddress -> de +; 2 * SCREEN_HEIGHT -> c +; $7b --> b + ld a, [hBGMapAddress + 1] + ld d, a + ld a, [hBGMapAddress] + ld e, a + ld c, 2 * SCREEN_HEIGHT + jr HDMATransfer_Wait123Scanlines +; 1041c1 (41:41c1) + +HDMATransfer_NoDI: ; 1041c1 +; HDMA transfer from hl to [hBGMapAddress] +; [hBGMapAddress] --> de +; 2 * SCREEN_HEIGHT --> c + ld a, [hBGMapAddress + 1] + ld d, a + ld a, [hBGMapAddress] + ld e, a + ld c, 2 * SCREEN_HEIGHT + + ; [rHDMA1, rHDMA2] = hl & $fff0 + ld a, h + ld [rHDMA1], a + ld a, l + and $f0 + ld [rHDMA2], a + ; [rHDMA3, rHDMA4] = de & $1ff0 + ld a, d + and $1f + ld [rHDMA3], a + ld a, e + and $f0 + ld [rHDMA4], a + ; b = c | %10000000 + ld a, c + dec c + or $80 + ld b, a + ; d = $7f - c + 1 + ld a, $7f + sub c + ld d, a + ; while [rLY] >= d: pass +.loop1 + ld a, [rLY] + cp d + jr nc, .loop1 + ; while not [rSTAT] & 3: pass +.loop2 + ld a, [rSTAT] + and $3 + jr z, .loop2 + ; load the 5th byte of HDMA + ld a, b + ld [rHDMA5], a + ; wait until rLY advances (c + 1) times + ld a, [rLY] + inc c + ld hl, rLY +.loop3 + cp [hl] + jr z, .loop3 + ld a, [hl] + dec c + jr nz, .loop3 + ld hl, rHDMA5 + res 7, [hl] + ret +; 104205 + +HDMATransfer_Wait123Scanlines: + ld b, $7b + jr _continue_HDMATransfer + + +HDMATransfer_Wait127Scanlines: + ld b, $7f +_continue_HDMATransfer: +; a lot of waiting around for hardware registers + ; [rHDMA1, rHDMA2] = hl & $fff0 + ld a, h + ld [rHDMA1], a + ld a, l + and $f0 ; high nybble + ld [rHDMA2], a + ; [rHDMA3, rHDMA4] = de & $1ff0 + ld a, d + and $1f ; lower 5 bits + ld [rHDMA3], a + ld a, e + and $f0 ; high nybble + ld [rHDMA4], a + ; e = c | %10000000 + ld a, c + dec c + or $80 + ld e, a + ; d = b - c + 1 + ld a, b + sub c + ld d, a + ; while [rLY] >= d: pass +.ly_loop + ld a, [rLY] + cp d + jr nc, .ly_loop + + di + ; while [rSTAT] & 3: pass +.rstat_loop_1 + ld a, [rSTAT] + and $3 + jr nz, .rstat_loop_1 + ; while not [rSTAT] & 3: pass +.rstat_loop_2 + ld a, [rSTAT] + and $3 + jr z, .rstat_loop_2 + ; load the 5th byte of HDMA + ld a, e + ld [rHDMA5], a + ; wait until rLY advances (c + 1) times + ld a, [rLY] + inc c + ld hl, rLY +.final_ly_loop + cp [hl] + jr z, .final_ly_loop + ld a, [hl] + dec c + jr nz, .final_ly_loop + ld hl, rHDMA5 + res 7, [hl] + ei + + ret +; 10424e + + +_LoadHDMAParameters: ; 10424e (41:424e) + ld a, h + ld [rHDMA1], a + ld a, l + ld [rHDMA2], a + ld a, [hBGMapAddress + 1] + and $1f + ld [rHDMA3], a + ld a, [hBGMapAddress] + ld [rHDMA4], a + ret + +PadTilemapForHDMATransfer: ; 10425f (41:425f) + ld c, " " + jr PadMapForHDMATransfer + +PadAttrMapForHDMATransfer: ; 104263 (41:4263) + ld c, $0 + +PadMapForHDMATransfer: ; 104265 (41:4265) +; pad a 20x18 map to 32x18 for HDMA transfer +; back up the padding value in c to hMapObjectIndexBuffer + ld a, [hMapObjectIndexBuffer] + push af + ld a, c + ld [hMapObjectIndexBuffer], a + +; for each row on the screen + ld c, SCREEN_HEIGHT +.loop1 +; for each tile in the row + ld b, SCREEN_WIDTH +.loop2 +; copy from de to hl + ld a, [de] + inc de + ld [hli], a + dec b + jr nz, .loop2 + +; load the original padding value of c into hl for 32 - 20 = 12 rows + ld a, [hMapObjectIndexBuffer] + ld b, BG_MAP_WIDTH - SCREEN_WIDTH +.loop3 + ld [hli], a + dec b + jr nz, .loop3 + + dec c + jr nz, .loop1 + +; restore the original value of hMapObjectIndexBuffer + pop af + ld [hMapObjectIndexBuffer], a + ret + + +_Get2bpp:: ; 104284 + ; 2bpp when [rLCDC] & $80 + ; switch to WRAM bank 6 + ld a, [rSVBK] + push af + ld a, BANK(wScratchTileMap) + ld [rSVBK], a + + push bc + push hl + + ; Copy c tiles of the 2bpp from b:de to wScratchTileMap + ld a, b ; bank + ld l, c ; number of tiles + ld h, $0 + ; multiply by 16 (16 bytes of a 2bpp = 8 x 8 tile) + add hl, hl + add hl, hl + add hl, hl + add hl, hl + ld b, h + ld c, l + ld h, d ; address + ld l, e + ld de, wScratchTileMap + call FarCopyBytes + + pop hl + pop bc + + push bc + call DelayFrame + pop bc + + ld d, h + ld e, l + ld hl, wScratchTileMap + call HDMATransfer_Wait127Scanlines + + ; restore the previous bank + pop af + ld [rSVBK], a + ret +; 1042b2 + +_Get1bpp:: ; 1042b2 + ; 1bpp when [rLCDC] & $80 +.loop + ld a, c + cp $10 + jp c, .bankswitch + jp z, .bankswitch + push bc + push hl + push de + ld c, $10 + call .bankswitch + pop de + ld hl, $80 + add hl, de + ld d, h + ld e, l + pop hl + lb bc, 1, 0 + add hl, bc + pop bc + ld a, c + sub $10 + ld c, a + jr .loop +; 1042d6 + +.bankswitch ; 1042d6 + ld a, [rSVBK] + push af + ld a, BANK(wScratchTileMap) + ld [rSVBK], a + + push bc + push hl + + ld a, b + ld l, c + ld h, $0 + add hl, hl ; multiply by 8 + add hl, hl ; multiply by 8 + add hl, hl ; multiply by 8 + ld c, l + ld b, h + ld h, d + ld l, e + ld de, wScratchTileMap + call FarCopyBytesDouble_DoubleBankSwitch + + pop hl + pop bc + + push bc + call DelayFrame + pop bc + + ld d, h + ld e, l + ld hl, wScratchTileMap + call HDMATransfer_Wait127Scanlines + + pop af + ld [rSVBK], a + ret +; 104303 + +HDMATransfer_OnlyTopFourRows: ; 104303 + ld hl, .Function + jp CallInSafeGFXMode +; 104309 + +.Function: + ld hl, wScratchTileMap + decoord 0, 0 + call .Copy + ld hl, wScratchTileMap + $80 + decoord 0, 0, wAttrMap + call .Copy + ld a, $1 + ld [rVBK], a + ld c, $8 + ld hl, wScratchTileMap + $80 + debgcoord 0, 0, vBGMap1 + call HDMATransfer_Wait127Scanlines + ld a, $0 + ld [rVBK], a + ld c, $8 + ld hl, wScratchTileMap + debgcoord 0, 0, vBGMap1 + call HDMATransfer_Wait127Scanlines + ret + +.Copy: ; 10433a (41:433a) + ld b, 4 +.outer_loop + ld c, SCREEN_WIDTH +.inner_loop + ld a, [de] + ld [hli], a + inc de + dec c + jr nz, .inner_loop + ld a, l + add BG_MAP_WIDTH - SCREEN_WIDTH + ld l, a + ld a, h + adc 0 + ld h, a + dec b + jr nz, .outer_loop + ret +; 104350 diff --git a/engine/gfx/evolution_animation.asm b/engine/gfx/evolution_animation.asm deleted file mode 100755 index 978f9e968..000000000 --- a/engine/gfx/evolution_animation.asm +++ /dev/null @@ -1,368 +0,0 @@ -EvolutionAnimation: ; 4e5e1 - push hl - push de - push bc - ld a, [wCurSpecies] - push af - ld a, [rOBP0] - push af - ld a, [wBaseDexNo] - push af - - call .EvolutionAnimation - - pop af - ld [wBaseDexNo], a - pop af - ld [rOBP0], a - pop af - ld [wCurSpecies], a - pop bc - pop de - pop hl - - ld a, [wEvolutionCanceled] - and a - ret z - - scf - ret -; 4e607 - -.EvolutionAnimation: ; 4e607 - ld a, %11100100 - ld [rOBP0], a - - ld de, MUSIC_NONE - call PlayMusic - - farcall ClearSpriteAnims - - ld de, .GFX - ld hl, vTiles0 - lb bc, BANK(.GFX), 8 - call Request2bpp - - xor a - ld [wLowHealthAlarm], a - call WaitBGMap - xor a - ld [hBGMapMode], a - ld a, [wEvolutionOldSpecies] - ld [wPlayerHPPal], a - - ld c, $0 - call .GetSGBLayout - ld a, [wEvolutionOldSpecies] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call .PlaceFrontpic - - ld de, vTiles2 - ld hl, vTiles2 tile $31 - ld bc, 7 * 7 - call Request2bpp - - ld a, 7 * 7 - ld [wEvolutionPicOffset], a - call .ReplaceFrontpic - ld a, [wEvolutionNewSpecies] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call .LoadFrontpic - ld a, [wEvolutionOldSpecies] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - - ld a, $1 - ld [hBGMapMode], a - call .check_statused - jr c, .skip_cry - - ld a, [wEvolutionOldSpecies] - call PlayMonCry - -.skip_cry - ld de, MUSIC_EVOLUTION - call PlayMusic - - ld c, 80 - call DelayFrames - - ld c, $1 - call .GetSGBLayout - call .AnimationSequence - jr c, .cancel_evo - - ld a, -7 * 7 - ld [wEvolutionPicOffset], a - call .ReplaceFrontpic - xor a - ld [wEvolutionCanceled], a - - ld a, [wEvolutionNewSpecies] - ld [wPlayerHPPal], a - - ld c, $0 - call .GetSGBLayout - call .PlayEvolvedSFX - farcall ClearSpriteAnims - call .check_statused - jr c, .no_anim - - ld a, [wBoxAlignment] - push af - ld a, $1 - ld [wBoxAlignment], a - ld a, [wCurPartySpecies] - push af - - ld a, [wPlayerHPPal] - ld [wCurPartySpecies], a - hlcoord 7, 2 - ld d, $0 - ld e, ANIM_MON_EVOLVE - predef AnimateFrontpic - - pop af - ld [wCurPartySpecies], a - pop af - ld [wBoxAlignment], a - ret - -.no_anim - ret - -.cancel_evo - ld a, $1 - ld [wEvolutionCanceled], a - - ld a, [wEvolutionOldSpecies] - ld [wPlayerHPPal], a - - ld c, $0 - call .GetSGBLayout - call .PlayEvolvedSFX - farcall ClearSpriteAnims - call .check_statused - ret c - - ld a, [wPlayerHPPal] - call PlayMonCry - ret -; 4e703 - -.GetSGBLayout: ; 4e703 - ld b, SCGB_EVOLUTION - jp GetSGBLayout -; 4e708 - -.PlaceFrontpic: ; 4e708 - call GetBaseData - hlcoord 7, 2 - jp PrepMonFrontpic -; 4e711 - -.LoadFrontpic: ; 4e711 - call GetBaseData - ld a, $1 - ld [wBoxAlignment], a - ld de, vTiles2 - predef GetAnimatedFrontpic - xor a - ld [wBoxAlignment], a - ret -; 4e726 - -.AnimationSequence: ; 4e726 - call ClearJoypad - lb bc, 1, 2 * 7 ; flash b times, wait c frames in between -.loop - push bc - call .WaitFrames_CheckPressedB - pop bc - jr c, .exit_sequence - push bc - call .Flash - pop bc - inc b - dec c - dec c - jr nz, .loop - and a - ret - -.exit_sequence - scf - ret -; 4e741 - -.Flash: ; 4e741 - ld a, -7 * 7 ; new stage - ld [wEvolutionPicOffset], a - call .ReplaceFrontpic - ld a, 7 * 7 ; previous stage - ld [wEvolutionPicOffset], a - call .ReplaceFrontpic - dec b - jr nz, .Flash - ret -; 4e755 - -.ReplaceFrontpic: ; 4e755 - push bc - xor a - ld [hBGMapMode], a - hlcoord 7, 2 - lb bc, 7, 7 - ld de, SCREEN_WIDTH - 7 -.loop1 - push bc -.loop2 - ld a, [wEvolutionPicOffset] - add [hl] - ld [hli], a - dec c - jr nz, .loop2 - pop bc - add hl, de - dec b - jr nz, .loop1 - ld a, $1 - ld [hBGMapMode], a - call WaitBGMap - pop bc - ret -; 4e779 - -.WaitFrames_CheckPressedB: ; 4e779 - call DelayFrame - push bc - call JoyTextDelay - ld a, [hJoyDown] - pop bc - and B_BUTTON - jr nz, .pressed_b -.loop3 - dec c - jr nz, .WaitFrames_CheckPressedB - and a - ret - -.pressed_b - ld a, [wForceEvolution] - and a - jr nz, .loop3 - scf - ret -; 4e794 - -.check_statused ; 4e794 - ld a, [wCurPartyMon] - ld hl, wPartyMon1Species - call GetPartyLocation - ld b, h - ld c, l - farcall CheckFaintedFrzSlp - ret -; 4e7a6 - -.PlayEvolvedSFX: ; 4e7a6 - ld a, [wEvolutionCanceled] - and a - ret nz - ld de, SFX_EVOLVED - call PlaySFX - ld hl, wJumptableIndex - ld a, [hl] - push af - ld [hl], $0 -.loop4 - call .balls_of_light - jr nc, .done - call .AnimateBallsOfLight - jr .loop4 - -.done - ld c, 32 -.loop5 - call .AnimateBallsOfLight - dec c - jr nz, .loop5 - pop af - ld [wJumptableIndex], a - ret -; 4e7cf - -.balls_of_light ; 4e7cf - ld hl, wJumptableIndex - ld a, [hl] - cp 32 - ret nc - ld d, a - inc [hl] - and $1 - jr nz, .done_balls - ld e, $0 - call .GenerateBallOfLight - ld e, $10 - call .GenerateBallOfLight - -.done_balls - scf - ret -; 4e7e8 - -.GenerateBallOfLight: ; 4e7e8 - push de - depixel 9, 11 - ld a, SPRITE_ANIM_INDEX_EVOLUTION_BALL_OF_LIGHT - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld a, [wJumptableIndex] - and %1110 - sla a - pop de - add e - ld [hl], a - ld hl, SPRITEANIMSTRUCT_TILE_ID - add hl, bc - ld [hl], $0 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $10 - ret -; 4e80c - -.AnimateBallsOfLight: ; 4e80c - push bc - callfar PlaySpriteAnimations - ; a = (([hVBlankCounter] + 4) / 2) % NUM_PALETTES - ld a, [hVBlankCounter] - and %1110 - srl a - inc a - inc a - and $7 - ld b, a - ld hl, wVirtualOAMSprite00Attributes - ld c, NUM_SPRITE_OAM_STRUCTS -.loop6 - ld a, [hl] - or b - ld [hli], a ; attributes -rept SPRITEOAMSTRUCT_LENGTH + -1 - inc hl -endr - dec c - jr nz, .loop6 - pop bc - call DelayFrame - ret -; 4e831 - - -.GFX: -INCBIN "gfx/evo/bubble_large.2bpp" -INCBIN "gfx/evo/bubble.2bpp" diff --git a/engine/gfx/gbc_only.asm b/engine/gfx/gbc_only.asm deleted file mode 100644 index badd953aa..000000000 --- a/engine/gfx/gbc_only.asm +++ /dev/null @@ -1,149 +0,0 @@ -GBCOnlyScreen: ; 4ea82 - - ld a, [hCGB] - and a - ret nz - - ld de, MUSIC_NONE - call PlayMusic - - call ClearTileMap - - ld hl, GBCOnlyGFX - ld de, wGBCOnlyDecompressBuffer - ld a, [rSVBK] - push af - ld a, 0 ; this has the same effect as selecting bank 1 - ld [rSVBK], a - call Decompress - pop af - ld [rSVBK], a - - ld de, wGBCOnlyDecompressBuffer - ld hl, vTiles2 - lb bc, BANK(GBCOnlyGFX), 84 - call Get2bpp - - ld de, Font - ld hl, vTiles1 - lb bc, BANK(Font), $80 - call Get1bpp - - call DrawGBCOnlyScreen - - call WaitBGMap - -; better luck next time -.loop - call DelayFrame - jr .loop -; 4eac5 - - -DrawGBCOnlyScreen: ; 4eac5 - - call DrawGBCOnlyBorder - - ; Pokemon - hlcoord 3, 2 - ld b, 14 - ld c, 4 - ld a, $8 - call DrawGBCOnlyGraphic - - ; Crystal - hlcoord 5, 6 - ld b, 10 - ld c, 2 - ld a, $40 - call DrawGBCOnlyGraphic - - ld de, GBCOnlyString - hlcoord 1, 10 - call PlaceString - - ret -; 4eaea - - -DrawGBCOnlyBorder: ; 4eaea - - hlcoord 0, 0 - ld [hl], 0 ; top-left - - inc hl - ld a, 1 ; top - call .FillRow - - ld [hl], 2 ; top-right - - hlcoord 0, 1 - ld a, 3 ; left - call .FillColumn - - hlcoord 19, 1 - ld a, 4 ; right - call .FillColumn - - hlcoord 0, 17 - ld [hl], 5 ; bottom-left - - inc hl - ld a, 6 ; bottom - call .FillRow - - ld [hl], 7 ; bottom-right - ret -; 4eb15 - -.FillRow: ; 4eb15 - ld c, SCREEN_WIDTH - 2 -.next_column - ld [hli], a - dec c - jr nz, .next_column - ret -; 4eb1c - -.FillColumn: ; 4eb1c - ld de, SCREEN_WIDTH - ld c, SCREEN_HEIGHT - 2 -.next_row - ld [hl], a - add hl, de - dec c - jr nz, .next_row - ret -; 4eb27 - - -DrawGBCOnlyGraphic: ; 4eb27 - ld de, SCREEN_WIDTH -.y - push bc - push hl -.x - ld [hli], a - inc a - dec b - jr nz, .x - pop hl - add hl, de - pop bc - dec c - jr nz, .y - ret -; 4eb38 - - -GBCOnlyString: ; 4eb38 - db "This Game Pak is" - next "designed only for" - next "use on the" - next "Game Boy Color.@" -; 4eb76 - - -GBCOnlyGFX: ; 4eb76 -INCBIN "gfx/sgb/gbc_only.2bpp.lz" -; 4f0bc diff --git a/engine/gfx/loadpushoam.asm b/engine/gfx/loadpushoam.asm new file mode 100644 index 000000000..95f67ff73 --- /dev/null +++ b/engine/gfx/loadpushoam.asm @@ -0,0 +1,21 @@ +WriteOAMDMACodeToHRAM:: ; 4031 + ld c, hTransferVirtualOAM - $ff00 + ld b, .PushOAMEnd - .PushOAM + ld hl, .PushOAM +.loop + ld a, [hli] + ld [$ff00+c], a + inc c + dec b + jr nz, .loop + ret + +.PushOAM: ; 403f + ld a, HIGH(wVirtualOAM) + ld [rDMA], a + ld a, NUM_SPRITE_OAM_STRUCTS +.pushoam_loop + dec a + jr nz, .pushoam_loop + ret +.PushOAMEnd diff --git a/engine/gfx/map_palettes.asm b/engine/gfx/map_palettes.asm deleted file mode 100644 index a9d2b382f..000000000 --- a/engine/gfx/map_palettes.asm +++ /dev/null @@ -1,86 +0,0 @@ -SwapTextboxPalettes:: ; 4c000 - hlcoord 0, 0 - decoord 0, 0, wAttrMap - ld b, SCREEN_HEIGHT -.loop - push bc - ld c, SCREEN_WIDTH -.innerloop - ld a, [hl] - push hl - srl a - jr c, .UpperNybble - ld hl, wTilesetPalettes - add [hl] - ld l, a - ld a, [wTilesetPalettes + 1] - adc 0 - ld h, a - ld a, [hl] - and $f - jr .next - -.UpperNybble: - ld hl, wTilesetPalettes - add [hl] - ld l, a - ld a, [wTilesetPalettes + 1] - adc 0 - ld h, a - ld a, [hl] - swap a - and $f - -.next - pop hl - ld [de], a - res 7, [hl] - inc hl - inc de - dec c - jr nz, .innerloop - pop bc - dec b - jr nz, .loop - ret - -ScrollBGMapPalettes:: ; 4c03f - ld hl, wBGMapBuffer - ld de, wBGMapPalBuffer -.loop - ld a, [hl] - push hl - srl a - jr c, .UpperNybble - -; .LowerNybble - ld hl, wTilesetPalettes - add [hl] - ld l, a - ld a, [wTilesetPalettes + 1] - adc 0 - ld h, a - ld a, [hl] - and $f - jr .next - -.UpperNybble: - ld hl, wTilesetPalettes - add [hl] - ld l, a - ld a, [wTilesetPalettes + 1] - adc 0 - ld h, a - ld a, [hl] - swap a - and $f - -.next - pop hl - ld [de], a - res 7, [hl] - inc hl - inc de - dec c - jr nz, .loop - ret diff --git a/engine/gfx/mapgroup_roofs.asm b/engine/gfx/mapgroup_roofs.asm deleted file mode 100644 index 58e5e7cfe..000000000 --- a/engine/gfx/mapgroup_roofs.asm +++ /dev/null @@ -1,20 +0,0 @@ -LoadMapGroupRoof:: ; 1c000 - ld a, [wMapGroup] - ld e, a - ld d, 0 - ld hl, MapGroupRoofs - add hl, de - ld a, [hl] - cp -1 - ret z - ld hl, Roofs - ld bc, 9 tiles - call AddNTimes - ld de, vTiles2 tile $0a - ld bc, 9 tiles - call CopyBytes - ret -; 1c021 - - -INCLUDE "data/maps/roofs.asm" diff --git a/engine/gfx/tileset_anims.asm b/engine/gfx/tileset_anims.asm deleted file mode 100644 index bf0037e65..000000000 --- a/engine/gfx/tileset_anims.asm +++ /dev/null @@ -1,1060 +0,0 @@ -_AnimateTileset:: ; fc000 -; Iterate over a given pointer array of -; animation functions (one per frame). - -; Typically in wra1, vra0 - - ld a, [wTilesetAnim] - ld e, a - ld a, [wTilesetAnim + 1] - ld d, a - - ld a, [hTileAnimFrame] - ld l, a - inc a - ld [hTileAnimFrame], a - - ld h, 0 - add hl, hl - add hl, hl - add hl, de - -; 2-byte parameter -; All functions take input de. - ld e, [hl] - inc hl - ld d, [hl] - inc hl - -; Function address - ld a, [hli] - ld h, [hl] - ld l, a - - jp hl -; fc01b - -Tileset0Anim: ; 0xfc01b -TilesetJohtoModernAnim: ; 0xfc01b -TilesetKantoAnim: ; 0xfc01b - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, TileAnimationPalette - dw NULL, WaitTileAnimation - dw NULL, AnimateFlowerTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc047 - -TilesetParkAnim: ; 0xfc047 - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, WaitTileAnimation - dw vTiles2 tile $5f, AnimateFountain - dw NULL, WaitTileAnimation - dw NULL, TileAnimationPalette - dw NULL, WaitTileAnimation - dw NULL, AnimateFlowerTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc073 - -TilesetForestAnim: ; 0xfc073 - dw NULL, ForestTreeLeftAnimation - dw NULL, ForestTreeRightAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, ForestTreeLeftAnimation2 - dw NULL, ForestTreeRightAnimation2 - dw NULL, AnimateFlowerTile - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, TileAnimationPalette - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc0a3 - -TilesetJohtoAnim: ; 0xfc0a3 - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, TileAnimationPalette - dw NULL, WaitTileAnimation - dw NULL, AnimateFlowerTile - dw WhirlpoolFrames1, AnimateWhirlpoolTile - dw WhirlpoolFrames2, AnimateWhirlpoolTile - dw WhirlpoolFrames3, AnimateWhirlpoolTile - dw WhirlpoolFrames4, AnimateWhirlpoolTile - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc0d7 - -UnusedTilesetAnim_fc0d7: ; 0xfc0d7 - dw vTiles2 tile $03, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $03, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, AnimateFlowerTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc103 - -UnusedTilesetAnim_fc103: ; 0xfc103 - dw vTiles2 tile $14, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $14, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc12f - -TilesetPortAnim: ; 0xfc12f - dw vTiles2 tile $14, AnimateWaterTile - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, TileAnimationPalette - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc15f - -TilesetEliteFourRoomAnim: ; 0xfc15f - dw NULL, LavaBubbleAnim2 - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, LavaBubbleAnim1 - dw NULL, WaitTileAnimation - dw NULL, StandingTileFrame8 - dw NULL, DoneTileAnimation -; 0xfc17f - -UnusedTilesetAnim_fc17f: ; 0xfc17f - dw vTiles2 tile $53, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileDown - dw wTileAnimBuffer, ScrollTileDown - dw vTiles2 tile $53, WriteTileFromBuffer - dw vTiles2 tile $03, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $03, WriteTileFromBuffer - dw vTiles2 tile $53, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileDown - dw wTileAnimBuffer, ScrollTileDown - dw vTiles2 tile $53, WriteTileFromBuffer - dw NULL, DoneTileAnimation -; 0xfc1af - -UnusedTilesetAnim_fc1af: ; 0xfc1af - dw vTiles2 tile $54, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileDown - dw wTileAnimBuffer, ScrollTileDown - dw vTiles2 tile $54, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw vTiles2 tile $03, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $03, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw vTiles2 tile $54, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileDown - dw wTileAnimBuffer, ScrollTileDown - dw vTiles2 tile $54, WriteTileFromBuffer - dw NULL, DoneTileAnimation -; 0xfc1e7 - -TilesetCaveAnim: ; 0xfc1e7 -TilesetDarkCaveAnim: ; 0xfc1e7 - dw vTiles2 tile $14, WriteTileToBuffer - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileRightLeft - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $14, WriteTileFromBuffer - dw NULL, FlickeringCaveEntrancePalette - dw NULL, TileAnimationPalette - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $40, WriteTileToBuffer - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $40, WriteTileFromBuffer - dw NULL, FlickeringCaveEntrancePalette - dw NULL, DoneTileAnimation -; 0xfc233 - -TilesetIcePathAnim: ; 0xfc233 - dw vTiles2 tile $35, WriteTileToBuffer - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileRightLeft - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $35, WriteTileFromBuffer - dw NULL, FlickeringCaveEntrancePalette - dw NULL, TileAnimationPalette - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $31, WriteTileToBuffer - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw wTileAnimBuffer, ScrollTileDown - dw NULL, FlickeringCaveEntrancePalette - dw vTiles2 tile $31, WriteTileFromBuffer - dw NULL, FlickeringCaveEntrancePalette - dw NULL, DoneTileAnimation -; 0xfc27f - -TilesetTowerAnim: ; 0xfc27f - dw TowerPillarTilePointer9, AnimateTowerPillarTile - dw TowerPillarTilePointer10, AnimateTowerPillarTile - dw TowerPillarTilePointer7, AnimateTowerPillarTile - dw TowerPillarTilePointer8, AnimateTowerPillarTile - dw TowerPillarTilePointer5, AnimateTowerPillarTile - dw TowerPillarTilePointer6, AnimateTowerPillarTile - dw TowerPillarTilePointer3, AnimateTowerPillarTile - dw TowerPillarTilePointer4, AnimateTowerPillarTile - dw TowerPillarTilePointer1, AnimateTowerPillarTile - dw TowerPillarTilePointer2, AnimateTowerPillarTile - dw NULL, StandingTileFrame - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc2bf - -UnusedTilesetAnim_fc2bf: ; 0xfc2bf - dw vTiles2 tile $4f, WriteTileToBuffer - dw wTileAnimBuffer, ScrollTileRightLeft - dw vTiles2 tile $4f, WriteTileFromBuffer - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc2e7 - -TilesetBattleTowerOutsideAnim: ; 0xfc2e7 -TilesetHouseAnim: ; 0xfc2e7 -TilesetPlayersHouseAnim: ; 0xfc2e7 -TilesetPokecenterAnim: ; 0xfc2e7 -TilesetGateAnim: ; 0xfc2e7 -TilesetLabAnim: ; 0xfc2e7 -TilesetFacilityAnim: ; 0xfc2e7 -TilesetMartAnim: ; 0xfc2e7 -TilesetMansionAnim: ; 0xfc2e7 -TilesetGameCornerAnim: ; 0xfc2e7 -TilesetTraditionalHouseAnim: ; 0xfc2e7 -TilesetTrainStationAnim: ; 0xfc2e7 -TilesetChampionsRoomAnim: ; 0xfc2e7 -TilesetLighthouseAnim: ; 0xfc2e7 -TilesetPlayersRoomAnim: ; 0xfc2e7 -TilesetPokeComCenterAnim: ; 0xfc2e7 -TilesetBattleTowerAnim: ; 0xfc2e7 -TilesetRuinsOfAlphAnim: ; 0xfc2e7 -TilesetRadioTowerAnim: ; 0xfc2e7 -TilesetUndergroundAnim: ; 0xfc2e7 -TilesetBetaWordRoomAnim: ; 0xfc2e7 -TilesetHoOhWordRoomAnim: ; 0xfc2e7 -TilesetKabutoWordRoomAnim: ; 0xfc2e7 -TilesetOmanyteWordRoomAnim: ; 0xfc2e7 -TilesetAerodactylWordRoomAnim: ; 0xfc2e7 - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, WaitTileAnimation - dw NULL, DoneTileAnimation -; 0xfc2fb - -DoneTileAnimation: ; fc2fb -; Reset the animation command loop. - xor a - ld [hTileAnimFrame], a - -WaitTileAnimation: ; fc2fe -; Do nothing this frame. - ret -; fc2ff - -StandingTileFrame8: ; fc2ff - ld a, [wTileAnimationTimer] - inc a - and %111 - ld [wTileAnimationTimer], a - ret -; fc309 - - -ScrollTileRightLeft: ; fc309 -; Scroll right for 4 ticks, then left for 4 ticks. - ld a, [wTileAnimationTimer] - inc a - and %111 - ld [wTileAnimationTimer], a - and %100 - jr nz, ScrollTileLeft - jr ScrollTileRight -; fc318 - -ScrollTileUpDown: ; fc318 -; Scroll up for 4 ticks, then down for 4 ticks. - ld a, [wTileAnimationTimer] - inc a - and %111 - ld [wTileAnimationTimer], a - and %100 - jr nz, ScrollTileDown - jr ScrollTileUp -; fc327 - -ScrollTileLeft: ; fc327 - ld h, d - ld l, e - ld c, 4 -.loop -rept 4 - ld a, [hl] - rlca - ld [hli], a -endr - dec c - jr nz, .loop - ret -; fc33b - -ScrollTileRight: ; fc33b - ld h, d - ld l, e - ld c, 4 -.loop -rept 4 - ld a, [hl] - rrca - ld [hli], a -endr - dec c - jr nz, .loop - ret -; fc34f - -ScrollTileUp: ; fc34f - ld h, d - ld l, e - ld d, [hl] - inc hl - ld e, [hl] - ld bc, TILE_WIDTH * 2 - 2 - add hl, bc - ld a, TILE_WIDTH / 2 -.loop - ld c, [hl] - ld [hl], e - dec hl - ld b, [hl] - ld [hl], d - dec hl - ld e, [hl] - ld [hl], c - dec hl - ld d, [hl] - ld [hl], b - dec hl - dec a - jr nz, .loop - ret -; fc36a - -ScrollTileDown: ; fc36a - ld h, d - ld l, e - ld de, TILE_WIDTH * 2 - 2 - push hl - add hl, de - ld d, [hl] - inc hl - ld e, [hl] - pop hl - ld a, TILE_WIDTH / 2 -.loop - ld b, [hl] - ld [hl], d - inc hl - ld c, [hl] - ld [hl], e - inc hl - ld d, [hl] - ld [hl], b - inc hl - ld e, [hl] - ld [hl], c - inc hl - dec a - jr nz, .loop - ret -; fc387 - - -AnimateFountain: ; fc387 - ld hl, sp+0 - ld b, h - ld c, l - ld hl, .frames - ld a, [wTileAnimationTimer] - and %111 - add a - add l - ld l, a - jr nc, .okay - inc h -.okay - ld a, [hli] - ld h, [hl] - ld l, a - ld sp, hl - ld l, e - ld h, d - jp WriteTile - -.frames - dw .frame1 - dw .frame2 - dw .frame3 - dw .frame4 - dw .frame3 - dw .frame4 - dw .frame5 - dw .frame1 - -.frame1 INCBIN "gfx/tilesets/fountain/1.2bpp" -.frame2 INCBIN "gfx/tilesets/fountain/2.2bpp" -.frame3 INCBIN "gfx/tilesets/fountain/3.2bpp" -.frame4 INCBIN "gfx/tilesets/fountain/4.2bpp" -.frame5 INCBIN "gfx/tilesets/fountain/5.2bpp" -; fc402 - - -AnimateWaterTile: ; fc402 -; Draw a water tile for the current frame in VRAM tile at de. - -; Save sp in bc (see WriteTile). - ld hl, sp+0 - ld b, h - ld c, l - - ld a, [wTileAnimationTimer] - -; 4 tile graphics, updated every other frame. - and %110 - -; 2 x 8 = 16 bytes per tile - add a - add a - add a - - add LOW(WaterTileFrames) - ld l, a - ld a, 0 - adc HIGH(WaterTileFrames) - ld h, a - -; The stack now points to the start of the tile for this frame. - ld sp, hl - - ld l, e - ld h, d - - jp WriteTile -; fc41c - -WaterTileFrames: ; fc41c - INCBIN "gfx/tilesets/water/water.2bpp" -; fc45c - - -ForestTreeLeftAnimation: ; fc45c - ld hl, sp+0 - ld b, h - ld c, l - -; Only during the Celebi event. - ld a, [wCelebiEvent] - bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a - jr nz, .asm_fc46c - ld hl, ForestTreeLeftFrames - jr .asm_fc47d - -.asm_fc46c - ld a, [wTileAnimationTimer] - call GetForestTreeFrame - add a - add a - add a - add LOW(ForestTreeLeftFrames) - ld l, a - ld a, 0 - adc HIGH(ForestTreeLeftFrames) - ld h, a - -.asm_fc47d - ld sp, hl - ld hl, vTiles2 tile $0c - jp WriteTile -; fc484 - - -ForestTreeLeftFrames: ; fc484 - INCBIN "gfx/tilesets/forest-tree/1.2bpp" - INCBIN "gfx/tilesets/forest-tree/2.2bpp" -; fc4a4 - -ForestTreeRightFrames: ; fc4a4 - INCBIN "gfx/tilesets/forest-tree/3.2bpp" - INCBIN "gfx/tilesets/forest-tree/4.2bpp" -; fc4c4 - - -ForestTreeRightAnimation: ; fc4c4 - ld hl, sp+0 - ld b, h - ld c, l - -; Only during the Celebi event. - ld a, [wCelebiEvent] - bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a - jr nz, .asm_fc4d4 - ld hl, ForestTreeRightFrames - jr .asm_fc4eb - -.asm_fc4d4 - ld a, [wTileAnimationTimer] - call GetForestTreeFrame - add a - add a - add a - add LOW(ForestTreeLeftFrames) - ld l, a - ld a, 0 - adc HIGH(ForestTreeLeftFrames) - ld h, a - push bc - ld bc, ForestTreeRightFrames - ForestTreeLeftFrames - add hl, bc - pop bc - -.asm_fc4eb - ld sp, hl - ld hl, vTiles2 tile $0f - jp WriteTile -; fc4f2 - - -ForestTreeLeftAnimation2: ; fc4f2 - ld hl, sp+0 - ld b, h - ld c, l - -; Only during the Celebi event. - ld a, [wCelebiEvent] - bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a - jr nz, .asm_fc502 - ld hl, ForestTreeLeftFrames - jr .asm_fc515 - -.asm_fc502 - ld a, [wTileAnimationTimer] - call GetForestTreeFrame - xor 2 - add a - add a - add a - add LOW(ForestTreeLeftFrames) - ld l, a - ld a, 0 - adc HIGH(ForestTreeLeftFrames) - ld h, a - -.asm_fc515 - ld sp, hl - ld hl, vTiles2 tile $0c - jp WriteTile -; fc51c - - -ForestTreeRightAnimation2: ; fc51c - ld hl, sp+0 - ld b, h - ld c, l - -; Only during the Celebi event. - ld a, [wCelebiEvent] - bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a - jr nz, .asm_fc52c - ld hl, ForestTreeRightFrames - jr .asm_fc545 - -.asm_fc52c - ld a, [wTileAnimationTimer] - call GetForestTreeFrame - xor 2 - add a - add a - add a - add LOW(ForestTreeLeftFrames) - ld l, a - ld a, 0 - adc HIGH(ForestTreeLeftFrames) - ld h, a - push bc - ld bc, ForestTreeRightFrames - ForestTreeLeftFrames - add hl, bc - pop bc - -.asm_fc545 - ld sp, hl - ld hl, vTiles2 tile $0f - jp WriteTile -; fc54c - - -GetForestTreeFrame: ; fc54c -; Return 0 if a is even, or 2 if odd. - and a - jr z, .even - cp 1 - jr z, .odd - cp 2 - jr z, .even - cp 3 - jr z, .odd - cp 4 - jr z, .even - cp 5 - jr z, .odd - cp 6 - jr z, .even -.odd - ld a, 2 - scf - ret -.even - xor a - ret -; fc56d - - -AnimateFlowerTile: ; fc56d -; No parameters. - -; Save sp in bc (see WriteTile). - ld hl, sp+0 - ld b, h - ld c, l - -; Alternate tile graphic every other frame - ld a, [wTileAnimationTimer] - and %10 - ld e, a - -; CGB has different color mappings for flowers. - ld a, [hCGB] - and 1 - - add e - swap a - ld e, a - ld d, 0 - ld hl, FlowerTileFrames - add hl, de - ld sp, hl - - ld hl, vTiles2 tile $03 - - jp WriteTile -; fc58c - -FlowerTileFrames: ; fc58c - INCBIN "gfx/tilesets/flower/dmg_1.2bpp" - INCBIN "gfx/tilesets/flower/cgb_1.2bpp" - INCBIN "gfx/tilesets/flower/dmg_2.2bpp" - INCBIN "gfx/tilesets/flower/cgb_2.2bpp" -; fc5cc - - -LavaBubbleAnim1: ; fc5cc -; Splash in the bottom-right corner of the fountain. - ld hl, sp+0 - ld b, h - ld c, l - ld a, [wTileAnimationTimer] - and %110 - srl a - inc a - inc a - and %011 - swap a - ld e, a - ld d, 0 - ld hl, LavaBubbleFrames - add hl, de - ld sp, hl - ld hl, vTiles2 tile $5b - jp WriteTile -; fc5eb - - -LavaBubbleAnim2: ; fc5eb -; Splash in the top-left corner of the fountain. - ld hl, sp+0 - ld b, h - ld c, l - ld a, [wTileAnimationTimer] - and %110 - add a - add a - add a - ld e, a - ld d, 0 - ld hl, LavaBubbleFrames - add hl, de - ld sp, hl - ld hl, vTiles2 tile $38 - jp WriteTile -; fc605 - - -LavaBubbleFrames: ; fc605 - INCBIN "gfx/tilesets/lava/1.2bpp" - INCBIN "gfx/tilesets/lava/2.2bpp" - INCBIN "gfx/tilesets/lava/3.2bpp" - INCBIN "gfx/tilesets/lava/4.2bpp" -; fc645 - - -AnimateTowerPillarTile: ; fc645 -; Read from struct at de: -; Destination (VRAM) -; Address of the first tile in the frame array - - ld hl, sp+0 - ld b, h - ld c, l - - ld a, [wTileAnimationTimer] - and %111 - -; Get frame index a - ld hl, .frames - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, [hl] - -; Destination - ld l, e - ld h, d - ld e, [hl] - inc hl - ld d, [hl] - inc hl - -; Add the frame index to the starting address - add [hl] - inc hl - ld h, [hl] - ld l, a - ld a, 0 - adc h - ld h, a - - ld sp, hl - ld l, e - ld h, d - jr WriteTile - -.frames - db $00, $10, $20, $30, $40, $30, $20, $10 -; fc673 - - -StandingTileFrame: ; fc673 - ld hl, wTileAnimationTimer - inc [hl] - ret -; fc678 - - -AnimateWhirlpoolTile: ; fc678 -; Update whirlpool tile using struct at de. - -; Struct: -; VRAM address -; Address of the first tile - -; Only does one of 4 tiles at a time. - -; Save sp in bc (see WriteTile). - ld hl, sp+0 - ld b, h - ld c, l - -; de = VRAM address - ld l, e - ld h, d - ld e, [hl] - inc hl - ld d, [hl] - inc hl -; Tile address is now at hl. - -; Get the tile for this frame. - ld a, [wTileAnimationTimer] - and %11 ; 4 frames x2 - swap a ; * 16 bytes per tile - - add [hl] - inc hl - ld h, [hl] - ld l, a - ld a, 0 - adc h - ld h, a - -; The stack now points to the desired frame. - ld sp, hl - - ld l, e - ld h, d - - jr WriteTile -; fc696 - - -WriteTileFromBuffer: ; fc696 -; Write tiledata at wTileAnimBuffer to de. -; wTileAnimBuffer is loaded to sp for WriteTile. - - ld hl, sp+0 - ld b, h - ld c, l - - ld hl, wTileAnimBuffer - ld sp, hl - - ld h, d - ld l, e - jr WriteTile -; fc6a2 - - -WriteTileToBuffer: ; fc6a2 -; Write tiledata de to wTileAnimBuffer. -; de is loaded to sp for WriteTile. - - ld hl, sp+0 - ld b, h - ld c, l - - ld h, d - ld l, e - ld sp, hl - - ld hl, wTileAnimBuffer - - ; fallthrough - -WriteTile: ; fc6ac -; Write one 8x8 tile ($10 bytes) from sp to hl. - -; Warning: sp is saved in bc so we can abuse pop. -; sp is restored to address bc. Save sp in bc before calling. - - pop de - ld [hl], e - inc hl - ld [hl], d - -rept 7 - pop de - inc hl - ld [hl], e - inc hl - ld [hl], d -endr - -; restore sp - ld h, b - ld l, c - ld sp, hl - ret -; fc6d7 - - -TileAnimationPalette: ; fc6d7 -; Transition between color values 0-2 for color 0 in palette 3. - -; No palette changes on DMG. - ld a, [hCGB] - and a - ret z - -; We don't want to mess with non-standard palettes. - ld a, [rBGP] ; BGP - cp %11100100 - ret nz - -; Only update on even frames. - ld a, [wTileAnimationTimer] - ld l, a - and 1 ; odd - ret nz - -; Ready for BGPD input... - - ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_WATER - ld [rBGPI], a - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - -; Update color 0 in order 0 1 2 1 - ld a, l - and %110 ; frames 0 2 4 6 - jr z, .color0 - cp %100 ; frame 4 - jr z, .color2 - -.color1 - ld hl, wBGPals1 palette PAL_BG_WATER color 1 - ld a, [hli] - ld [rBGPD], a - ld a, [hli] - ld [rBGPD], a - jr .end - -.color0 - ld hl, wBGPals1 palette PAL_BG_WATER color 0 - ld a, [hli] - ld [rBGPD], a - ld a, [hli] - ld [rBGPD], a - jr .end - -.color2 - ld hl, wBGPals1 palette PAL_BG_WATER color 2 - ld a, [hli] - ld [rBGPD], a - ld a, [hli] - ld [rBGPD], a - -.end - pop af - ld [rSVBK], a - ret -; fc71e - - -FlickeringCaveEntrancePalette: ; fc71e -; No palette changes on DMG. - ld a, [hCGB] - and a - ret z -; We don't want to mess with non-standard palettes. - ld a, [rBGP] - cp %11100100 - ret nz -; We only want to be here if we're in a dark cave. - ld a, [wTimeOfDayPalset] - cp %11111111 ; 3,3,3,3 - ret nz - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a -; Ready for BGPD input... - ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_YELLOW - ld [rBGPI], a - ld a, [hVBlankCounter] - and %10 - jr nz, .bit1set - ld hl, wBGPals1 palette PAL_BG_YELLOW - jr .okay - -.bit1set - ld hl, wBGPals1 palette PAL_BG_YELLOW color 1 - -.okay - ld a, [hli] - ld [rBGPD], a - ld a, [hli] - ld [rBGPD], a - - pop af - ld [rSVBK], a - ret -; fc750 - - -TowerPillarTilePointer1: dw vTiles2 tile $2d, TowerPillarTile1 -TowerPillarTilePointer2: dw vTiles2 tile $2f, TowerPillarTile2 -TowerPillarTilePointer3: dw vTiles2 tile $3d, TowerPillarTile3 -TowerPillarTilePointer4: dw vTiles2 tile $3f, TowerPillarTile4 -TowerPillarTilePointer5: dw vTiles2 tile $3c, TowerPillarTile5 -TowerPillarTilePointer6: dw vTiles2 tile $2c, TowerPillarTile6 -TowerPillarTilePointer7: dw vTiles2 tile $4d, TowerPillarTile7 -TowerPillarTilePointer8: dw vTiles2 tile $4f, TowerPillarTile8 -TowerPillarTilePointer9: dw vTiles2 tile $5d, TowerPillarTile9 -TowerPillarTilePointer10: dw vTiles2 tile $5f, TowerPillarTile10 - -TowerPillarTile1: INCBIN "gfx/tilesets/tower-pillar/1.2bpp" -TowerPillarTile2: INCBIN "gfx/tilesets/tower-pillar/2.2bpp" -TowerPillarTile3: INCBIN "gfx/tilesets/tower-pillar/3.2bpp" -TowerPillarTile4: INCBIN "gfx/tilesets/tower-pillar/4.2bpp" -TowerPillarTile5: INCBIN "gfx/tilesets/tower-pillar/5.2bpp" -TowerPillarTile6: INCBIN "gfx/tilesets/tower-pillar/6.2bpp" -TowerPillarTile7: INCBIN "gfx/tilesets/tower-pillar/7.2bpp" -TowerPillarTile8: INCBIN "gfx/tilesets/tower-pillar/8.2bpp" -TowerPillarTile9: INCBIN "gfx/tilesets/tower-pillar/9.2bpp" -TowerPillarTile10: INCBIN "gfx/tilesets/tower-pillar/10.2bpp" -; fca98 - - -WhirlpoolFrames1: dw vTiles2 tile $32, WhirlpoolTiles1 -WhirlpoolFrames2: dw vTiles2 tile $33, WhirlpoolTiles2 -WhirlpoolFrames3: dw vTiles2 tile $42, WhirlpoolTiles3 -WhirlpoolFrames4: dw vTiles2 tile $43, WhirlpoolTiles4 -; fcaa8 - -WhirlpoolTiles1: INCBIN "gfx/tilesets/whirlpool/1.2bpp" -WhirlpoolTiles2: INCBIN "gfx/tilesets/whirlpool/2.2bpp" -WhirlpoolTiles3: INCBIN "gfx/tilesets/whirlpool/3.2bpp" -WhirlpoolTiles4: INCBIN "gfx/tilesets/whirlpool/4.2bpp" -; fcba8 diff --git a/engine/gfx/tileset_palettes.asm b/engine/gfx/tileset_palettes.asm deleted file mode 100644 index e2c39c0ab..000000000 --- a/engine/gfx/tileset_palettes.asm +++ /dev/null @@ -1,151 +0,0 @@ -LoadSpecialMapPalette: ; 494ac - ld a, [wMapTileset] - cp TILESET_POKECOM_CENTER - jr z, .pokecom_2f - cp TILESET_BATTLE_TOWER - jr z, .battle_tower - cp TILESET_ICE_PATH - jr z, .ice_path - cp TILESET_HOUSE - jr z, .house - cp TILESET_RADIO_TOWER - jr z, .radio_tower - cp TILESET_MANSION - jr z, .mansion_mobile - jr .do_nothing - -.pokecom_2f - call LoadPokeComPalette - scf - ret - -.battle_tower - call LoadBattleTowerPalette - scf - ret - -.ice_path - ld a, [wEnvironment] - and $7 - cp INDOOR ; Hall of Fame - jr z, .do_nothing - call LoadIcePathPalette - scf - ret - -.house - call LoadHousePalette - scf - ret - -.radio_tower - call LoadRadioTowerPalette - scf - ret - -.mansion_mobile - call LoadMansionPalette - scf - ret - -.do_nothing - and a - ret -; 494f2 - -LoadPokeComPalette: ; 494f2 - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, PokeComPalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 49501 - -PokeComPalette: ; 49501 -INCLUDE "gfx/tilesets/pokecom_center.pal" -; 49541 - -LoadBattleTowerPalette: ; 49541 - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, BattleTowerPalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 49550 - -BattleTowerPalette: ; 49550 -INCLUDE "gfx/tilesets/battle_tower.pal" -; 49590 - -LoadIcePathPalette: ; 49590 - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, IcePathPalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 4959f - -IcePathPalette: ; 4959f -INCLUDE "gfx/tilesets/ice_path.pal" -; 495df - -LoadHousePalette: ; 495df - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, HousePalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 495ee - -HousePalette: ; 495ee -INCLUDE "gfx/tilesets/house.pal" -; 4962e - -LoadRadioTowerPalette: ; 4962e - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, RadioTowerPalette - ld bc, 8 palettes - call FarCopyWRAM - ret -; 4963d - -RadioTowerPalette: ; 4963d -INCLUDE "gfx/tilesets/radio_tower.pal" -; 4967d - -MansionPalette1: ; 4967d -INCLUDE "gfx/tilesets/mansion_1.pal" -; 496c5 - -LoadMansionPalette: ; 496c5 - ld a, BANK(wBGPals1) - ld de, wBGPals1 - ld hl, MansionPalette1 - ld bc, 8 palettes - call FarCopyWRAM - ld a, BANK(wBGPals1) - ld de, wBGPals1 palette PAL_BG_YELLOW - ld hl, MansionPalette2 - ld bc, 1 palettes - call FarCopyWRAM - ld a, BANK(wBGPals1) - ld de, wBGPals1 palette PAL_BG_WATER - ld hl, MansionPalette1 + 6 palettes - ld bc, 1 palettes - call FarCopyWRAM - ld a, BANK(wBGPals1) - ld de, wBGPals1 palette PAL_BG_ROOF - ld hl, MansionPalette1 + 8 palettes - ld bc, 1 palettes - call FarCopyWRAM - ret -; 496fe - -MansionPalette2: ; 496fe -INCLUDE "gfx/tilesets/mansion_2.pal" -; 49706 diff --git a/engine/gfx/timeofdaypals.asm b/engine/gfx/timeofdaypals.asm deleted file mode 100644 index b8d43d252..000000000 --- a/engine/gfx/timeofdaypals.asm +++ /dev/null @@ -1,415 +0,0 @@ -DummyPredef35: ; 8c000 -DummyPredef36: - ret - -UpdateTimeOfDayPal:: ; 8c001 - call UpdateTime - ld a, [wTimeOfDay] - ld [wCurTimeOfDay], a - call GetTimePalette - ld [wTimeOfDayPal], a - ret -; 8c011 - - -_TimeOfDayPals:: ; 8c011 -; return carry if pals are changed - -; forced pals? - ld hl, wTimeOfDayPalFlags - bit 7, [hl] - jr nz, .dontchange - -; do we need to bother updating? - ld a, [wTimeOfDay] - ld hl, wCurTimeOfDay - cp [hl] - jr z, .dontchange - -; if so, the time of day has changed - ld a, [wTimeOfDay] - ld [wCurTimeOfDay], a - -; get palette id - call GetTimePalette - -; same palette as before? - ld hl, wTimeOfDayPal - cp [hl] - jr z, .dontchange - -; update palette id - ld [wTimeOfDayPal], a - -; save bg palette 7 - ld hl, wBGPals1 palette PAL_BG_TEXT - -; save wram bank - ld a, [rSVBK] - ld b, a - - ld a, BANK(wBGPals1) - ld [rSVBK], a - -; push palette - ld c, NUM_PAL_COLORS -.push - ld d, [hl] - inc hl - ld e, [hl] - inc hl - push de - dec c - jr nz, .push - -; restore wram bank - ld a, b - ld [rSVBK], a - - -; update sgb pals - ld b, SCGB_MAPPALS - call GetSGBLayout - - -; restore bg palette 7 - ld hl, wOBPals1 - 1 ; last byte in wBGPals1 - -; save wram bank - ld a, [rSVBK] - ld d, a - - ld a, BANK(wOBPals1) - ld [rSVBK], a - -; pop palette - ld e, NUM_PAL_COLORS -.pop - pop bc - ld [hl], c - dec hl - ld [hl], b - dec hl - dec e - jr nz, .pop - -; restore wram bank - ld a, d - ld [rSVBK], a - -; update palettes - call _UpdateTimePals - call DelayFrame - -; successful change - scf - ret - -.dontchange -; no change occurred - and a - ret -; 8c070 - - -_UpdateTimePals:: ; 8c070 - ld c, $9 ; normal - call GetTimePalFade - call DmgToCgbTimePals - ret -; 8c079 - -FadeInPalettes:: ; 8c079 - ld c, $12 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsDecHL - ret -; 8c084 - -FadeOutPalettes:: ; 8c084 - call FillWhiteBGColor - ld c, $9 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsIncHL - ret -; 8c092 - -BattleTowerFade: ; 8c092 - call FillWhiteBGColor - ld c, $9 - call GetTimePalFade - ld b, $4 -.asm_8c09c - call DmgToCgbTimePals - inc hl - inc hl - inc hl - ld c, $7 - call DelayFrames - dec b - jr nz, .asm_8c09c - ret -; 8c0ab - -FadeInQuickly: ; 8c0ab - ld c, $0 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsIncHL - ret -; 8c0b6 - -FadeBlackQuickly: ; 8c0b6 - ld c, $9 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsDecHL - ret -; 8c0c1 - - -FillWhiteBGColor: ; 8c0c1 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld hl, wBGPals1 - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - ld hl, wBGPals1 + 1 palettes - ld c, 6 -.loop - ld a, e - ld [hli], a - ld a, d - ld [hli], a -rept 6 - inc hl -endr - dec c - jr nz, .loop - - pop af - ld [rSVBK], a - ret -; 8c0e5 - -ReplaceTimeOfDayPals: ; 8c0e5 - ld hl, .BrightnessLevels - ld a, [wMapTimeOfDay] - cp $4 ; Dark cave, needs Flash - jr z, .DarkCave - and $7 - add l - ld l, a - ld a, $0 - adc h - ld h, a - ld a, [hl] - ld [wTimeOfDayPalset], a - ret - -.DarkCave: - ld a, [wStatusFlags] - bit STATUSFLAGS_FLASH_F, a - jr nz, .UsedFlash - ld a, %11111111 ; 3, 3, 3, 3 - ld [wTimeOfDayPalset], a - ret - -.UsedFlash: - ld a, %10101010 ; 2, 2, 2, 2 - ld [wTimeOfDayPalset], a - ret -; 8c10f (23:410f) - -.BrightnessLevels: ; 8c10f - dc 3, 2, 1, 0 - dc 1, 1, 1, 1 - dc 2, 2, 2, 2 - dc 0, 0, 0, 0 - dc 3, 3, 3, 3 - dc 3, 2, 1, 0 - dc 3, 2, 1, 0 - dc 3, 2, 1, 0 -; 8c117 - -GetTimePalette: ; 8c117 - ld a, [wTimeOfDay] - ld e, a - ld d, 0 - ld hl, .TimePalettes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 8c126 - -.TimePalettes: - dw .MorningPalette - dw .DayPalette - dw .NitePalette - dw .DarknessPalette - -.MorningPalette: - ld a, [wTimeOfDayPalset] - and %00000011 ; 0 - ret - -.DayPalette: - ld a, [wTimeOfDayPalset] - and %00001100 ; 1 - srl a - srl a - ret - -.NitePalette: - ld a, [wTimeOfDayPalset] - and %00110000 ; 2 - swap a - ret - -.DarknessPalette: - ld a, [wTimeOfDayPalset] - and %11000000 ; 3 - rlca - rlca - ret -; 8c14e - - -DmgToCgbTimePals: ; 8c14e - push hl - push de - ld a, [hli] - call DmgToCgbBGPals - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - call DmgToCgbObjPals - pop de - pop hl - ret -; 8c15e - -ConvertTimePalsIncHL: ; 8c15e -.loop - call DmgToCgbTimePals - inc hl - inc hl - inc hl - ld c, 2 - call DelayFrames - dec b - jr nz, .loop - ret -; 8c16d - -ConvertTimePalsDecHL: ; 8c16d -.loop - call DmgToCgbTimePals - dec hl - dec hl - dec hl - ld c, 2 - call DelayFrames - dec b - jr nz, .loop - ret -; 8c17c - - -GetTimePalFade: ; 8c17c -; check cgb - ld a, [hCGB] - and a - jr nz, .cgb - -; else: dmg - -; index - ld a, [wTimeOfDayPal] - and %11 - -; get fade table - push bc - ld c, a - ld b, $0 - ld hl, .dmgfades - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - pop bc - -; get place in fade table - ld b, $0 - add hl, bc - ret - -.cgb - ld hl, .cgbfade - ld b, $0 - add hl, bc - ret - -.dmgfades - dw .morn - dw .day - dw .nite - dw .darkness - -.morn - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11100100, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.day - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11100100, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.nite - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11101001, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.darkness - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111111 - db %11111110, %11100100, %11111111 - db %11111101, %11010000, %11111111 - db %11111101, %10000000, %11111111 - db %00000000, %01000000, %00000000 - db %00000000, %00000000, %00000000 - -.cgbfade - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11111001, %11111001 - db %11100100, %11100100, %11100100 - db %10010000, %10010000, %10010000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 -; 8c20f diff --git a/engine/gfx/trade_animation.asm b/engine/gfx/trade_animation.asm deleted file mode 100755 index 04c31df80..000000000 --- a/engine/gfx/trade_animation.asm +++ /dev/null @@ -1,1646 +0,0 @@ -TRADEANIM_RIGHT_ARROW EQU $ed -TRADEANIM_LEFT_ARROW EQU $ee - -; TradeAnim_TubeAnimJumptable.Jumptable indexes - const_def - const TRADEANIMSTATE_0 ; 0 - const TRADEANIMSTATE_1 ; 1 - const TRADEANIMSTATE_2 ; 2 - const TRADEANIMSTATE_3 ; 3 -TRADEANIMJUMPTABLE_LENGTH EQU const_value - -TradeAnimation: ; 28f24 - xor a - ld [wcf66], a - ld hl, wPlayerTrademonSenderName - ld de, wOTTrademonSenderName - call LinkTradeAnim_LoadTradePlayerNames - ld hl, wPlayerTrademonSpecies - ld de, wOTTrademonSpecies - call LinkTradeAnim_LoadTradeMonSpecies - ld de, .script - jr RunTradeAnimScript - -.script - tradeanim_setup_givemon_scroll - tradeanim_show_givemon_data - tradeanim_do_givemon_scroll - tradeanim_wait_80 - tradeanim_wait_96 - tradeanim_poof - tradeanim_rocking_ball - tradeanim_enter_link_tube - tradeanim_wait_anim - tradeanim_bulge_through_tube - tradeanim_wait_anim - tradeanim_textbox_scroll - tradeanim_give_trademon_sfx - tradeanim_tube_to_ot - tradeanim_sent_to_ot_text - tradeanim_scroll_out_right - - tradeanim_ot_sends_text_1 - tradeanim_ot_bids_farewell - tradeanim_wait_40 - tradeanim_scroll_out_right - tradeanim_get_trademon_sfx - tradeanim_tube_to_player - tradeanim_enter_link_tube - tradeanim_drop_ball - tradeanim_exit_link_tube - tradeanim_wait_anim - tradeanim_show_getmon_data - tradeanim_poof - tradeanim_wait_anim - tradeanim_frontpic_scroll - tradeanim_animate_frontpic - tradeanim_wait_80_if_ot_egg - tradeanim_textbox_scroll - tradeanim_take_care_of_text - tradeanim_scroll_out_right - tradeanim_end - -TradeAnimationPlayer2: ; 28f63 - xor a - ld [wcf66], a - ld hl, wOTTrademonSenderName - ld de, wPlayerTrademonSenderName - call LinkTradeAnim_LoadTradePlayerNames - ld hl, wOTTrademonSpecies - ld de, wPlayerTrademonSpecies - call LinkTradeAnim_LoadTradeMonSpecies - ld de, .script - jr RunTradeAnimScript - -.script - tradeanim_ot_sends_text_2 - tradeanim_ot_bids_farewell - tradeanim_wait_40 - tradeanim_scroll_out_right - tradeanim_get_trademon_sfx - tradeanim_tube_to_ot - tradeanim_enter_link_tube - tradeanim_drop_ball - tradeanim_exit_link_tube - tradeanim_wait_anim - tradeanim_show_getmon_data - tradeanim_poof - tradeanim_wait_anim - tradeanim_frontpic_scroll - tradeanim_animate_frontpic - tradeanim_wait_180_if_ot_egg - tradeanim_textbox_scroll - tradeanim_take_care_of_text - tradeanim_scroll_out_right - - tradeanim_setup_givemon_scroll - tradeanim_show_givemon_data - tradeanim_do_givemon_scroll - tradeanim_wait_40 - tradeanim_poof - tradeanim_rocking_ball - tradeanim_enter_link_tube - tradeanim_wait_anim - tradeanim_bulge_through_tube - tradeanim_wait_anim - tradeanim_textbox_scroll - tradeanim_give_trademon_sfx - tradeanim_tube_to_player - tradeanim_sent_to_ot_text - tradeanim_scroll_out_right - tradeanim_end - -RunTradeAnimScript: ; 28fa1 - ld hl, wTradeAnimAddress - ld [hl], e - inc hl - ld [hl], d - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a - ld hl, wVramState - ld a, [hl] - push af - res 0, [hl] - ld hl, wOptions - ld a, [hl] - push af - set 4, [hl] - call .TradeAnimLayout - ld a, [wcf66] - and a - jr nz, .anim_loop - ld de, MUSIC_EVOLUTION - call PlayMusic2 -.anim_loop - call DoTradeAnimation - jr nc, .anim_loop - pop af - ld [wOptions], a - pop af - ld [wVramState], a - pop af - ld [hMapAnims], a - ret - -; 28fdb - -.TradeAnimLayout: ; 28fdb - xor a - ld [wJumptableIndex], a - call ClearBGPalettes - call ClearSprites - call ClearTileMap - call DisableLCD - call LoadFontsBattleExtra - callfar ClearSpriteAnims - ld a, [hCGB] - and a - jr z, .NotCGB - ld a, $1 - ld [rVBK], a - ld hl, vTiles0 - ld bc, sScratch - vTiles0 - xor a - call ByteFill - ld a, $0 - ld [rVBK], a - -.NotCGB: - hlbgcoord 0, 0 - ld bc, sScratch - vBGMap0 - ld a, " " - call ByteFill - ld hl, TradeGameBoyLZ - ld de, vTiles2 tile $31 - call Decompress - ld hl, TradeArrowGFX - ld de, vTiles0 tile TRADEANIM_RIGHT_ARROW - ld bc, 1 tiles - ld a, BANK(TradeArrowGFX) - call FarCopyBytes - ld hl, TradeArrowGFX + 1 tiles - ld de, vTiles0 tile TRADEANIM_LEFT_ARROW - ld bc, 1 tiles - ld a, BANK(TradeArrowGFX) - call FarCopyBytes - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall GetTrademonFrontpic - call EnableLCD - call LoadTradeBallAndCableGFX - ld a, [wPlayerTrademonSpecies] - ld hl, wPlayerTrademonDVs - ld de, vTiles0 - call TradeAnim_GetFrontpic - ld a, [wOTTrademonSpecies] - ld hl, wOTTrademonDVs - ld de, vTiles0 tile $31 - call TradeAnim_GetFrontpic - ld a, [wPlayerTrademonSpecies] - ld de, wPlayerTrademonSpeciesName - call TradeAnim_GetNickname - ld a, [wOTTrademonSpecies] - ld de, wOTTrademonSpeciesName - call TradeAnim_GetNickname - call TradeAnim_NormalPals - ret - -; 29082 - -DoTradeAnimation: ; 29082 - ld a, [wJumptableIndex] - bit 7, a - jr nz, .finished - call .DoTradeAnimCommand - callfar PlaySpriteAnimations - ld hl, wcf65 - inc [hl] - call DelayFrame - and a - ret - -.finished - call LoadStandardFont - scf - ret - -; 290a0 - -.DoTradeAnimCommand: ; 290a0 - 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 -; 290af - -.JumpTable: ; 290af -; entries correspond to macros/scripts/trade_anims.asm enumeration - dw TradeAnim_AdvanceScriptPointer ; 00 - dw TradeAnim_ShowGivemonData ; 01 - dw TradeAnim_ShowGetmonData ; 02 - dw TradeAnim_EnterLinkTube1 ; 03 - dw TradeAnim_EnterLinkTube2 ; 04 - dw TradeAnim_ExitLinkTube ; 05 - dw TradeAnim_TubeToOT1 ; 06 - dw TradeAnim_TubeToOT2 ; 07 - dw TradeAnim_TubeToOT3 ; 08 - dw TradeAnim_TubeToOT4 ; 09 - dw TradeAnim_TubeToOT5 ; 0a - dw TradeAnim_TubeToOT6 ; 0b - dw TradeAnim_TubeToOT7 ; 0c - dw TradeAnim_TubeToOT8 ; 0d - dw TradeAnim_TubeToPlayer1 ; 0e - dw TradeAnim_TubeToPlayer2 ; 0f - dw TradeAnim_TubeToPlayer3 ; 10 - dw TradeAnim_TubeToPlayer4 ; 11 - dw TradeAnim_TubeToPlayer5 ; 12 - dw TradeAnim_TubeToPlayer6 ; 13 - dw TradeAnim_TubeToPlayer7 ; 14 - dw TradeAnim_TubeToPlayer8 ; 15 - dw TradeAnim_SentToOTText ; 16 - dw TradeAnim_OTBidsFarewell ; 17 - dw TradeAnim_TakeCareOfText ; 18 - dw TradeAnim_OTSendsText1 ; 19 - dw TradeAnim_OTSendsText2 ; 1a - dw TradeAnim_SetupGivemonScroll ; 1b - dw TradeAnim_DoGivemonScroll ; 1c - dw TradeAnim_FrontpicScrollStart ; 1d - dw TradeAnim_TextboxScrollStart ; 1e - dw TradeAnim_ScrollOutRight ; 1f - dw TradeAnim_ScrollOutRight2 ; 20 - dw TraideAnim_Wait80 ; 21 - dw TraideAnim_Wait40 ; 22 - dw TradeAnim_RockingBall ; 23 - dw TradeAnim_DropBall ; 24 - dw TradeAnim_WaitAnim ; 25 - dw TradeAnim_WaitAnim2 ; 26 - dw TradeAnim_Poof ; 27 - dw TradeAnim_BulgeThroughTube ; 28 - dw TradeAnim_GiveTrademonSFX ; 29 - dw TradeAnim_GetTrademonSFX ; 2a - dw TradeAnim_End ; 2b - dw TradeAnim_AnimateFrontpic ; 2c - dw TraideAnim_Wait96 ; 2d - dw TraideAnim_Wait80IfOTEgg ; 2e - dw TraideAnim_Wait180IfOTEgg ; 2f -; 2910f - -TradeAnim_IncrementJumptableIndex: ; 2910f - ld hl, wJumptableIndex - inc [hl] - ret - -; 29114 - -TradeAnim_AdvanceScriptPointer: ; 29114 - ld hl, wTradeAnimAddress - ld e, [hl] - inc hl - ld d, [hl] - ld a, [de] - ld [wJumptableIndex], a - inc de - ld [hl], d - dec hl - ld [hl], e - ret - -; 29123 - -TradeAnim_End: ; 29123 - ld hl, wJumptableIndex - set 7, [hl] - ret - -; 29129 - -TradeAnim_TubeToOT1: ; 29129 - ld a, TRADEANIM_RIGHT_ARROW - call TradeAnim_PlaceTrademonStatsOnTubeAnim - ld a, [wLinkTradeSendmonSpecies] - ld [wd265], a - xor a - depixel 5, 11, 4, 0 - ld b, $0 - jr TradeAnim_InitTubeAnim - -TradeAnim_TubeToPlayer1: ; 2913c - ld a, TRADEANIM_LEFT_ARROW - call TradeAnim_PlaceTrademonStatsOnTubeAnim - ld a, [wLinkTradeGetmonSpecies] - ld [wd265], a - ld a, TRADEANIMSTATE_2 - depixel 9, 18, 4, 4 - ld b, $4 -TradeAnim_InitTubeAnim: ; 2914e - push bc - push de - push bc - push de - - push af - call DisableLCD - callfar ClearSpriteAnims - hlbgcoord 20, 3 - ld bc, 12 - ld a, $60 - call ByteFill - pop af - - call TradeAnim_TubeAnimJumptable - - xor a - ld [hSCX], a - ld a, $7 - ld [hWX], a - ld a, $70 - ld [hWY], a - call EnableLCD - call LoadTradeBubbleGFX - - pop de - ld a, SPRITE_ANIM_INDEX_TRADEMON_ICON - call _InitSpriteAnimStruct - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - pop bc - ld [hl], b - - pop de - ld a, SPRITE_ANIM_INDEX_TRADEMON_BUBBLE - call _InitSpriteAnimStruct - - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - pop bc - ld [hl], b - - call WaitBGMap - ld b, SCGB_TRADE_TUBE - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - ld a, %11010000 - call DmgToCgbObjPal0 - - call TradeAnim_IncrementJumptableIndex - ld a, 92 - ld [wFrameCounter], a - ret - -; 291af - -TradeAnim_TubeToOT2: ; 291af - call TradeAnim_FlashBGPals - ld a, [hSCX] - add $2 - ld [hSCX], a - cp $50 - ret nz - ld a, TRADEANIMSTATE_1 - call TradeAnim_TubeAnimJumptable - call TradeAnim_IncrementJumptableIndex - ret - -; 291c4 - -TradeAnim_TubeToOT3: ; 291c4 - call TradeAnim_FlashBGPals - ld a, [hSCX] - add $2 - ld [hSCX], a - cp $a0 - ret nz - ld a, TRADEANIMSTATE_2 - call TradeAnim_TubeAnimJumptable - call TradeAnim_IncrementJumptableIndex - ret - -; 291d9 - -TradeAnim_TubeToOT4: ; 291d9 - call TradeAnim_FlashBGPals - ld a, [hSCX] - add $2 - ld [hSCX], a - and a - ret nz - call TradeAnim_IncrementJumptableIndex - ret - -; 291e8 - -TradeAnim_TubeToPlayer3: ; 291e8 - call TradeAnim_FlashBGPals - ld a, [hSCX] - sub $2 - ld [hSCX], a - cp $b0 - ret nz - ld a, TRADEANIMSTATE_1 - call TradeAnim_TubeAnimJumptable - call TradeAnim_IncrementJumptableIndex - ret - -; 291fd - -TradeAnim_TubeToPlayer4: ; 291fd - call TradeAnim_FlashBGPals - ld a, [hSCX] - sub $2 - ld [hSCX], a - cp $60 - ret nz - xor a ; TRADEANIMSTATE_0 - call TradeAnim_TubeAnimJumptable - call TradeAnim_IncrementJumptableIndex - ret - -; 29211 - -TradeAnim_TubeToPlayer5: ; 29211 - call TradeAnim_FlashBGPals - ld a, [hSCX] - sub $2 - ld [hSCX], a - and a - ret nz - call TradeAnim_IncrementJumptableIndex - ret - -; 29220 - -TradeAnim_TubeToOT6: -TradeAnim_TubeToPlayer6: ; 29220 - ld a, 128 - ld [wFrameCounter], a - call TradeAnim_IncrementJumptableIndex - ret - -; 29229 - -TradeAnim_TubeToOT8: -TradeAnim_TubeToPlayer8: ; 29229 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - callfar ClearSpriteAnims - hlbgcoord 0, 0 - ld bc, sScratch - vBGMap0 - ld a, " " - call ByteFill - xor a - ld [hSCX], a - ld a, $90 - ld [hWY], a - call EnableLCD - call LoadTradeBallAndCableGFX - call WaitBGMap - call TradeAnim_NormalPals - call TradeAnim_AdvanceScriptPointer - ret - -; 2925d - -TradeAnim_TubeToOT5: -TradeAnim_TubeToOT7: -TradeAnim_TubeToPlayer2: -TradeAnim_TubeToPlayer7: ; 2925d - call TradeAnim_FlashBGPals - ld hl, wFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - ret - -.done - call TradeAnim_IncrementJumptableIndex - ret - -; 2926d - -TradeAnim_GiveTrademonSFX: ; 2926d - call TradeAnim_AdvanceScriptPointer - ld de, SFX_GIVE_TRADEMON - call PlaySFX - ret - -; 29277 - -TradeAnim_GetTrademonSFX: ; 29277 - call TradeAnim_AdvanceScriptPointer - ld de, SFX_GET_TRADEMON - call PlaySFX - ret - -; 29281 - -TradeAnim_TubeAnimJumptable: ; 29281 - maskbits TRADEANIMJUMPTABLE_LENGTH - 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 -; 2928f - -.Jumptable: ; 2928f -; entries correspond to TRADEANIMSTATE_* constants - dw .Zero - dw .One - dw .Two - dw .Three -; 29297 - -.Zero: ; 29297 -.Three: ; 29297 - call TradeAnim_BlankTileMap - hlcoord 9, 3 - ld [hl], $5b - inc hl - ld bc, 10 - ld a, $60 - call ByteFill - hlcoord 3, 2 - call TradeAnim_CopyTradeGameBoyTilemap - ret - -; 292af - -.One: ; 292af - call TradeAnim_BlankTileMap - hlcoord 0, 3 - ld bc, SCREEN_WIDTH - ld a, $60 - call ByteFill - ret - -; 292be - -.Two: ; 292be - call TradeAnim_BlankTileMap - hlcoord 0, 3 - ld bc, $11 - ld a, $60 - call ByteFill - hlcoord 17, 3 - ld a, $5d - ld [hl], a - - ld a, $61 - ld de, SCREEN_WIDTH - ld c, $3 -.loop - add hl, de - ld [hl], a - dec c - jr nz, .loop - - add hl, de - ld a, $5f - ld [hld], a - ld a, $5b - ld [hl], a - hlcoord 10, 6 - call TradeAnim_CopyTradeGameBoyTilemap - ret - -; 292ec - -TradeAnim_CopyTradeGameBoyTilemap: ; 292ec - ld de, TradeGameBoyTilemap - lb bc, 8, 6 - call TradeAnim_CopyBoxFromDEtoHL - ret - -; 292f6 - -TradeAnim_PlaceTrademonStatsOnTubeAnim: ; 292f6 - push af - call ClearBGPalettes - call WaitTop - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - call ClearTileMap - hlcoord 0, 0 - ld bc, SCREEN_WIDTH - ld a, "─" - call ByteFill - hlcoord 0, 1 - ld de, wLinkPlayer1Name - call PlaceString - ld hl, wLinkPlayer2Name - ld de, 0 -.find_name_end_loop - ld a, [hli] - cp "@" - jr z, .done - dec de - jr .find_name_end_loop - -.done - hlcoord 0, 4 - add hl, de - ld de, wLinkPlayer2Name - call PlaceString - hlcoord 7, 2 - ld bc, 6 - pop af - call ByteFill - call WaitBGMap - call WaitTop - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - call ClearTileMap - ret - -; 29348 - -TradeAnim_EnterLinkTube1: ; 29348 - call ClearTileMap - call WaitTop - ld a, $a0 - ld [hSCX], a - call DelayFrame - hlcoord 8, 2 - ld de, TradeLinkTubeTilemap - lb bc, 3, 12 - call TradeAnim_CopyBoxFromDEtoHL - call WaitBGMap - ld b, SCGB_TRADE_TUBE - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - lb de, %11100100, %11100100 ; 3,2,1,0, 3,2,1,0 - call DmgToCgbObjPals - ld de, SFX_POTION - call PlaySFX - call TradeAnim_IncrementJumptableIndex - ret - -; 2937e - -TradeAnim_EnterLinkTube2: ; 2937e - ld a, [hSCX] - and a - jr z, .done - add $4 - ld [hSCX], a - ret - -.done - ld c, 80 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 29391 - -TradeAnim_ExitLinkTube: ; 29391 - ld a, [hSCX] - cp $a0 - jr z, .done - sub $4 - ld [hSCX], a - ret - -.done - call ClearTileMap - xor a - ld [hSCX], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293a6 - -TradeAnim_SetupGivemonScroll: ; 293a6 - ld a, $8f - ld [hWX], a - ld a, $88 - ld [hSCX], a - ld a, $50 - ld [hWY], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293b6 - -TradeAnim_DoGivemonScroll: ; 293b6 - ld a, [hWX] - cp $7 - jr z, .done - sub $4 - ld [hWX], a - ld a, [hSCX] - sub $4 - ld [hSCX], a - ret - -.done - ld a, $7 - ld [hWX], a - xor a - ld [hSCX], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293d2 - -TradeAnim_FrontpicScrollStart: ; 293d2 - ld a, $7 - ld [hWX], a - ld a, $50 - ld [hWY], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293de - -TradeAnim_TextboxScrollStart: ; 293de - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - call TradeAnim_AdvanceScriptPointer - ret - -; 293ea - -TradeAnim_ScrollOutRight: ; 293ea - call WaitTop - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - call WaitBGMap - ld a, $7 - ld [hWX], a - xor a - ld [hWY], a - call DelayFrame - call WaitTop - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - call ClearTileMap - call TradeAnim_IncrementJumptableIndex - ret - -; 2940c - -TradeAnim_ScrollOutRight2: ; 2940c - ld a, [hWX] - cp $a1 - jr nc, .done - add $4 - ld [hWX], a - ret - -.done - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - call WaitBGMap - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - call TradeAnim_AdvanceScriptPointer - ret - -; 2942e - -TradeAnim_ShowGivemonData: ; 2942e - call ShowPlayerTrademonStats - ld a, [wPlayerTrademonSpecies] - ld [wCurPartySpecies], a - ld a, [wPlayerTrademonDVs] - ld [wTempMonDVs], a - ld a, [wPlayerTrademonDVs + 1] - ld [wTempMonDVs + 1], a - ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - call TradeAnim_ShowGivemonFrontpic - - ld a, [wPlayerTrademonSpecies] - call GetCryIndex - jr c, .skip_cry - ld e, c - ld d, b - call PlayCry -.skip_cry - - call TradeAnim_AdvanceScriptPointer - ret - -; 29461 - -TradeAnim_ShowGetmonData: ; 29461 - call ShowOTTrademonStats - ld a, [wOTTrademonSpecies] - ld [wCurPartySpecies], a - ld a, [wOTTrademonDVs] - ld [wTempMonDVs], a - ld a, [wOTTrademonDVs + 1] - ld [wTempMonDVs + 1], a - ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - call TradeAnim_ShowGetmonFrontpic - call TradeAnim_AdvanceScriptPointer - ret - -; 29487 - -TradeAnim_AnimateFrontpic: ; 29487 - farcall AnimateTrademonFrontpic - call TradeAnim_AdvanceScriptPointer - ret - -; 29491 - -TradeAnim_GetFrontpic: ; 29491 - push de - push af - predef GetUnownLetter - pop af - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call GetBaseData - pop de - predef GetMonFrontpic - ret - -; 294a9 - -TradeAnim_GetNickname: ; 294a9 - push de - ld [wd265], a - call GetPokemonName - ld hl, wStringBuffer1 - pop de - ld bc, NAME_LENGTH - call CopyBytes - ret - -; 294bb - -TradeAnim_ShowGivemonFrontpic: ; 294bb - ld de, vTiles0 - jr TradeAnim_ShowFrontpic - -TradeAnim_ShowGetmonFrontpic: ; 294c0 - ld de, vTiles0 tile $31 -TradeAnim_ShowFrontpic: ; 294c3 - call DelayFrame - ld hl, vTiles2 - lb bc, 10, $31 - call Request2bpp - call WaitTop - call TradeAnim_BlankTileMap - hlcoord 7, 2 - xor a - ld [hGraphicStartTile], a - lb bc, 7, 7 - predef PlaceGraphic - call WaitBGMap - ret - -; 294e7 - -TraideAnim_Wait80: ; 294e7 - ld c, 80 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 294f0 - -TraideAnim_Wait40: ; 294f0 - ld c, 40 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 294f9 - -TraideAnim_Wait96: ; 294f9 - ld c, 96 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 29502 - -TraideAnim_Wait80IfOTEgg: ; 29502 - call IsOTTrademonEgg - ret nz - ld c, 80 - call DelayFrames - ret - -; 2950c - -TraideAnim_Wait180IfOTEgg: ; 2950c - call IsOTTrademonEgg - ret nz - ld c, 180 - call DelayFrames - ret - -; 29516 - -IsOTTrademonEgg: ; 29516 - call TradeAnim_AdvanceScriptPointer - ld a, [wOTTrademonSpecies] - cp EGG - ret - -; 2951f -ShowPlayerTrademonStats: ; 2951f - ld de, wPlayerTrademonSpecies - ld a, [de] - cp EGG - jr z, TrademonStats_Egg - call TrademonStats_MonTemplate - ld de, wPlayerTrademonSpecies - call TrademonStats_PrintSpeciesNumber - ld de, wPlayerTrademonSpeciesName - call TrademonStats_PrintSpeciesName - ld a, [wPlayerTrademonCaughtData] - ld de, wPlayerTrademonOTName - call TrademonStats_PrintOTName - ld de, wPlayerTrademonID - call TrademonStats_PrintTrademonID - call TrademonStats_WaitBGMap - ret - -; 29549 - -ShowOTTrademonStats: ; 29549 - ld de, wOTTrademonSpecies - ld a, [de] - cp EGG - jr z, TrademonStats_Egg - call TrademonStats_MonTemplate - ld de, wOTTrademonSpecies - call TrademonStats_PrintSpeciesNumber - ld de, wOTTrademonSpeciesName - call TrademonStats_PrintSpeciesName - ld a, [wOTTrademonCaughtData] - ld de, wOTTrademonOTName - call TrademonStats_PrintOTName - ld de, wOTTrademonID - call TrademonStats_PrintTrademonID - call TrademonStats_WaitBGMap - ret - -; 29573 - -TrademonStats_MonTemplate: ; 29573 - call WaitTop - call TradeAnim_BlankTileMap - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - hlcoord 3, 0 - ld b, $6 - ld c, $d - call TextBox - hlcoord 4, 0 - ld de, .OTMonData - call PlaceString - ret - -; 29591 - -.OTMonData: ; 29591 - db "─── №." - next "" - next "OT/" - next "№.@" -; 295a1 - -TrademonStats_Egg: ; 295a1 - call WaitTop - call TradeAnim_BlankTileMap - ld a, HIGH(vBGMap1) - ld [hBGMapAddress + 1], a - hlcoord 3, 0 - ld b, 6 - ld c, 13 - call TextBox - hlcoord 4, 2 - ld de, .EggData - call PlaceString - call TrademonStats_WaitBGMap - ret - -; 295c2 - -.EggData: ; 295c2 - db "EGG" - next "OT/?????" - next "№.?????@" -; 295d8 - -TrademonStats_WaitBGMap: ; 295d8 - call WaitBGMap - call WaitTop - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - ret - -; 295e3 - -TrademonStats_PrintSpeciesNumber: ; 295e3 - hlcoord 10, 0 - lb bc, PRINTNUM_LEADINGZEROS | 1, 3 - call PrintNum - ld [hl], " " - ret - -; 295ef - -TrademonStats_PrintSpeciesName: ; 295ef - hlcoord 4, 2 - call PlaceString - ret - -; 295f6 - -TrademonStats_PrintOTName: ; 295f6 - cp 3 - jr c, .caught_gender_okay - xor a -.caught_gender_okay - push af - hlcoord 7, 4 - call PlaceString - inc bc - pop af - ld hl, .Gender - ld d, 0 - ld e, a - add hl, de - ld a, [hl] - ld [bc], a - ret - -; 2960e - -.Gender: ; 2960e - db " ", "♂", "♀" -; 29611 - -TrademonStats_PrintTrademonID: ; 29611 - hlcoord 7, 6 - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - ret - -; 2961b - -TradeAnim_RockingBall: ; 2961b - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_TRADE_POKE_BALL - call _InitSpriteAnimStruct - call TradeAnim_AdvanceScriptPointer - ld a, 32 - ld [wFrameCounter], a - ret - -; 2962c - -TradeAnim_DropBall: ; 2962c - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_TRADE_POKE_BALL - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld [hl], $1 - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], $dc - call TradeAnim_AdvanceScriptPointer - ld a, 56 - ld [wFrameCounter], a - ret - -; 29649 - -TradeAnim_Poof: ; 29649 - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_TRADE_POOF - call _InitSpriteAnimStruct - call TradeAnim_AdvanceScriptPointer - ld a, 16 - ld [wFrameCounter], a - ld de, SFX_BALL_POOF - call PlaySFX - ret - -; 29660 - -TradeAnim_BulgeThroughTube: ; 29660 - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbObjPal0 - depixel 5, 11 - ld a, SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE - call _InitSpriteAnimStruct - call TradeAnim_AdvanceScriptPointer - ld a, 64 - ld [wFrameCounter], a - ret - -; 29676 - -TradeAnim_AnimateTrademonInTube: ; 29676 (a:5676) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 29686 - -.Jumptable: ; 29686 (a:5686) - dw .InitTimer - dw .WaitTimer1 - dw .MoveRight - dw .MoveDown - dw .MoveUp - dw .MoveLeft - dw .WaitTimer2 -; 2969a - -.JumptableNext: ; 29694 (a:5694) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ret - -.InitTimer: ; 2969a (a:569a) - call .JumptableNext - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $80 - ret - -.WaitTimer1: ; 296a4 (a:56a4) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - dec [hl] - and a - ret nz - call .JumptableNext - -.MoveRight: ; 296af (a:56af) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - cp $94 - jr nc, .done_move_right - inc [hl] - ret - -.done_move_right - call .JumptableNext - -.MoveDown: ; 296bd (a:56bd) - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, [hl] - cp $4c - jr nc, .done_move_down - inc [hl] - ret - -.done_move_down - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -.MoveUp: ; 296cf (a:56cf) - ld hl, SPRITEANIMSTRUCT_YCOORD - add hl, bc - ld a, [hl] - cp $2c - jr z, .done_move_up - dec [hl] - ret - -.done_move_up - call .JumptableNext - -.MoveLeft: ; 296dd (a:56dd) - ld hl, SPRITEANIMSTRUCT_XCOORD - add hl, bc - ld a, [hl] - cp $58 - jr z, .done_move_left - dec [hl] - ret - -.done_move_left - call .JumptableNext - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $80 - ret - -.WaitTimer2: ; 296f2 (a:56f2) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - dec [hl] - and a - ret nz - ld hl, SPRITEANIMSTRUCT_INDEX - add hl, bc - ld [hl], $0 - ret - -; 29701 (a:5701) - -TradeAnim_SentToOTText: ; 29701 - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jr z, .time_capsule - ld hl, .Text_MonName - call PrintText - ld c, 189 - call DelayFrames - ld hl, .Text_WasSentTo - call PrintText - call TradeAnim_Wait80Frames - ld c, 128 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -.time_capsule - ld hl, .Text_WasSentTo - call PrintText - call TradeAnim_Wait80Frames - call TradeAnim_AdvanceScriptPointer - ret - -; 29732 - -.Text_WasSentTo: ; 0x29732 - ; was sent to @ . - text_jump UnknownText_0x1bc6e9 - db "@" -; 0x29737 - -.Text_MonName: ; 0x29737 - ; - text_jump UnknownText_0x1bc701 - db "@" -; 0x2973c - -TradeAnim_OTBidsFarewell: ; 2973c - ld hl, .Text_BidsFarewellToMon - call PrintText - call TradeAnim_Wait80Frames - ld hl, .Text_MonName - call PrintText - call TradeAnim_Wait80Frames - call TradeAnim_AdvanceScriptPointer - ret - -; 29752 - -.Text_BidsFarewellToMon: ; 0x29752 - ; bids farewell to - text_jump UnknownText_0x1bc703 - db "@" -; 0x29757 - -.Text_MonName: ; 0x29757 - ; . - text_jump UnknownText_0x1bc719 - db "@" -; 0x2975c - -TradeAnim_TakeCareOfText: ; 2975c - call WaitTop - hlcoord 0, 10 - ld bc, 8 * SCREEN_WIDTH - ld a, " " - call ByteFill - call WaitBGMap - ld hl, .Text_TakeGoodCareOfMon - call PrintText - call TradeAnim_Wait80Frames - call TradeAnim_AdvanceScriptPointer - ret - -; 2977a - -.Text_TakeGoodCareOfMon: ; 0x2977a - ; Take good care of @ . - text_jump UnknownText_0x1bc71f - db "@" -; 0x2977f - -TradeAnim_OTSendsText1: ; 2977f - ld hl, .Text_ForYourMon - call PrintText - call TradeAnim_Wait80Frames - ld hl, .Text_OTSends - call PrintText - call TradeAnim_Wait80Frames - ld c, 14 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 2979a - -.Text_ForYourMon: ; 0x2979a - ; For @ 's @ , - text_jump UnknownText_0x1bc739 - db "@" -; 0x2979f - -.Text_OTSends: ; 0x2979f - ; sends @ . - text_jump UnknownText_0x1bc74c - db "@" -; 0x297a4 - -TradeAnim_OTSendsText2: ; 297a4 - ld hl, .Text_WillTrade - call PrintText - call TradeAnim_Wait80Frames - ld hl, .Text_ForYourMon - call PrintText - call TradeAnim_Wait80Frames - ld c, 14 - call DelayFrames - call TradeAnim_AdvanceScriptPointer - ret - -; 297bf - -.Text_WillTrade: ; 0x297bf - ; will trade @ @ - text_jump UnknownText_0x1bc75e - db "@" -; 0x297c4 - -.Text_ForYourMon: ; 0x297c4 - ; for @ 's @ . - text_jump UnknownText_0x1bc774 - db "@" -; 0x297c9 - -TradeAnim_Wait80Frames: ; 297c9 - ld c, 80 - call DelayFrames - ret - -; 297cf - -TradeAnim_BlankTileMap: ; 297cf - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, " " - call ByteFill - ret - -; 297db - -TradeAnim_CopyBoxFromDEtoHL: ; 297db -.row - push bc - push hl -.col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret - -; 297ed - -TradeAnim_NormalPals: ; 297ed - ld a, [hSGB] - and a - ld a, %11100100 ; 3,2,1,0 - jr z, .not_sgb - ld a, $f0 - -.not_sgb - call DmgToCgbObjPal0 - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - ret - -; 297ff - -LinkTradeAnim_LoadTradePlayerNames: ; 297ff - push de - ld de, wLinkPlayer1Name - ld bc, NAME_LENGTH - call CopyBytes - pop hl - ld de, wLinkPlayer2Name - ld bc, NAME_LENGTH - call CopyBytes - ret - -; 29814 - -LinkTradeAnim_LoadTradeMonSpecies: ; 29814 - ld a, [hl] - ld [wLinkTradeSendmonSpecies], a - ld a, [de] - ld [wLinkTradeGetmonSpecies], a - ret - -; 2981d - -TradeAnim_FlashBGPals: ; 2981d - ld a, [wcf65] - and $7 - ret nz - ld a, [rBGP] - xor %00111100 - call DmgToCgbBGPals - ret - -; 2982b - -LoadTradeBallAndCableGFX: ; 2982b - call DelayFrame - ld de, TradeBallGFX - ld hl, vTiles0 tile $62 - lb bc, BANK(TradeBallGFX), 6 - call Request2bpp - ld de, TradePoofGFX - ld hl, vTiles0 tile $68 - lb bc, BANK(TradePoofGFX), 12 - call Request2bpp - ld de, TradeCableGFX - ld hl, vTiles0 tile $74 - lb bc, BANK(TradeCableGFX), 4 - call Request2bpp - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], $62 - ret - -; 2985a - -LoadTradeBubbleGFX: ; 2985a - call DelayFrame - ld e, $3 - callfar LoadMenuMonIcon - ld de, TradeBubbleGFX - ld hl, vTiles0 tile $72 - lb bc, BANK(TradeBubbleGFX), 4 - call Request2bpp - xor a - ld hl, wSpriteAnimDict - ld [hli], a - ld [hl], $62 - ret - -; 29879 - -TradeAnim_WaitAnim: ; 29879 - ld hl, wFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - ret - -.done - call TradeAnim_AdvanceScriptPointer - ret - -; 29886 - -TradeAnim_WaitAnim2: ; 29886 - ld hl, wFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - ret - -.done - call TradeAnim_AdvanceScriptPointer - ret - -; 29893 - - -Unreferenced_DebugTrade: ; 29893 -; This function is not referenced. -; It was meant for use in Japanese versions, so the -; constant used for copy length was changed by accident. - - ld hl, .DebugTradeData - - ld a, [hli] - ld [wPlayerTrademonSpecies], a - ld de, wPlayerTrademonSenderName - ld c, NAME_LENGTH + 2 ; JP: NAME_LENGTH_JAPANESE + 2 -.loop1 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop1 - - ld a, [hli] - ld [wOTTrademonSpecies], a - ld de, wOTTrademonSenderName - ld c, NAME_LENGTH + 2 ; JP: NAME_LENGTH_JAPANESE + 2 -.loop2 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop2 - ret - -; 298b5 - -debugtrade: MACRO -; species, ot name, ot id (?) - db \1, \2 - dw \3 -ENDM - -.DebugTradeData: ; 298b5 - debugtrade VENUSAUR, "ゲーフり@@", $0123 ; GAME FREAK - debugtrade CHARIZARD, "クりーチャ@", $0456 ; Creatures Inc. -; 298c7 - - -TradeGameBoyTilemap: ; 298c7 -; 6x8 - db $31, $32, $32, $32, $32, $33 - db $34, $35, $36, $36, $37, $38 - db $34, $39, $3a, $3a, $3b, $38 - db $3c, $3d, $3e, $3e, $3f, $40 - db $41, $42, $43, $43, $44, $45 - db $46, $47, $43, $48, $49, $4a - db $41, $43, $4b, $4c, $4d, $4e - db $4f, $50, $50, $50, $51, $52 -; 297f7 - -TradeLinkTubeTilemap: ; 297f7 -; 12x3 - db $43, $55, $56, $53, $53, $53, $53, $53, $53, $53, $53, $53 - db $43, $57, $58, $54, $54, $54, $54, $54, $54, $54, $54, $54 - db $43, $59, $5a, $43, $43, $43, $43, $43, $43, $43, $43, $43 -; 2991b - -TradeArrowGFX: INCBIN "gfx/trade/arrow.2bpp" -TradeCableGFX: INCBIN "gfx/trade/cable.2bpp" -TradeBubbleGFX: INCBIN "gfx/trade/bubble.2bpp" -TradeGameBoyLZ: INCBIN "gfx/trade/game_boy.2bpp.lz" -TradeBallGFX: INCBIN "gfx/trade/ball.2bpp" -TradePoofGFX: INCBIN "gfx/trade/poof.2bpp" diff --git a/engine/items/tmhm.asm b/engine/items/tmhm.asm index 9db3dc291..442f73cfa 100755 --- a/engine/items/tmhm.asm +++ b/engine/items/tmhm.asm @@ -1,49 +1,589 @@ -CanLearnTMHMMove: ; 11639 +TMHMPocket: ; 2c76f (b:476f) + ld a, $1 + ld [hInMenu], a + call TMHM_PocketLoop + ld a, $0 + ld [hInMenu], a + ret nc + call PlaceHollowCursor + call WaitBGMap + ld a, [wCurItem] + dec a + ld [wCurItemQuantity], a + ld hl, wTMsHMs + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + ld [wItemQuantityBuffer], a + call .ConvertItemToTMHMNumber + scf + ret + +.ConvertItemToTMHMNumber: ; 2c798 (b:4798) + ld a, [wCurItem] + ld c, a + callfar GetNumberedTMHM + ld a, c + ld [wCurItem], a + ret + +ConvertCurItemIntoCurTMHM: ; 2c7a7 (b:47a7) + ld a, [wCurItem] + ld c, a + callfar GetTMHMNumber + ld a, c + ld [wCurTMHM], a + ret + +GetTMHMItemMove: ; 2c7b6 (b:47b6) + call ConvertCurItemIntoCurTMHM + predef GetTMHMMove + ret + +AskTeachTMHM: ; 2c7bf (b:47bf) + ld hl, wOptions + ld a, [hl] + push af + res NO_TEXT_SCROLL, [hl] + ld a, [wCurItem] + cp TM01 + jr c, .NotTMHM + call GetTMHMItemMove + ld a, [wCurTMHM] + ld [wPutativeTMHMMove], a + call GetMoveName + call CopyName1 + ld hl, Text_BootedTM ; Booted up a TM + ld a, [wCurItem] + cp HM01 + jr c, .TM + ld hl, Text_BootedHM ; Booted up an HM +.TM: + call PrintText + ld hl, Text_ItContained + call PrintText + call YesNoBox +.NotTMHM: + pop bc + ld a, b + ld [wOptions], a + ret + +ChooseMonToLearnTMHM: ; 2c7fb + ld hl, wStringBuffer2 + ld de, wTMHMMoveNameBackup + ld bc, 12 + call CopyBytes + call ClearBGPalettes +ChooseMonToLearnTMHM_NoRefresh: ; 2c80a + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + ld a, PARTYMENUACTION_TEACH_TMHM + ld [wPartyMenuActionText], a +.loopback + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + push af ld a, [wCurPartySpecies] - ld [wCurSpecies], a - call GetBaseData - ld hl, wBaseTMHM + cp EGG + pop bc ; now contains the former contents of af + jr z, .egg + push bc + ld hl, wTMHMMoveNameBackup + ld de, wStringBuffer2 + ld bc, 12 + call CopyBytes + pop af ; now contains the original contents of af + ret + +.egg push hl + push de + push bc + push af + ld de, SFX_WRONG + call PlaySFX + call WaitSFX + pop af + pop bc + pop de + pop hl + jr .loopback +; 2c867 + +TeachTMHM: ; 2c867 + predef CanLearnTMHMMove + + push bc + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + pop bc + + ld a, c + and a + jr nz, .compatible + push de + ld de, SFX_WRONG + call PlaySFX + pop de + ld hl, Text_TMHMNotCompatible + call PrintText + jr .nope + +.compatible + callfar KnowsMove + jr c, .nope + + predef LearnMove + ld a, b + and a + jr z, .nope + + farcall StubbedTrainerRankings_TMsHMsTaught + ld a, [wCurItem] + call IsHM + ret c + + ld c, HAPPINESS_LEARNMOVE + callfar ChangeHappiness + call ConsumeTM + jr .learned_move + +.nope + and a + ret - ld a, [wPutativeTMHMMove] +.unused + ld a, 2 + ld [wItemEffectSucceeded], a +.learned_move + scf + ret +; 2c8bf (b:48bf) + +Text_BootedTM: ; 0x2c8bf + ; Booted up a TM. + text_jump UnknownText_0x1c0373 + db "@" +; 0x2c8c4 + +Text_BootedHM: ; 0x2c8c4 + ; Booted up an HM. + text_jump UnknownText_0x1c0384 + db "@" +; 0x2c8c9 + +Text_ItContained: ; 0x2c8c9 + ; It contained @ . Teach @ to a #MON? + text_jump UnknownText_0x1c0396 + db "@" +; 0x2c8ce + +Text_TMHMNotCompatible: ; 0x2c8ce + ; is not compatible with @ . It can't learn @ . + text_jump UnknownText_0x1c03c2 + db "@" +; 0x2c8d3 + +TMHM_PocketLoop: ; 2c8d3 (b:48d3) + xor a + ld [hBGMapMode], a + call TMHM_DisplayPocketItems + ld a, 2 + ld [w2DMenuCursorInitY], a + ld a, 7 + ld [w2DMenuCursorInitX], a + ld a, 1 + ld [w2DMenuNumCols], a + ld a, 5 + sub d + inc a + cp 6 + jr nz, .okay + dec a +.okay + ld [w2DMenuNumRows], a + ld a, $c + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuCursorOffsets], a + ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN | D_LEFT | D_RIGHT + ld [wMenuJoypadFilter], a + ld a, [wTMHMPocketCursor] + inc a + ld [wMenuCursorY], a + ld a, $1 + ld [wMenuCursorX], a + jr TMHM_ShowTMMoveDescription + +TMHM_JoypadLoop: ; 2c915 (b:4915) + call TMHM_DisplayPocketItems + call StaticMenuJoypad + ld b, a + ld a, [wMenuCursorY] + dec a + ld [wTMHMPocketCursor], a + xor a + ld [hBGMapMode], a + ld a, [w2DMenuFlags2] + bit 7, a + jp nz, TMHM_ScrollPocket + ld a, b + ld [wMenuJoypad], a + bit A_BUTTON_F, a + jp nz, TMHM_ChooseTMorHM + bit B_BUTTON_F, a + jp nz, TMHM_ExitPack + bit D_RIGHT_F, a + jp nz, TMHM_ExitPocket + bit D_LEFT_F, a + jp nz, TMHM_ExitPocket +TMHM_ShowTMMoveDescription: ; 2c946 (b:4946) + call TMHM_CheckHoveringOverCancel + jp nc, TMHM_ExitPocket + hlcoord 0, 12 + ld b, 4 + ld c, SCREEN_WIDTH - 2 + call TextBox + ld a, [wCurItem] + cp NUM_TMS + NUM_HMS + 1 + jr nc, TMHM_JoypadLoop + ld [wd265], a + predef GetTMHMMove + ld a, [wd265] + ld [wCurSpecies], a + hlcoord 1, 14 + call PrintMoveDesc + jp TMHM_JoypadLoop + +TMHM_ChooseTMorHM: ; 2c974 (b:4974) + call TMHM_PlaySFX_ReadText2 + call CountTMsHMs ; This stores the count to wd265. + ld a, [wMenuCursorY] + dec a + ld b, a + ld a, [wTMHMPocketScrollPosition] + add b + ld b, a + ld a, [wd265] + cp b + jr z, _TMHM_ExitPack ; our cursor was hovering over CANCEL +TMHM_CheckHoveringOverCancel: ; 2c98a (b:498a) + call TMHM_GetCurrentPocketPosition + ld a, [wMenuCursorY] ld b, a - ld c, 0 - ld hl, TMHMMoves .loop + inc c + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jr nc, .okay ld a, [hli] and a - jr z, .end - cp b - jr z, .asm_11659 + jr z, .loop + dec b + jr nz, .loop + ld a, c +.okay + ld [wCurItem], a + cp -1 + ret + +TMHM_ExitPack: ; 2c9a5 (b:49a5) + call TMHM_PlaySFX_ReadText2 +_TMHM_ExitPack: ; 2c9a8 (b:49a8) + ld a, $2 + ld [wMenuJoypad], a + and a + ret + +TMHM_ExitPocket: ; 2c9af (b:49af) + and a + ret + +TMHM_ScrollPocket: ; 2c9b1 (b:49b1) + ld a, b + bit 7, a + jr nz, .skip + ld hl, wTMHMPocketScrollPosition + ld a, [hl] + and a + jp z, TMHM_JoypadLoop + dec [hl] + call TMHM_DisplayPocketItems + jp TMHM_ShowTMMoveDescription + +.skip + call TMHM_GetCurrentPocketPosition + ld b, 5 +.loop + inc c + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jp nc, TMHM_JoypadLoop + ld a, [hli] + and a + jr z, .loop + dec b + jr nz, .loop + ld hl, wTMHMPocketScrollPosition + inc [hl] + call TMHM_DisplayPocketItems + jp TMHM_ShowTMMoveDescription + +TMHM_DisplayPocketItems: ; 2c9e2 (b:49e2) + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jp z, Tutorial_TMHMPocket + + hlcoord 5, 2 + lb bc, 10, 15 + ld a, " " + call ClearBox + call TMHM_GetCurrentPocketPosition + ld d, $5 +.loop2 inc c - jr .loop + ld a, c + cp NUM_TMS + NUM_HMS + 1 + jr nc, .NotTMHM + ld a, [hli] + and a + jr z, .loop2 + ld b, a + ld a, c + ld [wd265], a + push hl + push de + push bc + call TMHMPocket_GetCurrentLineCoord + push hl + ld a, [wd265] + cp NUM_TMS + 1 + jr nc, .HM + ld de, wd265 + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + jr .okay -.asm_11659 +.HM: + push af + sub NUM_TMS + ld [wd265], a + ld [hl], "H" + inc hl + ld de, wd265 + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + pop af + ld [wd265], a +.okay + predef GetTMHMMove + ld a, [wd265] + ld [wPutativeTMHMMove], a + call GetMoveName + pop hl + ld bc, 3 + add hl, bc + push hl + call PlaceString + pop hl + pop bc + ld a, c + push bc + cp NUM_TMS + 1 + jr nc, .hm2 + ld bc, SCREEN_WIDTH + 9 + add hl, bc + ld [hl], "×" + inc hl + ld a, "0" ; why are we doing this? + pop bc + push bc + ld a, b + ld [wd265], a + ld de, wd265 + lb bc, 1, 2 + call PrintNum +.hm2 + pop bc + pop de pop hl - ld b, CHECK_FLAG + dec d + jr nz, .loop2 + jr .done + +.NotTMHM: + call TMHMPocket_GetCurrentLineCoord + inc hl + inc hl + inc hl push de - ld d, 0 - predef SmallFarFlagAction + ld de, TMHM_String_Cancel + call PlaceString pop de +.done + ret + +TMHMPocket_GetCurrentLineCoord: ; 2ca86 (b:4a86) + hlcoord 5, 0 + ld bc, 2 * SCREEN_WIDTH + ld a, 6 + sub d + ld e, a + ; AddNTimes +.loop + add hl, bc + dec e + jr nz, .loop ret +; 2ca95 (b:4a95) -.end +Unreferenced_Function2ca95: ; 2ca95 + pop hl + ld bc, 3 + add hl, bc + predef GetTMHMMove + ld a, [wd265] + ld [wPutativeTMHMMove], a + call GetMoveName + push hl + call PlaceString pop hl + ret +; 2caae + +TMHM_String_Cancel: ; 2caae + db "CANCEL@" +; 2cab5 + +TMHM_GetCurrentPocketPosition: ; 2cab5 (b:4ab5) + ld hl, wTMsHMs + ld a, [wTMHMPocketScrollPosition] + ld b, a + inc b ld c, 0 +.loop + inc c + ld a, [hli] + and a + jr z, .loop + dec b + jr nz, .loop + dec hl + dec c ret -; 1166a -GetTMHMMove: ; 1166a +Tutorial_TMHMPocket: ; 2caca (b:4aca) + hlcoord 9, 3 + push de + ld de, TMHM_String_Cancel + call PlaceString + pop de + ret + +TMHM_PlaySFX_ReadText2: ; 2cad6 (b:4ad6) + push de + ld de, SFX_READ_TEXT_2 + call PlaySFX + pop de + ret +; 2cadf (b:4adf) + +Unreferenced_Function2cadf: ; 2cadf + call ConvertCurItemIntoCurTMHM + call .CheckHaveRoomForTMHM + ld hl, .NoRoomText + jr nc, .print + ld hl, .ReceivedText +.print + jp PrintText +; 2caf0 + +.NoRoomText: ; 0x2caf0 + ; You have no room for any more @ S. + text_jump UnknownText_0x1c03fa + db "@" +; 0x2caf5 + +.ReceivedText: ; 0x2caf5 + ; You received @ ! + text_jump UnknownText_0x1c0421 + db "@" +; 0x2cafa + +.CheckHaveRoomForTMHM: ; 2cafa ld a, [wd265] dec a - ld hl, TMHMMoves + ld hl, wTMsHMs ld b, 0 ld c, a add hl, bc ld a, [hl] - ld [wd265], a + inc a + cp NUM_TMS * 2 + ret nc + ld [hl], a ret -; 1167a +; 2cb0c +ConsumeTM: ; 2cb0c (b:4b0c) + call ConvertCurItemIntoCurTMHM + ld a, [wd265] + dec a + ld hl, wTMsHMs + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + and a + ret z + dec a + ld [hl], a + ret nz + ld a, [wTMHMPocketScrollPosition] + and a + ret z + dec a + ld [wTMHMPocketScrollPosition], a + ret + +CountTMsHMs: ; 2cb2a (b:4b2a) + ld b, 0 + ld c, NUM_TMS + NUM_HMS + ld hl, wTMsHMs +.loop + ld a, [hli] + and a + jr z, .skip + inc b +.skip + dec c + jr nz, .loop + ld a, b + ld [wd265], a + ret -INCLUDE "data/moves/tmhm_moves.asm" +PrintMoveDesc: ; 2cb3e + push hl + ld hl, MoveDescriptions + ld a, [wCurSpecies] + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, [hli] + ld e, a + ld d, [hl] + pop hl + jp PlaceString +; 2cb52 diff --git a/engine/items/tmhm2.asm b/engine/items/tmhm2.asm new file mode 100755 index 000000000..9db3dc291 --- /dev/null +++ b/engine/items/tmhm2.asm @@ -0,0 +1,49 @@ +CanLearnTMHMMove: ; 11639 + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + call GetBaseData + ld hl, wBaseTMHM + push hl + + ld a, [wPutativeTMHMMove] + ld b, a + ld c, 0 + ld hl, TMHMMoves +.loop + ld a, [hli] + and a + jr z, .end + cp b + jr z, .asm_11659 + inc c + jr .loop + +.asm_11659 + pop hl + ld b, CHECK_FLAG + push de + ld d, 0 + predef SmallFarFlagAction + pop de + ret + +.end + pop hl + ld c, 0 + ret +; 1166a + +GetTMHMMove: ; 1166a + ld a, [wd265] + dec a + ld hl, TMHMMoves + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wd265], a + ret +; 1167a + + +INCLUDE "data/moves/tmhm_moves.asm" diff --git a/engine/link/link.asm b/engine/link/link.asm index 86af41c01..f6f37619f 100755 --- a/engine/link/link.asm +++ b/engine/link/link.asm @@ -2029,7 +2029,7 @@ Unreferenced_Function28f09: ; 28f09 ret ; 28f24 -INCLUDE "engine/gfx/trade_animation.asm" +INCLUDE "engine/movie/trade_animation.asm" CheckTimeCapsuleCompatibility: ; 29bfb ; Checks to see if your party is compatible with the Gen 1 games. diff --git a/engine/link/placewaitingtext.asm b/engine/link/placewaitingtext.asm new file mode 100644 index 000000000..9b2260722 --- /dev/null +++ b/engine/link/placewaitingtext.asm @@ -0,0 +1,24 @@ +PlaceWaitingText:: ; 4000 + hlcoord 3, 10 + ld b, 1 + ld c, 11 + + ld a, [wBattleMode] + and a + jr z, .notinbattle + + call TextBox + jr .proceed + +.notinbattle + predef LinkTextboxAtHL + +.proceed + hlcoord 4, 11 + ld de, .Waiting + call PlaceString + ld c, 50 + jp DelayFrames + +.Waiting: ; 4025 + db "Waiting...!@" diff --git a/engine/menus/debug.asm b/engine/menus/debug.asm new file mode 100755 index 000000000..4c3110fe1 --- /dev/null +++ b/engine/menus/debug.asm @@ -0,0 +1,1447 @@ + const_def $6a + const DEBUGTEST_UP_ARROW ; $6a + const DEBUGTEST_TICKS ; $6b + const DEBUGTEST_WHITE ; $6c + const DEBUGTEST_LIGHT ; $6d + const DEBUGTEST_DARK ; $6e + const DEBUGTEST_BLACK ; $6f + const DEBUGTEST_0 ; $70 + const DEBUGTEST_1 ; $71 + const DEBUGTEST_2 ; $72 + const DEBUGTEST_3 ; $73 + const DEBUGTEST_4 ; $74 + const DEBUGTEST_5 ; $75 + const DEBUGTEST_6 ; $76 + const DEBUGTEST_7 ; $77 + const DEBUGTEST_8 ; $78 + const DEBUGTEST_9 ; $79 + const DEBUGTEST_A ; $7a + const DEBUGTEST_B ; $7b + const DEBUGTEST_C ; $7c + const DEBUGTEST_D ; $7d + const DEBUGTEST_E ; $7e + const DEBUGTEST_F ; $7f + +ColorTest: ; 818ac +; A debug menu to test monster and trainer palettes at runtime. + + ld a, [hCGB] + and a + jr nz, .asm_818b5 + ld a, [hSGB] + and a + ret z + +.asm_818b5 + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + call DisableLCD + call Function81948 + call Function8197c + call Function819a7 + call Function818f4 + call EnableLCD + ld de, MUSIC_NONE + call PlayMusic + xor a + ld [wJumptableIndex], a + ld [wcf66], a + ld [wd003], a +.asm_818de + ld a, [wJumptableIndex] + bit 7, a + jr nz, .asm_818f0 + call Function81a74 + call Function81f5e + call DelayFrame + jr .asm_818de + +.asm_818f0 + pop af + ld [hInMenu], a + ret +; 818f4 + +Function818f4: ; 818f4 + ld a, [wd002] + and a + jr nz, Function81911 + ld hl, PokemonPalettes + +Function818fd: ; 818fd + ld de, wOverworldMap + ld c, NUM_POKEMON + 1 +.asm_81902 + push bc + push hl + call Function81928 + pop hl + ld bc, 8 + add hl, bc + pop bc + dec c + jr nz, .asm_81902 + ret + +Function81911: ; 81911 + ld hl, TrainerPalettes + ld de, wOverworldMap + ld c, NUM_TRAINER_CLASSES +.asm_81919 + push bc + push hl + call Function81928 + pop hl + ld bc, 4 + add hl, bc + pop bc + dec c + jr nz, .asm_81919 + ret +; 81928 + +Function81928: ; 81928 + ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) + call GetFarByte + ld [de], a + inc de + inc hl + ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) + call GetFarByte + ld [de], a + inc de + inc hl + ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) + call GetFarByte + ld [de], a + inc de + inc hl + ld a, BANK(PokemonPalettes) ; BANK(TrainerPalettes) + call GetFarByte + ld [de], a + inc de + ret +; 81948 + +Function81948: ; 81948 + ld a, $1 + ld [rVBK], a + ld hl, vTiles0 + ld bc, sScratch - vTiles0 + xor a + call ByteFill + ld a, $0 + ld [rVBK], a + ld hl, vTiles0 + ld bc, sScratch - vTiles0 + xor a + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + call ClearSprites + ret +; 8197c + +Function8197c: ; 8197c + ld hl, DebugColorTestGFX + 1 tiles + ld de, vTiles2 tile DEBUGTEST_UP_ARROW + ld bc, 22 tiles + call CopyBytes + ld hl, DebugColorTestGFX + ld de, vTiles0 + ld bc, 1 tiles + call CopyBytes + call LoadStandardFont + ld hl, vTiles1 + lb bc, 8, 0 +.asm_8199d + ld a, [hl] + xor $ff + ld [hli], a + dec bc + ld a, c + or b + jr nz, .asm_8199d + ret +; 819a7 + +Function819a7: ; 819a7 + ld a, [hCGB] + and a + ret z + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld hl, Palette_DebugBG + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + ld a, 1 << rBGPI_AUTO_INCREMENT + ld [rBGPI], a + ld hl, Palette_DebugBG + ld c, 8 palettes + xor a +.asm_819c8 + ld [rBGPD], a + dec c + jr nz, .asm_819c8 + ld a, 1 << rOBPI_AUTO_INCREMENT + ld [rOBPI], a + ld hl, Palette_DebugOB + ld c, 8 palettes +.asm_819d6 + ld a, [hli] + ld [rOBPD], a + dec c + jr nz, .asm_819d6 + ld a, $94 + ld [wc608], a + ld a, $52 + ld [wc608 + 1], a + ld a, $4a + ld [wc608 + 2], a + ld a, $29 + ld [wc608 + 3], a + pop af + ld [rSVBK], a + ret +; 819f4 + +Palette_DebugBG: ; 819f4 +INCLUDE "gfx/debug/bg.pal" + +Palette_DebugOB: ; 81a34 +INCLUDE "gfx/debug/ob.pal" +; 81a74 + +Function81a74: ; 81a74 + call JoyTextDelay + ld a, [wJumptableIndex] + cp $4 + jr nc, .asm_81a8b + ld hl, hJoyLast + ld a, [hl] + and SELECT + jr nz, .asm_81a9a + ld a, [hl] + and START + jr nz, .asm_81aab + +.asm_81a8b + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, Jumptable_81acf + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.asm_81a9a + call Function81eca + call Function81ac3 + ld e, a + ld a, [wcf66] + inc a + cp e + jr c, .asm_81aba + xor a + jr .asm_81aba + +.asm_81aab + call Function81eca + ld a, [wcf66] + dec a + cp $ff + jr nz, .asm_81aba + call Function81ac3 + dec a + +.asm_81aba + ld [wcf66], a + ld a, $0 + ld [wJumptableIndex], a + ret +; 81ac3 + +Function81ac3: ; 81ac3 +; Looping back around the pic set. + ld a, [wd002] + and a + jr nz, .asm_81acc + ld a, NUM_POKEMON ; CELEBI + ret + +.asm_81acc + ld a, NUM_TRAINER_CLASSES - 1 ; MYSTICALMAN + ret +; 81acf + +Jumptable_81acf: ; 81acf + dw Function81adb + dw Function81c18 + dw Function81c33 + dw Function81cc2 + dw Function81d8e + dw Function81daf +; 81adb + +Function81adb: ; 81adb + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, DEBUGTEST_BLACK + call ByteFill + hlcoord 1, 3 + lb bc, 7, 18 + ld a, DEBUGTEST_WHITE + call Bank20_FillBoxWithByte + hlcoord 11, 0 + lb bc, 2, 3 + ld a, DEBUGTEST_LIGHT + call Bank20_FillBoxWithByte + hlcoord 16, 0 + lb bc, 2, 3 + ld a, DEBUGTEST_DARK + call Bank20_FillBoxWithByte + call Function81bc0 + call Function81bf4 + ld a, [wcf66] + inc a + ld [wCurPartySpecies], a + ld [wd265], a + hlcoord 0, 1 + ld de, wd265 + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + call PrintNum + ld a, [wd002] + and a + jr nz, .asm_81b7a + ld a, $1 + ld [wUnownLetter], a + call GetPokemonName + hlcoord 4, 1 + call PlaceString + xor a + ld [wBoxAlignment], a + hlcoord 12, 3 + call _PrepMonFrontpic + ld de, vTiles2 tile $31 + predef GetMonBackpic + ld a, $31 + ld [hGraphicStartTile], a + hlcoord 2, 4 + lb bc, 6, 6 + predef PlaceGraphic + ld a, [wd003] + and a + jr z, .asm_81b66 + ld de, String_81baf + jr .asm_81b69 + +.asm_81b66 + ld de, String_81bb4 + +.asm_81b69 + hlcoord 7, 17 + call PlaceString + hlcoord 0, 17 + ld de, String_81bb9 + call PlaceString + jr .asm_81ba9 + +.asm_81b7a + ld a, [wd265] + ld [wTrainerClass], a + callfar GetTrainerAttributes + ld de, wStringBuffer1 + hlcoord 4, 1 + call PlaceString + ld de, vTiles2 + callfar GetTrainerPic + xor a + ld [wTempEnemyMonSpecies], a + ld [hGraphicStartTile], a + hlcoord 2, 3 + lb bc, 7, 7 + predef PlaceGraphic + +.asm_81ba9 + ld a, $1 + ld [wJumptableIndex], a + ret +; 81baf + +String_81baf: db "レア", DEBUGTEST_BLACK, DEBUGTEST_BLACK, "@" ; rare (shiny) +String_81bb4: db "ノーマル@" ; normal +String_81bb9: db DEBUGTEST_A, "きりかえ▶@" ; (A) switches +; 81bc0 + +Function81bc0: ; 81bc0 + decoord 0, 11, wAttrMap + hlcoord 2, 11 + ld a, $1 + call Function81bde + decoord 0, 13, wAttrMap + hlcoord 2, 13 + ld a, $2 + call Function81bde + decoord 0, 15, wAttrMap + hlcoord 2, 15 + ld a, $3 + +Function81bde: ; 81bde + push af + ld a, DEBUGTEST_UP_ARROW + ld [hli], a + ld bc, $f + ld a, DEBUGTEST_TICKS + call ByteFill + ld l, e + ld h, d + pop af + ld bc, $28 + call ByteFill + ret +; 81bf4 + +Function81bf4: ; 81bf4 + ld a, [wcf66] + inc a + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld de, wOverworldMap + add hl, de + ld de, wc608 + ld bc, 4 + call CopyBytes + xor a + ld [wcf64], a + ld [wcf65], a + ld de, wc608 + call Function81ea5 + ret +; 81c18 + +Function81c18: ; 81c18 + ld a, [hCGB] + and a + jr z, .asm_81c2a + ld a, $2 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + +.asm_81c2a + call WaitBGMap + ld a, $2 + ld [wJumptableIndex], a + ret +; 81c33 + +Function81c33: ; 81c33 + ld a, [hCGB] + and a + jr z, .asm_81c69 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld hl, wBGPals2 + ld de, wc608 + ld c, $1 + call Function81ee3 + hlcoord 10, 2 + ld de, wc608 + call Function81ca7 + hlcoord 15, 2 + ld de, wc608 + 2 + call Function81ca7 + ld a, $1 + ld [hCGBPalUpdate], a + ld a, $3 + ld [wJumptableIndex], a + pop af + ld [rSVBK], a + ret + +.asm_81c69 + ld hl, wSGBPals + ld a, 1 + ld [hli], a + ld a, LOW(PALRGB_WHITE) + ld [hli], a + ld a, HIGH(PALRGB_WHITE) + ld [hli], a + ld a, [wc608] + ld [hli], a + ld a, [wc608 + 1] + ld [hli], a + ld a, [wc608 + 2] + ld [hli], a + ld a, [wc608 + 3] + ld [hli], a + xor a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, wSGBPals + call Function81f0c + hlcoord 10, 2 + ld de, wc608 + call Function81ca7 + hlcoord 15, 2 + ld de, wc608 + 2 + call Function81ca7 + ld a, $3 + ld [wJumptableIndex], a + ret +; 81ca7 + +Function81ca7: ; 81ca7 + inc hl + inc hl + inc hl + ld a, [de] + call Function81cbc + ld a, [de] + swap a + call Function81cbc + inc de + ld a, [de] + call Function81cbc + ld a, [de] + swap a + +Function81cbc: ; 81cbc + and $f + add DEBUGTEST_0 + ld [hld], a + ret +; 81cc2 + +Function81cc2: ; 81cc2 + ld a, [hJoyLast] + and B_BUTTON + jr nz, .asm_81cdf + ld a, [hJoyLast] + and A_BUTTON + jr nz, .asm_81ce5 + ld a, [wcf64] + and $3 + ld e, a + ld d, 0 + ld hl, Jumptable_81d02 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.asm_81cdf + ld a, $4 + ld [wJumptableIndex], a + ret + +.asm_81ce5 + ld a, [wd002] + and a + ret nz + ld a, [wd003] + xor $4 + ld [wd003], a + ld c, a + ld b, 0 + ld hl, PokemonPalettes + add hl, bc + call Function818fd + ld a, $0 + ld [wJumptableIndex], a + ret +; 81d02 + +Jumptable_81d02: ; 81d02 + dw Function81d0a + dw Function81d34 + dw Function81d46 + dw Function81d58 +; 81d0a + +Function81d0a: ; 81d0a + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function81d89 + ld a, [hl] + and D_LEFT + jr nz, .asm_81d1d + ld a, [hl] + and D_RIGHT + jr nz, .asm_81d28 + ret + +.asm_81d1d + xor a + ld [wcf65], a + ld de, wc608 + call Function81ea5 + ret + +.asm_81d28 + ld a, $1 + ld [wcf65], a + ld de, wc608 + 2 + call Function81ea5 + ret + +Function81d34: ; 81d34 + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function81d89 + ld a, [hl] + and D_UP + jr nz, Function81d84 + ld hl, wc608 + 10 + jr Function81d63 + +Function81d46: ; 81d46 + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function81d89 + ld a, [hl] + and D_UP + jr nz, Function81d84 + ld hl, wc608 + 11 + jr Function81d63 + +Function81d58: ; 81d58 + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, Function81d84 + ld hl, wc608 + 12 + +Function81d63: ; 81d63 + ld a, [hJoyLast] + and D_RIGHT + jr nz, Function81d70 + ld a, [hJoyLast] + and D_LEFT + jr nz, Function81d77 + ret + +Function81d70: ; 81d70 + ld a, [hl] + cp $1f + ret nc + inc [hl] + jr Function81d7b + +Function81d77: ; 81d77 + ld a, [hl] + and a + ret z + dec [hl] + +Function81d7b: ; 81d7b + call Function81e67 + ld a, $2 + ld [wJumptableIndex], a + ret + +Function81d84: ; 81d84 + ld hl, wcf64 + dec [hl] + ret + +Function81d89: ; 81d89 + ld hl, wcf64 + inc [hl] + ret +; 81d8e + +Function81d8e: ; 81d8e + hlcoord 0, 10 + ld bc, $a0 + ld a, DEBUGTEST_BLACK + call ByteFill + hlcoord 2, 12 + ld de, String_81fcd + call PlaceString + xor a + ld [wd004], a + call Function81df4 + ld a, $5 + ld [wJumptableIndex], a + ret +; 81daf + +Function81daf: ; 81daf + ld hl, hJoyPressed + ld a, [hl] + and B_BUTTON + jr nz, .asm_81dbb + call Function81dc7 + ret + +.asm_81dbb + ld a, $0 + ld [wJumptableIndex], a + ret +; 81dc1 + +Function81dc1: ; 81dc1 + ld hl, wJumptableIndex + set 7, [hl] + ret +; 81dc7 + +Function81dc7: ; 81dc7 + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .asm_81dd5 + ld a, [hl] + and D_DOWN + jr nz, .asm_81de2 + ret + +.asm_81dd5 + ld a, [wd004] + cp $3b + jr z, .asm_81ddf + inc a + jr .asm_81ded + +.asm_81ddf + xor a + jr .asm_81ded + +.asm_81de2 + ld a, [wd004] + and a + jr z, .asm_81deb + dec a + jr .asm_81ded + +.asm_81deb + ld a, $3b + +.asm_81ded + ld [wd004], a + call Function81df4 + ret +; 81df4 + +Function81df4: ; 81df4 + hlcoord 10, 11 + call Function81e5e + hlcoord 10, 12 + call Function81e5e + hlcoord 10, 13 + call Function81e5e + hlcoord 10, 14 + call Function81e5e + ld a, [wd004] + inc a + ld [wd265], a + predef GetTMHMMove + ld a, [wd265] + ld [wPutativeTMHMMove], a + call GetMoveName + hlcoord 10, 12 + call PlaceString + ld a, [wd004] + call Function81e55 + ld [wCurItem], a + predef CanLearnTMHMMove + ld a, c + and a + ld de, String_81e46 + jr nz, .asm_81e3f + ld de, String_81e4d + +.asm_81e3f + hlcoord 10, 14 + call PlaceString + ret +; 81e46 + +String_81e46: db "おぼえられる@" ; can be taught +String_81e4d: db "おぼえられない@" ; cannot be taught +; 81e55 + +Function81e55: ; 81e55 + cp $32 + jr c, .asm_81e5b + inc a + inc a + +.asm_81e5b + add $bf + ret +; 81e5e + +Function81e5e: ; 81e5e + ld bc, 10 + ld a, DEBUGTEST_BLACK + call ByteFill + ret +; 81e67 + +Function81e67: ; 81e67 + ld a, [wc608 + 10] + and $1f + ld e, a + ld a, [wc608 + 11] + and $7 + sla a + swap a + or e + ld e, a + ld a, [wc608 + 11] + and $18 + sla a + swap a + ld d, a + ld a, [wc608 + 12] + and $1f + sla a + sla a + or d + ld d, a + ld a, [wcf65] + and a + jr z, .asm_81e9c + ld a, e + ld [wc608 + 2], a + ld a, d + ld [wc608 + 3], a + ret + +.asm_81e9c + ld a, e + ld [wc608], a + ld a, d + ld [wc608 + 1], a + ret +; 81ea5 + +Function81ea5: ; 81ea5 + ld a, [de] + and $1f + ld [wc608 + 10], a + ld a, [de] + and $e0 + swap a + srl a + ld b, a + inc de + ld a, [de] + and $3 + swap a + srl a + or b + ld [wc608 + 11], a + ld a, [de] + and $7c + srl a + srl a + ld [wc608 + 12], a + ret +; 81eca + +Function81eca: ; 81eca + ld a, [wcf66] + inc a + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld de, wOverworldMap + add hl, de + ld e, l + ld d, h + ld hl, wc608 + ld bc, 4 + call CopyBytes + ret +; 81ee3 + +Function81ee3: ; 81ee3 +.asm_81ee3 + ld a, LOW(PALRGB_WHITE) + ld [hli], a + ld a, HIGH(PALRGB_WHITE) + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + xor a + ld [hli], a + ld [hli], a + dec c + jr nz, .asm_81ee3 + ret +; 81efc + +Bank20_FillBoxWithByte: ; 81efc +; For some reason, we have another copy of FillBoxWithByte here +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; 81f0c + +Function81f0c: ; 81f0c + ld a, [wcfbe] + push af + set 7, a + ld [wcfbe], a + call Function81f1d + pop af + ld [wcfbe], a + ret +; 81f1d + +Function81f1d: ; 81f1d + ld a, [hl] + and $7 + ret z + ld b, a +.asm_81f22 + push bc + xor a + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + ld b, $10 +.asm_81f2c + ld e, $8 + ld a, [hli] + ld d, a +.asm_81f30 + bit 0, d + ld a, $10 + jr nz, .asm_81f38 + ld a, $20 + +.asm_81f38 + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + rr d + dec e + jr nz, .asm_81f30 + dec b + jr nz, .asm_81f2c + ld a, $20 + ld [rJOYP], a + ld a, $30 + ld [rJOYP], a + ld de, 7000 +.asm_81f51 + nop + nop + nop + dec de + ld a, d + or e + jr nz, .asm_81f51 + pop bc + dec b + jr nz, .asm_81f22 + ret +; 81f5e + +Function81f5e: ; 81f5e + ld a, DEBUGTEST_BLACK + hlcoord 10, 0 + ld [hl], a + hlcoord 15, 0 + ld [hl], a + hlcoord 1, 11 + ld [hl], a + hlcoord 1, 13 + ld [hl], a + hlcoord 1, 15 + ld [hl], a + ld a, [wJumptableIndex] + cp $3 + jr nz, .asm_81fc9 + ld a, [wcf64] + and a + jr z, .asm_81f8d + dec a + hlcoord 1, 11 + ld bc, 2 * SCREEN_WIDTH + call AddNTimes + ld [hl], $ed + +.asm_81f8d + ld a, [wcf65] + and a + jr z, .asm_81f98 + hlcoord 15, 0 + jr .asm_81f9b + +.asm_81f98 + hlcoord 10, 0 + +.asm_81f9b + ld [hl], $ed + ld b, $70 + ld c, $5 + ld hl, wVirtualOAM + ld de, wc608 + 10 + call .asm_81fb7 + ld de, wc608 + 11 + call .asm_81fb7 + ld de, wc608 + 12 + call .asm_81fb7 + ret + +.asm_81fb7 + ld a, b + ld [hli], a ; y + ld a, [de] + add a + add a + add 3 * TILE_WIDTH + ld [hli], a ; x + xor a + ld [hli], a ; tile id + ld a, c + ld [hli], a ; attributes + ld a, 2 * TILE_WIDTH + add b + ld b, a + inc c + ret + +.asm_81fc9 + call ClearSprites + ret +; 81fcd + +String_81fcd: ; 81fcd + db "おわりますか?" ; Are you finished? + next "はい", DEBUGTEST_A ; YES...(A) + next "いいえ", DEBUGTEST_B ; NO..(B) + db "@" +; 81fe3 + +DebugColorTestGFX: +INCBIN "gfx/debug/color_test.2bpp" + + +TilesetColorTest: + ret + xor a + ld [wJumptableIndex], a + ld [wcf64], a + ld [wcf65], a + ld [wcf66], a + ld [hMapAnims], a + call ClearSprites + call OverworldTextModeSwitch + call WaitBGMap2 + xor a + ld [hBGMapMode], a + ld de, DebugColorTestGFX + 1 tiles + ld hl, vTiles2 tile DEBUGTEST_UP_ARROW + lb bc, BANK(DebugColorTestGFX), 22 + call Request2bpp + ld de, DebugColorTestGFX + ld hl, vTiles1 + lb bc, BANK(DebugColorTestGFX), 1 + call Request2bpp + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, DEBUGTEST_BLACK + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $7 + call ByteFill + ld de, $15 + ld a, DEBUGTEST_WHITE + call Function821d2 + ld de, $1a + ld a, DEBUGTEST_LIGHT + call Function821d2 + ld de, $1f + ld a, DEBUGTEST_DARK + call Function821d2 + ld de, $24 + ld a, DEBUGTEST_BLACK + call Function821d2 + call Function821f4 + call Function8220f + call WaitBGMap2 + ld [wJumptableIndex], a + ld a, $40 + ld [hWY], a + ret +; 821d2 + +Function821d2: ; 821d2 + hlcoord 0, 0 + call Function821de + +Function821d8: ; 821d8 + ld a, [wcf64] + hlcoord 0, 0, wAttrMap + +Function821de: ; 821de + add hl, de +rept 4 + ld [hli], a +endr + ld bc, $10 + add hl, bc +rept 4 + ld [hli], a +endr + ld bc, $10 + add hl, bc +rept 4 + ld [hli], a +endr + ret +; 821f4 + +Function821f4: ; 821f4 + hlcoord 2, 4 + call Function82203 + hlcoord 2, 6 + call Function82203 + hlcoord 2, 8 + +Function82203: ; 82203 + ld a, DEBUGTEST_UP_ARROW + ld [hli], a + ld bc, $10 - 1 + ld a, DEBUGTEST_TICKS + call ByteFill + ret +; 8220f + +Function8220f: ; 8220f + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld a, [wcf64] + ld l, a + ld h, $0 + add hl, hl + add hl, hl + add hl, hl + ld de, wBGPals1 + add hl, de + ld de, wc608 + ld bc, 8 + call CopyBytes + ld de, wc608 + call Function81ea5 + pop af + ld [rSVBK], a + ret +; 82236 + + +Function82236: ; 82236 + ld hl, hJoyLast + ld a, [hl] + and SELECT + jr nz, .loop7 + ld a, [hl] + and B_BUTTON + jr nz, .asm_82299 + call Function822f0 + ret + +.loop7 + ld hl, wcf64 + ld a, [hl] + inc a + and $7 + cp $7 + jr nz, .asm_82253 + xor a + +.asm_82253 + ld [hl], a + ld de, $15 + call Function821d8 + ld de, $1a + call Function821d8 + ld de, $1f + call Function821d8 + ld de, $24 + call Function821d8 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld hl, wBGPals2 + ld a, [wcf64] + ld bc, 1 palettes + call AddNTimes + ld de, wc608 + ld bc, 1 palettes + call CopyBytes + pop af + ld [rSVBK], a + ld a, $2 + ld [hBGMapMode], a + ld c, 3 + call DelayFrames + ld a, $1 + ld [hBGMapMode], a + ret + +.asm_82299 + call ClearSprites + ld a, [hWY] + xor $d0 + ld [hWY], a + ret +; 822a3 + +Function822a3: ; 822a3 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld hl, wBGPals2 + ld a, [wcf64] + ld bc, 1 palettes + call AddNTimes + ld e, l + ld d, h + ld hl, wc608 + ld bc, 1 palettes + call CopyBytes + hlcoord 1, 0 + ld de, wc608 + call Function81ca7 + hlcoord 6, 0 + ld de, wc608 + 2 + call Function81ca7 + hlcoord 11, 0 + ld de, wc608 + 4 + call Function81ca7 + hlcoord 16, 0 + ld de, wc608 + 6 + call Function81ca7 + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + call DelayFrame + ret +; 822f0 + +Function822f0: ; 822f0 + ld a, [wcf65] + and 3 + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 82301 + +.dw ; 82301 + dw Function82309 + dw Function82339 + dw Function8234b + dw Function8235d +; 82309 + +Function82309: ; 82309 + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function8238c + ld a, [hl] + and D_LEFT + jr nz, .asm_8231c + ld a, [hl] + and D_RIGHT + jr nz, .asm_82322 + ret + +.asm_8231c + ld a, [wcf66] + dec a + jr .asm_82326 + +.asm_82322 + ld a, [wcf66] + inc a + +.asm_82326 + and $3 + ld [wcf66], a + ld e, a + ld d, $0 + ld hl, wc608 + add hl, de + add hl, de + ld e, l + ld d, h + call Function81ea5 + ret + +Function82339: ; 82338 + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function8238c + ld a, [hl] + and D_UP + jr nz, Function82387 + ld hl, wc608 + 10 + jr Function82368 + +Function8234b: ; 8234b + ld hl, hJoyLast + ld a, [hl] + and D_DOWN + jr nz, Function8238c + ld a, [hl] + and D_UP + jr nz, Function82387 + ld hl, wc608 + 11 + jr Function82368 + +Function8235d: ; 8235d + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, Function82387 + ld hl, wc608 + 12 + +Function82368: ; 82368 + ld a, [hJoyLast] + and D_RIGHT + jr nz, .asm_82375 + ld a, [hJoyLast] + and D_LEFT + jr nz, .asm_8237c + ret + +.asm_82375 + ld a, [hl] + cp $1f + ret nc + inc [hl] + jr .asm_82380 + +.asm_8237c + ld a, [hl] + and a + ret z + dec [hl] + +.asm_82380 + call Function82391 + call Function822a3 + ret + +Function82387: ; 82387 + ld hl, wcf65 + dec [hl] + ret + +Function8238c: ; 8238c + ld hl, wcf65 + inc [hl] + ret +; 82391 + +Function82391: ; 82391 + ld a, [wc608 + 10] + and $1f + ld e, a + ld a, [wc608 + 11] + and $7 + sla a + swap a + or e + ld e, a + ld a, [wc608 + 11] + and $18 + sla a + swap a + ld d, a + ld a, [wc608 + 12] + and $1f + sla a + sla a + or d + ld d, a + ld a, [wcf66] + ld c, a + ld b, $0 + ld hl, wc608 + add hl, bc + add hl, bc + ld a, e + ld [hli], a + ld [hl], d + ret +; 823c6 + +Function823c6: ; 823c6 + ret + +Function823c7: ; 823c7 + ret +; 823c8 diff --git a/engine/menus/save.asm b/engine/menus/save.asm new file mode 100644 index 000000000..7984c1612 --- /dev/null +++ b/engine/menus/save.asm @@ -0,0 +1,1210 @@ +SaveMenu: ; 14a1a + call LoadStandardMenuHeader + farcall DisplaySaveInfoOnSave + call SpeechTextBox + call UpdateSprites + farcall SaveMenu_CopyTilemapAtOnce + ld hl, Text_WouldYouLikeToSaveTheGame + call SaveTheGame_yesorno + jr nz, .refused + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call _SavingDontTurnOffThePower + call ResumeGameLogic + call ExitMenu + and a + ret + +.refused + call ExitMenu + call ret_d90 + farcall SaveMenu_CopyTilemapAtOnce + scf + ret + +SaveAfterLinkTrade: ; 14a58 + call PauseGameLogic + farcall StageRTCTimeForSave + farcall BackupMysteryGift + call SavePokemonData + call SaveChecksum + call SaveBackupPokemonData + call SaveBackupChecksum + farcall BackupPartyMonMail + farcall SaveRTC + call ResumeGameLogic + ret +; 14a83 + + +ChangeBoxSaveGame: ; 14a83 (5:4a83) + push de + ld hl, Text_SaveOnBoxSwitch + call MenuTextBox + call YesNoBox + call ExitMenu + jr c, .refused + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call SavingDontTurnOffThePower + call SaveBox + pop de + ld a, e + ld [wCurBox], a + call LoadBox + call SavedTheGame + call ResumeGameLogic + and a + ret +.refused + pop de + ret + +Link_SaveGame: ; 14ab2 + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call _SavingDontTurnOffThePower + call ResumeGameLogic + and a + +.refused + ret +; 14ac2 + +MoveMonWOMail_SaveGame: ; 14ac2 + call PauseGameLogic + push de + call SaveBox + pop de + ld a, e + ld [wCurBox], a + call LoadBox + call ResumeGameLogic + ret +; 14ad5 + +MoveMonWOMail_InsertMon_SaveGame: ; 14ad5 + call PauseGameLogic + push de + call SaveBox + pop de + ld a, e + ld [wCurBox], a + ld a, $1 + ld [wSaveFileExists], a + farcall StageRTCTimeForSave + farcall BackupMysteryGift + call ValidateSave + call SaveOptions + call SavePlayerData + call SavePokemonData + call SaveChecksum + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum + farcall BackupPartyMonMail + farcall BackupMobileEventIndex + farcall SaveRTC + call LoadBox + call ResumeGameLogic + ld de, SFX_SAVE + call PlaySFX + ld c, 24 + call DelayFrames + ret +; 14b34 + +StartMoveMonWOMail_SaveGame: ; 14b34 + ld hl, Text_SaveOnMoveMonWOMail + call MenuTextBox + call YesNoBox + call ExitMenu + jr c, .refused + call AskOverwriteSaveFile + jr c, .refused + call PauseGameLogic + call _SavingDontTurnOffThePower + call ResumeGameLogic + and a + ret + +.refused + scf + ret +; 14b54 + +PauseGameLogic: ; 14b54 + ld a, $1 + ld [wGameLogicPaused], a + ret +; 14b5a + +ResumeGameLogic: ; 14b5a + xor a + ld [wGameLogicPaused], a + ret +; 14b5f + + +AddHallOfFameEntry: ; 14b5f + ld a, BANK(sHallOfFame) + call GetSRAMBank + ld hl, sHallOfFame + HOF_LENGTH * (NUM_HOF_TEAMS - 1) - 1 + ld de, sHallOfFame + HOF_LENGTH * NUM_HOF_TEAMS - 1 + ld bc, HOF_LENGTH * (NUM_HOF_TEAMS - 1) +.loop + ld a, [hld] + ld [de], a + dec de + dec bc + ld a, c + or b + jr nz, .loop + ld hl, wOverworldMap + ld de, sHallOfFame + ld bc, HOF_LENGTH + call CopyBytes + call CloseSRAM + ret +; 14b85 + +SaveGameData: ; 14b85 + call SaveGameData_ + ret +; 14b89 + +AskOverwriteSaveFile: ; 14b89 + ld a, [wSaveFileExists] + and a + jr z, .erase + call CompareLoadedAndSavedPlayerID + jr z, .yoursavefile + ld hl, Text_AnotherSaveFile + call SaveTheGame_yesorno + jr nz, .refused + jr .erase + +.yoursavefile + ld hl, Text_AlreadyASaveFile + call SaveTheGame_yesorno + jr nz, .refused + jr .ok + +.erase + call ErasePreviousSave + +.ok + and a + ret + +.refused + scf + ret +; 14baf + +SaveTheGame_yesorno: ; 14baf + ld b, BANK(Text_WouldYouLikeToSaveTheGame) + call MapTextbox + call LoadMenuTextBox + lb bc, 0, 7 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call CloseWindow + push af + call ret_d90 + pop af + and a + ret +; 14bcb + +CompareLoadedAndSavedPlayerID: ; 14bcb + ld a, BANK(sPlayerData) + call GetSRAMBank + ld hl, sPlayerData + (wPlayerID - wPlayerData) + ld a, [hli] + ld c, [hl] + ld b, a + call CloseSRAM + ld a, [wPlayerID] + cp b + ret nz + ld a, [wPlayerID + 1] + cp c + ret +; 14be3 + +_SavingDontTurnOffThePower: ; 14be3 + call SavingDontTurnOffThePower +SavedTheGame: ; 14be6 + call SaveGameData_ + ; wait 32 frames + ld c, $20 + call DelayFrames + ; copy the original text speed setting to the stack + ld a, [wOptions] + push af + ; set text speed super slow + ld a, 3 + ld [wOptions], a + ; saved the game! + ld hl, Text_PlayerSavedTheGame + call PrintText + ; restore the original text speed setting + pop af + ld [wOptions], a + ld de, SFX_SAVE + call WaitPlaySFX + call WaitSFX + ; wait 30 frames + ld c, $1e + call DelayFrames + ret +; 14c10 + + +SaveGameData_: ; 14c10 + ld a, 1 + ld [wSaveFileExists], a + farcall StageRTCTimeForSave + farcall BackupMysteryGift + call ValidateSave + call SaveOptions + call SavePlayerData + call SavePokemonData + call SaveBox + call SaveChecksum + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum + call UpdateStackTop + farcall BackupPartyMonMail + farcall BackupMobileEventIndex + farcall SaveRTC + ld a, BANK(sBattleTowerChallengeState) + call GetSRAMBank + ld a, [sBattleTowerChallengeState] + cp BATTLETOWER_RECEIVED_REWARD + jr nz, .ok + xor a + ld [sBattleTowerChallengeState], a +.ok + call CloseSRAM + ret +; 14c6b + +UpdateStackTop: ; 14c6b +; sStackTop appears to be unused. +; It could have been used to debug stack overflow during saving. + call FindStackTop + ld a, BANK(sStackTop) + call GetSRAMBank + ld a, [sStackTop + 0] + ld e, a + ld a, [sStackTop + 1] + ld d, a + or e + jr z, .update + ld a, e + sub l + ld a, d + sbc h + jr c, .done + +.update + ld a, l + ld [sStackTop + 0], a + ld a, h + ld [sStackTop + 1], a + +.done + call CloseSRAM + ret +; 14c90 + +FindStackTop: ; 14c90 +; Find the furthest point that sp has traversed to. +; This is distinct from the current value of sp. + ld hl, wStack - $ff +.loop + ld a, [hl] + or a + ret nz + inc hl + jr .loop +; 14c99 + +SavingDontTurnOffThePower: ; 14c99 + ; Prevent joypad interrupts + xor a + ld [hJoypadReleased], a + ld [hJoypadPressed], a + ld [hJoypadSum], a + ld [hJoypadDown], a + ; Save the text speed setting to the stack + ld a, [wOptions] + push af + ; Set the text speed to super slow + ld a, $3 + ld [wOptions], a + ; SAVING... DON'T TURN OFF THE POWER. + ld hl, Text_SavingDontTurnOffThePower + call PrintText + ; Restore the text speed setting + pop af + ld [wOptions], a + ; Wait for 16 frames + ld c, $10 + call DelayFrames + ret +; 14cbb + + +ErasePreviousSave: ; 14cbb + call EraseBoxes + call EraseHallOfFame + call EraseLinkBattleStats + call EraseMysteryGift + call SaveData + call EraseBattleTowerStatus + ld a, BANK(sStackTop) + call GetSRAMBank + xor a + ld [sStackTop + 0], a + ld [sStackTop + 1], a + call CloseSRAM + ld a, $1 + ld [wSavedAtLeastOnce], a + ret +; 14ce2 + +EraseLinkBattleStats: ; 14ce2 + ld a, BANK(sLinkBattleStats) + call GetSRAMBank + ld hl, sLinkBattleStats + ld bc, sLinkBattleStatsEnd - sLinkBattleStats + xor a + call ByteFill + jp CloseSRAM +; 14cf4 + +EraseMysteryGift: ; 14cf4 + ld a, BANK(sBackupMysteryGiftItem) + call GetSRAMBank + ld hl, sBackupMysteryGiftItem + ld bc, sBackupMysteryGiftItemEnd - sBackupMysteryGiftItem + xor a + call ByteFill + jp CloseSRAM +; 14d06 + +EraseHallOfFame: ; 14d06 + ld a, BANK(sHallOfFame) + call GetSRAMBank + ld hl, sHallOfFame + ld bc, sHallOfFameEnd - sHallOfFame + xor a + call ByteFill + jp CloseSRAM +; 14d18 + +Unreferenced_Function14d18: ; 14d18 +; copy .Data to SRA4:a007 + ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + ld hl, .Data + ld de, $a007 ; address of MBC30 bank + ld bc, .DataEnd - .Data + call CopyBytes + jp CloseSRAM +; 14d2c + +.Data: ; 14d2c + db $0d, $02, $00, $05, $00, $00 + db $22, $02, $01, $05, $00, $00 + db $03, $04, $05, $08, $03, $05 + db $0e, $06, $03, $02, $00, $00 + db $39, $07, $07, $04, $00, $05 + db $04, $07, $01, $05, $00, $00 + db $0f, $05, $14, $07, $05, $05 + db $11, $0c, $0c, $06, $06, $04 +; 14d5c +.DataEnd + +EraseBattleTowerStatus: ; 14d5c + ld a, BANK(sBattleTowerChallengeState) + call GetSRAMBank + xor a + ld [sBattleTowerChallengeState], a + jp CloseSRAM +; 14d68 + +SaveData: ; 14d68 + call _SaveData + ret +; 14d6c + +Unreferenced_Function14d6c: ; 14d6c + ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + ld a, [$a60b] ; address of MBC30 bank + ld b, $0 + and a + jr z, .ok + ld b, $2 + +.ok + ld a, b + ld [$a60b], a ; address of MBC30 bank + call CloseSRAM + ret +; 14d83 + +Unreferenced_Function14d83: ; 14d83 + ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + xor a + ld [$a60c], a ; address of MBC30 bank + ld [$a60d], a ; address of MBC30 bank + call CloseSRAM + ret +; 14d93 + +Unreferenced_Function14d93: ; 14d93 + ld a, 7 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + xor a + ld [$a000], a ; address of MBC30 bank + call CloseSRAM + ret +; 14da0 + + +HallOfFame_InitSaveIfNeeded: ; 14da0 + ld a, [wSavedAtLeastOnce] + and a + ret nz + call ErasePreviousSave + ret +; 14da9 + +ValidateSave: ; 14da9 + ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) + call GetSRAMBank + ld a, SAVE_CHECK_VALUE_1 + ld [sCheckValue1], a + ld a, SAVE_CHECK_VALUE_2 + ld [sCheckValue2], a + jp CloseSRAM +; 14dbb + +SaveOptions: ; 14dbb + ld a, BANK(sOptions) + call GetSRAMBank + ld hl, wOptions + ld de, sOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + ld a, [wOptions] + and $ff ^ (1 << NO_TEXT_SCROLL) + ld [sOptions], a + jp CloseSRAM +; 14dd7 + +SavePlayerData: ; 14dd7 + ld a, BANK(sPlayerData) + call GetSRAMBank + ld hl, wPlayerData + ld de, sPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, wCurrMapData + ld de, sCurrMapData + ld bc, wCurrMapDataEnd - wCurrMapData + call CopyBytes + jp CloseSRAM +; 14df7 + +SavePokemonData: ; 14df7 + ld a, BANK(sPokemonData) + call GetSRAMBank + ld hl, wPokemonData + ld de, sPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret +; 14e0c + +SaveBox: ; 14e0c + call GetBoxAddress + call SaveBoxAddress + ret +; 14e13 + +SaveChecksum: ; 14e13 + ld hl, sGameData + ld bc, sGameDataEnd - sGameData + ld a, BANK(sGameData) + call GetSRAMBank + call Checksum + ld a, e + ld [sChecksum + 0], a + ld a, d + ld [sChecksum + 1], a + call CloseSRAM + ret +; 14e2d + +ValidateBackupSave: ; 14e2d + ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2) + call GetSRAMBank + ld a, SAVE_CHECK_VALUE_1 + ld [sBackupCheckValue1], a + ld a, SAVE_CHECK_VALUE_2 + ld [sBackupCheckValue2], a + call CloseSRAM + ret +; 14e40 + +SaveBackupOptions: ; 14e40 + ld a, BANK(sBackupOptions) + call GetSRAMBank + ld hl, wOptions + ld de, sBackupOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call CloseSRAM + ret +; 14e55 + +SaveBackupPlayerData: ; 14e55 + ld a, BANK(sBackupPlayerData) + call GetSRAMBank + ld hl, wPlayerData + ld de, sBackupPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, wCurrMapData + ld de, sBackupCurrMapData + ld bc, wCurrMapDataEnd - wCurrMapData + call CopyBytes + call CloseSRAM + ret +; 14e76 + +SaveBackupPokemonData: ; 14e76 + ld a, BANK(sBackupPokemonData) + call GetSRAMBank + ld hl, wPokemonData + ld de, sBackupPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret +; 14e8b + +SaveBackupChecksum: ; 14e8b + ld hl, sBackupGameData + ld bc, sBackupGameDataEnd - sBackupGameData + ld a, BANK(sBackupGameData) + call GetSRAMBank + call Checksum + ld a, e + ld [sBackupChecksum + 0], a + ld a, d + ld [sBackupChecksum + 1], a + call CloseSRAM + ret +; 14ea5 + + +TryLoadSaveFile: ; 14ea5 (5:4ea5) + call VerifyChecksum + jr nz, .backup + call LoadPlayerData + call LoadPokemonData + call LoadBox + farcall RestorePartyMonMail + farcall RestoreMobileEventIndex + farcall RestoreMysteryGift + call ValidateBackupSave + call SaveBackupOptions + call SaveBackupPlayerData + call SaveBackupPokemonData + call SaveBackupChecksum + and a + ret + +.backup + call VerifyBackupChecksum + jr nz, .corrupt + call LoadBackupPlayerData + call LoadBackupPokemonData + call LoadBox + farcall RestorePartyMonMail + farcall RestoreMobileEventIndex + farcall RestoreMysteryGift + call ValidateSave + call SaveOptions + call SavePlayerData + call SavePokemonData + call SaveChecksum + and a + ret + +.corrupt + ld a, [wOptions] + push af + set NO_TEXT_SCROLL, a + ld [wOptions], a + ld hl, Text_SaveFileCorrupted + call PrintText + pop af + ld [wOptions], a + scf + ret + + +TryLoadSaveData: ; 14f1c + xor a + ld [wSaveFileExists], a + call CheckPrimarySaveFile + ld a, [wSaveFileExists] + and a + jr z, .backup + + ld a, BANK(sPlayerData) + call GetSRAMBank + ld hl, sPlayerData + wStartDay - wPlayerData + ld de, wStartDay + ld bc, 8 + call CopyBytes + ld hl, sPlayerData + wStatusFlags - wPlayerData + ld de, wStatusFlags + ld a, [hl] + ld [de], a + call CloseSRAM + ret + +.backup + call CheckBackupSaveFile + ld a, [wSaveFileExists] + and a + jr z, .corrupt + + ld a, BANK(sBackupPlayerData) + call GetSRAMBank + ld hl, sBackupPlayerData + wStartDay - wPlayerData + ld de, wStartDay + ld bc, 8 + call CopyBytes + ld hl, sBackupPlayerData + wStatusFlags - wPlayerData + ld de, wStatusFlags + ld a, [hl] + ld [de], a + call CloseSRAM + ret + +.corrupt + ld hl, DefaultOptions + ld de, wOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call PanicResetClock + ret +; 14f7c + + +INCLUDE "data/default_options.asm" + + +CheckPrimarySaveFile: ; 14f84 + ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) + call GetSRAMBank + ld a, [sCheckValue1] + cp SAVE_CHECK_VALUE_1 + jr nz, .nope + ld a, [sCheckValue2] + cp SAVE_CHECK_VALUE_2 + jr nz, .nope + ld hl, sOptions + ld de, wOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + call CloseSRAM + ld a, $1 + ld [wSaveFileExists], a + +.nope + call CloseSRAM + ret +; 14faf + +CheckBackupSaveFile: ; 14faf + ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2) + call GetSRAMBank + ld a, [sBackupCheckValue1] + cp SAVE_CHECK_VALUE_1 + jr nz, .nope + ld a, [sBackupCheckValue2] + cp SAVE_CHECK_VALUE_2 + jr nz, .nope + ld hl, sBackupOptions + ld de, wOptions + ld bc, wOptionsEnd - wOptions + call CopyBytes + ld a, $2 + ld [wSaveFileExists], a + +.nope + call CloseSRAM + ret +; 14fd7 + + +LoadPlayerData: ; 14fd7 (5:4fd7) + ld a, BANK(sPlayerData) + call GetSRAMBank + ld hl, sPlayerData + ld de, wPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, sCurrMapData + ld de, wCurrMapData + ld bc, wCurrMapDataEnd - wCurrMapData + call CopyBytes + call CloseSRAM + ld a, BANK(sBattleTowerChallengeState) + call GetSRAMBank + ld a, [sBattleTowerChallengeState] + cp BATTLETOWER_RECEIVED_REWARD + jr nz, .not_4 + ld a, BATTLETOWER_WON_CHALLENGE + ld [sBattleTowerChallengeState], a +.not_4 + call CloseSRAM + ret + +LoadPokemonData: ; 1500c + ld a, BANK(sPokemonData) + call GetSRAMBank + ld hl, sPokemonData + ld de, wPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret +; 15021 + +LoadBox: ; 15021 (5:5021) + call GetBoxAddress + call LoadBoxAddress + ret + +VerifyChecksum: ; 15028 (5:5028) + ld hl, sGameData + ld bc, sGameDataEnd - sGameData + ld a, BANK(sGameData) + call GetSRAMBank + call Checksum + ld a, [sChecksum + 0] + cp e + jr nz, .fail + ld a, [sChecksum + 1] + cp d +.fail + push af + call CloseSRAM + pop af + ret + +LoadBackupPlayerData: ; 15046 (5:5046) + ld a, BANK(sBackupPlayerData) + call GetSRAMBank + ld hl, sBackupPlayerData + ld de, wPlayerData + ld bc, wPlayerDataEnd - wPlayerData + call CopyBytes + ld hl, sBackupCurrMapData + ld de, wCurrMapData + ld bc, wCurrMapDataEnd - wCurrMapData + call CopyBytes + call CloseSRAM + ret + +LoadBackupPokemonData: ; 15067 (5:5067) + ld a, BANK(sBackupPokemonData) + call GetSRAMBank + ld hl, sBackupPokemonData + ld de, wPokemonData + ld bc, wPokemonDataEnd - wPokemonData + call CopyBytes + call CloseSRAM + ret + +VerifyBackupChecksum: ; 1507c (5:507c) + ld hl, sBackupGameData + ld bc, sBackupGameDataEnd - sBackupGameData + ld a, BANK(sBackupGameData) + call GetSRAMBank + call Checksum + ld a, [sBackupChecksum + 0] + cp e + jr nz, .fail + ld a, [sBackupChecksum + 1] + cp d +.fail + push af + call CloseSRAM + pop af + ret + + +_SaveData: ; 1509a + ; This is called within two scenarios: + ; a) ErasePreviousSave (the process of erasing the save from a previous game file) + ; b) unused mobile functionality + ; It is not part of a regular save. + + ld a, BANK(sCrystalData) + call GetSRAMBank + ld hl, wCrystalData + ld de, sCrystalData + ld bc, wCrystalDataEnd - wCrystalData + call CopyBytes + + ; This block originally had some mobile functionality, but since we're still in + ; BANK(sCrystalData), it instead overwrites the sixteen wEventFlags starting at 1:a603 with + ; garbage from wd479. This isn't an issue, since ErasePreviousSave is followed by a regular + ; save that unwrites the garbage. + + ld hl, wd479 + ld a, [hli] + ld [$a60e + 0], a + ld a, [hli] + ld [$a60e + 1], a + + jp CloseSRAM + + +_LoadData: ; 150b9 + ld a, BANK(sCrystalData) + call GetSRAMBank + ld hl, sCrystalData + ld de, wCrystalData + ld bc, wCrystalDataEnd - wCrystalData + call CopyBytes + + ; This block originally had some mobile functionality to mirror _SaveData above, but instead it + ; (harmlessly) writes the aforementioned wEventFlags to the unused wd479. + + ld hl, wd479 + ld a, [$a60e + 0] + ld [hli], a + ld a, [$a60e + 1] + ld [hli], a + + jp CloseSRAM + + +GetBoxAddress: ; 150d8 + ld a, [wCurBox] + cp NUM_BOXES + jr c, .ok + xor a + ld [wCurBox], a + +.ok + ld e, a + ld d, 0 + ld hl, BoxAddresses +rept 5 + add hl, de +endr + ld a, [hli] + push af + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld h, [hl] + ld l, a + pop af + ret +; 150f9 + +SaveBoxAddress: ; 150f9 +; Save box via wMisc. +; We do this in three steps because the size of wMisc is less than +; the size of sBox. + push hl +; Load the first part of the active box. + push af + push de + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBox + ld de, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + pop de + pop af +; Save it to the target box. + push af + push de + call GetSRAMBank + ld hl, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + +; Load the second part of the active box. + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBox + (wMiscEnd - wMisc) + ld de, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + pop de + pop af + + ld hl, (wMiscEnd - wMisc) + add hl, de + ld e, l + ld d, h +; Save it to the next part of the target box. + push af + push de + call GetSRAMBank + ld hl, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + +; Load the third and final part of the active box. + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBox + (wMiscEnd - wMisc) * 2 + ld de, wMisc + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e + call CopyBytes + call CloseSRAM + pop de + pop af + + ld hl, (wMiscEnd - wMisc) + add hl, de + ld e, l + ld d, h +; Save it to the final part of the target box. + call GetSRAMBank + ld hl, wMisc + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e + call CopyBytes + call CloseSRAM + + pop hl + ret +; 1517d + + +LoadBoxAddress: ; 1517d (5:517d) +; Load box via wMisc. +; We do this in three steps because the size of wMisc is less than +; the size of sBox. + push hl + ld l, e + ld h, d +; Load part 1 + push af + push hl + call GetSRAMBank + ld de, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call GetSRAMBank + ld hl, wMisc + ld de, sBox + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + pop hl + pop af + + ld de, (wMiscEnd - wMisc) + add hl, de +; Load part 2 + push af + push hl + call GetSRAMBank + ld de, wMisc + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call GetSRAMBank + ld hl, wMisc + ld de, sBox + (wMiscEnd - wMisc) + ld bc, (wMiscEnd - wMisc) + call CopyBytes + call CloseSRAM + pop hl + pop af +; Load part 3 + ld de, (wMiscEnd - wMisc) + add hl, de + call GetSRAMBank + ld de, wMisc + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e + call CopyBytes + call CloseSRAM + ld a, BANK(sBox) + call GetSRAMBank + ld hl, wMisc + ld de, sBox + (wMiscEnd - wMisc) * 2 + ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e + call CopyBytes + call CloseSRAM + + pop hl + ret + + +EraseBoxes: ; 151fb + ld hl, BoxAddresses + ld c, NUM_BOXES +.next + push bc + ld a, [hli] + call GetSRAMBank + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + xor a + ld [de], a + inc de + ld a, -1 + ld [de], a + inc de + ld bc, sBoxEnd - (sBox + 2) +.clear + xor a + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .clear + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, -1 + ld [de], a + inc de + xor a + ld [de], a + call CloseSRAM + pop bc + dec c + jr nz, .next + ret +; 1522d + +BoxAddresses: ; 1522d +; dbww bank, address, address + dbww BANK(sBox1), sBox1, sBox1End + dbww BANK(sBox2), sBox2, sBox2End + dbww BANK(sBox3), sBox3, sBox3End + dbww BANK(sBox4), sBox4, sBox4End + dbww BANK(sBox5), sBox5, sBox5End + dbww BANK(sBox6), sBox6, sBox6End + dbww BANK(sBox7), sBox7, sBox7End + dbww BANK(sBox8), sBox8, sBox8End + dbww BANK(sBox9), sBox9, sBox9End + dbww BANK(sBox10), sBox10, sBox10End + dbww BANK(sBox11), sBox11, sBox11End + dbww BANK(sBox12), sBox12, sBox12End + dbww BANK(sBox13), sBox13, sBox13End + dbww BANK(sBox14), sBox14, sBox14End +; 15273 + + +Checksum: ; 15273 + ld de, 0 +.loop + ld a, [hli] + add e + ld e, a + ld a, 0 + adc d + ld d, a + dec bc + ld a, b + or c + jr nz, .loop + ret +; 15283 + + +Text_WouldYouLikeToSaveTheGame: ; 0x15283 + ; Would you like to save the game? + text_jump UnknownText_0x1c454b + db "@" +; 0x15288 + +Text_SavingDontTurnOffThePower: ; 0x15288 + ; SAVING… DON'T TURN OFF THE POWER. + text_jump UnknownText_0x1c456d + db "@" +; 0x1528d + +Text_PlayerSavedTheGame: ; 0x1528d + ; saved the game. + text_jump UnknownText_0x1c4590 + db "@" +; 0x15292 + +Text_AlreadyASaveFile: ; 0x15292 + ; There is already a save file. Is it OK to overwrite? + text_jump UnknownText_0x1c45a3 + db "@" +; 0x15297 + +Text_AnotherSaveFile: ; 0x15297 + ; There is another save file. Is it OK to overwrite? + text_jump UnknownText_0x1c45d9 + db "@" +; 0x1529c + +Text_SaveFileCorrupted: ; 0x1529c + ; The save file is corrupted! + text_jump UnknownText_0x1c460d + db "@" +; 0x152a1 + +Text_SaveOnBoxSwitch: ; 0x152a1 + ; When you change a #MON BOX, data will be saved. OK? + text_jump UnknownText_0x1c462a + db "@" +; 0x152a6 + +Text_SaveOnMoveMonWOMail: ; 0x152a6 + ; Each time you move a #MON, data will be saved. OK? + text_jump UnknownText_0x1c465f + db "@" +; 0x152ab diff --git a/engine/menus/savemenu_copytilemapatonce.asm b/engine/menus/savemenu_copytilemapatonce.asm new file mode 100644 index 000000000..9b50494a4 --- /dev/null +++ b/engine/menus/savemenu_copytilemapatonce.asm @@ -0,0 +1,77 @@ +SaveMenu_CopyTilemapAtOnce: ; 4cf45 (13:4f45) + ld a, [hCGB] + and a + jp z, WaitBGMap + +; The following is a modified version of CopyTilemapAtOnce. + ld a, [hBGMapMode] + push af + xor a + ld [hBGMapMode], a + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a +.WaitLY: + ld a, [rLY] + cp $60 + jr c, .WaitLY + + di + ld a, BANK(vBGMap2) + ld [rVBK], a + hlcoord 0, 0, wAttrMap + call .CopyTilemapAtOnce + ld a, BANK(vBGMap0) + ld [rVBK], a + hlcoord 0, 0 + call .CopyTilemapAtOnce +.WaitLY2: + ld a, [rLY] + cp $60 + jr c, .WaitLY2 + ei + + pop af + ld [hMapAnims], a + pop af + ld [hBGMapMode], a + ret + +.CopyTilemapAtOnce: ; 4cf80 (13:4f80) + ld [hSPBuffer], sp ; $ffd9 + ld sp, hl + ld a, [hBGMapAddress + 1] + ld h, a + ld l, 0 + ld a, SCREEN_HEIGHT + ld [hTilesPerCycle], a + ld b, 1 << 1 + ld c, LOW(rSTAT) + +.loop +rept SCREEN_WIDTH / 2 + pop de +.loop\@ + ld a, [$ff00+c] + and b + jr nz, .loop\@ + ld [hl], e + inc l + ld [hl], d + inc l +endr + + ld de, BG_MAP_WIDTH - SCREEN_WIDTH + add hl, de + ld a, [hTilesPerCycle] + dec a + ld [hTilesPerCycle], a + jr nz, .loop + + ld a, [hSPBuffer] + ld l, a + ld a, [hSPBuffer + 1] + ld h, a + ld sp, hl + ret diff --git a/engine/money.asm b/engine/money.asm deleted file mode 100755 index 585c85618..000000000 --- a/engine/money.asm +++ /dev/null @@ -1,221 +0,0 @@ -GiveMoney:: ; 15fd7 - ld a, 3 - call AddMoney - ld bc, MaxMoney - ld a, 3 - call CompareMoney - jr z, .not_maxed_out - jr c, .not_maxed_out - ld hl, MaxMoney - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - scf - ret - -.not_maxed_out - and a - ret -; 15ff7 - -MaxMoney: ; 15ff7 - dt MAX_MONEY -; 15ffa - - -TakeMoney:: ; 15ffa - ld a, 3 - call SubtractMoney - jr nc, .okay - ; leave with 0 money - xor a - ld [de], a - inc de - ld [de], a - inc de - ld [de], a - scf - ret - -.okay - and a - ret -; 1600b - -CompareMoney:: ; 1600b - ld a, 3 -CompareFunds: ; 1600d -; a: number of bytes -; bc: start addr of amount (big-endian) -; de: start addr of account (big-endian) - push hl - push de - push bc - ld h, b - ld l, c - ld c, 0 - ld b, a -.loop1 - dec a - jr z, .done - inc de - inc hl - jr .loop1 - -.done - and a -.loop2 - ld a, [de] - sbc [hl] - jr z, .okay - inc c - -.okay - dec de - dec hl - dec b - jr nz, .loop2 - jr c, .set_carry - ld a, c - and a - jr .skip_carry - -.set_carry - ld a, 1 - and a - scf -.skip_carry - pop bc - pop de - pop hl - ret -; 16035 - -SubtractMoney: ; 16035 - ld a, 3 -SubtractFunds: ; 16037 -; a: number of bytes -; bc: start addr of amount (big-endian) -; de: start addr of account (big-endian) - push hl - push de - push bc - ld h, b - ld l, c - ld b, a - ld c, 0 -.loop - dec a - jr z, .done - inc de - inc hl - jr .loop - -.done - and a -.loop2 - ld a, [de] - sbc [hl] - ld [de], a - dec de - dec hl - dec b - jr nz, .loop2 - pop bc - pop de - pop hl - ret -; 16053 - -AddMoney: ; 16053 - ld a, 3 -AddFunds: ; 16055 -; a: number of bytes -; bc: start addr of amount (big-endian) -; de: start addr of account (big-endian) - push hl - push de - push bc - - ld h, b - ld l, c - ld b, a -.loop1 - dec a - jr z, .done - inc de - inc hl - jr .loop1 - -.done - and a -.loop2 - ld a, [de] - adc [hl] - ld [de], a - dec de - dec hl - dec b - jr nz, .loop2 - - pop bc - pop de - pop hl - ret -; 1606f - -GiveCoins:: ; 1606f - ld a, 2 - ld de, wCoins - call AddFunds - ld a, 2 - ld bc, .maxcoins - call CompareFunds - jr c, .not_maxed - ld hl, .maxcoins - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - scf - ret - -.not_maxed - and a - ret -; 1608d - -.maxcoins ; 1608d - bigdw MAX_COINS -; 1608f - - -TakeCoins:: ; 1608f - ld a, 2 - ld de, wCoins - call SubtractFunds - jr nc, .okay - ; leave with 0 coins - xor a - ld [de], a - inc de - ld [de], a - scf - ret - -.okay - and a - ret -; 160a1 - -CheckCoins:: ; 160a1 - ld a, 2 - ld de, wCoins - jp CompareFunds -; 160a9 diff --git a/engine/movie/credits.asm b/engine/movie/credits.asm new file mode 100644 index 000000000..1aaecf64a --- /dev/null +++ b/engine/movie/credits.asm @@ -0,0 +1,621 @@ +INCLUDE "constants.asm" + + +SECTION "Credits", ROMX + +Credits:: ; 109847 + bit 6, b ; Hall Of Fame + ld a, $0 + jr z, .okay + ld a, $40 +.okay + ld [wJumptableIndex], a + + ld a, [rSVBK] + push af + ld a, BANK(wGBCPalettes) + ld [rSVBK], a + + call ClearBGPalettes + call ClearTileMap + call ClearSprites + + ld hl, wCreditsFaux2bpp + ld c, $80 + ld de, $ff00 + +.load_loop + ld a, e + ld [hli], a + ld a, d + ld [hli], a + dec c + jr nz, .load_loop + + ld de, CreditsBorderGFX + ld hl, vTiles2 tile $20 + lb bc, BANK(CreditsBorderGFX), 9 + call Request2bpp + + ld de, CopyrightGFX + ld hl, vTiles2 tile $60 + lb bc, BANK(CopyrightGFX), 29 + call Request2bpp + + ld de, TheEndGFX + ld hl, vTiles2 tile $40 + lb bc, BANK(TheEndGFX), 16 + call Request2bpp + + ld a, $ff + ld [wCreditsBorderFrame], a + xor a + ld [wCreditsBorderMon], a + + call Credits_LoadBorderGFX + ld e, l + ld d, h + ld hl, vTiles2 + lb bc, BANK(CreditsMonsGFX), 16 + call Request2bpp + + call ConstructCreditsTilemap + xor a + ld [wCreditsLYOverride], a + + ld hl, wLYOverrides + ld bc, $100 + xor a + call ByteFill + + ld a, rSCX - $ff00 + ld [hLCDCPointer], a + + call GetCreditsPalette + call SetPalettes + ld a, [hVBlank] + push af + ld a, $5 + ld [hVBlank], a + ld a, $1 + ld [hInMenu], a + xor a + ld [hBGMapMode], a + ld [wCreditsPos], a + ld [wCreditsUnusedCD21], a + ld [wCreditsTimer], a + +.execution_loop + call Credits_HandleBButton + call Credits_HandleAButton + jr nz, .exit_credits + + call Credits_Jumptable + call DelayFrame + jr .execution_loop + +.exit_credits + call ClearBGPalettes + xor a + ld [hLCDCPointer], a + ld [hBGMapAddress], a + pop af + ld [hVBlank], a + pop af + ld [rSVBK], a + ret +; 1098fd + +Credits_HandleAButton: ; 1098fd + ld a, [hJoypadDown] + and A_BUTTON + ret z + ld a, [wJumptableIndex] + bit 7, a + ret +; 109908 + +Credits_HandleBButton: ; 109908 + ld a, [hJoypadDown] + and B_BUTTON + ret z + ld a, [wJumptableIndex] + bit 6, a + ret z + ld hl, wCreditsPos + ld a, [hli] + cp $d + jr nc, .okay + ld a, [hli] + and a + ret z +.okay + ld hl, wCreditsTimer + ld a, [hl] + and a + ret z + dec [hl] + ret +; 109926 + +Credits_Jumptable: ; 109926 + ld a, [wJumptableIndex] + and $f + 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 +; 109937 + +.Jumptable: ; 109937 (42:5937) + dw ParseCredits + dw Credits_Next + dw Credits_Next + dw Credits_PrepBGMapUpdate + dw Credits_UpdateGFXRequestPath + dw Credits_RequestGFX + dw Credits_LYOverride + dw Credits_Next + dw Credits_Next + dw Credits_Next + dw Credits_UpdateGFXRequestPath + dw Credits_RequestGFX + dw Credits_LoopBack + +Credits_Next: ; 109951 (42:5951) + ld hl, wJumptableIndex + inc [hl] + ret + +Credits_LoopBack: ; 109956 (42:5956) + ld hl, wJumptableIndex + ld a, [hl] + and $f0 + ld [hl], a + ret + +Credits_PrepBGMapUpdate: ; 10995e (42:595e) + xor a + ld [hBGMapMode], a + jp Credits_Next + +Credits_UpdateGFXRequestPath: ; 109964 (42:5964) + call Credits_LoadBorderGFX + ld a, l + ld [wRequested2bppSource], a + ld a, h + ld [wRequested2bppSource + 1], a + ld a, LOW(vTiles2) + ld [wRequested2bppDest], a + ld a, HIGH(vTiles2) + ld [wRequested2bppDest + 1], a + jr Credits_RequestGFX + +Credits_RequestGFX: ; 10997b (42:597b) + xor a + ld [hBGMapMode], a + ld a, $8 + ld [wRequested2bpp], a + jp Credits_Next + +Credits_LYOverride: ; 109986 (42:5986) + ld a, [rLY] + cp $30 + jr c, Credits_LYOverride + ld a, [wCreditsLYOverride] + dec a + dec a + ld [wCreditsLYOverride], a + ld hl, wLYOverrides + $1f + call .Fill + ld hl, wLYOverrides + $87 + call .Fill + jp Credits_Next + +.Fill: ; 1099a3 (42:59a3) + ld c, $8 +.loop + ld [hli], a + dec c + jr nz, .loop + ret +; 1099aa + + +ParseCredits: ; 1099aa + ld hl, wJumptableIndex + bit 7, [hl] + jp nz, .done + +; Wait until the timer has run out to parse the next command. + ld hl, wCreditsTimer + ld a, [hl] + and a + jr z, .parse + +; One tick has passed. + dec [hl] + jp .done + +.parse +; First, let's clear the current text display, +; starting from line 5. + xor a + ld [hBGMapMode], a + hlcoord 0, 5 + ld bc, 20 * 12 + ld a, " " + call ByteFill + +; Then read the script. + +.loop + call .get + +; Commands: + cp CREDITS_END + jp z, .end + cp CREDITS_WAIT + jr z, .wait + cp CREDITS_SCENE + jr z, .scene + cp CREDITS_CLEAR + jr z, .clear + cp CREDITS_MUSIC + jr z, .music + cp CREDITS_WAIT2 + jr z, .wait2 + cp CREDITS_THEEND + jr z, .theend + +; If it's not a command, it's a string identifier. + + push af + ld e, a + ld d, 0 + ld hl, CreditsStrings + add hl, de + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a + pop af + +; Strings spanning multiple lines have special cases. + + cp COPYRIGHT + jr z, .copyright + + cp STAFF + jr c, .staff + +; The rest start from line 6. + + hlcoord 0, 6 + jr .print + +.copyright + hlcoord 2, 6 + jr .print + +.staff + hlcoord 0, 6 + +.print +; Print strings spaced every two lines. + call .get + ld bc, 20 * 2 + call AddNTimes + call PlaceString + jr .loop + +.theend +; Display "The End" graphic. + call Credits_TheEnd + jr .loop + +.scene +; Update the scene number and corresponding palette. + call .get + ld [wCreditsBorderMon], a ; scene + xor a + ld [wCreditsBorderFrame], a ; frame + call GetCreditsPalette + call SetPalettes ; update hw pal registers + jr .loop + +.clear +; Clear the banner. + ld a, $ff + ld [wCreditsBorderFrame], a ; frame + jr .loop + +.music +; Play the credits music. + ld de, MUSIC_CREDITS + push de + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + pop de + call PlayMusic + jp .loop + +.wait2 +; Wait for some amount of ticks. + call .get + ld [wCreditsTimer], a + jr .done + +.wait +; Wait for some amount of ticks, and do something else. + call .get + ld [wCreditsTimer], a + + xor a + ld [hBGMapThird], a + ld a, 1 + ld [hBGMapMode], a + +.done + jp Credits_Next + +.end +; Stop execution. + ld hl, wJumptableIndex + set 7, [hl] + ld a, 32 + ld [wMusicFade], a + ld a, LOW(MUSIC_POST_CREDITS) + ld [wMusicFadeID], a + ld a, HIGH(MUSIC_POST_CREDITS) + ld [wMusicFadeID + 1], a + ret + +.get +; Get byte wCreditsPos from CreditsScript + push hl + push de + ld a, [wCreditsPos] + ld e, a + ld a, [wCreditsPos+1] + ld d, a + ld hl, CreditsScript + add hl, de + + inc de + ld a, e + ld [wCreditsPos], a + ld a, d + ld [wCreditsPos+1], a + ld a, [hl] + pop de + pop hl + ret +; 109a95 + + +ConstructCreditsTilemap: ; 109a95 (42:5a95) + xor a + ld [hBGMapMode], a + ld a, $c + ld [hBGMapAddress], a + + ld a, $28 + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + call ByteFill + + ld a, $7f + hlcoord 0, 4 + ld bc, (SCREEN_HEIGHT - 4) * SCREEN_WIDTH + call ByteFill + + hlcoord 0, 4 + ld a, $24 + call DrawCreditsBorder + + hlcoord 0, 17 + ld a, $20 + call DrawCreditsBorder + + hlcoord 0, 0, wAttrMap + ld bc, 4 * SCREEN_WIDTH + xor a + call ByteFill + + hlcoord 0, 4, wAttrMap + ld bc, SCREEN_WIDTH + ld a, $1 + call ByteFill + + hlcoord 0, 5, wAttrMap + ld bc, 12 * SCREEN_WIDTH + ld a, $2 + call ByteFill + + hlcoord 0, 17, wAttrMap + ld bc, SCREEN_WIDTH + ld a, $1 + call ByteFill + + call WaitBGMap2 + xor a + ld [hBGMapMode], a + ld [hBGMapAddress], a + hlcoord 0, 0 + call .InitTopPortion + call WaitBGMap2 + ret + +.InitTopPortion: ; 109aff (42:5aff) + ld b, 5 +.outer_loop + push hl + ld de, SCREEN_WIDTH - 3 + ld c, 4 + xor a +.inner_loop +rept 3 + ld [hli], a + inc a +endr + ld [hl], a + inc a + add hl, de + dec c + jr nz, .inner_loop + pop hl +rept 4 + inc hl +endr + dec b + jr nz, .outer_loop + ret + +DrawCreditsBorder: ; 109b1d (42:5b1d) + ld c, SCREEN_WIDTH / 4 +.loop + push af +rept 3 + ld [hli], a + inc a +endr + ld [hli], a + pop af + dec c + jr nz, .loop + ret + +GetCreditsPalette: ; 109b2c + call .GetPalAddress + + push hl + ld a, 0 + call .UpdatePals + pop hl + ret + +.GetPalAddress: +; Each set of palette data is 24 bytes long. + ld a, [wCreditsBorderMon] ; scene + and %11 + add a + add a ; * 8 + add a + ld e, a + ld d, 0 + ld hl, CreditsPalettes + add hl, de + add hl, de ; * 3 + add hl, de + ret + +.UpdatePals: +; Update the first three colors in both palette buffers. + push af + push hl + add LOW(wBGPals1) + ld e, a + ld a, 0 + adc HIGH(wBGPals1) + ld d, a + ld bc, 24 + call CopyBytes + + pop hl + pop af + add LOW(wBGPals2) + ld e, a + ld a, 0 + adc HIGH(wBGPals2) + ld d, a + ld bc, 24 + call CopyBytes + ret + +CreditsPalettes: +INCLUDE "gfx/credits/credits.pal" +; 109bca + +Credits_LoadBorderGFX: ; 109bca (42:5bca) + ld hl, wCreditsBorderFrame + ld a, [hl] + cp $ff + jr z, .init + + and %11 + ld e, a + inc a + and %11 + ld [hl], a + ld a, [wCreditsBorderMon] + and %11 + add a + add a + add e + add a + ld e, a + ld d, 0 + ld hl, .Frames + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +.init + ld hl, wCreditsFaux2bpp + ret +; 109bf1 (42:5bf1) + +.Frames: ; 109bf1 + dw CreditsPichuGFX + dw CreditsPichuGFX + 16 tiles + dw CreditsPichuGFX + 32 tiles + dw CreditsPichuGFX + 48 tiles + dw CreditsSmoochumGFX + dw CreditsSmoochumGFX + 16 tiles + dw CreditsSmoochumGFX + 32 tiles + dw CreditsSmoochumGFX + 48 tiles + dw CreditsDittoGFX + dw CreditsDittoGFX + 16 tiles + dw CreditsDittoGFX + 32 tiles + dw CreditsDittoGFX + 48 tiles + dw CreditsIgglybuffGFX + dw CreditsIgglybuffGFX + 16 tiles + dw CreditsIgglybuffGFX + 32 tiles + dw CreditsIgglybuffGFX + 48 tiles +; 109c11 + +Credits_TheEnd: ; 109c11 (42:5c11) + ld a, $40 + hlcoord 6, 9 + call .Load + hlcoord 6, 10 +.Load: ; 109c1c (42:5c1c) + ld c, 8 +.loop + ld [hli], a + inc a + dec c + jr nz, .loop + ret +; 109c24 (42:5c24) + + +CreditsBorderGFX: INCBIN "gfx/credits/border.2bpp" + +CreditsMonsGFX: +CreditsPichuGFX: INCBIN "gfx/credits/pichu.2bpp" +CreditsSmoochumGFX: INCBIN "gfx/credits/smoochum.2bpp" +CreditsDittoGFX: INCBIN "gfx/credits/ditto.2bpp" +CreditsIgglybuffGFX: INCBIN "gfx/credits/igglybuff.2bpp" + +INCLUDE "data/credits_script.asm" +INCLUDE "data/credits_strings.asm" diff --git a/engine/movie/crystal_intro.asm b/engine/movie/crystal_intro.asm new file mode 100755 index 000000000..56bb02750 --- /dev/null +++ b/engine/movie/crystal_intro.asm @@ -0,0 +1,2199 @@ +Copyright_GFPresents: ; e4579 + ld de, MUSIC_NONE + call PlayMusic + call ClearBGPalettes + call ClearTileMap + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + xor a ; LOW(vBGMap0) + ld [hBGMapAddress], a + ld [hJoyDown], a + ld [hSCX], a + ld [hSCY], a + ld a, $90 + ld [hWY], a + call WaitBGMap + ld b, SCGB_GAMEFREAK_LOGO + call GetSGBLayout + call SetPalettes + ld c, 10 + call DelayFrames + callfar Copyright + call WaitBGMap + ld c, 100 + call DelayFrames + call ClearTileMap + farcall GBCOnlyScreen + call .GetGFLogoGFX +.joy_loop + call JoyTextDelay + ld a, [hJoyLast] + and BUTTONS + jr nz, .pressed_button + ld a, [wJumptableIndex] + bit 7, a + jr nz, .finish + call PlaceGameFreakPresents + farcall PlaySpriteAnimations + call DelayFrame + jr .joy_loop + +.pressed_button + call .StopGamefreakAnim + scf + ret + +.finish + call .StopGamefreakAnim + and a + ret +; e45e8 + +.GetGFLogoGFX: ; e45e8 + ld de, GameFreakLogo + ld hl, vTiles2 + lb bc, BANK(GameFreakLogo), 28 + call Get1bpp + + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + ld hl, IntroLogoGFX + ld de, wDecompressScratch + ld a, BANK(IntroLogoGFX) + call FarDecompress + + ld hl, vTiles0 + ld de, wDecompressScratch + lb bc, 1, 8 tiles + call Request2bpp + + ld hl, vTiles1 + ld de, wDecompressScratch + $80 tiles + lb bc, 1, 8 tiles + call Request2bpp + + pop af + ld [rSVBK], a + + farcall ClearSpriteAnims + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_GAMEFREAK_LOGO + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $a0 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $60 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + xor a + ld [wJumptableIndex], a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + ld [hSCX], a + ld [hSCY], a + ld a, $1 + ld [hBGMapMode], a + ld a, $90 + ld [hWY], a + lb de, %11100100, %11100100 + call DmgToCgbObjPals + ret +; e465e + +.StopGamefreakAnim: ; e465e + farcall ClearSpriteAnims + call ClearTileMap + call ClearSprites + ld c, 16 + call DelayFrames + ret +; e4670 + +PlaceGameFreakPresents: ; e4670 + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e467f + +.dw ; e467f + dw PlaceGameFreakPresents_0 + dw PlaceGameFreakPresents_1 + dw PlaceGameFreakPresents_2 + dw PlaceGameFreakPresents_3 +; e4687 + +PlaceGameFreakPresents_AdvanceIndex: ; e4687 + ld hl, wJumptableIndex + inc [hl] + ret +; e468c + +PlaceGameFreakPresents_0: ; e468c + ret +; e468d + +PlaceGameFreakPresents_1: ; e468d + ld hl, wIntroSceneTimer + ld a, [hl] + cp $20 + jr nc, .PlaceGameFreak + inc [hl] + ret + +.PlaceGameFreak: + ld [hl], 0 + ld hl, .GAME_FREAK + decoord 5, 10 + ld bc, .end - .GAME_FREAK + call CopyBytes + call PlaceGameFreakPresents_AdvanceIndex + ld de, SFX_GAME_FREAK_PRESENTS + call PlaySFX + ret +; e46af + +.GAME_FREAK: + ; G A M E _ F R E A K + db 0, 1, 2, 3, 13, 4, 5, 3, 1, 6 +.end + db "@" +; e46ba + +PlaceGameFreakPresents_2: ; e46ba + ld hl, wIntroSceneTimer + ld a, [hl] + cp $40 + jr nc, .place_presents + inc [hl] + ret + +.place_presents + ld [hl], 0 + ld hl, .presents + decoord 7, 11 + ld bc, .end - .presents + call CopyBytes + call PlaceGameFreakPresents_AdvanceIndex + ret +; e46d6 + +.presents + db 7, 8, 9, 10, 11, 12 +.end + db "@" +; e46dd + +PlaceGameFreakPresents_3: ; e46dd + ld hl, wIntroSceneTimer + ld a, [hl] + cp $80 + jr nc, .finish + inc [hl] + ret + +.finish + ld hl, wJumptableIndex + set 7, [hl] + ret +; e46ed + + +GameFreakLogoJumper: ; e46ed (39:46ed) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, GameFreakLogoScenes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +GameFreakLogoScenes: ; e46fd (39:46fd) + dw GameFreakLogoScene1 + dw GameFreakLogoScene2 + dw GameFreakLogoScene3 + dw GameFreakLogoScene4 + dw GameFreakLogoScene5 + +GameFreakLogoScene1: ; e4707 (39:4707) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +GameFreakLogoScene2: ; e470d (39:470d) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_e4747 + ld d, a + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and %111111 + cp %100000 + jr nc, .asm_e4723 + add %100000 +.asm_e4723 + ld e, a + farcall BattleAnim_Sine_e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], e + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + dec [hl] + and $1f + ret nz + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + sub $30 + ld [hl], a + ld de, SFX_DITTO_BOUNCE + call PlaySFX + ret + +.asm_e4747 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $0 + ld de, SFX_DITTO_POP_UP + call PlaySFX + ret + +GameFreakLogoScene3: ; e4759 (39:4759) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $20 + jr nc, .asm_e4764 + inc [hl] + ret + +.asm_e4764 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $0 + ld de, SFX_DITTO_TRANSFORM + call PlaySFX + ret + +GameFreakLogoScene4: ; e4776 (39:4776) + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $40 + jr z, .asm_e47a3 + inc [hl] + srl a + srl a + ld e, a + ld d, $0 + ld hl, GameFreakLogoPalettes + add hl, de + add hl, de + ld a, [rSVBK] + push af + ld a, BANK(wOBPals2) + ld [rSVBK], a + ld a, [hli] + ld [wOBPals2 + 12], a + ld a, [hli] + ld [wOBPals2 + 13], a + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret + +.asm_e47a3 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + call PlaceGameFreakPresents_AdvanceIndex +GameFreakLogoScene5: ; e47ab (39:47ab) + ret +; e47ac (39:47ac) + +GameFreakLogoPalettes: ; e47ac +INCLUDE "gfx/intro/gamefreak_logo.pal" +; e47cc + +GameFreakLogo: ; e47cc +INCBIN "gfx/splash/logo1.1bpp" +INCBIN "gfx/splash/logo2.1bpp" +; e48ac + +CrystalIntro: ; e48ac + ld a, [rSVBK] + push af + ld a, BANK(wGBCPalettes) + ld [rSVBK], a + ld a, [hInMenu] + push af + ld a, [hVBlank] + push af + call .InitRAMAddrs +.loop ; e48bc + call JoyTextDelay + ld a, [hJoyLast] + and BUTTONS + jr nz, .ShutOffMusic + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call IntroSceneJumper + farcall PlaySpriteAnimations + call DelayFrame + jp .loop + +.ShutOffMusic: + ld de, MUSIC_NONE + call PlayMusic + +.done + call ClearBGPalettes + call ClearSprites + call ClearTileMap + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + pop af + ld [hVBlank], a + pop af + ld [hInMenu], a + pop af + ld [rSVBK], a + ret +; e4901 + +.InitRAMAddrs: ; e4901 + xor a + ld [hVBlank], a + ld a, $1 + ld [hInMenu], a + xor a + ld [hMapAnims], a + ld [wJumptableIndex], a + ret +; e490f + +IntroSceneJumper: ; e490f + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, IntroScenes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e491e + +IntroScenes: ; e491e (39:491e) + dw IntroScene1 + dw IntroScene2 + dw IntroScene3 + dw IntroScene4 + dw IntroScene5 + dw IntroScene6 + dw IntroScene7 + dw IntroScene8 + dw IntroScene9 + dw IntroScene10 + dw IntroScene11 + dw IntroScene12 + dw IntroScene13 + dw IntroScene14 + dw IntroScene15 + dw IntroScene16 + dw IntroScene17 + dw IntroScene18 + dw IntroScene19 + dw IntroScene20 + dw IntroScene21 + dw IntroScene22 + dw IntroScene23 + dw IntroScene24 + dw IntroScene25 + dw IntroScene26 + dw IntroScene27 + dw IntroScene28 + +NextIntroScene: ; e4956 (39:4956) + ld hl, wJumptableIndex + inc [hl] + ret + +IntroScene1: ; e495b (39:495b) +; Setup the next scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap001 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroPulseGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap002 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette2 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette2 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene2: ; e49d6 (39:49d6) +; First Unown (A) fades in, pulses, then fades out. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .endscene + cp $60 + jr nz, .DontPlaySound + push af + depixel 11, 11 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_1 + call PlaySFX + pop af +.DontPlaySound: + ld [wIntroSceneTimer], a + xor a + call CrystalIntro_UnownFade + ret +.endscene + call NextIntroScene + ret + +IntroScene3: ; e49fd (39:49fd) +; More setup. Transition to the outdoor scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap003 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap004 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette1 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette1 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + call Intro_ResetLYOverrides + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene4: ; e4a69 (39:4a69) +; Scroll the outdoor panorama for a bit. + call Intro_PerspectiveScrollBG + ld hl, wIntroSceneFrameCounter + ld a, [hl] + cp $80 + jr z, .endscene + inc [hl] + ret + +.endscene + call NextIntroScene + ret + +IntroScene5: ; e4a7a (39:4a7a) +; Go back to the Unown. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld [hLCDCPointer], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap005 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroPulseGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap006 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette2 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette2 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene6: ; e4af7 (39:4af7) +; Two more Unown (I, H) fade in. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .endscene + cp $60 + jr z, .SecondUnown + cp $40 + jr nc, .StopUnown + cp $20 + jr z, .FirstUnown + jr .NoUnown + +.FirstUnown: + push af + depixel 7, 15 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_2 + call PlaySFX + pop af +.NoUnown: + ld [wIntroSceneTimer], a + xor a + call CrystalIntro_UnownFade + ret + +.SecondUnown: + push af + depixel 14, 6 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_1 + call PlaySFX + pop af +.StopUnown: + ld [wIntroSceneTimer], a + ld a, $1 + call CrystalIntro_UnownFade + ret + +.endscene + call NextIntroScene + ret + +IntroScene7: ; e4b3f (39:4b3f) +; Back to the outdoor scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap003 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + + ld hl, IntroPichuWooperGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneRunGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + + ld hl, IntroTilemap004 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld hl, IntroPalette1 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + + ld hl, IntroPalette1 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + + pop af + ld [rSVBK], a + + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + call Intro_ResetLYOverrides + farcall ClearSpriteAnims + depixel 13, 27, 4, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE + call _InitSpriteAnimStruct + ld a, $f0 + ld [wGlobalAnimXOffset], a + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene8: ; e4bd3 (39:4bd3) +; Scroll the scene, then show Suicune running across the screen. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $40 + jr z, .suicune_sound + jr nc, .animate_suicune + call Intro_PerspectiveScrollBG + ret + +.suicune_sound + ld de, SFX_INTRO_SUICUNE_3 + call PlaySFX +.animate_suicune + ld a, [wGlobalAnimXOffset] + and a + jr z, .finish + sub $8 + ld [wGlobalAnimXOffset], a + ret + +.finish + ld de, SFX_INTRO_SUICUNE_2 + call PlaySFX + farcall DeinitializeAllSprites + call NextIntroScene + ret + +IntroScene9: ; e4c04 (39:4c04) +; Set up the next scene (same bg). + xor a + ld [hLCDCPointer], a + call ClearSprites + hlcoord 0, 0, wAttrMap + ; first 12 rows have palette 1 + ld bc, 12 * SCREEN_WIDTH + ld a, $1 + call ByteFill + ; middle 3 rows have palette 2 + ld bc, 3 * SCREEN_WIDTH + ld a, $2 + call ByteFill + ; last three rows have palette 3 + ld bc, 3 * SCREEN_WIDTH + ld a, $3 + call ByteFill + ld a, $2 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + ld a, $c ; $980c + ld [hBGMapAddress], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ld [hBGMapMode], a + ld [hBGMapAddress], a + ld [wGlobalAnimXOffset], a + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene10: ; e4c4f (39:4c4f) +; Wooper and Pichu enter. + call Intro_RustleGrass + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $c0 + jr z, .done + cp $20 + jr z, .wooper + cp $40 + jr z, .pichu + ret + +.pichu + depixel 21, 16, 1, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_PICHU + call _InitSpriteAnimStruct + ld de, SFX_INTRO_PICHU + call PlaySFX + ret + +.wooper + depixel 22, 6 + ld a, SPRITE_ANIM_INDEX_INTRO_WOOPER + call _InitSpriteAnimStruct + ld de, SFX_INTRO_PICHU + call PlaySFX + ret +.done + call NextIntroScene + ret + +IntroScene11: ; e4c86 (39:4c86) +; Back to Unown again. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld [hLCDCPointer], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap007 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap008 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette2 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette2 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene12: ; e4cfa (39:4cfa) +; Even more Unown. + call .PlayUnownSound + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $c0 + jr nc, .done + cp $80 + jr nc, .second_half +; first half + ld c, a + and $1f + sla a + ld [wIntroSceneTimer], a + ld a, c + and $e0 + srl a + swap a + call CrystalIntro_UnownFade + ret + +.second_half +; double speed + ld c, a + and $f + sla a + sla a + ld [wIntroSceneTimer], a + ld a, c + and $70 + or $40 + swap a + call CrystalIntro_UnownFade + ret + +.done + call NextIntroScene + ret + +.PlayUnownSound: ; e4d36 (39:4d36) + ld a, [wIntroSceneFrameCounter] + ld c, a + ld hl, .UnownSounds +.loop + ld a, [hli] + cp -1 + ret z + cp c + jr z, .playsound + inc hl + inc hl + jr .loop +.playsound + ld a, [hli] + ld d, [hl] + ld e, a + push de + call SFXChannelsOff + pop de + call PlaySFX + ret +; e4d54 (39:4d54) + +.UnownSounds: ; e4d54 + dbw $00, SFX_INTRO_UNOWN_3 + dbw $20, SFX_INTRO_UNOWN_2 + dbw $40, SFX_INTRO_UNOWN_1 + dbw $60, SFX_INTRO_UNOWN_2 + dbw $80, SFX_INTRO_UNOWN_3 + dbw $90, SFX_INTRO_UNOWN_2 + dbw $a0, SFX_INTRO_UNOWN_1 + dbw $b0, SFX_INTRO_UNOWN_2 + db -1 ; e4d6d + +IntroScene13: ; e4d6d (39:4d6d) +; Switch scenes again. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap003 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneRunGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap004 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette1 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette1 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + depixel 13, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE + call _InitSpriteAnimStruct + ld de, MUSIC_CRYSTAL_OPENING + call PlayMusic + xor a + ld [wGlobalAnimXOffset], a + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene14: ; e4dfa (39:4dfa) +; Suicune runs then jumps. + ld a, [hSCX] + sub 10 + ld [hSCX], a + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr z, .done + cp $60 + jr z, .jump + jr nc, .asm_e4e1a + cp $40 + jr nc, .asm_e4e33 + ret + +.jump + ld de, SFX_INTRO_SUICUNE_4 + call PlaySFX + +.asm_e4e1a + ld a, $1 + ld [wIntroSceneTimer], a + ld a, [wGlobalAnimXOffset] + cp $88 + jr c, .asm_e4e2c + sub $8 + ld [wGlobalAnimXOffset], a + ret + +.asm_e4e2c + farcall DeinitializeAllSprites + ret + +.asm_e4e33 + ld a, [wGlobalAnimXOffset] + sub $2 + ld [wGlobalAnimXOffset], a + ret + +.done + call NextIntroScene + ret + +IntroScene15: ; e4e40 (39:4e40) +; Transition to a new scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap009 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneJumpGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownBackGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld de, IntroGrass4GFX + ld hl, vTiles1 tile $00 + lb bc, BANK(IntroGrass4GFX), 1 + call Request2bpp + ld hl, IntroTilemap010 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + call Intro_LoadTilemap + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette5 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette5 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld a, $90 + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + depixel 8, 5 + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN_F + call _InitSpriteAnimStruct + depixel 12, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY + call _InitSpriteAnimStruct + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene16: ; e4edc (39:4edc) +; Suicune shows its face. An Unown appears in front. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .done + call Intro_Scene16_AnimateSuicune + ld a, [hSCY] + and a + ret z + add 8 + ld [hSCY], a + ret +.done + call NextIntroScene + ret + +IntroScene17: ; e4ef5 (39:4ef5) +; ... + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap011 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneCloseGFX + ld de, vTiles1 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + ld hl, IntroTilemap012 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette4 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette4 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene18: ; e4f67 (39:4f67) +; Suicune close up. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $60 + jr nc, .done + ld a, [hSCX] + cp $60 + ret z + add 8 + ld [hSCX], a + ret +.done + call NextIntroScene + ret + +IntroScene19: ; e4f7e (39:4f7e) +; More setup. + call Intro_ClearBGPals + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap013 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroSuicuneBackGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownsGFX + ld de, vTiles1 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld de, IntroGrass4GFX + ld hl, vTiles1 tile $7f + lb bc, BANK(IntroGrass4GFX), 1 + call Request2bpp + ld hl, IntroTilemap014 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + call Intro_LoadTilemap + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette5 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette5 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld a, $d8 + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + ld hl, wSpriteAnimDict + xor a + ld [hli], a + ld [hl], $7f + call Intro_SetCGBPalUpdate + depixel 12, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY + call _InitSpriteAnimStruct + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene20: ; e5019 (39:5019) +; Suicune running away. A bunch of Unown appear. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $98 + jr nc, .finished + cp $58 + ret nc + cp $40 + jr nc, .AppearUnown + cp $28 + ret nc + ld a, [hSCY] + inc a + ld [hSCY], a + ret + +.AppearUnown: + sub $18 + ld c, a + and $3 + cp $3 + ret nz + ld a, c + and $1c + srl a + srl a + ld [wIntroSceneTimer], a + xor a + call Intro_Scene20_AppearUnown + ret +; e5049 (39:5049) +; unused + ld a, c + and $1c + srl a + srl a + ld [wIntroSceneTimer], a + ld a, 1 + call Intro_Scene20_AppearUnown + ret + +.finished + call NextIntroScene + ret + +IntroScene21: ; e505d (39:505d) +; Suicune gets more distant and turns black. + call Intro_ColoredSuicuneFrameSwap + ld c, 3 + call DelayFrames + xor a + ld [hBGMapMode], a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene22: ; e5072 (39:5072) + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $8 + jr nc, .done + ret +.done + farcall DeinitializeAllSprites + call NextIntroScene + ret + +IntroScene23: ; e5086 (39:5086) + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene24: ; e508e (39:508e) +; Fade to white. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $20 + jr nc, .done + + ld c, a + and $3 + ret nz + + ld a, c + and $1c + sla a + call Intro_Scene24_ApplyPaletteFade + ret + +.done + ld a, $40 + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene25: ; e50ad (39:50ad) +; Wait around a bit. + ld a, [wIntroSceneFrameCounter] + dec a + jr z, .done + ld [wIntroSceneFrameCounter], a + ret + +.done + call NextIntroScene + ret + +IntroScene26: ; e50bb (39:50bb) +; Load the final scene. + call ClearBGPalettes + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld a, $1 + ld [rVBK], a + ld hl, IntroTilemap015 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ld [rVBK], a + ld hl, IntroCrystalUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroTilemap017 + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + ld hl, IntroPalette3 + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroPalette3 + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ld [rSVBK], a + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene27: ; e512d (39:512d) +; Spell out C R Y S T A L with Unown. + ld hl, wIntroSceneTimer + inc [hl] + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .done + + ld c, a + and $f + ld [wIntroSceneTimer], a + ld a, c + and $70 + swap a + call Intro_FadeUnownWordPals + ret + +.done + call NextIntroScene + ld a, $80 + ld [wIntroSceneFrameCounter], a + ret + +IntroScene28: ; e5152 (39:5152) +; Cut out when the music ends, and lead into the title screen. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + cp $18 + jr z, .clear + cp $8 + ret nz + + ld de, SFX_UNKNOWN_CB + call PlaySFX + ret + +.clear + call ClearBGPalettes + ret + +.done + ld hl, wJumptableIndex + set 7, [hl] + ret + +Intro_Scene24_ApplyPaletteFade: ; e5172 (39:5172) +; load the (a)th palette from .FadePals to all wBGPals2 + ld hl, .FadePals + add l + ld l, a + ld a, $0 + adc h + ld h, a + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + ld de, wBGPals2 + ld b, 8 ; number of BG pals +.loop1 + push hl + ld c, 1 palettes +.loop2 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop2 + pop hl + dec b + jr nz, .loop1 + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret +; e519c (39:519c) + +.FadePals: ; e519c +INCLUDE "gfx/intro/fade.pal" +; e51dc + +CrystalIntro_InitUnownAnim: ; e51dc (39:51dc) + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $8 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_4 + call ReinitSpriteAnimFrame + pop de + + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $18 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_3 + call ReinitSpriteAnimFrame + pop de + + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $28 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1 + call ReinitSpriteAnimFrame + pop de + + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $38 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_2 + call ReinitSpriteAnimFrame + ret + +CrystalIntro_UnownFade: ; e5223 (39:5223) + add a + add a + add a + ld e, a + ld d, $0 + ld hl, wBGPals2 + add hl, de + inc hl + inc hl + ld a, [wIntroSceneTimer] + and %111111 + cp %011111 + jr z, .okay + jr c, .okay + ld c, a + ld a, %111111 + sub c +.okay + + ld c, a + ld b, $0 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + + push hl + push bc + ld hl, wBGPals2 + ld bc, 8 palettes + xor a + call ByteFill + pop bc + pop hl + + push hl + ld hl, .BWFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .BlackLBlueFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .BlackBlueFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret +; e5288 (39:5288) + +.BWFade: ; e5288 +; Fade between black and white. +hue = 0 +rept 32 + RGB hue, hue, hue +hue = hue + 1 +endr +; e52c8 + +.BlackLBlueFade: ; e52c8 +; Fade between black and light blue. +hue = 0 +rept 32 + RGB 0, hue / 2, hue +hue = hue + 1 +endr +; e5308 + +.BlackBlueFade: ; e5308 +; Fade between black and blue. +hue = 0 +rept 32 + RGB 0, 0, hue +hue = hue + 1 +endr +; e5348 + +Intro_Scene20_AppearUnown: ; e5348 (39:5348) +; Spawn the palette for the nth Unown + and a + jr nz, .load_pal_2 + + ld hl, .pal1 + jr .got_pointer + +.load_pal_2 + ld hl, .pal2 + +.got_pointer + ld a, [wIntroSceneTimer] + and $7 + add a + add a + add a + ld c, a + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + + push bc + ld de, wBGPals2 + + ld a, c + add e + ld e, a + ld a, $0 + adc d + ld d, a + + ld bc, 1 palettes + call CopyBytes + pop bc + + ld de, wBGPals1 + ld a, c + add e + ld e, a + ld a, $0 + adc d + ld d, a + + ld bc, 1 palettes + call CopyBytes + + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret +; e538d (39:538d) + +.pal1 ; e538d + RGB 24, 12, 09 + RGB 31, 31, 31 + RGB 12, 00, 31 + RGB 00, 00, 00 + +; e5395 + +.pal2 ; e5395 + RGB 24, 12, 09 + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 31, 31 + +; e539d + +Intro_FadeUnownWordPals: ; e539d (39:539d) + add a + add a + add a + ld e, a + ld d, $0 + ld hl, wBGPals2 + add hl, de +rept 4 + inc hl +endr + ld a, [wIntroSceneTimer] + add a + ld c, a + ld b, $0 + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + + push hl + ld hl, .FastFadePalettes + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .SlowFadePalettes + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + ret +; e53db (39:53db) + +.FastFadePalettes: ; e53db +hue = 31 +rept 8 + RGB hue, hue, hue +hue = hue + -1 + RGB hue, hue, hue +hue = hue + -2 +endr +; e53fb + +.SlowFadePalettes: ; e53fb +hue = 31 +rept 16 + RGB hue, hue, hue +hue = hue + -1 +endr +; e541b + +Intro_LoadTilemap: ; e541b (39:541b) + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + ld hl, wDecompressScratch + decoord 0, 0 + ld b, SCREEN_HEIGHT +.row + ld c, SCREEN_WIDTH +.col + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .col + ld a, BG_MAP_WIDTH - SCREEN_WIDTH + add l + ld l, a + ld a, 0 + adc h + ld h, a + dec b + jr nz, .row + + pop af + ld [rSVBK], a + ret + +Intro_Scene16_AnimateSuicune: ; e5441 (39:5441) + ld a, [wIntroSceneFrameCounter] + and $3 + jr z, Intro_ColoredSuicuneFrameSwap + cp $3 + jr z, .PrepareForSuicuneSwap + ret + +.PrepareForSuicuneSwap: + xor a + ld [hBGMapMode], a + ret + +Intro_ColoredSuicuneFrameSwap: ; e5451 (39:5451) + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH +.loop + ld a, [hl] + and a + jr z, .skip + cp $80 + jr nc, .skip + xor $8 + ld [hl], a +.skip + inc hl + dec bc + ld a, c + or b + jr nz, .loop + ld a, $1 + ld [hBGMapMode], a + ret + +Intro_RustleGrass: ; e546d (39:546d) + ld a, [wIntroSceneFrameCounter] + cp 36 + ret nc + and $c + srl a + ld e, a + ld d, $0 + ld hl, .RustlingGrassPointers + add hl, de + ld a, [hli] + ld [wRequested2bppSource], a + ld a, [hli] + ld [wRequested2bppSource + 1], a + ld a, LOW(vTiles2 tile $09) + ld [wRequested2bppDest], a + ld a, HIGH(vTiles2 tile $09) + ld [wRequested2bppDest + 1], a + ld a, 4 + ld [wRequested2bppSize], a + ret +; e5496 (39:5496) + +.RustlingGrassPointers: ; e5496 + dw IntroGrass1GFX + dw IntroGrass2GFX + dw IntroGrass3GFX + dw IntroGrass2GFX +; e549e + +Intro_SetCGBPalUpdate: ; e549e (39:549e) + ld a, $1 + ld [hCGBPalUpdate], a + ret + +Intro_ClearBGPals: ; e54a3 (39:54a3) + ld a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ld [rSVBK], a + + ld hl, wBGPals2 + ld bc, 16 palettes + xor a + call ByteFill + + pop af + ld [rSVBK], a + ld a, $1 + ld [hCGBPalUpdate], a + call DelayFrame + call DelayFrame + ret + +Intro_DecompressRequest2bpp_128Tiles: ; e54c2 (39:54c2) + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $80 + call Request2bpp + + pop af + ld [rSVBK], a + ret + +Intro_DecompressRequest2bpp_255Tiles: ; e54de (39:54de) + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $ff + call Request2bpp + + pop af + ld [rSVBK], a + ret + +Intro_DecompressRequest2bpp_64Tiles: ; e54fa (39:54fa) + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $40 + call Request2bpp + + pop af + ld [rSVBK], a + ret + +Intro_ResetLYOverrides: ; e5516 (39:5516) + ld a, [rSVBK] + push af + ld a, BANK(wLYOverrides) + ld [rSVBK], a + + ld hl, wLYOverrides + ld bc, wLYOverridesEnd - wLYOverrides + xor a + call ByteFill + + pop af + ld [rSVBK], a + ld a, rSCX - $ff00 + ld [hLCDCPointer], a + ret + +Intro_PerspectiveScrollBG: ; e552f (39:552f) + ld a, [rSVBK] + push af + ld a, BANK(wLYOverrides) + ld [rSVBK], a + ; Scroll the grass every frame. + ; Scroll the trees every other frame and at half speed. + ; This creates an illusion of perspective. + ld a, [wIntroSceneFrameCounter] + and $1 + jr z, .skip + ; trees in the back + ld hl, wLYOverrides + ld a, [hl] + inc a + ld bc, $5f + call ByteFill +.skip + ; grass in the front + ld hl, wLYOverrides + $5f + ld a, [hl] + inc a + inc a + ld bc, $31 + call ByteFill + ld a, [wLYOverrides + 0] + ld [hSCX], a + pop af + ld [rSVBK], a + ret + +IntroSuicuneRunGFX: ; e555d +INCBIN "gfx/intro/suicune_run.2bpp.lz" +; e592d + +IntroPichuWooperGFX: ; e592d +INCBIN "gfx/intro/pichu_wooper.2bpp.lz" +; e5c7d + +IntroBackgroundGFX: ; e5c7d +INCBIN "gfx/intro/background.2bpp.lz" +; e5e6d + +IntroTilemap004: ; e5e6d +INCBIN "gfx/intro/004.tilemap.lz" +; e5ecd + +IntroTilemap003: ; e5ecd +INCBIN "gfx/intro/003.tilemap.lz" +; e5edd + +IntroPalette1: ; e5edd +INCLUDE "gfx/intro/intro_1.pal" +; e5f5d + +IntroUnownsGFX: ; e5f5d +INCBIN "gfx/intro/unowns.2bpp.lz" +; e634d + +IntroPulseGFX: ; e634d +INCBIN "gfx/intro/pulse.2bpp.lz" +; e63dd + +IntroTilemap002: ; e63dd +INCBIN "gfx/intro/002.tilemap.lz" +; e641d + +IntroTilemap001: ; e641d +INCBIN "gfx/intro/001.tilemap.lz" +; e642d + +IntroTilemap006: ; e642d +INCBIN "gfx/intro/006.tilemap.lz" +; e647d + +IntroTilemap005: ; e647d +INCBIN "gfx/intro/005.tilemap.lz" +; e649d + +IntroTilemap008: ; e649d +INCBIN "gfx/intro/008.tilemap.lz" +; e655d + +IntroTilemap007: ; e655d +INCBIN "gfx/intro/007.tilemap.lz" +; e65ad + +IntroPalette2: ; e65ad +INCLUDE "gfx/intro/intro_2.pal" +; e662d + +IntroCrystalUnownsGFX: ; e662d +INCBIN "gfx/intro/crystal_unowns.2bpp.lz" +; e672d + +IntroTilemap017: ; e672d +INCBIN "gfx/intro/017.tilemap.lz" +; e676d + +IntroTilemap015: ; e676d +INCBIN "gfx/intro/015.tilemap.lz" +; e679d + +IntroPalette3: ; e679d +INCLUDE "gfx/intro/intro_3.pal" +; e681d + +IntroSuicuneCloseGFX: ; e681d +INCBIN "gfx/intro/suicune_close.2bpp.lz" +; e6c3d + +IntroTilemap012: ; e6c3d +INCBIN "gfx/intro/012.tilemap.lz" +; e6d0d + +IntroTilemap011: ; e6d0d +INCBIN "gfx/intro/011.tilemap.lz" +; e6d6d + +IntroPalette4: ; e6d6d +INCLUDE "gfx/intro/intro_4.pal" +; e6ded + +IntroSuicuneJumpGFX: ; e6ded +INCBIN "gfx/intro/suicune_jump.2bpp.lz" +; e72ad + +IntroSuicuneBackGFX: ; e72ad +INCBIN "gfx/intro/suicune_back.2bpp.lz" +; e764d + +IntroTilemap010: ; e764d +INCBIN "gfx/intro/010.tilemap.lz" +; e76ad + +IntroTilemap009: ; e76ad +INCBIN "gfx/intro/009.tilemap.lz" +; e76bd + +IntroTilemap014: ; e76bd +INCBIN "gfx/intro/014.tilemap.lz" +; e778d + +IntroTilemap013: ; e778d +INCBIN "gfx/intro/013.tilemap.lz" +; e77dd + +IntroPalette5: ; e77dd +INCLUDE "gfx/intro/intro_5.pal" + +IntroUnownBackGFX: ; e785d +INCBIN "gfx/intro/unown_back.2bpp.lz" +; e799d + +IntroGrass1GFX: ; e799d +INCBIN "gfx/intro/grass1.2bpp" +IntroGrass2GFX: ; e79dd +INCBIN "gfx/intro/grass2.2bpp" +IntroGrass3GFX: ; e7a1d +INCBIN "gfx/intro/grass3.2bpp" +IntroGrass4GFX: ; e7a5d +INCBIN "gfx/intro/grass4.2bpp" diff --git a/engine/movie/evolution_animation.asm b/engine/movie/evolution_animation.asm new file mode 100755 index 000000000..978f9e968 --- /dev/null +++ b/engine/movie/evolution_animation.asm @@ -0,0 +1,368 @@ +EvolutionAnimation: ; 4e5e1 + push hl + push de + push bc + ld a, [wCurSpecies] + push af + ld a, [rOBP0] + push af + ld a, [wBaseDexNo] + push af + + call .EvolutionAnimation + + pop af + ld [wBaseDexNo], a + pop af + ld [rOBP0], a + pop af + ld [wCurSpecies], a + pop bc + pop de + pop hl + + ld a, [wEvolutionCanceled] + and a + ret z + + scf + ret +; 4e607 + +.EvolutionAnimation: ; 4e607 + ld a, %11100100 + ld [rOBP0], a + + ld de, MUSIC_NONE + call PlayMusic + + farcall ClearSpriteAnims + + ld de, .GFX + ld hl, vTiles0 + lb bc, BANK(.GFX), 8 + call Request2bpp + + xor a + ld [wLowHealthAlarm], a + call WaitBGMap + xor a + ld [hBGMapMode], a + ld a, [wEvolutionOldSpecies] + ld [wPlayerHPPal], a + + ld c, $0 + call .GetSGBLayout + ld a, [wEvolutionOldSpecies] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call .PlaceFrontpic + + ld de, vTiles2 + ld hl, vTiles2 tile $31 + ld bc, 7 * 7 + call Request2bpp + + ld a, 7 * 7 + ld [wEvolutionPicOffset], a + call .ReplaceFrontpic + ld a, [wEvolutionNewSpecies] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call .LoadFrontpic + ld a, [wEvolutionOldSpecies] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + + ld a, $1 + ld [hBGMapMode], a + call .check_statused + jr c, .skip_cry + + ld a, [wEvolutionOldSpecies] + call PlayMonCry + +.skip_cry + ld de, MUSIC_EVOLUTION + call PlayMusic + + ld c, 80 + call DelayFrames + + ld c, $1 + call .GetSGBLayout + call .AnimationSequence + jr c, .cancel_evo + + ld a, -7 * 7 + ld [wEvolutionPicOffset], a + call .ReplaceFrontpic + xor a + ld [wEvolutionCanceled], a + + ld a, [wEvolutionNewSpecies] + ld [wPlayerHPPal], a + + ld c, $0 + call .GetSGBLayout + call .PlayEvolvedSFX + farcall ClearSpriteAnims + call .check_statused + jr c, .no_anim + + ld a, [wBoxAlignment] + push af + ld a, $1 + ld [wBoxAlignment], a + ld a, [wCurPartySpecies] + push af + + ld a, [wPlayerHPPal] + ld [wCurPartySpecies], a + hlcoord 7, 2 + ld d, $0 + ld e, ANIM_MON_EVOLVE + predef AnimateFrontpic + + pop af + ld [wCurPartySpecies], a + pop af + ld [wBoxAlignment], a + ret + +.no_anim + ret + +.cancel_evo + ld a, $1 + ld [wEvolutionCanceled], a + + ld a, [wEvolutionOldSpecies] + ld [wPlayerHPPal], a + + ld c, $0 + call .GetSGBLayout + call .PlayEvolvedSFX + farcall ClearSpriteAnims + call .check_statused + ret c + + ld a, [wPlayerHPPal] + call PlayMonCry + ret +; 4e703 + +.GetSGBLayout: ; 4e703 + ld b, SCGB_EVOLUTION + jp GetSGBLayout +; 4e708 + +.PlaceFrontpic: ; 4e708 + call GetBaseData + hlcoord 7, 2 + jp PrepMonFrontpic +; 4e711 + +.LoadFrontpic: ; 4e711 + call GetBaseData + ld a, $1 + ld [wBoxAlignment], a + ld de, vTiles2 + predef GetAnimatedFrontpic + xor a + ld [wBoxAlignment], a + ret +; 4e726 + +.AnimationSequence: ; 4e726 + call ClearJoypad + lb bc, 1, 2 * 7 ; flash b times, wait c frames in between +.loop + push bc + call .WaitFrames_CheckPressedB + pop bc + jr c, .exit_sequence + push bc + call .Flash + pop bc + inc b + dec c + dec c + jr nz, .loop + and a + ret + +.exit_sequence + scf + ret +; 4e741 + +.Flash: ; 4e741 + ld a, -7 * 7 ; new stage + ld [wEvolutionPicOffset], a + call .ReplaceFrontpic + ld a, 7 * 7 ; previous stage + ld [wEvolutionPicOffset], a + call .ReplaceFrontpic + dec b + jr nz, .Flash + ret +; 4e755 + +.ReplaceFrontpic: ; 4e755 + push bc + xor a + ld [hBGMapMode], a + hlcoord 7, 2 + lb bc, 7, 7 + ld de, SCREEN_WIDTH - 7 +.loop1 + push bc +.loop2 + ld a, [wEvolutionPicOffset] + add [hl] + ld [hli], a + dec c + jr nz, .loop2 + pop bc + add hl, de + dec b + jr nz, .loop1 + ld a, $1 + ld [hBGMapMode], a + call WaitBGMap + pop bc + ret +; 4e779 + +.WaitFrames_CheckPressedB: ; 4e779 + call DelayFrame + push bc + call JoyTextDelay + ld a, [hJoyDown] + pop bc + and B_BUTTON + jr nz, .pressed_b +.loop3 + dec c + jr nz, .WaitFrames_CheckPressedB + and a + ret + +.pressed_b + ld a, [wForceEvolution] + and a + jr nz, .loop3 + scf + ret +; 4e794 + +.check_statused ; 4e794 + ld a, [wCurPartyMon] + ld hl, wPartyMon1Species + call GetPartyLocation + ld b, h + ld c, l + farcall CheckFaintedFrzSlp + ret +; 4e7a6 + +.PlayEvolvedSFX: ; 4e7a6 + ld a, [wEvolutionCanceled] + and a + ret nz + ld de, SFX_EVOLVED + call PlaySFX + ld hl, wJumptableIndex + ld a, [hl] + push af + ld [hl], $0 +.loop4 + call .balls_of_light + jr nc, .done + call .AnimateBallsOfLight + jr .loop4 + +.done + ld c, 32 +.loop5 + call .AnimateBallsOfLight + dec c + jr nz, .loop5 + pop af + ld [wJumptableIndex], a + ret +; 4e7cf + +.balls_of_light ; 4e7cf + ld hl, wJumptableIndex + ld a, [hl] + cp 32 + ret nc + ld d, a + inc [hl] + and $1 + jr nz, .done_balls + ld e, $0 + call .GenerateBallOfLight + ld e, $10 + call .GenerateBallOfLight + +.done_balls + scf + ret +; 4e7e8 + +.GenerateBallOfLight: ; 4e7e8 + push de + depixel 9, 11 + ld a, SPRITE_ANIM_INDEX_EVOLUTION_BALL_OF_LIGHT + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [wJumptableIndex] + and %1110 + sla a + pop de + add e + ld [hl], a + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], $0 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $10 + ret +; 4e80c + +.AnimateBallsOfLight: ; 4e80c + push bc + callfar PlaySpriteAnimations + ; a = (([hVBlankCounter] + 4) / 2) % NUM_PALETTES + ld a, [hVBlankCounter] + and %1110 + srl a + inc a + inc a + and $7 + ld b, a + ld hl, wVirtualOAMSprite00Attributes + ld c, NUM_SPRITE_OAM_STRUCTS +.loop6 + ld a, [hl] + or b + ld [hli], a ; attributes +rept SPRITEOAMSTRUCT_LENGTH + -1 + inc hl +endr + dec c + jr nz, .loop6 + pop bc + call DelayFrame + ret +; 4e831 + + +.GFX: +INCBIN "gfx/evo/bubble_large.2bpp" +INCBIN "gfx/evo/bubble.2bpp" diff --git a/engine/movie/gbc_only.asm b/engine/movie/gbc_only.asm new file mode 100644 index 000000000..badd953aa --- /dev/null +++ b/engine/movie/gbc_only.asm @@ -0,0 +1,149 @@ +GBCOnlyScreen: ; 4ea82 + + ld a, [hCGB] + and a + ret nz + + ld de, MUSIC_NONE + call PlayMusic + + call ClearTileMap + + ld hl, GBCOnlyGFX + ld de, wGBCOnlyDecompressBuffer + ld a, [rSVBK] + push af + ld a, 0 ; this has the same effect as selecting bank 1 + ld [rSVBK], a + call Decompress + pop af + ld [rSVBK], a + + ld de, wGBCOnlyDecompressBuffer + ld hl, vTiles2 + lb bc, BANK(GBCOnlyGFX), 84 + call Get2bpp + + ld de, Font + ld hl, vTiles1 + lb bc, BANK(Font), $80 + call Get1bpp + + call DrawGBCOnlyScreen + + call WaitBGMap + +; better luck next time +.loop + call DelayFrame + jr .loop +; 4eac5 + + +DrawGBCOnlyScreen: ; 4eac5 + + call DrawGBCOnlyBorder + + ; Pokemon + hlcoord 3, 2 + ld b, 14 + ld c, 4 + ld a, $8 + call DrawGBCOnlyGraphic + + ; Crystal + hlcoord 5, 6 + ld b, 10 + ld c, 2 + ld a, $40 + call DrawGBCOnlyGraphic + + ld de, GBCOnlyString + hlcoord 1, 10 + call PlaceString + + ret +; 4eaea + + +DrawGBCOnlyBorder: ; 4eaea + + hlcoord 0, 0 + ld [hl], 0 ; top-left + + inc hl + ld a, 1 ; top + call .FillRow + + ld [hl], 2 ; top-right + + hlcoord 0, 1 + ld a, 3 ; left + call .FillColumn + + hlcoord 19, 1 + ld a, 4 ; right + call .FillColumn + + hlcoord 0, 17 + ld [hl], 5 ; bottom-left + + inc hl + ld a, 6 ; bottom + call .FillRow + + ld [hl], 7 ; bottom-right + ret +; 4eb15 + +.FillRow: ; 4eb15 + ld c, SCREEN_WIDTH - 2 +.next_column + ld [hli], a + dec c + jr nz, .next_column + ret +; 4eb1c + +.FillColumn: ; 4eb1c + ld de, SCREEN_WIDTH + ld c, SCREEN_HEIGHT - 2 +.next_row + ld [hl], a + add hl, de + dec c + jr nz, .next_row + ret +; 4eb27 + + +DrawGBCOnlyGraphic: ; 4eb27 + ld de, SCREEN_WIDTH +.y + push bc + push hl +.x + ld [hli], a + inc a + dec b + jr nz, .x + pop hl + add hl, de + pop bc + dec c + jr nz, .y + ret +; 4eb38 + + +GBCOnlyString: ; 4eb38 + db "This Game Pak is" + next "designed only for" + next "use on the" + next "Game Boy Color.@" +; 4eb76 + + +GBCOnlyGFX: ; 4eb76 +INCBIN "gfx/sgb/gbc_only.2bpp.lz" +; 4f0bc diff --git a/engine/movie/init_hof_credits.asm b/engine/movie/init_hof_credits.asm new file mode 100644 index 000000000..e8e98a0e1 --- /dev/null +++ b/engine/movie/init_hof_credits.asm @@ -0,0 +1,79 @@ +InitDisplayForHallOfFame: ; 4e881 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + call LoadStandardFont + call LoadFontsBattleExtra + hlbgcoord 0, 0 + ld bc, vBGMap1 - vBGMap0 + ld a, " " + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + xor a + ld [hSCY], a + ld [hSCX], a + call EnableLCD + ld hl, .SavingRecordDontTurnOff + call PrintText + call WaitBGMap2 + call SetPalettes + ret + +.SavingRecordDontTurnOff: ; 0x4e8bd + ; SAVING RECORD… DON'T TURN OFF! + text_jump UnknownText_0x1bd39e + db "@" + +InitDisplayForRedCredits: ; 4e8c2 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + call LoadStandardFont + call LoadFontsBattleExtra + hlbgcoord 0, 0 + ld bc, vBGMap1 - vBGMap0 + ld a, " " + call ByteFill + hlcoord 0, 0, wAttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + ld hl, wBGPals1 + ld c, 4 tiles +.load_white_palettes + ld a, LOW(PALRGB_WHITE) + ld [hli], a + ld a, HIGH(PALRGB_WHITE) + ld [hli], a + dec c + jr nz, .load_white_palettes + xor a + ld [hSCY], a + ld [hSCX], a + call EnableLCD + call WaitBGMap2 + call SetPalettes + ret + +ResetDisplayBetweenHallOfFameMons: ; 4e906 + ld a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ld [rSVBK], a + ld hl, wDecompressScratch + ld bc, wScratchAttrMap - wDecompressScratch + ld a, " " + call ByteFill + hlbgcoord 0, 0 + ld de, wDecompressScratch + ld b, 0 + ld c, 4 tiles + call Request2bpp + pop af + ld [rSVBK], a + ret diff --git a/engine/movie/title.asm b/engine/movie/title.asm new file mode 100644 index 000000000..f311f2342 --- /dev/null +++ b/engine/movie/title.asm @@ -0,0 +1,402 @@ +_TitleScreen: ; 10ed67 + + call ClearBGPalettes + call ClearSprites + call ClearTileMap + +; Turn BG Map update off + xor a + ld [hBGMapMode], a + +; Reset timing variables + ld hl, wJumptableIndex + ld [hli], a ; wJumptableIndex + ld [hli], a ; wIntroSceneFrameCounter + ld [hli], a ; wTitleScreenTimer + ld [hl], a ; wTitleScreenTimer + 1 + +; Turn LCD off + call DisableLCD + + +; VRAM bank 1 + ld a, 1 + ld [rVBK], a + + +; Decompress running Suicune gfx + ld hl, TitleSuicuneGFX + ld de, vTiles1 + call Decompress + + +; Clear screen palettes + hlbgcoord 0, 0 + ld bc, 20 * BG_MAP_WIDTH + xor a + call ByteFill + + +; Fill tile palettes: + +; BG Map 1: + +; line 0 (copyright) + hlbgcoord 0, 0, vBGMap1 + ld bc, BG_MAP_WIDTH + ld a, 7 ; palette + call ByteFill + + +; BG Map 0: + +; Apply logo gradient: + +; lines 3-4 + hlbgcoord 0, 3 + ld bc, 2 * BG_MAP_WIDTH + ld a, 2 + call ByteFill +; line 5 + hlbgcoord 0, 5 + ld bc, BG_MAP_WIDTH + ld a, 3 + call ByteFill +; line 6 + hlbgcoord 0, 6 + ld bc, BG_MAP_WIDTH + ld a, 4 + call ByteFill +; line 7 + hlbgcoord 0, 7 + ld bc, BG_MAP_WIDTH + ld a, 5 + call ByteFill +; lines 8-9 + hlbgcoord 0, 8 + ld bc, 2 * BG_MAP_WIDTH + ld a, 6 + call ByteFill + + +; 'CRYSTAL VERSION' + hlbgcoord 5, 9 + ld bc, NAME_LENGTH ; length of version text + ld a, 1 + call ByteFill + +; Suicune gfx + hlbgcoord 0, 12 + ld bc, 6 * BG_MAP_WIDTH ; the rest of the screen + ld a, 0 | VRAM_BANK_1 + call ByteFill + + +; Back to VRAM bank 0 + ld a, $0 + ld [rVBK], a + + +; Decompress logo + ld hl, TitleLogoGFX + ld de, vTiles1 + call Decompress + +; Decompress background crystal + ld hl, TitleCrystalGFX + ld de, vTiles0 + call Decompress + + +; Clear screen tiles + hlbgcoord 0, 0 + ld bc, 64 * BG_MAP_WIDTH + ld a, " " + call ByteFill + +; Draw Pokemon logo + hlcoord 0, 3 + lb bc, 7, 20 + ld d, $80 + ld e, $14 + call DrawTitleGraphic + +; Draw copyright text + hlbgcoord 3, 0, vBGMap1 + lb bc, 1, 13 + ld d, $c + ld e, $10 + call DrawTitleGraphic + +; Initialize running Suicune? + ld d, $0 + call LoadSuicuneFrame + +; Initialize background crystal + call InitializeBackground + +; Save WRAM bank + ld a, [rSVBK] + push af +; WRAM bank 5 + ld a, BANK(wBGPals1) + ld [rSVBK], a + +; Update palette colors + ld hl, TitleScreenPalettes + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + + ld hl, TitleScreenPalettes + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + +; Restore WRAM bank + pop af + ld [rSVBK], a + + +; LY/SCX trickery starts here + + ld a, [rSVBK] + push af + ld a, BANK(wLYOverrides) + ld [rSVBK], a + +; Make alternating lines come in from opposite sides + +; (This part is actually totally pointless, you can't +; see anything until these values are overwritten!) + + ld b, 80 / 2 ; alternate for 80 lines + ld hl, wLYOverrides +.loop +; $00 is the middle position + ld [hl], +112 ; coming from the left + inc hl + ld [hl], -112 ; coming from the right + inc hl + dec b + jr nz, .loop + +; Make sure the rest of the buffer is empty + ld hl, wLYOverrides + 80 + xor a + ld bc, wLYOverridesEnd - (wLYOverrides + 80) + call ByteFill + +; Let LCD Stat know we're messing around with SCX + ld a, rSCX - $ff00 + ld [hLCDCPointer], a + + pop af + ld [rSVBK], a + + +; Reset audio + call ChannelsOff + call EnableLCD + +; Set sprite size to 8x16 + ld a, [rLCDC] + set rLCDC_SPRITE_SIZE, a + ld [rLCDC], a + + ld a, +112 + ld [hSCX], a + ld a, 8 + ld [hSCY], a + ld a, 7 + ld [hWX], a + ld a, -112 + ld [hWY], a + + ld a, $1 + ld [hCGBPalUpdate], a + +; Update BG Map 0 (bank 0) + ld [hBGMapMode], a + + xor a + ld [wBGPals1 + 2], a + +; Play starting sound effect + call SFXChannelsOff + ld de, SFX_TITLE_SCREEN_ENTRANCE + call PlaySFX + + ret +; 10eea7 + +SuicuneFrameIterator: ; 10eea7 + ld hl, wBGPals1 + 2 + ld a, [hl] + ld c, a + inc [hl] + +; Only do this once every eight frames + and %111 + ret nz + + ld a, c + and %11000 + sla a + swap a + ld e, a + ld d, $0 + ld hl, .Frames + add hl, de + ld d, [hl] + xor a + ld [hBGMapMode], a + call LoadSuicuneFrame + ld a, $1 + ld [hBGMapMode], a + ld a, $3 + ld [hBGMapThird], a + ret +; 10eece + +.Frames: ; 10eece + db $80 ; vTiles4 tile $00 + db $88 ; vTiles4 tile $08 + db $00 ; vTiles5 tile $00 + db $08 ; vTiles5 tile $08 +; 10eed2 + + +LoadSuicuneFrame: ; 10eed2 + hlcoord 6, 12 + ld b, 6 +.bgrows + ld c, 8 +.col + ld a, d + ld [hli], a + inc d + dec c + jr nz, .col + ld a, SCREEN_WIDTH - 8 + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, 8 + add d + ld d, a + dec b + jr nz, .bgrows + ret +; 10eeef + +DrawTitleGraphic: ; 10eeef +; input: +; hl: draw location +; b: height +; c: width +; d: tile to start drawing from +; e: number of tiles to advance for each bgrows +.bgrows + push de + push bc + push hl +.col + ld a, d + ld [hli], a + inc d + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + pop de + ld a, e + add d + ld d, a + dec b + jr nz, .bgrows + ret +; 10ef06 + +InitializeBackground: ; 10ef06 + ld hl, wVirtualOAMSprite00 + ld d, -$22 + ld e, $0 + ld c, 5 +.loop + push bc + call .InitColumn + pop bc + ld a, $10 + add d + ld d, a + dec c + jr nz, .loop + ret +; 10ef1c + +.InitColumn: ; 10ef1c + ld c, $6 + ld b, $40 +.loop2 + ld a, d + ld [hli], a ; y + ld a, b + ld [hli], a ; x + add $8 + ld b, a + ld a, e + ld [hli], a ; tile id + inc e + inc e + ld a, 0 | PRIORITY + ld [hli], a ; attributes + dec c + jr nz, .loop2 + ret +; 10ef32 + + +AnimateTitleCrystal: ; 10ef32 +; Move the title screen crystal downward until it's fully visible + +; Stop at y=6 +; y is really from the bottom of the sprite, which is two tiles high + ld hl, wVirtualOAMSprite00YCoord + ld a, [hl] + cp 6 + 2 * TILE_WIDTH + ret z + +; Move all 30 parts of the crystal down by 2 + ld c, 30 +.loop + ld a, [hl] + add 2 + ld [hli], a ; y +rept SPRITEOAMSTRUCT_LENGTH + -1 + inc hl +endr + dec c + jr nz, .loop + + ret +; 10ef46 + +TitleSuicuneGFX: ; 10ef46 +INCBIN "gfx/title/suicune.2bpp.lz" +; 10f326 + +TitleLogoGFX: ; 10f326 +INCBIN "gfx/title/logo.2bpp.lz" +; 10fcee + +TitleCrystalGFX: ; 10fcee +INCBIN "gfx/title/crystal.2bpp.lz" +; 10fede + +TitleScreenPalettes: +INCLUDE "gfx/title/title.pal" diff --git a/engine/movie/trade_animation.asm b/engine/movie/trade_animation.asm new file mode 100755 index 000000000..04c31df80 --- /dev/null +++ b/engine/movie/trade_animation.asm @@ -0,0 +1,1646 @@ +TRADEANIM_RIGHT_ARROW EQU $ed +TRADEANIM_LEFT_ARROW EQU $ee + +; TradeAnim_TubeAnimJumptable.Jumptable indexes + const_def + const TRADEANIMSTATE_0 ; 0 + const TRADEANIMSTATE_1 ; 1 + const TRADEANIMSTATE_2 ; 2 + const TRADEANIMSTATE_3 ; 3 +TRADEANIMJUMPTABLE_LENGTH EQU const_value + +TradeAnimation: ; 28f24 + xor a + ld [wcf66], a + ld hl, wPlayerTrademonSenderName + ld de, wOTTrademonSenderName + call LinkTradeAnim_LoadTradePlayerNames + ld hl, wPlayerTrademonSpecies + ld de, wOTTrademonSpecies + call LinkTradeAnim_LoadTradeMonSpecies + ld de, .script + jr RunTradeAnimScript + +.script + tradeanim_setup_givemon_scroll + tradeanim_show_givemon_data + tradeanim_do_givemon_scroll + tradeanim_wait_80 + tradeanim_wait_96 + tradeanim_poof + tradeanim_rocking_ball + tradeanim_enter_link_tube + tradeanim_wait_anim + tradeanim_bulge_through_tube + tradeanim_wait_anim + tradeanim_textbox_scroll + tradeanim_give_trademon_sfx + tradeanim_tube_to_ot + tradeanim_sent_to_ot_text + tradeanim_scroll_out_right + + tradeanim_ot_sends_text_1 + tradeanim_ot_bids_farewell + tradeanim_wait_40 + tradeanim_scroll_out_right + tradeanim_get_trademon_sfx + tradeanim_tube_to_player + tradeanim_enter_link_tube + tradeanim_drop_ball + tradeanim_exit_link_tube + tradeanim_wait_anim + tradeanim_show_getmon_data + tradeanim_poof + tradeanim_wait_anim + tradeanim_frontpic_scroll + tradeanim_animate_frontpic + tradeanim_wait_80_if_ot_egg + tradeanim_textbox_scroll + tradeanim_take_care_of_text + tradeanim_scroll_out_right + tradeanim_end + +TradeAnimationPlayer2: ; 28f63 + xor a + ld [wcf66], a + ld hl, wOTTrademonSenderName + ld de, wPlayerTrademonSenderName + call LinkTradeAnim_LoadTradePlayerNames + ld hl, wOTTrademonSpecies + ld de, wPlayerTrademonSpecies + call LinkTradeAnim_LoadTradeMonSpecies + ld de, .script + jr RunTradeAnimScript + +.script + tradeanim_ot_sends_text_2 + tradeanim_ot_bids_farewell + tradeanim_wait_40 + tradeanim_scroll_out_right + tradeanim_get_trademon_sfx + tradeanim_tube_to_ot + tradeanim_enter_link_tube + tradeanim_drop_ball + tradeanim_exit_link_tube + tradeanim_wait_anim + tradeanim_show_getmon_data + tradeanim_poof + tradeanim_wait_anim + tradeanim_frontpic_scroll + tradeanim_animate_frontpic + tradeanim_wait_180_if_ot_egg + tradeanim_textbox_scroll + tradeanim_take_care_of_text + tradeanim_scroll_out_right + + tradeanim_setup_givemon_scroll + tradeanim_show_givemon_data + tradeanim_do_givemon_scroll + tradeanim_wait_40 + tradeanim_poof + tradeanim_rocking_ball + tradeanim_enter_link_tube + tradeanim_wait_anim + tradeanim_bulge_through_tube + tradeanim_wait_anim + tradeanim_textbox_scroll + tradeanim_give_trademon_sfx + tradeanim_tube_to_player + tradeanim_sent_to_ot_text + tradeanim_scroll_out_right + tradeanim_end + +RunTradeAnimScript: ; 28fa1 + ld hl, wTradeAnimAddress + ld [hl], e + inc hl + ld [hl], d + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a + ld hl, wVramState + ld a, [hl] + push af + res 0, [hl] + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + call .TradeAnimLayout + ld a, [wcf66] + and a + jr nz, .anim_loop + ld de, MUSIC_EVOLUTION + call PlayMusic2 +.anim_loop + call DoTradeAnimation + jr nc, .anim_loop + pop af + ld [wOptions], a + pop af + ld [wVramState], a + pop af + ld [hMapAnims], a + ret + +; 28fdb + +.TradeAnimLayout: ; 28fdb + xor a + ld [wJumptableIndex], a + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call DisableLCD + call LoadFontsBattleExtra + callfar ClearSpriteAnims + ld a, [hCGB] + and a + jr z, .NotCGB + ld a, $1 + ld [rVBK], a + ld hl, vTiles0 + ld bc, sScratch - vTiles0 + xor a + call ByteFill + ld a, $0 + ld [rVBK], a + +.NotCGB: + hlbgcoord 0, 0 + ld bc, sScratch - vBGMap0 + ld a, " " + call ByteFill + ld hl, TradeGameBoyLZ + ld de, vTiles2 tile $31 + call Decompress + ld hl, TradeArrowGFX + ld de, vTiles0 tile TRADEANIM_RIGHT_ARROW + ld bc, 1 tiles + ld a, BANK(TradeArrowGFX) + call FarCopyBytes + ld hl, TradeArrowGFX + 1 tiles + ld de, vTiles0 tile TRADEANIM_LEFT_ARROW + ld bc, 1 tiles + ld a, BANK(TradeArrowGFX) + call FarCopyBytes + xor a + ld [hSCX], a + ld [hSCY], a + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + farcall GetTrademonFrontpic + call EnableLCD + call LoadTradeBallAndCableGFX + ld a, [wPlayerTrademonSpecies] + ld hl, wPlayerTrademonDVs + ld de, vTiles0 + call TradeAnim_GetFrontpic + ld a, [wOTTrademonSpecies] + ld hl, wOTTrademonDVs + ld de, vTiles0 tile $31 + call TradeAnim_GetFrontpic + ld a, [wPlayerTrademonSpecies] + ld de, wPlayerTrademonSpeciesName + call TradeAnim_GetNickname + ld a, [wOTTrademonSpecies] + ld de, wOTTrademonSpeciesName + call TradeAnim_GetNickname + call TradeAnim_NormalPals + ret + +; 29082 + +DoTradeAnimation: ; 29082 + ld a, [wJumptableIndex] + bit 7, a + jr nz, .finished + call .DoTradeAnimCommand + callfar PlaySpriteAnimations + ld hl, wcf65 + inc [hl] + call DelayFrame + and a + ret + +.finished + call LoadStandardFont + scf + ret + +; 290a0 + +.DoTradeAnimCommand: ; 290a0 + 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 +; 290af + +.JumpTable: ; 290af +; entries correspond to macros/scripts/trade_anims.asm enumeration + dw TradeAnim_AdvanceScriptPointer ; 00 + dw TradeAnim_ShowGivemonData ; 01 + dw TradeAnim_ShowGetmonData ; 02 + dw TradeAnim_EnterLinkTube1 ; 03 + dw TradeAnim_EnterLinkTube2 ; 04 + dw TradeAnim_ExitLinkTube ; 05 + dw TradeAnim_TubeToOT1 ; 06 + dw TradeAnim_TubeToOT2 ; 07 + dw TradeAnim_TubeToOT3 ; 08 + dw TradeAnim_TubeToOT4 ; 09 + dw TradeAnim_TubeToOT5 ; 0a + dw TradeAnim_TubeToOT6 ; 0b + dw TradeAnim_TubeToOT7 ; 0c + dw TradeAnim_TubeToOT8 ; 0d + dw TradeAnim_TubeToPlayer1 ; 0e + dw TradeAnim_TubeToPlayer2 ; 0f + dw TradeAnim_TubeToPlayer3 ; 10 + dw TradeAnim_TubeToPlayer4 ; 11 + dw TradeAnim_TubeToPlayer5 ; 12 + dw TradeAnim_TubeToPlayer6 ; 13 + dw TradeAnim_TubeToPlayer7 ; 14 + dw TradeAnim_TubeToPlayer8 ; 15 + dw TradeAnim_SentToOTText ; 16 + dw TradeAnim_OTBidsFarewell ; 17 + dw TradeAnim_TakeCareOfText ; 18 + dw TradeAnim_OTSendsText1 ; 19 + dw TradeAnim_OTSendsText2 ; 1a + dw TradeAnim_SetupGivemonScroll ; 1b + dw TradeAnim_DoGivemonScroll ; 1c + dw TradeAnim_FrontpicScrollStart ; 1d + dw TradeAnim_TextboxScrollStart ; 1e + dw TradeAnim_ScrollOutRight ; 1f + dw TradeAnim_ScrollOutRight2 ; 20 + dw TraideAnim_Wait80 ; 21 + dw TraideAnim_Wait40 ; 22 + dw TradeAnim_RockingBall ; 23 + dw TradeAnim_DropBall ; 24 + dw TradeAnim_WaitAnim ; 25 + dw TradeAnim_WaitAnim2 ; 26 + dw TradeAnim_Poof ; 27 + dw TradeAnim_BulgeThroughTube ; 28 + dw TradeAnim_GiveTrademonSFX ; 29 + dw TradeAnim_GetTrademonSFX ; 2a + dw TradeAnim_End ; 2b + dw TradeAnim_AnimateFrontpic ; 2c + dw TraideAnim_Wait96 ; 2d + dw TraideAnim_Wait80IfOTEgg ; 2e + dw TraideAnim_Wait180IfOTEgg ; 2f +; 2910f + +TradeAnim_IncrementJumptableIndex: ; 2910f + ld hl, wJumptableIndex + inc [hl] + ret + +; 29114 + +TradeAnim_AdvanceScriptPointer: ; 29114 + ld hl, wTradeAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + ld a, [de] + ld [wJumptableIndex], a + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +; 29123 + +TradeAnim_End: ; 29123 + ld hl, wJumptableIndex + set 7, [hl] + ret + +; 29129 + +TradeAnim_TubeToOT1: ; 29129 + ld a, TRADEANIM_RIGHT_ARROW + call TradeAnim_PlaceTrademonStatsOnTubeAnim + ld a, [wLinkTradeSendmonSpecies] + ld [wd265], a + xor a + depixel 5, 11, 4, 0 + ld b, $0 + jr TradeAnim_InitTubeAnim + +TradeAnim_TubeToPlayer1: ; 2913c + ld a, TRADEANIM_LEFT_ARROW + call TradeAnim_PlaceTrademonStatsOnTubeAnim + ld a, [wLinkTradeGetmonSpecies] + ld [wd265], a + ld a, TRADEANIMSTATE_2 + depixel 9, 18, 4, 4 + ld b, $4 +TradeAnim_InitTubeAnim: ; 2914e + push bc + push de + push bc + push de + + push af + call DisableLCD + callfar ClearSpriteAnims + hlbgcoord 20, 3 + ld bc, 12 + ld a, $60 + call ByteFill + pop af + + call TradeAnim_TubeAnimJumptable + + xor a + ld [hSCX], a + ld a, $7 + ld [hWX], a + ld a, $70 + ld [hWY], a + call EnableLCD + call LoadTradeBubbleGFX + + pop de + ld a, SPRITE_ANIM_INDEX_TRADEMON_ICON + call _InitSpriteAnimStruct + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + pop bc + ld [hl], b + + pop de + ld a, SPRITE_ANIM_INDEX_TRADEMON_BUBBLE + call _InitSpriteAnimStruct + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + pop bc + ld [hl], b + + call WaitBGMap + ld b, SCGB_TRADE_TUBE + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + ld a, %11010000 + call DmgToCgbObjPal0 + + call TradeAnim_IncrementJumptableIndex + ld a, 92 + ld [wFrameCounter], a + ret + +; 291af + +TradeAnim_TubeToOT2: ; 291af + call TradeAnim_FlashBGPals + ld a, [hSCX] + add $2 + ld [hSCX], a + cp $50 + ret nz + ld a, TRADEANIMSTATE_1 + call TradeAnim_TubeAnimJumptable + call TradeAnim_IncrementJumptableIndex + ret + +; 291c4 + +TradeAnim_TubeToOT3: ; 291c4 + call TradeAnim_FlashBGPals + ld a, [hSCX] + add $2 + ld [hSCX], a + cp $a0 + ret nz + ld a, TRADEANIMSTATE_2 + call TradeAnim_TubeAnimJumptable + call TradeAnim_IncrementJumptableIndex + ret + +; 291d9 + +TradeAnim_TubeToOT4: ; 291d9 + call TradeAnim_FlashBGPals + ld a, [hSCX] + add $2 + ld [hSCX], a + and a + ret nz + call TradeAnim_IncrementJumptableIndex + ret + +; 291e8 + +TradeAnim_TubeToPlayer3: ; 291e8 + call TradeAnim_FlashBGPals + ld a, [hSCX] + sub $2 + ld [hSCX], a + cp $b0 + ret nz + ld a, TRADEANIMSTATE_1 + call TradeAnim_TubeAnimJumptable + call TradeAnim_IncrementJumptableIndex + ret + +; 291fd + +TradeAnim_TubeToPlayer4: ; 291fd + call TradeAnim_FlashBGPals + ld a, [hSCX] + sub $2 + ld [hSCX], a + cp $60 + ret nz + xor a ; TRADEANIMSTATE_0 + call TradeAnim_TubeAnimJumptable + call TradeAnim_IncrementJumptableIndex + ret + +; 29211 + +TradeAnim_TubeToPlayer5: ; 29211 + call TradeAnim_FlashBGPals + ld a, [hSCX] + sub $2 + ld [hSCX], a + and a + ret nz + call TradeAnim_IncrementJumptableIndex + ret + +; 29220 + +TradeAnim_TubeToOT6: +TradeAnim_TubeToPlayer6: ; 29220 + ld a, 128 + ld [wFrameCounter], a + call TradeAnim_IncrementJumptableIndex + ret + +; 29229 + +TradeAnim_TubeToOT8: +TradeAnim_TubeToPlayer8: ; 29229 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + callfar ClearSpriteAnims + hlbgcoord 0, 0 + ld bc, sScratch - vBGMap0 + ld a, " " + call ByteFill + xor a + ld [hSCX], a + ld a, $90 + ld [hWY], a + call EnableLCD + call LoadTradeBallAndCableGFX + call WaitBGMap + call TradeAnim_NormalPals + call TradeAnim_AdvanceScriptPointer + ret + +; 2925d + +TradeAnim_TubeToOT5: +TradeAnim_TubeToOT7: +TradeAnim_TubeToPlayer2: +TradeAnim_TubeToPlayer7: ; 2925d + call TradeAnim_FlashBGPals + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + ret + +.done + call TradeAnim_IncrementJumptableIndex + ret + +; 2926d + +TradeAnim_GiveTrademonSFX: ; 2926d + call TradeAnim_AdvanceScriptPointer + ld de, SFX_GIVE_TRADEMON + call PlaySFX + ret + +; 29277 + +TradeAnim_GetTrademonSFX: ; 29277 + call TradeAnim_AdvanceScriptPointer + ld de, SFX_GET_TRADEMON + call PlaySFX + ret + +; 29281 + +TradeAnim_TubeAnimJumptable: ; 29281 + maskbits TRADEANIMJUMPTABLE_LENGTH + 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 +; 2928f + +.Jumptable: ; 2928f +; entries correspond to TRADEANIMSTATE_* constants + dw .Zero + dw .One + dw .Two + dw .Three +; 29297 + +.Zero: ; 29297 +.Three: ; 29297 + call TradeAnim_BlankTileMap + hlcoord 9, 3 + ld [hl], $5b + inc hl + ld bc, 10 + ld a, $60 + call ByteFill + hlcoord 3, 2 + call TradeAnim_CopyTradeGameBoyTilemap + ret + +; 292af + +.One: ; 292af + call TradeAnim_BlankTileMap + hlcoord 0, 3 + ld bc, SCREEN_WIDTH + ld a, $60 + call ByteFill + ret + +; 292be + +.Two: ; 292be + call TradeAnim_BlankTileMap + hlcoord 0, 3 + ld bc, $11 + ld a, $60 + call ByteFill + hlcoord 17, 3 + ld a, $5d + ld [hl], a + + ld a, $61 + ld de, SCREEN_WIDTH + ld c, $3 +.loop + add hl, de + ld [hl], a + dec c + jr nz, .loop + + add hl, de + ld a, $5f + ld [hld], a + ld a, $5b + ld [hl], a + hlcoord 10, 6 + call TradeAnim_CopyTradeGameBoyTilemap + ret + +; 292ec + +TradeAnim_CopyTradeGameBoyTilemap: ; 292ec + ld de, TradeGameBoyTilemap + lb bc, 8, 6 + call TradeAnim_CopyBoxFromDEtoHL + ret + +; 292f6 + +TradeAnim_PlaceTrademonStatsOnTubeAnim: ; 292f6 + push af + call ClearBGPalettes + call WaitTop + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + call ClearTileMap + hlcoord 0, 0 + ld bc, SCREEN_WIDTH + ld a, "─" + call ByteFill + hlcoord 0, 1 + ld de, wLinkPlayer1Name + call PlaceString + ld hl, wLinkPlayer2Name + ld de, 0 +.find_name_end_loop + ld a, [hli] + cp "@" + jr z, .done + dec de + jr .find_name_end_loop + +.done + hlcoord 0, 4 + add hl, de + ld de, wLinkPlayer2Name + call PlaceString + hlcoord 7, 2 + ld bc, 6 + pop af + call ByteFill + call WaitBGMap + call WaitTop + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + call ClearTileMap + ret + +; 29348 + +TradeAnim_EnterLinkTube1: ; 29348 + call ClearTileMap + call WaitTop + ld a, $a0 + ld [hSCX], a + call DelayFrame + hlcoord 8, 2 + ld de, TradeLinkTubeTilemap + lb bc, 3, 12 + call TradeAnim_CopyBoxFromDEtoHL + call WaitBGMap + ld b, SCGB_TRADE_TUBE + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + lb de, %11100100, %11100100 ; 3,2,1,0, 3,2,1,0 + call DmgToCgbObjPals + ld de, SFX_POTION + call PlaySFX + call TradeAnim_IncrementJumptableIndex + ret + +; 2937e + +TradeAnim_EnterLinkTube2: ; 2937e + ld a, [hSCX] + and a + jr z, .done + add $4 + ld [hSCX], a + ret + +.done + ld c, 80 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 29391 + +TradeAnim_ExitLinkTube: ; 29391 + ld a, [hSCX] + cp $a0 + jr z, .done + sub $4 + ld [hSCX], a + ret + +.done + call ClearTileMap + xor a + ld [hSCX], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293a6 + +TradeAnim_SetupGivemonScroll: ; 293a6 + ld a, $8f + ld [hWX], a + ld a, $88 + ld [hSCX], a + ld a, $50 + ld [hWY], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293b6 + +TradeAnim_DoGivemonScroll: ; 293b6 + ld a, [hWX] + cp $7 + jr z, .done + sub $4 + ld [hWX], a + ld a, [hSCX] + sub $4 + ld [hSCX], a + ret + +.done + ld a, $7 + ld [hWX], a + xor a + ld [hSCX], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293d2 + +TradeAnim_FrontpicScrollStart: ; 293d2 + ld a, $7 + ld [hWX], a + ld a, $50 + ld [hWY], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293de + +TradeAnim_TextboxScrollStart: ; 293de + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + call TradeAnim_AdvanceScriptPointer + ret + +; 293ea + +TradeAnim_ScrollOutRight: ; 293ea + call WaitTop + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + call WaitBGMap + ld a, $7 + ld [hWX], a + xor a + ld [hWY], a + call DelayFrame + call WaitTop + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + call ClearTileMap + call TradeAnim_IncrementJumptableIndex + ret + +; 2940c + +TradeAnim_ScrollOutRight2: ; 2940c + ld a, [hWX] + cp $a1 + jr nc, .done + add $4 + ld [hWX], a + ret + +.done + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + call WaitBGMap + ld a, $7 + ld [hWX], a + ld a, $90 + ld [hWY], a + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + call TradeAnim_AdvanceScriptPointer + ret + +; 2942e + +TradeAnim_ShowGivemonData: ; 2942e + call ShowPlayerTrademonStats + ld a, [wPlayerTrademonSpecies] + ld [wCurPartySpecies], a + ld a, [wPlayerTrademonDVs] + ld [wTempMonDVs], a + ld a, [wPlayerTrademonDVs + 1] + ld [wTempMonDVs + 1], a + ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + call TradeAnim_ShowGivemonFrontpic + + ld a, [wPlayerTrademonSpecies] + call GetCryIndex + jr c, .skip_cry + ld e, c + ld d, b + call PlayCry +.skip_cry + + call TradeAnim_AdvanceScriptPointer + ret + +; 29461 + +TradeAnim_ShowGetmonData: ; 29461 + call ShowOTTrademonStats + ld a, [wOTTrademonSpecies] + ld [wCurPartySpecies], a + ld a, [wOTTrademonDVs] + ld [wTempMonDVs], a + ld a, [wOTTrademonDVs + 1] + ld [wTempMonDVs + 1], a + ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + call TradeAnim_ShowGetmonFrontpic + call TradeAnim_AdvanceScriptPointer + ret + +; 29487 + +TradeAnim_AnimateFrontpic: ; 29487 + farcall AnimateTrademonFrontpic + call TradeAnim_AdvanceScriptPointer + ret + +; 29491 + +TradeAnim_GetFrontpic: ; 29491 + push de + push af + predef GetUnownLetter + pop af + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + pop de + predef GetMonFrontpic + ret + +; 294a9 + +TradeAnim_GetNickname: ; 294a9 + push de + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 + pop de + ld bc, NAME_LENGTH + call CopyBytes + ret + +; 294bb + +TradeAnim_ShowGivemonFrontpic: ; 294bb + ld de, vTiles0 + jr TradeAnim_ShowFrontpic + +TradeAnim_ShowGetmonFrontpic: ; 294c0 + ld de, vTiles0 tile $31 +TradeAnim_ShowFrontpic: ; 294c3 + call DelayFrame + ld hl, vTiles2 + lb bc, 10, $31 + call Request2bpp + call WaitTop + call TradeAnim_BlankTileMap + hlcoord 7, 2 + xor a + ld [hGraphicStartTile], a + lb bc, 7, 7 + predef PlaceGraphic + call WaitBGMap + ret + +; 294e7 + +TraideAnim_Wait80: ; 294e7 + ld c, 80 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 294f0 + +TraideAnim_Wait40: ; 294f0 + ld c, 40 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 294f9 + +TraideAnim_Wait96: ; 294f9 + ld c, 96 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 29502 + +TraideAnim_Wait80IfOTEgg: ; 29502 + call IsOTTrademonEgg + ret nz + ld c, 80 + call DelayFrames + ret + +; 2950c + +TraideAnim_Wait180IfOTEgg: ; 2950c + call IsOTTrademonEgg + ret nz + ld c, 180 + call DelayFrames + ret + +; 29516 + +IsOTTrademonEgg: ; 29516 + call TradeAnim_AdvanceScriptPointer + ld a, [wOTTrademonSpecies] + cp EGG + ret + +; 2951f +ShowPlayerTrademonStats: ; 2951f + ld de, wPlayerTrademonSpecies + ld a, [de] + cp EGG + jr z, TrademonStats_Egg + call TrademonStats_MonTemplate + ld de, wPlayerTrademonSpecies + call TrademonStats_PrintSpeciesNumber + ld de, wPlayerTrademonSpeciesName + call TrademonStats_PrintSpeciesName + ld a, [wPlayerTrademonCaughtData] + ld de, wPlayerTrademonOTName + call TrademonStats_PrintOTName + ld de, wPlayerTrademonID + call TrademonStats_PrintTrademonID + call TrademonStats_WaitBGMap + ret + +; 29549 + +ShowOTTrademonStats: ; 29549 + ld de, wOTTrademonSpecies + ld a, [de] + cp EGG + jr z, TrademonStats_Egg + call TrademonStats_MonTemplate + ld de, wOTTrademonSpecies + call TrademonStats_PrintSpeciesNumber + ld de, wOTTrademonSpeciesName + call TrademonStats_PrintSpeciesName + ld a, [wOTTrademonCaughtData] + ld de, wOTTrademonOTName + call TrademonStats_PrintOTName + ld de, wOTTrademonID + call TrademonStats_PrintTrademonID + call TrademonStats_WaitBGMap + ret + +; 29573 + +TrademonStats_MonTemplate: ; 29573 + call WaitTop + call TradeAnim_BlankTileMap + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + hlcoord 3, 0 + ld b, $6 + ld c, $d + call TextBox + hlcoord 4, 0 + ld de, .OTMonData + call PlaceString + ret + +; 29591 + +.OTMonData: ; 29591 + db "─── №." + next "" + next "OT/" + next "№.@" +; 295a1 + +TrademonStats_Egg: ; 295a1 + call WaitTop + call TradeAnim_BlankTileMap + ld a, HIGH(vBGMap1) + ld [hBGMapAddress + 1], a + hlcoord 3, 0 + ld b, 6 + ld c, 13 + call TextBox + hlcoord 4, 2 + ld de, .EggData + call PlaceString + call TrademonStats_WaitBGMap + ret + +; 295c2 + +.EggData: ; 295c2 + db "EGG" + next "OT/?????" + next "№.?????@" +; 295d8 + +TrademonStats_WaitBGMap: ; 295d8 + call WaitBGMap + call WaitTop + ld a, HIGH(vBGMap0) + ld [hBGMapAddress + 1], a + ret + +; 295e3 + +TrademonStats_PrintSpeciesNumber: ; 295e3 + hlcoord 10, 0 + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + call PrintNum + ld [hl], " " + ret + +; 295ef + +TrademonStats_PrintSpeciesName: ; 295ef + hlcoord 4, 2 + call PlaceString + ret + +; 295f6 + +TrademonStats_PrintOTName: ; 295f6 + cp 3 + jr c, .caught_gender_okay + xor a +.caught_gender_okay + push af + hlcoord 7, 4 + call PlaceString + inc bc + pop af + ld hl, .Gender + ld d, 0 + ld e, a + add hl, de + ld a, [hl] + ld [bc], a + ret + +; 2960e + +.Gender: ; 2960e + db " ", "♂", "♀" +; 29611 + +TrademonStats_PrintTrademonID: ; 29611 + hlcoord 7, 6 + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + ret + +; 2961b + +TradeAnim_RockingBall: ; 2961b + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_TRADE_POKE_BALL + call _InitSpriteAnimStruct + call TradeAnim_AdvanceScriptPointer + ld a, 32 + ld [wFrameCounter], a + ret + +; 2962c + +TradeAnim_DropBall: ; 2962c + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_TRADE_POKE_BALL + call _InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld [hl], $1 + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $dc + call TradeAnim_AdvanceScriptPointer + ld a, 56 + ld [wFrameCounter], a + ret + +; 29649 + +TradeAnim_Poof: ; 29649 + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_TRADE_POOF + call _InitSpriteAnimStruct + call TradeAnim_AdvanceScriptPointer + ld a, 16 + ld [wFrameCounter], a + ld de, SFX_BALL_POOF + call PlaySFX + ret + +; 29660 + +TradeAnim_BulgeThroughTube: ; 29660 + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbObjPal0 + depixel 5, 11 + ld a, SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE + call _InitSpriteAnimStruct + call TradeAnim_AdvanceScriptPointer + ld a, 64 + ld [wFrameCounter], a + ret + +; 29676 + +TradeAnim_AnimateTrademonInTube: ; 29676 (a:5676) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 29686 + +.Jumptable: ; 29686 (a:5686) + dw .InitTimer + dw .WaitTimer1 + dw .MoveRight + dw .MoveDown + dw .MoveUp + dw .MoveLeft + dw .WaitTimer2 +; 2969a + +.JumptableNext: ; 29694 (a:5694) + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +.InitTimer: ; 2969a (a:569a) + call .JumptableNext + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $80 + ret + +.WaitTimer1: ; 296a4 (a:56a4) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + dec [hl] + and a + ret nz + call .JumptableNext + +.MoveRight: ; 296af (a:56af) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $94 + jr nc, .done_move_right + inc [hl] + ret + +.done_move_right + call .JumptableNext + +.MoveDown: ; 296bd (a:56bd) + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $4c + jr nc, .done_move_down + inc [hl] + ret + +.done_move_down + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +.MoveUp: ; 296cf (a:56cf) + ld hl, SPRITEANIMSTRUCT_YCOORD + add hl, bc + ld a, [hl] + cp $2c + jr z, .done_move_up + dec [hl] + ret + +.done_move_up + call .JumptableNext + +.MoveLeft: ; 296dd (a:56dd) + ld hl, SPRITEANIMSTRUCT_XCOORD + add hl, bc + ld a, [hl] + cp $58 + jr z, .done_move_left + dec [hl] + ret + +.done_move_left + call .JumptableNext + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $80 + ret + +.WaitTimer2: ; 296f2 (a:56f2) + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + dec [hl] + and a + ret nz + ld hl, SPRITEANIMSTRUCT_INDEX + add hl, bc + ld [hl], $0 + ret + +; 29701 (a:5701) + +TradeAnim_SentToOTText: ; 29701 + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jr z, .time_capsule + ld hl, .Text_MonName + call PrintText + ld c, 189 + call DelayFrames + ld hl, .Text_WasSentTo + call PrintText + call TradeAnim_Wait80Frames + ld c, 128 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +.time_capsule + ld hl, .Text_WasSentTo + call PrintText + call TradeAnim_Wait80Frames + call TradeAnim_AdvanceScriptPointer + ret + +; 29732 + +.Text_WasSentTo: ; 0x29732 + ; was sent to @ . + text_jump UnknownText_0x1bc6e9 + db "@" +; 0x29737 + +.Text_MonName: ; 0x29737 + ; + text_jump UnknownText_0x1bc701 + db "@" +; 0x2973c + +TradeAnim_OTBidsFarewell: ; 2973c + ld hl, .Text_BidsFarewellToMon + call PrintText + call TradeAnim_Wait80Frames + ld hl, .Text_MonName + call PrintText + call TradeAnim_Wait80Frames + call TradeAnim_AdvanceScriptPointer + ret + +; 29752 + +.Text_BidsFarewellToMon: ; 0x29752 + ; bids farewell to + text_jump UnknownText_0x1bc703 + db "@" +; 0x29757 + +.Text_MonName: ; 0x29757 + ; . + text_jump UnknownText_0x1bc719 + db "@" +; 0x2975c + +TradeAnim_TakeCareOfText: ; 2975c + call WaitTop + hlcoord 0, 10 + ld bc, 8 * SCREEN_WIDTH + ld a, " " + call ByteFill + call WaitBGMap + ld hl, .Text_TakeGoodCareOfMon + call PrintText + call TradeAnim_Wait80Frames + call TradeAnim_AdvanceScriptPointer + ret + +; 2977a + +.Text_TakeGoodCareOfMon: ; 0x2977a + ; Take good care of @ . + text_jump UnknownText_0x1bc71f + db "@" +; 0x2977f + +TradeAnim_OTSendsText1: ; 2977f + ld hl, .Text_ForYourMon + call PrintText + call TradeAnim_Wait80Frames + ld hl, .Text_OTSends + call PrintText + call TradeAnim_Wait80Frames + ld c, 14 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 2979a + +.Text_ForYourMon: ; 0x2979a + ; For @ 's @ , + text_jump UnknownText_0x1bc739 + db "@" +; 0x2979f + +.Text_OTSends: ; 0x2979f + ; sends @ . + text_jump UnknownText_0x1bc74c + db "@" +; 0x297a4 + +TradeAnim_OTSendsText2: ; 297a4 + ld hl, .Text_WillTrade + call PrintText + call TradeAnim_Wait80Frames + ld hl, .Text_ForYourMon + call PrintText + call TradeAnim_Wait80Frames + ld c, 14 + call DelayFrames + call TradeAnim_AdvanceScriptPointer + ret + +; 297bf + +.Text_WillTrade: ; 0x297bf + ; will trade @ @ + text_jump UnknownText_0x1bc75e + db "@" +; 0x297c4 + +.Text_ForYourMon: ; 0x297c4 + ; for @ 's @ . + text_jump UnknownText_0x1bc774 + db "@" +; 0x297c9 + +TradeAnim_Wait80Frames: ; 297c9 + ld c, 80 + call DelayFrames + ret + +; 297cf + +TradeAnim_BlankTileMap: ; 297cf + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill + ret + +; 297db + +TradeAnim_CopyBoxFromDEtoHL: ; 297db +.row + push bc + push hl +.col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret + +; 297ed + +TradeAnim_NormalPals: ; 297ed + ld a, [hSGB] + and a + ld a, %11100100 ; 3,2,1,0 + jr z, .not_sgb + ld a, $f0 + +.not_sgb + call DmgToCgbObjPal0 + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + ret + +; 297ff + +LinkTradeAnim_LoadTradePlayerNames: ; 297ff + push de + ld de, wLinkPlayer1Name + ld bc, NAME_LENGTH + call CopyBytes + pop hl + ld de, wLinkPlayer2Name + ld bc, NAME_LENGTH + call CopyBytes + ret + +; 29814 + +LinkTradeAnim_LoadTradeMonSpecies: ; 29814 + ld a, [hl] + ld [wLinkTradeSendmonSpecies], a + ld a, [de] + ld [wLinkTradeGetmonSpecies], a + ret + +; 2981d + +TradeAnim_FlashBGPals: ; 2981d + ld a, [wcf65] + and $7 + ret nz + ld a, [rBGP] + xor %00111100 + call DmgToCgbBGPals + ret + +; 2982b + +LoadTradeBallAndCableGFX: ; 2982b + call DelayFrame + ld de, TradeBallGFX + ld hl, vTiles0 tile $62 + lb bc, BANK(TradeBallGFX), 6 + call Request2bpp + ld de, TradePoofGFX + ld hl, vTiles0 tile $68 + lb bc, BANK(TradePoofGFX), 12 + call Request2bpp + ld de, TradeCableGFX + ld hl, vTiles0 tile $74 + lb bc, BANK(TradeCableGFX), 4 + call Request2bpp + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], $62 + ret + +; 2985a + +LoadTradeBubbleGFX: ; 2985a + call DelayFrame + ld e, $3 + callfar LoadMenuMonIcon + ld de, TradeBubbleGFX + ld hl, vTiles0 tile $72 + lb bc, BANK(TradeBubbleGFX), 4 + call Request2bpp + xor a + ld hl, wSpriteAnimDict + ld [hli], a + ld [hl], $62 + ret + +; 29879 + +TradeAnim_WaitAnim: ; 29879 + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + ret + +.done + call TradeAnim_AdvanceScriptPointer + ret + +; 29886 + +TradeAnim_WaitAnim2: ; 29886 + ld hl, wFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + ret + +.done + call TradeAnim_AdvanceScriptPointer + ret + +; 29893 + + +Unreferenced_DebugTrade: ; 29893 +; This function is not referenced. +; It was meant for use in Japanese versions, so the +; constant used for copy length was changed by accident. + + ld hl, .DebugTradeData + + ld a, [hli] + ld [wPlayerTrademonSpecies], a + ld de, wPlayerTrademonSenderName + ld c, NAME_LENGTH + 2 ; JP: NAME_LENGTH_JAPANESE + 2 +.loop1 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop1 + + ld a, [hli] + ld [wOTTrademonSpecies], a + ld de, wOTTrademonSenderName + ld c, NAME_LENGTH + 2 ; JP: NAME_LENGTH_JAPANESE + 2 +.loop2 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop2 + ret + +; 298b5 + +debugtrade: MACRO +; species, ot name, ot id (?) + db \1, \2 + dw \3 +ENDM + +.DebugTradeData: ; 298b5 + debugtrade VENUSAUR, "ゲーフり@@", $0123 ; GAME FREAK + debugtrade CHARIZARD, "クりーチャ@", $0456 ; Creatures Inc. +; 298c7 + + +TradeGameBoyTilemap: ; 298c7 +; 6x8 + db $31, $32, $32, $32, $32, $33 + db $34, $35, $36, $36, $37, $38 + db $34, $39, $3a, $3a, $3b, $38 + db $3c, $3d, $3e, $3e, $3f, $40 + db $41, $42, $43, $43, $44, $45 + db $46, $47, $43, $48, $49, $4a + db $41, $43, $4b, $4c, $4d, $4e + db $4f, $50, $50, $50, $51, $52 +; 297f7 + +TradeLinkTubeTilemap: ; 297f7 +; 12x3 + db $43, $55, $56, $53, $53, $53, $53, $53, $53, $53, $53, $53 + db $43, $57, $58, $54, $54, $54, $54, $54, $54, $54, $54, $54 + db $43, $59, $5a, $43, $43, $43, $43, $43, $43, $43, $43, $43 +; 2991b + +TradeArrowGFX: INCBIN "gfx/trade/arrow.2bpp" +TradeCableGFX: INCBIN "gfx/trade/cable.2bpp" +TradeBubbleGFX: INCBIN "gfx/trade/bubble.2bpp" +TradeGameBoyLZ: INCBIN "gfx/trade/game_boy.2bpp.lz" +TradeBallGFX: INCBIN "gfx/trade/ball.2bpp" +TradePoofGFX: INCBIN "gfx/trade/poof.2bpp" diff --git a/engine/movie/unused_title.asm b/engine/movie/unused_title.asm new file mode 100644 index 000000000..8e52a71bb --- /dev/null +++ b/engine/movie/unused_title.asm @@ -0,0 +1,178 @@ +UnusedTitleScreen: ; 10c000 + + call ClearBGPalettes + call ClearTileMap + call DisableLCD + +; Turn BG Map update off + xor a + ld [hBGMapMode], a + +; Reset timing variables + ld hl, wJumptableIndex + ld [hli], a ; wJumptableIndex + ld [hli], a ; wIntroSceneFrameCounter + ld [hli], a ; wTitleScreenTimer + ld [hl], a ; wTitleScreenTimer + 1 + + ld hl, UnusedTitleBG_GFX + ld de, vTiles2 + ld bc, vBGMap0 - vTiles2 + call CopyBytes + + ld hl, UnusedTitleBG_GFX + $80 tiles + ld de, vTiles1 + ld bc, vTiles2 - vTiles1 + call CopyBytes + + ld hl, UnusedTitleFG_GFX + ld de, vTiles0 + ld bc, vTiles1 - vTiles0 + call CopyBytes + + ld hl, UnusedTitleBG_Tilemap + debgcoord 0, 0 + ld bc, BG_MAP_WIDTH * BG_MAP_HEIGHT +.copy + ld a, 0 + ld [rVBK], a + ld a, [hli] + ld [de], a + ld a, 1 + ld [rVBK], a + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .copy + + ld hl, UnusedTitleFG_OAM + ld de, wVirtualOAMSprite00 + ld bc, SPRITEOAMSTRUCT_LENGTH * NUM_SPRITE_OAM_STRUCTS + call CopyBytes + + call EnableLCD + ld a, [rLCDC] + set rLCDC_SPRITES_ENABLE, a + set rLCDC_SPRITE_SIZE, a + ld [rLCDC], a + + call DelayFrame + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld hl, UnusedTitleBG_Palettes + ld de, wBGPals1 + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleFG_Palettes + ld de, wOBPals1 + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleBG_Palettes + ld de, wBGPals2 + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleFG_Palettes + ld de, wOBPals2 + ld bc, 8 palettes + call CopyBytes + + pop af + ld [rSVBK], a + + ld a, $1 + ld [hCGBPalUpdate], a + + ld de, MUSIC_TITLE + call PlayMusic + + ret +; 10c0b1 + +UnusedTitleBG_GFX: ; 10c0b1 +INCBIN "gfx/title/old_bg.2bpp" +; 10d0b1 + +UnusedTitleBG_Tilemap: ; 10d0b1 +; 32x32 (alternating tiles and attributes) +INCBIN "gfx/title/old_bg.tilemap" +; 10d8b1 + +UnusedTitleBG_Palettes: ; 10d8b1 +INCLUDE "gfx/title/old_bg.pal" +; 10dab1 + +UnusedTitleFG_GFX: ; 10dab1 +INCBIN "gfx/title/old_fg.2bpp" +; 10eab1 + +UnusedTitleFG_Palettes: ; 10eab1 +INCLUDE "gfx/title/old_fg.pal" +; 10ecb1 + +UnusedTitleFG_OAM: ; 10ecb1 + dsprite 3, 0, 7, 0, $00, 1 + dsprite 3, 0, 8, 0, $02, 1 + dsprite 3, 0, 9, 0, $04, 1 + dsprite 3, 0, 10, 0, $06, 1 + dsprite 3, 0, 11, 0, $08, 1 + dsprite 3, 0, 12, 0, $0a, 1 + dsprite 3, 0, 13, 0, $0c, 1 + dsprite 3, 0, 14, 0, $0e, 1 + dsprite 5, 0, 7, 0, $10, 0 + dsprite 5, 0, 8, 0, $12, 0 + dsprite 5, 0, 9, 0, $14, 0 + dsprite 5, 0, 10, 0, $16, 0 + dsprite 5, 0, 11, 0, $18, 0 + dsprite 5, 0, 12, 0, $1a, 0 + dsprite 5, 0, 13, 0, $1c, 0 + dsprite 5, 0, 14, 0, $1e, 0 + dsprite 7, 0, 7, 0, $20, 0 + dsprite 7, 0, 8, 0, $22, 0 + dsprite 7, 0, 9, 0, $24, 0 + dsprite 7, 0, 10, 0, $26, 0 + dsprite 7, 0, 11, 0, $28, 0 + dsprite 7, 0, 12, 0, $2a, 0 + dsprite 7, 0, 13, 0, $2c, 0 + dsprite 7, 0, 14, 0, $2e, 0 + dsprite 9, 0, 7, 0, $30, 2 + dsprite 9, 0, 8, 0, $32, 2 + dsprite 9, 0, 9, 0, $34, 2 + dsprite 9, 0, 10, 0, $36, 2 + dsprite 9, 0, 11, 0, $38, 2 + dsprite 9, 0, 12, 0, $3a, 2 + dsprite 9, 0, 13, 0, $3c, 2 + dsprite 9, 0, 14, 0, $3e, 2 + dsprite 11, 0, 7, 0, $40, 1 + dsprite 11, 0, 8, 0, $42, 1 + dsprite 11, 0, 9, 0, $44, 1 + dsprite 11, 0, 10, 0, $46, 1 + dsprite 11, 0, 11, 0, $48, 1 + dsprite 11, 0, 12, 0, $4a, 1 + dsprite 11, 0, 13, 0, $4c, 1 + dsprite 11, 0, 14, 0, $4e, 1 +; 10ed51 + +Function10ed51: ; 10ed51 + call _TitleScreen +.loop + call JoyTextDelay + ld a, [hJoyLast] + ld b, a + and 1 + jr nz, .done + call SuicuneFrameIterator + call DelayFrame + jr .loop +.done + ret +; 10ed67 diff --git a/engine/phone/phonering_copytilemapatonce.asm b/engine/phone/phonering_copytilemapatonce.asm new file mode 100644 index 000000000..b0d4ffa1e --- /dev/null +++ b/engine/phone/phonering_copytilemapatonce.asm @@ -0,0 +1,80 @@ +PhoneRing_CopyTilemapAtOnce: ; 4d188 + ld a, [hCGB] + and a + jp z, WaitBGMap + ld a, [wSpriteUpdatesEnabled] + cp $0 + jp z, WaitBGMap + +; What follows is a modified version of CopyTilemapAtOnce. + ld a, [hBGMapMode] + push af + xor a + ld [hBGMapMode], a + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a +.wait + ld a, [rLY] + cp LY_VBLANK - 1 + jr c, .wait + + di + ld a, BANK(vBGMap2) + ld [rVBK], a + hlcoord 0, 0, wAttrMap + call .CopyTilemapAtOnce + ld a, BANK(vBGMap0) + ld [rVBK], a + hlcoord 0, 0 + call .CopyTilemapAtOnce +.wait2 + ld a, [rLY] + cp LY_VBLANK - 1 + jr c, .wait2 + ei + + pop af + ld [hMapAnims], a + pop af + ld [hBGMapMode], a + ret + +.CopyTilemapAtOnce: ; 4d1cb + ld [hSPBuffer], sp + ld sp, hl + ld a, [hBGMapAddress + 1] + ld h, a + ld l, 0 + ld a, SCREEN_HEIGHT + ld [hTilesPerCycle], a + ld b, 1 << 1 ; not in v/hblank + ld c, LOW(rSTAT) + +.loop +rept SCREEN_WIDTH / 2 + pop de +.loop\@ + ld a, [$ff00+c] + and b + jr nz, .loop\@ + ld [hl], e + inc l + ld [hl], d + inc l +endr + + ld de, BG_MAP_WIDTH - SCREEN_WIDTH + add hl, de + ld a, [hTilesPerCycle] + dec a + ld [hTilesPerCycle], a + jr nz, .loop + + ld a, [hSPBuffer] + ld l, a + ld a, [hSPBuffer + 1] + ld h, a + ld sp, hl + ret diff --git a/engine/pokegear/townmap_convertlinebreakcharacters.asm b/engine/pokegear/townmap_convertlinebreakcharacters.asm new file mode 100644 index 000000000..6ccd79aae --- /dev/null +++ b/engine/pokegear/townmap_convertlinebreakcharacters.asm @@ -0,0 +1,21 @@ +TownMap_ConvertLineBreakCharacters: ; 1de2c5 + ld hl, wStringBuffer1 +.loop + ld a, [hl] + cp "@" + jr z, .end + cp "%" + jr z, .line_break + cp "¯" + jr z, .line_break + inc hl + jr .loop + +.line_break + ld [hl], "" + +.end + ld de, wStringBuffer1 + hlcoord 9, 0 + call PlaceString + ret diff --git a/engine/pokemon/checknickerrors.asm b/engine/pokemon/checknickerrors.asm new file mode 100644 index 000000000..87ebd6bb3 --- /dev/null +++ b/engine/pokemon/checknickerrors.asm @@ -0,0 +1,74 @@ +CheckNickErrors:: ; 669f +; error-check monster nick before use +; must be a peace offering to gamesharkers + +; input: de = nick location + + push bc + push de + ld b, MON_NAME_LENGTH + +.checkchar +; end of nick? + ld a, [de] + cp "@" ; terminator + jr z, .end + +; check if this char is a text command + ld hl, .textcommands + dec hl +.loop +; next entry + inc hl +; reached end of commands table? + ld a, [hl] + cp -1 + jr z, .done + +; is the current char between this value (inclusive)... + ld a, [de] + cp [hl] + inc hl + jr c, .loop +; ...and this one? + cp [hl] + jr nc, .loop + +; replace it with a "?" + ld a, "?" + ld [de], a + jr .loop + +.done +; next char + inc de +; reached end of nick without finding a terminator? + dec b + jr nz, .checkchar + +; change nick to "?@" + pop de + push de + ld a, "?" + ld [de], a + inc de + ld a, "@" + ld [de], a +.end +; if the nick has any errors at this point it's out of our hands + pop de + pop bc + ret + +.textcommands ; 66cf +; table defining which characters are actually text commands +; format: + ; ≥ < + db TX_START, TX_BOX + 1 + db "", "" + 1 + db "", "" + 1 + db "", "" + 1 + db "", "" + 1 + db "", "" + 1 + db "", "┘" + 1 + db -1 ; end diff --git a/engine/pokemon/correcterrorsinplayerparty.asm b/engine/pokemon/correcterrorsinplayerparty.asm new file mode 100644 index 000000000..e815aa4c8 --- /dev/null +++ b/engine/pokemon/correcterrorsinplayerparty.asm @@ -0,0 +1,229 @@ +Unreferenced_CorrectErrorsInPlayerParty: + ld hl, wPartyCount + ld a, [hl] + and a + ret z + + cp PARTY_LENGTH + 1 + jr c, .party_length_okay + ld a, PARTY_LENGTH + ld [hl], a +.party_length_okay + inc hl + + ld b, a + ld c, 0 +.loop1 + ld a, [hl] + and a + jr z, .invalid_species + cp NUM_POKEMON + 1 + jr z, .invalid_species + cp EGG + 1 + jr c, .next_species + +.invalid_species + ld [hl], SMEARGLE + push hl + push bc + ld a, c + ld hl, wPartyMon1Species + call GetPartyLocation + ld [hl], SMEARGLE + pop bc + pop hl + +.next_species + inc hl + inc c + dec b + jr nz, .loop1 + ld [hl], $ff + + ld hl, wPartyMon1 + ld a, [wPartyCount] + ld d, a + ld e, 0 +.loop2 + push de + push hl + ld b, h + ld c, l + ld a, [hl] + and a + jr z, .invalid_species_2 + cp NUM_POKEMON + 1 + jr c, .check_level + +.invalid_species_2 + ld [hl], SMEARGLE + push de + ld d, 0 + ld hl, wPartySpecies + add hl, de + pop de + ld a, SMEARGLE + ld [hl], a + +.check_level + ld [wCurSpecies], a + call GetBaseData + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + cp MIN_LEVEL + ld a, MIN_LEVEL + jr c, .invalid_level + ld a, [hl] + cp MAX_LEVEL + jr c, .load_level + ld a, MAX_LEVEL +.invalid_level + ld [hl], a +.load_level + ld [wCurPartyLevel], a + + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + ld b, TRUE + predef CalcMonStats + pop hl + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop de + inc e + dec d + jr nz, .loop2 + + ld de, wPartyMonNicknames + ld a, [wPartyCount] + ld b, a + ld c, 0 +.loop3 + push bc + call .GetLengthOfStringWith6CharCap + push de + farcall CheckStringForErrors + pop hl + pop bc + jr nc, .valid_nickname + + push bc + push hl + ld hl, wPartySpecies + push bc + ld b, 0 + add hl, bc + pop bc + ld a, [hl] + cp EGG + ld hl, .TAMAGO + jr z, .got_nickname + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 +.got_nickname + pop de + ld bc, MON_NAME_LENGTH + call CopyBytes + pop bc + +.valid_nickname + inc c + dec b + jr nz, .loop3 + + ld de, wPartyMonOT + ld a, [wPartyCount] + ld b, a + ld c, 0 +.loop4 + push bc + call .GetLengthOfStringWith6CharCap + push de + farcall CheckStringForErrors + pop hl + jr nc, .valid_ot_name + ld d, h + ld e, l + ld hl, wPlayerName + ld bc, NAME_LENGTH + call CopyBytes +.valid_ot_name + pop bc + inc c + dec b + jr nz, .loop4 + + ld hl, wPartyMon1Moves + ld a, [wPartyCount] + ld b, a +.loop5 + push hl + ld c, NUM_MOVES + ld a, [hl] + and a + jr z, .invalid_move + cp NUM_ATTACKS + 1 + jr c, .moves_loop +.invalid_move + ld [hl], POUND + +.moves_loop + ld a, [hl] + and a + jr z, .fill_invalid_moves + cp NUM_ATTACKS + 1 + jr c, .next_move + +.fill_invalid_moves + xor a + ld [hli], a + dec c + jr nz, .fill_invalid_moves + jr .next_pokemon + +.next_move + inc hl + dec c + jr nz, .moves_loop + +.next_pokemon + pop hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop bc + dec b + jr nz, .loop5 + ret +; 13b6b + +.TAMAGO: ; 13b6b + db "タマゴ@@@" +; 13b71 + +.GetLengthOfStringWith6CharCap: ; 13b71 + push de + ld c, 1 + ld b, NAME_LENGTH_JAPANESE +.search_loop + ld a, [de] + cp "@" + jr z, .done + inc de + inc c + dec b + jr nz, .search_loop + dec c + dec de + ld a, "@" + ld [de], a +.done + pop de + ret +; 13b87 diff --git a/engine/pokemon/tmhm.asm b/engine/pokemon/tmhm.asm deleted file mode 100755 index 442f73cfa..000000000 --- a/engine/pokemon/tmhm.asm +++ /dev/null @@ -1,589 +0,0 @@ -TMHMPocket: ; 2c76f (b:476f) - ld a, $1 - ld [hInMenu], a - call TMHM_PocketLoop - ld a, $0 - ld [hInMenu], a - ret nc - call PlaceHollowCursor - call WaitBGMap - ld a, [wCurItem] - dec a - ld [wCurItemQuantity], a - ld hl, wTMsHMs - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - ld [wItemQuantityBuffer], a - call .ConvertItemToTMHMNumber - scf - ret - -.ConvertItemToTMHMNumber: ; 2c798 (b:4798) - ld a, [wCurItem] - ld c, a - callfar GetNumberedTMHM - ld a, c - ld [wCurItem], a - ret - -ConvertCurItemIntoCurTMHM: ; 2c7a7 (b:47a7) - ld a, [wCurItem] - ld c, a - callfar GetTMHMNumber - ld a, c - ld [wCurTMHM], a - ret - -GetTMHMItemMove: ; 2c7b6 (b:47b6) - call ConvertCurItemIntoCurTMHM - predef GetTMHMMove - ret - -AskTeachTMHM: ; 2c7bf (b:47bf) - ld hl, wOptions - ld a, [hl] - push af - res NO_TEXT_SCROLL, [hl] - ld a, [wCurItem] - cp TM01 - jr c, .NotTMHM - call GetTMHMItemMove - ld a, [wCurTMHM] - ld [wPutativeTMHMMove], a - call GetMoveName - call CopyName1 - ld hl, Text_BootedTM ; Booted up a TM - ld a, [wCurItem] - cp HM01 - jr c, .TM - ld hl, Text_BootedHM ; Booted up an HM -.TM: - call PrintText - ld hl, Text_ItContained - call PrintText - call YesNoBox -.NotTMHM: - pop bc - ld a, b - ld [wOptions], a - ret - -ChooseMonToLearnTMHM: ; 2c7fb - ld hl, wStringBuffer2 - ld de, wTMHMMoveNameBackup - ld bc, 12 - call CopyBytes - call ClearBGPalettes -ChooseMonToLearnTMHM_NoRefresh: ; 2c80a - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuGFX - ld a, PARTYMENUACTION_TEACH_TMHM - ld [wPartyMenuActionText], a -.loopback - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes - call DelayFrame - farcall PartyMenuSelect - push af - ld a, [wCurPartySpecies] - cp EGG - pop bc ; now contains the former contents of af - jr z, .egg - push bc - ld hl, wTMHMMoveNameBackup - ld de, wStringBuffer2 - ld bc, 12 - call CopyBytes - pop af ; now contains the original contents of af - ret - -.egg - push hl - push de - push bc - push af - ld de, SFX_WRONG - call PlaySFX - call WaitSFX - pop af - pop bc - pop de - pop hl - jr .loopback -; 2c867 - -TeachTMHM: ; 2c867 - predef CanLearnTMHMMove - - push bc - ld a, [wCurPartyMon] - ld hl, wPartyMonNicknames - call GetNick - pop bc - - ld a, c - and a - jr nz, .compatible - push de - ld de, SFX_WRONG - call PlaySFX - pop de - ld hl, Text_TMHMNotCompatible - call PrintText - jr .nope - -.compatible - callfar KnowsMove - jr c, .nope - - predef LearnMove - ld a, b - and a - jr z, .nope - - farcall StubbedTrainerRankings_TMsHMsTaught - ld a, [wCurItem] - call IsHM - ret c - - ld c, HAPPINESS_LEARNMOVE - callfar ChangeHappiness - call ConsumeTM - jr .learned_move - -.nope - and a - ret - -.unused - ld a, 2 - ld [wItemEffectSucceeded], a -.learned_move - scf - ret -; 2c8bf (b:48bf) - -Text_BootedTM: ; 0x2c8bf - ; Booted up a TM. - text_jump UnknownText_0x1c0373 - db "@" -; 0x2c8c4 - -Text_BootedHM: ; 0x2c8c4 - ; Booted up an HM. - text_jump UnknownText_0x1c0384 - db "@" -; 0x2c8c9 - -Text_ItContained: ; 0x2c8c9 - ; It contained @ . Teach @ to a #MON? - text_jump UnknownText_0x1c0396 - db "@" -; 0x2c8ce - -Text_TMHMNotCompatible: ; 0x2c8ce - ; is not compatible with @ . It can't learn @ . - text_jump UnknownText_0x1c03c2 - db "@" -; 0x2c8d3 - -TMHM_PocketLoop: ; 2c8d3 (b:48d3) - xor a - ld [hBGMapMode], a - call TMHM_DisplayPocketItems - ld a, 2 - ld [w2DMenuCursorInitY], a - ld a, 7 - ld [w2DMenuCursorInitX], a - ld a, 1 - ld [w2DMenuNumCols], a - ld a, 5 - sub d - inc a - cp 6 - jr nz, .okay - dec a -.okay - ld [w2DMenuNumRows], a - ld a, $c - ld [w2DMenuFlags1], a - xor a - ld [w2DMenuFlags2], a - ld a, $20 - ld [w2DMenuCursorOffsets], a - ld a, A_BUTTON | B_BUTTON | D_UP | D_DOWN | D_LEFT | D_RIGHT - ld [wMenuJoypadFilter], a - ld a, [wTMHMPocketCursor] - inc a - ld [wMenuCursorY], a - ld a, $1 - ld [wMenuCursorX], a - jr TMHM_ShowTMMoveDescription - -TMHM_JoypadLoop: ; 2c915 (b:4915) - call TMHM_DisplayPocketItems - call StaticMenuJoypad - ld b, a - ld a, [wMenuCursorY] - dec a - ld [wTMHMPocketCursor], a - xor a - ld [hBGMapMode], a - ld a, [w2DMenuFlags2] - bit 7, a - jp nz, TMHM_ScrollPocket - ld a, b - ld [wMenuJoypad], a - bit A_BUTTON_F, a - jp nz, TMHM_ChooseTMorHM - bit B_BUTTON_F, a - jp nz, TMHM_ExitPack - bit D_RIGHT_F, a - jp nz, TMHM_ExitPocket - bit D_LEFT_F, a - jp nz, TMHM_ExitPocket -TMHM_ShowTMMoveDescription: ; 2c946 (b:4946) - call TMHM_CheckHoveringOverCancel - jp nc, TMHM_ExitPocket - hlcoord 0, 12 - ld b, 4 - ld c, SCREEN_WIDTH - 2 - call TextBox - ld a, [wCurItem] - cp NUM_TMS + NUM_HMS + 1 - jr nc, TMHM_JoypadLoop - ld [wd265], a - predef GetTMHMMove - ld a, [wd265] - ld [wCurSpecies], a - hlcoord 1, 14 - call PrintMoveDesc - jp TMHM_JoypadLoop - -TMHM_ChooseTMorHM: ; 2c974 (b:4974) - call TMHM_PlaySFX_ReadText2 - call CountTMsHMs ; This stores the count to wd265. - ld a, [wMenuCursorY] - dec a - ld b, a - ld a, [wTMHMPocketScrollPosition] - add b - ld b, a - ld a, [wd265] - cp b - jr z, _TMHM_ExitPack ; our cursor was hovering over CANCEL -TMHM_CheckHoveringOverCancel: ; 2c98a (b:498a) - call TMHM_GetCurrentPocketPosition - ld a, [wMenuCursorY] - ld b, a -.loop - inc c - ld a, c - cp NUM_TMS + NUM_HMS + 1 - jr nc, .okay - ld a, [hli] - and a - jr z, .loop - dec b - jr nz, .loop - ld a, c -.okay - ld [wCurItem], a - cp -1 - ret - -TMHM_ExitPack: ; 2c9a5 (b:49a5) - call TMHM_PlaySFX_ReadText2 -_TMHM_ExitPack: ; 2c9a8 (b:49a8) - ld a, $2 - ld [wMenuJoypad], a - and a - ret - -TMHM_ExitPocket: ; 2c9af (b:49af) - and a - ret - -TMHM_ScrollPocket: ; 2c9b1 (b:49b1) - ld a, b - bit 7, a - jr nz, .skip - ld hl, wTMHMPocketScrollPosition - ld a, [hl] - and a - jp z, TMHM_JoypadLoop - dec [hl] - call TMHM_DisplayPocketItems - jp TMHM_ShowTMMoveDescription - -.skip - call TMHM_GetCurrentPocketPosition - ld b, 5 -.loop - inc c - ld a, c - cp NUM_TMS + NUM_HMS + 1 - jp nc, TMHM_JoypadLoop - ld a, [hli] - and a - jr z, .loop - dec b - jr nz, .loop - ld hl, wTMHMPocketScrollPosition - inc [hl] - call TMHM_DisplayPocketItems - jp TMHM_ShowTMMoveDescription - -TMHM_DisplayPocketItems: ; 2c9e2 (b:49e2) - ld a, [wBattleType] - cp BATTLETYPE_TUTORIAL - jp z, Tutorial_TMHMPocket - - hlcoord 5, 2 - lb bc, 10, 15 - ld a, " " - call ClearBox - call TMHM_GetCurrentPocketPosition - ld d, $5 -.loop2 - inc c - ld a, c - cp NUM_TMS + NUM_HMS + 1 - jr nc, .NotTMHM - ld a, [hli] - and a - jr z, .loop2 - ld b, a - ld a, c - ld [wd265], a - push hl - push de - push bc - call TMHMPocket_GetCurrentLineCoord - push hl - ld a, [wd265] - cp NUM_TMS + 1 - jr nc, .HM - ld de, wd265 - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - jr .okay - -.HM: - push af - sub NUM_TMS - ld [wd265], a - ld [hl], "H" - inc hl - ld de, wd265 - lb bc, PRINTNUM_RIGHTALIGN | 1, 2 - call PrintNum - pop af - ld [wd265], a -.okay - predef GetTMHMMove - ld a, [wd265] - ld [wPutativeTMHMMove], a - call GetMoveName - pop hl - ld bc, 3 - add hl, bc - push hl - call PlaceString - pop hl - pop bc - ld a, c - push bc - cp NUM_TMS + 1 - jr nc, .hm2 - ld bc, SCREEN_WIDTH + 9 - add hl, bc - ld [hl], "×" - inc hl - ld a, "0" ; why are we doing this? - pop bc - push bc - ld a, b - ld [wd265], a - ld de, wd265 - lb bc, 1, 2 - call PrintNum -.hm2 - pop bc - pop de - pop hl - dec d - jr nz, .loop2 - jr .done - -.NotTMHM: - call TMHMPocket_GetCurrentLineCoord - inc hl - inc hl - inc hl - push de - ld de, TMHM_String_Cancel - call PlaceString - pop de -.done - ret - -TMHMPocket_GetCurrentLineCoord: ; 2ca86 (b:4a86) - hlcoord 5, 0 - ld bc, 2 * SCREEN_WIDTH - ld a, 6 - sub d - ld e, a - ; AddNTimes -.loop - add hl, bc - dec e - jr nz, .loop - ret -; 2ca95 (b:4a95) - -Unreferenced_Function2ca95: ; 2ca95 - pop hl - ld bc, 3 - add hl, bc - predef GetTMHMMove - ld a, [wd265] - ld [wPutativeTMHMMove], a - call GetMoveName - push hl - call PlaceString - pop hl - ret -; 2caae - -TMHM_String_Cancel: ; 2caae - db "CANCEL@" -; 2cab5 - -TMHM_GetCurrentPocketPosition: ; 2cab5 (b:4ab5) - ld hl, wTMsHMs - ld a, [wTMHMPocketScrollPosition] - ld b, a - inc b - ld c, 0 -.loop - inc c - ld a, [hli] - and a - jr z, .loop - dec b - jr nz, .loop - dec hl - dec c - ret - -Tutorial_TMHMPocket: ; 2caca (b:4aca) - hlcoord 9, 3 - push de - ld de, TMHM_String_Cancel - call PlaceString - pop de - ret - -TMHM_PlaySFX_ReadText2: ; 2cad6 (b:4ad6) - push de - ld de, SFX_READ_TEXT_2 - call PlaySFX - pop de - ret -; 2cadf (b:4adf) - -Unreferenced_Function2cadf: ; 2cadf - call ConvertCurItemIntoCurTMHM - call .CheckHaveRoomForTMHM - ld hl, .NoRoomText - jr nc, .print - ld hl, .ReceivedText -.print - jp PrintText -; 2caf0 - -.NoRoomText: ; 0x2caf0 - ; You have no room for any more @ S. - text_jump UnknownText_0x1c03fa - db "@" -; 0x2caf5 - -.ReceivedText: ; 0x2caf5 - ; You received @ ! - text_jump UnknownText_0x1c0421 - db "@" -; 0x2cafa - -.CheckHaveRoomForTMHM: ; 2cafa - ld a, [wd265] - dec a - ld hl, wTMsHMs - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - inc a - cp NUM_TMS * 2 - ret nc - ld [hl], a - ret -; 2cb0c - -ConsumeTM: ; 2cb0c (b:4b0c) - call ConvertCurItemIntoCurTMHM - ld a, [wd265] - dec a - ld hl, wTMsHMs - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - and a - ret z - dec a - ld [hl], a - ret nz - ld a, [wTMHMPocketScrollPosition] - and a - ret z - dec a - ld [wTMHMPocketScrollPosition], a - ret - -CountTMsHMs: ; 2cb2a (b:4b2a) - ld b, 0 - ld c, NUM_TMS + NUM_HMS - ld hl, wTMsHMs -.loop - ld a, [hli] - and a - jr z, .skip - inc b -.skip - dec c - jr nz, .loop - ld a, b - ld [wd265], a - ret - -PrintMoveDesc: ; 2cb3e - push hl - ld hl, MoveDescriptions - ld a, [wCurSpecies] - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld a, [hli] - ld e, a - ld d, [hl] - pop hl - jp PlaceString -; 2cb52 diff --git a/engine/predef.asm b/engine/predef.asm deleted file mode 100644 index 13c593c90..000000000 --- a/engine/predef.asm +++ /dev/null @@ -1,29 +0,0 @@ -GetPredefPointer:: ; 854b -; Return the bank and address of wPredefID in a and wPredefAddress. - -; Save hl for later (back in Predef) - ld a, h - ld [wPredefTemp], a - ld a, l - ld [wPredefTemp + 1], a - - push de - ld a, [wPredefID] - ld e, a - ld d, 0 - ld hl, PredefPointers - add hl, de - add hl, de - add hl, de - pop de - - ld a, [hli] - ld [wPredefAddress + 1], a - ld a, [hli] - ld [wPredefAddress], a - ld a, [hl] - - ret -; 856b - -INCLUDE "data/predef_pointers.asm" diff --git a/engine/routines/checknickerrors.asm b/engine/routines/checknickerrors.asm deleted file mode 100644 index 87ebd6bb3..000000000 --- a/engine/routines/checknickerrors.asm +++ /dev/null @@ -1,74 +0,0 @@ -CheckNickErrors:: ; 669f -; error-check monster nick before use -; must be a peace offering to gamesharkers - -; input: de = nick location - - push bc - push de - ld b, MON_NAME_LENGTH - -.checkchar -; end of nick? - ld a, [de] - cp "@" ; terminator - jr z, .end - -; check if this char is a text command - ld hl, .textcommands - dec hl -.loop -; next entry - inc hl -; reached end of commands table? - ld a, [hl] - cp -1 - jr z, .done - -; is the current char between this value (inclusive)... - ld a, [de] - cp [hl] - inc hl - jr c, .loop -; ...and this one? - cp [hl] - jr nc, .loop - -; replace it with a "?" - ld a, "?" - ld [de], a - jr .loop - -.done -; next char - inc de -; reached end of nick without finding a terminator? - dec b - jr nz, .checkchar - -; change nick to "?@" - pop de - push de - ld a, "?" - ld [de], a - inc de - ld a, "@" - ld [de], a -.end -; if the nick has any errors at this point it's out of our hands - pop de - pop bc - ret - -.textcommands ; 66cf -; table defining which characters are actually text commands -; format: - ; ≥ < - db TX_START, TX_BOX + 1 - db "", "" + 1 - db "", "" + 1 - db "", "" + 1 - db "", "" + 1 - db "", "" + 1 - db "", "┘" + 1 - db -1 ; end diff --git a/engine/routines/checksave.asm b/engine/routines/checksave.asm deleted file mode 100644 index 2280f0e53..000000000 --- a/engine/routines/checksave.asm +++ /dev/null @@ -1,20 +0,0 @@ -CheckSave:: ; 4cffe - ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) - call GetSRAMBank - ld a, [sCheckValue1] - ld b, a - ld a, [sCheckValue2] - ld c, a - call CloseSRAM - ld a, b - cp SAVE_CHECK_VALUE_1 - jr nz, .ok - ld a, c - cp SAVE_CHECK_VALUE_2 - jr nz, .ok - ld c, $1 - ret - -.ok - ld c, $0 - ret diff --git a/engine/routines/checktime.asm b/engine/routines/checktime.asm deleted file mode 100644 index 4c7d033ff..000000000 --- a/engine/routines/checktime.asm +++ /dev/null @@ -1,19 +0,0 @@ -CheckTime:: ; c000 - ld a, [wTimeOfDay] - ld hl, .TimeOfDayTable - ld de, 2 - call IsInArray - inc hl - ld c, [hl] - ret c - - xor a - ld c, a - ret - -.TimeOfDayTable: ; c012 - db MORN_F, MORN - db DAY_F, DAY - db NITE_F, NITE - db NITE_F, NITE - db -1 diff --git a/engine/routines/correcterrorsinplayerparty.asm b/engine/routines/correcterrorsinplayerparty.asm deleted file mode 100644 index e815aa4c8..000000000 --- a/engine/routines/correcterrorsinplayerparty.asm +++ /dev/null @@ -1,229 +0,0 @@ -Unreferenced_CorrectErrorsInPlayerParty: - ld hl, wPartyCount - ld a, [hl] - and a - ret z - - cp PARTY_LENGTH + 1 - jr c, .party_length_okay - ld a, PARTY_LENGTH - ld [hl], a -.party_length_okay - inc hl - - ld b, a - ld c, 0 -.loop1 - ld a, [hl] - and a - jr z, .invalid_species - cp NUM_POKEMON + 1 - jr z, .invalid_species - cp EGG + 1 - jr c, .next_species - -.invalid_species - ld [hl], SMEARGLE - push hl - push bc - ld a, c - ld hl, wPartyMon1Species - call GetPartyLocation - ld [hl], SMEARGLE - pop bc - pop hl - -.next_species - inc hl - inc c - dec b - jr nz, .loop1 - ld [hl], $ff - - ld hl, wPartyMon1 - ld a, [wPartyCount] - ld d, a - ld e, 0 -.loop2 - push de - push hl - ld b, h - ld c, l - ld a, [hl] - and a - jr z, .invalid_species_2 - cp NUM_POKEMON + 1 - jr c, .check_level - -.invalid_species_2 - ld [hl], SMEARGLE - push de - ld d, 0 - ld hl, wPartySpecies - add hl, de - pop de - ld a, SMEARGLE - ld [hl], a - -.check_level - ld [wCurSpecies], a - call GetBaseData - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - cp MIN_LEVEL - ld a, MIN_LEVEL - jr c, .invalid_level - ld a, [hl] - cp MAX_LEVEL - jr c, .load_level - ld a, MAX_LEVEL -.invalid_level - ld [hl], a -.load_level - ld [wCurPartyLevel], a - - ld hl, MON_MAXHP - add hl, bc - ld d, h - ld e, l - ld hl, MON_STAT_EXP - 1 - add hl, bc - ld b, TRUE - predef CalcMonStats - pop hl - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop de - inc e - dec d - jr nz, .loop2 - - ld de, wPartyMonNicknames - ld a, [wPartyCount] - ld b, a - ld c, 0 -.loop3 - push bc - call .GetLengthOfStringWith6CharCap - push de - farcall CheckStringForErrors - pop hl - pop bc - jr nc, .valid_nickname - - push bc - push hl - ld hl, wPartySpecies - push bc - ld b, 0 - add hl, bc - pop bc - ld a, [hl] - cp EGG - ld hl, .TAMAGO - jr z, .got_nickname - ld [wd265], a - call GetPokemonName - ld hl, wStringBuffer1 -.got_nickname - pop de - ld bc, MON_NAME_LENGTH - call CopyBytes - pop bc - -.valid_nickname - inc c - dec b - jr nz, .loop3 - - ld de, wPartyMonOT - ld a, [wPartyCount] - ld b, a - ld c, 0 -.loop4 - push bc - call .GetLengthOfStringWith6CharCap - push de - farcall CheckStringForErrors - pop hl - jr nc, .valid_ot_name - ld d, h - ld e, l - ld hl, wPlayerName - ld bc, NAME_LENGTH - call CopyBytes -.valid_ot_name - pop bc - inc c - dec b - jr nz, .loop4 - - ld hl, wPartyMon1Moves - ld a, [wPartyCount] - ld b, a -.loop5 - push hl - ld c, NUM_MOVES - ld a, [hl] - and a - jr z, .invalid_move - cp NUM_ATTACKS + 1 - jr c, .moves_loop -.invalid_move - ld [hl], POUND - -.moves_loop - ld a, [hl] - and a - jr z, .fill_invalid_moves - cp NUM_ATTACKS + 1 - jr c, .next_move - -.fill_invalid_moves - xor a - ld [hli], a - dec c - jr nz, .fill_invalid_moves - jr .next_pokemon - -.next_move - inc hl - dec c - jr nz, .moves_loop - -.next_pokemon - pop hl - push bc - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop bc - dec b - jr nz, .loop5 - ret -; 13b6b - -.TAMAGO: ; 13b6b - db "タマゴ@@@" -; 13b71 - -.GetLengthOfStringWith6CharCap: ; 13b71 - push de - ld c, 1 - ld b, NAME_LENGTH_JAPANESE -.search_loop - ld a, [de] - cp "@" - jr z, .done - inc de - inc c - dec b - jr nz, .search_loop - dec c - dec de - ld a, "@" - ld [de], a -.done - pop de - ret -; 13b87 diff --git a/engine/routines/loadpushoam.asm b/engine/routines/loadpushoam.asm deleted file mode 100644 index 95f67ff73..000000000 --- a/engine/routines/loadpushoam.asm +++ /dev/null @@ -1,21 +0,0 @@ -WriteOAMDMACodeToHRAM:: ; 4031 - ld c, hTransferVirtualOAM - $ff00 - ld b, .PushOAMEnd - .PushOAM - ld hl, .PushOAM -.loop - ld a, [hli] - ld [$ff00+c], a - inc c - dec b - jr nz, .loop - ret - -.PushOAM: ; 403f - ld a, HIGH(wVirtualOAM) - ld [rDMA], a - ld a, NUM_SPRITE_OAM_STRUCTS -.pushoam_loop - dec a - jr nz, .pushoam_loop - ret -.PushOAMEnd diff --git a/engine/routines/phonering_copytilemapatonce.asm b/engine/routines/phonering_copytilemapatonce.asm deleted file mode 100644 index b0d4ffa1e..000000000 --- a/engine/routines/phonering_copytilemapatonce.asm +++ /dev/null @@ -1,80 +0,0 @@ -PhoneRing_CopyTilemapAtOnce: ; 4d188 - ld a, [hCGB] - and a - jp z, WaitBGMap - ld a, [wSpriteUpdatesEnabled] - cp $0 - jp z, WaitBGMap - -; What follows is a modified version of CopyTilemapAtOnce. - ld a, [hBGMapMode] - push af - xor a - ld [hBGMapMode], a - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a -.wait - ld a, [rLY] - cp LY_VBLANK - 1 - jr c, .wait - - di - ld a, BANK(vBGMap2) - ld [rVBK], a - hlcoord 0, 0, wAttrMap - call .CopyTilemapAtOnce - ld a, BANK(vBGMap0) - ld [rVBK], a - hlcoord 0, 0 - call .CopyTilemapAtOnce -.wait2 - ld a, [rLY] - cp LY_VBLANK - 1 - jr c, .wait2 - ei - - pop af - ld [hMapAnims], a - pop af - ld [hBGMapMode], a - ret - -.CopyTilemapAtOnce: ; 4d1cb - ld [hSPBuffer], sp - ld sp, hl - ld a, [hBGMapAddress + 1] - ld h, a - ld l, 0 - ld a, SCREEN_HEIGHT - ld [hTilesPerCycle], a - ld b, 1 << 1 ; not in v/hblank - ld c, LOW(rSTAT) - -.loop -rept SCREEN_WIDTH / 2 - pop de -.loop\@ - ld a, [$ff00+c] - and b - jr nz, .loop\@ - ld [hl], e - inc l - ld [hl], d - inc l -endr - - ld de, BG_MAP_WIDTH - SCREEN_WIDTH - add hl, de - ld a, [hTilesPerCycle] - dec a - ld [hTilesPerCycle], a - jr nz, .loop - - ld a, [hSPBuffer] - ld l, a - ld a, [hSPBuffer + 1] - ld h, a - ld sp, hl - ret diff --git a/engine/routines/placewaitingtext.asm b/engine/routines/placewaitingtext.asm deleted file mode 100644 index 9b2260722..000000000 --- a/engine/routines/placewaitingtext.asm +++ /dev/null @@ -1,24 +0,0 @@ -PlaceWaitingText:: ; 4000 - hlcoord 3, 10 - ld b, 1 - ld c, 11 - - ld a, [wBattleMode] - and a - jr z, .notinbattle - - call TextBox - jr .proceed - -.notinbattle - predef LinkTextboxAtHL - -.proceed - hlcoord 4, 11 - ld de, .Waiting - call PlaceString - ld c, 50 - jp DelayFrames - -.Waiting: ; 4025 - db "Waiting...!@" diff --git a/engine/routines/playslowcry.asm b/engine/routines/playslowcry.asm deleted file mode 100644 index 1f27a7ca4..000000000 --- a/engine/routines/playslowcry.asm +++ /dev/null @@ -1,31 +0,0 @@ -PlaySlowCry: ; fb841 - ld a, [wScriptVar] - call LoadCry - jr c, .done - - ld hl, wCryPitch - ld a, [hli] - ld h, [hl] - ld l, a - ld bc, -$140 - add hl, bc - ld a, l - ld [wCryPitch], a - ld a, h - ld [wCryPitch + 1], a - ld hl, wCryLength - ld a, [hli] - ld h, [hl] - ld l, a - ld bc, $60 - add hl, bc - ld a, l - ld [wCryLength], a - ld a, h - ld [wCryLength + 1], a - farcall _PlayCry - call WaitSFX - -.done - ret -; fb877 diff --git a/engine/routines/predef.asm b/engine/routines/predef.asm new file mode 100644 index 000000000..13c593c90 --- /dev/null +++ b/engine/routines/predef.asm @@ -0,0 +1,29 @@ +GetPredefPointer:: ; 854b +; Return the bank and address of wPredefID in a and wPredefAddress. + +; Save hl for later (back in Predef) + ld a, h + ld [wPredefTemp], a + ld a, l + ld [wPredefTemp + 1], a + + push de + ld a, [wPredefID] + ld e, a + ld d, 0 + ld hl, PredefPointers + add hl, de + add hl, de + add hl, de + pop de + + ld a, [hli] + ld [wPredefAddress + 1], a + ld a, [hli] + ld [wPredefAddress], a + ld a, [hl] + + ret +; 856b + +INCLUDE "data/predef_pointers.asm" diff --git a/engine/routines/savemenu_copytilemapatonce.asm b/engine/routines/savemenu_copytilemapatonce.asm deleted file mode 100644 index 9b50494a4..000000000 --- a/engine/routines/savemenu_copytilemapatonce.asm +++ /dev/null @@ -1,77 +0,0 @@ -SaveMenu_CopyTilemapAtOnce: ; 4cf45 (13:4f45) - ld a, [hCGB] - and a - jp z, WaitBGMap - -; The following is a modified version of CopyTilemapAtOnce. - ld a, [hBGMapMode] - push af - xor a - ld [hBGMapMode], a - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a -.WaitLY: - ld a, [rLY] - cp $60 - jr c, .WaitLY - - di - ld a, BANK(vBGMap2) - ld [rVBK], a - hlcoord 0, 0, wAttrMap - call .CopyTilemapAtOnce - ld a, BANK(vBGMap0) - ld [rVBK], a - hlcoord 0, 0 - call .CopyTilemapAtOnce -.WaitLY2: - ld a, [rLY] - cp $60 - jr c, .WaitLY2 - ei - - pop af - ld [hMapAnims], a - pop af - ld [hBGMapMode], a - ret - -.CopyTilemapAtOnce: ; 4cf80 (13:4f80) - ld [hSPBuffer], sp ; $ffd9 - ld sp, hl - ld a, [hBGMapAddress + 1] - ld h, a - ld l, 0 - ld a, SCREEN_HEIGHT - ld [hTilesPerCycle], a - ld b, 1 << 1 - ld c, LOW(rSTAT) - -.loop -rept SCREEN_WIDTH / 2 - pop de -.loop\@ - ld a, [$ff00+c] - and b - jr nz, .loop\@ - ld [hl], e - inc l - ld [hl], d - inc l -endr - - ld de, BG_MAP_WIDTH - SCREEN_WIDTH - add hl, de - ld a, [hTilesPerCycle] - dec a - ld [hTilesPerCycle], a - jr nz, .loop - - ld a, [hSPBuffer] - ld l, a - ld a, [hSPBuffer + 1] - ld h, a - ld sp, hl - ret diff --git a/engine/routines/townmap_convertlinebreakcharacters.asm b/engine/routines/townmap_convertlinebreakcharacters.asm deleted file mode 100644 index 6ccd79aae..000000000 --- a/engine/routines/townmap_convertlinebreakcharacters.asm +++ /dev/null @@ -1,21 +0,0 @@ -TownMap_ConvertLineBreakCharacters: ; 1de2c5 - ld hl, wStringBuffer1 -.loop - ld a, [hl] - cp "@" - jr z, .end - cp "%" - jr z, .line_break - cp "¯" - jr z, .line_break - inc hl - jr .loop - -.line_break - ld [hl], "" - -.end - ld de, wStringBuffer1 - hlcoord 9, 0 - call PlaceString - ret diff --git a/engine/save.asm b/engine/save.asm deleted file mode 100644 index 7984c1612..000000000 --- a/engine/save.asm +++ /dev/null @@ -1,1210 +0,0 @@ -SaveMenu: ; 14a1a - call LoadStandardMenuHeader - farcall DisplaySaveInfoOnSave - call SpeechTextBox - call UpdateSprites - farcall SaveMenu_CopyTilemapAtOnce - ld hl, Text_WouldYouLikeToSaveTheGame - call SaveTheGame_yesorno - jr nz, .refused - call AskOverwriteSaveFile - jr c, .refused - call PauseGameLogic - call _SavingDontTurnOffThePower - call ResumeGameLogic - call ExitMenu - and a - ret - -.refused - call ExitMenu - call ret_d90 - farcall SaveMenu_CopyTilemapAtOnce - scf - ret - -SaveAfterLinkTrade: ; 14a58 - call PauseGameLogic - farcall StageRTCTimeForSave - farcall BackupMysteryGift - call SavePokemonData - call SaveChecksum - call SaveBackupPokemonData - call SaveBackupChecksum - farcall BackupPartyMonMail - farcall SaveRTC - call ResumeGameLogic - ret -; 14a83 - - -ChangeBoxSaveGame: ; 14a83 (5:4a83) - push de - ld hl, Text_SaveOnBoxSwitch - call MenuTextBox - call YesNoBox - call ExitMenu - jr c, .refused - call AskOverwriteSaveFile - jr c, .refused - call PauseGameLogic - call SavingDontTurnOffThePower - call SaveBox - pop de - ld a, e - ld [wCurBox], a - call LoadBox - call SavedTheGame - call ResumeGameLogic - and a - ret -.refused - pop de - ret - -Link_SaveGame: ; 14ab2 - call AskOverwriteSaveFile - jr c, .refused - call PauseGameLogic - call _SavingDontTurnOffThePower - call ResumeGameLogic - and a - -.refused - ret -; 14ac2 - -MoveMonWOMail_SaveGame: ; 14ac2 - call PauseGameLogic - push de - call SaveBox - pop de - ld a, e - ld [wCurBox], a - call LoadBox - call ResumeGameLogic - ret -; 14ad5 - -MoveMonWOMail_InsertMon_SaveGame: ; 14ad5 - call PauseGameLogic - push de - call SaveBox - pop de - ld a, e - ld [wCurBox], a - ld a, $1 - ld [wSaveFileExists], a - farcall StageRTCTimeForSave - farcall BackupMysteryGift - call ValidateSave - call SaveOptions - call SavePlayerData - call SavePokemonData - call SaveChecksum - call ValidateBackupSave - call SaveBackupOptions - call SaveBackupPlayerData - call SaveBackupPokemonData - call SaveBackupChecksum - farcall BackupPartyMonMail - farcall BackupMobileEventIndex - farcall SaveRTC - call LoadBox - call ResumeGameLogic - ld de, SFX_SAVE - call PlaySFX - ld c, 24 - call DelayFrames - ret -; 14b34 - -StartMoveMonWOMail_SaveGame: ; 14b34 - ld hl, Text_SaveOnMoveMonWOMail - call MenuTextBox - call YesNoBox - call ExitMenu - jr c, .refused - call AskOverwriteSaveFile - jr c, .refused - call PauseGameLogic - call _SavingDontTurnOffThePower - call ResumeGameLogic - and a - ret - -.refused - scf - ret -; 14b54 - -PauseGameLogic: ; 14b54 - ld a, $1 - ld [wGameLogicPaused], a - ret -; 14b5a - -ResumeGameLogic: ; 14b5a - xor a - ld [wGameLogicPaused], a - ret -; 14b5f - - -AddHallOfFameEntry: ; 14b5f - ld a, BANK(sHallOfFame) - call GetSRAMBank - ld hl, sHallOfFame + HOF_LENGTH * (NUM_HOF_TEAMS - 1) - 1 - ld de, sHallOfFame + HOF_LENGTH * NUM_HOF_TEAMS - 1 - ld bc, HOF_LENGTH * (NUM_HOF_TEAMS - 1) -.loop - ld a, [hld] - ld [de], a - dec de - dec bc - ld a, c - or b - jr nz, .loop - ld hl, wOverworldMap - ld de, sHallOfFame - ld bc, HOF_LENGTH - call CopyBytes - call CloseSRAM - ret -; 14b85 - -SaveGameData: ; 14b85 - call SaveGameData_ - ret -; 14b89 - -AskOverwriteSaveFile: ; 14b89 - ld a, [wSaveFileExists] - and a - jr z, .erase - call CompareLoadedAndSavedPlayerID - jr z, .yoursavefile - ld hl, Text_AnotherSaveFile - call SaveTheGame_yesorno - jr nz, .refused - jr .erase - -.yoursavefile - ld hl, Text_AlreadyASaveFile - call SaveTheGame_yesorno - jr nz, .refused - jr .ok - -.erase - call ErasePreviousSave - -.ok - and a - ret - -.refused - scf - ret -; 14baf - -SaveTheGame_yesorno: ; 14baf - ld b, BANK(Text_WouldYouLikeToSaveTheGame) - call MapTextbox - call LoadMenuTextBox - lb bc, 0, 7 - call PlaceYesNoBox - ld a, [wMenuCursorY] - dec a - call CloseWindow - push af - call ret_d90 - pop af - and a - ret -; 14bcb - -CompareLoadedAndSavedPlayerID: ; 14bcb - ld a, BANK(sPlayerData) - call GetSRAMBank - ld hl, sPlayerData + (wPlayerID - wPlayerData) - ld a, [hli] - ld c, [hl] - ld b, a - call CloseSRAM - ld a, [wPlayerID] - cp b - ret nz - ld a, [wPlayerID + 1] - cp c - ret -; 14be3 - -_SavingDontTurnOffThePower: ; 14be3 - call SavingDontTurnOffThePower -SavedTheGame: ; 14be6 - call SaveGameData_ - ; wait 32 frames - ld c, $20 - call DelayFrames - ; copy the original text speed setting to the stack - ld a, [wOptions] - push af - ; set text speed super slow - ld a, 3 - ld [wOptions], a - ; saved the game! - ld hl, Text_PlayerSavedTheGame - call PrintText - ; restore the original text speed setting - pop af - ld [wOptions], a - ld de, SFX_SAVE - call WaitPlaySFX - call WaitSFX - ; wait 30 frames - ld c, $1e - call DelayFrames - ret -; 14c10 - - -SaveGameData_: ; 14c10 - ld a, 1 - ld [wSaveFileExists], a - farcall StageRTCTimeForSave - farcall BackupMysteryGift - call ValidateSave - call SaveOptions - call SavePlayerData - call SavePokemonData - call SaveBox - call SaveChecksum - call ValidateBackupSave - call SaveBackupOptions - call SaveBackupPlayerData - call SaveBackupPokemonData - call SaveBackupChecksum - call UpdateStackTop - farcall BackupPartyMonMail - farcall BackupMobileEventIndex - farcall SaveRTC - ld a, BANK(sBattleTowerChallengeState) - call GetSRAMBank - ld a, [sBattleTowerChallengeState] - cp BATTLETOWER_RECEIVED_REWARD - jr nz, .ok - xor a - ld [sBattleTowerChallengeState], a -.ok - call CloseSRAM - ret -; 14c6b - -UpdateStackTop: ; 14c6b -; sStackTop appears to be unused. -; It could have been used to debug stack overflow during saving. - call FindStackTop - ld a, BANK(sStackTop) - call GetSRAMBank - ld a, [sStackTop + 0] - ld e, a - ld a, [sStackTop + 1] - ld d, a - or e - jr z, .update - ld a, e - sub l - ld a, d - sbc h - jr c, .done - -.update - ld a, l - ld [sStackTop + 0], a - ld a, h - ld [sStackTop + 1], a - -.done - call CloseSRAM - ret -; 14c90 - -FindStackTop: ; 14c90 -; Find the furthest point that sp has traversed to. -; This is distinct from the current value of sp. - ld hl, wStack - $ff -.loop - ld a, [hl] - or a - ret nz - inc hl - jr .loop -; 14c99 - -SavingDontTurnOffThePower: ; 14c99 - ; Prevent joypad interrupts - xor a - ld [hJoypadReleased], a - ld [hJoypadPressed], a - ld [hJoypadSum], a - ld [hJoypadDown], a - ; Save the text speed setting to the stack - ld a, [wOptions] - push af - ; Set the text speed to super slow - ld a, $3 - ld [wOptions], a - ; SAVING... DON'T TURN OFF THE POWER. - ld hl, Text_SavingDontTurnOffThePower - call PrintText - ; Restore the text speed setting - pop af - ld [wOptions], a - ; Wait for 16 frames - ld c, $10 - call DelayFrames - ret -; 14cbb - - -ErasePreviousSave: ; 14cbb - call EraseBoxes - call EraseHallOfFame - call EraseLinkBattleStats - call EraseMysteryGift - call SaveData - call EraseBattleTowerStatus - ld a, BANK(sStackTop) - call GetSRAMBank - xor a - ld [sStackTop + 0], a - ld [sStackTop + 1], a - call CloseSRAM - ld a, $1 - ld [wSavedAtLeastOnce], a - ret -; 14ce2 - -EraseLinkBattleStats: ; 14ce2 - ld a, BANK(sLinkBattleStats) - call GetSRAMBank - ld hl, sLinkBattleStats - ld bc, sLinkBattleStatsEnd - sLinkBattleStats - xor a - call ByteFill - jp CloseSRAM -; 14cf4 - -EraseMysteryGift: ; 14cf4 - ld a, BANK(sBackupMysteryGiftItem) - call GetSRAMBank - ld hl, sBackupMysteryGiftItem - ld bc, sBackupMysteryGiftItemEnd - sBackupMysteryGiftItem - xor a - call ByteFill - jp CloseSRAM -; 14d06 - -EraseHallOfFame: ; 14d06 - ld a, BANK(sHallOfFame) - call GetSRAMBank - ld hl, sHallOfFame - ld bc, sHallOfFameEnd - sHallOfFame - xor a - call ByteFill - jp CloseSRAM -; 14d18 - -Unreferenced_Function14d18: ; 14d18 -; copy .Data to SRA4:a007 - ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 - call GetSRAMBank - ld hl, .Data - ld de, $a007 ; address of MBC30 bank - ld bc, .DataEnd - .Data - call CopyBytes - jp CloseSRAM -; 14d2c - -.Data: ; 14d2c - db $0d, $02, $00, $05, $00, $00 - db $22, $02, $01, $05, $00, $00 - db $03, $04, $05, $08, $03, $05 - db $0e, $06, $03, $02, $00, $00 - db $39, $07, $07, $04, $00, $05 - db $04, $07, $01, $05, $00, $00 - db $0f, $05, $14, $07, $05, $05 - db $11, $0c, $0c, $06, $06, $04 -; 14d5c -.DataEnd - -EraseBattleTowerStatus: ; 14d5c - ld a, BANK(sBattleTowerChallengeState) - call GetSRAMBank - xor a - ld [sBattleTowerChallengeState], a - jp CloseSRAM -; 14d68 - -SaveData: ; 14d68 - call _SaveData - ret -; 14d6c - -Unreferenced_Function14d6c: ; 14d6c - ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 - call GetSRAMBank - ld a, [$a60b] ; address of MBC30 bank - ld b, $0 - and a - jr z, .ok - ld b, $2 - -.ok - ld a, b - ld [$a60b], a ; address of MBC30 bank - call CloseSRAM - ret -; 14d83 - -Unreferenced_Function14d83: ; 14d83 - ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 - call GetSRAMBank - xor a - ld [$a60c], a ; address of MBC30 bank - ld [$a60d], a ; address of MBC30 bank - call CloseSRAM - ret -; 14d93 - -Unreferenced_Function14d93: ; 14d93 - ld a, 7 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 - call GetSRAMBank - xor a - ld [$a000], a ; address of MBC30 bank - call CloseSRAM - ret -; 14da0 - - -HallOfFame_InitSaveIfNeeded: ; 14da0 - ld a, [wSavedAtLeastOnce] - and a - ret nz - call ErasePreviousSave - ret -; 14da9 - -ValidateSave: ; 14da9 - ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) - call GetSRAMBank - ld a, SAVE_CHECK_VALUE_1 - ld [sCheckValue1], a - ld a, SAVE_CHECK_VALUE_2 - ld [sCheckValue2], a - jp CloseSRAM -; 14dbb - -SaveOptions: ; 14dbb - ld a, BANK(sOptions) - call GetSRAMBank - ld hl, wOptions - ld de, sOptions - ld bc, wOptionsEnd - wOptions - call CopyBytes - ld a, [wOptions] - and $ff ^ (1 << NO_TEXT_SCROLL) - ld [sOptions], a - jp CloseSRAM -; 14dd7 - -SavePlayerData: ; 14dd7 - ld a, BANK(sPlayerData) - call GetSRAMBank - ld hl, wPlayerData - ld de, sPlayerData - ld bc, wPlayerDataEnd - wPlayerData - call CopyBytes - ld hl, wCurrMapData - ld de, sCurrMapData - ld bc, wCurrMapDataEnd - wCurrMapData - call CopyBytes - jp CloseSRAM -; 14df7 - -SavePokemonData: ; 14df7 - ld a, BANK(sPokemonData) - call GetSRAMBank - ld hl, wPokemonData - ld de, sPokemonData - ld bc, wPokemonDataEnd - wPokemonData - call CopyBytes - call CloseSRAM - ret -; 14e0c - -SaveBox: ; 14e0c - call GetBoxAddress - call SaveBoxAddress - ret -; 14e13 - -SaveChecksum: ; 14e13 - ld hl, sGameData - ld bc, sGameDataEnd - sGameData - ld a, BANK(sGameData) - call GetSRAMBank - call Checksum - ld a, e - ld [sChecksum + 0], a - ld a, d - ld [sChecksum + 1], a - call CloseSRAM - ret -; 14e2d - -ValidateBackupSave: ; 14e2d - ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2) - call GetSRAMBank - ld a, SAVE_CHECK_VALUE_1 - ld [sBackupCheckValue1], a - ld a, SAVE_CHECK_VALUE_2 - ld [sBackupCheckValue2], a - call CloseSRAM - ret -; 14e40 - -SaveBackupOptions: ; 14e40 - ld a, BANK(sBackupOptions) - call GetSRAMBank - ld hl, wOptions - ld de, sBackupOptions - ld bc, wOptionsEnd - wOptions - call CopyBytes - call CloseSRAM - ret -; 14e55 - -SaveBackupPlayerData: ; 14e55 - ld a, BANK(sBackupPlayerData) - call GetSRAMBank - ld hl, wPlayerData - ld de, sBackupPlayerData - ld bc, wPlayerDataEnd - wPlayerData - call CopyBytes - ld hl, wCurrMapData - ld de, sBackupCurrMapData - ld bc, wCurrMapDataEnd - wCurrMapData - call CopyBytes - call CloseSRAM - ret -; 14e76 - -SaveBackupPokemonData: ; 14e76 - ld a, BANK(sBackupPokemonData) - call GetSRAMBank - ld hl, wPokemonData - ld de, sBackupPokemonData - ld bc, wPokemonDataEnd - wPokemonData - call CopyBytes - call CloseSRAM - ret -; 14e8b - -SaveBackupChecksum: ; 14e8b - ld hl, sBackupGameData - ld bc, sBackupGameDataEnd - sBackupGameData - ld a, BANK(sBackupGameData) - call GetSRAMBank - call Checksum - ld a, e - ld [sBackupChecksum + 0], a - ld a, d - ld [sBackupChecksum + 1], a - call CloseSRAM - ret -; 14ea5 - - -TryLoadSaveFile: ; 14ea5 (5:4ea5) - call VerifyChecksum - jr nz, .backup - call LoadPlayerData - call LoadPokemonData - call LoadBox - farcall RestorePartyMonMail - farcall RestoreMobileEventIndex - farcall RestoreMysteryGift - call ValidateBackupSave - call SaveBackupOptions - call SaveBackupPlayerData - call SaveBackupPokemonData - call SaveBackupChecksum - and a - ret - -.backup - call VerifyBackupChecksum - jr nz, .corrupt - call LoadBackupPlayerData - call LoadBackupPokemonData - call LoadBox - farcall RestorePartyMonMail - farcall RestoreMobileEventIndex - farcall RestoreMysteryGift - call ValidateSave - call SaveOptions - call SavePlayerData - call SavePokemonData - call SaveChecksum - and a - ret - -.corrupt - ld a, [wOptions] - push af - set NO_TEXT_SCROLL, a - ld [wOptions], a - ld hl, Text_SaveFileCorrupted - call PrintText - pop af - ld [wOptions], a - scf - ret - - -TryLoadSaveData: ; 14f1c - xor a - ld [wSaveFileExists], a - call CheckPrimarySaveFile - ld a, [wSaveFileExists] - and a - jr z, .backup - - ld a, BANK(sPlayerData) - call GetSRAMBank - ld hl, sPlayerData + wStartDay - wPlayerData - ld de, wStartDay - ld bc, 8 - call CopyBytes - ld hl, sPlayerData + wStatusFlags - wPlayerData - ld de, wStatusFlags - ld a, [hl] - ld [de], a - call CloseSRAM - ret - -.backup - call CheckBackupSaveFile - ld a, [wSaveFileExists] - and a - jr z, .corrupt - - ld a, BANK(sBackupPlayerData) - call GetSRAMBank - ld hl, sBackupPlayerData + wStartDay - wPlayerData - ld de, wStartDay - ld bc, 8 - call CopyBytes - ld hl, sBackupPlayerData + wStatusFlags - wPlayerData - ld de, wStatusFlags - ld a, [hl] - ld [de], a - call CloseSRAM - ret - -.corrupt - ld hl, DefaultOptions - ld de, wOptions - ld bc, wOptionsEnd - wOptions - call CopyBytes - call PanicResetClock - ret -; 14f7c - - -INCLUDE "data/default_options.asm" - - -CheckPrimarySaveFile: ; 14f84 - ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) - call GetSRAMBank - ld a, [sCheckValue1] - cp SAVE_CHECK_VALUE_1 - jr nz, .nope - ld a, [sCheckValue2] - cp SAVE_CHECK_VALUE_2 - jr nz, .nope - ld hl, sOptions - ld de, wOptions - ld bc, wOptionsEnd - wOptions - call CopyBytes - call CloseSRAM - ld a, $1 - ld [wSaveFileExists], a - -.nope - call CloseSRAM - ret -; 14faf - -CheckBackupSaveFile: ; 14faf - ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2) - call GetSRAMBank - ld a, [sBackupCheckValue1] - cp SAVE_CHECK_VALUE_1 - jr nz, .nope - ld a, [sBackupCheckValue2] - cp SAVE_CHECK_VALUE_2 - jr nz, .nope - ld hl, sBackupOptions - ld de, wOptions - ld bc, wOptionsEnd - wOptions - call CopyBytes - ld a, $2 - ld [wSaveFileExists], a - -.nope - call CloseSRAM - ret -; 14fd7 - - -LoadPlayerData: ; 14fd7 (5:4fd7) - ld a, BANK(sPlayerData) - call GetSRAMBank - ld hl, sPlayerData - ld de, wPlayerData - ld bc, wPlayerDataEnd - wPlayerData - call CopyBytes - ld hl, sCurrMapData - ld de, wCurrMapData - ld bc, wCurrMapDataEnd - wCurrMapData - call CopyBytes - call CloseSRAM - ld a, BANK(sBattleTowerChallengeState) - call GetSRAMBank - ld a, [sBattleTowerChallengeState] - cp BATTLETOWER_RECEIVED_REWARD - jr nz, .not_4 - ld a, BATTLETOWER_WON_CHALLENGE - ld [sBattleTowerChallengeState], a -.not_4 - call CloseSRAM - ret - -LoadPokemonData: ; 1500c - ld a, BANK(sPokemonData) - call GetSRAMBank - ld hl, sPokemonData - ld de, wPokemonData - ld bc, wPokemonDataEnd - wPokemonData - call CopyBytes - call CloseSRAM - ret -; 15021 - -LoadBox: ; 15021 (5:5021) - call GetBoxAddress - call LoadBoxAddress - ret - -VerifyChecksum: ; 15028 (5:5028) - ld hl, sGameData - ld bc, sGameDataEnd - sGameData - ld a, BANK(sGameData) - call GetSRAMBank - call Checksum - ld a, [sChecksum + 0] - cp e - jr nz, .fail - ld a, [sChecksum + 1] - cp d -.fail - push af - call CloseSRAM - pop af - ret - -LoadBackupPlayerData: ; 15046 (5:5046) - ld a, BANK(sBackupPlayerData) - call GetSRAMBank - ld hl, sBackupPlayerData - ld de, wPlayerData - ld bc, wPlayerDataEnd - wPlayerData - call CopyBytes - ld hl, sBackupCurrMapData - ld de, wCurrMapData - ld bc, wCurrMapDataEnd - wCurrMapData - call CopyBytes - call CloseSRAM - ret - -LoadBackupPokemonData: ; 15067 (5:5067) - ld a, BANK(sBackupPokemonData) - call GetSRAMBank - ld hl, sBackupPokemonData - ld de, wPokemonData - ld bc, wPokemonDataEnd - wPokemonData - call CopyBytes - call CloseSRAM - ret - -VerifyBackupChecksum: ; 1507c (5:507c) - ld hl, sBackupGameData - ld bc, sBackupGameDataEnd - sBackupGameData - ld a, BANK(sBackupGameData) - call GetSRAMBank - call Checksum - ld a, [sBackupChecksum + 0] - cp e - jr nz, .fail - ld a, [sBackupChecksum + 1] - cp d -.fail - push af - call CloseSRAM - pop af - ret - - -_SaveData: ; 1509a - ; This is called within two scenarios: - ; a) ErasePreviousSave (the process of erasing the save from a previous game file) - ; b) unused mobile functionality - ; It is not part of a regular save. - - ld a, BANK(sCrystalData) - call GetSRAMBank - ld hl, wCrystalData - ld de, sCrystalData - ld bc, wCrystalDataEnd - wCrystalData - call CopyBytes - - ; This block originally had some mobile functionality, but since we're still in - ; BANK(sCrystalData), it instead overwrites the sixteen wEventFlags starting at 1:a603 with - ; garbage from wd479. This isn't an issue, since ErasePreviousSave is followed by a regular - ; save that unwrites the garbage. - - ld hl, wd479 - ld a, [hli] - ld [$a60e + 0], a - ld a, [hli] - ld [$a60e + 1], a - - jp CloseSRAM - - -_LoadData: ; 150b9 - ld a, BANK(sCrystalData) - call GetSRAMBank - ld hl, sCrystalData - ld de, wCrystalData - ld bc, wCrystalDataEnd - wCrystalData - call CopyBytes - - ; This block originally had some mobile functionality to mirror _SaveData above, but instead it - ; (harmlessly) writes the aforementioned wEventFlags to the unused wd479. - - ld hl, wd479 - ld a, [$a60e + 0] - ld [hli], a - ld a, [$a60e + 1] - ld [hli], a - - jp CloseSRAM - - -GetBoxAddress: ; 150d8 - ld a, [wCurBox] - cp NUM_BOXES - jr c, .ok - xor a - ld [wCurBox], a - -.ok - ld e, a - ld d, 0 - ld hl, BoxAddresses -rept 5 - add hl, de -endr - ld a, [hli] - push af - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - ld a, [hli] - ld h, [hl] - ld l, a - pop af - ret -; 150f9 - -SaveBoxAddress: ; 150f9 -; Save box via wMisc. -; We do this in three steps because the size of wMisc is less than -; the size of sBox. - push hl -; Load the first part of the active box. - push af - push de - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBox - ld de, wMisc - ld bc, (wMiscEnd - wMisc) - call CopyBytes - call CloseSRAM - pop de - pop af -; Save it to the target box. - push af - push de - call GetSRAMBank - ld hl, wMisc - ld bc, (wMiscEnd - wMisc) - call CopyBytes - call CloseSRAM - -; Load the second part of the active box. - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBox + (wMiscEnd - wMisc) - ld de, wMisc - ld bc, (wMiscEnd - wMisc) - call CopyBytes - call CloseSRAM - pop de - pop af - - ld hl, (wMiscEnd - wMisc) - add hl, de - ld e, l - ld d, h -; Save it to the next part of the target box. - push af - push de - call GetSRAMBank - ld hl, wMisc - ld bc, (wMiscEnd - wMisc) - call CopyBytes - call CloseSRAM - -; Load the third and final part of the active box. - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBox + (wMiscEnd - wMisc) * 2 - ld de, wMisc - ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e - call CopyBytes - call CloseSRAM - pop de - pop af - - ld hl, (wMiscEnd - wMisc) - add hl, de - ld e, l - ld d, h -; Save it to the final part of the target box. - call GetSRAMBank - ld hl, wMisc - ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e - call CopyBytes - call CloseSRAM - - pop hl - ret -; 1517d - - -LoadBoxAddress: ; 1517d (5:517d) -; Load box via wMisc. -; We do this in three steps because the size of wMisc is less than -; the size of sBox. - push hl - ld l, e - ld h, d -; Load part 1 - push af - push hl - call GetSRAMBank - ld de, wMisc - ld bc, (wMiscEnd - wMisc) - call CopyBytes - call CloseSRAM - ld a, BANK(sBox) - call GetSRAMBank - ld hl, wMisc - ld de, sBox - ld bc, (wMiscEnd - wMisc) - call CopyBytes - call CloseSRAM - pop hl - pop af - - ld de, (wMiscEnd - wMisc) - add hl, de -; Load part 2 - push af - push hl - call GetSRAMBank - ld de, wMisc - ld bc, (wMiscEnd - wMisc) - call CopyBytes - call CloseSRAM - ld a, BANK(sBox) - call GetSRAMBank - ld hl, wMisc - ld de, sBox + (wMiscEnd - wMisc) - ld bc, (wMiscEnd - wMisc) - call CopyBytes - call CloseSRAM - pop hl - pop af -; Load part 3 - ld de, (wMiscEnd - wMisc) - add hl, de - call GetSRAMBank - ld de, wMisc - ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e - call CopyBytes - call CloseSRAM - ld a, BANK(sBox) - call GetSRAMBank - ld hl, wMisc - ld de, sBox + (wMiscEnd - wMisc) * 2 - ld bc, sBoxEnd - (sBox + (wMiscEnd - wMisc) * 2) ; $8e - call CopyBytes - call CloseSRAM - - pop hl - ret - - -EraseBoxes: ; 151fb - ld hl, BoxAddresses - ld c, NUM_BOXES -.next - push bc - ld a, [hli] - call GetSRAMBank - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - xor a - ld [de], a - inc de - ld a, -1 - ld [de], a - inc de - ld bc, sBoxEnd - (sBox + 2) -.clear - xor a - ld [de], a - inc de - dec bc - ld a, b - or c - jr nz, .clear - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - ld a, -1 - ld [de], a - inc de - xor a - ld [de], a - call CloseSRAM - pop bc - dec c - jr nz, .next - ret -; 1522d - -BoxAddresses: ; 1522d -; dbww bank, address, address - dbww BANK(sBox1), sBox1, sBox1End - dbww BANK(sBox2), sBox2, sBox2End - dbww BANK(sBox3), sBox3, sBox3End - dbww BANK(sBox4), sBox4, sBox4End - dbww BANK(sBox5), sBox5, sBox5End - dbww BANK(sBox6), sBox6, sBox6End - dbww BANK(sBox7), sBox7, sBox7End - dbww BANK(sBox8), sBox8, sBox8End - dbww BANK(sBox9), sBox9, sBox9End - dbww BANK(sBox10), sBox10, sBox10End - dbww BANK(sBox11), sBox11, sBox11End - dbww BANK(sBox12), sBox12, sBox12End - dbww BANK(sBox13), sBox13, sBox13End - dbww BANK(sBox14), sBox14, sBox14End -; 15273 - - -Checksum: ; 15273 - ld de, 0 -.loop - ld a, [hli] - add e - ld e, a - ld a, 0 - adc d - ld d, a - dec bc - ld a, b - or c - jr nz, .loop - ret -; 15283 - - -Text_WouldYouLikeToSaveTheGame: ; 0x15283 - ; Would you like to save the game? - text_jump UnknownText_0x1c454b - db "@" -; 0x15288 - -Text_SavingDontTurnOffThePower: ; 0x15288 - ; SAVING… DON'T TURN OFF THE POWER. - text_jump UnknownText_0x1c456d - db "@" -; 0x1528d - -Text_PlayerSavedTheGame: ; 0x1528d - ; saved the game. - text_jump UnknownText_0x1c4590 - db "@" -; 0x15292 - -Text_AlreadyASaveFile: ; 0x15292 - ; There is already a save file. Is it OK to overwrite? - text_jump UnknownText_0x1c45a3 - db "@" -; 0x15297 - -Text_AnotherSaveFile: ; 0x15297 - ; There is another save file. Is it OK to overwrite? - text_jump UnknownText_0x1c45d9 - db "@" -; 0x1529c - -Text_SaveFileCorrupted: ; 0x1529c - ; The save file is corrupted! - text_jump UnknownText_0x1c460d - db "@" -; 0x152a1 - -Text_SaveOnBoxSwitch: ; 0x152a1 - ; When you change a #MON BOX, data will be saved. OK? - text_jump UnknownText_0x1c462a - db "@" -; 0x152a6 - -Text_SaveOnMoveMonWOMail: ; 0x152a6 - ; Each time you move a #MON, data will be saved. OK? - text_jump UnknownText_0x1c465f - db "@" -; 0x152ab diff --git a/engine/tilesets/map_palettes.asm b/engine/tilesets/map_palettes.asm new file mode 100644 index 000000000..a9d2b382f --- /dev/null +++ b/engine/tilesets/map_palettes.asm @@ -0,0 +1,86 @@ +SwapTextboxPalettes:: ; 4c000 + hlcoord 0, 0 + decoord 0, 0, wAttrMap + ld b, SCREEN_HEIGHT +.loop + push bc + ld c, SCREEN_WIDTH +.innerloop + ld a, [hl] + push hl + srl a + jr c, .UpperNybble + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + and $f + jr .next + +.UpperNybble: + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + swap a + and $f + +.next + pop hl + ld [de], a + res 7, [hl] + inc hl + inc de + dec c + jr nz, .innerloop + pop bc + dec b + jr nz, .loop + ret + +ScrollBGMapPalettes:: ; 4c03f + ld hl, wBGMapBuffer + ld de, wBGMapPalBuffer +.loop + ld a, [hl] + push hl + srl a + jr c, .UpperNybble + +; .LowerNybble + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + and $f + jr .next + +.UpperNybble: + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + swap a + and $f + +.next + pop hl + ld [de], a + res 7, [hl] + inc hl + inc de + dec c + jr nz, .loop + ret diff --git a/engine/tilesets/mapgroup_roofs.asm b/engine/tilesets/mapgroup_roofs.asm new file mode 100644 index 000000000..58e5e7cfe --- /dev/null +++ b/engine/tilesets/mapgroup_roofs.asm @@ -0,0 +1,20 @@ +LoadMapGroupRoof:: ; 1c000 + ld a, [wMapGroup] + ld e, a + ld d, 0 + ld hl, MapGroupRoofs + add hl, de + ld a, [hl] + cp -1 + ret z + ld hl, Roofs + ld bc, 9 tiles + call AddNTimes + ld de, vTiles2 tile $0a + ld bc, 9 tiles + call CopyBytes + ret +; 1c021 + + +INCLUDE "data/maps/roofs.asm" diff --git a/engine/tilesets/tileset_anims.asm b/engine/tilesets/tileset_anims.asm new file mode 100644 index 000000000..bf0037e65 --- /dev/null +++ b/engine/tilesets/tileset_anims.asm @@ -0,0 +1,1060 @@ +_AnimateTileset:: ; fc000 +; Iterate over a given pointer array of +; animation functions (one per frame). + +; Typically in wra1, vra0 + + ld a, [wTilesetAnim] + ld e, a + ld a, [wTilesetAnim + 1] + ld d, a + + ld a, [hTileAnimFrame] + ld l, a + inc a + ld [hTileAnimFrame], a + + ld h, 0 + add hl, hl + add hl, hl + add hl, de + +; 2-byte parameter +; All functions take input de. + ld e, [hl] + inc hl + ld d, [hl] + inc hl + +; Function address + ld a, [hli] + ld h, [hl] + ld l, a + + jp hl +; fc01b + +Tileset0Anim: ; 0xfc01b +TilesetJohtoModernAnim: ; 0xfc01b +TilesetKantoAnim: ; 0xfc01b + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, TileAnimationPalette + dw NULL, WaitTileAnimation + dw NULL, AnimateFlowerTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc047 + +TilesetParkAnim: ; 0xfc047 + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, WaitTileAnimation + dw vTiles2 tile $5f, AnimateFountain + dw NULL, WaitTileAnimation + dw NULL, TileAnimationPalette + dw NULL, WaitTileAnimation + dw NULL, AnimateFlowerTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc073 + +TilesetForestAnim: ; 0xfc073 + dw NULL, ForestTreeLeftAnimation + dw NULL, ForestTreeRightAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, ForestTreeLeftAnimation2 + dw NULL, ForestTreeRightAnimation2 + dw NULL, AnimateFlowerTile + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, TileAnimationPalette + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc0a3 + +TilesetJohtoAnim: ; 0xfc0a3 + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, TileAnimationPalette + dw NULL, WaitTileAnimation + dw NULL, AnimateFlowerTile + dw WhirlpoolFrames1, AnimateWhirlpoolTile + dw WhirlpoolFrames2, AnimateWhirlpoolTile + dw WhirlpoolFrames3, AnimateWhirlpoolTile + dw WhirlpoolFrames4, AnimateWhirlpoolTile + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc0d7 + +UnusedTilesetAnim_fc0d7: ; 0xfc0d7 + dw vTiles2 tile $03, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $03, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, AnimateFlowerTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc103 + +UnusedTilesetAnim_fc103: ; 0xfc103 + dw vTiles2 tile $14, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $14, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc12f + +TilesetPortAnim: ; 0xfc12f + dw vTiles2 tile $14, AnimateWaterTile + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, TileAnimationPalette + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc15f + +TilesetEliteFourRoomAnim: ; 0xfc15f + dw NULL, LavaBubbleAnim2 + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, LavaBubbleAnim1 + dw NULL, WaitTileAnimation + dw NULL, StandingTileFrame8 + dw NULL, DoneTileAnimation +; 0xfc17f + +UnusedTilesetAnim_fc17f: ; 0xfc17f + dw vTiles2 tile $53, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileDown + dw wTileAnimBuffer, ScrollTileDown + dw vTiles2 tile $53, WriteTileFromBuffer + dw vTiles2 tile $03, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $03, WriteTileFromBuffer + dw vTiles2 tile $53, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileDown + dw wTileAnimBuffer, ScrollTileDown + dw vTiles2 tile $53, WriteTileFromBuffer + dw NULL, DoneTileAnimation +; 0xfc1af + +UnusedTilesetAnim_fc1af: ; 0xfc1af + dw vTiles2 tile $54, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileDown + dw wTileAnimBuffer, ScrollTileDown + dw vTiles2 tile $54, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw vTiles2 tile $03, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $03, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw vTiles2 tile $54, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileDown + dw wTileAnimBuffer, ScrollTileDown + dw vTiles2 tile $54, WriteTileFromBuffer + dw NULL, DoneTileAnimation +; 0xfc1e7 + +TilesetCaveAnim: ; 0xfc1e7 +TilesetDarkCaveAnim: ; 0xfc1e7 + dw vTiles2 tile $14, WriteTileToBuffer + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileRightLeft + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $14, WriteTileFromBuffer + dw NULL, FlickeringCaveEntrancePalette + dw NULL, TileAnimationPalette + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $40, WriteTileToBuffer + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $40, WriteTileFromBuffer + dw NULL, FlickeringCaveEntrancePalette + dw NULL, DoneTileAnimation +; 0xfc233 + +TilesetIcePathAnim: ; 0xfc233 + dw vTiles2 tile $35, WriteTileToBuffer + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileRightLeft + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $35, WriteTileFromBuffer + dw NULL, FlickeringCaveEntrancePalette + dw NULL, TileAnimationPalette + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $31, WriteTileToBuffer + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw wTileAnimBuffer, ScrollTileDown + dw NULL, FlickeringCaveEntrancePalette + dw vTiles2 tile $31, WriteTileFromBuffer + dw NULL, FlickeringCaveEntrancePalette + dw NULL, DoneTileAnimation +; 0xfc27f + +TilesetTowerAnim: ; 0xfc27f + dw TowerPillarTilePointer9, AnimateTowerPillarTile + dw TowerPillarTilePointer10, AnimateTowerPillarTile + dw TowerPillarTilePointer7, AnimateTowerPillarTile + dw TowerPillarTilePointer8, AnimateTowerPillarTile + dw TowerPillarTilePointer5, AnimateTowerPillarTile + dw TowerPillarTilePointer6, AnimateTowerPillarTile + dw TowerPillarTilePointer3, AnimateTowerPillarTile + dw TowerPillarTilePointer4, AnimateTowerPillarTile + dw TowerPillarTilePointer1, AnimateTowerPillarTile + dw TowerPillarTilePointer2, AnimateTowerPillarTile + dw NULL, StandingTileFrame + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc2bf + +UnusedTilesetAnim_fc2bf: ; 0xfc2bf + dw vTiles2 tile $4f, WriteTileToBuffer + dw wTileAnimBuffer, ScrollTileRightLeft + dw vTiles2 tile $4f, WriteTileFromBuffer + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc2e7 + +TilesetBattleTowerOutsideAnim: ; 0xfc2e7 +TilesetHouseAnim: ; 0xfc2e7 +TilesetPlayersHouseAnim: ; 0xfc2e7 +TilesetPokecenterAnim: ; 0xfc2e7 +TilesetGateAnim: ; 0xfc2e7 +TilesetLabAnim: ; 0xfc2e7 +TilesetFacilityAnim: ; 0xfc2e7 +TilesetMartAnim: ; 0xfc2e7 +TilesetMansionAnim: ; 0xfc2e7 +TilesetGameCornerAnim: ; 0xfc2e7 +TilesetTraditionalHouseAnim: ; 0xfc2e7 +TilesetTrainStationAnim: ; 0xfc2e7 +TilesetChampionsRoomAnim: ; 0xfc2e7 +TilesetLighthouseAnim: ; 0xfc2e7 +TilesetPlayersRoomAnim: ; 0xfc2e7 +TilesetPokeComCenterAnim: ; 0xfc2e7 +TilesetBattleTowerAnim: ; 0xfc2e7 +TilesetRuinsOfAlphAnim: ; 0xfc2e7 +TilesetRadioTowerAnim: ; 0xfc2e7 +TilesetUndergroundAnim: ; 0xfc2e7 +TilesetBetaWordRoomAnim: ; 0xfc2e7 +TilesetHoOhWordRoomAnim: ; 0xfc2e7 +TilesetKabutoWordRoomAnim: ; 0xfc2e7 +TilesetOmanyteWordRoomAnim: ; 0xfc2e7 +TilesetAerodactylWordRoomAnim: ; 0xfc2e7 + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, WaitTileAnimation + dw NULL, DoneTileAnimation +; 0xfc2fb + +DoneTileAnimation: ; fc2fb +; Reset the animation command loop. + xor a + ld [hTileAnimFrame], a + +WaitTileAnimation: ; fc2fe +; Do nothing this frame. + ret +; fc2ff + +StandingTileFrame8: ; fc2ff + ld a, [wTileAnimationTimer] + inc a + and %111 + ld [wTileAnimationTimer], a + ret +; fc309 + + +ScrollTileRightLeft: ; fc309 +; Scroll right for 4 ticks, then left for 4 ticks. + ld a, [wTileAnimationTimer] + inc a + and %111 + ld [wTileAnimationTimer], a + and %100 + jr nz, ScrollTileLeft + jr ScrollTileRight +; fc318 + +ScrollTileUpDown: ; fc318 +; Scroll up for 4 ticks, then down for 4 ticks. + ld a, [wTileAnimationTimer] + inc a + and %111 + ld [wTileAnimationTimer], a + and %100 + jr nz, ScrollTileDown + jr ScrollTileUp +; fc327 + +ScrollTileLeft: ; fc327 + ld h, d + ld l, e + ld c, 4 +.loop +rept 4 + ld a, [hl] + rlca + ld [hli], a +endr + dec c + jr nz, .loop + ret +; fc33b + +ScrollTileRight: ; fc33b + ld h, d + ld l, e + ld c, 4 +.loop +rept 4 + ld a, [hl] + rrca + ld [hli], a +endr + dec c + jr nz, .loop + ret +; fc34f + +ScrollTileUp: ; fc34f + ld h, d + ld l, e + ld d, [hl] + inc hl + ld e, [hl] + ld bc, TILE_WIDTH * 2 - 2 + add hl, bc + ld a, TILE_WIDTH / 2 +.loop + ld c, [hl] + ld [hl], e + dec hl + ld b, [hl] + ld [hl], d + dec hl + ld e, [hl] + ld [hl], c + dec hl + ld d, [hl] + ld [hl], b + dec hl + dec a + jr nz, .loop + ret +; fc36a + +ScrollTileDown: ; fc36a + ld h, d + ld l, e + ld de, TILE_WIDTH * 2 - 2 + push hl + add hl, de + ld d, [hl] + inc hl + ld e, [hl] + pop hl + ld a, TILE_WIDTH / 2 +.loop + ld b, [hl] + ld [hl], d + inc hl + ld c, [hl] + ld [hl], e + inc hl + ld d, [hl] + ld [hl], b + inc hl + ld e, [hl] + ld [hl], c + inc hl + dec a + jr nz, .loop + ret +; fc387 + + +AnimateFountain: ; fc387 + ld hl, sp+0 + ld b, h + ld c, l + ld hl, .frames + ld a, [wTileAnimationTimer] + and %111 + add a + add l + ld l, a + jr nc, .okay + inc h +.okay + ld a, [hli] + ld h, [hl] + ld l, a + ld sp, hl + ld l, e + ld h, d + jp WriteTile + +.frames + dw .frame1 + dw .frame2 + dw .frame3 + dw .frame4 + dw .frame3 + dw .frame4 + dw .frame5 + dw .frame1 + +.frame1 INCBIN "gfx/tilesets/fountain/1.2bpp" +.frame2 INCBIN "gfx/tilesets/fountain/2.2bpp" +.frame3 INCBIN "gfx/tilesets/fountain/3.2bpp" +.frame4 INCBIN "gfx/tilesets/fountain/4.2bpp" +.frame5 INCBIN "gfx/tilesets/fountain/5.2bpp" +; fc402 + + +AnimateWaterTile: ; fc402 +; Draw a water tile for the current frame in VRAM tile at de. + +; Save sp in bc (see WriteTile). + ld hl, sp+0 + ld b, h + ld c, l + + ld a, [wTileAnimationTimer] + +; 4 tile graphics, updated every other frame. + and %110 + +; 2 x 8 = 16 bytes per tile + add a + add a + add a + + add LOW(WaterTileFrames) + ld l, a + ld a, 0 + adc HIGH(WaterTileFrames) + ld h, a + +; The stack now points to the start of the tile for this frame. + ld sp, hl + + ld l, e + ld h, d + + jp WriteTile +; fc41c + +WaterTileFrames: ; fc41c + INCBIN "gfx/tilesets/water/water.2bpp" +; fc45c + + +ForestTreeLeftAnimation: ; fc45c + ld hl, sp+0 + ld b, h + ld c, l + +; Only during the Celebi event. + ld a, [wCelebiEvent] + bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a + jr nz, .asm_fc46c + ld hl, ForestTreeLeftFrames + jr .asm_fc47d + +.asm_fc46c + ld a, [wTileAnimationTimer] + call GetForestTreeFrame + add a + add a + add a + add LOW(ForestTreeLeftFrames) + ld l, a + ld a, 0 + adc HIGH(ForestTreeLeftFrames) + ld h, a + +.asm_fc47d + ld sp, hl + ld hl, vTiles2 tile $0c + jp WriteTile +; fc484 + + +ForestTreeLeftFrames: ; fc484 + INCBIN "gfx/tilesets/forest-tree/1.2bpp" + INCBIN "gfx/tilesets/forest-tree/2.2bpp" +; fc4a4 + +ForestTreeRightFrames: ; fc4a4 + INCBIN "gfx/tilesets/forest-tree/3.2bpp" + INCBIN "gfx/tilesets/forest-tree/4.2bpp" +; fc4c4 + + +ForestTreeRightAnimation: ; fc4c4 + ld hl, sp+0 + ld b, h + ld c, l + +; Only during the Celebi event. + ld a, [wCelebiEvent] + bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a + jr nz, .asm_fc4d4 + ld hl, ForestTreeRightFrames + jr .asm_fc4eb + +.asm_fc4d4 + ld a, [wTileAnimationTimer] + call GetForestTreeFrame + add a + add a + add a + add LOW(ForestTreeLeftFrames) + ld l, a + ld a, 0 + adc HIGH(ForestTreeLeftFrames) + ld h, a + push bc + ld bc, ForestTreeRightFrames - ForestTreeLeftFrames + add hl, bc + pop bc + +.asm_fc4eb + ld sp, hl + ld hl, vTiles2 tile $0f + jp WriteTile +; fc4f2 + + +ForestTreeLeftAnimation2: ; fc4f2 + ld hl, sp+0 + ld b, h + ld c, l + +; Only during the Celebi event. + ld a, [wCelebiEvent] + bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a + jr nz, .asm_fc502 + ld hl, ForestTreeLeftFrames + jr .asm_fc515 + +.asm_fc502 + ld a, [wTileAnimationTimer] + call GetForestTreeFrame + xor 2 + add a + add a + add a + add LOW(ForestTreeLeftFrames) + ld l, a + ld a, 0 + adc HIGH(ForestTreeLeftFrames) + ld h, a + +.asm_fc515 + ld sp, hl + ld hl, vTiles2 tile $0c + jp WriteTile +; fc51c + + +ForestTreeRightAnimation2: ; fc51c + ld hl, sp+0 + ld b, h + ld c, l + +; Only during the Celebi event. + ld a, [wCelebiEvent] + bit CELEBIEVENT_FOREST_IS_RESTLESS_F, a + jr nz, .asm_fc52c + ld hl, ForestTreeRightFrames + jr .asm_fc545 + +.asm_fc52c + ld a, [wTileAnimationTimer] + call GetForestTreeFrame + xor 2 + add a + add a + add a + add LOW(ForestTreeLeftFrames) + ld l, a + ld a, 0 + adc HIGH(ForestTreeLeftFrames) + ld h, a + push bc + ld bc, ForestTreeRightFrames - ForestTreeLeftFrames + add hl, bc + pop bc + +.asm_fc545 + ld sp, hl + ld hl, vTiles2 tile $0f + jp WriteTile +; fc54c + + +GetForestTreeFrame: ; fc54c +; Return 0 if a is even, or 2 if odd. + and a + jr z, .even + cp 1 + jr z, .odd + cp 2 + jr z, .even + cp 3 + jr z, .odd + cp 4 + jr z, .even + cp 5 + jr z, .odd + cp 6 + jr z, .even +.odd + ld a, 2 + scf + ret +.even + xor a + ret +; fc56d + + +AnimateFlowerTile: ; fc56d +; No parameters. + +; Save sp in bc (see WriteTile). + ld hl, sp+0 + ld b, h + ld c, l + +; Alternate tile graphic every other frame + ld a, [wTileAnimationTimer] + and %10 + ld e, a + +; CGB has different color mappings for flowers. + ld a, [hCGB] + and 1 + + add e + swap a + ld e, a + ld d, 0 + ld hl, FlowerTileFrames + add hl, de + ld sp, hl + + ld hl, vTiles2 tile $03 + + jp WriteTile +; fc58c + +FlowerTileFrames: ; fc58c + INCBIN "gfx/tilesets/flower/dmg_1.2bpp" + INCBIN "gfx/tilesets/flower/cgb_1.2bpp" + INCBIN "gfx/tilesets/flower/dmg_2.2bpp" + INCBIN "gfx/tilesets/flower/cgb_2.2bpp" +; fc5cc + + +LavaBubbleAnim1: ; fc5cc +; Splash in the bottom-right corner of the fountain. + ld hl, sp+0 + ld b, h + ld c, l + ld a, [wTileAnimationTimer] + and %110 + srl a + inc a + inc a + and %011 + swap a + ld e, a + ld d, 0 + ld hl, LavaBubbleFrames + add hl, de + ld sp, hl + ld hl, vTiles2 tile $5b + jp WriteTile +; fc5eb + + +LavaBubbleAnim2: ; fc5eb +; Splash in the top-left corner of the fountain. + ld hl, sp+0 + ld b, h + ld c, l + ld a, [wTileAnimationTimer] + and %110 + add a + add a + add a + ld e, a + ld d, 0 + ld hl, LavaBubbleFrames + add hl, de + ld sp, hl + ld hl, vTiles2 tile $38 + jp WriteTile +; fc605 + + +LavaBubbleFrames: ; fc605 + INCBIN "gfx/tilesets/lava/1.2bpp" + INCBIN "gfx/tilesets/lava/2.2bpp" + INCBIN "gfx/tilesets/lava/3.2bpp" + INCBIN "gfx/tilesets/lava/4.2bpp" +; fc645 + + +AnimateTowerPillarTile: ; fc645 +; Read from struct at de: +; Destination (VRAM) +; Address of the first tile in the frame array + + ld hl, sp+0 + ld b, h + ld c, l + + ld a, [wTileAnimationTimer] + and %111 + +; Get frame index a + ld hl, .frames + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, [hl] + +; Destination + ld l, e + ld h, d + ld e, [hl] + inc hl + ld d, [hl] + inc hl + +; Add the frame index to the starting address + add [hl] + inc hl + ld h, [hl] + ld l, a + ld a, 0 + adc h + ld h, a + + ld sp, hl + ld l, e + ld h, d + jr WriteTile + +.frames + db $00, $10, $20, $30, $40, $30, $20, $10 +; fc673 + + +StandingTileFrame: ; fc673 + ld hl, wTileAnimationTimer + inc [hl] + ret +; fc678 + + +AnimateWhirlpoolTile: ; fc678 +; Update whirlpool tile using struct at de. + +; Struct: +; VRAM address +; Address of the first tile + +; Only does one of 4 tiles at a time. + +; Save sp in bc (see WriteTile). + ld hl, sp+0 + ld b, h + ld c, l + +; de = VRAM address + ld l, e + ld h, d + ld e, [hl] + inc hl + ld d, [hl] + inc hl +; Tile address is now at hl. + +; Get the tile for this frame. + ld a, [wTileAnimationTimer] + and %11 ; 4 frames x2 + swap a ; * 16 bytes per tile + + add [hl] + inc hl + ld h, [hl] + ld l, a + ld a, 0 + adc h + ld h, a + +; The stack now points to the desired frame. + ld sp, hl + + ld l, e + ld h, d + + jr WriteTile +; fc696 + + +WriteTileFromBuffer: ; fc696 +; Write tiledata at wTileAnimBuffer to de. +; wTileAnimBuffer is loaded to sp for WriteTile. + + ld hl, sp+0 + ld b, h + ld c, l + + ld hl, wTileAnimBuffer + ld sp, hl + + ld h, d + ld l, e + jr WriteTile +; fc6a2 + + +WriteTileToBuffer: ; fc6a2 +; Write tiledata de to wTileAnimBuffer. +; de is loaded to sp for WriteTile. + + ld hl, sp+0 + ld b, h + ld c, l + + ld h, d + ld l, e + ld sp, hl + + ld hl, wTileAnimBuffer + + ; fallthrough + +WriteTile: ; fc6ac +; Write one 8x8 tile ($10 bytes) from sp to hl. + +; Warning: sp is saved in bc so we can abuse pop. +; sp is restored to address bc. Save sp in bc before calling. + + pop de + ld [hl], e + inc hl + ld [hl], d + +rept 7 + pop de + inc hl + ld [hl], e + inc hl + ld [hl], d +endr + +; restore sp + ld h, b + ld l, c + ld sp, hl + ret +; fc6d7 + + +TileAnimationPalette: ; fc6d7 +; Transition between color values 0-2 for color 0 in palette 3. + +; No palette changes on DMG. + ld a, [hCGB] + and a + ret z + +; We don't want to mess with non-standard palettes. + ld a, [rBGP] ; BGP + cp %11100100 + ret nz + +; Only update on even frames. + ld a, [wTileAnimationTimer] + ld l, a + and 1 ; odd + ret nz + +; Ready for BGPD input... + + ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_WATER + ld [rBGPI], a + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + +; Update color 0 in order 0 1 2 1 + ld a, l + and %110 ; frames 0 2 4 6 + jr z, .color0 + cp %100 ; frame 4 + jr z, .color2 + +.color1 + ld hl, wBGPals1 palette PAL_BG_WATER color 1 + ld a, [hli] + ld [rBGPD], a + ld a, [hli] + ld [rBGPD], a + jr .end + +.color0 + ld hl, wBGPals1 palette PAL_BG_WATER color 0 + ld a, [hli] + ld [rBGPD], a + ld a, [hli] + ld [rBGPD], a + jr .end + +.color2 + ld hl, wBGPals1 palette PAL_BG_WATER color 2 + ld a, [hli] + ld [rBGPD], a + ld a, [hli] + ld [rBGPD], a + +.end + pop af + ld [rSVBK], a + ret +; fc71e + + +FlickeringCaveEntrancePalette: ; fc71e +; No palette changes on DMG. + ld a, [hCGB] + and a + ret z +; We don't want to mess with non-standard palettes. + ld a, [rBGP] + cp %11100100 + ret nz +; We only want to be here if we're in a dark cave. + ld a, [wTimeOfDayPalset] + cp %11111111 ; 3,3,3,3 + ret nz + + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a +; Ready for BGPD input... + ld a, (1 << rBGPI_AUTO_INCREMENT) palette PAL_BG_YELLOW + ld [rBGPI], a + ld a, [hVBlankCounter] + and %10 + jr nz, .bit1set + ld hl, wBGPals1 palette PAL_BG_YELLOW + jr .okay + +.bit1set + ld hl, wBGPals1 palette PAL_BG_YELLOW color 1 + +.okay + ld a, [hli] + ld [rBGPD], a + ld a, [hli] + ld [rBGPD], a + + pop af + ld [rSVBK], a + ret +; fc750 + + +TowerPillarTilePointer1: dw vTiles2 tile $2d, TowerPillarTile1 +TowerPillarTilePointer2: dw vTiles2 tile $2f, TowerPillarTile2 +TowerPillarTilePointer3: dw vTiles2 tile $3d, TowerPillarTile3 +TowerPillarTilePointer4: dw vTiles2 tile $3f, TowerPillarTile4 +TowerPillarTilePointer5: dw vTiles2 tile $3c, TowerPillarTile5 +TowerPillarTilePointer6: dw vTiles2 tile $2c, TowerPillarTile6 +TowerPillarTilePointer7: dw vTiles2 tile $4d, TowerPillarTile7 +TowerPillarTilePointer8: dw vTiles2 tile $4f, TowerPillarTile8 +TowerPillarTilePointer9: dw vTiles2 tile $5d, TowerPillarTile9 +TowerPillarTilePointer10: dw vTiles2 tile $5f, TowerPillarTile10 + +TowerPillarTile1: INCBIN "gfx/tilesets/tower-pillar/1.2bpp" +TowerPillarTile2: INCBIN "gfx/tilesets/tower-pillar/2.2bpp" +TowerPillarTile3: INCBIN "gfx/tilesets/tower-pillar/3.2bpp" +TowerPillarTile4: INCBIN "gfx/tilesets/tower-pillar/4.2bpp" +TowerPillarTile5: INCBIN "gfx/tilesets/tower-pillar/5.2bpp" +TowerPillarTile6: INCBIN "gfx/tilesets/tower-pillar/6.2bpp" +TowerPillarTile7: INCBIN "gfx/tilesets/tower-pillar/7.2bpp" +TowerPillarTile8: INCBIN "gfx/tilesets/tower-pillar/8.2bpp" +TowerPillarTile9: INCBIN "gfx/tilesets/tower-pillar/9.2bpp" +TowerPillarTile10: INCBIN "gfx/tilesets/tower-pillar/10.2bpp" +; fca98 + + +WhirlpoolFrames1: dw vTiles2 tile $32, WhirlpoolTiles1 +WhirlpoolFrames2: dw vTiles2 tile $33, WhirlpoolTiles2 +WhirlpoolFrames3: dw vTiles2 tile $42, WhirlpoolTiles3 +WhirlpoolFrames4: dw vTiles2 tile $43, WhirlpoolTiles4 +; fcaa8 + +WhirlpoolTiles1: INCBIN "gfx/tilesets/whirlpool/1.2bpp" +WhirlpoolTiles2: INCBIN "gfx/tilesets/whirlpool/2.2bpp" +WhirlpoolTiles3: INCBIN "gfx/tilesets/whirlpool/3.2bpp" +WhirlpoolTiles4: INCBIN "gfx/tilesets/whirlpool/4.2bpp" +; fcba8 diff --git a/engine/tilesets/tileset_palettes.asm b/engine/tilesets/tileset_palettes.asm new file mode 100644 index 000000000..e2c39c0ab --- /dev/null +++ b/engine/tilesets/tileset_palettes.asm @@ -0,0 +1,151 @@ +LoadSpecialMapPalette: ; 494ac + ld a, [wMapTileset] + cp TILESET_POKECOM_CENTER + jr z, .pokecom_2f + cp TILESET_BATTLE_TOWER + jr z, .battle_tower + cp TILESET_ICE_PATH + jr z, .ice_path + cp TILESET_HOUSE + jr z, .house + cp TILESET_RADIO_TOWER + jr z, .radio_tower + cp TILESET_MANSION + jr z, .mansion_mobile + jr .do_nothing + +.pokecom_2f + call LoadPokeComPalette + scf + ret + +.battle_tower + call LoadBattleTowerPalette + scf + ret + +.ice_path + ld a, [wEnvironment] + and $7 + cp INDOOR ; Hall of Fame + jr z, .do_nothing + call LoadIcePathPalette + scf + ret + +.house + call LoadHousePalette + scf + ret + +.radio_tower + call LoadRadioTowerPalette + scf + ret + +.mansion_mobile + call LoadMansionPalette + scf + ret + +.do_nothing + and a + ret +; 494f2 + +LoadPokeComPalette: ; 494f2 + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, PokeComPalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 49501 + +PokeComPalette: ; 49501 +INCLUDE "gfx/tilesets/pokecom_center.pal" +; 49541 + +LoadBattleTowerPalette: ; 49541 + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, BattleTowerPalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 49550 + +BattleTowerPalette: ; 49550 +INCLUDE "gfx/tilesets/battle_tower.pal" +; 49590 + +LoadIcePathPalette: ; 49590 + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, IcePathPalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 4959f + +IcePathPalette: ; 4959f +INCLUDE "gfx/tilesets/ice_path.pal" +; 495df + +LoadHousePalette: ; 495df + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, HousePalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 495ee + +HousePalette: ; 495ee +INCLUDE "gfx/tilesets/house.pal" +; 4962e + +LoadRadioTowerPalette: ; 4962e + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, RadioTowerPalette + ld bc, 8 palettes + call FarCopyWRAM + ret +; 4963d + +RadioTowerPalette: ; 4963d +INCLUDE "gfx/tilesets/radio_tower.pal" +; 4967d + +MansionPalette1: ; 4967d +INCLUDE "gfx/tilesets/mansion_1.pal" +; 496c5 + +LoadMansionPalette: ; 496c5 + ld a, BANK(wBGPals1) + ld de, wBGPals1 + ld hl, MansionPalette1 + ld bc, 8 palettes + call FarCopyWRAM + ld a, BANK(wBGPals1) + ld de, wBGPals1 palette PAL_BG_YELLOW + ld hl, MansionPalette2 + ld bc, 1 palettes + call FarCopyWRAM + ld a, BANK(wBGPals1) + ld de, wBGPals1 palette PAL_BG_WATER + ld hl, MansionPalette1 + 6 palettes + ld bc, 1 palettes + call FarCopyWRAM + ld a, BANK(wBGPals1) + ld de, wBGPals1 palette PAL_BG_ROOF + ld hl, MansionPalette1 + 8 palettes + ld bc, 1 palettes + call FarCopyWRAM + ret +; 496fe + +MansionPalette2: ; 496fe +INCLUDE "gfx/tilesets/mansion_2.pal" +; 49706 diff --git a/engine/tilesets/timeofdaypals.asm b/engine/tilesets/timeofdaypals.asm new file mode 100644 index 000000000..b8d43d252 --- /dev/null +++ b/engine/tilesets/timeofdaypals.asm @@ -0,0 +1,415 @@ +DummyPredef35: ; 8c000 +DummyPredef36: + ret + +UpdateTimeOfDayPal:: ; 8c001 + call UpdateTime + ld a, [wTimeOfDay] + ld [wCurTimeOfDay], a + call GetTimePalette + ld [wTimeOfDayPal], a + ret +; 8c011 + + +_TimeOfDayPals:: ; 8c011 +; return carry if pals are changed + +; forced pals? + ld hl, wTimeOfDayPalFlags + bit 7, [hl] + jr nz, .dontchange + +; do we need to bother updating? + ld a, [wTimeOfDay] + ld hl, wCurTimeOfDay + cp [hl] + jr z, .dontchange + +; if so, the time of day has changed + ld a, [wTimeOfDay] + ld [wCurTimeOfDay], a + +; get palette id + call GetTimePalette + +; same palette as before? + ld hl, wTimeOfDayPal + cp [hl] + jr z, .dontchange + +; update palette id + ld [wTimeOfDayPal], a + +; save bg palette 7 + ld hl, wBGPals1 palette PAL_BG_TEXT + +; save wram bank + ld a, [rSVBK] + ld b, a + + ld a, BANK(wBGPals1) + ld [rSVBK], a + +; push palette + ld c, NUM_PAL_COLORS +.push + ld d, [hl] + inc hl + ld e, [hl] + inc hl + push de + dec c + jr nz, .push + +; restore wram bank + ld a, b + ld [rSVBK], a + + +; update sgb pals + ld b, SCGB_MAPPALS + call GetSGBLayout + + +; restore bg palette 7 + ld hl, wOBPals1 - 1 ; last byte in wBGPals1 + +; save wram bank + ld a, [rSVBK] + ld d, a + + ld a, BANK(wOBPals1) + ld [rSVBK], a + +; pop palette + ld e, NUM_PAL_COLORS +.pop + pop bc + ld [hl], c + dec hl + ld [hl], b + dec hl + dec e + jr nz, .pop + +; restore wram bank + ld a, d + ld [rSVBK], a + +; update palettes + call _UpdateTimePals + call DelayFrame + +; successful change + scf + ret + +.dontchange +; no change occurred + and a + ret +; 8c070 + + +_UpdateTimePals:: ; 8c070 + ld c, $9 ; normal + call GetTimePalFade + call DmgToCgbTimePals + ret +; 8c079 + +FadeInPalettes:: ; 8c079 + ld c, $12 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsDecHL + ret +; 8c084 + +FadeOutPalettes:: ; 8c084 + call FillWhiteBGColor + ld c, $9 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsIncHL + ret +; 8c092 + +BattleTowerFade: ; 8c092 + call FillWhiteBGColor + ld c, $9 + call GetTimePalFade + ld b, $4 +.asm_8c09c + call DmgToCgbTimePals + inc hl + inc hl + inc hl + ld c, $7 + call DelayFrames + dec b + jr nz, .asm_8c09c + ret +; 8c0ab + +FadeInQuickly: ; 8c0ab + ld c, $0 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsIncHL + ret +; 8c0b6 + +FadeBlackQuickly: ; 8c0b6 + ld c, $9 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsDecHL + ret +; 8c0c1 + + +FillWhiteBGColor: ; 8c0c1 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld hl, wBGPals1 + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld hl, wBGPals1 + 1 palettes + ld c, 6 +.loop + ld a, e + ld [hli], a + ld a, d + ld [hli], a +rept 6 + inc hl +endr + dec c + jr nz, .loop + + pop af + ld [rSVBK], a + ret +; 8c0e5 + +ReplaceTimeOfDayPals: ; 8c0e5 + ld hl, .BrightnessLevels + ld a, [wMapTimeOfDay] + cp $4 ; Dark cave, needs Flash + jr z, .DarkCave + and $7 + add l + ld l, a + ld a, $0 + adc h + ld h, a + ld a, [hl] + ld [wTimeOfDayPalset], a + ret + +.DarkCave: + ld a, [wStatusFlags] + bit STATUSFLAGS_FLASH_F, a + jr nz, .UsedFlash + ld a, %11111111 ; 3, 3, 3, 3 + ld [wTimeOfDayPalset], a + ret + +.UsedFlash: + ld a, %10101010 ; 2, 2, 2, 2 + ld [wTimeOfDayPalset], a + ret +; 8c10f (23:410f) + +.BrightnessLevels: ; 8c10f + dc 3, 2, 1, 0 + dc 1, 1, 1, 1 + dc 2, 2, 2, 2 + dc 0, 0, 0, 0 + dc 3, 3, 3, 3 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 +; 8c117 + +GetTimePalette: ; 8c117 + ld a, [wTimeOfDay] + ld e, a + ld d, 0 + ld hl, .TimePalettes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 8c126 + +.TimePalettes: + dw .MorningPalette + dw .DayPalette + dw .NitePalette + dw .DarknessPalette + +.MorningPalette: + ld a, [wTimeOfDayPalset] + and %00000011 ; 0 + ret + +.DayPalette: + ld a, [wTimeOfDayPalset] + and %00001100 ; 1 + srl a + srl a + ret + +.NitePalette: + ld a, [wTimeOfDayPalset] + and %00110000 ; 2 + swap a + ret + +.DarknessPalette: + ld a, [wTimeOfDayPalset] + and %11000000 ; 3 + rlca + rlca + ret +; 8c14e + + +DmgToCgbTimePals: ; 8c14e + push hl + push de + ld a, [hli] + call DmgToCgbBGPals + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + call DmgToCgbObjPals + pop de + pop hl + ret +; 8c15e + +ConvertTimePalsIncHL: ; 8c15e +.loop + call DmgToCgbTimePals + inc hl + inc hl + inc hl + ld c, 2 + call DelayFrames + dec b + jr nz, .loop + ret +; 8c16d + +ConvertTimePalsDecHL: ; 8c16d +.loop + call DmgToCgbTimePals + dec hl + dec hl + dec hl + ld c, 2 + call DelayFrames + dec b + jr nz, .loop + ret +; 8c17c + + +GetTimePalFade: ; 8c17c +; check cgb + ld a, [hCGB] + and a + jr nz, .cgb + +; else: dmg + +; index + ld a, [wTimeOfDayPal] + and %11 + +; get fade table + push bc + ld c, a + ld b, $0 + ld hl, .dmgfades + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + pop bc + +; get place in fade table + ld b, $0 + add hl, bc + ret + +.cgb + ld hl, .cgbfade + ld b, $0 + add hl, bc + ret + +.dmgfades + dw .morn + dw .day + dw .nite + dw .darkness + +.morn + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11100100, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.day + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11100100, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.nite + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11101001, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.darkness + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111111 + db %11111110, %11100100, %11111111 + db %11111101, %11010000, %11111111 + db %11111101, %10000000, %11111111 + db %00000000, %01000000, %00000000 + db %00000000, %00000000, %00000000 + +.cgbfade + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11111001, %11111001 + db %11100100, %11100100, %11100100 + db %10010000, %10010000, %10010000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 +; 8c20f diff --git a/engine/title/credits.asm b/engine/title/credits.asm deleted file mode 100644 index 1aaecf64a..000000000 --- a/engine/title/credits.asm +++ /dev/null @@ -1,621 +0,0 @@ -INCLUDE "constants.asm" - - -SECTION "Credits", ROMX - -Credits:: ; 109847 - bit 6, b ; Hall Of Fame - ld a, $0 - jr z, .okay - ld a, $40 -.okay - ld [wJumptableIndex], a - - ld a, [rSVBK] - push af - ld a, BANK(wGBCPalettes) - ld [rSVBK], a - - call ClearBGPalettes - call ClearTileMap - call ClearSprites - - ld hl, wCreditsFaux2bpp - ld c, $80 - ld de, $ff00 - -.load_loop - ld a, e - ld [hli], a - ld a, d - ld [hli], a - dec c - jr nz, .load_loop - - ld de, CreditsBorderGFX - ld hl, vTiles2 tile $20 - lb bc, BANK(CreditsBorderGFX), 9 - call Request2bpp - - ld de, CopyrightGFX - ld hl, vTiles2 tile $60 - lb bc, BANK(CopyrightGFX), 29 - call Request2bpp - - ld de, TheEndGFX - ld hl, vTiles2 tile $40 - lb bc, BANK(TheEndGFX), 16 - call Request2bpp - - ld a, $ff - ld [wCreditsBorderFrame], a - xor a - ld [wCreditsBorderMon], a - - call Credits_LoadBorderGFX - ld e, l - ld d, h - ld hl, vTiles2 - lb bc, BANK(CreditsMonsGFX), 16 - call Request2bpp - - call ConstructCreditsTilemap - xor a - ld [wCreditsLYOverride], a - - ld hl, wLYOverrides - ld bc, $100 - xor a - call ByteFill - - ld a, rSCX - $ff00 - ld [hLCDCPointer], a - - call GetCreditsPalette - call SetPalettes - ld a, [hVBlank] - push af - ld a, $5 - ld [hVBlank], a - ld a, $1 - ld [hInMenu], a - xor a - ld [hBGMapMode], a - ld [wCreditsPos], a - ld [wCreditsUnusedCD21], a - ld [wCreditsTimer], a - -.execution_loop - call Credits_HandleBButton - call Credits_HandleAButton - jr nz, .exit_credits - - call Credits_Jumptable - call DelayFrame - jr .execution_loop - -.exit_credits - call ClearBGPalettes - xor a - ld [hLCDCPointer], a - ld [hBGMapAddress], a - pop af - ld [hVBlank], a - pop af - ld [rSVBK], a - ret -; 1098fd - -Credits_HandleAButton: ; 1098fd - ld a, [hJoypadDown] - and A_BUTTON - ret z - ld a, [wJumptableIndex] - bit 7, a - ret -; 109908 - -Credits_HandleBButton: ; 109908 - ld a, [hJoypadDown] - and B_BUTTON - ret z - ld a, [wJumptableIndex] - bit 6, a - ret z - ld hl, wCreditsPos - ld a, [hli] - cp $d - jr nc, .okay - ld a, [hli] - and a - ret z -.okay - ld hl, wCreditsTimer - ld a, [hl] - and a - ret z - dec [hl] - ret -; 109926 - -Credits_Jumptable: ; 109926 - ld a, [wJumptableIndex] - and $f - 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 -; 109937 - -.Jumptable: ; 109937 (42:5937) - dw ParseCredits - dw Credits_Next - dw Credits_Next - dw Credits_PrepBGMapUpdate - dw Credits_UpdateGFXRequestPath - dw Credits_RequestGFX - dw Credits_LYOverride - dw Credits_Next - dw Credits_Next - dw Credits_Next - dw Credits_UpdateGFXRequestPath - dw Credits_RequestGFX - dw Credits_LoopBack - -Credits_Next: ; 109951 (42:5951) - ld hl, wJumptableIndex - inc [hl] - ret - -Credits_LoopBack: ; 109956 (42:5956) - ld hl, wJumptableIndex - ld a, [hl] - and $f0 - ld [hl], a - ret - -Credits_PrepBGMapUpdate: ; 10995e (42:595e) - xor a - ld [hBGMapMode], a - jp Credits_Next - -Credits_UpdateGFXRequestPath: ; 109964 (42:5964) - call Credits_LoadBorderGFX - ld a, l - ld [wRequested2bppSource], a - ld a, h - ld [wRequested2bppSource + 1], a - ld a, LOW(vTiles2) - ld [wRequested2bppDest], a - ld a, HIGH(vTiles2) - ld [wRequested2bppDest + 1], a - jr Credits_RequestGFX - -Credits_RequestGFX: ; 10997b (42:597b) - xor a - ld [hBGMapMode], a - ld a, $8 - ld [wRequested2bpp], a - jp Credits_Next - -Credits_LYOverride: ; 109986 (42:5986) - ld a, [rLY] - cp $30 - jr c, Credits_LYOverride - ld a, [wCreditsLYOverride] - dec a - dec a - ld [wCreditsLYOverride], a - ld hl, wLYOverrides + $1f - call .Fill - ld hl, wLYOverrides + $87 - call .Fill - jp Credits_Next - -.Fill: ; 1099a3 (42:59a3) - ld c, $8 -.loop - ld [hli], a - dec c - jr nz, .loop - ret -; 1099aa - - -ParseCredits: ; 1099aa - ld hl, wJumptableIndex - bit 7, [hl] - jp nz, .done - -; Wait until the timer has run out to parse the next command. - ld hl, wCreditsTimer - ld a, [hl] - and a - jr z, .parse - -; One tick has passed. - dec [hl] - jp .done - -.parse -; First, let's clear the current text display, -; starting from line 5. - xor a - ld [hBGMapMode], a - hlcoord 0, 5 - ld bc, 20 * 12 - ld a, " " - call ByteFill - -; Then read the script. - -.loop - call .get - -; Commands: - cp CREDITS_END - jp z, .end - cp CREDITS_WAIT - jr z, .wait - cp CREDITS_SCENE - jr z, .scene - cp CREDITS_CLEAR - jr z, .clear - cp CREDITS_MUSIC - jr z, .music - cp CREDITS_WAIT2 - jr z, .wait2 - cp CREDITS_THEEND - jr z, .theend - -; If it's not a command, it's a string identifier. - - push af - ld e, a - ld d, 0 - ld hl, CreditsStrings - add hl, de - add hl, de - ld a, [hli] - ld d, [hl] - ld e, a - pop af - -; Strings spanning multiple lines have special cases. - - cp COPYRIGHT - jr z, .copyright - - cp STAFF - jr c, .staff - -; The rest start from line 6. - - hlcoord 0, 6 - jr .print - -.copyright - hlcoord 2, 6 - jr .print - -.staff - hlcoord 0, 6 - -.print -; Print strings spaced every two lines. - call .get - ld bc, 20 * 2 - call AddNTimes - call PlaceString - jr .loop - -.theend -; Display "The End" graphic. - call Credits_TheEnd - jr .loop - -.scene -; Update the scene number and corresponding palette. - call .get - ld [wCreditsBorderMon], a ; scene - xor a - ld [wCreditsBorderFrame], a ; frame - call GetCreditsPalette - call SetPalettes ; update hw pal registers - jr .loop - -.clear -; Clear the banner. - ld a, $ff - ld [wCreditsBorderFrame], a ; frame - jr .loop - -.music -; Play the credits music. - ld de, MUSIC_CREDITS - push de - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - pop de - call PlayMusic - jp .loop - -.wait2 -; Wait for some amount of ticks. - call .get - ld [wCreditsTimer], a - jr .done - -.wait -; Wait for some amount of ticks, and do something else. - call .get - ld [wCreditsTimer], a - - xor a - ld [hBGMapThird], a - ld a, 1 - ld [hBGMapMode], a - -.done - jp Credits_Next - -.end -; Stop execution. - ld hl, wJumptableIndex - set 7, [hl] - ld a, 32 - ld [wMusicFade], a - ld a, LOW(MUSIC_POST_CREDITS) - ld [wMusicFadeID], a - ld a, HIGH(MUSIC_POST_CREDITS) - ld [wMusicFadeID + 1], a - ret - -.get -; Get byte wCreditsPos from CreditsScript - push hl - push de - ld a, [wCreditsPos] - ld e, a - ld a, [wCreditsPos+1] - ld d, a - ld hl, CreditsScript - add hl, de - - inc de - ld a, e - ld [wCreditsPos], a - ld a, d - ld [wCreditsPos+1], a - ld a, [hl] - pop de - pop hl - ret -; 109a95 - - -ConstructCreditsTilemap: ; 109a95 (42:5a95) - xor a - ld [hBGMapMode], a - ld a, $c - ld [hBGMapAddress], a - - ld a, $28 - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - call ByteFill - - ld a, $7f - hlcoord 0, 4 - ld bc, (SCREEN_HEIGHT - 4) * SCREEN_WIDTH - call ByteFill - - hlcoord 0, 4 - ld a, $24 - call DrawCreditsBorder - - hlcoord 0, 17 - ld a, $20 - call DrawCreditsBorder - - hlcoord 0, 0, wAttrMap - ld bc, 4 * SCREEN_WIDTH - xor a - call ByteFill - - hlcoord 0, 4, wAttrMap - ld bc, SCREEN_WIDTH - ld a, $1 - call ByteFill - - hlcoord 0, 5, wAttrMap - ld bc, 12 * SCREEN_WIDTH - ld a, $2 - call ByteFill - - hlcoord 0, 17, wAttrMap - ld bc, SCREEN_WIDTH - ld a, $1 - call ByteFill - - call WaitBGMap2 - xor a - ld [hBGMapMode], a - ld [hBGMapAddress], a - hlcoord 0, 0 - call .InitTopPortion - call WaitBGMap2 - ret - -.InitTopPortion: ; 109aff (42:5aff) - ld b, 5 -.outer_loop - push hl - ld de, SCREEN_WIDTH - 3 - ld c, 4 - xor a -.inner_loop -rept 3 - ld [hli], a - inc a -endr - ld [hl], a - inc a - add hl, de - dec c - jr nz, .inner_loop - pop hl -rept 4 - inc hl -endr - dec b - jr nz, .outer_loop - ret - -DrawCreditsBorder: ; 109b1d (42:5b1d) - ld c, SCREEN_WIDTH / 4 -.loop - push af -rept 3 - ld [hli], a - inc a -endr - ld [hli], a - pop af - dec c - jr nz, .loop - ret - -GetCreditsPalette: ; 109b2c - call .GetPalAddress - - push hl - ld a, 0 - call .UpdatePals - pop hl - ret - -.GetPalAddress: -; Each set of palette data is 24 bytes long. - ld a, [wCreditsBorderMon] ; scene - and %11 - add a - add a ; * 8 - add a - ld e, a - ld d, 0 - ld hl, CreditsPalettes - add hl, de - add hl, de ; * 3 - add hl, de - ret - -.UpdatePals: -; Update the first three colors in both palette buffers. - push af - push hl - add LOW(wBGPals1) - ld e, a - ld a, 0 - adc HIGH(wBGPals1) - ld d, a - ld bc, 24 - call CopyBytes - - pop hl - pop af - add LOW(wBGPals2) - ld e, a - ld a, 0 - adc HIGH(wBGPals2) - ld d, a - ld bc, 24 - call CopyBytes - ret - -CreditsPalettes: -INCLUDE "gfx/credits/credits.pal" -; 109bca - -Credits_LoadBorderGFX: ; 109bca (42:5bca) - ld hl, wCreditsBorderFrame - ld a, [hl] - cp $ff - jr z, .init - - and %11 - ld e, a - inc a - and %11 - ld [hl], a - ld a, [wCreditsBorderMon] - and %11 - add a - add a - add e - add a - ld e, a - ld d, 0 - ld hl, .Frames - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret - -.init - ld hl, wCreditsFaux2bpp - ret -; 109bf1 (42:5bf1) - -.Frames: ; 109bf1 - dw CreditsPichuGFX - dw CreditsPichuGFX + 16 tiles - dw CreditsPichuGFX + 32 tiles - dw CreditsPichuGFX + 48 tiles - dw CreditsSmoochumGFX - dw CreditsSmoochumGFX + 16 tiles - dw CreditsSmoochumGFX + 32 tiles - dw CreditsSmoochumGFX + 48 tiles - dw CreditsDittoGFX - dw CreditsDittoGFX + 16 tiles - dw CreditsDittoGFX + 32 tiles - dw CreditsDittoGFX + 48 tiles - dw CreditsIgglybuffGFX - dw CreditsIgglybuffGFX + 16 tiles - dw CreditsIgglybuffGFX + 32 tiles - dw CreditsIgglybuffGFX + 48 tiles -; 109c11 - -Credits_TheEnd: ; 109c11 (42:5c11) - ld a, $40 - hlcoord 6, 9 - call .Load - hlcoord 6, 10 -.Load: ; 109c1c (42:5c1c) - ld c, 8 -.loop - ld [hli], a - inc a - dec c - jr nz, .loop - ret -; 109c24 (42:5c24) - - -CreditsBorderGFX: INCBIN "gfx/credits/border.2bpp" - -CreditsMonsGFX: -CreditsPichuGFX: INCBIN "gfx/credits/pichu.2bpp" -CreditsSmoochumGFX: INCBIN "gfx/credits/smoochum.2bpp" -CreditsDittoGFX: INCBIN "gfx/credits/ditto.2bpp" -CreditsIgglybuffGFX: INCBIN "gfx/credits/igglybuff.2bpp" - -INCLUDE "data/credits_script.asm" -INCLUDE "data/credits_strings.asm" diff --git a/engine/title/crystal_intro.asm b/engine/title/crystal_intro.asm deleted file mode 100755 index 56bb02750..000000000 --- a/engine/title/crystal_intro.asm +++ /dev/null @@ -1,2199 +0,0 @@ -Copyright_GFPresents: ; e4579 - ld de, MUSIC_NONE - call PlayMusic - call ClearBGPalettes - call ClearTileMap - ld a, HIGH(vBGMap0) - ld [hBGMapAddress + 1], a - xor a ; LOW(vBGMap0) - ld [hBGMapAddress], a - ld [hJoyDown], a - ld [hSCX], a - ld [hSCY], a - ld a, $90 - ld [hWY], a - call WaitBGMap - ld b, SCGB_GAMEFREAK_LOGO - call GetSGBLayout - call SetPalettes - ld c, 10 - call DelayFrames - callfar Copyright - call WaitBGMap - ld c, 100 - call DelayFrames - call ClearTileMap - farcall GBCOnlyScreen - call .GetGFLogoGFX -.joy_loop - call JoyTextDelay - ld a, [hJoyLast] - and BUTTONS - jr nz, .pressed_button - ld a, [wJumptableIndex] - bit 7, a - jr nz, .finish - call PlaceGameFreakPresents - farcall PlaySpriteAnimations - call DelayFrame - jr .joy_loop - -.pressed_button - call .StopGamefreakAnim - scf - ret - -.finish - call .StopGamefreakAnim - and a - ret -; e45e8 - -.GetGFLogoGFX: ; e45e8 - ld de, GameFreakLogo - ld hl, vTiles2 - lb bc, BANK(GameFreakLogo), 28 - call Get1bpp - - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - ld hl, IntroLogoGFX - ld de, wDecompressScratch - ld a, BANK(IntroLogoGFX) - call FarDecompress - - ld hl, vTiles0 - ld de, wDecompressScratch - lb bc, 1, 8 tiles - call Request2bpp - - ld hl, vTiles1 - ld de, wDecompressScratch + $80 tiles - lb bc, 1, 8 tiles - call Request2bpp - - pop af - ld [rSVBK], a - - farcall ClearSpriteAnims - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_GAMEFREAK_LOGO - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], $a0 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $60 - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $30 - xor a - ld [wJumptableIndex], a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - ld [hSCX], a - ld [hSCY], a - ld a, $1 - ld [hBGMapMode], a - ld a, $90 - ld [hWY], a - lb de, %11100100, %11100100 - call DmgToCgbObjPals - ret -; e465e - -.StopGamefreakAnim: ; e465e - farcall ClearSpriteAnims - call ClearTileMap - call ClearSprites - ld c, 16 - call DelayFrames - ret -; e4670 - -PlaceGameFreakPresents: ; e4670 - ld a, [wJumptableIndex] - ld e, a - ld d, 0 - ld hl, .dw - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e467f - -.dw ; e467f - dw PlaceGameFreakPresents_0 - dw PlaceGameFreakPresents_1 - dw PlaceGameFreakPresents_2 - dw PlaceGameFreakPresents_3 -; e4687 - -PlaceGameFreakPresents_AdvanceIndex: ; e4687 - ld hl, wJumptableIndex - inc [hl] - ret -; e468c - -PlaceGameFreakPresents_0: ; e468c - ret -; e468d - -PlaceGameFreakPresents_1: ; e468d - ld hl, wIntroSceneTimer - ld a, [hl] - cp $20 - jr nc, .PlaceGameFreak - inc [hl] - ret - -.PlaceGameFreak: - ld [hl], 0 - ld hl, .GAME_FREAK - decoord 5, 10 - ld bc, .end - .GAME_FREAK - call CopyBytes - call PlaceGameFreakPresents_AdvanceIndex - ld de, SFX_GAME_FREAK_PRESENTS - call PlaySFX - ret -; e46af - -.GAME_FREAK: - ; G A M E _ F R E A K - db 0, 1, 2, 3, 13, 4, 5, 3, 1, 6 -.end - db "@" -; e46ba - -PlaceGameFreakPresents_2: ; e46ba - ld hl, wIntroSceneTimer - ld a, [hl] - cp $40 - jr nc, .place_presents - inc [hl] - ret - -.place_presents - ld [hl], 0 - ld hl, .presents - decoord 7, 11 - ld bc, .end - .presents - call CopyBytes - call PlaceGameFreakPresents_AdvanceIndex - ret -; e46d6 - -.presents - db 7, 8, 9, 10, 11, 12 -.end - db "@" -; e46dd - -PlaceGameFreakPresents_3: ; e46dd - ld hl, wIntroSceneTimer - ld a, [hl] - cp $80 - jr nc, .finish - inc [hl] - ret - -.finish - ld hl, wJumptableIndex - set 7, [hl] - ret -; e46ed - - -GameFreakLogoJumper: ; e46ed (39:46ed) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, GameFreakLogoScenes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -GameFreakLogoScenes: ; e46fd (39:46fd) - dw GameFreakLogoScene1 - dw GameFreakLogoScene2 - dw GameFreakLogoScene3 - dw GameFreakLogoScene4 - dw GameFreakLogoScene5 - -GameFreakLogoScene1: ; e4707 (39:4707) - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ret - -GameFreakLogoScene2: ; e470d (39:470d) - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .asm_e4747 - ld d, a - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - and %111111 - cp %100000 - jr nc, .asm_e4723 - add %100000 -.asm_e4723 - ld e, a - farcall BattleAnim_Sine_e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], e - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - dec [hl] - and $1f - ret nz - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - sub $30 - ld [hl], a - ld de, SFX_DITTO_BOUNCE - call PlaySFX - ret - -.asm_e4747 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $0 - ld de, SFX_DITTO_POP_UP - call PlaySFX - ret - -GameFreakLogoScene3: ; e4759 (39:4759) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $20 - jr nc, .asm_e4764 - inc [hl] - ret - -.asm_e4764 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $0 - ld de, SFX_DITTO_TRANSFORM - call PlaySFX - ret - -GameFreakLogoScene4: ; e4776 (39:4776) - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $40 - jr z, .asm_e47a3 - inc [hl] - srl a - srl a - ld e, a - ld d, $0 - ld hl, GameFreakLogoPalettes - add hl, de - add hl, de - ld a, [rSVBK] - push af - ld a, BANK(wOBPals2) - ld [rSVBK], a - ld a, [hli] - ld [wOBPals2 + 12], a - ld a, [hli] - ld [wOBPals2 + 13], a - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret - -.asm_e47a3 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - call PlaceGameFreakPresents_AdvanceIndex -GameFreakLogoScene5: ; e47ab (39:47ab) - ret -; e47ac (39:47ac) - -GameFreakLogoPalettes: ; e47ac -INCLUDE "gfx/intro/gamefreak_logo.pal" -; e47cc - -GameFreakLogo: ; e47cc -INCBIN "gfx/splash/logo1.1bpp" -INCBIN "gfx/splash/logo2.1bpp" -; e48ac - -CrystalIntro: ; e48ac - ld a, [rSVBK] - push af - ld a, BANK(wGBCPalettes) - ld [rSVBK], a - ld a, [hInMenu] - push af - ld a, [hVBlank] - push af - call .InitRAMAddrs -.loop ; e48bc - call JoyTextDelay - ld a, [hJoyLast] - and BUTTONS - jr nz, .ShutOffMusic - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call IntroSceneJumper - farcall PlaySpriteAnimations - call DelayFrame - jp .loop - -.ShutOffMusic: - ld de, MUSIC_NONE - call PlayMusic - -.done - call ClearBGPalettes - call ClearSprites - call ClearTileMap - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - pop af - ld [hVBlank], a - pop af - ld [hInMenu], a - pop af - ld [rSVBK], a - ret -; e4901 - -.InitRAMAddrs: ; e4901 - xor a - ld [hVBlank], a - ld a, $1 - ld [hInMenu], a - xor a - ld [hMapAnims], a - ld [wJumptableIndex], a - ret -; e490f - -IntroSceneJumper: ; e490f - ld a, [wJumptableIndex] - ld e, a - ld d, 0 - ld hl, IntroScenes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e491e - -IntroScenes: ; e491e (39:491e) - dw IntroScene1 - dw IntroScene2 - dw IntroScene3 - dw IntroScene4 - dw IntroScene5 - dw IntroScene6 - dw IntroScene7 - dw IntroScene8 - dw IntroScene9 - dw IntroScene10 - dw IntroScene11 - dw IntroScene12 - dw IntroScene13 - dw IntroScene14 - dw IntroScene15 - dw IntroScene16 - dw IntroScene17 - dw IntroScene18 - dw IntroScene19 - dw IntroScene20 - dw IntroScene21 - dw IntroScene22 - dw IntroScene23 - dw IntroScene24 - dw IntroScene25 - dw IntroScene26 - dw IntroScene27 - dw IntroScene28 - -NextIntroScene: ; e4956 (39:4956) - ld hl, wJumptableIndex - inc [hl] - ret - -IntroScene1: ; e495b (39:495b) -; Setup the next scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap001 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroPulseGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap002 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette2 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette2 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene2: ; e49d6 (39:49d6) -; First Unown (A) fades in, pulses, then fades out. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .endscene - cp $60 - jr nz, .DontPlaySound - push af - depixel 11, 11 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_1 - call PlaySFX - pop af -.DontPlaySound: - ld [wIntroSceneTimer], a - xor a - call CrystalIntro_UnownFade - ret -.endscene - call NextIntroScene - ret - -IntroScene3: ; e49fd (39:49fd) -; More setup. Transition to the outdoor scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap003 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap004 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette1 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette1 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - call Intro_ResetLYOverrides - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene4: ; e4a69 (39:4a69) -; Scroll the outdoor panorama for a bit. - call Intro_PerspectiveScrollBG - ld hl, wIntroSceneFrameCounter - ld a, [hl] - cp $80 - jr z, .endscene - inc [hl] - ret - -.endscene - call NextIntroScene - ret - -IntroScene5: ; e4a7a (39:4a7a) -; Go back to the Unown. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld [hLCDCPointer], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap005 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroPulseGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap006 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette2 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette2 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene6: ; e4af7 (39:4af7) -; Two more Unown (I, H) fade in. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .endscene - cp $60 - jr z, .SecondUnown - cp $40 - jr nc, .StopUnown - cp $20 - jr z, .FirstUnown - jr .NoUnown - -.FirstUnown: - push af - depixel 7, 15 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_2 - call PlaySFX - pop af -.NoUnown: - ld [wIntroSceneTimer], a - xor a - call CrystalIntro_UnownFade - ret - -.SecondUnown: - push af - depixel 14, 6 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_1 - call PlaySFX - pop af -.StopUnown: - ld [wIntroSceneTimer], a - ld a, $1 - call CrystalIntro_UnownFade - ret - -.endscene - call NextIntroScene - ret - -IntroScene7: ; e4b3f (39:4b3f) -; Back to the outdoor scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap003 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - - ld hl, IntroPichuWooperGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneRunGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - - ld hl, IntroTilemap004 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld hl, IntroPalette1 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - - ld hl, IntroPalette1 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - - pop af - ld [rSVBK], a - - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - call Intro_ResetLYOverrides - farcall ClearSpriteAnims - depixel 13, 27, 4, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE - call _InitSpriteAnimStruct - ld a, $f0 - ld [wGlobalAnimXOffset], a - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene8: ; e4bd3 (39:4bd3) -; Scroll the scene, then show Suicune running across the screen. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $40 - jr z, .suicune_sound - jr nc, .animate_suicune - call Intro_PerspectiveScrollBG - ret - -.suicune_sound - ld de, SFX_INTRO_SUICUNE_3 - call PlaySFX -.animate_suicune - ld a, [wGlobalAnimXOffset] - and a - jr z, .finish - sub $8 - ld [wGlobalAnimXOffset], a - ret - -.finish - ld de, SFX_INTRO_SUICUNE_2 - call PlaySFX - farcall DeinitializeAllSprites - call NextIntroScene - ret - -IntroScene9: ; e4c04 (39:4c04) -; Set up the next scene (same bg). - xor a - ld [hLCDCPointer], a - call ClearSprites - hlcoord 0, 0, wAttrMap - ; first 12 rows have palette 1 - ld bc, 12 * SCREEN_WIDTH - ld a, $1 - call ByteFill - ; middle 3 rows have palette 2 - ld bc, 3 * SCREEN_WIDTH - ld a, $2 - call ByteFill - ; last three rows have palette 3 - ld bc, 3 * SCREEN_WIDTH - ld a, $3 - call ByteFill - ld a, $2 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - call DelayFrame - ld a, $c ; $980c - ld [hBGMapAddress], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ld [hBGMapMode], a - ld [hBGMapAddress], a - ld [wGlobalAnimXOffset], a - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene10: ; e4c4f (39:4c4f) -; Wooper and Pichu enter. - call Intro_RustleGrass - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $c0 - jr z, .done - cp $20 - jr z, .wooper - cp $40 - jr z, .pichu - ret - -.pichu - depixel 21, 16, 1, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_PICHU - call _InitSpriteAnimStruct - ld de, SFX_INTRO_PICHU - call PlaySFX - ret - -.wooper - depixel 22, 6 - ld a, SPRITE_ANIM_INDEX_INTRO_WOOPER - call _InitSpriteAnimStruct - ld de, SFX_INTRO_PICHU - call PlaySFX - ret -.done - call NextIntroScene - ret - -IntroScene11: ; e4c86 (39:4c86) -; Back to Unown again. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld [hLCDCPointer], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap007 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap008 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette2 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette2 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene12: ; e4cfa (39:4cfa) -; Even more Unown. - call .PlayUnownSound - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $c0 - jr nc, .done - cp $80 - jr nc, .second_half -; first half - ld c, a - and $1f - sla a - ld [wIntroSceneTimer], a - ld a, c - and $e0 - srl a - swap a - call CrystalIntro_UnownFade - ret - -.second_half -; double speed - ld c, a - and $f - sla a - sla a - ld [wIntroSceneTimer], a - ld a, c - and $70 - or $40 - swap a - call CrystalIntro_UnownFade - ret - -.done - call NextIntroScene - ret - -.PlayUnownSound: ; e4d36 (39:4d36) - ld a, [wIntroSceneFrameCounter] - ld c, a - ld hl, .UnownSounds -.loop - ld a, [hli] - cp -1 - ret z - cp c - jr z, .playsound - inc hl - inc hl - jr .loop -.playsound - ld a, [hli] - ld d, [hl] - ld e, a - push de - call SFXChannelsOff - pop de - call PlaySFX - ret -; e4d54 (39:4d54) - -.UnownSounds: ; e4d54 - dbw $00, SFX_INTRO_UNOWN_3 - dbw $20, SFX_INTRO_UNOWN_2 - dbw $40, SFX_INTRO_UNOWN_1 - dbw $60, SFX_INTRO_UNOWN_2 - dbw $80, SFX_INTRO_UNOWN_3 - dbw $90, SFX_INTRO_UNOWN_2 - dbw $a0, SFX_INTRO_UNOWN_1 - dbw $b0, SFX_INTRO_UNOWN_2 - db -1 ; e4d6d - -IntroScene13: ; e4d6d (39:4d6d) -; Switch scenes again. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap003 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneRunGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap004 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette1 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette1 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - depixel 13, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE - call _InitSpriteAnimStruct - ld de, MUSIC_CRYSTAL_OPENING - call PlayMusic - xor a - ld [wGlobalAnimXOffset], a - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene14: ; e4dfa (39:4dfa) -; Suicune runs then jumps. - ld a, [hSCX] - sub 10 - ld [hSCX], a - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr z, .done - cp $60 - jr z, .jump - jr nc, .asm_e4e1a - cp $40 - jr nc, .asm_e4e33 - ret - -.jump - ld de, SFX_INTRO_SUICUNE_4 - call PlaySFX - -.asm_e4e1a - ld a, $1 - ld [wIntroSceneTimer], a - ld a, [wGlobalAnimXOffset] - cp $88 - jr c, .asm_e4e2c - sub $8 - ld [wGlobalAnimXOffset], a - ret - -.asm_e4e2c - farcall DeinitializeAllSprites - ret - -.asm_e4e33 - ld a, [wGlobalAnimXOffset] - sub $2 - ld [wGlobalAnimXOffset], a - ret - -.done - call NextIntroScene - ret - -IntroScene15: ; e4e40 (39:4e40) -; Transition to a new scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap009 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneJumpGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownBackGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld de, IntroGrass4GFX - ld hl, vTiles1 tile $00 - lb bc, BANK(IntroGrass4GFX), 1 - call Request2bpp - ld hl, IntroTilemap010 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - call Intro_LoadTilemap - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette5 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette5 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld a, $90 - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - depixel 8, 5 - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN_F - call _InitSpriteAnimStruct - depixel 12, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY - call _InitSpriteAnimStruct - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene16: ; e4edc (39:4edc) -; Suicune shows its face. An Unown appears in front. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .done - call Intro_Scene16_AnimateSuicune - ld a, [hSCY] - and a - ret z - add 8 - ld [hSCY], a - ret -.done - call NextIntroScene - ret - -IntroScene17: ; e4ef5 (39:4ef5) -; ... - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap011 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneCloseGFX - ld de, vTiles1 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - ld hl, IntroTilemap012 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette4 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette4 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene18: ; e4f67 (39:4f67) -; Suicune close up. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $60 - jr nc, .done - ld a, [hSCX] - cp $60 - ret z - add 8 - ld [hSCX], a - ret -.done - call NextIntroScene - ret - -IntroScene19: ; e4f7e (39:4f7e) -; More setup. - call Intro_ClearBGPals - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap013 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroSuicuneBackGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownsGFX - ld de, vTiles1 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld de, IntroGrass4GFX - ld hl, vTiles1 tile $7f - lb bc, BANK(IntroGrass4GFX), 1 - call Request2bpp - ld hl, IntroTilemap014 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - call Intro_LoadTilemap - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette5 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette5 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld a, $d8 - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - ld hl, wSpriteAnimDict - xor a - ld [hli], a - ld [hl], $7f - call Intro_SetCGBPalUpdate - depixel 12, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY - call _InitSpriteAnimStruct - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene20: ; e5019 (39:5019) -; Suicune running away. A bunch of Unown appear. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $98 - jr nc, .finished - cp $58 - ret nc - cp $40 - jr nc, .AppearUnown - cp $28 - ret nc - ld a, [hSCY] - inc a - ld [hSCY], a - ret - -.AppearUnown: - sub $18 - ld c, a - and $3 - cp $3 - ret nz - ld a, c - and $1c - srl a - srl a - ld [wIntroSceneTimer], a - xor a - call Intro_Scene20_AppearUnown - ret -; e5049 (39:5049) -; unused - ld a, c - and $1c - srl a - srl a - ld [wIntroSceneTimer], a - ld a, 1 - call Intro_Scene20_AppearUnown - ret - -.finished - call NextIntroScene - ret - -IntroScene21: ; e505d (39:505d) -; Suicune gets more distant and turns black. - call Intro_ColoredSuicuneFrameSwap - ld c, 3 - call DelayFrames - xor a - ld [hBGMapMode], a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene22: ; e5072 (39:5072) - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $8 - jr nc, .done - ret -.done - farcall DeinitializeAllSprites - call NextIntroScene - ret - -IntroScene23: ; e5086 (39:5086) - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene24: ; e508e (39:508e) -; Fade to white. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $20 - jr nc, .done - - ld c, a - and $3 - ret nz - - ld a, c - and $1c - sla a - call Intro_Scene24_ApplyPaletteFade - ret - -.done - ld a, $40 - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene25: ; e50ad (39:50ad) -; Wait around a bit. - ld a, [wIntroSceneFrameCounter] - dec a - jr z, .done - ld [wIntroSceneFrameCounter], a - ret - -.done - call NextIntroScene - ret - -IntroScene26: ; e50bb (39:50bb) -; Load the final scene. - call ClearBGPalettes - call ClearSprites - call ClearTileMap - xor a - ld [hBGMapMode], a - ld a, $1 - ld [rVBK], a - ld hl, IntroTilemap015 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ld [rVBK], a - ld hl, IntroCrystalUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroTilemap017 - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - ld hl, IntroPalette3 - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroPalette3 - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ld [rSVBK], a - xor a - ld [hSCX], a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $90 - ld [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene27: ; e512d (39:512d) -; Spell out C R Y S T A L with Unown. - ld hl, wIntroSceneTimer - inc [hl] - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .done - - ld c, a - and $f - ld [wIntroSceneTimer], a - ld a, c - and $70 - swap a - call Intro_FadeUnownWordPals - ret - -.done - call NextIntroScene - ld a, $80 - ld [wIntroSceneFrameCounter], a - ret - -IntroScene28: ; e5152 (39:5152) -; Cut out when the music ends, and lead into the title screen. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - cp $18 - jr z, .clear - cp $8 - ret nz - - ld de, SFX_UNKNOWN_CB - call PlaySFX - ret - -.clear - call ClearBGPalettes - ret - -.done - ld hl, wJumptableIndex - set 7, [hl] - ret - -Intro_Scene24_ApplyPaletteFade: ; e5172 (39:5172) -; load the (a)th palette from .FadePals to all wBGPals2 - ld hl, .FadePals - add l - ld l, a - ld a, $0 - adc h - ld h, a - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - ld de, wBGPals2 - ld b, 8 ; number of BG pals -.loop1 - push hl - ld c, 1 palettes -.loop2 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop2 - pop hl - dec b - jr nz, .loop1 - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; e519c (39:519c) - -.FadePals: ; e519c -INCLUDE "gfx/intro/fade.pal" -; e51dc - -CrystalIntro_InitUnownAnim: ; e51dc (39:51dc) - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $8 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_4 - call ReinitSpriteAnimFrame - pop de - - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $18 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_3 - call ReinitSpriteAnimFrame - pop de - - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $28 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1 - call ReinitSpriteAnimFrame - pop de - - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call _InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $38 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_2 - call ReinitSpriteAnimFrame - ret - -CrystalIntro_UnownFade: ; e5223 (39:5223) - add a - add a - add a - ld e, a - ld d, $0 - ld hl, wBGPals2 - add hl, de - inc hl - inc hl - ld a, [wIntroSceneTimer] - and %111111 - cp %011111 - jr z, .okay - jr c, .okay - ld c, a - ld a, %111111 - sub c -.okay - - ld c, a - ld b, $0 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - - push hl - push bc - ld hl, wBGPals2 - ld bc, 8 palettes - xor a - call ByteFill - pop bc - pop hl - - push hl - ld hl, .BWFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .BlackLBlueFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .BlackBlueFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; e5288 (39:5288) - -.BWFade: ; e5288 -; Fade between black and white. -hue = 0 -rept 32 - RGB hue, hue, hue -hue = hue + 1 -endr -; e52c8 - -.BlackLBlueFade: ; e52c8 -; Fade between black and light blue. -hue = 0 -rept 32 - RGB 0, hue / 2, hue -hue = hue + 1 -endr -; e5308 - -.BlackBlueFade: ; e5308 -; Fade between black and blue. -hue = 0 -rept 32 - RGB 0, 0, hue -hue = hue + 1 -endr -; e5348 - -Intro_Scene20_AppearUnown: ; e5348 (39:5348) -; Spawn the palette for the nth Unown - and a - jr nz, .load_pal_2 - - ld hl, .pal1 - jr .got_pointer - -.load_pal_2 - ld hl, .pal2 - -.got_pointer - ld a, [wIntroSceneTimer] - and $7 - add a - add a - add a - ld c, a - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - - push bc - ld de, wBGPals2 - - ld a, c - add e - ld e, a - ld a, $0 - adc d - ld d, a - - ld bc, 1 palettes - call CopyBytes - pop bc - - ld de, wBGPals1 - ld a, c - add e - ld e, a - ld a, $0 - adc d - ld d, a - - ld bc, 1 palettes - call CopyBytes - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; e538d (39:538d) - -.pal1 ; e538d - RGB 24, 12, 09 - RGB 31, 31, 31 - RGB 12, 00, 31 - RGB 00, 00, 00 - -; e5395 - -.pal2 ; e5395 - RGB 24, 12, 09 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - -; e539d - -Intro_FadeUnownWordPals: ; e539d (39:539d) - add a - add a - add a - ld e, a - ld d, $0 - ld hl, wBGPals2 - add hl, de -rept 4 - inc hl -endr - ld a, [wIntroSceneTimer] - add a - ld c, a - ld b, $0 - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - - push hl - ld hl, .FastFadePalettes - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .SlowFadePalettes - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; e53db (39:53db) - -.FastFadePalettes: ; e53db -hue = 31 -rept 8 - RGB hue, hue, hue -hue = hue + -1 - RGB hue, hue, hue -hue = hue + -2 -endr -; e53fb - -.SlowFadePalettes: ; e53fb -hue = 31 -rept 16 - RGB hue, hue, hue -hue = hue + -1 -endr -; e541b - -Intro_LoadTilemap: ; e541b (39:541b) - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - ld hl, wDecompressScratch - decoord 0, 0 - ld b, SCREEN_HEIGHT -.row - ld c, SCREEN_WIDTH -.col - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .col - ld a, BG_MAP_WIDTH - SCREEN_WIDTH - add l - ld l, a - ld a, 0 - adc h - ld h, a - dec b - jr nz, .row - - pop af - ld [rSVBK], a - ret - -Intro_Scene16_AnimateSuicune: ; e5441 (39:5441) - ld a, [wIntroSceneFrameCounter] - and $3 - jr z, Intro_ColoredSuicuneFrameSwap - cp $3 - jr z, .PrepareForSuicuneSwap - ret - -.PrepareForSuicuneSwap: - xor a - ld [hBGMapMode], a - ret - -Intro_ColoredSuicuneFrameSwap: ; e5451 (39:5451) - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH -.loop - ld a, [hl] - and a - jr z, .skip - cp $80 - jr nc, .skip - xor $8 - ld [hl], a -.skip - inc hl - dec bc - ld a, c - or b - jr nz, .loop - ld a, $1 - ld [hBGMapMode], a - ret - -Intro_RustleGrass: ; e546d (39:546d) - ld a, [wIntroSceneFrameCounter] - cp 36 - ret nc - and $c - srl a - ld e, a - ld d, $0 - ld hl, .RustlingGrassPointers - add hl, de - ld a, [hli] - ld [wRequested2bppSource], a - ld a, [hli] - ld [wRequested2bppSource + 1], a - ld a, LOW(vTiles2 tile $09) - ld [wRequested2bppDest], a - ld a, HIGH(vTiles2 tile $09) - ld [wRequested2bppDest + 1], a - ld a, 4 - ld [wRequested2bppSize], a - ret -; e5496 (39:5496) - -.RustlingGrassPointers: ; e5496 - dw IntroGrass1GFX - dw IntroGrass2GFX - dw IntroGrass3GFX - dw IntroGrass2GFX -; e549e - -Intro_SetCGBPalUpdate: ; e549e (39:549e) - ld a, $1 - ld [hCGBPalUpdate], a - ret - -Intro_ClearBGPals: ; e54a3 (39:54a3) - ld a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ld [rSVBK], a - - ld hl, wBGPals2 - ld bc, 16 palettes - xor a - call ByteFill - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - call DelayFrame - call DelayFrame - ret - -Intro_DecompressRequest2bpp_128Tiles: ; e54c2 (39:54c2) - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $80 - call Request2bpp - - pop af - ld [rSVBK], a - ret - -Intro_DecompressRequest2bpp_255Tiles: ; e54de (39:54de) - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $ff - call Request2bpp - - pop af - ld [rSVBK], a - ret - -Intro_DecompressRequest2bpp_64Tiles: ; e54fa (39:54fa) - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $40 - call Request2bpp - - pop af - ld [rSVBK], a - ret - -Intro_ResetLYOverrides: ; e5516 (39:5516) - ld a, [rSVBK] - push af - ld a, BANK(wLYOverrides) - ld [rSVBK], a - - ld hl, wLYOverrides - ld bc, wLYOverridesEnd - wLYOverrides - xor a - call ByteFill - - pop af - ld [rSVBK], a - ld a, rSCX - $ff00 - ld [hLCDCPointer], a - ret - -Intro_PerspectiveScrollBG: ; e552f (39:552f) - ld a, [rSVBK] - push af - ld a, BANK(wLYOverrides) - ld [rSVBK], a - ; Scroll the grass every frame. - ; Scroll the trees every other frame and at half speed. - ; This creates an illusion of perspective. - ld a, [wIntroSceneFrameCounter] - and $1 - jr z, .skip - ; trees in the back - ld hl, wLYOverrides - ld a, [hl] - inc a - ld bc, $5f - call ByteFill -.skip - ; grass in the front - ld hl, wLYOverrides + $5f - ld a, [hl] - inc a - inc a - ld bc, $31 - call ByteFill - ld a, [wLYOverrides + 0] - ld [hSCX], a - pop af - ld [rSVBK], a - ret - -IntroSuicuneRunGFX: ; e555d -INCBIN "gfx/intro/suicune_run.2bpp.lz" -; e592d - -IntroPichuWooperGFX: ; e592d -INCBIN "gfx/intro/pichu_wooper.2bpp.lz" -; e5c7d - -IntroBackgroundGFX: ; e5c7d -INCBIN "gfx/intro/background.2bpp.lz" -; e5e6d - -IntroTilemap004: ; e5e6d -INCBIN "gfx/intro/004.tilemap.lz" -; e5ecd - -IntroTilemap003: ; e5ecd -INCBIN "gfx/intro/003.tilemap.lz" -; e5edd - -IntroPalette1: ; e5edd -INCLUDE "gfx/intro/intro_1.pal" -; e5f5d - -IntroUnownsGFX: ; e5f5d -INCBIN "gfx/intro/unowns.2bpp.lz" -; e634d - -IntroPulseGFX: ; e634d -INCBIN "gfx/intro/pulse.2bpp.lz" -; e63dd - -IntroTilemap002: ; e63dd -INCBIN "gfx/intro/002.tilemap.lz" -; e641d - -IntroTilemap001: ; e641d -INCBIN "gfx/intro/001.tilemap.lz" -; e642d - -IntroTilemap006: ; e642d -INCBIN "gfx/intro/006.tilemap.lz" -; e647d - -IntroTilemap005: ; e647d -INCBIN "gfx/intro/005.tilemap.lz" -; e649d - -IntroTilemap008: ; e649d -INCBIN "gfx/intro/008.tilemap.lz" -; e655d - -IntroTilemap007: ; e655d -INCBIN "gfx/intro/007.tilemap.lz" -; e65ad - -IntroPalette2: ; e65ad -INCLUDE "gfx/intro/intro_2.pal" -; e662d - -IntroCrystalUnownsGFX: ; e662d -INCBIN "gfx/intro/crystal_unowns.2bpp.lz" -; e672d - -IntroTilemap017: ; e672d -INCBIN "gfx/intro/017.tilemap.lz" -; e676d - -IntroTilemap015: ; e676d -INCBIN "gfx/intro/015.tilemap.lz" -; e679d - -IntroPalette3: ; e679d -INCLUDE "gfx/intro/intro_3.pal" -; e681d - -IntroSuicuneCloseGFX: ; e681d -INCBIN "gfx/intro/suicune_close.2bpp.lz" -; e6c3d - -IntroTilemap012: ; e6c3d -INCBIN "gfx/intro/012.tilemap.lz" -; e6d0d - -IntroTilemap011: ; e6d0d -INCBIN "gfx/intro/011.tilemap.lz" -; e6d6d - -IntroPalette4: ; e6d6d -INCLUDE "gfx/intro/intro_4.pal" -; e6ded - -IntroSuicuneJumpGFX: ; e6ded -INCBIN "gfx/intro/suicune_jump.2bpp.lz" -; e72ad - -IntroSuicuneBackGFX: ; e72ad -INCBIN "gfx/intro/suicune_back.2bpp.lz" -; e764d - -IntroTilemap010: ; e764d -INCBIN "gfx/intro/010.tilemap.lz" -; e76ad - -IntroTilemap009: ; e76ad -INCBIN "gfx/intro/009.tilemap.lz" -; e76bd - -IntroTilemap014: ; e76bd -INCBIN "gfx/intro/014.tilemap.lz" -; e778d - -IntroTilemap013: ; e778d -INCBIN "gfx/intro/013.tilemap.lz" -; e77dd - -IntroPalette5: ; e77dd -INCLUDE "gfx/intro/intro_5.pal" - -IntroUnownBackGFX: ; e785d -INCBIN "gfx/intro/unown_back.2bpp.lz" -; e799d - -IntroGrass1GFX: ; e799d -INCBIN "gfx/intro/grass1.2bpp" -IntroGrass2GFX: ; e79dd -INCBIN "gfx/intro/grass2.2bpp" -IntroGrass3GFX: ; e7a1d -INCBIN "gfx/intro/grass3.2bpp" -IntroGrass4GFX: ; e7a5d -INCBIN "gfx/intro/grass4.2bpp" diff --git a/engine/title/init_hof_credits.asm b/engine/title/init_hof_credits.asm deleted file mode 100644 index e8e98a0e1..000000000 --- a/engine/title/init_hof_credits.asm +++ /dev/null @@ -1,79 +0,0 @@ -InitDisplayForHallOfFame: ; 4e881 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - call LoadStandardFont - call LoadFontsBattleExtra - hlbgcoord 0, 0 - ld bc, vBGMap1 - vBGMap0 - ld a, " " - call ByteFill - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - xor a - ld [hSCY], a - ld [hSCX], a - call EnableLCD - ld hl, .SavingRecordDontTurnOff - call PrintText - call WaitBGMap2 - call SetPalettes - ret - -.SavingRecordDontTurnOff: ; 0x4e8bd - ; SAVING RECORD… DON'T TURN OFF! - text_jump UnknownText_0x1bd39e - db "@" - -InitDisplayForRedCredits: ; 4e8c2 - call ClearBGPalettes - call ClearTileMap - call ClearSprites - call DisableLCD - call LoadStandardFont - call LoadFontsBattleExtra - hlbgcoord 0, 0 - ld bc, vBGMap1 - vBGMap0 - ld a, " " - call ByteFill - hlcoord 0, 0, wAttrMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - ld hl, wBGPals1 - ld c, 4 tiles -.load_white_palettes - ld a, LOW(PALRGB_WHITE) - ld [hli], a - ld a, HIGH(PALRGB_WHITE) - ld [hli], a - dec c - jr nz, .load_white_palettes - xor a - ld [hSCY], a - ld [hSCX], a - call EnableLCD - call WaitBGMap2 - call SetPalettes - ret - -ResetDisplayBetweenHallOfFameMons: ; 4e906 - ld a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ld [rSVBK], a - ld hl, wDecompressScratch - ld bc, wScratchAttrMap - wDecompressScratch - ld a, " " - call ByteFill - hlbgcoord 0, 0 - ld de, wDecompressScratch - ld b, 0 - ld c, 4 tiles - call Request2bpp - pop af - ld [rSVBK], a - ret diff --git a/engine/title/title.asm b/engine/title/title.asm deleted file mode 100644 index f311f2342..000000000 --- a/engine/title/title.asm +++ /dev/null @@ -1,402 +0,0 @@ -_TitleScreen: ; 10ed67 - - call ClearBGPalettes - call ClearSprites - call ClearTileMap - -; Turn BG Map update off - xor a - ld [hBGMapMode], a - -; Reset timing variables - ld hl, wJumptableIndex - ld [hli], a ; wJumptableIndex - ld [hli], a ; wIntroSceneFrameCounter - ld [hli], a ; wTitleScreenTimer - ld [hl], a ; wTitleScreenTimer + 1 - -; Turn LCD off - call DisableLCD - - -; VRAM bank 1 - ld a, 1 - ld [rVBK], a - - -; Decompress running Suicune gfx - ld hl, TitleSuicuneGFX - ld de, vTiles1 - call Decompress - - -; Clear screen palettes - hlbgcoord 0, 0 - ld bc, 20 * BG_MAP_WIDTH - xor a - call ByteFill - - -; Fill tile palettes: - -; BG Map 1: - -; line 0 (copyright) - hlbgcoord 0, 0, vBGMap1 - ld bc, BG_MAP_WIDTH - ld a, 7 ; palette - call ByteFill - - -; BG Map 0: - -; Apply logo gradient: - -; lines 3-4 - hlbgcoord 0, 3 - ld bc, 2 * BG_MAP_WIDTH - ld a, 2 - call ByteFill -; line 5 - hlbgcoord 0, 5 - ld bc, BG_MAP_WIDTH - ld a, 3 - call ByteFill -; line 6 - hlbgcoord 0, 6 - ld bc, BG_MAP_WIDTH - ld a, 4 - call ByteFill -; line 7 - hlbgcoord 0, 7 - ld bc, BG_MAP_WIDTH - ld a, 5 - call ByteFill -; lines 8-9 - hlbgcoord 0, 8 - ld bc, 2 * BG_MAP_WIDTH - ld a, 6 - call ByteFill - - -; 'CRYSTAL VERSION' - hlbgcoord 5, 9 - ld bc, NAME_LENGTH ; length of version text - ld a, 1 - call ByteFill - -; Suicune gfx - hlbgcoord 0, 12 - ld bc, 6 * BG_MAP_WIDTH ; the rest of the screen - ld a, 0 | VRAM_BANK_1 - call ByteFill - - -; Back to VRAM bank 0 - ld a, $0 - ld [rVBK], a - - -; Decompress logo - ld hl, TitleLogoGFX - ld de, vTiles1 - call Decompress - -; Decompress background crystal - ld hl, TitleCrystalGFX - ld de, vTiles0 - call Decompress - - -; Clear screen tiles - hlbgcoord 0, 0 - ld bc, 64 * BG_MAP_WIDTH - ld a, " " - call ByteFill - -; Draw Pokemon logo - hlcoord 0, 3 - lb bc, 7, 20 - ld d, $80 - ld e, $14 - call DrawTitleGraphic - -; Draw copyright text - hlbgcoord 3, 0, vBGMap1 - lb bc, 1, 13 - ld d, $c - ld e, $10 - call DrawTitleGraphic - -; Initialize running Suicune? - ld d, $0 - call LoadSuicuneFrame - -; Initialize background crystal - call InitializeBackground - -; Save WRAM bank - ld a, [rSVBK] - push af -; WRAM bank 5 - ld a, BANK(wBGPals1) - ld [rSVBK], a - -; Update palette colors - ld hl, TitleScreenPalettes - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - - ld hl, TitleScreenPalettes - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - -; Restore WRAM bank - pop af - ld [rSVBK], a - - -; LY/SCX trickery starts here - - ld a, [rSVBK] - push af - ld a, BANK(wLYOverrides) - ld [rSVBK], a - -; Make alternating lines come in from opposite sides - -; (This part is actually totally pointless, you can't -; see anything until these values are overwritten!) - - ld b, 80 / 2 ; alternate for 80 lines - ld hl, wLYOverrides -.loop -; $00 is the middle position - ld [hl], +112 ; coming from the left - inc hl - ld [hl], -112 ; coming from the right - inc hl - dec b - jr nz, .loop - -; Make sure the rest of the buffer is empty - ld hl, wLYOverrides + 80 - xor a - ld bc, wLYOverridesEnd - (wLYOverrides + 80) - call ByteFill - -; Let LCD Stat know we're messing around with SCX - ld a, rSCX - $ff00 - ld [hLCDCPointer], a - - pop af - ld [rSVBK], a - - -; Reset audio - call ChannelsOff - call EnableLCD - -; Set sprite size to 8x16 - ld a, [rLCDC] - set rLCDC_SPRITE_SIZE, a - ld [rLCDC], a - - ld a, +112 - ld [hSCX], a - ld a, 8 - ld [hSCY], a - ld a, 7 - ld [hWX], a - ld a, -112 - ld [hWY], a - - ld a, $1 - ld [hCGBPalUpdate], a - -; Update BG Map 0 (bank 0) - ld [hBGMapMode], a - - xor a - ld [wBGPals1 + 2], a - -; Play starting sound effect - call SFXChannelsOff - ld de, SFX_TITLE_SCREEN_ENTRANCE - call PlaySFX - - ret -; 10eea7 - -SuicuneFrameIterator: ; 10eea7 - ld hl, wBGPals1 + 2 - ld a, [hl] - ld c, a - inc [hl] - -; Only do this once every eight frames - and %111 - ret nz - - ld a, c - and %11000 - sla a - swap a - ld e, a - ld d, $0 - ld hl, .Frames - add hl, de - ld d, [hl] - xor a - ld [hBGMapMode], a - call LoadSuicuneFrame - ld a, $1 - ld [hBGMapMode], a - ld a, $3 - ld [hBGMapThird], a - ret -; 10eece - -.Frames: ; 10eece - db $80 ; vTiles4 tile $00 - db $88 ; vTiles4 tile $08 - db $00 ; vTiles5 tile $00 - db $08 ; vTiles5 tile $08 -; 10eed2 - - -LoadSuicuneFrame: ; 10eed2 - hlcoord 6, 12 - ld b, 6 -.bgrows - ld c, 8 -.col - ld a, d - ld [hli], a - inc d - dec c - jr nz, .col - ld a, SCREEN_WIDTH - 8 - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, 8 - add d - ld d, a - dec b - jr nz, .bgrows - ret -; 10eeef - -DrawTitleGraphic: ; 10eeef -; input: -; hl: draw location -; b: height -; c: width -; d: tile to start drawing from -; e: number of tiles to advance for each bgrows -.bgrows - push de - push bc - push hl -.col - ld a, d - ld [hli], a - inc d - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - pop de - ld a, e - add d - ld d, a - dec b - jr nz, .bgrows - ret -; 10ef06 - -InitializeBackground: ; 10ef06 - ld hl, wVirtualOAMSprite00 - ld d, -$22 - ld e, $0 - ld c, 5 -.loop - push bc - call .InitColumn - pop bc - ld a, $10 - add d - ld d, a - dec c - jr nz, .loop - ret -; 10ef1c - -.InitColumn: ; 10ef1c - ld c, $6 - ld b, $40 -.loop2 - ld a, d - ld [hli], a ; y - ld a, b - ld [hli], a ; x - add $8 - ld b, a - ld a, e - ld [hli], a ; tile id - inc e - inc e - ld a, 0 | PRIORITY - ld [hli], a ; attributes - dec c - jr nz, .loop2 - ret -; 10ef32 - - -AnimateTitleCrystal: ; 10ef32 -; Move the title screen crystal downward until it's fully visible - -; Stop at y=6 -; y is really from the bottom of the sprite, which is two tiles high - ld hl, wVirtualOAMSprite00YCoord - ld a, [hl] - cp 6 + 2 * TILE_WIDTH - ret z - -; Move all 30 parts of the crystal down by 2 - ld c, 30 -.loop - ld a, [hl] - add 2 - ld [hli], a ; y -rept SPRITEOAMSTRUCT_LENGTH + -1 - inc hl -endr - dec c - jr nz, .loop - - ret -; 10ef46 - -TitleSuicuneGFX: ; 10ef46 -INCBIN "gfx/title/suicune.2bpp.lz" -; 10f326 - -TitleLogoGFX: ; 10f326 -INCBIN "gfx/title/logo.2bpp.lz" -; 10fcee - -TitleCrystalGFX: ; 10fcee -INCBIN "gfx/title/crystal.2bpp.lz" -; 10fede - -TitleScreenPalettes: -INCLUDE "gfx/title/title.pal" diff --git a/engine/title/unused_title.asm b/engine/title/unused_title.asm deleted file mode 100644 index 8e52a71bb..000000000 --- a/engine/title/unused_title.asm +++ /dev/null @@ -1,178 +0,0 @@ -UnusedTitleScreen: ; 10c000 - - call ClearBGPalettes - call ClearTileMap - call DisableLCD - -; Turn BG Map update off - xor a - ld [hBGMapMode], a - -; Reset timing variables - ld hl, wJumptableIndex - ld [hli], a ; wJumptableIndex - ld [hli], a ; wIntroSceneFrameCounter - ld [hli], a ; wTitleScreenTimer - ld [hl], a ; wTitleScreenTimer + 1 - - ld hl, UnusedTitleBG_GFX - ld de, vTiles2 - ld bc, vBGMap0 - vTiles2 - call CopyBytes - - ld hl, UnusedTitleBG_GFX + $80 tiles - ld de, vTiles1 - ld bc, vTiles2 - vTiles1 - call CopyBytes - - ld hl, UnusedTitleFG_GFX - ld de, vTiles0 - ld bc, vTiles1 - vTiles0 - call CopyBytes - - ld hl, UnusedTitleBG_Tilemap - debgcoord 0, 0 - ld bc, BG_MAP_WIDTH * BG_MAP_HEIGHT -.copy - ld a, 0 - ld [rVBK], a - ld a, [hli] - ld [de], a - ld a, 1 - ld [rVBK], a - ld a, [hli] - ld [de], a - inc de - dec bc - ld a, b - or c - jr nz, .copy - - ld hl, UnusedTitleFG_OAM - ld de, wVirtualOAMSprite00 - ld bc, SPRITEOAMSTRUCT_LENGTH * NUM_SPRITE_OAM_STRUCTS - call CopyBytes - - call EnableLCD - ld a, [rLCDC] - set rLCDC_SPRITES_ENABLE, a - set rLCDC_SPRITE_SIZE, a - ld [rLCDC], a - - call DelayFrame - - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld hl, UnusedTitleBG_Palettes - ld de, wBGPals1 - ld bc, 8 palettes - call CopyBytes - - ld hl, UnusedTitleFG_Palettes - ld de, wOBPals1 - ld bc, 8 palettes - call CopyBytes - - ld hl, UnusedTitleBG_Palettes - ld de, wBGPals2 - ld bc, 8 palettes - call CopyBytes - - ld hl, UnusedTitleFG_Palettes - ld de, wOBPals2 - ld bc, 8 palettes - call CopyBytes - - pop af - ld [rSVBK], a - - ld a, $1 - ld [hCGBPalUpdate], a - - ld de, MUSIC_TITLE - call PlayMusic - - ret -; 10c0b1 - -UnusedTitleBG_GFX: ; 10c0b1 -INCBIN "gfx/title/old_bg.2bpp" -; 10d0b1 - -UnusedTitleBG_Tilemap: ; 10d0b1 -; 32x32 (alternating tiles and attributes) -INCBIN "gfx/title/old_bg.tilemap" -; 10d8b1 - -UnusedTitleBG_Palettes: ; 10d8b1 -INCLUDE "gfx/title/old_bg.pal" -; 10dab1 - -UnusedTitleFG_GFX: ; 10dab1 -INCBIN "gfx/title/old_fg.2bpp" -; 10eab1 - -UnusedTitleFG_Palettes: ; 10eab1 -INCLUDE "gfx/title/old_fg.pal" -; 10ecb1 - -UnusedTitleFG_OAM: ; 10ecb1 - dsprite 3, 0, 7, 0, $00, 1 - dsprite 3, 0, 8, 0, $02, 1 - dsprite 3, 0, 9, 0, $04, 1 - dsprite 3, 0, 10, 0, $06, 1 - dsprite 3, 0, 11, 0, $08, 1 - dsprite 3, 0, 12, 0, $0a, 1 - dsprite 3, 0, 13, 0, $0c, 1 - dsprite 3, 0, 14, 0, $0e, 1 - dsprite 5, 0, 7, 0, $10, 0 - dsprite 5, 0, 8, 0, $12, 0 - dsprite 5, 0, 9, 0, $14, 0 - dsprite 5, 0, 10, 0, $16, 0 - dsprite 5, 0, 11, 0, $18, 0 - dsprite 5, 0, 12, 0, $1a, 0 - dsprite 5, 0, 13, 0, $1c, 0 - dsprite 5, 0, 14, 0, $1e, 0 - dsprite 7, 0, 7, 0, $20, 0 - dsprite 7, 0, 8, 0, $22, 0 - dsprite 7, 0, 9, 0, $24, 0 - dsprite 7, 0, 10, 0, $26, 0 - dsprite 7, 0, 11, 0, $28, 0 - dsprite 7, 0, 12, 0, $2a, 0 - dsprite 7, 0, 13, 0, $2c, 0 - dsprite 7, 0, 14, 0, $2e, 0 - dsprite 9, 0, 7, 0, $30, 2 - dsprite 9, 0, 8, 0, $32, 2 - dsprite 9, 0, 9, 0, $34, 2 - dsprite 9, 0, 10, 0, $36, 2 - dsprite 9, 0, 11, 0, $38, 2 - dsprite 9, 0, 12, 0, $3a, 2 - dsprite 9, 0, 13, 0, $3c, 2 - dsprite 9, 0, 14, 0, $3e, 2 - dsprite 11, 0, 7, 0, $40, 1 - dsprite 11, 0, 8, 0, $42, 1 - dsprite 11, 0, 9, 0, $44, 1 - dsprite 11, 0, 10, 0, $46, 1 - dsprite 11, 0, 11, 0, $48, 1 - dsprite 11, 0, 12, 0, $4a, 1 - dsprite 11, 0, 13, 0, $4c, 1 - dsprite 11, 0, 14, 0, $4e, 1 -; 10ed51 - -Function10ed51: ; 10ed51 - call _TitleScreen -.loop - call JoyTextDelay - ld a, [hJoyLast] - ld b, a - and 1 - jr nz, .done - call SuicuneFrameIterator - call DelayFrame - jr .loop -.done - ret -; 10ed67 diff --git a/main.asm b/main.asm index 7c5610e5f..4980beee4 100644 --- a/main.asm +++ b/main.asm @@ -3,13 +3,13 @@ INCLUDE "constants.asm" SECTION "bank1", ROMX -INCLUDE "engine/routines/placewaitingtext.asm" -INCLUDE "engine/routines/loadpushoam.asm" +INCLUDE "engine/link/placewaitingtext.asm" +INCLUDE "engine/gfx/loadpushoam.asm" INCLUDE "engine/overworld/map_objects.asm" INCLUDE "engine/menus/intro_menu.asm" INCLUDE "engine/overworld/init_map.asm" INCLUDE "engine/pokemon/learn.asm" -INCLUDE "engine/routines/checknickerrors.asm" +INCLUDE "engine/pokemon/checknickerrors.asm" INCLUDE "engine/routines/math.asm" INCLUDE "data/items/attributes.asm" INCLUDE "engine/overworld/npc_movement.asm" @@ -21,13 +21,13 @@ SECTION "bank2", ROMX INCLUDE "engine/overworld/player_object.asm" INCLUDE "engine/routines/sine.asm" -INCLUDE "engine/predef.asm" +INCLUDE "engine/routines/predef.asm" INCLUDE "engine/gfx/color.asm" SECTION "bank3", ROMX -INCLUDE "engine/routines/checktime.asm" +INCLUDE "engine/events/checktime.asm" INCLUDE "engine/events/specials.asm" INCLUDE "engine/routines/printnum.asm" INCLUDE "engine/pokemon/health.asm" @@ -48,7 +48,7 @@ SECTION "bank4", ROMX INCLUDE "engine/items/pack.asm" INCLUDE "engine/overworld/time.asm" -INCLUDE "engine/items/tmhm.asm" +INCLUDE "engine/items/tmhm2.asm" INCLUDE "engine/menus/naming_screen.asm" INCLUDE "engine/events/misc_scripts.asm" INCLUDE "engine/events/heal_machine_anim.asm" @@ -64,7 +64,7 @@ INCLUDE "engine/events/std_collision.asm" INCLUDE "engine/events/bug_contest/judging.asm" INCLUDE "engine/events/pokerus/apply_pokerus_tick.asm" INCLUDE "engine/events/bug_contest/contest_2.asm" -INCLUDE "engine/routines/correcterrorsinplayerparty.asm" +INCLUDE "engine/pokemon/correcterrorsinplayerparty.asm" INCLUDE "engine/routines/getsquareroot.asm" @@ -73,12 +73,12 @@ SECTION "bank5", ROMX INCLUDE "engine/rtc/rtc.asm" INCLUDE "engine/overworld/overworld.asm" INCLUDE "engine/overworld/tile_events.asm" -INCLUDE "engine/save.asm" +INCLUDE "engine/menus/save.asm" INCLUDE "engine/overworld/spawn_points.asm" INCLUDE "engine/overworld/map_setup.asm" INCLUDE "engine/events/pokecenter_pc.asm" INCLUDE "engine/items/mart.asm" -INCLUDE "engine/money.asm" +INCLUDE "engine/events/money.asm" INCLUDE "data/items/marts.asm" INCLUDE "engine/events/mom.asm" INCLUDE "engine/events/daycare.asm" @@ -90,7 +90,7 @@ INCLUDE "gfx/tilesets.asm" SECTION "Roofs", ROMX -INCLUDE "engine/gfx/mapgroup_roofs.asm" +INCLUDE "engine/tilesets/mapgroup_roofs.asm" SECTION "Clock Reset", ROMX @@ -144,7 +144,7 @@ INCLUDE "data/trainers/class_names.asm" INCLUDE "engine/battle/ai/redundant.asm" INCLUDE "engine/events/move_deleter.asm" INCLUDE "engine/link/mystery_gift_2.asm" -INCLUDE "engine/pokemon/tmhm.asm" +INCLUDE "engine/items/tmhm.asm" INCLUDE "data/moves/descriptions.asm" INCLUDE "engine/events/pokerus/pokerus.asm" INCLUDE "engine/battle/start_battle.asm" @@ -205,15 +205,15 @@ INCLUDE "engine/events/buena_menu.asm" SECTION "bank13", ROMX -INCLUDE "engine/gfx/map_palettes.asm" +INCLUDE "engine/tilesets/map_palettes.asm" INCLUDE "gfx/tileset_palette_maps.asm" INCLUDE "data/collision_permissions.asm" INCLUDE "engine/routines/emptyallsrambanks.asm" -INCLUDE "engine/routines/savemenu_copytilemapatonce.asm" -INCLUDE "engine/routines/checksave.asm" +INCLUDE "engine/menus/savemenu_copytilemapatonce.asm" +INCLUDE "engine/events/checksave.asm" INCLUDE "data/maps/scenes.asm" INCLUDE "engine/overworld/loadmappart.asm" -INCLUDE "engine/routines/phonering_copytilemapatonce.asm" +INCLUDE "engine/phone/phonering_copytilemapatonce.asm" Shrink1Pic: ; 4d249 INCBIN "gfx/new_game/shrink1.2bpp.lz" @@ -232,13 +232,13 @@ INCLUDE "engine/pokemon/caught_data.asm" INCLUDE "engine/pokemon/search2.asm" INCLUDE "engine/pokemon/stats_screen.asm" INCLUDE "engine/events/catch_tutorial.asm" -INCLUDE "engine/gfx/evolution_animation.asm" -INCLUDE "engine/title/init_hof_credits.asm" +INCLUDE "engine/movie/evolution_animation.asm" +INCLUDE "engine/movie/init_hof_credits.asm" INCLUDE "engine/events/battle_tower/get_trainer_class.asm" INCLUDE "engine/battle/sliding_intro.asm" INCLUDE "mobile/print_opp_message.asm" INCLUDE "engine/battle/checkbattlescene.asm" -INCLUDE "engine/gfx/gbc_only.asm" +INCLUDE "engine/movie/gbc_only.asm" INCLUDE "engine/events/poke_seer.asm" @@ -277,10 +277,10 @@ INCLUDE "data/phone/text/extra.asm" SECTION "bank20", ROMX INCLUDE "engine/overworld/player_movement.asm" -INCLUDE "engine/engine_flags.asm" +INCLUDE "engine/events/engine_flags.asm" INCLUDE "engine/overworld/variables.asm" INCLUDE "data/text/battle.asm" -INCLUDE "engine/debug.asm" +INCLUDE "engine/menus/debug.asm" SECTION "bank21", ROMX @@ -304,7 +304,7 @@ INCLUDE "mobile/mobile_22_2.asm" SECTION "bank23", ROMX -INCLUDE "engine/gfx/timeofdaypals.asm" +INCLUDE "engine/tilesets/timeofdaypals.asm" INCLUDE "engine/battle/battle_transition.asm" INCLUDE "engine/events/field_moves.asm" INCLUDE "engine/events/magnet_train.asm" @@ -442,7 +442,7 @@ CopyrightGFX:: ; e4000 INCBIN "gfx/splash/copyright.2bpp" INCLUDE "engine/menus/options_menu.asm" -INCLUDE "engine/title/crystal_intro.asm" +INCLUDE "engine/movie/crystal_intro.asm" SECTION "bank3E", ROMX @@ -450,7 +450,7 @@ SECTION "bank3E", ROMX INCLUDE "engine/gfx/load_font.asm" INCLUDE "engine/link/time_capsule.asm" INCLUDE "engine/events/name_rater.asm" -INCLUDE "engine/routines/playslowcry.asm" +INCLUDE "engine/events/playslowcry.asm" INCLUDE "engine/pokedex/newpokedexentry.asm" INCLUDE "engine/link/time_capsule_2.asm" INCLUDE "engine/pokedex/unown_dex.asm" @@ -461,7 +461,7 @@ INCLUDE "engine/battle/misc.asm" SECTION "bank3F", ROMX -INCLUDE "engine/gfx/tileset_anims.asm" +INCLUDE "engine/tilesets/tileset_anims.asm" INCLUDE "engine/events/npc_trade.asm" INCLUDE "engine/events/mom_phone.asm" @@ -471,7 +471,7 @@ INCLUDE "mobile/mobile_40.asm" SECTION "bank41", ROMX -INCLUDE "engine/dma_transfer.asm" +INCLUDE "engine/gfx/dma_transfer.asm" INCLUDE "gfx/emotes.asm" INCLUDE "engine/overworld/warp_connection.asm" INCLUDE "engine/link/mystery_gift.asm" @@ -493,8 +493,8 @@ INCBIN "gfx/intro/logo.2bpp.lz" SECTION "Title", ROMX -INCLUDE "engine/title/unused_title.asm" -INCLUDE "engine/title/title.asm" +INCLUDE "engine/movie/unused_title.asm" +INCLUDE "engine/movie/title.asm" INCLUDE "mobile/mobile_45.asm" @@ -586,7 +586,7 @@ INCLUDE "engine/rtc/printhoursmins.asm" INCLUDE "engine/events/diploma.asm" INCLUDE "engine/pokedex/pokedex_3.asm" INCLUDE "engine/events/catch_tutorial_input.asm" -INCLUDE "engine/routines/townmap_convertlinebreakcharacters.asm" +INCLUDE "engine/pokegear/townmap_convertlinebreakcharacters.asm" PokegearGFX: ; 1de2e4 INCBIN "gfx/pokegear/pokegear.2bpp.lz" -- cgit v1.2.3 From be76ee56a89e72c0b87a605321bb1670e86f8220 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sun, 25 Mar 2018 18:24:14 +0200 Subject: Organize the engine/ directory, director's cut Cleaned up `engine/routines`, in favor of moving files into more appropriate directories. predef-related routines are now in top-level `engine`. `rtc/delete_save_change_clock.asm` has been split into both `menus/delete_save.asm` and `rtc/reset_password.asm`. Made a new subdirectory: * engine/math: Contains all generic math-related routines. --- .../unreferenced_getgen1trainerclassname.asm | 21 ++ engine/flagpredef.asm | 70 +++++ engine/link/initlist.asm | 54 ++++ engine/math/getsquareroot.asm | 32 +++ engine/math/math.asm | 196 ++++++++++++++ engine/math/printnum.asm | 300 +++++++++++++++++++++ engine/math/sine.asm | 4 + engine/menus/delete_save.asm | 36 +++ engine/menus/emptyallsrambanks.asm | 19 ++ engine/predef.asm | 29 ++ engine/routines/emptyallsrambanks.asm | 19 -- engine/routines/flagpredef.asm | 70 ----- engine/routines/getsquareroot.asm | 32 --- engine/routines/initlist.asm | 54 ---- engine/routines/math.asm | 196 -------------- engine/routines/predef.asm | 29 -- engine/routines/printnum.asm | 300 --------------------- engine/routines/sine.asm | 4 - .../unreferenced_getgen1trainerclassname.asm | 21 -- engine/rtc/clock_reset.asm | 254 ----------------- engine/rtc/delete_save_change_clock.asm | 296 -------------------- engine/rtc/reset_password.asm | 259 ++++++++++++++++++ engine/rtc/restart_clock.asm | 253 +++++++++++++++++ main.asm | 23 +- 24 files changed, 1285 insertions(+), 1286 deletions(-) create mode 100644 engine/battle/unreferenced_getgen1trainerclassname.asm create mode 100644 engine/flagpredef.asm create mode 100644 engine/link/initlist.asm create mode 100644 engine/math/getsquareroot.asm create mode 100755 engine/math/math.asm create mode 100755 engine/math/printnum.asm create mode 100755 engine/math/sine.asm create mode 100644 engine/menus/delete_save.asm create mode 100644 engine/menus/emptyallsrambanks.asm create mode 100644 engine/predef.asm delete mode 100644 engine/routines/emptyallsrambanks.asm delete mode 100644 engine/routines/flagpredef.asm delete mode 100644 engine/routines/getsquareroot.asm delete mode 100644 engine/routines/initlist.asm delete mode 100755 engine/routines/math.asm delete mode 100644 engine/routines/predef.asm delete mode 100755 engine/routines/printnum.asm delete mode 100755 engine/routines/sine.asm delete mode 100644 engine/routines/unreferenced_getgen1trainerclassname.asm delete mode 100755 engine/rtc/clock_reset.asm delete mode 100755 engine/rtc/delete_save_change_clock.asm create mode 100755 engine/rtc/reset_password.asm create mode 100755 engine/rtc/restart_clock.asm diff --git a/engine/battle/unreferenced_getgen1trainerclassname.asm b/engine/battle/unreferenced_getgen1trainerclassname.asm new file mode 100644 index 000000000..da8e98b61 --- /dev/null +++ b/engine/battle/unreferenced_getgen1trainerclassname.asm @@ -0,0 +1,21 @@ +Unreferenced_GetGen1TrainerClassName: ; 50a28 + ld hl, Gen1TrainerClassNames + ld a, [wTrainerClass] + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wStringBuffer1 +.copy + ld a, [hli] + ld [de], a + inc de + cp "@" + jr nz, .copy + ret + +INCLUDE "data/text/unused_gen1_trainer_names.asm" diff --git a/engine/flagpredef.asm b/engine/flagpredef.asm new file mode 100644 index 000000000..2a6d91ee1 --- /dev/null +++ b/engine/flagpredef.asm @@ -0,0 +1,70 @@ +SmallFarFlagAction: ; 4d7c1 +; Perform action b on bit c in flag array hl. +; If checking a flag, check flag array d:hl unless d is 0. + +; For longer flag arrays, see FlagAction. + + push hl + push bc + +; Divide by 8 to get the byte we want. + push bc + srl c + srl c + srl c + ld b, 0 + add hl, bc + pop bc + +; Which bit we want from the byte + ld a, c + and 7 + ld c, a + +; Shift left until we can mask the bit + ld a, 1 + jr z, .shifted +.shift + add a + dec c + jr nz, .shift +.shifted + ld c, a + +; What are we doing to this flag? + dec b + jr z, .set ; 1 + dec b + jr z, .check ; 2 + +.reset + ld a, c + cpl + and [hl] + ld [hl], a + jr .done + +.set + ld a, [hl] + or c + ld [hl], a + jr .done + +.check + ld a, d + cp 0 + jr nz, .farcheck + + ld a, [hl] + and c + jr .done + +.farcheck + call GetFarByte + and c + +.done + pop bc + pop hl + ld c, a + ret diff --git a/engine/link/initlist.asm b/engine/link/initlist.asm new file mode 100644 index 000000000..26c77b5bb --- /dev/null +++ b/engine/link/initlist.asm @@ -0,0 +1,54 @@ +InitList: ; 50db9 + ld a, [wInitListType] + + cp INIT_ENEMYOT_LIST + jr nz, .check_party_ot_name + ld hl, wOTPartyCount + ld de, wOTPartyMonOT + ld a, ENEMY_OT_NAME + jr .done + +.check_party_ot_name + cp INIT_PLAYEROT_LIST + jr nz, .check_mon_name + ld hl, wPartyCount + ld de, wPartyMonOT + ld a, PARTY_OT_NAME + jr .done + +.check_mon_name + cp INIT_MON_LIST + jr nz, .check_item_name + ld hl, wCurMart + ld de, PokemonNames + ld a, MON_NAME + jr .done + +.check_item_name + cp INIT_BAG_ITEM_LIST + jr nz, .check_ob_item_name + ld hl, wNumItems + ld de, ItemNames + ld a, ITEM_NAME + jr .done + +.check_ob_item_name + ld hl, wCurMart + ld de, ItemNames + ld a, ITEM_NAME +.done + ld [wNamedObjectTypeBuffer], a + ld a, l + ld [wListPointer], a + ld a, h + ld [wListPointer + 1], a + ld a, e + ld [wUnusedD102], a + ld a, d + ld [wUnusedD102 + 1], a + ld bc, ItemAttributes + ld a, c + ld [wItemAttributesPtr], a + ld a, b + ld [wItemAttributesPtr + 1], a + ret diff --git a/engine/math/getsquareroot.asm b/engine/math/getsquareroot.asm new file mode 100644 index 000000000..412fd04ff --- /dev/null +++ b/engine/math/getsquareroot.asm @@ -0,0 +1,32 @@ +NUM_SQUARE_ROOTS EQU 255 + +GetSquareRoot: ; 13b87 +; Return the square root of de in b. + +; Rather than calculating the result, we take the index of the +; first value in a table of squares that isn't lower than de. + + ld hl, .Squares + ld b, 0 +.loop +; Make sure we don't go past the end of the table. + inc b + ld a, b + cp NUM_SQUARE_ROOTS + ret z + +; Iterate over the table until b**2 >= de. + ld a, [hli] + sub e + ld a, [hli] + sbc d + + jr c, .loop + ret + +.Squares: ; 13b98 +x = 1 +rept NUM_SQUARE_ROOTS + dw x * x +x = x + 1 +endr diff --git a/engine/math/math.asm b/engine/math/math.asm new file mode 100755 index 000000000..0cd6b0b47 --- /dev/null +++ b/engine/math/math.asm @@ -0,0 +1,196 @@ +_Multiply:: ; 66de + +; hMultiplier is one byte. + ld a, 8 + ld b, a + + xor a + ld [hProduct], a + ld [hMathBuffer + 1], a + ld [hMathBuffer + 2], a + ld [hMathBuffer + 3], a + ld [hMathBuffer + 4], a + + +.loop + ld a, [hMultiplier] + srl a + ld [hMultiplier], a + jr nc, .next + + ld a, [hMathBuffer + 4] + ld c, a + ld a, [hMultiplicand + 2] + add c + ld [hMathBuffer + 4], a + + ld a, [hMathBuffer + 3] + ld c, a + ld a, [hMultiplicand + 1] + adc c + ld [hMathBuffer + 3], a + + ld a, [hMathBuffer + 2] + ld c, a + ld a, [hMultiplicand + 0] + adc c + ld [hMathBuffer + 2], a + + ld a, [hMathBuffer + 1] + ld c, a + ld a, [hProduct] + adc c + ld [hMathBuffer + 1], a + +.next + dec b + jr z, .done + + +; hMultiplicand <<= 1 + + ld a, [hMultiplicand + 2] + add a + ld [hMultiplicand + 2], a + + ld a, [hMultiplicand + 1] + rla + ld [hMultiplicand + 1], a + + ld a, [hMultiplicand + 0] + rla + ld [hMultiplicand + 0], a + + ld a, [hProduct] + rla + ld [hProduct], a + + jr .loop + + +.done + ld a, [hMathBuffer + 4] + ld [hProduct + 3], a + + ld a, [hMathBuffer + 3] + ld [hProduct + 2], a + + ld a, [hMathBuffer + 2] + ld [hProduct + 1], a + + ld a, [hMathBuffer + 1] + ld [hProduct + 0], a + + ret +; 673e + + +_Divide:: ; 673e + xor a + ld [hMathBuffer + 0], a + ld [hMathBuffer + 1], a + ld [hMathBuffer + 2], a + ld [hMathBuffer + 3], a + ld [hMathBuffer + 4], a + + ld a, 9 + ld e, a + +.loop + ld a, [hMathBuffer + 0] + ld c, a + ld a, [hDividend + 1] + sub c + ld d, a + + ld a, [hDivisor] + ld c, a + ld a, [hDividend + 0] + sbc c + jr c, .next + + ld [hDividend + 0], a + + ld a, d + ld [hDividend + 1], a + + ld a, [hMathBuffer + 4] + inc a + ld [hMathBuffer + 4], a + + jr .loop + +.next + ld a, b + cp 1 + jr z, .done + + ld a, [hMathBuffer + 4] + add a + ld [hMathBuffer + 4], a + + ld a, [hMathBuffer + 3] + rla + ld [hMathBuffer + 3], a + + ld a, [hMathBuffer + 2] + rla + ld [hMathBuffer + 2], a + + ld a, [hMathBuffer + 1] + rla + ld [hMathBuffer + 1], a + + dec e + jr nz, .next2 + + ld e, 8 + ld a, [hMathBuffer + 0] + ld [hDivisor], a + xor a + ld [hMathBuffer + 0], a + + ld a, [hDividend + 1] + ld [hDividend + 0], a + + ld a, [hDividend + 2] + ld [hDividend + 1], a + + ld a, [hDividend + 3] + ld [hDividend + 2], a + +.next2 + ld a, e + cp 1 + jr nz, .okay + dec b + +.okay + ld a, [hDivisor] + srl a + ld [hDivisor], a + + ld a, [hMathBuffer + 0] + rr a + ld [hMathBuffer + 0], a + + jr .loop + +.done + ld a, [hDividend + 1] + ld [hDivisor], a + + ld a, [hMathBuffer + 4] + ld [hDividend + 3], a + + ld a, [hMathBuffer + 3] + ld [hDividend + 2], a + + ld a, [hMathBuffer + 2] + ld [hDividend + 1], a + + ld a, [hMathBuffer + 1] + ld [hDividend + 0], a + + ret +; 67c1 diff --git a/engine/math/printnum.asm b/engine/math/printnum.asm new file mode 100755 index 000000000..fec798d5c --- /dev/null +++ b/engine/math/printnum.asm @@ -0,0 +1,300 @@ +_PrintNum:: ; c4c7 +; Print c digits of the b-byte value from de to hl. +; Allows 2 to 7 digits. For 1-digit numbers, add +; the value to char "0" instead of calling PrintNum. +; Some extra flags can be given in bits 5-7 of b. +; Bit 5: money if set (unless left-aligned without leading zeros) +; Bit 6: right-aligned if set +; Bit 7: print leading zeros if set + + push bc + + bit 5, b + jr z, .main + bit 7, b + jr nz, .moneyflag + bit 6, b + jr z, .main + +.moneyflag ; 101xxxxx or 011xxxxx + ld a, "¥" + ld [hli], a + res 5, b ; 100xxxxx or 010xxxxx + +.main + xor a + ld [hPrintNum1], a + ld [hPrintNum2], a + ld [hPrintNum3], a + ld a, b + and $f + cp 1 + jr z, .byte + cp 2 + jr z, .word +; maximum 3 bytes +.long + ld a, [de] + ld [hPrintNum2], a + inc de + ld a, [de] + ld [hPrintNum3], a + inc de + ld a, [de] + ld [hPrintNum4], a + jr .start + +.word + ld a, [de] + ld [hPrintNum3], a + inc de + ld a, [de] + ld [hPrintNum4], a + jr .start + +.byte + ld a, [de] + ld [hPrintNum4], a + +.start + push de + + ld d, b + ld a, c + swap a + and $f + ld e, a + ld a, c + and $f + ld b, a + ld c, 0 + cp 2 + jr z, .two + cp 3 + jr z, .three + cp 4 + jr z, .four + cp 5 + jr z, .five + cp 6 + jr z, .six + +.seven + ld a, HIGH(1000000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(1000000) ; mid + ld [hPrintNum6], a + ld a, LOW(1000000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.six + ld a, HIGH(100000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(100000) ; mid + ld [hPrintNum6], a + ld a, LOW(100000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.five + xor a ; HIGH(10000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(10000) ; mid + ld [hPrintNum6], a + ld a, LOW(10000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.four + xor a ; HIGH(1000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(1000) ; mid + ld [hPrintNum6], a + ld a, LOW(1000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.three + xor a ; HIGH(100 >> 8) + ld [hPrintNum5], a + xor a ; HIGH(100) ; mid + ld [hPrintNum6], a + ld a, LOW(100) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.two + dec e + jr nz, .two_skip + ld a, "0" + ld [hPrintNum1], a +.two_skip + + ld c, 0 + ld a, [hPrintNum4] +.mod_10 + cp 10 + jr c, .modded_10 + sub 10 + inc c + jr .mod_10 +.modded_10 + + ld b, a + ld a, [hPrintNum1] + or c + jr nz, .money + call .PrintLeadingZero + jr .money_leading_zero + +.money + call .PrintYen + push af + ld a, "0" + add c + ld [hl], a + pop af + ld [hPrintNum1], a + inc e + dec e + jr nz, .money_leading_zero + inc hl + ld [hl], "" + +.money_leading_zero + call .AdvancePointer + call .PrintYen + ld a, "0" + add b + ld [hli], a + + pop de + pop bc + ret + +.PrintYen: ; c5ba + push af + ld a, [hPrintNum1] + and a + jr nz, .stop + bit 5, d + jr z, .stop + ld a, "¥" + ld [hli], a + res 5, d + +.stop + pop af + ret + +.PrintDigit: ; c5cb (3:45cb) + dec e + jr nz, .ok + ld a, "0" + ld [hPrintNum1], a +.ok + ld c, 0 +.loop + ld a, [hPrintNum5] + ld b, a + ld a, [hPrintNum2] + ld [hPrintNum8], a + cp b + jr c, .skip1 + sub b + ld [hPrintNum2], a + ld a, [hPrintNum6] + ld b, a + ld a, [hPrintNum3] + ld [hPrintNum9], a + cp b + jr nc, .skip2 + ld a, [hPrintNum2] + or 0 + jr z, .skip3 + dec a + ld [hPrintNum2], a + ld a, [hPrintNum3] +.skip2 + sub b + ld [hPrintNum3], a + ld a, [hPrintNum7] + ld b, a + ld a, [hPrintNum4] + ld [hPrintNum10], a + cp b + jr nc, .skip4 + ld a, [hPrintNum3] + and a + jr nz, .skip5 + ld a, [hPrintNum2] + and a + jr z, .skip6 + dec a + ld [hPrintNum2], a + xor a +.skip5 + dec a + ld [hPrintNum3], a + ld a, [hPrintNum4] +.skip4 + sub b + ld [hPrintNum4], a + inc c + jr .loop +.skip6 + ld a, [hPrintNum9] + ld [hPrintNum3], a +.skip3 + ld a, [hPrintNum8] + ld [hPrintNum2], a +.skip1 + ld a, [hPrintNum1] + or c + jr z, .PrintLeadingZero + ld a, [hPrintNum1] + and a + jr nz, .done + bit 5, d + jr z, .done + ld a, "¥" + ld [hli], a + res 5, d +.done + ld a, "0" + add c + ld [hl], a + ld [hPrintNum1], a + inc e + dec e + ret nz + inc hl + ld [hl], "" + ret + +.PrintLeadingZero: ; c644 +; prints a leading zero unless they are turned off in the flags + bit 7, d ; print leading zeroes? + ret z + ld [hl], "0" + ret + +.AdvancePointer: ; c64a +; increments the pointer unless leading zeroes are not being printed, +; the number is left-aligned, and no nonzero digits have been printed yet + bit 7, d ; print leading zeroes? + jr nz, .inc + bit 6, d ; left alignment or right alignment? + jr z, .inc + ld a, [hPrintNum1] + and a + ret z +.inc + inc hl + ret diff --git a/engine/math/sine.asm b/engine/math/sine.asm new file mode 100755 index 000000000..23e86c015 --- /dev/null +++ b/engine/math/sine.asm @@ -0,0 +1,4 @@ +_Sine:: ; 84d9 +; a = d * sin(e * pi/32) + ld a, e + calc_sine_wave diff --git a/engine/menus/delete_save.asm b/engine/menus/delete_save.asm new file mode 100644 index 000000000..a86faf06a --- /dev/null +++ b/engine/menus/delete_save.asm @@ -0,0 +1,36 @@ +_DeleteSaveData: ; 4d54c + farcall BlankScreen + ld b, SCGB_DIPLOMA + call GetSGBLayout + call LoadStandardFont + call LoadFontsExtra + ld de, MUSIC_MAIN_MENU + call PlayMusic + ld hl, .Text_ClearAllSaveData + call PrintText + ld hl, .NoYesMenuHeader + call CopyMenuHeader + call VerticalMenu + ret c + ld a, [wMenuCursorY] + cp $1 + ret z + farcall EmptyAllSRAMBanks + ret + +.Text_ClearAllSaveData: ; 0x4d580 + ; Clear all save data? + text_jump UnknownText_0x1c564a + db "@" + +.NoYesMenuHeader: ; 0x4d585 + db 0 ; flags + menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .MenuData + db 1 ; default option + +.MenuData: ; 0x4d58d + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "NO@" + db "YES@" diff --git a/engine/menus/emptyallsrambanks.asm b/engine/menus/emptyallsrambanks.asm new file mode 100644 index 000000000..8b060f3ef --- /dev/null +++ b/engine/menus/emptyallsrambanks.asm @@ -0,0 +1,19 @@ +EmptyAllSRAMBanks: ; 4cf1f + ld a, 0 + call .EmptyBank + ld a, 1 + call .EmptyBank + ld a, 2 + call .EmptyBank + ld a, 3 + call .EmptyBank + ret + +.EmptyBank: ; 4cf34 + call GetSRAMBank + ld hl, SRAM_Begin + ld bc, SRAM_End - SRAM_Begin + xor a + call ByteFill + call CloseSRAM + ret diff --git a/engine/predef.asm b/engine/predef.asm new file mode 100644 index 000000000..13c593c90 --- /dev/null +++ b/engine/predef.asm @@ -0,0 +1,29 @@ +GetPredefPointer:: ; 854b +; Return the bank and address of wPredefID in a and wPredefAddress. + +; Save hl for later (back in Predef) + ld a, h + ld [wPredefTemp], a + ld a, l + ld [wPredefTemp + 1], a + + push de + ld a, [wPredefID] + ld e, a + ld d, 0 + ld hl, PredefPointers + add hl, de + add hl, de + add hl, de + pop de + + ld a, [hli] + ld [wPredefAddress + 1], a + ld a, [hli] + ld [wPredefAddress], a + ld a, [hl] + + ret +; 856b + +INCLUDE "data/predef_pointers.asm" diff --git a/engine/routines/emptyallsrambanks.asm b/engine/routines/emptyallsrambanks.asm deleted file mode 100644 index 8b060f3ef..000000000 --- a/engine/routines/emptyallsrambanks.asm +++ /dev/null @@ -1,19 +0,0 @@ -EmptyAllSRAMBanks: ; 4cf1f - ld a, 0 - call .EmptyBank - ld a, 1 - call .EmptyBank - ld a, 2 - call .EmptyBank - ld a, 3 - call .EmptyBank - ret - -.EmptyBank: ; 4cf34 - call GetSRAMBank - ld hl, SRAM_Begin - ld bc, SRAM_End - SRAM_Begin - xor a - call ByteFill - call CloseSRAM - ret diff --git a/engine/routines/flagpredef.asm b/engine/routines/flagpredef.asm deleted file mode 100644 index 2a6d91ee1..000000000 --- a/engine/routines/flagpredef.asm +++ /dev/null @@ -1,70 +0,0 @@ -SmallFarFlagAction: ; 4d7c1 -; Perform action b on bit c in flag array hl. -; If checking a flag, check flag array d:hl unless d is 0. - -; For longer flag arrays, see FlagAction. - - push hl - push bc - -; Divide by 8 to get the byte we want. - push bc - srl c - srl c - srl c - ld b, 0 - add hl, bc - pop bc - -; Which bit we want from the byte - ld a, c - and 7 - ld c, a - -; Shift left until we can mask the bit - ld a, 1 - jr z, .shifted -.shift - add a - dec c - jr nz, .shift -.shifted - ld c, a - -; What are we doing to this flag? - dec b - jr z, .set ; 1 - dec b - jr z, .check ; 2 - -.reset - ld a, c - cpl - and [hl] - ld [hl], a - jr .done - -.set - ld a, [hl] - or c - ld [hl], a - jr .done - -.check - ld a, d - cp 0 - jr nz, .farcheck - - ld a, [hl] - and c - jr .done - -.farcheck - call GetFarByte - and c - -.done - pop bc - pop hl - ld c, a - ret diff --git a/engine/routines/getsquareroot.asm b/engine/routines/getsquareroot.asm deleted file mode 100644 index 412fd04ff..000000000 --- a/engine/routines/getsquareroot.asm +++ /dev/null @@ -1,32 +0,0 @@ -NUM_SQUARE_ROOTS EQU 255 - -GetSquareRoot: ; 13b87 -; Return the square root of de in b. - -; Rather than calculating the result, we take the index of the -; first value in a table of squares that isn't lower than de. - - ld hl, .Squares - ld b, 0 -.loop -; Make sure we don't go past the end of the table. - inc b - ld a, b - cp NUM_SQUARE_ROOTS - ret z - -; Iterate over the table until b**2 >= de. - ld a, [hli] - sub e - ld a, [hli] - sbc d - - jr c, .loop - ret - -.Squares: ; 13b98 -x = 1 -rept NUM_SQUARE_ROOTS - dw x * x -x = x + 1 -endr diff --git a/engine/routines/initlist.asm b/engine/routines/initlist.asm deleted file mode 100644 index 26c77b5bb..000000000 --- a/engine/routines/initlist.asm +++ /dev/null @@ -1,54 +0,0 @@ -InitList: ; 50db9 - ld a, [wInitListType] - - cp INIT_ENEMYOT_LIST - jr nz, .check_party_ot_name - ld hl, wOTPartyCount - ld de, wOTPartyMonOT - ld a, ENEMY_OT_NAME - jr .done - -.check_party_ot_name - cp INIT_PLAYEROT_LIST - jr nz, .check_mon_name - ld hl, wPartyCount - ld de, wPartyMonOT - ld a, PARTY_OT_NAME - jr .done - -.check_mon_name - cp INIT_MON_LIST - jr nz, .check_item_name - ld hl, wCurMart - ld de, PokemonNames - ld a, MON_NAME - jr .done - -.check_item_name - cp INIT_BAG_ITEM_LIST - jr nz, .check_ob_item_name - ld hl, wNumItems - ld de, ItemNames - ld a, ITEM_NAME - jr .done - -.check_ob_item_name - ld hl, wCurMart - ld de, ItemNames - ld a, ITEM_NAME -.done - ld [wNamedObjectTypeBuffer], a - ld a, l - ld [wListPointer], a - ld a, h - ld [wListPointer + 1], a - ld a, e - ld [wUnusedD102], a - ld a, d - ld [wUnusedD102 + 1], a - ld bc, ItemAttributes - ld a, c - ld [wItemAttributesPtr], a - ld a, b - ld [wItemAttributesPtr + 1], a - ret diff --git a/engine/routines/math.asm b/engine/routines/math.asm deleted file mode 100755 index 0cd6b0b47..000000000 --- a/engine/routines/math.asm +++ /dev/null @@ -1,196 +0,0 @@ -_Multiply:: ; 66de - -; hMultiplier is one byte. - ld a, 8 - ld b, a - - xor a - ld [hProduct], a - ld [hMathBuffer + 1], a - ld [hMathBuffer + 2], a - ld [hMathBuffer + 3], a - ld [hMathBuffer + 4], a - - -.loop - ld a, [hMultiplier] - srl a - ld [hMultiplier], a - jr nc, .next - - ld a, [hMathBuffer + 4] - ld c, a - ld a, [hMultiplicand + 2] - add c - ld [hMathBuffer + 4], a - - ld a, [hMathBuffer + 3] - ld c, a - ld a, [hMultiplicand + 1] - adc c - ld [hMathBuffer + 3], a - - ld a, [hMathBuffer + 2] - ld c, a - ld a, [hMultiplicand + 0] - adc c - ld [hMathBuffer + 2], a - - ld a, [hMathBuffer + 1] - ld c, a - ld a, [hProduct] - adc c - ld [hMathBuffer + 1], a - -.next - dec b - jr z, .done - - -; hMultiplicand <<= 1 - - ld a, [hMultiplicand + 2] - add a - ld [hMultiplicand + 2], a - - ld a, [hMultiplicand + 1] - rla - ld [hMultiplicand + 1], a - - ld a, [hMultiplicand + 0] - rla - ld [hMultiplicand + 0], a - - ld a, [hProduct] - rla - ld [hProduct], a - - jr .loop - - -.done - ld a, [hMathBuffer + 4] - ld [hProduct + 3], a - - ld a, [hMathBuffer + 3] - ld [hProduct + 2], a - - ld a, [hMathBuffer + 2] - ld [hProduct + 1], a - - ld a, [hMathBuffer + 1] - ld [hProduct + 0], a - - ret -; 673e - - -_Divide:: ; 673e - xor a - ld [hMathBuffer + 0], a - ld [hMathBuffer + 1], a - ld [hMathBuffer + 2], a - ld [hMathBuffer + 3], a - ld [hMathBuffer + 4], a - - ld a, 9 - ld e, a - -.loop - ld a, [hMathBuffer + 0] - ld c, a - ld a, [hDividend + 1] - sub c - ld d, a - - ld a, [hDivisor] - ld c, a - ld a, [hDividend + 0] - sbc c - jr c, .next - - ld [hDividend + 0], a - - ld a, d - ld [hDividend + 1], a - - ld a, [hMathBuffer + 4] - inc a - ld [hMathBuffer + 4], a - - jr .loop - -.next - ld a, b - cp 1 - jr z, .done - - ld a, [hMathBuffer + 4] - add a - ld [hMathBuffer + 4], a - - ld a, [hMathBuffer + 3] - rla - ld [hMathBuffer + 3], a - - ld a, [hMathBuffer + 2] - rla - ld [hMathBuffer + 2], a - - ld a, [hMathBuffer + 1] - rla - ld [hMathBuffer + 1], a - - dec e - jr nz, .next2 - - ld e, 8 - ld a, [hMathBuffer + 0] - ld [hDivisor], a - xor a - ld [hMathBuffer + 0], a - - ld a, [hDividend + 1] - ld [hDividend + 0], a - - ld a, [hDividend + 2] - ld [hDividend + 1], a - - ld a, [hDividend + 3] - ld [hDividend + 2], a - -.next2 - ld a, e - cp 1 - jr nz, .okay - dec b - -.okay - ld a, [hDivisor] - srl a - ld [hDivisor], a - - ld a, [hMathBuffer + 0] - rr a - ld [hMathBuffer + 0], a - - jr .loop - -.done - ld a, [hDividend + 1] - ld [hDivisor], a - - ld a, [hMathBuffer + 4] - ld [hDividend + 3], a - - ld a, [hMathBuffer + 3] - ld [hDividend + 2], a - - ld a, [hMathBuffer + 2] - ld [hDividend + 1], a - - ld a, [hMathBuffer + 1] - ld [hDividend + 0], a - - ret -; 67c1 diff --git a/engine/routines/predef.asm b/engine/routines/predef.asm deleted file mode 100644 index 13c593c90..000000000 --- a/engine/routines/predef.asm +++ /dev/null @@ -1,29 +0,0 @@ -GetPredefPointer:: ; 854b -; Return the bank and address of wPredefID in a and wPredefAddress. - -; Save hl for later (back in Predef) - ld a, h - ld [wPredefTemp], a - ld a, l - ld [wPredefTemp + 1], a - - push de - ld a, [wPredefID] - ld e, a - ld d, 0 - ld hl, PredefPointers - add hl, de - add hl, de - add hl, de - pop de - - ld a, [hli] - ld [wPredefAddress + 1], a - ld a, [hli] - ld [wPredefAddress], a - ld a, [hl] - - ret -; 856b - -INCLUDE "data/predef_pointers.asm" diff --git a/engine/routines/printnum.asm b/engine/routines/printnum.asm deleted file mode 100755 index fec798d5c..000000000 --- a/engine/routines/printnum.asm +++ /dev/null @@ -1,300 +0,0 @@ -_PrintNum:: ; c4c7 -; Print c digits of the b-byte value from de to hl. -; Allows 2 to 7 digits. For 1-digit numbers, add -; the value to char "0" instead of calling PrintNum. -; Some extra flags can be given in bits 5-7 of b. -; Bit 5: money if set (unless left-aligned without leading zeros) -; Bit 6: right-aligned if set -; Bit 7: print leading zeros if set - - push bc - - bit 5, b - jr z, .main - bit 7, b - jr nz, .moneyflag - bit 6, b - jr z, .main - -.moneyflag ; 101xxxxx or 011xxxxx - ld a, "¥" - ld [hli], a - res 5, b ; 100xxxxx or 010xxxxx - -.main - xor a - ld [hPrintNum1], a - ld [hPrintNum2], a - ld [hPrintNum3], a - ld a, b - and $f - cp 1 - jr z, .byte - cp 2 - jr z, .word -; maximum 3 bytes -.long - ld a, [de] - ld [hPrintNum2], a - inc de - ld a, [de] - ld [hPrintNum3], a - inc de - ld a, [de] - ld [hPrintNum4], a - jr .start - -.word - ld a, [de] - ld [hPrintNum3], a - inc de - ld a, [de] - ld [hPrintNum4], a - jr .start - -.byte - ld a, [de] - ld [hPrintNum4], a - -.start - push de - - ld d, b - ld a, c - swap a - and $f - ld e, a - ld a, c - and $f - ld b, a - ld c, 0 - cp 2 - jr z, .two - cp 3 - jr z, .three - cp 4 - jr z, .four - cp 5 - jr z, .five - cp 6 - jr z, .six - -.seven - ld a, HIGH(1000000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(1000000) ; mid - ld [hPrintNum6], a - ld a, LOW(1000000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.six - ld a, HIGH(100000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(100000) ; mid - ld [hPrintNum6], a - ld a, LOW(100000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.five - xor a ; HIGH(10000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(10000) ; mid - ld [hPrintNum6], a - ld a, LOW(10000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.four - xor a ; HIGH(1000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(1000) ; mid - ld [hPrintNum6], a - ld a, LOW(1000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.three - xor a ; HIGH(100 >> 8) - ld [hPrintNum5], a - xor a ; HIGH(100) ; mid - ld [hPrintNum6], a - ld a, LOW(100) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.two - dec e - jr nz, .two_skip - ld a, "0" - ld [hPrintNum1], a -.two_skip - - ld c, 0 - ld a, [hPrintNum4] -.mod_10 - cp 10 - jr c, .modded_10 - sub 10 - inc c - jr .mod_10 -.modded_10 - - ld b, a - ld a, [hPrintNum1] - or c - jr nz, .money - call .PrintLeadingZero - jr .money_leading_zero - -.money - call .PrintYen - push af - ld a, "0" - add c - ld [hl], a - pop af - ld [hPrintNum1], a - inc e - dec e - jr nz, .money_leading_zero - inc hl - ld [hl], "" - -.money_leading_zero - call .AdvancePointer - call .PrintYen - ld a, "0" - add b - ld [hli], a - - pop de - pop bc - ret - -.PrintYen: ; c5ba - push af - ld a, [hPrintNum1] - and a - jr nz, .stop - bit 5, d - jr z, .stop - ld a, "¥" - ld [hli], a - res 5, d - -.stop - pop af - ret - -.PrintDigit: ; c5cb (3:45cb) - dec e - jr nz, .ok - ld a, "0" - ld [hPrintNum1], a -.ok - ld c, 0 -.loop - ld a, [hPrintNum5] - ld b, a - ld a, [hPrintNum2] - ld [hPrintNum8], a - cp b - jr c, .skip1 - sub b - ld [hPrintNum2], a - ld a, [hPrintNum6] - ld b, a - ld a, [hPrintNum3] - ld [hPrintNum9], a - cp b - jr nc, .skip2 - ld a, [hPrintNum2] - or 0 - jr z, .skip3 - dec a - ld [hPrintNum2], a - ld a, [hPrintNum3] -.skip2 - sub b - ld [hPrintNum3], a - ld a, [hPrintNum7] - ld b, a - ld a, [hPrintNum4] - ld [hPrintNum10], a - cp b - jr nc, .skip4 - ld a, [hPrintNum3] - and a - jr nz, .skip5 - ld a, [hPrintNum2] - and a - jr z, .skip6 - dec a - ld [hPrintNum2], a - xor a -.skip5 - dec a - ld [hPrintNum3], a - ld a, [hPrintNum4] -.skip4 - sub b - ld [hPrintNum4], a - inc c - jr .loop -.skip6 - ld a, [hPrintNum9] - ld [hPrintNum3], a -.skip3 - ld a, [hPrintNum8] - ld [hPrintNum2], a -.skip1 - ld a, [hPrintNum1] - or c - jr z, .PrintLeadingZero - ld a, [hPrintNum1] - and a - jr nz, .done - bit 5, d - jr z, .done - ld a, "¥" - ld [hli], a - res 5, d -.done - ld a, "0" - add c - ld [hl], a - ld [hPrintNum1], a - inc e - dec e - ret nz - inc hl - ld [hl], "" - ret - -.PrintLeadingZero: ; c644 -; prints a leading zero unless they are turned off in the flags - bit 7, d ; print leading zeroes? - ret z - ld [hl], "0" - ret - -.AdvancePointer: ; c64a -; increments the pointer unless leading zeroes are not being printed, -; the number is left-aligned, and no nonzero digits have been printed yet - bit 7, d ; print leading zeroes? - jr nz, .inc - bit 6, d ; left alignment or right alignment? - jr z, .inc - ld a, [hPrintNum1] - and a - ret z -.inc - inc hl - ret diff --git a/engine/routines/sine.asm b/engine/routines/sine.asm deleted file mode 100755 index 23e86c015..000000000 --- a/engine/routines/sine.asm +++ /dev/null @@ -1,4 +0,0 @@ -_Sine:: ; 84d9 -; a = d * sin(e * pi/32) - ld a, e - calc_sine_wave diff --git a/engine/routines/unreferenced_getgen1trainerclassname.asm b/engine/routines/unreferenced_getgen1trainerclassname.asm deleted file mode 100644 index da8e98b61..000000000 --- a/engine/routines/unreferenced_getgen1trainerclassname.asm +++ /dev/null @@ -1,21 +0,0 @@ -Unreferenced_GetGen1TrainerClassName: ; 50a28 - ld hl, Gen1TrainerClassNames - ld a, [wTrainerClass] - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wStringBuffer1 -.copy - ld a, [hli] - ld [de], a - inc de - cp "@" - jr nz, .copy - ret - -INCLUDE "data/text/unused_gen1_trainer_names.asm" diff --git a/engine/rtc/clock_reset.asm b/engine/rtc/clock_reset.asm deleted file mode 100755 index c05129349..000000000 --- a/engine/rtc/clock_reset.asm +++ /dev/null @@ -1,254 +0,0 @@ - -ResetClock_GetWraparoundTime: ; 20000 (8:4000) - push hl - dec a - ld e, a - ld d, 0 - ld hl, .WrapAroundTimes -rept 4 - add hl, de -endr - ld e, [hl] - inc hl - ld d, [hl] - inc hl - ld b, [hl] - inc hl - ld c, [hl] - pop hl - ret -; 20015 (8:4015) - -.WrapAroundTimes: ; 20015 - dw wBuffer4 - db 7, 4 - - dw wBuffer5 - db 24, 12 - - dw wBuffer6 - db 60, 15 -; 20021 - -RestartClock: ; 20021 (8:4021) -; If we're here, we had an RTC overflow. - ld hl, .Text_ClockTimeMayBeWrong - call PrintText - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - call LoadStandardMenuHeader - call ClearTileMap - ld hl, .Text_SetWithControlPad - call PrintText - call .SetClock - call ExitMenu - pop bc - ld hl, wOptions - ld [hl], b - ld c, a - ret -; 20047 (8:4047) - -.Text_ClockTimeMayBeWrong: ; 0x20047 - ; The clock's time may be wrong. Please reset the time. - text_jump UnknownText_0x1c40e6 - db "@" -; 0x2004c - -.Text_SetWithControlPad: ; 0x2004c - ; Set with the Control Pad. Confirm: A Button Cancel: B Button - text_jump UnknownText_0x1c411c - db "@" -; 0x20051 - -.SetClock: ; 20051 (8:4051) - ld a, 1 - ld [wBuffer1], a ; which digit - ld [wBuffer2], a - ld a, 8 - ld [wBuffer3], a - call UpdateTime - call GetWeekday - ld [wBuffer4], a - ld a, [hHours] - ld [wBuffer5], a - ld a, [hMinutes] - ld [wBuffer6], a - -.loop - call .joy_loop - jr nc, .loop - and a - ret nz - call .PrintTime - ld hl, .Text_IsThisOK - call PrintText - call YesNoBox - jr c, .cancel - ld a, [wBuffer4] - ld [wStringBuffer2], a - ld a, [wBuffer5] - ld [wStringBuffer2 + 1], a - ld a, [wBuffer6] - ld [wStringBuffer2 + 2], a - xor a - ld [wStringBuffer2 + 3], a - call InitTime - call .PrintTime - ld hl, .Text_ClockReset - call PrintText - call WaitPressAorB_BlinkCursor - xor a - ret - -.cancel - ld a, $1 - ret -; 200b0 (8:40b0) - -.Text_IsThisOK: ; 0x200b0 - ; Is this OK? - text_jump UnknownText_0x1c415b - db "@" -; 0x200b5 - -.Text_ClockReset: ; 0x200b5 - ; The clock has been reset. - text_jump UnknownText_0x1c4168 - db "@" -; 0x200ba - -.joy_loop - call JoyTextDelay_ForcehJoyDown - ld c, a - push af - call .PrintTime - pop af - bit 0, a - jr nz, .press_A - bit 1, a - jr nz, .press_B - bit 6, a - jr nz, .pressed_up - bit 7, a - jr nz, .pressed_down - bit 5, a - jr nz, .pressed_left - bit 4, a - jr nz, .pressed_right - jr .joy_loop - -.press_A - ld a, $0 - scf - ret - -.press_B - ld a, $1 - scf - ret - -.pressed_up - ld a, [wBuffer1] - call ResetClock_GetWraparoundTime - ld a, [de] - inc a - ld [de], a - cp b - jr c, .done_scroll - ld a, $0 - ld [de], a - jr .done_scroll - -.pressed_down - ld a, [wBuffer1] - call ResetClock_GetWraparoundTime - ld a, [de] - dec a - ld [de], a - cp -1 - jr nz, .done_scroll - ld a, b - dec a - ld [de], a - jr .done_scroll - -.pressed_left - ld hl, wBuffer1 - dec [hl] - jr nz, .done_scroll - ld [hl], $3 - jr .done_scroll - -.pressed_right - ld hl, wBuffer1 - inc [hl] - ld a, [hl] - cp $4 - jr c, .done_scroll - ld [hl], $1 - -.done_scroll - xor a - ret - -.PrintTime: ; 2011f (8:411f) - hlcoord 0, 5 - ld b, 5 - ld c, 18 - call TextBox - decoord 1, 8 - ld a, [wBuffer4] - ld b, a - farcall PrintDayOfWeek - ld a, [wBuffer5] - ld b, a - ld a, [wBuffer6] - ld c, a - decoord 11, 8 - farcall PrintHoursMins - ld a, [wBuffer2] - lb de, " ", " " - call .PlaceChars - ld a, [wBuffer1] - lb de, "▲", "▼" - call .PlaceChars - ld a, [wBuffer1] - ld [wBuffer2], a - ret -; 20160 (8:4160) - -.unreferenced ; 20160 -; unused - ld a, [wBuffer3] - ld b, a - call Coord2Tile - ret -; 20168 - -.PlaceChars: ; 20168 (8:4168) - push de - call ResetClock_GetWraparoundTime - ld a, [wBuffer3] - dec a - ld b, a - call Coord2Tile - pop de - ld [hl], d - ld bc, 2 * SCREEN_WIDTH - add hl, bc - ld [hl], e - ret -; 2017c (8:417c) - -UnreferencedString_HourJP: ; 2017c -; unused - db "じ@" ; HR -; 2017e - -UnreferencedString_MinuteJP: ; 2017e -; unused - db "ふん@" ; MIN -; 20181 diff --git a/engine/rtc/delete_save_change_clock.asm b/engine/rtc/delete_save_change_clock.asm deleted file mode 100755 index 431dc6034..000000000 --- a/engine/rtc/delete_save_change_clock.asm +++ /dev/null @@ -1,296 +0,0 @@ -_ResetClock: ; 4d3b1 - farcall BlankScreen - ld b, SCGB_DIPLOMA - call GetSGBLayout - call LoadStandardFont - call LoadFontsExtra - ld de, MUSIC_MAIN_MENU - call PlayMusic - ld hl, .text_askreset - call PrintText - ld hl, .NoYes_MenuHeader - call CopyMenuHeader - call VerticalMenu - ret c - ld a, [wMenuCursorY] - cp $1 - ret z - call ClockResetPassword - jr c, .wrongpassword - ld a, BANK(sRTCStatusFlags) - call GetSRAMBank - ld a, $80 - ld [sRTCStatusFlags], a - call CloseSRAM - ld hl, .text_okay - call PrintText - ret - -.wrongpassword - ld hl, .text_wrong - call PrintText - ret - -.text_okay ; 0x4d3fe - ; Password OK. Select CONTINUE & reset settings. - text_jump UnknownText_0x1c55db - db "@" - -.text_wrong ; 0x4d403 - ; Wrong password! - text_jump UnknownText_0x1c560b - db "@" - -.text_askreset ; 0x4d408 - ; Reset the clock? - text_jump UnknownText_0x1c561c - db "@" - -.NoYes_MenuHeader: ; 0x4d40d - db 0 ; flags - menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .NoYes_MenuData - db 1 ; default option - -.NoYes_MenuData: ; 0x4d415 - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "NO@" - db "YES@" - -ClockResetPassword: ; 4d41e - call .CalculatePassword - push de - ld hl, wStringBuffer2 - ld bc, 5 - xor a - call ByteFill - ld a, $4 - ld [wStringBuffer2 + 5], a - ld hl, .pleaseenterpasswordtext - call PrintText -.loop - call .updateIDdisplay -.loop2 - call JoyTextDelay - ld a, [hJoyLast] - ld b, a - and A_BUTTON - jr nz, .confirm - ld a, b - and D_PAD - jr z, .loop2 - call .dpadinput - ld c, 3 - call DelayFrames - jr .loop - -.confirm - call .ConvertDecIDToBytes - pop de - ld a, e - cp l - jr nz, .nope - ld a, d - cp h - jr nz, .nope - and a - ret - -.nope - scf - ret - -.pleaseenterpasswordtext ; 0x4d463 - ; Please enter the password. - text_jump UnknownText_0x1c562e - db "@" - -.updateIDdisplay ; 4d468 - hlcoord 14, 15 - ld de, wStringBuffer2 - ld c, 5 -.loop3 - ld a, [de] - add "0" - ld [hli], a - inc de - dec c - jr nz, .loop3 - hlcoord 14, 16 - ld bc, 5 - ld a, " " - call ByteFill - hlcoord 14, 16 - ld a, [wStringBuffer2 + 5] - ld e, a - ld d, $0 - add hl, de - ld [hl], "▲" - ret - -.dpadinput ; 4d490 - ld a, b - and D_LEFT - jr nz, .left - ld a, b - and D_RIGHT - jr nz, .right - ld a, b - and D_UP - jr nz, .up - ld a, b - and D_DOWN - jr nz, .down - ret - -.left - ld a, [wStringBuffer2 + 5] - and a - ret z - dec a - ld [wStringBuffer2 + 5], a - ret - -.right - ld a, [wStringBuffer2 + 5] - cp $4 - ret z - inc a - ld [wStringBuffer2 + 5], a - ret - -.up - call .getcurrentdigit - ld a, [hl] - cp 9 - jr z, .wraparound_up - inc a - ld [hl], a - ret - -.wraparound_up - ld [hl], $0 - ret - -.down - call .getcurrentdigit - ld a, [hl] - and a - jr z, .wraparound_down - dec a - ld [hl], a - ret - -.wraparound_down - ld [hl], 9 - ret - -.getcurrentdigit ; 4d4d5 - ld a, [wStringBuffer2 + 5] - ld e, a - ld d, $0 - ld hl, wStringBuffer2 - add hl, de - ret - -.ConvertDecIDToBytes: ; 4d4e0 - ld hl, 0 - ld de, wStringBuffer2 + 4 - ld bc, 1 - call .ConvertToBytes - ld bc, 10 - call .ConvertToBytes - ld bc, 100 - call .ConvertToBytes - ld bc, 1000 - call .ConvertToBytes - ld bc, 10000 -.ConvertToBytes: ; 4d501 - ld a, [de] - dec de - push hl - ld hl, 0 - call AddNTimes - ld c, l - ld b, h - pop hl - add hl, bc - ret - -.CalculatePassword: ; 4d50f - ld a, BANK(sPlayerData) - call GetSRAMBank - ld de, 0 - ld hl, sPlayerData + (wPlayerID - wPlayerData) - ld c, $2 - call .ComponentFromNumber - ld hl, sPlayerData + (wPlayerName - wPlayerData) - ld c, NAME_LENGTH_JAPANESE - 1 - call .ComponentFromString - ld hl, sPlayerData + (wMoney - wPlayerData) - ld c, $3 - call .ComponentFromNumber - call CloseSRAM - ret - -.ComponentFromNumber: ; 4d533 - ld a, [hli] - add e - ld e, a - ld a, $0 - adc d - ld d, a - dec c - jr nz, .ComponentFromNumber - ret - -.ComponentFromString: ; 4d53e - ld a, [hli] - cp "@" - ret z - add e - ld e, a - ld a, $0 - adc d - ld d, a - dec c - jr nz, .ComponentFromString - ret - -_DeleteSaveData: ; 4d54c - farcall BlankScreen - ld b, SCGB_DIPLOMA - call GetSGBLayout - call LoadStandardFont - call LoadFontsExtra - ld de, MUSIC_MAIN_MENU - call PlayMusic - ld hl, .Text_ClearAllSaveData - call PrintText - ld hl, .NoYesMenuHeader - call CopyMenuHeader - call VerticalMenu - ret c - ld a, [wMenuCursorY] - cp $1 - ret z - farcall EmptyAllSRAMBanks - ret - -.Text_ClearAllSaveData: ; 0x4d580 - ; Clear all save data? - text_jump UnknownText_0x1c564a - db "@" - -.NoYesMenuHeader: ; 0x4d585 - db 0 ; flags - menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 - dw .MenuData - db 1 ; default option - -.MenuData: ; 0x4d58d - db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags - db 2 ; items - db "NO@" - db "YES@" diff --git a/engine/rtc/reset_password.asm b/engine/rtc/reset_password.asm new file mode 100755 index 000000000..fd5007ba7 --- /dev/null +++ b/engine/rtc/reset_password.asm @@ -0,0 +1,259 @@ +_ResetClock: ; 4d3b1 + farcall BlankScreen + ld b, SCGB_DIPLOMA + call GetSGBLayout + call LoadStandardFont + call LoadFontsExtra + ld de, MUSIC_MAIN_MENU + call PlayMusic + ld hl, .text_askreset + call PrintText + ld hl, .NoYes_MenuHeader + call CopyMenuHeader + call VerticalMenu + ret c + ld a, [wMenuCursorY] + cp $1 + ret z + call ClockResetPassword + jr c, .wrongpassword + ld a, BANK(sRTCStatusFlags) + call GetSRAMBank + ld a, $80 + ld [sRTCStatusFlags], a + call CloseSRAM + ld hl, .text_okay + call PrintText + ret + +.wrongpassword + ld hl, .text_wrong + call PrintText + ret + +.text_okay ; 0x4d3fe + ; Password OK. Select CONTINUE & reset settings. + text_jump UnknownText_0x1c55db + db "@" + +.text_wrong ; 0x4d403 + ; Wrong password! + text_jump UnknownText_0x1c560b + db "@" + +.text_askreset ; 0x4d408 + ; Reset the clock? + text_jump UnknownText_0x1c561c + db "@" + +.NoYes_MenuHeader: ; 0x4d40d + db 0 ; flags + menu_coords 14, 7, SCREEN_WIDTH - 1, TEXTBOX_Y - 1 + dw .NoYes_MenuData + db 1 ; default option + +.NoYes_MenuData: ; 0x4d415 + db STATICMENU_CURSOR | STATICMENU_NO_TOP_SPACING ; flags + db 2 ; items + db "NO@" + db "YES@" + +ClockResetPassword: ; 4d41e + call .CalculatePassword + push de + ld hl, wStringBuffer2 + ld bc, 5 + xor a + call ByteFill + ld a, $4 + ld [wStringBuffer2 + 5], a + ld hl, .pleaseenterpasswordtext + call PrintText +.loop + call .updateIDdisplay +.loop2 + call JoyTextDelay + ld a, [hJoyLast] + ld b, a + and A_BUTTON + jr nz, .confirm + ld a, b + and D_PAD + jr z, .loop2 + call .dpadinput + ld c, 3 + call DelayFrames + jr .loop + +.confirm + call .ConvertDecIDToBytes + pop de + ld a, e + cp l + jr nz, .nope + ld a, d + cp h + jr nz, .nope + and a + ret + +.nope + scf + ret + +.pleaseenterpasswordtext ; 0x4d463 + ; Please enter the password. + text_jump UnknownText_0x1c562e + db "@" + +.updateIDdisplay ; 4d468 + hlcoord 14, 15 + ld de, wStringBuffer2 + ld c, 5 +.loop3 + ld a, [de] + add "0" + ld [hli], a + inc de + dec c + jr nz, .loop3 + hlcoord 14, 16 + ld bc, 5 + ld a, " " + call ByteFill + hlcoord 14, 16 + ld a, [wStringBuffer2 + 5] + ld e, a + ld d, $0 + add hl, de + ld [hl], "▲" + ret + +.dpadinput ; 4d490 + ld a, b + and D_LEFT + jr nz, .left + ld a, b + and D_RIGHT + jr nz, .right + ld a, b + and D_UP + jr nz, .up + ld a, b + and D_DOWN + jr nz, .down + ret + +.left + ld a, [wStringBuffer2 + 5] + and a + ret z + dec a + ld [wStringBuffer2 + 5], a + ret + +.right + ld a, [wStringBuffer2 + 5] + cp $4 + ret z + inc a + ld [wStringBuffer2 + 5], a + ret + +.up + call .getcurrentdigit + ld a, [hl] + cp 9 + jr z, .wraparound_up + inc a + ld [hl], a + ret + +.wraparound_up + ld [hl], $0 + ret + +.down + call .getcurrentdigit + ld a, [hl] + and a + jr z, .wraparound_down + dec a + ld [hl], a + ret + +.wraparound_down + ld [hl], 9 + ret + +.getcurrentdigit ; 4d4d5 + ld a, [wStringBuffer2 + 5] + ld e, a + ld d, $0 + ld hl, wStringBuffer2 + add hl, de + ret + +.ConvertDecIDToBytes: ; 4d4e0 + ld hl, 0 + ld de, wStringBuffer2 + 4 + ld bc, 1 + call .ConvertToBytes + ld bc, 10 + call .ConvertToBytes + ld bc, 100 + call .ConvertToBytes + ld bc, 1000 + call .ConvertToBytes + ld bc, 10000 +.ConvertToBytes: ; 4d501 + ld a, [de] + dec de + push hl + ld hl, 0 + call AddNTimes + ld c, l + ld b, h + pop hl + add hl, bc + ret + +.CalculatePassword: ; 4d50f + ld a, BANK(sPlayerData) + call GetSRAMBank + ld de, 0 + ld hl, sPlayerData + (wPlayerID - wPlayerData) + ld c, $2 + call .ComponentFromNumber + ld hl, sPlayerData + (wPlayerName - wPlayerData) + ld c, NAME_LENGTH_JAPANESE - 1 + call .ComponentFromString + ld hl, sPlayerData + (wMoney - wPlayerData) + ld c, $3 + call .ComponentFromNumber + call CloseSRAM + ret + +.ComponentFromNumber: ; 4d533 + ld a, [hli] + add e + ld e, a + ld a, $0 + adc d + ld d, a + dec c + jr nz, .ComponentFromNumber + ret + +.ComponentFromString: ; 4d53e + ld a, [hli] + cp "@" + ret z + add e + ld e, a + ld a, $0 + adc d + ld d, a + dec c + jr nz, .ComponentFromString + ret diff --git a/engine/rtc/restart_clock.asm b/engine/rtc/restart_clock.asm new file mode 100755 index 000000000..5fbac80dd --- /dev/null +++ b/engine/rtc/restart_clock.asm @@ -0,0 +1,253 @@ +RestartClock_GetWraparoundTime: ; 20000 (8:4000) + push hl + dec a + ld e, a + ld d, 0 + ld hl, .WrapAroundTimes +rept 4 + add hl, de +endr + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld b, [hl] + inc hl + ld c, [hl] + pop hl + ret +; 20015 (8:4015) + +.WrapAroundTimes: ; 20015 + dw wBuffer4 + db 7, 4 + + dw wBuffer5 + db 24, 12 + + dw wBuffer6 + db 60, 15 +; 20021 + +RestartClock: ; 20021 (8:4021) +; If we're here, we had an RTC overflow. + ld hl, .Text_ClockTimeMayBeWrong + call PrintText + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call LoadStandardMenuHeader + call ClearTileMap + ld hl, .Text_SetWithControlPad + call PrintText + call .SetClock + call ExitMenu + pop bc + ld hl, wOptions + ld [hl], b + ld c, a + ret +; 20047 (8:4047) + +.Text_ClockTimeMayBeWrong: ; 0x20047 + ; The clock's time may be wrong. Please reset the time. + text_jump UnknownText_0x1c40e6 + db "@" +; 0x2004c + +.Text_SetWithControlPad: ; 0x2004c + ; Set with the Control Pad. Confirm: A Button Cancel: B Button + text_jump UnknownText_0x1c411c + db "@" +; 0x20051 + +.SetClock: ; 20051 (8:4051) + ld a, 1 + ld [wBuffer1], a ; which digit + ld [wBuffer2], a + ld a, 8 + ld [wBuffer3], a + call UpdateTime + call GetWeekday + ld [wBuffer4], a + ld a, [hHours] + ld [wBuffer5], a + ld a, [hMinutes] + ld [wBuffer6], a + +.loop + call .joy_loop + jr nc, .loop + and a + ret nz + call .PrintTime + ld hl, .Text_IsThisOK + call PrintText + call YesNoBox + jr c, .cancel + ld a, [wBuffer4] + ld [wStringBuffer2], a + ld a, [wBuffer5] + ld [wStringBuffer2 + 1], a + ld a, [wBuffer6] + ld [wStringBuffer2 + 2], a + xor a + ld [wStringBuffer2 + 3], a + call InitTime + call .PrintTime + ld hl, .Text_ClockReset + call PrintText + call WaitPressAorB_BlinkCursor + xor a + ret + +.cancel + ld a, $1 + ret +; 200b0 (8:40b0) + +.Text_IsThisOK: ; 0x200b0 + ; Is this OK? + text_jump UnknownText_0x1c415b + db "@" +; 0x200b5 + +.Text_ClockReset: ; 0x200b5 + ; The clock has been reset. + text_jump UnknownText_0x1c4168 + db "@" +; 0x200ba + +.joy_loop + call JoyTextDelay_ForcehJoyDown + ld c, a + push af + call .PrintTime + pop af + bit 0, a + jr nz, .press_A + bit 1, a + jr nz, .press_B + bit 6, a + jr nz, .pressed_up + bit 7, a + jr nz, .pressed_down + bit 5, a + jr nz, .pressed_left + bit 4, a + jr nz, .pressed_right + jr .joy_loop + +.press_A + ld a, $0 + scf + ret + +.press_B + ld a, $1 + scf + ret + +.pressed_up + ld a, [wBuffer1] + call RestartClock_GetWraparoundTime + ld a, [de] + inc a + ld [de], a + cp b + jr c, .done_scroll + ld a, $0 + ld [de], a + jr .done_scroll + +.pressed_down + ld a, [wBuffer1] + call RestartClock_GetWraparoundTime + ld a, [de] + dec a + ld [de], a + cp -1 + jr nz, .done_scroll + ld a, b + dec a + ld [de], a + jr .done_scroll + +.pressed_left + ld hl, wBuffer1 + dec [hl] + jr nz, .done_scroll + ld [hl], $3 + jr .done_scroll + +.pressed_right + ld hl, wBuffer1 + inc [hl] + ld a, [hl] + cp $4 + jr c, .done_scroll + ld [hl], $1 + +.done_scroll + xor a + ret + +.PrintTime: ; 2011f (8:411f) + hlcoord 0, 5 + ld b, 5 + ld c, 18 + call TextBox + decoord 1, 8 + ld a, [wBuffer4] + ld b, a + farcall PrintDayOfWeek + ld a, [wBuffer5] + ld b, a + ld a, [wBuffer6] + ld c, a + decoord 11, 8 + farcall PrintHoursMins + ld a, [wBuffer2] + lb de, " ", " " + call .PlaceChars + ld a, [wBuffer1] + lb de, "▲", "▼" + call .PlaceChars + ld a, [wBuffer1] + ld [wBuffer2], a + ret +; 20160 (8:4160) + +.unreferenced ; 20160 +; unused + ld a, [wBuffer3] + ld b, a + call Coord2Tile + ret +; 20168 + +.PlaceChars: ; 20168 (8:4168) + push de + call RestartClock_GetWraparoundTime + ld a, [wBuffer3] + dec a + ld b, a + call Coord2Tile + pop de + ld [hl], d + ld bc, 2 * SCREEN_WIDTH + add hl, bc + ld [hl], e + ret +; 2017c (8:417c) + +UnreferencedString_HourJP: ; 2017c +; unused + db "じ@" ; HR +; 2017e + +UnreferencedString_MinuteJP: ; 2017e +; unused + db "ふん@" ; MIN +; 20181 diff --git a/main.asm b/main.asm index 4980beee4..2420bd414 100644 --- a/main.asm +++ b/main.asm @@ -10,7 +10,7 @@ INCLUDE "engine/menus/intro_menu.asm" INCLUDE "engine/overworld/init_map.asm" INCLUDE "engine/pokemon/learn.asm" INCLUDE "engine/pokemon/checknickerrors.asm" -INCLUDE "engine/routines/math.asm" +INCLUDE "engine/math/math.asm" INCLUDE "data/items/attributes.asm" INCLUDE "engine/overworld/npc_movement.asm" INCLUDE "engine/events/happiness_egg.asm" @@ -20,8 +20,8 @@ INCLUDE "engine/events/specials_2.asm" SECTION "bank2", ROMX INCLUDE "engine/overworld/player_object.asm" -INCLUDE "engine/routines/sine.asm" -INCLUDE "engine/routines/predef.asm" +INCLUDE "engine/math/sine.asm" +INCLUDE "engine/predef.asm" INCLUDE "engine/gfx/color.asm" @@ -29,7 +29,7 @@ SECTION "bank3", ROMX INCLUDE "engine/events/checktime.asm" INCLUDE "engine/events/specials.asm" -INCLUDE "engine/routines/printnum.asm" +INCLUDE "engine/math/printnum.asm" INCLUDE "engine/pokemon/health.asm" INCLUDE "engine/events/overworld.asm" INCLUDE "engine/items/items.asm" @@ -65,7 +65,7 @@ INCLUDE "engine/events/bug_contest/judging.asm" INCLUDE "engine/events/pokerus/apply_pokerus_tick.asm" INCLUDE "engine/events/bug_contest/contest_2.asm" INCLUDE "engine/pokemon/correcterrorsinplayerparty.asm" -INCLUDE "engine/routines/getsquareroot.asm" +INCLUDE "engine/math/getsquareroot.asm" SECTION "bank5", ROMX @@ -95,7 +95,7 @@ INCLUDE "engine/tilesets/mapgroup_roofs.asm" SECTION "Clock Reset", ROMX -INCLUDE "engine/rtc/clock_reset.asm" +INCLUDE "engine/rtc/restart_clock.asm" SECTION "bank9", ROMX @@ -208,7 +208,7 @@ SECTION "bank13", ROMX INCLUDE "engine/tilesets/map_palettes.asm" INCLUDE "gfx/tileset_palette_maps.asm" INCLUDE "data/collision_permissions.asm" -INCLUDE "engine/routines/emptyallsrambanks.asm" +INCLUDE "engine/menus/emptyallsrambanks.asm" INCLUDE "engine/menus/savemenu_copytilemapatonce.asm" INCLUDE "engine/events/checksave.asm" INCLUDE "data/maps/scenes.asm" @@ -222,9 +222,10 @@ Shrink2Pic: ; 4d2d9 INCBIN "gfx/new_game/shrink2.2bpp.lz" INCLUDE "engine/link/link_2.asm" -INCLUDE "engine/rtc/delete_save_change_clock.asm" +INCLUDE "engine/rtc/reset_password.asm" +INCLUDE "engine/menus/delete_save.asm" INCLUDE "data/tilesets.asm" -INCLUDE "engine/routines/flagpredef.asm" +INCLUDE "engine/flagpredef.asm" INCLUDE "engine/gfx/trademonfrontpic.asm" INCLUDE "engine/events/pokerus/check_pokerus.asm" INCLUDE "engine/events/lucky_number.asm" @@ -253,9 +254,9 @@ INCLUDE "engine/events/basement_key.asm" INCLUDE "engine/events/sacred_ash.asm" INCLUDE "engine/pokemon/tempmon.asm" INCLUDE "engine/pokemon/types.asm" -INCLUDE "engine/routines/unreferenced_getgen1trainerclassname.asm" +INCLUDE "engine/battle/unreferenced_getgen1trainerclassname.asm" INCLUDE "engine/pokemon/mon_stats.asm" -INCLUDE "engine/routines/initlist.asm" +INCLUDE "engine/link/initlist.asm" INCLUDE "engine/pokemon/experience.asm" INCLUDE "engine/pokemon/switchpartymons.asm" INCLUDE "engine/gfx/load_pics.asm" -- cgit v1.2.3 From 05ba221eb53472d9c617d96a6aaed9c2e87e2ad7 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sun, 25 Mar 2018 19:14:26 +0200 Subject: =?UTF-8?q?`flagpredef.asm`=20=E2=86=92=20`smallflag.asm`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- engine/flagpredef.asm | 70 --------------------------------------------------- engine/smallflag.asm | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ main.asm | 2 +- 3 files changed, 71 insertions(+), 71 deletions(-) delete mode 100644 engine/flagpredef.asm create mode 100644 engine/smallflag.asm diff --git a/engine/flagpredef.asm b/engine/flagpredef.asm deleted file mode 100644 index 2a6d91ee1..000000000 --- a/engine/flagpredef.asm +++ /dev/null @@ -1,70 +0,0 @@ -SmallFarFlagAction: ; 4d7c1 -; Perform action b on bit c in flag array hl. -; If checking a flag, check flag array d:hl unless d is 0. - -; For longer flag arrays, see FlagAction. - - push hl - push bc - -; Divide by 8 to get the byte we want. - push bc - srl c - srl c - srl c - ld b, 0 - add hl, bc - pop bc - -; Which bit we want from the byte - ld a, c - and 7 - ld c, a - -; Shift left until we can mask the bit - ld a, 1 - jr z, .shifted -.shift - add a - dec c - jr nz, .shift -.shifted - ld c, a - -; What are we doing to this flag? - dec b - jr z, .set ; 1 - dec b - jr z, .check ; 2 - -.reset - ld a, c - cpl - and [hl] - ld [hl], a - jr .done - -.set - ld a, [hl] - or c - ld [hl], a - jr .done - -.check - ld a, d - cp 0 - jr nz, .farcheck - - ld a, [hl] - and c - jr .done - -.farcheck - call GetFarByte - and c - -.done - pop bc - pop hl - ld c, a - ret diff --git a/engine/smallflag.asm b/engine/smallflag.asm new file mode 100644 index 000000000..2a6d91ee1 --- /dev/null +++ b/engine/smallflag.asm @@ -0,0 +1,70 @@ +SmallFarFlagAction: ; 4d7c1 +; Perform action b on bit c in flag array hl. +; If checking a flag, check flag array d:hl unless d is 0. + +; For longer flag arrays, see FlagAction. + + push hl + push bc + +; Divide by 8 to get the byte we want. + push bc + srl c + srl c + srl c + ld b, 0 + add hl, bc + pop bc + +; Which bit we want from the byte + ld a, c + and 7 + ld c, a + +; Shift left until we can mask the bit + ld a, 1 + jr z, .shifted +.shift + add a + dec c + jr nz, .shift +.shifted + ld c, a + +; What are we doing to this flag? + dec b + jr z, .set ; 1 + dec b + jr z, .check ; 2 + +.reset + ld a, c + cpl + and [hl] + ld [hl], a + jr .done + +.set + ld a, [hl] + or c + ld [hl], a + jr .done + +.check + ld a, d + cp 0 + jr nz, .farcheck + + ld a, [hl] + and c + jr .done + +.farcheck + call GetFarByte + and c + +.done + pop bc + pop hl + ld c, a + ret diff --git a/main.asm b/main.asm index 2420bd414..82e00596b 100644 --- a/main.asm +++ b/main.asm @@ -225,7 +225,7 @@ INCLUDE "engine/link/link_2.asm" INCLUDE "engine/rtc/reset_password.asm" INCLUDE "engine/menus/delete_save.asm" INCLUDE "data/tilesets.asm" -INCLUDE "engine/flagpredef.asm" +INCLUDE "engine/smallflag.asm" INCLUDE "engine/gfx/trademonfrontpic.asm" INCLUDE "engine/events/pokerus/check_pokerus.asm" INCLUDE "engine/events/lucky_number.asm" -- cgit v1.2.3 From 91a768b24343ffabbe5ab4084451d1e3ecbc306b Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sun, 1 Apr 2018 17:01:51 +0200 Subject: Update file paths in constants/ and docs/ --- constants/audio_constants.asm | 2 +- constants/deco_constants.asm | 16 ++++++++-------- constants/engine_flags.asm | 2 +- constants/gfx_constants.asm | 2 +- constants/item_constants.asm | 2 +- constants/item_data_constants.asm | 6 +++--- constants/map_data_constants.asm | 2 +- constants/map_object_constants.asm | 8 ++++---- constants/map_setup_constants.asm | 2 +- constants/menu_constants.asm | 4 ++-- constants/radio_constants.asm | 10 +++++----- constants/scgb_constants.asm | 4 ++-- constants/script_constants.asm | 12 ++++++------ constants/sprite_anim_constants.asm | 2 +- constants/sprite_constants.asm | 2 +- constants/text_constants.asm | 2 +- docs/bugs_and_glitches.md | 32 ++++++++++++++++---------------- docs/design_flaws.md | 18 +++++++++--------- docs/event_commands.md | 2 +- docs/movement_commands.md | 2 +- 20 files changed, 66 insertions(+), 66 deletions(-) diff --git a/constants/audio_constants.asm b/constants/audio_constants.asm index 7aa0895a3..288caad91 100755 --- a/constants/audio_constants.asm +++ b/constants/audio_constants.asm @@ -17,7 +17,7 @@ const CC ; d (used for pitchoffset) ; channel -; ChannelPointers indexes (see engine/audio.asm) +; ChannelPointers indexes (see audio/engine.asm) const_def const CHAN1 ; 0 const CHAN2 ; 1 diff --git a/constants/deco_constants.asm b/constants/deco_constants.asm index 3b0230965..f385e7cd7 100644 --- a/constants/deco_constants.asm +++ b/constants/deco_constants.asm @@ -35,7 +35,7 @@ const_value = 1 const YELLOW_CARPET const GREEN_CARPET -; DoDecorationAction2.DecoActions indexes (see engine/decorations.asm) +; DoDecorationAction2.DecoActions indexes (see engine/overworld/decorations.asm) const_value = 1 const SET_UP_BED const PUT_AWAY_BED @@ -64,41 +64,41 @@ ENDM ; - DecorationIDs (see data/decorations/decorations.asm) const_value = 1 __enum__ = 0 -; FindOwnedBeds.beds values (see engine/decorations.asm) +; FindOwnedBeds.beds values (see engine/overworld/decorations.asm) const BEDS deco FEATHERY_BED deco PINK_BED deco POLKADOT_BED deco PIKACHU_BED -; FindOwnedCarpets.carpets values (see engine/decorations.asm) +; FindOwnedCarpets.carpets values (see engine/overworld/decorations.asm) const CARPETS deco RED_CARPET deco BLUE_CARPET deco YELLOW_CARPET deco GREEN_CARPET -; FindOwnedPlants.plants values (see engine/decorations.asm) +; FindOwnedPlants.plants values (see engine/overworld/decorations.asm) const PLANTS deco MAGNAPLANT deco TROPICPLANT deco JUMBOPLANT -; FindOwnedPosters.posters values (see engine/decorations.asm) +; FindOwnedPosters.posters values (see engine/overworld/decorations.asm) const POSTERS deco TOWN_MAP deco PIKACHU_POSTER deco CLEFAIRY_POSTER deco JIGGLYPUFF_POSTER -; FindOwnedConsoles.consoles values (see engine/decorations.asm) +; FindOwnedConsoles.consoles values (see engine/overworld/decorations.asm) const CONSOLES deco FAMICOM deco SNES deco N64 deco VIRTUAL_BOY -; FindOwnedBigDolls.big_dolls values (see engine/decorations.asm) +; FindOwnedBigDolls.big_dolls values (see engine/overworld/decorations.asm) const BIG_DOLLS deco BIG_SNORLAX_DOLL deco BIG_ONIX_DOLL deco BIG_LAPRAS_DOLL -; FindOwnedOrnaments.ornaments values (see engine/decorations.asm) +; FindOwnedOrnaments.ornaments values (see engine/overworld/decorations.asm) const DOLLS deco PIKACHU_DOLL deco SURF_PIKACHU_DOLL diff --git a/constants/engine_flags.asm b/constants/engine_flags.asm index 9b2eaaeaf..518edf806 100644 --- a/constants/engine_flags.asm +++ b/constants/engine_flags.asm @@ -1,4 +1,4 @@ -; EngineFlags indexes (see engine/engine_flasg.asm) +; EngineFlags indexes (see engine/engine_flags.asm) const_def ; wPokegearFlags const ENGINE_RADIO_CARD diff --git a/constants/gfx_constants.asm b/constants/gfx_constants.asm index d0f8b2b62..515045306 100644 --- a/constants/gfx_constants.asm +++ b/constants/gfx_constants.asm @@ -41,7 +41,7 @@ SPRITEOAMSTRUCT_LENGTH EQU const_value NUM_SPRITE_OAM_STRUCTS EQU 40 ; see wVirtualOAM -; PokeAnims indexes (see engine/pic_animation.asm) +; PokeAnims indexes (see engine/gfx/pic_animation.asm) const_def const ANIM_MON_SLOW const ANIM_MON_NORMAL diff --git a/constants/item_constants.asm b/constants/item_constants.asm index 426f28bd0..ec5f5f211 100644 --- a/constants/item_constants.asm +++ b/constants/item_constants.asm @@ -3,7 +3,7 @@ ; - ItemNames (see data/items/names.asm) ; - ItemDescriptions (see data/items/descriptions.asm) ; - ItemAttributes (see data/items/attributes.asm) -; - ItemEffects (see engine/item_effects.asm) +; - ItemEffects (see engine/items/item_effects.asm) const_def const NO_ITEM ; 00 const MASTER_BALL ; 01 diff --git a/constants/item_data_constants.asm b/constants/item_data_constants.asm index 1af3c47ac..055e24656 100644 --- a/constants/item_data_constants.asm +++ b/constants/item_data_constants.asm @@ -17,8 +17,8 @@ ITEMATTR_STRUCT_LENGTH EQU const_value const TM_HM ; 4 ; item menu types -; UseItem.dw indexes (see engine/pack.asm) -; UseRegisteredItem.SwitchTo indexes (see engine/select_menu.asm) +; UseItem.dw indexes (see engine/items/pack.asm) +; UseRegisteredItem.SwitchTo indexes (see engine/overworld/select_menu.asm) ITEMMENU_NOUSE EQU 0 ITEMMENU_CURRENT EQU 4 ITEMMENU_PARTY EQU 5 @@ -130,7 +130,7 @@ MAIL_STRUCT_LENGTH EQU $2f ; mailmsg struct const HELD_FOCUS_BAND -; mart types (see engine/mart.asm) +; mart types (see engine/items/mart.asm) const_def const MARTTYPE_STANDARD const MARTTYPE_BITTER diff --git a/constants/map_data_constants.asm b/constants/map_data_constants.asm index 0178e22b1..9a160a2fa 100644 --- a/constants/map_data_constants.asm +++ b/constants/map_data_constants.asm @@ -103,6 +103,6 @@ const_value = -1 NUM_SPAWNS EQU const_value -; outdoor sprite limits (see engine/overworld.asm) +; outdoor sprite limits (see engine/overworld/overworld.asm) MAX_OUTDOOR_SPRITES EQU 23 SPRITE_GFX_LIST_CAPACITY EQU $20 diff --git a/constants/map_object_constants.asm b/constants/map_object_constants.asm index b752b66e8..73685d4ec 100644 --- a/constants/map_object_constants.asm +++ b/constants/map_object_constants.asm @@ -121,7 +121,7 @@ MAPOBJECT_SCREEN_WIDTH EQU 12 NUM_SPRITEMOVEDATA EQU const_value SPRITEMOVEDATA_FIELDS EQU 6 -; MapObjectMovementPattern.Pointers indexes (see engine/map_objects.asm) +; MapObjectMovementPattern.Pointers indexes (see engine/overworld/map_objects.asm) const_def const SPRITEMOVEFN_00 ; 00 const SPRITEMOVEFN_RANDOM_WALK_Y ; 01 @@ -152,7 +152,7 @@ SPRITEMOVEDATA_FIELDS EQU 6 const SPRITEMOVEFN_BOULDERDUST ; 1a const SPRITEMOVEFN_GRASS ; 1b -; StepTypesJumptable indexes (see engine/map_objects.asm) +; StepTypesJumptable indexes (see engine/overworld/map_objects.asm) const_def const STEP_TYPE_00 ; 00 const STEP_TYPE_SLEEP ; 01 @@ -181,7 +181,7 @@ SPRITEMOVEDATA_FIELDS EQU 6 const STEP_TYPE_18 ; 18 const STEP_TYPE_SKYFALL_TOP ; 19 -; ObjectActionPairPointers indexes (see engine/map_object_action.asm) +; ObjectActionPairPointers indexes (see engine/overworld/map_object_action.asm) const_def const OBJECT_ACTION_00 ; 00 const OBJECT_ACTION_STAND ; 01 @@ -237,7 +237,7 @@ SPRITEMOVEDATA_FIELDS EQU 6 const FACING_GRASS_2 ; 1f -; DoPlayerMovement.DoStep arguments (see engine/player_movement.asm) +; DoPlayerMovement.DoStep arguments (see engine/overworld/player_movement.asm) const_def const STEP_SLOW ; 0 const STEP_WALK ; 1 diff --git a/constants/map_setup_constants.asm b/constants/map_setup_constants.asm index 9c6164169..426cbb298 100644 --- a/constants/map_setup_constants.asm +++ b/constants/map_setup_constants.asm @@ -14,7 +14,7 @@ const MAPSETUP_BADWARP ; fb const MAPSETUP_FLY ; fc -; MapSetupCommands indexes (see engine/map_setup.asm) +; MapSetupCommands indexes (see engine/overworld/map_setup.asm) ; Names taken from Condensation water's scripting compendium ; https://hax.iimarck.us/files/scriptingcodes_eng.htm const_def diff --git a/constants/menu_constants.asm b/constants/menu_constants.asm index f1ca20ae5..46c65474d 100644 --- a/constants/menu_constants.asm +++ b/constants/menu_constants.asm @@ -34,7 +34,7 @@ ; MonMenuOptions indexes (see data/mon_menu.asm) -; used by PokemonActionSubmenu (see engine/start_menu.asm) +; used by PokemonActionSubmenu (see engine/menus/start_menu.asm) const_def 1 ; moves const MONMENUITEM_CUT ; 1 @@ -83,7 +83,7 @@ HMENURETURN_ASM EQU %11111111 const PARTYMENUACTION_GIVE_MON_FEMALE ; unused const PARTYMENUACTION_GIVE_ITEM const PARTYMENUACTION_MOBILE ; mobile -; PrintPartyMenuActionText arguments (see engine/party_menu.asm) +; PrintPartyMenuActionText arguments (see engine/pokemon/party_menu.asm) const_def $f0 const PARTYMENUTEXT_HEAL_PSN const PARTYMENUTEXT_HEAL_BRN diff --git a/constants/radio_constants.asm b/constants/radio_constants.asm index 8903ef005..537b3289e 100644 --- a/constants/radio_constants.asm +++ b/constants/radio_constants.asm @@ -1,8 +1,8 @@ ; radio channel ids ; indexes for: ; - RadioChannelSongs (see data/radio/channel_music.asm) -; - PlayRadioShow/RadioJumptable (see engine/radio.asm) -; - RadioChannels (see engine/radio.asm) +; - PlayRadioShow/RadioJumptable (see engine/pokegear/radio.asm) +; - RadioChannels (see engine/pokegear/radio.asm) const_def const OAKS_POKEMON_TALK ; 00 const POKEDEX_SHOW ; 01 @@ -94,7 +94,7 @@ const POKEDEX_SHOW_7 ; 56 const POKEDEX_SHOW_8 ; 57 -; PlayRadio.StationPointers indexes (see engine/pokegear.asm) +; PlayRadio.StationPointers indexes (see engine/pokegear/pokegear.asm) const_def const MAPRADIO_POKEMON_CHANNEL const MAPRADIO_OAKS_POKEMON_TALK @@ -106,7 +106,7 @@ const MAPRADIO_LETS_ALL_SING const MAPRADIO_ROCKET -; These tables in engine/radio.asm are all sized to a power of 2 +; These tables in engine/pokegear/radio.asm are all sized to a power of 2 ; so there's no need for a rejection sampling loop NUM_OAKS_POKEMON_TALK_ADVERBS EQU 16 ; OaksPKMNTalk8.Adverbs NUM_OAKS_POKEMON_TALK_ADJECTIVES EQU 16 ; OaksPKMNTalk9.Adjectives @@ -117,7 +117,7 @@ NUM_PNP_PLACES_ADJECTIVES EQU 16 ; PeoplePlaces7.Adjectives NUM_PASSWORD_CATEGORIES EQU 11 NUM_PASSWORDS_PER_CATEGORY EQU 3 -; GetBuenasPassword.StringFunctionJumpTable indexes (see engine/radio.asm) +; GetBuenasPassword.StringFunctionJumpTable indexes (see engine/pokegear/radio.asm) const_def const BUENA_MON const BUENA_ITEM diff --git a/constants/scgb_constants.asm b/constants/scgb_constants.asm index e31a2139f..e7d987113 100755 --- a/constants/scgb_constants.asm +++ b/constants/scgb_constants.asm @@ -1,4 +1,4 @@ -; GetSGBLayout arguments (see engine/cgb_layouts.asm and engine/sgb_layouts.asm) +; GetSGBLayout arguments (see engine/gfx/cgb_layouts.asm and engine/gfx/sgb_layouts.asm) const_def const SCGB_BATTLE_GRAYSCALE const SCGB_BATTLE_COLORS @@ -36,7 +36,7 @@ SCGB_PARTY_MENU_HP_PALS EQU -4 SCGB_RAM EQU -1 ; PredefPals indexes (see gfx/sgb/predef.pal) -; GetPredefPal arguments (see engine/color.asm) +; GetPredefPal arguments (see engine/gfx/color.asm) const_def const PREDEFPAL_00 const PREDEFPAL_PALLET diff --git a/constants/script_constants.asm b/constants/script_constants.asm index dd086e6b3..e1feaaed9 100644 --- a/constants/script_constants.asm +++ b/constants/script_constants.asm @@ -38,7 +38,7 @@ NUM_MEM_BUFFERS EQU const_value ; writecode/checkcode arguments -; _GetVarAction.VarActionTable indexes (see engine/variables.asm) +; _GetVarAction.VarActionTable indexes (see engine/overworld/variables.asm) const_def const VAR_STRINGBUFFER2 ; 00 const VAR_PARTYCOUNT ; 01 @@ -75,7 +75,7 @@ RETVAR_ADDR_DE EQU (1 << 6) RETVAR_EXECUTE EQU (2 << 6) -; PlayerEventScriptPointers indexes (see engine/events.asm) +; PlayerEventScriptPointers indexes (see engine/overworld/events.asm) const_def -1 const PLAYEREVENT_MAPSCRIPT const PLAYEREVENT_NONE @@ -92,7 +92,7 @@ NUM_PLAYER_EVENTS EQU const_value ; bg_event types -; TryBGEvent arguments (see engine/events.asm) +; TryBGEvent arguments (see engine/overworld/events.asm) const_def const BGEVENT_READ const BGEVENT_UP @@ -105,7 +105,7 @@ NUM_PLAYER_EVENTS EQU const_value const BGEVENT_COPY ; object_event types -; TryObjectEvent arguments (see engine/events.asm) +; TryObjectEvent arguments (see engine/overworld/events.asm) const_def const OBJECTTYPE_SCRIPT const OBJECTTYPE_ITEMBALL @@ -203,7 +203,7 @@ EMOTE_MEM EQU -1 NUM_FRUIT_TREES EQU const_value + -1 ; describedecoration arguments -; DescribeDecoration.JumpTable indexes (see engine/decorations.asm) +; DescribeDecoration.JumpTable indexes (see engine/overworld/decorations.asm) const_def const DECODESC_POSTER ; 0 const DECODESC_LEFT_DOLL ; 1 @@ -259,7 +259,7 @@ NUM_FRUIT_TREES EQU const_value + -1 const HEALMACHINE_HALL_OF_FAME ; 2 ; UnownPuzzle writebyte arguments -; LoadUnownPuzzlePiecesGFX.LZPointers indexes (see engine/unown_puzzle.asm) +; LoadUnownPuzzlePiecesGFX.LZPointers indexes (see engine/games/unown_puzzle.asm) const_def const UNOWNPUZZLE_KABUTO ; 0 const UNOWNPUZZLE_OMANYTE ; 1 diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index 8be0f312a..0fbc4d849 100644 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -67,7 +67,7 @@ NUM_SPRITE_ANIM_STRUCTS EQU 10 ; see wSpriteAnimationStructs const SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY ; 2b const SPRITE_ANIM_INDEX_CELEBI ; 2c -; DoAnimFrame.Jumptable indexes (see engine/sprite_anims.asm) +; DoAnimFrame.Jumptable indexes (see engine/gfx/sprite_anims.asm) const_def const SPRITE_ANIM_SEQ_NULL ; 00 const SPRITE_ANIM_SEQ_PARTY_MON ; 01 diff --git a/constants/sprite_constants.asm b/constants/sprite_constants.asm index c23a3b246..0e63cce52 100644 --- a/constants/sprite_constants.asm +++ b/constants/sprite_constants.asm @@ -144,7 +144,7 @@ SPRITE_POKEMON EQU const_value const SPRITE_LUGIA ; a1 const SPRITE_HO_OH ; a2 -; special GetMonSprite values (see engine/overworld.asm) +; special GetMonSprite values (see engine/overworld/overworld.asm) const_def $e0 const SPRITE_DAY_CARE_MON_1 ; e0 const SPRITE_DAY_CARE_MON_2 ; e1 diff --git a/constants/text_constants.asm b/constants/text_constants.asm index a64039f64..5a9a35931 100644 --- a/constants/text_constants.asm +++ b/constants/text_constants.asm @@ -36,7 +36,7 @@ TEXTBOX_INNERY EQU TEXTBOX_Y + 2 const PRINTNUM_RIGHTALIGN_F ; 6 const PRINTNUM_LEADINGZEROS_F ; 7 -; PrintNum arguments (see engine/printnum.asm) +; PrintNum arguments (see engine/math/printnum.asm) PRINTNUM_MONEY EQU 1 << PRINTNUM_MONEY_F PRINTNUM_RIGHTALIGN EQU 1 << PRINTNUM_RIGHTALIGN_F PRINTNUM_LEADINGZEROS EQU 1 << PRINTNUM_LEADINGZEROS_F diff --git a/docs/bugs_and_glitches.md b/docs/bugs_and_glitches.md index 0212ed6fc..c24876873 100644 --- a/docs/bugs_and_glitches.md +++ b/docs/bugs_and_glitches.md @@ -490,7 +490,7 @@ This is a bug with `LongAnim_UpdateVariables` in [engine/battle/anim_hp_bar.asm] ([Video](https://www.youtube.com/watch?v=9KyNVIZxJvI)) -This is a bug with `ShortHPBar_CalcPixelFrame` in [engine/anim_hp_bar.asm](/engine/anim_hp_bar.asm): +This is a bug with `ShortHPBar_CalcPixelFrame` in [engine/battle/anim_hp_bar.asm](/engine/battle/anim_hp_bar.asm): ```asm ld b, 0 @@ -519,7 +519,7 @@ This is a bug with `ShortHPBar_CalcPixelFrame` in [engine/anim_hp_bar.asm](/engi This can bring Pokémon straight from level 1 to 100 by gaining just a few experience points. -This is a bug with `CalcExpAtLevel` in [engine/experience.asm](/engine/experience.asm): +This is a bug with `CalcExpAtLevel` in [engine/pokemon/experience.asm](/engine/pokemon/experience.asm): ```asm CalcExpAtLevel: ; 50e47 @@ -589,7 +589,7 @@ Text_StringBuffer2ExpPoints:: ## BRN/PSN/PAR do not affect catch rate -This is a bug with `PokeBallEffect` in [engine/item_effects.asm](/engine/item_effects.asm): +This is a bug with `PokeBallEffect` in [engine/items/item_effects.asm](/engine/items/item_effects.asm): ```asm ; This routine is buggy. It was intended that SLP and FRZ provide a higher @@ -923,7 +923,7 @@ This is a bug with `_HallOfFamePC.DisplayMonAndStrings` in [engine/events/hallof ([Video](https://www.youtube.com/watch?v=ojq3xqfRF6I)) -This is a bug with `Slots_PayoutAnim` in [engine/slot_machine.asm](/engine/slot_machine.asm): +This is a bug with `Slots_PayoutAnim` in [engine/games/slot_machine.asm](/engine/games/slot_machine.asm): ```asm .okay @@ -973,7 +973,7 @@ This is a bug with `PlayBattleMusic` in [engine/battle/start_battle.asm](/engine ## No bump noise if standing on tile `$3E` -This is a bug with `DoPlayerMovement.CheckWarp` in [engine/player_movement.asm](/engine/player_movement.asm): +This is a bug with `DoPlayerMovement.CheckWarp` in [engine/overworld/player_movement.asm](/engine/overworld/player_movement.asm): ```asm ; Bug: Since no case is made for STANDING here, it will check @@ -1108,7 +1108,7 @@ In [home/map.asm](/home/map.asm): This bug is why the Lapras in [maps/UnionCaveB2F.asm](/maps/UnionCaveB2F.asm), which uses `SPRITEMOVEDATA_SWIM_WANDER`, is not restricted by its `1, 1` movement radius. -In [engine/npc_movement.asm](/engine/npc_movement.asm): +In [engine/overworld/npc_movement.asm](/engine/overworld/npc_movement.asm): ```asm ld hl, OBJECT_FLAGS1 @@ -1126,7 +1126,7 @@ In [engine/npc_movement.asm](/engine/npc_movement.asm): This bug can allow you to talk to Eusine in Celadon City and encounter Ho-Oh with only traded legendary beasts. -In [engine/search.asm](/engine/search.asm): +In [engine/pokemon/search.asm](/engine/pokemon/search.asm): ```asm ; check OT @@ -1157,7 +1157,7 @@ endr This bug can affect Mew or Pokémon other than Ditto that used Transform via Mirror Move or Sketch. -This is a bug with `PokeBallEffect` in [engine/item_effects.asm](/engine/item_effects.asm): +This is a bug with `PokeBallEffect` in [engine/items/item_effects.asm](/engine/items/item_effects.asm): ```asm ld hl, wEnemySubStatus5 @@ -1229,7 +1229,7 @@ This is a bug with `PokeBallEffect` in [engine/item_effects.asm](/engine/item_ef ([Video](https://www.youtube.com/watch?v=v1ErZdLCIyU)) -This is a bug with `PokeBallEffect` in [engine/item_effects.asm](/engine/item_effects.asm): +This is a bug with `PokeBallEffect` in [engine/items/item_effects.asm](/engine/items/item_effects.asm): ```asm .room_in_party @@ -1254,7 +1254,7 @@ This is a bug with `PokeBallEffect` in [engine/item_effects.asm](/engine/item_ef ## `HELD_CATCH_CHANCE` has no effect -This is a bug with `PokeBallEffect` in [engine/item_effects.asm](/engine/item_effects.asm): +This is a bug with `PokeBallEffect` in [engine/items/item_effects.asm](/engine/items/item_effects.asm): ```asm ; BUG: farcall overwrites a, and GetItemHeldEffect takes b anyway. @@ -1281,7 +1281,7 @@ This is a bug with `PokeBallEffect` in [engine/item_effects.asm](/engine/item_ef ## Only the first three `EvosAttacks` evolution entries can have Stone compatibility reported correctly -This is a bug with `PlacePartyMonEvoStoneCompatibility.DetermineCompatibility` in [engine/party_menu.asm](/engine/party_menu.asm): +This is a bug with `PlacePartyMonEvoStoneCompatibility.DetermineCompatibility` in [engine/pokemon/party_menu.asm](/engine/pokemon/party_menu.asm): ```asm .DetermineCompatibility: ; 50268 @@ -1304,7 +1304,7 @@ This is a bug with `PlacePartyMonEvoStoneCompatibility.DetermineCompatibility` i ## `EVOLVE_STAT` can break Stone compatibility reporting -This is a bug with `PlacePartyMonEvoStoneCompatibility.DetermineCompatibility` in [engine/party_menu.asm](/engine/party_menu.asm): +This is a bug with `PlacePartyMonEvoStoneCompatibility.DetermineCompatibility` in [engine/pokemon/party_menu.asm](/engine/pokemon/party_menu.asm): ```asm .loop2 @@ -1337,7 +1337,7 @@ This is a bug with `PlacePartyMonEvoStoneCompatibility.DetermineCompatibility` i ## `ScriptCall` can overflow `wScriptStack` and crash -In [engine/scripting.asm](/engine/scripting.asm): +In [engine/overworld/scripting.asm](/engine/overworld/scripting.asm): ```asm ScriptCall: @@ -1377,7 +1377,7 @@ ScriptCall: ## `LoadSpriteGFX` does not limit the capacity of `UsedSprites` -In [engine/overworld.asm](/engine/overworld.asm): +In [engine/overworld/overworld.asm](/engine/overworld/overworld.asm): ```asm LoadSpriteGFX: ; 14306 @@ -1414,7 +1414,7 @@ LoadSpriteGFX: ; 14306 ## `ChooseWildEncounter` doesn't really validate the wild Pokémon species -In [engine/wildmons.asm](/engine/wildmons.asm): +In [engine/overworld/wildmons.asm](/engine/overworld/wildmons.asm): ```asm ChooseWildEncounter: ; 2a14f @@ -1452,7 +1452,7 @@ ValidateTempWildMonSpecies: ; 2a4a0 ## `TryObjectEvent` arbitrary code execution -In [engine/events.asm](/engine/events.asm): +In [engine/overworld/events.asm](/engine/overworld/events.asm): ```asm ; Bug: If IsInArray returns nc, data at bc will be executed as code. diff --git a/docs/design_flaws.md b/docs/design_flaws.md index 20b70cac1..e4a81123b 100644 --- a/docs/design_flaws.md +++ b/docs/design_flaws.md @@ -25,7 +25,7 @@ dba_pic: MACRO ; dbw bank, address ENDM ``` -The offset is translated into a correct bank by `FixPicBank` in [engine/load_pics.asm](/engine/load_pics.asm): +The offset is translated into a correct bank by `FixPicBank` in [engine/gfx/load_pics.asm](/engine/gfx/load_pics.asm): ```asm FixPicBank: ; 511c5 @@ -107,7 +107,7 @@ ROMX $49 "Pics 2" ``` -Two routines in [engine/load_pics.asm](/engine/load_pics.asm) make this assumption; `GetFrontpicPointer`: +Two routines in [engine/gfx/load_pics.asm](/engine/gfx/load_pics.asm) make this assumption; `GetFrontpicPointer`: ```asm ld a, [wCurPartySpecies] @@ -295,7 +295,7 @@ Modify `Pokedex_LoadAnyFootprint`: NUM_TMS = const_value - TM01 - 2 ; discount ITEM_C3 and ITEM_DC ``` -`GetTMHMNumber` and `GetNumberedTMHM` in [engine/items.asm](/engine/items.asm) have to compensate for this: +`GetTMHMNumber` and `GetNumberedTMHM` in [engine/items/items.asm](/engine/items/items.asm) have to compensate for this: ```asm GetTMHMNumber:: ; d407 @@ -338,7 +338,7 @@ GetNumberedTMHM: ; d417 Move `ITEM_C3` and `ITEM_DC` above all the TMs in every table of item data. -Modify engine/items.asm: +Modify engine/items/items.asm: ```asm GetTMHMNumber:: ; d407 @@ -399,7 +399,7 @@ GetDexEntryPointer: ; 44333 db BANK(PokedexEntries4) ``` -`GetPokedexEntryBank` in [engine/item_effects.asm](/engine/item_effects.asm): +`GetPokedexEntryBank` in [engine/items/item_effects.asm](/engine/items/item_effects.asm): ```asm GetPokedexEntryBank: @@ -425,7 +425,7 @@ GetPokedexEntryBank: db BANK(PokedexEntries4) ``` -And `PokedexShow_GetDexEntryBank` in [engine/radio.asm](/engine/radio.asm): +And `PokedexShow_GetDexEntryBank` in [engine/pokegear/radio.asm](/engine/pokegear/radio.asm): ```asm PokedexShow_GetDexEntryBank: @@ -457,7 +457,7 @@ PokedexShow_GetDexEntryBank: ## Identical sine wave code and data is repeated five times -`_Sine` in [engine/routines/sine.asm](/engine/routines/sine.asm): +`_Sine` in [engine/math/sine.asm](/engine/math/sine.asm): ```asm _Sine:: ; 84d9 @@ -466,7 +466,7 @@ _Sine:: ; 84d9 calc_sine_wave ``` -`Sprites_Cosine` and `Sprites_Sine` in [engine/sprites.asm](/engine/sprites.asm): +`Sprites_Cosine` and `Sprites_Sine` in [engine/gfx/sprites.asm](/engine/gfx/sprites.asm): ```asm Sprites_Cosine: ; 8e72a @@ -583,7 +583,7 @@ ENDM ## `GetForestTreeFrame` works, but it's still bad -In [engine/tileset_anims.asm](/engine/tileset_anims.asm): +In [engine/tilesets/tileset_anims.asm](/engine/tilesets/tileset_anims.asm): ```asm GetForestTreeFrame: ; fc54c diff --git a/docs/event_commands.md b/docs/event_commands.md index bb6d4def4..5eaf1d778 100644 --- a/docs/event_commands.md +++ b/docs/event_commands.md @@ -1,6 +1,6 @@ # Event Commands -Defined in [macros/scripts/events.asm](/macros/scripts/events.asm) and [engine/scripting.asm:ScriptCommandTable](/engine/scripting.asm). +Defined in [macros/scripts/events.asm](/macros/scripts/events.asm) and [engine/overworld/scripting.asm:ScriptCommandTable](/engine/overworld/scripting.asm). Until this document is filled out, the [G/S Scripting Compendium](https://hax.iimarckus.org/files/scriptingcodes_eng.htm) has descriptions for most of these commands. It was written for G/S binary hacking and not Crystal assembly hacking, so it's not 100% accurate for pokecrystal. diff --git a/docs/movement_commands.md b/docs/movement_commands.md index 10792c88b..794dd8a98 100644 --- a/docs/movement_commands.md +++ b/docs/movement_commands.md @@ -1,6 +1,6 @@ # Movement Commands -Defined in [macros/scripts/movement.asm](/macros/scripts/movement.asm) and [engine/movement.asm:MovementPointers](/engine/movement.asm). +Defined in [macros/scripts/movement.asm](/macros/scripts/movement.asm) and [engine/overworld/movement.asm:MovementPointers](/engine/overworld/movement.asm). ## `$00`−`$03`: turn_head direction -- cgit v1.2.3 From 81fff9bb80af3db0ee381c824261b8963e1cc221 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sun, 1 Apr 2018 17:03:11 +0200 Subject: Fix file permissions I have no idea why this was a thing (do people store this repo on FAT32 flash drives or something?), but quite a bit of files had a permission of 755. This isn't really a problem, but it's inconsistent and weird. --- constants/audio_constants.asm | 0 constants/battle_tower_constants.asm | 0 constants/cry_constants.asm | 0 constants/printer_constants.asm | 0 constants/scgb_constants.asm | 0 data/battle_anims/framesets.asm | 0 data/battle_anims/oam.asm | 0 data/battle_anims/object_gfx.asm | 0 data/battle_anims/objects.asm | 0 data/battle_tower/unknown.asm | 0 data/sprite_anims/framesets.asm | 0 data/sprites/map_objects.asm | 0 data/trainers/class_names.asm | 0 data/unused_53d84.asm | 0 engine/battle/ai/move.asm | 0 engine/battle/ai/redundant.asm | 0 engine/battle/ai/switch.asm | 0 engine/battle/anim_hp_bar.asm | 0 engine/battle/link_result.asm | 0 engine/battle/menu.asm | 0 engine/battle/move_effects/attract.asm | 0 engine/battle/move_effects/present.asm | 0 engine/battle/move_effects/transform.asm | 0 engine/battle/read_trainer_party.asm | 0 engine/battle/sliding_intro.asm | 0 engine/battle/trainer_huds.asm | 0 engine/battle/used_move_text.asm | 0 engine/battle_anims/core.asm | 0 engine/battle_anims/functions.asm | 0 engine/battle_anims/getpokeballwobble.asm | 0 engine/battle_anims/helpers.asm | 0 engine/events/basement_key.asm | 0 engine/events/battle_tower/battle_tower.asm | 0 engine/events/battle_tower/trainer_text.asm | 0 engine/events/bug_contest/contest_2.asm | 0 engine/events/bug_contest/judging.asm | 0 engine/events/card_key.asm | 0 engine/events/celebi.asm | 0 engine/events/daycare.asm | 0 engine/events/elevator.asm | 0 engine/events/field_moves.asm | 0 engine/events/forced_movement.asm | 0 engine/events/halloffame.asm | 0 engine/events/happiness_egg.asm | 0 engine/events/heal_machine_anim.asm | 0 engine/events/itemfinder.asm | 0 engine/events/magnet_train.asm | 0 engine/events/misc_scripts.asm | 0 engine/events/mom_phone.asm | 0 engine/events/money.asm | 0 engine/events/npc_trade.asm | 0 engine/events/overworld.asm | 0 engine/events/poisonstep.asm | 0 engine/events/pokecenter_pc.asm | 0 engine/events/pokepic.asm | 0 engine/events/print_photo.asm | 0 engine/events/prof_oaks_pc.asm | 0 engine/events/sacred_ash.asm | 0 engine/events/specials_2.asm | 0 engine/events/squirtbottle.asm | 0 engine/events/sweet_scent.asm | 0 engine/events/treemons.asm | 0 engine/events/whiteout.asm | 0 engine/games/card_flip.asm | 0 engine/games/dummy_game.asm | 0 engine/games/slot_machine.asm | 0 engine/games/unown_puzzle.asm | 0 engine/gfx/crystal_layouts.asm | 0 engine/gfx/dma_transfer.asm | 0 engine/gfx/load_pics.asm | 0 engine/gfx/mon_icons.asm | 0 engine/gfx/sprite_anims.asm | 0 engine/gfx/sprites.asm | 0 engine/items/buy_sell_toss.asm | 0 engine/items/items.asm | 0 engine/items/mart.asm | 0 engine/items/switch_items.asm | 0 engine/items/tmhm.asm | 0 engine/items/tmhm2.asm | 0 engine/link/link.asm | 0 engine/link/link_trade.asm | 0 engine/link/mystery_gift.asm | 0 engine/link/mystery_gift_2.asm | 0 engine/link/time_capsule.asm | 0 engine/math/math.asm | 0 engine/math/printnum.asm | 0 engine/math/sine.asm | 0 engine/menus/debug.asm | 0 engine/menus/init_gender.asm | 0 engine/menus/intro_menu.asm | 0 engine/menus/main_menu.asm | 0 engine/menus/menu.asm | 0 engine/menus/naming_screen.asm | 0 engine/menus/options_menu.asm | 0 engine/menus/scrolling_menu.asm | 0 engine/menus/start_menu.asm | 0 engine/menus/trainer_card.asm | 0 engine/movie/crystal_intro.asm | 0 engine/movie/evolution_animation.asm | 0 engine/movie/trade_animation.asm | 0 engine/overworld/decorations.asm | 0 engine/overworld/map_object_action.asm | 0 engine/overworld/npc_movement.asm | 0 engine/overworld/overworld.asm | 0 engine/overworld/player_movement.asm | 0 engine/overworld/player_object.asm | 0 engine/overworld/player_step.asm | 0 engine/overworld/select_menu.asm | 0 engine/overworld/tile_events.asm | 0 engine/overworld/time.asm | 0 engine/overworld/variables.asm | 0 engine/overworld/warp_connection.asm | 0 engine/overworld/wildmons.asm | 0 engine/pokedex/unown_dex.asm | 0 engine/pokegear/pokegear.asm | 0 engine/pokemon/billspc.asm | 0 engine/pokemon/billspctop.asm | 0 engine/pokemon/breeding.asm | 0 engine/pokemon/evolve.asm | 0 engine/pokemon/health.asm | 0 engine/pokemon/learn.asm | 0 engine/pokemon/mail.asm | 0 engine/pokemon/mail_2.asm | 0 engine/pokemon/mon_menu.asm | 0 engine/pokemon/move_mon.asm | 0 engine/pokemon/move_mon_wo_mail.asm | 0 engine/pokemon/search.asm | 0 engine/pokemon/search2.asm | 0 engine/pokemon/stats_screen.asm | 0 engine/printer/print_party.asm | 0 engine/printer/printer.asm | 0 engine/printer/printer_serial.asm | 0 engine/rtc/reset_password.asm | 0 engine/rtc/restart_clock.asm | 0 engine/rtc/rtc.asm | 0 engine/rtc/timeset.asm | 0 gfx/battle_anims/beam.png | Bin gfx/battle_anims/lightning.png | Bin gfx/battle_anims/misc.png | Bin gfx/battle_anims/noise.png | Bin gfx/battle_anims/objects.png | Bin gfx/battle_anims/poison.png | Bin gfx/battle_anims/pokeball.png | Bin gfx/battle_anims/rocks.png | Bin gfx/battle_anims/sand.png | Bin gfx/font.asm | 0 gfx/frames/space.png | Bin gfx/mail/cloud.png | Bin gfx/mail/dragonite.png | Bin gfx/mail/flower_mail_border.png | Bin gfx/mail/large_note.png | Bin gfx/mail/litebluemail_border.png | Bin gfx/mail/morph_mail_corner.png | Bin gfx/mail/surf_mail_border.png | Bin gfx/mobile/electro_ball_nonmatching.png | Bin gfx/mobile/mobile_splash.png | Bin gfx/splash/logo1.png | Bin gfx/splash/logo2.png | Bin gfx/trade/ball.png | Bin gfx/unknown/16c903.pal | 0 macros/wram.asm | 0 mobile/fixed_words.asm | 0 mobile/mobile_12.asm | 0 mobile/mobile_12_2.asm | 0 mobile/mobile_41.asm | 0 mobile/mobile_45_sprite_engine.asm | 0 mobile/mobile_46.asm | 0 mobile/mobile_5b.asm | 0 mobile/mobile_5c.asm | 0 mobile/mobile_menu.asm | 0 tools/toc.py | 0 171 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 constants/audio_constants.asm mode change 100755 => 100644 constants/battle_tower_constants.asm mode change 100755 => 100644 constants/cry_constants.asm mode change 100755 => 100644 constants/printer_constants.asm mode change 100755 => 100644 constants/scgb_constants.asm mode change 100755 => 100644 data/battle_anims/framesets.asm mode change 100755 => 100644 data/battle_anims/oam.asm mode change 100755 => 100644 data/battle_anims/object_gfx.asm mode change 100755 => 100644 data/battle_anims/objects.asm mode change 100755 => 100644 data/battle_tower/unknown.asm mode change 100755 => 100644 data/sprite_anims/framesets.asm mode change 100755 => 100644 data/sprites/map_objects.asm mode change 100755 => 100644 data/trainers/class_names.asm mode change 100755 => 100644 data/unused_53d84.asm mode change 100755 => 100644 engine/battle/ai/move.asm mode change 100755 => 100644 engine/battle/ai/redundant.asm mode change 100755 => 100644 engine/battle/ai/switch.asm mode change 100755 => 100644 engine/battle/anim_hp_bar.asm mode change 100755 => 100644 engine/battle/link_result.asm mode change 100755 => 100644 engine/battle/menu.asm mode change 100755 => 100644 engine/battle/move_effects/attract.asm mode change 100755 => 100644 engine/battle/move_effects/present.asm mode change 100755 => 100644 engine/battle/move_effects/transform.asm mode change 100755 => 100644 engine/battle/read_trainer_party.asm mode change 100755 => 100644 engine/battle/sliding_intro.asm mode change 100755 => 100644 engine/battle/trainer_huds.asm mode change 100755 => 100644 engine/battle/used_move_text.asm mode change 100755 => 100644 engine/battle_anims/core.asm mode change 100755 => 100644 engine/battle_anims/functions.asm mode change 100755 => 100644 engine/battle_anims/getpokeballwobble.asm mode change 100755 => 100644 engine/battle_anims/helpers.asm mode change 100755 => 100644 engine/events/basement_key.asm mode change 100755 => 100644 engine/events/battle_tower/battle_tower.asm mode change 100755 => 100644 engine/events/battle_tower/trainer_text.asm mode change 100755 => 100644 engine/events/bug_contest/contest_2.asm mode change 100755 => 100644 engine/events/bug_contest/judging.asm mode change 100755 => 100644 engine/events/card_key.asm mode change 100755 => 100644 engine/events/celebi.asm mode change 100755 => 100644 engine/events/daycare.asm mode change 100755 => 100644 engine/events/elevator.asm mode change 100755 => 100644 engine/events/field_moves.asm mode change 100755 => 100644 engine/events/forced_movement.asm mode change 100755 => 100644 engine/events/halloffame.asm mode change 100755 => 100644 engine/events/happiness_egg.asm mode change 100755 => 100644 engine/events/heal_machine_anim.asm mode change 100755 => 100644 engine/events/itemfinder.asm mode change 100755 => 100644 engine/events/magnet_train.asm mode change 100755 => 100644 engine/events/misc_scripts.asm mode change 100755 => 100644 engine/events/mom_phone.asm mode change 100755 => 100644 engine/events/money.asm mode change 100755 => 100644 engine/events/npc_trade.asm mode change 100755 => 100644 engine/events/overworld.asm mode change 100755 => 100644 engine/events/poisonstep.asm mode change 100755 => 100644 engine/events/pokecenter_pc.asm mode change 100755 => 100644 engine/events/pokepic.asm mode change 100755 => 100644 engine/events/print_photo.asm mode change 100755 => 100644 engine/events/prof_oaks_pc.asm mode change 100755 => 100644 engine/events/sacred_ash.asm mode change 100755 => 100644 engine/events/specials_2.asm mode change 100755 => 100644 engine/events/squirtbottle.asm mode change 100755 => 100644 engine/events/sweet_scent.asm mode change 100755 => 100644 engine/events/treemons.asm mode change 100755 => 100644 engine/events/whiteout.asm mode change 100755 => 100644 engine/games/card_flip.asm mode change 100755 => 100644 engine/games/dummy_game.asm mode change 100755 => 100644 engine/games/slot_machine.asm mode change 100755 => 100644 engine/games/unown_puzzle.asm mode change 100755 => 100644 engine/gfx/crystal_layouts.asm mode change 100755 => 100644 engine/gfx/dma_transfer.asm mode change 100755 => 100644 engine/gfx/load_pics.asm mode change 100755 => 100644 engine/gfx/mon_icons.asm mode change 100755 => 100644 engine/gfx/sprite_anims.asm mode change 100755 => 100644 engine/gfx/sprites.asm mode change 100755 => 100644 engine/items/buy_sell_toss.asm mode change 100755 => 100644 engine/items/items.asm mode change 100755 => 100644 engine/items/mart.asm mode change 100755 => 100644 engine/items/switch_items.asm mode change 100755 => 100644 engine/items/tmhm.asm mode change 100755 => 100644 engine/items/tmhm2.asm mode change 100755 => 100644 engine/link/link.asm mode change 100755 => 100644 engine/link/link_trade.asm mode change 100755 => 100644 engine/link/mystery_gift.asm mode change 100755 => 100644 engine/link/mystery_gift_2.asm mode change 100755 => 100644 engine/link/time_capsule.asm mode change 100755 => 100644 engine/math/math.asm mode change 100755 => 100644 engine/math/printnum.asm mode change 100755 => 100644 engine/math/sine.asm mode change 100755 => 100644 engine/menus/debug.asm mode change 100755 => 100644 engine/menus/init_gender.asm mode change 100755 => 100644 engine/menus/intro_menu.asm mode change 100755 => 100644 engine/menus/main_menu.asm mode change 100755 => 100644 engine/menus/menu.asm mode change 100755 => 100644 engine/menus/naming_screen.asm mode change 100755 => 100644 engine/menus/options_menu.asm mode change 100755 => 100644 engine/menus/scrolling_menu.asm mode change 100755 => 100644 engine/menus/start_menu.asm mode change 100755 => 100644 engine/menus/trainer_card.asm mode change 100755 => 100644 engine/movie/crystal_intro.asm mode change 100755 => 100644 engine/movie/evolution_animation.asm mode change 100755 => 100644 engine/movie/trade_animation.asm mode change 100755 => 100644 engine/overworld/decorations.asm mode change 100755 => 100644 engine/overworld/map_object_action.asm mode change 100755 => 100644 engine/overworld/npc_movement.asm mode change 100755 => 100644 engine/overworld/overworld.asm mode change 100755 => 100644 engine/overworld/player_movement.asm mode change 100755 => 100644 engine/overworld/player_object.asm mode change 100755 => 100644 engine/overworld/player_step.asm mode change 100755 => 100644 engine/overworld/select_menu.asm mode change 100755 => 100644 engine/overworld/tile_events.asm mode change 100755 => 100644 engine/overworld/time.asm mode change 100755 => 100644 engine/overworld/variables.asm mode change 100755 => 100644 engine/overworld/warp_connection.asm mode change 100755 => 100644 engine/overworld/wildmons.asm mode change 100755 => 100644 engine/pokedex/unown_dex.asm mode change 100755 => 100644 engine/pokegear/pokegear.asm mode change 100755 => 100644 engine/pokemon/billspc.asm mode change 100755 => 100644 engine/pokemon/billspctop.asm mode change 100755 => 100644 engine/pokemon/breeding.asm mode change 100755 => 100644 engine/pokemon/evolve.asm mode change 100755 => 100644 engine/pokemon/health.asm mode change 100755 => 100644 engine/pokemon/learn.asm mode change 100755 => 100644 engine/pokemon/mail.asm mode change 100755 => 100644 engine/pokemon/mail_2.asm mode change 100755 => 100644 engine/pokemon/mon_menu.asm mode change 100755 => 100644 engine/pokemon/move_mon.asm mode change 100755 => 100644 engine/pokemon/move_mon_wo_mail.asm mode change 100755 => 100644 engine/pokemon/search.asm mode change 100755 => 100644 engine/pokemon/search2.asm mode change 100755 => 100644 engine/pokemon/stats_screen.asm mode change 100755 => 100644 engine/printer/print_party.asm mode change 100755 => 100644 engine/printer/printer.asm mode change 100755 => 100644 engine/printer/printer_serial.asm mode change 100755 => 100644 engine/rtc/reset_password.asm mode change 100755 => 100644 engine/rtc/restart_clock.asm mode change 100755 => 100644 engine/rtc/rtc.asm mode change 100755 => 100644 engine/rtc/timeset.asm mode change 100755 => 100644 gfx/battle_anims/beam.png mode change 100755 => 100644 gfx/battle_anims/lightning.png mode change 100755 => 100644 gfx/battle_anims/misc.png mode change 100755 => 100644 gfx/battle_anims/noise.png mode change 100755 => 100644 gfx/battle_anims/objects.png mode change 100755 => 100644 gfx/battle_anims/poison.png mode change 100755 => 100644 gfx/battle_anims/pokeball.png mode change 100755 => 100644 gfx/battle_anims/rocks.png mode change 100755 => 100644 gfx/battle_anims/sand.png mode change 100755 => 100644 gfx/font.asm mode change 100755 => 100644 gfx/frames/space.png mode change 100755 => 100644 gfx/mail/cloud.png mode change 100755 => 100644 gfx/mail/dragonite.png mode change 100755 => 100644 gfx/mail/flower_mail_border.png mode change 100755 => 100644 gfx/mail/large_note.png mode change 100755 => 100644 gfx/mail/litebluemail_border.png mode change 100755 => 100644 gfx/mail/morph_mail_corner.png mode change 100755 => 100644 gfx/mail/surf_mail_border.png mode change 100755 => 100644 gfx/mobile/electro_ball_nonmatching.png mode change 100755 => 100644 gfx/mobile/mobile_splash.png mode change 100755 => 100644 gfx/splash/logo1.png mode change 100755 => 100644 gfx/splash/logo2.png mode change 100755 => 100644 gfx/trade/ball.png mode change 100755 => 100644 gfx/unknown/16c903.pal mode change 100755 => 100644 macros/wram.asm mode change 100755 => 100644 mobile/fixed_words.asm mode change 100755 => 100644 mobile/mobile_12.asm mode change 100755 => 100644 mobile/mobile_12_2.asm mode change 100755 => 100644 mobile/mobile_41.asm mode change 100755 => 100644 mobile/mobile_45_sprite_engine.asm mode change 100755 => 100644 mobile/mobile_46.asm mode change 100755 => 100644 mobile/mobile_5b.asm mode change 100755 => 100644 mobile/mobile_5c.asm mode change 100755 => 100644 mobile/mobile_menu.asm mode change 100644 => 100755 tools/toc.py diff --git a/constants/audio_constants.asm b/constants/audio_constants.asm old mode 100755 new mode 100644 diff --git a/constants/battle_tower_constants.asm b/constants/battle_tower_constants.asm old mode 100755 new mode 100644 diff --git a/constants/cry_constants.asm b/constants/cry_constants.asm old mode 100755 new mode 100644 diff --git a/constants/printer_constants.asm b/constants/printer_constants.asm old mode 100755 new mode 100644 diff --git a/constants/scgb_constants.asm b/constants/scgb_constants.asm old mode 100755 new mode 100644 diff --git a/data/battle_anims/framesets.asm b/data/battle_anims/framesets.asm old mode 100755 new mode 100644 diff --git a/data/battle_anims/oam.asm b/data/battle_anims/oam.asm old mode 100755 new mode 100644 diff --git a/data/battle_anims/object_gfx.asm b/data/battle_anims/object_gfx.asm old mode 100755 new mode 100644 diff --git a/data/battle_anims/objects.asm b/data/battle_anims/objects.asm old mode 100755 new mode 100644 diff --git a/data/battle_tower/unknown.asm b/data/battle_tower/unknown.asm old mode 100755 new mode 100644 diff --git a/data/sprite_anims/framesets.asm b/data/sprite_anims/framesets.asm old mode 100755 new mode 100644 diff --git a/data/sprites/map_objects.asm b/data/sprites/map_objects.asm old mode 100755 new mode 100644 diff --git a/data/trainers/class_names.asm b/data/trainers/class_names.asm old mode 100755 new mode 100644 diff --git a/data/unused_53d84.asm b/data/unused_53d84.asm old mode 100755 new mode 100644 diff --git a/engine/battle/ai/move.asm b/engine/battle/ai/move.asm old mode 100755 new mode 100644 diff --git a/engine/battle/ai/redundant.asm b/engine/battle/ai/redundant.asm old mode 100755 new mode 100644 diff --git a/engine/battle/ai/switch.asm b/engine/battle/ai/switch.asm old mode 100755 new mode 100644 diff --git a/engine/battle/anim_hp_bar.asm b/engine/battle/anim_hp_bar.asm old mode 100755 new mode 100644 diff --git a/engine/battle/link_result.asm b/engine/battle/link_result.asm old mode 100755 new mode 100644 diff --git a/engine/battle/menu.asm b/engine/battle/menu.asm old mode 100755 new mode 100644 diff --git a/engine/battle/move_effects/attract.asm b/engine/battle/move_effects/attract.asm old mode 100755 new mode 100644 diff --git a/engine/battle/move_effects/present.asm b/engine/battle/move_effects/present.asm old mode 100755 new mode 100644 diff --git a/engine/battle/move_effects/transform.asm b/engine/battle/move_effects/transform.asm old mode 100755 new mode 100644 diff --git a/engine/battle/read_trainer_party.asm b/engine/battle/read_trainer_party.asm old mode 100755 new mode 100644 diff --git a/engine/battle/sliding_intro.asm b/engine/battle/sliding_intro.asm old mode 100755 new mode 100644 diff --git a/engine/battle/trainer_huds.asm b/engine/battle/trainer_huds.asm old mode 100755 new mode 100644 diff --git a/engine/battle/used_move_text.asm b/engine/battle/used_move_text.asm old mode 100755 new mode 100644 diff --git a/engine/battle_anims/core.asm b/engine/battle_anims/core.asm old mode 100755 new mode 100644 diff --git a/engine/battle_anims/functions.asm b/engine/battle_anims/functions.asm old mode 100755 new mode 100644 diff --git a/engine/battle_anims/getpokeballwobble.asm b/engine/battle_anims/getpokeballwobble.asm old mode 100755 new mode 100644 diff --git a/engine/battle_anims/helpers.asm b/engine/battle_anims/helpers.asm old mode 100755 new mode 100644 diff --git a/engine/events/basement_key.asm b/engine/events/basement_key.asm old mode 100755 new mode 100644 diff --git a/engine/events/battle_tower/battle_tower.asm b/engine/events/battle_tower/battle_tower.asm old mode 100755 new mode 100644 diff --git a/engine/events/battle_tower/trainer_text.asm b/engine/events/battle_tower/trainer_text.asm old mode 100755 new mode 100644 diff --git a/engine/events/bug_contest/contest_2.asm b/engine/events/bug_contest/contest_2.asm old mode 100755 new mode 100644 diff --git a/engine/events/bug_contest/judging.asm b/engine/events/bug_contest/judging.asm old mode 100755 new mode 100644 diff --git a/engine/events/card_key.asm b/engine/events/card_key.asm old mode 100755 new mode 100644 diff --git a/engine/events/celebi.asm b/engine/events/celebi.asm old mode 100755 new mode 100644 diff --git a/engine/events/daycare.asm b/engine/events/daycare.asm old mode 100755 new mode 100644 diff --git a/engine/events/elevator.asm b/engine/events/elevator.asm old mode 100755 new mode 100644 diff --git a/engine/events/field_moves.asm b/engine/events/field_moves.asm old mode 100755 new mode 100644 diff --git a/engine/events/forced_movement.asm b/engine/events/forced_movement.asm old mode 100755 new mode 100644 diff --git a/engine/events/halloffame.asm b/engine/events/halloffame.asm old mode 100755 new mode 100644 diff --git a/engine/events/happiness_egg.asm b/engine/events/happiness_egg.asm old mode 100755 new mode 100644 diff --git a/engine/events/heal_machine_anim.asm b/engine/events/heal_machine_anim.asm old mode 100755 new mode 100644 diff --git a/engine/events/itemfinder.asm b/engine/events/itemfinder.asm old mode 100755 new mode 100644 diff --git a/engine/events/magnet_train.asm b/engine/events/magnet_train.asm old mode 100755 new mode 100644 diff --git a/engine/events/misc_scripts.asm b/engine/events/misc_scripts.asm old mode 100755 new mode 100644 diff --git a/engine/events/mom_phone.asm b/engine/events/mom_phone.asm old mode 100755 new mode 100644 diff --git a/engine/events/money.asm b/engine/events/money.asm old mode 100755 new mode 100644 diff --git a/engine/events/npc_trade.asm b/engine/events/npc_trade.asm old mode 100755 new mode 100644 diff --git a/engine/events/overworld.asm b/engine/events/overworld.asm old mode 100755 new mode 100644 diff --git a/engine/events/poisonstep.asm b/engine/events/poisonstep.asm old mode 100755 new mode 100644 diff --git a/engine/events/pokecenter_pc.asm b/engine/events/pokecenter_pc.asm old mode 100755 new mode 100644 diff --git a/engine/events/pokepic.asm b/engine/events/pokepic.asm old mode 100755 new mode 100644 diff --git a/engine/events/print_photo.asm b/engine/events/print_photo.asm old mode 100755 new mode 100644 diff --git a/engine/events/prof_oaks_pc.asm b/engine/events/prof_oaks_pc.asm old mode 100755 new mode 100644 diff --git a/engine/events/sacred_ash.asm b/engine/events/sacred_ash.asm old mode 100755 new mode 100644 diff --git a/engine/events/specials_2.asm b/engine/events/specials_2.asm old mode 100755 new mode 100644 diff --git a/engine/events/squirtbottle.asm b/engine/events/squirtbottle.asm old mode 100755 new mode 100644 diff --git a/engine/events/sweet_scent.asm b/engine/events/sweet_scent.asm old mode 100755 new mode 100644 diff --git a/engine/events/treemons.asm b/engine/events/treemons.asm old mode 100755 new mode 100644 diff --git a/engine/events/whiteout.asm b/engine/events/whiteout.asm old mode 100755 new mode 100644 diff --git a/engine/games/card_flip.asm b/engine/games/card_flip.asm old mode 100755 new mode 100644 diff --git a/engine/games/dummy_game.asm b/engine/games/dummy_game.asm old mode 100755 new mode 100644 diff --git a/engine/games/slot_machine.asm b/engine/games/slot_machine.asm old mode 100755 new mode 100644 diff --git a/engine/games/unown_puzzle.asm b/engine/games/unown_puzzle.asm old mode 100755 new mode 100644 diff --git a/engine/gfx/crystal_layouts.asm b/engine/gfx/crystal_layouts.asm old mode 100755 new mode 100644 diff --git a/engine/gfx/dma_transfer.asm b/engine/gfx/dma_transfer.asm old mode 100755 new mode 100644 diff --git a/engine/gfx/load_pics.asm b/engine/gfx/load_pics.asm old mode 100755 new mode 100644 diff --git a/engine/gfx/mon_icons.asm b/engine/gfx/mon_icons.asm old mode 100755 new mode 100644 diff --git a/engine/gfx/sprite_anims.asm b/engine/gfx/sprite_anims.asm old mode 100755 new mode 100644 diff --git a/engine/gfx/sprites.asm b/engine/gfx/sprites.asm old mode 100755 new mode 100644 diff --git a/engine/items/buy_sell_toss.asm b/engine/items/buy_sell_toss.asm old mode 100755 new mode 100644 diff --git a/engine/items/items.asm b/engine/items/items.asm old mode 100755 new mode 100644 diff --git a/engine/items/mart.asm b/engine/items/mart.asm old mode 100755 new mode 100644 diff --git a/engine/items/switch_items.asm b/engine/items/switch_items.asm old mode 100755 new mode 100644 diff --git a/engine/items/tmhm.asm b/engine/items/tmhm.asm old mode 100755 new mode 100644 diff --git a/engine/items/tmhm2.asm b/engine/items/tmhm2.asm old mode 100755 new mode 100644 diff --git a/engine/link/link.asm b/engine/link/link.asm old mode 100755 new mode 100644 diff --git a/engine/link/link_trade.asm b/engine/link/link_trade.asm old mode 100755 new mode 100644 diff --git a/engine/link/mystery_gift.asm b/engine/link/mystery_gift.asm old mode 100755 new mode 100644 diff --git a/engine/link/mystery_gift_2.asm b/engine/link/mystery_gift_2.asm old mode 100755 new mode 100644 diff --git a/engine/link/time_capsule.asm b/engine/link/time_capsule.asm old mode 100755 new mode 100644 diff --git a/engine/math/math.asm b/engine/math/math.asm old mode 100755 new mode 100644 diff --git a/engine/math/printnum.asm b/engine/math/printnum.asm old mode 100755 new mode 100644 diff --git a/engine/math/sine.asm b/engine/math/sine.asm old mode 100755 new mode 100644 diff --git a/engine/menus/debug.asm b/engine/menus/debug.asm old mode 100755 new mode 100644 diff --git a/engine/menus/init_gender.asm b/engine/menus/init_gender.asm old mode 100755 new mode 100644 diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm old mode 100755 new mode 100644 diff --git a/engine/menus/main_menu.asm b/engine/menus/main_menu.asm old mode 100755 new mode 100644 diff --git a/engine/menus/menu.asm b/engine/menus/menu.asm old mode 100755 new mode 100644 diff --git a/engine/menus/naming_screen.asm b/engine/menus/naming_screen.asm old mode 100755 new mode 100644 diff --git a/engine/menus/options_menu.asm b/engine/menus/options_menu.asm old mode 100755 new mode 100644 diff --git a/engine/menus/scrolling_menu.asm b/engine/menus/scrolling_menu.asm old mode 100755 new mode 100644 diff --git a/engine/menus/start_menu.asm b/engine/menus/start_menu.asm old mode 100755 new mode 100644 diff --git a/engine/menus/trainer_card.asm b/engine/menus/trainer_card.asm old mode 100755 new mode 100644 diff --git a/engine/movie/crystal_intro.asm b/engine/movie/crystal_intro.asm old mode 100755 new mode 100644 diff --git a/engine/movie/evolution_animation.asm b/engine/movie/evolution_animation.asm old mode 100755 new mode 100644 diff --git a/engine/movie/trade_animation.asm b/engine/movie/trade_animation.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/decorations.asm b/engine/overworld/decorations.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/map_object_action.asm b/engine/overworld/map_object_action.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/npc_movement.asm b/engine/overworld/npc_movement.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/overworld.asm b/engine/overworld/overworld.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/player_object.asm b/engine/overworld/player_object.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/player_step.asm b/engine/overworld/player_step.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/select_menu.asm b/engine/overworld/select_menu.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/tile_events.asm b/engine/overworld/tile_events.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/time.asm b/engine/overworld/time.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/variables.asm b/engine/overworld/variables.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/warp_connection.asm b/engine/overworld/warp_connection.asm old mode 100755 new mode 100644 diff --git a/engine/overworld/wildmons.asm b/engine/overworld/wildmons.asm old mode 100755 new mode 100644 diff --git a/engine/pokedex/unown_dex.asm b/engine/pokedex/unown_dex.asm old mode 100755 new mode 100644 diff --git a/engine/pokegear/pokegear.asm b/engine/pokegear/pokegear.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/billspc.asm b/engine/pokemon/billspc.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/billspctop.asm b/engine/pokemon/billspctop.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/breeding.asm b/engine/pokemon/breeding.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/evolve.asm b/engine/pokemon/evolve.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/health.asm b/engine/pokemon/health.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/learn.asm b/engine/pokemon/learn.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/mail.asm b/engine/pokemon/mail.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/mail_2.asm b/engine/pokemon/mail_2.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/mon_menu.asm b/engine/pokemon/mon_menu.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/move_mon.asm b/engine/pokemon/move_mon.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/move_mon_wo_mail.asm b/engine/pokemon/move_mon_wo_mail.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/search.asm b/engine/pokemon/search.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/search2.asm b/engine/pokemon/search2.asm old mode 100755 new mode 100644 diff --git a/engine/pokemon/stats_screen.asm b/engine/pokemon/stats_screen.asm old mode 100755 new mode 100644 diff --git a/engine/printer/print_party.asm b/engine/printer/print_party.asm old mode 100755 new mode 100644 diff --git a/engine/printer/printer.asm b/engine/printer/printer.asm old mode 100755 new mode 100644 diff --git a/engine/printer/printer_serial.asm b/engine/printer/printer_serial.asm old mode 100755 new mode 100644 diff --git a/engine/rtc/reset_password.asm b/engine/rtc/reset_password.asm old mode 100755 new mode 100644 diff --git a/engine/rtc/restart_clock.asm b/engine/rtc/restart_clock.asm old mode 100755 new mode 100644 diff --git a/engine/rtc/rtc.asm b/engine/rtc/rtc.asm old mode 100755 new mode 100644 diff --git a/engine/rtc/timeset.asm b/engine/rtc/timeset.asm old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/beam.png b/gfx/battle_anims/beam.png old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/lightning.png b/gfx/battle_anims/lightning.png old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/misc.png b/gfx/battle_anims/misc.png old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/noise.png b/gfx/battle_anims/noise.png old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/objects.png b/gfx/battle_anims/objects.png old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/poison.png b/gfx/battle_anims/poison.png old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/pokeball.png b/gfx/battle_anims/pokeball.png old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/rocks.png b/gfx/battle_anims/rocks.png old mode 100755 new mode 100644 diff --git a/gfx/battle_anims/sand.png b/gfx/battle_anims/sand.png old mode 100755 new mode 100644 diff --git a/gfx/font.asm b/gfx/font.asm old mode 100755 new mode 100644 diff --git a/gfx/frames/space.png b/gfx/frames/space.png old mode 100755 new mode 100644 diff --git a/gfx/mail/cloud.png b/gfx/mail/cloud.png old mode 100755 new mode 100644 diff --git a/gfx/mail/dragonite.png b/gfx/mail/dragonite.png old mode 100755 new mode 100644 diff --git a/gfx/mail/flower_mail_border.png b/gfx/mail/flower_mail_border.png old mode 100755 new mode 100644 diff --git a/gfx/mail/large_note.png b/gfx/mail/large_note.png old mode 100755 new mode 100644 diff --git a/gfx/mail/litebluemail_border.png b/gfx/mail/litebluemail_border.png old mode 100755 new mode 100644 diff --git a/gfx/mail/morph_mail_corner.png b/gfx/mail/morph_mail_corner.png old mode 100755 new mode 100644 diff --git a/gfx/mail/surf_mail_border.png b/gfx/mail/surf_mail_border.png old mode 100755 new mode 100644 diff --git a/gfx/mobile/electro_ball_nonmatching.png b/gfx/mobile/electro_ball_nonmatching.png old mode 100755 new mode 100644 diff --git a/gfx/mobile/mobile_splash.png b/gfx/mobile/mobile_splash.png old mode 100755 new mode 100644 diff --git a/gfx/splash/logo1.png b/gfx/splash/logo1.png old mode 100755 new mode 100644 diff --git a/gfx/splash/logo2.png b/gfx/splash/logo2.png old mode 100755 new mode 100644 diff --git a/gfx/trade/ball.png b/gfx/trade/ball.png old mode 100755 new mode 100644 diff --git a/gfx/unknown/16c903.pal b/gfx/unknown/16c903.pal old mode 100755 new mode 100644 diff --git a/macros/wram.asm b/macros/wram.asm old mode 100755 new mode 100644 diff --git a/mobile/fixed_words.asm b/mobile/fixed_words.asm old mode 100755 new mode 100644 diff --git a/mobile/mobile_12.asm b/mobile/mobile_12.asm old mode 100755 new mode 100644 diff --git a/mobile/mobile_12_2.asm b/mobile/mobile_12_2.asm old mode 100755 new mode 100644 diff --git a/mobile/mobile_41.asm b/mobile/mobile_41.asm old mode 100755 new mode 100644 diff --git a/mobile/mobile_45_sprite_engine.asm b/mobile/mobile_45_sprite_engine.asm old mode 100755 new mode 100644 diff --git a/mobile/mobile_46.asm b/mobile/mobile_46.asm old mode 100755 new mode 100644 diff --git a/mobile/mobile_5b.asm b/mobile/mobile_5b.asm old mode 100755 new mode 100644 diff --git a/mobile/mobile_5c.asm b/mobile/mobile_5c.asm old mode 100755 new mode 100644 diff --git a/mobile/mobile_menu.asm b/mobile/mobile_menu.asm old mode 100755 new mode 100644 diff --git a/tools/toc.py b/tools/toc.py old mode 100644 new mode 100755 -- cgit v1.2.3 From d3cc861d334c8b773c1b6c662ed9924c43cef009 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Wed, 4 Apr 2018 22:26:07 +0200 Subject: Fix snake_case filenames Renamed a bunch of files, most of them one-off functions, to better fit the general snake_case naming scheme. Also renamed some awfully long filenames. --- engine/battle/check_battle_scene.asm | 47 + engine/battle/checkbattlescene.asm | 47 - engine/battle/consume_held_item.asm | 57 + engine/battle/consumehelditem.asm | 57 - engine/battle/update_battle_huds.asm | 9 + engine/battle/updatebattlehuds.asm | 9 - engine/battle_anims/getpokeballwobble.asm | 62 - engine/battle_anims/pokeball_wobble.asm | 62 + engine/events/fishing_gfx.asm | 46 + engine/events/haircut.asm | 82 + engine/events/loadfishinggfx.asm | 46 - engine/events/play_slow_cry.asm | 31 + engine/events/playslowcry.asm | 31 - engine/events/shuckle.asm | 142 ++ engine/events/specials_2.asm | 225 --- engine/gfx/drawkrispackgfx.asm | 20 - engine/gfx/load_overworld_font.asm | 17 + engine/gfx/load_push_oam.asm | 21 + engine/gfx/loadoverworldfont.asm | 17 - engine/gfx/loadpushoam.asm | 21 - engine/gfx/place_graphic.asm | 55 + engine/gfx/placegraphic.asm | 55 - engine/gfx/trademon_frontpic.asm | 38 + engine/gfx/trademonfrontpic.asm | 38 - engine/items/pack_kris.asm | 20 + engine/items/print_item_description.asm | 31 + engine/items/printitemdescription.asm | 31 - engine/items/update_item_description.asm | 13 + engine/items/updateitemdescription.asm | 13 - engine/link/init_list.asm | 54 + engine/link/initlist.asm | 54 - engine/link/place_waiting_text.asm | 24 + engine/link/placewaitingtext.asm | 24 - engine/math/get_square_root.asm | 32 + engine/math/getsquareroot.asm | 32 - engine/math/print_num.asm | 300 +++ engine/math/printnum.asm | 300 --- engine/menus/empty_sram.asm | 19 + engine/menus/emptyallsrambanks.asm | 19 - engine/overworld/load_map_part.asm | 36 + engine/overworld/loadmappart.asm | 36 - engine/pokedex/new_pokedex_entry.asm | 52 + engine/pokedex/newpokedexentry.asm | 52 - engine/pokemon/bills_pc.asm | 2618 +++++++++++++++++++++++++ engine/pokemon/bills_pc_top.asm | 387 ++++ engine/pokemon/billspc.asm | 2618 ------------------------- engine/pokemon/billspctop.asm | 387 ---- engine/pokemon/breedmon_level_growth.asm | 27 + engine/pokemon/check_nick_errors.asm | 74 + engine/pokemon/checknickerrors.asm | 74 - engine/pokemon/correct_party_errors.asm | 229 +++ engine/pokemon/correcterrorsinplayerparty.asm | 229 --- engine/pokemon/getbreedmonlevelgrowth.asm | 27 - engine/pokemon/knows_move.asm | 25 + engine/pokemon/knowsmove.asm | 25 - engine/pokemon/level_up_happiness.asm | 20 + engine/pokemon/leveluphappinessmod.asm | 20 - engine/rtc/print_hours_mins.asm | 63 + engine/rtc/printhoursmins.asm | 63 - engine/tilesets/timeofday_pals.asm | 415 ++++ engine/tilesets/timeofdaypals.asm | 415 ---- main.asm | 61 +- 62 files changed, 5077 insertions(+), 5077 deletions(-) create mode 100644 engine/battle/check_battle_scene.asm delete mode 100644 engine/battle/checkbattlescene.asm create mode 100644 engine/battle/consume_held_item.asm delete mode 100644 engine/battle/consumehelditem.asm create mode 100644 engine/battle/update_battle_huds.asm delete mode 100644 engine/battle/updatebattlehuds.asm delete mode 100644 engine/battle_anims/getpokeballwobble.asm create mode 100644 engine/battle_anims/pokeball_wobble.asm create mode 100644 engine/events/fishing_gfx.asm create mode 100644 engine/events/haircut.asm delete mode 100644 engine/events/loadfishinggfx.asm create mode 100644 engine/events/play_slow_cry.asm delete mode 100644 engine/events/playslowcry.asm create mode 100644 engine/events/shuckle.asm delete mode 100644 engine/events/specials_2.asm delete mode 100644 engine/gfx/drawkrispackgfx.asm create mode 100644 engine/gfx/load_overworld_font.asm create mode 100644 engine/gfx/load_push_oam.asm delete mode 100644 engine/gfx/loadoverworldfont.asm delete mode 100644 engine/gfx/loadpushoam.asm create mode 100644 engine/gfx/place_graphic.asm delete mode 100644 engine/gfx/placegraphic.asm create mode 100644 engine/gfx/trademon_frontpic.asm delete mode 100644 engine/gfx/trademonfrontpic.asm create mode 100644 engine/items/pack_kris.asm create mode 100644 engine/items/print_item_description.asm delete mode 100644 engine/items/printitemdescription.asm create mode 100644 engine/items/update_item_description.asm delete mode 100644 engine/items/updateitemdescription.asm create mode 100644 engine/link/init_list.asm delete mode 100644 engine/link/initlist.asm create mode 100644 engine/link/place_waiting_text.asm delete mode 100644 engine/link/placewaitingtext.asm create mode 100644 engine/math/get_square_root.asm delete mode 100644 engine/math/getsquareroot.asm create mode 100644 engine/math/print_num.asm delete mode 100644 engine/math/printnum.asm create mode 100644 engine/menus/empty_sram.asm delete mode 100644 engine/menus/emptyallsrambanks.asm create mode 100644 engine/overworld/load_map_part.asm delete mode 100644 engine/overworld/loadmappart.asm create mode 100644 engine/pokedex/new_pokedex_entry.asm delete mode 100644 engine/pokedex/newpokedexentry.asm create mode 100644 engine/pokemon/bills_pc.asm create mode 100644 engine/pokemon/bills_pc_top.asm delete mode 100644 engine/pokemon/billspc.asm delete mode 100644 engine/pokemon/billspctop.asm create mode 100644 engine/pokemon/breedmon_level_growth.asm create mode 100644 engine/pokemon/check_nick_errors.asm delete mode 100644 engine/pokemon/checknickerrors.asm create mode 100644 engine/pokemon/correct_party_errors.asm delete mode 100644 engine/pokemon/correcterrorsinplayerparty.asm delete mode 100644 engine/pokemon/getbreedmonlevelgrowth.asm create mode 100644 engine/pokemon/knows_move.asm delete mode 100644 engine/pokemon/knowsmove.asm create mode 100644 engine/pokemon/level_up_happiness.asm delete mode 100644 engine/pokemon/leveluphappinessmod.asm create mode 100644 engine/rtc/print_hours_mins.asm delete mode 100644 engine/rtc/printhoursmins.asm create mode 100644 engine/tilesets/timeofday_pals.asm delete mode 100644 engine/tilesets/timeofdaypals.asm diff --git a/engine/battle/check_battle_scene.asm b/engine/battle/check_battle_scene.asm new file mode 100644 index 000000000..577c36e33 --- /dev/null +++ b/engine/battle/check_battle_scene.asm @@ -0,0 +1,47 @@ +CheckBattleScene: ; 4ea44 +; Return carry if battle scene is turned off. + + ld a, BANK(wLinkMode) + ld hl, wLinkMode + call GetFarWRAMByte + cp LINK_MOBILE + jr z, .mobile + + ld a, [wOptions] + bit BATTLE_SCENE, a + jr nz, .off + + and a + ret + +.mobile + ld a, [wcd2f] + and a + jr nz, .from_wram + + ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 + call GetSRAMBank + ld a, [$a60c] ; address of MBC30 bank + ld c, a + call CloseSRAM + + ld a, c + bit 0, c + jr z, .off + + and a + ret + +.from_wram + ld a, BANK(w5_dc00) + ld hl, w5_dc00 + call GetFarWRAMByte + bit 0, a + jr z, .off + + and a + ret + +.off + scf + ret diff --git a/engine/battle/checkbattlescene.asm b/engine/battle/checkbattlescene.asm deleted file mode 100644 index 577c36e33..000000000 --- a/engine/battle/checkbattlescene.asm +++ /dev/null @@ -1,47 +0,0 @@ -CheckBattleScene: ; 4ea44 -; Return carry if battle scene is turned off. - - ld a, BANK(wLinkMode) - ld hl, wLinkMode - call GetFarWRAMByte - cp LINK_MOBILE - jr z, .mobile - - ld a, [wOptions] - bit BATTLE_SCENE, a - jr nz, .off - - and a - ret - -.mobile - ld a, [wcd2f] - and a - jr nz, .from_wram - - ld a, 4 ; MBC30 bank used by JP Crystal; inaccessible by MBC3 - call GetSRAMBank - ld a, [$a60c] ; address of MBC30 bank - ld c, a - call CloseSRAM - - ld a, c - bit 0, c - jr z, .off - - and a - ret - -.from_wram - ld a, BANK(w5_dc00) - ld hl, w5_dc00 - call GetFarWRAMByte - bit 0, a - jr z, .off - - and a - ret - -.off - scf - ret diff --git a/engine/battle/consume_held_item.asm b/engine/battle/consume_held_item.asm new file mode 100644 index 000000000..d727a44e0 --- /dev/null +++ b/engine/battle/consume_held_item.asm @@ -0,0 +1,57 @@ +ConsumeHeldItem: ; 27192 + push hl + push de + push bc + ld a, [hBattleTurn] + and a + ld hl, wOTPartyMon1Item + ld de, wEnemyMonItem + ld a, [wCurOTMon] + jr z, .theirturn + ld hl, wPartyMon1Item + ld de, wBattleMonItem + ld a, [wCurBattleMon] + +.theirturn + push hl + push af + ld a, [de] + ld b, a + farcall GetItemHeldEffect + ld hl, ConsumableEffects +.loop + ld a, [hli] + cp b + jr z, .ok + inc a + jr nz, .loop + pop af + pop hl + pop bc + pop de + pop hl + ret + +.ok + xor a + ld [de], a + pop af + pop hl + call GetPartyLocation + ld a, [hBattleTurn] + and a + jr nz, .ourturn + ld a, [wBattleMode] + dec a + jr z, .done + +.ourturn + ld [hl], NO_ITEM + +.done + pop bc + pop de + pop hl + ret + +INCLUDE "data/battle/held_consumables.asm" diff --git a/engine/battle/consumehelditem.asm b/engine/battle/consumehelditem.asm deleted file mode 100644 index d727a44e0..000000000 --- a/engine/battle/consumehelditem.asm +++ /dev/null @@ -1,57 +0,0 @@ -ConsumeHeldItem: ; 27192 - push hl - push de - push bc - ld a, [hBattleTurn] - and a - ld hl, wOTPartyMon1Item - ld de, wEnemyMonItem - ld a, [wCurOTMon] - jr z, .theirturn - ld hl, wPartyMon1Item - ld de, wBattleMonItem - ld a, [wCurBattleMon] - -.theirturn - push hl - push af - ld a, [de] - ld b, a - farcall GetItemHeldEffect - ld hl, ConsumableEffects -.loop - ld a, [hli] - cp b - jr z, .ok - inc a - jr nz, .loop - pop af - pop hl - pop bc - pop de - pop hl - ret - -.ok - xor a - ld [de], a - pop af - pop hl - call GetPartyLocation - ld a, [hBattleTurn] - and a - jr nz, .ourturn - ld a, [wBattleMode] - dec a - jr z, .done - -.ourturn - ld [hl], NO_ITEM - -.done - pop bc - pop de - pop hl - ret - -INCLUDE "data/battle/held_consumables.asm" diff --git a/engine/battle/update_battle_huds.asm b/engine/battle/update_battle_huds.asm new file mode 100644 index 000000000..0c31f1c36 --- /dev/null +++ b/engine/battle/update_battle_huds.asm @@ -0,0 +1,9 @@ +_UpdateBattleHUDs: + farcall DrawPlayerHUD + ld hl, wPlayerHPPal + call SetHPPal + farcall DrawEnemyHUD + ld hl, wEnemyHPPal + call SetHPPal + farcall FinishBattleAnim + ret diff --git a/engine/battle/updatebattlehuds.asm b/engine/battle/updatebattlehuds.asm deleted file mode 100644 index 0c31f1c36..000000000 --- a/engine/battle/updatebattlehuds.asm +++ /dev/null @@ -1,9 +0,0 @@ -_UpdateBattleHUDs: - farcall DrawPlayerHUD - ld hl, wPlayerHPPal - call SetHPPal - farcall DrawEnemyHUD - ld hl, wEnemyHPPal - call SetHPPal - farcall FinishBattleAnim - ret diff --git a/engine/battle_anims/getpokeballwobble.asm b/engine/battle_anims/getpokeballwobble.asm deleted file mode 100644 index d85240f08..000000000 --- a/engine/battle_anims/getpokeballwobble.asm +++ /dev/null @@ -1,62 +0,0 @@ -GetPokeBallWobble: ; f971 (3:7971) -; Returns whether a Poke Ball will wobble in the catch animation. -; Whether a Pokemon is caught is determined beforehand. - - push de - - ld a, [rSVBK] - ld d, a - push de - - ld a, BANK(wBuffer2) - ld [rSVBK], a - - ld a, [wBuffer2] - inc a - ld [wBuffer2], a - -; Wobble up to 3 times. - cp 3 + 1 - jr z, .finished - - ld a, [wWildMon] - and a - ld c, 0 ; next - jr nz, .done - - ld hl, WobbleProbabilities - ld a, [wBuffer1] - ld b, a -.loop - ld a, [hli] - cp b - jr nc, .checkwobble - inc hl - jr .loop - -.checkwobble - ld b, [hl] - call Random - cp b - ld c, 0 ; next - jr c, .done - ld c, 2 ; escaped - jr .done - -.finished - ld a, [wWildMon] - and a - ld c, 1 ; caught - jr nz, .done - ld c, 2 ; escaped - -.done - pop de - ld e, a - ld a, d - ld [rSVBK], a - ld a, e - pop de - ret - -INCLUDE "data/battle/wobble_probabilities.asm" diff --git a/engine/battle_anims/pokeball_wobble.asm b/engine/battle_anims/pokeball_wobble.asm new file mode 100644 index 000000000..d85240f08 --- /dev/null +++ b/engine/battle_anims/pokeball_wobble.asm @@ -0,0 +1,62 @@ +GetPokeBallWobble: ; f971 (3:7971) +; Returns whether a Poke Ball will wobble in the catch animation. +; Whether a Pokemon is caught is determined beforehand. + + push de + + ld a, [rSVBK] + ld d, a + push de + + ld a, BANK(wBuffer2) + ld [rSVBK], a + + ld a, [wBuffer2] + inc a + ld [wBuffer2], a + +; Wobble up to 3 times. + cp 3 + 1 + jr z, .finished + + ld a, [wWildMon] + and a + ld c, 0 ; next + jr nz, .done + + ld hl, WobbleProbabilities + ld a, [wBuffer1] + ld b, a +.loop + ld a, [hli] + cp b + jr nc, .checkwobble + inc hl + jr .loop + +.checkwobble + ld b, [hl] + call Random + cp b + ld c, 0 ; next + jr c, .done + ld c, 2 ; escaped + jr .done + +.finished + ld a, [wWildMon] + and a + ld c, 1 ; caught + jr nz, .done + ld c, 2 ; escaped + +.done + pop de + ld e, a + ld a, d + ld [rSVBK], a + ld a, e + pop de + ret + +INCLUDE "data/battle/wobble_probabilities.asm" diff --git a/engine/events/fishing_gfx.asm b/engine/events/fishing_gfx.asm new file mode 100644 index 000000000..3d3ab0ba0 --- /dev/null +++ b/engine/events/fishing_gfx.asm @@ -0,0 +1,46 @@ +LoadFishingGFX: ; b84b3 + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + + ld de, FishingGFX + ld a, [wPlayerGender] + bit PLAYERGENDER_FEMALE_F, a + jr z, .got_gender + ld de, KrisFishingGFX +.got_gender + + ld hl, vTiles0 tile $02 + call .LoadGFX + ld hl, vTiles0 tile $06 + call .LoadGFX + ld hl, vTiles0 tile $0a + call .LoadGFX + ld hl, vTiles1 tile $7c + call .LoadGFX + + pop af + ld [rVBK], a + ret +; b84e3 + +.LoadGFX: ; b84e3 + lb bc, BANK(FishingGFX), 2 + push de + call Get2bpp + pop de + ld hl, 2 tiles + add hl, de + ld d, h + ld e, l + ret +; b84f2 + +FishingGFX: ; b84f2 +INCBIN "gfx/overworld/chris_fish.2bpp" +; b8582 + +KrisFishingGFX: ; b8582 +INCBIN "gfx/overworld/kris_fish.2bpp" +; b8612 diff --git a/engine/events/haircut.asm b/engine/events/haircut.asm new file mode 100644 index 000000000..0e4400235 --- /dev/null +++ b/engine/events/haircut.asm @@ -0,0 +1,82 @@ +BillsGrandfather: ; 73f7 + farcall SelectMonFromParty + jr c, .cancel + ld a, [wCurPartySpecies] + ld [wScriptVar], a + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + jp CopyPokemonName_Buffer1_Buffer3 + +.cancel + xor a + ld [wScriptVar], a + ret + +YoungerHaircutBrother: ; 7413 + ld hl, HappinessData_YoungerHaircutBrother + jr HaircutOrGrooming + +OlderHaircutBrother: ; 7418 + ld hl, HappinessData_OlderHaircutBrother + jr HaircutOrGrooming + +DaisysGrooming: ; 741d + ld hl, HappinessData_DaisysGrooming + ; fallthrough + +HaircutOrGrooming: ; 7420 + push hl + farcall SelectMonFromParty + pop hl + jr c, .nope + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + push hl + call GetCurNick + call CopyPokemonName_Buffer1_Buffer3 + pop hl + call Random +; Bug: Subtracting $ff from $ff fails to set c. +; This can result in overflow into the next data array. +; In the case of getting a grooming from Daisy, we bleed +; into CopyPokemonName_Buffer1_Buffer3, which passes +; $d0 to ChangeHappiness and returns $73 to the script. +; The end result is that there is a 0.4% chance your +; Pokemon's happiness will not change at all. +.loop + sub [hl] + jr c, .ok + inc hl + inc hl + inc hl + jr .loop + +.ok + inc hl + ld a, [hli] + ld [wScriptVar], a + ld c, [hl] + call ChangeHappiness + ret + +.nope + xor a + ld [wScriptVar], a + ret + +.egg + ld a, 1 + ld [wScriptVar], a + ret + +INCLUDE "data/events/happiness_probabilities.asm" + +CopyPokemonName_Buffer1_Buffer3: ; 746e + ld hl, wStringBuffer1 + ld de, wStringBuffer3 + ld bc, MON_NAME_LENGTH + jp CopyBytes + +DummyPredef1: ; 747a + ret diff --git a/engine/events/loadfishinggfx.asm b/engine/events/loadfishinggfx.asm deleted file mode 100644 index 3d3ab0ba0..000000000 --- a/engine/events/loadfishinggfx.asm +++ /dev/null @@ -1,46 +0,0 @@ -LoadFishingGFX: ; b84b3 - ld a, [rVBK] - push af - ld a, $1 - ld [rVBK], a - - ld de, FishingGFX - ld a, [wPlayerGender] - bit PLAYERGENDER_FEMALE_F, a - jr z, .got_gender - ld de, KrisFishingGFX -.got_gender - - ld hl, vTiles0 tile $02 - call .LoadGFX - ld hl, vTiles0 tile $06 - call .LoadGFX - ld hl, vTiles0 tile $0a - call .LoadGFX - ld hl, vTiles1 tile $7c - call .LoadGFX - - pop af - ld [rVBK], a - ret -; b84e3 - -.LoadGFX: ; b84e3 - lb bc, BANK(FishingGFX), 2 - push de - call Get2bpp - pop de - ld hl, 2 tiles - add hl, de - ld d, h - ld e, l - ret -; b84f2 - -FishingGFX: ; b84f2 -INCBIN "gfx/overworld/chris_fish.2bpp" -; b8582 - -KrisFishingGFX: ; b8582 -INCBIN "gfx/overworld/kris_fish.2bpp" -; b8612 diff --git a/engine/events/play_slow_cry.asm b/engine/events/play_slow_cry.asm new file mode 100644 index 000000000..1f27a7ca4 --- /dev/null +++ b/engine/events/play_slow_cry.asm @@ -0,0 +1,31 @@ +PlaySlowCry: ; fb841 + ld a, [wScriptVar] + call LoadCry + jr c, .done + + ld hl, wCryPitch + ld a, [hli] + ld h, [hl] + ld l, a + ld bc, -$140 + add hl, bc + ld a, l + ld [wCryPitch], a + ld a, h + ld [wCryPitch + 1], a + ld hl, wCryLength + ld a, [hli] + ld h, [hl] + ld l, a + ld bc, $60 + add hl, bc + ld a, l + ld [wCryLength], a + ld a, h + ld [wCryLength + 1], a + farcall _PlayCry + call WaitSFX + +.done + ret +; fb877 diff --git a/engine/events/playslowcry.asm b/engine/events/playslowcry.asm deleted file mode 100644 index 1f27a7ca4..000000000 --- a/engine/events/playslowcry.asm +++ /dev/null @@ -1,31 +0,0 @@ -PlaySlowCry: ; fb841 - ld a, [wScriptVar] - call LoadCry - jr c, .done - - ld hl, wCryPitch - ld a, [hli] - ld h, [hl] - ld l, a - ld bc, -$140 - add hl, bc - ld a, l - ld [wCryPitch], a - ld a, h - ld [wCryPitch + 1], a - ld hl, wCryLength - ld a, [hli] - ld h, [hl] - ld l, a - ld bc, $60 - add hl, bc - ld a, l - ld [wCryLength], a - ld a, h - ld [wCryLength + 1], a - farcall _PlayCry - call WaitSFX - -.done - ret -; fb877 diff --git a/engine/events/shuckle.asm b/engine/events/shuckle.asm new file mode 100644 index 000000000..99fcd7924 --- /dev/null +++ b/engine/events/shuckle.asm @@ -0,0 +1,142 @@ +MANIA_OT_ID EQU 00518 + +GiveShuckle: ; 7305 + +; Adding to the party. + xor a + ld [wMonType], a + +; Level 15 Shuckle. + ld a, SHUCKLE + ld [wCurPartySpecies], a + ld a, 15 + ld [wCurPartyLevel], a + + predef TryAddMonToParty + jr nc, .NotGiven + +; Caught data. + ld b, 0 + farcall SetGiftPartyMonCaughtData + +; Holding a Berry. + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wPartyCount] + dec a + push af + push bc + ld hl, wPartyMon1Item + call AddNTimes + ld [hl], BERRY + pop bc + pop af + +; OT ID. + ld hl, wPartyMon1ID + call AddNTimes + ld a, HIGH(MANIA_OT_ID) + ld [hli], a + ld [hl], LOW(MANIA_OT_ID) + +; Nickname. + ld a, [wPartyCount] + dec a + ld hl, wPartyMonNicknames + call SkipNames + ld de, SpecialShuckleNick + call CopyName2 + +; OT. + ld a, [wPartyCount] + dec a + ld hl, wPartyMonOT + call SkipNames + ld de, SpecialShuckleOT + call CopyName2 + +; Engine flag for this event. + ld hl, wDailyFlags + set DAILYFLAGS_GOT_SHUCKIE_TODAY_F, [hl] + ld a, 1 + ld [wScriptVar], a + ret + +.NotGiven: + xor a + ld [wScriptVar], a + ret + +SpecialShuckleOT: + db "MANIA@" +SpecialShuckleNick: + db "SHUCKIE@" + +ReturnShuckle: ; 737e + farcall SelectMonFromParty + jr c, .refused + + ld a, [wCurPartySpecies] + cp SHUCKLE + jr nz, .DontReturn + + ld a, [wCurPartyMon] + ld hl, wPartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + +; OT ID + ld a, [hli] + cp HIGH(MANIA_OT_ID) + jr nz, .DontReturn + ld a, [hl] + cp LOW(MANIA_OT_ID) + jr nz, .DontReturn + +; OT + ld a, [wCurPartyMon] + ld hl, wPartyMonOT + call SkipNames + ld de, SpecialShuckleOT +.CheckOT: + ld a, [de] + cp [hl] + jr nz, .DontReturn + cp "@" + jr z, .done + inc de + inc hl + jr .CheckOT + +.done + farcall CheckCurPartyMonFainted + jr c, .fainted + ld a, [wCurPartyMon] + ld hl, wPartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + cp 150 + ld a, SHUCKIE_HAPPY + jr nc, .HappyToStayWithYou + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + callfar RemoveMonFromPartyOrBox + ld a, SHUCKIE_RETURNED +.HappyToStayWithYou: + ld [wScriptVar], a + ret + +.refused + ld a, SHUCKIE_REFUSED + ld [wScriptVar], a + ret + +.DontReturn: + xor a ; SHUCKIE_WRONG_MON + ld [wScriptVar], a + ret + +.fainted + ld a, SHUCKIE_FAINTED + ld [wScriptVar], a + ret diff --git a/engine/events/specials_2.asm b/engine/events/specials_2.asm deleted file mode 100644 index 9a83b982b..000000000 --- a/engine/events/specials_2.asm +++ /dev/null @@ -1,225 +0,0 @@ -MANIA_OT_ID EQU 00518 - -GiveShuckle: ; 7305 - -; Adding to the party. - xor a - ld [wMonType], a - -; Level 15 Shuckle. - ld a, SHUCKLE - ld [wCurPartySpecies], a - ld a, 15 - ld [wCurPartyLevel], a - - predef TryAddMonToParty - jr nc, .NotGiven - -; Caught data. - ld b, 0 - farcall SetGiftPartyMonCaughtData - -; Holding a Berry. - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wPartyCount] - dec a - push af - push bc - ld hl, wPartyMon1Item - call AddNTimes - ld [hl], BERRY - pop bc - pop af - -; OT ID. - ld hl, wPartyMon1ID - call AddNTimes - ld a, HIGH(MANIA_OT_ID) - ld [hli], a - ld [hl], LOW(MANIA_OT_ID) - -; Nickname. - ld a, [wPartyCount] - dec a - ld hl, wPartyMonNicknames - call SkipNames - ld de, SpecialShuckleNick - call CopyName2 - -; OT. - ld a, [wPartyCount] - dec a - ld hl, wPartyMonOT - call SkipNames - ld de, SpecialShuckleOT - call CopyName2 - -; Engine flag for this event. - ld hl, wDailyFlags - set DAILYFLAGS_GOT_SHUCKIE_TODAY_F, [hl] - ld a, 1 - ld [wScriptVar], a - ret - -.NotGiven: - xor a - ld [wScriptVar], a - ret - -SpecialShuckleOT: - db "MANIA@" -SpecialShuckleNick: - db "SHUCKIE@" - -ReturnShuckle: ; 737e - farcall SelectMonFromParty - jr c, .refused - - ld a, [wCurPartySpecies] - cp SHUCKLE - jr nz, .DontReturn - - ld a, [wCurPartyMon] - ld hl, wPartyMon1ID - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - -; OT ID - ld a, [hli] - cp HIGH(MANIA_OT_ID) - jr nz, .DontReturn - ld a, [hl] - cp LOW(MANIA_OT_ID) - jr nz, .DontReturn - -; OT - ld a, [wCurPartyMon] - ld hl, wPartyMonOT - call SkipNames - ld de, SpecialShuckleOT -.CheckOT: - ld a, [de] - cp [hl] - jr nz, .DontReturn - cp "@" - jr z, .done - inc de - inc hl - jr .CheckOT - -.done - farcall CheckCurPartyMonFainted - jr c, .fainted - ld a, [wCurPartyMon] - ld hl, wPartyMon1Happiness - ld bc, PARTYMON_STRUCT_LENGTH - call AddNTimes - ld a, [hl] - cp 150 - ld a, SHUCKIE_HAPPY - jr nc, .HappyToStayWithYou - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - callfar RemoveMonFromPartyOrBox - ld a, SHUCKIE_RETURNED -.HappyToStayWithYou: - ld [wScriptVar], a - ret - -.refused - ld a, SHUCKIE_REFUSED - ld [wScriptVar], a - ret - -.DontReturn: - xor a ; SHUCKIE_WRONG_MON - ld [wScriptVar], a - ret - -.fainted - ld a, SHUCKIE_FAINTED - ld [wScriptVar], a - ret - -BillsGrandfather: ; 73f7 - farcall SelectMonFromParty - jr c, .cancel - ld a, [wCurPartySpecies] - ld [wScriptVar], a - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - jp CopyPokemonName_Buffer1_Buffer3 - -.cancel - xor a - ld [wScriptVar], a - ret - -YoungerHaircutBrother: ; 7413 - ld hl, HappinessData_YoungerHaircutBrother - jr HaircutOrGrooming - -OlderHaircutBrother: ; 7418 - ld hl, HappinessData_OlderHaircutBrother - jr HaircutOrGrooming - -DaisysGrooming: ; 741d - ld hl, HappinessData_DaisysGrooming - ; fallthrough - -HaircutOrGrooming: ; 7420 - push hl - farcall SelectMonFromParty - pop hl - jr c, .nope - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - push hl - call GetCurNick - call CopyPokemonName_Buffer1_Buffer3 - pop hl - call Random -; Bug: Subtracting $ff from $ff fails to set c. -; This can result in overflow into the next data array. -; In the case of getting a grooming from Daisy, we bleed -; into CopyPokemonName_Buffer1_Buffer3, which passes -; $d0 to ChangeHappiness and returns $73 to the script. -; The end result is that there is a 0.4% chance your -; Pokemon's happiness will not change at all. -.loop - sub [hl] - jr c, .ok - inc hl - inc hl - inc hl - jr .loop - -.ok - inc hl - ld a, [hli] - ld [wScriptVar], a - ld c, [hl] - call ChangeHappiness - ret - -.nope - xor a - ld [wScriptVar], a - ret - -.egg - ld a, 1 - ld [wScriptVar], a - ret - -INCLUDE "data/events/happiness_probabilities.asm" - -CopyPokemonName_Buffer1_Buffer3: ; 746e - ld hl, wStringBuffer1 - ld de, wStringBuffer3 - ld bc, MON_NAME_LENGTH - jp CopyBytes - -DummyPredef1: ; 747a - ret diff --git a/engine/gfx/drawkrispackgfx.asm b/engine/gfx/drawkrispackgfx.asm deleted file mode 100644 index 54a21e447..000000000 --- a/engine/gfx/drawkrispackgfx.asm +++ /dev/null @@ -1,20 +0,0 @@ -DrawKrisPackGFX: ; 48e81 - ld hl, PackFGFXPointers - add hl, de - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - ld hl, vTiles2 tile $50 - lb bc, BANK(PackFGFX), 15 - call Request2bpp - ret - -PackFGFXPointers: ; 48e93 - dw PackFGFX + (15 tiles) * 1 ; ITEM_POCKET - dw PackFGFX + (15 tiles) * 3 ; BALL_POCKET - dw PackFGFX + (15 tiles) * 0 ; KEY_ITEM_POCKET - dw PackFGFX + (15 tiles) * 2 ; TM_HM_POCKET - -PackFGFX: ; 48e9b -INCBIN "gfx/pack/pack_f.2bpp" diff --git a/engine/gfx/load_overworld_font.asm b/engine/gfx/load_overworld_font.asm new file mode 100644 index 000000000..f23f01c4e --- /dev/null +++ b/engine/gfx/load_overworld_font.asm @@ -0,0 +1,17 @@ +LoadOverworldFont:: ; 106594 + ld de, .OverworldFontGFX + ld hl, vTiles1 + lb bc, BANK(.OverworldFontGFX), $80 + call Get2bpp + ld de, .OverworldFontSpaceGFX + ld hl, vTiles2 tile " " + lb bc, BANK(.OverworldFontSpaceGFX), 1 + call Get2bpp + ret +; 1065ad + +.OverworldFontGFX: +INCBIN "gfx/font/overworld.2bpp" + +.OverworldFontSpaceGFX: +INCBIN "gfx/font/overworld_space.2bpp" diff --git a/engine/gfx/load_push_oam.asm b/engine/gfx/load_push_oam.asm new file mode 100644 index 000000000..95f67ff73 --- /dev/null +++ b/engine/gfx/load_push_oam.asm @@ -0,0 +1,21 @@ +WriteOAMDMACodeToHRAM:: ; 4031 + ld c, hTransferVirtualOAM - $ff00 + ld b, .PushOAMEnd - .PushOAM + ld hl, .PushOAM +.loop + ld a, [hli] + ld [$ff00+c], a + inc c + dec b + jr nz, .loop + ret + +.PushOAM: ; 403f + ld a, HIGH(wVirtualOAM) + ld [rDMA], a + ld a, NUM_SPRITE_OAM_STRUCTS +.pushoam_loop + dec a + jr nz, .pushoam_loop + ret +.PushOAMEnd diff --git a/engine/gfx/loadoverworldfont.asm b/engine/gfx/loadoverworldfont.asm deleted file mode 100644 index f23f01c4e..000000000 --- a/engine/gfx/loadoverworldfont.asm +++ /dev/null @@ -1,17 +0,0 @@ -LoadOverworldFont:: ; 106594 - ld de, .OverworldFontGFX - ld hl, vTiles1 - lb bc, BANK(.OverworldFontGFX), $80 - call Get2bpp - ld de, .OverworldFontSpaceGFX - ld hl, vTiles2 tile " " - lb bc, BANK(.OverworldFontSpaceGFX), 1 - call Get2bpp - ret -; 1065ad - -.OverworldFontGFX: -INCBIN "gfx/font/overworld.2bpp" - -.OverworldFontSpaceGFX: -INCBIN "gfx/font/overworld_space.2bpp" diff --git a/engine/gfx/loadpushoam.asm b/engine/gfx/loadpushoam.asm deleted file mode 100644 index 95f67ff73..000000000 --- a/engine/gfx/loadpushoam.asm +++ /dev/null @@ -1,21 +0,0 @@ -WriteOAMDMACodeToHRAM:: ; 4031 - ld c, hTransferVirtualOAM - $ff00 - ld b, .PushOAMEnd - .PushOAM - ld hl, .PushOAM -.loop - ld a, [hli] - ld [$ff00+c], a - inc c - dec b - jr nz, .loop - ret - -.PushOAM: ; 403f - ld a, HIGH(wVirtualOAM) - ld [rDMA], a - ld a, NUM_SPRITE_OAM_STRUCTS -.pushoam_loop - dec a - jr nz, .pushoam_loop - ret -.PushOAMEnd diff --git a/engine/gfx/place_graphic.asm b/engine/gfx/place_graphic.asm new file mode 100644 index 000000000..21b914950 --- /dev/null +++ b/engine/gfx/place_graphic.asm @@ -0,0 +1,55 @@ +PlaceGraphic: ; 2ef6e +; Fill wBoxAlignment-aligned box width b height c +; with iterating tile starting from hGraphicStartTile at hl. + + ld de, SCREEN_WIDTH + + ld a, [wBoxAlignment] + and a + jr nz, .right + + ld a, [hGraphicStartTile] +.x1 + push bc + push hl + +.y1 + ld [hl], a + add hl, de + inc a + dec c + jr nz, .y1 + + pop hl + inc hl + pop bc + dec b + jr nz, .x1 + ret + +.right +; Right-aligned. + push bc + ld b, 0 + dec c + add hl, bc + pop bc + + ld a, [hGraphicStartTile] +.x2 + push bc + push hl + +.y2 + ld [hl], a + add hl, de + inc a + dec c + jr nz, .y2 + + pop hl + dec hl + pop bc + dec b + jr nz, .x2 + ret diff --git a/engine/gfx/placegraphic.asm b/engine/gfx/placegraphic.asm deleted file mode 100644 index 21b914950..000000000 --- a/engine/gfx/placegraphic.asm +++ /dev/null @@ -1,55 +0,0 @@ -PlaceGraphic: ; 2ef6e -; Fill wBoxAlignment-aligned box width b height c -; with iterating tile starting from hGraphicStartTile at hl. - - ld de, SCREEN_WIDTH - - ld a, [wBoxAlignment] - and a - jr nz, .right - - ld a, [hGraphicStartTile] -.x1 - push bc - push hl - -.y1 - ld [hl], a - add hl, de - inc a - dec c - jr nz, .y1 - - pop hl - inc hl - pop bc - dec b - jr nz, .x1 - ret - -.right -; Right-aligned. - push bc - ld b, 0 - dec c - add hl, bc - pop bc - - ld a, [hGraphicStartTile] -.x2 - push bc - push hl - -.y2 - ld [hl], a - add hl, de - inc a - dec c - jr nz, .y2 - - pop hl - dec hl - pop bc - dec b - jr nz, .x2 - ret diff --git a/engine/gfx/trademon_frontpic.asm b/engine/gfx/trademon_frontpic.asm new file mode 100644 index 000000000..d5f7b55de --- /dev/null +++ b/engine/gfx/trademon_frontpic.asm @@ -0,0 +1,38 @@ +GetTrademonFrontpic: ; 4d7fd + ld a, [wOTTrademonSpecies] + ld hl, wOTTrademonDVs + ld de, vTiles2 + push de + push af + predef GetUnownLetter + pop af + ld [wCurPartySpecies], a + ld [wCurSpecies], a + call GetBaseData + pop de + predef GetAnimatedFrontpic + ret + +AnimateTrademonFrontpic: ; 4d81e + ld a, [wOTTrademonSpecies] + call IsAPokemon + ret c + farcall ShowOTTrademonStats + ld a, [wOTTrademonSpecies] + ld [wCurPartySpecies], a + ld a, [wOTTrademonDVs] + ld [wTempMonDVs], a + ld a, [wOTTrademonDVs + 1] + ld [wTempMonDVs + 1], a + ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + farcall TradeAnim_ShowGetmonFrontpic + ld a, [wOTTrademonSpecies] + ld [wCurPartySpecies], a + hlcoord 7, 2 + ld d, $0 + ld e, ANIM_MON_TRADE + predef AnimateFrontpic + ret diff --git a/engine/gfx/trademonfrontpic.asm b/engine/gfx/trademonfrontpic.asm deleted file mode 100644 index d5f7b55de..000000000 --- a/engine/gfx/trademonfrontpic.asm +++ /dev/null @@ -1,38 +0,0 @@ -GetTrademonFrontpic: ; 4d7fd - ld a, [wOTTrademonSpecies] - ld hl, wOTTrademonDVs - ld de, vTiles2 - push de - push af - predef GetUnownLetter - pop af - ld [wCurPartySpecies], a - ld [wCurSpecies], a - call GetBaseData - pop de - predef GetAnimatedFrontpic - ret - -AnimateTrademonFrontpic: ; 4d81e - ld a, [wOTTrademonSpecies] - call IsAPokemon - ret c - farcall ShowOTTrademonStats - ld a, [wOTTrademonSpecies] - ld [wCurPartySpecies], a - ld a, [wOTTrademonDVs] - ld [wTempMonDVs], a - ld a, [wOTTrademonDVs + 1] - ld [wTempMonDVs + 1], a - ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - ld a, %11100100 ; 3,2,1,0 - call DmgToCgbBGPals - farcall TradeAnim_ShowGetmonFrontpic - ld a, [wOTTrademonSpecies] - ld [wCurPartySpecies], a - hlcoord 7, 2 - ld d, $0 - ld e, ANIM_MON_TRADE - predef AnimateFrontpic - ret diff --git a/engine/items/pack_kris.asm b/engine/items/pack_kris.asm new file mode 100644 index 000000000..54a21e447 --- /dev/null +++ b/engine/items/pack_kris.asm @@ -0,0 +1,20 @@ +DrawKrisPackGFX: ; 48e81 + ld hl, PackFGFXPointers + add hl, de + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + ld hl, vTiles2 tile $50 + lb bc, BANK(PackFGFX), 15 + call Request2bpp + ret + +PackFGFXPointers: ; 48e93 + dw PackFGFX + (15 tiles) * 1 ; ITEM_POCKET + dw PackFGFX + (15 tiles) * 3 ; BALL_POCKET + dw PackFGFX + (15 tiles) * 0 ; KEY_ITEM_POCKET + dw PackFGFX + (15 tiles) * 2 ; TM_HM_POCKET + +PackFGFX: ; 48e9b +INCBIN "gfx/pack/pack_f.2bpp" diff --git a/engine/items/print_item_description.asm b/engine/items/print_item_description.asm new file mode 100644 index 000000000..2a9007b97 --- /dev/null +++ b/engine/items/print_item_description.asm @@ -0,0 +1,31 @@ +PrintItemDescription: ; 0x1c8955 +; Print the description for item [wCurSpecies] at de. + + ld a, [wCurSpecies] + cp TM01 + jr c, .not_a_tm + + ld [wCurItem], a + push de + farcall GetTMHMItemMove + pop hl + ld a, [wd265] + ld [wCurSpecies], a + predef PrintMoveDesc + ret + +.not_a_tm + push de + ld hl, ItemDescriptions + ld a, [wCurSpecies] + dec a + ld c, a + ld b, 0 + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + pop hl + jp PlaceString +; 0x1c8987 diff --git a/engine/items/printitemdescription.asm b/engine/items/printitemdescription.asm deleted file mode 100644 index 2a9007b97..000000000 --- a/engine/items/printitemdescription.asm +++ /dev/null @@ -1,31 +0,0 @@ -PrintItemDescription: ; 0x1c8955 -; Print the description for item [wCurSpecies] at de. - - ld a, [wCurSpecies] - cp TM01 - jr c, .not_a_tm - - ld [wCurItem], a - push de - farcall GetTMHMItemMove - pop hl - ld a, [wd265] - ld [wCurSpecies], a - predef PrintMoveDesc - ret - -.not_a_tm - push de - ld hl, ItemDescriptions - ld a, [wCurSpecies] - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld e, [hl] - inc hl - ld d, [hl] - pop hl - jp PlaceString -; 0x1c8987 diff --git a/engine/items/update_item_description.asm b/engine/items/update_item_description.asm new file mode 100644 index 000000000..fdb1e864d --- /dev/null +++ b/engine/items/update_item_description.asm @@ -0,0 +1,13 @@ +UpdateItemDescription: ; 0x244c3 + ld a, [wMenuSelection] + ld [wCurSpecies], a + hlcoord 0, 12 + ld b, 4 + ld c, SCREEN_WIDTH - 2 + call TextBox + ld a, [wMenuSelection] + cp -1 + ret z + decoord 1, 14 + farcall PrintItemDescription + ret diff --git a/engine/items/updateitemdescription.asm b/engine/items/updateitemdescription.asm deleted file mode 100644 index fdb1e864d..000000000 --- a/engine/items/updateitemdescription.asm +++ /dev/null @@ -1,13 +0,0 @@ -UpdateItemDescription: ; 0x244c3 - ld a, [wMenuSelection] - ld [wCurSpecies], a - hlcoord 0, 12 - ld b, 4 - ld c, SCREEN_WIDTH - 2 - call TextBox - ld a, [wMenuSelection] - cp -1 - ret z - decoord 1, 14 - farcall PrintItemDescription - ret diff --git a/engine/link/init_list.asm b/engine/link/init_list.asm new file mode 100644 index 000000000..26c77b5bb --- /dev/null +++ b/engine/link/init_list.asm @@ -0,0 +1,54 @@ +InitList: ; 50db9 + ld a, [wInitListType] + + cp INIT_ENEMYOT_LIST + jr nz, .check_party_ot_name + ld hl, wOTPartyCount + ld de, wOTPartyMonOT + ld a, ENEMY_OT_NAME + jr .done + +.check_party_ot_name + cp INIT_PLAYEROT_LIST + jr nz, .check_mon_name + ld hl, wPartyCount + ld de, wPartyMonOT + ld a, PARTY_OT_NAME + jr .done + +.check_mon_name + cp INIT_MON_LIST + jr nz, .check_item_name + ld hl, wCurMart + ld de, PokemonNames + ld a, MON_NAME + jr .done + +.check_item_name + cp INIT_BAG_ITEM_LIST + jr nz, .check_ob_item_name + ld hl, wNumItems + ld de, ItemNames + ld a, ITEM_NAME + jr .done + +.check_ob_item_name + ld hl, wCurMart + ld de, ItemNames + ld a, ITEM_NAME +.done + ld [wNamedObjectTypeBuffer], a + ld a, l + ld [wListPointer], a + ld a, h + ld [wListPointer + 1], a + ld a, e + ld [wUnusedD102], a + ld a, d + ld [wUnusedD102 + 1], a + ld bc, ItemAttributes + ld a, c + ld [wItemAttributesPtr], a + ld a, b + ld [wItemAttributesPtr + 1], a + ret diff --git a/engine/link/initlist.asm b/engine/link/initlist.asm deleted file mode 100644 index 26c77b5bb..000000000 --- a/engine/link/initlist.asm +++ /dev/null @@ -1,54 +0,0 @@ -InitList: ; 50db9 - ld a, [wInitListType] - - cp INIT_ENEMYOT_LIST - jr nz, .check_party_ot_name - ld hl, wOTPartyCount - ld de, wOTPartyMonOT - ld a, ENEMY_OT_NAME - jr .done - -.check_party_ot_name - cp INIT_PLAYEROT_LIST - jr nz, .check_mon_name - ld hl, wPartyCount - ld de, wPartyMonOT - ld a, PARTY_OT_NAME - jr .done - -.check_mon_name - cp INIT_MON_LIST - jr nz, .check_item_name - ld hl, wCurMart - ld de, PokemonNames - ld a, MON_NAME - jr .done - -.check_item_name - cp INIT_BAG_ITEM_LIST - jr nz, .check_ob_item_name - ld hl, wNumItems - ld de, ItemNames - ld a, ITEM_NAME - jr .done - -.check_ob_item_name - ld hl, wCurMart - ld de, ItemNames - ld a, ITEM_NAME -.done - ld [wNamedObjectTypeBuffer], a - ld a, l - ld [wListPointer], a - ld a, h - ld [wListPointer + 1], a - ld a, e - ld [wUnusedD102], a - ld a, d - ld [wUnusedD102 + 1], a - ld bc, ItemAttributes - ld a, c - ld [wItemAttributesPtr], a - ld a, b - ld [wItemAttributesPtr + 1], a - ret diff --git a/engine/link/place_waiting_text.asm b/engine/link/place_waiting_text.asm new file mode 100644 index 000000000..9b2260722 --- /dev/null +++ b/engine/link/place_waiting_text.asm @@ -0,0 +1,24 @@ +PlaceWaitingText:: ; 4000 + hlcoord 3, 10 + ld b, 1 + ld c, 11 + + ld a, [wBattleMode] + and a + jr z, .notinbattle + + call TextBox + jr .proceed + +.notinbattle + predef LinkTextboxAtHL + +.proceed + hlcoord 4, 11 + ld de, .Waiting + call PlaceString + ld c, 50 + jp DelayFrames + +.Waiting: ; 4025 + db "Waiting...!@" diff --git a/engine/link/placewaitingtext.asm b/engine/link/placewaitingtext.asm deleted file mode 100644 index 9b2260722..000000000 --- a/engine/link/placewaitingtext.asm +++ /dev/null @@ -1,24 +0,0 @@ -PlaceWaitingText:: ; 4000 - hlcoord 3, 10 - ld b, 1 - ld c, 11 - - ld a, [wBattleMode] - and a - jr z, .notinbattle - - call TextBox - jr .proceed - -.notinbattle - predef LinkTextboxAtHL - -.proceed - hlcoord 4, 11 - ld de, .Waiting - call PlaceString - ld c, 50 - jp DelayFrames - -.Waiting: ; 4025 - db "Waiting...!@" diff --git a/engine/math/get_square_root.asm b/engine/math/get_square_root.asm new file mode 100644 index 000000000..412fd04ff --- /dev/null +++ b/engine/math/get_square_root.asm @@ -0,0 +1,32 @@ +NUM_SQUARE_ROOTS EQU 255 + +GetSquareRoot: ; 13b87 +; Return the square root of de in b. + +; Rather than calculating the result, we take the index of the +; first value in a table of squares that isn't lower than de. + + ld hl, .Squares + ld b, 0 +.loop +; Make sure we don't go past the end of the table. + inc b + ld a, b + cp NUM_SQUARE_ROOTS + ret z + +; Iterate over the table until b**2 >= de. + ld a, [hli] + sub e + ld a, [hli] + sbc d + + jr c, .loop + ret + +.Squares: ; 13b98 +x = 1 +rept NUM_SQUARE_ROOTS + dw x * x +x = x + 1 +endr diff --git a/engine/math/getsquareroot.asm b/engine/math/getsquareroot.asm deleted file mode 100644 index 412fd04ff..000000000 --- a/engine/math/getsquareroot.asm +++ /dev/null @@ -1,32 +0,0 @@ -NUM_SQUARE_ROOTS EQU 255 - -GetSquareRoot: ; 13b87 -; Return the square root of de in b. - -; Rather than calculating the result, we take the index of the -; first value in a table of squares that isn't lower than de. - - ld hl, .Squares - ld b, 0 -.loop -; Make sure we don't go past the end of the table. - inc b - ld a, b - cp NUM_SQUARE_ROOTS - ret z - -; Iterate over the table until b**2 >= de. - ld a, [hli] - sub e - ld a, [hli] - sbc d - - jr c, .loop - ret - -.Squares: ; 13b98 -x = 1 -rept NUM_SQUARE_ROOTS - dw x * x -x = x + 1 -endr diff --git a/engine/math/print_num.asm b/engine/math/print_num.asm new file mode 100644 index 000000000..fec798d5c --- /dev/null +++ b/engine/math/print_num.asm @@ -0,0 +1,300 @@ +_PrintNum:: ; c4c7 +; Print c digits of the b-byte value from de to hl. +; Allows 2 to 7 digits. For 1-digit numbers, add +; the value to char "0" instead of calling PrintNum. +; Some extra flags can be given in bits 5-7 of b. +; Bit 5: money if set (unless left-aligned without leading zeros) +; Bit 6: right-aligned if set +; Bit 7: print leading zeros if set + + push bc + + bit 5, b + jr z, .main + bit 7, b + jr nz, .moneyflag + bit 6, b + jr z, .main + +.moneyflag ; 101xxxxx or 011xxxxx + ld a, "¥" + ld [hli], a + res 5, b ; 100xxxxx or 010xxxxx + +.main + xor a + ld [hPrintNum1], a + ld [hPrintNum2], a + ld [hPrintNum3], a + ld a, b + and $f + cp 1 + jr z, .byte + cp 2 + jr z, .word +; maximum 3 bytes +.long + ld a, [de] + ld [hPrintNum2], a + inc de + ld a, [de] + ld [hPrintNum3], a + inc de + ld a, [de] + ld [hPrintNum4], a + jr .start + +.word + ld a, [de] + ld [hPrintNum3], a + inc de + ld a, [de] + ld [hPrintNum4], a + jr .start + +.byte + ld a, [de] + ld [hPrintNum4], a + +.start + push de + + ld d, b + ld a, c + swap a + and $f + ld e, a + ld a, c + and $f + ld b, a + ld c, 0 + cp 2 + jr z, .two + cp 3 + jr z, .three + cp 4 + jr z, .four + cp 5 + jr z, .five + cp 6 + jr z, .six + +.seven + ld a, HIGH(1000000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(1000000) ; mid + ld [hPrintNum6], a + ld a, LOW(1000000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.six + ld a, HIGH(100000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(100000) ; mid + ld [hPrintNum6], a + ld a, LOW(100000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.five + xor a ; HIGH(10000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(10000) ; mid + ld [hPrintNum6], a + ld a, LOW(10000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.four + xor a ; HIGH(1000 >> 8) + ld [hPrintNum5], a + ld a, HIGH(1000) ; mid + ld [hPrintNum6], a + ld a, LOW(1000) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.three + xor a ; HIGH(100 >> 8) + ld [hPrintNum5], a + xor a ; HIGH(100) ; mid + ld [hPrintNum6], a + ld a, LOW(100) + ld [hPrintNum7], a + call .PrintDigit + call .AdvancePointer + +.two + dec e + jr nz, .two_skip + ld a, "0" + ld [hPrintNum1], a +.two_skip + + ld c, 0 + ld a, [hPrintNum4] +.mod_10 + cp 10 + jr c, .modded_10 + sub 10 + inc c + jr .mod_10 +.modded_10 + + ld b, a + ld a, [hPrintNum1] + or c + jr nz, .money + call .PrintLeadingZero + jr .money_leading_zero + +.money + call .PrintYen + push af + ld a, "0" + add c + ld [hl], a + pop af + ld [hPrintNum1], a + inc e + dec e + jr nz, .money_leading_zero + inc hl + ld [hl], "" + +.money_leading_zero + call .AdvancePointer + call .PrintYen + ld a, "0" + add b + ld [hli], a + + pop de + pop bc + ret + +.PrintYen: ; c5ba + push af + ld a, [hPrintNum1] + and a + jr nz, .stop + bit 5, d + jr z, .stop + ld a, "¥" + ld [hli], a + res 5, d + +.stop + pop af + ret + +.PrintDigit: ; c5cb (3:45cb) + dec e + jr nz, .ok + ld a, "0" + ld [hPrintNum1], a +.ok + ld c, 0 +.loop + ld a, [hPrintNum5] + ld b, a + ld a, [hPrintNum2] + ld [hPrintNum8], a + cp b + jr c, .skip1 + sub b + ld [hPrintNum2], a + ld a, [hPrintNum6] + ld b, a + ld a, [hPrintNum3] + ld [hPrintNum9], a + cp b + jr nc, .skip2 + ld a, [hPrintNum2] + or 0 + jr z, .skip3 + dec a + ld [hPrintNum2], a + ld a, [hPrintNum3] +.skip2 + sub b + ld [hPrintNum3], a + ld a, [hPrintNum7] + ld b, a + ld a, [hPrintNum4] + ld [hPrintNum10], a + cp b + jr nc, .skip4 + ld a, [hPrintNum3] + and a + jr nz, .skip5 + ld a, [hPrintNum2] + and a + jr z, .skip6 + dec a + ld [hPrintNum2], a + xor a +.skip5 + dec a + ld [hPrintNum3], a + ld a, [hPrintNum4] +.skip4 + sub b + ld [hPrintNum4], a + inc c + jr .loop +.skip6 + ld a, [hPrintNum9] + ld [hPrintNum3], a +.skip3 + ld a, [hPrintNum8] + ld [hPrintNum2], a +.skip1 + ld a, [hPrintNum1] + or c + jr z, .PrintLeadingZero + ld a, [hPrintNum1] + and a + jr nz, .done + bit 5, d + jr z, .done + ld a, "¥" + ld [hli], a + res 5, d +.done + ld a, "0" + add c + ld [hl], a + ld [hPrintNum1], a + inc e + dec e + ret nz + inc hl + ld [hl], "" + ret + +.PrintLeadingZero: ; c644 +; prints a leading zero unless they are turned off in the flags + bit 7, d ; print leading zeroes? + ret z + ld [hl], "0" + ret + +.AdvancePointer: ; c64a +; increments the pointer unless leading zeroes are not being printed, +; the number is left-aligned, and no nonzero digits have been printed yet + bit 7, d ; print leading zeroes? + jr nz, .inc + bit 6, d ; left alignment or right alignment? + jr z, .inc + ld a, [hPrintNum1] + and a + ret z +.inc + inc hl + ret diff --git a/engine/math/printnum.asm b/engine/math/printnum.asm deleted file mode 100644 index fec798d5c..000000000 --- a/engine/math/printnum.asm +++ /dev/null @@ -1,300 +0,0 @@ -_PrintNum:: ; c4c7 -; Print c digits of the b-byte value from de to hl. -; Allows 2 to 7 digits. For 1-digit numbers, add -; the value to char "0" instead of calling PrintNum. -; Some extra flags can be given in bits 5-7 of b. -; Bit 5: money if set (unless left-aligned without leading zeros) -; Bit 6: right-aligned if set -; Bit 7: print leading zeros if set - - push bc - - bit 5, b - jr z, .main - bit 7, b - jr nz, .moneyflag - bit 6, b - jr z, .main - -.moneyflag ; 101xxxxx or 011xxxxx - ld a, "¥" - ld [hli], a - res 5, b ; 100xxxxx or 010xxxxx - -.main - xor a - ld [hPrintNum1], a - ld [hPrintNum2], a - ld [hPrintNum3], a - ld a, b - and $f - cp 1 - jr z, .byte - cp 2 - jr z, .word -; maximum 3 bytes -.long - ld a, [de] - ld [hPrintNum2], a - inc de - ld a, [de] - ld [hPrintNum3], a - inc de - ld a, [de] - ld [hPrintNum4], a - jr .start - -.word - ld a, [de] - ld [hPrintNum3], a - inc de - ld a, [de] - ld [hPrintNum4], a - jr .start - -.byte - ld a, [de] - ld [hPrintNum4], a - -.start - push de - - ld d, b - ld a, c - swap a - and $f - ld e, a - ld a, c - and $f - ld b, a - ld c, 0 - cp 2 - jr z, .two - cp 3 - jr z, .three - cp 4 - jr z, .four - cp 5 - jr z, .five - cp 6 - jr z, .six - -.seven - ld a, HIGH(1000000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(1000000) ; mid - ld [hPrintNum6], a - ld a, LOW(1000000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.six - ld a, HIGH(100000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(100000) ; mid - ld [hPrintNum6], a - ld a, LOW(100000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.five - xor a ; HIGH(10000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(10000) ; mid - ld [hPrintNum6], a - ld a, LOW(10000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.four - xor a ; HIGH(1000 >> 8) - ld [hPrintNum5], a - ld a, HIGH(1000) ; mid - ld [hPrintNum6], a - ld a, LOW(1000) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.three - xor a ; HIGH(100 >> 8) - ld [hPrintNum5], a - xor a ; HIGH(100) ; mid - ld [hPrintNum6], a - ld a, LOW(100) - ld [hPrintNum7], a - call .PrintDigit - call .AdvancePointer - -.two - dec e - jr nz, .two_skip - ld a, "0" - ld [hPrintNum1], a -.two_skip - - ld c, 0 - ld a, [hPrintNum4] -.mod_10 - cp 10 - jr c, .modded_10 - sub 10 - inc c - jr .mod_10 -.modded_10 - - ld b, a - ld a, [hPrintNum1] - or c - jr nz, .money - call .PrintLeadingZero - jr .money_leading_zero - -.money - call .PrintYen - push af - ld a, "0" - add c - ld [hl], a - pop af - ld [hPrintNum1], a - inc e - dec e - jr nz, .money_leading_zero - inc hl - ld [hl], "" - -.money_leading_zero - call .AdvancePointer - call .PrintYen - ld a, "0" - add b - ld [hli], a - - pop de - pop bc - ret - -.PrintYen: ; c5ba - push af - ld a, [hPrintNum1] - and a - jr nz, .stop - bit 5, d - jr z, .stop - ld a, "¥" - ld [hli], a - res 5, d - -.stop - pop af - ret - -.PrintDigit: ; c5cb (3:45cb) - dec e - jr nz, .ok - ld a, "0" - ld [hPrintNum1], a -.ok - ld c, 0 -.loop - ld a, [hPrintNum5] - ld b, a - ld a, [hPrintNum2] - ld [hPrintNum8], a - cp b - jr c, .skip1 - sub b - ld [hPrintNum2], a - ld a, [hPrintNum6] - ld b, a - ld a, [hPrintNum3] - ld [hPrintNum9], a - cp b - jr nc, .skip2 - ld a, [hPrintNum2] - or 0 - jr z, .skip3 - dec a - ld [hPrintNum2], a - ld a, [hPrintNum3] -.skip2 - sub b - ld [hPrintNum3], a - ld a, [hPrintNum7] - ld b, a - ld a, [hPrintNum4] - ld [hPrintNum10], a - cp b - jr nc, .skip4 - ld a, [hPrintNum3] - and a - jr nz, .skip5 - ld a, [hPrintNum2] - and a - jr z, .skip6 - dec a - ld [hPrintNum2], a - xor a -.skip5 - dec a - ld [hPrintNum3], a - ld a, [hPrintNum4] -.skip4 - sub b - ld [hPrintNum4], a - inc c - jr .loop -.skip6 - ld a, [hPrintNum9] - ld [hPrintNum3], a -.skip3 - ld a, [hPrintNum8] - ld [hPrintNum2], a -.skip1 - ld a, [hPrintNum1] - or c - jr z, .PrintLeadingZero - ld a, [hPrintNum1] - and a - jr nz, .done - bit 5, d - jr z, .done - ld a, "¥" - ld [hli], a - res 5, d -.done - ld a, "0" - add c - ld [hl], a - ld [hPrintNum1], a - inc e - dec e - ret nz - inc hl - ld [hl], "" - ret - -.PrintLeadingZero: ; c644 -; prints a leading zero unless they are turned off in the flags - bit 7, d ; print leading zeroes? - ret z - ld [hl], "0" - ret - -.AdvancePointer: ; c64a -; increments the pointer unless leading zeroes are not being printed, -; the number is left-aligned, and no nonzero digits have been printed yet - bit 7, d ; print leading zeroes? - jr nz, .inc - bit 6, d ; left alignment or right alignment? - jr z, .inc - ld a, [hPrintNum1] - and a - ret z -.inc - inc hl - ret diff --git a/engine/menus/empty_sram.asm b/engine/menus/empty_sram.asm new file mode 100644 index 000000000..8b060f3ef --- /dev/null +++ b/engine/menus/empty_sram.asm @@ -0,0 +1,19 @@ +EmptyAllSRAMBanks: ; 4cf1f + ld a, 0 + call .EmptyBank + ld a, 1 + call .EmptyBank + ld a, 2 + call .EmptyBank + ld a, 3 + call .EmptyBank + ret + +.EmptyBank: ; 4cf34 + call GetSRAMBank + ld hl, SRAM_Begin + ld bc, SRAM_End - SRAM_Begin + xor a + call ByteFill + call CloseSRAM + ret diff --git a/engine/menus/emptyallsrambanks.asm b/engine/menus/emptyallsrambanks.asm deleted file mode 100644 index 8b060f3ef..000000000 --- a/engine/menus/emptyallsrambanks.asm +++ /dev/null @@ -1,19 +0,0 @@ -EmptyAllSRAMBanks: ; 4cf1f - ld a, 0 - call .EmptyBank - ld a, 1 - call .EmptyBank - ld a, 2 - call .EmptyBank - ld a, 3 - call .EmptyBank - ret - -.EmptyBank: ; 4cf34 - call GetSRAMBank - ld hl, SRAM_Begin - ld bc, SRAM_End - SRAM_Begin - xor a - call ByteFill - call CloseSRAM - ret diff --git a/engine/overworld/load_map_part.asm b/engine/overworld/load_map_part.asm new file mode 100644 index 000000000..2184ebf7e --- /dev/null +++ b/engine/overworld/load_map_part.asm @@ -0,0 +1,36 @@ +_LoadMapPart:: ; 4d15b + ld hl, wMisc + ld a, [wMetatileStandingY] + and a + jr z, .top_row + ld bc, WMISC_WIDTH * 2 + add hl, bc + +.top_row + ld a, [wMetatileStandingX] + and a + jr z, .left_column + inc hl + inc hl + +.left_column + decoord 0, 0 + ld b, SCREEN_HEIGHT +.loop + ld c, SCREEN_WIDTH +.loop2 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop2 + ld a, l + add 4 + ld l, a + jr nc, .carry + inc h + +.carry + dec b + jr nz, .loop + ret diff --git a/engine/overworld/loadmappart.asm b/engine/overworld/loadmappart.asm deleted file mode 100644 index 2184ebf7e..000000000 --- a/engine/overworld/loadmappart.asm +++ /dev/null @@ -1,36 +0,0 @@ -_LoadMapPart:: ; 4d15b - ld hl, wMisc - ld a, [wMetatileStandingY] - and a - jr z, .top_row - ld bc, WMISC_WIDTH * 2 - add hl, bc - -.top_row - ld a, [wMetatileStandingX] - and a - jr z, .left_column - inc hl - inc hl - -.left_column - decoord 0, 0 - ld b, SCREEN_HEIGHT -.loop - ld c, SCREEN_WIDTH -.loop2 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop2 - ld a, l - add 4 - ld l, a - jr nc, .carry - inc h - -.carry - dec b - jr nz, .loop - ret diff --git a/engine/pokedex/new_pokedex_entry.asm b/engine/pokedex/new_pokedex_entry.asm new file mode 100644 index 000000000..365cf1b70 --- /dev/null +++ b/engine/pokedex/new_pokedex_entry.asm @@ -0,0 +1,52 @@ +NewPokedexEntry: ; fb877 + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a + call LowVolume + call ClearBGPalettes + call ClearTileMap + call UpdateSprites + call ClearSprites + ld a, [wPokedexStatus] + push af + ld a, [hSCX] + add POKEDEX_SCX + ld [hSCX], a + xor a + ld [wPokedexStatus], a + farcall _NewPokedexEntry + call WaitPressAorB_BlinkCursor + ld a, 1 ; page 2 + ld [wPokedexStatus], a + farcall DisplayDexEntry + call WaitPressAorB_BlinkCursor + pop af + ld [wPokedexStatus], a + call MaxVolume + call RotateThreePalettesRight + ld a, [hSCX] + add -POKEDEX_SCX + ld [hSCX], a + call .ReturnFromDexRegistration + pop af + ld [hMapAnims], a + ret +; fb8c8 + +.ReturnFromDexRegistration: ; fb8c8 + call ClearTileMap + call LoadFontsExtra + call LoadStandardFont + farcall Pokedex_PlaceFrontpicTopLeftCorner + call WaitBGMap2 + farcall GetEnemyMonDVs + ld a, [hli] + ld [wTempMonDVs], a + ld a, [hl] + ld [wTempMonDVs + 1], a + ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + call SetPalettes + ret +; fb8f1 diff --git a/engine/pokedex/newpokedexentry.asm b/engine/pokedex/newpokedexentry.asm deleted file mode 100644 index 365cf1b70..000000000 --- a/engine/pokedex/newpokedexentry.asm +++ /dev/null @@ -1,52 +0,0 @@ -NewPokedexEntry: ; fb877 - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a - call LowVolume - call ClearBGPalettes - call ClearTileMap - call UpdateSprites - call ClearSprites - ld a, [wPokedexStatus] - push af - ld a, [hSCX] - add POKEDEX_SCX - ld [hSCX], a - xor a - ld [wPokedexStatus], a - farcall _NewPokedexEntry - call WaitPressAorB_BlinkCursor - ld a, 1 ; page 2 - ld [wPokedexStatus], a - farcall DisplayDexEntry - call WaitPressAorB_BlinkCursor - pop af - ld [wPokedexStatus], a - call MaxVolume - call RotateThreePalettesRight - ld a, [hSCX] - add -POKEDEX_SCX - ld [hSCX], a - call .ReturnFromDexRegistration - pop af - ld [hMapAnims], a - ret -; fb8c8 - -.ReturnFromDexRegistration: ; fb8c8 - call ClearTileMap - call LoadFontsExtra - call LoadStandardFont - farcall Pokedex_PlaceFrontpicTopLeftCorner - call WaitBGMap2 - farcall GetEnemyMonDVs - ld a, [hli] - ld [wTempMonDVs], a - ld a, [hl] - ld [wTempMonDVs + 1], a - ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - call SetPalettes - ret -; fb8f1 diff --git a/engine/pokemon/bills_pc.asm b/engine/pokemon/bills_pc.asm new file mode 100644 index 000000000..96d6ac310 --- /dev/null +++ b/engine/pokemon/bills_pc.asm @@ -0,0 +1,2618 @@ +_DepositPKMN: ; e2391 (38:6391) + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [hMapAnims], a + call BillsPC_InitRAM + xor a + ld [wBillsPC_LoadedBox], a + call DelayFrame +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call .RunJumptable + call DelayFrame + jr .loop +.done + call ClearSprites + pop af + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret + +.RunJumptable: ; e23d5 (38:63d5) + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl + +.Jumptable: ; e23df (38:63df) + dw .Init + dw .HandleJoypad + dw .WhatsUp + dw .Submenu + dw BillsPC_EndJumptableLoop + +.Init: ; e23e9 (38:63e9) + xor a + ld [hBGMapMode], a + call ClearSprites + call CopyBoxmonSpecies + call BillsPC_BoxName + ld de, PCString_ChooseaPKMN + call BillsPC_PlaceString + ld a, $5 + ld [wBillsPC_NumMonsOnScreen], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $ff + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + call WaitBGMap + call BillsPC_UpdateSelectionCursor + call BillsPC_IncrementJumptableIndex + ret + +.HandleJoypad: ; e241a (38:641a) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and A_BUTTON + jr nz, .a_button + call Withdraw_UpDown + and a + ret z + call BillsPC_UpdateSelectionCursor + xor a + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + ret + +.a_button + call BillsPC_GetSelectedPokemonSpecies + and a + ret z + cp -1 + jr z, .b_button + ld a, $2 + ld [wJumptableIndex], a + ret +; e2452 (38:6452) + +.go_back + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button + ld a, $4 + ld [wJumptableIndex], a + ret + +.WhatsUp: ; e245d (38:645d) + xor a + ld [hBGMapMode], a + call ClearSprites + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ld a, $1 + ld [wMenuCursorY], a + call BillsPC_IncrementJumptableIndex + ret + +.Submenu: ; e247d (38:647d) + ld hl, BillsPCDepositMenuHeader + call CopyMenuHeader + ld a, [wMenuCursorY] + call StoreTo_wMenuCursorBuffer + call VerticalMenu + jp c, BillsPCDepositFuncCancel + ld a, [wMenuCursorY] + dec a + and %11 + ld e, a + ld d, 0 + ld hl, BillsPCDepositJumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +BillsPCDepositJumptable: ; e24a1 (38:64a1) + dw BillsPCDepositFuncDeposit ; Deposit Pokemon + dw BillsPCDepositFuncStats ; Pokemon Stats + dw BillsPCDepositFuncRelease ; Release Pokemon + dw BillsPCDepositFuncCancel ; Cancel + + +BillsPCDepositFuncDeposit: ; e24a9 (38:64a9) + call BillsPC_CheckMail_PreventBlackout + jp c, BillsPCDepositFuncCancel + call DepositPokemon + jr c, .box_full + ld a, $0 + ld [wJumptableIndex], a + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ret + +.box_full + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ret + +BillsPCDepositFuncStats: ; e24c8 (38:64c8) + call LoadStandardMenuHeader + call BillsPC_StatsScreen + call ExitMenu + call PCMonInfo + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ret + +BillsPCDepositFuncRelease: ; e24e0 (38:64e0) + call BillsPC_CheckMail_PreventBlackout + jr c, BillsPCDepositFuncCancel + call BillsPC_IsMonAnEgg + jr c, BillsPCDepositFuncCancel + ld a, [wMenuCursorY] + push af + ld de, PCString_ReleasePKMN + call BillsPC_PlaceString + call LoadStandardMenuHeader + lb bc, 14, 11 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call ExitMenu + and a + jr nz, .failed_release + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + call ReleasePKMN_ByePKMN + ld a, $0 + ld [wJumptableIndex], a + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + pop af + ret + +.failed_release + ld de, PCString_WhatsUp + call BillsPC_PlaceString + pop af + ld [wMenuCursorY], a + ret + +BillsPCDepositFuncCancel: ; e2537 (38:6537) + ld a, $0 + ld [wJumptableIndex], a + ret +; e253d (38:653d) + +BillsPCDepositMenuHeader: ; 0xe253d (38:653d) + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe2545 + +.MenuData: ; 0xe2545 (38:6545) + db STATICMENU_CURSOR ; flags + db 4 ; items + db "DEPOSIT@" + db "STATS@" + db "RELEASE@" + db "CANCEL@" +; 0xe2564 (38:6564) + +Unreferenced_BillsPCClearThreeBoxes: ; e2564 + hlcoord 0, 0 + ld b, 4 + ld c, 8 + call ClearBox + hlcoord 0, 4 + ld b, 10 + ld c, 9 + call ClearBox + hlcoord 0, 14 + ld b, 2 + ld c, 8 + call ClearBox + ret +; e2583 + +_WithdrawPKMN: ; e2583 (38:6583) + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [hMapAnims], a + call BillsPC_InitRAM + ld a, NUM_BOXES + 1 + ld [wBillsPC_LoadedBox], a + call DelayFrame +.loop + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call .RunJumptable + call DelayFrame + jr .loop +.done + call ClearSprites + pop af + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret + +.RunJumptable: ; e25c8 (38:65c8) + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl + +.Jumptable: ; e25d2 (38:65d2) + dw .Init + dw .Joypad + dw .PrepSubmenu + dw BillsPC_Withdraw + dw BillsPC_EndJumptableLoop + +.Init: ; e25dc (38:65dc) + ld a, NUM_BOXES + 1 + ld [wBillsPC_LoadedBox], a + xor a + ld [hBGMapMode], a + call ClearSprites + call CopyBoxmonSpecies + call BillsPC_BoxName + ld de, PCString_ChooseaPKMN + call BillsPC_PlaceString + ld a, $5 + ld [wBillsPC_NumMonsOnScreen], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $ff + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + call WaitBGMap + call BillsPC_UpdateSelectionCursor + call BillsPC_IncrementJumptableIndex + ret + +.Joypad: ; e2612 (38:6612) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and A_BUTTON + jr nz, .a_button + call Withdraw_UpDown + and a + ret z + call BillsPC_UpdateSelectionCursor + xor a + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + ret +.a_button + call BillsPC_GetSelectedPokemonSpecies + and a + ret z + cp -1 + jr z, .b_button + ld a, $2 + ld [wJumptableIndex], a + ret ; e264a (38:664a) + +.unused + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button + ld a, $4 + ld [wJumptableIndex], a + ret +; e2655 + +.PrepSubmenu: ; e2655 (38:6655) + xor a + ld [hBGMapMode], a + call ClearSprites + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ld a, $1 + ld [wMenuCursorY], a + call BillsPC_IncrementJumptableIndex + ret + +BillsPC_Withdraw: ; e2675 (38:6675) + ld hl, .MenuHeader + call CopyMenuHeader + ld a, [wMenuCursorY] + call StoreTo_wMenuCursorBuffer + call VerticalMenu + jp c, .cancel + ld a, [wMenuCursorY] + dec a + and %11 + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.dw ; e2699 (38:6699) #mark + dw .withdraw ; Withdraw + dw .stats ; Stats + dw .release ; Release + dw .cancel ; Cancel + + +.withdraw ; e26a1 (38:66a1) + call BillsPC_CheckMail_PreventBlackout + jp c, .cancel + call TryWithdrawPokemon + jr c, .FailedWithdraw + ld a, $0 + ld [wJumptableIndex], a + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ret +.FailedWithdraw: + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ret + +.stats ; e26c0 (38:66c0) + call LoadStandardMenuHeader + call BillsPC_StatsScreen + call ExitMenu + call PCMonInfo + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ret + +.release ; e26d8 (38:66d8) + ld a, [wMenuCursorY] + push af + call BillsPC_IsMonAnEgg + jr c, .FailedRelease + ld de, PCString_ReleasePKMN + call BillsPC_PlaceString + call LoadStandardMenuHeader + lb bc, 14, 11 + call PlaceYesNoBox + ld a, [wMenuCursorY] + dec a + call ExitMenu + and a + jr nz, .FailedRelease + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, REMOVE_BOX + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + call ReleasePKMN_ByePKMN + ld a, $0 + ld [wJumptableIndex], a + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + pop af + ret +.FailedRelease: + ld de, PCString_WhatsUp + call BillsPC_PlaceString + pop af + ld [wMenuCursorY], a + ret + +.cancel ; e272b (38:672b) + ld a, $0 + ld [wJumptableIndex], a + ret +; e2731 (38:6731) + +.MenuHeader: ; 0xe2731 + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe2739 + +.MenuData: ; 0xe2739 + db STATICMENU_CURSOR ; flags + db 4 ; items + db "WITHDRAW@" + db "STATS@" + db "RELEASE@" + db "CANCEL@" +; 0xe2759 + +_MovePKMNWithoutMail: ; e2759 + ld hl, wOptions + ld a, [hl] + push af + set 4, [hl] + ld a, [wVramState] + push af + xor a + ld [wVramState], a + ld a, [hInMenu] + push af + ld a, $1 + ld [hInMenu], a + xor a + ld [hMapAnims], a + call BillsPC_InitRAM + ld a, [wCurBox] + and $f + inc a + ld [wBillsPC_LoadedBox], a + call DelayFrame +.asm_e2781 + call JoyTextDelay + ld a, [wJumptableIndex] + bit 7, a + jr nz, .asm_e2793 + call .RunJumptable + call DelayFrame + jr .asm_e2781 + +.asm_e2793 + call ClearSprites + pop af + ld [hInMenu], a + pop af + ld [wVramState], a + pop af + ld [wOptions], a + ret +; e27a2 + +.RunJumptable: ; e27a2 + ld a, [wJumptableIndex] + ld hl, .Jumptable + call BillsPC_Jumptable + jp hl +; e27ac + +.Jumptable: ; e27ac + dw .Init + dw .Joypad + dw .PrepSubmenu + dw .MoveMonWOMailSubmenu + dw .PrepInsertCursor + dw .Joypad2 + dw BillsPC_EndJumptableLoop +; e27ba + +.Init: ; e27ba + xor a + ld [hBGMapMode], a + call ClearSprites + call CopyBoxmonSpecies + ld de, PCString_ChooseaPKMN + call BillsPC_PlaceString + ld a, 5 + ld [wBillsPC_NumMonsOnScreen], a + call BillsPC_RefreshTextboxes + call BillsPC_MoveMonWOMail_BoxNameAndArrows + call PCMonInfo + ld a, $ff + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + call WaitBGMap + call BillsPC_UpdateSelectionCursor + call BillsPC_IncrementJumptableIndex + ret +; e27eb + +.Joypad: ; e27eb + ld hl, hJoyPressed + ld a, [hl] + and B_BUTTON + jr nz, .b_button + ld a, [hl] + and A_BUTTON + jr nz, .a_button + call MoveMonWithoutMail_DPad + jr c, .d_pad + and a + ret z + call BillsPC_UpdateSelectionCursor + xor a + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + call PCMonInfo + ld a, $1 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + ret + +.d_pad + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ld a, $0 + ld [wJumptableIndex], a + ret + +.a_button + call BillsPC_GetSelectedPokemonSpecies + and a + ret z + cp -1 + jr z, .b_button + ld a, $2 + ld [wJumptableIndex], a + ret + +.unused + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button + ld a, $6 + ld [wJumptableIndex], a + ret +; e283d + +.PrepSubmenu: ; e283d + xor a + ld [hBGMapMode], a + call ClearSprites + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ld de, PCString_WhatsUp + call BillsPC_PlaceString + ld a, $1 + ld [wMenuCursorY], a + call BillsPC_IncrementJumptableIndex + ret +; e285d + +.MoveMonWOMailSubmenu: ; e285d + ld hl, .MenuHeader + call CopyMenuHeader + ld a, [wMenuCursorY] + call StoreTo_wMenuCursorBuffer + call VerticalMenu + jp c, .Cancel + ld a, [wMenuCursorY] + dec a + and %11 + ld e, a + ld d, 0 + ld hl, .Jumptable2 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; e2881 + +.Jumptable2: ; e2881 + dw .Move + dw .Stats + dw .Cancel +; e2887 + +.Move: ; e2887 + call BillsPC_CheckMail_PreventBlackout + jp c, .Cancel + ld a, [wBillsPC_ScrollPosition] + ld [wBillsPC_BackupScrollPosition], a + ld a, [wBillsPC_CursorPosition] + ld [wBillsPC_BackupCursorPosition], a + ld a, [wBillsPC_LoadedBox] + ld [wBillsPC_BackupLoadedBox], a + ld a, $4 + ld [wJumptableIndex], a + ret +; e28a5 + +.Stats: ; e28a5 + call LoadStandardMenuHeader + call BillsPC_StatsScreen + call ExitMenu + call PCMonInfo + call BillsPC_GetSelectedPokemonSpecies + ld [wCurPartySpecies], a + ld a, SCGB_BILLS_PC + call BillsPC_ApplyPalettes + ret +; e28bd + +.Cancel: ; e28bd + ld a, $0 + ld [wJumptableIndex], a + ret +; e28c3 + +.MenuHeader: ; 0xe28c3 + db MENU_BACKUP_TILES ; flags + menu_coords 9, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe28cb + +.MenuData: ; 0xe28cb + db STATICMENU_CURSOR ; flags + db 3 ; items + db "MOVE@" + db "STATS@" + db "CANCEL@" +; 0xe28df + +.PrepInsertCursor: ; e28df + xor a + ld [hBGMapMode], a + call CopyBoxmonSpecies + ld de, PCString_MoveToWhere + call BillsPC_PlaceString + ld a, $5 + ld [wBillsPC_NumMonsOnScreen], a + call BillsPC_RefreshTextboxes + call BillsPC_MoveMonWOMail_BoxNameAndArrows + call ClearSprites + call BillsPC_UpdateInsertCursor + call WaitBGMap + call BillsPC_IncrementJumptableIndex + ret +; e2903 + +.Joypad2: ; e2903 + ld hl, hJoyPressed + ld a, [hl] + and B_BUTTON + jr nz, .b_button_2 + ld a, [hl] + and A_BUTTON + jr nz, .a_button_2 + call MoveMonWithoutMail_DPad_2 + jr c, .dpad_2 + and a + ret z + call BillsPC_UpdateInsertCursor + xor a + ld [hBGMapMode], a + call BillsPC_RefreshTextboxes + ld a, $1 + ld [hBGMapMode], a + call DelayFrame + call DelayFrame + ret + +.dpad_2 + xor a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ld a, $4 + ld [wJumptableIndex], a + ret + +.a_button_2 + call BillsPC_CheckSpaceInDestination + jr c, .no_space + call MovePKMNWitoutMail_InsertMon + ld a, $0 + ld [wJumptableIndex], a + ret + +.no_space + ld hl, wJumptableIndex + dec [hl] + ret + +.b_button_2 + ld a, [wBillsPC_BackupScrollPosition] + ld [wBillsPC_ScrollPosition], a + ld a, [wBillsPC_BackupCursorPosition] + ld [wBillsPC_CursorPosition], a + ld a, [wBillsPC_BackupLoadedBox] + ld [wBillsPC_LoadedBox], a + ld a, $0 + ld [wJumptableIndex], a + ret +; e2963 + +BillsPC_InitRAM: ; e2963 (38:6963) + call ClearBGPalettes + call ClearSprites + call ClearTileMap + call BillsPC_InitGFX + ld hl, wBillsPCPokemonList + ld bc, $338 + xor a + call ByteFill + xor a + ld [wJumptableIndex], a + ld [wcf64], a + ld [wcf65], a + ld [wcf66], a + ld [wBillsPC_CursorPosition], a + ld [wBillsPC_ScrollPosition], a + ret + +BillsPC_IncrementJumptableIndex: ; e298d (38:698d) + ld hl, wJumptableIndex + inc [hl] + ret + +BillsPC_EndJumptableLoop: ; e2992 (38:6992) + ld hl, wJumptableIndex + set 7, [hl] + ret + +_StatsScreenDPad: ; e2998 (38:6998) + ld a, [wBillsPC_NumMonsOnScreen] + ld d, a + ld a, [wBillsPC_NumMonsInBox] + and a + jr z, .empty + dec a + cp $1 + jr z, .empty + ld e, a + ld a, [hl] + and D_UP + jr nz, BillsPC_PressUp + ld a, [hl] + and D_DOWN + jr nz, BillsPC_PressDown +.empty + jp BillsPC_JoypadDidNothing + +Withdraw_UpDown: ; e29b5 (38:69b5) + ld hl, hJoyLast + ld a, [wBillsPC_NumMonsOnScreen] + ld d, a + ld a, [wBillsPC_NumMonsInBox] + ld e, a + and a + jr z, .empty + ld a, [hl] + and D_UP + jr nz, BillsPC_PressUp + ld a, [hl] + and D_DOWN + jr nz, BillsPC_PressDown +.empty + jp BillsPC_JoypadDidNothing +; e29d0 (38:69d0) + +MoveMonWithoutMail_DPad: ; e29d0 + ld hl, hJoyLast + ld a, [wBillsPC_NumMonsOnScreen] + ld d, a + ld a, [wBillsPC_NumMonsInBox] + ld e, a + and a + jr z, .check_left_right + ld a, [hl] + and D_UP + jr nz, BillsPC_PressUp + ld a, [hl] + and D_DOWN + jr nz, BillsPC_PressDown + +.check_left_right + ld a, [hl] + and D_LEFT + jr nz, BillsPC_PressLeft + ld a, [hl] + and D_RIGHT + jr nz, BillsPC_PressRight + jr BillsPC_JoypadDidNothing + +MoveMonWithoutMail_DPad_2: ; e29f4 + ld hl, hJoyLast + ld a, [wBillsPC_NumMonsOnScreen] + ld d, a + ld a, [wBillsPC_NumMonsInBox] + ld e, a + and a + jr z, .check_left_right + + ld a, [hl] + and D_UP + jr nz, BillsPC_PressUp + ld a, [hl] + and D_DOWN + jr nz, BillsPC_PressDown + +.check_left_right + ld a, [hl] + and D_LEFT + jr nz, BillsPC_PressLeft + ld a, [hl] + and D_RIGHT + jr nz, BillsPC_PressRight + jr BillsPC_JoypadDidNothing + +BillsPC_PressUp: ; e2a18 (38:6a18) + ld hl, wBillsPC_CursorPosition + ld a, [hl] + and a + jr z, .top + dec [hl] + jr BillsPC_UpDownDidSomething + +.top + ld hl, wBillsPC_ScrollPosition + ld a, [hl] + and a + jr z, BillsPC_JoypadDidNothing + dec [hl] + jr BillsPC_UpDownDidSomething + +BillsPC_PressDown: ; e2a2c (38:6a2c) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + inc a + cp e + jr nc, BillsPC_JoypadDidNothing + + ld hl, wBillsPC_CursorPosition + ld a, [hl] + inc a + cp d + jr nc, .not_bottom + inc [hl] + jr BillsPC_UpDownDidSomething + +.not_bottom + ld hl, wBillsPC_ScrollPosition + inc [hl] + jr BillsPC_UpDownDidSomething +; e2a48 (38:6a48) + +BillsPC_PressLeft: ; e2a48 + ld hl, wBillsPC_LoadedBox + ld a, [hl] + and a + jr z, .wrap_around + dec [hl] + jr BillsPC_LeftRightDidSomething + +.wrap_around + ld [hl], NUM_BOXES + jr BillsPC_LeftRightDidSomething + +BillsPC_PressRight: ; e2a56 + ld hl, wBillsPC_LoadedBox + ld a, [hl] + cp NUM_BOXES + jr z, .wrap_around + inc [hl] + jr BillsPC_LeftRightDidSomething + +.wrap_around + ld [hl], 0 + jr BillsPC_LeftRightDidSomething + +BillsPC_JoypadDidNothing: ; e2a65 (38:6a65) + xor a + and a + ret + +BillsPC_UpDownDidSomething: ; e2a68 (38:6a68) + ld a, TRUE + and a + ret +; e2a6c (38:6a6c) + +BillsPC_LeftRightDidSomething: ; e2a6c + scf + ret +; e2a6e + +BillsPC_PlaceString: ; e2a6e (38:6a6e) + push de + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + pop de + hlcoord 1, 16 + call PlaceString + ret +; e2a80 (38:6a80) + +BillsPC_MoveMonWOMail_BoxNameAndArrows: ; e2a80 + call BillsPC_BoxName + hlcoord 8, 1 + ld [hl], $5f + hlcoord 19, 1 + ld [hl], $5e + ret +; e2a8e + +BillsPC_BoxName: ; e2a8e (38:6a8e) + hlcoord 8, 0 + lb bc, 1, 10 + call TextBox + + ld a, [wBillsPC_LoadedBox] + and a + jr z, .party + + cp NUM_BOXES + 1 + jr nz, .gotbox + + ld a, [wCurBox] + inc a +.gotbox + dec a + ld hl, wBoxNames + ld bc, BOX_NAME_LENGTH + call AddNTimes + ld e, l + ld d, h + jr .print + +.party + ld de, .PartyPKMN +.print + hlcoord 10, 1 + call PlaceString + ret +; e2abd (38:6abd) + +.PartyPKMN: + db "PARTY @" +; e2ac6 + +PCMonInfo: ; e2ac6 (38:6ac6) +; Display a monster's pic and +; attributes when highlighting +; it in a PC menu. + +; Includes the neat cascading +; effect when showing the pic. + +; Example: Species, level, gender, +; whether it's holding an item. + + hlcoord 0, 0 + lb bc, 15, 8 + call ClearBox + + hlcoord 8, 14 + lb bc, 1, 3 + call ClearBox + + call BillsPC_GetSelectedPokemonSpecies + and a + ret z + cp -1 + ret z + + ld [wd265], a + hlcoord 1, 4 + xor a + ld b, 7 +.row + ld c, 7 + push af + push hl +.col + ld [hli], a + add 7 + dec c + jr nz, .col + pop hl + ld de, SCREEN_WIDTH + add hl, de + pop af + inc a + dec b + jr nz, .row + + call BillsPC_LoadMonStats + ld a, [wd265] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + ld hl, wTempMonDVs + predef GetUnownLetter + call GetBaseData + ld de, vTiles2 tile $00 + predef GetMonFrontpic + xor a + ld [wBillsPC_MonHasMail], a + ld a, [wCurPartySpecies] + ld [wd265], a + cp EGG + ret z + + call GetBasePokemonName + hlcoord 1, 14 + call PlaceString + + hlcoord 1, 12 + call PrintLevel + + ld a, $3 + ld [wMonType], a + farcall GetGender + jr c, .skip_gender + ld a, "♂" + jr nz, .printgender + ld a, "♀" +.printgender + hlcoord 5, 12 + ld [hl], a +.skip_gender + + ld a, [wTempMonItem] + and a + ret z + + ld d, a + callfar ItemIsMail + jr c, .mail + ld a, $5d ; item icon + jr .printitem +.mail + ld a, $1 + ld [wBillsPC_MonHasMail], a + ld a, $5c ; mail icon +.printitem + hlcoord 7, 12 + ld [hl], a + ret + +BillsPC_LoadMonStats: ; e2b6d (38:6b6d) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld e, a + ld d, $0 + ld hl, wBillsPCPokemonList + 1 ; box number + add hl, de + add hl, de + add hl, de + ld a, [hl] + and a + jr z, .party + cp NUM_BOXES + 1 + jr z, .sBox + ld b, a + call GetBoxPointer + ld a, b + call GetSRAMBank + push hl + ld bc, sBoxMon1Level - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonLevel], a + pop hl + push hl + ld bc, sBoxMon1Item - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonItem], a + pop hl + ld bc, sBoxMon1DVs - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld de, wTempMonDVs + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + call CloseSRAM + ret + +.party + ld hl, wPartyMon1Level + ld bc, PARTYMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonLevel], a + ld hl, wPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonItem], a + ld hl, wPartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld de, wTempMonDVs + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + ret + +.sBox + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxMon1Level + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonLevel], a + + ld hl, sBoxMon1Item + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + ld [wTempMonItem], a + + ld hl, sBoxMon1DVs + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld de, wTempMonDVs + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + ld [de], a + + call CloseSRAM + ret + +BillsPC_RefreshTextboxes: ; e2c2c (38:6c2c) + hlcoord 8, 2 + lb bc, 10, 10 + call TextBox + + hlcoord 8, 2 + ld [hl], "└" + hlcoord 19, 2 + ld [hl], "┘" + + ld a, [wBillsPC_ScrollPosition] + ld e, a + ld d, 0 + ld hl, wBillsPCPokemonList + add hl, de + add hl, de + add hl, de + ld e, l + ld d, h + hlcoord 9, 4 + ld a, [wBillsPC_NumMonsOnScreen] +.loop + push af + push de + push hl + call .PlaceNickname + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop de + inc de + inc de + inc de + pop af + dec a + jr nz, .loop + ret +; e2c67 (38:6c67) + +.CancelString: + db "CANCEL@" +; e2c6e + +.PlaceNickname: ; e2c6e (38:6c6e) + ld a, [de] + and a + ret z + cp -1 + jr nz, .get_nickname + ld de, .CancelString + call PlaceString + ret + +.get_nickname + inc de + ld a, [de] + ld b, a + inc de + ld a, [de] + ld e, a + ld a, b + and a + jr z, .party + cp NUM_BOXES + 1 + jr z, .sBox + push hl + call GetBoxPointer + ld a, b + call GetSRAMBank + push hl + ld bc, sBoxMons - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + ld a, e + call AddNTimes + ld a, [hl] + pop hl + and a + jr z, .boxfail + ld bc, sBoxMonNicknames - sBox + add hl, bc + ld bc, MON_NAME_LENGTH + ld a, e + call AddNTimes + ld de, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + pop hl + ld de, wStringBuffer1 + call PlaceString + ret + +.boxfail + call CloseSRAM + pop hl + jr .placeholder_string + +.party + push hl + ld hl, wPartySpecies + ld d, $0 + add hl, de + ld a, [hl] + and a + jr z, .partyfail + ld hl, wPartyMonNicknames + ld bc, MON_NAME_LENGTH + ld a, e + call AddNTimes + ld de, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + pop hl + ld de, wStringBuffer1 + call PlaceString + ret + +.partyfail + pop hl + jr .placeholder_string + +.sBox + push hl + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + ld d, $0 + add hl, de + ld a, [hl] + and a + jr z, .sBoxFail + ld hl, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + ld a, e + call AddNTimes + ld de, wStringBuffer1 + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + pop hl + ld de, wStringBuffer1 + call PlaceString + ret + +.sBoxFail + call CloseSRAM + pop hl +.placeholder_string + ld de, .Placeholder + call PlaceString + ret +; e2d2a (38:6d2a) + +.Placeholder: + db "-----@" +; e2d30 + +copy_box_data: MACRO +.loop\@ + ld a, [hl] + cp -1 + jr z, .done\@ + and a + jr z, .done\@ + ld [de], a + inc de + ld a, [wBillsPC_LoadedBox] + ld [de], a + inc de + ld a, [wd003] + ld [de], a + inc a + ld [wd003], a + inc de + inc hl + ld a, [wd004] + inc a + ld [wd004], a + jr .loop\@ + +.done\@ +if \1 + call CloseSRAM +endc + ld a, -1 + ld [de], a + ld a, [wd004] + inc a + ld [wBillsPC_NumMonsInBox], a +ENDM + +CopyBoxmonSpecies: ; e2d30 (38:6d30) + xor a + ld hl, wBillsPCPokemonList + ld bc, 3 * 30 + call ByteFill + ld de, wBillsPCPokemonList + xor a + ld [wd003], a + ld [wd004], a + ld a, [wBillsPC_LoadedBox] + and a + jr z, .party + cp NUM_BOXES + 1 + jr z, .sBox + ld b, a + call GetBoxPointer + ld a, b + call GetSRAMBank + inc hl + copy_box_data 1 + ret + +.party + ld hl, wPartySpecies + copy_box_data 0 + ret + +.sBox + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + copy_box_data 1 + ret + +BillsPC_GetSelectedPokemonSpecies: ; e2def (38:6def) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld e, a + ld d, $0 + ld hl, wBillsPCPokemonList + add hl, de + add hl, de + add hl, de + ld a, [hl] + ret + +BillsPC_UpdateSelectionCursor: ; e2e01 (38:6e01) + ld a, [wBillsPC_NumMonsInBox] + and a + jr nz, .place_cursor + call ClearSprites + ret + +.place_cursor + ld hl, .OAM + ld de, wVirtualOAMSprite00 +.loop + ld a, [hl] + cp -1 + ret z + ld a, [wBillsPC_CursorPosition] + and $7 + swap a + add [hl] + inc hl + ld [de], a ; y + inc de +rept SPRITEOAMSTRUCT_LENGTH + -1 + ld a, [hli] + ld [de], a + inc de +endr + jr .loop +; e2e2b (38:6e2b) + +.OAM: ; e2e2b + dsprite 4, 6, 10, 0, $00, 0 + dsprite 4, 6, 11, 0, $00, 0 + dsprite 4, 6, 12, 0, $00, 0 + dsprite 4, 6, 13, 0, $00, 0 + dsprite 4, 6, 14, 0, $00, 0 + dsprite 4, 6, 15, 0, $00, 0 + dsprite 4, 6, 16, 0, $00, 0 + dsprite 4, 6, 17, 0, $00, 0 + dsprite 4, 6, 18, 0, $00, 0 + dsprite 4, 6, 18, 7, $00, 0 + dsprite 7, 1, 10, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 11, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 12, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 13, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 14, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 15, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 16, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 17, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 18, 0, $00, 0 | Y_FLIP + dsprite 7, 1, 18, 7, $00, 0 | Y_FLIP + dsprite 5, 6, 9, 6, $01, 0 + dsprite 6, 1, 9, 6, $01, 0 | Y_FLIP + dsprite 5, 6, 19, 1, $01, 0 | X_FLIP + dsprite 6, 1, 19, 1, $01, 0 | X_FLIP | Y_FLIP + db -1 +; e2e8c + +BillsPC_UpdateInsertCursor: ; e2e8c + ld hl, .OAM + ld de, wVirtualOAMSprite00 +.loop + ld a, [hl] + cp -1 + ret z + ld a, [wBillsPC_CursorPosition] + and $7 + swap a + add [hl] + inc hl + ld [de], a ; y + inc de +rept SPRITEOAMSTRUCT_LENGTH + -1 + ld a, [hli] + ld [de], a + inc de +endr + jr .loop +; e2eac + +.OAM: ; e2eac + dsprite 4, 7, 10, 0, $06, 0 + dsprite 5, 3, 11, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 12, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 13, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 14, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 15, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 16, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 17, 0, $00, 0 | Y_FLIP + dsprite 5, 3, 18, 0, $00, 0 | Y_FLIP + dsprite 4, 7, 19, 0, $07, 0 + db -1 +; e2ed5 + +Unreferenced_BillsPC_FillBox: ; e2ed5 +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; e2ee5 + +BillsPC_CheckSpaceInDestination: ; e2ee5 +; If moving within a box, no need to be here. + ld hl, wBillsPC_LoadedBox + ld a, [wBillsPC_BackupLoadedBox] + cp [hl] + jr z, .same_box + +; Exceeding box or party capacity is a big no-no. + ld a, [wBillsPC_LoadedBox] + and a + jr z, .party + ld e, MONS_PER_BOX + 1 + jr .compare + +.party + ld e, PARTY_LENGTH + 1 +.compare + ld a, [wBillsPC_NumMonsInBox] + cp e + jr nc, .no_room +.same_box + and a + ret + +.no_room + ld de, PCString_TheresNoRoom + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret +; e2f18 + +BillsPC_CheckMail_PreventBlackout: ; e2f18 (38:6f18) + ld a, [wBillsPC_LoadedBox] + and a + jr nz, .Okay + ld a, [wBillsPC_NumMonsInBox] + cp $3 + jr c, .ItsYourLastPokemon + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + farcall CheckCurPartyMonFainted + jr c, .AllOthersFainted + ld a, [wBillsPC_MonHasMail] + and a + jr nz, .HasMail +.Okay: + and a + ret + +.HasMail: + ld de, PCString_RemoveMail + jr .NotOkay + +.AllOthersFainted: + ld de, PCString_NoMoreUsablePKMN + jr .NotOkay + +.ItsYourLastPokemon: + ld de, PCString_ItsYourLastPKMN +.NotOkay: + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret + +BillsPC_IsMonAnEgg: ; e2f5f (38:6f5f) + ld a, [wCurPartySpecies] + cp EGG + jr z, .egg + and a + ret + +.egg + ld de, PCString_NoReleasingEGGS + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret + +BillsPC_StatsScreen: ; e2f7e (38:6f7e) + call LowVolume + call BillsPC_CopyMon + ld a, $3 + ld [wMonType], a + predef StatsScreenInit + call BillsPC_InitGFX + call MaxVolume + ret + +StatsScreenDPad: ; e2f95 (38:6f95) + ld hl, hJoyPressed ; $ffa7 + ld a, [hl] + and A_BUTTON | B_BUTTON | D_RIGHT | D_LEFT + ld [wMenuJoypad], a + jr nz, .pressed_a_b_right_left + ld a, [hl] + and D_DOWN | D_UP + ld [wMenuJoypad], a + jr nz, .pressed_down_up + jr .pressed_a_b_right_left + +.pressed_down_up + call _StatsScreenDPad + and a + jr z, .did_nothing + call BillsPC_GetSelectedPokemonSpecies + ld [wd265], a + call BillsPC_LoadMonStats + ld a, [wd265] + ld [wCurPartySpecies], a + ld [wCurSpecies], a + ld hl, wTempMonDVs + predef GetUnownLetter + call GetBaseData + call BillsPC_CopyMon +.pressed_a_b_right_left + ret + +.did_nothing + xor a + ld [wMenuJoypad], a + ret + +BillsPC_CopyMon: ; e2fd6 (38:6fd6) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, [wBillsPC_LoadedBox] + and a + jr z, .party + cp NUM_BOXES + 1 + jr nz, .box + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + call CopySpeciesToTemp + ld hl, sBoxMonNicknames + call CopyNicknameToTemp + ld hl, sBoxMonOT + call CopyOTNameToTemp + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + call CloseSRAM + farcall CalcBufferMonStats + ret + +.party + ld hl, wPartySpecies + call CopySpeciesToTemp + ld hl, wPartyMonNicknames + call CopyNicknameToTemp + ld hl, wPartyMonOT + call CopyOTNameToTemp + ld hl, wPartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ret + +.box + ld b, a + call GetBoxPointer + ld a, b + call GetSRAMBank + push hl + inc hl + call CopySpeciesToTemp + pop hl + push hl + ld bc, sBoxMonNicknames - sBox + add hl, bc + call CopyNicknameToTemp + pop hl + push hl + ld bc, sBoxMonOT - sBox + add hl, bc + call CopyOTNameToTemp + pop hl + ld bc, sBoxMons - sBox + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call CopyMonToTemp + call CloseSRAM + farcall CalcBufferMonStats + ret + +DepositPokemon: ; e307c (38:707c) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld hl, wPartyMonNicknames + ld a, [wCurPartyMon] + call GetNick + ld a, PC_DEPOSIT + ld [wPokemonWithdrawDepositParameter], a + predef SendGetMonIntoFromBox + jr c, .asm_boxisfull + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ld a, [wCurPartySpecies] + call PlayMonCry + hlcoord 0, 0 + lb bc, 15, 8 + call ClearBox + hlcoord 8, 14 + lb bc, 1, 3 + call ClearBox + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + call WaitBGMap + hlcoord 1, 16 + ld de, PCString_Stored + call PlaceString + ld l, c + ld h, b + ld de, wStringBuffer1 + call PlaceString + ld a, "!" + ld [bc], a + ld c, 50 + call DelayFrames + and a + ret + +.asm_boxisfull + ld de, PCString_BoxFull + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret + +TryWithdrawPokemon: ; e30fa (38:70fa) + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + ld a, [wCurPartyMon] + ld hl, sBoxMonNicknames + call GetNick + call CloseSRAM + xor a + ld [wPokemonWithdrawDepositParameter], a + predef SendGetMonIntoFromBox + jr c, .PartyFull + ld a, REMOVE_BOX + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ld a, [wCurPartySpecies] + call PlayMonCry + hlcoord 0, 0 + lb bc, 15, 8 + call ClearBox + hlcoord 8, 14 + lb bc, 1, 3 + call ClearBox + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + call WaitBGMap + hlcoord 1, 16 + ld de, PCString_Got + call PlaceString + ld l, c + ld h, b + ld de, wStringBuffer1 + call PlaceString + ld a, $e7 + ld [bc], a + ld c, 50 + call DelayFrames + and a + ret + +.PartyFull: + ld de, PCString_PartyFull + call BillsPC_PlaceString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + scf + ret + + +ReleasePKMN_ByePKMN: ; e3180 (38:7180) + hlcoord 0, 0 + lb bc, 15, 8 + call ClearBox + hlcoord 8, 14 + lb bc, 1, 3 + call ClearBox + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + + call WaitBGMap + ld a, [wCurPartySpecies] + call GetCryIndex + jr c, .skip_cry + ld e, c + ld d, b + call PlayCry +.skip_cry + + ld a, [wCurPartySpecies] + ld [wd265], a + call GetPokemonName + hlcoord 1, 16 + ld de, PCString_ReleasedPKMN + call PlaceString + ld c, 80 + call DelayFrames + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + hlcoord 1, 16 + ld de, PCString_Bye + call PlaceString + ld l, c + ld h, b + inc hl + ld de, wStringBuffer1 + call PlaceString + ld l, c + ld h, b + ld [hl], $e7 + ld c, 50 + call DelayFrames + ret +; e31e7 (38:71e7) + +MovePKMNWitoutMail_InsertMon: ; e31e7 + push hl + push de + push bc + push af + hlcoord 0, 15 + lb bc, 1, 18 + call TextBox + hlcoord 1, 16 + ld de, .Saving_LeaveOn + call PlaceString + ld c, 20 + call DelayFrames + pop af + pop bc + pop de + pop hl + ld a, [wCurBox] + push af + ld bc, 0 + ld a, [wBillsPC_BackupLoadedBox] + and a + jr nz, .moving_from_box + set 0, c + +.moving_from_box + ld a, [wBillsPC_LoadedBox] + and a + jr nz, .moving_to_box + set 1, c + +.moving_to_box + ld hl, .Jumptable + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .dw_return + push de + jp hl +; e322a + +.dw_return ; e322a + pop af + ld e, a + farcall MoveMonWOMail_InsertMon_SaveGame + ret +; e3233 + +.Saving_LeaveOn: + db "Saving… Leave ON!@" +; e3245 + +.Jumptable: ; e3245 + dw .BoxToBox + dw .PartyToBox + dw .BoxToParty + dw .PartyToParty +; e324d + +.BoxToBox: ; e324d + ld hl, wBillsPC_BackupLoadedBox + ld a, [wBillsPC_LoadedBox] + cp [hl] + jr z, .same_box + call .CopyFromBox + call .CopyToBox + ret + +.same_box + call .CopyFromBox + call .CheckTrivialMove + call .CopyToBox + ret +; e3267 + +.PartyToBox: ; e3267 + call .CopyFromParty + ld a, $1 + ld [wGameLogicPaused], a + farcall SaveGameData + xor a + ld [wGameLogicPaused], a + call .CopyToBox + ret +; e327d + +.BoxToParty: ; e327d + call .CopyFromBox + call .CopyToParty + ret +; e3284 + +.PartyToParty: ; e3284 + call .CopyFromParty + call .CheckTrivialMove + call .CopyToParty + ret +; e328e + +.CheckTrivialMove: ; e328e + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld e, a + ld a, [wBillsPC_BackupCursorPosition] + ld hl, wBillsPC_BackupScrollPosition + add [hl] + cp e + ret nc + ld hl, wBillsPC_CursorPosition + ld a, [hl] + and a + jr z, .top_of_screen + dec [hl] + ret + +.top_of_screen + ld hl, wBillsPC_ScrollPosition + ld a, [hl] + and a + ret z + dec [hl] + ret +; e32b0 + +.CopyFromBox: ; e32b0 + ld a, [wBillsPC_BackupLoadedBox] + dec a + ld e, a + farcall MoveMonWOMail_SaveGame + ld a, [wBillsPC_BackupCursorPosition] + ld hl, wBillsPC_BackupScrollPosition + add [hl] + ld [wCurPartyMon], a + ld a, BANK(sBox) + call GetSRAMBank + ld hl, sBoxSpecies + call CopySpeciesToTemp + ld hl, sBoxMonNicknames + call CopyNicknameToTemp + ld hl, sBoxMonOT + call CopyOTNameToTemp + ld hl, sBoxMons + ld bc, BOXMON_STRUCT_LENGTH + call CopyMonToTemp + call CloseSRAM + farcall CalcBufferMonStats + ld a, REMOVE_BOX + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ret +; e32fa + +.CopyToBox: ; e32fa + ld a, [wBillsPC_LoadedBox] + dec a + ld e, a + farcall MoveMonWOMail_SaveGame + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + farcall InsertPokemonIntoBox + ret +; e3316 + +.CopyFromParty: ; e3316 + ld a, [wBillsPC_BackupCursorPosition] + ld hl, wBillsPC_BackupScrollPosition + add [hl] + ld [wCurPartyMon], a + ld hl, wPartySpecies + call CopySpeciesToTemp + ld hl, wPartyMonNicknames + call CopyNicknameToTemp + ld hl, wPartyMonOT + call CopyOTNameToTemp + ld hl, wPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call CopyMonToTemp + xor a ; REMOVE_PARTY + ld [wPokemonWithdrawDepositParameter], a + farcall RemoveMonFromPartyOrBox + ret +; e3346 + +.CopyToParty: ; e3346 + ld a, [wBillsPC_CursorPosition] + ld hl, wBillsPC_ScrollPosition + add [hl] + ld [wCurPartyMon], a + farcall InsertPokemonIntoParty + ret +; e3357 + +CopySpeciesToTemp: ; e3357 (38:7357) + ld a, [wCurPartyMon] + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + ld [wCurPartySpecies], a + ret + +CopyNicknameToTemp: ; e3363 (38:7363) + ld bc, MON_NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMonNick + ld bc, MON_NAME_LENGTH + call CopyBytes + ret + +CopyOTNameToTemp: ; e3376 (38:7376) + ld bc, NAME_LENGTH + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMonOT + ld bc, NAME_LENGTH + call CopyBytes + ret + +CopyMonToTemp: ; e3389 (38:7389) + ld a, [wCurPartyMon] + call AddNTimes + ld de, wBufferMon + call CopyBytes + ret + +GetBoxPointer: ; e3396 (38:7396) + dec b + ld c, b + ld b, 0 + ld hl, .boxes + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a + ret +; e33a6 (38:73a6) + +.boxes ; e33a6 + ; bank, address + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 +; e33d0 + +BillsPC_ApplyPalettes: ; e33d0 (38:73d0) + ld b, a + call GetSGBLayout + ld a, %11100100 + call DmgToCgbBGPals + ld a, %11111100 + call DmgToCgbObjPal0 + ret + +BillsPC_Jumptable: ; e33df (38:73df) + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +BillsPC_InitGFX: ; e33e8 (38:73e8) + call DisableLCD + ld hl, vTiles2 tile $00 + ld bc, $31 tiles + xor a + call ByteFill + call LoadStandardFont + call LoadFontsBattleExtra + ld hl, PCMailGFX + ld de, vTiles2 tile $5c + ld bc, 4 tiles + call CopyBytes + ld hl, PCSelectLZ + ld de, vTiles0 tile $00 + call Decompress + ld a, 6 + call SkipMusic + call EnableLCD + ret +; e3419 (38:7419) + +PCSelectLZ: INCBIN "gfx/pc/pc.2bpp.lz" +PCMailGFX: INCBIN "gfx/pc/pc_mail.2bpp" +; e34dd + +PCString_ChooseaPKMN: db "Choose a .@" +PCString_WhatsUp: db "What's up?@" +PCString_ReleasePKMN: db "Release ?@" +PCString_MoveToWhere: db "Move to where?@" +PCString_ItsYourLastPKMN: db "It's your last !@" +PCString_TheresNoRoom: db "There's no room!@" +PCString_NoMoreUsablePKMN: db "No more usable !@" +PCString_RemoveMail: db "Remove MAIL.@" +PCString_ReleasedPKMN: db "Released .@" +PCString_Bye: db "Bye,@" +PCString_Stored: db "Stored @" +PCString_Got: db "Got @" +PCString_Non: db "Non.@" +PCString_BoxFull: db "The BOX is full.@" +PCString_PartyFull: db "The party's full!@" +PCString_NoReleasingEGGS: db "No releasing EGGS!@" +; e35aa + + +_ChangeBox: ; e35aa (38:75aa) + call LoadStandardMenuHeader + call BillsPC_ClearTilemap +.loop + xor a + ld [hBGMapMode], a + call BillsPC_PrintBoxName + call BillsPC_PlaceChooseABoxString + ld hl, _ChangeBox_MenuHeader + call CopyMenuHeader + xor a + ld [wMenuScrollPosition], a + hlcoord 0, 4 + lb bc, 8, 9 + call TextBox + call ScrollingMenu + ld a, [wMenuJoypad] + cp B_BUTTON + jr z, .done + call BillsPC_PlaceWhatsUpString + call BillsPC_ChangeBoxSubmenu + jr .loop +.done + call CloseWindow + ret + +BillsPC_ClearTilemap: ; e35e2 (38:75e2) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, " " + call ByteFill + ret +; e35f1 (38:75f1) + +_ChangeBox_MenuHeader: ; 0xe35f1 + db MENU_BACKUP_TILES ; flags + menu_coords 1, 5, 9, 12 + dw .MenuData + db 1 ; default option +; 0xe35f9 + +.MenuData ; 0xe35f9 + db MENU_UNUSED_1 | MENU_UNUSED_3 ; flags + db 4, 0 + db 1 + dba .boxes + dba .boxnames + dba NULL + dba BillsPC_PrintBoxCountAndCapacity +; e3609 + +.boxes ; e3609 + db NUM_BOXES +x = 1 +rept NUM_BOXES + db x +x = x + 1 +endr + db -1 +; e3619 + +.boxnames ; e3619 + push de + ld a, [wMenuSelection] + dec a + call GetBoxName + pop hl + call PlaceString + ret +; e3626 + +GetBoxName: ; e3626 (38:7626) + ld bc, BOX_NAME_LENGTH + ld hl, wBoxNames + call AddNTimes + ld d, h + ld e, l + ret +; e3632 (38:7632) + +BillsPC_PrintBoxCountAndCapacity: ; e3632 + hlcoord 11, 7 + lb bc, 5, 7 + call TextBox + ld a, [wMenuSelection] + cp -1 + ret z + hlcoord 12, 9 + ld de, .Pokemon + call PlaceString + call GetBoxCount + ld [wd265], a + hlcoord 13, 11 + ld de, wd265 + lb bc, 1, 2 + call PrintNum + ld de, .out_of_20 + call PlaceString + ret +; e3663 + +.Pokemon: ; e3663 + db "#MON@" +; e3668 + +.out_of_20 ; e3668 + ; db "/20@" + db "/" + db "0" + MONS_PER_BOX / 10 ; "2" + db "0" + MONS_PER_BOX % 10 ; "0" + db "@" +; e366c + +GetBoxCount: ; e366c (38:766c) + ld a, [wCurBox] + ld c, a + ld a, [wMenuSelection] + dec a + cp c + jr z, .activebox + ld c, a + ld b, 0 + ld hl, .boxbanks + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + ld b, a + call GetSRAMBank + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hl] + call CloseSRAM + ld c, a + ld a, [wSavedAtLeastOnce] + and a + jr z, .newfile + ld a, c + ret + +.newfile + xor a + ret + +.activebox + ld a, BANK(sBoxCount) + ld b, a + call GetSRAMBank + ld hl, sBoxCount + ld a, [hl] + call CloseSRAM + ret +; e36a5 (38:76a5) + +.boxbanks ; e36a5 + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 +; e36cf + +BillsPC_PrintBoxName: ; e36cf (38:76cf) + hlcoord 0, 0 + ld b, 2 + ld c, 18 + call TextBox + hlcoord 1, 2 + ld de, .Current + call PlaceString + ld a, [wCurBox] + and $f + call GetBoxName + hlcoord 11, 2 + call PlaceString + ret +; e36f1 (38:76f1) + +.Current: ; e36f1 + db "CURRENT@" +; e36f9 + +BillsPC_ChangeBoxSubmenu: ; e36f9 (38:76f9) + ld hl, .MenuHeader + call LoadMenuHeader + call VerticalMenu + call ExitMenu + ret c + ld a, [wMenuCursorY] + cp $1 + jr z, .Switch + cp $2 + jr z, .Name + cp $3 + jr z, .Print + and a + ret + +.Print: + call GetBoxCount + and a + jr z, .EmptyBox + ld e, l + ld d, h + ld a, [wMenuSelection] + dec a + ld c, a + farcall PrintPCBox + call BillsPC_ClearTilemap + and a + ret + +.EmptyBox: + call BillsPC_PlaceEmptyBoxString_SFX + and a + ret + +.Switch: + ld a, [wMenuSelection] + dec a + ld e, a + ld a, [wCurBox] + cp e + ret z + farcall ChangeBoxSaveGame + ret + +.Name: + ld b, $4 ; box + ld de, wd002 + farcall NamingScreen + call ClearTileMap + call LoadStandardFont + call LoadFontsBattleExtra + ld a, [wMenuSelection] + dec a + call GetBoxName + ld e, l + ld d, h + ld hl, wd002 + ld c, BOX_NAME_LENGTH - 1 + call InitString + ld a, [wMenuSelection] + dec a + call GetBoxName + ld de, wd002 + call CopyName2 + ret +; e3778 (38:7778) + + hlcoord 11, 7 ; unused + +.MenuHeader: ; 0xe377b + db MENU_BACKUP_TILES ; flags + menu_coords 11, 4, SCREEN_WIDTH - 1, 13 + dw .MenuData + db 1 ; default option +; 0xe3783 + +.MenuData: ; 0xe3783 + db STATICMENU_CURSOR ; flags + db 4 ; items + db "SWITCH@" + db "NAME@" + db "PRINT@" + db "QUIT@" +; 0xe379c + +BillsPC_PlaceChooseABoxString: ; e379c (38:779c) + ld de, .ChooseABox + jr BillsPC_PlaceChangeBoxString +; e37a1 (38:77a1) + +.ChooseABox: ; e37a1 + db "Choose a BOX.@" +; e37af + +BillsPC_PlaceWhatsUpString: ; e37af (38:77af) + ld de, .WhatsUp + jr BillsPC_PlaceChangeBoxString +; e37b4 (38:77b4) + +.WhatsUp: ; e37b4 + db "What's up?@" +; e37be + +BillsPC_PlaceEmptyBoxString_SFX: ; e37be (38:77be) + ld de, .NoMonString + call BillsPC_PlaceChangeBoxString + ld de, SFX_WRONG + call WaitPlaySFX + call WaitSFX + ld c, 50 + call DelayFrames + ret +; e37d3 (38:77d3) + +.NoMonString: ; e37d3 + db "There's no #MON.@" +; e37e3 + +BillsPC_PlaceChangeBoxString: ; e37e3 (38:77e3) + push de + hlcoord 0, 14 + lb bc, 2, 18 + call TextBox + pop de + hlcoord 1, 16 + call PlaceString + ld a, $1 + ld [hBGMapMode], a + ret diff --git a/engine/pokemon/bills_pc_top.asm b/engine/pokemon/bills_pc_top.asm new file mode 100644 index 000000000..1e808c02c --- /dev/null +++ b/engine/pokemon/bills_pc_top.asm @@ -0,0 +1,387 @@ +_BillsPC: ; e3fd + call .CheckCanUsePC + ret c + call .LogIn + call .UseBillsPC + jp .LogOut + +.CheckCanUsePC: ; e40a (3:640a) + ld a, [wPartyCount] + and a + ret nz + ld hl, .Text_GottaHavePokemon + call MenuTextBoxBackup + scf + ret + +.Text_GottaHavePokemon: ; 0xe417 + ; You gotta have #MON to call! + text_jump UnknownText_0x1c1006 + db "@" + +.LogIn: ; e41c (3:641c) + xor a + ld [hBGMapMode], a + call LoadStandardMenuHeader + call ClearPCItemScreen + ld hl, wOptions + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + ld hl, .Text_What + call PrintText + pop af + ld [wOptions], a + call LoadFontsBattleExtra + ret + +.Text_What: ; 0xe43a + ; What? + text_jump UnknownText_0x1c1024 + db "@" + +.LogOut: ; e43f (3:643f) + call CloseSubmenu + ret + +.UseBillsPC: ; e443 (3:6443) + ld hl, .MenuHeader + call LoadMenuHeader + ld a, $1 +.loop + ld [wMenuCursorBuffer], a + call SetPalettes + xor a + ld [wWhichIndexSet], a + ld [hBGMapMode], a + call DoNthMenu + jr c, .cancel + ld a, [wMenuCursorBuffer] + push af + ld a, [wMenuSelection] + ld hl, .Jumptable + rst JumpTable + pop bc + ld a, b + jr nc, .loop +.cancel + call CloseWindow + ret + +.MenuHeader: ; 0xe46f + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 + dw .MenuData + db 1 ; default option + +.MenuData: ; 0xe477 + db STATICMENU_CURSOR ; flags + db 0 ; items + dw .items + dw PlaceMenuStrings + dw .strings + +.strings ; e47f + db "WITHDRAW @" + db "DEPOSIT @" + db "CHANGE BOX@" + db "MOVE W/O MAIL@" + db "SEE YA!@" + +.Jumptable: ; e4ba (3:64ba) + dw BillsPC_WithdrawMenu + dw BillsPC_DepositMenu + dw BillsPC_ChangeBoxMenu + dw BillsPC_MovePKMNMenu + dw BillsPC_SeeYa + +.items ; e4c4 + db 5 + db 0 ; WITHDRAW + db 1; DEPOSIT + db 2 ; CHANGE BOX + db 3 ; MOVE PKMN + db 4 ; SEE YA! + db -1 + +BillsPC_SeeYa: ; e4cb + scf + ret + +BillsPC_MovePKMNMenu: ; e4cd + call LoadStandardMenuHeader + farcall IsAnyMonHoldingMail + jr nc, .no_mail + ld hl, .Text_MonHoldingMail + call PrintText + jr .quit + +.no_mail + farcall StartMoveMonWOMail_SaveGame + jr c, .quit + farcall _MovePKMNWithoutMail + call ReturnToMapFromSubmenu + call ClearPCItemScreen + +.quit + call CloseWindow + and a + ret + +.Text_MonHoldingMail: ; 0xe4f9 + ; There is a #MON holding MAIL. Please remove the MAIL. + text_jump UnknownText_0x1c102b + db "@" + +BillsPC_DepositMenu: ; e4fe (3:64fe) + call LoadStandardMenuHeader + farcall _DepositPKMN + call ReturnToMapFromSubmenu + call ClearPCItemScreen + call CloseWindow + and a + ret + +Unreferenced_Functione512: + ld a, [wPartyCount] + and a + jr z, .no_mon + cp 2 + jr c, .only_one_mon + and a + ret + +.no_mon + ld hl, .Text_NoMon + call MenuTextBoxBackup + scf + ret + +.only_one_mon + ld hl, .Text_ItsYourLastMon + call MenuTextBoxBackup + scf + ret + +.Text_NoMon: ; 0xe52e + ; You don't have a single #MON! + text_jump UnknownText_0x1c1062 + db "@" + +.Text_ItsYourLastMon: ; 0xe533 + ; You can't deposit your last #MON! + text_jump UnknownText_0x1c1080 + db "@" + +CheckCurPartyMonFainted: ; e538 + ld hl, wPartyMon1HP + ld de, PARTYMON_STRUCT_LENGTH + ld b, $0 +.loop + ld a, [wCurPartyMon] + cp b + jr z, .skip + ld a, [hli] + or [hl] + jr nz, .notfainted + dec hl + +.skip + inc b + ld a, [wPartyCount] + cp b + jr z, .done + add hl, de + jr .loop + +.done + scf + ret + +.notfainted + and a + ret + +BillsPC_WithdrawMenu: ; e559 (3:6559) + call LoadStandardMenuHeader + farcall _WithdrawPKMN + call ReturnToMapFromSubmenu + call ClearPCItemScreen + call CloseWindow + and a + ret + +Unreferenced_Functione56d: + ld a, [wPartyCount] + cp PARTY_LENGTH + jr nc, .asm_e576 + and a + ret + +.asm_e576 + ld hl, UnknownText_0xe57e + call MenuTextBoxBackup + scf + ret + +UnknownText_0xe57e: ; 0xe57e + ; You can't take any more #MON. + text_jump UnknownText_0x1c10a2 + db "@" + +BillsPC_ChangeBoxMenu: ; e583 (3:6583) + farcall _ChangeBox + and a + ret + +ClearPCItemScreen: ; e58b + call DisableSpriteUpdates + xor a + ld [hBGMapMode], a + call ClearBGPalettes + call ClearSprites + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + hlcoord 0, 0 + lb bc, 10, 18 + call TextBox + hlcoord 0, 12 + lb bc, 4, 18 + call TextBox + call WaitBGMap2 + call SetPalettes ; load regular palettes? + ret + +CopyBoxmonToTempMon: ; e5bb + ld a, [wCurPartyMon] + ld hl, sBoxMon1Species + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld de, wTempMonSpecies + ld bc, BOXMON_STRUCT_LENGTH + ld a, BANK(sBoxMon1Species) + call GetSRAMBank + call CopyBytes + call CloseSRAM + ret + +Unreferenced_Functione5d9: + ld a, [wCurBox] + cp b + jr z, .same_box + ld a, b + ld hl, .BoxAddrs + ld bc, 3 + call AddNTimes + ld a, [hli] + push af + ld a, [hli] + ld h, [hl] + ld l, a + pop af + jr .okay + +.same_box + ld a, BANK(sBoxCount) + ld hl, sBoxCount + +.okay + call GetSRAMBank + ld a, [hl] + ld bc, 1 + MONS_PER_BOX + 1 + add hl, bc + ld b, a + ld c, $0 + ld de, wc608 + ld a, b + and a + jr z, .empty_box +.loop + push hl + push bc + ld a, c + ld bc, 0 + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [de], a + inc de + ld [wCurSpecies], a + call GetBaseData + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MONS_PER_BOX * (BOXMON_STRUCT_LENGTH + NAME_LENGTH) + add hl, bc + call SkipNames + call CopyBytes + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MON_LEVEL + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hl] + ld [de], a + inc de + pop bc + pop hl + + push hl + push bc + ld a, c + ld bc, MON_DVS + add hl, bc + ld bc, BOXMON_STRUCT_LENGTH + call AddNTimes + ld a, [hli] + and $f0 + ld b, a + ld a, [hl] + and $f0 + swap a + or b + ld b, a + ld a, [wBaseGender] + cp b + ld a, $1 + jr c, .okay2 + xor a +.okay2 + ld [de], a + inc de + pop bc + pop hl + + inc c + dec b + jr nz, .loop +.empty_box + call CloseSRAM + ret + +.BoxAddrs: ; e66e + dba sBox1 + dba sBox2 + dba sBox3 + dba sBox4 + dba sBox5 + dba sBox6 + dba sBox7 + dba sBox8 + dba sBox9 + dba sBox10 + dba sBox11 + dba sBox12 + dba sBox13 + dba sBox14 diff --git a/engine/pokemon/billspc.asm b/engine/pokemon/billspc.asm deleted file mode 100644 index 96d6ac310..000000000 --- a/engine/pokemon/billspc.asm +++ /dev/null @@ -1,2618 +0,0 @@ -_DepositPKMN: ; e2391 (38:6391) - ld hl, wOptions - ld a, [hl] - push af - set 4, [hl] - ld a, [wVramState] - push af - xor a - ld [wVramState], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - xor a - ld [hMapAnims], a - call BillsPC_InitRAM - xor a - ld [wBillsPC_LoadedBox], a - call DelayFrame -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call .RunJumptable - call DelayFrame - jr .loop -.done - call ClearSprites - pop af - ld [hInMenu], a - pop af - ld [wVramState], a - pop af - ld [wOptions], a - ret - -.RunJumptable: ; e23d5 (38:63d5) - ld a, [wJumptableIndex] - ld hl, .Jumptable - call BillsPC_Jumptable - jp hl - -.Jumptable: ; e23df (38:63df) - dw .Init - dw .HandleJoypad - dw .WhatsUp - dw .Submenu - dw BillsPC_EndJumptableLoop - -.Init: ; e23e9 (38:63e9) - xor a - ld [hBGMapMode], a - call ClearSprites - call CopyBoxmonSpecies - call BillsPC_BoxName - ld de, PCString_ChooseaPKMN - call BillsPC_PlaceString - ld a, $5 - ld [wBillsPC_NumMonsOnScreen], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $ff - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - call WaitBGMap - call BillsPC_UpdateSelectionCursor - call BillsPC_IncrementJumptableIndex - ret - -.HandleJoypad: ; e241a (38:641a) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and A_BUTTON - jr nz, .a_button - call Withdraw_UpDown - and a - ret z - call BillsPC_UpdateSelectionCursor - xor a - ld [hBGMapMode], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $1 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - ret - -.a_button - call BillsPC_GetSelectedPokemonSpecies - and a - ret z - cp -1 - jr z, .b_button - ld a, $2 - ld [wJumptableIndex], a - ret -; e2452 (38:6452) - -.go_back - ld hl, wJumptableIndex - dec [hl] - ret - -.b_button - ld a, $4 - ld [wJumptableIndex], a - ret - -.WhatsUp: ; e245d (38:645d) - xor a - ld [hBGMapMode], a - call ClearSprites - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ld a, $1 - ld [wMenuCursorY], a - call BillsPC_IncrementJumptableIndex - ret - -.Submenu: ; e247d (38:647d) - ld hl, BillsPCDepositMenuHeader - call CopyMenuHeader - ld a, [wMenuCursorY] - call StoreTo_wMenuCursorBuffer - call VerticalMenu - jp c, BillsPCDepositFuncCancel - ld a, [wMenuCursorY] - dec a - and %11 - ld e, a - ld d, 0 - ld hl, BillsPCDepositJumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -BillsPCDepositJumptable: ; e24a1 (38:64a1) - dw BillsPCDepositFuncDeposit ; Deposit Pokemon - dw BillsPCDepositFuncStats ; Pokemon Stats - dw BillsPCDepositFuncRelease ; Release Pokemon - dw BillsPCDepositFuncCancel ; Cancel - - -BillsPCDepositFuncDeposit: ; e24a9 (38:64a9) - call BillsPC_CheckMail_PreventBlackout - jp c, BillsPCDepositFuncCancel - call DepositPokemon - jr c, .box_full - ld a, $0 - ld [wJumptableIndex], a - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ret - -.box_full - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ret - -BillsPCDepositFuncStats: ; e24c8 (38:64c8) - call LoadStandardMenuHeader - call BillsPC_StatsScreen - call ExitMenu - call PCMonInfo - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ret - -BillsPCDepositFuncRelease: ; e24e0 (38:64e0) - call BillsPC_CheckMail_PreventBlackout - jr c, BillsPCDepositFuncCancel - call BillsPC_IsMonAnEgg - jr c, BillsPCDepositFuncCancel - ld a, [wMenuCursorY] - push af - ld de, PCString_ReleasePKMN - call BillsPC_PlaceString - call LoadStandardMenuHeader - lb bc, 14, 11 - call PlaceYesNoBox - ld a, [wMenuCursorY] - dec a - call ExitMenu - and a - jr nz, .failed_release - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - call ReleasePKMN_ByePKMN - ld a, $0 - ld [wJumptableIndex], a - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - pop af - ret - -.failed_release - ld de, PCString_WhatsUp - call BillsPC_PlaceString - pop af - ld [wMenuCursorY], a - ret - -BillsPCDepositFuncCancel: ; e2537 (38:6537) - ld a, $0 - ld [wJumptableIndex], a - ret -; e253d (38:653d) - -BillsPCDepositMenuHeader: ; 0xe253d (38:653d) - db MENU_BACKUP_TILES ; flags - menu_coords 9, 4, SCREEN_WIDTH - 1, 13 - dw .MenuData - db 1 ; default option -; 0xe2545 - -.MenuData: ; 0xe2545 (38:6545) - db STATICMENU_CURSOR ; flags - db 4 ; items - db "DEPOSIT@" - db "STATS@" - db "RELEASE@" - db "CANCEL@" -; 0xe2564 (38:6564) - -Unreferenced_BillsPCClearThreeBoxes: ; e2564 - hlcoord 0, 0 - ld b, 4 - ld c, 8 - call ClearBox - hlcoord 0, 4 - ld b, 10 - ld c, 9 - call ClearBox - hlcoord 0, 14 - ld b, 2 - ld c, 8 - call ClearBox - ret -; e2583 - -_WithdrawPKMN: ; e2583 (38:6583) - ld hl, wOptions - ld a, [hl] - push af - set 4, [hl] - ld a, [wVramState] - push af - xor a - ld [wVramState], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - xor a - ld [hMapAnims], a - call BillsPC_InitRAM - ld a, NUM_BOXES + 1 - ld [wBillsPC_LoadedBox], a - call DelayFrame -.loop - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call .RunJumptable - call DelayFrame - jr .loop -.done - call ClearSprites - pop af - ld [hInMenu], a - pop af - ld [wVramState], a - pop af - ld [wOptions], a - ret - -.RunJumptable: ; e25c8 (38:65c8) - ld a, [wJumptableIndex] - ld hl, .Jumptable - call BillsPC_Jumptable - jp hl - -.Jumptable: ; e25d2 (38:65d2) - dw .Init - dw .Joypad - dw .PrepSubmenu - dw BillsPC_Withdraw - dw BillsPC_EndJumptableLoop - -.Init: ; e25dc (38:65dc) - ld a, NUM_BOXES + 1 - ld [wBillsPC_LoadedBox], a - xor a - ld [hBGMapMode], a - call ClearSprites - call CopyBoxmonSpecies - call BillsPC_BoxName - ld de, PCString_ChooseaPKMN - call BillsPC_PlaceString - ld a, $5 - ld [wBillsPC_NumMonsOnScreen], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $ff - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - call WaitBGMap - call BillsPC_UpdateSelectionCursor - call BillsPC_IncrementJumptableIndex - ret - -.Joypad: ; e2612 (38:6612) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and A_BUTTON - jr nz, .a_button - call Withdraw_UpDown - and a - ret z - call BillsPC_UpdateSelectionCursor - xor a - ld [hBGMapMode], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $1 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - ret -.a_button - call BillsPC_GetSelectedPokemonSpecies - and a - ret z - cp -1 - jr z, .b_button - ld a, $2 - ld [wJumptableIndex], a - ret ; e264a (38:664a) - -.unused - ld hl, wJumptableIndex - dec [hl] - ret - -.b_button - ld a, $4 - ld [wJumptableIndex], a - ret -; e2655 - -.PrepSubmenu: ; e2655 (38:6655) - xor a - ld [hBGMapMode], a - call ClearSprites - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ld a, $1 - ld [wMenuCursorY], a - call BillsPC_IncrementJumptableIndex - ret - -BillsPC_Withdraw: ; e2675 (38:6675) - ld hl, .MenuHeader - call CopyMenuHeader - ld a, [wMenuCursorY] - call StoreTo_wMenuCursorBuffer - call VerticalMenu - jp c, .cancel - ld a, [wMenuCursorY] - dec a - and %11 - ld e, a - ld d, 0 - ld hl, .dw - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.dw ; e2699 (38:6699) #mark - dw .withdraw ; Withdraw - dw .stats ; Stats - dw .release ; Release - dw .cancel ; Cancel - - -.withdraw ; e26a1 (38:66a1) - call BillsPC_CheckMail_PreventBlackout - jp c, .cancel - call TryWithdrawPokemon - jr c, .FailedWithdraw - ld a, $0 - ld [wJumptableIndex], a - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ret -.FailedWithdraw: - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ret - -.stats ; e26c0 (38:66c0) - call LoadStandardMenuHeader - call BillsPC_StatsScreen - call ExitMenu - call PCMonInfo - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ret - -.release ; e26d8 (38:66d8) - ld a, [wMenuCursorY] - push af - call BillsPC_IsMonAnEgg - jr c, .FailedRelease - ld de, PCString_ReleasePKMN - call BillsPC_PlaceString - call LoadStandardMenuHeader - lb bc, 14, 11 - call PlaceYesNoBox - ld a, [wMenuCursorY] - dec a - call ExitMenu - and a - jr nz, .FailedRelease - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - ld a, REMOVE_BOX - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - call ReleasePKMN_ByePKMN - ld a, $0 - ld [wJumptableIndex], a - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - pop af - ret -.FailedRelease: - ld de, PCString_WhatsUp - call BillsPC_PlaceString - pop af - ld [wMenuCursorY], a - ret - -.cancel ; e272b (38:672b) - ld a, $0 - ld [wJumptableIndex], a - ret -; e2731 (38:6731) - -.MenuHeader: ; 0xe2731 - db MENU_BACKUP_TILES ; flags - menu_coords 9, 4, SCREEN_WIDTH - 1, 13 - dw .MenuData - db 1 ; default option -; 0xe2739 - -.MenuData: ; 0xe2739 - db STATICMENU_CURSOR ; flags - db 4 ; items - db "WITHDRAW@" - db "STATS@" - db "RELEASE@" - db "CANCEL@" -; 0xe2759 - -_MovePKMNWithoutMail: ; e2759 - ld hl, wOptions - ld a, [hl] - push af - set 4, [hl] - ld a, [wVramState] - push af - xor a - ld [wVramState], a - ld a, [hInMenu] - push af - ld a, $1 - ld [hInMenu], a - xor a - ld [hMapAnims], a - call BillsPC_InitRAM - ld a, [wCurBox] - and $f - inc a - ld [wBillsPC_LoadedBox], a - call DelayFrame -.asm_e2781 - call JoyTextDelay - ld a, [wJumptableIndex] - bit 7, a - jr nz, .asm_e2793 - call .RunJumptable - call DelayFrame - jr .asm_e2781 - -.asm_e2793 - call ClearSprites - pop af - ld [hInMenu], a - pop af - ld [wVramState], a - pop af - ld [wOptions], a - ret -; e27a2 - -.RunJumptable: ; e27a2 - ld a, [wJumptableIndex] - ld hl, .Jumptable - call BillsPC_Jumptable - jp hl -; e27ac - -.Jumptable: ; e27ac - dw .Init - dw .Joypad - dw .PrepSubmenu - dw .MoveMonWOMailSubmenu - dw .PrepInsertCursor - dw .Joypad2 - dw BillsPC_EndJumptableLoop -; e27ba - -.Init: ; e27ba - xor a - ld [hBGMapMode], a - call ClearSprites - call CopyBoxmonSpecies - ld de, PCString_ChooseaPKMN - call BillsPC_PlaceString - ld a, 5 - ld [wBillsPC_NumMonsOnScreen], a - call BillsPC_RefreshTextboxes - call BillsPC_MoveMonWOMail_BoxNameAndArrows - call PCMonInfo - ld a, $ff - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - call WaitBGMap - call BillsPC_UpdateSelectionCursor - call BillsPC_IncrementJumptableIndex - ret -; e27eb - -.Joypad: ; e27eb - ld hl, hJoyPressed - ld a, [hl] - and B_BUTTON - jr nz, .b_button - ld a, [hl] - and A_BUTTON - jr nz, .a_button - call MoveMonWithoutMail_DPad - jr c, .d_pad - and a - ret z - call BillsPC_UpdateSelectionCursor - xor a - ld [hBGMapMode], a - call BillsPC_RefreshTextboxes - call PCMonInfo - ld a, $1 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - ret - -.d_pad - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ld a, $0 - ld [wJumptableIndex], a - ret - -.a_button - call BillsPC_GetSelectedPokemonSpecies - and a - ret z - cp -1 - jr z, .b_button - ld a, $2 - ld [wJumptableIndex], a - ret - -.unused - ld hl, wJumptableIndex - dec [hl] - ret - -.b_button - ld a, $6 - ld [wJumptableIndex], a - ret -; e283d - -.PrepSubmenu: ; e283d - xor a - ld [hBGMapMode], a - call ClearSprites - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ld de, PCString_WhatsUp - call BillsPC_PlaceString - ld a, $1 - ld [wMenuCursorY], a - call BillsPC_IncrementJumptableIndex - ret -; e285d - -.MoveMonWOMailSubmenu: ; e285d - ld hl, .MenuHeader - call CopyMenuHeader - ld a, [wMenuCursorY] - call StoreTo_wMenuCursorBuffer - call VerticalMenu - jp c, .Cancel - ld a, [wMenuCursorY] - dec a - and %11 - ld e, a - ld d, 0 - ld hl, .Jumptable2 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; e2881 - -.Jumptable2: ; e2881 - dw .Move - dw .Stats - dw .Cancel -; e2887 - -.Move: ; e2887 - call BillsPC_CheckMail_PreventBlackout - jp c, .Cancel - ld a, [wBillsPC_ScrollPosition] - ld [wBillsPC_BackupScrollPosition], a - ld a, [wBillsPC_CursorPosition] - ld [wBillsPC_BackupCursorPosition], a - ld a, [wBillsPC_LoadedBox] - ld [wBillsPC_BackupLoadedBox], a - ld a, $4 - ld [wJumptableIndex], a - ret -; e28a5 - -.Stats: ; e28a5 - call LoadStandardMenuHeader - call BillsPC_StatsScreen - call ExitMenu - call PCMonInfo - call BillsPC_GetSelectedPokemonSpecies - ld [wCurPartySpecies], a - ld a, SCGB_BILLS_PC - call BillsPC_ApplyPalettes - ret -; e28bd - -.Cancel: ; e28bd - ld a, $0 - ld [wJumptableIndex], a - ret -; e28c3 - -.MenuHeader: ; 0xe28c3 - db MENU_BACKUP_TILES ; flags - menu_coords 9, 4, SCREEN_WIDTH - 1, 13 - dw .MenuData - db 1 ; default option -; 0xe28cb - -.MenuData: ; 0xe28cb - db STATICMENU_CURSOR ; flags - db 3 ; items - db "MOVE@" - db "STATS@" - db "CANCEL@" -; 0xe28df - -.PrepInsertCursor: ; e28df - xor a - ld [hBGMapMode], a - call CopyBoxmonSpecies - ld de, PCString_MoveToWhere - call BillsPC_PlaceString - ld a, $5 - ld [wBillsPC_NumMonsOnScreen], a - call BillsPC_RefreshTextboxes - call BillsPC_MoveMonWOMail_BoxNameAndArrows - call ClearSprites - call BillsPC_UpdateInsertCursor - call WaitBGMap - call BillsPC_IncrementJumptableIndex - ret -; e2903 - -.Joypad2: ; e2903 - ld hl, hJoyPressed - ld a, [hl] - and B_BUTTON - jr nz, .b_button_2 - ld a, [hl] - and A_BUTTON - jr nz, .a_button_2 - call MoveMonWithoutMail_DPad_2 - jr c, .dpad_2 - and a - ret z - call BillsPC_UpdateInsertCursor - xor a - ld [hBGMapMode], a - call BillsPC_RefreshTextboxes - ld a, $1 - ld [hBGMapMode], a - call DelayFrame - call DelayFrame - ret - -.dpad_2 - xor a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ld a, $4 - ld [wJumptableIndex], a - ret - -.a_button_2 - call BillsPC_CheckSpaceInDestination - jr c, .no_space - call MovePKMNWitoutMail_InsertMon - ld a, $0 - ld [wJumptableIndex], a - ret - -.no_space - ld hl, wJumptableIndex - dec [hl] - ret - -.b_button_2 - ld a, [wBillsPC_BackupScrollPosition] - ld [wBillsPC_ScrollPosition], a - ld a, [wBillsPC_BackupCursorPosition] - ld [wBillsPC_CursorPosition], a - ld a, [wBillsPC_BackupLoadedBox] - ld [wBillsPC_LoadedBox], a - ld a, $0 - ld [wJumptableIndex], a - ret -; e2963 - -BillsPC_InitRAM: ; e2963 (38:6963) - call ClearBGPalettes - call ClearSprites - call ClearTileMap - call BillsPC_InitGFX - ld hl, wBillsPCPokemonList - ld bc, $338 - xor a - call ByteFill - xor a - ld [wJumptableIndex], a - ld [wcf64], a - ld [wcf65], a - ld [wcf66], a - ld [wBillsPC_CursorPosition], a - ld [wBillsPC_ScrollPosition], a - ret - -BillsPC_IncrementJumptableIndex: ; e298d (38:698d) - ld hl, wJumptableIndex - inc [hl] - ret - -BillsPC_EndJumptableLoop: ; e2992 (38:6992) - ld hl, wJumptableIndex - set 7, [hl] - ret - -_StatsScreenDPad: ; e2998 (38:6998) - ld a, [wBillsPC_NumMonsOnScreen] - ld d, a - ld a, [wBillsPC_NumMonsInBox] - and a - jr z, .empty - dec a - cp $1 - jr z, .empty - ld e, a - ld a, [hl] - and D_UP - jr nz, BillsPC_PressUp - ld a, [hl] - and D_DOWN - jr nz, BillsPC_PressDown -.empty - jp BillsPC_JoypadDidNothing - -Withdraw_UpDown: ; e29b5 (38:69b5) - ld hl, hJoyLast - ld a, [wBillsPC_NumMonsOnScreen] - ld d, a - ld a, [wBillsPC_NumMonsInBox] - ld e, a - and a - jr z, .empty - ld a, [hl] - and D_UP - jr nz, BillsPC_PressUp - ld a, [hl] - and D_DOWN - jr nz, BillsPC_PressDown -.empty - jp BillsPC_JoypadDidNothing -; e29d0 (38:69d0) - -MoveMonWithoutMail_DPad: ; e29d0 - ld hl, hJoyLast - ld a, [wBillsPC_NumMonsOnScreen] - ld d, a - ld a, [wBillsPC_NumMonsInBox] - ld e, a - and a - jr z, .check_left_right - ld a, [hl] - and D_UP - jr nz, BillsPC_PressUp - ld a, [hl] - and D_DOWN - jr nz, BillsPC_PressDown - -.check_left_right - ld a, [hl] - and D_LEFT - jr nz, BillsPC_PressLeft - ld a, [hl] - and D_RIGHT - jr nz, BillsPC_PressRight - jr BillsPC_JoypadDidNothing - -MoveMonWithoutMail_DPad_2: ; e29f4 - ld hl, hJoyLast - ld a, [wBillsPC_NumMonsOnScreen] - ld d, a - ld a, [wBillsPC_NumMonsInBox] - ld e, a - and a - jr z, .check_left_right - - ld a, [hl] - and D_UP - jr nz, BillsPC_PressUp - ld a, [hl] - and D_DOWN - jr nz, BillsPC_PressDown - -.check_left_right - ld a, [hl] - and D_LEFT - jr nz, BillsPC_PressLeft - ld a, [hl] - and D_RIGHT - jr nz, BillsPC_PressRight - jr BillsPC_JoypadDidNothing - -BillsPC_PressUp: ; e2a18 (38:6a18) - ld hl, wBillsPC_CursorPosition - ld a, [hl] - and a - jr z, .top - dec [hl] - jr BillsPC_UpDownDidSomething - -.top - ld hl, wBillsPC_ScrollPosition - ld a, [hl] - and a - jr z, BillsPC_JoypadDidNothing - dec [hl] - jr BillsPC_UpDownDidSomething - -BillsPC_PressDown: ; e2a2c (38:6a2c) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - inc a - cp e - jr nc, BillsPC_JoypadDidNothing - - ld hl, wBillsPC_CursorPosition - ld a, [hl] - inc a - cp d - jr nc, .not_bottom - inc [hl] - jr BillsPC_UpDownDidSomething - -.not_bottom - ld hl, wBillsPC_ScrollPosition - inc [hl] - jr BillsPC_UpDownDidSomething -; e2a48 (38:6a48) - -BillsPC_PressLeft: ; e2a48 - ld hl, wBillsPC_LoadedBox - ld a, [hl] - and a - jr z, .wrap_around - dec [hl] - jr BillsPC_LeftRightDidSomething - -.wrap_around - ld [hl], NUM_BOXES - jr BillsPC_LeftRightDidSomething - -BillsPC_PressRight: ; e2a56 - ld hl, wBillsPC_LoadedBox - ld a, [hl] - cp NUM_BOXES - jr z, .wrap_around - inc [hl] - jr BillsPC_LeftRightDidSomething - -.wrap_around - ld [hl], 0 - jr BillsPC_LeftRightDidSomething - -BillsPC_JoypadDidNothing: ; e2a65 (38:6a65) - xor a - and a - ret - -BillsPC_UpDownDidSomething: ; e2a68 (38:6a68) - ld a, TRUE - and a - ret -; e2a6c (38:6a6c) - -BillsPC_LeftRightDidSomething: ; e2a6c - scf - ret -; e2a6e - -BillsPC_PlaceString: ; e2a6e (38:6a6e) - push de - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - pop de - hlcoord 1, 16 - call PlaceString - ret -; e2a80 (38:6a80) - -BillsPC_MoveMonWOMail_BoxNameAndArrows: ; e2a80 - call BillsPC_BoxName - hlcoord 8, 1 - ld [hl], $5f - hlcoord 19, 1 - ld [hl], $5e - ret -; e2a8e - -BillsPC_BoxName: ; e2a8e (38:6a8e) - hlcoord 8, 0 - lb bc, 1, 10 - call TextBox - - ld a, [wBillsPC_LoadedBox] - and a - jr z, .party - - cp NUM_BOXES + 1 - jr nz, .gotbox - - ld a, [wCurBox] - inc a -.gotbox - dec a - ld hl, wBoxNames - ld bc, BOX_NAME_LENGTH - call AddNTimes - ld e, l - ld d, h - jr .print - -.party - ld de, .PartyPKMN -.print - hlcoord 10, 1 - call PlaceString - ret -; e2abd (38:6abd) - -.PartyPKMN: - db "PARTY @" -; e2ac6 - -PCMonInfo: ; e2ac6 (38:6ac6) -; Display a monster's pic and -; attributes when highlighting -; it in a PC menu. - -; Includes the neat cascading -; effect when showing the pic. - -; Example: Species, level, gender, -; whether it's holding an item. - - hlcoord 0, 0 - lb bc, 15, 8 - call ClearBox - - hlcoord 8, 14 - lb bc, 1, 3 - call ClearBox - - call BillsPC_GetSelectedPokemonSpecies - and a - ret z - cp -1 - ret z - - ld [wd265], a - hlcoord 1, 4 - xor a - ld b, 7 -.row - ld c, 7 - push af - push hl -.col - ld [hli], a - add 7 - dec c - jr nz, .col - pop hl - ld de, SCREEN_WIDTH - add hl, de - pop af - inc a - dec b - jr nz, .row - - call BillsPC_LoadMonStats - ld a, [wd265] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - ld hl, wTempMonDVs - predef GetUnownLetter - call GetBaseData - ld de, vTiles2 tile $00 - predef GetMonFrontpic - xor a - ld [wBillsPC_MonHasMail], a - ld a, [wCurPartySpecies] - ld [wd265], a - cp EGG - ret z - - call GetBasePokemonName - hlcoord 1, 14 - call PlaceString - - hlcoord 1, 12 - call PrintLevel - - ld a, $3 - ld [wMonType], a - farcall GetGender - jr c, .skip_gender - ld a, "♂" - jr nz, .printgender - ld a, "♀" -.printgender - hlcoord 5, 12 - ld [hl], a -.skip_gender - - ld a, [wTempMonItem] - and a - ret z - - ld d, a - callfar ItemIsMail - jr c, .mail - ld a, $5d ; item icon - jr .printitem -.mail - ld a, $1 - ld [wBillsPC_MonHasMail], a - ld a, $5c ; mail icon -.printitem - hlcoord 7, 12 - ld [hl], a - ret - -BillsPC_LoadMonStats: ; e2b6d (38:6b6d) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld e, a - ld d, $0 - ld hl, wBillsPCPokemonList + 1 ; box number - add hl, de - add hl, de - add hl, de - ld a, [hl] - and a - jr z, .party - cp NUM_BOXES + 1 - jr z, .sBox - ld b, a - call GetBoxPointer - ld a, b - call GetSRAMBank - push hl - ld bc, sBoxMon1Level - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonLevel], a - pop hl - push hl - ld bc, sBoxMon1Item - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonItem], a - pop hl - ld bc, sBoxMon1DVs - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld de, wTempMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - call CloseSRAM - ret - -.party - ld hl, wPartyMon1Level - ld bc, PARTYMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonLevel], a - ld hl, wPartyMon1Item - ld bc, PARTYMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonItem], a - ld hl, wPartyMon1DVs - ld bc, PARTYMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld de, wTempMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - ret - -.sBox - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxMon1Level - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonLevel], a - - ld hl, sBoxMon1Item - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - ld [wTempMonItem], a - - ld hl, sBoxMon1DVs - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld de, wTempMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - - call CloseSRAM - ret - -BillsPC_RefreshTextboxes: ; e2c2c (38:6c2c) - hlcoord 8, 2 - lb bc, 10, 10 - call TextBox - - hlcoord 8, 2 - ld [hl], "└" - hlcoord 19, 2 - ld [hl], "┘" - - ld a, [wBillsPC_ScrollPosition] - ld e, a - ld d, 0 - ld hl, wBillsPCPokemonList - add hl, de - add hl, de - add hl, de - ld e, l - ld d, h - hlcoord 9, 4 - ld a, [wBillsPC_NumMonsOnScreen] -.loop - push af - push de - push hl - call .PlaceNickname - pop hl - ld de, 2 * SCREEN_WIDTH - add hl, de - pop de - inc de - inc de - inc de - pop af - dec a - jr nz, .loop - ret -; e2c67 (38:6c67) - -.CancelString: - db "CANCEL@" -; e2c6e - -.PlaceNickname: ; e2c6e (38:6c6e) - ld a, [de] - and a - ret z - cp -1 - jr nz, .get_nickname - ld de, .CancelString - call PlaceString - ret - -.get_nickname - inc de - ld a, [de] - ld b, a - inc de - ld a, [de] - ld e, a - ld a, b - and a - jr z, .party - cp NUM_BOXES + 1 - jr z, .sBox - push hl - call GetBoxPointer - ld a, b - call GetSRAMBank - push hl - ld bc, sBoxMons - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - ld a, e - call AddNTimes - ld a, [hl] - pop hl - and a - jr z, .boxfail - ld bc, sBoxMonNicknames - sBox - add hl, bc - ld bc, MON_NAME_LENGTH - ld a, e - call AddNTimes - ld de, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - call CloseSRAM - pop hl - ld de, wStringBuffer1 - call PlaceString - ret - -.boxfail - call CloseSRAM - pop hl - jr .placeholder_string - -.party - push hl - ld hl, wPartySpecies - ld d, $0 - add hl, de - ld a, [hl] - and a - jr z, .partyfail - ld hl, wPartyMonNicknames - ld bc, MON_NAME_LENGTH - ld a, e - call AddNTimes - ld de, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - pop hl - ld de, wStringBuffer1 - call PlaceString - ret - -.partyfail - pop hl - jr .placeholder_string - -.sBox - push hl - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxSpecies - ld d, $0 - add hl, de - ld a, [hl] - and a - jr z, .sBoxFail - ld hl, sBoxMonNicknames - ld bc, MON_NAME_LENGTH - ld a, e - call AddNTimes - ld de, wStringBuffer1 - ld bc, MON_NAME_LENGTH - call CopyBytes - call CloseSRAM - pop hl - ld de, wStringBuffer1 - call PlaceString - ret - -.sBoxFail - call CloseSRAM - pop hl -.placeholder_string - ld de, .Placeholder - call PlaceString - ret -; e2d2a (38:6d2a) - -.Placeholder: - db "-----@" -; e2d30 - -copy_box_data: MACRO -.loop\@ - ld a, [hl] - cp -1 - jr z, .done\@ - and a - jr z, .done\@ - ld [de], a - inc de - ld a, [wBillsPC_LoadedBox] - ld [de], a - inc de - ld a, [wd003] - ld [de], a - inc a - ld [wd003], a - inc de - inc hl - ld a, [wd004] - inc a - ld [wd004], a - jr .loop\@ - -.done\@ -if \1 - call CloseSRAM -endc - ld a, -1 - ld [de], a - ld a, [wd004] - inc a - ld [wBillsPC_NumMonsInBox], a -ENDM - -CopyBoxmonSpecies: ; e2d30 (38:6d30) - xor a - ld hl, wBillsPCPokemonList - ld bc, 3 * 30 - call ByteFill - ld de, wBillsPCPokemonList - xor a - ld [wd003], a - ld [wd004], a - ld a, [wBillsPC_LoadedBox] - and a - jr z, .party - cp NUM_BOXES + 1 - jr z, .sBox - ld b, a - call GetBoxPointer - ld a, b - call GetSRAMBank - inc hl - copy_box_data 1 - ret - -.party - ld hl, wPartySpecies - copy_box_data 0 - ret - -.sBox - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxSpecies - copy_box_data 1 - ret - -BillsPC_GetSelectedPokemonSpecies: ; e2def (38:6def) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld e, a - ld d, $0 - ld hl, wBillsPCPokemonList - add hl, de - add hl, de - add hl, de - ld a, [hl] - ret - -BillsPC_UpdateSelectionCursor: ; e2e01 (38:6e01) - ld a, [wBillsPC_NumMonsInBox] - and a - jr nz, .place_cursor - call ClearSprites - ret - -.place_cursor - ld hl, .OAM - ld de, wVirtualOAMSprite00 -.loop - ld a, [hl] - cp -1 - ret z - ld a, [wBillsPC_CursorPosition] - and $7 - swap a - add [hl] - inc hl - ld [de], a ; y - inc de -rept SPRITEOAMSTRUCT_LENGTH + -1 - ld a, [hli] - ld [de], a - inc de -endr - jr .loop -; e2e2b (38:6e2b) - -.OAM: ; e2e2b - dsprite 4, 6, 10, 0, $00, 0 - dsprite 4, 6, 11, 0, $00, 0 - dsprite 4, 6, 12, 0, $00, 0 - dsprite 4, 6, 13, 0, $00, 0 - dsprite 4, 6, 14, 0, $00, 0 - dsprite 4, 6, 15, 0, $00, 0 - dsprite 4, 6, 16, 0, $00, 0 - dsprite 4, 6, 17, 0, $00, 0 - dsprite 4, 6, 18, 0, $00, 0 - dsprite 4, 6, 18, 7, $00, 0 - dsprite 7, 1, 10, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 11, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 12, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 13, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 14, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 15, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 16, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 17, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 18, 0, $00, 0 | Y_FLIP - dsprite 7, 1, 18, 7, $00, 0 | Y_FLIP - dsprite 5, 6, 9, 6, $01, 0 - dsprite 6, 1, 9, 6, $01, 0 | Y_FLIP - dsprite 5, 6, 19, 1, $01, 0 | X_FLIP - dsprite 6, 1, 19, 1, $01, 0 | X_FLIP | Y_FLIP - db -1 -; e2e8c - -BillsPC_UpdateInsertCursor: ; e2e8c - ld hl, .OAM - ld de, wVirtualOAMSprite00 -.loop - ld a, [hl] - cp -1 - ret z - ld a, [wBillsPC_CursorPosition] - and $7 - swap a - add [hl] - inc hl - ld [de], a ; y - inc de -rept SPRITEOAMSTRUCT_LENGTH + -1 - ld a, [hli] - ld [de], a - inc de -endr - jr .loop -; e2eac - -.OAM: ; e2eac - dsprite 4, 7, 10, 0, $06, 0 - dsprite 5, 3, 11, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 12, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 13, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 14, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 15, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 16, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 17, 0, $00, 0 | Y_FLIP - dsprite 5, 3, 18, 0, $00, 0 | Y_FLIP - dsprite 4, 7, 19, 0, $07, 0 - db -1 -; e2ed5 - -Unreferenced_BillsPC_FillBox: ; e2ed5 -.row - push bc - push hl -.col - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret -; e2ee5 - -BillsPC_CheckSpaceInDestination: ; e2ee5 -; If moving within a box, no need to be here. - ld hl, wBillsPC_LoadedBox - ld a, [wBillsPC_BackupLoadedBox] - cp [hl] - jr z, .same_box - -; Exceeding box or party capacity is a big no-no. - ld a, [wBillsPC_LoadedBox] - and a - jr z, .party - ld e, MONS_PER_BOX + 1 - jr .compare - -.party - ld e, PARTY_LENGTH + 1 -.compare - ld a, [wBillsPC_NumMonsInBox] - cp e - jr nc, .no_room -.same_box - and a - ret - -.no_room - ld de, PCString_TheresNoRoom - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret -; e2f18 - -BillsPC_CheckMail_PreventBlackout: ; e2f18 (38:6f18) - ld a, [wBillsPC_LoadedBox] - and a - jr nz, .Okay - ld a, [wBillsPC_NumMonsInBox] - cp $3 - jr c, .ItsYourLastPokemon - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - farcall CheckCurPartyMonFainted - jr c, .AllOthersFainted - ld a, [wBillsPC_MonHasMail] - and a - jr nz, .HasMail -.Okay: - and a - ret - -.HasMail: - ld de, PCString_RemoveMail - jr .NotOkay - -.AllOthersFainted: - ld de, PCString_NoMoreUsablePKMN - jr .NotOkay - -.ItsYourLastPokemon: - ld de, PCString_ItsYourLastPKMN -.NotOkay: - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret - -BillsPC_IsMonAnEgg: ; e2f5f (38:6f5f) - ld a, [wCurPartySpecies] - cp EGG - jr z, .egg - and a - ret - -.egg - ld de, PCString_NoReleasingEGGS - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret - -BillsPC_StatsScreen: ; e2f7e (38:6f7e) - call LowVolume - call BillsPC_CopyMon - ld a, $3 - ld [wMonType], a - predef StatsScreenInit - call BillsPC_InitGFX - call MaxVolume - ret - -StatsScreenDPad: ; e2f95 (38:6f95) - ld hl, hJoyPressed ; $ffa7 - ld a, [hl] - and A_BUTTON | B_BUTTON | D_RIGHT | D_LEFT - ld [wMenuJoypad], a - jr nz, .pressed_a_b_right_left - ld a, [hl] - and D_DOWN | D_UP - ld [wMenuJoypad], a - jr nz, .pressed_down_up - jr .pressed_a_b_right_left - -.pressed_down_up - call _StatsScreenDPad - and a - jr z, .did_nothing - call BillsPC_GetSelectedPokemonSpecies - ld [wd265], a - call BillsPC_LoadMonStats - ld a, [wd265] - ld [wCurPartySpecies], a - ld [wCurSpecies], a - ld hl, wTempMonDVs - predef GetUnownLetter - call GetBaseData - call BillsPC_CopyMon -.pressed_a_b_right_left - ret - -.did_nothing - xor a - ld [wMenuJoypad], a - ret - -BillsPC_CopyMon: ; e2fd6 (38:6fd6) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - ld a, [wBillsPC_LoadedBox] - and a - jr z, .party - cp NUM_BOXES + 1 - jr nz, .box - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxSpecies - call CopySpeciesToTemp - ld hl, sBoxMonNicknames - call CopyNicknameToTemp - ld hl, sBoxMonOT - call CopyOTNameToTemp - ld hl, sBoxMons - ld bc, BOXMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMon - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - call CloseSRAM - farcall CalcBufferMonStats - ret - -.party - ld hl, wPartySpecies - call CopySpeciesToTemp - ld hl, wPartyMonNicknames - call CopyNicknameToTemp - ld hl, wPartyMonOT - call CopyOTNameToTemp - ld hl, wPartyMon1 - ld bc, PARTYMON_STRUCT_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMon - ld bc, PARTYMON_STRUCT_LENGTH - call CopyBytes - ret - -.box - ld b, a - call GetBoxPointer - ld a, b - call GetSRAMBank - push hl - inc hl - call CopySpeciesToTemp - pop hl - push hl - ld bc, sBoxMonNicknames - sBox - add hl, bc - call CopyNicknameToTemp - pop hl - push hl - ld bc, sBoxMonOT - sBox - add hl, bc - call CopyOTNameToTemp - pop hl - ld bc, sBoxMons - sBox - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - call CopyMonToTemp - call CloseSRAM - farcall CalcBufferMonStats - ret - -DepositPokemon: ; e307c (38:707c) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - ld hl, wPartyMonNicknames - ld a, [wCurPartyMon] - call GetNick - ld a, PC_DEPOSIT - ld [wPokemonWithdrawDepositParameter], a - predef SendGetMonIntoFromBox - jr c, .asm_boxisfull - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ld a, [wCurPartySpecies] - call PlayMonCry - hlcoord 0, 0 - lb bc, 15, 8 - call ClearBox - hlcoord 8, 14 - lb bc, 1, 3 - call ClearBox - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - call WaitBGMap - hlcoord 1, 16 - ld de, PCString_Stored - call PlaceString - ld l, c - ld h, b - ld de, wStringBuffer1 - call PlaceString - ld a, "!" - ld [bc], a - ld c, 50 - call DelayFrames - and a - ret - -.asm_boxisfull - ld de, PCString_BoxFull - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret - -TryWithdrawPokemon: ; e30fa (38:70fa) - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - ld a, BANK(sBoxMonNicknames) - call GetSRAMBank - ld a, [wCurPartyMon] - ld hl, sBoxMonNicknames - call GetNick - call CloseSRAM - xor a - ld [wPokemonWithdrawDepositParameter], a - predef SendGetMonIntoFromBox - jr c, .PartyFull - ld a, REMOVE_BOX - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ld a, [wCurPartySpecies] - call PlayMonCry - hlcoord 0, 0 - lb bc, 15, 8 - call ClearBox - hlcoord 8, 14 - lb bc, 1, 3 - call ClearBox - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - call WaitBGMap - hlcoord 1, 16 - ld de, PCString_Got - call PlaceString - ld l, c - ld h, b - ld de, wStringBuffer1 - call PlaceString - ld a, $e7 - ld [bc], a - ld c, 50 - call DelayFrames - and a - ret - -.PartyFull: - ld de, PCString_PartyFull - call BillsPC_PlaceString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - scf - ret - - -ReleasePKMN_ByePKMN: ; e3180 (38:7180) - hlcoord 0, 0 - lb bc, 15, 8 - call ClearBox - hlcoord 8, 14 - lb bc, 1, 3 - call ClearBox - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - - call WaitBGMap - ld a, [wCurPartySpecies] - call GetCryIndex - jr c, .skip_cry - ld e, c - ld d, b - call PlayCry -.skip_cry - - ld a, [wCurPartySpecies] - ld [wd265], a - call GetPokemonName - hlcoord 1, 16 - ld de, PCString_ReleasedPKMN - call PlaceString - ld c, 80 - call DelayFrames - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - hlcoord 1, 16 - ld de, PCString_Bye - call PlaceString - ld l, c - ld h, b - inc hl - ld de, wStringBuffer1 - call PlaceString - ld l, c - ld h, b - ld [hl], $e7 - ld c, 50 - call DelayFrames - ret -; e31e7 (38:71e7) - -MovePKMNWitoutMail_InsertMon: ; e31e7 - push hl - push de - push bc - push af - hlcoord 0, 15 - lb bc, 1, 18 - call TextBox - hlcoord 1, 16 - ld de, .Saving_LeaveOn - call PlaceString - ld c, 20 - call DelayFrames - pop af - pop bc - pop de - pop hl - ld a, [wCurBox] - push af - ld bc, 0 - ld a, [wBillsPC_BackupLoadedBox] - and a - jr nz, .moving_from_box - set 0, c - -.moving_from_box - ld a, [wBillsPC_LoadedBox] - and a - jr nz, .moving_to_box - set 1, c - -.moving_to_box - ld hl, .Jumptable - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - ld de, .dw_return - push de - jp hl -; e322a - -.dw_return ; e322a - pop af - ld e, a - farcall MoveMonWOMail_InsertMon_SaveGame - ret -; e3233 - -.Saving_LeaveOn: - db "Saving… Leave ON!@" -; e3245 - -.Jumptable: ; e3245 - dw .BoxToBox - dw .PartyToBox - dw .BoxToParty - dw .PartyToParty -; e324d - -.BoxToBox: ; e324d - ld hl, wBillsPC_BackupLoadedBox - ld a, [wBillsPC_LoadedBox] - cp [hl] - jr z, .same_box - call .CopyFromBox - call .CopyToBox - ret - -.same_box - call .CopyFromBox - call .CheckTrivialMove - call .CopyToBox - ret -; e3267 - -.PartyToBox: ; e3267 - call .CopyFromParty - ld a, $1 - ld [wGameLogicPaused], a - farcall SaveGameData - xor a - ld [wGameLogicPaused], a - call .CopyToBox - ret -; e327d - -.BoxToParty: ; e327d - call .CopyFromBox - call .CopyToParty - ret -; e3284 - -.PartyToParty: ; e3284 - call .CopyFromParty - call .CheckTrivialMove - call .CopyToParty - ret -; e328e - -.CheckTrivialMove: ; e328e - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld e, a - ld a, [wBillsPC_BackupCursorPosition] - ld hl, wBillsPC_BackupScrollPosition - add [hl] - cp e - ret nc - ld hl, wBillsPC_CursorPosition - ld a, [hl] - and a - jr z, .top_of_screen - dec [hl] - ret - -.top_of_screen - ld hl, wBillsPC_ScrollPosition - ld a, [hl] - and a - ret z - dec [hl] - ret -; e32b0 - -.CopyFromBox: ; e32b0 - ld a, [wBillsPC_BackupLoadedBox] - dec a - ld e, a - farcall MoveMonWOMail_SaveGame - ld a, [wBillsPC_BackupCursorPosition] - ld hl, wBillsPC_BackupScrollPosition - add [hl] - ld [wCurPartyMon], a - ld a, BANK(sBox) - call GetSRAMBank - ld hl, sBoxSpecies - call CopySpeciesToTemp - ld hl, sBoxMonNicknames - call CopyNicknameToTemp - ld hl, sBoxMonOT - call CopyOTNameToTemp - ld hl, sBoxMons - ld bc, BOXMON_STRUCT_LENGTH - call CopyMonToTemp - call CloseSRAM - farcall CalcBufferMonStats - ld a, REMOVE_BOX - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ret -; e32fa - -.CopyToBox: ; e32fa - ld a, [wBillsPC_LoadedBox] - dec a - ld e, a - farcall MoveMonWOMail_SaveGame - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - farcall InsertPokemonIntoBox - ret -; e3316 - -.CopyFromParty: ; e3316 - ld a, [wBillsPC_BackupCursorPosition] - ld hl, wBillsPC_BackupScrollPosition - add [hl] - ld [wCurPartyMon], a - ld hl, wPartySpecies - call CopySpeciesToTemp - ld hl, wPartyMonNicknames - call CopyNicknameToTemp - ld hl, wPartyMonOT - call CopyOTNameToTemp - ld hl, wPartyMon1Species - ld bc, PARTYMON_STRUCT_LENGTH - call CopyMonToTemp - xor a ; REMOVE_PARTY - ld [wPokemonWithdrawDepositParameter], a - farcall RemoveMonFromPartyOrBox - ret -; e3346 - -.CopyToParty: ; e3346 - ld a, [wBillsPC_CursorPosition] - ld hl, wBillsPC_ScrollPosition - add [hl] - ld [wCurPartyMon], a - farcall InsertPokemonIntoParty - ret -; e3357 - -CopySpeciesToTemp: ; e3357 (38:7357) - ld a, [wCurPartyMon] - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - ld [wCurPartySpecies], a - ret - -CopyNicknameToTemp: ; e3363 (38:7363) - ld bc, MON_NAME_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMonNick - ld bc, MON_NAME_LENGTH - call CopyBytes - ret - -CopyOTNameToTemp: ; e3376 (38:7376) - ld bc, NAME_LENGTH - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMonOT - ld bc, NAME_LENGTH - call CopyBytes - ret - -CopyMonToTemp: ; e3389 (38:7389) - ld a, [wCurPartyMon] - call AddNTimes - ld de, wBufferMon - call CopyBytes - ret - -GetBoxPointer: ; e3396 (38:7396) - dec b - ld c, b - ld b, 0 - ld hl, .boxes - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - ld b, a - ld a, [hli] - ld h, [hl] - ld l, a - ret -; e33a6 (38:73a6) - -.boxes ; e33a6 - ; bank, address - dba sBox1 - dba sBox2 - dba sBox3 - dba sBox4 - dba sBox5 - dba sBox6 - dba sBox7 - dba sBox8 - dba sBox9 - dba sBox10 - dba sBox11 - dba sBox12 - dba sBox13 - dba sBox14 -; e33d0 - -BillsPC_ApplyPalettes: ; e33d0 (38:73d0) - ld b, a - call GetSGBLayout - ld a, %11100100 - call DmgToCgbBGPals - ld a, %11111100 - call DmgToCgbObjPal0 - ret - -BillsPC_Jumptable: ; e33df (38:73df) - ld e, a - ld d, $0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret - -BillsPC_InitGFX: ; e33e8 (38:73e8) - call DisableLCD - ld hl, vTiles2 tile $00 - ld bc, $31 tiles - xor a - call ByteFill - call LoadStandardFont - call LoadFontsBattleExtra - ld hl, PCMailGFX - ld de, vTiles2 tile $5c - ld bc, 4 tiles - call CopyBytes - ld hl, PCSelectLZ - ld de, vTiles0 tile $00 - call Decompress - ld a, 6 - call SkipMusic - call EnableLCD - ret -; e3419 (38:7419) - -PCSelectLZ: INCBIN "gfx/pc/pc.2bpp.lz" -PCMailGFX: INCBIN "gfx/pc/pc_mail.2bpp" -; e34dd - -PCString_ChooseaPKMN: db "Choose a .@" -PCString_WhatsUp: db "What's up?@" -PCString_ReleasePKMN: db "Release ?@" -PCString_MoveToWhere: db "Move to where?@" -PCString_ItsYourLastPKMN: db "It's your last !@" -PCString_TheresNoRoom: db "There's no room!@" -PCString_NoMoreUsablePKMN: db "No more usable !@" -PCString_RemoveMail: db "Remove MAIL.@" -PCString_ReleasedPKMN: db "Released .@" -PCString_Bye: db "Bye,@" -PCString_Stored: db "Stored @" -PCString_Got: db "Got @" -PCString_Non: db "Non.@" -PCString_BoxFull: db "The BOX is full.@" -PCString_PartyFull: db "The party's full!@" -PCString_NoReleasingEGGS: db "No releasing EGGS!@" -; e35aa - - -_ChangeBox: ; e35aa (38:75aa) - call LoadStandardMenuHeader - call BillsPC_ClearTilemap -.loop - xor a - ld [hBGMapMode], a - call BillsPC_PrintBoxName - call BillsPC_PlaceChooseABoxString - ld hl, _ChangeBox_MenuHeader - call CopyMenuHeader - xor a - ld [wMenuScrollPosition], a - hlcoord 0, 4 - lb bc, 8, 9 - call TextBox - call ScrollingMenu - ld a, [wMenuJoypad] - cp B_BUTTON - jr z, .done - call BillsPC_PlaceWhatsUpString - call BillsPC_ChangeBoxSubmenu - jr .loop -.done - call CloseWindow - ret - -BillsPC_ClearTilemap: ; e35e2 (38:75e2) - xor a - ld [hBGMapMode], a - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, " " - call ByteFill - ret -; e35f1 (38:75f1) - -_ChangeBox_MenuHeader: ; 0xe35f1 - db MENU_BACKUP_TILES ; flags - menu_coords 1, 5, 9, 12 - dw .MenuData - db 1 ; default option -; 0xe35f9 - -.MenuData ; 0xe35f9 - db MENU_UNUSED_1 | MENU_UNUSED_3 ; flags - db 4, 0 - db 1 - dba .boxes - dba .boxnames - dba NULL - dba BillsPC_PrintBoxCountAndCapacity -; e3609 - -.boxes ; e3609 - db NUM_BOXES -x = 1 -rept NUM_BOXES - db x -x = x + 1 -endr - db -1 -; e3619 - -.boxnames ; e3619 - push de - ld a, [wMenuSelection] - dec a - call GetBoxName - pop hl - call PlaceString - ret -; e3626 - -GetBoxName: ; e3626 (38:7626) - ld bc, BOX_NAME_LENGTH - ld hl, wBoxNames - call AddNTimes - ld d, h - ld e, l - ret -; e3632 (38:7632) - -BillsPC_PrintBoxCountAndCapacity: ; e3632 - hlcoord 11, 7 - lb bc, 5, 7 - call TextBox - ld a, [wMenuSelection] - cp -1 - ret z - hlcoord 12, 9 - ld de, .Pokemon - call PlaceString - call GetBoxCount - ld [wd265], a - hlcoord 13, 11 - ld de, wd265 - lb bc, 1, 2 - call PrintNum - ld de, .out_of_20 - call PlaceString - ret -; e3663 - -.Pokemon: ; e3663 - db "#MON@" -; e3668 - -.out_of_20 ; e3668 - ; db "/20@" - db "/" - db "0" + MONS_PER_BOX / 10 ; "2" - db "0" + MONS_PER_BOX % 10 ; "0" - db "@" -; e366c - -GetBoxCount: ; e366c (38:766c) - ld a, [wCurBox] - ld c, a - ld a, [wMenuSelection] - dec a - cp c - jr z, .activebox - ld c, a - ld b, 0 - ld hl, .boxbanks - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - ld b, a - call GetSRAMBank - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [hl] - call CloseSRAM - ld c, a - ld a, [wSavedAtLeastOnce] - and a - jr z, .newfile - ld a, c - ret - -.newfile - xor a - ret - -.activebox - ld a, BANK(sBoxCount) - ld b, a - call GetSRAMBank - ld hl, sBoxCount - ld a, [hl] - call CloseSRAM - ret -; e36a5 (38:76a5) - -.boxbanks ; e36a5 - dba sBox1 - dba sBox2 - dba sBox3 - dba sBox4 - dba sBox5 - dba sBox6 - dba sBox7 - dba sBox8 - dba sBox9 - dba sBox10 - dba sBox11 - dba sBox12 - dba sBox13 - dba sBox14 -; e36cf - -BillsPC_PrintBoxName: ; e36cf (38:76cf) - hlcoord 0, 0 - ld b, 2 - ld c, 18 - call TextBox - hlcoord 1, 2 - ld de, .Current - call PlaceString - ld a, [wCurBox] - and $f - call GetBoxName - hlcoord 11, 2 - call PlaceString - ret -; e36f1 (38:76f1) - -.Current: ; e36f1 - db "CURRENT@" -; e36f9 - -BillsPC_ChangeBoxSubmenu: ; e36f9 (38:76f9) - ld hl, .MenuHeader - call LoadMenuHeader - call VerticalMenu - call ExitMenu - ret c - ld a, [wMenuCursorY] - cp $1 - jr z, .Switch - cp $2 - jr z, .Name - cp $3 - jr z, .Print - and a - ret - -.Print: - call GetBoxCount - and a - jr z, .EmptyBox - ld e, l - ld d, h - ld a, [wMenuSelection] - dec a - ld c, a - farcall PrintPCBox - call BillsPC_ClearTilemap - and a - ret - -.EmptyBox: - call BillsPC_PlaceEmptyBoxString_SFX - and a - ret - -.Switch: - ld a, [wMenuSelection] - dec a - ld e, a - ld a, [wCurBox] - cp e - ret z - farcall ChangeBoxSaveGame - ret - -.Name: - ld b, $4 ; box - ld de, wd002 - farcall NamingScreen - call ClearTileMap - call LoadStandardFont - call LoadFontsBattleExtra - ld a, [wMenuSelection] - dec a - call GetBoxName - ld e, l - ld d, h - ld hl, wd002 - ld c, BOX_NAME_LENGTH - 1 - call InitString - ld a, [wMenuSelection] - dec a - call GetBoxName - ld de, wd002 - call CopyName2 - ret -; e3778 (38:7778) - - hlcoord 11, 7 ; unused - -.MenuHeader: ; 0xe377b - db MENU_BACKUP_TILES ; flags - menu_coords 11, 4, SCREEN_WIDTH - 1, 13 - dw .MenuData - db 1 ; default option -; 0xe3783 - -.MenuData: ; 0xe3783 - db STATICMENU_CURSOR ; flags - db 4 ; items - db "SWITCH@" - db "NAME@" - db "PRINT@" - db "QUIT@" -; 0xe379c - -BillsPC_PlaceChooseABoxString: ; e379c (38:779c) - ld de, .ChooseABox - jr BillsPC_PlaceChangeBoxString -; e37a1 (38:77a1) - -.ChooseABox: ; e37a1 - db "Choose a BOX.@" -; e37af - -BillsPC_PlaceWhatsUpString: ; e37af (38:77af) - ld de, .WhatsUp - jr BillsPC_PlaceChangeBoxString -; e37b4 (38:77b4) - -.WhatsUp: ; e37b4 - db "What's up?@" -; e37be - -BillsPC_PlaceEmptyBoxString_SFX: ; e37be (38:77be) - ld de, .NoMonString - call BillsPC_PlaceChangeBoxString - ld de, SFX_WRONG - call WaitPlaySFX - call WaitSFX - ld c, 50 - call DelayFrames - ret -; e37d3 (38:77d3) - -.NoMonString: ; e37d3 - db "There's no #MON.@" -; e37e3 - -BillsPC_PlaceChangeBoxString: ; e37e3 (38:77e3) - push de - hlcoord 0, 14 - lb bc, 2, 18 - call TextBox - pop de - hlcoord 1, 16 - call PlaceString - ld a, $1 - ld [hBGMapMode], a - ret diff --git a/engine/pokemon/billspctop.asm b/engine/pokemon/billspctop.asm deleted file mode 100644 index 1e808c02c..000000000 --- a/engine/pokemon/billspctop.asm +++ /dev/null @@ -1,387 +0,0 @@ -_BillsPC: ; e3fd - call .CheckCanUsePC - ret c - call .LogIn - call .UseBillsPC - jp .LogOut - -.CheckCanUsePC: ; e40a (3:640a) - ld a, [wPartyCount] - and a - ret nz - ld hl, .Text_GottaHavePokemon - call MenuTextBoxBackup - scf - ret - -.Text_GottaHavePokemon: ; 0xe417 - ; You gotta have #MON to call! - text_jump UnknownText_0x1c1006 - db "@" - -.LogIn: ; e41c (3:641c) - xor a - ld [hBGMapMode], a - call LoadStandardMenuHeader - call ClearPCItemScreen - ld hl, wOptions - ld a, [hl] - push af - set NO_TEXT_SCROLL, [hl] - ld hl, .Text_What - call PrintText - pop af - ld [wOptions], a - call LoadFontsBattleExtra - ret - -.Text_What: ; 0xe43a - ; What? - text_jump UnknownText_0x1c1024 - db "@" - -.LogOut: ; e43f (3:643f) - call CloseSubmenu - ret - -.UseBillsPC: ; e443 (3:6443) - ld hl, .MenuHeader - call LoadMenuHeader - ld a, $1 -.loop - ld [wMenuCursorBuffer], a - call SetPalettes - xor a - ld [wWhichIndexSet], a - ld [hBGMapMode], a - call DoNthMenu - jr c, .cancel - ld a, [wMenuCursorBuffer] - push af - ld a, [wMenuSelection] - ld hl, .Jumptable - rst JumpTable - pop bc - ld a, b - jr nc, .loop -.cancel - call CloseWindow - ret - -.MenuHeader: ; 0xe46f - db MENU_BACKUP_TILES ; flags - menu_coords 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - dw .MenuData - db 1 ; default option - -.MenuData: ; 0xe477 - db STATICMENU_CURSOR ; flags - db 0 ; items - dw .items - dw PlaceMenuStrings - dw .strings - -.strings ; e47f - db "WITHDRAW @" - db "DEPOSIT @" - db "CHANGE BOX@" - db "MOVE W/O MAIL@" - db "SEE YA!@" - -.Jumptable: ; e4ba (3:64ba) - dw BillsPC_WithdrawMenu - dw BillsPC_DepositMenu - dw BillsPC_ChangeBoxMenu - dw BillsPC_MovePKMNMenu - dw BillsPC_SeeYa - -.items ; e4c4 - db 5 - db 0 ; WITHDRAW - db 1; DEPOSIT - db 2 ; CHANGE BOX - db 3 ; MOVE PKMN - db 4 ; SEE YA! - db -1 - -BillsPC_SeeYa: ; e4cb - scf - ret - -BillsPC_MovePKMNMenu: ; e4cd - call LoadStandardMenuHeader - farcall IsAnyMonHoldingMail - jr nc, .no_mail - ld hl, .Text_MonHoldingMail - call PrintText - jr .quit - -.no_mail - farcall StartMoveMonWOMail_SaveGame - jr c, .quit - farcall _MovePKMNWithoutMail - call ReturnToMapFromSubmenu - call ClearPCItemScreen - -.quit - call CloseWindow - and a - ret - -.Text_MonHoldingMail: ; 0xe4f9 - ; There is a #MON holding MAIL. Please remove the MAIL. - text_jump UnknownText_0x1c102b - db "@" - -BillsPC_DepositMenu: ; e4fe (3:64fe) - call LoadStandardMenuHeader - farcall _DepositPKMN - call ReturnToMapFromSubmenu - call ClearPCItemScreen - call CloseWindow - and a - ret - -Unreferenced_Functione512: - ld a, [wPartyCount] - and a - jr z, .no_mon - cp 2 - jr c, .only_one_mon - and a - ret - -.no_mon - ld hl, .Text_NoMon - call MenuTextBoxBackup - scf - ret - -.only_one_mon - ld hl, .Text_ItsYourLastMon - call MenuTextBoxBackup - scf - ret - -.Text_NoMon: ; 0xe52e - ; You don't have a single #MON! - text_jump UnknownText_0x1c1062 - db "@" - -.Text_ItsYourLastMon: ; 0xe533 - ; You can't deposit your last #MON! - text_jump UnknownText_0x1c1080 - db "@" - -CheckCurPartyMonFainted: ; e538 - ld hl, wPartyMon1HP - ld de, PARTYMON_STRUCT_LENGTH - ld b, $0 -.loop - ld a, [wCurPartyMon] - cp b - jr z, .skip - ld a, [hli] - or [hl] - jr nz, .notfainted - dec hl - -.skip - inc b - ld a, [wPartyCount] - cp b - jr z, .done - add hl, de - jr .loop - -.done - scf - ret - -.notfainted - and a - ret - -BillsPC_WithdrawMenu: ; e559 (3:6559) - call LoadStandardMenuHeader - farcall _WithdrawPKMN - call ReturnToMapFromSubmenu - call ClearPCItemScreen - call CloseWindow - and a - ret - -Unreferenced_Functione56d: - ld a, [wPartyCount] - cp PARTY_LENGTH - jr nc, .asm_e576 - and a - ret - -.asm_e576 - ld hl, UnknownText_0xe57e - call MenuTextBoxBackup - scf - ret - -UnknownText_0xe57e: ; 0xe57e - ; You can't take any more #MON. - text_jump UnknownText_0x1c10a2 - db "@" - -BillsPC_ChangeBoxMenu: ; e583 (3:6583) - farcall _ChangeBox - and a - ret - -ClearPCItemScreen: ; e58b - call DisableSpriteUpdates - xor a - ld [hBGMapMode], a - call ClearBGPalettes - call ClearSprites - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - ld a, " " - call ByteFill - hlcoord 0, 0 - lb bc, 10, 18 - call TextBox - hlcoord 0, 12 - lb bc, 4, 18 - call TextBox - call WaitBGMap2 - call SetPalettes ; load regular palettes? - ret - -CopyBoxmonToTempMon: ; e5bb - ld a, [wCurPartyMon] - ld hl, sBoxMon1Species - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld de, wTempMonSpecies - ld bc, BOXMON_STRUCT_LENGTH - ld a, BANK(sBoxMon1Species) - call GetSRAMBank - call CopyBytes - call CloseSRAM - ret - -Unreferenced_Functione5d9: - ld a, [wCurBox] - cp b - jr z, .same_box - ld a, b - ld hl, .BoxAddrs - ld bc, 3 - call AddNTimes - ld a, [hli] - push af - ld a, [hli] - ld h, [hl] - ld l, a - pop af - jr .okay - -.same_box - ld a, BANK(sBoxCount) - ld hl, sBoxCount - -.okay - call GetSRAMBank - ld a, [hl] - ld bc, 1 + MONS_PER_BOX + 1 - add hl, bc - ld b, a - ld c, $0 - ld de, wc608 - ld a, b - and a - jr z, .empty_box -.loop - push hl - push bc - ld a, c - ld bc, 0 - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld a, [hl] - ld [de], a - inc de - ld [wCurSpecies], a - call GetBaseData - pop bc - pop hl - - push hl - push bc - ld a, c - ld bc, MONS_PER_BOX * (BOXMON_STRUCT_LENGTH + NAME_LENGTH) - add hl, bc - call SkipNames - call CopyBytes - pop bc - pop hl - - push hl - push bc - ld a, c - ld bc, MON_LEVEL - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld a, [hl] - ld [de], a - inc de - pop bc - pop hl - - push hl - push bc - ld a, c - ld bc, MON_DVS - add hl, bc - ld bc, BOXMON_STRUCT_LENGTH - call AddNTimes - ld a, [hli] - and $f0 - ld b, a - ld a, [hl] - and $f0 - swap a - or b - ld b, a - ld a, [wBaseGender] - cp b - ld a, $1 - jr c, .okay2 - xor a -.okay2 - ld [de], a - inc de - pop bc - pop hl - - inc c - dec b - jr nz, .loop -.empty_box - call CloseSRAM - ret - -.BoxAddrs: ; e66e - dba sBox1 - dba sBox2 - dba sBox3 - dba sBox4 - dba sBox5 - dba sBox6 - dba sBox7 - dba sBox8 - dba sBox9 - dba sBox10 - dba sBox11 - dba sBox12 - dba sBox13 - dba sBox14 diff --git a/engine/pokemon/breedmon_level_growth.asm b/engine/pokemon/breedmon_level_growth.asm new file mode 100644 index 000000000..dc22db798 --- /dev/null +++ b/engine/pokemon/breedmon_level_growth.asm @@ -0,0 +1,27 @@ +GetBreedMon1LevelGrowth: ; e698 + ld hl, wBreedMon1Stats + ld de, wTempMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + callfar CalcLevel + ld a, [wBreedMon1Level] + ld b, a + ld a, d + ld e, a + sub b + ld d, a + ret + +GetBreedMon2LevelGrowth: ; e6b3 + ld hl, wBreedMon2Stats + ld de, wTempMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + callfar CalcLevel + ld a, [wBreedMon2Level] + ld b, a + ld a, d + ld e, a + sub b + ld d, a + ret diff --git a/engine/pokemon/check_nick_errors.asm b/engine/pokemon/check_nick_errors.asm new file mode 100644 index 000000000..87ebd6bb3 --- /dev/null +++ b/engine/pokemon/check_nick_errors.asm @@ -0,0 +1,74 @@ +CheckNickErrors:: ; 669f +; error-check monster nick before use +; must be a peace offering to gamesharkers + +; input: de = nick location + + push bc + push de + ld b, MON_NAME_LENGTH + +.checkchar +; end of nick? + ld a, [de] + cp "@" ; terminator + jr z, .end + +; check if this char is a text command + ld hl, .textcommands + dec hl +.loop +; next entry + inc hl +; reached end of commands table? + ld a, [hl] + cp -1 + jr z, .done + +; is the current char between this value (inclusive)... + ld a, [de] + cp [hl] + inc hl + jr c, .loop +; ...and this one? + cp [hl] + jr nc, .loop + +; replace it with a "?" + ld a, "?" + ld [de], a + jr .loop + +.done +; next char + inc de +; reached end of nick without finding a terminator? + dec b + jr nz, .checkchar + +; change nick to "?@" + pop de + push de + ld a, "?" + ld [de], a + inc de + ld a, "@" + ld [de], a +.end +; if the nick has any errors at this point it's out of our hands + pop de + pop bc + ret + +.textcommands ; 66cf +; table defining which characters are actually text commands +; format: + ; ≥ < + db TX_START, TX_BOX + 1 + db "", "" + 1 + db "", "" + 1 + db "", "" + 1 + db "", "" + 1 + db "", "" + 1 + db "", "┘" + 1 + db -1 ; end diff --git a/engine/pokemon/checknickerrors.asm b/engine/pokemon/checknickerrors.asm deleted file mode 100644 index 87ebd6bb3..000000000 --- a/engine/pokemon/checknickerrors.asm +++ /dev/null @@ -1,74 +0,0 @@ -CheckNickErrors:: ; 669f -; error-check monster nick before use -; must be a peace offering to gamesharkers - -; input: de = nick location - - push bc - push de - ld b, MON_NAME_LENGTH - -.checkchar -; end of nick? - ld a, [de] - cp "@" ; terminator - jr z, .end - -; check if this char is a text command - ld hl, .textcommands - dec hl -.loop -; next entry - inc hl -; reached end of commands table? - ld a, [hl] - cp -1 - jr z, .done - -; is the current char between this value (inclusive)... - ld a, [de] - cp [hl] - inc hl - jr c, .loop -; ...and this one? - cp [hl] - jr nc, .loop - -; replace it with a "?" - ld a, "?" - ld [de], a - jr .loop - -.done -; next char - inc de -; reached end of nick without finding a terminator? - dec b - jr nz, .checkchar - -; change nick to "?@" - pop de - push de - ld a, "?" - ld [de], a - inc de - ld a, "@" - ld [de], a -.end -; if the nick has any errors at this point it's out of our hands - pop de - pop bc - ret - -.textcommands ; 66cf -; table defining which characters are actually text commands -; format: - ; ≥ < - db TX_START, TX_BOX + 1 - db "", "" + 1 - db "", "" + 1 - db "", "" + 1 - db "", "" + 1 - db "", "" + 1 - db "", "┘" + 1 - db -1 ; end diff --git a/engine/pokemon/correct_party_errors.asm b/engine/pokemon/correct_party_errors.asm new file mode 100644 index 000000000..cf60115ee --- /dev/null +++ b/engine/pokemon/correct_party_errors.asm @@ -0,0 +1,229 @@ +Unreferenced_CorrectPartyErrors: + ld hl, wPartyCount + ld a, [hl] + and a + ret z + + cp PARTY_LENGTH + 1 + jr c, .party_length_okay + ld a, PARTY_LENGTH + ld [hl], a +.party_length_okay + inc hl + + ld b, a + ld c, 0 +.loop1 + ld a, [hl] + and a + jr z, .invalid_species + cp NUM_POKEMON + 1 + jr z, .invalid_species + cp EGG + 1 + jr c, .next_species + +.invalid_species + ld [hl], SMEARGLE + push hl + push bc + ld a, c + ld hl, wPartyMon1Species + call GetPartyLocation + ld [hl], SMEARGLE + pop bc + pop hl + +.next_species + inc hl + inc c + dec b + jr nz, .loop1 + ld [hl], $ff + + ld hl, wPartyMon1 + ld a, [wPartyCount] + ld d, a + ld e, 0 +.loop2 + push de + push hl + ld b, h + ld c, l + ld a, [hl] + and a + jr z, .invalid_species_2 + cp NUM_POKEMON + 1 + jr c, .check_level + +.invalid_species_2 + ld [hl], SMEARGLE + push de + ld d, 0 + ld hl, wPartySpecies + add hl, de + pop de + ld a, SMEARGLE + ld [hl], a + +.check_level + ld [wCurSpecies], a + call GetBaseData + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + cp MIN_LEVEL + ld a, MIN_LEVEL + jr c, .invalid_level + ld a, [hl] + cp MAX_LEVEL + jr c, .load_level + ld a, MAX_LEVEL +.invalid_level + ld [hl], a +.load_level + ld [wCurPartyLevel], a + + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + ld b, TRUE + predef CalcMonStats + pop hl + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop de + inc e + dec d + jr nz, .loop2 + + ld de, wPartyMonNicknames + ld a, [wPartyCount] + ld b, a + ld c, 0 +.loop3 + push bc + call .GetLengthOfStringWith6CharCap + push de + farcall CheckStringForErrors + pop hl + pop bc + jr nc, .valid_nickname + + push bc + push hl + ld hl, wPartySpecies + push bc + ld b, 0 + add hl, bc + pop bc + ld a, [hl] + cp EGG + ld hl, .TAMAGO + jr z, .got_nickname + ld [wd265], a + call GetPokemonName + ld hl, wStringBuffer1 +.got_nickname + pop de + ld bc, MON_NAME_LENGTH + call CopyBytes + pop bc + +.valid_nickname + inc c + dec b + jr nz, .loop3 + + ld de, wPartyMonOT + ld a, [wPartyCount] + ld b, a + ld c, 0 +.loop4 + push bc + call .GetLengthOfStringWith6CharCap + push de + farcall CheckStringForErrors + pop hl + jr nc, .valid_ot_name + ld d, h + ld e, l + ld hl, wPlayerName + ld bc, NAME_LENGTH + call CopyBytes +.valid_ot_name + pop bc + inc c + dec b + jr nz, .loop4 + + ld hl, wPartyMon1Moves + ld a, [wPartyCount] + ld b, a +.loop5 + push hl + ld c, NUM_MOVES + ld a, [hl] + and a + jr z, .invalid_move + cp NUM_ATTACKS + 1 + jr c, .moves_loop +.invalid_move + ld [hl], POUND + +.moves_loop + ld a, [hl] + and a + jr z, .fill_invalid_moves + cp NUM_ATTACKS + 1 + jr c, .next_move + +.fill_invalid_moves + xor a + ld [hli], a + dec c + jr nz, .fill_invalid_moves + jr .next_pokemon + +.next_move + inc hl + dec c + jr nz, .moves_loop + +.next_pokemon + pop hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop bc + dec b + jr nz, .loop5 + ret +; 13b6b + +.TAMAGO: ; 13b6b + db "タマゴ@@@" +; 13b71 + +.GetLengthOfStringWith6CharCap: ; 13b71 + push de + ld c, 1 + ld b, NAME_LENGTH_JAPANESE +.search_loop + ld a, [de] + cp "@" + jr z, .done + inc de + inc c + dec b + jr nz, .search_loop + dec c + dec de + ld a, "@" + ld [de], a +.done + pop de + ret +; 13b87 diff --git a/engine/pokemon/correcterrorsinplayerparty.asm b/engine/pokemon/correcterrorsinplayerparty.asm deleted file mode 100644 index e815aa4c8..000000000 --- a/engine/pokemon/correcterrorsinplayerparty.asm +++ /dev/null @@ -1,229 +0,0 @@ -Unreferenced_CorrectErrorsInPlayerParty: - ld hl, wPartyCount - ld a, [hl] - and a - ret z - - cp PARTY_LENGTH + 1 - jr c, .party_length_okay - ld a, PARTY_LENGTH - ld [hl], a -.party_length_okay - inc hl - - ld b, a - ld c, 0 -.loop1 - ld a, [hl] - and a - jr z, .invalid_species - cp NUM_POKEMON + 1 - jr z, .invalid_species - cp EGG + 1 - jr c, .next_species - -.invalid_species - ld [hl], SMEARGLE - push hl - push bc - ld a, c - ld hl, wPartyMon1Species - call GetPartyLocation - ld [hl], SMEARGLE - pop bc - pop hl - -.next_species - inc hl - inc c - dec b - jr nz, .loop1 - ld [hl], $ff - - ld hl, wPartyMon1 - ld a, [wPartyCount] - ld d, a - ld e, 0 -.loop2 - push de - push hl - ld b, h - ld c, l - ld a, [hl] - and a - jr z, .invalid_species_2 - cp NUM_POKEMON + 1 - jr c, .check_level - -.invalid_species_2 - ld [hl], SMEARGLE - push de - ld d, 0 - ld hl, wPartySpecies - add hl, de - pop de - ld a, SMEARGLE - ld [hl], a - -.check_level - ld [wCurSpecies], a - call GetBaseData - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - cp MIN_LEVEL - ld a, MIN_LEVEL - jr c, .invalid_level - ld a, [hl] - cp MAX_LEVEL - jr c, .load_level - ld a, MAX_LEVEL -.invalid_level - ld [hl], a -.load_level - ld [wCurPartyLevel], a - - ld hl, MON_MAXHP - add hl, bc - ld d, h - ld e, l - ld hl, MON_STAT_EXP - 1 - add hl, bc - ld b, TRUE - predef CalcMonStats - pop hl - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop de - inc e - dec d - jr nz, .loop2 - - ld de, wPartyMonNicknames - ld a, [wPartyCount] - ld b, a - ld c, 0 -.loop3 - push bc - call .GetLengthOfStringWith6CharCap - push de - farcall CheckStringForErrors - pop hl - pop bc - jr nc, .valid_nickname - - push bc - push hl - ld hl, wPartySpecies - push bc - ld b, 0 - add hl, bc - pop bc - ld a, [hl] - cp EGG - ld hl, .TAMAGO - jr z, .got_nickname - ld [wd265], a - call GetPokemonName - ld hl, wStringBuffer1 -.got_nickname - pop de - ld bc, MON_NAME_LENGTH - call CopyBytes - pop bc - -.valid_nickname - inc c - dec b - jr nz, .loop3 - - ld de, wPartyMonOT - ld a, [wPartyCount] - ld b, a - ld c, 0 -.loop4 - push bc - call .GetLengthOfStringWith6CharCap - push de - farcall CheckStringForErrors - pop hl - jr nc, .valid_ot_name - ld d, h - ld e, l - ld hl, wPlayerName - ld bc, NAME_LENGTH - call CopyBytes -.valid_ot_name - pop bc - inc c - dec b - jr nz, .loop4 - - ld hl, wPartyMon1Moves - ld a, [wPartyCount] - ld b, a -.loop5 - push hl - ld c, NUM_MOVES - ld a, [hl] - and a - jr z, .invalid_move - cp NUM_ATTACKS + 1 - jr c, .moves_loop -.invalid_move - ld [hl], POUND - -.moves_loop - ld a, [hl] - and a - jr z, .fill_invalid_moves - cp NUM_ATTACKS + 1 - jr c, .next_move - -.fill_invalid_moves - xor a - ld [hli], a - dec c - jr nz, .fill_invalid_moves - jr .next_pokemon - -.next_move - inc hl - dec c - jr nz, .moves_loop - -.next_pokemon - pop hl - push bc - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop bc - dec b - jr nz, .loop5 - ret -; 13b6b - -.TAMAGO: ; 13b6b - db "タマゴ@@@" -; 13b71 - -.GetLengthOfStringWith6CharCap: ; 13b71 - push de - ld c, 1 - ld b, NAME_LENGTH_JAPANESE -.search_loop - ld a, [de] - cp "@" - jr z, .done - inc de - inc c - dec b - jr nz, .search_loop - dec c - dec de - ld a, "@" - ld [de], a -.done - pop de - ret -; 13b87 diff --git a/engine/pokemon/getbreedmonlevelgrowth.asm b/engine/pokemon/getbreedmonlevelgrowth.asm deleted file mode 100644 index dc22db798..000000000 --- a/engine/pokemon/getbreedmonlevelgrowth.asm +++ /dev/null @@ -1,27 +0,0 @@ -GetBreedMon1LevelGrowth: ; e698 - ld hl, wBreedMon1Stats - ld de, wTempMon - ld bc, BOXMON_STRUCT_LENGTH - call CopyBytes - callfar CalcLevel - ld a, [wBreedMon1Level] - ld b, a - ld a, d - ld e, a - sub b - ld d, a - ret - -GetBreedMon2LevelGrowth: ; e6b3 - ld hl, wBreedMon2Stats - ld de, wTempMon - ld bc, BOXMON_STRUCT_LENGTH - call CopyBytes - callfar CalcLevel - ld a, [wBreedMon2Level] - ld b, a - ld a, d - ld e, a - sub b - ld d, a - ret diff --git a/engine/pokemon/knows_move.asm b/engine/pokemon/knows_move.asm new file mode 100644 index 000000000..4ec3da347 --- /dev/null +++ b/engine/pokemon/knows_move.asm @@ -0,0 +1,25 @@ +KnowsMove: ; f9ea + ld a, MON_MOVES + call GetPartyParamLocation + ld a, [wPutativeTMHMMove] + ld b, a + ld c, NUM_MOVES +.loop + ld a, [hli] + cp b + jr z, .knows_move + dec c + jr nz, .loop + and a + ret + +.knows_move + ld hl, .Text_knows + call PrintText + scf + ret + +.Text_knows: ; 0xfa06 + ; knows @ . + text_jump UnknownText_0x1c5ea8 + db "@" diff --git a/engine/pokemon/knowsmove.asm b/engine/pokemon/knowsmove.asm deleted file mode 100644 index 4ec3da347..000000000 --- a/engine/pokemon/knowsmove.asm +++ /dev/null @@ -1,25 +0,0 @@ -KnowsMove: ; f9ea - ld a, MON_MOVES - call GetPartyParamLocation - ld a, [wPutativeTMHMMove] - ld b, a - ld c, NUM_MOVES -.loop - ld a, [hli] - cp b - jr z, .knows_move - dec c - jr nz, .loop - and a - ret - -.knows_move - ld hl, .Text_knows - call PrintText - scf - ret - -.Text_knows: ; 0xfa06 - ; knows @ . - text_jump UnknownText_0x1c5ea8 - db "@" diff --git a/engine/pokemon/level_up_happiness.asm b/engine/pokemon/level_up_happiness.asm new file mode 100644 index 000000000..8c6dd92fe --- /dev/null +++ b/engine/pokemon/level_up_happiness.asm @@ -0,0 +1,20 @@ +LevelUpHappinessMod: ; 2709e + ld a, [wCurPartyMon] + ld hl, wPartyMon1CaughtLocation + call GetPartyLocation + ld a, [hl] + and $7f + ld d, a + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + call GetWorldMapLocation + cp d + ld c, HAPPINESS_GAINLEVEL + jr nz, .ok + ld c, HAPPINESS_GAINLEVELATHOME + +.ok + callfar ChangeHappiness + ret diff --git a/engine/pokemon/leveluphappinessmod.asm b/engine/pokemon/leveluphappinessmod.asm deleted file mode 100644 index 8c6dd92fe..000000000 --- a/engine/pokemon/leveluphappinessmod.asm +++ /dev/null @@ -1,20 +0,0 @@ -LevelUpHappinessMod: ; 2709e - ld a, [wCurPartyMon] - ld hl, wPartyMon1CaughtLocation - call GetPartyLocation - ld a, [hl] - and $7f - ld d, a - ld a, [wMapGroup] - ld b, a - ld a, [wMapNumber] - ld c, a - call GetWorldMapLocation - cp d - ld c, HAPPINESS_GAINLEVEL - jr nz, .ok - ld c, HAPPINESS_GAINLEVELATHOME - -.ok - callfar ChangeHappiness - ret diff --git a/engine/rtc/print_hours_mins.asm b/engine/rtc/print_hours_mins.asm new file mode 100644 index 000000000..eb7dc1619 --- /dev/null +++ b/engine/rtc/print_hours_mins.asm @@ -0,0 +1,63 @@ +Unreferenced_Function1dd6a9: ; 1dd6a9 + ld a, b + ld b, c + ld c, a + push bc + push de + ld hl, sp+$2 + ld d, h + ld e, l + pop hl + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + pop bc + ret + +PrintHoursMins: ; 1dd6bb (77:56bb) +; Hours in b, minutes in c + ld a, b + cp 12 + push af + jr c, .AM + jr z, .PM + sub 12 + jr .PM +.AM: + or a + jr nz, .PM + ld a, 12 +.PM: + ld b, a +; Crazy stuff happening with the stack + push bc + ld hl, sp+$1 + push de + push hl + pop de + pop hl + ld [hl], " " + lb bc, 1, 2 + call PrintNum + ld [hl], ":" + inc hl + ld d, h + ld e, l + ld hl, sp+$0 + push de + push hl + pop de + pop hl + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + pop bc + ld de, String_AM + pop af + jr c, .place_am_pm + ld de, String_PM +.place_am_pm + inc hl + call PlaceString + ret + +String_AM: db "AM@" ; 1dd6fc +String_PM: db "PM@" ; 1dd6ff diff --git a/engine/rtc/printhoursmins.asm b/engine/rtc/printhoursmins.asm deleted file mode 100644 index eb7dc1619..000000000 --- a/engine/rtc/printhoursmins.asm +++ /dev/null @@ -1,63 +0,0 @@ -Unreferenced_Function1dd6a9: ; 1dd6a9 - ld a, b - ld b, c - ld c, a - push bc - push de - ld hl, sp+$2 - ld d, h - ld e, l - pop hl - lb bc, PRINTNUM_LEADINGZEROS | 2, 5 - call PrintNum - pop bc - ret - -PrintHoursMins: ; 1dd6bb (77:56bb) -; Hours in b, minutes in c - ld a, b - cp 12 - push af - jr c, .AM - jr z, .PM - sub 12 - jr .PM -.AM: - or a - jr nz, .PM - ld a, 12 -.PM: - ld b, a -; Crazy stuff happening with the stack - push bc - ld hl, sp+$1 - push de - push hl - pop de - pop hl - ld [hl], " " - lb bc, 1, 2 - call PrintNum - ld [hl], ":" - inc hl - ld d, h - ld e, l - ld hl, sp+$0 - push de - push hl - pop de - pop hl - lb bc, PRINTNUM_LEADINGZEROS | 1, 2 - call PrintNum - pop bc - ld de, String_AM - pop af - jr c, .place_am_pm - ld de, String_PM -.place_am_pm - inc hl - call PlaceString - ret - -String_AM: db "AM@" ; 1dd6fc -String_PM: db "PM@" ; 1dd6ff diff --git a/engine/tilesets/timeofday_pals.asm b/engine/tilesets/timeofday_pals.asm new file mode 100644 index 000000000..b8d43d252 --- /dev/null +++ b/engine/tilesets/timeofday_pals.asm @@ -0,0 +1,415 @@ +DummyPredef35: ; 8c000 +DummyPredef36: + ret + +UpdateTimeOfDayPal:: ; 8c001 + call UpdateTime + ld a, [wTimeOfDay] + ld [wCurTimeOfDay], a + call GetTimePalette + ld [wTimeOfDayPal], a + ret +; 8c011 + + +_TimeOfDayPals:: ; 8c011 +; return carry if pals are changed + +; forced pals? + ld hl, wTimeOfDayPalFlags + bit 7, [hl] + jr nz, .dontchange + +; do we need to bother updating? + ld a, [wTimeOfDay] + ld hl, wCurTimeOfDay + cp [hl] + jr z, .dontchange + +; if so, the time of day has changed + ld a, [wTimeOfDay] + ld [wCurTimeOfDay], a + +; get palette id + call GetTimePalette + +; same palette as before? + ld hl, wTimeOfDayPal + cp [hl] + jr z, .dontchange + +; update palette id + ld [wTimeOfDayPal], a + +; save bg palette 7 + ld hl, wBGPals1 palette PAL_BG_TEXT + +; save wram bank + ld a, [rSVBK] + ld b, a + + ld a, BANK(wBGPals1) + ld [rSVBK], a + +; push palette + ld c, NUM_PAL_COLORS +.push + ld d, [hl] + inc hl + ld e, [hl] + inc hl + push de + dec c + jr nz, .push + +; restore wram bank + ld a, b + ld [rSVBK], a + + +; update sgb pals + ld b, SCGB_MAPPALS + call GetSGBLayout + + +; restore bg palette 7 + ld hl, wOBPals1 - 1 ; last byte in wBGPals1 + +; save wram bank + ld a, [rSVBK] + ld d, a + + ld a, BANK(wOBPals1) + ld [rSVBK], a + +; pop palette + ld e, NUM_PAL_COLORS +.pop + pop bc + ld [hl], c + dec hl + ld [hl], b + dec hl + dec e + jr nz, .pop + +; restore wram bank + ld a, d + ld [rSVBK], a + +; update palettes + call _UpdateTimePals + call DelayFrame + +; successful change + scf + ret + +.dontchange +; no change occurred + and a + ret +; 8c070 + + +_UpdateTimePals:: ; 8c070 + ld c, $9 ; normal + call GetTimePalFade + call DmgToCgbTimePals + ret +; 8c079 + +FadeInPalettes:: ; 8c079 + ld c, $12 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsDecHL + ret +; 8c084 + +FadeOutPalettes:: ; 8c084 + call FillWhiteBGColor + ld c, $9 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsIncHL + ret +; 8c092 + +BattleTowerFade: ; 8c092 + call FillWhiteBGColor + ld c, $9 + call GetTimePalFade + ld b, $4 +.asm_8c09c + call DmgToCgbTimePals + inc hl + inc hl + inc hl + ld c, $7 + call DelayFrames + dec b + jr nz, .asm_8c09c + ret +; 8c0ab + +FadeInQuickly: ; 8c0ab + ld c, $0 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsIncHL + ret +; 8c0b6 + +FadeBlackQuickly: ; 8c0b6 + ld c, $9 + call GetTimePalFade + ld b, $4 + call ConvertTimePalsDecHL + ret +; 8c0c1 + + +FillWhiteBGColor: ; 8c0c1 + ld a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ld [rSVBK], a + + ld hl, wBGPals1 + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld hl, wBGPals1 + 1 palettes + ld c, 6 +.loop + ld a, e + ld [hli], a + ld a, d + ld [hli], a +rept 6 + inc hl +endr + dec c + jr nz, .loop + + pop af + ld [rSVBK], a + ret +; 8c0e5 + +ReplaceTimeOfDayPals: ; 8c0e5 + ld hl, .BrightnessLevels + ld a, [wMapTimeOfDay] + cp $4 ; Dark cave, needs Flash + jr z, .DarkCave + and $7 + add l + ld l, a + ld a, $0 + adc h + ld h, a + ld a, [hl] + ld [wTimeOfDayPalset], a + ret + +.DarkCave: + ld a, [wStatusFlags] + bit STATUSFLAGS_FLASH_F, a + jr nz, .UsedFlash + ld a, %11111111 ; 3, 3, 3, 3 + ld [wTimeOfDayPalset], a + ret + +.UsedFlash: + ld a, %10101010 ; 2, 2, 2, 2 + ld [wTimeOfDayPalset], a + ret +; 8c10f (23:410f) + +.BrightnessLevels: ; 8c10f + dc 3, 2, 1, 0 + dc 1, 1, 1, 1 + dc 2, 2, 2, 2 + dc 0, 0, 0, 0 + dc 3, 3, 3, 3 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 +; 8c117 + +GetTimePalette: ; 8c117 + ld a, [wTimeOfDay] + ld e, a + ld d, 0 + ld hl, .TimePalettes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 8c126 + +.TimePalettes: + dw .MorningPalette + dw .DayPalette + dw .NitePalette + dw .DarknessPalette + +.MorningPalette: + ld a, [wTimeOfDayPalset] + and %00000011 ; 0 + ret + +.DayPalette: + ld a, [wTimeOfDayPalset] + and %00001100 ; 1 + srl a + srl a + ret + +.NitePalette: + ld a, [wTimeOfDayPalset] + and %00110000 ; 2 + swap a + ret + +.DarknessPalette: + ld a, [wTimeOfDayPalset] + and %11000000 ; 3 + rlca + rlca + ret +; 8c14e + + +DmgToCgbTimePals: ; 8c14e + push hl + push de + ld a, [hli] + call DmgToCgbBGPals + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + call DmgToCgbObjPals + pop de + pop hl + ret +; 8c15e + +ConvertTimePalsIncHL: ; 8c15e +.loop + call DmgToCgbTimePals + inc hl + inc hl + inc hl + ld c, 2 + call DelayFrames + dec b + jr nz, .loop + ret +; 8c16d + +ConvertTimePalsDecHL: ; 8c16d +.loop + call DmgToCgbTimePals + dec hl + dec hl + dec hl + ld c, 2 + call DelayFrames + dec b + jr nz, .loop + ret +; 8c17c + + +GetTimePalFade: ; 8c17c +; check cgb + ld a, [hCGB] + and a + jr nz, .cgb + +; else: dmg + +; index + ld a, [wTimeOfDayPal] + and %11 + +; get fade table + push bc + ld c, a + ld b, $0 + ld hl, .dmgfades + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + pop bc + +; get place in fade table + ld b, $0 + add hl, bc + ret + +.cgb + ld hl, .cgbfade + ld b, $0 + add hl, bc + ret + +.dmgfades + dw .morn + dw .day + dw .nite + dw .darkness + +.morn + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11100100, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.day + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11100100, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.nite + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11100100, %11100100 + db %11101001, %11010000, %11010000 + db %10010000, %10000000, %10000000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 + +.darkness + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111111 + db %11111110, %11100100, %11111111 + db %11111101, %11010000, %11111111 + db %11111101, %10000000, %11111111 + db %00000000, %01000000, %00000000 + db %00000000, %00000000, %00000000 + +.cgbfade + db %11111111, %11111111, %11111111 + db %11111110, %11111110, %11111110 + db %11111001, %11111001, %11111001 + db %11100100, %11100100, %11100100 + db %10010000, %10010000, %10010000 + db %01000000, %01000000, %01000000 + db %00000000, %00000000, %00000000 +; 8c20f diff --git a/engine/tilesets/timeofdaypals.asm b/engine/tilesets/timeofdaypals.asm deleted file mode 100644 index b8d43d252..000000000 --- a/engine/tilesets/timeofdaypals.asm +++ /dev/null @@ -1,415 +0,0 @@ -DummyPredef35: ; 8c000 -DummyPredef36: - ret - -UpdateTimeOfDayPal:: ; 8c001 - call UpdateTime - ld a, [wTimeOfDay] - ld [wCurTimeOfDay], a - call GetTimePalette - ld [wTimeOfDayPal], a - ret -; 8c011 - - -_TimeOfDayPals:: ; 8c011 -; return carry if pals are changed - -; forced pals? - ld hl, wTimeOfDayPalFlags - bit 7, [hl] - jr nz, .dontchange - -; do we need to bother updating? - ld a, [wTimeOfDay] - ld hl, wCurTimeOfDay - cp [hl] - jr z, .dontchange - -; if so, the time of day has changed - ld a, [wTimeOfDay] - ld [wCurTimeOfDay], a - -; get palette id - call GetTimePalette - -; same palette as before? - ld hl, wTimeOfDayPal - cp [hl] - jr z, .dontchange - -; update palette id - ld [wTimeOfDayPal], a - -; save bg palette 7 - ld hl, wBGPals1 palette PAL_BG_TEXT - -; save wram bank - ld a, [rSVBK] - ld b, a - - ld a, BANK(wBGPals1) - ld [rSVBK], a - -; push palette - ld c, NUM_PAL_COLORS -.push - ld d, [hl] - inc hl - ld e, [hl] - inc hl - push de - dec c - jr nz, .push - -; restore wram bank - ld a, b - ld [rSVBK], a - - -; update sgb pals - ld b, SCGB_MAPPALS - call GetSGBLayout - - -; restore bg palette 7 - ld hl, wOBPals1 - 1 ; last byte in wBGPals1 - -; save wram bank - ld a, [rSVBK] - ld d, a - - ld a, BANK(wOBPals1) - ld [rSVBK], a - -; pop palette - ld e, NUM_PAL_COLORS -.pop - pop bc - ld [hl], c - dec hl - ld [hl], b - dec hl - dec e - jr nz, .pop - -; restore wram bank - ld a, d - ld [rSVBK], a - -; update palettes - call _UpdateTimePals - call DelayFrame - -; successful change - scf - ret - -.dontchange -; no change occurred - and a - ret -; 8c070 - - -_UpdateTimePals:: ; 8c070 - ld c, $9 ; normal - call GetTimePalFade - call DmgToCgbTimePals - ret -; 8c079 - -FadeInPalettes:: ; 8c079 - ld c, $12 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsDecHL - ret -; 8c084 - -FadeOutPalettes:: ; 8c084 - call FillWhiteBGColor - ld c, $9 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsIncHL - ret -; 8c092 - -BattleTowerFade: ; 8c092 - call FillWhiteBGColor - ld c, $9 - call GetTimePalFade - ld b, $4 -.asm_8c09c - call DmgToCgbTimePals - inc hl - inc hl - inc hl - ld c, $7 - call DelayFrames - dec b - jr nz, .asm_8c09c - ret -; 8c0ab - -FadeInQuickly: ; 8c0ab - ld c, $0 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsIncHL - ret -; 8c0b6 - -FadeBlackQuickly: ; 8c0b6 - ld c, $9 - call GetTimePalFade - ld b, $4 - call ConvertTimePalsDecHL - ret -; 8c0c1 - - -FillWhiteBGColor: ; 8c0c1 - ld a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ld [rSVBK], a - - ld hl, wBGPals1 - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - ld hl, wBGPals1 + 1 palettes - ld c, 6 -.loop - ld a, e - ld [hli], a - ld a, d - ld [hli], a -rept 6 - inc hl -endr - dec c - jr nz, .loop - - pop af - ld [rSVBK], a - ret -; 8c0e5 - -ReplaceTimeOfDayPals: ; 8c0e5 - ld hl, .BrightnessLevels - ld a, [wMapTimeOfDay] - cp $4 ; Dark cave, needs Flash - jr z, .DarkCave - and $7 - add l - ld l, a - ld a, $0 - adc h - ld h, a - ld a, [hl] - ld [wTimeOfDayPalset], a - ret - -.DarkCave: - ld a, [wStatusFlags] - bit STATUSFLAGS_FLASH_F, a - jr nz, .UsedFlash - ld a, %11111111 ; 3, 3, 3, 3 - ld [wTimeOfDayPalset], a - ret - -.UsedFlash: - ld a, %10101010 ; 2, 2, 2, 2 - ld [wTimeOfDayPalset], a - ret -; 8c10f (23:410f) - -.BrightnessLevels: ; 8c10f - dc 3, 2, 1, 0 - dc 1, 1, 1, 1 - dc 2, 2, 2, 2 - dc 0, 0, 0, 0 - dc 3, 3, 3, 3 - dc 3, 2, 1, 0 - dc 3, 2, 1, 0 - dc 3, 2, 1, 0 -; 8c117 - -GetTimePalette: ; 8c117 - ld a, [wTimeOfDay] - ld e, a - ld d, 0 - ld hl, .TimePalettes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl -; 8c126 - -.TimePalettes: - dw .MorningPalette - dw .DayPalette - dw .NitePalette - dw .DarknessPalette - -.MorningPalette: - ld a, [wTimeOfDayPalset] - and %00000011 ; 0 - ret - -.DayPalette: - ld a, [wTimeOfDayPalset] - and %00001100 ; 1 - srl a - srl a - ret - -.NitePalette: - ld a, [wTimeOfDayPalset] - and %00110000 ; 2 - swap a - ret - -.DarknessPalette: - ld a, [wTimeOfDayPalset] - and %11000000 ; 3 - rlca - rlca - ret -; 8c14e - - -DmgToCgbTimePals: ; 8c14e - push hl - push de - ld a, [hli] - call DmgToCgbBGPals - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - call DmgToCgbObjPals - pop de - pop hl - ret -; 8c15e - -ConvertTimePalsIncHL: ; 8c15e -.loop - call DmgToCgbTimePals - inc hl - inc hl - inc hl - ld c, 2 - call DelayFrames - dec b - jr nz, .loop - ret -; 8c16d - -ConvertTimePalsDecHL: ; 8c16d -.loop - call DmgToCgbTimePals - dec hl - dec hl - dec hl - ld c, 2 - call DelayFrames - dec b - jr nz, .loop - ret -; 8c17c - - -GetTimePalFade: ; 8c17c -; check cgb - ld a, [hCGB] - and a - jr nz, .cgb - -; else: dmg - -; index - ld a, [wTimeOfDayPal] - and %11 - -; get fade table - push bc - ld c, a - ld b, $0 - ld hl, .dmgfades - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - pop bc - -; get place in fade table - ld b, $0 - add hl, bc - ret - -.cgb - ld hl, .cgbfade - ld b, $0 - add hl, bc - ret - -.dmgfades - dw .morn - dw .day - dw .nite - dw .darkness - -.morn - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11100100, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.day - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11100100, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.nite - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11100100, %11100100 - db %11101001, %11010000, %11010000 - db %10010000, %10000000, %10000000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 - -.darkness - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111111 - db %11111110, %11100100, %11111111 - db %11111101, %11010000, %11111111 - db %11111101, %10000000, %11111111 - db %00000000, %01000000, %00000000 - db %00000000, %00000000, %00000000 - -.cgbfade - db %11111111, %11111111, %11111111 - db %11111110, %11111110, %11111110 - db %11111001, %11111001, %11111001 - db %11100100, %11100100, %11100100 - db %10010000, %10010000, %10010000 - db %01000000, %01000000, %01000000 - db %00000000, %00000000, %00000000 -; 8c20f diff --git a/main.asm b/main.asm index 82e00596b..fac1b8f3f 100644 --- a/main.asm +++ b/main.asm @@ -3,18 +3,19 @@ INCLUDE "constants.asm" SECTION "bank1", ROMX -INCLUDE "engine/link/placewaitingtext.asm" -INCLUDE "engine/gfx/loadpushoam.asm" +INCLUDE "engine/link/place_waiting_text.asm" +INCLUDE "engine/gfx/load_push_oam.asm" INCLUDE "engine/overworld/map_objects.asm" INCLUDE "engine/menus/intro_menu.asm" INCLUDE "engine/overworld/init_map.asm" INCLUDE "engine/pokemon/learn.asm" -INCLUDE "engine/pokemon/checknickerrors.asm" +INCLUDE "engine/pokemon/check_nick_errors.asm" INCLUDE "engine/math/math.asm" INCLUDE "data/items/attributes.asm" INCLUDE "engine/overworld/npc_movement.asm" INCLUDE "engine/events/happiness_egg.asm" -INCLUDE "engine/events/specials_2.asm" +INCLUDE "engine/events/shuckle.asm" +INCLUDE "engine/events/haircut.asm" SECTION "bank2", ROMX @@ -29,19 +30,19 @@ SECTION "bank3", ROMX INCLUDE "engine/events/checktime.asm" INCLUDE "engine/events/specials.asm" -INCLUDE "engine/math/printnum.asm" +INCLUDE "engine/math/print_num.asm" INCLUDE "engine/pokemon/health.asm" INCLUDE "engine/events/overworld.asm" INCLUDE "engine/items/items.asm" INCLUDE "engine/overworld/player_step.asm" INCLUDE "engine/battle/anim_hp_bar.asm" INCLUDE "engine/pokemon/move_mon.asm" -INCLUDE "engine/pokemon/billspctop.asm" -INCLUDE "engine/pokemon/getbreedmonlevelgrowth.asm" +INCLUDE "engine/pokemon/bills_pc_top.asm" +INCLUDE "engine/pokemon/breedmon_level_growth.asm" INCLUDE "engine/events/bug_contest/caught_mon.asm" INCLUDE "engine/items/item_effects.asm" -INCLUDE "engine/battle_anims/getpokeballwobble.asm" -INCLUDE "engine/pokemon/knowsmove.asm" +INCLUDE "engine/battle_anims/pokeball_wobble.asm" +INCLUDE "engine/pokemon/knows_move.asm" SECTION "bank4", ROMX @@ -64,8 +65,8 @@ INCLUDE "engine/events/std_collision.asm" INCLUDE "engine/events/bug_contest/judging.asm" INCLUDE "engine/events/pokerus/apply_pokerus_tick.asm" INCLUDE "engine/events/bug_contest/contest_2.asm" -INCLUDE "engine/pokemon/correcterrorsinplayerparty.asm" -INCLUDE "engine/math/getsquareroot.asm" +INCLUDE "engine/pokemon/correct_party_errors.asm" +INCLUDE "engine/math/get_square_root.asm" SECTION "bank5", ROMX @@ -102,7 +103,7 @@ SECTION "bank9", ROMX INCLUDE "data/text_buffers.asm" INCLUDE "engine/menus/menu.asm" -INCLUDE "engine/items/updateitemdescription.asm" +INCLUDE "engine/items/update_item_description.asm" INCLUDE "engine/events/pokepic.asm" INCLUDE "engine/overworld/map_objects_2.asm" INCLUDE "engine/menus/scrolling_menu.asm" @@ -114,11 +115,11 @@ INCLUDE "engine/items/buy_sell_toss.asm" INCLUDE "engine/menus/trainer_card.asm" INCLUDE "engine/events/prof_oaks_pc.asm" INCLUDE "engine/overworld/decorations.asm" -INCLUDE "engine/pokemon/leveluphappinessmod.asm" +INCLUDE "engine/pokemon/level_up_happiness.asm" INCLUDE "engine/battle/read_trainer_dvs.asm" INCLUDE "data/trainers/dvs.asm" INCLUDE "engine/battle/returntobattle_useball.asm" -INCLUDE "engine/battle/consumehelditem.asm" +INCLUDE "engine/battle/consume_held_item.asm" INCLUDE "data/moves/effects_pointers.asm" INCLUDE "data/moves/effects.asm" INCLUDE "engine/events/kurt_selectquantity_interpretjoypad.asm" @@ -148,7 +149,7 @@ INCLUDE "engine/items/tmhm.asm" INCLUDE "data/moves/descriptions.asm" INCLUDE "engine/events/pokerus/pokerus.asm" INCLUDE "engine/battle/start_battle.asm" -INCLUDE "engine/gfx/placegraphic.asm" +INCLUDE "engine/gfx/place_graphic.asm" SECTION "Effect Commands", ROMX @@ -192,7 +193,7 @@ INCLUDE "engine/pokemon/mail.asm" SECTION "Crystal Features 1", ROMX INCLUDE "engine/menus/init_gender.asm" -INCLUDE "engine/gfx/drawkrispackgfx.asm" +INCLUDE "engine/items/pack_kris.asm" INCLUDE "engine/events/move_tutor.asm" INCLUDE "engine/gfx/crystal_layouts.asm" INCLUDE "engine/events/celebi.asm" @@ -208,11 +209,11 @@ SECTION "bank13", ROMX INCLUDE "engine/tilesets/map_palettes.asm" INCLUDE "gfx/tileset_palette_maps.asm" INCLUDE "data/collision_permissions.asm" -INCLUDE "engine/menus/emptyallsrambanks.asm" +INCLUDE "engine/menus/empty_sram.asm" INCLUDE "engine/menus/savemenu_copytilemapatonce.asm" INCLUDE "engine/events/checksave.asm" INCLUDE "data/maps/scenes.asm" -INCLUDE "engine/overworld/loadmappart.asm" +INCLUDE "engine/overworld/load_map_part.asm" INCLUDE "engine/phone/phonering_copytilemapatonce.asm" Shrink1Pic: ; 4d249 @@ -226,7 +227,7 @@ INCLUDE "engine/rtc/reset_password.asm" INCLUDE "engine/menus/delete_save.asm" INCLUDE "data/tilesets.asm" INCLUDE "engine/smallflag.asm" -INCLUDE "engine/gfx/trademonfrontpic.asm" +INCLUDE "engine/gfx/trademon_frontpic.asm" INCLUDE "engine/events/pokerus/check_pokerus.asm" INCLUDE "engine/events/lucky_number.asm" INCLUDE "engine/pokemon/caught_data.asm" @@ -238,7 +239,7 @@ INCLUDE "engine/movie/init_hof_credits.asm" INCLUDE "engine/events/battle_tower/get_trainer_class.asm" INCLUDE "engine/battle/sliding_intro.asm" INCLUDE "mobile/print_opp_message.asm" -INCLUDE "engine/battle/checkbattlescene.asm" +INCLUDE "engine/battle/check_battle_scene.asm" INCLUDE "engine/movie/gbc_only.asm" INCLUDE "engine/events/poke_seer.asm" @@ -256,7 +257,7 @@ INCLUDE "engine/pokemon/tempmon.asm" INCLUDE "engine/pokemon/types.asm" INCLUDE "engine/battle/unreferenced_getgen1trainerclassname.asm" INCLUDE "engine/pokemon/mon_stats.asm" -INCLUDE "engine/link/initlist.asm" +INCLUDE "engine/link/init_list.asm" INCLUDE "engine/pokemon/experience.asm" INCLUDE "engine/pokemon/switchpartymons.asm" INCLUDE "engine/gfx/load_pics.asm" @@ -305,7 +306,7 @@ INCLUDE "mobile/mobile_22_2.asm" SECTION "bank23", ROMX -INCLUDE "engine/tilesets/timeofdaypals.asm" +INCLUDE "engine/tilesets/timeofday_pals.asm" INCLUDE "engine/battle/battle_transition.asm" INCLUDE "engine/events/field_moves.asm" INCLUDE "engine/events/magnet_train.asm" @@ -356,7 +357,7 @@ SECTION "bank2E", ROMX INCLUDE "engine/events/map_name_sign.asm" INCLUDE "engine/events/checkforhiddenitems.asm" INCLUDE "engine/events/treemons.asm" -INCLUDE "engine/events/loadfishinggfx.asm" +INCLUDE "engine/events/fishing_gfx.asm" INCLUDE "engine/pokegear/radio.asm" INCLUDE "engine/pokemon/mail_2.asm" @@ -434,7 +435,7 @@ INCLUDE "engine/events/print_unown_2.asm" INCLUDE "engine/games/card_flip.asm" INCLUDE "engine/games/unown_puzzle.asm" INCLUDE "engine/games/dummy_game.asm" -INCLUDE "engine/pokemon/billspc.asm" +INCLUDE "engine/pokemon/bills_pc.asm" SECTION "bank39", ROMX @@ -451,8 +452,8 @@ SECTION "bank3E", ROMX INCLUDE "engine/gfx/load_font.asm" INCLUDE "engine/link/time_capsule.asm" INCLUDE "engine/events/name_rater.asm" -INCLUDE "engine/events/playslowcry.asm" -INCLUDE "engine/pokedex/newpokedexentry.asm" +INCLUDE "engine/events/play_slow_cry.asm" +INCLUDE "engine/pokedex/new_pokedex_entry.asm" INCLUDE "engine/link/time_capsule_2.asm" INCLUDE "engine/pokedex/unown_dex.asm" INCLUDE "engine/events/magikarp.asm" @@ -478,7 +479,7 @@ INCLUDE "engine/overworld/warp_connection.asm" INCLUDE "engine/link/mystery_gift.asm" INCLUDE "engine/battle/used_move_text.asm" INCLUDE "mobile/mobile_41.asm" -INCLUDE "engine/gfx/loadoverworldfont.asm" +INCLUDE "engine/gfx/load_overworld_font.asm" SECTION "Mobile 42", ROMX @@ -527,7 +528,7 @@ INCLUDE "data/phone/text/extra2.asm" SECTION "UpdateBattleHUDs", ROMX -INCLUDE "engine/battle/updatebattlehuds.asm" +INCLUDE "engine/battle/update_battle_huds.asm" SECTION "Mobile 5E", ROMX @@ -567,7 +568,7 @@ INCLUDE "data/phone/text/trainers.asm" SECTION "Miscellaneous Text", ROMX INCLUDE "data/items/names.asm" -INCLUDE "engine/items/printitemdescription.asm" +INCLUDE "engine/items/print_item_description.asm" INCLUDE "data/items/descriptions.asm" INCLUDE "data/moves/names.asm" INCLUDE "engine/overworld/landmarks.asm" @@ -583,7 +584,7 @@ INCLUDE "engine/printer/print_party.asm" SECTION "bank77_2", ROMX -INCLUDE "engine/rtc/printhoursmins.asm" +INCLUDE "engine/rtc/print_hours_mins.asm" INCLUDE "engine/events/diploma.asm" INCLUDE "engine/pokedex/pokedex_3.asm" INCLUDE "engine/events/catch_tutorial_input.asm" -- cgit v1.2.3 From 38107209a6ad431b399cc36405c0af8b5babf5ef Mon Sep 17 00:00:00 2001 From: mid-kid Date: Wed, 4 Apr 2018 23:44:24 +0200 Subject: Update docs and comments to reflect renames --- constants/text_constants.asm | 2 +- docs/battle_anim_commands.md | 2 +- docs/bugs_and_glitches.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/constants/text_constants.asm b/constants/text_constants.asm index 5a9a35931..ee5589561 100644 --- a/constants/text_constants.asm +++ b/constants/text_constants.asm @@ -36,7 +36,7 @@ TEXTBOX_INNERY EQU TEXTBOX_Y + 2 const PRINTNUM_RIGHTALIGN_F ; 6 const PRINTNUM_LEADINGZEROS_F ; 7 -; PrintNum arguments (see engine/math/printnum.asm) +; PrintNum arguments (see engine/math/print_num.asm) PRINTNUM_MONEY EQU 1 << PRINTNUM_MONEY_F PRINTNUM_RIGHTALIGN EQU 1 << PRINTNUM_RIGHTALIGN_F PRINTNUM_LEADINGZEROS EQU 1 << PRINTNUM_LEADINGZEROS_F diff --git a/docs/battle_anim_commands.md b/docs/battle_anim_commands.md index bd40e8a6d..86763b24a 100644 --- a/docs/battle_anim_commands.md +++ b/docs/battle_anim_commands.md @@ -88,7 +88,7 @@ Temporarily creates sprites from the top row of the player backpic, so that the ## `$DB`: `anim_checkpokeball` -Sets `BattleAnimVar` to the result of [GetPokeBallWobble](/engine/battle_anims/getpokeballwobble.asm). +Sets `BattleAnimVar` to the result of [GetPokeBallWobble](/engine/battle_anims/pokeball_wobble.asm). ## `$DC`: `anim_transform` diff --git a/docs/bugs_and_glitches.md b/docs/bugs_and_glitches.md index c24876873..2c7f83e25 100644 --- a/docs/bugs_and_glitches.md +++ b/docs/bugs_and_glitches.md @@ -713,7 +713,7 @@ This is a bug with `ItemAttributes` in [data/items/attributes.asm](/data/items/a ## Daisy's grooming doesn't always increase happiness -This is a bug with `HaircutOrGrooming` in [engine/events/specials_2.asm](/engine/events/specials_2.asm): +This is a bug with `HaircutOrGrooming` in [engine/events/haircut.asm](/engine/events/haircut.asm): ```asm ; Bug: Subtracting $ff from $ff fails to set c. -- cgit v1.2.3