diff options
author | Daniel Harding <33dannye@gmail.com> | 2021-10-10 17:08:01 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-10 17:08:01 -0500 |
commit | 7d5761dcd9c0ecca427bd568e91ae137b04ed54e (patch) | |
tree | 2130f26a5bc8005f3df30976f17f0683e6f18113 /src | |
parent | 40d32ea4e266fa2e87f344d50ba854d53b02fba3 (diff) | |
parent | be47e02cd7c844944665108b5c921b1eae27ad7b (diff) |
Merge pull request #112 from ElectroDeoxys/master
Split bank 6 and some bank 7
Diffstat (limited to 'src')
-rw-r--r-- | src/data/maps/tilemaps.asm | 371 | ||||
-rw-r--r-- | src/data/sequences/credits.asm (renamed from src/data/sequences/credits_sequence.asm) | 0 | ||||
-rw-r--r-- | src/data/sequences/intro.asm | 47 | ||||
-rw-r--r-- | src/data/sequences/opening_sequence.asm | 47 | ||||
-rw-r--r-- | src/engine/auto_deck_machines.asm | 191 | ||||
-rw-r--r-- | src/engine/bank04.asm | 4 | ||||
-rw-r--r-- | src/engine/bank06.asm | 5974 | ||||
-rw-r--r-- | src/engine/bank07.asm | 1863 | ||||
-rw-r--r-- | src/engine/bank20.asm | 1205 | ||||
-rw-r--r-- | src/engine/copy_card_name.asm | 152 | ||||
-rw-r--r-- | src/engine/credits.asm | 189 | ||||
-rw-r--r-- | src/engine/duel/ai/attacks.asm (renamed from src/engine/ai/attacks.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/boss_deck_set_up.asm (renamed from src/engine/ai/boss_deck_set_up.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/common.asm (renamed from src/engine/ai/common.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/core.asm (renamed from src/engine/ai/core.asm) | 20 | ||||
-rw-r--r-- | src/engine/duel/ai/damage_calculation.asm (renamed from src/engine/ai/damage_calculation.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/deck_ai.asm (renamed from src/engine/ai/deck_ai.asm) | 38 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/fire_charge.asm (renamed from src/engine/ai/decks/fire_charge.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/first_strike.asm (renamed from src/engine/ai/decks/first_strike.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/flower_power.asm (renamed from src/engine/ai/decks/flower_power.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/general.asm (renamed from src/engine/ai/decks/general.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/general_no_retreat.asm (renamed from src/engine/ai/decks/general_no_retreat.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/go_go_rain_dance.asm (renamed from src/engine/ai/decks/go_go_rain_dance.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/im_ronald.asm (renamed from src/engine/ai/decks/im_ronald.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/invincible_ronald.asm (renamed from src/engine/ai/decks/invincible_ronald.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/legendary_articuno.asm (renamed from src/engine/ai/decks/legendary_articuno.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/legendary_dragonite.asm (renamed from src/engine/ai/decks/legendary_dragonite.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/legendary_moltres.asm (renamed from src/engine/ai/decks/legendary_moltres.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/legendary_ronald.asm (renamed from src/engine/ai/decks/legendary_ronald.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/legendary_zapdos.asm (renamed from src/engine/ai/decks/legendary_zapdos.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/powerful_ronald.asm (renamed from src/engine/ai/decks/powerful_ronald.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/rock_crusher.asm (renamed from src/engine/ai/decks/rock_crusher.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/sams_practice.asm (renamed from src/engine/ai/decks/sams_practice.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/strange_psyshock.asm (renamed from src/engine/ai/decks/strange_psyshock.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/unreferenced.asm (renamed from src/engine/ai/decks/unreferenced.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/wonders_of_science.asm (renamed from src/engine/ai/decks/wonders_of_science.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/decks/zapping_selfdestruct.asm (renamed from src/engine/ai/decks/zapping_selfdestruct.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/energy.asm (renamed from src/engine/ai/energy.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/hand_pokemon.asm (renamed from src/engine/ai/hand_pokemon.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/init.asm (renamed from src/engine/ai/init.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/pkmn_powers.asm (renamed from src/engine/ai/pkmn_powers.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/retreat.asm (renamed from src/engine/ai/retreat.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/special_attacks.asm (renamed from src/engine/ai/special_attacks.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/ai/trainer_cards.asm (renamed from src/engine/ai/trainer_cards.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/animations/commands.asm | 354 | ||||
-rw-r--r-- | src/engine/duel/animations/core.asm | 661 | ||||
-rw-r--r-- | src/engine/duel/animations/screen_effects.asm | 286 | ||||
-rw-r--r-- | src/engine/duel/core.asm | 2 | ||||
-rw-r--r-- | src/engine/duel/effect_commands.asm (renamed from src/data/duel/effect_commands.asm) | 0 | ||||
-rw-r--r-- | src/engine/duel/effect_functions.asm (renamed from src/engine/effect_functions.asm) | 0 | ||||
-rw-r--r-- | src/engine/game_loop.asm | 2 | ||||
-rw-r--r-- | src/engine/gfx/gfx_table_pointers.asm | 6 | ||||
-rw-r--r-- | src/engine/gfx/palettes.asm | 170 | ||||
-rw-r--r-- | src/engine/gfx/sprite_animations.asm | 224 | ||||
-rw-r--r-- | src/engine/gfx/sprite_vblank.asm | 39 | ||||
-rw-r--r-- | src/engine/gfx/sprites.asm | 122 | ||||
-rw-r--r-- | src/engine/gfx/tilemaps.asm | 114 | ||||
-rw-r--r-- | src/engine/gfx/tilesets.asm | 95 | ||||
-rw-r--r-- | src/engine/input_name.asm | 1417 | ||||
-rw-r--r-- | src/engine/intro.asm | 114 | ||||
-rw-r--r-- | src/engine/link/card_pop.asm | 399 | ||||
-rw-r--r-- | src/engine/link/ir_core.asm | 531 | ||||
-rw-r--r-- | src/engine/link/ir_functions.asm | 323 | ||||
-rw-r--r-- | src/engine/link/link_duel.asm | 179 | ||||
-rw-r--r-- | src/engine/link/printer.asm | 1124 | ||||
-rw-r--r-- | src/engine/menus/booster_pack.asm | 42 | ||||
-rw-r--r-- | src/engine/menus/common.asm | 8 | ||||
-rw-r--r-- | src/engine/menus/glossary.asm | 221 | ||||
-rw-r--r-- | src/engine/menus/play_area.asm | 570 | ||||
-rw-r--r-- | src/engine/menus/start.asm | 418 | ||||
-rw-r--r-- | src/engine/menus/unknown.asm | 103 | ||||
-rw-r--r-- | src/engine/overworld/scripting.asm | 2 | ||||
-rw-r--r-- | src/engine/promotional_card.asm | 61 | ||||
-rw-r--r-- | src/engine/sequences/credits_sequence_commands.asm | 4 | ||||
-rw-r--r-- | src/engine/sequences/intro_sequence_commands.asm (renamed from src/engine/sequences/opening_sequence_commands.asm) | 159 | ||||
-rw-r--r-- | src/engine/sgb.asm (renamed from src/engine/bank1c.asm) | 210 | ||||
-rw-r--r-- | src/engine/starter_deck.asm | 182 | ||||
-rw-r--r-- | src/engine/unused_copyright.asm | 26 | ||||
-rw-r--r-- | src/engine/unused_save_validation.asm | 96 | ||||
-rw-r--r-- | src/gfx.asm | 1026 | ||||
-rw-r--r-- | src/home/ai.asm | 2 | ||||
-rw-r--r-- | src/home/lcd.asm | 4 | ||||
-rw-r--r-- | src/home/map.asm | 2 | ||||
-rw-r--r-- | src/layout.link | 22 | ||||
-rw-r--r-- | src/macros/intro_sequence.asm | 63 | ||||
-rw-r--r-- | src/macros/opening_sequence.asm | 63 | ||||
-rw-r--r-- | src/main.asm | 86 | ||||
-rw-r--r-- | src/sram.asm | 2 | ||||
-rw-r--r-- | src/text/text1.asm | 2 | ||||
-rw-r--r-- | src/text/text_offsets.asm | 2 | ||||
-rw-r--r-- | src/wram.asm | 4 |
91 files changed, 9855 insertions, 9788 deletions
diff --git a/src/data/maps/tilemaps.asm b/src/data/maps/tilemaps.asm new file mode 100644 index 0000000..bf66636 --- /dev/null +++ b/src/data/maps/tilemaps.asm @@ -0,0 +1,371 @@ +OverworldMapTilemap:: + db $14 ; width + db $12 ; height + dw NULL + db FALSE ; cgb mode + INCBIN "data/maps/tiles/overworld_map.bin" + +OverworldMapCGBTilemap:: + db $14 ; width + db $12 ; height + dw NULL + db TRUE ; cgb mode + INCBIN "data/maps/tiles/overworld_map_cgb.bin" + +MasonLaboratoryTilemap:: + db $1c ; width + db $1e ; height + dw MasonLaboratoryPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/mason_laboratory.bin" +MasonLaboratoryPermissions: + INCBIN "data/maps/permissions/mason_laboratory.bin" + +MasonLaboratoryCGBTilemap:: + db $1c ; width + db $1e ; height + dw MasonLaboratoryCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/mason_laboratory_cgb.bin" +MasonLaboratoryCGBPermissions: + INCBIN "data/maps/permissions/mason_laboratory_cgb.bin" + +ChallengeMachineMapEventTilemap:: + db $04 ; width + db $06 ; height + dw ChallengeMachineMapEventPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/challenge_machine_map_event.bin" +ChallengeMachineMapEventPermissions: + INCBIN "data/maps/permissions/challenge_machine_map_event.bin" + +ChallengeMachineMapEventCGBTilemap:: + db $04 ; width + db $06 ; height + dw ChallengeMachineMapEventCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/challenge_machine_map_event_cgb.bin" +ChallengeMachineMapEventCGBPermissions: + INCBIN "data/maps/permissions/challenge_machine_map_event_cgb.bin" + +DeckMachineRoomTilemap:: + db $18 ; width + db $1e ; height + dw DeckMachineRoomPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/deck_machine_room.bin" +DeckMachineRoomPermissions: + INCBIN "data/maps/permissions/deck_machine_room.bin" + +DeckMachineRoomCGBTilemap:: + db $18 ; width + db $1e ; height + dw DeckMachineRoomCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/deck_machine_room_cgb.bin" +DeckMachineRoomCGBPermissions: + INCBIN "data/maps/permissions/deck_machine_room_cgb.bin" + +DeckMachineMapEventTilemap:: + db $04 ; width + db $01 ; height + dw DeckMachineMapEventPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/deck_machine_map_event.bin" +DeckMachineMapEventPermissions: + INCBIN "data/maps/permissions/deck_machine_map_event.bin" + +DeckMachineMapEventCGBTilemap:: + db $04 ; width + db $01 ; height + dw DeckMachineMapEventCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/deck_machine_map_event_cgb.bin" +DeckMachineMapEventCGBPermissions: + INCBIN "data/maps/permissions/deck_machine_map_event_cgb.bin" + +IshiharaTilemap:: + db $14 ; width + db $18 ; height + dw IshiharaPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/ishihara.bin" +IshiharaPermissions: + INCBIN "data/maps/permissions/ishihara.bin" + +IshiharaCGBTilemap:: + db $14 ; width + db $18 ; height + dw IshiharaCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/ishihara_cgb.bin" +IshiharaCGBPermissions: + INCBIN "data/maps/permissions/ishihara_cgb.bin" + +FightingClubEntranceTilemap:: + db $14 ; width + db $12 ; height + dw FightingClubEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/fighting_club_entrance.bin" +FightingClubEntrancePermissions: + INCBIN "data/maps/permissions/fighting_club_entrance.bin" + +FightingClubEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw FightingClubEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/fighting_club_entrance_cgb.bin" +FightingClubEntranceCGBPermissions: + INCBIN "data/maps/permissions/fighting_club_entrance_cgb.bin" + +RockClubEntranceTilemap:: + db $14 ; width + db $12 ; height + dw RockClubEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/rock_club_entrance.bin" +RockClubEntrancePermissions: + INCBIN "data/maps/permissions/rock_club_entrance.bin" + +RockClubEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw RockClubEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/rock_club_entrance_cgb.bin" +RockClubEntranceCGBPermissions: + INCBIN "data/maps/permissions/rock_club_entrance_cgb.bin" + +WaterClubEntranceTilemap:: + db $14 ; width + db $12 ; height + dw WaterClubEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/water_club_entrance.bin" +WaterClubEntrancePermissions: + INCBIN "data/maps/permissions/water_club_entrance.bin" + +WaterClubEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw WaterClubEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/water_club_entrance_cgb.bin" +WaterClubEntranceCGBPermissions: + INCBIN "data/maps/permissions/water_club_entrance_cgb.bin" + +LightningClubEntranceTilemap:: + db $14 ; width + db $12 ; height + dw LightningClubEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/lightning_club_entrance.bin" +LightningClubEntrancePermissions: + INCBIN "data/maps/permissions/lightning_club_entrance.bin" + +LightningClubEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw LightningClubEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/lightning_club_entrance_cgb.bin" +LightningClubEntranceCGBPermissions: + INCBIN "data/maps/permissions/lightning_club_entrance_cgb.bin" + +GrassClubEntranceTilemap:: + db $14 ; width + db $12 ; height + dw GrassClubEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/grass_club_entrance.bin" +GrassClubEntrancePermissions: + INCBIN "data/maps/permissions/grass_club_entrance.bin" + +GrassClubEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw GrassClubEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/grass_club_entrance_cgb.bin" +GrassClubEntranceCGBPermissions: + INCBIN "data/maps/permissions/grass_club_entrance_cgb.bin" + +PsychicClubEntranceTilemap:: + db $14 ; width + db $12 ; height + dw PsychicClubEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/psychic_club_entrance.bin" +PsychicClubEntrancePermissions: + INCBIN "data/maps/permissions/psychic_club_entrance.bin" + +PsychicClubEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw PsychicClubEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/psychic_club_entrance_cgb.bin" +PsychicClubEntranceCGBPermissions: + INCBIN "data/maps/permissions/psychic_club_entrance_cgb.bin" + +ScienceClubEntranceTilemap:: + db $14 ; width + db $12 ; height + dw ScienceClubEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/science_club_entrance.bin" +ScienceClubEntrancePermissions: + INCBIN "data/maps/permissions/science_club_entrance.bin" + +ScienceClubEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw ScienceClubEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/science_club_entrance_cgb.bin" +ScienceClubEntranceCGBPermissions: + INCBIN "data/maps/permissions/science_club_entrance_cgb.bin" + +FireClubEntranceTilemap:: + db $14 ; width + db $12 ; height + dw FireClubEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/fire_club_entrance.bin" +FireClubEntrancePermissions: + INCBIN "data/maps/permissions/fire_club_entrance.bin" + +FireClubEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw FireClubEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/fire_club_entrance_cgb.bin" +FireClubEntranceCGBPermissions: + INCBIN "data/maps/permissions/fire_club_entrance_cgb.bin" + +ChallengeHallEntranceTilemap:: + db $14 ; width + db $12 ; height + dw ChallengeHallEntrancePermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/challenge_hall_entrance.bin" +ChallengeHallEntrancePermissions: + INCBIN "data/maps/permissions/challenge_hall_entrance.bin" + +ChallengeHallEntranceCGBTilemap:: + db $14 ; width + db $12 ; height + dw ChallengeHallEntranceCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/challenge_hall_entrance_cgb.bin" +ChallengeHallEntranceCGBPermissions: + INCBIN "data/maps/permissions/challenge_hall_entrance_cgb.bin" + +ClubLobbyTilemap:: + db $1c ; width + db $1a ; height + dw ClubLobbyPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/club_lobby.bin" +ClubLobbyPermissions: + INCBIN "data/maps/permissions/club_lobby.bin" + +ClubLobbyCGBTilemap:: + db $1c ; width + db $1a ; height + dw ClubLobbyCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/club_lobby_cgb.bin" +ClubLobbyCGBPermissions: + INCBIN "data/maps/permissions/club_lobby_cgb.bin" + +FightingClubTilemap:: + db $18 ; width + db $12 ; height + dw FightingClubPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/fighting_club.bin" +FightingClubPermissions: + INCBIN "data/maps/permissions/fighting_club.bin" + +FightingClubCGBTilemap:: + db $18 ; width + db $12 ; height + dw FightingClubCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/fighting_club_cgb.bin" +FightingClubCGBPermissions: + INCBIN "data/maps/permissions/fighting_club_cgb.bin" + +RockClubTilemap:: + db $1c ; width + db $1e ; height + dw RockClubPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/rock_club.bin" +RockClubPermissions: + INCBIN "data/maps/permissions/rock_club.bin" + +RockClubCGBTilemap:: + db $1c ; width + db $1e ; height + dw RockClubCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/rock_club_cgb.bin" +RockClubCGBPermissions: + INCBIN "data/maps/permissions/rock_club_cgb.bin" + +PokemonDomeDoorMapEventTilemap:: + db $04 ; width + db $03 ; height + dw PokemonDomeDoorMapEventPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/pokemon_dome_door_map_event.bin" +PokemonDomeDoorMapEventPermissions: + INCBIN "data/maps/permissions/pokemon_dome_door_map_event.bin" + +PokemonDomeDoorMapEventCGBTilemap:: + db $04 ; width + db $03 ; height + dw PokemonDomeDoorMapEventCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/pokemon_dome_door_map_event_cgb.bin" +PokemonDomeDoorMapEventCGBPermissions: + INCBIN "data/maps/permissions/pokemon_dome_door_map_event_cgb.bin" + +HallOfHonorDoorMapEventTilemap:: + db $04 ; width + db $03 ; height + dw HallOfHonorDoorMapEventPermissions + db FALSE ; cgb mode + INCBIN "data/maps/tiles/hall_of_honor_door_map_event.bin" +HallOfHonorDoorMapEventPermissions: + INCBIN "data/maps/permissions/hall_of_honor_door_map_event.bin" + +HallOfHonorDoorMapEventCGBTilemap:: + db $04 ; width + db $03 ; height + dw HallOfHonorDoorMapEventCGBPermissions + db TRUE ; cgb mode + INCBIN "data/maps/tiles/hall_of_honor_door_map_event_cgb.bin" +HallOfHonorDoorMapEventCGBPermissions: + INCBIN "data/maps/permissions/hall_of_honor_door_map_event_cgb.bin" + +GrassMedalTilemap:: + db $03 ; width + db $03 ; height + dw NULL + db TRUE ; cgb mode + INCBIN "data/maps/tiles/grass_medal.bin" + +AnimData1:: + frame_table AnimFrameTable0 + frame_data 3, 16, 0, 0 + frame_data 4, 16, 0, 0 + frame_data 0, 0, 0, 0 + +Palette110:: + db $00, $00 diff --git a/src/data/sequences/credits_sequence.asm b/src/data/sequences/credits.asm index cc7d267..cc7d267 100644 --- a/src/data/sequences/credits_sequence.asm +++ b/src/data/sequences/credits.asm diff --git a/src/data/sequences/intro.asm b/src/data/sequences/intro.asm new file mode 100644 index 0000000..22aeea7 --- /dev/null +++ b/src/data/sequences/intro.asm @@ -0,0 +1,47 @@ +INCLUDE "macros/intro_sequence.asm" + +IntroSequence: ; 1d59d (7:559d) + intro_seq_load_charizard_scene + intro_seq_play_sfx SFX_58 + intro_seq_set_orbs_coordinates IntroOrbCoordinates_CharizardScene + intro_seq_set_orbs_animations IntroOrbAnimations_CharizardScene + intro_seq_wait 44 + intro_seq_fade_in + intro_seq_wait 44 + intro_seq_fade_out + intro_seq_wait 30 + + intro_seq_load_scyther_scene + intro_seq_play_sfx SFX_58 + intro_seq_set_orbs_coordinates IntroOrbCoordinates_ScytherScene + intro_seq_set_orbs_animations IntroOrbAnimations_ScytherScene + intro_seq_wait 44 + intro_seq_fade_in + intro_seq_wait 44 + intro_seq_fade_out + intro_seq_wait 30 + + intro_seq_load_aerodactyl_scene + intro_seq_play_sfx SFX_59 + intro_seq_set_orbs_coordinates IntroOrbCoordinates_AerodactylScene + intro_seq_set_orbs_animations IntroOrbAnimations_AerodactylScene + intro_seq_wait 44 + intro_seq_fade_in + intro_seq_wait 100 + intro_seq_fade_out + intro_seq_wait 60 + + intro_seq_load_title_screen_scene + intro_seq_play_sfx SFX_5A + intro_seq_set_orbs_coordinates IntroOrbCoordinates_InitialTitleScreen + intro_seq_set_orbs_animations IntroOrbAnimations_InitialTitleScreen + intro_seq_wait_orbs_animation + intro_seq_fade_in + intro_seq_wait 16 + intro_seq_play_sfx SFX_5B + intro_seq_set_orbs_coordinates IntroOrbCoordinates_InTitleScreen + intro_seq_set_orbs_animations IntroOrbAnimations_InTitleScreen + intro_seq_wait_sfx + intro_seq_play_title_screen_music + intro_seq_wait 60 + intro_seq_end diff --git a/src/data/sequences/opening_sequence.asm b/src/data/sequences/opening_sequence.asm deleted file mode 100644 index a88bd4f..0000000 --- a/src/data/sequences/opening_sequence.asm +++ /dev/null @@ -1,47 +0,0 @@ -INCLUDE "macros/opening_sequence.asm" - -OpeningSequence: ; 1d59d (7:559d) - opening_seq_load_charizard_scene - opening_seq_play_sfx SFX_58 - opening_seq_set_orbs_coordinates OpeningOrbCoordinates_CharizardScene - opening_seq_set_orbs_animations OpeningOrbAnimations_CharizardScene - opening_seq_wait 44 - opening_seq_fade_in - opening_seq_wait 44 - opening_seq_fade_out - opening_seq_wait 30 - - opening_seq_load_scyther_scene - opening_seq_play_sfx SFX_58 - opening_seq_set_orbs_coordinates OpeningOrbCoordinates_ScytherScene - opening_seq_set_orbs_animations OpeningOrbAnimations_ScytherScene - opening_seq_wait 44 - opening_seq_fade_in - opening_seq_wait 44 - opening_seq_fade_out - opening_seq_wait 30 - - opening_seq_load_aerodactyl_scene - opening_seq_play_sfx SFX_59 - opening_seq_set_orbs_coordinates OpeningOrbCoordinates_AerodactylScene - opening_seq_set_orbs_animations OpeningOrbAnimations_AerodactylScene - opening_seq_wait 44 - opening_seq_fade_in - opening_seq_wait 100 - opening_seq_fade_out - opening_seq_wait 60 - - opening_seq_load_title_screen_scene - opening_seq_play_sfx SFX_5A - opening_seq_set_orbs_coordinates OpeningOrbCoordinates_InitialTitleScreen - opening_seq_set_orbs_animations OpeningOrbAnimations_InitialTitleScreen - opening_seq_wait_orbs_animation - opening_seq_fade_in - opening_seq_wait 16 - opening_seq_play_sfx SFX_5B - opening_seq_set_orbs_coordinates OpeningOrbCoordinates_InTitleScreen - opening_seq_set_orbs_animations OpeningOrbAnimations_InTitleScreen - opening_seq_wait_sfx - opening_seq_play_title_screen_music - opening_seq_wait 60 - opening_seq_end diff --git a/src/engine/auto_deck_machines.asm b/src/engine/auto_deck_machines.asm new file mode 100644 index 0000000..0f84cef --- /dev/null +++ b/src/engine/auto_deck_machines.asm @@ -0,0 +1,191 @@ +INCLUDE "data/auto_deck_card_lists.asm" +INCLUDE "data/auto_deck_machines.asm" + +; writes to sAutoDecks all the deck configurations +; from the Auto Deck Machine in wCurAutoDeckMachine +ReadAutoDeckConfiguration: + call EnableSRAM + ld a, [wCurAutoDeckMachine] + ld l, a + ld h, 6 * NUM_DECK_MACHINE_SLOTS + call HtimesL + ld bc, AutoDeckMachineEntries + add hl, bc + ld b, 0 +.loop_decks + call .GetPointerToSRAMAutoDeck + call .ReadDeckConfiguration + call .ReadDeckName + + ; store deck description text ID + push hl + ld de, wAutoDeckMachineTextDescriptions + ld h, b + ld l, 2 + call HtimesL + add hl, de + ld d, h + ld e, l + pop hl + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc b + ld a, b + cp NUM_DECK_MACHINE_SLOTS + jr nz, .loop_decks + call DisableSRAM + ret + +; outputs in de the saved deck with index b +.GetPointerToSRAMAutoDeck + push hl + ld l, b + ld h, DECK_STRUCT_SIZE + call HtimesL + ld de, sAutoDecks + add hl, de + ld d, h + ld e, l + pop hl + ret + +; writes the deck configuration in SRAM +; by reading the given deck card list +.ReadDeckConfiguration + push hl + push bc + push de + push de + ld e, [hl] + inc hl + ld d, [hl] + pop hl + ld bc, DECK_NAME_SIZE + add hl, bc +.loop_create_deck + ld a, [de] + inc de + ld b, a ; card count + or a + jr z, .done_create_deck + ld a, [de] + inc de + ld c, a ; card ID +.loop_card_count + ld [hl], c + inc hl + dec b + jr nz, .loop_card_count + jr .loop_create_deck +.done_create_deck + pop de + pop bc + pop hl + inc hl + inc hl + ret + +.ReadDeckName + push hl + push bc + push de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wDismantledDeckName + call CopyText + pop hl + ld de, wDismantledDeckName +.loop_copy_name + ld a, [de] + ld [hli], a + or a + jr z, .done_copy_name + inc de + jr .loop_copy_name +.done_copy_name + pop bc + pop hl + inc hl + inc hl + ret + +; tries out all combinations of dismantling the player's decks +; in order to build the deck in wSelectedDeckMachineEntry +; if none of the combinations work, return carry set +; otherwise, return in a which deck flags should be dismantled +CheckWhichDecksToDismantleToBuildSavedDeck: + xor a + ld [wDecksToBeDismantled], a + +; first check if it can be built by +; only dismantling a single deck + ld a, DECK_1 +.loop_single_built_decks + call .CheckIfCanBuild + ret nc + sla a ; next deck + cp (1 << NUM_DECKS) + jr z, .two_deck_combinations + jr .loop_single_built_decks + +.two_deck_combinations +; next check all two deck combinations + ld a, DECK_1 | DECK_2 + call .CheckIfCanBuild + ret nc + ld a, DECK_1 | DECK_3 + call .CheckIfCanBuild + ret nc + ld a, DECK_1 | DECK_4 + call .CheckIfCanBuild + ret nc + ld a, DECK_2 | DECK_3 + call .CheckIfCanBuild + ret nc + ld a, DECK_2 | DECK_4 + call .CheckIfCanBuild + ret nc + ld a, DECK_3 | DECK_4 + call .CheckIfCanBuild + ret nc + +; all but one deck combinations + ld a, $ff ^ DECK_4 +.loop_three_deck_combinations + call .CheckIfCanBuild + ret nc + sra a + cp $ff + jr z, .all_decks + jr .loop_three_deck_combinations + +.all_decks +; finally check if can be built by dismantling all decks + call .CheckIfCanBuild + ret nc + +; none of the combinations work + scf + ret + +; returns carry if wSelectedDeckMachineEntry cannot be built +; by dismantling the decks given by register a +; a = DECK_* flags +.CheckIfCanBuild + push af + ld hl, wSelectedDeckMachineEntry + ld b, [hl] + farcall CheckIfCanBuildSavedDeck + jr c, .cannot_build + pop af + ld [wDecksToBeDismantled], a + or a + ret +.cannot_build + pop af + scf + ret diff --git a/src/engine/bank04.asm b/src/engine/bank04.asm index 5781e73..add4bb3 100644 --- a/src/engine/bank04.asm +++ b/src/engine/bank04.asm @@ -5255,7 +5255,7 @@ Unknown_127fb: ; 127fb (4:67fb) db BOOSTER_ENERGY_LIGHTNING_FIRE DebugCredits: ; 12800 (4:6800) - farcall Credits_1d6ad + farcall PlayCreditsSequence scf ret @@ -5337,7 +5337,7 @@ Func_12871: ; 12871 (4:6871) ldh [hSCY], a ldh [hWX], a ldh [hWY], a - call Set_WD_off + call SetWindowOff ret Func_1288c: ; 1288c (4:688c) diff --git a/src/engine/bank06.asm b/src/engine/bank06.asm deleted file mode 100644 index fa181f3..0000000 --- a/src/engine/bank06.asm +++ /dev/null @@ -1,5974 +0,0 @@ -; copy the name and level of the card at wLoadedCard1 to wDefaultText -; a = length in number of tiles (the resulting string will be padded with spaces to match it) -_CopyCardNameAndLevel: ; 18000 (6:4000) - push bc - push de - ld [wCardNameLength], a - ld hl, wLoadedCard1Name - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wDefaultText - push de - call CopyText ; copy card name to wDefaultText - pop hl - ld a, [hli] - cp TX_HALFWIDTH - jp z, _CopyCardNameAndLevel_HalfwidthText - -; the name doesn't start with TX_HALFWIDTH -; this doesn't appear to be ever the case (unless caller manipulates wLoadedCard1Name) - ld a, [wCardNameLength] - ld c, a - ld a, [wLoadedCard1Type] - cp TYPE_ENERGY - jr nc, .level_done ; jump if energy or trainer - ld a, [wLoadedCard1Level] - or a - jr z, .level_done - inc c - inc c - ld a, [wLoadedCard1Level] - cp 10 - jr c, .level_done - inc c ; second digit -.level_done - ld hl, wLoadedCard1Name - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wDefaultText - push de - call CopyText - pop hl - push de - ld e, c - call GetTextLengthInTiles - add e - ld c, a - pop hl - push hl -.fill_loop - ld a, $70 - ld [hli], a - dec c - jr nz, .fill_loop - ld [hl], TX_END - pop hl - ld a, [wLoadedCard1Type] - cp TYPE_ENERGY - jr nc, .done - ld a, [wLoadedCard1Level] - or a - jr z, .done - ld a, TX_SYMBOL - ld [hli], a - ld [hl], SYM_Lv - inc hl - ld a, [wLoadedCard1Level] - cp 10 - jr c, .one_digit - ld [hl], TX_SYMBOL - inc hl - ld b, SYM_0 - 1 -.first_digit_loop - inc b - sub 10 - jr nc, .first_digit_loop - add 10 - ld [hl], b ; first digit - inc hl -.one_digit - ld [hl], TX_SYMBOL - inc hl - add SYM_0 - ld [hl], a ; last (or only) digit - inc hl -.done - pop de - pop bc - ret - -; the name starts with TX_HALFWIDTH -_CopyCardNameAndLevel_HalfwidthText: ; 18086 (6:4086) - ld a, [wCardNameLength] - inc a - add a - ld b, a - ld hl, wDefaultText -.find_end_text_loop - dec b - ld a, [hli] - or a ; TX_END - jr nz, .find_end_text_loop - dec hl - ld a, [wLoadedCard1Type] - cp TYPE_ENERGY - jr nc, .level_done - ld a, [wLoadedCard1Level] - or a - jr z, .level_done - ld c, a - ld a, " " - ld [hli], a - dec b - ld a, "L" - ld [hli], a - dec b - ld a, "v" - ld [hli], a - dec b - ld a, c - cp 10 - jr c, .got_level - push bc - ld b, "0" - 1 -.first_digit_loop - inc b - sub 10 - jr nc, .first_digit_loop - add 10 - ld [hl], b ; first digit - inc hl - pop bc - ld c, a - dec b -.got_level - ld a, c - add "0" - ld [hli], a ; last (or only) digit - dec b -.level_done - push hl - ld a, " " -.fill_spaces_loop - ld [hli], a - dec b - jr nz, .fill_spaces_loop - ld [hl], TX_END - pop hl - pop de - pop bc - ret - -; this function is called when the player is shown the "In Play Area" screen. -; it can be called with either the select button (DuelMenuShortcut_BothActivePokemon), -; or via the "In Play Area" item of the Check menu (DuelCheckMenu_InPlayArea) -OpenInPlayAreaScreen: ; 180d5 (6:40d5) - ld a, INPLAYAREA_PLAYER_ACTIVE - ld [wInPlayAreaCurPosition], a -.start - xor a - ld [wCheckMenuCursorBlinkCounter], a - farcall DrawInPlayAreaScreen - call EnableLCD - call IsClairvoyanceActive - jr c, .clairvoyance_on - - ld de, OpenInPlayAreaScreen_TransitionTable1 - jr .clairvoyance_off - -.clairvoyance_on - ld de, OpenInPlayAreaScreen_TransitionTable2 -.clairvoyance_off - ld hl, wMenuInputTablePointer - ld [hl], e - inc hl - ld [hl], d - ld a, [wInPlayAreaCurPosition] - call .print_associated_text -.on_frame - ld a, $01 - ld [wVBlankOAMCopyToggle], a - call DoFrame - - ldh a, [hDPadHeld] - and START - jr nz, .selection - - ; if this function's been called from 'select' button, - ; wInPlayAreaFromSelectButton is on. - ld a, [wInPlayAreaFromSelectButton] - or a - jr z, .handle_input ; if it's from the Check menu, jump. - - ldh a, [hDPadHeld] - and SELECT - jr nz, .skip_input - -.handle_input - ld a, [wInPlayAreaCurPosition] - ld [wInPlayAreaTemporaryPosition], a - call OpenInPlayAreaScreen_HandleInput - jr c, .pressed - - ld a, [wInPlayAreaCurPosition] - cp INPLAYAREA_PLAYER_PLAY_AREA - jp z, .show_turn_holder_play_area - cp INPLAYAREA_OPP_PLAY_AREA - jp z, .show_non_turn_holder_play_area - - ; check if the cursor moved. - ld hl, wInPlayAreaTemporaryPosition - cp [hl] - call nz, .print_associated_text - - jr .on_frame - -.pressed - cp -1 - jr nz, .selection - - ; pressed b button. - call ZeroObjectPositionsAndToggleOAMCopy_Bank6 - lb de, $38, $9f - call SetupText - scf - ret - -.skip_input - call ZeroObjectPositionsAndToggleOAMCopy_Bank6 - lb de, $38, $9f - call SetupText - or a - ret - -.selection ; pressed a button or start button. - call ZeroObjectPositionsAndToggleOAMCopy_Bank6 - lb de, $38, $9f - call SetupText - ld a, [wInPlayAreaCurPosition] - ld [wInPlayAreaPreservedPosition], a - ld hl, .jump_table - call JumpToFunctionInTable - ld a, [wInPlayAreaPreservedPosition] - ld [wInPlayAreaCurPosition], a - - jp .start - -.print_associated_text ; 18171 (6:4171) -; each position has a text associated to it, -; which is printed at the bottom of the screen - push af - lb de, 1, 17 - call InitTextPrinting - ldtx hl, EmptyLineText - call ProcessTextFromID - - ld hl, hffb0 - ld [hl], $01 - ldtx hl, HandText_2 - call ProcessTextFromID - - ld hl, hffb0 - ld [hl], $00 - lb de, 1, 17 - call InitTextPrinting - pop af - ld hl, OpenInPlayAreaScreen_TextTable - ld b, 0 - sla a - ld c, a - add hl, bc - - ; hl = OpenInPlayAreaScreen_TextTable + 2 * (wInPlayAreaCurPosition) - ld a, [hli] - ld h, [hl] - ld l, a - ld a, h - - ; jump ahead if entry does not contain null text (it's not active pokemon) - or a - jr nz, .print_hand_or_discard_pile - - ld a, l - ; bench slots have dummy text IDs assigned to them, which are never used. - ; these are secretly not text id's, but rather, 2-byte PLAY_AREA_BENCH_* constants - ; check if the value at register l is one of those, and jump ahead if not - cp PLAY_AREA_BENCH_5 + $01 - jr nc, .print_hand_or_discard_pile - -; if we make it here, we need to print a Pokemon card name. -; wInPlayAreaCurPosition determines which duelist -; and l contains the PLAY_AREA_* location of the card. - ld a, [wInPlayAreaCurPosition] - cp INPLAYAREA_PLAYER_HAND - jr nc, .opponent_side - - ld a, l - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - cp -1 - ret z - - call GetCardIDFromDeckIndex - call LoadCardDataToBuffer1_FromCardID - jr .display_card_name - -.opponent_side - ld a, l - add DUELVARS_ARENA_CARD - call GetNonTurnDuelistVariable - cp -1 - ret z - - call SwapTurn - call GetCardIDFromDeckIndex - call LoadCardDataToBuffer1_FromCardID - call SwapTurn - -.display_card_name - ld a, 18 - call CopyCardNameAndLevel - ld hl, wDefaultText - call ProcessText - ret - -.print_hand_or_discard_pile -; if we make it here, cursor position is to Hand or Discard Pile -; so DuelistHandText_2 or DuelistDiscardPileText will be printed - - ld a, [wInPlayAreaCurPosition] - cp INPLAYAREA_OPP_ACTIVE - jr nc, .opp_side_print_hand_or_discard_pile - call PrintTextNoDelay - ret - -.opp_side_print_hand_or_discard_pile - call SwapTurn - call PrintTextNoDelay - call SwapTurn - ret - -.show_turn_holder_play_area - lb de, $38, $9f - call SetupText - ldh a, [hWhoseTurn] - push af - bank1call OpenTurnHolderPlayAreaScreen - pop af - ldh [hWhoseTurn], a - ld a, [wInPlayAreaPreservedPosition] - ld [wInPlayAreaCurPosition], a - jp .start - -.show_non_turn_holder_play_area - lb de, $38, $9f - call SetupText - ldh a, [hWhoseTurn] - push af - bank1call OpenNonTurnHolderPlayAreaScreen - pop af - ldh [hWhoseTurn], a - ld a, [wInPlayAreaPreservedPosition] - ld [wInPlayAreaCurPosition], a - jp .start - -.jump_table ; (6:4228) - dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x00: INPLAYAREA_PLAYER_BENCH_1 - dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x01: INPLAYAREA_PLAYER_BENCH_2 - dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x02: INPLAYAREA_PLAYER_BENCH_3 - dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x03: INPLAYAREA_PLAYER_BENCH_4 - dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x04: INPLAYAREA_PLAYER_BENCH_5 - dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x05: INPLAYAREA_PLAYER_ACTIVE - dw OpenInPlayAreaScreen_TurnHolderHand ; 0x06: INPLAYAREA_PLAYER_HAND - dw OpenInPlayAreaScreen_TurnHolderDiscardPile ; 0x07: INPLAYAREA_PLAYER_DISCARD_PILE - dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x08: INPLAYAREA_OPP_ACTIVE - dw OpenInPlayAreaScreen_NonTurnHolderHand ; 0x09: INPLAYAREA_OPP_HAND - dw OpenInPlayAreaScreen_NonTurnHolderDiscardPile ; 0x0a: INPLAYAREA_OPP_DISCARD_PILE - dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0b: INPLAYAREA_OPP_BENCH_1 - dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0c: INPLAYAREA_OPP_BENCH_2 - dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0d: INPLAYAREA_OPP_BENCH_3 - dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0e: INPLAYAREA_OPP_BENCH_4 - dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0f: INPLAYAREA_OPP_BENCH_5 - -OpenInPlayAreaScreen_TurnHolderPlayArea: ; 18248 (6:4248) - ; wInPlayAreaCurPosition constants conveniently map to (PLAY_AREA_* constants - 1) - ; for bench locations. this mapping is taken for granted in the following code. - ld a, [wInPlayAreaCurPosition] - inc a - cp INPLAYAREA_PLAYER_ACTIVE + $01 - jr nz, .on_bench - xor a ; PLAY_AREA_ARENA -.on_bench - ld [wCurPlayAreaSlot], a - add DUELVARS_ARENA_CARD - call GetTurnDuelistVariable - cp -1 - ret z - call GetCardIDFromDeckIndex - call LoadCardDataToBuffer1_FromCardID - xor a - ld [wCurPlayAreaY], a - bank1call OpenCardPage_FromCheckPlayArea - ret - -OpenInPlayAreaScreen_NonTurnHolderPlayArea: ; 1826a (6:426a) - ld a, [wInPlayAreaCurPosition] - sub INPLAYAREA_OPP_ACTIVE - or a - jr z, .active - ; convert INPLAYAREA_OPP_BENCH_* constant to PLAY_AREA_BENCH_* constant - sub INPLAYAREA_OPP_BENCH_1 - INPLAYAREA_OPP_ACTIVE - PLAY_AREA_BENCH_1 -.active - ld [wCurPlayAreaSlot], a - add DUELVARS_ARENA_CARD - call GetNonTurnDuelistVariable - cp -1 - ret z - call SwapTurn - call GetCardIDFromDeckIndex - call LoadCardDataToBuffer1_FromCardID - xor a - ld [wCurPlayAreaY], a - bank1call OpenCardPage_FromCheckPlayArea - call SwapTurn - ret - -OpenInPlayAreaScreen_TurnHolderHand: ; 18293 (6:4293) - ldh a, [hWhoseTurn] - push af - bank1call OpenTurnHolderHandScreen_Simple - pop af - ldh [hWhoseTurn], a - ret - -OpenInPlayAreaScreen_NonTurnHolderHand: ; 1829d (6:429d) - ldh a, [hWhoseTurn] - push af - bank1call OpenNonTurnHolderHandScreen_Simple - pop af - ldh [hWhoseTurn], a - ret - -OpenInPlayAreaScreen_TurnHolderDiscardPile: ; 182a7 (6:42a7) - ldh a, [hWhoseTurn] - push af - bank1call OpenTurnHolderDiscardPileScreen - pop af - ldh [hWhoseTurn], a - ret - -OpenInPlayAreaScreen_NonTurnHolderDiscardPile: ; 182b1 (6:42b1) - ldh a, [hWhoseTurn] - push af - bank1call OpenNonTurnHolderDiscardPileScreen - pop af - ldh [hWhoseTurn], a - ret - -OpenInPlayAreaScreen_TextTable: -; note that for bench slots, the entries are -; PLAY_AREA_BENCH_* constants in practice - tx HandText ; INPLAYAREA_PLAYER_BENCH_1 - tx CheckText ; INPLAYAREA_PLAYER_BENCH_2 - tx AttackText ; INPLAYAREA_PLAYER_BENCH_3 - tx PKMNPowerText ; INPLAYAREA_PLAYER_BENCH_4 - tx DoneText ; INPLAYAREA_PLAYER_BENCH_5 - dw NULL ; INPLAYAREA_PLAYER_ACTIVE - tx DuelistHandText_2 ; INPLAYAREA_PLAYER_HAND - tx DuelistDiscardPileText ; INPLAYAREA_PLAYER_DISCARD_PILE - dw NULL ; INPLAYAREA_OPP_ACTIVE - tx DuelistHandText_2 ; INPLAYAREA_OPP_HAND - tx DuelistDiscardPileText ; INPLAYAREA_OPP_DISCARD_PILE - tx HandText ; INPLAYAREA_OPP_BENCH_1 - tx CheckText ; INPLAYAREA_OPP_BENCH_2 - tx AttackText ; INPLAYAREA_OPP_BENCH_3 - tx PKMNPowerText ; INPLAYAREA_OPP_BENCH_4 - tx DoneText ; INPLAYAREA_OPP_BENCH_5 - -in_play_area_cursor_transition: MACRO - cursor_transition \1, \2, \3, INPLAYAREA_\4, INPLAYAREA_\5, INPLAYAREA_\6, INPLAYAREA_\7 -ENDM - -; it's related to wMenuInputTablePointer. -; with this table, the cursor moves into the proper location by the input. -; note that the unit of the position is not a 8x8 tile. -OpenInPlayAreaScreen_TransitionTable1: - in_play_area_cursor_transition $18, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_2, PLAYER_BENCH_5 - in_play_area_cursor_transition $30, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_3, PLAYER_BENCH_1 - in_play_area_cursor_transition $48, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_4, PLAYER_BENCH_2 - in_play_area_cursor_transition $60, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_5, PLAYER_BENCH_3 - in_play_area_cursor_transition $78, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_1, PLAYER_BENCH_4 - in_play_area_cursor_transition $30, $6c, $00, OPP_ACTIVE, PLAYER_BENCH_1, PLAYER_DISCARD_PILE, PLAYER_DISCARD_PILE - in_play_area_cursor_transition $78, $80, $00, PLAYER_DISCARD_PILE, PLAYER_BENCH_1, PLAYER_ACTIVE, PLAYER_ACTIVE - in_play_area_cursor_transition $78, $70, $00, OPP_ACTIVE, PLAYER_HAND, PLAYER_ACTIVE, PLAYER_ACTIVE - in_play_area_cursor_transition $78, $34, 1 << OAM_X_FLIP, OPP_BENCH_1, PLAYER_ACTIVE, OPP_DISCARD_PILE, OPP_DISCARD_PILE - in_play_area_cursor_transition $30, $20, 1 << OAM_X_FLIP, OPP_BENCH_1, OPP_DISCARD_PILE, OPP_ACTIVE, OPP_ACTIVE - in_play_area_cursor_transition $30, $38, 1 << OAM_X_FLIP, OPP_BENCH_1, PLAYER_ACTIVE, OPP_ACTIVE, OPP_ACTIVE - in_play_area_cursor_transition $90, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_5, OPP_BENCH_2 - in_play_area_cursor_transition $78, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_1, OPP_BENCH_3 - in_play_area_cursor_transition $60, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_2, OPP_BENCH_4 - in_play_area_cursor_transition $48, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_3, OPP_BENCH_5 - in_play_area_cursor_transition $30, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_4, OPP_BENCH_1 - -OpenInPlayAreaScreen_TransitionTable2: - in_play_area_cursor_transition $18, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_2, PLAYER_BENCH_5 - in_play_area_cursor_transition $30, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_3, PLAYER_BENCH_1 - in_play_area_cursor_transition $48, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_4, PLAYER_BENCH_2 - in_play_area_cursor_transition $60, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_5, PLAYER_BENCH_3 - in_play_area_cursor_transition $78, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_1, PLAYER_BENCH_4 - in_play_area_cursor_transition $30, $6c, $00, OPP_ACTIVE, PLAYER_BENCH_1, PLAYER_DISCARD_PILE, PLAYER_DISCARD_PILE - in_play_area_cursor_transition $78, $80, $00, PLAYER_DISCARD_PILE, PLAYER_BENCH_1, PLAYER_ACTIVE, PLAYER_ACTIVE - in_play_area_cursor_transition $78, $70, $00, OPP_ACTIVE, PLAYER_HAND, PLAYER_ACTIVE, PLAYER_ACTIVE - in_play_area_cursor_transition $78, $34, 1 << OAM_X_FLIP, OPP_BENCH_1, PLAYER_ACTIVE, OPP_DISCARD_PILE, OPP_DISCARD_PILE - in_play_area_cursor_transition $30, $20, 1 << OAM_X_FLIP, OPP_BENCH_1, OPP_DISCARD_PILE, OPP_ACTIVE, OPP_ACTIVE - in_play_area_cursor_transition $30, $38, 1 << OAM_X_FLIP, OPP_HAND, PLAYER_ACTIVE, OPP_ACTIVE, OPP_ACTIVE - in_play_area_cursor_transition $90, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_5, OPP_BENCH_2 - in_play_area_cursor_transition $78, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_1, OPP_BENCH_3 - in_play_area_cursor_transition $60, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_2, OPP_BENCH_4 - in_play_area_cursor_transition $48, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_3, OPP_BENCH_5 - in_play_area_cursor_transition $30, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_4, OPP_BENCH_1 - -OpenInPlayAreaScreen_HandleInput: ; 183bb (6:43bb) - xor a - ld [wPlaysSfx], a - ld hl, wMenuInputTablePointer - ld e, [hl] - inc hl - ld d, [hl] - ld a, [wInPlayAreaCurPosition] - ld l, a - ld h, $07 - call HtimesL - add hl, de - - ldh a, [hDPadHeld] - or a - jp z, .check_button - - inc hl - inc hl - inc hl - - ; check d-pad - bit D_UP_F, a - jr z, .else_if_down - - ; up - ld a, [hl] - jr .process_dpad - -.else_if_down - inc hl - bit D_DOWN_F, a - jr z, .else_if_right - - ; down - ld a, [hl] - jr .process_dpad - -.else_if_right - inc hl - bit D_RIGHT_F, a - jr z, .else_if_left - - ; right - ld a, [hl] - jr .process_dpad - -.else_if_left - inc hl - bit D_LEFT_F, a - jr z, .check_button - - ; left - ld a, [hl] -.process_dpad - push af - ld a, [wInPlayAreaCurPosition] - ld [wInPlayAreaPreservedPosition], a - pop af - - ld [wInPlayAreaCurPosition], a - cp INPLAYAREA_PLAYER_ACTIVE - jr c, .player_area - cp INPLAYAREA_OPP_BENCH_1 - jr c, .next - cp INPLAYAREA_PLAYER_PLAY_AREA - jr c, .opponent_area - - jr .next - -.player_area - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetTurnDuelistVariable - dec a - jr nz, .bench_pokemon_exists - - ; no pokemon in player's bench. - ; then move to player's play area. - ld a, INPLAYAREA_PLAYER_PLAY_AREA - ld [wInPlayAreaCurPosition], a - jr .next - -.bench_pokemon_exists - ld b, a - ld a, [wInPlayAreaCurPosition] - cp b - jr c, .next - - ; handle index overflow - ldh a, [hDPadHeld] - bit D_RIGHT_F, a - jr z, .on_left - - xor a - ld [wInPlayAreaCurPosition], a - jr .next - -.on_left - ld a, b - dec a - ld [wInPlayAreaCurPosition], a - jr .next - -.opponent_area - ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA - call GetNonTurnDuelistVariable - dec a - jr nz, .bench_pokemon_exists_2 - - ld a, INPLAYAREA_OPP_PLAY_AREA - ld [wInPlayAreaCurPosition], a - jr .next - -.bench_pokemon_exists_2 - ld b, a - ld a, [wInPlayAreaCurPosition] - sub INPLAYAREA_OPP_BENCH_1 - cp b - jr c, .next - - ldh a, [hDPadHeld] - bit D_LEFT_F, a - jr z, .on_right - - ld a, INPLAYAREA_OPP_BENCH_1 - ld [wInPlayAreaCurPosition], a - jr .next - -.on_right - ld a, b - add INPLAYAREA_OPP_DISCARD_PILE - ld [wInPlayAreaCurPosition], a -.next - ld a, $01 - ld [wPlaysSfx], a - xor a - ld [wCheckMenuCursorBlinkCounter], a -.check_button - ldh a, [hKeysPressed] - and A_BUTTON | B_BUTTON - jr z, .return - - and A_BUTTON - jr nz, .a_button - - ; pressed b button - ld a, -1 - farcall PlaySFXConfirmOrCancel - scf - ret - -.a_button - call .draw_cursor - ld a, $01 - farcall PlaySFXConfirmOrCancel - ld a, [wInPlayAreaCurPosition] - scf - ret - -.return - ld a, [wPlaysSfx] - or a - jr z, .skip_sfx - call PlaySFX -.skip_sfx - ld hl, wCheckMenuCursorBlinkCounter - ld a, [hl] - inc [hl] - and $10 - 1 - ret nz - - bit 4, [hl] ; = and $10 - jr nz, ZeroObjectPositionsAndToggleOAMCopy_Bank6 - -.draw_cursor ; 184a0 (6:44a0) - call ZeroObjectPositions - ld hl, wMenuInputTablePointer - ld e, [hl] - inc hl - ld d, [hl] - ld a, [wInPlayAreaCurPosition] - ld l, a - ld h, $07 - call HtimesL - add hl, de - - ld d, [hl] ; x position. - inc hl - ld e, [hl] ; y position. - inc hl - ld b, [hl] ; attribute. - ld c, $00 - call SetOneObjectAttributes - or a - ret - -ZeroObjectPositionsAndToggleOAMCopy_Bank6: ; 184bf (6:44bf) - call ZeroObjectPositions - ld a, $01 - ld [wVBlankOAMCopyToggle], a - ret - -OpenGlossaryScreen: ; 184c8 (6:44c8) - xor a - ld [wGlossaryPageNo], a - call .display_menu - - xor a - ld [wInPlayAreaCurPosition], a - ld de, OpenGlossaryScreen_TransitionTable ; this data is stored in bank 2. - ld hl, wMenuInputTablePointer - ld [hl], e - inc hl - ld [hl], d - ld a, $ff - ld [wDuelInitialPrizesUpperBitsSet], a - xor a - ld [wCheckMenuCursorBlinkCounter], a -.next - ld a, $01 - ld [wVBlankOAMCopyToggle], a - call DoFrame - ldh a, [hKeysPressed] - and SELECT - jr nz, .on_select - - farcall YourOrOppPlayAreaScreen_HandleInput - jr nc, .next - - cp -1 ; b button - jr nz, .check_button - - farcall ZeroObjectPositionsWithCopyToggleOn - ret - -.check_button - push af - farcall ZeroObjectPositionsWithCopyToggleOn - pop af - - cp $09 ; $09: next page or prev page - jr z, .change_page - - call .print_description - call .display_menu - xor a - ld [wCheckMenuCursorBlinkCounter], a - jr .next - -.on_select - ld a, $01 - farcall PlaySFXConfirmOrCancel -.change_page - ld a, [wGlossaryPageNo] - xor $01 ; swap page - ld [wGlossaryPageNo], a - call .print_menu - jr .next - -; display glossary menu. -.display_menu ; 1852b (6:452b) - xor a - ld [wTileMapFill], a - call ZeroObjectPositions - ld a, $01 - ld [wVBlankOAMCopyToggle], a - call DoFrame - call EmptyScreen - call Set_OBJ_8x8 - farcall LoadCursorTile - - lb de, 5, 0 - call InitTextPrinting - ldtx hl, PokemonCardGlossaryText - call ProcessTextFromID - call .print_menu - ldtx hl, ChooseWordAndPressAButtonText - call DrawWideTextBox_PrintText - ret - -; print texts in glossary menu. -.print_menu ; 1855a (6:455a) - ld hl, wDefaultText - - ld a, TX_SYMBOL - ld [hli], a - - ld a, [wGlossaryPageNo] - add SYM_1 - ld [hli], a - - ld a, TX_SYMBOL - ld [hli], a - - ld a, SYM_SLASH - ld [hli], a - - ld a, TX_SYMBOL - ld [hli], a - - ld a, SYM_2 - ld [hli], a - - ld [hl], TX_END - - lb de, 16, 1 - call InitTextPrinting - ld hl, wDefaultText - call ProcessText - - lb de, 1, 3 - call InitTextPrinting - ld a, [wGlossaryPageNo] - or a - jr nz, .page_two - - ldtx hl, GlossaryMenuPage1Text - jr .page_one - -.page_two - ldtx hl, GlossaryMenuPage2Text -.page_one - call ProcessTextFromID - ret - -; display glossary description. -.print_description ; 18598 (6:4598) - push af - xor a - ld [wTileMapFill], a - call EmptyScreen - lb de, 5, 0 - call InitTextPrinting - ldtx hl, PokemonCardGlossaryText - call ProcessTextFromID - lb de, 0, 4 - lb bc, 20, 14 - call DrawRegularTextBox - - ld a, [wGlossaryPageNo] - or a - jr nz, .back_page - - ld hl, GlossaryData1 - jr .front_page - -.back_page - ld hl, GlossaryData2 -.front_page - pop af - ; hl += (a + (a << 2)). - ; that is, - ; hl += (5 * a). - ld c, a - ld b, 0 - add hl, bc - sla a - sla a - ld c, a - add hl, bc - ld a, [hli] - push hl - ld d, a - ld e, $02 - call InitTextPrinting - ld a, [hli] - ld h, [hl] - ld l, a - call ProcessTextFromID - pop hl - lb de, 1, 5 - call InitTextPrinting - inc hl - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - ld a, $01 - ld [wLineSeparation], a - call ProcessTextFromID - xor a - ld [wLineSeparation], a - call EnableLCD -.loop - call DoFrame - ldh a, [hKeysPressed] - and B_BUTTON - jr z, .loop - - ld a, -1 - farcall PlaySFXConfirmOrCancel - ret - -; unit: 5 bytes. -; [structure] -; horizontal align (1) / title text id (2) / desc. text id (2) -glossary_entry: MACRO - db \1 - tx \2 - tx \3 -ENDM - -GlossaryData1: - glossary_entry 7, AboutTheDeckText, DeckDescriptionText - glossary_entry 5, AboutTheDiscardPileText, DiscardPileDescriptionText - glossary_entry 7, AboutTheHandText, HandDescriptionText - glossary_entry 6, AboutTheArenaText, ArenaDescriptionText - glossary_entry 6, AboutTheBenchText, BenchDescriptionText - glossary_entry 4, AboutTheActivePokemonText, ActivePokemonDescriptionText - glossary_entry 5, AboutBenchPokemonText, BenchPokemonDescriptionText - glossary_entry 7, AboutPrizesText, PrizesDescriptionText - glossary_entry 5, AboutDamageCountersText, DamageCountersDescriptionText - -GlossaryData2: - glossary_entry 5, AboutEnergyCardsText, EnergyCardsDescriptionText - glossary_entry 5, AboutTrainerCardsText, TrainerCardsDescriptionText - glossary_entry 5, AboutBasicPokemonText, BasicPokemonDescriptionText - glossary_entry 5, AboutEvolutionCardsText, EvolutionCardsDescriptionText - glossary_entry 6, AboutAttackingText, AttackingDescriptionText - glossary_entry 5, AboutPokemonPowerText, PokemonPowerDescriptionText - glossary_entry 6, AboutWeaknessText, WeaknessDescriptionText - glossary_entry 6, AboutResistanceText, ResistanceDescriptionText - glossary_entry 6, AboutRetreatingText, RetreatingDescriptionText - -Func_18661: ; 18661 (6:4661) - xor a - ld [wPlaysSfx], a - ld a, [wCheckMenuCursorXPosition] - ld d, a - ld a, [wCheckMenuCursorYPosition] - ld e, a - ldh a, [hDPadHeld] - or a - jr z, .check_button -; check input from dpad - bit D_LEFT_F, a - jr nz, .left_or_right - bit D_RIGHT_F, a - jr z, .check_up_and_down -.left_or_right -; swap the lsb of x position value. - ld a, d - xor $1 - ld d, a - jr .cursor_moved - -.check_up_and_down - bit D_UP_F, a - jr nz, .up_or_down - bit D_DOWN_F, a - jr z, .check_button -.up_or_down - ld a, e - xor $1 - ld e, a -.cursor_moved - ld a, $1 - ld [wPlaysSfx], a - push de - call .draw_blank_cursor - pop de - ld a, d - ld [wCheckMenuCursorXPosition], a - ld a, e - ld [wCheckMenuCursorYPosition], a - xor a - ld [wCheckMenuCursorBlinkCounter], a -.check_button - ldh a, [hKeysPressed] - and A_BUTTON | B_BUTTON - jr z, .check_cursor_moved - and A_BUTTON - jr nz, .a_button - -; b button - ld a, -1 - call Func_190fb - scf - ret - -; a button -.a_button - call .draw_cursor - ld a, 1 - call Func_190fb - scf - ret - -.check_cursor_moved - ld a, [wPlaysSfx] - or a - jr z, .check_cursor_blink - call PlaySFX -.check_cursor_blink - ld hl, wCheckMenuCursorBlinkCounter - ld a, [hl] - inc [hl] - and %00001111 - ret nz - ld a, SYM_CURSOR_R - bit D_RIGHT_F, [hl] - jr z, .draw_tile -.draw_blank_cursor ; 186d4 (6:46d4) - ld a, SYM_SPACE -.draw_tile - ld e, a - ld a, 10 - ld l, a - ld a, [wCheckMenuCursorXPosition] - ld h, a - call HtimesL - ld a, l - add 1 - ld b, a - ld a, [wCheckMenuCursorYPosition] - sla a - add 14 - ld c, a - ld a, e - ; b = 11, c = y_pos * 2 + 14 - ; h = x_pos * 10, l = 10 - call WriteByteToBGMap0 - or a - ret -.draw_cursor ; 186f3 (6:46f3) - ld a, SYM_CURSOR_R - jr .draw_tile - -INCLUDE "data/duel/effect_commands.asm" - -; reads the animation commands from PointerTable_AttackAnimation -; of attack in wLoadedAttackAnimation and plays them -PlayAttackAnimationCommands: ; 18f9c (6:4f9c) - ld a, [wLoadedAttackAnimation] - or a - ret z - - ld l, a - ld h, 0 - add hl, hl - ld de, PointerTable_AttackAnimation - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - - push de - ld hl, wce7e - ld a, [hl] - or a - jr nz, .read_command - ld [hl], $01 - call Func_3b21 - pop de - - push de - ld a, DUEL_ANIM_SCREEN_MAIN_SCENE - ld [wDuelAnimationScreen], a - ld a, $01 - ld [wd4b3], a - xor a - ld [wDuelAnimLocationParam], a - ld a, [de] - cp $04 - jr z, .read_command - ld a, DUEL_ANIM_150 - call PlayDuelAnimation -.read_command - pop de - ; fallthrough - -PlayAttackAnimationCommands_NextCommand: ; 18fd4 (6:4fd4) - ld a, [de] - inc de - ld hl, AnimationCommandPointerTable - jp JumpToFunctionInTable - -AnimationCommand_AnimEnd: ; 18fdc (6:4fdc) - ret - -AnimationCommand_AnimPlayer: ; 18fdd (6:4fdd) - ldh a, [hWhoseTurn] - ld [wDuelAnimDuelistSide], a - ld a, [wDuelType] - cp $00 - jr nz, AnimationCommand_AnimNormal - ld a, PLAYER_TURN - ld [wDuelAnimDuelistSide], a - jr AnimationCommand_AnimNormal - -AnimationCommand_AnimOpponent: ; 18ff0 (6:4ff0) - call SwapTurn - ldh a, [hWhoseTurn] - ld [wDuelAnimDuelistSide], a - call SwapTurn - ld a, [wDuelType] - cp $00 - jr nz, AnimationCommand_AnimNormal - ld a, OPPONENT_TURN - ld [wDuelAnimDuelistSide], a - jr AnimationCommand_AnimNormal - -AnimationCommand_AnimUnknown2: ; 19009 (6:5009) - ld a, [wce82] - and $7f - ld [wDuelAnimLocationParam], a - jr AnimationCommand_AnimNormal - -AnimationCommand_AnimEnd2: ; 19013 (6:5013) - ret - -AnimationCommand_AnimNormal: ; 19014 (6:5014) - ld a, [de] - inc de - cp DUEL_ANIM_SHOW_DAMAGE - jr z, .show_damage - cp DUEL_ANIM_SHAKE1 - jr z, .shake_1 - cp DUEL_ANIM_SHAKE2 - jr z, .shake_2 - cp DUEL_ANIM_SHAKE3 - jr z, .shake_3 - -.play_anim - call PlayDuelAnimation - jr PlayAttackAnimationCommands_NextCommand - -.show_damage - ld a, DUEL_ANIM_PRINT_DAMAGE - call PlayDuelAnimation - ld a, [wce81] - ld [wd4b3], a - - push de - ld hl, wce7f - ld de, wDuelAnimDamage - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - pop de - - ld a, $8c - call PlayDuelAnimation - ld a, [wDuelDisplayedScreen] - cp DUEL_MAIN_SCENE - jr nz, .skip_update_hud - ld a, DUEL_ANIM_UPDATE_HUD - call PlayDuelAnimation -.skip_update_hud - jp PlayAttackAnimationCommands_NextCommand - -; screen shake happens differently -; depending on whose turn it is -.shake_1 - ld c, DUEL_ANIM_SMALL_SHAKE_X - ld b, DUEL_ANIM_SMALL_SHAKE_Y - jr .check_duelist - -.shake_2 - ld c, DUEL_ANIM_BIG_SHAKE_X - ld b, DUEL_ANIM_BIG_SHAKE_Y - jr .check_duelist - -.shake_3 - ld c, DUEL_ANIM_SMALL_SHAKE_Y - ld b, DUEL_ANIM_SMALL_SHAKE_X - -.check_duelist - ldh a, [hWhoseTurn] - cp PLAYER_TURN - ld a, c - jr z, .play_anim - ld a, [wDuelType] - cp $00 - ld a, c - jr z, .play_anim - ld a, b - jr .play_anim - -AnimationCommand_AnimUnknown: ; 19079 (6:5079) - ld a, [de] - inc de - ld [wd4b3], a - ld a, [wce82] - ld [wDuelAnimLocationParam], a - call SetDuelAnimationScreen - ld a, DUEL_ANIM_150 - call PlayDuelAnimation - jp PlayAttackAnimationCommands_NextCommand - -AnimationCommandPointerTable: ; 1908f (6:508f) - dw AnimationCommand_AnimEnd ; anim_end - dw AnimationCommand_AnimNormal ; anim_normal - dw AnimationCommand_AnimPlayer ; anim_player - dw AnimationCommand_AnimOpponent ; anim_opponent - dw AnimationCommand_AnimUnknown ; anim_unknown - dw AnimationCommand_AnimUnknown2 ; anim_unknown2 - dw AnimationCommand_AnimEnd2 ; anim_end2 (unused) - -; sets wDuelAnimationScreen according to wd4b3 -; if wd4b3 == $01, set it to Main Scene -; if wd4b3 == $04, st it to Play Area scene -SetDuelAnimationScreen: ; 1909d (6:509d) - ld a, [wd4b3] - cp $04 - jr z, .set_play_area_screen - cp $01 - ret nz - ld a, DUEL_ANIM_SCREEN_MAIN_SCENE - ld [wDuelAnimationScreen], a - ret - -.set_play_area_screen - ld a, [wDuelAnimLocationParam] - ld l, a - ld a, [wWhoseTurn] - ld h, a - cp PLAYER_TURN - jr z, .player - -; opponent - ld a, [wDuelType] - cp $00 - jr z, .asm_50c6 - -; link duel or vs. AI - bit 7, l - jr z, .asm_50e2 - jr .asm_50d2 - -.asm_50c6 - bit 7, l - jr z, .asm_50da - jr .asm_50ea - -.player - bit 7, l - jr z, .asm_50d2 - jr .asm_50e2 - -.asm_50d2 - ld l, UNKNOWN_SCREEN_4 - ld h, PLAYER_TURN - ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA - jr .ok -.asm_50da - ld l, UNKNOWN_SCREEN_4 - ld h, OPPONENT_TURN - ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA - jr .ok -.asm_50e2 - ld l, UNKNOWN_SCREEN_5 - ld h, OPPONENT_TURN - ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA - jr .ok -.asm_50ea - ld l, UNKNOWN_SCREEN_5 - ld h, PLAYER_TURN - ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA - -.ok - ld [wDuelAnimationScreen], a - ret - -Func_190f4: ; 190f4 (6:50f4) - ld a, [wd4b3] - cp $04 - jr z, Func_1910f - ; fallthrough - -Func_190fb: ; 190fb (6:50fb) - cp $01 - jr nz, .asm_510e - ld a, DUEL_ANIM_SCREEN_MAIN_SCENE - ld [wDuelAnimationScreen], a - ld a, [wDuelDisplayedScreen] - cp $01 - jr z, .asm_510e - bank1call DrawDuelMainScene -.asm_510e - ret - -Func_1910f: ; 1910f (6:510f) - call SetDuelAnimationScreen - ld a, [wDuelDisplayedScreen] - cp l - jr z, .skip_change_screen - ld a, l - push af - ld l, PLAYER_TURN - ld a, [wDuelType] - cp $00 - jr nz, .asm_5127 - ld a, [wWhoseTurn] - ld l, a -.asm_5127 - call DrawYourOrOppPlayAreaScreen_Bank0 - pop af - ld [wDuelDisplayedScreen], a -.skip_change_screen - call DrawWideTextBox - ret - -; prints text related to the damage received -; by card stored in wTempNonTurnDuelistCardID -; takes into account type effectiveness -PrintDamageText: ; 19132 (6:5132) - push hl - push bc - push de - ld a, [wLoadedAttackAnimation] - cp ATK_ANIM_HEAL - jr z, .skip - cp ATK_ANIM_HEALING_WIND_PLAY_AREA - jr z, .skip - - ld a, [wTempNonTurnDuelistCardID] - ld e, a - ld d, $00 - call LoadCardDataToBuffer1_FromCardID - ld a, 18 - call CopyCardNameAndLevel - ld [hl], TX_END - ld hl, wTxRam2 - xor a - ld [hli], a - ld [hl], a - ld hl, wce7f - ld a, [hli] - ld h, [hl] - ld l, a - call GetDamageText - ld a, l - or h - call nz, DrawWideTextBox_PrintText -.skip - pop de - pop bc - pop hl - ret - -; returns in hl the text id associated with -; the damage in hl and its effectiveness -GetDamageText: ; 19168 (6:5168) - ld a, l - or h - jr z, .no_damage - call LoadTxRam3 - ld a, [wce81] - ldtx hl, AttackDamageText - and (1 << RESISTANCE) | (1 << WEAKNESS) - ret z ; not weak or resistant - ldtx hl, WeaknessMoreDamage2Text - cp (1 << RESISTANCE) | (1 << WEAKNESS) - ret z ; weak and resistant - and (1 << WEAKNESS) - ldtx hl, WeaknessMoreDamageText - ret nz ; weak - ldtx hl, ResistanceLessDamageText - ret ; resistant - -.no_damage - call CheckNoDamageOrEffect - ret c - ldtx hl, NoDamageText - ld a, [wce81] - and (1 << RESISTANCE) - ret z ; not resistant - ldtx hl, ResistanceNoDamageText - ret ; resistant - -UpdateMainSceneHUD: ; 19199 (6:5199) - ld a, [wDuelDisplayedScreen] - cp DUEL_MAIN_SCENE - ret nz - bank1call DrawDuelHUDs - ret - -Func_191a3: ; 191a3 (6:51a3) - ret - -INCLUDE "data/duel/animations/attack_animations.asm" - -; if carry flag is set, only delays -; if carry not set: -; - set rRP to $c1, wait; -; - set rRP to $c0, wait; -; - return -Func_19674: ; 19674 (6:5674) - jr c, .delay_once - ld [hl], $c1 - ld a, 5 - jr .loop_delay_1 ; jump to possibly to add more cycles? -.loop_delay_1 - dec a - jr nz, .loop_delay_1 - ld [hl], $c0 - ld a, 14 - jr .loop_delay_2 ; jump to possibly to add more cycles? -.loop_delay_2 - dec a - jr nz, .loop_delay_2 - ret - -.delay_once - ld a, 21 - jr .loop_delay_3 ; jump to possibly to add more cycles? -.loop_delay_3 - dec a - jr nz, .loop_delay_3 - nop - ret - -; input a = byte to transmit through IR -TransmitByteThroughIR: ; 19692 (6:5692) - push hl - ld hl, rRP - push de - push bc - ld b, a - scf ; carry set - call Func_19674 - or a ; carry not set - call Func_19674 - ld c, 8 - ld c, 8 ; number of input bits -.loop - ld a, $00 - rr b - call Func_19674 - dec c - jr nz, .loop - pop bc - pop de - pop hl - ldh a, [rJOYP] - bit 1, a ; P11 - jr z, ReturnZFlagUnsetAndCarryFlagSet - xor a ; return z set - ret - -; same as ReceiveByteThroughIR but -; returns $0 in a if there's an error in IR -ReceiveByteThroughIR_ZeroIfUnsuccessful: ; 196ba (6:56ba) - call ReceiveByteThroughIR - ret nc - xor a - ret - -; returns carry if there's some time out -; and output in register a of $ff -; otherwise returns in a some sequence of bits -; related to how rRP sets/unsets bit 1 -ReceiveByteThroughIR: ; 196c0 (6:56c0) - push de - push bc - push hl - -; waits for bit 1 in rRP to be unset -; up to $100 loops - ld b, 0 - ld hl, rRP -.wait_ir - bit 1, [hl] - jr z, .ok - dec b - jr nz, .wait_ir - ; looped around $100 times - ; return $ff and carry set - pop hl - pop bc - pop de - scf - ld a, $ff - ret - -.ok -; delay for some cycles - ld a, 15 -.loop_delay - dec a - jr nz, .loop_delay - -; loop for each bit - ld e, 8 -.loop - ld a, $01 - ; possibly delay cycles? - ld b, 9 - ld b, 9 - ld b, 9 - ld b, 9 - -; checks for bit 1 in rRP -; if in any of the checks it is unset, -; then a is set to 0 -; this is done a total of 9 times - bit 1, [hl] - jr nz, .asm_196ec - xor a -.asm_196ec - bit 1, [hl] - jr nz, .asm_196f1 - xor a -.asm_196f1 - dec b - jr nz, .asm_196ec - ; one bit received - rrca - rr d - dec e - jr nz, .loop - ld a, d ; has bits set for each "cycle" that bit 1 was not unset - pop hl - pop bc - pop de - or a - ret - -ReturnZFlagUnsetAndCarryFlagSet: ; 19700 (6:5700) - ld a, $ff - or a ; z not set - scf ; carry set - ret - -; called when expecting to transmit data -Func_19705: ; 19705 (6:5705) - ld hl, rRP -.asm_19708 - ldh a, [rJOYP] - bit 1, a - jr z, ReturnZFlagUnsetAndCarryFlagSet - ld a, $aa ; request - call TransmitByteThroughIR - push hl - pop hl - call ReceiveByteThroughIR_ZeroIfUnsuccessful - cp $33 ; acknowledge - jr nz, .asm_19708 - xor a - ret - -; called when expecting to receive data -Func_1971e: ; 1971e (6:571e) - ld hl, rRP -.asm_19721 - ldh a, [rJOYP] - bit 1, a - jr z, ReturnZFlagUnsetAndCarryFlagSet - call ReceiveByteThroughIR_ZeroIfUnsuccessful - cp $aa ; request - jr nz, .asm_19721 - ld a, $33 ; acknowledge - call TransmitByteThroughIR - xor a - ret - -ReturnZFlagUnsetAndCarryFlagSet2: ; 19735 (6:5735) - jp ReturnZFlagUnsetAndCarryFlagSet - -TransmitIRDataBuffer: ; 19738 (6:5738) - call Func_19705 - jr c, ReturnZFlagUnsetAndCarryFlagSet2 - ld a, $49 - call TransmitByteThroughIR - ld a, $52 - call TransmitByteThroughIR - ld hl, wIRDataBuffer - ld c, 8 - jr TransmitNBytesFromHLThroughIR - -ReceiveIRDataBuffer: ; 1974e (6:5738) - call Func_1971e - jr c, ReturnZFlagUnsetAndCarryFlagSet2 - call ReceiveByteThroughIR - cp $49 - jr nz, ReceiveIRDataBuffer - call ReceiveByteThroughIR - cp $52 - jr nz, ReceiveIRDataBuffer - ld hl, wIRDataBuffer - ld c, 8 - jr ReceiveNBytesToHLThroughIR - -; hl = start of data to transmit -; c = number of bytes to transmit -TransmitNBytesFromHLThroughIR: ; 19768 (6:5768) - ld b, $0 -.loop_data_bytes - ld a, b - add [hl] - ld b, a - ld a, [hli] - call TransmitByteThroughIR - jr c, .asm_1977c - dec c - jr nz, .loop_data_bytes - ld a, b - cpl - inc a - call TransmitByteThroughIR -.asm_1977c - ret - -; hl = address to write received data -; c = number of bytes to be received -ReceiveNBytesToHLThroughIR: ; 1977d (6:577d) - ld b, 0 -.loop_data_bytes - call ReceiveByteThroughIR - jr c, ReturnZFlagUnsetAndCarryFlagSet2 - ld [hli], a - add b - ld b, a - dec c - jr nz, .loop_data_bytes - call ReceiveByteThroughIR - add b - or a - jr nz, ReturnZFlagUnsetAndCarryFlagSet2 - ret - -; disables interrupts, and sets joypad and IR communication port -; switches to CGB normal speed -StartIRCommunications: ; 19792 (6:5792) - di - call SwitchToCGBNormalSpeed - ld a, P14 - ldh [rJOYP], a - ld a, $c0 - ldh [rRP], a - ret - -; reenables interrupts, and switches CGB back to double speed -CloseIRCommunications: ; 1979f (6:579f) - ld a, P14 | P15 - ldh [rJOYP], a -.wait_vblank_on - ldh a, [rSTAT] - and STAT_LCDC_STATUS - cp STAT_ON_VBLANK - jr z, .wait_vblank_on -.wait_vblank_off - ldh a, [rSTAT] - and STAT_LCDC_STATUS - cp STAT_ON_VBLANK - jr nz, .wait_vblank_off - call SwitchToCGBDoubleSpeed - ei - ret - -; set rRP to 0 -ClearRP: ; 197b8 (6:57b8) - ld a, $00 - ldh [rRP], a - ret - -; expects to receive a command (IRCMD_* constant) -; in wIRDataBuffer + 1, then calls the subroutine -; corresponding to that command -ExecuteReceivedIRCommands: ; 197bd (6:57bd) - call StartIRCommunications -.loop_commands - call ReceiveIRDataBuffer - jr c, .error - jr nz, .loop_commands - ld hl, wIRDataBuffer + 1 - ld a, [hl] - ld hl, .CmdPointerTable - cp NUM_IR_COMMANDS - jr nc, .loop_commands ; invalid command - call .JumpToCmdPointer ; execute command - jr .loop_commands -.error - call CloseIRCommunications - xor a - scf - ret - -.JumpToCmdPointer - add a ; *2 - add l - ld l, a - ld a, 0 - adc h - ld h, a - ld a, [hli] - ld h, [hl] - ld l, a -.jp_hl - jp hl - -.CmdPointerTable - dw .Close ; IRCMD_CLOSE - dw .ReturnWithoutClosing ; IRCMD_RETURN_WO_CLOSING - dw .TransmitData ; IRCMD_TRANSMIT_DATA - dw .ReceiveData ; IRCMD_RECEIVE_DATA - dw .CallFunction ; IRCMD_CALL_FUNCTION - -; closes the IR communications -; pops hl so that the sp points -; to the return address of ExecuteReceivedIRCommands -.Close - pop hl - call CloseIRCommunications - or a - ret - -; returns without closing the IR communications -; will continue the command loop -.ReturnWithoutClosing - or a - ret - -; receives an address and number of bytes -; and transmits starting at that address -.TransmitData - call Func_19705 - ret c - call LoadRegistersFromIRDataBuffer - jp TransmitNBytesFromHLThroughIR - -; receives an address and number of bytes -; and writes the data received to that address -.ReceiveData - call LoadRegistersFromIRDataBuffer - ld l, e - ld h, d - call ReceiveNBytesToHLThroughIR - jr c, .asm_19812 - sub b - call TransmitByteThroughIR -.asm_19812 - ret - -; receives an address to call, then stores -; the registers in the IR data buffer -.CallFunction - call LoadRegistersFromIRDataBuffer - call .jp_hl - call StoreRegistersInIRDataBuffer - ret - -; returns carry set if request sent was not acknowledged -TrySendIRRequest: ; 1981d (6:581d) - call StartIRCommunications - ld hl, rRP - ld c, 4 -.send_request - ld a, $aa ; request - push bc - call TransmitByteThroughIR - push bc - pop bc - call ReceiveByteThroughIR_ZeroIfUnsuccessful - pop bc - cp $33 ; acknowledgement - jr z, .received_ack - dec c - jr nz, .send_request - scf - jr .close - -.received_ack - xor a -.close - push af - call CloseIRCommunications - pop af - ret - -; returns carry set if request was not received -TryReceiveIRRequest: ; 19842 (6:5842) - call StartIRCommunications - ld hl, rRP -.wait_request - call ReceiveByteThroughIR_ZeroIfUnsuccessful - cp $aa ; request - jr z, .send_ack - ldh a, [rJOYP] - cpl - and P10 | P11 - jr z, .wait_request - scf - jr .close - -.send_ack - ld a, $33 ; acknowledgement - call TransmitByteThroughIR - xor a -.close - push af - call CloseIRCommunications - pop af - ret - -; sends request for other device to close current communication -RequestCloseIRCommunication: ; 19865 (6:5865) - call StartIRCommunications - ld a, IRCMD_CLOSE - ld [wIRDataBuffer + 1], a - call TransmitIRDataBuffer -; fallthrough - -; calls CloseIRCommunications while preserving af -SafelyCloseIRCommunications: ; 19870 (6:5870) - push af - call CloseIRCommunications - pop af - ret - -; sends a request for data to be transmitted -; from the other device -; hl = start of data to request to transmit -; de = address to write data received -; c = length of data -RequestDataTransmissionThroughIR: ; 19876 (6:5876) - ld a, IRCMD_TRANSMIT_DATA - call TransmitRegistersThroughIR - push de - push bc - call Func_1971e - pop bc - pop hl - jr c, SafelyCloseIRCommunications - call ReceiveNBytesToHLThroughIR - jr SafelyCloseIRCommunications - -; transmits data to be written in the other device -; hl = start of data to transmit -; de = address for other device to write data -; c = length of data -RequestDataReceivalThroughIR: ; 19889 (6:5889) - ld a, IRCMD_RECEIVE_DATA - call TransmitRegistersThroughIR - call TransmitNBytesFromHLThroughIR - jr c, SafelyCloseIRCommunications - call ReceiveByteThroughIR - jr c, SafelyCloseIRCommunications - add b - jr nz, .asm_1989e - xor a - jr SafelyCloseIRCommunications -.asm_1989e - call ReturnZFlagUnsetAndCarryFlagSet - jr SafelyCloseIRCommunications - -; first stores all the current registers in wIRDataBuffer -; then transmits it through IR -TransmitRegistersThroughIR: ; 198a3 (6:58a3) - push hl - push de - push bc - call StoreRegistersInIRDataBuffer - call StartIRCommunications - call TransmitIRDataBuffer - pop bc - pop de - pop hl - ret nc - inc sp - inc sp - jr SafelyCloseIRCommunications - -; stores af, hl, de and bc in wIRDataBuffer -StoreRegistersInIRDataBuffer: ; 198b7 (6:58b7) - push de - push hl - push af - ld hl, wIRDataBuffer - pop de - ld [hl], e ; <- f - inc hl - ld [hl], d ; <- a - inc hl - pop de - ld [hl], e ; <- l - inc hl - ld [hl], d ; <- h - inc hl - pop de - ld [hl], e ; <- e - inc hl - ld [hl], d ; <- d - inc hl - ld [hl], c ; <- c - inc hl - ld [hl], b ; <- b - ret - -; loads all the registers that were stored -; from StoreRegistersInIRDataBuffer -LoadRegistersFromIRDataBuffer: ; 198d0 (6:58d0) - ld hl, wIRDataBuffer - ld e, [hl] - inc hl - ld d, [hl] - inc hl - push de - ld e, [hl] - inc hl - ld d, [hl] - inc hl - push de - ld e, [hl] - inc hl - ld d, [hl] - inc hl - ld c, [hl] - inc hl - ld b, [hl] - pop hl - pop af - ret - -; empties screen and replaces -; wVBlankFunctionTrampoline with HandleAllSpriteAnimations -Func_198e7: ; 198e7 (6:58e7) - call EmptyScreen - call Set_OBJ_8x8 - call Func_3ca4 - lb de, $38, $7f - call SetupText - ld hl, wVBlankFunctionTrampoline + 1 - ld de, wVBlankFunctionTrampolineBackup - call BackupVBlankFunctionTrampoline - di - ld [hl], LOW(HandleAllSpriteAnimations) - inc hl - ld [hl], HIGH(HandleAllSpriteAnimations) - ei - ret - -; sets backup VBlank function as wVBlankFunctionTrampoline -RestoreVBlankFunction: ; 19907 (6:5907) - ld hl, wVBlankFunctionTrampolineBackup - ld de, wVBlankFunctionTrampoline + 1 - call BackupVBlankFunctionTrampoline - call Func_3ca4 - bank1call ZeroObjectPositionsAndToggleOAMCopy - ret - -; copies 2 bytes from hl to de while interrupts are disabled -; used to load or store wVBlankFunctionTrampoline -; to wVBlankFunctionTrampolineBackup -BackupVBlankFunctionTrampoline: ; 19917 (6:5917) - di - ld a, [hli] - ld [de], a - inc de - ld a, [hld] - ld [de], a - ei - ret - -Func_1991f: ; 1991f (6:591f) - add a - ld e, a - ld d, 0 - ld hl, .data - add hl, de - ld a, PLAYER_TURN - ldh [hWhoseTurn], a - ld a, [hli] - add $02 - push hl - ld hl, sDeck1Name - call CopyDeckNameAndCards - pop hl - call SwapTurn - ld a, [hli] - add $02 - call LoadDeck - call SwapTurn - call EnableSRAM - ld h, $a1 - ld de, wPlayerDeck - ld c, $3c -.asm_594c - ld a, [de] - inc de - ld l, a - res 7, [hl] - dec c - jr nz, .asm_594c - - ld h, $a1 - ld de, wOpponentDeck - ld c, $1e -.asm_595b - ld a, [de] - inc de - ld l, a - res 7, [hl] - inc [hl] - dec c - jr nz, .asm_595b - - call DisableSRAM - ret -.data - db $03, $04, $05, $06, $07, $08 - -; clears saved data (card Collection/saved decks/Card Pop! data/etc) -; then adds the starter decks as saved decks -; marks all cards in Collection as not owned -InitSaveData: ; 1996e (6:596e) -; clear card and deck save data - call EnableSRAM - ld a, PLAYER_TURN - ldh [hWhoseTurn], a - ld hl, sCardAndDeckSaveData - ld bc, sCardAndDeckSaveDataEnd - sCardAndDeckSaveData -.loop_clear - xor a - ld [hli], a - dec bc - ld a, c - or b - jr nz, .loop_clear - -; add the starter decks - ld a, CHARMANDER_AND_FRIENDS_DECK - ld hl, sSavedDeck1 - call CopyDeckNameAndCards - ld a, SQUIRTLE_AND_FRIENDS_DECK - ld hl, sSavedDeck2 - call CopyDeckNameAndCards - ld a, BULBASAUR_AND_FRIENDS_DECK - ld hl, sSavedDeck3 - call CopyDeckNameAndCards - -; marks all cards in Collection to not owned - call EnableSRAM - ld hl, sCardCollection - ld a, CARD_NOT_OWNED -.loop_collection - ld [hl], a - inc l - jr nz, .loop_collection - - ld hl, sCurrentDuel - xor a - ld [hli], a - ld [hli], a ; sCurrentDuelChecksum - ld [hl], a - -; clears Card Pop! names - ld hl, sCardPopNameList - ld c, CARDPOP_NAME_LIST_MAX_ELEMS -.loop_card_pop_names - ld [hl], $0 - ld de, NAME_BUFFER_LENGTH - add hl, de - dec c - jr nz, .loop_card_pop_names - -; saved configuration options - ld a, 2 - ld [sPrinterContrastLevel], a - ld a, $2 - ld [sTextSpeed], a - ld [wTextSpeed], a - -; miscellaneous data - xor a - ld [sAnimationsDisabled], a - ld [sSkipDelayAllowed], a - ld [s0a004], a - ld [sTotalCardPopsDone], a - ld [sReceivedLegendaryCards], a - farcall InitPromotionalCardAndDeckCounterSaveData - call DisableSRAM - ret - -; input: -; a = Deck ID -; hl = destination to copy -CopyDeckNameAndCards: ; 199e0 (6:59e0) - push de - push bc - push hl - call LoadDeck - jr c, .done - call .CopyDeckName - pop hl - call EnableSRAM - push hl - ld de, wDefaultText -.loop_write_name - ld a, [de] - inc de - ld [hli], a - or a - jr nz, .loop_write_name - pop hl - - push hl - ld de, DECK_NAME_SIZE - add hl, de - ld de, wPlayerDeck - ld c, DECK_SIZE -.loop_write_cards - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .loop_write_cards - call DisableSRAM - or a -.done - pop hl - pop bc - pop de - ret - -.CopyDeckName - ld hl, wDeckName - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wDefaultText - call CopyText - ret - -; hl = text ID -LoadLinkConnectingScene: ; 19a1f (6:5a1f) - push hl - call Func_198e7 - ld a, SCENE_GAMEBOY_LINK_CONNECTING - lb bc, 0, 0 - call LoadScene - pop hl - call DrawWideTextBox_PrintText - call EnableLCD - ret - -; shows Link Not Connected scene -; then asks the player whether they want to try again -; if the player selects "no", return carry -; input: -; - hl = text ID -LoadLinkNotConnectedSceneAndAskWhetherToTryAgain: ; 19a33 (6:5a33) - push hl - call RestoreVBlankFunction - call Func_198e7 - ld a, SCENE_GAMEBOY_LINK_NOT_CONNECTED - lb bc, 0, 0 - call LoadScene - pop hl - call DrawWideTextBox_WaitForInput - ldtx hl, WouldYouLikeToTryAgainText - call YesOrNoMenuWithText_SetCursorToYes -; fallthrough - -ClearRPAndRestoreVBlankFunction: ; 19a4c (6:5a4c) - push af - call ClearRP - call RestoreVBlankFunction - pop af - ret - -; prepares IR communication parameter data -; a = a IRPARAM_* constant for the function of this connection -InitIRCommunications: ; 19a55 (6:5a55) - ld hl, wOwnIRCommunicationParams - ld [hl], a - inc hl - ld [hl], $50 - inc hl - ld [hl], $4b - inc hl - ld [hl], $31 - ld a, $ff - ld [wIRCommunicationErrorCode], a - ld a, PLAYER_TURN - ldh [hWhoseTurn], a -; clear wNameBuffer and wOpponentName - xor a - ld [wNameBuffer], a - ld hl, wOpponentName - ld [hli], a - ld [hl], a -; loads player's name from SRAM -; to wDefaultText - call EnableSRAM - ld hl, sPlayerName - ld de, wDefaultText - ld c, NAME_BUFFER_LENGTH -.loop - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop - call DisableSRAM - ret - -; returns carry if communication was unsuccessful -; if a = 0, then it was a communication error -; if a = 1, then operation was cancelled by the player -PrepareSendCardOrDeckConfigurationThroughIR: ; 19a89 (6:5a89) - call InitIRCommunications - -; pressing A button triggers request for IR communication -.loop_frame - call DoFrame - ldh a, [hKeysPressed] - bit B_BUTTON_F, a - jr nz, .b_btn - ldh a, [hKeysHeld] - bit A_BUTTON_F, a - jr z, .loop_frame -; a btn - call TrySendIRRequest - jr nc, .request_success - or a - jr z, .loop_frame - xor a - scf - ret - -.b_btn - ; cancelled by the player - ld a, $01 - scf - ret - -.request_success - call ExchangeIRCommunicationParameters - ret c - ld a, [wOtherIRCommunicationParams + 3] - cp $31 - jr nz, SetIRCommunicationErrorCode_Error - or a - ret - -; exchanges player names and IR communication parameters -; checks whether parameters for communication match -; and if they don't, an error is issued -ExchangeIRCommunicationParameters: ; 19ab7 (6:5ab7) - ld hl, wOwnIRCommunicationParams - ld de, wOtherIRCommunicationParams - ld c, 4 - call RequestDataTransmissionThroughIR - jr c, .error - ld hl, wOtherIRCommunicationParams + 1 - ld a, [hli] - cp $50 - jr nz, .error - ld a, [hli] - cp $4b - jr nz, .error - ld a, [wOwnIRCommunicationParams] - ld hl, wOtherIRCommunicationParams - cp [hl] ; do parameters match? - jr nz, SetIRCommunicationErrorCode_Error - -; receives wDefaultText from other device -; and writes it to wNameBuffer - ld hl, wDefaultText - ld de, wNameBuffer - ld c, NAME_BUFFER_LENGTH - call RequestDataTransmissionThroughIR - jr c, .error -; transmits wDefaultText to be -; written in wNameBuffer in the other device - ld hl, wDefaultText - ld de, wNameBuffer - ld c, NAME_BUFFER_LENGTH - call RequestDataReceivalThroughIR - jr c, .error - or a - ret - -.error - xor a - scf - ret - -SetIRCommunicationErrorCode_Error: ; 19af9 (6:5af9) - ld hl, wIRCommunicationErrorCode - ld [hl], $01 - ld de, wIRCommunicationErrorCode - ld c, 1 - call RequestDataReceivalThroughIR - call RequestCloseIRCommunication - ld a, $01 - scf - ret - -SetIRCommunicationErrorCode_NoError: ; 19b0d (6:5b0d) - ld hl, wOwnIRCommunicationParams - ld [hl], $00 - ld de, wIRCommunicationErrorCode - ld c, 1 - call RequestDataReceivalThroughIR - ret c - call RequestCloseIRCommunication - or a - ret - -; makes device receptive to receive data from other device -; to write in wDuelTempList (either list of cards or a deck configuration) -; returns carry if some error occurred -TryReceiveCardOrDeckConfigurationThroughIR: ; 19b20 (6:5b20) - call InitIRCommunications -.loop_receive_request - xor a - ld [wDuelTempList], a - call TryReceiveIRRequest - jr nc, .receive_data - bit 1, a - jr nz, .cancelled - jr .loop_receive_request -.receive_data - call ExecuteReceivedIRCommands - ld a, [wIRCommunicationErrorCode] - or a - ret z ; no error - xor a - scf - ret - -.cancelled - ld a, $01 - scf - ret - -; returns carry if card(s) wasn't successfully sent -_SendCard: ; 19b41 (6:5b41) - call StopMusic - ldtx hl, SendingACardText - call LoadLinkConnectingScene - ld a, IRPARAM_SEND_CARDS - call PrepareSendCardOrDeckConfigurationThroughIR - jr c, .fail - - ; send cards - xor a - ld [wDuelTempList + DECK_SIZE], a - ld hl, wDuelTempList - ld e, l - ld d, h - ld c, DECK_SIZE + 1 - call RequestDataReceivalThroughIR - jr c, .fail - call SetIRCommunicationErrorCode_NoError - jr c, .fail - call ExecuteReceivedIRCommands - jr c, .fail - ld a, [wOwnIRCommunicationParams + 1] - cp $4f - jr nz, .fail - call PlayCardPopSong - xor a - call ClearRPAndRestoreVBlankFunction - ret - -.fail - call PlayCardPopSong - ldtx hl, CardTransferWasntSuccessful1Text - call LoadLinkNotConnectedSceneAndAskWhetherToTryAgain - jr nc, _SendCard ; loop back and try again - ; failed - scf - ret - -PlayCardPopSong: ; 19b87 (6:5b87) - ld a, MUSIC_CARD_POP - jp PlaySong - -_ReceiveCard: ; 19b8c (6:5b8c) - call StopMusic - ldtx hl, ReceivingACardText - call LoadLinkConnectingScene - ld a, IRPARAM_SEND_CARDS - call TryReceiveCardOrDeckConfigurationThroughIR - ld a, $4f - ld [wOwnIRCommunicationParams + 1], a - ld hl, wOwnIRCommunicationParams - ld e, l - ld d, h - ld c, 4 - call RequestDataReceivalThroughIR - jr c, .fail - call RequestCloseIRCommunication - jr c, .fail - call PlayCardPopSong - or a - call ClearRPAndRestoreVBlankFunction - ret - -.fail - call PlayCardPopSong - ldtx hl, CardTransferWasntSuccessful2Text - call LoadLinkNotConnectedSceneAndAskWhetherToTryAgain - jr nc, _ReceiveCard - scf - ret - -_SendDeckConfiguration: ; 19bc5 (6:5bc5) - call StopMusic - ldtx hl, SendingADeckConfigurationText - call LoadLinkConnectingScene - ld a, IRPARAM_SEND_DECK - call PrepareSendCardOrDeckConfigurationThroughIR - jr c, .fail - ld hl, wDuelTempList - ld e, l - ld d, h - ld c, DECK_STRUCT_SIZE - call RequestDataReceivalThroughIR - jr c, .fail - call SetIRCommunicationErrorCode_NoError - jr c, .fail - call PlayCardPopSong - call ClearRPAndRestoreVBlankFunction - or a - ret - -.fail - call PlayCardPopSong - ldtx hl, DeckConfigurationTransferWasntSuccessful1Text - call LoadLinkNotConnectedSceneAndAskWhetherToTryAgain - jr nc, _SendDeckConfiguration - scf - ret - -_ReceiveDeckConfiguration: ; 19bfb (6:5bfb) - call StopMusic - ldtx hl, ReceivingDeckConfigurationText - call LoadLinkConnectingScene - ld a, IRPARAM_SEND_DECK - call TryReceiveCardOrDeckConfigurationThroughIR - jr c, .fail - call PlayCardPopSong - call ClearRPAndRestoreVBlankFunction - or a - ret - -.fail - call PlayCardPopSong - ldtx hl, DeckConfigurationTransferWasntSuccessful2Text - call LoadLinkNotConnectedSceneAndAskWhetherToTryAgain - jr nc, _ReceiveDeckConfiguration ; loop back and try again - scf - ret - -_DoCardPop: ; 19c20 (6:5c20) -; loads scene for Card Pop! screen -; then checks if console is SGB -; and issues an error message in case it is - call Func_198e7 - ld a,SCENE_CARD_POP - lb bc, 0, 0 - call LoadScene - ldtx hl, AreYouBothReadyToCardPopText - call PrintScrollableText_NoTextBoxLabel - call RestoreVBlankFunction - ldtx hl, CardPopCannotBePlayedWithTheGameBoyText - ld a, [wConsole] - cp CONSOLE_SGB - jr z, .error - -; initiate the communications - call PauseSong - call Func_198e7 - ld a, SCENE_GAMEBOY_LINK_CONNECTING - lb bc, 0, 0 - call LoadScene - ldtx hl, PositionGameBoyColorsAndPressAButtonText - call DrawWideTextBox_PrintText - call EnableLCD - call HandleCardPopCommunications - push af - push hl - call ClearRP - call RestoreVBlankFunction - pop hl - pop af - jr c, .error - -; show the received card detail page -; and play the corresponding song - ld a, [wLoadedCard1ID] - call AddCardToCollectionAndUpdateAlbumProgress - ld hl, wLoadedCard1Name - ld a, [hli] - ld h, [hl] - ld l, a - call LoadTxRam2 - ld a, PLAYER_TURN - ldh [hWhoseTurn], a - ld a, SFX_5D - call PlaySFX -.wait_sfx - call AssertSFXFinished - or a - jr nz, .wait_sfx - ld a, [wCardPopCardObtainSong] - call PlaySong - ldtx hl, ReceivedThroughCardPopText - bank1call _DisplayCardDetailScreen - call ResumeSong - lb de, $38, $9f - call SetupText - bank1call OpenCardPage_FromHand - ret - -.error -; show Card Pop! error scene -; and print text in hl - push hl - call ResumeSong - call Func_198e7 - ld a, SCENE_CARD_POP_ERROR - lb bc, 0, 0 - call LoadScene - pop hl - call PrintScrollableText_NoTextBoxLabel - call RestoreVBlankFunction - ret - -; handles all communications to the other device to do Card Pop! -; returns carry if Card Pop! is unsuccessful -; and returns in hl the corresponding error text ID -HandleCardPopCommunications: ; 19cb2 (6:5cb2) -; copy CardPopNameList from SRAM to WRAM - call EnableSRAM - ld hl, sCardPopNameList - ld de, wCardPopNameList - ld bc, CARDPOP_NAME_LIST_SIZE - call CopyDataHLtoDE - call DisableSRAM - - ld a, IRPARAM_CARD_POP - call InitIRCommunications -.asm_19cc9 - call TryReceiveIRRequest ; receive request - jr nc, .asm_19d05 - bit 1, a - jr nz, .fail - call TrySendIRRequest ; send request - jr c, .asm_19cc9 - -; do the player name search, then transmit the result - call ExchangeIRCommunicationParameters - jr c, .fail - ld hl, wCardPopNameList - ld de, wOtherPlayerCardPopNameList - ld c, 0 ; $100 bytes = CARDPOP_NAME_LIST_SIZE - call RequestDataTransmissionThroughIR - jr c, .fail - call LookUpNameInCardPopNameList - ld hl, wCardPopNameSearchResult - ld de, wCardPopNameSearchResult - ld c, 1 - call RequestDataReceivalThroughIR - jr c, .fail - call SetIRCommunicationErrorCode_NoError - jr c, .fail - call ExecuteReceivedIRCommands - jr c, .fail - jr .check_search_result - -.asm_19d05 - call ExecuteReceivedIRCommands - ld a, [wIRCommunicationErrorCode] - or a - jr nz, .fail - call RequestCloseIRCommunication - jr c, .fail - -.check_search_result - ld a, [wCardPopNameSearchResult] - or a - jr z, .success - ; not $00, means the name was found in the list - ldtx hl, CannotCardPopWithFriendPreviouslyPoppedWithText - scf - ret - -.success - call DecideCardToReceiveFromCardPop - -; increment number of times Card Pop! was done -; and write the other player's name to sCardPopNameList -; the spot where this is written in the list is derived -; from the lower nybble of sTotalCardPopsDone -; that means that after 16 Card Pop!, the older -; names start to get overwritten - call EnableSRAM - ld hl, sTotalCardPopsDone - ld a, [hl] - inc [hl] - and $0f - swap a ; *NAME_BUFFER_LENGTH - ld l, a - ld h, $0 - ld de, sCardPopNameList - add hl, de - ld de, wNameBuffer - ld c, NAME_BUFFER_LENGTH -.loop_write_name - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .loop_write_name - call DisableSRAM - or a - ret - -.fail - ldtx hl, ThePopWasntSuccessfulText - scf - ret - -; looks up the name in wNameBuffer in wCardPopNameList -; used to know whether this save file has done Card Pop! -; with the other player already -; returns carry and wCardPopNameSearchResult = $ff if the name was found; -; returns no carry and wCardPopNameSearchResult = $00 otherwise -LookUpNameInCardPopNameList: ; 19d49 (6:5d49) -; searches for other player's name in this game's name list - ld hl, wCardPopNameList - ld c, CARDPOP_NAME_LIST_MAX_ELEMS -.loop_own_card_pop_name_list - push hl - ld de, wNameBuffer - call .CompareNames - pop hl - jr nc, .found_name - ld de, NAME_BUFFER_LENGTH - add hl, de - dec c - jr nz, .loop_own_card_pop_name_list - -; name was not found in wCardPopNameList - -; searches for this player's name in the other game's name list -; this is useless since it discards the result from the name comparisons -; as a result this loop will always return no carry - call EnableSRAM - ld hl, wOtherPlayerCardPopNameList - ld c, CARDPOP_NAME_LIST_MAX_ELEMS -.loop_other_card_pop_name_list - push hl - ld de, sPlayerName - call .CompareNames ; discards result from comparison - pop hl - ld de, NAME_BUFFER_LENGTH - add hl, de - dec c - jr nz, .loop_other_card_pop_name_list - xor a - jr .no_carry - -.found_name - ld a, $ff - scf -.no_carry - call DisableSRAM - ld [wCardPopNameSearchResult], a ; $00 if name was not found, $ff otherwise - ret - -; compares names in hl and de -; if they are different, return carry -.CompareNames - ld b, NAME_BUFFER_LENGTH -.loop_chars - ld a, [de] - inc de - cp [hl] - jr nz, .not_same - inc hl - dec b - jr nz, .loop_chars - or a - ret -.not_same - scf - ret - -; loads in wLoadedCard1 a random card to be received -; this selection is done based on the rarity that is -; decided from the names of both participants -; the card will always be a Pokemon card that is not -; from a Promotional set, with the exception -; of Venusaur1 and Mew2 -; output: -; - e = card ID chosen -DecideCardToReceiveFromCardPop: ; 19d92 (6:5d92) - ld a, PLAYER_TURN - ldh [hWhoseTurn], a - call EnableSRAM - ld hl, sPlayerName - call CalculateNameHash - call DisableSRAM - push de - ld hl, wNameBuffer - call CalculateNameHash - pop bc - -; de = other player's name hash -; bc = this player's name hash - -; updates RNG values to subtraction of these two hashes - ld hl, wRNG1 - ld a, b - sub d - ld d, a ; b - d - ld [hli], a ; wRNG1 - ld a, c - sub e - ld e, a ; c - e - ld [hli], a ; wRNG2 - ld [hl], $0 ; wRNGCounter - -; depending on the values obtained from the hashes, -; determine which rarity card to give to the player -; along with the song to play with each rarity -; the probabilities of each possibility can be calculated -; as follows (given 2 random player names): -; 101/256 ~ 39% for Circle -; 90/256 ~ 35% for Diamond -; 63/256 ~ 25% for Star -; 1/256 ~ .4% for Venusaur1 or Mew2 - ld a, e - cp 5 - jr z, .venusaur1_or_mew2 - cp 64 - jr c, .star_rarity ; < 64 - cp 154 - jr c, .diamond_rarity ; < 154 - ; >= 154 - - ld a, MUSIC_BOOSTER_PACK - ld b, CIRCLE - jr .got_rarity -.diamond_rarity - ld a, MUSIC_BOOSTER_PACK - ld b, DIAMOND - jr .got_rarity -.star_rarity - ld a, MUSIC_MATCH_VICTORY - ld b, STAR -.got_rarity - ld [wCardPopCardObtainSong], a - ld a, b - call CreateCardPopCandidateList - ; shuffle candidates and pick first from list - call ShuffleCards - ld a, [hl] - ld e, a -.got_card_id - ld d, $0 - call LoadCardDataToBuffer1_FromCardID - ld a, e - ret - -.venusaur1_or_mew2 -; choose either Venusaur1 or Mew2 -; depending on whether the lower -; bit of d is unset or set, respectively - ld a, MUSIC_MEDAL - ld [wCardPopCardObtainSong], a - ld e, VENUSAUR1 - ld a, d - and $1 ; get lower bit - jr z, .got_card_id - ld e, MEW2 - jr .got_card_id - -; lists in wCardPopCardCandidates all cards that: -; - are Pokemon cards; -; - have the same rarity as input register a; -; - are not from Promotional set. -; input: -; - a = card rarity -; output: -; - a = number of candidates -CreateCardPopCandidateList: ; 19df7 (6:5df7) - ld hl, wPlayerDeck - push hl - push de - push bc - ld b, a - - lb de, 0, GRASS_ENERGY -.loop_card_ids - call LoadCardDataToBuffer1_FromCardID - jr c, .count ; no more card IDs - ld a, [wLoadedCard1Type] - and TYPE_ENERGY - jr nz, .next_card_id ; not Pokemon card - ld a, [wLoadedCard1Rarity] - cp b - jr nz, .next_card_id ; not equal rarity - ld a, [wLoadedCard1Set] - and $f0 - cp PROMOTIONAL - jr z, .next_card_id ; no promos - ld [hl], e - inc hl -.next_card_id - inc de - jr .loop_card_ids - -; count all the cards that were listed -; and return it in a -.count - ld [hl], $00 ; invalid card ID as end of list - ld hl, wPlayerDeck - ld c, -1 -.loop_count - inc c - ld a, [hli] - or a - jr nz, .loop_count - ld a, c - pop bc - pop de - pop hl - ret - -; creates a unique two-byte hash from the name given in hl -; the low byte is calculated by simply adding up all characters -; the high byte is calculated by xoring all characters together -; input: -; - hl = points to the start of the name buffer -; output: -; - de = hash -CalculateNameHash: ; 19e32 (6:5e32) - ld c, NAME_BUFFER_LENGTH - ld de, $0 -.loop - ld a, e - add [hl] - ld e, a - ld a, d - xor [hl] - ld d, a - inc hl - dec c - jr nz, .loop - ret - -; sends serial data to printer -; if there's an error in connection, -; show Printer Not Connected scene with error message -_PreparePrinterConnection: ; 19e42 (6:5e42) - ld bc, $0 - lb de, PRINTERPKT_DATA, $0 - call SendPrinterPacket - ret nc ; return if no error - - ld hl, wPrinterStatus - ld a, [hl] - or a - jr nz, .asm_19e55 - ld [hl], $ff -.asm_19e55 - ld a, [hl] - cp $ff - jr z, ShowPrinterIsNotConnected -; fallthrough - -; shows message on screen depending on wPrinterStatus -; also shows SCENE_GAMEBOY_PRINTER_NOT_CONNECTED. -HandlePrinterError: ; 19e5a (6:5e5a) - ld a, [wPrinterStatus] - cp $ff - jr z, .cable_or_printer_switch - or a - jr z, .interrupted - bit PRINTER_ERROR_BATTERIES_LOST_CHARGE, a - jr nz, .batteries_lost_charge - bit PRINTER_ERROR_CABLE_PRINTER_SWITCH, a - jr nz, .cable_or_printer_switch - bit PRINTER_ERROR_PAPER_JAMMED, a - jr nz, .jammed_printer - - ldtx hl, PrinterPacketErrorText - ld a, $04 - jr ShowPrinterConnectionErrorScene -.cable_or_printer_switch - ldtx hl, CheckCableOrPrinterSwitchText - ld a, $02 - jr ShowPrinterConnectionErrorScene -.jammed_printer - ldtx hl, PrinterPaperIsJammedText - ld a, $03 - jr ShowPrinterConnectionErrorScene -.batteries_lost_charge - ldtx hl, BatteriesHaveLostTheirChargeText - ld a, $01 - jr ShowPrinterConnectionErrorScene -.interrupted - ldtx hl, PrintingWasInterruptedText - call DrawWideTextBox_WaitForInput - scf - ret - -ShowPrinterIsNotConnected: ; 19e94 (6:5e94) - ldtx hl, PrinterIsNotConnectedText - ld a, $02 -; fallthrough - -; a = error code -; hl = text ID to print in text box -ShowPrinterConnectionErrorScene: ; 19e99 (6:5e99) - push hl - ; unnecessary loading TxRam, since the text data - ; already incorporate the error number - ld l, a - ld h, $00 - call LoadTxRam3 - - call Func_198e7 - ld a, SCENE_GAMEBOY_PRINTER_NOT_CONNECTED - lb bc, 0, 0 - call LoadScene - pop hl - call DrawWideTextBox_WaitForInput - call RestoreVBlankFunction - scf - ret - -; main card printer function -Func_19eb4: ; 19eb4 (6:5eb4) - ld e, a - ld d, $0 - call LoadCardDataToBuffer1_FromCardID - call Func_198e7 - ld a, SCENE_GAMEBOY_PRINTER_TRANSMITTING - lb bc, 0, 0 - call LoadScene - ld a, 20 - call CopyCardNameAndLevel - ld [hl], TX_END - ld hl, $0 - call LoadTxRam2 - ldtx hl, NowPrintingText - call DrawWideTextBox_PrintText - call EnableLCD - call PrepareForPrinterCommunications - call DrawTopCardInfoInSRAMGfxBuffer0 - call Func_19f87 - call DrawCardPicInSRAMGfxBuffer2 - call Func_19f99 - jr c, .error - call DrawBottomCardInfoInSRAMGfxBuffer0 - call Func_1a011 - jr c, .error - call RestoreVBlankFunction - call ResetPrinterCommunicationSettings - or a - ret -.error - call RestoreVBlankFunction - call ResetPrinterCommunicationSettings - jp HandlePrinterError - -DrawCardPicInSRAMGfxBuffer2: ; 19f05 (6:5f05) - ld hl, wLoadedCard1Gfx - ld a, [hli] - ld h, [hl] - ld l, a - ld de, sGfxBuffer2 - call Func_37a5 - ; draw card's picture in sGfxBuffer2 - ld a, $40 - lb hl, 12, 1 - lb de, 2, 68 - lb bc, 16, 12 - call FillRectangle - ret - -; writes the tiles necessary to draw -; the card's information in sGfxBuffer0 -; this includes card's type, lv, HP and attacks if Pokemon card -; or otherwise just the card's name and type symbol -DrawTopCardInfoInSRAMGfxBuffer0: ; 19f20 (6:5f20) - call Func_1a025 - call Func_212f - - ; draw empty text box frame - ld hl, sGfxBuffer0 - ld a, $34 - lb de, $30, $31 - ld b, 20 - call CopyLine - ld c, 15 -.loop_lines - xor a ; SYM_SPACE - lb de, $36, $37 - ld b, 20 - call CopyLine - dec c - jr nz, .loop_lines - - ; draw card type symbol - ld a, $38 - lb hl, 1, 2 - lb de, 1, 65 - lb bc, 2, 2 - call FillRectangle - ; print card's name - lb de, 4, 65 - ld hl, wLoadedCard1Name - call InitTextPrinting_ProcessTextFromPointerToID - -; prints card's type, lv, HP and attacks if it's a Pokemon card - ld a, [wLoadedCard1Type] - cp TYPE_ENERGY - jr nc, .skip_pokemon_data - inc a ; symbol corresponding to card's type (color) - lb bc, 18, 65 - call WriteByteToBGMap0 - ld a, SYM_Lv - lb bc, 11, 66 - call WriteByteToBGMap0 - ld a, [wLoadedCard1Level] - lb bc, 12, 66 - bank1call WriteTwoDigitNumberInTxSymbolFormat - ld a, SYM_HP - lb bc, 15, 66 - call WriteByteToBGMap0 - ld a, [wLoadedCard1EffectCommands] - inc b - bank1call WriteTwoByteNumberInTxSymbolFormat -.skip_pokemon_data - ret - -Func_19f87: ; 19f87 (6:5f87) - call TryInitPrinterCommunications - ret c - ld hl, sGfxBuffer0 - call Func_1a0cc - ret c - call Func_1a0cc - call Func_1a111 - ret - -Func_19f99: ; 19f99 (6:5f99) - call TryInitPrinterCommunications - ret c - ld hl, sGfxBuffer0 + $8 tiles - ld c, $06 -.asm_19fa2 - call Func_1a0cc - ret c - dec c - jr nz, .asm_19fa2 - call Func_1a111 - ret - -; writes the tiles necessary to draw -; the card's information in sGfxBuffer0 -; this includes card's Retreat cost, Weakness, Resistance, -; and attack if it's Pokemon card -; or otherwise just the card's description. -DrawBottomCardInfoInSRAMGfxBuffer0: ; 19fad (6:5fad) - call Func_1a025 - xor a - ld [wCardPageType], a - ld hl, sGfxBuffer0 - ld b, 20 - ld c, 9 -.loop_lines - xor a ; SYM_SPACE - lb de, $36, $37 - call CopyLine - dec c - jr nz, .loop_lines - ld a, $35 - lb de, $32, $33 - call CopyLine - - ld a, [wLoadedCard1Type] - cp TYPE_ENERGY - jr nc, .not_pkmn_card - ld hl, RetreatWeakResistData - call PlaceTextItems - ld c, 66 - bank1call DisplayCardPage_PokemonOverview.attacks - ld a, SYM_No - lb bc, 15, 72 - call WriteByteToBGMap0 - inc b - ld a, [wLoadedCard1PokedexNumber] - bank1call WriteTwoByteNumberInTxSymbolFormat - ret - -.not_pkmn_card - bank1call SetNoLineSeparation - lb de, 1, 66 - ld a, SYM_No - call InitTextPrintingInTextbox - ld hl, wLoadedCard1NonPokemonDescription - call ProcessTextFromPointerToID - bank1call SetOneLineSeparation - ret - -RetreatWeakResistData: ; 1a004 (6:6004) - textitem 1, 70, RetreatText - textitem 1, 71, WeaknessText - textitem 1, 72, ResistanceText - db $ff - -Func_1a011: ; 1a011 (6:6011) - call TryInitPrinterCommunications - ret c - ld hl, sGfxBuffer0 - ld c, $05 -.asm_1a01a - call Func_1a0cc - ret c - dec c - jr nz, .asm_1a01a - call Func_1a108 - ret - -; calls setup text and sets wTilePatternSelector -Func_1a025: ; 1a025 (6:6025) - lb de, $40, $bf - call SetupText - ld a, $a4 - ld [wTilePatternSelector], a - xor a - ld [wTilePatternSelectorCorrection], a - ret - -; switches to CGB normal speed, resets serial -; enables SRAM and switches to SRAM1 -; and clears sGfxBuffer0 -PrepareForPrinterCommunications: ; 1a035 (6:6035) - call SwitchToCGBNormalSpeed - call ResetSerial - ld a, $10 - ld [wce9b], a - call EnableSRAM - ld a, [sPrinterContrastLevel] - ld [wPrinterContrastLevel], a - call DisableSRAM - ldh a, [hBankSRAM] - ld [wce8f], a - ld a, BANK("SRAM1") - call BankswitchSRAM - call EnableSRAM -; fallthrough - -ClearPrinterGfxBuffer: ; 1a035 (6:6035) - ld hl, sGfxBuffer0 - ld bc, $400 -.loop - xor a - ld [hli], a - dec bc - ld a, c - or b - jr nz, .loop - xor a - ld [wce9f], a - ret - -; reverts settings changed by PrepareForPrinterCommunications -ResetPrinterCommunicationSettings: ; 1a06b (6:606b) - push af - call SwitchToCGBDoubleSpeed - ld a, [wce8f] - call BankswitchSRAM - call DisableSRAM - lb de, $30, $bf - call SetupText - pop af - ret - -; unreferenced -; send some bytes through serial -Func_1a080: ; 1a080 (6:6080) - ld bc, $0 - lb de, PRINTERPKT_NUL, $0 - jp SendPrinterPacket - -; tries initiating the communications for -; sending data to printer -; returns carry if operation was cancelled -; by pressing B button or serial transfer took long -TryInitPrinterCommunications: ; 1a089 (6:6089) - xor a - ld [wPrinterInitAttempts], a -.wait_input - call DoFrame - ldh a, [hKeysHeld] - and B_BUTTON - jr nz, .b_button - ld bc, $0 - lb de, PRINTERPKT_NUL, $0 - call SendPrinterPacket - jr c, .delay - and (1 << PRINTER_STATUS_BUSY) | (1 << PRINTER_STATUS_PRINTING) - jr nz, .wait_input - -.init - ld bc, $0 - lb de, PRINTERPKT_INIT, $0 - call SendPrinterPacket - jr nc, .no_carry - ld hl, wPrinterInitAttempts - inc [hl] - ld a, [hl] - cp 3 - jr c, .wait_input - ; time out - scf - ret -.no_carry - ret - -.b_button - xor a - ld [wPrinterStatus], a - scf - ret - -.delay - ld c, 10 -.delay_loop - call DoFrame - dec c - jr nz, .delay_loop - jr .init - -; loads tiles given by map in hl to sGfxBuffer5 -; copies first 20 tiles, then offsets by 2 tiles -; and copies another 20 -Func_1a0cc: ; 1a0cc (6:60cc) - push bc - ld de, sGfxBuffer5 - call .Copy20Tiles - call .Copy20Tiles - push hl - call CompressDataForPrinterSerialTransfer - call SendPrinterPacket - pop hl - pop bc - ret - -; copies 20 tiles given by hl to de -; then adds 2 tiles to hl -.Copy20Tiles ; 1a0e0 (6:60e0) - push hl - ld c, 20 -.loop_tiles - ld a, [hli] - call .CopyTile - dec c - jr nz, .loop_tiles - pop hl - ld bc, 2 tiles - add hl, bc - ret - -; copies a tile to de -; a = tile to get from sGfxBuffer1 -.CopyTile ; 1a0f0 (6:60f0) - push hl - push bc - ld l, a - ld h, $00 - add hl, hl - add hl, hl - add hl, hl - add hl, hl ; *TILE_SIZE - ld bc, sGfxBuffer1 - add hl, bc - ld c, TILE_SIZE -.loop_copy - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop_copy - pop bc - pop hl - ret - -Func_1a108: ; 1a108 (6:6108) - call GetPrinterContrastSerialData - push hl - lb hl, $3, $1 - jr SendPrinterInstructionPacket - -Func_1a111: ; 1a111 (6:6111) - call GetPrinterContrastSerialData - push hl - ld hl, wce9b - ld a, [hl] - ld [hl], $00 - ld h, a - ld l, $01 -; fallthrough - -SendPrinterInstructionPacket: ; 1a11e (6:611e) - push hl - ld bc, $0 - lb de, PRINTERPKT_DATA, $0 - call SendPrinterPacket - jr c, .asm_1a135 - ld hl, sp+$00 ; contrast level bytes - ld bc, $4 ; instruction packets are 4 bytes in size - lb de, PRINTERPKT_PRINT_INSTRUCTION, $0 - call SendPrinterPacket -.asm_1a135 - pop hl - pop hl - ret - -; returns in h and l the bytes -; to be sent through serial to the printer -; for the set contrast level -GetPrinterContrastSerialData: ; 1a138 (6:6138) - ld a, [wPrinterContrastLevel] - ld e, a - ld d, $00 - ld hl, .contrast_level_data - add hl, de - ld h, [hl] - ld l, $e4 - ret - -.contrast_level_data - db $00, $20, $40, $60, $7f - -; unreferenced -Func_1a14b: ; 1a14b (6:614b) - ld a, $01 - jr .asm_1a15d - ld a, $02 - jr .asm_1a15d - ld a, $03 - jr .asm_1a15d - ld a, $04 - jr .asm_1a15d - ld a, $05 -.asm_1a15d - ld [wce9d], a - scf - ret - -; a = saved deck index to print -_PrintDeckConfiguration: ; 1a162 (6:6162) -; copies selected deck from SRAM to wDuelTempList - call EnableSRAM - ld l, a - ld h, DECK_STRUCT_SIZE - call HtimesL - ld de, sSavedDeck1 - add hl, de - ld de, wDuelTempList - ld bc, DECK_STRUCT_SIZE - call CopyDataHLtoDE - call DisableSRAM - - call ShowPrinterTransmitting - call PrepareForPrinterCommunications - call Func_1a025 - call Func_212f - lb de, 0, 64 - lb bc, 20, 4 - call DrawRegularTextBoxDMG - lb de, 4, 66 - call InitTextPrinting - ld hl, wDuelTempList ; print deck name - call ProcessText - ldtx hl, DeckPrinterText - call ProcessTextFromID - - ld a, 5 - ld [wPrinterHorizontalOffset], a - ld hl, wPrinterTotalCardCount - xor a - ld [hli], a - ld [hl], a - ld [wPrintOnlyStarRarity], a - - ld hl, wCurDeckCards -.loop_cards - ld a, [hl] - or a - jr z, .asm_1a1d6 - ld e, a - ld d, $00 - call LoadCardDataToBuffer1_FromCardID - - ; find out this card's count - ld a, [hli] - ld b, a - ld c, 1 -.loop_card_count - cp [hl] - jr nz, .got_card_count - inc hl - inc c - jr .loop_card_count - -.got_card_count - ld a, c - ld [wPrinterCardCount], a - call LoadCardInfoForPrinter - call AddToPrinterGfxBuffer - jr c, .printer_error - jr .loop_cards - -.asm_1a1d6 - call SendCardListToPrinter - jr c, .printer_error - call ResetPrinterCommunicationSettings - call RestoreVBlankFunction - or a - ret - -.printer_error - call ResetPrinterCommunicationSettings - call RestoreVBlankFunction - jp HandlePrinterError - -SendCardListToPrinter: ; 1a1ec (6:61ec) - ld a, [wPrinterHorizontalOffset] - cp 1 - jr z, .skip_load_gfx - call LoadGfxBufferForPrinter - ret c -.skip_load_gfx - call TryInitPrinterCommunications - ret c - call Func_1a108 - ret -; 0z1a1ff - -; increases printer horizontal offset by 2 -AddToPrinterGfxBuffer: ; 1a1ff (6:61ff) - push hl - ld hl, wPrinterHorizontalOffset - inc [hl] - inc [hl] - ld a, [hl] - pop hl - ; return no carry if below 18 - cp 18 - ccf - ret nc - ; >= 18 -; fallthrough - -; copies Gfx to Gfx buffer and sends some serial data -; returns carry set if unsuccessful -LoadGfxBufferForPrinter: ; 1a20b (6:620b) - push hl - call TryInitPrinterCommunications - jr c, .set_carry - ld a, [wPrinterHorizontalOffset] - srl a - ld c, a - ld hl, sGfxBuffer0 -.loop_gfx_buffer - call Func_1a0cc - jr c, .set_carry - dec c - jr nz, .loop_gfx_buffer - call Func_1a111 - jr c, .set_carry - - call ClearPrinterGfxBuffer - ld a, 1 - ld [wPrinterHorizontalOffset], a - pop hl - or a - ret - -.set_carry - pop hl - scf - ret - -; load symbol, name, level and card count to buffer -LoadCardInfoForPrinter: ; 1a235 (6:6235) - push hl - ld a, [wPrinterHorizontalOffset] - or %1000000 - ld e, a - ld d, 3 - ld a, [wPrintOnlyStarRarity] - or a - jr nz, .skip_card_symbol - ld hl, wPrinterTotalCardCount - ld a, [hli] - or [hl] - call z, DrawCardSymbol -.skip_card_symbol - ld a, 14 - call CopyCardNameAndLevel - call InitTextPrinting - ld hl, wDefaultText - call ProcessText - ld a, [wPrinterHorizontalOffset] - or %1000000 - ld c, a - ld b, 16 - ld a, SYM_CROSS - call WriteByteToBGMap0 - inc b - ld a, [wPrinterCardCount] - bank1call WriteTwoDigitNumberInTxSymbolFormat - pop hl - ret - -_PrintCardList: ; 1a270 (6:6270) -; if Select button is held when printing card list -; only print cards with Star rarity (excluding Promotional cards) -; even if it's not marked as seen in the collection - ld e, FALSE - ldh a, [hKeysHeld] - and SELECT - jr z, .no_select - inc e ; TRUE -.no_select - ld a, e - ld [wPrintOnlyStarRarity], a - - call ShowPrinterTransmitting - call CreateTempCardCollection - ld de, wDefaultText - call CopyPlayerName - call PrepareForPrinterCommunications - call Func_1a025 - call Func_212f - - lb de, 0, 64 - lb bc, 20, 4 - call DrawRegularTextBoxDMG - ld a, PLAYER_TURN - ldh [hWhoseTurn], a - lb de, 2, 66 - call InitTextPrinting - ld hl, wDefaultText - call ProcessText - ldtx hl, AllCardsOwnedText - call ProcessTextFromID - ld a, [wPrintOnlyStarRarity] - or a - jr z, .asm_1a2c2 - ld a, TX_HALF2FULL - call ProcessSpecialTextCharacter - lb de, 3, 84 - call Func_22ca -.asm_1a2c2 - ld a, $ff - ld [wCurPrinterCardType], a - xor a - ld hl, wPrinterTotalCardCount - ld [hli], a - ld [hl], a - ld [wPrinterNumCardTypes], a - ld a, 5 - ld [wPrinterHorizontalOffset], a - - ld e, GRASS_ENERGY -.loop_cards - push de - ld d, $00 - call LoadCardDataToBuffer1_FromCardID - jr c, .done_card_loop - ld d, HIGH(wTempCardCollection) - ld a, [de] ; card ID count in collection - ld [wPrinterCardCount], a - call .LoadCardTypeEntry - jr c, .printer_error_pop_de - - ld a, [wPrintOnlyStarRarity] - or a - jr z, .all_owned_cards_mode - ld a, [wLoadedCard1Set] - and %11110000 - cp PROMOTIONAL - jr z, .next_card - ld a, [wLoadedCard1Rarity] - cp STAR - jr nz, .next_card - ; not Promotional, and Star rarity - ld hl, wPrinterCardCount - res CARD_NOT_OWNED_F, [hl] - jr .got_card_count - -.all_owned_cards_mode - ld a, [wPrinterCardCount] - or a - jr z, .next_card - cp CARD_NOT_OWNED - jr z, .next_card ; ignore not owned cards - -.got_card_count - ld a, [wPrinterCardCount] - and CARD_COUNT_MASK - ld c, a - - ; add to total card count - ld hl, wPrinterTotalCardCount - add [hl] - ld [hli], a - ld a, 0 - adc [hl] - ld [hl], a - - ; add to current card type count - ld hl, wPrinterCurCardTypeCount - ld a, c - add [hl] - ld [hli], a - ld a, 0 - adc [hl] - ld [hl], a - - ld hl, wPrinterNumCardTypes - inc [hl] - ld hl, wce98 - inc [hl] - call LoadCardInfoForPrinter - call AddToPrinterGfxBuffer - jr c, .printer_error_pop_de -.next_card - pop de - inc e - jr .loop_cards - -.printer_error_pop_de - pop de -.printer_error - call ResetPrinterCommunicationSettings - call RestoreVBlankFunction - jp HandlePrinterError - -.done_card_loop - pop de - ; add separator line - ld a, [wPrinterHorizontalOffset] - dec a - or $40 - ld c, a - ld b, 0 - call BCCoordToBGMap0Address - ld a, $35 - lb de, $35, $35 - ld b, 20 - call CopyLine - call AddToPrinterGfxBuffer - jr c, .printer_error - - ld hl, wPrinterTotalCardCount - ld c, [hl] - inc hl - ld b, [hl] - ldtx hl, TotalNumberOfCardsText - call .PrintTextWithNumber - jr c, .printer_error - ld a, [wPrintOnlyStarRarity] - or a - jr nz, .done - ld a, [wPrinterNumCardTypes] - ld c, a - ld b, 0 - ldtx hl, TypesOfCardsText - call .PrintTextWithNumber - jr c, .printer_error - -.done - call SendCardListToPrinter - jr c, .printer_error - call ResetPrinterCommunicationSettings - call RestoreVBlankFunction - or a - ret - -; prints text ID given in hl -; with decimal representation of -; the number given in bc -; hl = text ID -; bc = number -.PrintTextWithNumber - push bc - ld a, [wPrinterHorizontalOffset] - dec a - or $40 - ld e, a - ld d, 2 - call InitTextPrinting - call ProcessTextFromID - ld d, 14 - call InitTextPrinting - pop hl - call TwoByteNumberToTxSymbol_TrimLeadingZeros - ld hl, wStringBuffer - call ProcessText - call AddToPrinterGfxBuffer - ret - -; loads this card's type icon and text -; if it's a new card type that hasn't been printed yet -.LoadCardTypeEntry - ld a, [wLoadedCard1Type] - ld c, a - cp TYPE_ENERGY - jr c, .got_type ; jump if Pokemon card - ld c, $08 - cp TYPE_TRAINER - jr nc, .got_type ; jump if Trainer card - ld c, $07 -.got_type - ld hl, wCurPrinterCardType - ld a, [hl] - cp c - ret z ; already handled this card type - - ; show corresponding icon and text - ; for this new card type - ld a, c - ld [hl], a ; set it as current card type - add a - add c ; *3 - ld c, a - ld b, $00 - ld hl, .IconTextList - add hl, bc - ld a, [wPrinterHorizontalOffset] - dec a - or %1000000 - ld e, a - ld d, 1 - ld a, [hli] - push hl - lb bc, 2, 2 - lb hl, 1, 2 - call FillRectangle - pop hl - ld d, 3 - inc e - call InitTextPrinting - ld a, [hli] - ld h, [hl] - ld l, a - call ProcessTextFromID - - call AddToPrinterGfxBuffer - ld hl, wPrinterCurCardTypeCount - xor a - ld [hli], a - ld [hl], a - ld [wce98], a - ret - -.IconTextList - ; Fire - db $e0 ; icon tile - tx FirePokemonText - - ; Grass - db $e4 ; icon tile - tx GrassPokemonText - - ; Lightning - db $e8 ; icon tile - tx LightningPokemonText - - ; Water - db $ec ; icon tile - tx WaterPokemonText - - ; Fighting - db $f0 ; icon tile - tx FightingPokemonText - - ; Psychic - db $f4 ; icon tile - tx PsychicPokemonText - - ; Colorless - db $f8 ; icon tile - tx ColorlessPokemonText - - ; Energy - db $fc ; icon tile - tx EnergyCardText - - ; Trainer - db $dc ; icon tile - tx TrainerCardText - -ShowPrinterTransmitting: ; 1a420 (6:6420) - call Func_198e7 - ld a, SCENE_GAMEBOY_PRINTER_TRANSMITTING - lb bc, 0, 0 - call LoadScene - ldtx hl, NowPrintingPleaseWaitText - call DrawWideTextBox_PrintText - call EnableLCD - ret - -; compresses $28 tiles in sGfxBuffer5 -; and writes it in sGfxBuffer5 + $28 tiles. -; compressed data has 2 commands to instruct on how to decompress it. -; - a command byte with bit 7 not set, means to copy that many + 1 -; bytes that are following it literally. -; - a command byte with bit 7 set, means to copy the following byte -; that many times + 2 (after masking the top bit of command byte). -; returns in bc the size of the compressed data and -; in de the packet type data. -CompressDataForPrinterSerialTransfer: ; 1a435 (6:6435) - ld hl, sGfxBuffer5 - ld de, sGfxBuffer5 + $28 tiles - ld bc, $28 tiles -.loop_remaining_data - ld a, $ff - inc b - dec b - jr nz, .check_compression - ld a, c -.check_compression - push bc - push de - ld c, a - call CheckDataCompression - ld a, e - ld c, e - pop de - jr c, .copy_byte - ld a, c - ld b, c - dec a - ld [de], a ; number of bytes to copy literally - 1 - inc de -.copy_literal_sequence - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .copy_literal_sequence - ld c, b - jr .sub_added_bytes - -.copy_byte - ld a, c - dec a - dec a - or %10000000 ; set high bit - ld [de], a ; = (n times to copy - 2) | %10000000 - inc de - ld a, [hl] ; byte to copy n times - ld [de], a - inc de - ld b, $0 - add hl, bc - -.sub_added_bytes - ld a, c - cpl - inc a - pop bc - add c - ld c, a - ld a, $ff - adc b - ld b, a - or c - jr nz, .loop_remaining_data - - ld hl, $10000 - (sGfxBuffer5 + $28 tiles) - add hl, de ; gets the size of the compressed data - ld c, l - ld b, h - ld hl, sGfxBuffer5 + $28 tiles - lb de, PRINTERPKT_DATA, $1 - ret - -; checks whether the next byte sequence in hl, up to c bytes, can be compressed -; returns carry if the next sequence of bytes can be compressed, -; i.e. has at least 3 consecutive bytes with the same value. -; in that case, returns in e the number of consecutive -; same value bytes that were found. -; if there are no bytes with same value, then count as many bytes left -; as possible until either there are no more remaining data bytes, -; or until a sequence of 3 bytes with the same value are found. -; in that case, the number of bytes in this sequence is returned in e. -CheckDataCompression: ; 1a485 (6:6485) - push hl - ld e, c - ld a, c -; if number of remaining bytes is less than 4 -; then no point in compressing - cp 4 - jr c, .no_carry - -; check first if there are at least -; 3 consecutive bytes with the same value - ld b, c - ld a, [hli] - cp [hl] - inc hl - jr nz, .literal_copy ; not same - cp [hl] - inc hl - jr nz, .literal_copy ; not same - -; 3 consecutive bytes were found with same value -; keep track of how many consecutive bytes -; with the same value there are in e - dec c - dec c - dec c - ld e, 3 -.loop_same_value - cp [hl] - jr nz, .set_carry ; exit when a different byte is found - inc hl - inc e - dec c - jr z, .set_carry ; exit when there is no more remaining data - bit 5, e - ; exit if number of consecutive bytes >= $20 - jr z, .loop_same_value -.set_carry - pop hl - scf - ret - -.literal_copy -; consecutive bytes are not the same value -; count the number of bytes there are left -; until a sequence of 3 bytes with the same value is found - pop hl - push hl - ld c, b ; number of remaining bytes - ld e, 1 - ld a, [hli] - dec c - jr z, .no_carry ; exit if no more data -.reset_same_value_count - ld d, 2 ; number of consecutive same value bytes to exit -.next_byte - inc e - dec c - jr z, .no_carry - bit 7, e - jr nz, .no_carry ; exit if >= $80 - cp [hl] - jr z, .same_consecutive_value - ld a, [hli] - jr .reset_same_value_count -.no_carry - pop hl - or a - ret - -.same_consecutive_value - inc hl - dec d - jr nz, .next_byte - ; 3 consecutive bytes with same value found - ; discard the last 3 bytes in the sequence - dec e - dec e - dec e - jr .no_carry - -; sets up to start a link duel -; decides which device will pick the number of prizes -; then exchanges names and duels between the players -; and starts the main duel routine -_SetUpAndStartLinkDuel: ; 1a4cf (6:64cf) - ld hl, sp+$00 - ld a, l - ld [wDuelReturnAddress + 0], a - ld a, h - ld [wDuelReturnAddress + 1], a - call Func_198e7 - - ld a, SCENE_GAMEBOY_LINK_TRANSMITTING - lb bc, 0, 0 - call LoadScene - - bank1call LoadPlayerDeck - call SwitchToCGBNormalSpeed - bank1call DecideLinkDuelVariables - push af - call RestoreVBlankFunction - pop af - jp c, .error - - ld a, DUELIST_TYPE_PLAYER - ld [wPlayerDuelistType], a - ld a, DUELIST_TYPE_LINK_OPP - ld [wOpponentDuelistType], a - ld a, DUELTYPE_LINK - ld [wDuelType], a - - call EmptyScreen - ld a, [wSerialOp] - cp $29 - jr nz, .asm_1a540 - - ld a, PLAYER_TURN - ldh [hWhoseTurn], a - call .ExchangeNamesAndDecks - jr c, .error - lb de, 6, 2 - lb bc, 8, 6 - call DrawRegularTextBox - lb de, 7, 4 - call InitTextPrinting - ldtx hl, PrizesCardsText - call ProcessTextFromID - ldtx hl, ChooseTheNumberOfPrizesText - call DrawWideTextBox_PrintText - call EnableLCD - call .PickNumberOfPrizeCards - ld a, [wNPCDuelPrizes] - call SerialSend8Bytes - jr .prizes_decided - -.asm_1a540 - ld a, OPPONENT_TURN - ldh [hWhoseTurn], a - call .ExchangeNamesAndDecks - jr c, .error - ldtx hl, PleaseWaitDecidingNumberOfPrizesText - call DrawWideTextBox_PrintText - call EnableLCD - call SerialRecv8Bytes - ld [wNPCDuelPrizes], a - -.prizes_decided - call ExchangeRNG - ld a, LINK_OPP_PIC - ld [wOpponentPortrait], a - ldh a, [hWhoseTurn] - push af - call EmptyScreen - bank1call SetDefaultPalettes - ld a, SHUFFLE_DECK - ld [wDuelDisplayedScreen], a - bank1call DrawDuelistPortraitsAndNames - ld a, OPPONENT_TURN - ldh [hWhoseTurn], a - ld a, [wNPCDuelPrizes] - ld l, a - ld h, $00 - call LoadTxRam3 - ldtx hl, BeginAPrizeDuelWithText - call DrawWideTextBox_WaitForInput - pop af - ldh [hWhoseTurn], a - call ExchangeRNG - bank1call StartDuel_VSLinkOpp - call SwitchToCGBDoubleSpeed - ret - -.error - ld a, -1 - ld [wDuelResult], a - call Func_198e7 - - ld a, SCENE_GAMEBOY_LINK_NOT_CONNECTED - lb bc, 0, 0 - call LoadScene - - ldtx hl, TransmissionErrorText - call DrawWideTextBox_WaitForInput - call RestoreVBlankFunction - call ResetSerial - ret - -.ExchangeNamesAndDecks - ld de, wDefaultText - push de - call CopyPlayerName - pop hl - ld de, wNameBuffer - ld c, NAME_BUFFER_LENGTH - call SerialExchangeBytes - ret c - xor a - ld hl, wOpponentName - ld [hli], a - ld [hl], a - ld hl, wPlayerDeck - ld de, wOpponentDeck - ld c, DECK_SIZE - call SerialExchangeBytes - ret - -; handles player choice of number of prize cards -; pressing left/right makes it decrease/increase respectively -; selection is confirmed by pressing A button -.PickNumberOfPrizeCards - ld a, PRIZES_4 - ld [wNPCDuelPrizes], a - xor a - ld [wPrizeCardSelectionFrameCounter], a -.loop_input - call DoFrame - ld a, [wNPCDuelPrizes] - add SYM_0 - ld e, a - ; check frame counter so that it - ; either blinks or shows number - ld hl, wPrizeCardSelectionFrameCounter - ld a, [hl] - inc [hl] - and $10 - jr z, .no_blink - ld e, SYM_SPACE -.no_blink - ld a, e - lb bc, 9, 6 - call WriteByteToBGMap0 - - ldh a, [hDPadHeld] - ld b, a - ld a, [wNPCDuelPrizes] - bit D_LEFT_F, b - jr z, .check_d_right - dec a - cp PRIZES_2 - jr nc, .got_prize_count - ld a, PRIZES_6 ; wrap around to 6 - jr .got_prize_count - -.check_d_right - bit D_RIGHT_F, b - jr z, .check_a_btn - inc a - cp PRIZES_6 + 1 - jr c, .got_prize_count - ld a, PRIZES_2 -.got_prize_count - ld [wNPCDuelPrizes], a - xor a - ld [wPrizeCardSelectionFrameCounter], a - -.check_a_btn - bit A_BUTTON_F, b - jr z, .loop_input - ret - -Func_1a61f: ; 1a61f (6:661f) - push af - lb de, $38, $9f - call SetupText - pop af - or a - jr nz, .else - ld a, MOLTRES2 - call .legendary_card_text - ld a, ARTICUNO2 - call .legendary_card_text - ld a, ZAPDOS3 - call .legendary_card_text - ld a, DRAGONITE1 -.legendary_card_text - ldtx hl, ReceivedLegendaryCardText - jr .print_text -.else - ldtx hl, ReceivedCardText - cp VILEPLUME - jr z, .print_text - cp BLASTOISE - jr z, .print_text - ldtx hl, ReceivedPromotionalFlyingPikachuText - cp FLYING_PIKACHU - jr z, .print_text - ldtx hl, ReceivedPromotionalSurfingPikachuText - cp SURFING_PIKACHU1 - jr z, .print_text - cp SURFING_PIKACHU2 - jr z, .print_text - ldtx hl, ReceivedPromotionalCardText -.print_text - push hl - ld e, a - ld d, $0 - call LoadCardDataToBuffer1_FromCardID - call PauseSong - ld a, MUSIC_MEDAL - call PlaySong - ld hl, wLoadedCard1Name - ld a, [hli] - ld h, [hl] - ld l, a - bank1call LoadTxRam2 ; switch to bank 1, but call a home func - ld a, PLAYER_TURN - ldh [hWhoseTurn], a - pop hl - bank1call _DisplayCardDetailScreen -.loop - call AssertSongFinished - or a - jr nz, .loop - - call ResumeSong - bank1call OpenCardPage_FromHand - ret - -_OpenBoosterPack: ; 1a68d (6:668d) - ld a, PLAYER_TURN - ldh [hWhoseTurn], a - ld h, a - ld l, $00 -.asm_6694 - xor a - ld [hli], a - ld a, l - cp $3c - jr c, .asm_6694 - xor a - ld hl, wBoosterCardsDrawn - ld de, wDuelTempList - ld c, $00 -.asm_66a4 - ld a, [hli] - or a - jr z, .asm_66ae - ld a, c - ld [de], a - inc de - inc c - jr .asm_66a4 -.asm_66ae - ld a, $ff - ld [de], a - lb de, $38, $9f - call SetupText - bank1call InitAndDrawCardListScreenLayout - ldtx hl, ChooseTheCardYouWishToExamineText - ldtx de, BoosterPackText - bank1call SetCardListHeaderText - ld a, A_BUTTON | START - ld [wNoItemSelectionMenuKeys], a - bank1call DisplayCardList - ret - -CommentedOut_1a6cc: ; 1a6cc (6:66cc) - ret - -Func_1a6cd: ; 1a6cd (6:66cd) - ldh a, [hBankSRAM] - or a - ret nz - push hl - push de - push bc - ld hl, sCardCollection - ld bc, $0250 - ld a, [s0a000 + $b] - ld e, a -.asm_66de - ld a, [hli] - xor e - ld e, a - dec bc - ld a, c - or b - jr nz, .asm_66de - ld a, e - pop bc - pop de - pop hl - or a - ret z - xor a - ld [wTileMapFill], a - ld hl, wDoFrameFunction - ld [hli], a - ld [hl], a - ldh [hSCX], a - ldh [hSCY], a - bank1call ZeroObjectPositionsAndToggleOAMCopy - call EmptyScreen - call LoadSymbolsFont - bank1call SetDefaultPalettes - ld a, [wConsole] - cp $01 - jr nz, .asm_6719 - ld a, $e4 - ld [wOBP0], a - ld [wBGP], a - ld a, $01 - ld [wFlushPaletteFlags], a -.asm_6719 - lb de, $38, $9f - call SetupText - ld hl, $00a3 - bank1call DrawWholeScreenTextBox - ld a, $0a - ld [MBC3SRamEnable], a - xor a - ldh [hBankSRAM], a - ld [MBC3SRamBank], a - ld [MBC3RTC], a - ld [MBC3SRamEnable], a - jp Reset - ret - -Func_1a73a: ; 1a73a (6:673a) - ldh a, [hBankSRAM] - or a - ret nz - push hl - push de - push bc - ld hl, sCardCollection - ld bc, $0250 - ld e, $00 -.asm_6749 - ld a, [hli] - xor e - ld e, a - dec bc - ld a, c - or b - jr nz, .asm_6749 - ld a, $0a - ld [MBC3SRamEnable], a - ld a, e - ld [s0a00b], a - pop bc - pop de - pop hl - ret - -WhatIsYourNameData: ; 1a75e (6:675e) - textitem 1, 1, WhatIsYourNameText - db $ff -; [Deck1Data ~ Deck4Data] -; These are directed from around (2:4f05), -; without any bank description. -; That is, the developers hard-coded it. -_-;; -Deck1Data: ; 1a763 (6:6763) - textitem 2, 1, Deck1Text - textitem 14, 1, DeckText - db $ff -Deck2Data: ; 1a76c (6:676c) - textitem 2, 1, Deck2Text - textitem 14, 1, DeckText - db $ff -Deck3Data: ; 1a775 (6:6775) - textitem 2, 1, Deck3Text - textitem 14, 1, DeckText - db $ff -Deck4Data: ; 1a77e (6:677e) - textitem 2, 1, Deck4Text - textitem 14, 1, DeckText - db $ff - -; set each byte zero from hl for b bytes. -ClearMemory: ; 1a787 (6:6787) - push af - push bc - push hl - ld b, a - xor a -.loop - ld [hli], a - dec b - jr nz, .loop - pop hl - pop bc - pop af - ret - -; play different sfx by a. -; if a is 0xff play SFX_03 (usually following a B press), -; else play SFX_02 (usually following an A press). -PlayAcceptOrDeclineSFX: ; 1a794 (6:6794) - push af - inc a - jr z, .sfx_decline - ld a, SFX_02 - jr .sfx_accept -.sfx_decline - ld a, SFX_03 -.sfx_accept - call PlaySFX - pop af - ret - -; get player name from the user -; into hl -InputPlayerName: ; 1a7a3 (6:67a3) - ld e, l - ld d, h - ld a, MAX_PLAYER_NAME_LENGTH - ld hl, WhatIsYourNameData - lb bc, 12, 1 - call InitializeInputName - call Set_OBJ_8x8 - xor a - ld [wTileMapFill], a - call EmptyScreen - call ZeroObjectPositions - ld a, $01 - ld [wVBlankOAMCopyToggle], a - call LoadSymbolsFont - lb de, $38, $bf - call SetupText - call LoadTextCursorTile - ld a, $02 - ld [wd009], a - call DrawNamingScreenBG - xor a - ld [wNamingScreenCursorX], a - ld [wNamingScreenCursorY], a - ld a, $09 - ld [wNamingScreenNumColumns], a - ld a, $06 - ld [wNamingScreenKeyboardHeight], a - ld a, $0f - ld [wVisibleCursorTile], a - ld a, $00 - ld [wInvisibleCursorTile], a -.loop - ld a, $01 - ld [wVBlankOAMCopyToggle], a - call DoFrame - call UpdateRNGSources - ldh a, [hDPadHeld] - and START - jr z, .else - ; if pressed start button. - ld a, $01 - call PlayAcceptOrDeclineSFX - call Func_1aa07 - ld a, 6 - ld [wNamingScreenCursorX], a - ld a, 5 - ld [wNamingScreenCursorY], a - call Func_1aa23 - jr .loop -.else - call NamingScreen_CheckButtonState - jr nc, .loop ; if not pressed, go back to the loop. - cp $ff - jr z, .on_b_button - ; on A button. - call NamingScreen_ProcessInput - jr nc, .loop - ; if the player selected the end button, - ; end its naming. - call FinalizeInputName - ret -.on_b_button - ld a, [wNamingScreenBufferLength] - or a - jr z, .loop ; empty string? - ; erase one character. - ld e, a - ld d, 0 - ld hl, wNamingScreenBuffer - add hl, de - dec hl - dec hl - ld [hl], TX_END - ld hl, wNamingScreenBufferLength ; note that its unit is byte, not word. - dec [hl] - dec [hl] - call PrintPlayerNameFromInput - jr .loop - -; it's called when naming(either player's or deck's) starts. -; a: maximum length of name(depending on whether player's or deck's). -; bc: position of name. -; de: dest. pointer. -; hl: pointer to text item of the question. -InitializeInputName: ; 1a846 (6:6846) - ld [wNamingScreenBufferMaxLength], a - push hl - ld hl, wNamingScreenNamePosition - ld [hl], b - inc hl - ld [hl], c - pop hl - ld b, h - ld c, l - ; set the question string. - ld hl, wNamingScreenQuestionPointer - ld [hl], c - inc hl - ld [hl], b - ; set the destination buffer. - ld hl, wNamingScreenDestPointer - ld [hl], e - inc hl - ld [hl], d - ; clear the name buffer. - ld a, NAMING_SCREEN_BUFFER_LENGTH - ld hl, wNamingScreenBuffer - call ClearMemory - ld hl, wNamingScreenBuffer - ld a, [wNamingScreenBufferMaxLength] - ld b, a - inc b -.loop - ; copy data from de to hl - ; for b bytes. - ld a, [de] - inc de - ld [hli], a - dec b - jr nz, .loop - ld hl, wNamingScreenBuffer - call GetTextLengthInTiles - ld a, c - ld [wNamingScreenBufferLength], a - ret - -FinalizeInputName: ; 1a880 (6:6880) - ld hl, wNamingScreenDestPointer - ld e, [hl] - inc hl - ld d, [hl] - ld l, e - ld h, d - ld de, wNamingScreenBuffer - ld a, [wNamingScreenBufferMaxLength] - ld b, a - inc b - jr InitializeInputName.loop - -; draws the keyboard frame -; and the question if it exists. -DrawNamingScreenBG: ; 1a892 (6:6892) - call DrawTextboxForKeyboard - call PrintPlayerNameFromInput - ld hl, wNamingScreenQuestionPointer - ld c, [hl] - inc hl - ld a, [hl] - ld h, a - or c - jr z, .put_text_end - ; print the question string. - ; ex) "What is your name?" - ld l, c - call PlaceTextItems -.put_text_end - ; print "End". - ld hl, .data - call PlaceTextItems - ldtx hl, PlayerNameKeyboardText - lb de, 2, 4 - call InitTextPrinting - call ProcessTextFromID - call EnableLCD - ret -.data - textitem $0f, $10, EndText ; "End" - db $ff - -DrawTextboxForKeyboard: ; 1a8c1 (6:68c1) - lb de, 0, 3 ; x, y - lb bc, 20, 15 ; w, h - call DrawRegularTextBox - ret - -PrintPlayerNameFromInput: ; 1a8cb (6:68cb) - ld hl, wNamingScreenNamePosition - ld d, [hl] - inc hl - ld e, [hl] - push de - call InitTextPrinting - ld a, [wNamingScreenBufferMaxLength] - ld e, a - ld a, $14 - sub e - inc a - ld e, a - ld d, 0 - ; print the underbars - ; before print the input. - ld hl, .char_underbar - add hl, de - call ProcessText - pop de - call InitTextPrinting - ; print the input from the user. - ld hl, wNamingScreenBuffer - call ProcessText - ret -.char_underbar - db $56 -rept 10 - textfw3 "_" -endr - done - -; check if button pressed. -; if pressed, set the carry bit on. -NamingScreen_CheckButtonState: ; 1a908 (6:6908) - xor a - ld [wPlaysSfx], a - ldh a, [hDPadHeld] - or a - jp z, .no_press - ; detected any button press. - ld b, a - ld a, [wNamingScreenKeyboardHeight] - ld c, a - ld a, [wNamingScreenCursorX] - ld h, a - ld a, [wNamingScreenCursorY] - ld l, a - bit D_UP_F, b - jr z, .asm_692c - ; up - dec a - bit D_DOWN_F, a - jr z, .asm_69a7 - ld a, c - dec a - jr .asm_69a7 -.asm_692c - bit D_DOWN_F, b - jr z, .asm_6937 - ; down - inc a - cp c - jr c, .asm_69a7 - xor a - jr .asm_69a7 -.asm_6937 - ld a, [wNamingScreenNumColumns] - ld c, a - ld a, h - bit D_LEFT_F, b - jr z, .asm_6974 - ; left - ld d, a - ld a, $06 - cp l - ld a, d - jr nz, .asm_696b - push hl - push bc - push af - call GetCharInfoFromPos_Player - inc hl - inc hl - inc hl - inc hl - inc hl - ld a, [hl] - dec a - ld d, a - pop af - pop bc - pop hl - sub d - cp $ff - jr nz, .asm_6962 - ld a, c - sub $02 - jr .asm_69aa -.asm_6962 - cp $fe - jr nz, .asm_696b - ld a, c - sub $03 - jr .asm_69aa -.asm_696b - dec a - bit D_DOWN_F, a - jr z, .asm_69aa - ld a, c - dec a - jr .asm_69aa -.asm_6974 - bit D_RIGHT_F, b - jr z, .no_press - ld d, a - ld a, $06 - cp l - ld a, d - jr nz, .asm_6990 - push hl - push bc - push af - call GetCharInfoFromPos_Player - inc hl - inc hl - inc hl - inc hl - ld a, [hl] - dec a - ld d, a - pop af - pop bc - pop hl - add d -.asm_6990 - inc a - cp c - jr c, .asm_69aa - inc c - cp c - jr c, .asm_69a4 - inc c - cp c - jr c, .asm_69a0 - ld a, $02 - jr .asm_69aa -.asm_69a0 - ld a, $01 - jr .asm_69aa -.asm_69a4 - xor a - jr .asm_69aa -.asm_69a7 - ld l, a - jr .asm_69ab -.asm_69aa - ld h, a -.asm_69ab - push hl - call GetCharInfoFromPos_Player - inc hl - inc hl - inc hl - ld a, [wd009] - cp $02 - jr nz, .asm_69bb - inc hl - inc hl -.asm_69bb - ld d, [hl] - push de - call Func_1aa07 - pop de - pop hl - ld a, l - ld [wNamingScreenCursorY], a - ld a, h - ld [wNamingScreenCursorX], a - xor a - ld [wCheckMenuCursorBlinkCounter], a - ld a, $06 - cp d - jp z, NamingScreen_CheckButtonState - ld a, $01 - ld [wPlaysSfx], a -.no_press - ldh a, [hKeysPressed] - and A_BUTTON | B_BUTTON - jr z, .asm_69ef - and A_BUTTON - jr nz, .asm_69e5 - ld a, $ff -.asm_69e5 - call PlayAcceptOrDeclineSFX - push af - call Func_1aa23 - pop af - scf - ret -.asm_69ef - ld a, [wPlaysSfx] - or a - jr z, .asm_69f8 - call PlaySFX -.asm_69f8 - ld hl, wCheckMenuCursorBlinkCounter - ld a, [hl] - inc [hl] - and $0f - ret nz - ld a, [wVisibleCursorTile] - bit 4, [hl] - jr z, Func_1aa07.asm_6a0a - -Func_1aa07: ; 1aa07 (6:6a07) - ld a, [wInvisibleCursorTile] -.asm_6a0a - ld e, a - ld a, [wNamingScreenCursorX] - ld h, a - ld a, [wNamingScreenCursorY] - ld l, a - call GetCharInfoFromPos_Player - ld a, [hli] - ld c, a - ld b, [hl] - dec b - ld a, e - call Func_1aa28 - call WriteByteToBGMap0 - or a - ret - -Func_1aa23: ; 1aa23 (6:6a23) - ld a, [wVisibleCursorTile] - jr Func_1aa07.asm_6a0a - -Func_1aa28: ; 1aa28 (6:6a28) - push af - push bc - push de - push hl - push af - call ZeroObjectPositions - pop af - ld b, a - ld a, [wInvisibleCursorTile] - cp b - jr z, .asm_6a60 - ld a, [wNamingScreenBufferLength] - srl a - ld d, a - ld a, [wNamingScreenBufferMaxLength] - srl a - ld e, a - ld a, d - cp e - jr nz, .asm_6a49 - dec a -.asm_6a49 - ld hl, wNamingScreenNamePosition - add [hl] - ld d, a - ld h, $08 - ld l, d - call HtimesL - ld a, l - add $08 - ld d, a - ld e, $18 - ld bc, $0000 - call SetOneObjectAttributes -.asm_6a60 - pop hl - pop de - pop bc - pop af - ret - -; load, to the first tile of v0Tiles0, the graphics for the -; blinking black square used in name input screens. -; for inputting full width text. -LoadTextCursorTile: ; 1aa65 (6:6a65) - ld hl, v0Tiles0 + $00 tiles - ld de, .data - ld b, 0 -.loop - ld a, TILE_SIZE - cp b - ret z - inc b - ld a, [de] - inc de - ld [hli], a - jr .loop - -.data -rept TILE_SIZE - db $ff -endr - -; set the carry bit on, -; if "End" was selected. -NamingScreen_ProcessInput: ; 1aa87 (6:6a87) - ld a, [wNamingScreenCursorX] - ld h, a - ld a, [wNamingScreenCursorY] - ld l, a - call GetCharInfoFromPos_Player - inc hl - inc hl - ; load types into de. - ld e, [hl] - inc hl - ld a, [hli] - ld d, a - cp $09 - jp z, .on_end - cp $07 - jr nz, .asm_6ab8 - ld a, [wd009] - or a - jr nz, .asm_6aac - ld a, $01 - jp .asm_6ace -.asm_6aac - dec a - jr nz, .asm_6ab4 - ld a, $02 - jp .asm_6ace -.asm_6ab4 - xor a - jp .asm_6ace -.asm_6ab8 - cp $08 - jr nz, .asm_6ad6 - ld a, [wd009] - or a - jr nz, .asm_6ac6 - ld a, $02 - jr .asm_6ace -.asm_6ac6 - dec a - jr nz, .asm_6acc - xor a - jr .asm_6ace -.asm_6acc - ld a, $01 -.asm_6ace - ld [wd009], a - call DrawNamingScreenBG - or a - ret -.asm_6ad6 - ld a, [wd009] - cp $02 - jr z, .read_char - ldfw3 bc, "“" - ld a, d - cp b - jr nz, .asm_6af4 - ld a, e - cp c - jr nz, .asm_6af4 - push hl - ld hl, TransitionTable1 ; from 55th. - call TransformCharacter - pop hl - jr c, .nothing - jr .asm_6b09 -.asm_6af4 - ldfw3 bc, "º(2)" - ld a, d - cp b - jr nz, .asm_6b1d - ld a, e - cp c - jr nz, .asm_6b1d - push hl - ld hl, TransitionTable2 ; from 72th. - call TransformCharacter - pop hl - jr c, .nothing -.asm_6b09 - ld a, [wNamingScreenBufferLength] - dec a - dec a - ld [wNamingScreenBufferLength], a - ld hl, wNamingScreenBuffer - push de - ld d, 0 - ld e, a - add hl, de - pop de - ld a, [hl] - jr .asm_6b37 -.asm_6b1d - ld a, d - or a - jr nz, .asm_6b37 - ld a, [wd009] - or a - jr nz, .asm_6b2b - ld a, TX_HIRAGANA - jr .asm_6b37 -.asm_6b2b - ld a, TX_KATAKANA - jr .asm_6b37 -; read character code from info. to register. -; hl: pointer. -.read_char - ld e, [hl] - inc hl - ld a, [hl] ; a: first byte of the code. - or a - ; if 2 bytes code, jump. - jr nz, .asm_6b37 - ; if 1 byte code(ascii), - ; set first byte to $0e. - ld a, $0e -; on 2 bytes code. -.asm_6b37 - ld d, a ; de: character code. - ld hl, wNamingScreenBufferLength - ld a, [hl] - ld c, a - push hl - ld hl, wNamingScreenBufferMaxLength - cp [hl] - pop hl - jr nz, .asm_6b4c - ; if the buffer is full - ; just change the last character of it. - ld hl, wNamingScreenBuffer - dec hl - dec hl - jr .asm_6b51 -; increase name length before add the character. -.asm_6b4c - inc [hl] - inc [hl] - ld hl, wNamingScreenBuffer -; write 2 bytes character codes to the name buffer. -; de: 2 bytes character codes. -; hl: dest. -.asm_6b51 - ld b, 0 - add hl, bc - ld [hl], d - inc hl - ld [hl], e - inc hl - ld [hl], TX_END ; null terminator. - call PrintPlayerNameFromInput -.nothing - or a - ret -.on_end - scf - ret - -; this transforms the last japanese character -; in the name buffer into its dakuon shape or something. -; it seems to have been deprecated as the game was translated into english. -; but it can still be applied to english, such as upper-lower case transition. -; hl: info. pointer. -TransformCharacter: ; 1ab61 (6:6b61) - ld a, [wNamingScreenBufferLength] - or a - jr z, .return ; if the length is zero, just return. - dec a - dec a - push hl - ld hl, wNamingScreenBuffer - ld d, 0 - ld e, a - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ; de: last character in the buffer, - ; but byte-wise swapped. - ld a, TX_KATAKANA - cp e - jr nz, .hiragana - ; if it's katakana, - ; make it hiragana by decreasing its high byte. - dec e -.hiragana - pop hl -.loop - ld a, [hli] - or a - jr z, .return - cp d - jr nz, .next - ld a, [hl] - cp e - jr nz, .next - inc hl - ld e, [hl] - inc hl - ld d, [hl] - or a - ret -.next - inc hl - inc hl - inc hl - jr .loop -.return - scf - ret - -; given the position of the current cursor, -; it returns the pointer to the proper information. -; h: position x. -; l: position y. -GetCharInfoFromPos_Player: ; 1ab93 (6:6b93) - push de - ; (information index) = (x) * (height) + (y) - ; (height) = 0x05(Deck) or 0x06(Player) - ld e, l - ld d, h - ld a, [wNamingScreenKeyboardHeight] - ld l, a - call HtimesL - ld a, l - add e - ld hl, KeyboardData_Player - pop de - or a - ret z -.loop - inc hl - inc hl - inc hl - inc hl - inc hl - inc hl - dec a - jr nz, .loop - ret - -; a set of keyboard datum. -; unit: 6 bytes. -; structure: -; abs. y pos. (1) / abs. x pos. (1) / type 1 (1) / type 2 (1) / char. code (2) -; unused data contains its character code as zero. -kbitem: MACRO - db \1, \2, \3, \4 -if (_NARG == 5) - dw \5 -elif (\5 == TX_FULLWIDTH3) - dw (\5 << 8) | STRCAT("FW3_", \6) -else - dw (\5 << 8) | \6 -endc -ENDM - -KeyboardData_Player: ; 1abaf (6:6baf) - kbitem $04, $02, $11, $00, TX_FULLWIDTH3, "A" - kbitem $06, $02, $12, $00, TX_FULLWIDTH3, "J" - kbitem $08, $02, $13, $00, TX_FULLWIDTH3, "S" - kbitem $0a, $02, $14, $00, "o" - kbitem $0c, $02, $15, $00, "d" - kbitem $10, $0f, $01, $09, $0000 - - kbitem $04, $04, $16, $00, TX_FULLWIDTH3, "B" - kbitem $06, $04, $17, $00, TX_FULLWIDTH3, "K" - kbitem $08, $04, $18, $00, TX_FULLWIDTH3, "T" - kbitem $0a, $04, $19, $00, TX_FULLWIDTH3, "&" - kbitem $0c, $04, $1a, $00, "e" - kbitem $10, $0f, $01, $09, $0000 - - kbitem $04, $06, $1b, $00, TX_FULLWIDTH3, "C" - kbitem $06, $06, $1c, $00, TX_FULLWIDTH3, "L" - kbitem $08, $06, $1d, $00, TX_FULLWIDTH3, "U" - kbitem $0a, $06, $1e, $00, "j" - kbitem $0c, $06, $1f, $00, "f" - kbitem $10, $0f, $01, $09, $0000 - - kbitem $04, $08, $20, $00, TX_FULLWIDTH3, "D" - kbitem $06, $08, $21, $00, TX_FULLWIDTH3, "M" - kbitem $08, $08, $22, $00, TX_FULLWIDTH3, "V" - kbitem $0a, $08, $23, $00, "k" - kbitem $0c, $08, $24, $00, "g" - kbitem $10, $0f, $01, $09, $0000 - - kbitem $04, $0a, $25, $00, TX_FULLWIDTH3, "E" - kbitem $06, $0a, $26, $00, TX_FULLWIDTH3, "N" - kbitem $08, $0a, $27, $00, TX_FULLWIDTH3, "W" - kbitem $0a, $0a, $28, $00, "w" - kbitem $0c, $0a, $29, $00, "h" - kbitem $10, $0f, $01, $09, $0000 - - kbitem $04, $0c, $2a, $00, TX_FULLWIDTH3, "F" - kbitem $06, $0c, $2b, $00, TX_FULLWIDTH3, "O" - kbitem $08, $0c, $2c, $00, TX_FULLWIDTH3, "X" - kbitem $0a, $0c, $2d, $00, "`" - kbitem $0c, $0c, $2e, $00, "i" - kbitem $10, $0f, $01, $09, $0000 - - kbitem $04, $0e, $2f, $00, TX_FULLWIDTH3, "G" - kbitem $06, $0e, $30, $00, TX_FULLWIDTH3, "P" - kbitem $08, $0e, $31, $00, TX_FULLWIDTH3, "Y" - kbitem $0a, $0e, $32, $00, "a" - kbitem $0c, $0e, $33, $00, TX_SYMBOL, SYM_No - kbitem $10, $0f, $01, $09, $0000 - - kbitem $04, $10, $34, $00, TX_FULLWIDTH3, "H" - kbitem $06, $10, $35, $00, TX_FULLWIDTH3, "Q" - kbitem $08, $10, $36, $00, TX_FULLWIDTH3, "Z" - kbitem $0a, $10, $3c, $00, "b" - kbitem $0c, $10, $3d, $00, TX_SYMBOL, SYM_Lv - kbitem $10, $0f, $01, $09, $0000 - - kbitem $04, $12, $37, $00, TX_FULLWIDTH3, "I" - kbitem $06, $12, $38, $00, TX_FULLWIDTH3, "R" - kbitem $08, $12, $39, $00, "n" - kbitem $0a, $12, $3a, $00, "c" - kbitem $0c, $12, $3b, $00, "p" - kbitem $10, $0f, $01, $09, $0000 - kbitem $00, $00, $00, $00, $0000 - -; a set of transition datum. -; unit: 4 bytes. -; structure: -; previous char. code (2) / translated char. code (2) -; - the former char. code contains 0x0e in high byte. -; - the latter char. code contains only low byte. -TransitionTable1: - dw $0e16, $003e - dw $0e17, $003f - dw $0e18, $0040 - dw $0e19, $0041 - dw $0e1a, $0042 - dw $0e1b, $0043 - dw $0e1c, $0044 - dw $0e1d, $0045 - dw $0e1e, $0046 - dw $0e1f, $0047 - dw $0e20, $0048 - dw $0e21, $0049 - dw $0e22, $004a - dw $0e23, $004b - dw $0e24, $004c - dw $0e2a, $004d - dw $0e2b, $004e - dw $0e2c, $004f - dw $0e2d, $0050 - dw $0e2e, $0051 - dw $0e52, $004d - dw $0e53, $004e - dw $0e54, $004f - dw $0e55, $0050 - dw $0e56, $0051 - dw $0000 - -TransitionTable2: - dw $0e2a, $0052 - dw $0e2b, $0053 - dw $0e2c, $0054 - dw $0e2d, $0055 - dw $0e2e, $0056 - dw $0e4d, $0052 - dw $0e4e, $0053 - dw $0e4f, $0054 - dw $0e50, $0055 - dw $0e51, $0056 - dw $0000 - -; get deck name from the user into de. -; function description is similar to the player's. -; refer to 'InputPlayerName'. -InputDeckName: ; 1ad89 (6:6d89) - push af - ; check if the buffer is empty. - ld a, [de] - or a - jr nz, .not_empty - ; this buffer will contain half-width chars. - ld a, TX_HALFWIDTH - ld [de], a -.not_empty - pop af - inc a - call InitializeInputName - call Set_OBJ_8x8 - - xor a - ld [wTileMapFill], a - call EmptyScreen - call ZeroObjectPositions - - ld a, $01 - ld [wVBlankOAMCopyToggle], a - call LoadSymbolsFont - - lb de, $38, $bf - call SetupText - call LoadHalfWidthTextCursorTile - - xor a - ld [wd009], a - call Func_1ae99 - - xor a - ld [wNamingScreenCursorX], a - ld [wNamingScreenCursorY], a - - ld a, $09 - ld [wNamingScreenNumColumns], a - ld a, $07 - ld [wNamingScreenKeyboardHeight], a - ld a, $0f - ld [wVisibleCursorTile], a - ld a, $00 - ld [wInvisibleCursorTile], a -.loop - ld a, $01 - ld [wVBlankOAMCopyToggle], a - call DoFrame - - call UpdateRNGSources - - ldh a, [hDPadHeld] - and START - jr z, .on_start - - ld a, $01 - call PlayAcceptOrDeclineSFX - call Func_1afa1 - - ld a, 6 - ld [wNamingScreenCursorX], a - ld [wNamingScreenCursorY], a - call Func_1afbd - - jr .loop -.on_start - call Func_1aefb - jr nc, .loop - - cp $ff - jr z, .asm_6e1c - - call Func_1aec3 - jr nc, .loop - - call FinalizeInputName - - ld hl, wNamingScreenDestPointer - ld a, [hli] - ld h, [hl] - ld l, a - inc hl - - ld a, [hl] - or a - jr nz, .return - - dec hl - ld [hl], TX_END -.return - ret -.asm_6e1c - ld a, [wNamingScreenBufferLength] - cp $02 - jr c, .loop - - ld e, a - ld d, 0 - ld hl, wNamingScreenBuffer - add hl, de - dec hl - ld [hl], TX_END - - ld hl, wNamingScreenBufferLength - dec [hl] - call ProcessTextWithUnderbar - - jp .loop - -; load, to the first tile of v0Tiles0, the graphics for the -; blinking black square used in name input screens. -; for inputting half width text. -LoadHalfWidthTextCursorTile: ; 1ae37 (6:6e37) - ld hl, v0Tiles0 + $00 tiles - ld de, .data - ld b, 0 -.loop - ld a, TILE_SIZE - cp b - ret z - inc b - ld a, [de] - inc de - ld [hli], a - jr .loop - -.data -rept TILE_SIZE - db $f0 -endr - -; it's only for naming the deck. -ProcessTextWithUnderbar: ; 1ae59 (6:6e59) - ld hl, wNamingScreenNamePosition - ld d, [hl] - inc hl - ld e, [hl] - call InitTextPrinting - ld hl, .underbar_data - ld de, wDefaultText -.loop ; copy the underbar string. - ld a, [hli] - ld [de], a - inc de - or a - jr nz, .loop - - ld hl, wNamingScreenBuffer - ld de, wDefaultText -.loop2 ; copy the input from the user. - ld a, [hli] - or a - jr z, .print_name - ld [de], a - inc de - jr .loop2 -.print_name - ld hl, wDefaultText - call ProcessText - ret -.underbar_data - db TX_HALFWIDTH -rept MAX_DECK_NAME_LENGTH - db "_" -endr - db TX_END - -Func_1ae99: ; 1ae99 (6:6e99) - call DrawTextboxForKeyboard - call ProcessTextWithUnderbar - ld hl, wNamingScreenQuestionPointer - ld c, [hl] - inc hl - ld a, [hl] - ld h, a - or c - jr z, .print - ; print the question string. - ld l, c - call PlaceTextItems -.print - ; print "End" - ld hl, DrawNamingScreenBG.data - call PlaceTextItems - ; print the keyboard characters. - ldtx hl, DeckNameKeyboardText ; "A B C D..." - lb de, 2, 4 - call InitTextPrinting - call ProcessTextFromID - call EnableLCD - ret - -Func_1aec3: ; 1aec3 (6:6ec3) - ld a, [wNamingScreenCursorX] - ld h, a - ld a, [wNamingScreenCursorY] - ld l, a - call GetCharInfoFromPos_Deck - inc hl - inc hl - ld a, [hl] - cp $01 - jr nz, .asm_6ed7 - scf - ret -.asm_6ed7 - ld d, a - ld hl, wNamingScreenBufferLength - ld a, [hl] - ld c, a - push hl - ld hl, wNamingScreenBufferMaxLength - cp [hl] - pop hl - jr nz, .asm_6eeb - ld hl, wNamingScreenBuffer - dec hl - jr .asm_6eef -.asm_6eeb - inc [hl] - ld hl, wNamingScreenBuffer -.asm_6eef - ld b, 0 - add hl, bc - ld [hl], d - inc hl - ld [hl], TX_END - call ProcessTextWithUnderbar - or a - ret - -Func_1aefb: ; 1aefb (6:6efb) - xor a - ld [wPlaysSfx], a - ldh a, [hDPadHeld] - or a - jp z, .asm_6f73 - ld b, a - ld a, [wNamingScreenKeyboardHeight] - ld c, a - ld a, [wNamingScreenCursorX] - ld h, a - ld a, [wNamingScreenCursorY] - ld l, a - bit 6, b - jr z, .asm_6f1f - dec a - bit 7, a - jr z, .asm_6f4b - ld a, c - dec a - jr .asm_6f4b -.asm_6f1f - bit 7, b - jr z, .asm_6f2a - inc a - cp c - jr c, .asm_6f4b - xor a - jr .asm_6f4b -.asm_6f2a - cp $06 - jr z, .asm_6f73 - ld a, [wNamingScreenNumColumns] - ld c, a - ld a, h - bit 5, b - jr z, .asm_6f40 - dec a - bit 7, a - jr z, .asm_6f4e - ld a, c - dec a - jr .asm_6f4e -.asm_6f40 - bit 4, b - jr z, .asm_6f73 - inc a - cp c - jr c, .asm_6f4e - xor a - jr .asm_6f4e -.asm_6f4b - ld l, a - jr .asm_6f4f -.asm_6f4e - ld h, a -.asm_6f4f - push hl - call GetCharInfoFromPos_Deck - inc hl - inc hl - ld d, [hl] - push de - call Func_1afa1 - pop de - pop hl - ld a, l - ld [wNamingScreenCursorY], a - ld a, h - ld [wNamingScreenCursorX], a - xor a - ld [wCheckMenuCursorBlinkCounter], a - ld a, $02 - cp d - jp z, Func_1aefb - ld a, $01 - ld [wPlaysSfx], a -.asm_6f73 - ldh a, [hKeysPressed] - and $03 - jr z, .asm_6f89 - and $01 - jr nz, .asm_6f7f - ld a, $ff -.asm_6f7f - call PlayAcceptOrDeclineSFX - push af - call Func_1afbd - pop af - scf - ret -.asm_6f89 - ld a, [wPlaysSfx] - or a - jr z, .asm_6f92 - call PlaySFX -.asm_6f92 - ld hl, wCheckMenuCursorBlinkCounter - ld a, [hl] - inc [hl] - and $0f - ret nz - ld a, [wVisibleCursorTile] - bit 4, [hl] - jr z, Func_1afa1.asm_6fa4 - -Func_1afa1: ; 1afa1 (6:6fa1) - ld a, [wInvisibleCursorTile] -.asm_6fa4 - ld e, a - ld a, [wNamingScreenCursorX] - ld h, a - ld a, [wNamingScreenCursorY] - ld l, a - call GetCharInfoFromPos_Deck - ld a, [hli] - ld c, a - ld b, [hl] - dec b - ld a, e - call Func_1afc2 - call WriteByteToBGMap0 - or a - ret - -Func_1afbd: ; 1afbd (6:6fbd) - ld a, [wVisibleCursorTile] - jr Func_1afa1.asm_6fa4 - -Func_1afc2: ; 1afc2 (6:6fc2) - push af - push bc - push de - push hl - push af - call ZeroObjectPositions - pop af - ld b, a - ld a, [wInvisibleCursorTile] - cp b - jr z, .asm_6ffb - ld a, [wNamingScreenBufferLength] - ld d, a - ld a, [wNamingScreenBufferMaxLength] - ld e, a - ld a, d - cp e - jr nz, .asm_6fdf - dec a -.asm_6fdf - dec a - ld d, a - ld hl, wNamingScreenNamePosition - ld a, [hl] - sla a - add d - ld d, a - ld h, $04 - ld l, d - call HtimesL - ld a, l - add $08 - ld d, a - ld e, $18 - ld bc, $0000 - call SetOneObjectAttributes -.asm_6ffb - pop hl - pop de - pop bc - pop af - ret - -; given the cursor position, -; returns the character information which the cursor directs. -; it's similar to "GetCharInfoFromPos_Player", -; but the data structure is different in its unit size. -; its unit size is 3, and player's is 6. -; h: x -; l: y -GetCharInfoFromPos_Deck: ; 1b000 (6:7000) - push de - ld e, l - ld d, h - ld a, [wNamingScreenKeyboardHeight] - ld l, a - call HtimesL - ld a, l - add e - ; x * h + y - ld hl, KeyboardData_Deck - pop de - or a - ret z -.loop - inc hl - inc hl - inc hl - dec a - jr nz, .loop - ret - -KeyboardData_Deck: ; 1b019 (6:7019) - db $04, $02, "A" - db $06, $02, "J" - db $08, $02, "S" - db $0a, $02, "?" - db $0c, $02, "4" - db $0e, $02, $02 - db $10, $0f, $01 - - db $04, $04, "B" - db $06, $04, "K" - db $08, $04, "T" - db $0a, $04, "&" - db $0c, $04, "5" - db $0e, $04, $02 - db $10, $0f, $01 - - db $04, $06, "C" - db $06, $06, "L" - db $08, $06, "U" - db $0a, $06, "+" - db $0c, $06, "6" - db $0e, $06, $02 - db $10, $0f, $01 - - db $04, $08, "D" - db $06, $08, "M" - db $08, $08, "V" - db $0a, $08, "-" - db $0c, $08, "7" - db $0e, $08, $02 - db $10, $0f, $01 - - db $04, $0a, "E" - db $06, $0a, "N" - db $08, $0a, "W" - db $0a, $0a, "'" - db $0c, $0a, "8" - db $0e, $0a, $02 - db $10, $0f, $01 - - db $04, $0c, "F" - db $06, $0c, "O" - db $08, $0c, "X" - db $0a, $0c, "0" - db $0c, $0c, "9" - db $0e, $0c, $02 - db $10, $0f, $01 - - db $04, $0e, "G" - db $06, $0e, "P" - db $08, $0e, "Y" - db $0a, $0e, "1" - db $0c, $0e, " " - db $0e, $0e, $02 - db $10, $0f, $01 - - db $04, $10, "H" - db $06, $10, "Q" - db $08, $10, "Z" - db $0a, $10, "2" - db $0c, $10, " " - db $0e, $10, $02 - db $10, $0f, $01 - - db $04, $12, "I" - db $06, $12, "R" - db $08, $12, "!" - db $0a, $12, "3" - db $0c, $12, " " - db $0e, $12, $02 - db $10, $0f, $01 - - ds 4 ; empty - -INCLUDE "data/auto_deck_card_lists.asm" -INCLUDE "data/auto_deck_machines.asm" - -; writes to sAutoDecks all the deck configurations -; from the Auto Deck Machine in wCurAutoDeckMachine -ReadAutoDeckConfiguration: ; 1ba14 (6:7a14) - call EnableSRAM - ld a, [wCurAutoDeckMachine] - ld l, a - ld h, 6 * NUM_DECK_MACHINE_SLOTS - call HtimesL - ld bc, AutoDeckMachineEntries - add hl, bc - ld b, 0 -.loop_decks - call .GetPointerToSRAMAutoDeck - call .ReadDeckConfiguration - call .ReadDeckName - - ; store deck description text ID - push hl - ld de, wAutoDeckMachineTextDescriptions - ld h, b - ld l, 2 - call HtimesL - add hl, de - ld d, h - ld e, l - pop hl - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc b - ld a, b - cp NUM_DECK_MACHINE_SLOTS - jr nz, .loop_decks - call DisableSRAM - ret - -; outputs in de the saved deck with index b -.GetPointerToSRAMAutoDeck - push hl - ld l, b - ld h, DECK_STRUCT_SIZE - call HtimesL - ld de, sAutoDecks - add hl, de - ld d, h - ld e, l - pop hl - ret - -; writes the deck configuration in SRAM -; by reading the given deck card list -.ReadDeckConfiguration - push hl - push bc - push de - push de - ld e, [hl] - inc hl - ld d, [hl] - pop hl - ld bc, DECK_NAME_SIZE - add hl, bc -.loop_create_deck - ld a, [de] - inc de - ld b, a ; card count - or a - jr z, .done_create_deck - ld a, [de] - inc de - ld c, a ; card ID -.loop_card_count - ld [hl], c - inc hl - dec b - jr nz, .loop_card_count - jr .loop_create_deck -.done_create_deck - pop de - pop bc - pop hl - inc hl - inc hl - ret - -.ReadDeckName - push hl - push bc - push de - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wDismantledDeckName - call CopyText - pop hl - ld de, wDismantledDeckName -.loop_copy_name - ld a, [de] - ld [hli], a - or a - jr z, .done_copy_name - inc de - jr .loop_copy_name -.done_copy_name - pop bc - pop hl - inc hl - inc hl - ret - -; tries out all combinations of dismantling the player's decks -; in order to build the deck in wSelectedDeckMachineEntry -; if none of the combinations work, return carry set -; otherwise, return in a which deck flags should be dismantled -CheckWhichDecksToDismantleToBuildSavedDeck: ; 1ba9a (6:7a9a) - xor a - ld [wDecksToBeDismantled], a - -; first check if it can be built by -; only dismantling a single deck - ld a, DECK_1 -.loop_single_built_decks - call .CheckIfCanBuild - ret nc - sla a ; next deck - cp (1 << NUM_DECKS) - jr z, .two_deck_combinations - jr .loop_single_built_decks - -.two_deck_combinations -; next check all two deck combinations - ld a, DECK_1 | DECK_2 - call .CheckIfCanBuild - ret nc - ld a, DECK_1 | DECK_3 - call .CheckIfCanBuild - ret nc - ld a, DECK_1 | DECK_4 - call .CheckIfCanBuild - ret nc - ld a, DECK_2 | DECK_3 - call .CheckIfCanBuild - ret nc - ld a, DECK_2 | DECK_4 - call .CheckIfCanBuild - ret nc - ld a, DECK_3 | DECK_4 - call .CheckIfCanBuild - ret nc - -; all but one deck combinations - ld a, $ff ^ DECK_4 -.loop_three_deck_combinations - call .CheckIfCanBuild - ret nc - sra a - cp $ff - jr z, .all_decks - jr .loop_three_deck_combinations - -.all_decks -; finally check if can be built by dismantling all decks - call .CheckIfCanBuild - ret nc - -; none of the combinations work - scf - ret - -; returns carry if wSelectedDeckMachineEntry cannot be built -; by dismantling the decks given by register a -; a = DECK_* flags -.CheckIfCanBuild - push af - ld hl, wSelectedDeckMachineEntry - ld b, [hl] - farcall CheckIfCanBuildSavedDeck - jr c, .cannot_build - pop af - ld [wDecksToBeDismantled], a - or a - ret -.cannot_build - pop af - scf - ret diff --git a/src/engine/bank07.asm b/src/engine/bank07.asm index d0172e5..cf9da13 100644 --- a/src/engine/bank07.asm +++ b/src/engine/bank07.asm @@ -1,24 +1,24 @@ -Func_1c000: ; 1c000 (7:4000) - jp Set_WD_off +JumpSetWindowOff: + jp SetWindowOff -; unreferenced debug function +; debug function ; prints player's coordinates by pressing B ; and draws palettes by pressing A -Func_1c003: ; 1c003 (7:4003) +Func_1c003: ; unreferenced ld a, [wCurMap] or a - jr z, Func_1c000 + jr z, JumpSetWindowOff ld a, [wOverworldMode] cp OWMODE_START_SCRIPT - jr nc, Func_1c000 + jr nc, JumpSetWindowOff ldh a, [hKeysHeld] ld b, a and A_BUTTON | B_BUTTON cp b - jr nz, Func_1c000 + jr nz, JumpSetWindowOff and B_BUTTON - jr z, Func_1c000 + jr z, JumpSetWindowOff ld bc, $20 ld a, [wPlayerXCoord] @@ -46,10 +46,10 @@ Func_1c003: ; 1c003 (7:4003) ld a, $68 ldh [hWY], a .set_wd_on - call Set_WD_on + call SetWindowOn ret -Func_1c056: ; 1c056 (7:4056) +Func_1c056: push hl push bc push de @@ -100,7 +100,7 @@ Func_1c056: ; 1c056 (7:4056) INCLUDE "data/warps.asm" ; loads data from the map header of wCurMap -LoadMapHeader: ; 1c33b (7:433b) +LoadMapHeader: push hl push bc push de @@ -143,7 +143,7 @@ LoadMapHeader: ; 1c33b (7:433b) INCLUDE "data/map_headers.asm" -ClearNPCs: ; 1c440 (7:4440) +ClearNPCs: push hl push bc ld hl, wLoadedNPCs @@ -159,7 +159,7 @@ ClearNPCs: ; 1c440 (7:4440) pop hl ret -GetNPCDirection: ; 1c455 (7:4455) +GetNPCDirection: push hl ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_DIRECTION @@ -171,7 +171,7 @@ GetNPCDirection: ; 1c455 (7:4455) ; sets new position to active NPC ; and updates its tile permissions ; bc = new coords -SetNPCPosition: ; 1c461 (7:4461) +SetNPCPosition: push hl push bc call UpdateNPCsTilePermission @@ -186,7 +186,7 @@ SetNPCPosition: ; 1c461 (7:4461) pop hl ret -GetNPCPosition: ; 1c477 (7:4477) +GetNPCPosition: push hl ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_COORD_X @@ -198,7 +198,7 @@ GetNPCPosition: ; 1c477 (7:4477) ret ; Loads NPC Sprite Data -LoadNPC: ; 1c485 (7:4485) +LoadNPC: push hl push bc push de @@ -265,7 +265,7 @@ LoadNPC: ; 1c485 (7:4485) ret ; returns carry if input NPC ID in register a is Ronald -CheckIfNPCIsRonald: ; 1c4fa (7:44fa) +CheckIfNPCIsRonald: cp NPC_RONALD1 jr z, .set_carry cp NPC_RONALD2 @@ -278,7 +278,7 @@ CheckIfNPCIsRonald: ; 1c4fa (7:44fa) scf ret -UnloadNPC: ; 1c50a (7:450a) +UnloadNPC: push hl call UpdateNPCsTilePermission ld a, [wLoadedNPCTempIndex] @@ -303,7 +303,7 @@ UnloadNPC: ; 1c50a (7:450a) pop hl ret -Func_1c52e: ; 1c52e (7:452e) +Func_1c52e: push hl push af ld a, [wLoadedNPCTempIndex] @@ -315,7 +315,7 @@ Func_1c52e: ; 1c52e (7:452e) pop hl ret -Func_1c53f: ; 1c53f (7:453f) +Func_1c53f: push hl push bc ld a, [wLoadedNPCTempIndex] @@ -332,7 +332,7 @@ Func_1c53f: ; 1c53f (7:453f) pop hl ret -Func_1c557: ; 1c557 (7:4557) +Func_1c557: push bc ld c, a ld a, [wLoadedNPCTempIndex] @@ -357,7 +357,7 @@ Func_1c557: ; 1c557 (7:4557) ret ; a = NPC animation -SetNPCAnimation: ; 1c57b (7:457b) +SetNPCAnimation: push hl push bc push af @@ -371,7 +371,7 @@ SetNPCAnimation: ; 1c57b (7:457b) pop hl ret -UpdateNPCAnimation: ; 1c58e (7:458e) +UpdateNPCAnimation: push hl push bc ld a, [wWhichSprite] @@ -404,7 +404,7 @@ UpdateNPCAnimation: ; 1c58e (7:458e) ; give it a random initial value ; this makes it so that all NPCs are out of phase ; when they are loaded into a map -ApplyRandomCountToNPCAnim: ; 1c5b9 (7:45b9) +ApplyRandomCountToNPCAnim: push hl push bc ld a, [wWhichSprite] @@ -438,7 +438,7 @@ ApplyRandomCountToNPCAnim: ; 1c5b9 (7:45b9) ; sets the loaded NPC's direction ; to the direction that is in LOADED_NPC_DIRECTION_BACKUP -Func_1c5e9: ; 1c5e9 (7:45e9) +Func_1c5e9: push hl push bc ld a, [wLoadedNPCTempIndex] @@ -454,7 +454,7 @@ Func_1c5e9: ; 1c5e9 (7:45e9) ret ; a = new direction -SetNPCDirection: ; 1c5ff (7:45ff) +SetNPCDirection: push hl push af ld a, [wLoadedNPCTempIndex] @@ -466,7 +466,7 @@ SetNPCDirection: ; 1c5ff (7:45ff) pop hl ret -HandleAllNPCMovement: ; 1c610 (7:4610) +HandleAllNPCMovement: push hl push bc push de @@ -527,7 +527,7 @@ HandleAllNPCMovement: ; 1c610 (7:4610) pop hl ret -UpdateNPCSpritePosition: ; 1c665 (7:4665) +UpdateNPCSpritePosition: push hl push bc push de @@ -623,7 +623,7 @@ UpdateNPCSpritePosition: ; 1c665 (7:4665) ; ands wIsAnNPCMoving with the current ; NPC's NPC_FLAG_MOVING_F -UpdateIsAnNPCMovingFlag: ; 1c6d3 (7:46d3) +UpdateIsAnNPCMovingFlag: push hl push bc ld bc, LOADED_NPC_FLAGS @@ -635,7 +635,7 @@ UpdateIsAnNPCMovingFlag: ; 1c6d3 (7:46d3) pop hl ret -SetNPCsTilePermission: ; 1c6e3 (7:46e3) +SetNPCsTilePermission: push hl push bc ld a, [wLoadedNPCTempIndex] @@ -650,7 +650,7 @@ SetNPCsTilePermission: ; 1c6e3 (7:46e3) pop hl ret -SetAllNPCTilePermissions: ; 1c6f8 (7:46f8) +SetAllNPCTilePermissions: push hl push bc push de @@ -675,7 +675,7 @@ SetAllNPCTilePermissions: ; 1c6f8 (7:46f8) pop hl ret -UpdateNPCsTilePermission: ; 1c719 (7:4719) +UpdateNPCsTilePermission: push hl push bc ld a, [wLoadedNPCTempIndex] @@ -691,7 +691,7 @@ UpdateNPCsTilePermission: ; 1c719 (7:4719) ret ; Find NPC at coords b (x) c (y) -FindNPCAtLocation: ; 1c72e (7:472e) +FindNPCAtLocation: push hl push bc push de @@ -742,7 +742,7 @@ FindNPCAtLocation: ; 1c72e (7:472e) ; Probably needs a new name. Loads data for NPC that the next Script is for ; Sets direction, Loads Image data for it, loads name, and more -SetNewScriptNPC: ; 1c768 (7:4768) +SetNewScriptNPC: push hl ld a, [wLoadedNPCTempIndex] ld l, LOADED_NPC_DIRECTION @@ -760,7 +760,7 @@ SetNewScriptNPC: ; 1c768 (7:4768) pop hl ret -StartNPCMovement: ; 1c78d (7:478d) +StartNPCMovement: push hl ; set NPC as moving ld a, [wLoadedNPCTempIndex] @@ -825,7 +825,7 @@ StartNPCMovement: ; 1c78d (7:478d) ret ; returns nz if there is an NPC currently moving -CheckIsAnNPCMoving: ; 1c7de (7:47de) +CheckIsAnNPCMoving: ld a, [wIsAnNPCMoving] and NPC_FLAG_MOVING ret @@ -833,7 +833,7 @@ CheckIsAnNPCMoving: ; 1c7de (7:47de) ; while the NPC is moving, increment its movement step by 1 ; once it reaches a value greater than 16, update ; its tile permission and its position and start next movement -UpdateNPCMovementStep: ; 1c7e4 (7:47e4) +UpdateNPCMovementStep: push hl push bc push de @@ -861,7 +861,7 @@ UpdateNPCMovementStep: ; 1c7e4 (7:47e4) pop hl ret -UpdateNPCPosition: ; 1c80d (7:480d) +UpdateNPCPosition: push hl push bc ld a, [wLoadedNPCTempIndex] @@ -888,7 +888,7 @@ UpdateNPCPosition: ; 1c80d (7:480d) pop hl ret -ClearMasterBeatenList: ; 1c82e (7:482e) +ClearMasterBeatenList: push hl push bc ld c, $a @@ -904,7 +904,7 @@ ClearMasterBeatenList: ; 1c82e (7:482e) ; writes Master in register a to ; first empty slot in wMastersBeatenList -AddMasterBeatenToList: ; 1c83d (7:483d) +AddMasterBeatenToList: push hl push bc ld b, a @@ -933,7 +933,7 @@ AddMasterBeatenToList: ; 1c83d (7:483d) ; iterates all masters and attempts to ; add each of them to wMastersBeatenList -AddAllMastersToMastersBeatenList: ; 1c858 (7:4858) +AddAllMastersToMastersBeatenList: ld a, $01 .loop push af @@ -944,13 +944,13 @@ AddAllMastersToMastersBeatenList: ; 1c858 (7:4858) jr c, .loop ret -Func_1c865: ; 1c865 (7:4865) +Func_1c865: ret -; unreferenced debug function +; debug function ; adjusts hSCX and hSCY by using the arrow keys ; pressing B makes it scroll faster -Func_1c866: ; 1c866 (7:4866) +Func_1c866: ; unreferenced ldh a, [hKeysHeld] and B_BUTTON call nz, .asm_1c86d ; executes following part twice @@ -982,9 +982,8 @@ Func_1c866: ; 1c866 (7:4866) ldh [hSCY], a ret -; unreferenced ; sets some flags on a given sprite -Func_1c890: ; 1c890 (7:4890) +Func_1c890: ; unreferenced ld a, [wVBlankCounter] and %111111 ret nz @@ -1012,1775 +1011,3 @@ Func_1c890: ; 1c890 (7:4890) set SPRITE_ANIM_FLAG_SPEED, [hl] .asm_1c8bb ret - -Func_1c8bc: ; 1c8bc (7:48bc) - push hl - push bc - call Set_OBJ_8x8 - ld a, LOW(Func_3ba2) - ld [wDoFrameFunction], a - ld a, HIGH(Func_3ba2) - ld [wDoFrameFunction + 1], a - ld a, $ff - ld hl, wAnimationQueue - ld c, ANIMATION_QUEUE_LENGTH -.fill_queue - ld [hli], a - dec c - jr nz, .fill_queue - ld [wd42a], a - ld [wd4c0], a - xor a - ld [wDuelAnimBufferCurPos], a - ld [wDuelAnimBufferSize], a - ld [wd4b3], a - call DefaultScreenAnimationUpdate - call Func_3ca0 - pop bc - pop hl - ret - -PlayLoadedDuelAnimation: ; 1c8ef (7:48ef) - ld a, [wDoFrameFunction + 0] - cp LOW(Func_3ba2) - jr nz, .error - ld a, [wDoFrameFunction + 1] - cp HIGH(Func_3ba2) - jr z, .okay -.error - debug_nop - ret - -.okay - ld a, [wTempAnimation] - ld [wd4bf], a - cp DUEL_SPECIAL_ANIMS - jp nc, Func_1cb5e - - push hl - push bc - push de - call GetAnimationData -; hl: pointer - - ld a, [wAnimationsDisabled] - or a - jr z, .check_to_play_sfx - ; animations are disabled - push hl - ld bc, ANIM_SPRITE_ANIM_FLAGS - add hl, bc - ld a, [hl] - ; if flag is set, play animation anyway - and (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) - pop hl - jr z, .return - -.check_to_play_sfx - push hl - ld bc, ANIM_SOUND_FX_ID - add hl, bc - ld a, [hl] - pop hl - or a - jr z, .calc_addr - call PlaySFX - -.calc_addr -; this data field is always $00, -; so this calculation is unnecessary -; seems like there was supposed to be -; more than 1 function to handle animation - push hl - ld bc, ANIM_HANDLER_FUNCTION - add hl, bc - ld a, [hl] - rlca - add LOW(.address) ; $48 - ld l, a ; LO - ld a, HIGH(.address) ; $49 - adc 0 - ld h, a ; HI -; hl: pointer - ld a, [hli] - ld b, [hl] - ld c, a - pop hl - - call CallBC -.return - pop de - pop bc - pop hl - ret - -.address - dw .handler_func - -.handler_func ; 1c94a (7:494a) -; if any of ANIM_SPRITE_ID, ANIM_PALETTE_ID and ANIM_SPRITE_ANIM_ID -; are 0, then return - ld e, l - ld d, h - ld c, ANIM_SPRITE_ANIM_ID + 1 -.loop - ld a, [de] - or a - jr z, .return_with_carry - inc de - dec c - jr nz, .loop - - ld a, [hli] ; ANIM_SPRITE_ID - farcall CreateSpriteAndAnimBufferEntry - ld a, [wWhichSprite] - ld [wAnimationQueue], a ; push an animation to the queue - - xor a - ld [wVRAMTileOffset], a - ld [wd4cb], a - - ld a, [hli] ; ANIM_PALETTE_ID - farcall LoadPaletteData - ld a, [hli] ; ANIM_SPRITE_ANIM_ID - - push af - ld a, [hli] ; ANIM_SPRITE_ANIM_FLAGS - ld [wAnimFlags], a - call LoadAnimCoordsAndFlags - pop af - - farcall StartNewSpriteAnimation - or a - jr .done - -.return_with_carry - scf -.done - ret - -; loads the correct coordinates/flags for -; sprite animation in wAnimationQueue -LoadAnimCoordsAndFlags: ; 1c980 (7:4980) - push hl - push bc - ld a, [wAnimationQueue] - ld c, SPRITE_ANIM_ATTRIBUTES - call GetSpriteAnimBufferProperty_SpriteInA - call GetAnimCoordsAndFlags - - push af - and (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_5) - or [hl] - ld [hli], a - ld a, b - ld [hli], a ; SPRITE_ANIM_COORD_X - ld [hl], c ; SPRITE_ANIM_COORD_Y - pop af - - ld bc, SPRITE_ANIM_FLAGS - SPRITE_ANIM_COORD_Y - add hl, bc - ld c, a ; useless - and (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) - or [hl] - ld [hl], a - pop bc - pop hl - ret - -; outputs x and y coordinates for the sprite animation -; taking into account who the turn duelist is. -; also returns in a the allowed animation flags of -; the configuration that is selected. -; output: -; a = anim flags -; b = x coordinate -; c = y coordinate -GetAnimCoordsAndFlags: ; 1c9a2 (7:49a2) - push hl - ld c, 0 - ld a, [wAnimFlags] - and (1 << SPRITE_ANIM_FLAG_SPEED) - jr nz, .calc_addr - - ld a, [wDuelAnimationScreen] - add a ; 2 * [wDuelAnimationScreen] - ld c, a - add a ; 4 * [wDuelAnimationScreen] - add c ; 6 * [wDuelAnimationScreen] - add a ; 12 * [wDuelAnimationScreen] - ld c, a - - ld a, [wDuelAnimDuelistSide] - cp PLAYER_TURN - jr z, .player_side -; opponent side - ld a, 6 - add c - ld c, a -.player_side - ld a, [wDuelAnimLocationParam] - add c ; a = [wDuelAnimLocationParam] + c - ld c, a - ld b, 0 - ld hl, AnimationCoordinatesIndex - add hl, bc - ld c, [hl] - -.calc_addr - ld a, c - add a ; a = c * 2 - add c ; a = c * 3 - ld c, a - ld b, 0 - ld hl, AnimationCoordinates - add hl, bc - ld b, [hl] ; x coord - inc hl - ld c, [hl] ; y coord - inc hl - ld a, [wAnimFlags] - and [hl] ; flags - pop hl - ret - -AnimationCoordinatesIndex: -; animations in the Duel Main Scene - db $01, $01, $01, $01, $01, $01 ; player - db $02, $02, $02, $02, $02, $02 ; opponent - -; animations in the Player's Play Area, for each Play Area Pokemon - db $03, $04, $05, $06, $07, $08 ; player - db $03, $04, $05, $06, $07, $08 ; opponent - -; animations in the Opponent's Play Area, for each Play Area Pokemon - db $09, $0a, $0b, $0c, $0d, $0e ; player - db $09, $0a, $0b, $0c, $0d, $0e ; opponent - -anim_coords: MACRO - db \1 - db \2 - db \3 -ENDM - -AnimationCoordinates: -; x coord, y coord, animation flags - anim_coords 88, 88, (1 << SPRITE_ANIM_FLAG_3) - -; animations in the Duel Main Scene - anim_coords 40, 80, $00 - anim_coords 136, 48, (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_5) | (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) - -; animations in the Player's Play Area, for each Play Area Pokemon - anim_coords 88, 72, $00 - anim_coords 24, 96, $00 - anim_coords 56, 96, $00 - anim_coords 88, 96, $00 - anim_coords 120, 96, $00 - anim_coords 152, 96, $00 - -; animations in the Opponent's Play Area, for each Play Area Pokemon - anim_coords 88, 80, $00 - anim_coords 152, 40, $00 - anim_coords 120, 40, $00 - anim_coords 88, 40, $00 - anim_coords 56, 40, $00 - anim_coords 24, 40, $00 - -; appends to end of wDuelAnimBuffer -; the current duel animation -LoadDuelAnimationToBuffer: ; 1ca31 (7:4a31) - push hl - push bc - ld a, [wDuelAnimBufferCurPos] - ld b, a - ld hl, wDuelAnimBufferSize - ld a, [hl] - ld c, a - add DUEL_ANIM_STRUCT_SIZE - and %01111111 - cp b - jp z, .skip - ld [hl], a - - ld b, $00 - ld hl, wDuelAnimBuffer - add hl, bc - ld a, [wTempAnimation] - ld [hli], a - ld a, [wDuelAnimationScreen] - ld [hli], a - ld a, [wDuelAnimDuelistSide] - ld [hli], a - ld a, [wDuelAnimLocationParam] - ld [hli], a - ld a, [wDuelAnimDamage] - ld [hli], a - ld a, [wDuelAnimDamage + 1] - ld [hli], a - ld a, [wd4b3] - ld [hli], a - ld a, [wDuelAnimReturnBank] - ld [hl], a - -.skip - pop bc - pop hl - ret - -; loads the animations from wDuelAnimBuffer -; in ascending order, starting at wDuelAnimBufferCurPos -PlayBufferedDuelAnimations: ; 1ca6e (7:4a6e) - push hl - push bc -.next_duel_anim - ld a, [wDuelAnimBufferSize] - ld b, a - ld a, [wDuelAnimBufferCurPos] - cp b - jr z, .skip - - ld c, a - add DUEL_ANIM_STRUCT_SIZE - and %01111111 - ld [wDuelAnimBufferCurPos], a - - ld b, $00 - ld hl, wDuelAnimBuffer - add hl, bc - ld a, [hli] - ld [wTempAnimation], a - ld a, [hli] - ld [wDuelAnimationScreen], a - ld a, [hli] - ld [wDuelAnimDuelistSide], a - ld a, [hli] - ld [wDuelAnimLocationParam], a - ld a, [hli] - ld [wDuelAnimDamage], a - ld a, [hli] - ld [wDuelAnimDamage + 1], a - ld a, [hli] - ld [wd4b3], a - ld a, [hl] - ld [wDuelAnimReturnBank], a - - call PlayLoadedDuelAnimation - call CheckAnyAnimationPlaying - jr nc, .next_duel_anim - -.skip - pop bc - pop hl - ret - -; gets data from Animations for anim ID in a -; outputs the pointer to the data in hl -GetAnimationData: ; 1cab3 (7:4ab3) - push bc - ld a, [wTempAnimation] - ld l, a - ld h, 0 - add hl, hl ; hl = anim * 2 - ld b, h - ld c, l - add hl, hl ; hl = anim * 4 - add hl, bc ; hl = anim * 6 - ld bc, Animations - add hl, bc - pop bc - ret - -Func_1cac5: ; 1cac5 (7:4ac5) - ld a, [wd42a] - cp $ff - jr nz, .asm_1cb03 - - ld a, [wd4c0] - or a - jr z, .asm_1cafb - cp $80 - jr z, .asm_1cb11 - ld hl, wAnimationQueue - ld c, ANIMATION_QUEUE_LENGTH -.loop_queue - push af - push bc - ld a, [hl] - cp $ff - jr z, .next - ld [wWhichSprite], a - farcall GetSpriteAnimCounter - cp $ff - jr nz, .next - farcall DisableCurSpriteAnim - ld a, $ff - ld [hl], a - -.next - pop bc - pop af - and [hl] - inc hl - dec c - jr nz, .loop_queue - -.asm_1cafb - cp $ff - jr nz, .skip_play_anims - call PlayBufferedDuelAnimations -.skip_play_anims - ret - -.asm_1cb03 - ld hl, wScreenAnimUpdatePtr - ld a, [hli] - ld h, [hl] - ld l, a - call CallHL2 - ld a, [wd42a] - jr .asm_1cafb - -.asm_1cb11 - ld a, $ff - ld [wd4c0], a - jr .asm_1cafb - -Func_1cb18: ; 1cb18 (7:4b18) - push hl - push bc - push de - - ; if Func_3ba2 is not set as - ; wDoFrameFunction, quit and set carry - ld a, [wDoFrameFunction] - cp LOW(Func_3ba2) - jr nz, .carry - ld a, [wDoFrameFunction + 1] - cp HIGH(Func_3ba2) - jr nz, .carry - - ld a, $ff - ld [wd4c0], a - ld a, [wd42a] - cp $ff - call nz, DoScreenAnimationUpdate - -; clear all queued animations -; and disable their sprite anims - ld hl, wAnimationQueue - ld c, ANIMATION_QUEUE_LENGTH -.loop_queue - push bc - ld a, [hl] - cp $ff - jr z, .next_queued - ld [wWhichSprite], a - farcall DisableCurSpriteAnim - ld a, $ff - ld [hl], a -.next_queued - pop bc - inc hl - dec c - jr nz, .loop_queue - - xor a - ld [wDuelAnimBufferCurPos], a - ld [wDuelAnimBufferSize], a -.done - pop de - pop bc - pop hl - ret -.carry - scf - jr .done - -Func_1cb5e: ; 1cb5e (7:4b5e) - cp $96 - jp nc, Func_1ce03 - cp $8c - jp nz, InitScreenAnimation - jr .asm_1cb6a ; redundant -.asm_1cb6a - ld a, [wDuelAnimDamage + 1] - cp $03 - jr nz, .asm_1cb76 - ld a, [wDuelAnimDamage] - cp $e8 -.asm_1cb76 - ret nc - - xor a - ld [wd4b8], a - ld [wVRAMTileOffset], a - ld [wd4cb], a - - ld a, PALETTE_37 - farcall LoadPaletteData - call Func_1cba6 - - ld hl, wd4b3 - bit 0, [hl] - call nz, Func_1cc3e - - ld a, $12 - ld [wd4b8], a - bit 1, [hl] - call nz, Func_1cc4e - - bit 2, [hl] - call nz, Func_1cc66 - - xor a - ld [wd4b3], a - ret - -Func_1cba6: ; 1cba6 (7:4ba6) - call Func_1cc03 - xor a - ld [wd4b7], a - - ld hl, wd4b4 - ld de, wAnimationQueue + 1 -.asm_1cbb3 - push hl - push de - ld a, [hl] - or a - jr z, .asm_1cbbc - call Func_1cbcc - -.asm_1cbbc - pop de - pop hl - inc hl - inc de - ld a, [wd4b7] - inc a - ld [wd4b7], a - cp $03 - jr c, .asm_1cbb3 - ret - -Func_1cbcc: ; 1cbcc (7:4bcc) - push af - ld a, SPRITE_DUEL_4 - farcall CreateSpriteAndAnimBufferEntry - ld a, [wWhichSprite] - ld [de], a - ld a, (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) - ld [wAnimFlags], a - ld c, SPRITE_ANIM_COORD_X - call GetSpriteAnimBufferProperty - call GetAnimCoordsAndFlags - - ld a, [wd4b7] - add LOW(Unknown_1cbfd) - ld e, a - ld a, HIGH(Unknown_1cbfd) - adc 0 - ld d, a - ld a, [de] - add b - - ld [hli], a ; SPRITE_ANIM_COORD_X - ld [hl], c ; SPRITE_ANIM_COORD_Y - - ld a, [wd4b8] - ld c, a - pop af - farcall Func_12ac9 - ret - -Unknown_1cbfd: ; 1cbfd (7:4bfd) - db -$10, -$8, $0, $8, -$8, -$10 - -Func_1cc03: ; 1cc03 (7:4c03) - ld a, [wDuelAnimDamage] - ld l, a - ld a, [wDuelAnimDamage + 1] - ld h, a - - ld de, wd4b4 - ld bc, -100 - call .Func_1cc2f - ld bc, -10 - call .Func_1cc2f - - ld a, l - add $4f - ld [de], a - ld hl, wd4b4 - ld c, 2 -.asm_1cc23 - ld a, [hl] - cp $4f - jr nz, .asm_1cc2e - ld [hl], $00 - inc hl - dec c - jr nz, .asm_1cc23 -.asm_1cc2e - ret - -.Func_1cc2f - ld a, $4e -.loop - inc a - add hl, bc - jr c, .loop - - ld [de], a - inc de - ld a, l - sub c - ld l, a - ld a, h - sbc b - ld h, a - ret - -Func_1cc3e: ; 1cc3e (7:4c3e) - push hl - ld a, $03 - ld [wd4b7], a - ld de, wAnimationQueue + 4 - ld a, SPRITE_ANIM_91 - call Func_1cbcc - pop hl - ret - -Func_1cc4e: ; 1cc4e (7:4c4e) - push hl - ld a, $04 - ld [wd4b7], a - ld de, wAnimationQueue + 5 - ld a, SPRITE_ANIM_90 - call Func_1cbcc - ld a, [wd4b8] - add $12 - ld [wd4b8], a - pop hl - ret - -Func_1cc66: ; 1cc66 (7:4c66) - push hl - ld a, $05 - ld [wd4b7], a - ld de, wAnimationQueue + 6 - ld a, SPRITE_ANIM_89 - call Func_1cbcc - pop hl - ret - -; initializes a screen animation from wTempAnimation -; loads a function pointer for updating a frame -; and initializes the duration of the animation. -InitScreenAnimation: ; 1cc76 (7:4c76) - ld a, [wAnimationsDisabled] - or a - jr nz, .skip - ld a, [wTempAnimation] - ld [wd42a], a - sub DUEL_SCREEN_ANIMS - add a - add a - ld c, a - ld b, $00 - ld hl, Data_1cc9f - add hl, bc - ld a, [hli] - ld [wScreenAnimUpdatePtr], a - ld c, a - ld a, [hli] - ld [wScreenAnimUpdatePtr + 1], a - ld b, a - ld a, [hl] - ld [wScreenAnimDuration], a - call CallBC -.skip - ret - -; for the following animations, these functions -; are run with the corresponding duration. -; this duration decides different effects, -; depending on which function runs -; and is decreased by one each time. -; when it is down to 0, the animation is done. - -screen_effect: MACRO - dw \1 ; function pointer - db \2 ; duration - db $00 ; padding -ENDM - -Data_1cc9f: ; 1cc9f (7:4c9f) -; function pointer, duration - screen_effect ShakeScreenX_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_X - screen_effect ShakeScreenX_Big, 32 ; DUEL_ANIM_BIG_SHAKE_X - screen_effect ShakeScreenY_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_Y - screen_effect ShakeScreenY_Big, 32 ; DUEL_ANIM_BIG_SHAKE_Y - screen_effect WhiteFlashScreen, 8 ; DUEL_ANIM_FLASH - screen_effect DistortScreen, 63 ; DUEL_ANIM_DISTORT - -; checks if screen animation duration is over -; and if so, loads the default update function -LoadDefaultScreenAnimationUpdateWhenFinished: ; 1ccb7 (7:4cb7) - ld a, [wScreenAnimDuration] - or a - ret nz - ; fallthrough - -; function called for the screen animation update when it is over -DefaultScreenAnimationUpdate: ; 1ccbc (7:4cbc) - ld a, $ff - ld [wd42a], a - call DisableInt_LYCoincidence - xor a - ldh [hSCX], a - ldh [rSCX], a - ldh [hSCY], a - ld hl, wScreenAnimUpdatePtr - ld [hl], LOW(DefaultScreenAnimationUpdate) - inc hl - ld [hl], HIGH(DefaultScreenAnimationUpdate) - ret - -; runs the screen update function set in wScreenAnimUpdatePtr -DoScreenAnimationUpdate: ; 1ccd4 (7:4cd4) - ld a, 1 - ld [wScreenAnimDuration], a - ld hl, wScreenAnimUpdatePtr - ld a, [hli] - ld h, [hl] - ld l, a - call CallHL2 - jr DefaultScreenAnimationUpdate - -ShakeScreenX_Small: ; 1cce4 (7:4ce4) - ld hl, SmallShakeOffsets - jr ShakeScreenX - -ShakeScreenX_Big: ; 1cce9 (7:4ce9) - ld hl, BigShakeOffsets - jr ShakeScreenX - -ShakeScreenX: ; 1ccee (7:4cee) - ld a, l - ld [wd4bc], a - ld a, h - ld [wd4bc + 1], a - - ld hl, wScreenAnimUpdatePtr - ld [hl], LOW(.update) - inc hl - ld [hl], HIGH(.update) - ret - -.update - call DecrementScreenAnimDuration - call UpdateShakeOffset - jp nc, LoadDefaultScreenAnimationUpdateWhenFinished - ldh a, [hSCX] - add [hl] - ldh [hSCX], a - jp LoadDefaultScreenAnimationUpdateWhenFinished - -ShakeScreenY_Small: ; 1cd10 (7:4d10) - ld hl, SmallShakeOffsets - jr ShakeScreenY - -ShakeScreenY_Big: ; 1cd15 (7:4d15) - ld hl, BigShakeOffsets - jr ShakeScreenY - -ShakeScreenY: ; 1cd1a (7:4d1a) - ld a, l - ld [wd4bc], a - ld a, h - ld [wd4bc + 1], a - ld hl, wScreenAnimUpdatePtr - ld [hl], LOW(.update) - inc hl - ld [hl], HIGH(.update) - ret - -.update - call DecrementScreenAnimDuration - call UpdateShakeOffset - jp nc, LoadDefaultScreenAnimationUpdateWhenFinished - ldh a, [hSCY] - add [hl] - ldh [hSCY], a - jp LoadDefaultScreenAnimationUpdateWhenFinished - -; get the displacement of the current frame -; depending on the value of wScreenAnimDuration -; returns carry if displacement was updated -UpdateShakeOffset: ; 1cd3c (7:4d3c) - ld hl, wd4bc - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wScreenAnimDuration] - cp [hl] - ret nc - inc hl - push hl - inc hl - ld a, l - ld [wd4bc], a - ld a, h - ld [wd4bc + 1], a - pop hl - scf - ret - -SmallShakeOffsets: ; 1cd55 (7:4d55) - db 21, 2 - db 17, -2 - db 13, 2 - db 9, -2 - db 5, 1 - db 1, -1 - -BigShakeOffsets: ; 1cd61 (7:4d61) - db 29, 4 - db 25, -4 - db 21, 4 - db 17, -4 - db 13, 3 - db 9, -3 - db 5, 2 - db 1, -2 - -DecrementScreenAnimDuration: ; 1cd71 (7:4d71) - ld hl, wScreenAnimDuration - dec [hl] - ret - -WhiteFlashScreen: ; 1cd76 (7:4d76) - ld hl, wScreenAnimUpdatePtr - ld [hl], LOW(.update) - inc hl - ld [hl], HIGH(.update) - ld a, [wBGP] - ld [wd4bc], a - ; backup the current background pals - ld hl, wBackgroundPalettesCGB - ld de, wTempBackgroundPalettesCGB - ld bc, 8 palettes - call CopyDataHLtoDE_SaveRegisters - ld de, PALRGB_WHITE - ld hl, wBackgroundPalettesCGB - ld bc, (8 palettes) / 2 - call FillMemoryWithDE - xor a - call SetBGP - call FlushAllPalettes - -.update - call DecrementScreenAnimDuration - ld a, [wScreenAnimDuration] - or a - ret nz - ; retrieve the previous background pals - ld hl, wTempBackgroundPalettesCGB - ld de, wBackgroundPalettesCGB - ld bc, 8 palettes - call CopyDataHLtoDE_SaveRegisters - ld a, [wd4bc] - call SetBGP - call FlushAllPalettes - jp DefaultScreenAnimationUpdate - -DistortScreen: ; 1cdc3 (7:4dc3) - ld hl, wScreenAnimUpdatePtr - ld [hl], LOW(.update) - inc hl - ld [hl], HIGH(.update) - xor a - ld [wApplyBGScroll], a - ld hl, wLCDCFunctionTrampoline + 1 - ld [hl], LOW(ApplyBackgroundScroll) - inc hl - ld [hl], HIGH(ApplyBackgroundScroll) - ld a, 1 - ld [wBGScrollMod], a - call EnableInt_LYCoincidence - -.update - ld a, [wScreenAnimDuration] - srl a - srl a - srl a - and %00000111 - ld c, a - ld b, $00 - ld hl, .BGScrollModData - add hl, bc - ld a, [hl] - ld [wBGScrollMod], a - call DecrementScreenAnimDuration - jp LoadDefaultScreenAnimationUpdateWhenFinished - -; each value is applied for 8 "ticks" of wScreenAnimDuration -; starting from the last and running backwards -.BGScrollModData - db 4, 3, 2, 1, 1, 1, 1, 2 - -Func_1ce03: ; 1ce03 (7:4e03) - cp DUEL_ANIM_158 - jr z, .asm_1ce17 - sub $96 - add a - ld c, a - ld b, $00 - ld hl, .pointer_table - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - jp Func_3bb5 - -.asm_1ce17 - ld a, [wDuelAnimDamage] - ld l, a - ld a, [wDuelAnimDamage + 1] - ld h, a - jp Func_3bb5 - -.pointer_table - dw Func_190f4 ; DUEL_ANIM_150 - dw PrintDamageText ; DUEL_ANIM_PRINT_DAMAGE - dw UpdateMainSceneHUD ; DUEL_ANIM_UPDATE_HUD - dw Func_191a3 ; DUEL_ANIM_153 - dw Func_191a3 ; DUEL_ANIM_154 - dw Func_191a3 ; DUEL_ANIM_155 - dw Func_191a3 ; DUEL_ANIM_156 - dw Func_191a3 ; DUEL_ANIM_157 - -INCLUDE "data/duel/animations/duel_animations.asm" - -; plays the Opening sequence, and handles player selection -; in the Title Screen and Start Menu -HandleTitleScreen: ; 1d078 (7:5078) -; if last selected item in Start Menu is 0 (Card Pop!) -; then skip straight to the Start Menu -; this makes it so that returning from Card Pop! -; doesn't play the Opening sequence - ld a, [wLastSelectedStartMenuItem] - or a - jr z, .start_menu - -.play_opening - ld a, MUSIC_STOP - call PlaySong - call Func_3ca0 - call PlayOpeningSequence - call LoadTitleScreenSprites - - xor a - ld [wd635], a - ld a, $3c - ld [wTitleScreenIgnoreInputCounter], a -.loop - call DoFrameIfLCDEnabled - call UpdateRNGSources - call AnimateRandomTitleScreenOrb - ld hl, wd635 - inc [hl] - call AssertSongFinished - or a - jr nz, .song_playing - ; reset back to the opening sequence - farcall Func_10ab4 - jr .play_opening - -.song_playing - ; should we ignore user input? - ld hl, wTitleScreenIgnoreInputCounter - ld a, [hl] - or a - jr z, .check_keys - ; ignore input, decrement the counter - dec [hl] - jr .loop - -.check_keys - ldh a, [hKeysPressed] - and A_BUTTON | START - jr z, .loop - ld a, SFX_02 - call PlaySFX - farcall Func_10ab4 - -.start_menu - call CheckIfHasSaveData - call HandleStartMenu - -; new game - ld a, [wStartMenuChoice] - cp START_MENU_NEW_GAME - jr nz, .continue_from_diary - call DeleteSaveDataForNewGame - jr c, HandleTitleScreen - jr .card_pop -.continue_from_diary - ld a, [wStartMenuChoice] - cp START_MENU_CONTINUE_FROM_DIARY - jr nz, .card_pop - call AskToContinueFromDiaryWithDuelData - jr c, HandleTitleScreen -.card_pop - ld a, [wStartMenuChoice] - cp START_MENU_CARD_POP - jr nz, .continue_duel - call ShowCardPopCGBDisclaimer - jr c, HandleTitleScreen -.continue_duel - call ResetDoFrameFunction - call Func_3ca0 - ret - -; updates wHasSaveData and wHasDuelSaveData -; depending on whether the save data is valid or not -CheckIfHasSaveData: ; 1d0fa (7:50fa) - farcall ValidateBackupGeneralSaveData - ld a, TRUE - jr c, .no_error - ld a, FALSE -.no_error - ld [wHasSaveData], a - cp $00 ; or a - jr z, .write_has_duel_data - bank1call ValidateSavedNonLinkDuelData - ld a, TRUE - jr nc, .write_has_duel_data - ld a, FALSE -.write_has_duel_data - ld [wHasDuelSaveData], a - farcall ValidateBackupGeneralSaveData - ret - -; handles printing the Start Menu -; and getting player input and choice -HandleStartMenu: ; 1d11c (7:511c) - ld a, MUSIC_PC_MAIN_MENU - call PlaySong - call DisableLCD - farcall Func_10000 - lb de, $30, $8f - call SetupText - call Func_3ca0 - xor a - ld [wLineSeparation], a - call .DrawPlayerPortrait - call .SetStartMenuParams - - ld a, $ff - ld [wTitleScreenIgnoreInputCounter], a - ld a, [wLastSelectedStartMenuItem] - cp $4 - jr c, .init_menu - ld a, [wHasSaveData] - or a - jr z, .init_menu - ld a, 1 ; start at second menu option -.init_menu - ld hl, wStartMenuParams - farcall InitAndPrintPauseMenu - farcall FlashWhiteScreen - -.wait_input - call DoFrameIfLCDEnabled - call UpdateRNGSources - call HandleMenuInput - push af - call PrintStartMenuDescriptionText - pop af - jr nc, .wait_input - ldh a, [hCurMenuItem] - cp e - jr nz, .wait_input - - ld [wLastSelectedStartMenuItem], a - ld a, [wHasSaveData] - or a - jr nz, .no_adjustment - ; New Game is 3rd option - ; but when there's no save data, - ; it's the 1st in menu list, so adjust it - inc e - inc e -.no_adjustment - ld a, e - ld [wStartMenuChoice], a - ret - -.SetStartMenuParams - ld hl, .StartMenuParams - ld de, wStartMenuParams - ld bc, .StartMenuParamsEnd - .StartMenuParams - call CopyDataHLtoDE - - ld e, 0 - ld a, [wHasSaveData] - or a - jr z, .get_text_id ; New Game - inc e - ld a, 2 - call .AddItems - ld a, [wHasDuelSaveData] - or a - jr z, .get_text_id ; Continue From Diary - inc e - ld a, 1 - call .AddItems - ; Continue Duel - -.get_text_id - sla e - ld d, $00 - ld hl, .StartMenuTextIDs - add hl, de - ; set text ID as Start Menu param - ld a, [hli] - ld [wStartMenuParams + 6], a - ld a, [hl] - ld [wStartMenuParams + 7], a - ret - -; adds c items to start menu list -; this means adding 2 units per item to the text box height -; and adding to the number of items -.AddItems - push bc - ld c, a - ; number of items in menu - ld a, [wStartMenuParams + 12] - add c - ld [wStartMenuParams + 12], a - ; height of text box - sla c - ld a, [wStartMenuParams + 3] - add c - ld [wStartMenuParams + 3], a - pop bc - ret - -.StartMenuParams - db 0, 0 ; start menu coords - db 14, 4 ; start menu text box dimensions - - db 2, 2 ; text alignment for InitTextPrinting - tx NewGameText - db $ff - - db 1, 2 ; cursor x, cursor y - db 2 ; y displacement between items - db 1 ; number of items - db SYM_CURSOR_R ; cursor tile number - db SYM_SPACE ; tile behind cursor - dw NULL ; function pointer if non-0 -.StartMenuParamsEnd - -.StartMenuTextIDs - tx NewGameText - tx CardPopContinueDiaryNewGameText - tx CardPopContinueDiaryNewGameContinueDuelText - -.DrawPlayerPortrait - lb bc, 14, 1 - farcall $4, DrawPlayerPortrait - ret - -; prints the description for the current selected item -; in the Start Menu in the text box -PrintStartMenuDescriptionText: ; 1d1e9 (7:51e9) - push hl - push bc - push de - ; don't print if it's already showing - ld a, [wCurMenuItem] - ld e, a - ld a, [wCurHighlightedStartMenuItem] - cp e - jr z, .skip - ld a, [wHasSaveData] - or a - jr nz, .has_data - ; New Game option is 3rd element - ; in function table, so add 2 - inc e - inc e -.has_data - - ld a, e - push af - lb de, 0, 10 - lb bc, 20, 8 - call DrawRegularTextBox - pop af - ld hl, .StartMenuDescriptionFunctionTable - call JumpToFunctionInTable -.skip - ld a, [wCurMenuItem] - ld [wCurHighlightedStartMenuItem], a - pop de - pop bc - pop hl - ret - -.StartMenuDescriptionFunctionTable - dw .CardPop - dw .ContinueFromDiary - dw .NewGame - dw .ContinueDuel - -.CardPop - lb de, 1, 12 - call InitTextPrinting - ldtx hl, WhenYouCardPopWithFriendText - call PrintTextNoDelay - ret - -.ContinueDuel - lb de, 1, 12 - call InitTextPrinting - ldtx hl, TheGameWillContinueFromThePointInTheDuelText - call PrintTextNoDelay - ret - -.NewGame - lb de, 1, 12 - call InitTextPrinting - ldtx hl, StartANewGameText - call PrintTextNoDelay - ret - -.ContinueFromDiary - ; get OW map name - ld a, [wCurOverworldMap] - add a - ld c, a - ld b, $00 - ld hl, OverworldMapNames - add hl, bc - ld a, [hli] - ld [wTxRam2 + 0], a - ld a, [hl] - ld [wTxRam2 + 1], a - - ; get medal count - ld a, [wMedalCount] - ld [wTxRam3 + 0], a - xor a - ld [wTxRam3 + 1], a - - ; print text - lb de, 1, 10 - call InitTextPrinting - ldtx hl, ContinueFromDiarySummaryText - call PrintTextNoDelay - - ld a, [wTotalNumCardsCollected] - ld d, a - ld a, [wTotalNumCardsToCollect] - ld e, a - ld bc, $90e - farcall Func_1024f - ld bc, $a10 - farcall Func_101df - ret - -; asks the player whether it's okay to delete -; the save data in order to create a new one -; if player answers "yes", delete it -DeleteSaveDataForNewGame: ; 1d289 (7:5289) -; exit if there no save data - ld a, [wHasSaveData] - or a - ret z - - call DisableLCD - farcall Func_10000 - call Func_3ca0 - farcall FlashWhiteScreen - call DoFrameIfLCDEnabled - ldtx hl, SavedDataAlreadyExistsText - call PrintScrollableText_NoTextBoxLabel - ldtx hl, OKToDeleteTheDataText - call YesOrNoMenuWithText - ret c ; quit if chose "no" - farcall InvalidateSaveData - ldtx hl, AllDataWasDeletedText - call PrintScrollableText_NoTextBoxLabel - or a - ret - -; asks the player if the game should resume -; from diary even though there is Duel save data -; returns carry if "no" was selected -AskToContinueFromDiaryWithDuelData: ; 1d2b8 (7:52b8) -; return if there's no duel save data - ld a, [wHasDuelSaveData] - or a - ret z - - call DisableLCD - farcall Func_10000 - call Func_3ca0 - farcall FlashWhiteScreen - call DoFrameIfLCDEnabled - ldtx hl, DataExistsWhenPowerWasTurnedOFFDuringDuelText - call PrintScrollableText_NoTextBoxLabel - ldtx hl, ContinueFromDiaryText - call YesOrNoMenuWithText - ret c - or a - ret - -; shows disclaimer for Card Pop! -; in case player is not playing in CGB -; return carry if disclaimer was shown -ShowCardPopCGBDisclaimer: ; 1d2dd (7:52dd) -; return if playing in CGB - ld a, [wConsole] - cp CONSOLE_CGB - ret z - - lb de, 0, 10 - lb bc, 20, 8 - call DrawRegularTextBox - lb de, 1,12 - call InitTextPrinting - ldtx hl, YouCanAccessCardPopOnlyWithGameBoyColorsText - call PrintTextNoDelay - lb bc, SYM_CURSOR_D, SYM_BOX_BOTTOM - lb de, 18, 17 - call SetCursorParametersForTextBox - call WaitForButtonAorB - scf - ret - -DrawPlayerPortraitAndPrintNewGameText: ; 1d306 (7:5306) - call DisableLCD - farcall Func_10a9b - farcall Func_10000 - call Func_3ca0 - ld hl, HandleAllSpriteAnimations - call SetDoFrameFunction - lb bc, 7, 3 - farcall $4, DrawPlayerPortrait - farcall Func_10af9 - call DoFrameIfLCDEnabled - ldtx hl, IsCrazyAboutPokemonAndPokemonCardCollectingText - call PrintScrollableText_NoTextBoxLabel - call ResetDoFrameFunction - call Func_3ca0 - ret - -PlayOpeningSequence: ; 1d335 (7:5335) - call DisableLCD - farcall Func_10a9b - farcall Func_10000 - call Func_3ca0 - ld hl, HandleAllSpriteAnimations - call SetDoFrameFunction - call LoadTitleScreenSprites - - ld a, LOW(OpeningSequence) - ld [wSequenceCmdPtr + 0], a - ld a, HIGH(OpeningSequence) - ld [wSequenceCmdPtr + 1], a - - xor a - ld [wd317], a - ld [wOpeningSequencePalsNeedUpdate], a - ld [wSequenceDelay], a - farcall FlashWhiteScreen - -.loop_cmds - call DoFrameIfLCDEnabled - call UpdateRNGSources - ldh a, [hKeysPressed] - and A_BUTTON | START - jr nz, .jump_to_title_screen - ld a, [wOpeningSequencePalsNeedUpdate] - or a - jr z, .no_pal_update - farcall Func_10d74 -.no_pal_update - call ExecuteOpeningSequenceCmd - ld a, [wSequenceDelay] - cp $ff - jr nz, .loop_cmds - jr .asm_1d39f - -.jump_to_title_screen - call AssertSongFinished - or a - jr nz, .asm_1d39f - call DisableLCD - ld a, MUSIC_TITLESCREEN - call PlaySong - lb bc, 0, 0 - ld a, SCENE_TITLE_SCREEN - call LoadScene - call OpeningSequenceEmptyFunc -.asm_1d39f - call Func_3ca0 - call .ShowPressStart - call EnableLCD - ret - -.ShowPressStart - ld a, SPRITE_PRESS_START - farcall CreateSpriteAndAnimBufferEntry - ld c, SPRITE_ANIM_COORD_X - call GetSpriteAnimBufferProperty - ld a, 48 - ld [hli], a ; x - ld a, 112 - ld [hl], a ; y - ld c, SPRITE_ANIM_190 - ld a, [wConsole] - cp CONSOLE_CGB - jr nz, .asm_1d3c5 - ld c, SPRITE_ANIM_191 -.asm_1d3c5 - ld a, c - ld bc, 60 - farcall Func_12ac9 - ret - -LoadTitleScreenSprites: ; 1d3ce (7:53ce) - xor a - ld [wd4ca], a - ld [wd4cb], a - ld a, PALETTE_30 - farcall LoadPaletteData - - ld bc, 0 - ld de, wTitleScreenSprites -.loop_load_sprites - push bc - push de - ld hl, .TitleScreenSpriteList - add hl, bc - ld a, [hl] - farcall CreateSpriteAndAnimBufferEntry - ld a, [wWhichSprite] - ld [de], a - call GetFirstSpriteAnimBufferProperty - inc hl - ld a, [hl] ; SPRITE_ANIM_ATTRIBUTES - or c - ld [hl], a - pop de - pop bc - inc de - inc c - ld a, c - cp $7 - jr c, .loop_load_sprites - ret - -.TitleScreenSpriteList - db SPRITE_GRASS - db SPRITE_FIRE - db SPRITE_WATER - db SPRITE_COLORLESS - db SPRITE_LIGHTNING - db SPRITE_PSYCHIC - db SPRITE_FIGHTING - -; TODO place in main.asm when possible -INCLUDE "engine/sequences/opening_sequence_commands.asm" -INCLUDE "data/sequences/opening_sequence.asm" - -; once every 63 frames randomly choose an orb sprite -; to animate, i.e. circle around the screen -AnimateRandomTitleScreenOrb: ; 1d614 (7:5614) - ld a, [wConsole] - cp CONSOLE_CGB - call z, .UpdateSpriteAttributes - ld a, [wd635] - and 63 - ret nz ; don't pick an orb now - -.pick_orb - ld a, $7 - call Random - ld c, a - ld b, $00 - ld hl, wTitleScreenSprites - add hl, bc - ld a, [hl] - ld [wWhichSprite], a - farcall GetSpriteAnimCounter - cp $ff - jr nz, .pick_orb - - ld c, SPRITE_ANIM_ATTRIBUTES - call GetSpriteAnimBufferProperty - ld a, [wConsole] - cp CONSOLE_CGB - jr nz, .set_coords - set SPRITE_ANIM_FLAG_UNSKIPPABLE, [hl] - -.set_coords - inc hl - ld a, 248 - ld [hli], a ; SPRITE_ANIM_COORD_X - ld a, 14 - ld [hl], a ; SPRITE_ANIM_COORD_Y - ld a, [wConsole] - cp CONSOLE_CGB - ld a, SPRITE_ANIM_215 - jr nz, .start_anim - ld a, SPRITE_ANIM_216 -.start_anim - farcall StartSpriteAnimation - ret - -.UpdateSpriteAttributes - ld c, $7 - ld de, wTitleScreenSprites -.loop_orbs - push bc - ld a, [de] - ld [wWhichSprite], a - ld c, SPRITE_ANIM_COORD_X - call GetSpriteAnimBufferProperty - ld a, [hld] - cp 152 - jr nz, .skip - res SPRITE_ANIM_FLAG_UNSKIPPABLE, [hl] -.skip - pop bc - inc de - dec c - jr nz, .loop_orbs - ret - -; unreferenced -; shows Copyright information for 300 frames -; or until Start button is pressed -Func_1d67b: ; 1d67b (7:567b) - call DisableLCD - farcall Func_10a9b - farcall Func_10000 - ld bc, $0 - ld a, SCENE_COPYRIGHT - call LoadScene - farcall Func_10af9 - ld bc, 300 -.loop_frame - push bc - call DoFrameIfLCDEnabled - call UpdateRNGSources - pop bc - ldh a, [hKeysPressed] - and START - jr nz, .exit - dec bc - ld a, b - or c - jr nz, .loop_frame -.exit - farcall Func_10ab4 - ret - -Credits_1d6ad: ; 1d6ad (7:56ad) - ld a, MUSIC_STOP - call PlaySong - call Func_1d705 - call AddAllMastersToMastersBeatenList - xor a - ld [wOWMapEvents + 1], a - ld a, MUSIC_CREDITS - call PlaySong - farcall FlashWhiteScreen - call SetCreditsSequenceCmdPtr -.asm_1d6c8 - call DoFrameIfLCDEnabled - call Func_1d765 - call ExecuteCreditsSequenceCmd - ld a, [wSequenceDelay] - cp $ff - jr nz, .asm_1d6c8 - call WaitForSongToFinish - ld a, $8 - farcall Func_12863 - ld a, MUSIC_STOP - call PlaySong - farcall Func_10ab4 - call Func_3ca4 - call Set_WD_off - call Func_1d758 - call EnableLCD - call DoFrameIfLCDEnabled - call DisableLCD - ld hl, wLCDC - set 1, [hl] - call ResetDoFrameFunction - ret - -Func_1d705: ; 1d705 (7:5705) - call DisableLCD - farcall Func_10a9b - call Func_3ca0 - farcall Func_10000 - call Func_1d7ee - ld hl, Func_3e31 - call SetDoFrameFunction - call .Func_1d720 ; can be fallthrough - ret - -.Func_1d720 - ld a, $91 - ld [wd647], a - ld [wd649], a - ld a, $01 - ld [wd648], a - ld [wd64a], a - call Func_1d765 - call Set_WD_on - call .Func_1d73a ; can bee fallthrough - ret - -.Func_1d73a - push hl - di - xor a - ld [wd657], a - ld hl, wLCDCFunctionTrampoline + 1 - ld [hl], LOW(Func_3e44) - inc hl - ld [hl], HIGH(Func_3e44) - ei - - ld hl, rSTAT - set STAT_LYC, [hl] - xor a - ldh [rLYC], a - ld hl, rIE - set INT_LCD_STAT, [hl] - pop hl - ret - -Func_1d758: ; 1d758 (7:5758) - push hl - ld hl, rSTAT - res STAT_LYC, [hl] - ld hl, rIE - res INT_LCD_STAT, [hl] - pop hl - ret - -Func_1d765: ; 1d765 (7:5765) - push hl - push bc - push de - xor a - ldh [hWY], a - - ld hl, wd659 - ld de, wd65f - ld a, [wd648] - or a - jr nz, .asm_1d785 - ld a, $a7 - ldh [hWX], a - ld [hli], a - push hl - ld hl, wLCDC - set 1, [hl] - pop hl - jr .asm_1d7e2 - -.asm_1d785 - ld a, [wd647] - or a - jr z, .asm_1d79e - dec a - ld [de], a - inc de - ld a, $a7 - ldh [hWX], a - ld [hli], a - push hl - ld hl, wLCDC - set 1, [hl] - pop hl - ld a, $07 - jr .asm_1d7a9 - -.asm_1d79e - ld a, $07 - ldh [hWX], a - push hl - ld hl, wLCDC - res 1, [hl] - pop hl -.asm_1d7a9 - ld [hli], a - ld a, [wd647] - dec a - ld c, a - ld a, [wd648] - add c - ld c, a - ld a, [wd649] - dec a - cp c - jr c, .asm_1d7d4 - jr z, .asm_1d7d4 - ld a, c - ld [de], a - inc de - push af - ld a, $a7 - ld [hli], a - pop bc - ld a, [wd64a] - or a - jr z, .asm_1d7e2 - ld a, [wd649] - dec a - ld [de], a - inc de - ld a, $07 - ld [hli], a - -.asm_1d7d4 - ld a, [wd649] - dec a - ld c, a - ld a, [wd64a] - add c - ld [de], a - inc de - ld a, $a7 - ld [hli], a -.asm_1d7e2 - ld a, $ff - ld [de], a - ld a, $01 - ld [wd665], a - pop de - pop bc - pop hl - ret - -Func_1d7ee: ; 1d7ee (7:57ee) - xor a - lb de, 0, 32 - lb bc, 20, 18 - lb hl, 0, 0 - call FillRectangle - ret diff --git a/src/engine/bank20.asm b/src/engine/bank20.asm index a8c03cc..bc71842 100644 --- a/src/engine/bank20.asm +++ b/src/engine/bank20.asm @@ -2,7 +2,7 @@ ; according to its Map Header configurations ; if it's the Overworld Map, also prints the map name ; and sets up the volcano animation -LoadMapGfxAndPermissions: ; 80000 (20:4000) +LoadMapGfxAndPermissions: call ClearSRAMBGMaps xor a ld [wTextBoxFrameType], a @@ -20,7 +20,7 @@ LoadMapGfxAndPermissions: ; 80000 (20:4000) ; reloads the map tiles and permissions ; after a textbox has been closed -ReloadMapAfterTextClose: ; 80028 (20:4028) +ReloadMapAfterTextClose: call ClearSRAMBGMaps lb bc, 0, 0 call LoadTilemap_ToSRAM @@ -29,7 +29,7 @@ ReloadMapAfterTextClose: ; 80028 (20:4028) farcall Func_c3ee ret -LoadMapTilesAndPals: ; 8003d (20:403d) +LoadMapTilesAndPals: farcall LoadMapHeader farcall SetSGB2AndSGB3MapPalette lb bc, 0, 0 @@ -58,14 +58,14 @@ LoadMapTilesAndPals: ; 8003d (20:403d) ; loads the BG map corresponding to wCurTilemap to SRAM ; bc = starting coordinates -LoadTilemap_ToSRAM: ; 80077 (20:4077) +LoadTilemap_ToSRAM: ld a, TRUE ld [wWriteBGMapToSRAM], a jr LoadTilemap ; loads the BG map corresponding to wCurTilemap to VRAM ; bc = starting coordinates -LoadTilemap_ToVRAM: ; 8007e (20:407e) +LoadTilemap_ToVRAM: xor a ; FALSE ld [wWriteBGMapToSRAM], a ; fallthrough @@ -74,7 +74,7 @@ LoadTilemap_ToVRAM: ; 8007e (20:407e) ; either loads them in VRAM or SRAM, ; depending on wWriteBGMapToSRAM ; bc = starting coordinates -LoadTilemap: ; 80082 (20:4082) +LoadTilemap: push hl push bc push de @@ -213,7 +213,7 @@ LoadTilemap: ; 80082 (20:4082) pop hl ret -Func_80148: ; 80148 (20:4148) +Func_80148: ld a, [wd291] or a ret z @@ -255,7 +255,7 @@ Func_80148: ; 80148 (20:4148) ; if SRAM is the target address to copy, ; copies data to sGfxBuffer0 or sGfxBuffer1 ; for VRAM0 or VRAM1 respectively -CopyBGDataToVRAMOrSRAM: ; 8016e (20:416e) +CopyBGDataToVRAMOrSRAM: ld a, [wWriteBGMapToSRAM] or a jp z, SafeCopyDataHLtoDE @@ -296,7 +296,7 @@ CopyBGDataToVRAMOrSRAM: ; 8016e (20:416e) ; safely copies $20 bytes at a time ; sGfxBuffer0 -> v0BGMap0 ; sGfxBuffer1 -> v0BGMap1 (if in CGB) -SafelyCopyBGMapFromSRAMToVRAM: ; 801a1 (20:41a1) +SafelyCopyBGMapFromSRAMToVRAM: push hl push bc push de @@ -348,7 +348,7 @@ SafelyCopyBGMapFromSRAMToVRAM: ; 801a1 (20:41a1) ret ; clears sGfxBuffer0 and sGfxBuffer1 -ClearSRAMBGMaps: ; 801f1 (20:41f1) +ClearSRAMBGMaps: push hl push bc ldh a, [hBankSRAM] @@ -368,10 +368,10 @@ ClearSRAMBGMaps: ; 801f1 (20:41f1) ; l - map data offset (0,2,4,6,8 for banks 0,1,2,3,4) ; a - map index (inside of the given bank) -GetMapDataPointer: ; 8020f (20:420f) +GetMapDataPointer: push bc push af - ld bc, MapDataPointers + ld bc, GfxTablePointers ld h, $0 add hl, bc ld c, [hl] @@ -389,18 +389,17 @@ GetMapDataPointer: ; 8020f (20:420f) ret ; Loads a pointer from [hl] to wTempPointer. Adds the graphics bank offset ($20) -LoadGraphicsPointerFromHL: ; 80229 (20:4229) +LoadGraphicsPointerFromHL: ld a, [hli] ld [wTempPointer], a ld a, [hli] ld [wTempPointer + 1], a ld a, [hli] - add BANK(MapDataPointers) + add BANK(GfxTablePointers) ld [wTempPointerBank], a ret -; unreferenced? -Func_80238: ; 80238 (20:4238) +Func_80238: ; unreferenced push hl ld l, $2 ; Tilesets ld a, [wCurTileset] @@ -423,7 +422,7 @@ Func_80238: ; 80238 (20:4238) ; a = sprite index within the data map ; output: ; a = number of tiles in sprite -Func_8025b: ; 8025b (20:425b) +Func_8025b: push hl ld l, $4 ; Sprites call GetMapDataPointer @@ -440,17 +439,17 @@ Func_8025b: ; 8025b (20:425b) ; loads graphics data pointed by wTempPointer in wTempPointerBank ; to the VRAM bank according to wd4cb, in address pointed by wVRAMPointer -LoadGfxDataFromTempPointerToVRAMBank: ; 80274 (20:4274) +LoadGfxDataFromTempPointerToVRAMBank: call GetTileOffsetPointerAndSwitchVRAM jr LoadGfxDataFromTempPointer -LoadGfxDataFromTempPointerToVRAMBank_Tiles0ToTiles2: ; 80279 (20:4279) +LoadGfxDataFromTempPointerToVRAMBank_Tiles0ToTiles2: call GetTileOffsetPointerAndSwitchVRAM_Tiles0ToTiles2 ; fallthrough ; loads graphics data pointed by wTempPointer in wTempPointerBank ; to wVRAMPointer -LoadGfxDataFromTempPointer: ; 8027c (20:427c) +LoadGfxDataFromTempPointer: push hl push bc push de @@ -478,7 +477,7 @@ LoadGfxDataFromTempPointer: ; 8027c (20:427c) ; convert wVRAMTileOffset to address in VRAM ; and stores it in wVRAMPointer ; switches VRAM according to wd4cb -GetTileOffsetPointerAndSwitchVRAM: ; 8029f (20:429f) +GetTileOffsetPointerAndSwitchVRAM: ; address of the tile offset is wVRAMTileOffset * $10 + $8000 ld a, [wVRAMTileOffset] swap a @@ -502,7 +501,7 @@ GetTileOffsetPointerAndSwitchVRAM: ; 8029f (20:429f) ; switches VRAM according to wd4cb ; then changes wVRAMPointer such that ; addresses to Tiles0 is changed to Tiles2 -GetTileOffsetPointerAndSwitchVRAM_Tiles0ToTiles2: ; 802bb (20:42bb) +GetTileOffsetPointerAndSwitchVRAM_Tiles0ToTiles2: ld a, [wVRAMTileOffset] push af xor $80 ; toggle top bit @@ -516,7 +515,7 @@ GetTileOffsetPointerAndSwitchVRAM_Tiles0ToTiles2: ; 802bb (20:42bb) ret ; loads tileset gfx to VRAM corresponding to wCurTileset -LoadTilesetGfx: ; 802d4 (20:42d4) +LoadTilesetGfx: push hl ld l, $02 ; Tilesets ld a, [wCurTileset] @@ -679,7 +678,7 @@ LoadTilesetGfx: ; 802d4 (20:42d4) ret ; gets pointer to BG map with ID from wCurTilemap -Func_803b9: ; 803b9 (20:43b9) +Func_803b9: ld l, $00 ; Tilemaps ld a, [wCurTilemap] call GetMapDataPointer @@ -691,7 +690,7 @@ Func_803b9: ; 803b9 (20:43b9) ; sets BGP in wLoadedPalData (if any) ; then loads the rest of the palette data ; a = palette index to load -SetBGPAndLoadedPal: ; 803c9 (20:43c9) +SetBGPAndLoadedPal: push hl push bc push de @@ -724,7 +723,7 @@ SetBGPAndLoadedPal: ; 803c9 (20:43c9) ; b = palette index ; c = palette size ; hl = palette data to copy -LoadPaletteDataFromHL: ; 803ec (20:43ec) +LoadPaletteDataFromHL: push hl push bc push de @@ -768,7 +767,7 @@ LoadPaletteDataFromHL: ; 803ec (20:43ec) ret ; loads palette index a -LoadPaletteData: ; 80418 (20:4418) +LoadPaletteData: push hl push bc push de @@ -824,7 +823,7 @@ LoadPaletteData: ; 80418 (20:4418) ret ; copies palette data of index in a to wLoadedPalData -LoadPaletteDataToBuffer: ; 80456 (20:4456) +LoadPaletteDataToBuffer: push hl push bc push de @@ -853,14 +852,14 @@ LoadPaletteDataToBuffer: ; 80456 (20:4456) pop hl ret -ClearNumLoadedFramesetSubgroups: ; 8047b (20:447b) +ClearNumLoadedFramesetSubgroups: xor a ld [wNumLoadedFramesetSubgroups], a ret ; for the current map, process the animation ; data of its corresponding OW tiles -DoMapOWFrame: ; 80480 (20:4480) +DoMapOWFrame: push hl push bc ld a, [wCurMap] @@ -887,7 +886,7 @@ DoMapOWFrame: ; 80480 (20:4480) ret ; processes the OW frameset pointed by hl -ProcessOWFrameset: ; 804a2 (20:44a2) +ProcessOWFrameset: push hl push bc ld a, l @@ -920,7 +919,7 @@ ProcessOWFrameset: ; 804a2 (20:44a2) ; for each of the loaded frameset subgroups ; load their tiles and advance their durations -DoLoadedFramesetSubgroupsFrame: ; 804d8 (20:44d8) +DoLoadedFramesetSubgroupsFrame: ld a, [wNumLoadedFramesetSubgroups] or a ret z @@ -941,7 +940,7 @@ DoLoadedFramesetSubgroupsFrame: ; 804d8 (20:44d8) ; from subgroup in register c, get ; from OW frameset in hl its corresponding ; data offset and duration -GetOWFramesetSubgroupData: ; 804f3 (20:44f3) +GetOWFramesetSubgroupData: push hl push bc push hl @@ -965,7 +964,7 @@ GetOWFramesetSubgroupData: ; 804f3 (20:44f3) ; if wCurOWFrameDuration == 0, processes next frame for OW map ; by loading the tiles corresponding to current frame ; if wCurOWFrameDuration != 0, then simply decrements it and returns -LoadOWFrameTiles: ; 8050c (20:450c) +LoadOWFrameTiles: ld a, [wCurOWFrameDuration] or a jr z, .next_frame @@ -1083,7 +1082,7 @@ LoadOWFrameTiles: ; 8050c (20:450c) ret ; fills wOWFramesetSubgroups with $ff -ClearOWFramesetSubgroups: ; 8059a (20:459a) +ClearOWFramesetSubgroups: push hl push bc ld hl, wOWFramesetSubgroups @@ -1100,7 +1099,7 @@ ClearOWFramesetSubgroups: ; 8059a (20:459a) ; copies wOWFramesetSubgroups + 2*c ; to wCurOWFrameDataOffset and wCurOWFrameDuration ; also returns its current duration -LoadOWFramesetSubgroup: ; 805aa (20:45aa) +LoadOWFramesetSubgroup: push hl push bc ld hl, wOWFramesetSubgroups @@ -1119,7 +1118,7 @@ LoadOWFramesetSubgroup: ; 805aa (20:45aa) ; copies wCurOWFrameDataOffset and wCurOWFrameDuration ; to wOWFramesetSubgroups + 2*c -StoreOWFramesetSubgroup: ; 805c1 (20:45c1) +StoreOWFramesetSubgroup: push hl push bc ld hl, wOWFramesetSubgroups @@ -1137,7 +1136,7 @@ StoreOWFramesetSubgroup: ; 805c1 (20:45c1) INCLUDE "data/map_ow_framesets.asm" ; clears wOWMapEvents -Func_80b7a: ; 80b7a (20:4b7a) +Func_80b7a: push hl push bc ld c, $b @@ -1152,7 +1151,7 @@ Func_80b7a: ; 80b7a (20:4b7a) ret ; a = MAP_EVENT_* constant -Func_80b89: ; 80b89 (20:4b89) +Func_80b89: push hl push bc push af @@ -1173,14 +1172,14 @@ Func_80b89: ; 80b89 (20:4b89) pop hl ret -Func_80ba4: ; 80ba4 (20:4ba4) +Func_80ba4: push af xor a ld [wWriteBGMapToSRAM], a pop af ; fallthrough -Func_80baa: ; 80baa (20:4baa) +Func_80baa: push hl push bc push de @@ -1294,10 +1293,9 @@ Func_80baa: ; 80baa (20:4baa) .ChallengeMachine db $0a, $00, TILEMAP_CHALLENGE_MACHINE_MAP_EVENT, TILEMAP_CHALLENGE_MACHINE_MAP_EVENT_CGB - ret ; unreferenced stray ret? + ret ; stray ret -; unreferenced? -Func_80c64: ; 80c64 (20:4c64) +Func_80c64: ; unreferenced ld a, [wLineSeparation] push af ld a, $01 ; no line separator @@ -1346,9 +1344,8 @@ Func_80c64: ; 80c64 (20:4c64) db SYM_SPACE ; tile behind cursor dw NULL ; function pointer if non-0 -; unreferenced? ; fills Tiles0 with random bytes -Func_80cc3: ; 80cc3 (20:4cc3) +Func_80cc3: ; unreferenced call DisableLCD ld hl, v0Tiles0 ld bc, $800 @@ -1361,12 +1358,12 @@ Func_80cc3: ; 80cc3 (20:4cc3) jr nz, .loop ret -Func_80cd6: ; 80cd6 (20:4cd6) +Func_80cd6: ret ; seems to be used to look at each OW NPC sprites ; with functions to rotate NPC and animate them -Func_80cd7: ; 80cd7 (20:4cd7) +Func_80cd7: call DisableLCD call EmptyScreen call Func_3ca4 @@ -1557,1118 +1554,8 @@ Func_80cd7: ; 80cd7 (20:4cd7) db SPRITE_OW_GRANNY, SPRITE_ANIM_LIGHT_NPC_UP, SPRITE_ANIM_YELLOW_NPC_UP ; $2b db SPRITE_OW_AMY, SPRITE_ANIM_SGB_AMY_LAYING, SPRITE_ANIM_CGB_AMY_LAYING ; $2c -SpriteNullAnimationPointer: ; 80e5a (20:4e5a) +SpriteNullAnimationPointer: dw SpriteNullAnimationFrame SpriteNullAnimationFrame: db 0 - -; might be closer to "screen specific data" than map data -MapDataPointers: ; 80e5d (20:4e5d) - dw Tilemaps - dw Tilesets - dw Sprites - dw SpriteAnimations - dw Palettes - -; \1 = pointer -; \2 = tileset -tilemap: MACRO - dwb \1, BANK(\1) - BANK(Tilemaps) - db \2 -ENDM - -Tilemaps: ; 80e67 (20:4e67) - tilemap OverworldMapTilemap, TILESET_OVERWORLD_MAP ; TILEMAP_OVERWORLD_MAP - tilemap OverworldMapCGBTilemap, TILESET_OVERWORLD_MAP ; TILEMAP_OVERWORLD_MAP_CGB - tilemap MasonLaboratoryTilemap, TILESET_MASON_LABORATORY ; TILEMAP_MASON_LABORATORY - tilemap MasonLaboratoryCGBTilemap, TILESET_MASON_LABORATORY ; TILEMAP_MASON_LABORATORY_CGB - tilemap ChallengeMachineMapEventTilemap, TILESET_MASON_LABORATORY ; TILEMAP_CHALLENGE_MACHINE_MAP_EVENT - tilemap ChallengeMachineMapEventCGBTilemap,TILESET_MASON_LABORATORY ; TILEMAP_CHALLENGE_MACHINE_MAP_EVENT_CGB - tilemap DeckMachineRoomTilemap, TILESET_MASON_LABORATORY ; TILEMAP_DECK_MACHINE_ROOM - tilemap DeckMachineRoomCGBTilemap, TILESET_MASON_LABORATORY ; TILEMAP_DECK_MACHINE_ROOM_CGB - tilemap DeckMachineMapEventTilemap, TILESET_MASON_LABORATORY ; TILEMAP_DECK_MACHINE_MAP_EVENT - tilemap DeckMachineMapEventCGBTilemap, TILESET_MASON_LABORATORY ; TILEMAP_DECK_MACHINE_MAP_EVENT_CGB - tilemap IshiharaTilemap, TILESET_ISHIHARA ; TILEMAP_ISHIHARA - tilemap IshiharaCGBTilemap, TILESET_ISHIHARA ; TILEMAP_ISHIHARA_CGB - tilemap FightingClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_FIGHTING_CLUB_ENTRANCE - tilemap FightingClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_FIGHTING_CLUB_ENTRANCE_CGB - tilemap RockClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_ROCK_CLUB_ENTRANCE - tilemap RockClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_ROCK_CLUB_ENTRANCE_CGB - tilemap WaterClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_WATER_CLUB_ENTRANCE - tilemap WaterClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_WATER_CLUB_ENTRANCE_CGB - tilemap LightningClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_LIGHTNING_CLUB_ENTRANCE - tilemap LightningClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_LIGHTNING_CLUB_ENTRANCE_CGB - tilemap GrassClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_GRASS_CLUB_ENTRANCE - tilemap GrassClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_GRASS_CLUB_ENTRANCE_CGB - tilemap PsychicClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_PSYCHIC_CLUB_ENTRANCE - tilemap PsychicClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_PSYCHIC_CLUB_ENTRANCE_CGB - tilemap ScienceClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_SCIENCE_CLUB_ENTRANCE - tilemap ScienceClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_SCIENCE_CLUB_ENTRANCE_CGB - tilemap FireClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_FIRE_CLUB_ENTRANCE - tilemap FireClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_FIRE_CLUB_ENTRANCE_CGB - tilemap ChallengeHallEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_CHALLENGE_HALL_ENTRANCE - tilemap ChallengeHallEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_CHALLENGE_HALL_ENTRANCE_CGB - tilemap ClubLobbyTilemap, TILESET_CLUB_LOBBY ; TILEMAP_CLUB_LOBBY - tilemap ClubLobbyCGBTilemap, TILESET_CLUB_LOBBY ; TILEMAP_CLUB_LOBBY_CGB - tilemap FightingClubTilemap, TILESET_FIGHTING_CLUB ; TILEMAP_FIGHTING_CLUB - tilemap FightingClubCGBTilemap, TILESET_FIGHTING_CLUB ; TILEMAP_FIGHTING_CLUB_CGB - tilemap RockClubTilemap, TILESET_ROCK_CLUB ; TILEMAP_ROCK_CLUB - tilemap RockClubCGBTilemap, TILESET_ROCK_CLUB ; TILEMAP_ROCK_CLUB_CGB - tilemap WaterClubTilemap, TILESET_WATER_CLUB ; TILEMAP_WATER_CLUB - tilemap WaterClubCGBTilemap, TILESET_WATER_CLUB ; TILEMAP_WATER_CLUB_CGB - tilemap LightningClubTilemap, TILESET_LIGHTNING_CLUB ; TILEMAP_LIGHTNING_CLUB - tilemap LightningClubCGBTilemap, TILESET_LIGHTNING_CLUB ; TILEMAP_LIGHTNING_CLUB_CGB - tilemap GrassClubTilemap, TILESET_GRASS_CLUB ; TILEMAP_GRASS_CLUB - tilemap GrassClubCGBTilemap, TILESET_GRASS_CLUB ; TILEMAP_GRASS_CLUB_CGB - tilemap PsychicClubTilemap, TILESET_PSYCHIC_CLUB ; TILEMAP_PSYCHIC_CLUB - tilemap PsychicClubCGBTilemap, TILESET_PSYCHIC_CLUB ; TILEMAP_PSYCHIC_CLUB_CGB - tilemap ScienceClubTilemap, TILESET_SCIENCE_CLUB ; TILEMAP_SCIENCE_CLUB - tilemap ScienceClubCGBTilemap, TILESET_SCIENCE_CLUB ; TILEMAP_SCIENCE_CLUB_CGB - tilemap FireClubTilemap, TILESET_FIRE_CLUB ; TILEMAP_FIRE_CLUB - tilemap FireClubCGBTilemap, TILESET_FIRE_CLUB ; TILEMAP_FIRE_CLUB_CGB - tilemap ChallengeHallTilemap, TILESET_CHALLENGE_HALL ; TILEMAP_CHALLENGE_HALL - tilemap ChallengeHallCGBTilemap, TILESET_CHALLENGE_HALL ; TILEMAP_CHALLENGE_HALL_CGB - tilemap PokemonDomeEntranceTilemap, TILESET_POKEMON_DOME_ENTRANCE ; TILEMAP_POKEMON_DOME_ENTRANCE - tilemap PokemonDomeEntranceCGBTilemap, TILESET_POKEMON_DOME_ENTRANCE ; TILEMAP_POKEMON_DOME_ENTRANCE_CGB - tilemap PokemonDomeDoorMapEventTilemap, TILESET_POKEMON_DOME_ENTRANCE ; TILEMAP_POKEMON_DOME_DOOR_MAP_EVENT - tilemap PokemonDomeDoorMapEventCGBTilemap, TILESET_POKEMON_DOME_ENTRANCE ; TILEMAP_POKEMON_DOME_DOOR_MAP_EVENT_CGB - tilemap PokemonDomeTilemap, TILESET_POKEMON_DOME ; TILEMAP_POKEMON_DOME - tilemap PokemonDomeCGBTilemap, TILESET_POKEMON_DOME ; TILEMAP_POKEMON_DOME_CGB - tilemap HallOfHonorDoorMapEventTilemap, TILESET_POKEMON_DOME ; TILEMAP_HALL_OF_HONOR_DOOR_MAP_EVENT - tilemap HallOfHonorDoorMapEventCGBTilemap, TILESET_POKEMON_DOME ; TILEMAP_HALL_OF_HONOR_DOOR_MAP_EVENT_CGB - tilemap HallOfHonorTilemap, TILESET_HALL_OF_HONOR ; TILEMAP_HALL_OF_HONOR - tilemap HallOfHonorCGBTilemap, TILESET_HALL_OF_HONOR ; TILEMAP_HALL_OF_HONOR_CGB - tilemap CardPopCGBTilemap, TILESET_CARD_POP ; TILEMAP_CARD_POP_CGB - tilemap CardPopTilemap, TILESET_CARD_POP ; TILEMAP_CARD_POP - tilemap GrassMedalTilemap, TILESET_MEDAL ; TILEMAP_GRASS_MEDAL - tilemap ScienceMedalTilemap, TILESET_MEDAL ; TILEMAP_SCIENCE_MEDAL - tilemap FireMedalTilemap, TILESET_MEDAL ; TILEMAP_FIRE_MEDAL - tilemap WaterMedalTilemap, TILESET_MEDAL ; TILEMAP_WATER_MEDAL - tilemap LightningMedalTilemap, TILESET_MEDAL ; TILEMAP_LIGHTNING_MEDAL - tilemap FightingMedalTilemap, TILESET_MEDAL ; TILEMAP_FIGHTING_MEDAL - tilemap RockMedalTilemap, TILESET_MEDAL ; TILEMAP_ROCK_MEDAL - tilemap PsychicMedalTilemap, TILESET_MEDAL ; TILEMAP_PSYCHIC_MEDAL - tilemap GameBoyLinkCGBTilemap, TILESET_GAMEBOY_LINK ; TILEMAP_GAMEBOY_LINK_CGB - tilemap GameBoyLinkTilemap, TILESET_GAMEBOY_LINK ; TILEMAP_GAMEBOY_LINK - tilemap GameBoyLinkConnectingCGBTilemap, TILESET_GAMEBOY_LINK ; TILEMAP_GAMEBOY_LINK_CONNECTING_CGB - tilemap GameBoyLinkConnectingTilemap, TILESET_GAMEBOY_LINK ; TILEMAP_GAMEBOY_LINK_CONNECTING - tilemap GameBoyPrinterCGBTilemap, TILESET_GAMEBOY_PRINTER ; TILEMAP_GAMEBOY_PRINTER_CGB - tilemap GameBoyPrinterTilemap, TILESET_GAMEBOY_PRINTER ; TILEMAP_GAMEBOY_PRINTER - tilemap ColosseumTilemap, TILESET_COLOSSEUM_1 ; TILEMAP_COLOSSEUM - tilemap ColosseumCGBTilemap, TILESET_COLOSSEUM_2 ; TILEMAP_COLOSSEUM_CGB - tilemap EvolutionTilemap, TILESET_EVOLUTION_1 ; TILEMAP_EVOLUTION - tilemap EvolutionCGBTilemap, TILESET_EVOLUTION_2 ; TILEMAP_EVOLUTION_CGB - tilemap MysteryTilemap, TILESET_MYSTERY_1 ; TILEMAP_MYSTERY - tilemap MysteryCGBTilemap, TILESET_MYSTERY_2 ; TILEMAP_MYSTERY_CGB - tilemap LaboratoryTilemap, TILESET_LABORATORY_1 ; TILEMAP_LABORATORY - tilemap LaboratoryCGBTilemap, TILESET_LABORATORY_2 ; TILEMAP_LABORATORY_CGB - tilemap CharizardIntroTilemap, TILESET_CHARIZARD_INTRO_1 ; TILEMAP_CHARIZARD_INTRO - tilemap CharizardIntroCGBTilemap, TILESET_CHARIZARD_INTRO_2 ; TILEMAP_CHARIZARD_INTRO_CGB - tilemap ScytherIntroTilemap, TILESET_SCYTHER_INTRO_1 ; TILEMAP_SCYTHER_INTRO - tilemap ScytherIntroCGBTilemap, TILESET_SCYTHER_INTRO_2 ; TILEMAP_SCYTHER_INTRO_CGB - tilemap AerodactylIntroTilemap, TILESET_AERODACTYL_INTRO_1 ; TILEMAP_AERODACTYL_INTRO - tilemap AerodactylIntroCGBTilemap, TILESET_AERODACTYL_INTRO_2 ; TILEMAP_AERODACTYL_INTRO_CGB - tilemap JapaneseTitleScreenTilemap, TILESET_JAPANESE_TITLE_SCREEN ; TILEMAP_JAPANESE_TITLE_SCREEN - tilemap JapaneseTitleScreenCGBTilemap, TILESET_JAPANESE_TITLE_SCREEN_CGB ; TILEMAP_JAPANESE_TITLE_SCREEN_CGB - tilemap SolidTiles1Tilemap, TILESET_SOLID_TILES_1 ; TILEMAP_SOLID_TILES_1 - tilemap SolidTiles2Tilemap, TILESET_SOLID_TILES_1 ; TILEMAP_SOLID_TILES_2 - tilemap SolidTiles3Tilemap, TILESET_SOLID_TILES_1 ; TILEMAP_SOLID_TILES_3 - tilemap JapaneseTitleScreen2Tilemap, TILESET_JAPANESE_TITLE_SCREEN_2 ; TILEMAP_JAPANESE_TITLE_SCREEN_2 - tilemap JapaneseTitleScreen2CGBTilemap, TILESET_JAPANESE_TITLE_SCREEN_2_CGB ; TILEMAP_JAPANESE_TITLE_SCREEN_2_CGB - tilemap SolidTiles4Tilemap, TILESET_SOLID_TILES_2 ; TILEMAP_SOLID_TILES_4 - tilemap PlayerTilemap, TILESET_PLAYER ; TILEMAP_PLAYER - tilemap OpponentTilemap, TILESET_RONALD ; TILEMAP_OPPONENT - tilemap TitleScreenTilemap, TILESET_TITLE_SCREEN ; TILEMAP_TITLE_SCREEN - tilemap TitleScreenCGBTilemap, TILESET_TITLE_SCREEN_CGB ; TILEMAP_TITLE_SCREEN_CGB - tilemap CopyrightTilemap, TILESET_COPYRIGHT ; TILEMAP_COPYRIGHT - tilemap CopyrightCGBTilemap, TILESET_COPYRIGHT ; TILEMAP_COPYRIGHT_CGB - tilemap NintendoTilemap, TILESET_NINTENDO ; TILEMAP_NINTENDO - tilemap CompaniesTilemap, TILESET_COMPANIES ; TILEMAP_COMPANIES - -; \1 = pointer -; \2 = number of tiles -tileset: MACRO - dwb \1, BANK(\1) - BANK(Tilesets) - db \2 -ENDM - -Tilesets: ; 8100f (20:500f) - tileset OverworldMapTiles, 193 ; TILESET_OVERWORLD_MAP - tileset MasonLaboratoryTilesetGfx, 151 ; TILESET_MASON_LABORATORY - tileset IshiharaTilesetGfx, 77 ; TILESET_ISHIHARA - tileset ClubEntranceTilesetGfx, 129 ; TILESET_CLUB_ENTRANCE - tileset ClubLobbyTilesetGfx, 120 ; TILESET_CLUB_LOBBY - tileset FightingClubTilesetGfx, 99 ; TILESET_FIGHTING_CLUB - tileset RockClubTilesetGfx, 60 ; TILESET_ROCK_CLUB - tileset WaterClubTilesetGfx, 161 ; TILESET_WATER_CLUB - tileset LightningClubTilesetGfx, 131 ; TILESET_LIGHTNING_CLUB - tileset GrassClubTilesetGfx, 87 ; TILESET_GRASS_CLUB - tileset PsychicClubTilesetGfx, 58 ; TILESET_PSYCHIC_CLUB - tileset ScienceClubTilesetGfx, 82 ; TILESET_SCIENCE_CLUB - tileset FireClubTilesetGfx, 87 ; TILESET_FIRE_CLUB - tileset ChallengeHallTilesetGfx, 157 ; TILESET_CHALLENGE_HALL - tileset PokemonDomeEntranceTilesetGfx, 78 ; TILESET_POKEMON_DOME_ENTRANCE - tileset PokemonDomeTilesetGfx, 207 ; TILESET_POKEMON_DOME - tileset HallOfHonorTilesetGfx, 121 ; TILESET_HALL_OF_HONOR - tileset CardPopGfx, 189 ; TILESET_CARD_POP - tileset MedalGfx, 72 ; TILESET_MEDAL - tileset GameBoyLinkGfx, 109 ; TILESET_GAMEBOY_LINK - tileset GameBoyPrinterGfx, 93 ; TILESET_GAMEBOY_PRINTER - tileset Colosseum1Gfx, 96 ; TILESET_COLOSSEUM_1 - tileset Colosseum2Gfx, 86 ; TILESET_COLOSSEUM_2 - tileset Evolution1Gfx, 96 ; TILESET_EVOLUTION_1 - tileset Evolution2Gfx, 86 ; TILESET_EVOLUTION_2 - tileset Mystery1Gfx, 96 ; TILESET_MYSTERY_1 - tileset Mystery2Gfx, 86 ; TILESET_MYSTERY_2 - tileset Laboratory1Gfx, 96 ; TILESET_LABORATORY_1 - tileset Laboratory2Gfx, 86 ; TILESET_LABORATORY_2 - tileset CharizardIntro1Gfx, 96 ; TILESET_CHARIZARD_INTRO_1 - tileset CharizardIntro2Gfx, 96 ; TILESET_CHARIZARD_INTRO_2 - tileset ScytherIntro1Gfx, 96 ; TILESET_SCYTHER_INTRO_1 - tileset ScytherIntro2Gfx, 96 ; TILESET_SCYTHER_INTRO_2 - tileset AerodactylIntro1Gfx, 96 ; TILESET_AERODACTYL_INTRO_1 - tileset AerodactylIntro2Gfx, 96 ; TILESET_AERODACTYL_INTRO_2 - tileset JapaneseTitleScreenGfx, 97 ; TILESET_JAPANESE_TITLE_SCREEN - tileset JapaneseTitleScreenCGBGfx, 97 ; TILESET_JAPANESE_TITLE_SCREEN_CGB - tileset SolidTiles1, 4 ; TILESET_SOLID_TILES_1 - tileset JapaneseTitleScreen2Gfx, 244 ; TILESET_JAPANESE_TITLE_SCREEN_2 - tileset JapaneseTitleScreen2CGBGfx, 59 ; TILESET_JAPANESE_TITLE_SCREEN_2_CGB - tileset SolidTiles2, 4 ; TILESET_SOLID_TILES_2 - tileset PlayerGfx, 36 ; TILESET_PLAYER - tileset RonaldGfx, 36 ; TILESET_RONALD - tileset TitleScreenGfx, 220 ; TILESET_TITLE_SCREEN - tileset TitleScreenCGBGfx, 212 ; TILESET_TITLE_SCREEN_CGB - tileset CopyrightGfx, 36 ; TILESET_COPYRIGHT - tileset NintendoGfx, 24 ; TILESET_NINTENDO - tileset CompaniesGfx, 49 ; TILESET_COMPANIES - tileset SamGfx, 36 ; TILESET_SAM - tileset ImakuniGfx, 36 ; TILESET_IMAKUNI - tileset NikkiGfx, 36 ; TILESET_NIKKI - tileset RickGfx, 36 ; TILESET_RICK - tileset KenGfx, 36 ; TILESET_KEN - tileset AmyGfx, 36 ; TILESET_AMY - tileset IsaacGfx, 36 ; TILESET_ISAAC - tileset MitchGfx, 36 ; TILESET_MITCH - tileset GeneGfx, 36 ; TILESET_GENE - tileset MurrayGfx, 36 ; TILESET_MURRAY - tileset CourtneyGfx, 36 ; TILESET_COURTNEY - tileset SteveGfx, 36 ; TILESET_STEVE - tileset JackGfx, 36 ; TILESET_JACK - tileset RodGfx, 36 ; TILESET_ROD - tileset JosephGfx, 36 ; TILESET_JOSEPH - tileset DavidGfx, 36 ; TILESET_DAVID - tileset ErikGfx, 36 ; TILESET_ERIK - tileset JohnGfx, 36 ; TILESET_JOHN - tileset AdamGfx, 36 ; TILESET_ADAM - tileset JonathanGfx, 36 ; TILESET_JONATHAN - tileset JoshuaGfx, 36 ; TILESET_JOSHUA - tileset NicholasGfx, 36 ; TILESET_NICHOLAS - tileset BrandonGfx, 36 ; TILESET_BRANDON - tileset MatthewGfx, 36 ; TILESET_MATTHEW - tileset RyanGfx, 36 ; TILESET_RYAN - tileset AndrewGfx, 36 ; TILESET_ANDREW - tileset ChrisGfx, 36 ; TILESET_CHRIS - tileset MichaelGfx, 36 ; TILESET_MICHAEL - tileset DanielGfx, 36 ; TILESET_DANIEL - tileset RobertGfx, 36 ; TILESET_ROBERT - tileset BrittanyGfx, 36 ; TILESET_BRITTANY - tileset KristinGfx, 36 ; TILESET_KRISTIN - tileset HeatherGfx, 36 ; TILESET_HEATHER - tileset SaraGfx, 36 ; TILESET_SARA - tileset AmandaGfx, 36 ; TILESET_AMANDA - tileset JenniferGfx, 36 ; TILESET_JENNIFER - tileset JessicaGfx, 36 ; TILESET_JESSICA - tileset StephanieGfx, 36 ; TILESET_STEPHANIE - tileset AaronGfx, 36 ; TILESET_AARON - -; \1 = gfx pointer -; \2 = number of tiles -gfx_pointer: MACRO - dwb \1, BANK(\1) - BANK(Sprites) - db \2 -ENDM - -Sprites: ; 8116b (20:516b) - gfx_pointer OWPlayerGfx, $14 ; SPRITE_OW_PLAYER - gfx_pointer OWRonaldGfx, $14 ; SPRITE_OW_RONALD - gfx_pointer OWDrMasonGfx, $14 ; SPRITE_OW_DRMASON - gfx_pointer OWIshiharaGfx, $14 ; SPRITE_OW_ISHIHARA - gfx_pointer OWImakuniGfx, $14 ; SPRITE_OW_IMAKUNI - gfx_pointer OWNikkiGfx, $14 ; SPRITE_OW_NIKKI - gfx_pointer OWRickGfx, $14 ; SPRITE_OW_RICK - gfx_pointer OWKenGfx, $14 ; SPRITE_OW_KEN - gfx_pointer OWAmyGfx, $1b ; SPRITE_OW_AMY - gfx_pointer OWIsaacGfx, $14 ; SPRITE_OW_ISAAC - gfx_pointer OWMitchGfx, $14 ; SPRITE_OW_MITCH - gfx_pointer OWGeneGfx, $14 ; SPRITE_OW_GENE - gfx_pointer OWMurrayGfx, $14 ; SPRITE_OW_MURRAY - gfx_pointer OWCourtneyGfx, $14 ; SPRITE_OW_COURTNEY - gfx_pointer OWSteveGfx, $14 ; SPRITE_OW_STEVE - gfx_pointer OWJackGfx, $14 ; SPRITE_OW_JACK - gfx_pointer OWRodGfx, $14 ; SPRITE_OW_ROD - gfx_pointer OWBoyGfx, $14 ; SPRITE_OW_BOY - gfx_pointer OWLadGfx, $14 ; SPRITE_OW_LAD - gfx_pointer OWSpecsGfx, $14 ; SPRITE_OW_SPECS - gfx_pointer OWButchGfx, $14 ; SPRITE_OW_BUTCH - gfx_pointer OWManiaGfx, $14 ; SPRITE_OW_MANIA - gfx_pointer OWJoshuaGfx, $14 ; SPRITE_OW_JOSHUA - gfx_pointer OWHoodGfx, $14 ; SPRITE_OW_HOOD - gfx_pointer OWTechGfx, $14 ; SPRITE_OW_TECH - gfx_pointer OWChapGfx, $14 ; SPRITE_OW_CHAP - gfx_pointer OWManGfx, $14 ; SPRITE_OW_MAN - gfx_pointer OWPappyGfx, $14 ; SPRITE_OW_PAPPY - gfx_pointer OWGirlGfx, $14 ; SPRITE_OW_GIRL - gfx_pointer OWLass1Gfx, $14 ; SPRITE_OW_LASS1 - gfx_pointer OWLass2Gfx, $14 ; SPRITE_OW_LASS2 - gfx_pointer OWLass3Gfx, $14 ; SPRITE_OW_LASS3 - gfx_pointer OWSwimmerGfx, $14 ; SPRITE_OW_SWIMMER - gfx_pointer OWClerkGfx, $08 ; SPRITE_OW_CLERK - gfx_pointer OWGalGfx, $14 ; SPRITE_OW_GAL - gfx_pointer OWWomanGfx, $14 ; SPRITE_OW_WOMAN - gfx_pointer OWGrannyGfx, $14 ; SPRITE_OW_GRANNY - gfx_pointer OverworldMapOAMGfx, $08 ; SPRITE_OW_MAP_OAM - gfx_pointer Duel0Gfx, $16 ; SPRITE_DUEL_0 - gfx_pointer Duel63Gfx, $0a ; SPRITE_DUEL_63 - gfx_pointer DuelGlowGfx, $0b ; SPRITE_DUEL_GLOW - gfx_pointer Duel1Gfx, $06 ; SPRITE_DUEL_1 - gfx_pointer Duel2Gfx, $08 ; SPRITE_DUEL_2 - gfx_pointer Duel55Gfx, $02 ; SPRITE_DUEL_55 - gfx_pointer Duel58Gfx, $04 ; SPRITE_DUEL_58 - gfx_pointer Duel3Gfx, $09 ; SPRITE_DUEL_3 - gfx_pointer Duel4Gfx, $12 ; SPRITE_DUEL_4 - gfx_pointer Duel5Gfx, $09 ; SPRITE_DUEL_5 - gfx_pointer Duel6Gfx, $11 ; SPRITE_DUEL_6 - gfx_pointer Duel59Gfx, $03 ; SPRITE_DUEL_59 - gfx_pointer Duel7Gfx, $2d ; SPRITE_DUEL_7 - gfx_pointer Duel8Gfx, $0d ; SPRITE_DUEL_8 - gfx_pointer Duel9Gfx, $1c ; SPRITE_DUEL_9 - gfx_pointer Duel10Gfx, $4c ; SPRITE_DUEL_10 - gfx_pointer Duel61Gfx, $03 ; SPRITE_DUEL_61 - gfx_pointer Duel11Gfx, $1b ; SPRITE_DUEL_11 - gfx_pointer Duel12Gfx, $07 ; SPRITE_DUEL_12 - gfx_pointer Duel13Gfx, $0c ; SPRITE_DUEL_13 - gfx_pointer Duel62Gfx, $01 ; SPRITE_DUEL_62 - gfx_pointer Duel14Gfx, $22 ; SPRITE_DUEL_14 - gfx_pointer Duel15Gfx, $20 ; SPRITE_DUEL_15 - gfx_pointer Duel16Gfx, $0a ; SPRITE_DUEL_16 - gfx_pointer Duel17Gfx, $25 ; SPRITE_DUEL_17 - gfx_pointer Duel18Gfx, $18 ; SPRITE_DUEL_18 - gfx_pointer Duel19Gfx, $1b ; SPRITE_DUEL_19 - gfx_pointer Duel20Gfx, $08 ; SPRITE_DUEL_20 - gfx_pointer Duel21Gfx, $0d ; SPRITE_DUEL_21 - gfx_pointer Duel22Gfx, $22 ; SPRITE_DUEL_22 - gfx_pointer Duel23Gfx, $0c ; SPRITE_DUEL_23 - gfx_pointer Duel24Gfx, $25 ; SPRITE_DUEL_24 - gfx_pointer Duel25Gfx, $22 ; SPRITE_DUEL_25 - gfx_pointer Duel26Gfx, $0c ; SPRITE_DUEL_26 - gfx_pointer Duel27Gfx, $4c ; SPRITE_DUEL_27 - gfx_pointer Duel28Gfx, $08 ; SPRITE_DUEL_28 - gfx_pointer Duel29Gfx, $07 ; SPRITE_DUEL_29 - gfx_pointer Duel56Gfx, $01 ; SPRITE_DUEL_56 - gfx_pointer Duel30Gfx, $1a ; SPRITE_DUEL_30 - gfx_pointer Duel31Gfx, $0a ; SPRITE_DUEL_31 - gfx_pointer Duel32Gfx, $2e ; SPRITE_DUEL_32 - gfx_pointer Duel33Gfx, $08 ; SPRITE_DUEL_33 - gfx_pointer Duel34Gfx, $07 ; SPRITE_DUEL_34 - gfx_pointer Duel35Gfx, $1c ; SPRITE_DUEL_35 - gfx_pointer Duel66Gfx, $04 ; SPRITE_DUEL_66 - gfx_pointer Duel36Gfx, $08 ; SPRITE_DUEL_36 - gfx_pointer Duel37Gfx, $0b ; SPRITE_DUEL_37 - gfx_pointer Duel57Gfx, $01 ; SPRITE_DUEL_57 - gfx_pointer Duel38Gfx, $1c ; SPRITE_DUEL_38 - gfx_pointer Duel39Gfx, $16 ; SPRITE_DUEL_39 - gfx_pointer Duel40Gfx, $10 ; SPRITE_DUEL_40 - gfx_pointer Duel41Gfx, $0f ; SPRITE_DUEL_41 - gfx_pointer Duel42Gfx, $07 ; SPRITE_DUEL_42 - gfx_pointer Duel43Gfx, $0a ; SPRITE_DUEL_43 - gfx_pointer Duel44Gfx, $09 ; SPRITE_DUEL_44 - gfx_pointer Duel60Gfx, $02 ; SPRITE_DUEL_60 - gfx_pointer Duel64Gfx, $02 ; SPRITE_DUEL_64 - gfx_pointer Duel45Gfx, $03 ; SPRITE_DUEL_45 - gfx_pointer Duel46Gfx, $08 ; SPRITE_DUEL_46 - gfx_pointer Duel47Gfx, $0f ; SPRITE_DUEL_47 - gfx_pointer Duel48Gfx, $03 ; SPRITE_DUEL_48 - gfx_pointer Duel49Gfx, $05 ; SPRITE_DUEL_49 - gfx_pointer Duel50Gfx, $17 ; SPRITE_DUEL_50 - gfx_pointer Duel51Gfx, $36 ; SPRITE_DUEL_WON_LOST_DRAW - gfx_pointer Duel52Gfx, $0b ; SPRITE_DUEL_52 - gfx_pointer Duel53Gfx, $06 ; SPRITE_DUEL_53 - gfx_pointer Duel54Gfx, $16 ; SPRITE_DUEL_54 - gfx_pointer BoosterPackOAMGfx, $20 ; SPRITE_BOOSTER_PACK_OAM - gfx_pointer PressStartGfx, $14 ; SPRITE_PRESS_START - gfx_pointer GrassGfx, $04 ; SPRITE_GRASS - gfx_pointer FireGfx, $04 ; SPRITE_FIRE - gfx_pointer WaterGfx, $04 ; SPRITE_WATER - gfx_pointer ColorlessGfx, $04 ; SPRITE_COLORLESS - gfx_pointer LightningGfx, $04 ; SPRITE_LIGHTNING - gfx_pointer PsychicGfx, $04 ; SPRITE_PSYCHIC - gfx_pointer FightingGfx, $04 ; SPRITE_FIGHTING - -; \1 = anim data pointer -anim_data_pointer: MACRO - dwb \1, BANK(\1) - BANK(SpriteAnimations) - db $00 ; unused (padding?) -ENDM - -SpriteAnimations: ; 81333 (20:5333) - anim_data_pointer AnimData0 ; SPRITE_ANIM_LIGHT_NPC_UP - anim_data_pointer AnimData1 ; SPRITE_ANIM_LIGHT_NPC_RIGHT - anim_data_pointer AnimData2 ; SPRITE_ANIM_LIGHT_NPC_DOWN - anim_data_pointer AnimData3 ; SPRITE_ANIM_LIGHT_NPC_LEFT - anim_data_pointer AnimData4 ; SPRITE_ANIM_DARK_NPC_UP - anim_data_pointer AnimData5 ; SPRITE_ANIM_DARK_NPC_RIGHT - anim_data_pointer AnimData6 ; SPRITE_ANIM_DARK_NPC_DOWN - anim_data_pointer AnimData7 ; SPRITE_ANIM_DARK_NPC_LEFT - anim_data_pointer AnimData8 ; SPRITE_ANIM_SGB_AMY_LAYING - anim_data_pointer AnimData9 ; SPRITE_ANIM_SGB_AMY_STAND - anim_data_pointer AnimData10 ; SPRITE_ANIM_SGB_CLERK_NPC_UP - anim_data_pointer AnimData11 ; SPRITE_ANIM_SGB_CLERK_NPC_RIGHT - anim_data_pointer AnimData12 ; SPRITE_ANIM_SGB_CLERK_NPC_DOWN - anim_data_pointer AnimData13 ; SPRITE_ANIM_SGB_CLERK_NPC_LEFT - anim_data_pointer AnimData14 ; SPRITE_ANIM_BLUE_NPC_UP - anim_data_pointer AnimData15 ; SPRITE_ANIM_BLUE_NPC_RIGHT - anim_data_pointer AnimData16 ; SPRITE_ANIM_BLUE_NPC_DOWN - anim_data_pointer AnimData17 ; SPRITE_ANIM_BLUE_NPC_LEFT - anim_data_pointer AnimData18 ; SPRITE_ANIM_PINK_NPC_UP - anim_data_pointer AnimData19 ; SPRITE_ANIM_PINK_NPC_RIGHT - anim_data_pointer AnimData20 ; SPRITE_ANIM_PINK_NPC_DOWN - anim_data_pointer AnimData21 ; SPRITE_ANIM_PINK_NPC_LEFT - anim_data_pointer AnimData22 ; SPRITE_ANIM_YELLOW_NPC_UP - anim_data_pointer AnimData23 ; SPRITE_ANIM_YELLOW_NPC_RIGHT - anim_data_pointer AnimData24 ; SPRITE_ANIM_YELLOW_NPC_DOWN - anim_data_pointer AnimData25 ; SPRITE_ANIM_YELLOW_NPC_LEFT - anim_data_pointer AnimData26 ; SPRITE_ANIM_GREEN_NPC_UP - anim_data_pointer AnimData27 ; SPRITE_ANIM_GREEN_NPC_RIGHT - anim_data_pointer AnimData28 ; SPRITE_ANIM_GREEN_NPC_DOWN - anim_data_pointer AnimData29 ; SPRITE_ANIM_GREEN_NPC_LEFT - anim_data_pointer AnimData30 ; SPRITE_ANIM_RED_NPC_UP - anim_data_pointer AnimData31 ; SPRITE_ANIM_RED_NPC_RIGHT - anim_data_pointer AnimData32 ; SPRITE_ANIM_RED_NPC_DOWN - anim_data_pointer AnimData33 ; SPRITE_ANIM_RED_NPC_LEFT - anim_data_pointer AnimData34 ; SPRITE_ANIM_PURPLE_NPC_UP - anim_data_pointer AnimData35 ; SPRITE_ANIM_PURPLE_NPC_RIGHT - anim_data_pointer AnimData36 ; SPRITE_ANIM_PURPLE_NPC_DOWN - anim_data_pointer AnimData37 ; SPRITE_ANIM_PURPLE_NPC_LEFT - anim_data_pointer AnimData38 ; SPRITE_ANIM_WHITE_NPC_UP - anim_data_pointer AnimData39 ; SPRITE_ANIM_WHITE_NPC_RIGHT - anim_data_pointer AnimData40 ; SPRITE_ANIM_WHITE_NPC_DOWN - anim_data_pointer AnimData41 ; SPRITE_ANIM_WHITE_NPC_LEFT - anim_data_pointer AnimData42 ; SPRITE_ANIM_INDIGO_NPC_UP - anim_data_pointer AnimData43 ; SPRITE_ANIM_INDIGO_NPC_RIGHT - anim_data_pointer AnimData44 ; SPRITE_ANIM_INDIGO_NPC_DOWN - anim_data_pointer AnimData45 ; SPRITE_ANIM_INDIGO_NPC_LEFT - anim_data_pointer AnimData46 ; SPRITE_ANIM_CGB_AMY_LAYING - anim_data_pointer AnimData47 ; SPRITE_ANIM_CGB_AMY_STAND - anim_data_pointer AnimData48 ; SPRITE_ANIM_CGB_CLERK_NPC_UP - anim_data_pointer AnimData49 ; SPRITE_ANIM_CGB_CLERK_NPC_RIGHT - anim_data_pointer AnimData50 ; SPRITE_ANIM_CGB_CLERK_NPC_DOWN - anim_data_pointer AnimData51 ; SPRITE_ANIM_CGB_CLERK_NPC_LEFT - anim_data_pointer AnimData52 ; SPRITE_ANIM_SGB_VOLCANO_SMOKE - anim_data_pointer AnimData53 ; SPRITE_ANIM_SGB_OWMAP_CURSOR - anim_data_pointer AnimData54 ; SPRITE_ANIM_SGB_OWMAP_CURSOR_FAST - anim_data_pointer AnimData55 ; SPRITE_ANIM_CGB_VOLCANO_SMOKE - anim_data_pointer AnimData56 ; SPRITE_ANIM_CGB_OWMAP_CURSOR - anim_data_pointer AnimData57 ; SPRITE_ANIM_CGB_OWMAP_CURSOR_FAST - anim_data_pointer AnimData58 ; SPRITE_ANIM_TORCH - anim_data_pointer AnimData59 ; SPRITE_ANIM_SGB_CARD_TOP_LEFT - anim_data_pointer AnimData60 ; SPRITE_ANIM_SGB_CARD_TOP_RIGHT - anim_data_pointer AnimData61 ; SPRITE_ANIM_SGB_CARD_LEFT_SPARK - anim_data_pointer AnimData62 ; SPRITE_ANIM_SGB_CARD_BOTTOM_LEFT - anim_data_pointer AnimData63 ; SPRITE_ANIM_SGB_CARD_BOTTOM_RIGHT - anim_data_pointer AnimData64 ; SPRITE_ANIM_SGB_CARD_RIGHT_SPARK - anim_data_pointer AnimData65 ; SPRITE_ANIM_CGB_CARD_TOP_LEFT - anim_data_pointer AnimData66 ; SPRITE_ANIM_CGB_CARD_TOP_RIGHT - anim_data_pointer AnimData67 ; SPRITE_ANIM_CGB_CARD_LEFT_SPARK - anim_data_pointer AnimData68 ; SPRITE_ANIM_CGB_CARD_BOTTOM_LEFT - anim_data_pointer AnimData69 ; SPRITE_ANIM_CGB_CARD_BOTTOM_RIGHT - anim_data_pointer AnimData70 ; SPRITE_ANIM_CGB_CARD_RIGHT_SPARK - anim_data_pointer AnimData71 ; SPRITE_ANIM_71 - anim_data_pointer AnimData72 ; SPRITE_ANIM_72 - anim_data_pointer AnimData73 ; SPRITE_ANIM_73 - anim_data_pointer AnimData74 ; SPRITE_ANIM_74 - anim_data_pointer AnimData75 ; SPRITE_ANIM_75 - anim_data_pointer AnimData76 ; SPRITE_ANIM_76 - anim_data_pointer AnimData77 ; SPRITE_ANIM_77 - anim_data_pointer AnimData78 ; SPRITE_ANIM_78 - anim_data_pointer AnimData79 ; SPRITE_ANIM_79 - anim_data_pointer AnimData80 ; SPRITE_ANIM_80 - anim_data_pointer AnimData81 ; SPRITE_ANIM_81 - anim_data_pointer AnimData82 ; SPRITE_ANIM_82 - anim_data_pointer AnimData83 ; SPRITE_ANIM_83 - anim_data_pointer AnimData84 ; SPRITE_ANIM_84 - anim_data_pointer AnimData85 ; SPRITE_ANIM_85 - anim_data_pointer AnimData86 ; SPRITE_ANIM_86 - anim_data_pointer AnimData87 ; SPRITE_ANIM_87 - anim_data_pointer AnimData88 ; SPRITE_ANIM_88 - anim_data_pointer AnimData89 ; SPRITE_ANIM_89 - anim_data_pointer AnimData90 ; SPRITE_ANIM_90 - anim_data_pointer AnimData91 ; SPRITE_ANIM_91 - anim_data_pointer AnimData92 ; SPRITE_ANIM_92 - anim_data_pointer AnimData93 ; SPRITE_ANIM_93 - anim_data_pointer AnimData94 ; SPRITE_ANIM_94 - anim_data_pointer AnimData95 ; SPRITE_ANIM_95 - anim_data_pointer AnimData96 ; SPRITE_ANIM_96 - anim_data_pointer AnimData97 ; SPRITE_ANIM_97 - anim_data_pointer AnimData98 ; SPRITE_ANIM_98 - anim_data_pointer AnimData99 ; SPRITE_ANIM_99 - anim_data_pointer AnimData100 ; SPRITE_ANIM_100 - anim_data_pointer AnimData101 ; SPRITE_ANIM_101 - anim_data_pointer AnimData102 ; SPRITE_ANIM_102 - anim_data_pointer AnimData103 ; SPRITE_ANIM_103 - anim_data_pointer AnimData104 ; SPRITE_ANIM_104 - anim_data_pointer AnimData105 ; SPRITE_ANIM_105 - anim_data_pointer AnimData106 ; SPRITE_ANIM_106 - anim_data_pointer AnimData107 ; SPRITE_ANIM_107 - anim_data_pointer AnimData108 ; SPRITE_ANIM_108 - anim_data_pointer AnimData109 ; SPRITE_ANIM_109 - anim_data_pointer AnimData110 ; SPRITE_ANIM_110 - anim_data_pointer AnimData111 ; SPRITE_ANIM_111 - anim_data_pointer AnimData112 ; SPRITE_ANIM_112 - anim_data_pointer AnimData113 ; SPRITE_ANIM_113 - anim_data_pointer AnimData114 ; SPRITE_ANIM_114 - anim_data_pointer AnimData115 ; SPRITE_ANIM_115 - anim_data_pointer AnimData116 ; SPRITE_ANIM_116 - anim_data_pointer AnimData117 ; SPRITE_ANIM_117 - anim_data_pointer AnimData118 ; SPRITE_ANIM_118 - anim_data_pointer AnimData119 ; SPRITE_ANIM_119 - anim_data_pointer AnimData120 ; SPRITE_ANIM_120 - anim_data_pointer AnimData121 ; SPRITE_ANIM_121 - anim_data_pointer AnimData122 ; SPRITE_ANIM_122 - anim_data_pointer AnimData123 ; SPRITE_ANIM_123 - anim_data_pointer AnimData124 ; SPRITE_ANIM_124 - anim_data_pointer AnimData125 ; SPRITE_ANIM_125 - anim_data_pointer AnimData126 ; SPRITE_ANIM_126 - anim_data_pointer AnimData127 ; SPRITE_ANIM_127 - anim_data_pointer AnimData128 ; SPRITE_ANIM_128 - anim_data_pointer AnimData129 ; SPRITE_ANIM_129 - anim_data_pointer AnimData130 ; SPRITE_ANIM_130 - anim_data_pointer AnimData131 ; SPRITE_ANIM_131 - anim_data_pointer AnimData132 ; SPRITE_ANIM_132 - anim_data_pointer AnimData133 ; SPRITE_ANIM_133 - anim_data_pointer AnimData134 ; SPRITE_ANIM_134 - anim_data_pointer AnimData135 ; SPRITE_ANIM_135 - anim_data_pointer AnimData136 ; SPRITE_ANIM_136 - anim_data_pointer AnimData137 ; SPRITE_ANIM_137 - anim_data_pointer AnimData138 ; SPRITE_ANIM_138 - anim_data_pointer AnimData139 ; SPRITE_ANIM_139 - anim_data_pointer AnimData140 ; SPRITE_ANIM_140 - anim_data_pointer AnimData141 ; SPRITE_ANIM_141 - anim_data_pointer AnimData142 ; SPRITE_ANIM_142 - anim_data_pointer AnimData143 ; SPRITE_ANIM_143 - anim_data_pointer AnimData144 ; SPRITE_ANIM_144 - anim_data_pointer AnimData145 ; SPRITE_ANIM_145 - anim_data_pointer AnimData146 ; SPRITE_ANIM_146 - anim_data_pointer AnimData147 ; SPRITE_ANIM_147 - anim_data_pointer AnimData148 ; SPRITE_ANIM_148 - anim_data_pointer AnimData149 ; SPRITE_ANIM_149 - anim_data_pointer AnimData150 ; SPRITE_ANIM_150 - anim_data_pointer AnimData151 ; SPRITE_ANIM_151 - anim_data_pointer AnimData152 ; SPRITE_ANIM_152 - anim_data_pointer AnimData153 ; SPRITE_ANIM_153 - anim_data_pointer AnimData154 ; SPRITE_ANIM_154 - anim_data_pointer AnimData155 ; SPRITE_ANIM_155 - anim_data_pointer AnimData156 ; SPRITE_ANIM_156 - anim_data_pointer AnimData157 ; SPRITE_ANIM_157 - anim_data_pointer AnimData158 ; SPRITE_ANIM_158 - anim_data_pointer AnimData159 ; SPRITE_ANIM_159 - anim_data_pointer AnimData160 ; SPRITE_ANIM_160 - anim_data_pointer AnimData161 ; SPRITE_ANIM_161 - anim_data_pointer AnimData162 ; SPRITE_ANIM_162 - anim_data_pointer AnimData163 ; SPRITE_ANIM_163 - anim_data_pointer AnimData164 ; SPRITE_ANIM_164 - anim_data_pointer AnimData165 ; SPRITE_ANIM_165 - anim_data_pointer AnimData166 ; SPRITE_ANIM_166 - anim_data_pointer AnimData167 ; SPRITE_ANIM_167 - anim_data_pointer AnimData168 ; SPRITE_ANIM_168 - anim_data_pointer AnimData169 ; SPRITE_ANIM_169 - anim_data_pointer AnimData170 ; SPRITE_ANIM_170 - anim_data_pointer AnimData171 ; SPRITE_ANIM_171 - anim_data_pointer AnimData172 ; SPRITE_ANIM_172 - anim_data_pointer AnimData173 ; SPRITE_ANIM_173 - anim_data_pointer AnimData174 ; SPRITE_ANIM_174 - anim_data_pointer AnimData175 ; SPRITE_ANIM_175 - anim_data_pointer AnimData176 ; SPRITE_ANIM_176 - anim_data_pointer AnimData177 ; SPRITE_ANIM_177 - anim_data_pointer AnimData178 ; SPRITE_ANIM_178 - anim_data_pointer AnimData179 ; SPRITE_ANIM_179 - anim_data_pointer AnimData180 ; SPRITE_ANIM_180 - anim_data_pointer AnimData181 ; SPRITE_ANIM_181 - anim_data_pointer AnimData182 ; SPRITE_ANIM_182 - anim_data_pointer AnimData183 ; SPRITE_ANIM_183 - anim_data_pointer AnimData184 ; SPRITE_ANIM_184 - anim_data_pointer AnimData185 ; SPRITE_ANIM_185 - anim_data_pointer AnimData186 ; SPRITE_ANIM_186 - anim_data_pointer AnimData187 ; SPRITE_ANIM_187 - anim_data_pointer AnimData188 ; SPRITE_ANIM_188 - anim_data_pointer AnimData189 ; SPRITE_ANIM_189 - anim_data_pointer AnimData190 ; SPRITE_ANIM_190 - anim_data_pointer AnimData191 ; SPRITE_ANIM_191 - anim_data_pointer AnimData192 ; SPRITE_ANIM_192 - anim_data_pointer AnimData193 ; SPRITE_ANIM_193 - anim_data_pointer AnimData194 ; SPRITE_ANIM_194 - anim_data_pointer AnimData195 ; SPRITE_ANIM_195 - anim_data_pointer AnimData196 ; SPRITE_ANIM_196 - anim_data_pointer AnimData197 ; SPRITE_ANIM_197 - anim_data_pointer AnimData198 ; SPRITE_ANIM_198 - anim_data_pointer AnimData199 ; SPRITE_ANIM_199 - anim_data_pointer AnimData200 ; SPRITE_ANIM_200 - anim_data_pointer AnimData201 ; SPRITE_ANIM_201 - anim_data_pointer AnimData202 ; SPRITE_ANIM_202 - anim_data_pointer AnimData203 ; SPRITE_ANIM_203 - anim_data_pointer AnimData204 ; SPRITE_ANIM_204 - anim_data_pointer AnimData205 ; SPRITE_ANIM_205 - anim_data_pointer AnimData206 ; SPRITE_ANIM_206 - anim_data_pointer AnimData207 ; SPRITE_ANIM_207 - anim_data_pointer AnimData208 ; SPRITE_ANIM_208 - anim_data_pointer AnimData209 ; SPRITE_ANIM_209 - anim_data_pointer AnimData210 ; SPRITE_ANIM_210 - anim_data_pointer AnimData211 ; SPRITE_ANIM_211 - anim_data_pointer AnimData212 ; SPRITE_ANIM_212 - anim_data_pointer AnimData213 ; SPRITE_ANIM_213 - anim_data_pointer AnimData214 ; SPRITE_ANIM_214 - anim_data_pointer AnimData215 ; SPRITE_ANIM_215 - anim_data_pointer AnimData216 ; SPRITE_ANIM_216 - -; \1 = palette pointer -; \2 = number of palettes -; \3 = number of OBJ colors -palette_pointer: MACRO - dwb \1, BANK(\1) - BANK(Palettes) - db (\2 << 4) + \3 -ENDM - -Palettes: ; 81697 (20:5697) - palette_pointer Palette0, 8, 1 ; PALETTE_0 - palette_pointer Palette1, 8, 0 ; PALETTE_1 - palette_pointer Palette2, 8, 0 ; PALETTE_2 - palette_pointer Palette3, 8, 0 ; PALETTE_3 - palette_pointer Palette4, 8, 0 ; PALETTE_4 - palette_pointer Palette5, 8, 0 ; PALETTE_5 - palette_pointer Palette6, 8, 0 ; PALETTE_6 - palette_pointer Palette7, 8, 0 ; PALETTE_7 - palette_pointer Palette8, 8, 0 ; PALETTE_8 - palette_pointer Palette9, 8, 0 ; PALETTE_9 - palette_pointer Palette10, 8, 0 ; PALETTE_10 - palette_pointer Palette11, 8, 0 ; PALETTE_11 - palette_pointer Palette12, 8, 0 ; PALETTE_12 - palette_pointer Palette13, 8, 0 ; PALETTE_13 - palette_pointer Palette14, 8, 0 ; PALETTE_14 - palette_pointer Palette15, 8, 0 ; PALETTE_15 - palette_pointer Palette16, 8, 0 ; PALETTE_16 - palette_pointer Palette17, 8, 0 ; PALETTE_17 - palette_pointer Palette18, 8, 0 ; PALETTE_18 - palette_pointer Palette19, 8, 0 ; PALETTE_19 - palette_pointer Palette20, 8, 0 ; PALETTE_20 - palette_pointer Palette21, 8, 0 ; PALETTE_21 - palette_pointer Palette22, 8, 0 ; PALETTE_22 - palette_pointer Palette23, 8, 0 ; PALETTE_23 - palette_pointer Palette24, 8, 0 ; PALETTE_24 - palette_pointer Palette25, 8, 0 ; PALETTE_25 - palette_pointer Palette26, 8, 0 ; PALETTE_26 - palette_pointer Palette27, 8, 0 ; PALETTE_27 - palette_pointer Palette28, 8, 0 ; PALETTE_28 - palette_pointer Palette29, 8, 2 ; PALETTE_29 - palette_pointer Palette30, 8, 2 ; PALETTE_30 - palette_pointer Palette31, 1, 1 ; PALETTE_31 - palette_pointer Palette32, 1, 1 ; PALETTE_32 - palette_pointer Palette33, 1, 1 ; PALETTE_33 - palette_pointer Palette34, 1, 1 ; PALETTE_34 - palette_pointer Palette35, 1, 1 ; PALETTE_35 - palette_pointer Palette36, 1, 1 ; PALETTE_36 - palette_pointer Palette37, 1, 1 ; PALETTE_37 - palette_pointer Palette38, 1, 1 ; PALETTE_38 - palette_pointer Palette39, 1, 1 ; PALETTE_39 - palette_pointer Palette40, 1, 1 ; PALETTE_40 - palette_pointer Palette41, 1, 1 ; PALETTE_41 - palette_pointer Palette42, 1, 1 ; PALETTE_42 - palette_pointer Palette43, 1, 1 ; PALETTE_43 - palette_pointer Palette44, 1, 1 ; PALETTE_44 - palette_pointer Palette45, 1, 1 ; PALETTE_45 - palette_pointer Palette46, 1, 1 ; PALETTE_46 - palette_pointer Palette47, 1, 1 ; PALETTE_47 - palette_pointer Palette48, 1, 1 ; PALETTE_48 - palette_pointer Palette49, 1, 1 ; PALETTE_49 - palette_pointer Palette50, 1, 1 ; PALETTE_50 - palette_pointer Palette51, 1, 1 ; PALETTE_51 - palette_pointer Palette52, 1, 1 ; PALETTE_52 - palette_pointer Palette53, 1, 1 ; PALETTE_53 - palette_pointer Palette54, 1, 1 ; PALETTE_54 - palette_pointer Palette55, 1, 1 ; PALETTE_55 - palette_pointer Palette56, 1, 1 ; PALETTE_56 - palette_pointer Palette57, 1, 1 ; PALETTE_57 - palette_pointer Palette58, 1, 1 ; PALETTE_58 - palette_pointer Palette59, 1, 1 ; PALETTE_59 - palette_pointer Palette60, 1, 1 ; PALETTE_60 - palette_pointer Palette61, 1, 1 ; PALETTE_61 - palette_pointer Palette62, 1, 1 ; PALETTE_62 - palette_pointer Palette63, 1, 1 ; PALETTE_63 - palette_pointer Palette64, 1, 1 ; PALETTE_64 - palette_pointer Palette65, 1, 1 ; PALETTE_65 - palette_pointer Palette66, 1, 1 ; PALETTE_66 - palette_pointer Palette67, 1, 1 ; PALETTE_67 - palette_pointer Palette68, 1, 1 ; PALETTE_68 - palette_pointer Palette69, 1, 1 ; PALETTE_69 - palette_pointer Palette70, 1, 1 ; PALETTE_70 - palette_pointer Palette71, 1, 1 ; PALETTE_71 - palette_pointer Palette72, 1, 1 ; PALETTE_72 - palette_pointer Palette73, 1, 1 ; PALETTE_73 - palette_pointer Palette74, 1, 1 ; PALETTE_74 - palette_pointer Palette75, 1, 1 ; PALETTE_75 - palette_pointer Palette76, 1, 1 ; PALETTE_76 - palette_pointer Palette77, 1, 1 ; PALETTE_77 - palette_pointer Palette78, 1, 1 ; PALETTE_78 - palette_pointer Palette79, 1, 1 ; PALETTE_79 - palette_pointer Palette80, 1, 1 ; PALETTE_80 - palette_pointer Palette81, 1, 1 ; PALETTE_81 - palette_pointer Palette82, 1, 1 ; PALETTE_82 - palette_pointer Palette83, 1, 1 ; PALETTE_83 - palette_pointer Palette84, 1, 1 ; PALETTE_84 - palette_pointer Palette85, 1, 1 ; PALETTE_85 - palette_pointer Palette86, 1, 1 ; PALETTE_86 - palette_pointer Palette87, 1, 1 ; PALETTE_87 - palette_pointer Palette88, 1, 1 ; PALETTE_88 - palette_pointer Palette89, 1, 1 ; PALETTE_89 - palette_pointer Palette90, 1, 1 ; PALETTE_90 - palette_pointer Palette91, 1, 1 ; PALETTE_91 - palette_pointer Palette92, 1, 1 ; PALETTE_92 - palette_pointer Palette93, 1, 1 ; PALETTE_93 - palette_pointer Palette94, 8, 0 ; PALETTE_94 - palette_pointer Palette95, 8, 0 ; PALETTE_95 - palette_pointer Palette96, 8, 0 ; PALETTE_96 - palette_pointer Palette97, 8, 0 ; PALETTE_97 - palette_pointer Palette98, 8, 0 ; PALETTE_98 - palette_pointer Palette99, 8, 0 ; PALETTE_99 - palette_pointer Palette100, 8, 0 ; PALETTE_100 - palette_pointer Palette101, 7, 0 ; PALETTE_101 - palette_pointer Palette102, 7, 0 ; PALETTE_102 - palette_pointer Palette103, 7, 0 ; PALETTE_103 - palette_pointer Palette104, 7, 0 ; PALETTE_104 - palette_pointer Palette105, 7, 0 ; PALETTE_105 - palette_pointer Palette106, 7, 0 ; PALETTE_106 - palette_pointer Palette107, 7, 0 ; PALETTE_107 - palette_pointer Palette108, 0, 1 ; PALETTE_108 - palette_pointer Palette109, 0, 1 ; PALETTE_109 - palette_pointer Palette110, 0, 0 ; PALETTE_110 - palette_pointer Palette111, 8, 1 ; PALETTE_111 - palette_pointer Palette112, 8, 1 ; PALETTE_112 - palette_pointer Palette113, 8, 1 ; PALETTE_113 - palette_pointer Palette114, 4, 2 ; PALETTE_114 - palette_pointer Palette115, 4, 2 ; PALETTE_115 - palette_pointer Palette116, 4, 2 ; PALETTE_116 - palette_pointer Palette117, 1, 0 ; PALETTE_117 - palette_pointer Palette118, 6, 0 ; PALETTE_118 - palette_pointer Palette119, 1, 0 ; PALETTE_119 - palette_pointer Palette120, 1, 0 ; PALETTE_120 - palette_pointer Palette121, 1, 0 ; PALETTE_121 - palette_pointer Palette122, 1, 0 ; PALETTE_122 - palette_pointer Palette123, 1, 0 ; PALETTE_123 - palette_pointer Palette124, 1, 0 ; PALETTE_124 - palette_pointer Palette125, 1, 0 ; PALETTE_125 - palette_pointer Palette126, 1, 0 ; PALETTE_126 - palette_pointer Palette127, 1, 0 ; PALETTE_127 - palette_pointer Palette128, 1, 0 ; PALETTE_128 - palette_pointer Palette129, 1, 0 ; PALETTE_129 - palette_pointer Palette130, 1, 0 ; PALETTE_130 - palette_pointer Palette131, 1, 0 ; PALETTE_131 - palette_pointer Palette132, 1, 0 ; PALETTE_132 - palette_pointer Palette133, 1, 0 ; PALETTE_133 - palette_pointer Palette134, 1, 0 ; PALETTE_134 - palette_pointer Palette135, 1, 0 ; PALETTE_135 - palette_pointer Palette136, 1, 0 ; PALETTE_136 - palette_pointer Palette137, 1, 0 ; PALETTE_137 - palette_pointer Palette138, 1, 0 ; PALETTE_138 - palette_pointer Palette139, 1, 0 ; PALETTE_139 - palette_pointer Palette140, 1, 0 ; PALETTE_140 - palette_pointer Palette141, 1, 0 ; PALETTE_141 - palette_pointer Palette142, 1, 0 ; PALETTE_142 - palette_pointer Palette143, 1, 0 ; PALETTE_143 - palette_pointer Palette144, 1, 0 ; PALETTE_144 - palette_pointer Palette145, 1, 0 ; PALETTE_145 - palette_pointer Palette146, 1, 0 ; PALETTE_146 - palette_pointer Palette147, 1, 0 ; PALETTE_147 - palette_pointer Palette148, 1, 0 ; PALETTE_148 - palette_pointer Palette149, 1, 0 ; PALETTE_149 - palette_pointer Palette150, 1, 0 ; PALETTE_150 - palette_pointer Palette151, 1, 0 ; PALETTE_151 - palette_pointer Palette152, 1, 0 ; PALETTE_152 - palette_pointer Palette153, 1, 0 ; PALETTE_153 - palette_pointer Palette154, 1, 0 ; PALETTE_154 - palette_pointer Palette155, 1, 0 ; PALETTE_155 - palette_pointer Palette156, 1, 0 ; PALETTE_156 - palette_pointer Palette157, 1, 0 ; PALETTE_157 - palette_pointer Palette158, 1, 0 ; PALETTE_158 - palette_pointer Palette159, 1, 0 ; PALETTE_159 - palette_pointer Palette160, 1, 0 ; PALETTE_160 - -OverworldMapTilemap:: ; 8191b (20:591b) - db $14 ; width - db $12 ; height - dw NULL - db FALSE ; cgb mode - INCBIN "data/maps/tiles/overworld_map.bin" - -OverworldMapCGBTilemap:: ; 81a22 (20:5a22) - db $14 ; width - db $12 ; height - dw NULL - db TRUE ; cgb mode - INCBIN "data/maps/tiles/overworld_map_cgb.bin" - -MasonLaboratoryTilemap:: ; 81c13 (20:5c13) - db $1c ; width - db $1e ; height - dw MasonLaboratoryPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/mason_laboratory.bin" -MasonLaboratoryPermissions: - INCBIN "data/maps/permissions/mason_laboratory.bin" - -MasonLaboratoryCGBTilemap:: ; 81d2e (20:5d2e) - db $1c ; width - db $1e ; height - dw MasonLaboratoryCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/mason_laboratory_cgb.bin" -MasonLaboratoryCGBPermissions: - INCBIN "data/maps/permissions/mason_laboratory_cgb.bin" - -ChallengeMachineMapEventTilemap:: ; 81ed1 (20:5ed1) - db $04 ; width - db $06 ; height - dw ChallengeMachineMapEventPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/challenge_machine_map_event.bin" -ChallengeMachineMapEventPermissions: - INCBIN "data/maps/permissions/challenge_machine_map_event.bin" - -ChallengeMachineMapEventCGBTilemap:: ; 81ef5 (20:5ef5) - db $04 ; width - db $06 ; height - dw ChallengeMachineMapEventCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/challenge_machine_map_event_cgb.bin" -ChallengeMachineMapEventCGBPermissions: - INCBIN "data/maps/permissions/challenge_machine_map_event_cgb.bin" - -DeckMachineRoomTilemap:: ; 81f26 (20:5f26) - db $18 ; width - db $1e ; height - dw DeckMachineRoomPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/deck_machine_room.bin" -DeckMachineRoomPermissions: - INCBIN "data/maps/permissions/deck_machine_room.bin" - -DeckMachineRoomCGBTilemap:: ; 81feb (20:5feb) - db $18 ; width - db $1e ; height - dw DeckMachineRoomCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/deck_machine_room_cgb.bin" -DeckMachineRoomCGBPermissions: - INCBIN "data/maps/permissions/deck_machine_room_cgb.bin" - -DeckMachineMapEventTilemap:: ; 82143 (20:6143) - db $04 ; width - db $01 ; height - dw DeckMachineMapEventPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/deck_machine_map_event.bin" -DeckMachineMapEventPermissions: - INCBIN "data/maps/permissions/deck_machine_map_event.bin" - -DeckMachineMapEventCGBTilemap:: ; 82150 (20:6150) - db $04 ; width - db $01 ; height - dw DeckMachineMapEventCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/deck_machine_map_event_cgb.bin" -DeckMachineMapEventCGBPermissions: - INCBIN "data/maps/permissions/deck_machine_map_event_cgb.bin" - -IshiharaTilemap:: ; 82160 (20:6160) - db $14 ; width - db $18 ; height - dw IshiharaPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/ishihara.bin" -IshiharaPermissions: - INCBIN "data/maps/permissions/ishihara.bin" - -IshiharaCGBTilemap:: ; 82222 (20:6222) - db $14 ; width - db $18 ; height - dw IshiharaCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/ishihara_cgb.bin" -IshiharaCGBPermissions: - INCBIN "data/maps/permissions/ishihara_cgb.bin" - -FightingClubEntranceTilemap:: ; 82336 (20:6336) - db $14 ; width - db $12 ; height - dw FightingClubEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/fighting_club_entrance.bin" -FightingClubEntrancePermissions: - INCBIN "data/maps/permissions/fighting_club_entrance.bin" - -FightingClubEntranceCGBTilemap:: ; 82400 (20:6400) - db $14 ; width - db $12 ; height - dw FightingClubEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/fighting_club_entrance_cgb.bin" -FightingClubEntranceCGBPermissions: - INCBIN "data/maps/permissions/fighting_club_entrance_cgb.bin" - -RockClubEntranceTilemap:: ; 8251d (20:651d) - db $14 ; width - db $12 ; height - dw RockClubEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/rock_club_entrance.bin" -RockClubEntrancePermissions: - INCBIN "data/maps/permissions/rock_club_entrance.bin" - -RockClubEntranceCGBTilemap:: ; 825e7 (20:65e7) - db $14 ; width - db $12 ; height - dw RockClubEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/rock_club_entrance_cgb.bin" -RockClubEntranceCGBPermissions: - INCBIN "data/maps/permissions/rock_club_entrance_cgb.bin" - -WaterClubEntranceTilemap:: ; 82704 (20:6704) - db $14 ; width - db $12 ; height - dw WaterClubEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/water_club_entrance.bin" -WaterClubEntrancePermissions: - INCBIN "data/maps/permissions/water_club_entrance.bin" - -WaterClubEntranceCGBTilemap:: ; 827ce (20:67ce) - db $14 ; width - db $12 ; height - dw WaterClubEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/water_club_entrance_cgb.bin" -WaterClubEntranceCGBPermissions: - INCBIN "data/maps/permissions/water_club_entrance_cgb.bin" - -LightningClubEntranceTilemap:: ; 828eb (20:68eb) - db $14 ; width - db $12 ; height - dw LightningClubEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/lightning_club_entrance.bin" -LightningClubEntrancePermissions: - INCBIN "data/maps/permissions/lightning_club_entrance.bin" - -LightningClubEntranceCGBTilemap:: ; 829b5 (20:69b5) - db $14 ; width - db $12 ; height - dw LightningClubEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/lightning_club_entrance_cgb.bin" -LightningClubEntranceCGBPermissions: - INCBIN "data/maps/permissions/lightning_club_entrance_cgb.bin" - -GrassClubEntranceTilemap:: ; 82ad2 (20:6ad2) - db $14 ; width - db $12 ; height - dw GrassClubEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/grass_club_entrance.bin" -GrassClubEntrancePermissions: - INCBIN "data/maps/permissions/grass_club_entrance.bin" - -GrassClubEntranceCGBTilemap:: ; 82b9c (20:6b9c) - db $14 ; width - db $12 ; height - dw GrassClubEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/grass_club_entrance_cgb.bin" -GrassClubEntranceCGBPermissions: - INCBIN "data/maps/permissions/grass_club_entrance_cgb.bin" - -PsychicClubEntranceTilemap:: ; 82cb9 (20:6cb9) - db $14 ; width - db $12 ; height - dw PsychicClubEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/psychic_club_entrance.bin" -PsychicClubEntrancePermissions: - INCBIN "data/maps/permissions/psychic_club_entrance.bin" - -PsychicClubEntranceCGBTilemap:: ; 82d83 (20:6d83) - db $14 ; width - db $12 ; height - dw PsychicClubEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/psychic_club_entrance_cgb.bin" -PsychicClubEntranceCGBPermissions: - INCBIN "data/maps/permissions/psychic_club_entrance_cgb.bin" - -ScienceClubEntranceTilemap:: ; 82ea0 (20:6ea0) - db $14 ; width - db $12 ; height - dw ScienceClubEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/science_club_entrance.bin" -ScienceClubEntrancePermissions: - INCBIN "data/maps/permissions/science_club_entrance.bin" - -ScienceClubEntranceCGBTilemap:: ; 82f6a (20:6f6a) - db $14 ; width - db $12 ; height - dw ScienceClubEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/science_club_entrance_cgb.bin" -ScienceClubEntranceCGBPermissions: - INCBIN "data/maps/permissions/science_club_entrance_cgb.bin" - -FireClubEntranceTilemap:: ; 83087 (20:7087) - db $14 ; width - db $12 ; height - dw FireClubEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/fire_club_entrance.bin" -FireClubEntrancePermissions: - INCBIN "data/maps/permissions/fire_club_entrance.bin" - -FireClubEntranceCGBTilemap:: ; 83151 (20:7151) - db $14 ; width - db $12 ; height - dw FireClubEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/fire_club_entrance_cgb.bin" -FireClubEntranceCGBPermissions: - INCBIN "data/maps/permissions/fire_club_entrance_cgb.bin" - -ChallengeHallEntranceTilemap:: ; 8326e (20:726e) - db $14 ; width - db $12 ; height - dw ChallengeHallEntrancePermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/challenge_hall_entrance.bin" -ChallengeHallEntrancePermissions: - INCBIN "data/maps/permissions/challenge_hall_entrance.bin" - -ChallengeHallEntranceCGBTilemap:: ; 83321 (20:7321) - db $14 ; width - db $12 ; height - dw ChallengeHallEntranceCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/challenge_hall_entrance_cgb.bin" -ChallengeHallEntranceCGBPermissions: - INCBIN "data/maps/permissions/challenge_hall_entrance_cgb.bin" - -ClubLobbyTilemap:: ; 83424 (20:7424) - db $1c ; width - db $1a ; height - dw ClubLobbyPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/club_lobby.bin" -ClubLobbyPermissions: - INCBIN "data/maps/permissions/club_lobby.bin" - -ClubLobbyCGBTilemap:: ; 83545 (20:7545) - db $1c ; width - db $1a ; height - dw ClubLobbyCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/club_lobby_cgb.bin" -ClubLobbyCGBPermissions: - INCBIN "data/maps/permissions/club_lobby_cgb.bin" - -FightingClubTilemap:: ; 836db (20:76db) - db $18 ; width - db $12 ; height - dw FightingClubPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/fighting_club.bin" -FightingClubPermissions: - INCBIN "data/maps/permissions/fighting_club.bin" - -FightingClubCGBTilemap:: ; 8378c (20:778c) - db $18 ; width - db $12 ; height - dw FightingClubCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/fighting_club_cgb.bin" -FightingClubCGBPermissions: - INCBIN "data/maps/permissions/fighting_club_cgb.bin" - -RockClubTilemap:: ; 8388d (20:788d) - db $1c ; width - db $1e ; height - dw RockClubPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/rock_club.bin" -RockClubPermissions: - INCBIN "data/maps/permissions/rock_club.bin" - -RockClubCGBTilemap:: ; 839d6 (20:79d6) - db $1c ; width - db $1e ; height - dw RockClubCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/rock_club_cgb.bin" -RockClubCGBPermissions: - INCBIN "data/maps/permissions/rock_club_cgb.bin" - -PokemonDomeDoorMapEventTilemap:: ; 83bf1 (20:7bf1) - db $04 ; width - db $03 ; height - dw PokemonDomeDoorMapEventPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/pokemon_dome_door_map_event.bin" -PokemonDomeDoorMapEventPermissions: - INCBIN "data/maps/permissions/pokemon_dome_door_map_event.bin" - -PokemonDomeDoorMapEventCGBTilemap:: ; 83c03 (20:7c03) - db $04 ; width - db $03 ; height - dw PokemonDomeDoorMapEventCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/pokemon_dome_door_map_event_cgb.bin" -PokemonDomeDoorMapEventCGBPermissions: - INCBIN "data/maps/permissions/pokemon_dome_door_map_event_cgb.bin" - -HallOfHonorDoorMapEventTilemap:: ; 83c1a (20:7c1a) - db $04 ; width - db $03 ; height - dw HallOfHonorDoorMapEventPermissions - db FALSE ; cgb mode - INCBIN "data/maps/tiles/hall_of_honor_door_map_event.bin" -HallOfHonorDoorMapEventPermissions: - INCBIN "data/maps/permissions/hall_of_honor_door_map_event.bin" - -HallOfHonorDoorMapEventCGBTilemap:: ; 83c26 (20:7c26) - db $04 ; width - db $03 ; height - dw HallOfHonorDoorMapEventCGBPermissions - db TRUE ; cgb mode - INCBIN "data/maps/tiles/hall_of_honor_door_map_event_cgb.bin" -HallOfHonorDoorMapEventCGBPermissions: - INCBIN "data/maps/permissions/hall_of_honor_door_map_event_cgb.bin" - -GrassMedalTilemap:: ; 83c36 (20:7c36) - db $03 ; width - db $03 ; height - dw NULL - db TRUE ; cgb mode - INCBIN "data/maps/tiles/grass_medal.bin" - -AnimData1:: ; 83c4c (20:7c4c) - frame_table AnimFrameTable0 - frame_data 3, 16, 0, 0 - frame_data 4, 16, 0, 0 - frame_data 0, 0, 0, 0 - -Palette110:: ; 83c5b (20:7c5b) - db $00, $00 diff --git a/src/engine/copy_card_name.asm b/src/engine/copy_card_name.asm new file mode 100644 index 0000000..feb33ca --- /dev/null +++ b/src/engine/copy_card_name.asm @@ -0,0 +1,152 @@ +; copy the name and level of the card at wLoadedCard1 to wDefaultText +; a = length in number of tiles (the resulting string will be padded with spaces to match it) +_CopyCardNameAndLevel: + push bc + push de + ld [wCardNameLength], a + ld hl, wLoadedCard1Name + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wDefaultText + push de + call CopyText ; copy card name to wDefaultText + pop hl + ld a, [hli] + cp TX_HALFWIDTH + jp z, _CopyCardNameAndLevel_HalfwidthText + +; the name doesn't start with TX_HALFWIDTH +; this doesn't appear to be ever the case (unless caller manipulates wLoadedCard1Name) + ld a, [wCardNameLength] + ld c, a + ld a, [wLoadedCard1Type] + cp TYPE_ENERGY + jr nc, .level_done ; jump if energy or trainer + ld a, [wLoadedCard1Level] + or a + jr z, .level_done + inc c + inc c + ld a, [wLoadedCard1Level] + cp 10 + jr c, .level_done + inc c ; second digit +.level_done + ld hl, wLoadedCard1Name + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wDefaultText + push de + call CopyText + pop hl + push de + ld e, c + call GetTextLengthInTiles + add e + ld c, a + pop hl + push hl +.fill_loop + ld a, $70 + ld [hli], a + dec c + jr nz, .fill_loop + ld [hl], TX_END + pop hl + ld a, [wLoadedCard1Type] + cp TYPE_ENERGY + jr nc, .done + ld a, [wLoadedCard1Level] + or a + jr z, .done + ld a, TX_SYMBOL + ld [hli], a + ld [hl], SYM_Lv + inc hl + ld a, [wLoadedCard1Level] + cp 10 + jr c, .one_digit + ld [hl], TX_SYMBOL + inc hl + ld b, SYM_0 - 1 +.first_digit_loop + inc b + sub 10 + jr nc, .first_digit_loop + add 10 + ld [hl], b ; first digit + inc hl +.one_digit + ld [hl], TX_SYMBOL + inc hl + add SYM_0 + ld [hl], a ; last (or only) digit + inc hl +.done + pop de + pop bc + ret + +; the name starts with TX_HALFWIDTH +_CopyCardNameAndLevel_HalfwidthText: + ld a, [wCardNameLength] + inc a + add a + ld b, a + ld hl, wDefaultText +.find_end_text_loop + dec b + ld a, [hli] + or a ; TX_END + jr nz, .find_end_text_loop + dec hl + ld a, [wLoadedCard1Type] + cp TYPE_ENERGY + jr nc, .level_done + ld a, [wLoadedCard1Level] + or a + jr z, .level_done + ld c, a + ld a, " " + ld [hli], a + dec b + ld a, "L" + ld [hli], a + dec b + ld a, "v" + ld [hli], a + dec b + ld a, c + cp 10 + jr c, .got_level + push bc + ld b, "0" - 1 +.first_digit_loop + inc b + sub 10 + jr nc, .first_digit_loop + add 10 + ld [hl], b ; first digit + inc hl + pop bc + ld c, a + dec b +.got_level + ld a, c + add "0" + ld [hli], a ; last (or only) digit + dec b +.level_done + push hl + ld a, " " +.fill_spaces_loop + ld [hli], a + dec b + jr nz, .fill_spaces_loop + ld [hl], TX_END + pop hl + pop de + pop bc + ret diff --git a/src/engine/credits.asm b/src/engine/credits.asm new file mode 100644 index 0000000..8ead323 --- /dev/null +++ b/src/engine/credits.asm @@ -0,0 +1,189 @@ +PlayCreditsSequence: + ld a, MUSIC_STOP + call PlaySong + call Func_1d705 + call AddAllMastersToMastersBeatenList + xor a + ld [wOWMapEvents + 1], a + ld a, MUSIC_CREDITS + call PlaySong + farcall FlashWhiteScreen + call SetCreditsSequenceCmdPtr +.asm_1d6c8 + call DoFrameIfLCDEnabled + call Func_1d765 + call ExecuteCreditsSequenceCmd + ld a, [wSequenceDelay] + cp $ff + jr nz, .asm_1d6c8 + call WaitForSongToFinish + ld a, $8 + farcall Func_12863 + ld a, MUSIC_STOP + call PlaySong + farcall Func_10ab4 + call Func_3ca4 + call SetWindowOff + call Func_1d758 + call EnableLCD + call DoFrameIfLCDEnabled + call DisableLCD + ld hl, wLCDC + set 1, [hl] + call ResetDoFrameFunction + ret + +Func_1d705: + call DisableLCD + farcall Func_10a9b + call Func_3ca0 + farcall Func_10000 + call Func_1d7ee + ld hl, Func_3e31 + call SetDoFrameFunction + call .Func_1d720 ; can be fallthrough + ret + +.Func_1d720 + ld a, $91 + ld [wd647], a + ld [wd649], a + ld a, $01 + ld [wd648], a + ld [wd64a], a + call Func_1d765 + call SetWindowOn + call .Func_1d73a ; can be fallthrough + ret + +.Func_1d73a + push hl + di + xor a + ld [wd657], a + ld hl, wLCDCFunctionTrampoline + 1 + ld [hl], LOW(Func_3e44) + inc hl + ld [hl], HIGH(Func_3e44) + ei + + ld hl, rSTAT + set STAT_LYC, [hl] + xor a + ldh [rLYC], a + ld hl, rIE + set INT_LCD_STAT, [hl] + pop hl + ret + +Func_1d758: + push hl + ld hl, rSTAT + res STAT_LYC, [hl] + ld hl, rIE + res INT_LCD_STAT, [hl] + pop hl + ret + +Func_1d765: + push hl + push bc + push de + xor a + ldh [hWY], a + + ld hl, wd659 + ld de, wd65f + ld a, [wd648] + or a + jr nz, .asm_1d785 + ld a, $a7 + ldh [hWX], a + ld [hli], a + push hl + ld hl, wLCDC + set 1, [hl] + pop hl + jr .asm_1d7e2 + +.asm_1d785 + ld a, [wd647] + or a + jr z, .asm_1d79e + dec a + ld [de], a + inc de + ld a, $a7 + ldh [hWX], a + ld [hli], a + push hl + ld hl, wLCDC + set 1, [hl] + pop hl + ld a, $07 + jr .asm_1d7a9 + +.asm_1d79e + ld a, $07 + ldh [hWX], a + push hl + ld hl, wLCDC + res 1, [hl] + pop hl +.asm_1d7a9 + ld [hli], a + ld a, [wd647] + dec a + ld c, a + ld a, [wd648] + add c + ld c, a + ld a, [wd649] + dec a + cp c + jr c, .asm_1d7d4 + jr z, .asm_1d7d4 + ld a, c + ld [de], a + inc de + push af + ld a, $a7 + ld [hli], a + pop bc + ld a, [wd64a] + or a + jr z, .asm_1d7e2 + ld a, [wd649] + dec a + ld [de], a + inc de + ld a, $07 + ld [hli], a + +.asm_1d7d4 + ld a, [wd649] + dec a + ld c, a + ld a, [wd64a] + add c + ld [de], a + inc de + ld a, $a7 + ld [hli], a +.asm_1d7e2 + ld a, $ff + ld [de], a + ld a, $01 + ld [wd665], a + pop de + pop bc + pop hl + ret + +Func_1d7ee: + xor a + lb de, 0, 32 + lb bc, 20, 18 + lb hl, 0, 0 + call FillRectangle + ret diff --git a/src/engine/ai/attacks.asm b/src/engine/duel/ai/attacks.asm index 69ae2e1..69ae2e1 100644 --- a/src/engine/ai/attacks.asm +++ b/src/engine/duel/ai/attacks.asm diff --git a/src/engine/ai/boss_deck_set_up.asm b/src/engine/duel/ai/boss_deck_set_up.asm index ebcd2ea..ebcd2ea 100644 --- a/src/engine/ai/boss_deck_set_up.asm +++ b/src/engine/duel/ai/boss_deck_set_up.asm diff --git a/src/engine/ai/common.asm b/src/engine/duel/ai/common.asm index d4f1da4..d4f1da4 100644 --- a/src/engine/ai/common.asm +++ b/src/engine/duel/ai/common.asm diff --git a/src/engine/ai/core.asm b/src/engine/duel/ai/core.asm index f182375..9604322 100644 --- a/src/engine/ai/core.asm +++ b/src/engine/duel/ai/core.asm @@ -1,4 +1,4 @@ -INCLUDE "engine/ai/decks/unreferenced.asm" +INCLUDE "engine/duel/ai/decks/unreferenced.asm" ; returns carry if damage dealt from any of ; a card's attacks KOs defending Pokémon @@ -707,13 +707,13 @@ LookForCardIDInHand: ; 143bf (5:43bf) or a ret -INCLUDE "engine/ai/damage_calculation.asm" +INCLUDE "engine/duel/ai/damage_calculation.asm" AIProcessHandTrainerCards: ; 14663 (5:4663) farcall _AIProcessHandTrainerCards ret -INCLUDE "engine/ai/deck_ai.asm" +INCLUDE "engine/duel/ai/deck_ai.asm" ; return carry if card ID loaded in a is found in hand ; and outputs in a the deck index of that card @@ -815,7 +815,7 @@ AIAttachEnergyInHandToCardInBench: ; 1562b (5:562b) ld b, PLAY_AREA_BENCH_1 jr AIAttachEnergyInHandToCardInPlayArea.attach -INCLUDE "engine/ai/init.asm" +INCLUDE "engine/duel/ai/init.asm" ; load selected attack from Pokémon in hTempPlayAreaLocation_ff9d, ; gets an energy card to discard and subsequently @@ -1306,7 +1306,7 @@ Func_15886: ; 15886 (5:5886) inc hl jr .loop_energy_cards -INCLUDE "engine/ai/retreat.asm" +INCLUDE "engine/duel/ai/retreat.asm" ; Copy cards from wDuelTempList in hl to wHandTempList in de CopyHandCardList: ; 15ea6 (5:5ea6) @@ -1317,7 +1317,7 @@ CopyHandCardList: ; 15ea6 (5:5ea6) inc de jr CopyHandCardList -INCLUDE "engine/ai/hand_pokemon.asm" +INCLUDE "engine/duel/ai/hand_pokemon.asm" ; check if player's active Pokémon is Mr Mime ; if it isn't, set carry @@ -1804,11 +1804,11 @@ CheckForEvolutionInDeck: ; 16451 (5:6451) scf ret -INCLUDE "engine/ai/energy.asm" +INCLUDE "engine/duel/ai/energy.asm" -INCLUDE "engine/ai/attacks.asm" +INCLUDE "engine/duel/ai/attacks.asm" -INCLUDE "engine/ai/special_attacks.asm" +INCLUDE "engine/duel/ai/special_attacks.asm" ; checks in other Play Area for non-basic cards. ; afterwards, that card is checked for damage, @@ -2285,7 +2285,7 @@ CheckCardEvolutionInHandOrDeck: ; 17274 (5:7274) scf ret -INCLUDE "engine/ai/boss_deck_set_up.asm" +INCLUDE "engine/duel/ai/boss_deck_set_up.asm" ; returns carry if Pokemon at PLAY_AREA* in a ; can damage defending Pokémon with any of its attacks diff --git a/src/engine/ai/damage_calculation.asm b/src/engine/duel/ai/damage_calculation.asm index 97c24b6..97c24b6 100644 --- a/src/engine/ai/damage_calculation.asm +++ b/src/engine/duel/ai/damage_calculation.asm diff --git a/src/engine/ai/deck_ai.asm b/src/engine/duel/ai/deck_ai.asm index c330418..b46de01 100644 --- a/src/engine/ai/deck_ai.asm +++ b/src/engine/duel/ai/deck_ai.asm @@ -61,22 +61,22 @@ ENDM ; wAICardListRetreatBonus : scores given to certain cards for retreat; ; wAICardListEnergyBonus : max number of energy cards and card scores. -INCLUDE "engine/ai/decks/general.asm" -INCLUDE "engine/ai/decks/sams_practice.asm" -INCLUDE "engine/ai/decks/general_no_retreat.asm" -INCLUDE "engine/ai/decks/legendary_moltres.asm" -INCLUDE "engine/ai/decks/legendary_zapdos.asm" -INCLUDE "engine/ai/decks/legendary_articuno.asm" -INCLUDE "engine/ai/decks/legendary_dragonite.asm" -INCLUDE "engine/ai/decks/first_strike.asm" -INCLUDE "engine/ai/decks/rock_crusher.asm" -INCLUDE "engine/ai/decks/go_go_rain_dance.asm" -INCLUDE "engine/ai/decks/zapping_selfdestruct.asm" -INCLUDE "engine/ai/decks/flower_power.asm" -INCLUDE "engine/ai/decks/strange_psyshock.asm" -INCLUDE "engine/ai/decks/wonders_of_science.asm" -INCLUDE "engine/ai/decks/fire_charge.asm" -INCLUDE "engine/ai/decks/im_ronald.asm" -INCLUDE "engine/ai/decks/powerful_ronald.asm" -INCLUDE "engine/ai/decks/invincible_ronald.asm" -INCLUDE "engine/ai/decks/legendary_ronald.asm" +INCLUDE "engine/duel/ai/decks/general.asm" +INCLUDE "engine/duel/ai/decks/sams_practice.asm" +INCLUDE "engine/duel/ai/decks/general_no_retreat.asm" +INCLUDE "engine/duel/ai/decks/legendary_moltres.asm" +INCLUDE "engine/duel/ai/decks/legendary_zapdos.asm" +INCLUDE "engine/duel/ai/decks/legendary_articuno.asm" +INCLUDE "engine/duel/ai/decks/legendary_dragonite.asm" +INCLUDE "engine/duel/ai/decks/first_strike.asm" +INCLUDE "engine/duel/ai/decks/rock_crusher.asm" +INCLUDE "engine/duel/ai/decks/go_go_rain_dance.asm" +INCLUDE "engine/duel/ai/decks/zapping_selfdestruct.asm" +INCLUDE "engine/duel/ai/decks/flower_power.asm" +INCLUDE "engine/duel/ai/decks/strange_psyshock.asm" +INCLUDE "engine/duel/ai/decks/wonders_of_science.asm" +INCLUDE "engine/duel/ai/decks/fire_charge.asm" +INCLUDE "engine/duel/ai/decks/im_ronald.asm" +INCLUDE "engine/duel/ai/decks/powerful_ronald.asm" +INCLUDE "engine/duel/ai/decks/invincible_ronald.asm" +INCLUDE "engine/duel/ai/decks/legendary_ronald.asm" diff --git a/src/engine/ai/decks/fire_charge.asm b/src/engine/duel/ai/decks/fire_charge.asm index f5b347b..f5b347b 100644 --- a/src/engine/ai/decks/fire_charge.asm +++ b/src/engine/duel/ai/decks/fire_charge.asm diff --git a/src/engine/ai/decks/first_strike.asm b/src/engine/duel/ai/decks/first_strike.asm index 2e636e1..2e636e1 100644 --- a/src/engine/ai/decks/first_strike.asm +++ b/src/engine/duel/ai/decks/first_strike.asm diff --git a/src/engine/ai/decks/flower_power.asm b/src/engine/duel/ai/decks/flower_power.asm index 4d423a3..4d423a3 100644 --- a/src/engine/ai/decks/flower_power.asm +++ b/src/engine/duel/ai/decks/flower_power.asm diff --git a/src/engine/ai/decks/general.asm b/src/engine/duel/ai/decks/general.asm index 039e101..039e101 100644 --- a/src/engine/ai/decks/general.asm +++ b/src/engine/duel/ai/decks/general.asm diff --git a/src/engine/ai/decks/general_no_retreat.asm b/src/engine/duel/ai/decks/general_no_retreat.asm index 20d84e3..20d84e3 100644 --- a/src/engine/ai/decks/general_no_retreat.asm +++ b/src/engine/duel/ai/decks/general_no_retreat.asm diff --git a/src/engine/ai/decks/go_go_rain_dance.asm b/src/engine/duel/ai/decks/go_go_rain_dance.asm index 23547e2..23547e2 100644 --- a/src/engine/ai/decks/go_go_rain_dance.asm +++ b/src/engine/duel/ai/decks/go_go_rain_dance.asm diff --git a/src/engine/ai/decks/im_ronald.asm b/src/engine/duel/ai/decks/im_ronald.asm index b002d83..b002d83 100644 --- a/src/engine/ai/decks/im_ronald.asm +++ b/src/engine/duel/ai/decks/im_ronald.asm diff --git a/src/engine/ai/decks/invincible_ronald.asm b/src/engine/duel/ai/decks/invincible_ronald.asm index 463560b..463560b 100644 --- a/src/engine/ai/decks/invincible_ronald.asm +++ b/src/engine/duel/ai/decks/invincible_ronald.asm diff --git a/src/engine/ai/decks/legendary_articuno.asm b/src/engine/duel/ai/decks/legendary_articuno.asm index 6409330..6409330 100644 --- a/src/engine/ai/decks/legendary_articuno.asm +++ b/src/engine/duel/ai/decks/legendary_articuno.asm diff --git a/src/engine/ai/decks/legendary_dragonite.asm b/src/engine/duel/ai/decks/legendary_dragonite.asm index 597f72c..597f72c 100644 --- a/src/engine/ai/decks/legendary_dragonite.asm +++ b/src/engine/duel/ai/decks/legendary_dragonite.asm diff --git a/src/engine/ai/decks/legendary_moltres.asm b/src/engine/duel/ai/decks/legendary_moltres.asm index c2a3882..c2a3882 100644 --- a/src/engine/ai/decks/legendary_moltres.asm +++ b/src/engine/duel/ai/decks/legendary_moltres.asm diff --git a/src/engine/ai/decks/legendary_ronald.asm b/src/engine/duel/ai/decks/legendary_ronald.asm index 3356838..3356838 100644 --- a/src/engine/ai/decks/legendary_ronald.asm +++ b/src/engine/duel/ai/decks/legendary_ronald.asm diff --git a/src/engine/ai/decks/legendary_zapdos.asm b/src/engine/duel/ai/decks/legendary_zapdos.asm index cc99f0c..cc99f0c 100644 --- a/src/engine/ai/decks/legendary_zapdos.asm +++ b/src/engine/duel/ai/decks/legendary_zapdos.asm diff --git a/src/engine/ai/decks/powerful_ronald.asm b/src/engine/duel/ai/decks/powerful_ronald.asm index 096fbea..096fbea 100644 --- a/src/engine/ai/decks/powerful_ronald.asm +++ b/src/engine/duel/ai/decks/powerful_ronald.asm diff --git a/src/engine/ai/decks/rock_crusher.asm b/src/engine/duel/ai/decks/rock_crusher.asm index 41a50fa..41a50fa 100644 --- a/src/engine/ai/decks/rock_crusher.asm +++ b/src/engine/duel/ai/decks/rock_crusher.asm diff --git a/src/engine/ai/decks/sams_practice.asm b/src/engine/duel/ai/decks/sams_practice.asm index dddce61..dddce61 100644 --- a/src/engine/ai/decks/sams_practice.asm +++ b/src/engine/duel/ai/decks/sams_practice.asm diff --git a/src/engine/ai/decks/strange_psyshock.asm b/src/engine/duel/ai/decks/strange_psyshock.asm index ef378b0..ef378b0 100644 --- a/src/engine/ai/decks/strange_psyshock.asm +++ b/src/engine/duel/ai/decks/strange_psyshock.asm diff --git a/src/engine/ai/decks/unreferenced.asm b/src/engine/duel/ai/decks/unreferenced.asm index 8722a27..8722a27 100644 --- a/src/engine/ai/decks/unreferenced.asm +++ b/src/engine/duel/ai/decks/unreferenced.asm diff --git a/src/engine/ai/decks/wonders_of_science.asm b/src/engine/duel/ai/decks/wonders_of_science.asm index 706a7e6..706a7e6 100644 --- a/src/engine/ai/decks/wonders_of_science.asm +++ b/src/engine/duel/ai/decks/wonders_of_science.asm diff --git a/src/engine/ai/decks/zapping_selfdestruct.asm b/src/engine/duel/ai/decks/zapping_selfdestruct.asm index da5e7c6..da5e7c6 100644 --- a/src/engine/ai/decks/zapping_selfdestruct.asm +++ b/src/engine/duel/ai/decks/zapping_selfdestruct.asm diff --git a/src/engine/ai/energy.asm b/src/engine/duel/ai/energy.asm index ce8c037..ce8c037 100644 --- a/src/engine/ai/energy.asm +++ b/src/engine/duel/ai/energy.asm diff --git a/src/engine/ai/hand_pokemon.asm b/src/engine/duel/ai/hand_pokemon.asm index 27a4176..27a4176 100644 --- a/src/engine/ai/hand_pokemon.asm +++ b/src/engine/duel/ai/hand_pokemon.asm diff --git a/src/engine/ai/init.asm b/src/engine/duel/ai/init.asm index 33132cf..33132cf 100644 --- a/src/engine/ai/init.asm +++ b/src/engine/duel/ai/init.asm diff --git a/src/engine/ai/pkmn_powers.asm b/src/engine/duel/ai/pkmn_powers.asm index 8ae629a..8ae629a 100644 --- a/src/engine/ai/pkmn_powers.asm +++ b/src/engine/duel/ai/pkmn_powers.asm diff --git a/src/engine/ai/retreat.asm b/src/engine/duel/ai/retreat.asm index 768a48b..768a48b 100644 --- a/src/engine/ai/retreat.asm +++ b/src/engine/duel/ai/retreat.asm diff --git a/src/engine/ai/special_attacks.asm b/src/engine/duel/ai/special_attacks.asm index 770324e..770324e 100644 --- a/src/engine/ai/special_attacks.asm +++ b/src/engine/duel/ai/special_attacks.asm diff --git a/src/engine/ai/trainer_cards.asm b/src/engine/duel/ai/trainer_cards.asm index 4bee001..4bee001 100644 --- a/src/engine/ai/trainer_cards.asm +++ b/src/engine/duel/ai/trainer_cards.asm diff --git a/src/engine/duel/animations/commands.asm b/src/engine/duel/animations/commands.asm new file mode 100644 index 0000000..46b1ea1 --- /dev/null +++ b/src/engine/duel/animations/commands.asm @@ -0,0 +1,354 @@ +; reads the animation commands from PointerTable_AttackAnimation +; of attack in wLoadedAttackAnimation and plays them +PlayAttackAnimationCommands: + ld a, [wLoadedAttackAnimation] + or a + ret z + + ld l, a + ld h, 0 + add hl, hl + ld de, PointerTable_AttackAnimation + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + + push de + ld hl, wce7e + ld a, [hl] + or a + jr nz, .read_command + ld [hl], $01 + call Func_3b21 + pop de + + push de + ld a, DUEL_ANIM_SCREEN_MAIN_SCENE + ld [wDuelAnimationScreen], a + ld a, $01 + ld [wd4b3], a + xor a + ld [wDuelAnimLocationParam], a + ld a, [de] + cp $04 + jr z, .read_command + ld a, DUEL_ANIM_150 + call PlayDuelAnimation +.read_command + pop de + ; fallthrough + +PlayAttackAnimationCommands_NextCommand: + ld a, [de] + inc de + ld hl, AnimationCommandPointerTable + jp JumpToFunctionInTable + +AnimationCommand_AnimEnd: + ret + +AnimationCommand_AnimPlayer: + ldh a, [hWhoseTurn] + ld [wDuelAnimDuelistSide], a + ld a, [wDuelType] + cp $00 + jr nz, AnimationCommand_AnimNormal + ld a, PLAYER_TURN + ld [wDuelAnimDuelistSide], a + jr AnimationCommand_AnimNormal + +AnimationCommand_AnimOpponent: + call SwapTurn + ldh a, [hWhoseTurn] + ld [wDuelAnimDuelistSide], a + call SwapTurn + ld a, [wDuelType] + cp $00 + jr nz, AnimationCommand_AnimNormal + ld a, OPPONENT_TURN + ld [wDuelAnimDuelistSide], a + jr AnimationCommand_AnimNormal + +AnimationCommand_AnimUnknown2: + ld a, [wce82] + and $7f + ld [wDuelAnimLocationParam], a + jr AnimationCommand_AnimNormal + +AnimationCommand_AnimEnd2: + ret + +AnimationCommand_AnimNormal: + ld a, [de] + inc de + cp DUEL_ANIM_SHOW_DAMAGE + jr z, .show_damage + cp DUEL_ANIM_SHAKE1 + jr z, .shake_1 + cp DUEL_ANIM_SHAKE2 + jr z, .shake_2 + cp DUEL_ANIM_SHAKE3 + jr z, .shake_3 + +.play_anim + call PlayDuelAnimation + jr PlayAttackAnimationCommands_NextCommand + +.show_damage + ld a, DUEL_ANIM_PRINT_DAMAGE + call PlayDuelAnimation + ld a, [wce81] + ld [wd4b3], a + + push de + ld hl, wce7f + ld de, wDuelAnimDamage + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + pop de + + ld a, $8c + call PlayDuelAnimation + ld a, [wDuelDisplayedScreen] + cp DUEL_MAIN_SCENE + jr nz, .skip_update_hud + ld a, DUEL_ANIM_UPDATE_HUD + call PlayDuelAnimation +.skip_update_hud + jp PlayAttackAnimationCommands_NextCommand + +; screen shake happens differently +; depending on whose turn it is +.shake_1 + ld c, DUEL_ANIM_SMALL_SHAKE_X + ld b, DUEL_ANIM_SMALL_SHAKE_Y + jr .check_duelist + +.shake_2 + ld c, DUEL_ANIM_BIG_SHAKE_X + ld b, DUEL_ANIM_BIG_SHAKE_Y + jr .check_duelist + +.shake_3 + ld c, DUEL_ANIM_SMALL_SHAKE_Y + ld b, DUEL_ANIM_SMALL_SHAKE_X + +.check_duelist + ldh a, [hWhoseTurn] + cp PLAYER_TURN + ld a, c + jr z, .play_anim + ld a, [wDuelType] + cp $00 + ld a, c + jr z, .play_anim + ld a, b + jr .play_anim + +AnimationCommand_AnimUnknown: + ld a, [de] + inc de + ld [wd4b3], a + ld a, [wce82] + ld [wDuelAnimLocationParam], a + call SetDuelAnimationScreen + ld a, DUEL_ANIM_150 + call PlayDuelAnimation + jp PlayAttackAnimationCommands_NextCommand + +AnimationCommandPointerTable: + dw AnimationCommand_AnimEnd ; anim_end + dw AnimationCommand_AnimNormal ; anim_normal + dw AnimationCommand_AnimPlayer ; anim_player + dw AnimationCommand_AnimOpponent ; anim_opponent + dw AnimationCommand_AnimUnknown ; anim_unknown + dw AnimationCommand_AnimUnknown2 ; anim_unknown2 + dw AnimationCommand_AnimEnd2 ; anim_end2 (unused) + +; sets wDuelAnimationScreen according to wd4b3 +; if wd4b3 == $01, set it to Main Scene +; if wd4b3 == $04, st it to Play Area scene +SetDuelAnimationScreen: + ld a, [wd4b3] + cp $04 + jr z, .set_play_area_screen + cp $01 + ret nz + ld a, DUEL_ANIM_SCREEN_MAIN_SCENE + ld [wDuelAnimationScreen], a + ret + +.set_play_area_screen + ld a, [wDuelAnimLocationParam] + ld l, a + ld a, [wWhoseTurn] + ld h, a + cp PLAYER_TURN + jr z, .player + +; opponent + ld a, [wDuelType] + cp $00 + jr z, .asm_50c6 + +; link duel or vs. AI + bit 7, l + jr z, .asm_50e2 + jr .asm_50d2 + +.asm_50c6 + bit 7, l + jr z, .asm_50da + jr .asm_50ea + +.player + bit 7, l + jr z, .asm_50d2 + jr .asm_50e2 + +.asm_50d2 + ld l, UNKNOWN_SCREEN_4 + ld h, PLAYER_TURN + ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA + jr .ok +.asm_50da + ld l, UNKNOWN_SCREEN_4 + ld h, OPPONENT_TURN + ld a, DUEL_ANIM_SCREEN_PLAYER_PLAY_AREA + jr .ok +.asm_50e2 + ld l, UNKNOWN_SCREEN_5 + ld h, OPPONENT_TURN + ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA + jr .ok +.asm_50ea + ld l, UNKNOWN_SCREEN_5 + ld h, PLAYER_TURN + ld a, DUEL_ANIM_SCREEN_OPP_PLAY_AREA + +.ok + ld [wDuelAnimationScreen], a + ret + +Func_190f4: + ld a, [wd4b3] + cp $04 + jr z, Func_1910f + ; fallthrough + +Func_190fb: + cp $01 + jr nz, .done + ld a, DUEL_ANIM_SCREEN_MAIN_SCENE + ld [wDuelAnimationScreen], a + ld a, [wDuelDisplayedScreen] + cp $01 + jr z, .done + bank1call DrawDuelMainScene +.done + ret + +Func_1910f: + call SetDuelAnimationScreen + ld a, [wDuelDisplayedScreen] + cp l + jr z, .skip_change_screen + ld a, l + push af + ld l, PLAYER_TURN + ld a, [wDuelType] + cp $00 + jr nz, .asm_5127 + ld a, [wWhoseTurn] + ld l, a +.asm_5127 + call DrawYourOrOppPlayAreaScreen_Bank0 + pop af + ld [wDuelDisplayedScreen], a +.skip_change_screen + call DrawWideTextBox + ret + +; prints text related to the damage received +; by card stored in wTempNonTurnDuelistCardID +; takes into account type effectiveness +PrintDamageText: + push hl + push bc + push de + ld a, [wLoadedAttackAnimation] + cp ATK_ANIM_HEAL + jr z, .skip + cp ATK_ANIM_HEALING_WIND_PLAY_AREA + jr z, .skip + + ld a, [wTempNonTurnDuelistCardID] + ld e, a + ld d, $00 + call LoadCardDataToBuffer1_FromCardID + ld a, 18 + call CopyCardNameAndLevel + ld [hl], TX_END + ld hl, wTxRam2 + xor a + ld [hli], a + ld [hl], a + ld hl, wce7f + ld a, [hli] + ld h, [hl] + ld l, a + call GetDamageText + ld a, l + or h + call nz, DrawWideTextBox_PrintText +.skip + pop de + pop bc + pop hl + ret + +; returns in hl the text id associated with +; the damage in hl and its effectiveness +GetDamageText: + ld a, l + or h + jr z, .no_damage + call LoadTxRam3 + ld a, [wce81] + ldtx hl, AttackDamageText + and (1 << RESISTANCE) | (1 << WEAKNESS) + ret z ; not weak or resistant + ldtx hl, WeaknessMoreDamage2Text + cp (1 << RESISTANCE) | (1 << WEAKNESS) + ret z ; weak and resistant + and (1 << WEAKNESS) + ldtx hl, WeaknessMoreDamageText + ret nz ; weak + ldtx hl, ResistanceLessDamageText + ret ; resistant + +.no_damage + call CheckNoDamageOrEffect + ret c + ldtx hl, NoDamageText + ld a, [wce81] + and (1 << RESISTANCE) + ret z ; not resistant + ldtx hl, ResistanceNoDamageText + ret ; resistant + +UpdateMainSceneHUD: + ld a, [wDuelDisplayedScreen] + cp DUEL_MAIN_SCENE + ret nz + bank1call DrawDuelHUDs + ret + +Func_191a3: + ret + +INCLUDE "data/duel/animations/attack_animations.asm" diff --git a/src/engine/duel/animations/core.asm b/src/engine/duel/animations/core.asm new file mode 100644 index 0000000..5da9a0a --- /dev/null +++ b/src/engine/duel/animations/core.asm @@ -0,0 +1,661 @@ +Func_1c8bc: + push hl + push bc + call Set_OBJ_8x8 + ld a, LOW(Func_3ba2) + ld [wDoFrameFunction], a + ld a, HIGH(Func_3ba2) + ld [wDoFrameFunction + 1], a + ld a, $ff + ld hl, wAnimationQueue + ld c, ANIMATION_QUEUE_LENGTH +.fill_queue + ld [hli], a + dec c + jr nz, .fill_queue + ld [wd42a], a + ld [wd4c0], a + xor a + ld [wDuelAnimBufferCurPos], a + ld [wDuelAnimBufferSize], a + ld [wd4b3], a + call DefaultScreenAnimationUpdate + call Func_3ca0 + pop bc + pop hl + ret + +PlayLoadedDuelAnimation: + ld a, [wDoFrameFunction + 0] + cp LOW(Func_3ba2) + jr nz, .error + ld a, [wDoFrameFunction + 1] + cp HIGH(Func_3ba2) + jr z, .okay +.error + debug_nop + ret + +.okay + ld a, [wTempAnimation] + ld [wd4bf], a + cp DUEL_SPECIAL_ANIMS + jp nc, Func_1cb5e + + push hl + push bc + push de + call GetAnimationData +; hl: pointer + + ld a, [wAnimationsDisabled] + or a + jr z, .check_to_play_sfx + ; animations are disabled + push hl + ld bc, ANIM_SPRITE_ANIM_FLAGS + add hl, bc + ld a, [hl] + ; if flag is set, play animation anyway + and (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) + pop hl + jr z, .return + +.check_to_play_sfx + push hl + ld bc, ANIM_SOUND_FX_ID + add hl, bc + ld a, [hl] + pop hl + or a + jr z, .calc_addr + call PlaySFX + +.calc_addr +; this data field is always $00, +; so this calculation is unnecessary +; seems like there was supposed to be +; more than 1 function to handle animation + push hl + ld bc, ANIM_HANDLER_FUNCTION + add hl, bc + ld a, [hl] + rlca + add LOW(.address) ; $48 + ld l, a ; LO + ld a, HIGH(.address) ; $49 + adc 0 + ld h, a ; HI +; hl: pointer + ld a, [hli] + ld b, [hl] + ld c, a + pop hl + + call CallBC +.return + pop de + pop bc + pop hl + ret + +.address + dw .handler_func + +.handler_func ; 1c94a (7:494a) +; if any of ANIM_SPRITE_ID, ANIM_PALETTE_ID and ANIM_SPRITE_ANIM_ID +; are 0, then return + ld e, l + ld d, h + ld c, ANIM_SPRITE_ANIM_ID + 1 +.loop + ld a, [de] + or a + jr z, .return_with_carry + inc de + dec c + jr nz, .loop + + ld a, [hli] ; ANIM_SPRITE_ID + farcall CreateSpriteAndAnimBufferEntry + ld a, [wWhichSprite] + ld [wAnimationQueue], a ; push an animation to the queue + + xor a + ld [wVRAMTileOffset], a + ld [wd4cb], a + + ld a, [hli] ; ANIM_PALETTE_ID + farcall LoadPaletteData + ld a, [hli] ; ANIM_SPRITE_ANIM_ID + + push af + ld a, [hli] ; ANIM_SPRITE_ANIM_FLAGS + ld [wAnimFlags], a + call LoadAnimCoordsAndFlags + pop af + + farcall StartNewSpriteAnimation + or a + jr .done + +.return_with_carry + scf +.done + ret + +; loads the correct coordinates/flags for +; sprite animation in wAnimationQueue +LoadAnimCoordsAndFlags: + push hl + push bc + ld a, [wAnimationQueue] + ld c, SPRITE_ANIM_ATTRIBUTES + call GetSpriteAnimBufferProperty_SpriteInA + call GetAnimCoordsAndFlags + + push af + and (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_5) + or [hl] + ld [hli], a + ld a, b + ld [hli], a ; SPRITE_ANIM_COORD_X + ld [hl], c ; SPRITE_ANIM_COORD_Y + pop af + + ld bc, SPRITE_ANIM_FLAGS - SPRITE_ANIM_COORD_Y + add hl, bc + ld c, a ; useless + and (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) + or [hl] + ld [hl], a + pop bc + pop hl + ret + +; outputs x and y coordinates for the sprite animation +; taking into account who the turn duelist is. +; also returns in a the allowed animation flags of +; the configuration that is selected. +; output: +; a = anim flags +; b = x coordinate +; c = y coordinate +GetAnimCoordsAndFlags: + push hl + ld c, 0 + ld a, [wAnimFlags] + and (1 << SPRITE_ANIM_FLAG_SPEED) + jr nz, .calc_addr + + ld a, [wDuelAnimationScreen] + add a ; 2 * [wDuelAnimationScreen] + ld c, a + add a ; 4 * [wDuelAnimationScreen] + add c ; 6 * [wDuelAnimationScreen] + add a ; 12 * [wDuelAnimationScreen] + ld c, a + + ld a, [wDuelAnimDuelistSide] + cp PLAYER_TURN + jr z, .player_side +; opponent side + ld a, 6 + add c + ld c, a +.player_side + ld a, [wDuelAnimLocationParam] + add c ; a = [wDuelAnimLocationParam] + c + ld c, a + ld b, 0 + ld hl, AnimationCoordinatesIndex + add hl, bc + ld c, [hl] + +.calc_addr + ld a, c + add a ; a = c * 2 + add c ; a = c * 3 + ld c, a + ld b, 0 + ld hl, AnimationCoordinates + add hl, bc + ld b, [hl] ; x coord + inc hl + ld c, [hl] ; y coord + inc hl + ld a, [wAnimFlags] + and [hl] ; flags + pop hl + ret + +AnimationCoordinatesIndex: +; animations in the Duel Main Scene + db $01, $01, $01, $01, $01, $01 ; player + db $02, $02, $02, $02, $02, $02 ; opponent + +; animations in the Player's Play Area, for each Play Area Pokemon + db $03, $04, $05, $06, $07, $08 ; player + db $03, $04, $05, $06, $07, $08 ; opponent + +; animations in the Opponent's Play Area, for each Play Area Pokemon + db $09, $0a, $0b, $0c, $0d, $0e ; player + db $09, $0a, $0b, $0c, $0d, $0e ; opponent + +anim_coords: MACRO + db \1 + db \2 + db \3 +ENDM + +AnimationCoordinates: +; x coord, y coord, animation flags + anim_coords 88, 88, (1 << SPRITE_ANIM_FLAG_3) + +; animations in the Duel Main Scene + anim_coords 40, 80, $00 + anim_coords 136, 48, (1 << SPRITE_ANIM_FLAG_6) | (1 << SPRITE_ANIM_FLAG_5) | (1 << SPRITE_ANIM_FLAG_Y_SUBTRACT) | (1 << SPRITE_ANIM_FLAG_X_SUBTRACT) + +; animations in the Player's Play Area, for each Play Area Pokemon + anim_coords 88, 72, $00 + anim_coords 24, 96, $00 + anim_coords 56, 96, $00 + anim_coords 88, 96, $00 + anim_coords 120, 96, $00 + anim_coords 152, 96, $00 + +; animations in the Opponent's Play Area, for each Play Area Pokemon + anim_coords 88, 80, $00 + anim_coords 152, 40, $00 + anim_coords 120, 40, $00 + anim_coords 88, 40, $00 + anim_coords 56, 40, $00 + anim_coords 24, 40, $00 + +; appends to end of wDuelAnimBuffer +; the current duel animation +LoadDuelAnimationToBuffer: + push hl + push bc + ld a, [wDuelAnimBufferCurPos] + ld b, a + ld hl, wDuelAnimBufferSize + ld a, [hl] + ld c, a + add DUEL_ANIM_STRUCT_SIZE + and %01111111 + cp b + jp z, .skip + ld [hl], a + + ld b, $00 + ld hl, wDuelAnimBuffer + add hl, bc + ld a, [wTempAnimation] + ld [hli], a + ld a, [wDuelAnimationScreen] + ld [hli], a + ld a, [wDuelAnimDuelistSide] + ld [hli], a + ld a, [wDuelAnimLocationParam] + ld [hli], a + ld a, [wDuelAnimDamage] + ld [hli], a + ld a, [wDuelAnimDamage + 1] + ld [hli], a + ld a, [wd4b3] + ld [hli], a + ld a, [wDuelAnimReturnBank] + ld [hl], a + +.skip + pop bc + pop hl + ret + +; loads the animations from wDuelAnimBuffer +; in ascending order, starting at wDuelAnimBufferCurPos +PlayBufferedDuelAnimations: + push hl + push bc +.next_duel_anim + ld a, [wDuelAnimBufferSize] + ld b, a + ld a, [wDuelAnimBufferCurPos] + cp b + jr z, .skip + + ld c, a + add DUEL_ANIM_STRUCT_SIZE + and %01111111 + ld [wDuelAnimBufferCurPos], a + + ld b, $00 + ld hl, wDuelAnimBuffer + add hl, bc + ld a, [hli] + ld [wTempAnimation], a + ld a, [hli] + ld [wDuelAnimationScreen], a + ld a, [hli] + ld [wDuelAnimDuelistSide], a + ld a, [hli] + ld [wDuelAnimLocationParam], a + ld a, [hli] + ld [wDuelAnimDamage], a + ld a, [hli] + ld [wDuelAnimDamage + 1], a + ld a, [hli] + ld [wd4b3], a + ld a, [hl] + ld [wDuelAnimReturnBank], a + + call PlayLoadedDuelAnimation + call CheckAnyAnimationPlaying + jr nc, .next_duel_anim + +.skip + pop bc + pop hl + ret + +; gets data from Animations for anim ID in a +; outputs the pointer to the data in hl +GetAnimationData: + push bc + ld a, [wTempAnimation] + ld l, a + ld h, 0 + add hl, hl ; hl = anim * 2 + ld b, h + ld c, l + add hl, hl ; hl = anim * 4 + add hl, bc ; hl = anim * 6 + ld bc, Animations + add hl, bc + pop bc + ret + +Func_1cac5: + ld a, [wd42a] + cp $ff + jr nz, .asm_1cb03 + + ld a, [wd4c0] + or a + jr z, .asm_1cafb + cp $80 + jr z, .asm_1cb11 + ld hl, wAnimationQueue + ld c, ANIMATION_QUEUE_LENGTH +.loop_queue + push af + push bc + ld a, [hl] + cp $ff + jr z, .next + ld [wWhichSprite], a + farcall GetSpriteAnimCounter + cp $ff + jr nz, .next + farcall DisableCurSpriteAnim + ld a, $ff + ld [hl], a + +.next + pop bc + pop af + and [hl] + inc hl + dec c + jr nz, .loop_queue + +.asm_1cafb + cp $ff + jr nz, .skip_play_anims + call PlayBufferedDuelAnimations +.skip_play_anims + ret + +.asm_1cb03 + ld hl, wScreenAnimUpdatePtr + ld a, [hli] + ld h, [hl] + ld l, a + call CallHL2 + ld a, [wd42a] + jr .asm_1cafb + +.asm_1cb11 + ld a, $ff + ld [wd4c0], a + jr .asm_1cafb + +Func_1cb18: + push hl + push bc + push de + + ; if Func_3ba2 is not set as + ; wDoFrameFunction, quit and set carry + ld a, [wDoFrameFunction] + cp LOW(Func_3ba2) + jr nz, .carry + ld a, [wDoFrameFunction + 1] + cp HIGH(Func_3ba2) + jr nz, .carry + + ld a, $ff + ld [wd4c0], a + ld a, [wd42a] + cp $ff + call nz, DoScreenAnimationUpdate + +; clear all queued animations +; and disable their sprite anims + ld hl, wAnimationQueue + ld c, ANIMATION_QUEUE_LENGTH +.loop_queue + push bc + ld a, [hl] + cp $ff + jr z, .next_queued + ld [wWhichSprite], a + farcall DisableCurSpriteAnim + ld a, $ff + ld [hl], a +.next_queued + pop bc + inc hl + dec c + jr nz, .loop_queue + + xor a + ld [wDuelAnimBufferCurPos], a + ld [wDuelAnimBufferSize], a +.done + pop de + pop bc + pop hl + ret +.carry + scf + jr .done + +Func_1cb5e: + cp $96 + jp nc, Func_1ce03 + cp $8c + jp nz, InitScreenAnimation + jr .asm_1cb6a ; redundant +.asm_1cb6a + ld a, [wDuelAnimDamage + 1] + cp $03 + jr nz, .asm_1cb76 + ld a, [wDuelAnimDamage] + cp $e8 +.asm_1cb76 + ret nc + + xor a + ld [wd4b8], a + ld [wVRAMTileOffset], a + ld [wd4cb], a + + ld a, PALETTE_37 + farcall LoadPaletteData + call Func_1cba6 + + ld hl, wd4b3 + bit 0, [hl] + call nz, Func_1cc3e + + ld a, $12 + ld [wd4b8], a + bit 1, [hl] + call nz, Func_1cc4e + + bit 2, [hl] + call nz, Func_1cc66 + + xor a + ld [wd4b3], a + ret + +Func_1cba6: + call Func_1cc03 + xor a + ld [wd4b7], a + + ld hl, wd4b4 + ld de, wAnimationQueue + 1 +.asm_1cbb3 + push hl + push de + ld a, [hl] + or a + jr z, .asm_1cbbc + call Func_1cbcc + +.asm_1cbbc + pop de + pop hl + inc hl + inc de + ld a, [wd4b7] + inc a + ld [wd4b7], a + cp $03 + jr c, .asm_1cbb3 + ret + +Func_1cbcc: + push af + ld a, SPRITE_DUEL_4 + farcall CreateSpriteAndAnimBufferEntry + ld a, [wWhichSprite] + ld [de], a + ld a, (1 << SPRITE_ANIM_FLAG_UNSKIPPABLE) + ld [wAnimFlags], a + ld c, SPRITE_ANIM_COORD_X + call GetSpriteAnimBufferProperty + call GetAnimCoordsAndFlags + + ld a, [wd4b7] + add LOW(Unknown_1cbfd) + ld e, a + ld a, HIGH(Unknown_1cbfd) + adc 0 + ld d, a + ld a, [de] + add b + + ld [hli], a ; SPRITE_ANIM_COORD_X + ld [hl], c ; SPRITE_ANIM_COORD_Y + + ld a, [wd4b8] + ld c, a + pop af + farcall Func_12ac9 + ret + +Unknown_1cbfd: + db -$10, -$8, $0, $8, -$8, -$10 + +Func_1cc03: + ld a, [wDuelAnimDamage] + ld l, a + ld a, [wDuelAnimDamage + 1] + ld h, a + + ld de, wd4b4 + ld bc, -100 + call .Func_1cc2f + ld bc, -10 + call .Func_1cc2f + + ld a, l + add $4f + ld [de], a + ld hl, wd4b4 + ld c, 2 +.asm_1cc23 + ld a, [hl] + cp $4f + jr nz, .asm_1cc2e + ld [hl], $00 + inc hl + dec c + jr nz, .asm_1cc23 +.asm_1cc2e + ret + +.Func_1cc2f + ld a, $4e +.loop + inc a + add hl, bc + jr c, .loop + + ld [de], a + inc de + ld a, l + sub c + ld l, a + ld a, h + sbc b + ld h, a + ret + +Func_1cc3e: + push hl + ld a, $03 + ld [wd4b7], a + ld de, wAnimationQueue + 4 + ld a, SPRITE_ANIM_91 + call Func_1cbcc + pop hl + ret + +Func_1cc4e: + push hl + ld a, $04 + ld [wd4b7], a + ld de, wAnimationQueue + 5 + ld a, SPRITE_ANIM_90 + call Func_1cbcc + ld a, [wd4b8] + add $12 + ld [wd4b8], a + pop hl + ret + +Func_1cc66: + push hl + ld a, $05 + ld [wd4b7], a + ld de, wAnimationQueue + 6 + ld a, SPRITE_ANIM_89 + call Func_1cbcc + pop hl + ret diff --git a/src/engine/duel/animations/screen_effects.asm b/src/engine/duel/animations/screen_effects.asm new file mode 100644 index 0000000..9058071 --- /dev/null +++ b/src/engine/duel/animations/screen_effects.asm @@ -0,0 +1,286 @@ +; initializes a screen animation from wTempAnimation +; loads a function pointer for updating a frame +; and initializes the duration of the animation. +InitScreenAnimation: + ld a, [wAnimationsDisabled] + or a + jr nz, .skip + ld a, [wTempAnimation] + ld [wd42a], a + sub DUEL_SCREEN_ANIMS + add a + add a + ld c, a + ld b, $00 + ld hl, Data_1cc9f + add hl, bc + ld a, [hli] + ld [wScreenAnimUpdatePtr], a + ld c, a + ld a, [hli] + ld [wScreenAnimUpdatePtr + 1], a + ld b, a + ld a, [hl] + ld [wScreenAnimDuration], a + call CallBC +.skip + ret + +; for the following animations, these functions +; are run with the corresponding duration. +; this duration decides different effects, +; depending on which function runs +; and is decreased by one each time. +; when it is down to 0, the animation is done. + +screen_effect: MACRO + dw \1 ; function pointer + db \2 ; duration + db $00 ; padding +ENDM + +Data_1cc9f: +; function pointer, duration + screen_effect ShakeScreenX_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_X + screen_effect ShakeScreenX_Big, 32 ; DUEL_ANIM_BIG_SHAKE_X + screen_effect ShakeScreenY_Small, 24 ; DUEL_ANIM_SMALL_SHAKE_Y + screen_effect ShakeScreenY_Big, 32 ; DUEL_ANIM_BIG_SHAKE_Y + screen_effect WhiteFlashScreen, 8 ; DUEL_ANIM_FLASH + screen_effect DistortScreen, 63 ; DUEL_ANIM_DISTORT + +; checks if screen animation duration is over +; and if so, loads the default update function +LoadDefaultScreenAnimationUpdateWhenFinished: + ld a, [wScreenAnimDuration] + or a + ret nz + ; fallthrough + +; function called for the screen animation update when it is over +DefaultScreenAnimationUpdate: + ld a, $ff + ld [wd42a], a + call DisableInt_LYCoincidence + xor a + ldh [hSCX], a + ldh [rSCX], a + ldh [hSCY], a + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(DefaultScreenAnimationUpdate) + inc hl + ld [hl], HIGH(DefaultScreenAnimationUpdate) + ret + +; runs the screen update function set in wScreenAnimUpdatePtr +DoScreenAnimationUpdate: + ld a, 1 + ld [wScreenAnimDuration], a + ld hl, wScreenAnimUpdatePtr + ld a, [hli] + ld h, [hl] + ld l, a + call CallHL2 + jr DefaultScreenAnimationUpdate + +ShakeScreenX_Small: + ld hl, SmallShakeOffsets + jr ShakeScreenX + +ShakeScreenX_Big: + ld hl, BigShakeOffsets + jr ShakeScreenX + +ShakeScreenX: + ld a, l + ld [wd4bc], a + ld a, h + ld [wd4bc + 1], a + + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(.update) + inc hl + ld [hl], HIGH(.update) + ret + +.update + call DecrementScreenAnimDuration + call UpdateShakeOffset + jp nc, LoadDefaultScreenAnimationUpdateWhenFinished + ldh a, [hSCX] + add [hl] + ldh [hSCX], a + jp LoadDefaultScreenAnimationUpdateWhenFinished + +ShakeScreenY_Small: + ld hl, SmallShakeOffsets + jr ShakeScreenY + +ShakeScreenY_Big: + ld hl, BigShakeOffsets + jr ShakeScreenY + +ShakeScreenY: + ld a, l + ld [wd4bc], a + ld a, h + ld [wd4bc + 1], a + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(.update) + inc hl + ld [hl], HIGH(.update) + ret + +.update + call DecrementScreenAnimDuration + call UpdateShakeOffset + jp nc, LoadDefaultScreenAnimationUpdateWhenFinished + ldh a, [hSCY] + add [hl] + ldh [hSCY], a + jp LoadDefaultScreenAnimationUpdateWhenFinished + +; get the displacement of the current frame +; depending on the value of wScreenAnimDuration +; returns carry if displacement was updated +UpdateShakeOffset: + ld hl, wd4bc + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wScreenAnimDuration] + cp [hl] + ret nc + inc hl + push hl + inc hl + ld a, l + ld [wd4bc], a + ld a, h + ld [wd4bc + 1], a + pop hl + scf + ret + +SmallShakeOffsets: + db 21, 2 + db 17, -2 + db 13, 2 + db 9, -2 + db 5, 1 + db 1, -1 + +BigShakeOffsets: + db 29, 4 + db 25, -4 + db 21, 4 + db 17, -4 + db 13, 3 + db 9, -3 + db 5, 2 + db 1, -2 + +DecrementScreenAnimDuration: + ld hl, wScreenAnimDuration + dec [hl] + ret + +WhiteFlashScreen: + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(.update) + inc hl + ld [hl], HIGH(.update) + ld a, [wBGP] + ld [wd4bc], a + ; backup the current background pals + ld hl, wBackgroundPalettesCGB + ld de, wTempBackgroundPalettesCGB + ld bc, 8 palettes + call CopyDataHLtoDE_SaveRegisters + ld de, PALRGB_WHITE + ld hl, wBackgroundPalettesCGB + ld bc, (8 palettes) / 2 + call FillMemoryWithDE + xor a + call SetBGP + call FlushAllPalettes + +.update + call DecrementScreenAnimDuration + ld a, [wScreenAnimDuration] + or a + ret nz + ; retrieve the previous background pals + ld hl, wTempBackgroundPalettesCGB + ld de, wBackgroundPalettesCGB + ld bc, 8 palettes + call CopyDataHLtoDE_SaveRegisters + ld a, [wd4bc] + call SetBGP + call FlushAllPalettes + jp DefaultScreenAnimationUpdate + +DistortScreen: + ld hl, wScreenAnimUpdatePtr + ld [hl], LOW(.update) + inc hl + ld [hl], HIGH(.update) + xor a + ld [wApplyBGScroll], a + ld hl, wLCDCFunctionTrampoline + 1 + ld [hl], LOW(ApplyBackgroundScroll) + inc hl + ld [hl], HIGH(ApplyBackgroundScroll) + ld a, 1 + ld [wBGScrollMod], a + call EnableInt_LYCoincidence + +.update + ld a, [wScreenAnimDuration] + srl a + srl a + srl a + and %00000111 + ld c, a + ld b, $00 + ld hl, .BGScrollModData + add hl, bc + ld a, [hl] + ld [wBGScrollMod], a + call DecrementScreenAnimDuration + jp LoadDefaultScreenAnimationUpdateWhenFinished + +; each value is applied for 8 "ticks" of wScreenAnimDuration +; starting from the last and running backwards +.BGScrollModData + db 4, 3, 2, 1, 1, 1, 1, 2 + +Func_1ce03: + cp DUEL_ANIM_158 + jr z, .asm_1ce17 + sub $96 + add a + ld c, a + ld b, $00 + ld hl, .pointer_table + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + jp Func_3bb5 + +.asm_1ce17 + ld a, [wDuelAnimDamage] + ld l, a + ld a, [wDuelAnimDamage + 1] + ld h, a + jp Func_3bb5 + +.pointer_table + dw Func_190f4 ; DUEL_ANIM_150 + dw PrintDamageText ; DUEL_ANIM_PRINT_DAMAGE + dw UpdateMainSceneHUD ; DUEL_ANIM_UPDATE_HUD + dw Func_191a3 ; DUEL_ANIM_153 + dw Func_191a3 ; DUEL_ANIM_154 + dw Func_191a3 ; DUEL_ANIM_155 + dw Func_191a3 ; DUEL_ANIM_156 + dw Func_191a3 ; DUEL_ANIM_157 diff --git a/src/engine/duel/core.asm b/src/engine/duel/core.asm index acf5add..10ccdee 100644 --- a/src/engine/duel/core.asm +++ b/src/engine/duel/core.asm @@ -5983,7 +5983,7 @@ PrintUsedTrainerCardDescription: ; byte 0 is $01, bytes 1 and 2 are the checksum, byte 3 is [wDuelType] ; next $33a bytes come from DuelDataToSave SaveDuelData: - farcall CommentedOut_1a6cc + farcall StubbedUnusedSaveDataValidation ld de, sCurrentDuel ; fallthrough diff --git a/src/data/duel/effect_commands.asm b/src/engine/duel/effect_commands.asm index e96ef7e..e96ef7e 100644 --- a/src/data/duel/effect_commands.asm +++ b/src/engine/duel/effect_commands.asm diff --git a/src/engine/effect_functions.asm b/src/engine/duel/effect_functions.asm index ce3a517..ce3a517 100644 --- a/src/engine/effect_functions.asm +++ b/src/engine/duel/effect_functions.asm diff --git a/src/engine/game_loop.asm b/src/engine/game_loop.asm index c3745b6..d6e4fab 100644 --- a/src/engine/game_loop.asm +++ b/src/engine/game_loop.asm @@ -15,7 +15,7 @@ GameLoop: ld a, 1 ld [wUppercaseHalfWidthLetters], a ei - farcall CommentedOut_1a6cc + farcall StubbedUnusedSaveDataValidation ldh a, [hKeysHeld] cp A_BUTTON | B_BUTTON jr z, .ask_erase_backup_ram diff --git a/src/engine/gfx/gfx_table_pointers.asm b/src/engine/gfx/gfx_table_pointers.asm new file mode 100644 index 0000000..370ed15 --- /dev/null +++ b/src/engine/gfx/gfx_table_pointers.asm @@ -0,0 +1,6 @@ +GfxTablePointers: + dw Tilemaps + dw Tilesets + dw Sprites + dw SpriteAnimations + dw Palettes diff --git a/src/engine/gfx/palettes.asm b/src/engine/gfx/palettes.asm new file mode 100644 index 0000000..8a0d71a --- /dev/null +++ b/src/engine/gfx/palettes.asm @@ -0,0 +1,170 @@ +; \1 = palette pointer +; \2 = number of palettes +; \3 = number of OBJ colors +palette_pointer: MACRO + dwb \1, BANK(\1) - BANK(Palettes) + db (\2 << 4) + \3 +ENDM + +Palettes: + palette_pointer Palette0, 8, 1 ; PALETTE_0 + palette_pointer Palette1, 8, 0 ; PALETTE_1 + palette_pointer Palette2, 8, 0 ; PALETTE_2 + palette_pointer Palette3, 8, 0 ; PALETTE_3 + palette_pointer Palette4, 8, 0 ; PALETTE_4 + palette_pointer Palette5, 8, 0 ; PALETTE_5 + palette_pointer Palette6, 8, 0 ; PALETTE_6 + palette_pointer Palette7, 8, 0 ; PALETTE_7 + palette_pointer Palette8, 8, 0 ; PALETTE_8 + palette_pointer Palette9, 8, 0 ; PALETTE_9 + palette_pointer Palette10, 8, 0 ; PALETTE_10 + palette_pointer Palette11, 8, 0 ; PALETTE_11 + palette_pointer Palette12, 8, 0 ; PALETTE_12 + palette_pointer Palette13, 8, 0 ; PALETTE_13 + palette_pointer Palette14, 8, 0 ; PALETTE_14 + palette_pointer Palette15, 8, 0 ; PALETTE_15 + palette_pointer Palette16, 8, 0 ; PALETTE_16 + palette_pointer Palette17, 8, 0 ; PALETTE_17 + palette_pointer Palette18, 8, 0 ; PALETTE_18 + palette_pointer Palette19, 8, 0 ; PALETTE_19 + palette_pointer Palette20, 8, 0 ; PALETTE_20 + palette_pointer Palette21, 8, 0 ; PALETTE_21 + palette_pointer Palette22, 8, 0 ; PALETTE_22 + palette_pointer Palette23, 8, 0 ; PALETTE_23 + palette_pointer Palette24, 8, 0 ; PALETTE_24 + palette_pointer Palette25, 8, 0 ; PALETTE_25 + palette_pointer Palette26, 8, 0 ; PALETTE_26 + palette_pointer Palette27, 8, 0 ; PALETTE_27 + palette_pointer Palette28, 8, 0 ; PALETTE_28 + palette_pointer Palette29, 8, 2 ; PALETTE_29 + palette_pointer Palette30, 8, 2 ; PALETTE_30 + palette_pointer Palette31, 1, 1 ; PALETTE_31 + palette_pointer Palette32, 1, 1 ; PALETTE_32 + palette_pointer Palette33, 1, 1 ; PALETTE_33 + palette_pointer Palette34, 1, 1 ; PALETTE_34 + palette_pointer Palette35, 1, 1 ; PALETTE_35 + palette_pointer Palette36, 1, 1 ; PALETTE_36 + palette_pointer Palette37, 1, 1 ; PALETTE_37 + palette_pointer Palette38, 1, 1 ; PALETTE_38 + palette_pointer Palette39, 1, 1 ; PALETTE_39 + palette_pointer Palette40, 1, 1 ; PALETTE_40 + palette_pointer Palette41, 1, 1 ; PALETTE_41 + palette_pointer Palette42, 1, 1 ; PALETTE_42 + palette_pointer Palette43, 1, 1 ; PALETTE_43 + palette_pointer Palette44, 1, 1 ; PALETTE_44 + palette_pointer Palette45, 1, 1 ; PALETTE_45 + palette_pointer Palette46, 1, 1 ; PALETTE_46 + palette_pointer Palette47, 1, 1 ; PALETTE_47 + palette_pointer Palette48, 1, 1 ; PALETTE_48 + palette_pointer Palette49, 1, 1 ; PALETTE_49 + palette_pointer Palette50, 1, 1 ; PALETTE_50 + palette_pointer Palette51, 1, 1 ; PALETTE_51 + palette_pointer Palette52, 1, 1 ; PALETTE_52 + palette_pointer Palette53, 1, 1 ; PALETTE_53 + palette_pointer Palette54, 1, 1 ; PALETTE_54 + palette_pointer Palette55, 1, 1 ; PALETTE_55 + palette_pointer Palette56, 1, 1 ; PALETTE_56 + palette_pointer Palette57, 1, 1 ; PALETTE_57 + palette_pointer Palette58, 1, 1 ; PALETTE_58 + palette_pointer Palette59, 1, 1 ; PALETTE_59 + palette_pointer Palette60, 1, 1 ; PALETTE_60 + palette_pointer Palette61, 1, 1 ; PALETTE_61 + palette_pointer Palette62, 1, 1 ; PALETTE_62 + palette_pointer Palette63, 1, 1 ; PALETTE_63 + palette_pointer Palette64, 1, 1 ; PALETTE_64 + palette_pointer Palette65, 1, 1 ; PALETTE_65 + palette_pointer Palette66, 1, 1 ; PALETTE_66 + palette_pointer Palette67, 1, 1 ; PALETTE_67 + palette_pointer Palette68, 1, 1 ; PALETTE_68 + palette_pointer Palette69, 1, 1 ; PALETTE_69 + palette_pointer Palette70, 1, 1 ; PALETTE_70 + palette_pointer Palette71, 1, 1 ; PALETTE_71 + palette_pointer Palette72, 1, 1 ; PALETTE_72 + palette_pointer Palette73, 1, 1 ; PALETTE_73 + palette_pointer Palette74, 1, 1 ; PALETTE_74 + palette_pointer Palette75, 1, 1 ; PALETTE_75 + palette_pointer Palette76, 1, 1 ; PALETTE_76 + palette_pointer Palette77, 1, 1 ; PALETTE_77 + palette_pointer Palette78, 1, 1 ; PALETTE_78 + palette_pointer Palette79, 1, 1 ; PALETTE_79 + palette_pointer Palette80, 1, 1 ; PALETTE_80 + palette_pointer Palette81, 1, 1 ; PALETTE_81 + palette_pointer Palette82, 1, 1 ; PALETTE_82 + palette_pointer Palette83, 1, 1 ; PALETTE_83 + palette_pointer Palette84, 1, 1 ; PALETTE_84 + palette_pointer Palette85, 1, 1 ; PALETTE_85 + palette_pointer Palette86, 1, 1 ; PALETTE_86 + palette_pointer Palette87, 1, 1 ; PALETTE_87 + palette_pointer Palette88, 1, 1 ; PALETTE_88 + palette_pointer Palette89, 1, 1 ; PALETTE_89 + palette_pointer Palette90, 1, 1 ; PALETTE_90 + palette_pointer Palette91, 1, 1 ; PALETTE_91 + palette_pointer Palette92, 1, 1 ; PALETTE_92 + palette_pointer Palette93, 1, 1 ; PALETTE_93 + palette_pointer Palette94, 8, 0 ; PALETTE_94 + palette_pointer Palette95, 8, 0 ; PALETTE_95 + palette_pointer Palette96, 8, 0 ; PALETTE_96 + palette_pointer Palette97, 8, 0 ; PALETTE_97 + palette_pointer Palette98, 8, 0 ; PALETTE_98 + palette_pointer Palette99, 8, 0 ; PALETTE_99 + palette_pointer Palette100, 8, 0 ; PALETTE_100 + palette_pointer Palette101, 7, 0 ; PALETTE_101 + palette_pointer Palette102, 7, 0 ; PALETTE_102 + palette_pointer Palette103, 7, 0 ; PALETTE_103 + palette_pointer Palette104, 7, 0 ; PALETTE_104 + palette_pointer Palette105, 7, 0 ; PALETTE_105 + palette_pointer Palette106, 7, 0 ; PALETTE_106 + palette_pointer Palette107, 7, 0 ; PALETTE_107 + palette_pointer Palette108, 0, 1 ; PALETTE_108 + palette_pointer Palette109, 0, 1 ; PALETTE_109 + palette_pointer Palette110, 0, 0 ; PALETTE_110 + palette_pointer Palette111, 8, 1 ; PALETTE_111 + palette_pointer Palette112, 8, 1 ; PALETTE_112 + palette_pointer Palette113, 8, 1 ; PALETTE_113 + palette_pointer Palette114, 4, 2 ; PALETTE_114 + palette_pointer Palette115, 4, 2 ; PALETTE_115 + palette_pointer Palette116, 4, 2 ; PALETTE_116 + palette_pointer Palette117, 1, 0 ; PALETTE_117 + palette_pointer Palette118, 6, 0 ; PALETTE_118 + palette_pointer Palette119, 1, 0 ; PALETTE_119 + palette_pointer Palette120, 1, 0 ; PALETTE_120 + palette_pointer Palette121, 1, 0 ; PALETTE_121 + palette_pointer Palette122, 1, 0 ; PALETTE_122 + palette_pointer Palette123, 1, 0 ; PALETTE_123 + palette_pointer Palette124, 1, 0 ; PALETTE_124 + palette_pointer Palette125, 1, 0 ; PALETTE_125 + palette_pointer Palette126, 1, 0 ; PALETTE_126 + palette_pointer Palette127, 1, 0 ; PALETTE_127 + palette_pointer Palette128, 1, 0 ; PALETTE_128 + palette_pointer Palette129, 1, 0 ; PALETTE_129 + palette_pointer Palette130, 1, 0 ; PALETTE_130 + palette_pointer Palette131, 1, 0 ; PALETTE_131 + palette_pointer Palette132, 1, 0 ; PALETTE_132 + palette_pointer Palette133, 1, 0 ; PALETTE_133 + palette_pointer Palette134, 1, 0 ; PALETTE_134 + palette_pointer Palette135, 1, 0 ; PALETTE_135 + palette_pointer Palette136, 1, 0 ; PALETTE_136 + palette_pointer Palette137, 1, 0 ; PALETTE_137 + palette_pointer Palette138, 1, 0 ; PALETTE_138 + palette_pointer Palette139, 1, 0 ; PALETTE_139 + palette_pointer Palette140, 1, 0 ; PALETTE_140 + palette_pointer Palette141, 1, 0 ; PALETTE_141 + palette_pointer Palette142, 1, 0 ; PALETTE_142 + palette_pointer Palette143, 1, 0 ; PALETTE_143 + palette_pointer Palette144, 1, 0 ; PALETTE_144 + palette_pointer Palette145, 1, 0 ; PALETTE_145 + palette_pointer Palette146, 1, 0 ; PALETTE_146 + palette_pointer Palette147, 1, 0 ; PALETTE_147 + palette_pointer Palette148, 1, 0 ; PALETTE_148 + palette_pointer Palette149, 1, 0 ; PALETTE_149 + palette_pointer Palette150, 1, 0 ; PALETTE_150 + palette_pointer Palette151, 1, 0 ; PALETTE_151 + palette_pointer Palette152, 1, 0 ; PALETTE_152 + palette_pointer Palette153, 1, 0 ; PALETTE_153 + palette_pointer Palette154, 1, 0 ; PALETTE_154 + palette_pointer Palette155, 1, 0 ; PALETTE_155 + palette_pointer Palette156, 1, 0 ; PALETTE_156 + palette_pointer Palette157, 1, 0 ; PALETTE_157 + palette_pointer Palette158, 1, 0 ; PALETTE_158 + palette_pointer Palette159, 1, 0 ; PALETTE_159 + palette_pointer Palette160, 1, 0 ; PALETTE_160 diff --git a/src/engine/gfx/sprite_animations.asm b/src/engine/gfx/sprite_animations.asm new file mode 100644 index 0000000..7c432c6 --- /dev/null +++ b/src/engine/gfx/sprite_animations.asm @@ -0,0 +1,224 @@ +; \1 = anim data pointer +anim_data_pointer: MACRO + dwb \1, BANK(\1) - BANK(SpriteAnimations) + db $00 ; unused (padding?) +ENDM + +SpriteAnimations: + anim_data_pointer AnimData0 ; SPRITE_ANIM_LIGHT_NPC_UP + anim_data_pointer AnimData1 ; SPRITE_ANIM_LIGHT_NPC_RIGHT + anim_data_pointer AnimData2 ; SPRITE_ANIM_LIGHT_NPC_DOWN + anim_data_pointer AnimData3 ; SPRITE_ANIM_LIGHT_NPC_LEFT + anim_data_pointer AnimData4 ; SPRITE_ANIM_DARK_NPC_UP + anim_data_pointer AnimData5 ; SPRITE_ANIM_DARK_NPC_RIGHT + anim_data_pointer AnimData6 ; SPRITE_ANIM_DARK_NPC_DOWN + anim_data_pointer AnimData7 ; SPRITE_ANIM_DARK_NPC_LEFT + anim_data_pointer AnimData8 ; SPRITE_ANIM_SGB_AMY_LAYING + anim_data_pointer AnimData9 ; SPRITE_ANIM_SGB_AMY_STAND + anim_data_pointer AnimData10 ; SPRITE_ANIM_SGB_CLERK_NPC_UP + anim_data_pointer AnimData11 ; SPRITE_ANIM_SGB_CLERK_NPC_RIGHT + anim_data_pointer AnimData12 ; SPRITE_ANIM_SGB_CLERK_NPC_DOWN + anim_data_pointer AnimData13 ; SPRITE_ANIM_SGB_CLERK_NPC_LEFT + anim_data_pointer AnimData14 ; SPRITE_ANIM_BLUE_NPC_UP + anim_data_pointer AnimData15 ; SPRITE_ANIM_BLUE_NPC_RIGHT + anim_data_pointer AnimData16 ; SPRITE_ANIM_BLUE_NPC_DOWN + anim_data_pointer AnimData17 ; SPRITE_ANIM_BLUE_NPC_LEFT + anim_data_pointer AnimData18 ; SPRITE_ANIM_PINK_NPC_UP + anim_data_pointer AnimData19 ; SPRITE_ANIM_PINK_NPC_RIGHT + anim_data_pointer AnimData20 ; SPRITE_ANIM_PINK_NPC_DOWN + anim_data_pointer AnimData21 ; SPRITE_ANIM_PINK_NPC_LEFT + anim_data_pointer AnimData22 ; SPRITE_ANIM_YELLOW_NPC_UP + anim_data_pointer AnimData23 ; SPRITE_ANIM_YELLOW_NPC_RIGHT + anim_data_pointer AnimData24 ; SPRITE_ANIM_YELLOW_NPC_DOWN + anim_data_pointer AnimData25 ; SPRITE_ANIM_YELLOW_NPC_LEFT + anim_data_pointer AnimData26 ; SPRITE_ANIM_GREEN_NPC_UP + anim_data_pointer AnimData27 ; SPRITE_ANIM_GREEN_NPC_RIGHT + anim_data_pointer AnimData28 ; SPRITE_ANIM_GREEN_NPC_DOWN + anim_data_pointer AnimData29 ; SPRITE_ANIM_GREEN_NPC_LEFT + anim_data_pointer AnimData30 ; SPRITE_ANIM_RED_NPC_UP + anim_data_pointer AnimData31 ; SPRITE_ANIM_RED_NPC_RIGHT + anim_data_pointer AnimData32 ; SPRITE_ANIM_RED_NPC_DOWN + anim_data_pointer AnimData33 ; SPRITE_ANIM_RED_NPC_LEFT + anim_data_pointer AnimData34 ; SPRITE_ANIM_PURPLE_NPC_UP + anim_data_pointer AnimData35 ; SPRITE_ANIM_PURPLE_NPC_RIGHT + anim_data_pointer AnimData36 ; SPRITE_ANIM_PURPLE_NPC_DOWN + anim_data_pointer AnimData37 ; SPRITE_ANIM_PURPLE_NPC_LEFT + anim_data_pointer AnimData38 ; SPRITE_ANIM_WHITE_NPC_UP + anim_data_pointer AnimData39 ; SPRITE_ANIM_WHITE_NPC_RIGHT + anim_data_pointer AnimData40 ; SPRITE_ANIM_WHITE_NPC_DOWN + anim_data_pointer AnimData41 ; SPRITE_ANIM_WHITE_NPC_LEFT + anim_data_pointer AnimData42 ; SPRITE_ANIM_INDIGO_NPC_UP + anim_data_pointer AnimData43 ; SPRITE_ANIM_INDIGO_NPC_RIGHT + anim_data_pointer AnimData44 ; SPRITE_ANIM_INDIGO_NPC_DOWN + anim_data_pointer AnimData45 ; SPRITE_ANIM_INDIGO_NPC_LEFT + anim_data_pointer AnimData46 ; SPRITE_ANIM_CGB_AMY_LAYING + anim_data_pointer AnimData47 ; SPRITE_ANIM_CGB_AMY_STAND + anim_data_pointer AnimData48 ; SPRITE_ANIM_CGB_CLERK_NPC_UP + anim_data_pointer AnimData49 ; SPRITE_ANIM_CGB_CLERK_NPC_RIGHT + anim_data_pointer AnimData50 ; SPRITE_ANIM_CGB_CLERK_NPC_DOWN + anim_data_pointer AnimData51 ; SPRITE_ANIM_CGB_CLERK_NPC_LEFT + anim_data_pointer AnimData52 ; SPRITE_ANIM_SGB_VOLCANO_SMOKE + anim_data_pointer AnimData53 ; SPRITE_ANIM_SGB_OWMAP_CURSOR + anim_data_pointer AnimData54 ; SPRITE_ANIM_SGB_OWMAP_CURSOR_FAST + anim_data_pointer AnimData55 ; SPRITE_ANIM_CGB_VOLCANO_SMOKE + anim_data_pointer AnimData56 ; SPRITE_ANIM_CGB_OWMAP_CURSOR + anim_data_pointer AnimData57 ; SPRITE_ANIM_CGB_OWMAP_CURSOR_FAST + anim_data_pointer AnimData58 ; SPRITE_ANIM_TORCH + anim_data_pointer AnimData59 ; SPRITE_ANIM_SGB_CARD_TOP_LEFT + anim_data_pointer AnimData60 ; SPRITE_ANIM_SGB_CARD_TOP_RIGHT + anim_data_pointer AnimData61 ; SPRITE_ANIM_SGB_CARD_LEFT_SPARK + anim_data_pointer AnimData62 ; SPRITE_ANIM_SGB_CARD_BOTTOM_LEFT + anim_data_pointer AnimData63 ; SPRITE_ANIM_SGB_CARD_BOTTOM_RIGHT + anim_data_pointer AnimData64 ; SPRITE_ANIM_SGB_CARD_RIGHT_SPARK + anim_data_pointer AnimData65 ; SPRITE_ANIM_CGB_CARD_TOP_LEFT + anim_data_pointer AnimData66 ; SPRITE_ANIM_CGB_CARD_TOP_RIGHT + anim_data_pointer AnimData67 ; SPRITE_ANIM_CGB_CARD_LEFT_SPARK + anim_data_pointer AnimData68 ; SPRITE_ANIM_CGB_CARD_BOTTOM_LEFT + anim_data_pointer AnimData69 ; SPRITE_ANIM_CGB_CARD_BOTTOM_RIGHT + anim_data_pointer AnimData70 ; SPRITE_ANIM_CGB_CARD_RIGHT_SPARK + anim_data_pointer AnimData71 ; SPRITE_ANIM_71 + anim_data_pointer AnimData72 ; SPRITE_ANIM_72 + anim_data_pointer AnimData73 ; SPRITE_ANIM_73 + anim_data_pointer AnimData74 ; SPRITE_ANIM_74 + anim_data_pointer AnimData75 ; SPRITE_ANIM_75 + anim_data_pointer AnimData76 ; SPRITE_ANIM_76 + anim_data_pointer AnimData77 ; SPRITE_ANIM_77 + anim_data_pointer AnimData78 ; SPRITE_ANIM_78 + anim_data_pointer AnimData79 ; SPRITE_ANIM_79 + anim_data_pointer AnimData80 ; SPRITE_ANIM_80 + anim_data_pointer AnimData81 ; SPRITE_ANIM_81 + anim_data_pointer AnimData82 ; SPRITE_ANIM_82 + anim_data_pointer AnimData83 ; SPRITE_ANIM_83 + anim_data_pointer AnimData84 ; SPRITE_ANIM_84 + anim_data_pointer AnimData85 ; SPRITE_ANIM_85 + anim_data_pointer AnimData86 ; SPRITE_ANIM_86 + anim_data_pointer AnimData87 ; SPRITE_ANIM_87 + anim_data_pointer AnimData88 ; SPRITE_ANIM_88 + anim_data_pointer AnimData89 ; SPRITE_ANIM_89 + anim_data_pointer AnimData90 ; SPRITE_ANIM_90 + anim_data_pointer AnimData91 ; SPRITE_ANIM_91 + anim_data_pointer AnimData92 ; SPRITE_ANIM_92 + anim_data_pointer AnimData93 ; SPRITE_ANIM_93 + anim_data_pointer AnimData94 ; SPRITE_ANIM_94 + anim_data_pointer AnimData95 ; SPRITE_ANIM_95 + anim_data_pointer AnimData96 ; SPRITE_ANIM_96 + anim_data_pointer AnimData97 ; SPRITE_ANIM_97 + anim_data_pointer AnimData98 ; SPRITE_ANIM_98 + anim_data_pointer AnimData99 ; SPRITE_ANIM_99 + anim_data_pointer AnimData100 ; SPRITE_ANIM_100 + anim_data_pointer AnimData101 ; SPRITE_ANIM_101 + anim_data_pointer AnimData102 ; SPRITE_ANIM_102 + anim_data_pointer AnimData103 ; SPRITE_ANIM_103 + anim_data_pointer AnimData104 ; SPRITE_ANIM_104 + anim_data_pointer AnimData105 ; SPRITE_ANIM_105 + anim_data_pointer AnimData106 ; SPRITE_ANIM_106 + anim_data_pointer AnimData107 ; SPRITE_ANIM_107 + anim_data_pointer AnimData108 ; SPRITE_ANIM_108 + anim_data_pointer AnimData109 ; SPRITE_ANIM_109 + anim_data_pointer AnimData110 ; SPRITE_ANIM_110 + anim_data_pointer AnimData111 ; SPRITE_ANIM_111 + anim_data_pointer AnimData112 ; SPRITE_ANIM_112 + anim_data_pointer AnimData113 ; SPRITE_ANIM_113 + anim_data_pointer AnimData114 ; SPRITE_ANIM_114 + anim_data_pointer AnimData115 ; SPRITE_ANIM_115 + anim_data_pointer AnimData116 ; SPRITE_ANIM_116 + anim_data_pointer AnimData117 ; SPRITE_ANIM_117 + anim_data_pointer AnimData118 ; SPRITE_ANIM_118 + anim_data_pointer AnimData119 ; SPRITE_ANIM_119 + anim_data_pointer AnimData120 ; SPRITE_ANIM_120 + anim_data_pointer AnimData121 ; SPRITE_ANIM_121 + anim_data_pointer AnimData122 ; SPRITE_ANIM_122 + anim_data_pointer AnimData123 ; SPRITE_ANIM_123 + anim_data_pointer AnimData124 ; SPRITE_ANIM_124 + anim_data_pointer AnimData125 ; SPRITE_ANIM_125 + anim_data_pointer AnimData126 ; SPRITE_ANIM_126 + anim_data_pointer AnimData127 ; SPRITE_ANIM_127 + anim_data_pointer AnimData128 ; SPRITE_ANIM_128 + anim_data_pointer AnimData129 ; SPRITE_ANIM_129 + anim_data_pointer AnimData130 ; SPRITE_ANIM_130 + anim_data_pointer AnimData131 ; SPRITE_ANIM_131 + anim_data_pointer AnimData132 ; SPRITE_ANIM_132 + anim_data_pointer AnimData133 ; SPRITE_ANIM_133 + anim_data_pointer AnimData134 ; SPRITE_ANIM_134 + anim_data_pointer AnimData135 ; SPRITE_ANIM_135 + anim_data_pointer AnimData136 ; SPRITE_ANIM_136 + anim_data_pointer AnimData137 ; SPRITE_ANIM_137 + anim_data_pointer AnimData138 ; SPRITE_ANIM_138 + anim_data_pointer AnimData139 ; SPRITE_ANIM_139 + anim_data_pointer AnimData140 ; SPRITE_ANIM_140 + anim_data_pointer AnimData141 ; SPRITE_ANIM_141 + anim_data_pointer AnimData142 ; SPRITE_ANIM_142 + anim_data_pointer AnimData143 ; SPRITE_ANIM_143 + anim_data_pointer AnimData144 ; SPRITE_ANIM_144 + anim_data_pointer AnimData145 ; SPRITE_ANIM_145 + anim_data_pointer AnimData146 ; SPRITE_ANIM_146 + anim_data_pointer AnimData147 ; SPRITE_ANIM_147 + anim_data_pointer AnimData148 ; SPRITE_ANIM_148 + anim_data_pointer AnimData149 ; SPRITE_ANIM_149 + anim_data_pointer AnimData150 ; SPRITE_ANIM_150 + anim_data_pointer AnimData151 ; SPRITE_ANIM_151 + anim_data_pointer AnimData152 ; SPRITE_ANIM_152 + anim_data_pointer AnimData153 ; SPRITE_ANIM_153 + anim_data_pointer AnimData154 ; SPRITE_ANIM_154 + anim_data_pointer AnimData155 ; SPRITE_ANIM_155 + anim_data_pointer AnimData156 ; SPRITE_ANIM_156 + anim_data_pointer AnimData157 ; SPRITE_ANIM_157 + anim_data_pointer AnimData158 ; SPRITE_ANIM_158 + anim_data_pointer AnimData159 ; SPRITE_ANIM_159 + anim_data_pointer AnimData160 ; SPRITE_ANIM_160 + anim_data_pointer AnimData161 ; SPRITE_ANIM_161 + anim_data_pointer AnimData162 ; SPRITE_ANIM_162 + anim_data_pointer AnimData163 ; SPRITE_ANIM_163 + anim_data_pointer AnimData164 ; SPRITE_ANIM_164 + anim_data_pointer AnimData165 ; SPRITE_ANIM_165 + anim_data_pointer AnimData166 ; SPRITE_ANIM_166 + anim_data_pointer AnimData167 ; SPRITE_ANIM_167 + anim_data_pointer AnimData168 ; SPRITE_ANIM_168 + anim_data_pointer AnimData169 ; SPRITE_ANIM_169 + anim_data_pointer AnimData170 ; SPRITE_ANIM_170 + anim_data_pointer AnimData171 ; SPRITE_ANIM_171 + anim_data_pointer AnimData172 ; SPRITE_ANIM_172 + anim_data_pointer AnimData173 ; SPRITE_ANIM_173 + anim_data_pointer AnimData174 ; SPRITE_ANIM_174 + anim_data_pointer AnimData175 ; SPRITE_ANIM_175 + anim_data_pointer AnimData176 ; SPRITE_ANIM_176 + anim_data_pointer AnimData177 ; SPRITE_ANIM_177 + anim_data_pointer AnimData178 ; SPRITE_ANIM_178 + anim_data_pointer AnimData179 ; SPRITE_ANIM_179 + anim_data_pointer AnimData180 ; SPRITE_ANIM_180 + anim_data_pointer AnimData181 ; SPRITE_ANIM_181 + anim_data_pointer AnimData182 ; SPRITE_ANIM_182 + anim_data_pointer AnimData183 ; SPRITE_ANIM_183 + anim_data_pointer AnimData184 ; SPRITE_ANIM_184 + anim_data_pointer AnimData185 ; SPRITE_ANIM_185 + anim_data_pointer AnimData186 ; SPRITE_ANIM_186 + anim_data_pointer AnimData187 ; SPRITE_ANIM_187 + anim_data_pointer AnimData188 ; SPRITE_ANIM_188 + anim_data_pointer AnimData189 ; SPRITE_ANIM_189 + anim_data_pointer AnimData190 ; SPRITE_ANIM_190 + anim_data_pointer AnimData191 ; SPRITE_ANIM_191 + anim_data_pointer AnimData192 ; SPRITE_ANIM_192 + anim_data_pointer AnimData193 ; SPRITE_ANIM_193 + anim_data_pointer AnimData194 ; SPRITE_ANIM_194 + anim_data_pointer AnimData195 ; SPRITE_ANIM_195 + anim_data_pointer AnimData196 ; SPRITE_ANIM_196 + anim_data_pointer AnimData197 ; SPRITE_ANIM_197 + anim_data_pointer AnimData198 ; SPRITE_ANIM_198 + anim_data_pointer AnimData199 ; SPRITE_ANIM_199 + anim_data_pointer AnimData200 ; SPRITE_ANIM_200 + anim_data_pointer AnimData201 ; SPRITE_ANIM_201 + anim_data_pointer AnimData202 ; SPRITE_ANIM_202 + anim_data_pointer AnimData203 ; SPRITE_ANIM_203 + anim_data_pointer AnimData204 ; SPRITE_ANIM_204 + anim_data_pointer AnimData205 ; SPRITE_ANIM_205 + anim_data_pointer AnimData206 ; SPRITE_ANIM_206 + anim_data_pointer AnimData207 ; SPRITE_ANIM_207 + anim_data_pointer AnimData208 ; SPRITE_ANIM_208 + anim_data_pointer AnimData209 ; SPRITE_ANIM_209 + anim_data_pointer AnimData210 ; SPRITE_ANIM_210 + anim_data_pointer AnimData211 ; SPRITE_ANIM_211 + anim_data_pointer AnimData212 ; SPRITE_ANIM_212 + anim_data_pointer AnimData213 ; SPRITE_ANIM_213 + anim_data_pointer AnimData214 ; SPRITE_ANIM_214 + anim_data_pointer AnimData215 ; SPRITE_ANIM_215 + anim_data_pointer AnimData216 ; SPRITE_ANIM_216 diff --git a/src/engine/gfx/sprite_vblank.asm b/src/engine/gfx/sprite_vblank.asm new file mode 100644 index 0000000..5f099a1 --- /dev/null +++ b/src/engine/gfx/sprite_vblank.asm @@ -0,0 +1,39 @@ +; empties screen and replaces +; wVBlankFunctionTrampoline with HandleAllSpriteAnimations +SetSpriteAnimationsAsVBlankFunction: + call EmptyScreen + call Set_OBJ_8x8 + call Func_3ca4 + lb de, $38, $7f + call SetupText + ld hl, wVBlankFunctionTrampoline + 1 + ld de, wVBlankFunctionTrampolineBackup + call BackupVBlankFunctionTrampoline + di + ld [hl], LOW(HandleAllSpriteAnimations) + inc hl + ld [hl], HIGH(HandleAllSpriteAnimations) + ei + ret + +; sets backup VBlank function as wVBlankFunctionTrampoline +RestoreVBlankFunction: + ld hl, wVBlankFunctionTrampolineBackup + ld de, wVBlankFunctionTrampoline + 1 + call BackupVBlankFunctionTrampoline + call Func_3ca4 + bank1call ZeroObjectPositionsAndToggleOAMCopy + ret + +; copies 2 bytes from hl to de while interrupts are disabled +; used to load or store wVBlankFunctionTrampoline +; to wVBlankFunctionTrampolineBackup +BackupVBlankFunctionTrampoline: + di + ld a, [hli] + ld [de], a + inc de + ld a, [hld] + ld [de], a + ei + ret diff --git a/src/engine/gfx/sprites.asm b/src/engine/gfx/sprites.asm new file mode 100644 index 0000000..c2aa277 --- /dev/null +++ b/src/engine/gfx/sprites.asm @@ -0,0 +1,122 @@ +; \1 = gfx pointer +; \2 = number of tiles +gfx_pointer: MACRO + dwb \1, BANK(\1) - BANK(Sprites) + db \2 +ENDM + +Sprites: + gfx_pointer OWPlayerGfx, $14 ; SPRITE_OW_PLAYER + gfx_pointer OWRonaldGfx, $14 ; SPRITE_OW_RONALD + gfx_pointer OWDrMasonGfx, $14 ; SPRITE_OW_DRMASON + gfx_pointer OWIshiharaGfx, $14 ; SPRITE_OW_ISHIHARA + gfx_pointer OWImakuniGfx, $14 ; SPRITE_OW_IMAKUNI + gfx_pointer OWNikkiGfx, $14 ; SPRITE_OW_NIKKI + gfx_pointer OWRickGfx, $14 ; SPRITE_OW_RICK + gfx_pointer OWKenGfx, $14 ; SPRITE_OW_KEN + gfx_pointer OWAmyGfx, $1b ; SPRITE_OW_AMY + gfx_pointer OWIsaacGfx, $14 ; SPRITE_OW_ISAAC + gfx_pointer OWMitchGfx, $14 ; SPRITE_OW_MITCH + gfx_pointer OWGeneGfx, $14 ; SPRITE_OW_GENE + gfx_pointer OWMurrayGfx, $14 ; SPRITE_OW_MURRAY + gfx_pointer OWCourtneyGfx, $14 ; SPRITE_OW_COURTNEY + gfx_pointer OWSteveGfx, $14 ; SPRITE_OW_STEVE + gfx_pointer OWJackGfx, $14 ; SPRITE_OW_JACK + gfx_pointer OWRodGfx, $14 ; SPRITE_OW_ROD + gfx_pointer OWBoyGfx, $14 ; SPRITE_OW_BOY + gfx_pointer OWLadGfx, $14 ; SPRITE_OW_LAD + gfx_pointer OWSpecsGfx, $14 ; SPRITE_OW_SPECS + gfx_pointer OWButchGfx, $14 ; SPRITE_OW_BUTCH + gfx_pointer OWManiaGfx, $14 ; SPRITE_OW_MANIA + gfx_pointer OWJoshuaGfx, $14 ; SPRITE_OW_JOSHUA + gfx_pointer OWHoodGfx, $14 ; SPRITE_OW_HOOD + gfx_pointer OWTechGfx, $14 ; SPRITE_OW_TECH + gfx_pointer OWChapGfx, $14 ; SPRITE_OW_CHAP + gfx_pointer OWManGfx, $14 ; SPRITE_OW_MAN + gfx_pointer OWPappyGfx, $14 ; SPRITE_OW_PAPPY + gfx_pointer OWGirlGfx, $14 ; SPRITE_OW_GIRL + gfx_pointer OWLass1Gfx, $14 ; SPRITE_OW_LASS1 + gfx_pointer OWLass2Gfx, $14 ; SPRITE_OW_LASS2 + gfx_pointer OWLass3Gfx, $14 ; SPRITE_OW_LASS3 + gfx_pointer OWSwimmerGfx, $14 ; SPRITE_OW_SWIMMER + gfx_pointer OWClerkGfx, $08 ; SPRITE_OW_CLERK + gfx_pointer OWGalGfx, $14 ; SPRITE_OW_GAL + gfx_pointer OWWomanGfx, $14 ; SPRITE_OW_WOMAN + gfx_pointer OWGrannyGfx, $14 ; SPRITE_OW_GRANNY + gfx_pointer OverworldMapOAMGfx, $08 ; SPRITE_OW_MAP_OAM + gfx_pointer Duel0Gfx, $16 ; SPRITE_DUEL_0 + gfx_pointer Duel63Gfx, $0a ; SPRITE_DUEL_63 + gfx_pointer DuelGlowGfx, $0b ; SPRITE_DUEL_GLOW + gfx_pointer Duel1Gfx, $06 ; SPRITE_DUEL_1 + gfx_pointer Duel2Gfx, $08 ; SPRITE_DUEL_2 + gfx_pointer Duel55Gfx, $02 ; SPRITE_DUEL_55 + gfx_pointer Duel58Gfx, $04 ; SPRITE_DUEL_58 + gfx_pointer Duel3Gfx, $09 ; SPRITE_DUEL_3 + gfx_pointer Duel4Gfx, $12 ; SPRITE_DUEL_4 + gfx_pointer Duel5Gfx, $09 ; SPRITE_DUEL_5 + gfx_pointer Duel6Gfx, $11 ; SPRITE_DUEL_6 + gfx_pointer Duel59Gfx, $03 ; SPRITE_DUEL_59 + gfx_pointer Duel7Gfx, $2d ; SPRITE_DUEL_7 + gfx_pointer Duel8Gfx, $0d ; SPRITE_DUEL_8 + gfx_pointer Duel9Gfx, $1c ; SPRITE_DUEL_9 + gfx_pointer Duel10Gfx, $4c ; SPRITE_DUEL_10 + gfx_pointer Duel61Gfx, $03 ; SPRITE_DUEL_61 + gfx_pointer Duel11Gfx, $1b ; SPRITE_DUEL_11 + gfx_pointer Duel12Gfx, $07 ; SPRITE_DUEL_12 + gfx_pointer Duel13Gfx, $0c ; SPRITE_DUEL_13 + gfx_pointer Duel62Gfx, $01 ; SPRITE_DUEL_62 + gfx_pointer Duel14Gfx, $22 ; SPRITE_DUEL_14 + gfx_pointer Duel15Gfx, $20 ; SPRITE_DUEL_15 + gfx_pointer Duel16Gfx, $0a ; SPRITE_DUEL_16 + gfx_pointer Duel17Gfx, $25 ; SPRITE_DUEL_17 + gfx_pointer Duel18Gfx, $18 ; SPRITE_DUEL_18 + gfx_pointer Duel19Gfx, $1b ; SPRITE_DUEL_19 + gfx_pointer Duel20Gfx, $08 ; SPRITE_DUEL_20 + gfx_pointer Duel21Gfx, $0d ; SPRITE_DUEL_21 + gfx_pointer Duel22Gfx, $22 ; SPRITE_DUEL_22 + gfx_pointer Duel23Gfx, $0c ; SPRITE_DUEL_23 + gfx_pointer Duel24Gfx, $25 ; SPRITE_DUEL_24 + gfx_pointer Duel25Gfx, $22 ; SPRITE_DUEL_25 + gfx_pointer Duel26Gfx, $0c ; SPRITE_DUEL_26 + gfx_pointer Duel27Gfx, $4c ; SPRITE_DUEL_27 + gfx_pointer Duel28Gfx, $08 ; SPRITE_DUEL_28 + gfx_pointer Duel29Gfx, $07 ; SPRITE_DUEL_29 + gfx_pointer Duel56Gfx, $01 ; SPRITE_DUEL_56 + gfx_pointer Duel30Gfx, $1a ; SPRITE_DUEL_30 + gfx_pointer Duel31Gfx, $0a ; SPRITE_DUEL_31 + gfx_pointer Duel32Gfx, $2e ; SPRITE_DUEL_32 + gfx_pointer Duel33Gfx, $08 ; SPRITE_DUEL_33 + gfx_pointer Duel34Gfx, $07 ; SPRITE_DUEL_34 + gfx_pointer Duel35Gfx, $1c ; SPRITE_DUEL_35 + gfx_pointer Duel66Gfx, $04 ; SPRITE_DUEL_66 + gfx_pointer Duel36Gfx, $08 ; SPRITE_DUEL_36 + gfx_pointer Duel37Gfx, $0b ; SPRITE_DUEL_37 + gfx_pointer Duel57Gfx, $01 ; SPRITE_DUEL_57 + gfx_pointer Duel38Gfx, $1c ; SPRITE_DUEL_38 + gfx_pointer Duel39Gfx, $16 ; SPRITE_DUEL_39 + gfx_pointer Duel40Gfx, $10 ; SPRITE_DUEL_40 + gfx_pointer Duel41Gfx, $0f ; SPRITE_DUEL_41 + gfx_pointer Duel42Gfx, $07 ; SPRITE_DUEL_42 + gfx_pointer Duel43Gfx, $0a ; SPRITE_DUEL_43 + gfx_pointer Duel44Gfx, $09 ; SPRITE_DUEL_44 + gfx_pointer Duel60Gfx, $02 ; SPRITE_DUEL_60 + gfx_pointer Duel64Gfx, $02 ; SPRITE_DUEL_64 + gfx_pointer Duel45Gfx, $03 ; SPRITE_DUEL_45 + gfx_pointer Duel46Gfx, $08 ; SPRITE_DUEL_46 + gfx_pointer Duel47Gfx, $0f ; SPRITE_DUEL_47 + gfx_pointer Duel48Gfx, $03 ; SPRITE_DUEL_48 + gfx_pointer Duel49Gfx, $05 ; SPRITE_DUEL_49 + gfx_pointer Duel50Gfx, $17 ; SPRITE_DUEL_50 + gfx_pointer Duel51Gfx, $36 ; SPRITE_DUEL_WON_LOST_DRAW + gfx_pointer Duel52Gfx, $0b ; SPRITE_DUEL_52 + gfx_pointer Duel53Gfx, $06 ; SPRITE_DUEL_53 + gfx_pointer Duel54Gfx, $16 ; SPRITE_DUEL_54 + gfx_pointer BoosterPackOAMGfx, $20 ; SPRITE_BOOSTER_PACK_OAM + gfx_pointer PressStartGfx, $14 ; SPRITE_PRESS_START + gfx_pointer GrassGfx, $04 ; SPRITE_GRASS + gfx_pointer FireGfx, $04 ; SPRITE_FIRE + gfx_pointer WaterGfx, $04 ; SPRITE_WATER + gfx_pointer ColorlessGfx, $04 ; SPRITE_COLORLESS + gfx_pointer LightningGfx, $04 ; SPRITE_LIGHTNING + gfx_pointer PsychicGfx, $04 ; SPRITE_PSYCHIC + gfx_pointer FightingGfx, $04 ; SPRITE_FIGHTING diff --git a/src/engine/gfx/tilemaps.asm b/src/engine/gfx/tilemaps.asm new file mode 100644 index 0000000..216cca1 --- /dev/null +++ b/src/engine/gfx/tilemaps.asm @@ -0,0 +1,114 @@ +; \1 = pointer +; \2 = tileset +tilemap: MACRO + dwb \1, BANK(\1) - BANK(Tilemaps) + db \2 +ENDM + +Tilemaps: + tilemap OverworldMapTilemap, TILESET_OVERWORLD_MAP ; TILEMAP_OVERWORLD_MAP + tilemap OverworldMapCGBTilemap, TILESET_OVERWORLD_MAP ; TILEMAP_OVERWORLD_MAP_CGB + tilemap MasonLaboratoryTilemap, TILESET_MASON_LABORATORY ; TILEMAP_MASON_LABORATORY + tilemap MasonLaboratoryCGBTilemap, TILESET_MASON_LABORATORY ; TILEMAP_MASON_LABORATORY_CGB + tilemap ChallengeMachineMapEventTilemap, TILESET_MASON_LABORATORY ; TILEMAP_CHALLENGE_MACHINE_MAP_EVENT + tilemap ChallengeMachineMapEventCGBTilemap,TILESET_MASON_LABORATORY ; TILEMAP_CHALLENGE_MACHINE_MAP_EVENT_CGB + tilemap DeckMachineRoomTilemap, TILESET_MASON_LABORATORY ; TILEMAP_DECK_MACHINE_ROOM + tilemap DeckMachineRoomCGBTilemap, TILESET_MASON_LABORATORY ; TILEMAP_DECK_MACHINE_ROOM_CGB + tilemap DeckMachineMapEventTilemap, TILESET_MASON_LABORATORY ; TILEMAP_DECK_MACHINE_MAP_EVENT + tilemap DeckMachineMapEventCGBTilemap, TILESET_MASON_LABORATORY ; TILEMAP_DECK_MACHINE_MAP_EVENT_CGB + tilemap IshiharaTilemap, TILESET_ISHIHARA ; TILEMAP_ISHIHARA + tilemap IshiharaCGBTilemap, TILESET_ISHIHARA ; TILEMAP_ISHIHARA_CGB + tilemap FightingClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_FIGHTING_CLUB_ENTRANCE + tilemap FightingClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_FIGHTING_CLUB_ENTRANCE_CGB + tilemap RockClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_ROCK_CLUB_ENTRANCE + tilemap RockClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_ROCK_CLUB_ENTRANCE_CGB + tilemap WaterClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_WATER_CLUB_ENTRANCE + tilemap WaterClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_WATER_CLUB_ENTRANCE_CGB + tilemap LightningClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_LIGHTNING_CLUB_ENTRANCE + tilemap LightningClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_LIGHTNING_CLUB_ENTRANCE_CGB + tilemap GrassClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_GRASS_CLUB_ENTRANCE + tilemap GrassClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_GRASS_CLUB_ENTRANCE_CGB + tilemap PsychicClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_PSYCHIC_CLUB_ENTRANCE + tilemap PsychicClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_PSYCHIC_CLUB_ENTRANCE_CGB + tilemap ScienceClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_SCIENCE_CLUB_ENTRANCE + tilemap ScienceClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_SCIENCE_CLUB_ENTRANCE_CGB + tilemap FireClubEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_FIRE_CLUB_ENTRANCE + tilemap FireClubEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_FIRE_CLUB_ENTRANCE_CGB + tilemap ChallengeHallEntranceTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_CHALLENGE_HALL_ENTRANCE + tilemap ChallengeHallEntranceCGBTilemap, TILESET_CLUB_ENTRANCE ; TILEMAP_CHALLENGE_HALL_ENTRANCE_CGB + tilemap ClubLobbyTilemap, TILESET_CLUB_LOBBY ; TILEMAP_CLUB_LOBBY + tilemap ClubLobbyCGBTilemap, TILESET_CLUB_LOBBY ; TILEMAP_CLUB_LOBBY_CGB + tilemap FightingClubTilemap, TILESET_FIGHTING_CLUB ; TILEMAP_FIGHTING_CLUB + tilemap FightingClubCGBTilemap, TILESET_FIGHTING_CLUB ; TILEMAP_FIGHTING_CLUB_CGB + tilemap RockClubTilemap, TILESET_ROCK_CLUB ; TILEMAP_ROCK_CLUB + tilemap RockClubCGBTilemap, TILESET_ROCK_CLUB ; TILEMAP_ROCK_CLUB_CGB + tilemap WaterClubTilemap, TILESET_WATER_CLUB ; TILEMAP_WATER_CLUB + tilemap WaterClubCGBTilemap, TILESET_WATER_CLUB ; TILEMAP_WATER_CLUB_CGB + tilemap LightningClubTilemap, TILESET_LIGHTNING_CLUB ; TILEMAP_LIGHTNING_CLUB + tilemap LightningClubCGBTilemap, TILESET_LIGHTNING_CLUB ; TILEMAP_LIGHTNING_CLUB_CGB + tilemap GrassClubTilemap, TILESET_GRASS_CLUB ; TILEMAP_GRASS_CLUB + tilemap GrassClubCGBTilemap, TILESET_GRASS_CLUB ; TILEMAP_GRASS_CLUB_CGB + tilemap PsychicClubTilemap, TILESET_PSYCHIC_CLUB ; TILEMAP_PSYCHIC_CLUB + tilemap PsychicClubCGBTilemap, TILESET_PSYCHIC_CLUB ; TILEMAP_PSYCHIC_CLUB_CGB + tilemap ScienceClubTilemap, TILESET_SCIENCE_CLUB ; TILEMAP_SCIENCE_CLUB + tilemap ScienceClubCGBTilemap, TILESET_SCIENCE_CLUB ; TILEMAP_SCIENCE_CLUB_CGB + tilemap FireClubTilemap, TILESET_FIRE_CLUB ; TILEMAP_FIRE_CLUB + tilemap FireClubCGBTilemap, TILESET_FIRE_CLUB ; TILEMAP_FIRE_CLUB_CGB + tilemap ChallengeHallTilemap, TILESET_CHALLENGE_HALL ; TILEMAP_CHALLENGE_HALL + tilemap ChallengeHallCGBTilemap, TILESET_CHALLENGE_HALL ; TILEMAP_CHALLENGE_HALL_CGB + tilemap PokemonDomeEntranceTilemap, TILESET_POKEMON_DOME_ENTRANCE ; TILEMAP_POKEMON_DOME_ENTRANCE + tilemap PokemonDomeEntranceCGBTilemap, TILESET_POKEMON_DOME_ENTRANCE ; TILEMAP_POKEMON_DOME_ENTRANCE_CGB + tilemap PokemonDomeDoorMapEventTilemap, TILESET_POKEMON_DOME_ENTRANCE ; TILEMAP_POKEMON_DOME_DOOR_MAP_EVENT + tilemap PokemonDomeDoorMapEventCGBTilemap, TILESET_POKEMON_DOME_ENTRANCE ; TILEMAP_POKEMON_DOME_DOOR_MAP_EVENT_CGB + tilemap PokemonDomeTilemap, TILESET_POKEMON_DOME ; TILEMAP_POKEMON_DOME + tilemap PokemonDomeCGBTilemap, TILESET_POKEMON_DOME ; TILEMAP_POKEMON_DOME_CGB + tilemap HallOfHonorDoorMapEventTilemap, TILESET_POKEMON_DOME ; TILEMAP_HALL_OF_HONOR_DOOR_MAP_EVENT + tilemap HallOfHonorDoorMapEventCGBTilemap, TILESET_POKEMON_DOME ; TILEMAP_HALL_OF_HONOR_DOOR_MAP_EVENT_CGB + tilemap HallOfHonorTilemap, TILESET_HALL_OF_HONOR ; TILEMAP_HALL_OF_HONOR + tilemap HallOfHonorCGBTilemap, TILESET_HALL_OF_HONOR ; TILEMAP_HALL_OF_HONOR_CGB + tilemap CardPopCGBTilemap, TILESET_CARD_POP ; TILEMAP_CARD_POP_CGB + tilemap CardPopTilemap, TILESET_CARD_POP ; TILEMAP_CARD_POP + tilemap GrassMedalTilemap, TILESET_MEDAL ; TILEMAP_GRASS_MEDAL + tilemap ScienceMedalTilemap, TILESET_MEDAL ; TILEMAP_SCIENCE_MEDAL + tilemap FireMedalTilemap, TILESET_MEDAL ; TILEMAP_FIRE_MEDAL + tilemap WaterMedalTilemap, TILESET_MEDAL ; TILEMAP_WATER_MEDAL + tilemap LightningMedalTilemap, TILESET_MEDAL ; TILEMAP_LIGHTNING_MEDAL + tilemap FightingMedalTilemap, TILESET_MEDAL ; TILEMAP_FIGHTING_MEDAL + tilemap RockMedalTilemap, TILESET_MEDAL ; TILEMAP_ROCK_MEDAL + tilemap PsychicMedalTilemap, TILESET_MEDAL ; TILEMAP_PSYCHIC_MEDAL + tilemap GameBoyLinkCGBTilemap, TILESET_GAMEBOY_LINK ; TILEMAP_GAMEBOY_LINK_CGB + tilemap GameBoyLinkTilemap, TILESET_GAMEBOY_LINK ; TILEMAP_GAMEBOY_LINK + tilemap GameBoyLinkConnectingCGBTilemap, TILESET_GAMEBOY_LINK ; TILEMAP_GAMEBOY_LINK_CONNECTING_CGB + tilemap GameBoyLinkConnectingTilemap, TILESET_GAMEBOY_LINK ; TILEMAP_GAMEBOY_LINK_CONNECTING + tilemap GameBoyPrinterCGBTilemap, TILESET_GAMEBOY_PRINTER ; TILEMAP_GAMEBOY_PRINTER_CGB + tilemap GameBoyPrinterTilemap, TILESET_GAMEBOY_PRINTER ; TILEMAP_GAMEBOY_PRINTER + tilemap ColosseumTilemap, TILESET_COLOSSEUM_1 ; TILEMAP_COLOSSEUM + tilemap ColosseumCGBTilemap, TILESET_COLOSSEUM_2 ; TILEMAP_COLOSSEUM_CGB + tilemap EvolutionTilemap, TILESET_EVOLUTION_1 ; TILEMAP_EVOLUTION + tilemap EvolutionCGBTilemap, TILESET_EVOLUTION_2 ; TILEMAP_EVOLUTION_CGB + tilemap MysteryTilemap, TILESET_MYSTERY_1 ; TILEMAP_MYSTERY + tilemap MysteryCGBTilemap, TILESET_MYSTERY_2 ; TILEMAP_MYSTERY_CGB + tilemap LaboratoryTilemap, TILESET_LABORATORY_1 ; TILEMAP_LABORATORY + tilemap LaboratoryCGBTilemap, TILESET_LABORATORY_2 ; TILEMAP_LABORATORY_CGB + tilemap CharizardIntroTilemap, TILESET_CHARIZARD_INTRO_1 ; TILEMAP_CHARIZARD_INTRO + tilemap CharizardIntroCGBTilemap, TILESET_CHARIZARD_INTRO_2 ; TILEMAP_CHARIZARD_INTRO_CGB + tilemap ScytherIntroTilemap, TILESET_SCYTHER_INTRO_1 ; TILEMAP_SCYTHER_INTRO + tilemap ScytherIntroCGBTilemap, TILESET_SCYTHER_INTRO_2 ; TILEMAP_SCYTHER_INTRO_CGB + tilemap AerodactylIntroTilemap, TILESET_AERODACTYL_INTRO_1 ; TILEMAP_AERODACTYL_INTRO + tilemap AerodactylIntroCGBTilemap, TILESET_AERODACTYL_INTRO_2 ; TILEMAP_AERODACTYL_INTRO_CGB + tilemap JapaneseTitleScreenTilemap, TILESET_JAPANESE_TITLE_SCREEN ; TILEMAP_JAPANESE_TITLE_SCREEN + tilemap JapaneseTitleScreenCGBTilemap, TILESET_JAPANESE_TITLE_SCREEN_CGB ; TILEMAP_JAPANESE_TITLE_SCREEN_CGB + tilemap SolidTiles1Tilemap, TILESET_SOLID_TILES_1 ; TILEMAP_SOLID_TILES_1 + tilemap SolidTiles2Tilemap, TILESET_SOLID_TILES_1 ; TILEMAP_SOLID_TILES_2 + tilemap SolidTiles3Tilemap, TILESET_SOLID_TILES_1 ; TILEMAP_SOLID_TILES_3 + tilemap JapaneseTitleScreen2Tilemap, TILESET_JAPANESE_TITLE_SCREEN_2 ; TILEMAP_JAPANESE_TITLE_SCREEN_2 + tilemap JapaneseTitleScreen2CGBTilemap, TILESET_JAPANESE_TITLE_SCREEN_2_CGB ; TILEMAP_JAPANESE_TITLE_SCREEN_2_CGB + tilemap SolidTiles4Tilemap, TILESET_SOLID_TILES_2 ; TILEMAP_SOLID_TILES_4 + tilemap PlayerTilemap, TILESET_PLAYER ; TILEMAP_PLAYER + tilemap OpponentTilemap, TILESET_RONALD ; TILEMAP_OPPONENT + tilemap TitleScreenTilemap, TILESET_TITLE_SCREEN ; TILEMAP_TITLE_SCREEN + tilemap TitleScreenCGBTilemap, TILESET_TITLE_SCREEN_CGB ; TILEMAP_TITLE_SCREEN_CGB + tilemap CopyrightTilemap, TILESET_COPYRIGHT ; TILEMAP_COPYRIGHT + tilemap CopyrightCGBTilemap, TILESET_COPYRIGHT ; TILEMAP_COPYRIGHT_CGB + tilemap NintendoTilemap, TILESET_NINTENDO ; TILEMAP_NINTENDO + tilemap CompaniesTilemap, TILESET_COMPANIES ; TILEMAP_COMPANIES diff --git a/src/engine/gfx/tilesets.asm b/src/engine/gfx/tilesets.asm new file mode 100644 index 0000000..0b4f0af --- /dev/null +++ b/src/engine/gfx/tilesets.asm @@ -0,0 +1,95 @@ +; \1 = pointer +; \2 = number of tiles +tileset: MACRO + dwb \1, BANK(\1) - BANK(Tilesets) + db \2 +ENDM + +Tilesets: + tileset OverworldMapTiles, 193 ; TILESET_OVERWORLD_MAP + tileset MasonLaboratoryTilesetGfx, 151 ; TILESET_MASON_LABORATORY + tileset IshiharaTilesetGfx, 77 ; TILESET_ISHIHARA + tileset ClubEntranceTilesetGfx, 129 ; TILESET_CLUB_ENTRANCE + tileset ClubLobbyTilesetGfx, 120 ; TILESET_CLUB_LOBBY + tileset FightingClubTilesetGfx, 99 ; TILESET_FIGHTING_CLUB + tileset RockClubTilesetGfx, 60 ; TILESET_ROCK_CLUB + tileset WaterClubTilesetGfx, 161 ; TILESET_WATER_CLUB + tileset LightningClubTilesetGfx, 131 ; TILESET_LIGHTNING_CLUB + tileset GrassClubTilesetGfx, 87 ; TILESET_GRASS_CLUB + tileset PsychicClubTilesetGfx, 58 ; TILESET_PSYCHIC_CLUB + tileset ScienceClubTilesetGfx, 82 ; TILESET_SCIENCE_CLUB + tileset FireClubTilesetGfx, 87 ; TILESET_FIRE_CLUB + tileset ChallengeHallTilesetGfx, 157 ; TILESET_CHALLENGE_HALL + tileset PokemonDomeEntranceTilesetGfx, 78 ; TILESET_POKEMON_DOME_ENTRANCE + tileset PokemonDomeTilesetGfx, 207 ; TILESET_POKEMON_DOME + tileset HallOfHonorTilesetGfx, 121 ; TILESET_HALL_OF_HONOR + tileset CardPopGfx, 189 ; TILESET_CARD_POP + tileset MedalGfx, 72 ; TILESET_MEDAL + tileset GameBoyLinkGfx, 109 ; TILESET_GAMEBOY_LINK + tileset GameBoyPrinterGfx, 93 ; TILESET_GAMEBOY_PRINTER + tileset Colosseum1Gfx, 96 ; TILESET_COLOSSEUM_1 + tileset Colosseum2Gfx, 86 ; TILESET_COLOSSEUM_2 + tileset Evolution1Gfx, 96 ; TILESET_EVOLUTION_1 + tileset Evolution2Gfx, 86 ; TILESET_EVOLUTION_2 + tileset Mystery1Gfx, 96 ; TILESET_MYSTERY_1 + tileset Mystery2Gfx, 86 ; TILESET_MYSTERY_2 + tileset Laboratory1Gfx, 96 ; TILESET_LABORATORY_1 + tileset Laboratory2Gfx, 86 ; TILESET_LABORATORY_2 + tileset CharizardIntro1Gfx, 96 ; TILESET_CHARIZARD_INTRO_1 + tileset CharizardIntro2Gfx, 96 ; TILESET_CHARIZARD_INTRO_2 + tileset ScytherIntro1Gfx, 96 ; TILESET_SCYTHER_INTRO_1 + tileset ScytherIntro2Gfx, 96 ; TILESET_SCYTHER_INTRO_2 + tileset AerodactylIntro1Gfx, 96 ; TILESET_AERODACTYL_INTRO_1 + tileset AerodactylIntro2Gfx, 96 ; TILESET_AERODACTYL_INTRO_2 + tileset JapaneseTitleScreenGfx, 97 ; TILESET_JAPANESE_TITLE_SCREEN + tileset JapaneseTitleScreenCGBGfx, 97 ; TILESET_JAPANESE_TITLE_SCREEN_CGB + tileset SolidTiles1, 4 ; TILESET_SOLID_TILES_1 + tileset JapaneseTitleScreen2Gfx, 244 ; TILESET_JAPANESE_TITLE_SCREEN_2 + tileset JapaneseTitleScreen2CGBGfx, 59 ; TILESET_JAPANESE_TITLE_SCREEN_2_CGB + tileset SolidTiles2, 4 ; TILESET_SOLID_TILES_2 + tileset PlayerGfx, 36 ; TILESET_PLAYER + tileset RonaldGfx, 36 ; TILESET_RONALD + tileset TitleScreenGfx, 220 ; TILESET_TITLE_SCREEN + tileset TitleScreenCGBGfx, 212 ; TILESET_TITLE_SCREEN_CGB + tileset CopyrightGfx, 36 ; TILESET_COPYRIGHT + tileset NintendoGfx, 24 ; TILESET_NINTENDO + tileset CompaniesGfx, 49 ; TILESET_COMPANIES + tileset SamGfx, 36 ; TILESET_SAM + tileset ImakuniGfx, 36 ; TILESET_IMAKUNI + tileset NikkiGfx, 36 ; TILESET_NIKKI + tileset RickGfx, 36 ; TILESET_RICK + tileset KenGfx, 36 ; TILESET_KEN + tileset AmyGfx, 36 ; TILESET_AMY + tileset IsaacGfx, 36 ; TILESET_ISAAC + tileset MitchGfx, 36 ; TILESET_MITCH + tileset GeneGfx, 36 ; TILESET_GENE + tileset MurrayGfx, 36 ; TILESET_MURRAY + tileset CourtneyGfx, 36 ; TILESET_COURTNEY + tileset SteveGfx, 36 ; TILESET_STEVE + tileset JackGfx, 36 ; TILESET_JACK + tileset RodGfx, 36 ; TILESET_ROD + tileset JosephGfx, 36 ; TILESET_JOSEPH + tileset DavidGfx, 36 ; TILESET_DAVID + tileset ErikGfx, 36 ; TILESET_ERIK + tileset JohnGfx, 36 ; TILESET_JOHN + tileset AdamGfx, 36 ; TILESET_ADAM + tileset JonathanGfx, 36 ; TILESET_JONATHAN + tileset JoshuaGfx, 36 ; TILESET_JOSHUA + tileset NicholasGfx, 36 ; TILESET_NICHOLAS + tileset BrandonGfx, 36 ; TILESET_BRANDON + tileset MatthewGfx, 36 ; TILESET_MATTHEW + tileset RyanGfx, 36 ; TILESET_RYAN + tileset AndrewGfx, 36 ; TILESET_ANDREW + tileset ChrisGfx, 36 ; TILESET_CHRIS + tileset MichaelGfx, 36 ; TILESET_MICHAEL + tileset DanielGfx, 36 ; TILESET_DANIEL + tileset RobertGfx, 36 ; TILESET_ROBERT + tileset BrittanyGfx, 36 ; TILESET_BRITTANY + tileset KristinGfx, 36 ; TILESET_KRISTIN + tileset HeatherGfx, 36 ; TILESET_HEATHER + tileset SaraGfx, 36 ; TILESET_SARA + tileset AmandaGfx, 36 ; TILESET_AMANDA + tileset JenniferGfx, 36 ; TILESET_JENNIFER + tileset JessicaGfx, 36 ; TILESET_JESSICA + tileset StephanieGfx, 36 ; TILESET_STEPHANIE + tileset AaronGfx, 36 ; TILESET_AARON diff --git a/src/engine/input_name.asm b/src/engine/input_name.asm new file mode 100644 index 0000000..edcac4c --- /dev/null +++ b/src/engine/input_name.asm @@ -0,0 +1,1417 @@ +WhatIsYourNameData: + textitem 1, 1, WhatIsYourNameText + db $ff +; [Deck1Data ~ Deck4Data] +; These are directed from InputCurDeckName, +; without any bank description. +; That is, the developers hard-coded it. -_-;; +Deck1Data: + textitem 2, 1, Deck1Text + textitem 14, 1, DeckText + db $ff +Deck2Data: + textitem 2, 1, Deck2Text + textitem 14, 1, DeckText + db $ff +Deck3Data: + textitem 2, 1, Deck3Text + textitem 14, 1, DeckText + db $ff +Deck4Data: + textitem 2, 1, Deck4Text + textitem 14, 1, DeckText + db $ff + +; set each byte zero from hl for b bytes. +ClearMemory: + push af + push bc + push hl + ld b, a + xor a +.loop + ld [hli], a + dec b + jr nz, .loop + pop hl + pop bc + pop af + ret + +; play different sfx by a. +; if a is 0xff play SFX_03 (usually following a B press), +; else play SFX_02 (usually following an A press). +PlayAcceptOrDeclineSFX: + push af + inc a + jr z, .sfx_decline + ld a, SFX_02 + jr .sfx_accept +.sfx_decline + ld a, SFX_03 +.sfx_accept + call PlaySFX + pop af + ret + +; get player name from the user +; into hl +InputPlayerName: + ld e, l + ld d, h + ld a, MAX_PLAYER_NAME_LENGTH + ld hl, WhatIsYourNameData + lb bc, 12, 1 + call InitializeInputName + call Set_OBJ_8x8 + xor a + ld [wTileMapFill], a + call EmptyScreen + call ZeroObjectPositions + ld a, $01 + ld [wVBlankOAMCopyToggle], a + call LoadSymbolsFont + lb de, $38, $bf + call SetupText + call LoadTextCursorTile + ld a, $02 + ld [wd009], a + call DrawNamingScreenBG + xor a + ld [wNamingScreenCursorX], a + ld [wNamingScreenCursorY], a + ld a, $09 + ld [wNamingScreenNumColumns], a + ld a, $06 + ld [wNamingScreenKeyboardHeight], a + ld a, $0f + ld [wVisibleCursorTile], a + ld a, $00 + ld [wInvisibleCursorTile], a +.loop + ld a, $01 + ld [wVBlankOAMCopyToggle], a + call DoFrame + call UpdateRNGSources + ldh a, [hDPadHeld] + and START + jr z, .else + ; if pressed start button. + ld a, $01 + call PlayAcceptOrDeclineSFX + call Func_1aa07 + ld a, 6 + ld [wNamingScreenCursorX], a + ld a, 5 + ld [wNamingScreenCursorY], a + call Func_1aa23 + jr .loop +.else + call NamingScreen_CheckButtonState + jr nc, .loop ; if not pressed, go back to the loop. + cp $ff + jr z, .on_b_button + ; on A button. + call NamingScreen_ProcessInput + jr nc, .loop + ; if the player selected the end button, + ; end its naming. + call FinalizeInputName + ret +.on_b_button + ld a, [wNamingScreenBufferLength] + or a + jr z, .loop ; empty string? + ; erase one character. + ld e, a + ld d, 0 + ld hl, wNamingScreenBuffer + add hl, de + dec hl + dec hl + ld [hl], TX_END + ld hl, wNamingScreenBufferLength ; note that its unit is byte, not word. + dec [hl] + dec [hl] + call PrintPlayerNameFromInput + jr .loop + +; it's called when naming(either player's or deck's) starts. +; a: maximum length of name(depending on whether player's or deck's). +; bc: position of name. +; de: dest. pointer. +; hl: pointer to text item of the question. +InitializeInputName: + ld [wNamingScreenBufferMaxLength], a + push hl + ld hl, wNamingScreenNamePosition + ld [hl], b + inc hl + ld [hl], c + pop hl + ld b, h + ld c, l + ; set the question string. + ld hl, wNamingScreenQuestionPointer + ld [hl], c + inc hl + ld [hl], b + ; set the destination buffer. + ld hl, wNamingScreenDestPointer + ld [hl], e + inc hl + ld [hl], d + ; clear the name buffer. + ld a, NAMING_SCREEN_BUFFER_LENGTH + ld hl, wNamingScreenBuffer + call ClearMemory + ld hl, wNamingScreenBuffer + ld a, [wNamingScreenBufferMaxLength] + ld b, a + inc b +.loop + ; copy data from de to hl + ; for b bytes. + ld a, [de] + inc de + ld [hli], a + dec b + jr nz, .loop + ld hl, wNamingScreenBuffer + call GetTextLengthInTiles + ld a, c + ld [wNamingScreenBufferLength], a + ret + +FinalizeInputName: + ld hl, wNamingScreenDestPointer + ld e, [hl] + inc hl + ld d, [hl] + ld l, e + ld h, d + ld de, wNamingScreenBuffer + ld a, [wNamingScreenBufferMaxLength] + ld b, a + inc b + jr InitializeInputName.loop + +; draws the keyboard frame +; and the question if it exists. +DrawNamingScreenBG: + call DrawTextboxForKeyboard + call PrintPlayerNameFromInput + ld hl, wNamingScreenQuestionPointer + ld c, [hl] + inc hl + ld a, [hl] + ld h, a + or c + jr z, .put_text_end + ; print the question string. + ; ex) "What is your name?" + ld l, c + call PlaceTextItems +.put_text_end + ; print "End". + ld hl, .data + call PlaceTextItems + ldtx hl, PlayerNameKeyboardText + lb de, 2, 4 + call InitTextPrinting + call ProcessTextFromID + call EnableLCD + ret +.data + textitem $0f, $10, EndText ; "End" + db $ff + +DrawTextboxForKeyboard: + lb de, 0, 3 ; x, y + lb bc, 20, 15 ; w, h + call DrawRegularTextBox + ret + +PrintPlayerNameFromInput: + ld hl, wNamingScreenNamePosition + ld d, [hl] + inc hl + ld e, [hl] + push de + call InitTextPrinting + ld a, [wNamingScreenBufferMaxLength] + ld e, a + ld a, $14 + sub e + inc a + ld e, a + ld d, 0 + ; print the underbars + ; before print the input. + ld hl, .char_underbar + add hl, de + call ProcessText + pop de + call InitTextPrinting + ; print the input from the user. + ld hl, wNamingScreenBuffer + call ProcessText + ret +.char_underbar + db $56 +rept 10 + textfw3 "_" +endr + done + +; check if button pressed. +; if pressed, set the carry bit on. +NamingScreen_CheckButtonState: + xor a + ld [wPlaysSfx], a + ldh a, [hDPadHeld] + or a + jp z, .no_press + ; detected any button press. + ld b, a + ld a, [wNamingScreenKeyboardHeight] + ld c, a + ld a, [wNamingScreenCursorX] + ld h, a + ld a, [wNamingScreenCursorY] + ld l, a + bit D_UP_F, b + jr z, .asm_692c + ; up + dec a + bit D_DOWN_F, a + jr z, .asm_69a7 + ld a, c + dec a + jr .asm_69a7 +.asm_692c + bit D_DOWN_F, b + jr z, .asm_6937 + ; down + inc a + cp c + jr c, .asm_69a7 + xor a + jr .asm_69a7 +.asm_6937 + ld a, [wNamingScreenNumColumns] + ld c, a + ld a, h + bit D_LEFT_F, b + jr z, .asm_6974 + ; left + ld d, a + ld a, $06 + cp l + ld a, d + jr nz, .asm_696b + push hl + push bc + push af + call GetCharInfoFromPos_Player + inc hl + inc hl + inc hl + inc hl + inc hl + ld a, [hl] + dec a + ld d, a + pop af + pop bc + pop hl + sub d + cp $ff + jr nz, .asm_6962 + ld a, c + sub $02 + jr .asm_69aa +.asm_6962 + cp $fe + jr nz, .asm_696b + ld a, c + sub $03 + jr .asm_69aa +.asm_696b + dec a + bit D_DOWN_F, a + jr z, .asm_69aa + ld a, c + dec a + jr .asm_69aa +.asm_6974 + bit D_RIGHT_F, b + jr z, .no_press + ld d, a + ld a, $06 + cp l + ld a, d + jr nz, .asm_6990 + push hl + push bc + push af + call GetCharInfoFromPos_Player + inc hl + inc hl + inc hl + inc hl + ld a, [hl] + dec a + ld d, a + pop af + pop bc + pop hl + add d +.asm_6990 + inc a + cp c + jr c, .asm_69aa + inc c + cp c + jr c, .asm_69a4 + inc c + cp c + jr c, .asm_69a0 + ld a, $02 + jr .asm_69aa +.asm_69a0 + ld a, $01 + jr .asm_69aa +.asm_69a4 + xor a + jr .asm_69aa +.asm_69a7 + ld l, a + jr .asm_69ab +.asm_69aa + ld h, a +.asm_69ab + push hl + call GetCharInfoFromPos_Player + inc hl + inc hl + inc hl + ld a, [wd009] + cp $02 + jr nz, .asm_69bb + inc hl + inc hl +.asm_69bb + ld d, [hl] + push de + call Func_1aa07 + pop de + pop hl + ld a, l + ld [wNamingScreenCursorY], a + ld a, h + ld [wNamingScreenCursorX], a + xor a + ld [wCheckMenuCursorBlinkCounter], a + ld a, $06 + cp d + jp z, NamingScreen_CheckButtonState + ld a, $01 + ld [wPlaysSfx], a +.no_press + ldh a, [hKeysPressed] + and A_BUTTON | B_BUTTON + jr z, .asm_69ef + and A_BUTTON + jr nz, .asm_69e5 + ld a, $ff +.asm_69e5 + call PlayAcceptOrDeclineSFX + push af + call Func_1aa23 + pop af + scf + ret +.asm_69ef + ld a, [wPlaysSfx] + or a + jr z, .asm_69f8 + call PlaySFX +.asm_69f8 + ld hl, wCheckMenuCursorBlinkCounter + ld a, [hl] + inc [hl] + and $0f + ret nz + ld a, [wVisibleCursorTile] + bit 4, [hl] + jr z, Func_1aa07.asm_6a0a + +Func_1aa07: + ld a, [wInvisibleCursorTile] +.asm_6a0a + ld e, a + ld a, [wNamingScreenCursorX] + ld h, a + ld a, [wNamingScreenCursorY] + ld l, a + call GetCharInfoFromPos_Player + ld a, [hli] + ld c, a + ld b, [hl] + dec b + ld a, e + call Func_1aa28 + call WriteByteToBGMap0 + or a + ret + +Func_1aa23: + ld a, [wVisibleCursorTile] + jr Func_1aa07.asm_6a0a + +Func_1aa28: + push af + push bc + push de + push hl + push af + call ZeroObjectPositions + pop af + ld b, a + ld a, [wInvisibleCursorTile] + cp b + jr z, .asm_6a60 + ld a, [wNamingScreenBufferLength] + srl a + ld d, a + ld a, [wNamingScreenBufferMaxLength] + srl a + ld e, a + ld a, d + cp e + jr nz, .asm_6a49 + dec a +.asm_6a49 + ld hl, wNamingScreenNamePosition + add [hl] + ld d, a + ld h, $08 + ld l, d + call HtimesL + ld a, l + add $08 + ld d, a + ld e, $18 + ld bc, $0000 + call SetOneObjectAttributes +.asm_6a60 + pop hl + pop de + pop bc + pop af + ret + +; load, to the first tile of v0Tiles0, the graphics for the +; blinking black square used in name input screens. +; for inputting full width text. +LoadTextCursorTile: + ld hl, v0Tiles0 + $00 tiles + ld de, .data + ld b, 0 +.loop + ld a, TILE_SIZE + cp b + ret z + inc b + ld a, [de] + inc de + ld [hli], a + jr .loop + +.data +rept TILE_SIZE + db $ff +endr + +; set the carry bit on, +; if "End" was selected. +NamingScreen_ProcessInput: + ld a, [wNamingScreenCursorX] + ld h, a + ld a, [wNamingScreenCursorY] + ld l, a + call GetCharInfoFromPos_Player + inc hl + inc hl + ; load types into de. + ld e, [hl] + inc hl + ld a, [hli] + ld d, a + cp $09 + jp z, .on_end + cp $07 + jr nz, .asm_6ab8 + ld a, [wd009] + or a + jr nz, .asm_6aac + ld a, $01 + jp .asm_6ace +.asm_6aac + dec a + jr nz, .asm_6ab4 + ld a, $02 + jp .asm_6ace +.asm_6ab4 + xor a + jp .asm_6ace +.asm_6ab8 + cp $08 + jr nz, .asm_6ad6 + ld a, [wd009] + or a + jr nz, .asm_6ac6 + ld a, $02 + jr .asm_6ace +.asm_6ac6 + dec a + jr nz, .asm_6acc + xor a + jr .asm_6ace +.asm_6acc + ld a, $01 +.asm_6ace + ld [wd009], a + call DrawNamingScreenBG + or a + ret +.asm_6ad6 + ld a, [wd009] + cp $02 + jr z, .read_char + ldfw3 bc, "“" + ld a, d + cp b + jr nz, .asm_6af4 + ld a, e + cp c + jr nz, .asm_6af4 + push hl + ld hl, TransitionTable1 ; from 55th. + call TransformCharacter + pop hl + jr c, .nothing + jr .asm_6b09 +.asm_6af4 + ldfw3 bc, "º(2)" + ld a, d + cp b + jr nz, .asm_6b1d + ld a, e + cp c + jr nz, .asm_6b1d + push hl + ld hl, TransitionTable2 ; from 72th. + call TransformCharacter + pop hl + jr c, .nothing +.asm_6b09 + ld a, [wNamingScreenBufferLength] + dec a + dec a + ld [wNamingScreenBufferLength], a + ld hl, wNamingScreenBuffer + push de + ld d, 0 + ld e, a + add hl, de + pop de + ld a, [hl] + jr .asm_6b37 +.asm_6b1d + ld a, d + or a + jr nz, .asm_6b37 + ld a, [wd009] + or a + jr nz, .asm_6b2b + ld a, TX_HIRAGANA + jr .asm_6b37 +.asm_6b2b + ld a, TX_KATAKANA + jr .asm_6b37 +; read character code from info. to register. +; hl: pointer. +.read_char + ld e, [hl] + inc hl + ld a, [hl] ; a: first byte of the code. + or a + ; if 2 bytes code, jump. + jr nz, .asm_6b37 + ; if 1 byte code(ascii), + ; set first byte to $0e. + ld a, $0e +; on 2 bytes code. +.asm_6b37 + ld d, a ; de: character code. + ld hl, wNamingScreenBufferLength + ld a, [hl] + ld c, a + push hl + ld hl, wNamingScreenBufferMaxLength + cp [hl] + pop hl + jr nz, .asm_6b4c + ; if the buffer is full + ; just change the last character of it. + ld hl, wNamingScreenBuffer + dec hl + dec hl + jr .asm_6b51 +; increase name length before add the character. +.asm_6b4c + inc [hl] + inc [hl] + ld hl, wNamingScreenBuffer +; write 2 bytes character codes to the name buffer. +; de: 2 bytes character codes. +; hl: dest. +.asm_6b51 + ld b, 0 + add hl, bc + ld [hl], d + inc hl + ld [hl], e + inc hl + ld [hl], TX_END ; null terminator. + call PrintPlayerNameFromInput +.nothing + or a + ret +.on_end + scf + ret + +; this transforms the last japanese character +; in the name buffer into its dakuon shape or something. +; it seems to have been deprecated as the game was translated into english. +; but it can still be applied to english, such as upper-lower case transition. +; hl: info. pointer. +TransformCharacter: + ld a, [wNamingScreenBufferLength] + or a + jr z, .return ; if the length is zero, just return. + dec a + dec a + push hl + ld hl, wNamingScreenBuffer + ld d, 0 + ld e, a + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ; de: last character in the buffer, + ; but byte-wise swapped. + ld a, TX_KATAKANA + cp e + jr nz, .hiragana + ; if it's katakana, + ; make it hiragana by decreasing its high byte. + dec e +.hiragana + pop hl +.loop + ld a, [hli] + or a + jr z, .return + cp d + jr nz, .next + ld a, [hl] + cp e + jr nz, .next + inc hl + ld e, [hl] + inc hl + ld d, [hl] + or a + ret +.next + inc hl + inc hl + inc hl + jr .loop +.return + scf + ret + +; given the position of the current cursor, +; it returns the pointer to the proper information. +; h: position x. +; l: position y. +GetCharInfoFromPos_Player: + push de + ; (information index) = (x) * (height) + (y) + ; (height) = 0x05(Deck) or 0x06(Player) + ld e, l + ld d, h + ld a, [wNamingScreenKeyboardHeight] + ld l, a + call HtimesL + ld a, l + add e + ld hl, KeyboardData_Player + pop de + or a + ret z +.loop + inc hl + inc hl + inc hl + inc hl + inc hl + inc hl + dec a + jr nz, .loop + ret + +; a set of keyboard datum. +; unit: 6 bytes. +; structure: +; abs. y pos. (1) / abs. x pos. (1) / type 1 (1) / type 2 (1) / char. code (2) +; unused data contains its character code as zero. +kbitem: MACRO + db \1, \2, \3, \4 +if (_NARG == 5) + dw \5 +elif (\5 == TX_FULLWIDTH3) + dw (\5 << 8) | STRCAT("FW3_", \6) +else + dw (\5 << 8) | \6 +endc +ENDM + +KeyboardData_Player: + kbitem $04, $02, $11, $00, TX_FULLWIDTH3, "A" + kbitem $06, $02, $12, $00, TX_FULLWIDTH3, "J" + kbitem $08, $02, $13, $00, TX_FULLWIDTH3, "S" + kbitem $0a, $02, $14, $00, "o" + kbitem $0c, $02, $15, $00, "d" + kbitem $10, $0f, $01, $09, $0000 + + kbitem $04, $04, $16, $00, TX_FULLWIDTH3, "B" + kbitem $06, $04, $17, $00, TX_FULLWIDTH3, "K" + kbitem $08, $04, $18, $00, TX_FULLWIDTH3, "T" + kbitem $0a, $04, $19, $00, TX_FULLWIDTH3, "&" + kbitem $0c, $04, $1a, $00, "e" + kbitem $10, $0f, $01, $09, $0000 + + kbitem $04, $06, $1b, $00, TX_FULLWIDTH3, "C" + kbitem $06, $06, $1c, $00, TX_FULLWIDTH3, "L" + kbitem $08, $06, $1d, $00, TX_FULLWIDTH3, "U" + kbitem $0a, $06, $1e, $00, "j" + kbitem $0c, $06, $1f, $00, "f" + kbitem $10, $0f, $01, $09, $0000 + + kbitem $04, $08, $20, $00, TX_FULLWIDTH3, "D" + kbitem $06, $08, $21, $00, TX_FULLWIDTH3, "M" + kbitem $08, $08, $22, $00, TX_FULLWIDTH3, "V" + kbitem $0a, $08, $23, $00, "k" + kbitem $0c, $08, $24, $00, "g" + kbitem $10, $0f, $01, $09, $0000 + + kbitem $04, $0a, $25, $00, TX_FULLWIDTH3, "E" + kbitem $06, $0a, $26, $00, TX_FULLWIDTH3, "N" + kbitem $08, $0a, $27, $00, TX_FULLWIDTH3, "W" + kbitem $0a, $0a, $28, $00, "w" + kbitem $0c, $0a, $29, $00, "h" + kbitem $10, $0f, $01, $09, $0000 + + kbitem $04, $0c, $2a, $00, TX_FULLWIDTH3, "F" + kbitem $06, $0c, $2b, $00, TX_FULLWIDTH3, "O" + kbitem $08, $0c, $2c, $00, TX_FULLWIDTH3, "X" + kbitem $0a, $0c, $2d, $00, "`" + kbitem $0c, $0c, $2e, $00, "i" + kbitem $10, $0f, $01, $09, $0000 + + kbitem $04, $0e, $2f, $00, TX_FULLWIDTH3, "G" + kbitem $06, $0e, $30, $00, TX_FULLWIDTH3, "P" + kbitem $08, $0e, $31, $00, TX_FULLWIDTH3, "Y" + kbitem $0a, $0e, $32, $00, "a" + kbitem $0c, $0e, $33, $00, TX_SYMBOL, SYM_No + kbitem $10, $0f, $01, $09, $0000 + + kbitem $04, $10, $34, $00, TX_FULLWIDTH3, "H" + kbitem $06, $10, $35, $00, TX_FULLWIDTH3, "Q" + kbitem $08, $10, $36, $00, TX_FULLWIDTH3, "Z" + kbitem $0a, $10, $3c, $00, "b" + kbitem $0c, $10, $3d, $00, TX_SYMBOL, SYM_Lv + kbitem $10, $0f, $01, $09, $0000 + + kbitem $04, $12, $37, $00, TX_FULLWIDTH3, "I" + kbitem $06, $12, $38, $00, TX_FULLWIDTH3, "R" + kbitem $08, $12, $39, $00, "n" + kbitem $0a, $12, $3a, $00, "c" + kbitem $0c, $12, $3b, $00, "p" + kbitem $10, $0f, $01, $09, $0000 + kbitem $00, $00, $00, $00, $0000 + +; a set of transition datum. +; unit: 4 bytes. +; structure: +; previous char. code (2) / translated char. code (2) +; - the former char. code contains 0x0e in high byte. +; - the latter char. code contains only low byte. +TransitionTable1: + dw $0e16, $003e + dw $0e17, $003f + dw $0e18, $0040 + dw $0e19, $0041 + dw $0e1a, $0042 + dw $0e1b, $0043 + dw $0e1c, $0044 + dw $0e1d, $0045 + dw $0e1e, $0046 + dw $0e1f, $0047 + dw $0e20, $0048 + dw $0e21, $0049 + dw $0e22, $004a + dw $0e23, $004b + dw $0e24, $004c + dw $0e2a, $004d + dw $0e2b, $004e + dw $0e2c, $004f + dw $0e2d, $0050 + dw $0e2e, $0051 + dw $0e52, $004d + dw $0e53, $004e + dw $0e54, $004f + dw $0e55, $0050 + dw $0e56, $0051 + dw $0000 + +TransitionTable2: + dw $0e2a, $0052 + dw $0e2b, $0053 + dw $0e2c, $0054 + dw $0e2d, $0055 + dw $0e2e, $0056 + dw $0e4d, $0052 + dw $0e4e, $0053 + dw $0e4f, $0054 + dw $0e50, $0055 + dw $0e51, $0056 + dw $0000 + +; get deck name from the user into de. +; function description is similar to the player's. +; refer to 'InputPlayerName'. +InputDeckName: + push af + ; check if the buffer is empty. + ld a, [de] + or a + jr nz, .not_empty + ; this buffer will contain half-width chars. + ld a, TX_HALFWIDTH + ld [de], a +.not_empty + pop af + inc a + call InitializeInputName + call Set_OBJ_8x8 + + xor a + ld [wTileMapFill], a + call EmptyScreen + call ZeroObjectPositions + + ld a, $01 + ld [wVBlankOAMCopyToggle], a + call LoadSymbolsFont + + lb de, $38, $bf + call SetupText + call LoadHalfWidthTextCursorTile + + xor a + ld [wd009], a + call Func_1ae99 + + xor a + ld [wNamingScreenCursorX], a + ld [wNamingScreenCursorY], a + + ld a, $09 + ld [wNamingScreenNumColumns], a + ld a, $07 + ld [wNamingScreenKeyboardHeight], a + ld a, $0f + ld [wVisibleCursorTile], a + ld a, $00 + ld [wInvisibleCursorTile], a +.loop + ld a, $01 + ld [wVBlankOAMCopyToggle], a + call DoFrame + + call UpdateRNGSources + + ldh a, [hDPadHeld] + and START + jr z, .on_start + + ld a, $01 + call PlayAcceptOrDeclineSFX + call Func_1afa1 + + ld a, 6 + ld [wNamingScreenCursorX], a + ld [wNamingScreenCursorY], a + call Func_1afbd + + jr .loop +.on_start + call Func_1aefb + jr nc, .loop + + cp $ff + jr z, .asm_6e1c + + call Func_1aec3 + jr nc, .loop + + call FinalizeInputName + + ld hl, wNamingScreenDestPointer + ld a, [hli] + ld h, [hl] + ld l, a + inc hl + + ld a, [hl] + or a + jr nz, .return + + dec hl + ld [hl], TX_END +.return + ret +.asm_6e1c + ld a, [wNamingScreenBufferLength] + cp $02 + jr c, .loop + + ld e, a + ld d, 0 + ld hl, wNamingScreenBuffer + add hl, de + dec hl + ld [hl], TX_END + + ld hl, wNamingScreenBufferLength + dec [hl] + call ProcessTextWithUnderbar + + jp .loop + +; load, to the first tile of v0Tiles0, the graphics for the +; blinking black square used in name input screens. +; for inputting half width text. +LoadHalfWidthTextCursorTile: + ld hl, v0Tiles0 + $00 tiles + ld de, .data + ld b, 0 +.loop + ld a, TILE_SIZE + cp b + ret z + inc b + ld a, [de] + inc de + ld [hli], a + jr .loop + +.data +rept TILE_SIZE + db $f0 +endr + +; it's only for naming the deck. +ProcessTextWithUnderbar: + ld hl, wNamingScreenNamePosition + ld d, [hl] + inc hl + ld e, [hl] + call InitTextPrinting + ld hl, .underbar_data + ld de, wDefaultText +.loop ; copy the underbar string. + ld a, [hli] + ld [de], a + inc de + or a + jr nz, .loop + + ld hl, wNamingScreenBuffer + ld de, wDefaultText +.loop2 ; copy the input from the user. + ld a, [hli] + or a + jr z, .print_name + ld [de], a + inc de + jr .loop2 +.print_name + ld hl, wDefaultText + call ProcessText + ret +.underbar_data + db TX_HALFWIDTH +rept MAX_DECK_NAME_LENGTH + db "_" +endr + db TX_END + +Func_1ae99: + call DrawTextboxForKeyboard + call ProcessTextWithUnderbar + ld hl, wNamingScreenQuestionPointer + ld c, [hl] + inc hl + ld a, [hl] + ld h, a + or c + jr z, .print + ; print the question string. + ld l, c + call PlaceTextItems +.print + ; print "End" + ld hl, DrawNamingScreenBG.data + call PlaceTextItems + ; print the keyboard characters. + ldtx hl, DeckNameKeyboardText ; "A B C D..." + lb de, 2, 4 + call InitTextPrinting + call ProcessTextFromID + call EnableLCD + ret + +Func_1aec3: + ld a, [wNamingScreenCursorX] + ld h, a + ld a, [wNamingScreenCursorY] + ld l, a + call GetCharInfoFromPos_Deck + inc hl + inc hl + ld a, [hl] + cp $01 + jr nz, .asm_6ed7 + scf + ret +.asm_6ed7 + ld d, a + ld hl, wNamingScreenBufferLength + ld a, [hl] + ld c, a + push hl + ld hl, wNamingScreenBufferMaxLength + cp [hl] + pop hl + jr nz, .asm_6eeb + ld hl, wNamingScreenBuffer + dec hl + jr .asm_6eef +.asm_6eeb + inc [hl] + ld hl, wNamingScreenBuffer +.asm_6eef + ld b, 0 + add hl, bc + ld [hl], d + inc hl + ld [hl], TX_END + call ProcessTextWithUnderbar + or a + ret + +Func_1aefb: + xor a + ld [wPlaysSfx], a + ldh a, [hDPadHeld] + or a + jp z, .asm_6f73 + ld b, a + ld a, [wNamingScreenKeyboardHeight] + ld c, a + ld a, [wNamingScreenCursorX] + ld h, a + ld a, [wNamingScreenCursorY] + ld l, a + bit 6, b + jr z, .asm_6f1f + dec a + bit 7, a + jr z, .asm_6f4b + ld a, c + dec a + jr .asm_6f4b +.asm_6f1f + bit 7, b + jr z, .asm_6f2a + inc a + cp c + jr c, .asm_6f4b + xor a + jr .asm_6f4b +.asm_6f2a + cp $06 + jr z, .asm_6f73 + ld a, [wNamingScreenNumColumns] + ld c, a + ld a, h + bit 5, b + jr z, .asm_6f40 + dec a + bit 7, a + jr z, .asm_6f4e + ld a, c + dec a + jr .asm_6f4e +.asm_6f40 + bit 4, b + jr z, .asm_6f73 + inc a + cp c + jr c, .asm_6f4e + xor a + jr .asm_6f4e +.asm_6f4b + ld l, a + jr .asm_6f4f +.asm_6f4e + ld h, a +.asm_6f4f + push hl + call GetCharInfoFromPos_Deck + inc hl + inc hl + ld d, [hl] + push de + call Func_1afa1 + pop de + pop hl + ld a, l + ld [wNamingScreenCursorY], a + ld a, h + ld [wNamingScreenCursorX], a + xor a + ld [wCheckMenuCursorBlinkCounter], a + ld a, $02 + cp d + jp z, Func_1aefb + ld a, $01 + ld [wPlaysSfx], a +.asm_6f73 + ldh a, [hKeysPressed] + and $03 + jr z, .asm_6f89 + and $01 + jr nz, .asm_6f7f + ld a, $ff +.asm_6f7f + call PlayAcceptOrDeclineSFX + push af + call Func_1afbd + pop af + scf + ret +.asm_6f89 + ld a, [wPlaysSfx] + or a + jr z, .asm_6f92 + call PlaySFX +.asm_6f92 + ld hl, wCheckMenuCursorBlinkCounter + ld a, [hl] + inc [hl] + and $0f + ret nz + ld a, [wVisibleCursorTile] + bit 4, [hl] + jr z, Func_1afa1.asm_6fa4 + +Func_1afa1: + ld a, [wInvisibleCursorTile] +.asm_6fa4 + ld e, a + ld a, [wNamingScreenCursorX] + ld h, a + ld a, [wNamingScreenCursorY] + ld l, a + call GetCharInfoFromPos_Deck + ld a, [hli] + ld c, a + ld b, [hl] + dec b + ld a, e + call Func_1afc2 + call WriteByteToBGMap0 + or a + ret + +Func_1afbd: + ld a, [wVisibleCursorTile] + jr Func_1afa1.asm_6fa4 + +Func_1afc2: + push af + push bc + push de + push hl + push af + call ZeroObjectPositions + pop af + ld b, a + ld a, [wInvisibleCursorTile] + cp b + jr z, .asm_6ffb + ld a, [wNamingScreenBufferLength] + ld d, a + ld a, [wNamingScreenBufferMaxLength] + ld e, a + ld a, d + cp e + jr nz, .asm_6fdf + dec a +.asm_6fdf + dec a + ld d, a + ld hl, wNamingScreenNamePosition + ld a, [hl] + sla a + add d + ld d, a + ld h, $04 + ld l, d + call HtimesL + ld a, l + add $08 + ld d, a + ld e, $18 + ld bc, $0000 + call SetOneObjectAttributes +.asm_6ffb + pop hl + pop de + pop bc + pop af + ret + +; given the cursor position, +; returns the character information which the cursor directs. +; it's similar to "GetCharInfoFromPos_Player", +; but the data structure is different in its unit size. +; its unit size is 3, and player's is 6. +; h: x +; l: y +GetCharInfoFromPos_Deck: + push de + ld e, l + ld d, h + ld a, [wNamingScreenKeyboardHeight] + ld l, a + call HtimesL + ld a, l + add e + ; x * h + y + ld hl, KeyboardData_Deck + pop de + or a + ret z +.loop + inc hl + inc hl + inc hl + dec a + jr nz, .loop + ret + +KeyboardData_Deck: + db $04, $02, "A" + db $06, $02, "J" + db $08, $02, "S" + db $0a, $02, "?" + db $0c, $02, "4" + db $0e, $02, $02 + db $10, $0f, $01 + + db $04, $04, "B" + db $06, $04, "K" + db $08, $04, "T" + db $0a, $04, "&" + db $0c, $04, "5" + db $0e, $04, $02 + db $10, $0f, $01 + + db $04, $06, "C" + db $06, $06, "L" + db $08, $06, "U" + db $0a, $06, "+" + db $0c, $06, "6" + db $0e, $06, $02 + db $10, $0f, $01 + + db $04, $08, "D" + db $06, $08, "M" + db $08, $08, "V" + db $0a, $08, "-" + db $0c, $08, "7" + db $0e, $08, $02 + db $10, $0f, $01 + + db $04, $0a, "E" + db $06, $0a, "N" + db $08, $0a, "W" + db $0a, $0a, "'" + db $0c, $0a, "8" + db $0e, $0a, $02 + db $10, $0f, $01 + + db $04, $0c, "F" + db $06, $0c, "O" + db $08, $0c, "X" + db $0a, $0c, "0" + db $0c, $0c, "9" + db $0e, $0c, $02 + db $10, $0f, $01 + + db $04, $0e, "G" + db $06, $0e, "P" + db $08, $0e, "Y" + db $0a, $0e, "1" + db $0c, $0e, " " + db $0e, $0e, $02 + db $10, $0f, $01 + + db $04, $10, "H" + db $06, $10, "Q" + db $08, $10, "Z" + db $0a, $10, "2" + db $0c, $10, " " + db $0e, $10, $02 + db $10, $0f, $01 + + db $04, $12, "I" + db $06, $12, "R" + db $08, $12, "!" + db $0a, $12, "3" + db $0c, $12, " " + db $0e, $12, $02 + db $10, $0f, $01 + + ds 4 ; empty diff --git a/src/engine/intro.asm b/src/engine/intro.asm new file mode 100644 index 0000000..8a16b3a --- /dev/null +++ b/src/engine/intro.asm @@ -0,0 +1,114 @@ +PlayIntroSequence: + call DisableLCD + farcall Func_10a9b + farcall Func_10000 + call Func_3ca0 + ld hl, HandleAllSpriteAnimations + call SetDoFrameFunction + call LoadTitleScreenSprites + + ld a, LOW(IntroSequence) + ld [wSequenceCmdPtr + 0], a + ld a, HIGH(IntroSequence) + ld [wSequenceCmdPtr + 1], a + + xor a + ld [wd317], a + ld [wIntroSequencePalsNeedUpdate], a + ld [wSequenceDelay], a + farcall FlashWhiteScreen + +.loop_cmds + call DoFrameIfLCDEnabled + call UpdateRNGSources + ldh a, [hKeysPressed] + and A_BUTTON | START + jr nz, .jump_to_title_screen + ld a, [wIntroSequencePalsNeedUpdate] + or a + jr z, .no_pal_update + farcall Func_10d74 +.no_pal_update + call ExecuteIntroSequenceCmd + ld a, [wSequenceDelay] + cp $ff + jr nz, .loop_cmds + jr .asm_1d39f + +.jump_to_title_screen + call AssertSongFinished + or a + jr nz, .asm_1d39f + call DisableLCD + ld a, MUSIC_TITLESCREEN + call PlaySong + lb bc, 0, 0 + ld a, SCENE_TITLE_SCREEN + call LoadScene + call IntroSequenceEmptyFunc +.asm_1d39f + call Func_3ca0 + call .ShowPressStart + call EnableLCD + ret + +.ShowPressStart + ld a, SPRITE_PRESS_START + farcall CreateSpriteAndAnimBufferEntry + ld c, SPRITE_ANIM_COORD_X + call GetSpriteAnimBufferProperty + ld a, 48 + ld [hli], a ; x + ld a, 112 + ld [hl], a ; y + ld c, SPRITE_ANIM_190 + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .asm_1d3c5 + ld c, SPRITE_ANIM_191 +.asm_1d3c5 + ld a, c + ld bc, 60 + farcall Func_12ac9 + ret + +LoadTitleScreenSprites: + xor a + ld [wd4ca], a + ld [wd4cb], a + ld a, PALETTE_30 + farcall LoadPaletteData + + ld bc, 0 + ld de, wTitleScreenSprites +.loop_load_sprites + push bc + push de + ld hl, .TitleScreenSpriteList + add hl, bc + ld a, [hl] + farcall CreateSpriteAndAnimBufferEntry + ld a, [wWhichSprite] + ld [de], a + call GetFirstSpriteAnimBufferProperty + inc hl + ld a, [hl] ; SPRITE_ANIM_ATTRIBUTES + or c + ld [hl], a + pop de + pop bc + inc de + inc c + ld a, c + cp $7 + jr c, .loop_load_sprites + ret + +.TitleScreenSpriteList + db SPRITE_GRASS + db SPRITE_FIRE + db SPRITE_WATER + db SPRITE_COLORLESS + db SPRITE_LIGHTNING + db SPRITE_PSYCHIC + db SPRITE_FIGHTING diff --git a/src/engine/link/card_pop.asm b/src/engine/link/card_pop.asm new file mode 100644 index 0000000..5f809ef --- /dev/null +++ b/src/engine/link/card_pop.asm @@ -0,0 +1,399 @@ +_DoCardPop: +; loads scene for Card Pop! screen +; then checks if console is SGB +; and issues an error message in case it is + call SetSpriteAnimationsAsVBlankFunction + ld a,SCENE_CARD_POP + lb bc, 0, 0 + call LoadScene + ldtx hl, AreYouBothReadyToCardPopText + call PrintScrollableText_NoTextBoxLabel + call RestoreVBlankFunction + ldtx hl, CardPopCannotBePlayedWithTheGameBoyText + ld a, [wConsole] + cp CONSOLE_SGB + jr z, .error + +; initiate the communications + call PauseSong + call SetSpriteAnimationsAsVBlankFunction + ld a, SCENE_GAMEBOY_LINK_CONNECTING + lb bc, 0, 0 + call LoadScene + ldtx hl, PositionGameBoyColorsAndPressAButtonText + call DrawWideTextBox_PrintText + call EnableLCD + call HandleCardPopCommunications + push af + push hl + call ClearRP + call RestoreVBlankFunction + pop hl + pop af + jr c, .error + +; show the received card detail page +; and play the corresponding song + ld a, [wLoadedCard1ID] + call AddCardToCollectionAndUpdateAlbumProgress + ld hl, wLoadedCard1Name + ld a, [hli] + ld h, [hl] + ld l, a + call LoadTxRam2 + ld a, PLAYER_TURN + ldh [hWhoseTurn], a + ld a, SFX_5D + call PlaySFX +.wait_sfx + call AssertSFXFinished + or a + jr nz, .wait_sfx + ld a, [wCardPopCardObtainSong] + call PlaySong + ldtx hl, ReceivedThroughCardPopText + bank1call _DisplayCardDetailScreen + call ResumeSong + lb de, $38, $9f + call SetupText + bank1call OpenCardPage_FromHand + ret + +.error +; show Card Pop! error scene +; and print text in hl + push hl + call ResumeSong + call SetSpriteAnimationsAsVBlankFunction + ld a, SCENE_CARD_POP_ERROR + lb bc, 0, 0 + call LoadScene + pop hl + call PrintScrollableText_NoTextBoxLabel + call RestoreVBlankFunction + ret + +; handles all communications to the other device to do Card Pop! +; returns carry if Card Pop! is unsuccessful +; and returns in hl the corresponding error text ID +HandleCardPopCommunications: +; copy CardPopNameList from SRAM to WRAM + call EnableSRAM + ld hl, sCardPopNameList + ld de, wCardPopNameList + ld bc, CARDPOP_NAME_LIST_SIZE + call CopyDataHLtoDE + call DisableSRAM + + ld a, IRPARAM_CARD_POP + call InitIRCommunications +.asm_19cc9 + call TryReceiveIRRequest ; receive request + jr nc, .asm_19d05 + bit 1, a + jr nz, .fail + call TrySendIRRequest ; send request + jr c, .asm_19cc9 + +; do the player name search, then transmit the result + call ExchangeIRCommunicationParameters + jr c, .fail + ld hl, wCardPopNameList + ld de, wOtherPlayerCardPopNameList + ld c, 0 ; $100 bytes = CARDPOP_NAME_LIST_SIZE + call RequestDataTransmissionThroughIR + jr c, .fail + call LookUpNameInCardPopNameList + ld hl, wCardPopNameSearchResult + ld de, wCardPopNameSearchResult + ld c, 1 + call RequestDataReceivalThroughIR + jr c, .fail + call SetIRCommunicationErrorCode_NoError + jr c, .fail + call ExecuteReceivedIRCommands + jr c, .fail + jr .check_search_result + +.asm_19d05 + call ExecuteReceivedIRCommands + ld a, [wIRCommunicationErrorCode] + or a + jr nz, .fail + call RequestCloseIRCommunication + jr c, .fail + +.check_search_result + ld a, [wCardPopNameSearchResult] + or a + jr z, .success + ; not $00, means the name was found in the list + ldtx hl, CannotCardPopWithFriendPreviouslyPoppedWithText + scf + ret + +.success + call DecideCardToReceiveFromCardPop + +; increment number of times Card Pop! was done +; and write the other player's name to sCardPopNameList +; the spot where this is written in the list is derived +; from the lower nybble of sTotalCardPopsDone +; that means that after 16 Card Pop!, the older +; names start to get overwritten + call EnableSRAM + ld hl, sTotalCardPopsDone + ld a, [hl] + inc [hl] + and $0f + swap a ; *NAME_BUFFER_LENGTH + ld l, a + ld h, $0 + ld de, sCardPopNameList + add hl, de + ld de, wNameBuffer + ld c, NAME_BUFFER_LENGTH +.loop_write_name + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .loop_write_name + call DisableSRAM + or a + ret + +.fail + ldtx hl, ThePopWasntSuccessfulText + scf + ret + +; looks up the name in wNameBuffer in wCardPopNameList +; used to know whether this save file has done Card Pop! +; with the other player already +; returns carry and wCardPopNameSearchResult = $ff if the name was found; +; returns no carry and wCardPopNameSearchResult = $00 otherwise +LookUpNameInCardPopNameList: +; searches for other player's name in this game's name list + ld hl, wCardPopNameList + ld c, CARDPOP_NAME_LIST_MAX_ELEMS +.loop_own_card_pop_name_list + push hl + ld de, wNameBuffer + call .CompareNames + pop hl + jr nc, .found_name + ld de, NAME_BUFFER_LENGTH + add hl, de + dec c + jr nz, .loop_own_card_pop_name_list + +; name was not found in wCardPopNameList + +; searches for this player's name in the other game's name list +; this is useless since it discards the result from the name comparisons +; as a result this loop will always return no carry + call EnableSRAM + ld hl, wOtherPlayerCardPopNameList + ld c, CARDPOP_NAME_LIST_MAX_ELEMS +.loop_other_card_pop_name_list + push hl + ld de, sPlayerName + call .CompareNames ; discards result from comparison + pop hl + ld de, NAME_BUFFER_LENGTH + add hl, de + dec c + jr nz, .loop_other_card_pop_name_list + xor a + jr .no_carry + +.found_name + ld a, $ff + scf +.no_carry + call DisableSRAM + ld [wCardPopNameSearchResult], a ; $00 if name was not found, $ff otherwise + ret + +; compares names in hl and de +; if they are different, return carry +.CompareNames + ld b, NAME_BUFFER_LENGTH +.loop_chars + ld a, [de] + inc de + cp [hl] + jr nz, .not_same + inc hl + dec b + jr nz, .loop_chars + or a + ret +.not_same + scf + ret + +; loads in wLoadedCard1 a random card to be received +; this selection is done based on the rarity that is +; decided from the names of both participants +; the card will always be a Pokemon card that is not +; from a Promotional set, with the exception +; of Venusaur1 and Mew2 +; output: +; - e = card ID chosen +DecideCardToReceiveFromCardPop: + ld a, PLAYER_TURN + ldh [hWhoseTurn], a + call EnableSRAM + ld hl, sPlayerName + call CalculateNameHash + call DisableSRAM + push de + ld hl, wNameBuffer + call CalculateNameHash + pop bc + +; de = other player's name hash +; bc = this player's name hash + +; updates RNG values to subtraction of these two hashes + ld hl, wRNG1 + ld a, b + sub d + ld d, a ; b - d + ld [hli], a ; wRNG1 + ld a, c + sub e + ld e, a ; c - e + ld [hli], a ; wRNG2 + ld [hl], $0 ; wRNGCounter + +; depending on the values obtained from the hashes, +; determine which rarity card to give to the player +; along with the song to play with each rarity +; the probabilities of each possibility can be calculated +; as follows (given 2 random player names): +; 101/256 ~ 39% for Circle +; 90/256 ~ 35% for Diamond +; 63/256 ~ 25% for Star +; 1/256 ~ .4% for Venusaur1 or Mew2 + ld a, e + cp 5 + jr z, .venusaur1_or_mew2 + cp 64 + jr c, .star_rarity ; < 64 + cp 154 + jr c, .diamond_rarity ; < 154 + ; >= 154 + + ld a, MUSIC_BOOSTER_PACK + ld b, CIRCLE + jr .got_rarity +.diamond_rarity + ld a, MUSIC_BOOSTER_PACK + ld b, DIAMOND + jr .got_rarity +.star_rarity + ld a, MUSIC_MATCH_VICTORY + ld b, STAR +.got_rarity + ld [wCardPopCardObtainSong], a + ld a, b + call CreateCardPopCandidateList + ; shuffle candidates and pick first from list + call ShuffleCards + ld a, [hl] + ld e, a +.got_card_id + ld d, $0 + call LoadCardDataToBuffer1_FromCardID + ld a, e + ret + +.venusaur1_or_mew2 +; choose either Venusaur1 or Mew2 +; depending on whether the lower +; bit of d is unset or set, respectively + ld a, MUSIC_MEDAL + ld [wCardPopCardObtainSong], a + ld e, VENUSAUR1 + ld a, d + and $1 ; get lower bit + jr z, .got_card_id + ld e, MEW2 + jr .got_card_id + +; lists in wCardPopCardCandidates all cards that: +; - are Pokemon cards; +; - have the same rarity as input register a; +; - are not from Promotional set. +; input: +; - a = card rarity +; output: +; - a = number of candidates +CreateCardPopCandidateList: + ld hl, wPlayerDeck + push hl + push de + push bc + ld b, a + + lb de, 0, GRASS_ENERGY +.loop_card_ids + call LoadCardDataToBuffer1_FromCardID + jr c, .count ; no more card IDs + ld a, [wLoadedCard1Type] + and TYPE_ENERGY + jr nz, .next_card_id ; not Pokemon card + ld a, [wLoadedCard1Rarity] + cp b + jr nz, .next_card_id ; not equal rarity + ld a, [wLoadedCard1Set] + and $f0 + cp PROMOTIONAL + jr z, .next_card_id ; no promos + ld [hl], e + inc hl +.next_card_id + inc de + jr .loop_card_ids + +; count all the cards that were listed +; and return it in a +.count + ld [hl], $00 ; invalid card ID as end of list + ld hl, wPlayerDeck + ld c, -1 +.loop_count + inc c + ld a, [hli] + or a + jr nz, .loop_count + ld a, c + pop bc + pop de + pop hl + ret + +; creates a unique two-byte hash from the name given in hl +; the low byte is calculated by simply adding up all characters +; the high byte is calculated by xoring all characters together +; input: +; - hl = points to the start of the name buffer +; output: +; - de = hash +CalculateNameHash: + ld c, NAME_BUFFER_LENGTH + ld de, $0 +.loop + ld a, e + add [hl] + ld e, a + ld a, d + xor [hl] + ld d, a + inc hl + dec c + jr nz, .loop + ret diff --git a/src/engine/link/ir_core.asm b/src/engine/link/ir_core.asm new file mode 100644 index 0000000..ab9eaae --- /dev/null +++ b/src/engine/link/ir_core.asm @@ -0,0 +1,531 @@ +; if carry flag is set, only delays +; if carry not set: +; - set rRP to $c1, wait; +; - set rRP to $c0, wait; +; - return +Func_19674: + jr c, .delay_once + ld [hl], $c1 + ld a, 5 + jr .loop_delay_1 ; jump to possibly to add more cycles? +.loop_delay_1 + dec a + jr nz, .loop_delay_1 + ld [hl], $c0 + ld a, 14 + jr .loop_delay_2 ; jump to possibly to add more cycles? +.loop_delay_2 + dec a + jr nz, .loop_delay_2 + ret + +.delay_once + ld a, 21 + jr .loop_delay_3 ; jump to possibly to add more cycles? +.loop_delay_3 + dec a + jr nz, .loop_delay_3 + nop + ret + +; input a = byte to transmit through IR +TransmitByteThroughIR: + push hl + ld hl, rRP + push de + push bc + ld b, a + scf ; carry set + call Func_19674 + or a ; carry not set + call Func_19674 + ld c, 8 + ld c, 8 ; number of input bits +.loop + ld a, $00 + rr b + call Func_19674 + dec c + jr nz, .loop + pop bc + pop de + pop hl + ldh a, [rJOYP] + bit 1, a ; P11 + jr z, ReturnZFlagUnsetAndCarryFlagSet + xor a ; return z set + ret + +; same as ReceiveByteThroughIR but +; returns $0 in a if there's an error in IR +ReceiveByteThroughIR_ZeroIfUnsuccessful: + call ReceiveByteThroughIR + ret nc + xor a + ret + +; returns carry if there's some time out +; and output in register a of $ff +; otherwise returns in a some sequence of bits +; related to how rRP sets/unsets bit 1 +ReceiveByteThroughIR: + push de + push bc + push hl + +; waits for bit 1 in rRP to be unset +; up to $100 loops + ld b, 0 + ld hl, rRP +.wait_ir + bit 1, [hl] + jr z, .ok + dec b + jr nz, .wait_ir + ; looped around $100 times + ; return $ff and carry set + pop hl + pop bc + pop de + scf + ld a, $ff + ret + +.ok +; delay for some cycles + ld a, 15 +.loop_delay + dec a + jr nz, .loop_delay + +; loop for each bit + ld e, 8 +.loop + ld a, $01 + ; possibly delay cycles? + ld b, 9 + ld b, 9 + ld b, 9 + ld b, 9 + +; checks for bit 1 in rRP +; if in any of the checks it is unset, +; then a is set to 0 +; this is done a total of 9 times + bit 1, [hl] + jr nz, .asm_196ec + xor a +.asm_196ec + bit 1, [hl] + jr nz, .asm_196f1 + xor a +.asm_196f1 + dec b + jr nz, .asm_196ec + ; one bit received + rrca + rr d + dec e + jr nz, .loop + ld a, d ; has bits set for each "cycle" that bit 1 was not unset + pop hl + pop bc + pop de + or a + ret + +ReturnZFlagUnsetAndCarryFlagSet: + ld a, $ff + or a ; z not set + scf ; carry set + ret + +; called when expecting to transmit data +Func_19705: + ld hl, rRP +.asm_19708 + ldh a, [rJOYP] + bit 1, a + jr z, ReturnZFlagUnsetAndCarryFlagSet + ld a, $aa ; request + call TransmitByteThroughIR + push hl + pop hl + call ReceiveByteThroughIR_ZeroIfUnsuccessful + cp $33 ; acknowledge + jr nz, .asm_19708 + xor a + ret + +; called when expecting to receive data +Func_1971e: + ld hl, rRP +.asm_19721 + ldh a, [rJOYP] + bit 1, a + jr z, ReturnZFlagUnsetAndCarryFlagSet + call ReceiveByteThroughIR_ZeroIfUnsuccessful + cp $aa ; request + jr nz, .asm_19721 + ld a, $33 ; acknowledge + call TransmitByteThroughIR + xor a + ret + +ReturnZFlagUnsetAndCarryFlagSet2: + jp ReturnZFlagUnsetAndCarryFlagSet + +TransmitIRDataBuffer: + call Func_19705 + jr c, ReturnZFlagUnsetAndCarryFlagSet2 + ld a, $49 + call TransmitByteThroughIR + ld a, $52 + call TransmitByteThroughIR + ld hl, wIRDataBuffer + ld c, 8 + jr TransmitNBytesFromHLThroughIR + +ReceiveIRDataBuffer: + call Func_1971e + jr c, ReturnZFlagUnsetAndCarryFlagSet2 + call ReceiveByteThroughIR + cp $49 + jr nz, ReceiveIRDataBuffer + call ReceiveByteThroughIR + cp $52 + jr nz, ReceiveIRDataBuffer + ld hl, wIRDataBuffer + ld c, 8 + jr ReceiveNBytesToHLThroughIR + +; hl = start of data to transmit +; c = number of bytes to transmit +TransmitNBytesFromHLThroughIR: + ld b, $0 +.loop_data_bytes + ld a, b + add [hl] + ld b, a + ld a, [hli] + call TransmitByteThroughIR + jr c, .asm_1977c + dec c + jr nz, .loop_data_bytes + ld a, b + cpl + inc a + call TransmitByteThroughIR +.asm_1977c + ret + +; hl = address to write received data +; c = number of bytes to be received +ReceiveNBytesToHLThroughIR: + ld b, 0 +.loop_data_bytes + call ReceiveByteThroughIR + jr c, ReturnZFlagUnsetAndCarryFlagSet2 + ld [hli], a + add b + ld b, a + dec c + jr nz, .loop_data_bytes + call ReceiveByteThroughIR + add b + or a + jr nz, ReturnZFlagUnsetAndCarryFlagSet2 + ret + +; disables interrupts, and sets joypad and IR communication port +; switches to CGB normal speed +StartIRCommunications: + di + call SwitchToCGBNormalSpeed + ld a, P14 + ldh [rJOYP], a + ld a, $c0 + ldh [rRP], a + ret + +; reenables interrupts, and switches CGB back to double speed +CloseIRCommunications: + ld a, P14 | P15 + ldh [rJOYP], a +.wait_vblank_on + ldh a, [rSTAT] + and STAT_LCDC_STATUS + cp STAT_ON_VBLANK + jr z, .wait_vblank_on +.wait_vblank_off + ldh a, [rSTAT] + and STAT_LCDC_STATUS + cp STAT_ON_VBLANK + jr nz, .wait_vblank_off + call SwitchToCGBDoubleSpeed + ei + ret + +; set rRP to 0 +ClearRP: + ld a, $00 + ldh [rRP], a + ret + +; expects to receive a command (IRCMD_* constant) +; in wIRDataBuffer + 1, then calls the subroutine +; corresponding to that command +ExecuteReceivedIRCommands: + call StartIRCommunications +.loop_commands + call ReceiveIRDataBuffer + jr c, .error + jr nz, .loop_commands + ld hl, wIRDataBuffer + 1 + ld a, [hl] + ld hl, .CmdPointerTable + cp NUM_IR_COMMANDS + jr nc, .loop_commands ; invalid command + call .JumpToCmdPointer ; execute command + jr .loop_commands +.error + call CloseIRCommunications + xor a + scf + ret + +.JumpToCmdPointer + add a ; *2 + add l + ld l, a + ld a, 0 + adc h + ld h, a + ld a, [hli] + ld h, [hl] + ld l, a +.jp_hl + jp hl + +.CmdPointerTable + dw .Close ; IRCMD_CLOSE + dw .ReturnWithoutClosing ; IRCMD_RETURN_WO_CLOSING + dw .TransmitData ; IRCMD_TRANSMIT_DATA + dw .ReceiveData ; IRCMD_RECEIVE_DATA + dw .CallFunction ; IRCMD_CALL_FUNCTION + +; closes the IR communications +; pops hl so that the sp points +; to the return address of ExecuteReceivedIRCommands +.Close + pop hl + call CloseIRCommunications + or a + ret + +; returns without closing the IR communications +; will continue the command loop +.ReturnWithoutClosing + or a + ret + +; receives an address and number of bytes +; and transmits starting at that address +.TransmitData + call Func_19705 + ret c + call LoadRegistersFromIRDataBuffer + jp TransmitNBytesFromHLThroughIR + +; receives an address and number of bytes +; and writes the data received to that address +.ReceiveData + call LoadRegistersFromIRDataBuffer + ld l, e + ld h, d + call ReceiveNBytesToHLThroughIR + jr c, .asm_19812 + sub b + call TransmitByteThroughIR +.asm_19812 + ret + +; receives an address to call, then stores +; the registers in the IR data buffer +.CallFunction + call LoadRegistersFromIRDataBuffer + call .jp_hl + call StoreRegistersInIRDataBuffer + ret + +; returns carry set if request sent was not acknowledged +TrySendIRRequest: + call StartIRCommunications + ld hl, rRP + ld c, 4 +.send_request + ld a, $aa ; request + push bc + call TransmitByteThroughIR + push bc + pop bc + call ReceiveByteThroughIR_ZeroIfUnsuccessful + pop bc + cp $33 ; acknowledgement + jr z, .received_ack + dec c + jr nz, .send_request + scf + jr .close + +.received_ack + xor a +.close + push af + call CloseIRCommunications + pop af + ret + +; returns carry set if request was not received +TryReceiveIRRequest: + call StartIRCommunications + ld hl, rRP +.wait_request + call ReceiveByteThroughIR_ZeroIfUnsuccessful + cp $aa ; request + jr z, .send_ack + ldh a, [rJOYP] + cpl + and P10 | P11 + jr z, .wait_request + scf + jr .close + +.send_ack + ld a, $33 ; acknowledgement + call TransmitByteThroughIR + xor a +.close + push af + call CloseIRCommunications + pop af + ret + +; sends request for other device to close current communication +RequestCloseIRCommunication: + call StartIRCommunications + ld a, IRCMD_CLOSE + ld [wIRDataBuffer + 1], a + call TransmitIRDataBuffer +; fallthrough + +; calls CloseIRCommunications while preserving af +SafelyCloseIRCommunications: + push af + call CloseIRCommunications + pop af + ret + +; sends a request for data to be transmitted +; from the other device +; hl = start of data to request to transmit +; de = address to write data received +; c = length of data +RequestDataTransmissionThroughIR: + ld a, IRCMD_TRANSMIT_DATA + call TransmitRegistersThroughIR + push de + push bc + call Func_1971e + pop bc + pop hl + jr c, SafelyCloseIRCommunications + call ReceiveNBytesToHLThroughIR + jr SafelyCloseIRCommunications + +; transmits data to be written in the other device +; hl = start of data to transmit +; de = address for other device to write data +; c = length of data +RequestDataReceivalThroughIR: + ld a, IRCMD_RECEIVE_DATA + call TransmitRegistersThroughIR + call TransmitNBytesFromHLThroughIR + jr c, SafelyCloseIRCommunications + call ReceiveByteThroughIR + jr c, SafelyCloseIRCommunications + add b + jr nz, .asm_1989e + xor a + jr SafelyCloseIRCommunications +.asm_1989e + call ReturnZFlagUnsetAndCarryFlagSet + jr SafelyCloseIRCommunications + +; first stores all the current registers in wIRDataBuffer +; then transmits it through IR +TransmitRegistersThroughIR: + push hl + push de + push bc + call StoreRegistersInIRDataBuffer + call StartIRCommunications + call TransmitIRDataBuffer + pop bc + pop de + pop hl + ret nc + inc sp + inc sp + jr SafelyCloseIRCommunications + +; stores af, hl, de and bc in wIRDataBuffer +StoreRegistersInIRDataBuffer: + push de + push hl + push af + ld hl, wIRDataBuffer + pop de + ld [hl], e ; <- f + inc hl + ld [hl], d ; <- a + inc hl + pop de + ld [hl], e ; <- l + inc hl + ld [hl], d ; <- h + inc hl + pop de + ld [hl], e ; <- e + inc hl + ld [hl], d ; <- d + inc hl + ld [hl], c ; <- c + inc hl + ld [hl], b ; <- b + ret + +; loads all the registers that were stored +; from StoreRegistersInIRDataBuffer +LoadRegistersFromIRDataBuffer: + ld hl, wIRDataBuffer + ld e, [hl] + inc hl + ld d, [hl] + inc hl + push de + ld e, [hl] + inc hl + ld d, [hl] + inc hl + push de + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld c, [hl] + inc hl + ld b, [hl] + pop hl + pop af + ret diff --git a/src/engine/link/ir_functions.asm b/src/engine/link/ir_functions.asm new file mode 100644 index 0000000..140dccb --- /dev/null +++ b/src/engine/link/ir_functions.asm @@ -0,0 +1,323 @@ +; hl = text ID +LoadLinkConnectingScene: + push hl + call SetSpriteAnimationsAsVBlankFunction + ld a, SCENE_GAMEBOY_LINK_CONNECTING + lb bc, 0, 0 + call LoadScene + pop hl + call DrawWideTextBox_PrintText + call EnableLCD + ret + +; shows Link Not Connected scene +; then asks the player whether they want to try again +; if the player selects "no", return carry +; input: +; - hl = text ID +LoadLinkNotConnectedSceneAndAskWhetherToTryAgain: + push hl + call RestoreVBlankFunction + call SetSpriteAnimationsAsVBlankFunction + ld a, SCENE_GAMEBOY_LINK_NOT_CONNECTED + lb bc, 0, 0 + call LoadScene + pop hl + call DrawWideTextBox_WaitForInput + ldtx hl, WouldYouLikeToTryAgainText + call YesOrNoMenuWithText_SetCursorToYes +; fallthrough + +ClearRPAndRestoreVBlankFunction: + push af + call ClearRP + call RestoreVBlankFunction + pop af + ret + +; prepares IR communication parameter data +; a = a IRPARAM_* constant for the function of this connection +InitIRCommunications: + ld hl, wOwnIRCommunicationParams + ld [hl], a + inc hl + ld [hl], $50 + inc hl + ld [hl], $4b + inc hl + ld [hl], $31 + ld a, $ff + ld [wIRCommunicationErrorCode], a + ld a, PLAYER_TURN + ldh [hWhoseTurn], a +; clear wNameBuffer and wOpponentName + xor a + ld [wNameBuffer], a + ld hl, wOpponentName + ld [hli], a + ld [hl], a +; loads player's name from SRAM +; to wDefaultText + call EnableSRAM + ld hl, sPlayerName + ld de, wDefaultText + ld c, NAME_BUFFER_LENGTH +.loop + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop + call DisableSRAM + ret + +; returns carry if communication was unsuccessful +; if a = 0, then it was a communication error +; if a = 1, then operation was cancelled by the player +PrepareSendCardOrDeckConfigurationThroughIR: + call InitIRCommunications + +; pressing A button triggers request for IR communication +.loop_frame + call DoFrame + ldh a, [hKeysPressed] + bit B_BUTTON_F, a + jr nz, .b_btn + ldh a, [hKeysHeld] + bit A_BUTTON_F, a + jr z, .loop_frame +; a btn + call TrySendIRRequest + jr nc, .request_success + or a + jr z, .loop_frame + xor a + scf + ret + +.b_btn + ; cancelled by the player + ld a, $01 + scf + ret + +.request_success + call ExchangeIRCommunicationParameters + ret c + ld a, [wOtherIRCommunicationParams + 3] + cp $31 + jr nz, SetIRCommunicationErrorCode_Error + or a + ret + +; exchanges player names and IR communication parameters +; checks whether parameters for communication match +; and if they don't, an error is issued +ExchangeIRCommunicationParameters: + ld hl, wOwnIRCommunicationParams + ld de, wOtherIRCommunicationParams + ld c, 4 + call RequestDataTransmissionThroughIR + jr c, .error + ld hl, wOtherIRCommunicationParams + 1 + ld a, [hli] + cp $50 + jr nz, .error + ld a, [hli] + cp $4b + jr nz, .error + ld a, [wOwnIRCommunicationParams] + ld hl, wOtherIRCommunicationParams + cp [hl] ; do parameters match? + jr nz, SetIRCommunicationErrorCode_Error + +; receives wDefaultText from other device +; and writes it to wNameBuffer + ld hl, wDefaultText + ld de, wNameBuffer + ld c, NAME_BUFFER_LENGTH + call RequestDataTransmissionThroughIR + jr c, .error +; transmits wDefaultText to be +; written in wNameBuffer in the other device + ld hl, wDefaultText + ld de, wNameBuffer + ld c, NAME_BUFFER_LENGTH + call RequestDataReceivalThroughIR + jr c, .error + or a + ret + +.error + xor a + scf + ret + +SetIRCommunicationErrorCode_Error: + ld hl, wIRCommunicationErrorCode + ld [hl], $01 + ld de, wIRCommunicationErrorCode + ld c, 1 + call RequestDataReceivalThroughIR + call RequestCloseIRCommunication + ld a, $01 + scf + ret + +SetIRCommunicationErrorCode_NoError: + ld hl, wOwnIRCommunicationParams + ld [hl], $00 + ld de, wIRCommunicationErrorCode + ld c, 1 + call RequestDataReceivalThroughIR + ret c + call RequestCloseIRCommunication + or a + ret + +; makes device receptive to receive data from other device +; to write in wDuelTempList (either list of cards or a deck configuration) +; returns carry if some error occurred +TryReceiveCardOrDeckConfigurationThroughIR: + call InitIRCommunications +.loop_receive_request + xor a + ld [wDuelTempList], a + call TryReceiveIRRequest + jr nc, .receive_data + bit 1, a + jr nz, .cancelled + jr .loop_receive_request +.receive_data + call ExecuteReceivedIRCommands + ld a, [wIRCommunicationErrorCode] + or a + ret z ; no error + xor a + scf + ret + +.cancelled + ld a, $01 + scf + ret + +; returns carry if card(s) wasn't successfully sent +_SendCard: + call StopMusic + ldtx hl, SendingACardText + call LoadLinkConnectingScene + ld a, IRPARAM_SEND_CARDS + call PrepareSendCardOrDeckConfigurationThroughIR + jr c, .fail + + ; send cards + xor a + ld [wDuelTempList + DECK_SIZE], a + ld hl, wDuelTempList + ld e, l + ld d, h + ld c, DECK_SIZE + 1 + call RequestDataReceivalThroughIR + jr c, .fail + call SetIRCommunicationErrorCode_NoError + jr c, .fail + call ExecuteReceivedIRCommands + jr c, .fail + ld a, [wOwnIRCommunicationParams + 1] + cp $4f + jr nz, .fail + call PlayCardPopSong + xor a + call ClearRPAndRestoreVBlankFunction + ret + +.fail + call PlayCardPopSong + ldtx hl, CardTransferWasntSuccessful1Text + call LoadLinkNotConnectedSceneAndAskWhetherToTryAgain + jr nc, _SendCard ; loop back and try again + ; failed + scf + ret + +PlayCardPopSong: + ld a, MUSIC_CARD_POP + jp PlaySong + +_ReceiveCard: + call StopMusic + ldtx hl, ReceivingACardText + call LoadLinkConnectingScene + ld a, IRPARAM_SEND_CARDS + call TryReceiveCardOrDeckConfigurationThroughIR + ld a, $4f + ld [wOwnIRCommunicationParams + 1], a + ld hl, wOwnIRCommunicationParams + ld e, l + ld d, h + ld c, 4 + call RequestDataReceivalThroughIR + jr c, .fail + call RequestCloseIRCommunication + jr c, .fail + call PlayCardPopSong + or a + call ClearRPAndRestoreVBlankFunction + ret + +.fail + call PlayCardPopSong + ldtx hl, CardTransferWasntSuccessful2Text + call LoadLinkNotConnectedSceneAndAskWhetherToTryAgain + jr nc, _ReceiveCard + scf + ret + +_SendDeckConfiguration: + call StopMusic + ldtx hl, SendingADeckConfigurationText + call LoadLinkConnectingScene + ld a, IRPARAM_SEND_DECK + call PrepareSendCardOrDeckConfigurationThroughIR + jr c, .fail + ld hl, wDuelTempList + ld e, l + ld d, h + ld c, DECK_STRUCT_SIZE + call RequestDataReceivalThroughIR + jr c, .fail + call SetIRCommunicationErrorCode_NoError + jr c, .fail + call PlayCardPopSong + call ClearRPAndRestoreVBlankFunction + or a + ret + +.fail + call PlayCardPopSong + ldtx hl, DeckConfigurationTransferWasntSuccessful1Text + call LoadLinkNotConnectedSceneAndAskWhetherToTryAgain + jr nc, _SendDeckConfiguration + scf + ret + +_ReceiveDeckConfiguration: + call StopMusic + ldtx hl, ReceivingDeckConfigurationText + call LoadLinkConnectingScene + ld a, IRPARAM_SEND_DECK + call TryReceiveCardOrDeckConfigurationThroughIR + jr c, .fail + call PlayCardPopSong + call ClearRPAndRestoreVBlankFunction + or a + ret + +.fail + call PlayCardPopSong + ldtx hl, DeckConfigurationTransferWasntSuccessful2Text + call LoadLinkNotConnectedSceneAndAskWhetherToTryAgain + jr nc, _ReceiveDeckConfiguration ; loop back and try again + scf + ret diff --git a/src/engine/link/link_duel.asm b/src/engine/link/link_duel.asm new file mode 100644 index 0000000..fc484d0 --- /dev/null +++ b/src/engine/link/link_duel.asm @@ -0,0 +1,179 @@ +; sets up to start a link duel +; decides which device will pick the number of prizes +; then exchanges names and duels between the players +; and starts the main duel routine +_SetUpAndStartLinkDuel: + ld hl, sp+$00 + ld a, l + ld [wDuelReturnAddress + 0], a + ld a, h + ld [wDuelReturnAddress + 1], a + call SetSpriteAnimationsAsVBlankFunction + + ld a, SCENE_GAMEBOY_LINK_TRANSMITTING + lb bc, 0, 0 + call LoadScene + + bank1call LoadPlayerDeck + call SwitchToCGBNormalSpeed + bank1call DecideLinkDuelVariables + push af + call RestoreVBlankFunction + pop af + jp c, .error + + ld a, DUELIST_TYPE_PLAYER + ld [wPlayerDuelistType], a + ld a, DUELIST_TYPE_LINK_OPP + ld [wOpponentDuelistType], a + ld a, DUELTYPE_LINK + ld [wDuelType], a + + call EmptyScreen + ld a, [wSerialOp] + cp $29 + jr nz, .asm_1a540 + + ld a, PLAYER_TURN + ldh [hWhoseTurn], a + call .ExchangeNamesAndDecks + jr c, .error + lb de, 6, 2 + lb bc, 8, 6 + call DrawRegularTextBox + lb de, 7, 4 + call InitTextPrinting + ldtx hl, PrizesCardsText + call ProcessTextFromID + ldtx hl, ChooseTheNumberOfPrizesText + call DrawWideTextBox_PrintText + call EnableLCD + call .PickNumberOfPrizeCards + ld a, [wNPCDuelPrizes] + call SerialSend8Bytes + jr .prizes_decided + +.asm_1a540 + ld a, OPPONENT_TURN + ldh [hWhoseTurn], a + call .ExchangeNamesAndDecks + jr c, .error + ldtx hl, PleaseWaitDecidingNumberOfPrizesText + call DrawWideTextBox_PrintText + call EnableLCD + call SerialRecv8Bytes + ld [wNPCDuelPrizes], a + +.prizes_decided + call ExchangeRNG + ld a, LINK_OPP_PIC + ld [wOpponentPortrait], a + ldh a, [hWhoseTurn] + push af + call EmptyScreen + bank1call SetDefaultPalettes + ld a, SHUFFLE_DECK + ld [wDuelDisplayedScreen], a + bank1call DrawDuelistPortraitsAndNames + ld a, OPPONENT_TURN + ldh [hWhoseTurn], a + ld a, [wNPCDuelPrizes] + ld l, a + ld h, $00 + call LoadTxRam3 + ldtx hl, BeginAPrizeDuelWithText + call DrawWideTextBox_WaitForInput + pop af + ldh [hWhoseTurn], a + call ExchangeRNG + bank1call StartDuel_VSLinkOpp + call SwitchToCGBDoubleSpeed + ret + +.error + ld a, -1 + ld [wDuelResult], a + call SetSpriteAnimationsAsVBlankFunction + + ld a, SCENE_GAMEBOY_LINK_NOT_CONNECTED + lb bc, 0, 0 + call LoadScene + + ldtx hl, TransmissionErrorText + call DrawWideTextBox_WaitForInput + call RestoreVBlankFunction + call ResetSerial + ret + +.ExchangeNamesAndDecks + ld de, wDefaultText + push de + call CopyPlayerName + pop hl + ld de, wNameBuffer + ld c, NAME_BUFFER_LENGTH + call SerialExchangeBytes + ret c + xor a + ld hl, wOpponentName + ld [hli], a + ld [hl], a + ld hl, wPlayerDeck + ld de, wOpponentDeck + ld c, DECK_SIZE + call SerialExchangeBytes + ret + +; handles player choice of number of prize cards +; pressing left/right makes it decrease/increase respectively +; selection is confirmed by pressing A button +.PickNumberOfPrizeCards + ld a, PRIZES_4 + ld [wNPCDuelPrizes], a + xor a + ld [wPrizeCardSelectionFrameCounter], a +.loop_input + call DoFrame + ld a, [wNPCDuelPrizes] + add SYM_0 + ld e, a + ; check frame counter so that it + ; either blinks or shows number + ld hl, wPrizeCardSelectionFrameCounter + ld a, [hl] + inc [hl] + and $10 + jr z, .no_blink + ld e, SYM_SPACE +.no_blink + ld a, e + lb bc, 9, 6 + call WriteByteToBGMap0 + + ldh a, [hDPadHeld] + ld b, a + ld a, [wNPCDuelPrizes] + bit D_LEFT_F, b + jr z, .check_d_right + dec a + cp PRIZES_2 + jr nc, .got_prize_count + ld a, PRIZES_6 ; wrap around to 6 + jr .got_prize_count + +.check_d_right + bit D_RIGHT_F, b + jr z, .check_a_btn + inc a + cp PRIZES_6 + 1 + jr c, .got_prize_count + ld a, PRIZES_2 +.got_prize_count + ld [wNPCDuelPrizes], a + xor a + ld [wPrizeCardSelectionFrameCounter], a + +.check_a_btn + bit A_BUTTON_F, b + jr z, .loop_input + ret diff --git a/src/engine/link/printer.asm b/src/engine/link/printer.asm new file mode 100644 index 0000000..110fde4 --- /dev/null +++ b/src/engine/link/printer.asm @@ -0,0 +1,1124 @@ +; sends serial data to printer +; if there's an error in connection, +; show Printer Not Connected scene with error message +_PreparePrinterConnection: + ld bc, $0 + lb de, PRINTERPKT_DATA, $0 + call SendPrinterPacket + ret nc ; return if no error + + ld hl, wPrinterStatus + ld a, [hl] + or a + jr nz, .asm_19e55 + ld [hl], $ff +.asm_19e55 + ld a, [hl] + cp $ff + jr z, ShowPrinterIsNotConnected +; fallthrough + +; shows message on screen depending on wPrinterStatus +; also shows SCENE_GAMEBOY_PRINTER_NOT_CONNECTED. +HandlePrinterError: + ld a, [wPrinterStatus] + cp $ff + jr z, .cable_or_printer_switch + or a + jr z, .interrupted + bit PRINTER_ERROR_BATTERIES_LOST_CHARGE, a + jr nz, .batteries_lost_charge + bit PRINTER_ERROR_CABLE_PRINTER_SWITCH, a + jr nz, .cable_or_printer_switch + bit PRINTER_ERROR_PAPER_JAMMED, a + jr nz, .jammed_printer + + ldtx hl, PrinterPacketErrorText + ld a, $04 + jr ShowPrinterConnectionErrorScene +.cable_or_printer_switch + ldtx hl, CheckCableOrPrinterSwitchText + ld a, $02 + jr ShowPrinterConnectionErrorScene +.jammed_printer + ldtx hl, PrinterPaperIsJammedText + ld a, $03 + jr ShowPrinterConnectionErrorScene +.batteries_lost_charge + ldtx hl, BatteriesHaveLostTheirChargeText + ld a, $01 + jr ShowPrinterConnectionErrorScene +.interrupted + ldtx hl, PrintingWasInterruptedText + call DrawWideTextBox_WaitForInput + scf + ret + +ShowPrinterIsNotConnected: + ldtx hl, PrinterIsNotConnectedText + ld a, $02 +; fallthrough + +; a = error code +; hl = text ID to print in text box +ShowPrinterConnectionErrorScene: + push hl + ; unnecessary loading TxRam, since the text data + ; already incorporate the error number + ld l, a + ld h, $00 + call LoadTxRam3 + + call SetSpriteAnimationsAsVBlankFunction + ld a, SCENE_GAMEBOY_PRINTER_NOT_CONNECTED + lb bc, 0, 0 + call LoadScene + pop hl + call DrawWideTextBox_WaitForInput + call RestoreVBlankFunction + scf + ret + +; main card printer function +Func_19eb4: + ld e, a + ld d, $0 + call LoadCardDataToBuffer1_FromCardID + call SetSpriteAnimationsAsVBlankFunction + ld a, SCENE_GAMEBOY_PRINTER_TRANSMITTING + lb bc, 0, 0 + call LoadScene + ld a, 20 + call CopyCardNameAndLevel + ld [hl], TX_END + ld hl, $0 + call LoadTxRam2 + ldtx hl, NowPrintingText + call DrawWideTextBox_PrintText + call EnableLCD + call PrepareForPrinterCommunications + call DrawTopCardInfoInSRAMGfxBuffer0 + call Func_19f87 + call DrawCardPicInSRAMGfxBuffer2 + call Func_19f99 + jr c, .error + call DrawBottomCardInfoInSRAMGfxBuffer0 + call Func_1a011 + jr c, .error + call RestoreVBlankFunction + call ResetPrinterCommunicationSettings + or a + ret +.error + call RestoreVBlankFunction + call ResetPrinterCommunicationSettings + jp HandlePrinterError + +DrawCardPicInSRAMGfxBuffer2: + ld hl, wLoadedCard1Gfx + ld a, [hli] + ld h, [hl] + ld l, a + ld de, sGfxBuffer2 + call Func_37a5 + ; draw card's picture in sGfxBuffer2 + ld a, $40 + lb hl, 12, 1 + lb de, 2, 68 + lb bc, 16, 12 + call FillRectangle + ret + +; writes the tiles necessary to draw +; the card's information in sGfxBuffer0 +; this includes card's type, lv, HP and attacks if Pokemon card +; or otherwise just the card's name and type symbol +DrawTopCardInfoInSRAMGfxBuffer0: + call Func_1a025 + call Func_212f + + ; draw empty text box frame + ld hl, sGfxBuffer0 + ld a, $34 + lb de, $30, $31 + ld b, 20 + call CopyLine + ld c, 15 +.loop_lines + xor a ; SYM_SPACE + lb de, $36, $37 + ld b, 20 + call CopyLine + dec c + jr nz, .loop_lines + + ; draw card type symbol + ld a, $38 + lb hl, 1, 2 + lb de, 1, 65 + lb bc, 2, 2 + call FillRectangle + ; print card's name + lb de, 4, 65 + ld hl, wLoadedCard1Name + call InitTextPrinting_ProcessTextFromPointerToID + +; prints card's type, lv, HP and attacks if it's a Pokemon card + ld a, [wLoadedCard1Type] + cp TYPE_ENERGY + jr nc, .skip_pokemon_data + inc a ; symbol corresponding to card's type (color) + lb bc, 18, 65 + call WriteByteToBGMap0 + ld a, SYM_Lv + lb bc, 11, 66 + call WriteByteToBGMap0 + ld a, [wLoadedCard1Level] + lb bc, 12, 66 + bank1call WriteTwoDigitNumberInTxSymbolFormat + ld a, SYM_HP + lb bc, 15, 66 + call WriteByteToBGMap0 + ld a, [wLoadedCard1EffectCommands] + inc b + bank1call WriteTwoByteNumberInTxSymbolFormat +.skip_pokemon_data + ret + +Func_19f87: + call TryInitPrinterCommunications + ret c + ld hl, sGfxBuffer0 + call Func_1a0cc + ret c + call Func_1a0cc + call Func_1a111 + ret + +Func_19f99: + call TryInitPrinterCommunications + ret c + ld hl, sGfxBuffer0 + $8 tiles + ld c, $06 +.asm_19fa2 + call Func_1a0cc + ret c + dec c + jr nz, .asm_19fa2 + call Func_1a111 + ret + +; writes the tiles necessary to draw +; the card's information in sGfxBuffer0 +; this includes card's Retreat cost, Weakness, Resistance, +; and attack if it's Pokemon card +; or otherwise just the card's description. +DrawBottomCardInfoInSRAMGfxBuffer0: + call Func_1a025 + xor a + ld [wCardPageType], a + ld hl, sGfxBuffer0 + ld b, 20 + ld c, 9 +.loop_lines + xor a ; SYM_SPACE + lb de, $36, $37 + call CopyLine + dec c + jr nz, .loop_lines + ld a, $35 + lb de, $32, $33 + call CopyLine + + ld a, [wLoadedCard1Type] + cp TYPE_ENERGY + jr nc, .not_pkmn_card + ld hl, RetreatWeakResistData + call PlaceTextItems + ld c, 66 + bank1call DisplayCardPage_PokemonOverview.attacks + ld a, SYM_No + lb bc, 15, 72 + call WriteByteToBGMap0 + inc b + ld a, [wLoadedCard1PokedexNumber] + bank1call WriteTwoByteNumberInTxSymbolFormat + ret + +.not_pkmn_card + bank1call SetNoLineSeparation + lb de, 1, 66 + ld a, SYM_No + call InitTextPrintingInTextbox + ld hl, wLoadedCard1NonPokemonDescription + call ProcessTextFromPointerToID + bank1call SetOneLineSeparation + ret + +RetreatWeakResistData: + textitem 1, 70, RetreatText + textitem 1, 71, WeaknessText + textitem 1, 72, ResistanceText + db $ff + +Func_1a011: + call TryInitPrinterCommunications + ret c + ld hl, sGfxBuffer0 + ld c, $05 +.asm_1a01a + call Func_1a0cc + ret c + dec c + jr nz, .asm_1a01a + call Func_1a108 + ret + +; calls setup text and sets wTilePatternSelector +Func_1a025: + lb de, $40, $bf + call SetupText + ld a, $a4 + ld [wTilePatternSelector], a + xor a + ld [wTilePatternSelectorCorrection], a + ret + +; switches to CGB normal speed, resets serial +; enables SRAM and switches to SRAM1 +; and clears sGfxBuffer0 +PrepareForPrinterCommunications: + call SwitchToCGBNormalSpeed + call ResetSerial + ld a, $10 + ld [wce9b], a + call EnableSRAM + ld a, [sPrinterContrastLevel] + ld [wPrinterContrastLevel], a + call DisableSRAM + ldh a, [hBankSRAM] + ld [wce8f], a + ld a, BANK("SRAM1") + call BankswitchSRAM + call EnableSRAM +; fallthrough + +ClearPrinterGfxBuffer: + ld hl, sGfxBuffer0 + ld bc, $400 +.loop + xor a + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + xor a + ld [wce9f], a + ret + +; reverts settings changed by PrepareForPrinterCommunications +ResetPrinterCommunicationSettings: + push af + call SwitchToCGBDoubleSpeed + ld a, [wce8f] + call BankswitchSRAM + call DisableSRAM + lb de, $30, $bf + call SetupText + pop af + ret + +; send some bytes through serial +Func_1a080: ; unreferenced + ld bc, $0 + lb de, PRINTERPKT_NUL, $0 + jp SendPrinterPacket + +; tries initiating the communications for +; sending data to printer +; returns carry if operation was cancelled +; by pressing B button or serial transfer took long +TryInitPrinterCommunications: + xor a + ld [wPrinterInitAttempts], a +.wait_input + call DoFrame + ldh a, [hKeysHeld] + and B_BUTTON + jr nz, .b_button + ld bc, $0 + lb de, PRINTERPKT_NUL, $0 + call SendPrinterPacket + jr c, .delay + and (1 << PRINTER_STATUS_BUSY) | (1 << PRINTER_STATUS_PRINTING) + jr nz, .wait_input + +.init + ld bc, $0 + lb de, PRINTERPKT_INIT, $0 + call SendPrinterPacket + jr nc, .no_carry + ld hl, wPrinterInitAttempts + inc [hl] + ld a, [hl] + cp 3 + jr c, .wait_input + ; time out + scf + ret +.no_carry + ret + +.b_button + xor a + ld [wPrinterStatus], a + scf + ret + +.delay + ld c, 10 +.delay_loop + call DoFrame + dec c + jr nz, .delay_loop + jr .init + +; loads tiles given by map in hl to sGfxBuffer5 +; copies first 20 tiles, then offsets by 2 tiles +; and copies another 20 +Func_1a0cc: + push bc + ld de, sGfxBuffer5 + call .Copy20Tiles + call .Copy20Tiles + push hl + call CompressDataForPrinterSerialTransfer + call SendPrinterPacket + pop hl + pop bc + ret + +; copies 20 tiles given by hl to de +; then adds 2 tiles to hl +.Copy20Tiles ; 1a0e0 (6:60e0) + push hl + ld c, 20 +.loop_tiles + ld a, [hli] + call .CopyTile + dec c + jr nz, .loop_tiles + pop hl + ld bc, 2 tiles + add hl, bc + ret + +; copies a tile to de +; a = tile to get from sGfxBuffer1 +.CopyTile ; 1a0f0 (6:60f0) + push hl + push bc + ld l, a + ld h, $00 + add hl, hl + add hl, hl + add hl, hl + add hl, hl ; *TILE_SIZE + ld bc, sGfxBuffer1 + add hl, bc + ld c, TILE_SIZE +.loop_copy + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop_copy + pop bc + pop hl + ret + +Func_1a108: + call GetPrinterContrastSerialData + push hl + lb hl, $3, $1 + jr SendPrinterInstructionPacket + +Func_1a111: + call GetPrinterContrastSerialData + push hl + ld hl, wce9b + ld a, [hl] + ld [hl], $00 + ld h, a + ld l, $01 +; fallthrough + +SendPrinterInstructionPacket: + push hl + ld bc, $0 + lb de, PRINTERPKT_DATA, $0 + call SendPrinterPacket + jr c, .asm_1a135 + ld hl, sp+$00 ; contrast level bytes + ld bc, $4 ; instruction packets are 4 bytes in size + lb de, PRINTERPKT_PRINT_INSTRUCTION, $0 + call SendPrinterPacket +.asm_1a135 + pop hl + pop hl + ret + +; returns in h and l the bytes +; to be sent through serial to the printer +; for the set contrast level +GetPrinterContrastSerialData: + ld a, [wPrinterContrastLevel] + ld e, a + ld d, $00 + ld hl, .contrast_level_data + add hl, de + ld h, [hl] + ld l, $e4 + ret + +.contrast_level_data + db $00, $20, $40, $60, $7f + +Func_1a14b: ; unreferenced + ld a, $01 + jr .asm_1a15d + ld a, $02 + jr .asm_1a15d + ld a, $03 + jr .asm_1a15d + ld a, $04 + jr .asm_1a15d + ld a, $05 +.asm_1a15d + ld [wce9d], a + scf + ret + +; a = saved deck index to print +_PrintDeckConfiguration: +; copies selected deck from SRAM to wDuelTempList + call EnableSRAM + ld l, a + ld h, DECK_STRUCT_SIZE + call HtimesL + ld de, sSavedDeck1 + add hl, de + ld de, wDuelTempList + ld bc, DECK_STRUCT_SIZE + call CopyDataHLtoDE + call DisableSRAM + + call ShowPrinterTransmitting + call PrepareForPrinterCommunications + call Func_1a025 + call Func_212f + lb de, 0, 64 + lb bc, 20, 4 + call DrawRegularTextBoxDMG + lb de, 4, 66 + call InitTextPrinting + ld hl, wDuelTempList ; print deck name + call ProcessText + ldtx hl, DeckPrinterText + call ProcessTextFromID + + ld a, 5 + ld [wPrinterHorizontalOffset], a + ld hl, wPrinterTotalCardCount + xor a + ld [hli], a + ld [hl], a + ld [wPrintOnlyStarRarity], a + + ld hl, wCurDeckCards +.loop_cards + ld a, [hl] + or a + jr z, .asm_1a1d6 + ld e, a + ld d, $00 + call LoadCardDataToBuffer1_FromCardID + + ; find out this card's count + ld a, [hli] + ld b, a + ld c, 1 +.loop_card_count + cp [hl] + jr nz, .got_card_count + inc hl + inc c + jr .loop_card_count + +.got_card_count + ld a, c + ld [wPrinterCardCount], a + call LoadCardInfoForPrinter + call AddToPrinterGfxBuffer + jr c, .printer_error + jr .loop_cards + +.asm_1a1d6 + call SendCardListToPrinter + jr c, .printer_error + call ResetPrinterCommunicationSettings + call RestoreVBlankFunction + or a + ret + +.printer_error + call ResetPrinterCommunicationSettings + call RestoreVBlankFunction + jp HandlePrinterError + +SendCardListToPrinter: + ld a, [wPrinterHorizontalOffset] + cp 1 + jr z, .skip_load_gfx + call LoadGfxBufferForPrinter + ret c +.skip_load_gfx + call TryInitPrinterCommunications + ret c + call Func_1a108 + ret +; 0z1a1ff + +; increases printer horizontal offset by 2 +AddToPrinterGfxBuffer: + push hl + ld hl, wPrinterHorizontalOffset + inc [hl] + inc [hl] + ld a, [hl] + pop hl + ; return no carry if below 18 + cp 18 + ccf + ret nc + ; >= 18 +; fallthrough + +; copies Gfx to Gfx buffer and sends some serial data +; returns carry set if unsuccessful +LoadGfxBufferForPrinter: + push hl + call TryInitPrinterCommunications + jr c, .set_carry + ld a, [wPrinterHorizontalOffset] + srl a + ld c, a + ld hl, sGfxBuffer0 +.loop_gfx_buffer + call Func_1a0cc + jr c, .set_carry + dec c + jr nz, .loop_gfx_buffer + call Func_1a111 + jr c, .set_carry + + call ClearPrinterGfxBuffer + ld a, 1 + ld [wPrinterHorizontalOffset], a + pop hl + or a + ret + +.set_carry + pop hl + scf + ret + +; load symbol, name, level and card count to buffer +LoadCardInfoForPrinter: + push hl + ld a, [wPrinterHorizontalOffset] + or %1000000 + ld e, a + ld d, 3 + ld a, [wPrintOnlyStarRarity] + or a + jr nz, .skip_card_symbol + ld hl, wPrinterTotalCardCount + ld a, [hli] + or [hl] + call z, DrawCardSymbol +.skip_card_symbol + ld a, 14 + call CopyCardNameAndLevel + call InitTextPrinting + ld hl, wDefaultText + call ProcessText + ld a, [wPrinterHorizontalOffset] + or %1000000 + ld c, a + ld b, 16 + ld a, SYM_CROSS + call WriteByteToBGMap0 + inc b + ld a, [wPrinterCardCount] + bank1call WriteTwoDigitNumberInTxSymbolFormat + pop hl + ret + +_PrintCardList: +; if Select button is held when printing card list +; only print cards with Star rarity (excluding Promotional cards) +; even if it's not marked as seen in the collection + ld e, FALSE + ldh a, [hKeysHeld] + and SELECT + jr z, .no_select + inc e ; TRUE +.no_select + ld a, e + ld [wPrintOnlyStarRarity], a + + call ShowPrinterTransmitting + call CreateTempCardCollection + ld de, wDefaultText + call CopyPlayerName + call PrepareForPrinterCommunications + call Func_1a025 + call Func_212f + + lb de, 0, 64 + lb bc, 20, 4 + call DrawRegularTextBoxDMG + ld a, PLAYER_TURN + ldh [hWhoseTurn], a + lb de, 2, 66 + call InitTextPrinting + ld hl, wDefaultText + call ProcessText + ldtx hl, AllCardsOwnedText + call ProcessTextFromID + ld a, [wPrintOnlyStarRarity] + or a + jr z, .asm_1a2c2 + ld a, TX_HALF2FULL + call ProcessSpecialTextCharacter + lb de, 3, 84 + call Func_22ca +.asm_1a2c2 + ld a, $ff + ld [wCurPrinterCardType], a + xor a + ld hl, wPrinterTotalCardCount + ld [hli], a + ld [hl], a + ld [wPrinterNumCardTypes], a + ld a, 5 + ld [wPrinterHorizontalOffset], a + + ld e, GRASS_ENERGY +.loop_cards + push de + ld d, $00 + call LoadCardDataToBuffer1_FromCardID + jr c, .done_card_loop + ld d, HIGH(wTempCardCollection) + ld a, [de] ; card ID count in collection + ld [wPrinterCardCount], a + call .LoadCardTypeEntry + jr c, .printer_error_pop_de + + ld a, [wPrintOnlyStarRarity] + or a + jr z, .all_owned_cards_mode + ld a, [wLoadedCard1Set] + and %11110000 + cp PROMOTIONAL + jr z, .next_card + ld a, [wLoadedCard1Rarity] + cp STAR + jr nz, .next_card + ; not Promotional, and Star rarity + ld hl, wPrinterCardCount + res CARD_NOT_OWNED_F, [hl] + jr .got_card_count + +.all_owned_cards_mode + ld a, [wPrinterCardCount] + or a + jr z, .next_card + cp CARD_NOT_OWNED + jr z, .next_card ; ignore not owned cards + +.got_card_count + ld a, [wPrinterCardCount] + and CARD_COUNT_MASK + ld c, a + + ; add to total card count + ld hl, wPrinterTotalCardCount + add [hl] + ld [hli], a + ld a, 0 + adc [hl] + ld [hl], a + + ; add to current card type count + ld hl, wPrinterCurCardTypeCount + ld a, c + add [hl] + ld [hli], a + ld a, 0 + adc [hl] + ld [hl], a + + ld hl, wPrinterNumCardTypes + inc [hl] + ld hl, wce98 + inc [hl] + call LoadCardInfoForPrinter + call AddToPrinterGfxBuffer + jr c, .printer_error_pop_de +.next_card + pop de + inc e + jr .loop_cards + +.printer_error_pop_de + pop de +.printer_error + call ResetPrinterCommunicationSettings + call RestoreVBlankFunction + jp HandlePrinterError + +.done_card_loop + pop de + ; add separator line + ld a, [wPrinterHorizontalOffset] + dec a + or $40 + ld c, a + ld b, 0 + call BCCoordToBGMap0Address + ld a, $35 + lb de, $35, $35 + ld b, 20 + call CopyLine + call AddToPrinterGfxBuffer + jr c, .printer_error + + ld hl, wPrinterTotalCardCount + ld c, [hl] + inc hl + ld b, [hl] + ldtx hl, TotalNumberOfCardsText + call .PrintTextWithNumber + jr c, .printer_error + ld a, [wPrintOnlyStarRarity] + or a + jr nz, .done + ld a, [wPrinterNumCardTypes] + ld c, a + ld b, 0 + ldtx hl, TypesOfCardsText + call .PrintTextWithNumber + jr c, .printer_error + +.done + call SendCardListToPrinter + jr c, .printer_error + call ResetPrinterCommunicationSettings + call RestoreVBlankFunction + or a + ret + +; prints text ID given in hl +; with decimal representation of +; the number given in bc +; hl = text ID +; bc = number +.PrintTextWithNumber + push bc + ld a, [wPrinterHorizontalOffset] + dec a + or $40 + ld e, a + ld d, 2 + call InitTextPrinting + call ProcessTextFromID + ld d, 14 + call InitTextPrinting + pop hl + call TwoByteNumberToTxSymbol_TrimLeadingZeros + ld hl, wStringBuffer + call ProcessText + call AddToPrinterGfxBuffer + ret + +; loads this card's type icon and text +; if it's a new card type that hasn't been printed yet +.LoadCardTypeEntry + ld a, [wLoadedCard1Type] + ld c, a + cp TYPE_ENERGY + jr c, .got_type ; jump if Pokemon card + ld c, $08 + cp TYPE_TRAINER + jr nc, .got_type ; jump if Trainer card + ld c, $07 +.got_type + ld hl, wCurPrinterCardType + ld a, [hl] + cp c + ret z ; already handled this card type + + ; show corresponding icon and text + ; for this new card type + ld a, c + ld [hl], a ; set it as current card type + add a + add c ; *3 + ld c, a + ld b, $00 + ld hl, .IconTextList + add hl, bc + ld a, [wPrinterHorizontalOffset] + dec a + or %1000000 + ld e, a + ld d, 1 + ld a, [hli] + push hl + lb bc, 2, 2 + lb hl, 1, 2 + call FillRectangle + pop hl + ld d, 3 + inc e + call InitTextPrinting + ld a, [hli] + ld h, [hl] + ld l, a + call ProcessTextFromID + + call AddToPrinterGfxBuffer + ld hl, wPrinterCurCardTypeCount + xor a + ld [hli], a + ld [hl], a + ld [wce98], a + ret + +.IconTextList + ; Fire + db $e0 ; icon tile + tx FirePokemonText + + ; Grass + db $e4 ; icon tile + tx GrassPokemonText + + ; Lightning + db $e8 ; icon tile + tx LightningPokemonText + + ; Water + db $ec ; icon tile + tx WaterPokemonText + + ; Fighting + db $f0 ; icon tile + tx FightingPokemonText + + ; Psychic + db $f4 ; icon tile + tx PsychicPokemonText + + ; Colorless + db $f8 ; icon tile + tx ColorlessPokemonText + + ; Energy + db $fc ; icon tile + tx EnergyCardText + + ; Trainer + db $dc ; icon tile + tx TrainerCardText + +ShowPrinterTransmitting: + call SetSpriteAnimationsAsVBlankFunction + ld a, SCENE_GAMEBOY_PRINTER_TRANSMITTING + lb bc, 0, 0 + call LoadScene + ldtx hl, NowPrintingPleaseWaitText + call DrawWideTextBox_PrintText + call EnableLCD + ret + +; compresses $28 tiles in sGfxBuffer5 +; and writes it in sGfxBuffer5 + $28 tiles. +; compressed data has 2 commands to instruct on how to decompress it. +; - a command byte with bit 7 not set, means to copy that many + 1 +; bytes that are following it literally. +; - a command byte with bit 7 set, means to copy the following byte +; that many times + 2 (after masking the top bit of command byte). +; returns in bc the size of the compressed data and +; in de the packet type data. +CompressDataForPrinterSerialTransfer: + ld hl, sGfxBuffer5 + ld de, sGfxBuffer5 + $28 tiles + ld bc, $28 tiles +.loop_remaining_data + ld a, $ff + inc b + dec b + jr nz, .check_compression + ld a, c +.check_compression + push bc + push de + ld c, a + call CheckDataCompression + ld a, e + ld c, e + pop de + jr c, .copy_byte + ld a, c + ld b, c + dec a + ld [de], a ; number of bytes to copy literally - 1 + inc de +.copy_literal_sequence + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .copy_literal_sequence + ld c, b + jr .sub_added_bytes + +.copy_byte + ld a, c + dec a + dec a + or %10000000 ; set high bit + ld [de], a ; = (n times to copy - 2) | %10000000 + inc de + ld a, [hl] ; byte to copy n times + ld [de], a + inc de + ld b, $0 + add hl, bc + +.sub_added_bytes + ld a, c + cpl + inc a + pop bc + add c + ld c, a + ld a, $ff + adc b + ld b, a + or c + jr nz, .loop_remaining_data + + ld hl, $10000 - (sGfxBuffer5 + $28 tiles) + add hl, de ; gets the size of the compressed data + ld c, l + ld b, h + ld hl, sGfxBuffer5 + $28 tiles + lb de, PRINTERPKT_DATA, $1 + ret + +; checks whether the next byte sequence in hl, up to c bytes, can be compressed +; returns carry if the next sequence of bytes can be compressed, +; i.e. has at least 3 consecutive bytes with the same value. +; in that case, returns in e the number of consecutive +; same value bytes that were found. +; if there are no bytes with same value, then count as many bytes left +; as possible until either there are no more remaining data bytes, +; or until a sequence of 3 bytes with the same value are found. +; in that case, the number of bytes in this sequence is returned in e. +CheckDataCompression: + push hl + ld e, c + ld a, c +; if number of remaining bytes is less than 4 +; then no point in compressing + cp 4 + jr c, .no_carry + +; check first if there are at least +; 3 consecutive bytes with the same value + ld b, c + ld a, [hli] + cp [hl] + inc hl + jr nz, .literal_copy ; not same + cp [hl] + inc hl + jr nz, .literal_copy ; not same + +; 3 consecutive bytes were found with same value +; keep track of how many consecutive bytes +; with the same value there are in e + dec c + dec c + dec c + ld e, 3 +.loop_same_value + cp [hl] + jr nz, .set_carry ; exit when a different byte is found + inc hl + inc e + dec c + jr z, .set_carry ; exit when there is no more remaining data + bit 5, e + ; exit if number of consecutive bytes >= $20 + jr z, .loop_same_value +.set_carry + pop hl + scf + ret + +.literal_copy +; consecutive bytes are not the same value +; count the number of bytes there are left +; until a sequence of 3 bytes with the same value is found + pop hl + push hl + ld c, b ; number of remaining bytes + ld e, 1 + ld a, [hli] + dec c + jr z, .no_carry ; exit if no more data +.reset_same_value_count + ld d, 2 ; number of consecutive same value bytes to exit +.next_byte + inc e + dec c + jr z, .no_carry + bit 7, e + jr nz, .no_carry ; exit if >= $80 + cp [hl] + jr z, .same_consecutive_value + ld a, [hli] + jr .reset_same_value_count +.no_carry + pop hl + or a + ret + +.same_consecutive_value + inc hl + dec d + jr nz, .next_byte + ; 3 consecutive bytes with same value found + ; discard the last 3 bytes in the sequence + dec e + dec e + dec e + jr .no_carry diff --git a/src/engine/menus/booster_pack.asm b/src/engine/menus/booster_pack.asm new file mode 100644 index 0000000..934b730 --- /dev/null +++ b/src/engine/menus/booster_pack.asm @@ -0,0 +1,42 @@ +_OpenBoosterPack: + ld a, PLAYER_TURN + ldh [hWhoseTurn], a +; clears DECK_SIZE bytes starting from wPlayerDuelVariables + ld h, a + ld l, $00 +.loop_clear + xor a + ld [hli], a + ld a, l + cp DECK_SIZE + jr c, .loop_clear + +; fills wDuelTempList with 0, 1, 2, 3, ... +; up to the number of cards received in Boster Pack + xor a + ld hl, wBoosterCardsDrawn + ld de, wDuelTempList + ld c, $00 +.loop_index_sequence + ld a, [hli] + or a + jr z, .done_index_sequence + ld a, c + ld [de], a + inc de + inc c + jr .loop_index_sequence +.done_index_sequence + ld a, $ff ; terminator byte + ld [de], a + + lb de, $38, $9f + call SetupText + bank1call InitAndDrawCardListScreenLayout + ldtx hl, ChooseTheCardYouWishToExamineText + ldtx de, BoosterPackText + bank1call SetCardListHeaderText + ld a, A_BUTTON | START + ld [wNoItemSelectionMenuKeys], a + bank1call DisplayCardList + ret diff --git a/src/engine/menus/common.asm b/src/engine/menus/common.asm index 069d168..60ad0a9 100644 --- a/src/engine/menus/common.asm +++ b/src/engine/menus/common.asm @@ -19,8 +19,8 @@ DoCardPop: farcall _DoCardPop ret -Func_7576: - farcall Func_1991f +AddStarterDeck: + farcall _AddStarterDeck ret PreparePrinterConnection: @@ -43,8 +43,8 @@ SetUpAndStartLinkDuel: farcall _SetUpAndStartLinkDuel ret -Func_7594: - farcall Func_1a61f +ShowPromotionalCardScreen: + farcall _ShowPromotionalCardScreen ret OpenBoosterPack: diff --git a/src/engine/menus/glossary.asm b/src/engine/menus/glossary.asm new file mode 100644 index 0000000..78f44dd --- /dev/null +++ b/src/engine/menus/glossary.asm @@ -0,0 +1,221 @@ +OpenGlossaryScreen: + xor a + ld [wGlossaryPageNo], a + call .display_menu + + xor a + ld [wInPlayAreaCurPosition], a + ld de, OpenGlossaryScreen_TransitionTable ; this data is stored in bank 2. + ld hl, wMenuInputTablePointer + ld [hl], e + inc hl + ld [hl], d + ld a, $ff + ld [wDuelInitialPrizesUpperBitsSet], a + xor a + ld [wCheckMenuCursorBlinkCounter], a +.next + ld a, $01 + ld [wVBlankOAMCopyToggle], a + call DoFrame + ldh a, [hKeysPressed] + and SELECT + jr nz, .on_select + + farcall YourOrOppPlayAreaScreen_HandleInput + jr nc, .next + + cp -1 ; b button + jr nz, .check_button + + farcall ZeroObjectPositionsWithCopyToggleOn + ret + +.check_button + push af + farcall ZeroObjectPositionsWithCopyToggleOn + pop af + + cp $09 ; $09: next page or prev page + jr z, .change_page + + call .print_description + call .display_menu + xor a + ld [wCheckMenuCursorBlinkCounter], a + jr .next + +.on_select + ld a, $01 + farcall PlaySFXConfirmOrCancel +.change_page + ld a, [wGlossaryPageNo] + xor $01 ; swap page + ld [wGlossaryPageNo], a + call .print_menu + jr .next + +; display glossary menu. +.display_menu ; 1852b (6:452b) + xor a + ld [wTileMapFill], a + call ZeroObjectPositions + ld a, $01 + ld [wVBlankOAMCopyToggle], a + call DoFrame + call EmptyScreen + call Set_OBJ_8x8 + farcall LoadCursorTile + + lb de, 5, 0 + call InitTextPrinting + ldtx hl, PokemonCardGlossaryText + call ProcessTextFromID + call .print_menu + ldtx hl, ChooseWordAndPressAButtonText + call DrawWideTextBox_PrintText + ret + +; print texts in glossary menu. +.print_menu ; 1855a (6:455a) + ld hl, wDefaultText + + ld a, TX_SYMBOL + ld [hli], a + + ld a, [wGlossaryPageNo] + add SYM_1 + ld [hli], a + + ld a, TX_SYMBOL + ld [hli], a + + ld a, SYM_SLASH + ld [hli], a + + ld a, TX_SYMBOL + ld [hli], a + + ld a, SYM_2 + ld [hli], a + + ld [hl], TX_END + + lb de, 16, 1 + call InitTextPrinting + ld hl, wDefaultText + call ProcessText + + lb de, 1, 3 + call InitTextPrinting + ld a, [wGlossaryPageNo] + or a + jr nz, .page_two + + ldtx hl, GlossaryMenuPage1Text + jr .page_one + +.page_two + ldtx hl, GlossaryMenuPage2Text +.page_one + call ProcessTextFromID + ret + +; display glossary description. +.print_description ; 18598 (6:4598) + push af + xor a + ld [wTileMapFill], a + call EmptyScreen + lb de, 5, 0 + call InitTextPrinting + ldtx hl, PokemonCardGlossaryText + call ProcessTextFromID + lb de, 0, 4 + lb bc, 20, 14 + call DrawRegularTextBox + + ld a, [wGlossaryPageNo] + or a + jr nz, .back_page + + ld hl, GlossaryData1 + jr .front_page + +.back_page + ld hl, GlossaryData2 +.front_page + pop af + ; hl += (a + (a << 2)). + ; that is, + ; hl += (5 * a). + ld c, a + ld b, 0 + add hl, bc + sla a + sla a + ld c, a + add hl, bc + ld a, [hli] + push hl + ld d, a + ld e, $02 + call InitTextPrinting + ld a, [hli] + ld h, [hl] + ld l, a + call ProcessTextFromID + pop hl + lb de, 1, 5 + call InitTextPrinting + inc hl + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ld a, $01 + ld [wLineSeparation], a + call ProcessTextFromID + xor a + ld [wLineSeparation], a + call EnableLCD +.loop + call DoFrame + ldh a, [hKeysPressed] + and B_BUTTON + jr z, .loop + + ld a, -1 + farcall PlaySFXConfirmOrCancel + ret + +; unit: 5 bytes. +; [structure] +; horizontal align (1) / title text id (2) / desc. text id (2) +glossary_entry: MACRO + db \1 + tx \2 + tx \3 +ENDM + +GlossaryData1: + glossary_entry 7, AboutTheDeckText, DeckDescriptionText + glossary_entry 5, AboutTheDiscardPileText, DiscardPileDescriptionText + glossary_entry 7, AboutTheHandText, HandDescriptionText + glossary_entry 6, AboutTheArenaText, ArenaDescriptionText + glossary_entry 6, AboutTheBenchText, BenchDescriptionText + glossary_entry 4, AboutTheActivePokemonText, ActivePokemonDescriptionText + glossary_entry 5, AboutBenchPokemonText, BenchPokemonDescriptionText + glossary_entry 7, AboutPrizesText, PrizesDescriptionText + glossary_entry 5, AboutDamageCountersText, DamageCountersDescriptionText + +GlossaryData2: + glossary_entry 5, AboutEnergyCardsText, EnergyCardsDescriptionText + glossary_entry 5, AboutTrainerCardsText, TrainerCardsDescriptionText + glossary_entry 5, AboutBasicPokemonText, BasicPokemonDescriptionText + glossary_entry 5, AboutEvolutionCardsText, EvolutionCardsDescriptionText + glossary_entry 6, AboutAttackingText, AttackingDescriptionText + glossary_entry 5, AboutPokemonPowerText, PokemonPowerDescriptionText + glossary_entry 6, AboutWeaknessText, WeaknessDescriptionText + glossary_entry 6, AboutResistanceText, ResistanceDescriptionText + glossary_entry 6, AboutRetreatingText, RetreatingDescriptionText diff --git a/src/engine/menus/play_area.asm b/src/engine/menus/play_area.asm new file mode 100644 index 0000000..047d24f --- /dev/null +++ b/src/engine/menus/play_area.asm @@ -0,0 +1,570 @@ +; this function is called when the player is shown the "In Play Area" screen. +; it can be called with either the select button (DuelMenuShortcut_BothActivePokemon), +; or via the "In Play Area" item of the Check menu (DuelCheckMenu_InPlayArea) +OpenInPlayAreaScreen: + ld a, INPLAYAREA_PLAYER_ACTIVE + ld [wInPlayAreaCurPosition], a +.start + xor a + ld [wCheckMenuCursorBlinkCounter], a + farcall DrawInPlayAreaScreen + call EnableLCD + call IsClairvoyanceActive + jr c, .clairvoyance_on + + ld de, OpenInPlayAreaScreen_TransitionTable1 + jr .clairvoyance_off + +.clairvoyance_on + ld de, OpenInPlayAreaScreen_TransitionTable2 +.clairvoyance_off + ld hl, wMenuInputTablePointer + ld [hl], e + inc hl + ld [hl], d + ld a, [wInPlayAreaCurPosition] + call .print_associated_text +.on_frame + ld a, $01 + ld [wVBlankOAMCopyToggle], a + call DoFrame + + ldh a, [hDPadHeld] + and START + jr nz, .selection + + ; if this function's been called from 'select' button, + ; wInPlayAreaFromSelectButton is on. + ld a, [wInPlayAreaFromSelectButton] + or a + jr z, .handle_input ; if it's from the Check menu, jump. + + ldh a, [hDPadHeld] + and SELECT + jr nz, .skip_input + +.handle_input + ld a, [wInPlayAreaCurPosition] + ld [wInPlayAreaTemporaryPosition], a + call OpenInPlayAreaScreen_HandleInput + jr c, .pressed + + ld a, [wInPlayAreaCurPosition] + cp INPLAYAREA_PLAYER_PLAY_AREA + jp z, .show_turn_holder_play_area + cp INPLAYAREA_OPP_PLAY_AREA + jp z, .show_non_turn_holder_play_area + + ; check if the cursor moved. + ld hl, wInPlayAreaTemporaryPosition + cp [hl] + call nz, .print_associated_text + + jr .on_frame + +.pressed + cp -1 + jr nz, .selection + + ; pressed b button. + call ZeroObjectPositionsAndToggleOAMCopy_Bank6 + lb de, $38, $9f + call SetupText + scf + ret + +.skip_input + call ZeroObjectPositionsAndToggleOAMCopy_Bank6 + lb de, $38, $9f + call SetupText + or a + ret + +.selection ; pressed a button or start button. + call ZeroObjectPositionsAndToggleOAMCopy_Bank6 + lb de, $38, $9f + call SetupText + ld a, [wInPlayAreaCurPosition] + ld [wInPlayAreaPreservedPosition], a + ld hl, .jump_table + call JumpToFunctionInTable + ld a, [wInPlayAreaPreservedPosition] + ld [wInPlayAreaCurPosition], a + + jp .start + +.print_associated_text ; 18171 (6:4171) +; each position has a text associated to it, +; which is printed at the bottom of the screen + push af + lb de, 1, 17 + call InitTextPrinting + ldtx hl, EmptyLineText + call ProcessTextFromID + + ld hl, hffb0 + ld [hl], $01 + ldtx hl, HandText_2 + call ProcessTextFromID + + ld hl, hffb0 + ld [hl], $00 + lb de, 1, 17 + call InitTextPrinting + pop af + ld hl, OpenInPlayAreaScreen_TextTable + ld b, 0 + sla a + ld c, a + add hl, bc + + ; hl = OpenInPlayAreaScreen_TextTable + 2 * (wInPlayAreaCurPosition) + ld a, [hli] + ld h, [hl] + ld l, a + ld a, h + + ; jump ahead if entry does not contain null text (it's not active pokemon) + or a + jr nz, .print_hand_or_discard_pile + + ld a, l + ; bench slots have dummy text IDs assigned to them, which are never used. + ; these are secretly not text id's, but rather, 2-byte PLAY_AREA_BENCH_* constants + ; check if the value at register l is one of those, and jump ahead if not + cp PLAY_AREA_BENCH_5 + $01 + jr nc, .print_hand_or_discard_pile + +; if we make it here, we need to print a Pokemon card name. +; wInPlayAreaCurPosition determines which duelist +; and l contains the PLAY_AREA_* location of the card. + ld a, [wInPlayAreaCurPosition] + cp INPLAYAREA_PLAYER_HAND + jr nc, .opponent_side + + ld a, l + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + cp -1 + ret z + + call GetCardIDFromDeckIndex + call LoadCardDataToBuffer1_FromCardID + jr .display_card_name + +.opponent_side + ld a, l + add DUELVARS_ARENA_CARD + call GetNonTurnDuelistVariable + cp -1 + ret z + + call SwapTurn + call GetCardIDFromDeckIndex + call LoadCardDataToBuffer1_FromCardID + call SwapTurn + +.display_card_name + ld a, 18 + call CopyCardNameAndLevel + ld hl, wDefaultText + call ProcessText + ret + +.print_hand_or_discard_pile +; if we make it here, cursor position is to Hand or Discard Pile +; so DuelistHandText_2 or DuelistDiscardPileText will be printed + + ld a, [wInPlayAreaCurPosition] + cp INPLAYAREA_OPP_ACTIVE + jr nc, .opp_side_print_hand_or_discard_pile + call PrintTextNoDelay + ret + +.opp_side_print_hand_or_discard_pile + call SwapTurn + call PrintTextNoDelay + call SwapTurn + ret + +.show_turn_holder_play_area + lb de, $38, $9f + call SetupText + ldh a, [hWhoseTurn] + push af + bank1call OpenTurnHolderPlayAreaScreen + pop af + ldh [hWhoseTurn], a + ld a, [wInPlayAreaPreservedPosition] + ld [wInPlayAreaCurPosition], a + jp .start + +.show_non_turn_holder_play_area + lb de, $38, $9f + call SetupText + ldh a, [hWhoseTurn] + push af + bank1call OpenNonTurnHolderPlayAreaScreen + pop af + ldh [hWhoseTurn], a + ld a, [wInPlayAreaPreservedPosition] + ld [wInPlayAreaCurPosition], a + jp .start + +.jump_table ; (6:4228) + dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x00: INPLAYAREA_PLAYER_BENCH_1 + dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x01: INPLAYAREA_PLAYER_BENCH_2 + dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x02: INPLAYAREA_PLAYER_BENCH_3 + dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x03: INPLAYAREA_PLAYER_BENCH_4 + dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x04: INPLAYAREA_PLAYER_BENCH_5 + dw OpenInPlayAreaScreen_TurnHolderPlayArea ; 0x05: INPLAYAREA_PLAYER_ACTIVE + dw OpenInPlayAreaScreen_TurnHolderHand ; 0x06: INPLAYAREA_PLAYER_HAND + dw OpenInPlayAreaScreen_TurnHolderDiscardPile ; 0x07: INPLAYAREA_PLAYER_DISCARD_PILE + dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x08: INPLAYAREA_OPP_ACTIVE + dw OpenInPlayAreaScreen_NonTurnHolderHand ; 0x09: INPLAYAREA_OPP_HAND + dw OpenInPlayAreaScreen_NonTurnHolderDiscardPile ; 0x0a: INPLAYAREA_OPP_DISCARD_PILE + dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0b: INPLAYAREA_OPP_BENCH_1 + dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0c: INPLAYAREA_OPP_BENCH_2 + dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0d: INPLAYAREA_OPP_BENCH_3 + dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0e: INPLAYAREA_OPP_BENCH_4 + dw OpenInPlayAreaScreen_NonTurnHolderPlayArea ; 0x0f: INPLAYAREA_OPP_BENCH_5 + +OpenInPlayAreaScreen_TurnHolderPlayArea: + ; wInPlayAreaCurPosition constants conveniently map to (PLAY_AREA_* constants - 1) + ; for bench locations. this mapping is taken for granted in the following code. + ld a, [wInPlayAreaCurPosition] + inc a + cp INPLAYAREA_PLAYER_ACTIVE + $01 + jr nz, .on_bench + xor a ; PLAY_AREA_ARENA +.on_bench + ld [wCurPlayAreaSlot], a + add DUELVARS_ARENA_CARD + call GetTurnDuelistVariable + cp -1 + ret z + call GetCardIDFromDeckIndex + call LoadCardDataToBuffer1_FromCardID + xor a + ld [wCurPlayAreaY], a + bank1call OpenCardPage_FromCheckPlayArea + ret + +OpenInPlayAreaScreen_NonTurnHolderPlayArea: + ld a, [wInPlayAreaCurPosition] + sub INPLAYAREA_OPP_ACTIVE + or a + jr z, .active + ; convert INPLAYAREA_OPP_BENCH_* constant to PLAY_AREA_BENCH_* constant + sub INPLAYAREA_OPP_BENCH_1 - INPLAYAREA_OPP_ACTIVE - PLAY_AREA_BENCH_1 +.active + ld [wCurPlayAreaSlot], a + add DUELVARS_ARENA_CARD + call GetNonTurnDuelistVariable + cp -1 + ret z + call SwapTurn + call GetCardIDFromDeckIndex + call LoadCardDataToBuffer1_FromCardID + xor a + ld [wCurPlayAreaY], a + bank1call OpenCardPage_FromCheckPlayArea + call SwapTurn + ret + +OpenInPlayAreaScreen_TurnHolderHand: + ldh a, [hWhoseTurn] + push af + bank1call OpenTurnHolderHandScreen_Simple + pop af + ldh [hWhoseTurn], a + ret + +OpenInPlayAreaScreen_NonTurnHolderHand: + ldh a, [hWhoseTurn] + push af + bank1call OpenNonTurnHolderHandScreen_Simple + pop af + ldh [hWhoseTurn], a + ret + +OpenInPlayAreaScreen_TurnHolderDiscardPile: + ldh a, [hWhoseTurn] + push af + bank1call OpenTurnHolderDiscardPileScreen + pop af + ldh [hWhoseTurn], a + ret + +OpenInPlayAreaScreen_NonTurnHolderDiscardPile: + ldh a, [hWhoseTurn] + push af + bank1call OpenNonTurnHolderDiscardPileScreen + pop af + ldh [hWhoseTurn], a + ret + +OpenInPlayAreaScreen_TextTable: +; note that for bench slots, the entries are +; PLAY_AREA_BENCH_* constants in practice + tx HandText ; INPLAYAREA_PLAYER_BENCH_1 + tx CheckText ; INPLAYAREA_PLAYER_BENCH_2 + tx AttackText ; INPLAYAREA_PLAYER_BENCH_3 + tx PKMNPowerText ; INPLAYAREA_PLAYER_BENCH_4 + tx DoneText ; INPLAYAREA_PLAYER_BENCH_5 + dw NULL ; INPLAYAREA_PLAYER_ACTIVE + tx DuelistHandText_2 ; INPLAYAREA_PLAYER_HAND + tx DuelistDiscardPileText ; INPLAYAREA_PLAYER_DISCARD_PILE + dw NULL ; INPLAYAREA_OPP_ACTIVE + tx DuelistHandText_2 ; INPLAYAREA_OPP_HAND + tx DuelistDiscardPileText ; INPLAYAREA_OPP_DISCARD_PILE + tx HandText ; INPLAYAREA_OPP_BENCH_1 + tx CheckText ; INPLAYAREA_OPP_BENCH_2 + tx AttackText ; INPLAYAREA_OPP_BENCH_3 + tx PKMNPowerText ; INPLAYAREA_OPP_BENCH_4 + tx DoneText ; INPLAYAREA_OPP_BENCH_5 + +in_play_area_cursor_transition: MACRO + cursor_transition \1, \2, \3, INPLAYAREA_\4, INPLAYAREA_\5, INPLAYAREA_\6, INPLAYAREA_\7 +ENDM + +; it's related to wMenuInputTablePointer. +; with this table, the cursor moves into the proper location by the input. +; note that the unit of the position is not a 8x8 tile. +OpenInPlayAreaScreen_TransitionTable1: + in_play_area_cursor_transition $18, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_2, PLAYER_BENCH_5 + in_play_area_cursor_transition $30, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_3, PLAYER_BENCH_1 + in_play_area_cursor_transition $48, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_4, PLAYER_BENCH_2 + in_play_area_cursor_transition $60, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_5, PLAYER_BENCH_3 + in_play_area_cursor_transition $78, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_1, PLAYER_BENCH_4 + in_play_area_cursor_transition $30, $6c, $00, OPP_ACTIVE, PLAYER_BENCH_1, PLAYER_DISCARD_PILE, PLAYER_DISCARD_PILE + in_play_area_cursor_transition $78, $80, $00, PLAYER_DISCARD_PILE, PLAYER_BENCH_1, PLAYER_ACTIVE, PLAYER_ACTIVE + in_play_area_cursor_transition $78, $70, $00, OPP_ACTIVE, PLAYER_HAND, PLAYER_ACTIVE, PLAYER_ACTIVE + in_play_area_cursor_transition $78, $34, 1 << OAM_X_FLIP, OPP_BENCH_1, PLAYER_ACTIVE, OPP_DISCARD_PILE, OPP_DISCARD_PILE + in_play_area_cursor_transition $30, $20, 1 << OAM_X_FLIP, OPP_BENCH_1, OPP_DISCARD_PILE, OPP_ACTIVE, OPP_ACTIVE + in_play_area_cursor_transition $30, $38, 1 << OAM_X_FLIP, OPP_BENCH_1, PLAYER_ACTIVE, OPP_ACTIVE, OPP_ACTIVE + in_play_area_cursor_transition $90, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_5, OPP_BENCH_2 + in_play_area_cursor_transition $78, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_1, OPP_BENCH_3 + in_play_area_cursor_transition $60, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_2, OPP_BENCH_4 + in_play_area_cursor_transition $48, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_3, OPP_BENCH_5 + in_play_area_cursor_transition $30, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_4, OPP_BENCH_1 + +OpenInPlayAreaScreen_TransitionTable2: + in_play_area_cursor_transition $18, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_2, PLAYER_BENCH_5 + in_play_area_cursor_transition $30, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_3, PLAYER_BENCH_1 + in_play_area_cursor_transition $48, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_4, PLAYER_BENCH_2 + in_play_area_cursor_transition $60, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_5, PLAYER_BENCH_3 + in_play_area_cursor_transition $78, $8c, $00, PLAYER_ACTIVE, PLAYER_PLAY_AREA, PLAYER_BENCH_1, PLAYER_BENCH_4 + in_play_area_cursor_transition $30, $6c, $00, OPP_ACTIVE, PLAYER_BENCH_1, PLAYER_DISCARD_PILE, PLAYER_DISCARD_PILE + in_play_area_cursor_transition $78, $80, $00, PLAYER_DISCARD_PILE, PLAYER_BENCH_1, PLAYER_ACTIVE, PLAYER_ACTIVE + in_play_area_cursor_transition $78, $70, $00, OPP_ACTIVE, PLAYER_HAND, PLAYER_ACTIVE, PLAYER_ACTIVE + in_play_area_cursor_transition $78, $34, 1 << OAM_X_FLIP, OPP_BENCH_1, PLAYER_ACTIVE, OPP_DISCARD_PILE, OPP_DISCARD_PILE + in_play_area_cursor_transition $30, $20, 1 << OAM_X_FLIP, OPP_BENCH_1, OPP_DISCARD_PILE, OPP_ACTIVE, OPP_ACTIVE + in_play_area_cursor_transition $30, $38, 1 << OAM_X_FLIP, OPP_HAND, PLAYER_ACTIVE, OPP_ACTIVE, OPP_ACTIVE + in_play_area_cursor_transition $90, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_5, OPP_BENCH_2 + in_play_area_cursor_transition $78, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_1, OPP_BENCH_3 + in_play_area_cursor_transition $60, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_2, OPP_BENCH_4 + in_play_area_cursor_transition $48, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_3, OPP_BENCH_5 + in_play_area_cursor_transition $30, $14, 1 << OAM_X_FLIP, OPP_PLAY_AREA, OPP_ACTIVE, OPP_BENCH_4, OPP_BENCH_1 + +OpenInPlayAreaScreen_HandleInput: + xor a + ld [wPlaysSfx], a + ld hl, wMenuInputTablePointer + ld e, [hl] + inc hl + ld d, [hl] + ld a, [wInPlayAreaCurPosition] + ld l, a + ld h, $07 + call HtimesL + add hl, de + + ldh a, [hDPadHeld] + or a + jp z, .check_button + + inc hl + inc hl + inc hl + + ; check d-pad + bit D_UP_F, a + jr z, .else_if_down + + ; up + ld a, [hl] + jr .process_dpad + +.else_if_down + inc hl + bit D_DOWN_F, a + jr z, .else_if_right + + ; down + ld a, [hl] + jr .process_dpad + +.else_if_right + inc hl + bit D_RIGHT_F, a + jr z, .else_if_left + + ; right + ld a, [hl] + jr .process_dpad + +.else_if_left + inc hl + bit D_LEFT_F, a + jr z, .check_button + + ; left + ld a, [hl] +.process_dpad + push af + ld a, [wInPlayAreaCurPosition] + ld [wInPlayAreaPreservedPosition], a + pop af + + ld [wInPlayAreaCurPosition], a + cp INPLAYAREA_PLAYER_ACTIVE + jr c, .player_area + cp INPLAYAREA_OPP_BENCH_1 + jr c, .next + cp INPLAYAREA_PLAYER_PLAY_AREA + jr c, .opponent_area + + jr .next + +.player_area + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetTurnDuelistVariable + dec a + jr nz, .bench_pokemon_exists + + ; no pokemon in player's bench. + ; then move to player's play area. + ld a, INPLAYAREA_PLAYER_PLAY_AREA + ld [wInPlayAreaCurPosition], a + jr .next + +.bench_pokemon_exists + ld b, a + ld a, [wInPlayAreaCurPosition] + cp b + jr c, .next + + ; handle index overflow + ldh a, [hDPadHeld] + bit D_RIGHT_F, a + jr z, .on_left + + xor a + ld [wInPlayAreaCurPosition], a + jr .next + +.on_left + ld a, b + dec a + ld [wInPlayAreaCurPosition], a + jr .next + +.opponent_area + ld a, DUELVARS_NUMBER_OF_POKEMON_IN_PLAY_AREA + call GetNonTurnDuelistVariable + dec a + jr nz, .bench_pokemon_exists_2 + + ld a, INPLAYAREA_OPP_PLAY_AREA + ld [wInPlayAreaCurPosition], a + jr .next + +.bench_pokemon_exists_2 + ld b, a + ld a, [wInPlayAreaCurPosition] + sub INPLAYAREA_OPP_BENCH_1 + cp b + jr c, .next + + ldh a, [hDPadHeld] + bit D_LEFT_F, a + jr z, .on_right + + ld a, INPLAYAREA_OPP_BENCH_1 + ld [wInPlayAreaCurPosition], a + jr .next + +.on_right + ld a, b + add INPLAYAREA_OPP_DISCARD_PILE + ld [wInPlayAreaCurPosition], a +.next + ld a, $01 + ld [wPlaysSfx], a + xor a + ld [wCheckMenuCursorBlinkCounter], a +.check_button + ldh a, [hKeysPressed] + and A_BUTTON | B_BUTTON + jr z, .return + + and A_BUTTON + jr nz, .a_button + + ; pressed b button + ld a, -1 + farcall PlaySFXConfirmOrCancel + scf + ret + +.a_button + call .draw_cursor + ld a, $01 + farcall PlaySFXConfirmOrCancel + ld a, [wInPlayAreaCurPosition] + scf + ret + +.return + ld a, [wPlaysSfx] + or a + jr z, .skip_sfx + call PlaySFX +.skip_sfx + ld hl, wCheckMenuCursorBlinkCounter + ld a, [hl] + inc [hl] + and $10 - 1 + ret nz + + bit 4, [hl] ; = and $10 + jr nz, ZeroObjectPositionsAndToggleOAMCopy_Bank6 + +.draw_cursor ; 184a0 (6:44a0) + call ZeroObjectPositions + ld hl, wMenuInputTablePointer + ld e, [hl] + inc hl + ld d, [hl] + ld a, [wInPlayAreaCurPosition] + ld l, a + ld h, $07 + call HtimesL + add hl, de + + ld d, [hl] ; x position. + inc hl + ld e, [hl] ; y position. + inc hl + ld b, [hl] ; attribute. + ld c, $00 + call SetOneObjectAttributes + or a + ret + +ZeroObjectPositionsAndToggleOAMCopy_Bank6: + call ZeroObjectPositions + ld a, $01 + ld [wVBlankOAMCopyToggle], a + ret diff --git a/src/engine/menus/start.asm b/src/engine/menus/start.asm new file mode 100644 index 0000000..4d46d4a --- /dev/null +++ b/src/engine/menus/start.asm @@ -0,0 +1,418 @@ +; plays the Opening sequence, and handles player selection +; in the Title Screen and Start Menu +HandleTitleScreen: +; if last selected item in Start Menu is 0 (Card Pop!) +; then skip straight to the Start Menu +; this makes it so that returning from Card Pop! +; doesn't play the Opening sequence + ld a, [wLastSelectedStartMenuItem] + or a + jr z, .start_menu + +.play_opening + ld a, MUSIC_STOP + call PlaySong + call Func_3ca0 + call PlayIntroSequence + call LoadTitleScreenSprites + + xor a + ld [wd635], a + ld a, $3c + ld [wTitleScreenIgnoreInputCounter], a +.loop + call DoFrameIfLCDEnabled + call UpdateRNGSources + call AnimateRandomTitleScreenOrb + ld hl, wd635 + inc [hl] + call AssertSongFinished + or a + jr nz, .song_playing + ; reset back to the opening sequence + farcall Func_10ab4 + jr .play_opening + +.song_playing + ; should we ignore user input? + ld hl, wTitleScreenIgnoreInputCounter + ld a, [hl] + or a + jr z, .check_keys + ; ignore input, decrement the counter + dec [hl] + jr .loop + +.check_keys + ldh a, [hKeysPressed] + and A_BUTTON | START + jr z, .loop + ld a, SFX_02 + call PlaySFX + farcall Func_10ab4 + +.start_menu + call CheckIfHasSaveData + call HandleStartMenu + +; new game + ld a, [wStartMenuChoice] + cp START_MENU_NEW_GAME + jr nz, .continue_from_diary + call DeleteSaveDataForNewGame + jr c, HandleTitleScreen + jr .card_pop +.continue_from_diary + ld a, [wStartMenuChoice] + cp START_MENU_CONTINUE_FROM_DIARY + jr nz, .card_pop + call AskToContinueFromDiaryWithDuelData + jr c, HandleTitleScreen +.card_pop + ld a, [wStartMenuChoice] + cp START_MENU_CARD_POP + jr nz, .continue_duel + call ShowCardPopCGBDisclaimer + jr c, HandleTitleScreen +.continue_duel + call ResetDoFrameFunction + call Func_3ca0 + ret + +; updates wHasSaveData and wHasDuelSaveData +; depending on whether the save data is valid or not +CheckIfHasSaveData: + farcall ValidateBackupGeneralSaveData + ld a, TRUE + jr c, .no_error + ld a, FALSE +.no_error + ld [wHasSaveData], a + cp $00 ; or a + jr z, .write_has_duel_data + bank1call ValidateSavedNonLinkDuelData + ld a, TRUE + jr nc, .write_has_duel_data + ld a, FALSE +.write_has_duel_data + ld [wHasDuelSaveData], a + farcall ValidateBackupGeneralSaveData + ret + +; handles printing the Start Menu +; and getting player input and choice +HandleStartMenu: + ld a, MUSIC_PC_MAIN_MENU + call PlaySong + call DisableLCD + farcall Func_10000 + lb de, $30, $8f + call SetupText + call Func_3ca0 + xor a + ld [wLineSeparation], a + call .DrawPlayerPortrait + call .SetStartMenuParams + + ld a, $ff + ld [wTitleScreenIgnoreInputCounter], a + ld a, [wLastSelectedStartMenuItem] + cp $4 + jr c, .init_menu + ld a, [wHasSaveData] + or a + jr z, .init_menu + ld a, 1 ; start at second menu option +.init_menu + ld hl, wStartMenuParams + farcall InitAndPrintPauseMenu + farcall FlashWhiteScreen + +.wait_input + call DoFrameIfLCDEnabled + call UpdateRNGSources + call HandleMenuInput + push af + call PrintStartMenuDescriptionText + pop af + jr nc, .wait_input + ldh a, [hCurMenuItem] + cp e + jr nz, .wait_input + + ld [wLastSelectedStartMenuItem], a + ld a, [wHasSaveData] + or a + jr nz, .no_adjustment + ; New Game is 3rd option + ; but when there's no save data, + ; it's the 1st in menu list, so adjust it + inc e + inc e +.no_adjustment + ld a, e + ld [wStartMenuChoice], a + ret + +.SetStartMenuParams + ld hl, .StartMenuParams + ld de, wStartMenuParams + ld bc, .StartMenuParamsEnd - .StartMenuParams + call CopyDataHLtoDE + + ld e, 0 + ld a, [wHasSaveData] + or a + jr z, .get_text_id ; New Game + inc e + ld a, 2 + call .AddItems + ld a, [wHasDuelSaveData] + or a + jr z, .get_text_id ; Continue From Diary + inc e + ld a, 1 + call .AddItems + ; Continue Duel + +.get_text_id + sla e + ld d, $00 + ld hl, .StartMenuTextIDs + add hl, de + ; set text ID as Start Menu param + ld a, [hli] + ld [wStartMenuParams + 6], a + ld a, [hl] + ld [wStartMenuParams + 7], a + ret + +; adds c items to start menu list +; this means adding 2 units per item to the text box height +; and adding to the number of items +.AddItems + push bc + ld c, a + ; number of items in menu + ld a, [wStartMenuParams + 12] + add c + ld [wStartMenuParams + 12], a + ; height of text box + sla c + ld a, [wStartMenuParams + 3] + add c + ld [wStartMenuParams + 3], a + pop bc + ret + +.StartMenuParams + db 0, 0 ; start menu coords + db 14, 4 ; start menu text box dimensions + + db 2, 2 ; text alignment for InitTextPrinting + tx NewGameText + db $ff + + db 1, 2 ; cursor x, cursor y + db 2 ; y displacement between items + db 1 ; number of items + db SYM_CURSOR_R ; cursor tile number + db SYM_SPACE ; tile behind cursor + dw NULL ; function pointer if non-0 +.StartMenuParamsEnd + +.StartMenuTextIDs + tx NewGameText + tx CardPopContinueDiaryNewGameText + tx CardPopContinueDiaryNewGameContinueDuelText + +.DrawPlayerPortrait + lb bc, 14, 1 + farcall $4, DrawPlayerPortrait + ret + +; prints the description for the current selected item +; in the Start Menu in the text box +PrintStartMenuDescriptionText: + push hl + push bc + push de + ; don't print if it's already showing + ld a, [wCurMenuItem] + ld e, a + ld a, [wCurHighlightedStartMenuItem] + cp e + jr z, .skip + ld a, [wHasSaveData] + or a + jr nz, .has_data + ; New Game option is 3rd element + ; in function table, so add 2 + inc e + inc e +.has_data + + ld a, e + push af + lb de, 0, 10 + lb bc, 20, 8 + call DrawRegularTextBox + pop af + ld hl, .StartMenuDescriptionFunctionTable + call JumpToFunctionInTable +.skip + ld a, [wCurMenuItem] + ld [wCurHighlightedStartMenuItem], a + pop de + pop bc + pop hl + ret + +.StartMenuDescriptionFunctionTable + dw .CardPop + dw .ContinueFromDiary + dw .NewGame + dw .ContinueDuel + +.CardPop + lb de, 1, 12 + call InitTextPrinting + ldtx hl, WhenYouCardPopWithFriendText + call PrintTextNoDelay + ret + +.ContinueDuel + lb de, 1, 12 + call InitTextPrinting + ldtx hl, TheGameWillContinueFromThePointInTheDuelText + call PrintTextNoDelay + ret + +.NewGame + lb de, 1, 12 + call InitTextPrinting + ldtx hl, StartANewGameText + call PrintTextNoDelay + ret + +.ContinueFromDiary + ; get OW map name + ld a, [wCurOverworldMap] + add a + ld c, a + ld b, $00 + ld hl, OverworldMapNames + add hl, bc + ld a, [hli] + ld [wTxRam2 + 0], a + ld a, [hl] + ld [wTxRam2 + 1], a + + ; get medal count + ld a, [wMedalCount] + ld [wTxRam3 + 0], a + xor a + ld [wTxRam3 + 1], a + + ; print text + lb de, 1, 10 + call InitTextPrinting + ldtx hl, ContinueFromDiarySummaryText + call PrintTextNoDelay + + ld a, [wTotalNumCardsCollected] + ld d, a + ld a, [wTotalNumCardsToCollect] + ld e, a + ld bc, $90e + farcall Func_1024f + ld bc, $a10 + farcall Func_101df + ret + +; asks the player whether it's okay to delete +; the save data in order to create a new one +; if player answers "yes", delete it +DeleteSaveDataForNewGame: +; exit if there no save data + ld a, [wHasSaveData] + or a + ret z + + call DisableLCD + farcall Func_10000 + call Func_3ca0 + farcall FlashWhiteScreen + call DoFrameIfLCDEnabled + ldtx hl, SavedDataAlreadyExistsText + call PrintScrollableText_NoTextBoxLabel + ldtx hl, OKToDeleteTheDataText + call YesOrNoMenuWithText + ret c ; quit if chose "no" + farcall InvalidateSaveData + ldtx hl, AllDataWasDeletedText + call PrintScrollableText_NoTextBoxLabel + or a + ret + +; asks the player if the game should resume +; from diary even though there is Duel save data +; returns carry if "no" was selected +AskToContinueFromDiaryWithDuelData: +; return if there's no duel save data + ld a, [wHasDuelSaveData] + or a + ret z + + call DisableLCD + farcall Func_10000 + call Func_3ca0 + farcall FlashWhiteScreen + call DoFrameIfLCDEnabled + ldtx hl, DataExistsWhenPowerWasTurnedOFFDuringDuelText + call PrintScrollableText_NoTextBoxLabel + ldtx hl, ContinueFromDiaryText + call YesOrNoMenuWithText + ret c + or a + ret + +; shows disclaimer for Card Pop! +; in case player is not playing in CGB +; return carry if disclaimer was shown +ShowCardPopCGBDisclaimer: +; return if playing in CGB + ld a, [wConsole] + cp CONSOLE_CGB + ret z + + lb de, 0, 10 + lb bc, 20, 8 + call DrawRegularTextBox + lb de, 1,12 + call InitTextPrinting + ldtx hl, YouCanAccessCardPopOnlyWithGameBoyColorsText + call PrintTextNoDelay + lb bc, SYM_CURSOR_D, SYM_BOX_BOTTOM + lb de, 18, 17 + call SetCursorParametersForTextBox + call WaitForButtonAorB + scf + ret + +DrawPlayerPortraitAndPrintNewGameText: + call DisableLCD + farcall Func_10a9b + farcall Func_10000 + call Func_3ca0 + ld hl, HandleAllSpriteAnimations + call SetDoFrameFunction + lb bc, 7, 3 + farcall $4, DrawPlayerPortrait + farcall Func_10af9 + call DoFrameIfLCDEnabled + ldtx hl, IsCrazyAboutPokemonAndPokemonCardCollectingText + call PrintScrollableText_NoTextBoxLabel + call ResetDoFrameFunction + call Func_3ca0 + ret diff --git a/src/engine/menus/unknown.asm b/src/engine/menus/unknown.asm new file mode 100644 index 0000000..c6f04fa --- /dev/null +++ b/src/engine/menus/unknown.asm @@ -0,0 +1,103 @@ +Func_18661: ; unreferenced + xor a + ld [wPlaysSfx], a + ld a, [wCheckMenuCursorXPosition] + ld d, a + ld a, [wCheckMenuCursorYPosition] + ld e, a + ldh a, [hDPadHeld] + or a + jr z, .check_button +; check input from dpad + bit D_LEFT_F, a + jr nz, .left_or_right + bit D_RIGHT_F, a + jr z, .check_up_and_down +.left_or_right +; swap the lsb of x position value. + ld a, d + xor $1 + ld d, a + jr .cursor_moved + +.check_up_and_down + bit D_UP_F, a + jr nz, .up_or_down + bit D_DOWN_F, a + jr z, .check_button +.up_or_down + ld a, e + xor $1 + ld e, a +.cursor_moved + ld a, $1 + ld [wPlaysSfx], a + push de + call .draw_blank_cursor + pop de + ld a, d + ld [wCheckMenuCursorXPosition], a + ld a, e + ld [wCheckMenuCursorYPosition], a + xor a + ld [wCheckMenuCursorBlinkCounter], a +.check_button + ldh a, [hKeysPressed] + and A_BUTTON | B_BUTTON + jr z, .check_cursor_moved + and A_BUTTON + jr nz, .a_button + +; b button + ld a, -1 + call Func_190fb + scf + ret + +; a button +.a_button + call .draw_cursor + ld a, 1 + call Func_190fb + scf + ret + +.check_cursor_moved + ld a, [wPlaysSfx] + or a + jr z, .check_cursor_blink + call PlaySFX +.check_cursor_blink + ld hl, wCheckMenuCursorBlinkCounter + ld a, [hl] + inc [hl] + and %00001111 + ret nz + ld a, SYM_CURSOR_R + bit D_RIGHT_F, [hl] + jr z, .draw_tile +.draw_blank_cursor ; 186d4 (6:46d4) + ld a, SYM_SPACE +.draw_tile + ld e, a + ld a, 10 + ld l, a + ld a, [wCheckMenuCursorXPosition] + ld h, a + call HtimesL + ld a, l + add 1 + ld b, a + ld a, [wCheckMenuCursorYPosition] + sla a + add 14 + ld c, a + ld a, e + ; b = 11, c = y_pos * 2 + 14 + ; h = x_pos * 10, l = 10 + call WriteByteToBGMap0 + or a + ret +.draw_cursor ; 186f3 (6:46f3) + ld a, SYM_CURSOR_R + jr .draw_tile diff --git a/src/engine/overworld/scripting.asm b/src/engine/overworld/scripting.asm index 0010a77..79cfaa3 100644 --- a/src/engine/overworld/scripting.asm +++ b/src/engine/overworld/scripting.asm @@ -1819,7 +1819,7 @@ ScriptCommand_nop: ScriptCommand_GiveStarterDeck: ld a, [wStarterDeckChoice] - bank1call Func_7576 + bank1call AddStarterDeck jp IncreaseScriptPointerBy1 Unknown_d3dd: diff --git a/src/engine/promotional_card.asm b/src/engine/promotional_card.asm new file mode 100644 index 0000000..bb3250a --- /dev/null +++ b/src/engine/promotional_card.asm @@ -0,0 +1,61 @@ +; shows screen with the promotional card and received text +; depending on input a +; if $0 = Legendary Molters, Articuno, Zapdos and Dragonite cards +; otherwise, a card ID +_ShowPromotionalCardScreen: + push af + lb de, $38, $9f + call SetupText + pop af + or a + jr nz, .else + ld a, MOLTRES2 + call .legendary_card_text + ld a, ARTICUNO2 + call .legendary_card_text + ld a, ZAPDOS3 + call .legendary_card_text + ld a, DRAGONITE1 +.legendary_card_text + ldtx hl, ReceivedLegendaryCardText + jr .print_text +.else + ldtx hl, ReceivedCardText + cp VILEPLUME + jr z, .print_text + cp BLASTOISE + jr z, .print_text + ldtx hl, ReceivedPromotionalFlyingPikachuText + cp FLYING_PIKACHU + jr z, .print_text + ldtx hl, ReceivedPromotionalSurfingPikachuText + cp SURFING_PIKACHU1 + jr z, .print_text + cp SURFING_PIKACHU2 + jr z, .print_text + ldtx hl, ReceivedPromotionalCardText +.print_text + push hl + ld e, a + ld d, $0 + call LoadCardDataToBuffer1_FromCardID + call PauseSong + ld a, MUSIC_MEDAL + call PlaySong + ld hl, wLoadedCard1Name + ld a, [hli] + ld h, [hl] + ld l, a + bank1call LoadTxRam2 ; switch to bank 1, but call a home func + ld a, PLAYER_TURN + ldh [hWhoseTurn], a + pop hl + bank1call _DisplayCardDetailScreen +.loop + call AssertSongFinished + or a + jr nz, .loop + + call ResumeSong + bank1call OpenCardPage_FromHand + ret diff --git a/src/engine/sequences/credits_sequence_commands.asm b/src/engine/sequences/credits_sequence_commands.asm index 0fde871..d80df8b 100644 --- a/src/engine/sequences/credits_sequence_commands.asm +++ b/src/engine/sequences/credits_sequence_commands.asm @@ -300,7 +300,7 @@ CreditsSequenceCmd_DisableLCD: ; 1d9db (7:59db) CreditsSequenceCmd_FadeIn: ; 1d9e1 (7:59e1) call DisableLCD - call Set_WD_on + call SetWindowOn farcall Func_10af9 jp AdvanceCreditsSequenceCmdPtrBy2 @@ -310,7 +310,7 @@ CreditsSequenceCmd_FadeOut: ; 1d9ee (7:59ee) call EnableLCD call DoFrameIfLCDEnabled call DisableLCD - call Set_WD_off + call SetWindowOff jp AdvanceCreditsSequenceCmdPtrBy2 CreditsSequenceCmd_DrawRectangle: ; 1da04 (7:5a04) diff --git a/src/engine/sequences/opening_sequence_commands.asm b/src/engine/sequences/intro_sequence_commands.asm index 446daa2..028027b 100644 --- a/src/engine/sequences/opening_sequence_commands.asm +++ b/src/engine/sequences/intro_sequence_commands.asm @@ -1,4 +1,4 @@ -ExecuteOpeningSequenceCmd: ; 1d408 (7:5408) +ExecuteIntroSequenceCmd: ; 1d408 (7:5408) ld a, [wSequenceDelay] or a jr z, .call_function @@ -25,22 +25,22 @@ ExecuteOpeningSequenceCmd: ; 1d408 (7:5408) ld l, e ld h, d call CallHL2 - jr c, ExecuteOpeningSequenceCmd + jr c, ExecuteIntroSequenceCmd ret -AdvanceOpeningSequenceCmdPtrBy2: ; 1d42e (7:542e) +AdvanceIntroSequenceCmdPtrBy2: ; 1d42e (7:542e) ld a, 2 - jr AdvanceOpeningSequenceCmdPtr + jr AdvanceIntroSequenceCmdPtr -AdvanceOpeningSequenceCmdPtrBy3: ; 1d432 (7:5432) +AdvanceIntroSequenceCmdPtrBy3: ; 1d432 (7:5432) ld a, 3 - jr AdvanceOpeningSequenceCmdPtr + jr AdvanceIntroSequenceCmdPtr -AdvanceOpeningSequenceCmdPtrBy4: ; 1d436 (7:5436) +AdvanceIntroSequenceCmdPtrBy4: ; 1d436 (7:5436) ld a, 4 ; fallthrough -AdvanceOpeningSequenceCmdPtr: ; 1d438 (7:5438) +AdvanceIntroSequenceCmdPtr: ; 1d438 (7:5438) push hl ld hl, wSequenceCmdPtr add [hl] @@ -51,7 +51,7 @@ AdvanceOpeningSequenceCmdPtr: ; 1d438 (7:5438) pop hl ret -OpeningSequenceCmd_WaitOrbsAnimation: ; 1d444 (7:5444) +IntroSequenceCmd_WaitOrbsAnimation: ; 1d444 (7:5444) ld c, $7 ld de, wTitleScreenSprites .loop @@ -63,7 +63,7 @@ OpeningSequenceCmd_WaitOrbsAnimation: ; 1d444 (7:5444) inc de dec c jr nz, .loop - call AdvanceOpeningSequenceCmdPtrBy2 + call AdvanceIntroSequenceCmdPtrBy2 scf ret @@ -71,14 +71,14 @@ OpeningSequenceCmd_WaitOrbsAnimation: ; 1d444 (7:5444) or a ret -OpeningSequenceCmd_Wait: ; 1d460 (7:5460) +IntroSequenceCmd_Wait: ; 1d460 (7:5460) ld a, c ld [wSequenceDelay], a - call AdvanceOpeningSequenceCmdPtrBy3 + call AdvanceIntroSequenceCmdPtrBy3 scf ret -OpeningSequenceCmd_SetOrbsAnimations: ; 1d469 (7:5469) +IntroSequenceCmd_SetOrbsAnimations: ; 1d469 (7:5469) ld l, c ld h, b @@ -97,11 +97,11 @@ OpeningSequenceCmd_SetOrbsAnimations: ; 1d469 (7:5469) dec c jr nz, .loop - call AdvanceOpeningSequenceCmdPtrBy4 + call AdvanceIntroSequenceCmdPtrBy4 scf ret -OpeningSequenceCmd_SetOrbsCoordinates: ; 1d486 (7:5486) +IntroSequenceCmd_SetOrbsCoordinates: ; 1d486 (7:5486) ld l, c ld h, b @@ -131,11 +131,11 @@ OpeningSequenceCmd_SetOrbsCoordinates: ; 1d486 (7:5486) dec c jr nz, .loop - call AdvanceOpeningSequenceCmdPtrBy4 + call AdvanceIntroSequenceCmdPtrBy4 scf ret -OpeningOrbAnimations_CharizardScene: ; 1d4b0 (7:54b0) +IntroOrbAnimations_CharizardScene: ; 1d4b0 (7:54b0) db SPRITE_ANIM_192 ; GRASS db SPRITE_ANIM_193 ; FIRE db SPRITE_ANIM_193 ; WATER @@ -144,7 +144,7 @@ OpeningOrbAnimations_CharizardScene: ; 1d4b0 (7:54b0) db SPRITE_ANIM_192 ; PSYCHIC db SPRITE_ANIM_193 ; FIGHTING -OpeningOrbCoordinates_CharizardScene: ; 1d4b7 (7:54b7) +IntroOrbCoordinates_CharizardScene: ; 1d4b7 (7:54b7) ; x coord, y coord db 240, 28 ; GRASS db 160, 120 ; FIRE @@ -154,7 +154,7 @@ OpeningOrbCoordinates_CharizardScene: ; 1d4b7 (7:54b7) db 240, 100 ; PSYCHIC db 160, 44 ; FIGHTING -OpeningOrbAnimations_ScytherScene: ; 1d4c5 (7:54c5) +IntroOrbAnimations_ScytherScene: ; 1d4c5 (7:54c5) db SPRITE_ANIM_193 ; GRASS db SPRITE_ANIM_192 ; FIRE db SPRITE_ANIM_192 ; WATER @@ -163,7 +163,7 @@ OpeningOrbAnimations_ScytherScene: ; 1d4c5 (7:54c5) db SPRITE_ANIM_193 ; PSYCHIC db SPRITE_ANIM_192 ; FIGHTING -OpeningOrbCoordinates_ScytherScene: ; 1d4cc (7:54cc) +IntroOrbCoordinates_ScytherScene: ; 1d4cc (7:54cc) ; x coord, y coord db 160, 28 ; GRASS db 240, 120 ; FIRE @@ -173,7 +173,7 @@ OpeningOrbCoordinates_ScytherScene: ; 1d4cc (7:54cc) db 160, 100 ; PSYCHIC db 240, 44 ; FIGHTING -OpeningOrbAnimations_AerodactylScene: ; 1d4da (7:54da) +IntroOrbAnimations_AerodactylScene: ; 1d4da (7:54da) db SPRITE_ANIM_194 ; GRASS db SPRITE_ANIM_197 ; FIRE db SPRITE_ANIM_200 ; WATER @@ -182,7 +182,7 @@ OpeningOrbAnimations_AerodactylScene: ; 1d4da (7:54da) db SPRITE_ANIM_209 ; PSYCHIC db SPRITE_ANIM_212 ; FIGHTING -OpeningOrbCoordinates_AerodactylScene: ; 1d4e1 (7:54e1) +IntroOrbCoordinates_AerodactylScene: ; 1d4e1 (7:54e1) ; x coord, y coord db 240, 32 ; GRASS db 160, 112 ; FIRE @@ -192,7 +192,7 @@ OpeningOrbCoordinates_AerodactylScene: ; 1d4e1 (7:54e1) db 240, 96 ; PSYCHIC db 160, 48 ; FIGHTING -OpeningOrbAnimations_InitialTitleScreen: ; 1d4ef (7:54ef) +IntroOrbAnimations_InitialTitleScreen: ; 1d4ef (7:54ef) db SPRITE_ANIM_195 ; GRASS db SPRITE_ANIM_198 ; FIRE db SPRITE_ANIM_201 ; WATER @@ -201,7 +201,7 @@ OpeningOrbAnimations_InitialTitleScreen: ; 1d4ef (7:54ef) db SPRITE_ANIM_210 ; PSYCHIC db SPRITE_ANIM_213 ; FIGHTING -OpeningOrbCoordinates_InitialTitleScreen: ; 1d4f6 (7:54f6) +IntroOrbCoordinates_InitialTitleScreen: ; 1d4f6 (7:54f6) ; x coord, y coord db 112, 144 ; GRASS db 12, 144 ; FIRE @@ -211,7 +211,7 @@ OpeningOrbCoordinates_InitialTitleScreen: ; 1d4f6 (7:54f6) db 132, 144 ; PSYCHIC db 72, 144 ; FIGHTING -OpeningOrbAnimations_InTitleScreen: ; 1d504 (7:5504) +IntroOrbAnimations_InTitleScreen: ; 1d504 (7:5504) db SPRITE_ANIM_196 ; GRASS db SPRITE_ANIM_199 ; FIRE db SPRITE_ANIM_202 ; WATER @@ -220,7 +220,7 @@ OpeningOrbAnimations_InTitleScreen: ; 1d504 (7:5504) db SPRITE_ANIM_211 ; PSYCHIC db SPRITE_ANIM_214 ; FIGHTING -OpeningOrbCoordinates_InTitleScreen: ; 1d50b (7:550b) +IntroOrbCoordinates_InTitleScreen: ; 1d50b (7:550b) ; x coord, y coord db 112, 76 ; GRASS db 0, 28 ; FIRE @@ -230,18 +230,18 @@ OpeningOrbCoordinates_InTitleScreen: ; 1d50b (7:550b) db 144, 28 ; PSYCHIC db 72, 76 ; FIGHTING -OpeningSequenceCmd_PlayTitleScreenMusic: ; 1d519 (7:5519) +IntroSequenceCmd_PlayTitleScreenMusic: ; 1d519 (7:5519) ld a, MUSIC_TITLESCREEN call PlaySong - call AdvanceOpeningSequenceCmdPtrBy2 + call AdvanceIntroSequenceCmdPtrBy2 scf ret -OpeningSequenceCmd_WaitSFX: ; 1d523 (7:5523) +IntroSequenceCmd_WaitSFX: ; 1d523 (7:5523) call AssertSFXFinished or a jr nz, .no_carry - call AdvanceOpeningSequenceCmdPtrBy2 + call AdvanceIntroSequenceCmdPtrBy2 scf ret @@ -249,39 +249,39 @@ OpeningSequenceCmd_WaitSFX: ; 1d523 (7:5523) or a ret -OpeningSequenceCmd_PlaySFX: ; 1d530 (7:5530) +IntroSequenceCmd_PlaySFX: ; 1d530 (7:5530) ld a, c call PlaySFX - call AdvanceOpeningSequenceCmdPtrBy3 + call AdvanceIntroSequenceCmdPtrBy3 scf ret -OpeningSequenceCmd_FadeIn: ; 1d539 (7:5539) +IntroSequenceCmd_FadeIn: ; 1d539 (7:5539) ld a, TRUE - ld [wOpeningSequencePalsNeedUpdate], a - call AdvanceOpeningSequenceCmdPtrBy2 + ld [wIntroSequencePalsNeedUpdate], a + call AdvanceIntroSequenceCmdPtrBy2 scf ret -OpeningSequenceCmd_FadeOut: ; 1d543 (7:5543) +IntroSequenceCmd_FadeOut: ; 1d543 (7:5543) farcall Func_10d50 ld a, TRUE - ld [wOpeningSequencePalsNeedUpdate], a - call AdvanceOpeningSequenceCmdPtrBy2 + ld [wIntroSequencePalsNeedUpdate], a + call AdvanceIntroSequenceCmdPtrBy2 scf ret -OpeningSequenceCmd_LoadCharizardScene: ; 1d551 (7:5551) +IntroSequenceCmd_LoadCharizardScene: ; 1d551 (7:5551) lb bc, 6, 3 ld a, SCENE_CHARIZARD_INTRO jr LoadOpeningSceneAndUpdateSGBBorder -OpeningSequenceCmd_LoadScytherScene: ; 1d558 (7:5558) +IntroSequenceCmd_LoadScytherScene: ; 1d558 (7:5558) lb bc, 6, 3 ld a, SCENE_SCYTHER_INTRO jr LoadOpeningSceneAndUpdateSGBBorder -OpeningSequenceCmd_LoadAerodactylScene: ; 1d55f (7:555f) +IntroSequenceCmd_LoadAerodactylScene: ; 1d55f (7:555f) lb bc, 6, 3 ld a, SCENE_AERODACTYL_INTRO ; fallthrough @@ -295,11 +295,11 @@ LoadOpeningSceneAndUpdateSGBBorder: ; 1d564 (7:5564) scf ret -OpeningSequenceCmd_LoadTitleScreenScene: ; 1d575 (7:5575) +IntroSequenceCmd_LoadTitleScreenScene: ; 1d575 (7:5575) lb bc, 0, 0 ld a, SCENE_TITLE_SCREEN call LoadOpeningScene - call OpeningSequenceEmptyFunc + call IntroSequenceEmptyFunc scf ret @@ -316,10 +316,77 @@ LoadOpeningScene: ; 1d582 (7:5582) farcall Func_10d17 xor a - ld [wOpeningSequencePalsNeedUpdate], a - call AdvanceOpeningSequenceCmdPtrBy2 + ld [wIntroSequencePalsNeedUpdate], a + call AdvanceIntroSequenceCmdPtrBy2 call EnableLCD ret -OpeningSequenceEmptyFunc: ; 1d59c (7:559c) +IntroSequenceEmptyFunc: ; 1d59c (7:559c) + ret + +INCLUDE "data/sequences/intro.asm" + +; once every 63 frames randomly choose an orb sprite +; to animate, i.e. circle around the screen +AnimateRandomTitleScreenOrb: + ld a, [wConsole] + cp CONSOLE_CGB + call z, .UpdateSpriteAttributes + ld a, [wd635] + and 63 + ret nz ; don't pick an orb now + +.pick_orb + ld a, $7 + call Random + ld c, a + ld b, $00 + ld hl, wTitleScreenSprites + add hl, bc + ld a, [hl] + ld [wWhichSprite], a + farcall GetSpriteAnimCounter + cp $ff + jr nz, .pick_orb + + ld c, SPRITE_ANIM_ATTRIBUTES + call GetSpriteAnimBufferProperty + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .set_coords + set SPRITE_ANIM_FLAG_UNSKIPPABLE, [hl] + +.set_coords + inc hl + ld a, 248 + ld [hli], a ; SPRITE_ANIM_COORD_X + ld a, 14 + ld [hl], a ; SPRITE_ANIM_COORD_Y + ld a, [wConsole] + cp CONSOLE_CGB + ld a, SPRITE_ANIM_215 + jr nz, .start_anim + ld a, SPRITE_ANIM_216 +.start_anim + farcall StartSpriteAnimation + ret + +.UpdateSpriteAttributes + ld c, $7 + ld de, wTitleScreenSprites +.loop_orbs + push bc + ld a, [de] + ld [wWhichSprite], a + ld c, SPRITE_ANIM_COORD_X + call GetSpriteAnimBufferProperty + ld a, [hld] + cp 152 + jr nz, .skip + res SPRITE_ANIM_FLAG_UNSKIPPABLE, [hl] +.skip + pop bc + inc de + dec c + jr nz, .loop_orbs ret diff --git a/src/engine/bank1c.asm b/src/engine/sgb.asm index d32928a..288dc45 100644 --- a/src/engine/bank1c.asm +++ b/src/engine/sgb.asm @@ -1,4 +1,4 @@ -SetMainSGBBorder: ; 70000 (1c:4000) +SetMainSGBBorder: ld a, [wConsole] cp CONSOLE_SGB ret nz ; exit if not SGB @@ -13,7 +13,7 @@ SetMainSGBBorder: ; 70000 (1c:4000) call SetSGBBorder ret -SetIntroSGBBorder: ; 70018 (1c:4018) +SetIntroSGBBorder: ld a, [wConsole] cp CONSOLE_SGB ret nz ; exit if not SGB @@ -21,13 +21,13 @@ SetIntroSGBBorder: ; 70018 (1c:4018) call SetSGBBorder ret -AtrcEnPacket_Disable: ; 70024 (1c:4024) +AtrcEnPacket_Disable: sgb ATRC_EN, 1 ; sgb_command, length db 1 ds $0e ; disable Controller Set-up Screen -IconEnPacket: ; 70034 (1c:4034) +IconEnPacket: sgb ICON_EN, 3 ; sgb_command, length db $01 ds $0e @@ -37,7 +37,7 @@ IconEnPacket: ; 70034 (1c:4034) ; $1 = medals (gold) ; $2 = medals (blue) ; $3 = debug -SetSGBBorder: ; 70044 (1c:4044) +SetSGBBorder: push hl push bc add a ; *2 @@ -62,7 +62,7 @@ SetSGBBorder: ; 70044 (1c:4044) ; forces SGB border intro ; unreferenced? -Func_7006f: ; 7006f (1c:406f) +Func_7006f: ld a, [wConsole] cp CONSOLE_SGB ret nz ; exit if not SGB @@ -72,7 +72,7 @@ Func_7006f: ; 7006f (1c:406f) call Func_701c0 ret -DecompressAndSendSGBBorder: ; 70082 (1c:4082) +DecompressAndSendSGBBorder: ld a, [wConsole] cp CONSOLE_SGB ret nz ; exit if not SGB @@ -99,7 +99,7 @@ DecompressAndSendSGBBorder: ; 70082 (1c:4082) pop hl ret -Func_700a3: ; 700a3 (1c:40a3) +Func_700a3: push hl push bc push de @@ -139,20 +139,20 @@ Func_700a3: ; 700a3 (1c:40a3) ret ; CHR_TRN: tiles $00-$7F, BG (border) tiles (from SNES $000-$FFF) -ChrTrnPacket_BGTiles1: ; 700de (1c:40de) +ChrTrnPacket_BGTiles1: sgb CHR_TRN, 1 ; sgb_command, length db 0 ds $0e ; CHR_TRN: tiles $80-$FF, BG (border) tiles (from SNES $000-$FFF) -ChrTrnPacket_BGTiles2: ; 700ee (1c:40ee) +ChrTrnPacket_BGTiles2: sgb CHR_TRN, 1 ; sgb_command, length db 1 ds $0e ; de = pals ; hl = map -SetMainSGBBorderPalsAndMap: ; 700fe (1c:40fe) +SetMainSGBBorderPalsAndMap: push hl push bc push de @@ -179,11 +179,11 @@ SetMainSGBBorderPalsAndMap: ; 700fe (1c:40fe) ret ; PCT_TRN: read tile map & palette data into VRAM (from SNES $000-$87F) -PctTrnPacket: ; 70126 (1c:4126) +PctTrnPacket: sgb PCT_TRN, 1 ; sgb_command, length ds $0f -Func_70136: ; 70136 (1c:4136) +Func_70136: push hl push bc push de @@ -218,7 +218,7 @@ Func_70136: ; 70136 (1c:4136) pop hl ret -SendSGBBorder: ; 70177 (1c:4177) +SendSGBBorder: push hl push bc push de @@ -242,18 +242,18 @@ SendSGBBorder: ; 70177 (1c:4177) ret ; MASK_EN on -MaskEnPacket_Freeze_Bank1c: ; 701a0 (1c:41a0) +MaskEnPacket_Freeze_Bank1c: sgb MASK_EN, 1 ; sgb_command, length db MASK_EN_FREEZE_SCREEN ds $0e ; MASK_EN off -MaskEnPacket_Cancel_Bank1c: ; 701b0 (1c:41b0) +MaskEnPacket_Cancel_Bank1c: sgb MASK_EN, 1 ; sgb_command, length db MASK_EN_CANCEL_MASK ds $0e -Func_701c0: ; 701c0 (1c:41c0) +Func_701c0: push hl push bc call DisableLCD @@ -280,7 +280,7 @@ Func_701c0: ; 701c0 (1c:41c0) ret ; decompresses data pointed by hl to de -DecompressSGBData: ; 701e9 (1c:41e9) +DecompressSGBData: ld a, [hli] ld c, a ld a, [hli] @@ -300,7 +300,7 @@ DecompressSGBData: ; 701e9 (1c:41e9) ; fills a 20x13 rectangle in v0BGMap0 ; with values ascending bytes starting at $80 -PrepareBGMapForSendingSGBBorder: ; 701fe (1c:41fe) +PrepareBGMapForSendingSGBBorder: ld hl, v0BGMap0 ld de, $000c ld a, $80 @@ -319,7 +319,7 @@ PrepareBGMapForSendingSGBBorder: ; 701fe (1c:41fe) ; iterates all the medals obtained by the player ; and fills the corresponding medal slot in the SGB border -FillSGBBorderMedalSlots: ; 70214 (1c:4214) +FillSGBBorderMedalSlots: ; exit if not SGBData_BorderMedals5 ld a, l cp LOW(SGBData_BorderMedals5) @@ -463,7 +463,7 @@ ENDM ; decompresses palette data depending on wCurMapSGBPals ; then sends it as SGB packet -SetSGB2AndSGB3MapPalette: ; 7036a (1c:436a) +SetSGB2AndSGB3MapPalette: ld a, [wConsole] cp CONSOLE_SGB ret nz ; return if not SGB @@ -520,7 +520,7 @@ SetSGB2AndSGB3MapPalette: ; 7036a (1c:436a) dw SGBData_MapPals9 ; MAP_SGB_PALS_9 dw SGBData_MapPals10 ; MAP_SGB_PALS_10 -Func_703cb: ; 703cb (1c:43cb) +Func_703cb: ld a, [wConsole] cp CONSOLE_SGB ret nz @@ -548,7 +548,7 @@ Func_703cb: ; 703cb (1c:43cb) pop hl ret -DecompressSGBPalette: ; 70403 (1c:4403) +DecompressSGBPalette: push hl push bc push de @@ -570,7 +570,7 @@ DecompressSGBPalette: ; 70403 (1c:4403) ret ; sends an SGB packet related with palettes -Func_7041d: ; 7041d (1c:441d) +Func_7041d: ld a, [wConsole] cp CONSOLE_SGB ret nz ; exit if not SGB @@ -653,7 +653,7 @@ Func_7041d: ; 7041d (1c:441d) ; d = block width ; e = block height ; l = %00xxyyzz, palette number for: outside block, block border, inside block -Func_70498: ; 70498 (1c:4498) +Func_70498: ld a, [wConsole] cp CONSOLE_SGB ret nz @@ -693,7 +693,7 @@ Func_70498: ; 70498 (1c:4498) ; set color 0 to default white rgb(28, 28, 24) ; input: ; hl = pointer to start of SGB packet -Func_704c7: ; 704c7 (1c:44c7) +Func_704c7: push af push hl inc hl @@ -705,318 +705,318 @@ Func_704c7: ; 704c7 (1c:44c7) pop af ret -SGBData_BorderDebug4: ; 704d3 (1c:44d3) +SGBData_BorderDebug4: dw $800 ; length INCBIN "data/sgb_data/border_debug_4.bin" -SGBData_BorderIntro4: ; 706dd (1c:46dd) +SGBData_BorderIntro4: dw $800 ; length INCBIN "data/sgb_data/border_intro_4.bin" -SGBData_BorderMedals5: ; 709dc (1c:49dc) +SGBData_BorderMedals5: dw $800 ; length INCBIN "data/sgb_data/border_medals_5.bin" -SGBBorderDebugGfxPointers: ; 70b96 (1c:4b96) +SGBBorderDebugGfxPointers: dw SGBData_BorderDebug1 dw SGBData_BorderDebug2 -SGBData_BorderDebug1: ; 70b9a (1c:45b9a) +SGBData_BorderDebug1: dw $1000 ; length INCBIN "data/sgb_data/border_debug_1.bin" -SGBData_BorderDebug2: ; 71359 (1c:5359) +SGBData_BorderDebug2: dw $a0 ; length INCBIN "data/sgb_data/border_debug_2.bin" -SGBBorderIntroGfxPointers: ; 713a9 (1c:53a9) +SGBBorderIntroGfxPointers: dw SGBData_BorderIntro1 dw SGBData_BorderIntro2 -SGBData_BorderIntro1: ; 713ad (1c:53ad) +SGBData_BorderIntro1: dw $1000 ; length INCBIN "data/sgb_data/border_intro_1.bin" -SGBData_BorderIntro2: ; 71ec0 (1c:5ec0) +SGBData_BorderIntro2: dw $4e0 ; length INCBIN "data/sgb_data/border_intro_2.bin" -SGBBorderMedalsGfxPointers: ; 72273 (1c:6273) +SGBBorderMedalsGfxPointers: dw SGBData_BorderMedals1 dw SGBData_BorderMedals2 -SGBData_BorderMedals1: ; 72277 (1c:5277) +SGBData_BorderMedals1: dw $1000 ; length INCBIN "data/sgb_data/border_medals_1.bin" -SGBData_BorderMedals2: ; 72fe4 (1c:5fe4) +SGBData_BorderMedals2: dw $100 ; length INCBIN "data/sgb_data/border_medals_2.bin" -SGBData_BorderDebug3: ; 730de (1c:70de) +SGBData_BorderDebug3: dw $60 ; length INCBIN "data/sgb_data/border_debug_3.bin" -SGBData_BorderIntro3: ; 73146 (1c:7146) +SGBData_BorderIntro3: dw $60 ; length INCBIN "data/sgb_data/border_intro_3.bin" -SGBData_BorderMedals3: ; 7319a (1c:719a) +SGBData_BorderMedals3: dw $60 ; length INCBIN "data/sgb_data/border_medals_3.bin" -SGBData_BorderMedals4: ; 731e5 (1c:71e5) +SGBData_BorderMedals4: dw $60 ; length INCBIN "data/sgb_data/border_medals_4.bin" -SGBData_MapPals1: ; 7322f (1c:722f) +SGBData_MapPals1: dw $20 ; length INCBIN "data/sgb_data/map_pals_1.bin" -SGBData_MapPals2: ; 73253 (1c:7253) +SGBData_MapPals2: dw $20 ; length INCBIN "data/sgb_data/map_pals_2.bin" -SGBData_MapPals3: ; 73277 (1c:7277) +SGBData_MapPals3: dw $20 ; length INCBIN "data/sgb_data/map_pals_3.bin" -SGBData_MapPals4: ; 7329a (1c:729a) +SGBData_MapPals4: dw $20 ; length INCBIN "data/sgb_data/map_pals_4.bin" -SGBData_MapPals5: ; 732bd (1c:72bd) +SGBData_MapPals5: dw $20 ; length INCBIN "data/sgb_data/map_pals_5.bin" -SGBData_MapPals6: ; 732e0 (1c:72e0) +SGBData_MapPals6: dw $20 ; length INCBIN "data/sgb_data/map_pals_6.bin" -SGBData_MapPals7: ; 73304 (1c:7304) +SGBData_MapPals7: dw $20 ; length INCBIN "data/sgb_data/map_pals_7.bin" -SGBData_MapPals8: ; 73328 (1c:7328) +SGBData_MapPals8: dw $20 ; length INCBIN "data/sgb_data/map_pals_8.bin" -SGBData_MapPals9: ; 7334b (1c:734b) +SGBData_MapPals9: dw $20 ; length INCBIN "data/sgb_data/map_pals_9.bin" -SGBData_MapPals10: ; 7336f (1c:736f) +SGBData_MapPals10: dw $20 ; length INCBIN "data/sgb_data/map_pals_10.bin" -SGBData_CharizardIntro: ; 73393 (1c:7393) +SGBData_CharizardIntro: dw $20 ; length INCBIN "data/sgb_data/charizard_intro_pals.bin" -SGBData_ScytherIntro: ; 733b8 (1c:73b8) +SGBData_ScytherIntro: dw $20 ; length INCBIN "data/sgb_data/scyther_intro_pals.bin" -SGBData_AerodactylIntro: ; 733dd (1c:73dd) +SGBData_AerodactylIntro: dw $20 ; length INCBIN "data/sgb_data/aerodactyl_intro_pals.bin" -SGBData_ColosseumBooster: ; 73402 (1c:7402) +SGBData_ColosseumBooster: dw $20 ; length INCBIN "data/sgb_data/colosseum_booster_pals.bin" -SGBData_EvolutionBooster: ; 73427 (1c:7427) +SGBData_EvolutionBooster: dw $20 ; length INCBIN "data/sgb_data/evolution_booster_pals.bin" -SGBData_MysteryBooster: ; 7344c (1c:744c) +SGBData_MysteryBooster: dw $20 ; length INCBIN "data/sgb_data/mystery_booster_pals.bin" -SGBData_LaboratoryBooster: ; 73471 (1c:7471) +SGBData_LaboratoryBooster: dw $20 ; length INCBIN "data/sgb_data/laboratory_booster_pals.bin" -SGBData_PlayerPortraitPals: ; 73496 (1c:7496) +SGBData_PlayerPortraitPals: dw $20 ; length INCBIN "data/sgb_data/player_pals.bin" -SGBData_LinkOpponentPortraitPals: ; 734bb (1c:74bb) +SGBData_LinkOpponentPortraitPals: dw $20 ; length INCBIN "data/sgb_data/link_opponent_pals.bin" -SGBData_RonaldPortraitPals: ; 734e0 (1c:74e0) +SGBData_RonaldPortraitPals: dw $20 ; length INCBIN "data/sgb_data/ronald_pals.bin" -SGBData_SamPortraitPals: ; 73505 (1c:7505) +SGBData_SamPortraitPals: dw $20 ; length INCBIN "data/sgb_data/sam_pals.bin" -SGBData_ImakuniPortraitPals: ; 7352a (1c:752a) +SGBData_ImakuniPortraitPals: dw $20 ; length INCBIN "data/sgb_data/imakuni_pals.bin" -SGBData_NikkiPortraitPals: ; 7354f (1c:754f) +SGBData_NikkiPortraitPals: dw $20 ; length INCBIN "data/sgb_data/nikki_pals.bin" -SGBData_RickPortraitPals: ; 73574 (1c:7574) +SGBData_RickPortraitPals: dw $20 ; length INCBIN "data/sgb_data/rick_pals.bin" -SGBData_KenPortraitPals: ; 73599 (1c:7599) +SGBData_KenPortraitPals: dw $20 ; length INCBIN "data/sgb_data/ken_pals.bin" -SGBData_AmyPortraitPals: ; 735be (1c:75be) +SGBData_AmyPortraitPals: dw $20 ; length INCBIN "data/sgb_data/amy_pals.bin" -SGBData_IsaacPortraitPals: ; 735e3 (1c:75e3) +SGBData_IsaacPortraitPals: dw $20 ; length INCBIN "data/sgb_data/isaac_pals.bin" -SGBData_MitchPortraitPals: ; 73608 (1c:7608) +SGBData_MitchPortraitPals: dw $20 ; length INCBIN "data/sgb_data/mitch_pals.bin" -SGBData_GenePortraitPals: ; 7362d (1c:762d) +SGBData_GenePortraitPals: dw $20 ; length INCBIN "data/sgb_data/gene_pals.bin" -SGBData_MurrayPortraitPals: ; 73652 (1c:7652) +SGBData_MurrayPortraitPals: dw $20 ; length INCBIN "data/sgb_data/murray_pals.bin" -SGBData_CourtneyPortraitPals: ; 73677 (1c:7677) +SGBData_CourtneyPortraitPals: dw $20 ; length INCBIN "data/sgb_data/courtney_pals.bin" -SGBData_StevePortraitPals: ; 7369c (1c:769c) +SGBData_StevePortraitPals: dw $20 ; length INCBIN "data/sgb_data/steve_pals.bin" -SGBData_JackPortraitPals: ; 736c1 (1c:76c1) +SGBData_JackPortraitPals: dw $20 ; length INCBIN "data/sgb_data/jack_pals.bin" -SGBData_RodPortraitPals: ; 736e6 (1c:76e6) +SGBData_RodPortraitPals: dw $20 ; length INCBIN "data/sgb_data/rod_pals.bin" -SGBData_JosephPortraitPals: ; 7370b (1c:770b) +SGBData_JosephPortraitPals: dw $20 ; length INCBIN "data/sgb_data/joseph_pals.bin" -SGBData_DavidPortraitPals: ; 73730 (1c:7730) +SGBData_DavidPortraitPals: dw $20 ; length INCBIN "data/sgb_data/david_pals.bin" -SGBData_ErikPortraitPals: ; 73755 (1c:7755) +SGBData_ErikPortraitPals: dw $20 ; length INCBIN "data/sgb_data/erik_pals.bin" -SGBData_JohnPortraitPals: ; 7377a (1c:777a) +SGBData_JohnPortraitPals: dw $20 ; length INCBIN "data/sgb_data/john_pals.bin" -SGBData_AdamPortraitPals: ; 7379f (1c:779f) +SGBData_AdamPortraitPals: dw $20 ; length INCBIN "data/sgb_data/adam_pals.bin" -SGBData_JonathanPortraitPals: ; 737c4 (1c:77c4) +SGBData_JonathanPortraitPals: dw $20 ; length INCBIN "data/sgb_data/jonathan_pals.bin" -SGBData_JoshuaPortraitPals: ; 737e9 (1c:77e9) +SGBData_JoshuaPortraitPals: dw $20 ; length INCBIN "data/sgb_data/joshua_pals.bin" -SGBData_NicholasPortraitPals: ; 7380e (1c:780e) +SGBData_NicholasPortraitPals: dw $20 ; length INCBIN "data/sgb_data/nicholas_pals.bin" -SGBData_BrandonPortraitPals: ; 73833 (1c:7833) +SGBData_BrandonPortraitPals: dw $20 ; length INCBIN "data/sgb_data/brandon_pals.bin" -SGBData_MatthewPortraitPals: ; 73858 (1c:7858) +SGBData_MatthewPortraitPals: dw $20 ; length INCBIN "data/sgb_data/matthew_pals.bin" -SGBData_RyanPortraitPals: ; 7387d (1c:787d) +SGBData_RyanPortraitPals: dw $20 ; length INCBIN "data/sgb_data/ryan_pals.bin" -SGBData_AndrewPortraitPals: ; 738a2 (1c:78a2) +SGBData_AndrewPortraitPals: dw $20 ; length INCBIN "data/sgb_data/andrew_pals.bin" -SGBData_ChrisPortraitPals: ; 738c7 (1c:78c7) +SGBData_ChrisPortraitPals: dw $20 ; length INCBIN "data/sgb_data/chris_pals.bin" -SGBData_MichaelPortraitPals: ; 738ec (1c:78ec) +SGBData_MichaelPortraitPals: dw $20 ; length INCBIN "data/sgb_data/michael_pals.bin" -SGBData_DanielPortraitPals: ; 73911 (1c:7911) +SGBData_DanielPortraitPals: dw $20 ; length INCBIN "data/sgb_data/daniel_pals.bin" -SGBData_RobertPortraitPals: ; 73936 (1c:7936) +SGBData_RobertPortraitPals: dw $20 ; length INCBIN "data/sgb_data/robert_pals.bin" -SGBData_BrittanyPortraitPals: ; 7395b (1c:795b) +SGBData_BrittanyPortraitPals: dw $20 ; length INCBIN "data/sgb_data/brittany_pals.bin" -SGBData_KristinPortraitPals: ; 73980 (1c:7980) +SGBData_KristinPortraitPals: dw $20 ; length INCBIN "data/sgb_data/kristin_pals.bin" -SGBData_HeatherPortraitPals: ; 739a5 (1c:79a5) +SGBData_HeatherPortraitPals: dw $20 ; length INCBIN "data/sgb_data/heather_pals.bin" -SGBData_SaraPortraitPals: ; 739ca (1c:79ca) +SGBData_SaraPortraitPals: dw $20 ; length INCBIN "data/sgb_data/sara_pals.bin" -SGBData_AmandaPortraitPals: ; 739ef (1c:79ef) +SGBData_AmandaPortraitPals: dw $20 ; length INCBIN "data/sgb_data/amanda_pals.bin" -SGBData_JenniferPortraitPals: ; 73a14 (1c:7a14) +SGBData_JenniferPortraitPals: dw $20 ; length INCBIN "data/sgb_data/jennifer_pals.bin" -SGBData_JessicaPortraitPals: ; 73a39 (1c:7a39) +SGBData_JessicaPortraitPals: dw $20 ; length INCBIN "data/sgb_data/jessica_pals.bin" -SGBData_StephaniePortraitPals: ; 73a5e (1c:7a5e) +SGBData_StephaniePortraitPals: dw $20 ; length INCBIN "data/sgb_data/stephanie_pals.bin" -SGBData_AaronPortraitPals: ; 73a83 (1c:7a83) +SGBData_AaronPortraitPals: dw $20 ; length INCBIN "data/sgb_data/aaron_pals.bin" -SGBData_GameBoyLink: ; 73aa8 (1c:7aa8) +SGBData_GameBoyLink: dw $40 ; length INCBIN "data/sgb_data/gameboy_link_pals.bin" -SGBData_CardPop: ; 73ad8 (1c:7ad8) +SGBData_CardPop: dw $40 ; length INCBIN "data/sgb_data/card_pop_pals.bin" -SGBData_GameBoyPrinter: ; 73b05 (1c:7b05) +SGBData_GameBoyPrinter: dw $40 ; length INCBIN "data/sgb_data/gameboy_printer_pals.bin" -SGBData_TitleScreen: ; 73b33 (1c:7b33) +SGBData_TitleScreen: dw $40 ; length INCBIN "data/sgb_data/title_screen_pals.bin" diff --git a/src/engine/starter_deck.asm b/src/engine/starter_deck.asm new file mode 100644 index 0000000..0500b4a --- /dev/null +++ b/src/engine/starter_deck.asm @@ -0,0 +1,182 @@ +; adds the chosen starter deck to the player's first deck configuration +; and also adds to the collection its corresponding extra cards +; input: +; - a = starter deck chosen +; $0 = Charmander +; $1 = Squirtle +; $2 = Bulbasaur +_AddStarterDeck: + add a + ld e, a + ld d, 0 + ld hl, .StarterCardIDs + add hl, de + ld a, PLAYER_TURN + ldh [hWhoseTurn], a + ld a, [hli] ; main deck + add 2 + push hl + ld hl, sDeck1 + call CopyDeckNameAndCards + pop hl + call SwapTurn + ld a, [hli] ; extra deck + add 2 + call LoadDeck + call SwapTurn + +; wPlayerDeck = main starter deck +; wOpponentDeck = extra cards + call EnableSRAM + ld h, HIGH(sCardCollection) + ld de, wPlayerDeck + ld c, DECK_SIZE +.loop_main_cards + ld a, [de] + inc de + ld l, a + res CARD_NOT_OWNED_F, [hl] + dec c + jr nz, .loop_main_cards + + ld h, HIGH(sCardCollection) + ld de, wOpponentDeck + ld c, 30 ; number of extra cards +.loop_extra_cards + ld a, [de] + inc de + ld l, a + res CARD_NOT_OWNED_F, [hl] + inc [hl] + dec c + jr nz, .loop_extra_cards + call DisableSRAM + ret + +.StarterCardIDs + ; main deck, extra cards + db CHARMANDER_AND_FRIENDS_DECK_ID, CHARMANDER_EXTRA_DECK_ID + db SQUIRTLE_AND_FRIENDS_DECK_ID, SQUIRTLE_EXTRA_DECK_ID + db BULBASAUR_AND_FRIENDS_DECK_ID, BULBASAUR_EXTRA_DECK_ID + +; clears saved data (card Collection/saved decks/Card Pop! data/etc) +; then adds the starter decks as saved decks +; marks all cards in Collection as not owned +InitSaveData: +; clear card and deck save data + call EnableSRAM + ld a, PLAYER_TURN + ldh [hWhoseTurn], a + ld hl, sCardAndDeckSaveData + ld bc, sCardAndDeckSaveDataEnd - sCardAndDeckSaveData +.loop_clear + xor a + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop_clear + +; add the starter decks + ld a, CHARMANDER_AND_FRIENDS_DECK + ld hl, sSavedDeck1 + call CopyDeckNameAndCards + ld a, SQUIRTLE_AND_FRIENDS_DECK + ld hl, sSavedDeck2 + call CopyDeckNameAndCards + ld a, BULBASAUR_AND_FRIENDS_DECK + ld hl, sSavedDeck3 + call CopyDeckNameAndCards + +; marks all cards in Collection to not owned + call EnableSRAM + ld hl, sCardCollection + ld a, CARD_NOT_OWNED +.loop_collection + ld [hl], a + inc l + jr nz, .loop_collection + + ld hl, sCurrentDuel + xor a + ld [hli], a + ld [hli], a ; sCurrentDuelChecksum + ld [hl], a + +; clears Card Pop! names + ld hl, sCardPopNameList + ld c, CARDPOP_NAME_LIST_MAX_ELEMS +.loop_card_pop_names + ld [hl], $0 + ld de, NAME_BUFFER_LENGTH + add hl, de + dec c + jr nz, .loop_card_pop_names + +; saved configuration options + ld a, 2 + ld [sPrinterContrastLevel], a + ld a, $2 + ld [sTextSpeed], a + ld [wTextSpeed], a + +; miscellaneous data + xor a + ld [sAnimationsDisabled], a + ld [sSkipDelayAllowed], a + ld [s0a004], a + ld [sTotalCardPopsDone], a + ld [sReceivedLegendaryCards], a + farcall InitPromotionalCardAndDeckCounterSaveData + call DisableSRAM + ret + +; input: +; a = Deck ID +; hl = destination to copy +CopyDeckNameAndCards: + push de + push bc + push hl + call LoadDeck + jr c, .done + call .CopyDeckName + pop hl + call EnableSRAM + push hl + ld de, wDefaultText +.loop_write_name + ld a, [de] + inc de + ld [hli], a + or a + jr nz, .loop_write_name + pop hl + + push hl + ld de, DECK_NAME_SIZE + add hl, de + ld de, wPlayerDeck + ld c, DECK_SIZE +.loop_write_cards + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .loop_write_cards + call DisableSRAM + or a +.done + pop hl + pop bc + pop de + ret + +.CopyDeckName + ld hl, wDeckName + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wDefaultText + call CopyText + ret diff --git a/src/engine/unused_copyright.asm b/src/engine/unused_copyright.asm new file mode 100644 index 0000000..31a489b --- /dev/null +++ b/src/engine/unused_copyright.asm @@ -0,0 +1,26 @@ +; shows Copyright information for 300 frames +; or until Start button is pressed +UnusedCopyrightScreen: ; unreferenced + call DisableLCD + farcall Func_10a9b + farcall Func_10000 + ld bc, $0 + ld a, SCENE_COPYRIGHT + call LoadScene + farcall Func_10af9 + ld bc, 300 +.loop_frame + push bc + call DoFrameIfLCDEnabled + call UpdateRNGSources + pop bc + ldh a, [hKeysPressed] + and START + jr nz, .exit + dec bc + ld a, b + or c + jr nz, .loop_frame +.exit + farcall Func_10ab4 + ret diff --git a/src/engine/unused_save_validation.asm b/src/engine/unused_save_validation.asm new file mode 100644 index 0000000..f26bbcb --- /dev/null +++ b/src/engine/unused_save_validation.asm @@ -0,0 +1,96 @@ +; this is a commented out routine for save data validation +; sUnusedSaveDataValidationByte would be used to store some validation byte +; and xor'd with $250 bytes in SRAM starting from sCardCollection +; if the result wasn't 0, then it would mean there was +; some save corruption and an error message would pop up +StubbedUnusedSaveDataValidation: + ret + +UnusedSaveDataValidation: ; unreferenced + ldh a, [hBankSRAM] + or a + ret nz + + push hl + push de + push bc + ld hl, sCardCollection + ld bc, $250 + ld a, [sUnusedSaveDataValidationByte] + ld e, a +.loop_xor + ld a, [hli] + xor e + ld e, a + dec bc + ld a, c + or b + jr nz, .loop_xor + ld a, e + pop bc + pop de + pop hl + or a + ret z + + xor a + ld [wTileMapFill], a + ld hl, wDoFrameFunction + ld [hli], a + ld [hl], a + ldh [hSCX], a + ldh [hSCY], a + bank1call ZeroObjectPositionsAndToggleOAMCopy + call EmptyScreen + call LoadSymbolsFont + bank1call SetDefaultPalettes + ld a, [wConsole] + cp CONSOLE_SGB + jr nz, .not_sgb + ld a, $e4 + ld [wOBP0], a + ld [wBGP], a + ld a, $01 + ld [wFlushPaletteFlags], a +.not_sgb + lb de, $38, $9f + call SetupText + ldtx hl, YourDataWasDestroyedSomehowText + bank1call DrawWholeScreenTextBox + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + xor a + ldh [hBankSRAM], a + ld [MBC3SRamBank], a + ld [MBC3RTC], a + ld [MBC3SRamEnable], a + jp Reset + + ret + +UnusedCalculateSaveDataValidationByte: ; unreferenced + ldh a, [hBankSRAM] + or a + ret nz + push hl + push de + push bc + ld hl, sCardCollection + ld bc, $250 + ld e, $00 +.loop_xor + ld a, [hli] + xor e + ld e, a + dec bc + ld a, c + or b + jr nz, .loop_xor + ld a, SRAM_ENABLE + ld [MBC3SRamEnable], a + ld a, e + ld [sUnusedSaveDataValidationByte], a + pop bc + pop de + pop hl + ret diff --git a/src/gfx.asm b/src/gfx.asm index 6df6203..1b96723 100644 --- a/src/gfx.asm +++ b/src/gfx.asm @@ -5,7 +5,7 @@ SECTION "Gfx 1", ROMX Fonts:: -FullWidthFonts:: ; 74000 (1d:4000) +FullWidthFonts:: INCBIN "gfx/fonts/full_width/0_0_katakana.1bpp" INCBIN "gfx/fonts/full_width/0_1_hiragana.1bpp" INCBIN "gfx/fonts/full_width/0_2_digits_kanji1.1bpp" @@ -14,36 +14,36 @@ INCBIN "gfx/fonts/full_width/2_kanji3.1bpp" INCBIN "gfx/fonts/full_width/3.1bpp" INCBIN "gfx/fonts/full_width/4.1bpp" -HalfWidthFont:: ; 76668 (1d:6668) +HalfWidthFont:: INCBIN "gfx/fonts/half_width.1bpp" -SymbolsFont:: ; 76968 (1d:6968) +SymbolsFont:: INCBIN "gfx/fonts/symbols.2bpp" DuelGraphics:: -DuelCardHeaderGraphics:: ; 76ce8 (1d:6ce8) +DuelCardHeaderGraphics:: INCBIN "gfx/duel/card_headers.2bpp" -DuelDmgSgbSymbolGraphics:: ; 76fe8 (1d:6fe8) +DuelDmgSgbSymbolGraphics:: INCBIN "gfx/duel/dmg_sgb_symbols.2bpp" -DuelCgbSymbolGraphics:: ; 777f8 (1d:77f8) +DuelCgbSymbolGraphics:: INCBIN "gfx/duel/cgb_symbols.2bpp", $0, $808 SECTION "Gfx 2", ROMX INCBIN "gfx/duel/cgb_symbols.2bpp", $808, $8 -DuelOtherGraphics:: ; 78008 (1e:4008) +DuelOtherGraphics:: INCBIN "gfx/duel/other.2bpp" -DuelBoxMessages:: ; 78318 (1e:4318) +DuelBoxMessages:: INCBIN "gfx/duel/box_messages.2bpp" SECTION "Gfx 3", ROMX -WaterClubTilemap:: ; 84000 (21:4000) +WaterClubTilemap:: db $1c ; width db $20 ; height dw WaterClubPermissions @@ -52,7 +52,7 @@ WaterClubTilemap:: ; 84000 (21:4000) WaterClubPermissions: INCBIN "data/maps/permissions/water_club.bin" -WaterClubCGBTilemap:: ; 84188 (21:4188) +WaterClubCGBTilemap:: db $1c ; width db $20 ; height dw WaterClubCGBPermissions @@ -61,7 +61,7 @@ WaterClubCGBTilemap:: ; 84188 (21:4188) WaterClubCGBPermissions: INCBIN "data/maps/permissions/water_club_cgb.bin" -LightningClubTilemap:: ; 843bb (21:43bb) +LightningClubTilemap:: db $1c ; width db $20 ; height dw LightningClubPermissions @@ -70,7 +70,7 @@ LightningClubTilemap:: ; 843bb (21:43bb) LightningClubPermissions: INCBIN "data/maps/permissions/lightning_club.bin" -LightningClubCGBTilemap:: ; 84533 (21:4533) +LightningClubCGBTilemap:: db $1c ; width db $20 ; height dw LightningClubCGBPermissions @@ -79,7 +79,7 @@ LightningClubCGBTilemap:: ; 84533 (21:4533) LightningClubCGBPermissions: INCBIN "data/maps/permissions/lightning_club_cgb.bin" -GrassClubTilemap:: ; 8472e (21:472e) +GrassClubTilemap:: db $1c ; width db $20 ; height dw GrassClubPermissions @@ -88,7 +88,7 @@ GrassClubTilemap:: ; 8472e (21:472e) GrassClubPermissions: INCBIN "data/maps/permissions/grass_club.bin" -GrassClubCGBTilemap:: ; 848d8 (21:48d8) +GrassClubCGBTilemap:: db $1c ; width db $20 ; height dw GrassClubCGBPermissions @@ -97,7 +97,7 @@ GrassClubCGBTilemap:: ; 848d8 (21:48d8) GrassClubCGBPermissions: INCBIN "data/maps/permissions/grass_club_cgb.bin" -PsychicClubTilemap:: ; 84b73 (21:4b73) +PsychicClubTilemap:: db $1c ; width db $1c ; height dw PsychicClubPermissions @@ -106,7 +106,7 @@ PsychicClubTilemap:: ; 84b73 (21:4b73) PsychicClubPermissions: INCBIN "data/maps/permissions/psychic_club.bin" -PsychicClubCGBTilemap:: ; 84c6f (21:4c6f) +PsychicClubCGBTilemap:: db $1c ; width db $1c ; height dw PsychicClubCGBPermissions @@ -115,7 +115,7 @@ PsychicClubCGBTilemap:: ; 84c6f (21:4c6f) PsychicClubCGBPermissions: INCBIN "data/maps/permissions/psychic_club_cgb.bin" -ScienceClubTilemap:: ; 84dfe (21:4dfe) +ScienceClubTilemap:: db $1c ; width db $20 ; height dw ScienceClubPermissions @@ -124,7 +124,7 @@ ScienceClubTilemap:: ; 84dfe (21:4dfe) ScienceClubPermissions: INCBIN "data/maps/permissions/science_club.bin" -ScienceClubCGBTilemap:: ; 84f1d (21:4f1d) +ScienceClubCGBTilemap:: db $1c ; width db $20 ; height dw ScienceClubCGBPermissions @@ -133,7 +133,7 @@ ScienceClubCGBTilemap:: ; 84f1d (21:4f1d) ScienceClubCGBPermissions: INCBIN "data/maps/permissions/science_club_cgb.bin" -FireClubTilemap:: ; 850b6 (21:50b6) +FireClubTilemap:: db $1c ; width db $20 ; height dw FireClubPermissions @@ -142,7 +142,7 @@ FireClubTilemap:: ; 850b6 (21:50b6) FireClubPermissions: INCBIN "data/maps/permissions/fire_club.bin" -FireClubCGBTilemap:: ; 85191 (21:5191) +FireClubCGBTilemap:: db $1c ; width db $20 ; height dw FireClubCGBPermissions @@ -151,7 +151,7 @@ FireClubCGBTilemap:: ; 85191 (21:5191) FireClubCGBPermissions: INCBIN "data/maps/permissions/fire_club_cgb.bin" -ChallengeHallTilemap:: ; 85315 (21:5315) +ChallengeHallTilemap:: db $20 ; width db $20 ; height dw ChallengeHallPermissions @@ -160,7 +160,7 @@ ChallengeHallTilemap:: ; 85315 (21:5315) ChallengeHallPermissions: INCBIN "data/maps/permissions/challenge_hall.bin" -ChallengeHallCGBTilemap:: ; 854b3 (21:54b3) +ChallengeHallCGBTilemap:: db $20 ; width db $20 ; height dw ChallengeHallCGBPermissions @@ -169,7 +169,7 @@ ChallengeHallCGBTilemap:: ; 854b3 (21:54b3) ChallengeHallCGBPermissions: INCBIN "data/maps/permissions/challenge_hall_cgb.bin" -PokemonDomeEntranceTilemap:: ; 8570a (21:570a) +PokemonDomeEntranceTilemap:: db $20 ; width db $12 ; height dw PokemonDomeEntrancePermissions @@ -178,7 +178,7 @@ PokemonDomeEntranceTilemap:: ; 8570a (21:570a) PokemonDomeEntrancePermissions: INCBIN "data/maps/permissions/pokemon_dome_entrance.bin" -PokemonDomeEntranceCGBTilemap:: ; 857ce (21:57ce) +PokemonDomeEntranceCGBTilemap:: db $20 ; width db $12 ; height dw PokemonDomeEntranceCGBPermissions @@ -187,7 +187,7 @@ PokemonDomeEntranceCGBTilemap:: ; 857ce (21:57ce) PokemonDomeEntranceCGBPermissions: INCBIN "data/maps/permissions/pokemon_dome_entrance_cgb.bin" -PokemonDomeTilemap:: ; 858ef (21:58ef) +PokemonDomeTilemap:: db $20 ; width db $20 ; height dw PokemonDomePermissions @@ -196,7 +196,7 @@ PokemonDomeTilemap:: ; 858ef (21:58ef) PokemonDomePermissions: INCBIN "data/maps/permissions/pokemon_dome.bin" -PokemonDomeCGBTilemap:: ; 85a79 (21:5a79) +PokemonDomeCGBTilemap:: db $20 ; width db $20 ; height dw PokemonDomeCGBPermissions @@ -205,7 +205,7 @@ PokemonDomeCGBTilemap:: ; 85a79 (21:5a79) PokemonDomeCGBPermissions: INCBIN "data/maps/permissions/pokemon_dome_cgb.bin" -HallOfHonorTilemap:: ; 85ce2 (21:5ce2) +HallOfHonorTilemap:: db $18 ; width db $1a ; height dw HallOfHonorPermissions @@ -214,7 +214,7 @@ HallOfHonorTilemap:: ; 85ce2 (21:5ce2) HallOfHonorPermissions: INCBIN "data/maps/permissions/hall_of_honor.bin" -HallOfHonorCGBTilemap:: ; 85df4 (21:5df4) +HallOfHonorCGBTilemap:: db $18 ; width db $1a ; height dw HallOfHonorCGBPermissions @@ -223,393 +223,393 @@ HallOfHonorCGBTilemap:: ; 85df4 (21:5df4) HallOfHonorCGBPermissions: INCBIN "data/maps/permissions/hall_of_honor_cgb.bin" -CardPopCGBTilemap:: ; 85f7c (21:5f7c) +CardPopCGBTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/card_pop_cgb.bin" -CardPopTilemap:: ; 8607f (21:607f) +CardPopTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/card_pop.bin" -ScienceMedalTilemap:: ; 8617d (21:617d) +ScienceMedalTilemap:: db $03 ; width db $03 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/science_medal.bin" -FireMedalTilemap:: ; 86193 (21:6193) +FireMedalTilemap:: db $03 ; width db $03 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/fire_medal.bin" -WaterMedalTilemap:: ; 861a9 (21:61a9) +WaterMedalTilemap:: db $03 ; width db $03 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/water_medal.bin" -LightningMedalTilemap:: ; 861bf (21:61bf) +LightningMedalTilemap:: db $03 ; width db $03 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/lightning_medal.bin" -FightingMedalTilemap:: ; 861d5 (21:61d5) +FightingMedalTilemap:: db $03 ; width db $03 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/fighting_medal.bin" -RockMedalTilemap:: ; 861eb (21:61eb) +RockMedalTilemap:: db $03 ; width db $03 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/rock_medal.bin" -PsychicMedalTilemap:: ; 86201 (21:6201) +PsychicMedalTilemap:: db $03 ; width db $03 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/psychic_medal.bin" -GameBoyLinkCGBTilemap:: ; 86217 (21:6217) +GameBoyLinkCGBTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/gameboy_link_cgb.bin" -GameBoyLinkTilemap:: ; 862da (21:62da) +GameBoyLinkTilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/gameboy_link.bin" -GameBoyLinkConnectingCGBTilemap:: ; 86364 (21:6364) +GameBoyLinkConnectingCGBTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/gameboy_link_connecting_cgb.bin" -GameBoyLinkConnectingTilemap:: ; 86443 (21:6443) +GameBoyLinkConnectingTilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/gameboy_link_connecting.bin" -GameBoyPrinterCGBTilemap:: ; 864df (21:64df) +GameBoyPrinterCGBTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/gameboy_printer_cgb.bin" -GameBoyPrinterTilemap:: ; 865b5 (21:65b5) +GameBoyPrinterTilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/gameboy_printer.bin" -ColosseumTilemap:: ; 86647 (21:6647) +ColosseumTilemap:: db $08 ; width db $0c ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/colosseum.bin" -ColosseumCGBTilemap:: ; 866b8 (21:66b8) +ColosseumCGBTilemap:: db $08 ; width db $0c ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/colosseum_cgb.bin" -EvolutionTilemap:: ; 8673e (21:673e) +EvolutionTilemap:: db $08 ; width db $0c ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/evolution.bin" -EvolutionCGBTilemap:: ; 867af (21:67af) +EvolutionCGBTilemap:: db $08 ; width db $0c ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/evolution_cgb.bin" -MysteryTilemap:: ; 86833 (21:6833) +MysteryTilemap:: db $08 ; width db $0c ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/mystery.bin" -MysteryCGBTilemap:: ; 868a4 (21:68a4) +MysteryCGBTilemap:: db $08 ; width db $0c ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/mystery_cgb.bin" -LaboratoryTilemap:: ; 86925 (21:6925) +LaboratoryTilemap:: db $08 ; width db $0c ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/laboratory.bin" -LaboratoryCGBTilemap:: ; 86996 (21:6996) +LaboratoryCGBTilemap:: db $08 ; width db $0c ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/laboratory_cgb.bin" -CharizardIntroTilemap:: ; 86a14 (21:6a14) +CharizardIntroTilemap:: db $08 ; width db $0c ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/charizard_intro.bin" -CharizardIntroCGBTilemap:: ; 86a85 (21:6a85) +CharizardIntroCGBTilemap:: db $08 ; width db $0c ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/charizard_intro_cgb.bin" -ScytherIntroTilemap:: ; 86b28 (21:6b28) +ScytherIntroTilemap:: db $08 ; width db $0c ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/scyther_intro.bin" -ScytherIntroCGBTilemap:: ; 86b99 (21:6b99) +ScytherIntroCGBTilemap:: db $08 ; width db $0c ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/scyther_intro_cgb.bin" -AerodactylIntroTilemap:: ; 86c34 (21:6c34) +AerodactylIntroTilemap:: db $08 ; width db $0c ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/aerodactyl_intro.bin" -AerodactylIntroCGBTilemap:: ; 86ca5 (21:6ca5) +AerodactylIntroCGBTilemap:: db $08 ; width db $0c ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/aerodactyl_intro_cgb.bin" -JapaneseTitleScreenTilemap:: ; 86d37 (21:6d37) +JapaneseTitleScreenTilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/japanese_title_screen.bin" -JapaneseTitleScreenCGBTilemap:: ; 86dcc (21:6dcc) +JapaneseTitleScreenCGBTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/japanese_title_screen_cgb.bin" -SolidTiles1Tilemap:: ; 86e8a (21:6e8a) +SolidTiles1Tilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/solid_tiles_1.bin" -SolidTiles2Tilemap:: ; 86f18 (21:6f18) +SolidTiles2Tilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/solid_tiles_2.bin" -SolidTiles3Tilemap:: ; 86fc0 (21:6fc0) +SolidTiles3Tilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/solid_tiles_3.bin" -JapaneseTitleScreen2Tilemap:: ; 8704f (21:704f) +JapaneseTitleScreen2Tilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/japanese_title_screen_2.bin" -JapaneseTitleScreen2CGBTilemap:: ; 871a5 (21:71a5) +JapaneseTitleScreen2CGBTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/japanese_title_screen_2_cgb.bin" -SolidTiles4Tilemap:: ; 87397 (21:7397) +SolidTiles4Tilemap:: db $08 ; width db $04 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/solid_tiles_4.bin" -PlayerTilemap:: ; 873b7 (21:73b7) +PlayerTilemap:: db $06 ; width db $06 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/player.bin" -OpponentTilemap:: ; 873e5 (21:73e5) +OpponentTilemap:: db $06 ; width db $06 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/opponent.bin" -TitleScreenTilemap:: ; 87413 (21:7413) +TitleScreenTilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/title_screen.bin" -TitleScreenCGBTilemap:: ; 87538 (21:7538) +TitleScreenCGBTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/title_screen_cgb.bin" -CopyrightTilemap:: ; 8769f (21:769f) +CopyrightTilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/copyright.bin" -CopyrightCGBTilemap:: ; 876f6 (21:76f6) +CopyrightCGBTilemap:: db $14 ; width db $12 ; height dw NULL db TRUE ; cgb mode INCBIN "data/maps/tiles/copyright_cgb.bin" -NintendoTilemap:: ; 8777c (21:777c) +NintendoTilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/nintendo.bin" -CompaniesTilemap:: ; 877c4 (21:77c4) +CompaniesTilemap:: db $14 ; width db $12 ; height dw NULL db FALSE ; cgb mode INCBIN "data/maps/tiles/companies.bin" -IshiharaTilesetGfx:: ; 87828 (21:7828) +IshiharaTilesetGfx:: dw 77 INCBIN "gfx/tilesets/ishihara.2bpp" -SolidTiles1:: ; 87cfa (21:7cfa) +SolidTiles1:: dw 4 INCBIN "gfx/solid_tiles.2bpp" -SolidTiles2:: ; 87d3c (21:7d3c) +SolidTiles2:: dw 4 INCBIN "gfx/solid_tiles.2bpp" -PlayerGfx:: ; 87d7e (21:7d7e) +PlayerGfx:: dw 36 INCBIN "gfx/duelists/player.2bpp" -Duel55Gfx:: ; 87fc0 (21:7fc0) +Duel55Gfx:: dw $2 INCBIN "gfx/duel/anims/55.2bpp" -Duel56Gfx:: ; 87fe2 (21:7fe2) +Duel56Gfx:: dw $1 INCBIN "gfx/duel/anims/56.2bpp" -AnimData12:: ; 87ff4 (21:7ff4) +AnimData12:: frame_table AnimFrameTable3 frame_data 2, 8, 0, 0 frame_data 0, 0, 0, 0 SECTION "Gfx 4", ROMX -OverworldMapTiles:: ; 88000 (22:4000) +OverworldMapTiles:: dw 193 INCBIN "gfx/overworld_map.2bpp" -MasonLaboratoryTilesetGfx:: ; 88c12 (22:4c12) +MasonLaboratoryTilesetGfx:: dw 151 INCBIN "gfx/tilesets/masonlaboratory.2bpp" -ClubEntranceTilesetGfx:: ; 89584 (22:5584) +ClubEntranceTilesetGfx:: dw 129 INCBIN "gfx/tilesets/clubentrance.2bpp" -ClubLobbyTilesetGfx:: ; 89d96 (22:5d96) +ClubLobbyTilesetGfx:: dw 120 INCBIN "gfx/tilesets/clublobby.2bpp" -FightingClubTilesetGfx:: ; 8a518 (22:6518) +FightingClubTilesetGfx:: dw 99 INCBIN "gfx/tilesets/fightingclub.2bpp" -RockClubTilesetGfx:: ; 8ab4a (22:6b4a) +RockClubTilesetGfx:: dw 60 INCBIN "gfx/tilesets/rockclub.2bpp" -WaterClubTilesetGfx:: ; 8af0c (22:6f0c) +WaterClubTilesetGfx:: dw 161 INCBIN "gfx/tilesets/waterclub.2bpp" -GrassClubTilesetGfx:: ; 8b91e (22:791e) +GrassClubTilesetGfx:: dw 87 INCBIN "gfx/tilesets/grassclub.2bpp" -OWPlayerGfx:: ; 8be90 (22:7e90) +OWPlayerGfx:: dw $14 INCBIN "gfx/overworld_sprites/player.2bpp" -Duel57Gfx:: ; 8bfd2 (22:7fd2) +Duel57Gfx:: dw $1 INCBIN "gfx/duel/anims/57.2bpp" -AnimData2:: ; 8bfe4 (22:7fe4) +AnimData2:: frame_table AnimFrameTable0 frame_data 5, 16, 0, 0 frame_data 6, 16, 0, 0 @@ -617,45 +617,45 @@ AnimData2:: ; 8bfe4 (22:7fe4) frame_data 6, 16, 0, 0 frame_data 0, 0, 0, 0 -Palette109:: ; 8bffb (22:7ffb) +Palette109:: db 1, %11100100 db 0 SECTION "Gfx 5", ROMX -LightningClubTilesetGfx:: ; 8c000 (23:4000) +LightningClubTilesetGfx:: dw 131 INCBIN "gfx/tilesets/lightningclub.2bpp" -PsychicClubTilesetGfx:: ; 8c832 (23:4832) +PsychicClubTilesetGfx:: dw 58 INCBIN "gfx/tilesets/psychicclub.2bpp" -ScienceClubTilesetGfx:: ; 8cbd4 (23:4bd4) +ScienceClubTilesetGfx:: dw 82 INCBIN "gfx/tilesets/scienceclub.2bpp" -FireClubTilesetGfx:: ; 8d0f6 (23:50f6) +FireClubTilesetGfx:: dw 87 INCBIN "gfx/tilesets/fireclub.2bpp" -ChallengeHallTilesetGfx:: ; 8d668 (23:5668) +ChallengeHallTilesetGfx:: dw 157 INCBIN "gfx/tilesets/challengehall.2bpp" -PokemonDomeEntranceTilesetGfx:: ; 8e03a (23:603a) +PokemonDomeEntranceTilesetGfx:: dw 78 INCBIN "gfx/tilesets/pokemondomeentrance.2bpp" -PokemonDomeTilesetGfx:: ; 8e51c (23:651c) +PokemonDomeTilesetGfx:: dw 207 INCBIN "gfx/tilesets/pokemondome.2bpp" -HallOfHonorTilesetGfx:: ; 8f20e (23:720e) +HallOfHonorTilesetGfx:: dw 121 INCBIN "gfx/tilesets/hallofhonor.2bpp" -MedalGfx:: ; 8f9a0 (23:79a0) +MedalGfx:: dw 72 INCBIN "gfx/medals.2bpp", $0, $c0 INCBIN "gfx/medals.2bpp", $240, $30 @@ -676,134 +676,134 @@ MedalGfx:: ; 8f9a0 (23:79a0) INCBIN "gfx/medals.2bpp", $420, $30 INCBIN "gfx/medals.2bpp", $3f0, $20 -NintendoGfx:: ; 8fe22 (23:7e22) +NintendoGfx:: dw 24 INCBIN "gfx/nintendo.2bpp" -Duel58Gfx:: ; 8ffa4 (23:7fa4) +Duel58Gfx:: dw $4 INCBIN "gfx/duel/anims/58.2bpp" -AnimData3:: ; 8ffe6 (23:7fe6) +AnimData3:: frame_table AnimFrameTable0 frame_data 8, 16, 0, 0 frame_data 9, 16, 0, 0 frame_data 0, 0, 0, 0 -AnimData11:: ; 8fff5 (23:7ff5) +AnimData11:: frame_table AnimFrameTable3 frame_data 1, 8, 0, 0 frame_data 0, 0, 0, 0 SECTION "Gfx 6", ROMX -CardPopGfx:: ; 90000 (24:4000) +CardPopGfx:: dw 189 INCBIN "gfx/link/cardpop.2bpp" -GameBoyLinkGfx:: ; 90bd2 (24:4bd2) +GameBoyLinkGfx:: dw 109 INCBIN "gfx/link/gameboylink.2bpp" -GameBoyPrinterGfx:: ; 912a4 (24:52a4) +GameBoyPrinterGfx:: dw 93 INCBIN "gfx/link/gameboyprinter.2bpp" -Colosseum1Gfx:: ; 91876 (24:5876) +Colosseum1Gfx:: dw 96 INCBIN "gfx/booster_packs/colosseum1.2bpp" -Colosseum2Gfx:: ; 91e78 (24:5e78) +Colosseum2Gfx:: dw 86 INCBIN "gfx/booster_packs/colosseum2.2bpp" -Evolution1Gfx:: ; 923da (24:63da) +Evolution1Gfx:: dw 96 INCBIN "gfx/booster_packs/evolution1.2bpp" -Evolution2Gfx:: ; 929dc (24:69dc) +Evolution2Gfx:: dw 86 INCBIN "gfx/booster_packs/evolution2.2bpp" -Mystery1Gfx:: ; 92f3e (24:6f3e) +Mystery1Gfx:: dw 96 INCBIN "gfx/booster_packs/mystery1.2bpp" -Mystery2Gfx:: ; 93540 (24:7540) +Mystery2Gfx:: dw 86 INCBIN "gfx/booster_packs/mystery2.2bpp" -RonaldGfx:: ; 93aa2 (24:7aa2) +RonaldGfx:: dw 36 INCBIN "gfx/duelists/ronald.2bpp" -CopyrightGfx:: ; 93ce4 (24:7ce4) +CopyrightGfx:: dw 36 INCBIN "gfx/copyright.2bpp" -OWClerkGfx:: ; 93f26 (24:7f26) +OWClerkGfx:: dw $8 INCBIN "gfx/overworld_sprites/clerk.2bpp" -Duel59Gfx:: ; 93fa8 (24:7fa8) +Duel59Gfx:: dw $3 INCBIN "gfx/duel/anims/59.2bpp" -Duel60Gfx:: ; 93fda (24:7fda) +Duel60Gfx:: dw $2 INCBIN "gfx/duel/anims/60.2bpp" SECTION "Gfx 7", ROMX -Laboratory1Gfx:: ; 94000 (25:4000) +Laboratory1Gfx:: dw 96 INCBIN "gfx/booster_packs/laboratory1.2bpp" -Laboratory2Gfx:: ; 94602 (25:4602) +Laboratory2Gfx:: dw 86 INCBIN "gfx/booster_packs/laboratory2.2bpp" -CharizardIntro1Gfx:: ; 94b64 (25:4b64) +CharizardIntro1Gfx:: dw 96 INCBIN "gfx/titlescreen/booster_packs/charizardintro1.2bpp" -CharizardIntro2Gfx:: ; 95166 (25:5166) +CharizardIntro2Gfx:: dw 96 INCBIN "gfx/titlescreen/booster_packs/charizardintro2.2bpp" -ScytherIntro1Gfx:: ; 95768 (25:5768) +ScytherIntro1Gfx:: dw 96 INCBIN "gfx/titlescreen/booster_packs/scytherintro1.2bpp" -ScytherIntro2Gfx:: ; 95d6a (25:5d6a) +ScytherIntro2Gfx:: dw 96 INCBIN "gfx/titlescreen/booster_packs/scytherintro2.2bpp" -AerodactylIntro1Gfx:: ; 9636c (25:636c) +AerodactylIntro1Gfx:: dw 96 INCBIN "gfx/titlescreen/booster_packs/aerodactylintro1.2bpp" -AerodactylIntro2Gfx:: ; 9696e (25:696e) +AerodactylIntro2Gfx:: dw 96 INCBIN "gfx/titlescreen/booster_packs/aerodactylintro2.2bpp" -JapaneseTitleScreenGfx:: ; 96f70 (25:6f70) +JapaneseTitleScreenGfx:: dw 97 INCBIN "gfx/titlescreen/japanese_title_screen.2bpp" -JapaneseTitleScreenCGBGfx:: ; 97582 (25:7582) +JapaneseTitleScreenCGBGfx:: dw 97 INCBIN "gfx/titlescreen/japanese_title_screen_cgb.2bpp" -CompaniesGfx:: ; 97b94 (25:7b94) +CompaniesGfx:: dw 49 INCBIN "gfx/companies.2bpp" -OWRonaldGfx:: ; 97ea6 (25:7ea6) +OWRonaldGfx:: dw $14 INCBIN "gfx/overworld_sprites/ronald.2bpp" -AnimData5:: ; 97fe8 (25:7fe8) +AnimData5:: frame_table AnimFrameTable1 frame_data 3, 16, 0, 0 frame_data 4, 16, 0, 0 @@ -811,335 +811,335 @@ AnimData5:: ; 97fe8 (25:7fe8) SECTION "Gfx 8", ROMX -JapaneseTitleScreen2Gfx:: ; 98000 (26:4000) +JapaneseTitleScreen2Gfx:: dw 244 INCBIN "gfx/titlescreen/japanese_title_screen_2.2bpp" -JapaneseTitleScreen2CGBGfx:: ; 98f42 (26:4f42) +JapaneseTitleScreen2CGBGfx:: dw 315 INCBIN "gfx/titlescreen/japanese_title_screen_2_cgb.2bpp" -TitleScreenGfx:: ; 9a2f4 (26:62f4) +TitleScreenGfx:: dw 220 INCBIN "gfx/titlescreen/title_screen.2bpp" -TitleScreenCGBGfx:: ; 9b0b6 (26:70b6) +TitleScreenCGBGfx:: dw 212 INCBIN "gfx/titlescreen/title_screen_cgb.2bpp" -OWDrMasonGfx:: ; 9bdf8 (26:7df8) +OWDrMasonGfx:: dw $14 INCBIN "gfx/overworld_sprites/doctormason.2bpp" -OverworldMapOAMGfx:: ; 9bf3a (26:7f3a) +OverworldMapOAMGfx:: dw $8 INCBIN "gfx/overworld_map_oam.2bpp" -Duel61Gfx:: ; 9bfbc (26:7fbc) +Duel61Gfx:: dw $3 INCBIN "gfx/duel/anims/61.2bpp" -Duel62Gfx:: ; 9bfee (26:7fee) +Duel62Gfx:: dw $1 INCBIN "gfx/duel/anims/62.2bpp" SECTION "Gfx 9", ROMX -SamGfx:: ; 9c000 (27:4000) +SamGfx:: dw 36 INCBIN "gfx/duelists/sam.2bpp" -ImakuniGfx:: ; 9c242 (27:4242) +ImakuniGfx:: dw 36 INCBIN "gfx/duelists/imakuni.2bpp" -NikkiGfx:: ; 9c484 (27:4484) +NikkiGfx:: dw 36 INCBIN "gfx/duelists/nikki.2bpp" -RickGfx:: ; 9c6c6 (27:46c6) +RickGfx:: dw 36 INCBIN "gfx/duelists/rick.2bpp" -KenGfx:: ; 9c908 (27:4908) +KenGfx:: dw 36 INCBIN "gfx/duelists/ken.2bpp" -AmyGfx:: ; 9cb4a (27:4b4a) +AmyGfx:: dw 36 INCBIN "gfx/duelists/amy.2bpp" -IsaacGfx:: ; 9cd8c (27:4d8c) +IsaacGfx:: dw 36 INCBIN "gfx/duelists/isaac.2bpp" -MitchGfx:: ; 9cfce (27:4fce) +MitchGfx:: dw 36 INCBIN "gfx/duelists/mitch.2bpp" -GeneGfx:: ; 9d210 (27:5210) +GeneGfx:: dw 36 INCBIN "gfx/duelists/gene.2bpp" -MurrayGfx:: ; 9d452 (27:5452) +MurrayGfx:: dw 36 INCBIN "gfx/duelists/murray.2bpp" -CourtneyGfx:: ; 9d694 (27:5694) +CourtneyGfx:: dw 36 INCBIN "gfx/duelists/courtney.2bpp" -SteveGfx:: ; 9d8d6 (27:58d6) +SteveGfx:: dw 36 INCBIN "gfx/duelists/steve.2bpp" -JackGfx:: ; 9db18 (27:5b18) +JackGfx:: dw 36 INCBIN "gfx/duelists/jack.2bpp" -RodGfx:: ; 9dd5a (27:5d5a) +RodGfx:: dw 36 INCBIN "gfx/duelists/rod.2bpp" -JosephGfx:: ; 9df9c (27:5f9c) +JosephGfx:: dw 36 INCBIN "gfx/duelists/joseph.2bpp" -DavidGfx:: ; 9e1de (27:61de) +DavidGfx:: dw 36 INCBIN "gfx/duelists/david.2bpp" -ErikGfx:: ; 9e420 (27:6420) +ErikGfx:: dw 36 INCBIN "gfx/duelists/erik.2bpp" -JohnGfx:: ; 9e662 (27:6662) +JohnGfx:: dw 36 INCBIN "gfx/duelists/john.2bpp" -AdamGfx:: ; 9e8a4 (27:68a4) +AdamGfx:: dw 36 INCBIN "gfx/duelists/adam.2bpp" -JonathanGfx:: ; 9eae6 (27:6ae6) +JonathanGfx:: dw 36 INCBIN "gfx/duelists/jonathan.2bpp" -JoshuaGfx:: ; 9ed28 (27:6d28) +JoshuaGfx:: dw 36 INCBIN "gfx/duelists/joshua.2bpp" -NicholasGfx:: ; 9ef6a (27:6f6a) +NicholasGfx:: dw 36 INCBIN "gfx/duelists/nicholas.2bpp" -BrandonGfx:: ; 9f1ac (27:71ac) +BrandonGfx:: dw 36 INCBIN "gfx/duelists/brandon.2bpp" -MatthewGfx:: ; 9f3ee (27:73ee) +MatthewGfx:: dw 36 INCBIN "gfx/duelists/matthew.2bpp" -RyanGfx:: ; 9f630 (27:7630) +RyanGfx:: dw 36 INCBIN "gfx/duelists/ryan.2bpp" -AndrewGfx:: ; 9f872 (27:7872) +AndrewGfx:: dw 36 INCBIN "gfx/duelists/andrew.2bpp" -ChrisGfx:: ; 9fab4 (27:7ab4) +ChrisGfx:: dw 36 INCBIN "gfx/duelists/chris.2bpp" -MichaelGfx:: ; 9fcf6 (27:7cf6) +MichaelGfx:: dw 36 INCBIN "gfx/duelists/michael.2bpp" -Duel63Gfx:: ; 9ff38 (27:7f38) +Duel63Gfx:: dw $a INCBIN "gfx/duel/anims/63.2bpp" -Duel64Gfx:: ; 9ffda (27:7fda) +Duel64Gfx:: dw $2 INCBIN "gfx/duel/anims/64.2bpp" SECTION "Gfx 10", ROMX -DanielGfx:: ; a0000 (28:4000) +DanielGfx:: dw 36 INCBIN "gfx/duelists/daniel.2bpp" -RobertGfx:: ; a0242 (28:4242) +RobertGfx:: dw 36 INCBIN "gfx/duelists/robert.2bpp" -BrittanyGfx:: ; a0484 (28:4484) +BrittanyGfx:: dw 36 INCBIN "gfx/duelists/brittany.2bpp" -KristinGfx:: ; a06c6 (28:46c6) +KristinGfx:: dw 36 INCBIN "gfx/duelists/kristin.2bpp" -HeatherGfx:: ; a0908 (28:4908) +HeatherGfx:: dw 36 INCBIN "gfx/duelists/heather.2bpp" -SaraGfx:: ; a0b4a (28:4b4a) +SaraGfx:: dw 36 INCBIN "gfx/duelists/sara.2bpp" -AmandaGfx:: ; a0d8c (28:4d8c) +AmandaGfx:: dw 36 INCBIN "gfx/duelists/amanda.2bpp" -JenniferGfx:: ; a0fce (28:4fce) +JenniferGfx:: dw 36 INCBIN "gfx/duelists/jennifer.2bpp" -JessicaGfx:: ; a1210 (28:5210) +JessicaGfx:: dw 36 INCBIN "gfx/duelists/jessica.2bpp" -StephanieGfx:: ; a1452 (28:5452) +StephanieGfx:: dw 36 INCBIN "gfx/duelists/stephanie.2bpp" -AaronGfx:: ; a1694 (28:5694) +AaronGfx:: dw 36 INCBIN "gfx/duelists/aaron.2bpp" -OWIshiharaGfx:: ; a18d6 (28:58d6) +OWIshiharaGfx:: dw $14 INCBIN "gfx/overworld_sprites/ishihara.2bpp" -OWImakuniGfx:: ; a1a18 (28:5a18) +OWImakuniGfx:: dw $14 INCBIN "gfx/overworld_sprites/imakuni.2bpp" -OWNikkiGfx:: ; a1b5a (28:5b5a) +OWNikkiGfx:: dw $14 INCBIN "gfx/overworld_sprites/nikki.2bpp" -OWRickGfx:: ; a1c9c (28:5c9c) +OWRickGfx:: dw $14 INCBIN "gfx/overworld_sprites/rick.2bpp" -OWKenGfx:: ; a1dde (28:5dde) +OWKenGfx:: dw $14 INCBIN "gfx/overworld_sprites/ken.2bpp" -OWAmyGfx:: ; a1f20 (28:5f20) +OWAmyGfx:: dw $1b INCBIN "gfx/overworld_sprites/amy.2bpp" -OWIsaacGfx:: ; a20d2 (28:60d2) +OWIsaacGfx:: dw $14 INCBIN "gfx/overworld_sprites/isaac.2bpp" -OWMitchGfx:: ; a2214 (28:6214) +OWMitchGfx:: dw $14 INCBIN "gfx/overworld_sprites/mitch.2bpp" -OWGeneGfx:: ; a2356 (28:6356) +OWGeneGfx:: dw $14 INCBIN "gfx/overworld_sprites/gene.2bpp" -OWMurrayGfx:: ; a2498 (28:6498) +OWMurrayGfx:: dw $14 INCBIN "gfx/overworld_sprites/murray.2bpp" -OWCourtneyGfx:: ; a25da (28:65da) +OWCourtneyGfx:: dw $14 INCBIN "gfx/overworld_sprites/courtney.2bpp" -OWSteveGfx:: ; a271c (28:671c) +OWSteveGfx:: dw $14 INCBIN "gfx/overworld_sprites/steve.2bpp" -OWJackGfx:: ; a285e (28:685e) +OWJackGfx:: dw $14 INCBIN "gfx/overworld_sprites/jack.2bpp" -OWRodGfx:: ; a29a0 (28:69a0) +OWRodGfx:: dw $14 INCBIN "gfx/overworld_sprites/rod.2bpp" -OWBoyGfx:: ; a2ae2 (28:6ae2) +OWBoyGfx:: dw $14 INCBIN "gfx/overworld_sprites/youngster.2bpp" -OWLadGfx:: ; a2c24 (28:6c24) +OWLadGfx:: dw $14 INCBIN "gfx/overworld_sprites/lad.2bpp" -OWSpecsGfx:: ; a2d66 (28:6d66) +OWSpecsGfx:: dw $14 INCBIN "gfx/overworld_sprites/specs.2bpp" -OWButchGfx:: ; a2ea8 (28:6ea8) +OWButchGfx:: dw $14 INCBIN "gfx/overworld_sprites/butch.2bpp" -OWManiaGfx:: ; a2fea (28:6fea) +OWManiaGfx:: dw $14 INCBIN "gfx/overworld_sprites/mania.2bpp" -OWJoshuaGfx:: ; a312c (28:712c) +OWJoshuaGfx:: dw $14 INCBIN "gfx/overworld_sprites/joshua.2bpp" -OWHoodGfx:: ; a326e (28:726e) +OWHoodGfx:: dw $14 INCBIN "gfx/overworld_sprites/hood.2bpp" -OWTechGfx:: ; a33b0 (28:73b0) +OWTechGfx:: dw $14 INCBIN "gfx/overworld_sprites/tech.2bpp" -OWChapGfx:: ; a34f2 (28:74f2) +OWChapGfx:: dw $14 INCBIN "gfx/overworld_sprites/chap.2bpp" -OWManGfx:: ; a3634 (28:7634) +OWManGfx:: dw $14 INCBIN "gfx/overworld_sprites/man.2bpp" -OWPappyGfx:: ; a3776 (28:7776) +OWPappyGfx:: dw $14 INCBIN "gfx/overworld_sprites/pappy.2bpp" -OWGirlGfx:: ; a38b8 (28:78b8) +OWGirlGfx:: dw $14 INCBIN "gfx/overworld_sprites/girl.2bpp" -OWLass1Gfx:: ; a39fa (28:79fa) +OWLass1Gfx:: dw $14 INCBIN "gfx/overworld_sprites/lass1.2bpp" -OWLass2Gfx:: ; a3b3c (28:7b3c) +OWLass2Gfx:: dw $14 INCBIN "gfx/overworld_sprites/lass2.2bpp" -OWLass3Gfx:: ; a3c7e (28:7c7e) +OWLass3Gfx:: dw $14 INCBIN "gfx/overworld_sprites/lass3.2bpp" -OWSwimmerGfx:: ; a3dc0 (28:7dc0) +OWSwimmerGfx:: dw $14 INCBIN "gfx/overworld_sprites/swimmer.2bpp" -DuelGlowGfx:: ; a3f02 (28:7f02) +DuelGlowGfx:: dw $b INCBIN "gfx/duel/anims/glow.2bpp" -Duel66Gfx:: ; a3fb4 (28:7fb4) +Duel66Gfx:: dw $4 INCBIN "gfx/duel/anims/66.2bpp" -Palette117:: ; a3ff6 (28:7ff6) +Palette117:: db 0 db 1 @@ -1150,203 +1150,203 @@ Palette117:: ; a3ff6 (28:7ff6) SECTION "Gfx 11", ROMX -OWGalGfx:: ; a4000 (29:4000) +OWGalGfx:: dw $14 INCBIN "gfx/overworld_sprites/gal.2bpp" -OWWomanGfx:: ; a4142 (29:4142) +OWWomanGfx:: dw $14 INCBIN "gfx/overworld_sprites/woman.2bpp" -OWGrannyGfx:: ; a4284 (29:4284) +OWGrannyGfx:: dw $14 INCBIN "gfx/overworld_sprites/granny.2bpp" -Duel0Gfx:: ; a43c6 (29:43c6) +Duel0Gfx:: dw $16 INCBIN "gfx/duel/anims/0.2bpp" -Duel1Gfx:: ; a4528 (29:4528) +Duel1Gfx:: dw $06 INCBIN "gfx/duel/anims/1.2bpp" -Duel2Gfx:: ; a458a (29:458a) +Duel2Gfx:: dw $08 INCBIN "gfx/duel/anims/2.2bpp" -Duel3Gfx:: ; a460c (29:460c) +Duel3Gfx:: dw $09 INCBIN "gfx/duel/anims/3.2bpp" -Duel4Gfx:: ; a469e (29:469e) +Duel4Gfx:: dw $12 INCBIN "gfx/duel/anims/4.2bpp" -Duel5Gfx:: ; a47c0 (29:47c0) +Duel5Gfx:: dw $09 INCBIN "gfx/duel/anims/5.2bpp" -Duel6Gfx:: ; a4852 (29:4852) +Duel6Gfx:: dw $11 INCBIN "gfx/duel/anims/6.2bpp" -Duel7Gfx:: ; a4964 (29:4964) +Duel7Gfx:: dw $2d INCBIN "gfx/duel/anims/7.2bpp" -Duel8Gfx:: ; a4c36 (29:4c36) +Duel8Gfx:: dw $0d INCBIN "gfx/duel/anims/8.2bpp" -Duel9Gfx:: ; a4d08 (29:4d08) +Duel9Gfx:: dw $1c INCBIN "gfx/duel/anims/9.2bpp" -Duel10Gfx:: ; a4eca (29:4eca) +Duel10Gfx:: dw $4c INCBIN "gfx/duel/anims/10.2bpp" -Duel11Gfx:: ; a538c (29:538c) +Duel11Gfx:: dw $1b INCBIN "gfx/duel/anims/11.2bpp" -Duel12Gfx:: ; a553e (29:553e) +Duel12Gfx:: dw $07 INCBIN "gfx/duel/anims/12.2bpp" -Duel13Gfx:: ; a55b0 (29:55b0) +Duel13Gfx:: dw $0c INCBIN "gfx/duel/anims/13.2bpp" -Duel14Gfx:: ; a5672 (29:5672) +Duel14Gfx:: dw $22 INCBIN "gfx/duel/anims/14.2bpp" -Duel15Gfx:: ; a5894 (29:5894) +Duel15Gfx:: dw $20 INCBIN "gfx/duel/anims/15.2bpp" -Duel16Gfx:: ; a5a96 (29:5a96) +Duel16Gfx:: dw $0a INCBIN "gfx/duel/anims/16.2bpp" -Duel17Gfx:: ; a5b38 (29:5b38) +Duel17Gfx:: dw $25 INCBIN "gfx/duel/anims/17.2bpp" -Duel18Gfx:: ; a5d8a (29:5d8a) +Duel18Gfx:: dw $18 INCBIN "gfx/duel/anims/18.2bpp" -Duel19Gfx:: ; a5f0c (29:5f0c) +Duel19Gfx:: dw $1b INCBIN "gfx/duel/anims/19.2bpp" -Duel20Gfx:: ; a60be (29:60be) +Duel20Gfx:: dw $08 INCBIN "gfx/duel/anims/20.2bpp" -Duel21Gfx:: ; a6140 (29:6140) +Duel21Gfx:: dw $0d INCBIN "gfx/duel/anims/21.2bpp" -Duel22Gfx:: ; a6212 (29:6212) +Duel22Gfx:: dw $22 INCBIN "gfx/duel/anims/22.2bpp" -Duel23Gfx:: ; a6434 (29:6434) +Duel23Gfx:: dw $0c INCBIN "gfx/duel/anims/23.2bpp" -Duel24Gfx:: ; a64f6 (29:64f6) +Duel24Gfx:: dw $25 INCBIN "gfx/duel/anims/24.2bpp" -Duel25Gfx:: ; a6748 (29:6748) +Duel25Gfx:: dw $22 INCBIN "gfx/duel/anims/25.2bpp" -Duel26Gfx:: ; a696a (29:696a) +Duel26Gfx:: dw $0c INCBIN "gfx/duel/anims/26.2bpp" -Duel27Gfx:: ; a6a2c (29:6a2c) +Duel27Gfx:: dw $4c INCBIN "gfx/duel/anims/27.2bpp" -Duel28Gfx:: ; a6eee (29:6eee) +Duel28Gfx:: dw $08 INCBIN "gfx/duel/anims/28.2bpp" -Duel29Gfx:: ; a6f70 (29:6f70) +Duel29Gfx:: dw $07 INCBIN "gfx/duel/anims/29.2bpp" -Duel30Gfx:: ; a6fe2 (29:6fe2) +Duel30Gfx:: dw $1a INCBIN "gfx/duel/anims/30.2bpp" -Duel31Gfx:: ; a7184 (29:7184) +Duel31Gfx:: dw $0a INCBIN "gfx/duel/anims/31.2bpp" -Duel32Gfx:: ; a7226 (29:7226) +Duel32Gfx:: dw $2e INCBIN "gfx/duel/anims/32.2bpp" -Duel33Gfx:: ; a7508 (29:7508) +Duel33Gfx:: dw $08 INCBIN "gfx/duel/anims/33.2bpp" -Duel34Gfx:: ; a758a (29:758a) +Duel34Gfx:: dw $07 INCBIN "gfx/duel/anims/34.2bpp" -Duel35Gfx:: ; a75fc (29:75fc) +Duel35Gfx:: dw $1c INCBIN "gfx/duel/anims/35.2bpp" -Duel36Gfx:: ; a77be (29:77be) +Duel36Gfx:: dw $08 INCBIN "gfx/duel/anims/36.2bpp" -Duel37Gfx:: ; a7840 (29:7840) +Duel37Gfx:: dw $0b INCBIN "gfx/duel/anims/37.2bpp" -Duel38Gfx:: ; a78f2 (29:78f2) +Duel38Gfx:: dw $1c INCBIN "gfx/duel/anims/38.2bpp" -Duel39Gfx:: ; a7ab4 (29:7ab4) +Duel39Gfx:: dw $16 INCBIN "gfx/duel/anims/39.2bpp" -Duel40Gfx:: ; a7c16 (29:7c16) +Duel40Gfx:: dw $10 INCBIN "gfx/duel/anims/40.2bpp" -Duel41Gfx:: ; a7d18 (29:7d18) +Duel41Gfx:: dw $0f INCBIN "gfx/duel/anims/41.2bpp" -Duel42Gfx:: ; a7e0a (29:7e0a) +Duel42Gfx:: dw $07 INCBIN "gfx/duel/anims/42.2bpp" -Duel43Gfx:: ; a7e7c (29:7e7c) +Duel43Gfx:: dw $0a INCBIN "gfx/duel/anims/43.2bpp" -Duel44Gfx:: ; a7f1e (29:7f1e) +Duel44Gfx:: dw $09 INCBIN "gfx/duel/anims/44.2bpp" -Duel45Gfx:: ; a7fb0 (29:7fb0) +Duel45Gfx:: dw $03 INCBIN "gfx/duel/anims/45.2bpp" -AnimData6:: ; a7fe2 (29:7fe2) +AnimData6:: frame_table AnimFrameTable1 frame_data 5, 16, 0, 0 frame_data 6, 16, 0, 0 @@ -1356,75 +1356,75 @@ AnimData6:: ; a7fe2 (29:7fe2) SECTION "Gfx 12", ROMX -Duel46Gfx:: ; a8000 (2a:4000) +Duel46Gfx:: dw $08 INCBIN "gfx/duel/anims/46.2bpp" -Duel47Gfx:: ; a8082 (2a:4082) +Duel47Gfx:: dw $0f INCBIN "gfx/duel/anims/47.2bpp" -Duel48Gfx:: ; a8174 (2a:4174) +Duel48Gfx:: dw $03 INCBIN "gfx/duel/anims/48.2bpp" -Duel49Gfx:: ; a81a6 (2a:41a6) +Duel49Gfx:: dw $05 INCBIN "gfx/duel/anims/49.2bpp" -Duel50Gfx:: ; a81f8 (2a:41f8) +Duel50Gfx:: dw $17 INCBIN "gfx/duel/anims/50.2bpp" -Duel51Gfx:: ; a836a (2a:436a) +Duel51Gfx:: dw $36 INCBIN "gfx/duel/anims/51.2bpp" -Duel52Gfx:: ; a86cc (2a:46cc) +Duel52Gfx:: dw $0b INCBIN "gfx/duel/anims/52.2bpp" -Duel53Gfx:: ; a877e (2a:477e) +Duel53Gfx:: dw $06 INCBIN "gfx/duel/anims/53.2bpp" -Duel54Gfx:: ; a87e0 (2a:47e0) +Duel54Gfx:: dw $16 INCBIN "gfx/duel/anims/54.2bpp" -BoosterPackOAMGfx:: ; a8942 (2a:4942) +BoosterPackOAMGfx:: dw $20 INCBIN "gfx/booster_packs/oam.2bpp" -PressStartGfx:: ; a8b44 (2a:4b44) +PressStartGfx:: dw $14 INCBIN "gfx/titlescreen/press_start.2bpp" -GrassGfx:: ; a8c86 (2a:4c86) +GrassGfx:: dw $04 INCBIN "gfx/titlescreen/energies/grass.2bpp" -FireGfx:: ; a8cc8 (2a:4cc8) +FireGfx:: dw $04 INCBIN "gfx/titlescreen/energies/fire.2bpp" -WaterGfx:: ; a8d0a (2a:4d0a) +WaterGfx:: dw $04 INCBIN "gfx/titlescreen/energies/water.2bpp" -ColorlessGfx:: ; a8d4c (2a:4d4c) +ColorlessGfx:: dw $04 INCBIN "gfx/titlescreen/energies/colorless.2bpp" -LightningGfx:: ; a8d8e (2a:4d8e) +LightningGfx:: dw $04 INCBIN "gfx/titlescreen/energies/lightning.2bpp" -PsychicGfx:: ; a8dd0 (2a:4dd0) +PsychicGfx:: dw $04 INCBIN "gfx/titlescreen/energies/psychic.2bpp" -FightingGfx:: ; a8e12 (2a:4e12) +FightingGfx:: dw $04 INCBIN "gfx/titlescreen/energies/fighting.2bpp" @@ -1437,7 +1437,7 @@ SECTION "Anims 2", ROMX SECTION "Anims 3", ROMX INCLUDE "data/duel/animations/anims3.asm" -Palette31:: ; b3feb (2c:7feb) +Palette31:: db 1, %11010010 db 1 @@ -1446,7 +1446,7 @@ Palette31:: ; b3feb (2c:7feb) rgb 31, 24, 6 rgb 11, 3, 0 -Palette119:: ; b3ff6 (2c:7ff6) +Palette119:: db 0 db 1 @@ -1466,89 +1466,89 @@ SECTION "Palettes2", ROMX SECTION "Card Gfx 1", ROMX -CardGraphics:: ; c4000 (31:4000) +CardGraphics:: -GrassEnergyCardGfx:: ; c4000 (31:4000) +GrassEnergyCardGfx:: INCBIN "gfx/cards/grassenergy.2bpp" INCBIN "gfx/cards/grassenergy.pal" -FireEnergyCardGfx:: ; c4308 (31:4308) +FireEnergyCardGfx:: INCBIN "gfx/cards/fireenergy.2bpp" INCBIN "gfx/cards/fireenergy.pal" -WaterEnergyCardGfx:: ; c4610 (31:4610) +WaterEnergyCardGfx:: INCBIN "gfx/cards/waterenergy.2bpp" INCBIN "gfx/cards/waterenergy.pal" -LightningEnergyCardGfx:: ; c4918 (31:4918) +LightningEnergyCardGfx:: INCBIN "gfx/cards/lightningenergy.2bpp" INCBIN "gfx/cards/lightningenergy.pal" -FightingEnergyCardGfx:: ; c4c20 (31:4c20) +FightingEnergyCardGfx:: INCBIN "gfx/cards/fightingenergy.2bpp" INCBIN "gfx/cards/fightingenergy.pal" -PsychicEnergyCardGfx:: ; c4f28 (31:4f28) +PsychicEnergyCardGfx:: INCBIN "gfx/cards/psychicenergy.2bpp" INCBIN "gfx/cards/psychicenergy.pal" -DoubleColorlessEnergyCardGfx:: ; c5230 (31:5230) +DoubleColorlessEnergyCardGfx:: INCBIN "gfx/cards/doublecolorlessenergy.2bpp" INCBIN "gfx/cards/doublecolorlessenergy.pal" -BulbasaurCardGfx:: ; c5538 (31:5538) +BulbasaurCardGfx:: INCBIN "gfx/cards/bulbasaur.2bpp" INCBIN "gfx/cards/bulbasaur.pal" -IvysaurCardGfx:: ; c5840 (31:5840) +IvysaurCardGfx:: INCBIN "gfx/cards/ivysaur.2bpp" INCBIN "gfx/cards/ivysaur.pal" -Venusaur1CardGfx:: ; c5b48 (31:5b48) +Venusaur1CardGfx:: INCBIN "gfx/cards/venusaur1.2bpp" INCBIN "gfx/cards/venusaur1.pal" -Venusaur2CardGfx:: ; c5e50 (31:5e50) +Venusaur2CardGfx:: INCBIN "gfx/cards/venusaur2.2bpp" INCBIN "gfx/cards/venusaur2.pal" -CaterpieCardGfx:: ; c6158 (31:6158) +CaterpieCardGfx:: INCBIN "gfx/cards/caterpie.2bpp" INCBIN "gfx/cards/caterpie.pal" -MetapodCardGfx:: ; c6460 (31:6460) +MetapodCardGfx:: INCBIN "gfx/cards/metapod.2bpp" INCBIN "gfx/cards/metapod.pal" -ButterfreeCardGfx:: ; c6768 (31:6768) +ButterfreeCardGfx:: INCBIN "gfx/cards/butterfree.2bpp" INCBIN "gfx/cards/butterfree.pal" -WeedleCardGfx:: ; c6a70 (31:6a70) +WeedleCardGfx:: INCBIN "gfx/cards/weedle.2bpp" INCBIN "gfx/cards/weedle.pal" -KakunaCardGfx:: ; c6d78 (31:6d78) +KakunaCardGfx:: INCBIN "gfx/cards/kakuna.2bpp" INCBIN "gfx/cards/kakuna.pal" -BeedrillCardGfx:: ; c7080 (31:7080) +BeedrillCardGfx:: INCBIN "gfx/cards/beedrill.2bpp" INCBIN "gfx/cards/beedrill.pal" -EkansCardGfx:: ; c7388 (31:7388) +EkansCardGfx:: INCBIN "gfx/cards/ekans.2bpp" INCBIN "gfx/cards/ekans.pal" -ArbokCardGfx:: ; c7690 (31:7690) +ArbokCardGfx:: INCBIN "gfx/cards/arbok.2bpp" INCBIN "gfx/cards/arbok.pal" -NidoranFCardGfx:: ; c7998 (31:7998) +NidoranFCardGfx:: INCBIN "gfx/cards/nidoranf.2bpp" INCBIN "gfx/cards/nidoranf.pal" -NidorinaCardGfx:: ; c7ca0 (31:7ca0) +NidorinaCardGfx:: INCBIN "gfx/cards/nidorina.2bpp" INCBIN "gfx/cards/nidorina.pal" @@ -1556,87 +1556,87 @@ NidorinaCardGfx:: ; c7ca0 (31:7ca0) SECTION "Card Gfx 2", ROMX -NidoqueenCardGfx:: ; c8000 (32:4000) +NidoqueenCardGfx:: INCBIN "gfx/cards/nidoqueen.2bpp" INCBIN "gfx/cards/nidoqueen.pal" -NidoranMCardGfx:: ; c8308 (32:4308) +NidoranMCardGfx:: INCBIN "gfx/cards/nidoranm.2bpp" INCBIN "gfx/cards/nidoranm.pal" -NidorinoCardGfx:: ; c8610 (32:4610) +NidorinoCardGfx:: INCBIN "gfx/cards/nidorino.2bpp" INCBIN "gfx/cards/nidorino.pal" -NidokingCardGfx:: ; c8918 (32:4918) +NidokingCardGfx:: INCBIN "gfx/cards/nidoking.2bpp" INCBIN "gfx/cards/nidoking.pal" -ZubatCardGfx:: ; c8c20 (32:4c20) +ZubatCardGfx:: INCBIN "gfx/cards/zubat.2bpp" INCBIN "gfx/cards/zubat.pal" -GolbatCardGfx:: ; c8f28 (32:4f28) +GolbatCardGfx:: INCBIN "gfx/cards/golbat.2bpp" INCBIN "gfx/cards/golbat.pal" -OddishCardGfx:: ; c9230 (32:5230) +OddishCardGfx:: INCBIN "gfx/cards/oddish.2bpp" INCBIN "gfx/cards/oddish.pal" -GloomCardGfx:: ; c9538 (32:5538) +GloomCardGfx:: INCBIN "gfx/cards/gloom.2bpp" INCBIN "gfx/cards/gloom.pal" -VileplumeCardGfx:: ; c9840 (32:5840) +VileplumeCardGfx:: INCBIN "gfx/cards/vileplume.2bpp" INCBIN "gfx/cards/vileplume.pal" -ParasCardGfx:: ; c9b48 (32:5b48) +ParasCardGfx:: INCBIN "gfx/cards/paras.2bpp" INCBIN "gfx/cards/paras.pal" -ParasectCardGfx:: ; c9e50 (32:5e50) +ParasectCardGfx:: INCBIN "gfx/cards/parasect.2bpp" INCBIN "gfx/cards/parasect.pal" -VenonatCardGfx:: ; ca158 (32:6158) +VenonatCardGfx:: INCBIN "gfx/cards/venonat.2bpp" INCBIN "gfx/cards/venonat.pal" -VenomothCardGfx:: ; ca460 (32:6460) +VenomothCardGfx:: INCBIN "gfx/cards/venomoth.2bpp" INCBIN "gfx/cards/venomoth.pal" -BellsproutCardGfx:: ; ca768 (32:6768) +BellsproutCardGfx:: INCBIN "gfx/cards/bellsprout.2bpp" INCBIN "gfx/cards/bellsprout.pal" -WeepinbellCardGfx:: ; caa70 (32:6a70) +WeepinbellCardGfx:: INCBIN "gfx/cards/weepinbell.2bpp" INCBIN "gfx/cards/weepinbell.pal" -VictreebelCardGfx:: ; cad78 (32:6d78) +VictreebelCardGfx:: INCBIN "gfx/cards/victreebel.2bpp" INCBIN "gfx/cards/victreebel.pal" -GrimerCardGfx:: ; cb080 (32:7080) +GrimerCardGfx:: INCBIN "gfx/cards/grimer.2bpp" INCBIN "gfx/cards/grimer.pal" -MukCardGfx:: ; cb388 (32:7388) +MukCardGfx:: INCBIN "gfx/cards/muk.2bpp" INCBIN "gfx/cards/muk.pal" -ExeggcuteCardGfx:: ; cb690 (32:7690) +ExeggcuteCardGfx:: INCBIN "gfx/cards/exeggcute.2bpp" INCBIN "gfx/cards/exeggcute.pal" -ExeggutorCardGfx:: ; cb998 (32:7998) +ExeggutorCardGfx:: INCBIN "gfx/cards/exeggutor.2bpp" INCBIN "gfx/cards/exeggutor.pal" -KoffingCardGfx:: ; cbca0 (32:7ca0) +KoffingCardGfx:: INCBIN "gfx/cards/koffing.2bpp" INCBIN "gfx/cards/koffing.pal" @@ -1644,87 +1644,87 @@ KoffingCardGfx:: ; cbca0 (32:7ca0) SECTION "Card Gfx 3", ROMX -WeezingCardGfx:: ; cc000 (33:4000) +WeezingCardGfx:: INCBIN "gfx/cards/weezing.2bpp" INCBIN "gfx/cards/weezing.pal" -Tangela1CardGfx:: ; cc308 (33:4308) +Tangela1CardGfx:: INCBIN "gfx/cards/tangela1.2bpp" INCBIN "gfx/cards/tangela1.pal" -Tangela2CardGfx:: ; cc610 (33:4610) +Tangela2CardGfx:: INCBIN "gfx/cards/tangela2.2bpp" INCBIN "gfx/cards/tangela2.pal" -ScytherCardGfx:: ; cc918 (33:4918) +ScytherCardGfx:: INCBIN "gfx/cards/scyther.2bpp" INCBIN "gfx/cards/scyther.pal" -PinsirCardGfx:: ; ccc20 (33:4c20) +PinsirCardGfx:: INCBIN "gfx/cards/pinsir.2bpp" INCBIN "gfx/cards/pinsir.pal" -CharmanderCardGfx:: ; ccf28 (33:4f28) +CharmanderCardGfx:: INCBIN "gfx/cards/charmander.2bpp" INCBIN "gfx/cards/charmander.pal" -CharmeleonCardGfx:: ; cd230 (33:5230) +CharmeleonCardGfx:: INCBIN "gfx/cards/charmeleon.2bpp" INCBIN "gfx/cards/charmeleon.pal" -CharizardCardGfx:: ; cd538 (33:5538) +CharizardCardGfx:: INCBIN "gfx/cards/charizard.2bpp" INCBIN "gfx/cards/charizard.pal" -VulpixCardGfx:: ; cd840 (33:5840) +VulpixCardGfx:: INCBIN "gfx/cards/vulpix.2bpp" INCBIN "gfx/cards/vulpix.pal" -Ninetales1CardGfx:: ; cdb48 (33:5b48) +Ninetales1CardGfx:: INCBIN "gfx/cards/ninetales1.2bpp" INCBIN "gfx/cards/ninetales1.pal" -Ninetales2CardGfx:: ; cde50 (33:5e50) +Ninetales2CardGfx:: INCBIN "gfx/cards/ninetales2.2bpp" INCBIN "gfx/cards/ninetales2.pal" -GrowlitheCardGfx:: ; ce158 (33:6158) +GrowlitheCardGfx:: INCBIN "gfx/cards/growlithe.2bpp" INCBIN "gfx/cards/growlithe.pal" -Arcanine1CardGfx:: ; ce460 (33:6460) +Arcanine1CardGfx:: INCBIN "gfx/cards/arcanine1.2bpp" INCBIN "gfx/cards/arcanine1.pal" -Arcanine2CardGfx:: ; ce768 (33:6768) +Arcanine2CardGfx:: INCBIN "gfx/cards/arcanine2.2bpp" INCBIN "gfx/cards/arcanine2.pal" -PonytaCardGfx:: ; cea70 (33:6a70) +PonytaCardGfx:: INCBIN "gfx/cards/ponyta.2bpp" INCBIN "gfx/cards/ponyta.pal" -RapidashCardGfx:: ; ced78 (33:6d78) +RapidashCardGfx:: INCBIN "gfx/cards/rapidash.2bpp" INCBIN "gfx/cards/rapidash.pal" -Magmar1CardGfx:: ; cf080 (33:7080) +Magmar1CardGfx:: INCBIN "gfx/cards/magmar1.2bpp" INCBIN "gfx/cards/magmar1.pal" -Magmar2CardGfx:: ; cf388 (33:7388) +Magmar2CardGfx:: INCBIN "gfx/cards/magmar2.2bpp" INCBIN "gfx/cards/magmar2.pal" -Flareon1CardGfx:: ; cf690 (33:7690) +Flareon1CardGfx:: INCBIN "gfx/cards/flareon1.2bpp" INCBIN "gfx/cards/flareon1.pal" -Flareon2CardGfx:: ; cf998 (33:7998) +Flareon2CardGfx:: INCBIN "gfx/cards/flareon2.2bpp" INCBIN "gfx/cards/flareon2.pal" -Moltres1CardGfx:: ; cfca0 (33:7ca0) +Moltres1CardGfx:: INCBIN "gfx/cards/moltres1.2bpp" INCBIN "gfx/cards/moltres1.pal" @@ -1732,87 +1732,87 @@ Moltres1CardGfx:: ; cfca0 (33:7ca0) SECTION "Card Gfx 4", ROMX -Moltres2CardGfx:: ; d0000 (34:4000) +Moltres2CardGfx:: INCBIN "gfx/cards/moltres2.2bpp" INCBIN "gfx/cards/moltres2.pal" -SquirtleCardGfx:: ; d0308 (34:4308) +SquirtleCardGfx:: INCBIN "gfx/cards/squirtle.2bpp" INCBIN "gfx/cards/squirtle.pal" -WartortleCardGfx:: ; d0610 (34:4610) +WartortleCardGfx:: INCBIN "gfx/cards/wartortle.2bpp" INCBIN "gfx/cards/wartortle.pal" -BlastoiseCardGfx:: ; d0918 (34:4918) +BlastoiseCardGfx:: INCBIN "gfx/cards/blastoise.2bpp" INCBIN "gfx/cards/blastoise.pal" -PsyduckCardGfx:: ; d0c20 (34:4c20) +PsyduckCardGfx:: INCBIN "gfx/cards/psyduck.2bpp" INCBIN "gfx/cards/psyduck.pal" -GolduckCardGfx:: ; d0f28 (34:4f28) +GolduckCardGfx:: INCBIN "gfx/cards/golduck.2bpp" INCBIN "gfx/cards/golduck.pal" -PoliwagCardGfx:: ; d1230 (34:5230) +PoliwagCardGfx:: INCBIN "gfx/cards/poliwag.2bpp" INCBIN "gfx/cards/poliwag.pal" -PoliwhirlCardGfx:: ; d1538 (34:5538) +PoliwhirlCardGfx:: INCBIN "gfx/cards/poliwhirl.2bpp" INCBIN "gfx/cards/poliwhirl.pal" -PoliwrathCardGfx:: ; d1840 (34:5840) +PoliwrathCardGfx:: INCBIN "gfx/cards/poliwrath.2bpp" INCBIN "gfx/cards/poliwrath.pal" -TentacoolCardGfx:: ; d1b48 (34:5b48) +TentacoolCardGfx:: INCBIN "gfx/cards/tentacool.2bpp" INCBIN "gfx/cards/tentacool.pal" -TentacruelCardGfx:: ; d1e50 (34:5e50) +TentacruelCardGfx:: INCBIN "gfx/cards/tentacruel.2bpp" INCBIN "gfx/cards/tentacruel.pal" -SeelCardGfx:: ; d2158 (34:6158) +SeelCardGfx:: INCBIN "gfx/cards/seel.2bpp" INCBIN "gfx/cards/seel.pal" -DewgongCardGfx:: ; d2460 (34:6460) +DewgongCardGfx:: INCBIN "gfx/cards/dewgong.2bpp" INCBIN "gfx/cards/dewgong.pal" -ShellderCardGfx:: ; d2768 (34:6768) +ShellderCardGfx:: INCBIN "gfx/cards/shellder.2bpp" INCBIN "gfx/cards/shellder.pal" -CloysterCardGfx:: ; d2a70 (34:6a70) +CloysterCardGfx:: INCBIN "gfx/cards/cloyster.2bpp" INCBIN "gfx/cards/cloyster.pal" -KrabbyCardGfx:: ; d2d78 (34:6d78) +KrabbyCardGfx:: INCBIN "gfx/cards/krabby.2bpp" INCBIN "gfx/cards/krabby.pal" -KinglerCardGfx:: ; d3080 (34:7080) +KinglerCardGfx:: INCBIN "gfx/cards/kingler.2bpp" INCBIN "gfx/cards/kingler.pal" -HorseaCardGfx:: ; d3388 (34:7388) +HorseaCardGfx:: INCBIN "gfx/cards/horsea.2bpp" INCBIN "gfx/cards/horsea.pal" -SeadraCardGfx:: ; d3690 (34:7690) +SeadraCardGfx:: INCBIN "gfx/cards/seadra.2bpp" INCBIN "gfx/cards/seadra.pal" -GoldeenCardGfx:: ; d3998 (34:7998) +GoldeenCardGfx:: INCBIN "gfx/cards/goldeen.2bpp" INCBIN "gfx/cards/goldeen.pal" -SeakingCardGfx:: ; d3ca0 (34:7ca0) +SeakingCardGfx:: INCBIN "gfx/cards/seaking.2bpp" INCBIN "gfx/cards/seaking.pal" @@ -1820,87 +1820,87 @@ SeakingCardGfx:: ; d3ca0 (34:7ca0) SECTION "Card Gfx 5", ROMX -StaryuCardGfx:: ; d4000 (35:4000) +StaryuCardGfx:: INCBIN "gfx/cards/staryu.2bpp" INCBIN "gfx/cards/staryu.pal" -StarmieCardGfx:: ; d4308 (35:4308) +StarmieCardGfx:: INCBIN "gfx/cards/starmie.2bpp" INCBIN "gfx/cards/starmie.pal" -MagikarpCardGfx:: ; d4610 (35:4610) +MagikarpCardGfx:: INCBIN "gfx/cards/magikarp.2bpp" INCBIN "gfx/cards/magikarp.pal" -GyaradosCardGfx:: ; d4918 (35:4918) +GyaradosCardGfx:: INCBIN "gfx/cards/gyarados.2bpp" INCBIN "gfx/cards/gyarados.pal" -LaprasCardGfx:: ; d4c20 (35:4c20) +LaprasCardGfx:: INCBIN "gfx/cards/lapras.2bpp" INCBIN "gfx/cards/lapras.pal" -Vaporeon1CardGfx:: ; d4f28 (35:4f28) +Vaporeon1CardGfx:: INCBIN "gfx/cards/vaporeon1.2bpp" INCBIN "gfx/cards/vaporeon1.pal" -Vaporeon2CardGfx:: ; d5230 (35:5230) +Vaporeon2CardGfx:: INCBIN "gfx/cards/vaporeon2.2bpp" INCBIN "gfx/cards/vaporeon2.pal" -OmanyteCardGfx:: ; d5538 (35:5538) +OmanyteCardGfx:: INCBIN "gfx/cards/omanyte.2bpp" INCBIN "gfx/cards/omanyte.pal" -OmastarCardGfx:: ; d5840 (35:5840) +OmastarCardGfx:: INCBIN "gfx/cards/omastar.2bpp" INCBIN "gfx/cards/omastar.pal" -Articuno1CardGfx:: ; d5b48 (35:5b48) +Articuno1CardGfx:: INCBIN "gfx/cards/articuno1.2bpp" INCBIN "gfx/cards/articuno1.pal" -Articuno2CardGfx:: ; d5e50 (35:5e50) +Articuno2CardGfx:: INCBIN "gfx/cards/articuno2.2bpp" INCBIN "gfx/cards/articuno2.pal" -Pikachu1CardGfx:: ; d6158 (35:6158) +Pikachu1CardGfx:: INCBIN "gfx/cards/pikachu1.2bpp" INCBIN "gfx/cards/pikachu1.pal" -Pikachu2CardGfx:: ; d6460 (35:6460) +Pikachu2CardGfx:: INCBIN "gfx/cards/pikachu2.2bpp" INCBIN "gfx/cards/pikachu2.pal" -Pikachu3CardGfx:: ; d6768 (35:6768) +Pikachu3CardGfx:: INCBIN "gfx/cards/pikachu3.2bpp" INCBIN "gfx/cards/pikachu3.pal" -Pikachu4CardGfx:: ; d6a70 (35:6a70) +Pikachu4CardGfx:: INCBIN "gfx/cards/pikachu4.2bpp" INCBIN "gfx/cards/pikachu4.pal" -FlyingPikachuCardGfx:: ; d6d78 (35:6d78) +FlyingPikachuCardGfx:: INCBIN "gfx/cards/flyingpikachu.2bpp" INCBIN "gfx/cards/flyingpikachu.pal" -SurfingPikachu1CardGfx:: ; d7080 (35:7080) +SurfingPikachu1CardGfx:: INCBIN "gfx/cards/surfingpikachu1.2bpp" INCBIN "gfx/cards/surfingpikachu1.pal" -SurfingPikachu2CardGfx:: ; d7388 (35:7388) +SurfingPikachu2CardGfx:: INCBIN "gfx/cards/surfingpikachu2.2bpp" INCBIN "gfx/cards/surfingpikachu2.pal" -Raichu1CardGfx:: ; d7690 (35:7690) +Raichu1CardGfx:: INCBIN "gfx/cards/raichu1.2bpp" INCBIN "gfx/cards/raichu1.pal" -Raichu2CardGfx:: ; d7998 (35:7998) +Raichu2CardGfx:: INCBIN "gfx/cards/raichu2.2bpp" INCBIN "gfx/cards/raichu2.pal" -Magnemite1CardGfx:: ; d7ca0 (35:7ca0) +Magnemite1CardGfx:: INCBIN "gfx/cards/magnemite1.2bpp" INCBIN "gfx/cards/magnemite1.pal" @@ -1908,87 +1908,87 @@ Magnemite1CardGfx:: ; d7ca0 (35:7ca0) SECTION "Card Gfx 6", ROMX -Magnemite2CardGfx:: ; d8000 (36:4000) +Magnemite2CardGfx:: INCBIN "gfx/cards/magnemite2.2bpp" INCBIN "gfx/cards/magnemite2.pal" -Magneton1CardGfx:: ; d8308 (36:4308) +Magneton1CardGfx:: INCBIN "gfx/cards/magneton1.2bpp" INCBIN "gfx/cards/magneton1.pal" -Magneton2CardGfx:: ; d8610 (36:4610) +Magneton2CardGfx:: INCBIN "gfx/cards/magneton2.2bpp" INCBIN "gfx/cards/magneton2.pal" -VoltorbCardGfx:: ; d8918 (36:4918) +VoltorbCardGfx:: INCBIN "gfx/cards/voltorb.2bpp" INCBIN "gfx/cards/voltorb.pal" -Electrode1CardGfx:: ; d8c20 (36:4c20) +Electrode1CardGfx:: INCBIN "gfx/cards/electrode1.2bpp" INCBIN "gfx/cards/electrode1.pal" -Electrode2CardGfx:: ; d8f28 (36:4f28) +Electrode2CardGfx:: INCBIN "gfx/cards/electrode2.2bpp" INCBIN "gfx/cards/electrode2.pal" -Electabuzz1CardGfx:: ; d9230 (36:5230) +Electabuzz1CardGfx:: INCBIN "gfx/cards/electabuzz1.2bpp" INCBIN "gfx/cards/electabuzz1.pal" -Electabuzz2CardGfx:: ; d9538 (36:5538) +Electabuzz2CardGfx:: INCBIN "gfx/cards/electabuzz2.2bpp" INCBIN "gfx/cards/electabuzz2.pal" -Jolteon1CardGfx:: ; d9840 (36:5840) +Jolteon1CardGfx:: INCBIN "gfx/cards/jolteon1.2bpp" INCBIN "gfx/cards/jolteon1.pal" -Jolteon2CardGfx:: ; d9b48 (36:5b48) +Jolteon2CardGfx:: INCBIN "gfx/cards/jolteon2.2bpp" INCBIN "gfx/cards/jolteon2.pal" -Zapdos1CardGfx:: ; d9e50 (36:5e50) +Zapdos1CardGfx:: INCBIN "gfx/cards/zapdos1.2bpp" INCBIN "gfx/cards/zapdos1.pal" -Zapdos2CardGfx:: ; da158 (36:6158) +Zapdos2CardGfx:: INCBIN "gfx/cards/zapdos2.2bpp" INCBIN "gfx/cards/zapdos2.pal" -Zapdos3CardGfx:: ; da460 (36:6460) +Zapdos3CardGfx:: INCBIN "gfx/cards/zapdos3.2bpp" INCBIN "gfx/cards/zapdos3.pal" -SandshrewCardGfx:: ; da768 (36:6768) +SandshrewCardGfx:: INCBIN "gfx/cards/sandshrew.2bpp" INCBIN "gfx/cards/sandshrew.pal" -SandslashCardGfx:: ; daa70 (36:6a70) +SandslashCardGfx:: INCBIN "gfx/cards/sandslash.2bpp" INCBIN "gfx/cards/sandslash.pal" -DiglettCardGfx:: ; dad78 (36:6d78) +DiglettCardGfx:: INCBIN "gfx/cards/diglett.2bpp" INCBIN "gfx/cards/diglett.pal" -DugtrioCardGfx:: ; db080 (36:7080) +DugtrioCardGfx:: INCBIN "gfx/cards/dugtrio.2bpp" INCBIN "gfx/cards/dugtrio.pal" -MankeyCardGfx:: ; db388 (36:7388) +MankeyCardGfx:: INCBIN "gfx/cards/mankey.2bpp" INCBIN "gfx/cards/mankey.pal" -PrimeapeCardGfx:: ; db690 (36:7690) +PrimeapeCardGfx:: INCBIN "gfx/cards/primeape.2bpp" INCBIN "gfx/cards/primeape.pal" -MachopCardGfx:: ; db998 (36:7998) +MachopCardGfx:: INCBIN "gfx/cards/machop.2bpp" INCBIN "gfx/cards/machop.pal" -MachokeCardGfx:: ; dbca0 (36:7ca0) +MachokeCardGfx:: INCBIN "gfx/cards/machoke.2bpp" INCBIN "gfx/cards/machoke.pal" @@ -1996,87 +1996,87 @@ MachokeCardGfx:: ; dbca0 (36:7ca0) SECTION "Card Gfx 7", ROMX -MachampCardGfx:: ; dc000 (37:4000) +MachampCardGfx:: INCBIN "gfx/cards/machamp.2bpp" INCBIN "gfx/cards/machamp.pal" -GeodudeCardGfx:: ; dc308 (37:4308) +GeodudeCardGfx:: INCBIN "gfx/cards/geodude.2bpp" INCBIN "gfx/cards/geodude.pal" -GravelerCardGfx:: ; dc610 (37:4610) +GravelerCardGfx:: INCBIN "gfx/cards/graveler.2bpp" INCBIN "gfx/cards/graveler.pal" -GolemCardGfx:: ; dc918 (37:4918) +GolemCardGfx:: INCBIN "gfx/cards/golem.2bpp" INCBIN "gfx/cards/golem.pal" -OnixCardGfx:: ; dcc20 (37:4c20) +OnixCardGfx:: INCBIN "gfx/cards/onix.2bpp" INCBIN "gfx/cards/onix.pal" -CuboneCardGfx:: ; dcf28 (37:4f28) +CuboneCardGfx:: INCBIN "gfx/cards/cubone.2bpp" INCBIN "gfx/cards/cubone.pal" -Marowak1CardGfx:: ; dd230 (37:5230) +Marowak1CardGfx:: INCBIN "gfx/cards/marowak1.2bpp" INCBIN "gfx/cards/marowak1.pal" -Marowak2CardGfx:: ; dd538 (37:5538) +Marowak2CardGfx:: INCBIN "gfx/cards/marowak2.2bpp" INCBIN "gfx/cards/marowak2.pal" -HitmonleeCardGfx:: ; dd840 (37:5840) +HitmonleeCardGfx:: INCBIN "gfx/cards/hitmonlee.2bpp" INCBIN "gfx/cards/hitmonlee.pal" -HitmonchanCardGfx:: ; ddb48 (37:5b48) +HitmonchanCardGfx:: INCBIN "gfx/cards/hitmonchan.2bpp" INCBIN "gfx/cards/hitmonchan.pal" -RhyhornCardGfx:: ; dde50 (37:5e50) +RhyhornCardGfx:: INCBIN "gfx/cards/rhyhorn.2bpp" INCBIN "gfx/cards/rhyhorn.pal" -RhydonCardGfx:: ; de158 (37:6158) +RhydonCardGfx:: INCBIN "gfx/cards/rhydon.2bpp" INCBIN "gfx/cards/rhydon.pal" -KabutoCardGfx:: ; de460 (37:6460) +KabutoCardGfx:: INCBIN "gfx/cards/kabuto.2bpp" INCBIN "gfx/cards/kabuto.pal" -KabutopsCardGfx:: ; de768 (37:6768) +KabutopsCardGfx:: INCBIN "gfx/cards/kabutops.2bpp" INCBIN "gfx/cards/kabutops.pal" -AerodactylCardGfx:: ; dea70 (37:6a70) +AerodactylCardGfx:: INCBIN "gfx/cards/aerodactyl.2bpp" INCBIN "gfx/cards/aerodactyl.pal" -AbraCardGfx:: ; ded78 (37:6d78) +AbraCardGfx:: INCBIN "gfx/cards/abra.2bpp" INCBIN "gfx/cards/abra.pal" -KadabraCardGfx:: ; df080 (37:7080) +KadabraCardGfx:: INCBIN "gfx/cards/kadabra.2bpp" INCBIN "gfx/cards/kadabra.pal" -AlakazamCardGfx:: ; df388 (37:7388) +AlakazamCardGfx:: INCBIN "gfx/cards/alakazam.2bpp" INCBIN "gfx/cards/alakazam.pal" -Slowpoke1CardGfx:: ; df690 (37:7690) +Slowpoke1CardGfx:: INCBIN "gfx/cards/slowpoke1.2bpp" INCBIN "gfx/cards/slowpoke1.pal" -Slowpoke2CardGfx:: ; df998 (37:7998) +Slowpoke2CardGfx:: INCBIN "gfx/cards/slowpoke2.2bpp" INCBIN "gfx/cards/slowpoke2.pal" -SlowbroCardGfx:: ; dfca0 (37:7ca0) +SlowbroCardGfx:: INCBIN "gfx/cards/slowbro.2bpp" INCBIN "gfx/cards/slowbro.pal" @@ -2084,87 +2084,87 @@ SlowbroCardGfx:: ; dfca0 (37:7ca0) SECTION "Card Gfx 8", ROMX -Gastly1CardGfx:: ; e0000 (38:4000) +Gastly1CardGfx:: INCBIN "gfx/cards/gastly1.2bpp" INCBIN "gfx/cards/gastly1.pal" -Gastly2CardGfx:: ; e0308 (38:4308) +Gastly2CardGfx:: INCBIN "gfx/cards/gastly2.2bpp" INCBIN "gfx/cards/gastly2.pal" -Haunter1CardGfx:: ; e0610 (38:4610) +Haunter1CardGfx:: INCBIN "gfx/cards/haunter1.2bpp" INCBIN "gfx/cards/haunter1.pal" -Haunter2CardGfx:: ; e0918 (38:4918) +Haunter2CardGfx:: INCBIN "gfx/cards/haunter2.2bpp" INCBIN "gfx/cards/haunter2.pal" -GengarCardGfx:: ; e0c20 (38:4c20) +GengarCardGfx:: INCBIN "gfx/cards/gengar.2bpp" INCBIN "gfx/cards/gengar.pal" -DrowzeeCardGfx:: ; e0f28 (38:4f28) +DrowzeeCardGfx:: INCBIN "gfx/cards/drowzee.2bpp" INCBIN "gfx/cards/drowzee.pal" -HypnoCardGfx:: ; e1230 (38:5230) +HypnoCardGfx:: INCBIN "gfx/cards/hypno.2bpp" INCBIN "gfx/cards/hypno.pal" -MrMimeCardGfx:: ; e1538 (38:5538) +MrMimeCardGfx:: INCBIN "gfx/cards/mrmime.2bpp" INCBIN "gfx/cards/mrmime.pal" -JynxCardGfx:: ; e1840 (38:5840) +JynxCardGfx:: INCBIN "gfx/cards/jynx.2bpp" INCBIN "gfx/cards/jynx.pal" -Mewtwo1CardGfx:: ; e1b48 (38:5b48) +Mewtwo1CardGfx:: INCBIN "gfx/cards/mewtwo1.2bpp" INCBIN "gfx/cards/mewtwo1.pal" -Mewtwo2CardGfx:: ; e1e50 (38:5e50) +Mewtwo2CardGfx:: INCBIN "gfx/cards/mewtwo2.2bpp" INCBIN "gfx/cards/mewtwo2.pal" -Mewtwo3CardGfx:: ; e2158 (38:6158) +Mewtwo3CardGfx:: INCBIN "gfx/cards/mewtwo3.2bpp" INCBIN "gfx/cards/mewtwo3.pal" -Mew1CardGfx:: ; e2460 (38:6460) +Mew1CardGfx:: INCBIN "gfx/cards/mew1.2bpp" INCBIN "gfx/cards/mew1.pal" -Mew2CardGfx:: ; e2768 (38:6768) +Mew2CardGfx:: INCBIN "gfx/cards/mew2.2bpp" INCBIN "gfx/cards/mew2.pal" -Mew3CardGfx:: ; e2a70 (38:6a70) +Mew3CardGfx:: INCBIN "gfx/cards/mew3.2bpp" INCBIN "gfx/cards/mew3.pal" -PidgeyCardGfx:: ; e2d78 (38:6d78) +PidgeyCardGfx:: INCBIN "gfx/cards/pidgey.2bpp" INCBIN "gfx/cards/pidgey.pal" -PidgeottoCardGfx:: ; e3080 (38:7080) +PidgeottoCardGfx:: INCBIN "gfx/cards/pidgeotto.2bpp" INCBIN "gfx/cards/pidgeotto.pal" -Pidgeot1CardGfx:: ; e3388 (38:7388) +Pidgeot1CardGfx:: INCBIN "gfx/cards/pidgeot1.2bpp" INCBIN "gfx/cards/pidgeot1.pal" -Pidgeot2CardGfx:: ; e3690 (38:7690) +Pidgeot2CardGfx:: INCBIN "gfx/cards/pidgeot2.2bpp" INCBIN "gfx/cards/pidgeot2.pal" -RattataCardGfx:: ; e3998 (38:7998) +RattataCardGfx:: INCBIN "gfx/cards/rattata.2bpp" INCBIN "gfx/cards/rattata.pal" -RaticateCardGfx:: ; e3ca0 (38:7ca0) +RaticateCardGfx:: INCBIN "gfx/cards/raticate.2bpp" INCBIN "gfx/cards/raticate.pal" @@ -2172,87 +2172,87 @@ RaticateCardGfx:: ; e3ca0 (38:7ca0) SECTION "Card Gfx 9", ROMX -SpearowCardGfx:: ; e4000 (39:4000) +SpearowCardGfx:: INCBIN "gfx/cards/spearow.2bpp" INCBIN "gfx/cards/spearow.pal" -FearowCardGfx:: ; e4308 (39:4308) +FearowCardGfx:: INCBIN "gfx/cards/fearow.2bpp" INCBIN "gfx/cards/fearow.pal" -ClefairyCardGfx:: ; e4610 (39:4610) +ClefairyCardGfx:: INCBIN "gfx/cards/clefairy.2bpp" INCBIN "gfx/cards/clefairy.pal" -ClefableCardGfx:: ; e4918 (39:4918) +ClefableCardGfx:: INCBIN "gfx/cards/clefable.2bpp" INCBIN "gfx/cards/clefable.pal" -Jigglypuff1CardGfx:: ; e4c20 (39:4c20) +Jigglypuff1CardGfx:: INCBIN "gfx/cards/jigglypuff1.2bpp" INCBIN "gfx/cards/jigglypuff1.pal" -Jigglypuff2CardGfx:: ; e4f28 (39:4f28) +Jigglypuff2CardGfx:: INCBIN "gfx/cards/jigglypuff2.2bpp" INCBIN "gfx/cards/jigglypuff2.pal" -Jigglypuff3CardGfx:: ; e5230 (39:5230) +Jigglypuff3CardGfx:: INCBIN "gfx/cards/jigglypuff3.2bpp" INCBIN "gfx/cards/jigglypuff3.pal" -WigglytuffCardGfx:: ; e5538 (39:5538) +WigglytuffCardGfx:: INCBIN "gfx/cards/wigglytuff.2bpp" INCBIN "gfx/cards/wigglytuff.pal" -Meowth1CardGfx:: ; e5840 (39:5840) +Meowth1CardGfx:: INCBIN "gfx/cards/meowth1.2bpp" INCBIN "gfx/cards/meowth1.pal" -Meowth2CardGfx:: ; e5b48 (39:5b48) +Meowth2CardGfx:: INCBIN "gfx/cards/meowth2.2bpp" INCBIN "gfx/cards/meowth2.pal" -PersianCardGfx:: ; e5e50 (39:5e50) +PersianCardGfx:: INCBIN "gfx/cards/persian.2bpp" INCBIN "gfx/cards/persian.pal" -FarfetchdCardGfx:: ; e6158 (39:6158) +FarfetchdCardGfx:: INCBIN "gfx/cards/farfetchd.2bpp" INCBIN "gfx/cards/farfetchd.pal" -DoduoCardGfx:: ; e6460 (39:6460) +DoduoCardGfx:: INCBIN "gfx/cards/doduo.2bpp" INCBIN "gfx/cards/doduo.pal" -DodrioCardGfx:: ; e6768 (39:6768) +DodrioCardGfx:: INCBIN "gfx/cards/dodrio.2bpp" INCBIN "gfx/cards/dodrio.pal" -LickitungCardGfx:: ; e6a70 (39:6a70) +LickitungCardGfx:: INCBIN "gfx/cards/lickitung.2bpp" INCBIN "gfx/cards/lickitung.pal" -ChanseyCardGfx:: ; e6d78 (39:6d78) +ChanseyCardGfx:: INCBIN "gfx/cards/chansey.2bpp" INCBIN "gfx/cards/chansey.pal" -KangaskhanCardGfx:: ; e7080 (39:7080) +KangaskhanCardGfx:: INCBIN "gfx/cards/kangaskhan.2bpp" INCBIN "gfx/cards/kangaskhan.pal" -TaurosCardGfx:: ; e7388 (39:7388) +TaurosCardGfx:: INCBIN "gfx/cards/tauros.2bpp" INCBIN "gfx/cards/tauros.pal" -DittoCardGfx:: ; e7690 (39:7690) +DittoCardGfx:: INCBIN "gfx/cards/ditto.2bpp" INCBIN "gfx/cards/ditto.pal" -EeveeCardGfx:: ; e7998 (39:7998) +EeveeCardGfx:: INCBIN "gfx/cards/eevee.2bpp" INCBIN "gfx/cards/eevee.pal" -PorygonCardGfx:: ; e7ca0 (39:7ca0) +PorygonCardGfx:: INCBIN "gfx/cards/porygon.2bpp" INCBIN "gfx/cards/porygon.pal" @@ -2260,87 +2260,87 @@ PorygonCardGfx:: ; e7ca0 (39:7ca0) SECTION "Card Gfx 10", ROMX -SnorlaxCardGfx:: ; e8000 (3a:4000) +SnorlaxCardGfx:: INCBIN "gfx/cards/snorlax.2bpp" INCBIN "gfx/cards/snorlax.pal" -DratiniCardGfx:: ; e8308 (3a:4308) +DratiniCardGfx:: INCBIN "gfx/cards/dratini.2bpp" INCBIN "gfx/cards/dratini.pal" -DragonairCardGfx:: ; e8610 (3a:4610) +DragonairCardGfx:: INCBIN "gfx/cards/dragonair.2bpp" INCBIN "gfx/cards/dragonair.pal" -Dragonite1CardGfx:: ; e8918 (3a:4918) +Dragonite1CardGfx:: INCBIN "gfx/cards/dragonite1.2bpp" INCBIN "gfx/cards/dragonite1.pal" -Dragonite2CardGfx:: ; e8c20 (3a:4c20) +Dragonite2CardGfx:: INCBIN "gfx/cards/dragonite2.2bpp" INCBIN "gfx/cards/dragonite2.pal" -ProfessorOakCardGfx:: ; e8f28 (3a:4f28) +ProfessorOakCardGfx:: INCBIN "gfx/cards/professoroak.2bpp" INCBIN "gfx/cards/professoroak.pal" -ImposterProfessorOakCardGfx:: ; e9230 (3a:5230) +ImposterProfessorOakCardGfx:: INCBIN "gfx/cards/imposterprofessoroak.2bpp" INCBIN "gfx/cards/imposterprofessoroak.pal" -BillCardGfx:: ; e9538 (3a:5538) +BillCardGfx:: INCBIN "gfx/cards/bill.2bpp" INCBIN "gfx/cards/bill.pal" -MrFujiCardGfx:: ; e9840 (3a:5840) +MrFujiCardGfx:: INCBIN "gfx/cards/mrfuji.2bpp" INCBIN "gfx/cards/mrfuji.pal" -LassCardGfx:: ; e9b48 (3a:5b48) +LassCardGfx:: INCBIN "gfx/cards/lass.2bpp" INCBIN "gfx/cards/lass.pal" -ImakuniCardGfx:: ; e9e50 (3a:5e50) +ImakuniCardGfx:: INCBIN "gfx/cards/imakuni.2bpp" INCBIN "gfx/cards/imakuni.pal" -PokemonTraderCardGfx:: ; ea158 (3a:6158) +PokemonTraderCardGfx:: INCBIN "gfx/cards/pokemontrader.2bpp" INCBIN "gfx/cards/pokemontrader.pal" -PokemonBreederCardGfx:: ; ea460 (3a:6460) +PokemonBreederCardGfx:: INCBIN "gfx/cards/pokemonbreeder.2bpp" INCBIN "gfx/cards/pokemonbreeder.pal" -ClefairyDollCardGfx:: ; ea768 (3a:6768) +ClefairyDollCardGfx:: INCBIN "gfx/cards/clefairydoll.2bpp" INCBIN "gfx/cards/clefairydoll.pal" -MysteriousFossilCardGfx:: ; eaa70 (3a:6a70) +MysteriousFossilCardGfx:: INCBIN "gfx/cards/mysteriousfossil.2bpp" INCBIN "gfx/cards/mysteriousfossil.pal" -EnergyRetrievalCardGfx:: ; ead78 (3a:6d78) +EnergyRetrievalCardGfx:: INCBIN "gfx/cards/energyretrieval.2bpp" INCBIN "gfx/cards/energyretrieval.pal" -SuperEnergyRetrievalCardGfx:: ; eb080 (3a:7080) +SuperEnergyRetrievalCardGfx:: INCBIN "gfx/cards/superenergyretrieval.2bpp" INCBIN "gfx/cards/superenergyretrieval.pal" -EnergySearchCardGfx:: ; eb388 (3a:7388) +EnergySearchCardGfx:: INCBIN "gfx/cards/energysearch.2bpp" INCBIN "gfx/cards/energysearch.pal" -EnergyRemovalCardGfx:: ; eb690 (3a:7690) +EnergyRemovalCardGfx:: INCBIN "gfx/cards/energyremoval.2bpp" INCBIN "gfx/cards/energyremoval.pal" -SuperEnergyRemovalCardGfx:: ; eb998 (3a:7998) +SuperEnergyRemovalCardGfx:: INCBIN "gfx/cards/superenergyremoval.2bpp" INCBIN "gfx/cards/superenergyremoval.pal" -SwitchCardGfx:: ; ebca0 (3a:7ca0) +SwitchCardGfx:: INCBIN "gfx/cards/switch.2bpp" INCBIN "gfx/cards/switch.pal" @@ -2348,74 +2348,74 @@ SwitchCardGfx:: ; ebca0 (3a:7ca0) SECTION "Card Gfx 11", ROMX -PokemonCenterCardGfx:: ; ec000 (3b:4000) +PokemonCenterCardGfx:: INCBIN "gfx/cards/pokemoncenter.2bpp" INCBIN "gfx/cards/pokemoncenter.pal" -PokeBallCardGfx:: ; ec308 (3b:4308) +PokeBallCardGfx:: INCBIN "gfx/cards/pokeball.2bpp" INCBIN "gfx/cards/pokeball.pal" -ScoopUpCardGfx:: ; ec610 (3b:4610) +ScoopUpCardGfx:: INCBIN "gfx/cards/scoopup.2bpp" INCBIN "gfx/cards/scoopup.pal" -ComputerSearchCardGfx:: ; ec918 (3b:4918) +ComputerSearchCardGfx:: INCBIN "gfx/cards/computersearch.2bpp" INCBIN "gfx/cards/computersearch.pal" -PokedexCardGfx:: ; ecc20 (3b:4c20) +PokedexCardGfx:: INCBIN "gfx/cards/pokedex.2bpp" INCBIN "gfx/cards/pokedex.pal" -PlusPowerCardGfx:: ; ecf28 (3b:4f28) +PlusPowerCardGfx:: INCBIN "gfx/cards/pluspower.2bpp" INCBIN "gfx/cards/pluspower.pal" -DefenderCardGfx:: ; ed230 (3b:5230) +DefenderCardGfx:: INCBIN "gfx/cards/defender.2bpp" INCBIN "gfx/cards/defender.pal" -ItemFinderCardGfx:: ; ed538 (3b:5538) +ItemFinderCardGfx:: INCBIN "gfx/cards/itemfinder.2bpp" INCBIN "gfx/cards/itemfinder.pal" -GustOfWindCardGfx:: ; ed840 (3b:5840) +GustOfWindCardGfx:: INCBIN "gfx/cards/gustofwind.2bpp" INCBIN "gfx/cards/gustofwind.pal" -DevolutionSprayCardGfx:: ; edb48 (3b:5b48) +DevolutionSprayCardGfx:: INCBIN "gfx/cards/devolutionspray.2bpp" INCBIN "gfx/cards/devolutionspray.pal" -PotionCardGfx:: ; ede50 (3b:5e50) +PotionCardGfx:: INCBIN "gfx/cards/potion.2bpp" INCBIN "gfx/cards/potion.pal" -SuperPotionCardGfx:: ; ee158 (3b:6158) +SuperPotionCardGfx:: INCBIN "gfx/cards/superpotion.2bpp" INCBIN "gfx/cards/superpotion.pal" -FullHealCardGfx:: ; ee460 (3b:6460) +FullHealCardGfx:: INCBIN "gfx/cards/fullheal.2bpp" INCBIN "gfx/cards/fullheal.pal" -ReviveCardGfx:: ; ee768 (3b:6768) +ReviveCardGfx:: INCBIN "gfx/cards/revive.2bpp" INCBIN "gfx/cards/revive.pal" -MaintenanceCardGfx:: ; eea70 (3b:6a70) +MaintenanceCardGfx:: INCBIN "gfx/cards/maintenance.2bpp" INCBIN "gfx/cards/maintenance.pal" -PokemonFluteCardGfx:: ; eed78 (3b:6d78) +PokemonFluteCardGfx:: INCBIN "gfx/cards/pokemonflute.2bpp" INCBIN "gfx/cards/pokemonflute.pal" -GamblerCardGfx:: ; ef080 (3b:7080) +GamblerCardGfx:: INCBIN "gfx/cards/gambler.2bpp" INCBIN "gfx/cards/gambler.pal" -RecycleCardGfx:: ; ef388 (3b:7388) +RecycleCardGfx:: INCBIN "gfx/cards/recycle.2bpp" INCBIN "gfx/cards/recycle.pal" diff --git a/src/home/ai.asm b/src/home/ai.asm index 270168f..b3834c1 100644 --- a/src/home/ai.asm +++ b/src/home/ai.asm @@ -70,7 +70,7 @@ AIDoAction_TakePrize: jr AIDoAction ; this line is not needed ; calls the appropriate AI routine to handle action, -; depending on the deck ID (see engine/ai/deck_ai.asm) +; depending on the deck ID (see engine/duel/ai/deck_ai.asm) ; input: ; - a = AIACTION_* constant AIDoAction: diff --git a/src/home/lcd.asm b/src/home/lcd.asm index 5e8fc5d..415aea0 100644 --- a/src/home/lcd.asm +++ b/src/home/lcd.asm @@ -69,14 +69,14 @@ Set_OBJ_8x16: ret ; set Window Display on -Set_WD_on: +SetWindowOn: ld a, [wLCDC] or LCDC_WINON ld [wLCDC], a ret ; set Window Display off -Set_WD_off: +SetWindowOff: ld a, [wLCDC] and LCDC_WINOFF ld [wLCDC], a diff --git a/src/home/map.asm b/src/home/map.asm index b00d456..4609b46 100644 --- a/src/home/map.asm +++ b/src/home/map.asm @@ -141,7 +141,7 @@ GameEvent_ContinueDuel: ret GameEvent_Credits: - farcall Credits_1d6ad + farcall PlayCreditsSequence or a ret diff --git a/src/layout.link b/src/layout.link index 6b19bfe..e913aa3 100644 --- a/src/layout.link +++ b/src/layout.link @@ -36,7 +36,7 @@ ROMX $01 "Duel Core" "Menus Common" ROMX $02 - "Menus" + "Menus 1" ROMX $03 "Overworld Scripting" ROMX $04 @@ -44,9 +44,24 @@ ROMX $04 ROMX $05 "AI Logic 1" ROMX $06 - "Bank 6" + "Menus 2" + "Effect Commands" + "Animation Commands" + "IR Communications Core" + "Sprite Animations VBlank" + "Starter Deck" + "Link Functions" + "Promotional Card" + "Booster Pack Menu" + "Unused Save Validation" + "Input Name" + "Auto Deck Machines" ROMX $07 "Bank 7" + "Duel Animations" + "Start Menu" + "Intro Sequence" + "Unused Copyright" "Credits Sequence" "Booster Packs" ROMX $08 @@ -83,13 +98,14 @@ ROMX $18 ROMX $19 "Text 13" ROMX $1c - "Bank 1C" + "SGB" ROMX $1d "Gfx 1" ROMX $1e "Gfx 2" ROMX $20 "Bank 20" + "Gfx" ROMX $21 "Gfx 3" ROMX $22 diff --git a/src/macros/intro_sequence.asm b/src/macros/intro_sequence.asm new file mode 100644 index 0000000..8c92b26 --- /dev/null +++ b/src/macros/intro_sequence.asm @@ -0,0 +1,63 @@ +intro_seq_wait_orbs_animation: MACRO + dw IntroSequenceCmd_WaitOrbsAnimation +ENDM + +; argument = frames to delay +intro_seq_wait: MACRO + dw IntroSequenceCmd_Wait + db \1 +ENDM + +; argument = list of animations to set +intro_seq_set_orbs_animations: MACRO + dw IntroSequenceCmd_SetOrbsAnimations + dw \1 +ENDM + +; argument = list of coordinates to set +intro_seq_set_orbs_coordinates: MACRO + dw IntroSequenceCmd_SetOrbsCoordinates + dw \1 +ENDM + +intro_seq_play_title_screen_music: MACRO + dw IntroSequenceCmd_PlayTitleScreenMusic +ENDM + +intro_seq_wait_sfx: MACRO + dw IntroSequenceCmd_WaitSFX +ENDM + +; argument = SFX to play +intro_seq_play_sfx: MACRO + dw IntroSequenceCmd_PlaySFX + db \1 +ENDM + +intro_seq_fade_in: MACRO + dw IntroSequenceCmd_FadeIn +ENDM + +intro_seq_fade_out: MACRO + dw IntroSequenceCmd_FadeOut +ENDM + +intro_seq_load_charizard_scene: MACRO + dw IntroSequenceCmd_LoadCharizardScene +ENDM + +intro_seq_load_scyther_scene: MACRO + dw IntroSequenceCmd_LoadScytherScene +ENDM + +intro_seq_load_aerodactyl_scene: MACRO + dw IntroSequenceCmd_LoadAerodactylScene +ENDM + +intro_seq_load_title_screen_scene: MACRO + dw IntroSequenceCmd_LoadTitleScreenScene +ENDM + +intro_seq_end: MACRO + intro_seq_wait $ff +ENDM diff --git a/src/macros/opening_sequence.asm b/src/macros/opening_sequence.asm deleted file mode 100644 index b864c3c..0000000 --- a/src/macros/opening_sequence.asm +++ /dev/null @@ -1,63 +0,0 @@ -opening_seq_wait_orbs_animation: MACRO - dw OpeningSequenceCmd_WaitOrbsAnimation -ENDM - -; argument = frames to delay -opening_seq_wait: MACRO - dw OpeningSequenceCmd_Wait - db \1 -ENDM - -; argument = list of animations to set -opening_seq_set_orbs_animations: MACRO - dw OpeningSequenceCmd_SetOrbsAnimations - dw \1 -ENDM - -; argument = list of coordinates to set -opening_seq_set_orbs_coordinates: MACRO - dw OpeningSequenceCmd_SetOrbsCoordinates - dw \1 -ENDM - -opening_seq_play_title_screen_music: MACRO - dw OpeningSequenceCmd_PlayTitleScreenMusic -ENDM - -opening_seq_wait_sfx: MACRO - dw OpeningSequenceCmd_WaitSFX -ENDM - -; argument = SFX to play -opening_seq_play_sfx: MACRO - dw OpeningSequenceCmd_PlaySFX - db \1 -ENDM - -opening_seq_fade_in: MACRO - dw OpeningSequenceCmd_FadeIn -ENDM - -opening_seq_fade_out: MACRO - dw OpeningSequenceCmd_FadeOut -ENDM - -opening_seq_load_charizard_scene: MACRO - dw OpeningSequenceCmd_LoadCharizardScene -ENDM - -opening_seq_load_scyther_scene: MACRO - dw OpeningSequenceCmd_LoadScytherScene -ENDM - -opening_seq_load_aerodactyl_scene: MACRO - dw OpeningSequenceCmd_LoadAerodactylScene -ENDM - -opening_seq_load_title_screen_scene: MACRO - dw OpeningSequenceCmd_LoadTitleScreenScene -ENDM - -opening_seq_end: MACRO - opening_seq_wait $ff -ENDM diff --git a/src/main.asm b/src/main.asm index 6ee64d1..f892cfb 100644 --- a/src/main.asm +++ b/src/main.asm @@ -12,7 +12,7 @@ INCLUDE "engine/duel/core.asm" SECTION "Menus Common", ROMX INCLUDE "engine/menus/common.asm" -SECTION "Menus", ROMX +SECTION "Menus 1", ROMX INCLUDE "engine/menus/duel.asm" INCLUDE "engine/menus/deck_selection.asm" INCLUDE "engine/menus/deck_check.asm" @@ -30,28 +30,83 @@ INCLUDE "engine/bank04.asm" SECTION "AI Logic 1", ROMX INCLUDE "data/deck_ai_pointers.asm" -INCLUDE "engine/ai/core.asm" +INCLUDE "engine/duel/ai/core.asm" -SECTION "Bank 6", ROMX -INCLUDE "engine/bank06.asm" +SECTION "Menus 2", ROMX +INCLUDE "engine/copy_card_name.asm" +INCLUDE "engine/menus/play_area.asm" +INCLUDE "engine/menus/glossary.asm" +INCLUDE "engine/menus/unknown.asm" + +SECTION "Effect Commands", ROMX +INCLUDE "engine/duel/effect_commands.asm" + +SECTION "Animation Commands", ROMX +INCLUDE "engine/duel/animations/commands.asm" + +SECTION "IR Communications Core", ROMX +INCLUDE "engine/link/ir_core.asm" + +SECTION "Sprite Animations VBlank", ROMX +INCLUDE "engine/gfx/sprite_vblank.asm" + +SECTION "Starter Deck", ROMX +INCLUDE "engine/starter_deck.asm" + +SECTION "Link Functions", ROMX +INCLUDE "engine/link/ir_functions.asm" +INCLUDE "engine/link/card_pop.asm" +INCLUDE "engine/link/printer.asm" +INCLUDE "engine/link/link_duel.asm" + +SECTION "Promotional Card", ROMX +INCLUDE "engine/promotional_card.asm" + +SECTION "Booster Pack Menu", ROMX +INCLUDE "engine/menus/booster_pack.asm" + +SECTION "Unused Save Validation", ROMX +INCLUDE "engine/unused_save_validation.asm" + +SECTION "Input Name", ROMX +INCLUDE "engine/input_name.asm" + +SECTION "Auto Deck Machines", ROMX +INCLUDE "engine/auto_deck_machines.asm" SECTION "Bank 7", ROMX INCLUDE "engine/bank07.asm" +SECTION "Duel Animations", ROMX +INCLUDE "engine/duel/animations/core.asm" +INCLUDE "engine/duel/animations/screen_effects.asm" +INCLUDE "data/duel/animations/duel_animations.asm" + +SECTION "Start Menu", ROMX +INCLUDE "engine/menus/start.asm" + +SECTION "Intro Sequence", ROMX +INCLUDE "engine/intro.asm" +INCLUDE "engine/sequences/intro_sequence_commands.asm" + +SECTION "Unused Copyright", ROMX +INCLUDE "engine/unused_copyright.asm" + SECTION "Credits Sequence", ROMX +INCLUDE "engine/credits.asm" INCLUDE "engine/sequences/credits_sequence_commands.asm" -INCLUDE "data/sequences/credits_sequence.asm" +INCLUDE "data/sequences/credits.asm" SECTION "Booster Packs", ROMX INCLUDE "engine/booster_packs.asm" SECTION "AI Logic 2", ROMX -INCLUDE "engine/ai/trainer_cards.asm" -INCLUDE "engine/ai/pkmn_powers.asm" -INCLUDE "engine/ai/common.asm" +INCLUDE "engine/duel/ai/trainer_cards.asm" +INCLUDE "engine/duel/ai/pkmn_powers.asm" +INCLUDE "engine/duel/ai/common.asm" SECTION "Effect Functions", ROMX -INCLUDE "engine/effect_functions.asm" +INCLUDE "engine/duel/effect_functions.asm" SECTION "Decks", ROMX INCLUDE "data/decks.asm" @@ -59,8 +114,17 @@ INCLUDE "data/decks.asm" SECTION "Cards", ROMX INCLUDE "data/cards.asm" -SECTION "Bank 1C", ROMX -INCLUDE "engine/bank1c.asm" +SECTION "SGB", ROMX +INCLUDE "engine/sgb.asm" SECTION "Bank 20", ROMX INCLUDE "engine/bank20.asm" + +SECTION "Gfx", ROMX +INCLUDE "engine/gfx/gfx_table_pointers.asm" +INCLUDE "engine/gfx/tilemaps.asm" +INCLUDE "engine/gfx/tilesets.asm" +INCLUDE "engine/gfx/sprites.asm" +INCLUDE "engine/gfx/sprite_animations.asm" +INCLUDE "engine/gfx/palettes.asm" +INCLUDE "data/maps/tilemaps.asm" diff --git a/src/sram.asm b/src/sram.asm index b1ba680..90e1093 100644 --- a/src/sram.asm +++ b/src/sram.asm @@ -29,7 +29,7 @@ sSkipDelayAllowed:: ; a009 ds $1 sReceivedLegendaryCards:: ; a00a ds $1 -s0a00b:: ; a00b +sUnusedSaveDataValidationByte:: ; a00b ds $1 s0a00c:: ; a00c ds $4 diff --git a/src/text/text1.asm b/src/text/text1.asm index e6192ee..39bd82d 100644 --- a/src/text/text1.asm +++ b/src/text/text1.asm @@ -763,7 +763,7 @@ ResetBackUpRamText: ; 372a9 (d:72a9) text "Reset Back Up RAM?" done -Text00a3: ; 372bd (d:72bd) +YourDataWasDestroyedSomehowText: ; 372bd (d:72bd) text "Your Data was destroyed" line "somehow." line "" diff --git a/src/text/text_offsets.asm b/src/text/text_offsets.asm index 0d212c2..ff38daa 100644 --- a/src/text/text_offsets.asm +++ b/src/text/text_offsets.asm @@ -164,7 +164,7 @@ TextOffsets:: ; 34000 (d:4000) textpointer Text00a0 ; 0x00a0 textpointer Text00a1 ; 0x00a1 textpointer ResetBackUpRamText ; 0x00a2 - textpointer Text00a3 ; 0x00a3 + textpointer YourDataWasDestroyedSomehowText ; 0x00a3 textpointer NoCardsInHandText ; 0x00a4 textpointer TheDiscardPileHasNoCardsText ; 0x00a5 textpointer PlayerDiscardPileText ; 0x00a6 diff --git a/src/wram.asm b/src/wram.asm index 19c680b..157bf0f 100644 --- a/src/wram.asm +++ b/src/wram.asm @@ -3113,7 +3113,7 @@ wTitleScreenSprites:: ; d629 ds $1 ; pointer to commands used by opening and credits sequence -; (see OpeningSequence and CreditsSequence) +; (see IntroSequence and CreditsSequence) wSequenceCmdPtr:: ; d631 ds $2 @@ -3123,7 +3123,7 @@ wSequenceCmdPtr:: ; d631 wSequenceDelay:: ; d633 ds $1 -wOpeningSequencePalsNeedUpdate:: ; d634 +wIntroSequencePalsNeedUpdate:: ; d634 ds $1 wd635:: ; d635 |