From aae999f72bd81a3156c7e00da4ebf499f52da5a6 Mon Sep 17 00:00:00 2001 From: Rangi Date: Wed, 4 Nov 2020 15:16:20 -0500 Subject: Start reorganizing pokeyellow --- engine/animated_objects_3e.asm | 394 --- engine/bank30.bin | Bin 16384 -> 0 bytes engine/bank3c.asm | 189 -- engine/bank3d.asm | 491 ---- engine/bank3e.asm | 5 - engine/bank3f.asm | 23 - engine/battle/animations.asm | 6 +- engine/battle/bank3d_battle.asm | 292 -- engine/battle/init_battle.asm | 282 ++ engine/battle/pikachu_entrance_anim.asm | 47 + engine/bg_map_attributes.asm | 219 -- engine/diploma_3a.asm | 168 -- engine/events/diploma2.asm | 171 ++ .../events/hidden_objects/vermilion_gym_trash2.asm | 108 + engine/events/pikachu_happiness.asm | 118 + engine/events/pokecenter_chansey.asm | 11 + engine/events/try_pikachu_movement.asm | 27 + engine/gfx/animated_objects.asm | 394 +++ engine/gfx/bg_map_attributes.asm | 219 ++ engine/gfx/palettes.asm | 34 +- engine/gfx/sprite_oam.asm | 2 +- engine/items/item_effects.asm | 4 +- engine/items/super_rod.asm | 41 + engine/menus/draw_badges.asm | 3 +- engine/menus/start_sub_menus.asm | 5 +- engine/menus/unused_input.asm | 129 + engine/minigame/surfing_pikachu.asm | 2863 ++++++++++++++++++++ engine/movie/intro_yellow.asm | 1085 ++++++++ engine/movie/title.asm | 2 +- engine/movie/title2.asm | 122 - engine/movie/title_rb.asm | 122 + engine/movie/title_yellow.asm | 109 + engine/overworld/healing_machine.asm | 2 +- engine/overworld/missable_objects.asm | 8 +- engine/overworld/specific_script_flags.asm | 25 + engine/overworld/sprite_collisions.asm | 2 +- .../overworld/unused_load_missable_object_data.asm | 40 + engine/pikachu/pikachu_emotions.asm | 422 +++ engine/pikachu/pikachu_follow.asm | 1578 +++++++++++ engine/pikachu/pikachu_movement.asm | 1048 +++++++ engine/pikachu/pikachu_pcm.asm | 154 ++ engine/pikachu/pikachu_pic_animation.asm | 855 ++++++ engine/pikachu/pikachu_status.asm | 258 ++ engine/pikachu/respawn_overworld_pikachu.asm | 6 + engine/pikachu_emotions.asm | 421 --- engine/pikachu_follow.asm | 1578 ----------- engine/pikachu_movement.asm | 1048 ------- engine/pikachu_pcm.asm | 154 -- engine/pikachu_pic_animation.asm | 851 ------ engine/pikachu_status.asm | 258 -- engine/printer.asm | 999 ------- engine/printer/printer.asm | 986 +++++++ engine/printer/printer2.asm | 973 +++++++ engine/printer/serial.asm | 15 +- engine/surfing_minigame.asm | 2862 ------------------- engine/unknown_ea3ea.asm | 973 ------- engine/vermilion_gym_trash_cans.asm | 108 - engine/yellow_intro.asm | 1081 -------- 58 files changed, 12116 insertions(+), 12274 deletions(-) delete mode 100755 engine/animated_objects_3e.asm delete mode 100644 engine/bank30.bin delete mode 100644 engine/bank3c.asm delete mode 100644 engine/bank3d.asm delete mode 100644 engine/bank3e.asm delete mode 100644 engine/bank3f.asm delete mode 100644 engine/battle/bank3d_battle.asm create mode 100644 engine/battle/init_battle.asm create mode 100644 engine/battle/pikachu_entrance_anim.asm delete mode 100644 engine/bg_map_attributes.asm delete mode 100755 engine/diploma_3a.asm create mode 100755 engine/events/diploma2.asm create mode 100644 engine/events/hidden_objects/vermilion_gym_trash2.asm create mode 100644 engine/events/pikachu_happiness.asm create mode 100644 engine/events/pokecenter_chansey.asm create mode 100644 engine/events/try_pikachu_movement.asm create mode 100755 engine/gfx/animated_objects.asm create mode 100644 engine/gfx/bg_map_attributes.asm create mode 100644 engine/items/super_rod.asm create mode 100644 engine/menus/unused_input.asm create mode 100755 engine/minigame/surfing_pikachu.asm create mode 100755 engine/movie/intro_yellow.asm delete mode 100755 engine/movie/title2.asm create mode 100755 engine/movie/title_rb.asm create mode 100644 engine/movie/title_yellow.asm create mode 100644 engine/overworld/specific_script_flags.asm create mode 100644 engine/overworld/unused_load_missable_object_data.asm create mode 100755 engine/pikachu/pikachu_emotions.asm create mode 100755 engine/pikachu/pikachu_follow.asm create mode 100755 engine/pikachu/pikachu_movement.asm create mode 100755 engine/pikachu/pikachu_pcm.asm create mode 100755 engine/pikachu/pikachu_pic_animation.asm create mode 100755 engine/pikachu/pikachu_status.asm create mode 100644 engine/pikachu/respawn_overworld_pikachu.asm delete mode 100755 engine/pikachu_emotions.asm delete mode 100755 engine/pikachu_follow.asm delete mode 100755 engine/pikachu_movement.asm delete mode 100755 engine/pikachu_pcm.asm delete mode 100755 engine/pikachu_pic_animation.asm delete mode 100755 engine/pikachu_status.asm delete mode 100644 engine/printer.asm create mode 100644 engine/printer/printer.asm create mode 100755 engine/printer/printer2.asm delete mode 100755 engine/surfing_minigame.asm delete mode 100755 engine/unknown_ea3ea.asm delete mode 100755 engine/vermilion_gym_trash_cans.asm delete mode 100755 engine/yellow_intro.asm (limited to 'engine') diff --git a/engine/animated_objects_3e.asm b/engine/animated_objects_3e.asm deleted file mode 100755 index 2373e19e..00000000 --- a/engine/animated_objects_3e.asm +++ /dev/null @@ -1,394 +0,0 @@ -ClearObjectAnimationBuffers: - ld hl, wAnimatedObjectsData - ld bc, wAnimatedObjectsDataEnd - wAnimatedObjectsData - xor a - call FillMemory - ret - -RunObjectAnimations: - ld hl, wAnimatedObjectDataStructs - ld e, 10 -.loop - ld a, [hl] - and a - jr z, .next - ld c, l - ld b, h - push hl - push de - call ExecuteCurrentAnimatedObjectCallback - call UpdateCurrentAnimatedObjectFrame - pop de - pop hl - jr c, .quit -.next - ld bc, $10 - add hl, bc - dec e - jr nz, .loop - ld a, [wCurrentAnimatedObjectOAMBufferOffset] - ld l, a - ld h, wOAMBuffer / $100 -.deinit_unused_oam_loop - ld a, l - cp wOAMBufferEnd % $100 - jr nc, .quit - xor a - ld [hli], a - jr .deinit_unused_oam_loop - -.quit - ret - -SpawnAnimatedObject: - push de - push af - ld hl, wAnimatedObjectDataStructs - ld e, 10 -.loop - ld a, [hl] - and a - jr z, .init - ld bc, $10 - add hl, bc - dec e - jr nz, .loop - pop af - pop de - scf - ret - -.init - pop af - ld c, l - ld b, h - ld hl, wNumLoadedAnimatedObjects - inc [hl] - ld e, a - ld d, $0 - ld a, [wAnimatedObjectSpawnStateDataPointer] - ld l, a - ld a, [wAnimatedObjectSpawnStateDataPointer + 1] - ld h, a - add hl, de - add hl, de - add hl, de - ld e, l - ld d, h - ld hl, $0 - add hl, bc - ld a, [wNumLoadedAnimatedObjects] - ld [hli], a - ld a, [de] - ld [hli], a - inc de - ld a, [de] - ld [hli], a - inc de - xor a - ld [hli], a - pop de - ld hl, $4 - add hl, bc - ld a, e - ld [hli], a - ld a, d - ld [hli], a - xor a - ld [hli], a - ld [hli], a - xor a - ld [hli], a - ld [hli], a - dec a - ld [hli], a - xor a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ret - -MaskCurrentAnimatedObjectStruct: - ld hl, $0 - add hl, bc - ld [hl], $0 - ret - -MaskAllAnimatedObjectStructs: - ld hl, wAnimatedObjectDataStructs - ld e, 10 -.loop - ld [hl], $0 - ld bc, $10 - add hl, bc - dec e - jr nz, .loop - ret - -UpdateCurrentAnimatedObjectFrame: - xor a - ld [wCurAnimatedObjectOAMAttributes], a - ld hl, $3 - add hl, bc - ld a, [hli] - ld [wCurrentAnimatedObjectVTileOffset], a - ld a, [hli] - ld [wCurrentAnimatedObjectXCoord], a - ld a, [hli] - ld [wCurrentAnimatedObjectYCoord], a - ld a, [hli] - ld [wCurrentAnimatedObjectXOffset], a - ld a, [hl] - ld [wCurrentAnimatedObjectYOffset], a - call UpdateDurationTimerAndFrameStateForCurrentAnimatedObject - cp $fd - jr z, .finish - cp $fc - jr z, .delete_animation - call GetCurrentAnimatedObjectOAMDataPointer - ld a, [wCurrentAnimatedObjectVTileOffset] - add [hl] - ld [wCurrentAnimatedObjectVTileOffset], a - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - push bc - ld a, [wCurrentAnimatedObjectOAMBufferOffset] - ld e, a - ld d, wOAMBuffer / $100 - ld a, [hli] - ld c, a -.loop - ld a, [wCurrentAnimatedObjectYCoord] - ld b, a - ld a, [wCurrentAnimatedObjectYOffset] - add b - ld b, a - ld a, [wAnimatedObjectGlobalYOffset] - add b - ld b, a - call GetCurrentAnimatedObjectTileYCoordinate - add b - ld [de], a - inc hl - inc de - ld a, [wCurrentAnimatedObjectXCoord] - ld b, a - ld a, [wCurrentAnimatedObjectXOffset] - add b - ld b, a - ld a, [wAnimatedObjectGlobalXOffset] - add b - ld b, a - call GetCurrentAnimatedObjectTileXCoordinate - add b - ld [de], a - inc hl - inc de - ld a, [wCurrentAnimatedObjectVTileOffset] - add [hl] - ld [de], a - inc hl - inc de - call SetCurrentAnimatedObjectOAMAttributes - ld b, a - ld a, [wc634] - cp $7 - ld a, b - jr z, .skip_load - ld [de], a -.skip_load - inc hl - inc de - ld a, e - ld [wCurrentAnimatedObjectOAMBufferOffset], a - cp wOAMBufferEnd % $100 - jr nc, .oam_is_full - dec c - jr nz, .loop - pop bc - jr .finish - -.delete_animation - call MaskCurrentAnimatedObjectStruct -.finish - and a - ret - -.oam_is_full - pop bc - scf - ret - -GetCurrentAnimatedObjectTileYCoordinate: - push hl - ld a, [hl] - ld hl, wCurAnimatedObjectOAMAttributes - bit 6, [hl] - jr z, .no_flip - add $8 - xor $ff - inc a -.no_flip - pop hl - ret - -GetCurrentAnimatedObjectTileXCoordinate: - push hl - ld a, [hl] - ld hl, wCurAnimatedObjectOAMAttributes - bit 5, [hl] - jr z, .no_flip - add $8 - xor $ff - inc a -.no_flip - pop hl - ret - -SetCurrentAnimatedObjectOAMAttributes: - ld a, [wCurAnimatedObjectOAMAttributes] - ld b, a - ld a, [hl] - xor b - and $e0 - ld b, a - ld a, [hl] - and $10 - or b - bit 4, a - ret z - or $4 - ret - -GetCurrentAnimatedObjectOAMDataPointer: - ld e, a - ld d, $0 - ld a, [wAnimatedObjectOAMDataPointer] - ld l, a - ld a, [wAnimatedObjectOAMDataPointer + 1] - ld h, a - add hl, de - add hl, de - add hl, de - ret - -SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters: - ld hl, $1 - add hl, bc - ld [hl], a - ld hl, $8 - add hl, bc - ld [hl], $0 - ld hl, $9 - add hl, bc - ld [hl], $0 - ld hl, $a - add hl, bc - ld [hl], $ff - ret - -UpdateDurationTimerAndFrameStateForCurrentAnimatedObject: -.loop - ld hl, $8 - add hl, bc - ld a, [hl] - and a - jr z, .next_frame - dec [hl] - call GetPointerToCurrentAnimatedObjectFrameScript - ld a, [hli] - push af - jr .finish - -.next_frame - ld hl, $a - add hl, bc - inc [hl] - call GetPointerToCurrentAnimatedObjectFrameScript - ld a, [hli] - cp $fe - jr z, .restart_anim - cp $ff - jr z, .hold_last_frame_state - push af - ld a, [hl] - push hl - and $3f - ld hl, $9 - add hl, bc - add [hl] - ld hl, $8 - add hl, bc - ld [hl], a - pop hl -.finish - ld a, [hl] - and $c0 - srl a - ld [wCurAnimatedObjectOAMAttributes], a - pop af - ret - -.hold_last_frame_state - xor a - ld hl, $8 - add hl, bc - ld [hl], a - ld hl, $a - add hl, bc - dec [hl] - dec [hl] - jr .loop - -.restart_anim - xor a - ld hl, $8 - add hl, bc - ld [hl], a - dec a - ld hl, $a - add hl, bc - ld [hl], a - jr .loop - -GetPointerToCurrentAnimatedObjectFrameScript: - ld hl, $1 - add hl, bc - ld e, [hl] - ld d, $0 - ld a, [wAnimatedObjectFramesDataPointer] - ld l, a - ld a, [wAnimatedObjectFramesDataPointer + 1] - ld h, a - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $a - add hl, bc - ld l, [hl] - ld h, $0 - add hl, hl - add hl, de - ret - -ExecuteCurrentAnimatedObjectCallback: - ld hl, $2 - add hl, bc - ld e, [hl] - ld d, $0 - ld a, [wAnimatedObjectJumptablePointer] - ld l, a - ld a, [wAnimatedObjectJumptablePointer + 1] - ld h, a - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl diff --git a/engine/bank30.bin b/engine/bank30.bin deleted file mode 100644 index 6309c149..00000000 Binary files a/engine/bank30.bin and /dev/null differ diff --git a/engine/bank3c.asm b/engine/bank3c.asm deleted file mode 100644 index 8eb32837..00000000 --- a/engine/bank3c.asm +++ /dev/null @@ -1,189 +0,0 @@ -INCLUDE "engine/pikachu_pcm.asm" -INCLUDE "engine/overworld/advance_player_sprite.asm" - -INCLUDE "engine/events/black_out.asm" - -SetMapSpecificScriptFlagsOnMapReload:: - ld a, [wCurMap] - cp VERMILION_GYM ; ??? new thing about verm gym? - jr z, .verm_gym - ld c, a - ld hl, .MapList -.search_loop - ld a, [hli] - cp c - jr z, .in_list - cp a, $ff - jr nz, .search_loop - ret - -.verm_gym - ld hl, wCurrentMapScriptFlags - set 6, [hl] - ret - -.in_list - ld hl, wCurrentMapScriptFlags - set 5, [hl] - ret - -.MapList - db SILPH_CO_2F - db SILPH_CO_3F - db SILPH_CO_4F - db SILPH_CO_5F - db SILPH_CO_6F - db SILPH_CO_7F - db SILPH_CO_8F - db SILPH_CO_9F - db SILPH_CO_10F - db SILPH_CO_11F - db POKEMON_MANSION_2F - db POKEMON_MANSION_3F - db POKEMON_MANSION_B1F - db POKEMON_MANSION_1F - db CINNABAR_GYM - db GAME_CORNER - db ROCKET_HIDEOUT_B1F - db ROCKET_HIDEOUT_B4F - db VICTORY_ROAD_3F - db VICTORY_ROAD_1F - db VICTORY_ROAD_2F - db LANCES_ROOM - db LORELEIS_ROOM - db BRUNOS_ROOM - db AGATHAS_ROOM - db $ff - -BeachHouse_GFX: - INCBIN "gfx/tilesets/beachhouse.2bpp" - ds 384 - -BeachHouse_Block: - INCBIN "gfx/blocksets/beachhouse.bst" - -Func_f0a54: - ret - -LoadUnusedBluesHouseMissableObjectData:: -; referenced in an unused function - ld hl, .MissableObjectsMaps -.loop - ld a, [hli] - cp a, $ff - ret z - ld b, a - ld a, [wCurMap] - cp b - jr z, .found - inc hl - inc hl - inc hl - jr .loop - -.found - ld a, [hli] - ld c, a - ld b, 0 - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wMissableObjectList - call CopyData - ret - -.MissableObjectsMaps: - dbbw BLUES_HOUSE, .End - .Start, .Start - db $ff - -.Start: - db 1, HS_DAISY_SITTING_COPY - db 2, HS_DAISY_WALKING_COPY - db 3, HS_TOWN_MAP_COPY - db $ff -.End: - -TryApplyPikachuMovementData: - ld a, [wd472] - bit 7, a - ret z - ld a, [wWalkBikeSurfState] - and a - ret nz - push hl - push bc - callfar GetPikachuFacingDirectionAndReturnToE - pop bc - pop hl - ld a, b - cp e - ret nz - push hl - ld a, [wUpdateSpritesEnabled] - push af - ld a, $ff - ld [wUpdateSpritesEnabled], a - callfar LoadPikachuShadowIntoVRAM - pop af - ld [wUpdateSpritesEnabled], a - pop hl - call ApplyPikachuMovementData - callfar RefreshPikachuFollow - ret - -Pic_f0abf: -INCBIN "gfx/pikachu/unknown_f0abf.pic" -GFX_f0b64: -INCBIN "gfx/pikachu/unknown_f0b64.2bpp" -Pic_f0cf4: -INCBIN "gfx/pikachu/unknown_f0cf4.pic" -GFX_f0d82: -INCBIN "gfx/pikachu/unknown_f0d82.2bpp" - -PokecenterChanseyText:: - ld hl, NurseChanseyText - call PrintText - ld a, CHANSEY - call PlayCry - call WaitForSoundToFinish - ret - -NurseChanseyText: - text_far _NurseChanseyText - text_end - -INCLUDE "engine/movie/credits.asm" -INCLUDE "scripts/ViridianCity2.asm" -INCLUDE "scripts/VermilionCity2.asm" -INCLUDE "scripts/CeladonCity2.asm" -INCLUDE "scripts/Route1_2.asm" -INCLUDE "scripts/Route22_2.asm" -INCLUDE "scripts/RedsHouse1F2.asm" -INCLUDE "scripts/OaksLab2.asm" -INCLUDE "scripts/ViridianSchoolHouse2.asm" -INCLUDE "scripts/Museum1F2.asm" -INCLUDE "scripts/PewterPokecenter2.asm" -INCLUDE "scripts/PokemonTower2F_2.asm" -INCLUDE "scripts/CeladonMart3F_2.asm" -INCLUDE "scripts/CeladonMansion1F_2.asm" -INCLUDE "scripts/CeladonMansion3F_2.asm" -INCLUDE "scripts/GameCorner2.asm" -INCLUDE "scripts/CeladonDiner2.asm" -INCLUDE "scripts/SafariZoneGate2.asm" -INCLUDE "scripts/CinnabarGym3.asm" -INCLUDE "scripts/MtMoonPokecenter2.asm" - -INCLUDE "data/maps/headers/BeachHouse.asm" -INCLUDE "scripts/BeachHouse.asm" -BeachHouse_Blocks: -INCBIN "maps/BeachHouse.blk" -INCLUDE "data/maps/objects/BeachHouse.asm" - -INCLUDE "scripts/BeachHouse2.asm" -INCLUDE "scripts/BillsHouse2.asm" -INCLUDE "scripts/ViridianForest2.asm" -INCLUDE "scripts/SSAnne2FRooms_2.asm" -INCLUDE "scripts/SilphCo11F_2.asm" - -INCLUDE "engine/overworld/hidden_objects.asm" -INCLUDE "engine/vermilion_gym_trash_cans.asm" diff --git a/engine/bank3d.asm b/engine/bank3d.asm deleted file mode 100644 index e929e44e..00000000 --- a/engine/bank3d.asm +++ /dev/null @@ -1,491 +0,0 @@ -INCLUDE "engine/battle/common_text.asm" -INCLUDE "engine/battle/link_battle_versus_text.asm" -INCLUDE "engine/battle/unused_stats_functions.asm" -INCLUDE "engine/battle/scroll_draw_trainer_pic.asm" - -StarterPikachuBattleEntranceAnimation: - hlcoord 0, 5 - ld c, 0 -.loop1 - inc c - ld a, c - cp 9 - ret z - ld d, 7 * 13 - push bc - push hl -.loop2 - call .PlaceColumn - dec hl - ld a, d - sub 7 - ld d, a - dec c - jr nz, .loop2 - ld c, 2 - call DelayFrames - pop hl - pop bc - inc hl - jr .loop1 - -.PlaceColumn: - push hl - push de - push bc - ld e, 7 -.loop3 - ld a, d - cp 7 * 7 - jr nc, .okay - ld a, $7f -.okay - ld [hl], a - ld bc, SCREEN_WIDTH - add hl, bc - inc d - dec e - jr nz, .loop3 - pop bc - pop de - pop hl - ret - -INCLUDE "engine/battle/decrement_pp.asm" - -ModifyPikachuHappiness:: - ld a, d - cp PIKAHAPPY_GYMLEADER - jr z, .checkanywhereinparty - cp PIKAHAPPY_WALKING - jr z, .checkanywhereinparty - push de - callfar IsThisPartymonStarterPikachu_Party - pop de - ret nc - jr .proceed - -.checkanywhereinparty - push de - callfar IsStarterPikachuInOurParty - pop de - ret nc - -.proceed - push de - ; Divide [wPikachuHappiness] by 100. Hold the integer part in e. - ld e, $0 - ld a, [wPikachuHappiness] - cp 100 - jr c, .wPikachuHappiness_div_100 - inc e - cp 200 - jr c, .wPikachuHappiness_div_100 - inc e -.wPikachuHappiness_div_100 - ; Get the (d, e) entry from HappinessChangeTable. - ld c, d - dec c - ld b, $0 - ld hl, HappinessChangeTable - add hl, bc - add hl, bc - add hl, bc - ld d, $0 - add hl, de - ld a, [hl] - ; If [hl] is positive, take min(0xff, [hl] + [wPikachuHappiness]). - ; If [hl] is negative, take max(0x00, [hl] + [wPikachuHappiness]). - ; Inexplicably, we're using 100 as the threshold for comparison. - cp 100 - ld a, [wPikachuHappiness] - jr nc, .negative - add [hl] - jr nc, .okay - ld a, -1 - jr .okay - -.negative - add [hl] - jr c, .okay - xor a -.okay - ld [wPikachuHappiness], a - - ; Restore d and get the d'th entry in PikachuMoods. - pop de - dec d - ld hl, PikachuMoods - ld e, d - ld d, $0 - add hl, de - ld a, [hl] - ld b, a - ; Modify Pikachu's mood - cp $80 - jr z, .done - ld a, [wPikachuMood] - jr c, .decreased - cp b - jr nc, .done - ld a, [wd49c] - and a - jr nz, .done - jr .update_mood - -.decreased - cp b - jr c, .done -.update_mood - ld a, b - ld [wPikachuMood], a -.done - ret - -HappinessChangeTable: - ; Increase - db 5, 3, 2 ; Gained a level - db 5, 3, 2 ; HP restore - db 1, 1, 0 ; Used X item - db 3, 2, 1 ; Challenged Gym Leader - db 1, 1, 0 ; Teach TM/HM - db 2, 1, 1 ; Walking around - ; Decrease - db -3, -3, -5 ; Deposited - db -1, -1, -1 ; Fainted in battle - db -5, -5, -10 ; Fainted due to Poison outside of battle - db -5, -5, -10 ; Fainted to opponent at least 30 levels higher - db -10, -10, -20 ; Traded away - -PikachuMoods: - ; Increase - db $8a ; Gained a level - db $83 ; HP restore - db $80 ; Teach TM/HM - db $80 ; Challenged Gym Leader - db $94 ; Unknown (d = 5) - db $80 ; Unknown (d = 6) - ; Decrease - db $62 ; Deposited - db $6c ; Fainted - db $62 ; Unknown (d = 9) - db $6c ; Unknown (d = 10) - db $00 ; Unknown (d = 11) - -RedPicBack: INCBIN "gfx/player/redb.pic" -OldManPic: INCBIN "gfx/battle/oldman.pic" -ProfOakPicBack: INCBIN "gfx/battle/prof.oakb.pic" - -LoadYellowTitleScreenGFX: - ld hl, PokemonLogoGraphics - ld de, vChars2 - ld bc, 115 * $10 - ld a, BANK(PokemonLogoGraphics) ; redundant because this function is in bank3d - call FarCopyData - ld hl, YellowLogoGraphics + 35 * $10 - ld de, vChars0 + 253 * $10 - ld bc, 3 * $10 - ld a, BANK(YellowLogoGraphics) - call FarCopyData - ld hl, YellowLogoGraphics + 38 * $10 - ld de, vChars1 - ld bc, 64 * $10 - ld a, BANK(YellowLogoGraphics) - call FarCopyData - ld hl, YellowLogoGraphics + 102 * $10 - ld de, vChars0 + 240 * $10 - ld bc, 12 * $10 - ld a, BANK(YellowLogoGraphics) - call FarCopyData - ret - -TitleScreen_PlacePokemonLogo: - hlcoord 2, 1 - ld de, TitleScreenPokemonLogoTilemap - lb bc, 7, 16 - call Bank3D_CopyBox - ret - -TitleScreen_PlacePikaSpeechBubble: - hlcoord 6, 4 - ld de, TitleScreenPikaBubbleTilemap - lb bc, 4, 7 - call Bank3D_CopyBox - hlcoord 9, 8 - ld [hl], $64 - inc hl - ld [hl], $65 - ret - -TitleScreen_PlacePikachu: - hlcoord 4, 8 - ld de, TitleScreenPikachuTilemap - lb bc, 9, 12 - call Bank3D_CopyBox - hlcoord 16, 10 - ld [hl], $96 - hlcoord 16, 11 - ld [hl], $9d - hlcoord 16, 12 - ld [hl], $a7 - hlcoord 16, 13 - ld [hl], $b1 - ld hl, TitleScreenPikachuEyesOAMData - ld de, wOAMBuffer - ld bc, $20 - call CopyData - ret - -TitleScreenPikachuEyesOAMData: - db $60, $40, $f1, $22 - db $60, $48, $f0, $22 - db $68, $40, $f3, $22 - db $68, $48, $f2, $22 - db $60, $60, $f0, $02 - db $60, $68, $f1, $02 - db $68, $60, $f2, $02 - db $68, $68, $f3, $02 - -Bank3D_CopyBox: -; copy cxb (xy) screen area from de to hl -.row - push bc - push hl -.col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ret - -TitleScreenPokemonLogoTilemap: -; 16x7 (xy) - db $f4, $f4, $f4, $f4, $f4, $f4, $49, $f4, $72, $30, $f4, $f4, $f4, $f4, $f4, $f4 - db $fd, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0a, $0b, $f4, $0d, $0e, $0f - db $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1a, $1b, $1c, $1d, $1e, $1f - db $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2a, $2b, $2c, $2d, $2e, $2f - db $f4, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3a, $3b, $3c, $3d, $3e, $3f - db $f4, $41, $42, $43, $44, $45, $46, $47, $48, $f4, $4a, $4b, $4c, $4d, $4e, $4f - db $f4, $6a, $6b, $6c, $6d, $f4, $f4, $f4, $f4, $f4, $f4, $6e, $6f, $70, $71, $f4 - -Pointer_f4669: -; Unreferenced - db $47, $48, $49, $4a, $4b, $4c, $4d, $4e, $4f, $5f - -TitleScreenPikaBubbleTilemap: -; 7x4 (xy) - db $24, $25, $66, $67, $68, $69, $2a - db $50, $51, $52, $53, $54, $55, $56 - db $57, $58, $59, $5a, $5b, $5c, $5d - db $6d, $5e, $5f, $60, $61, $62, $63 - -TitleScreenPikachuTilemap: -; 12x9 (xy) - db $80, $81, $82, $83, $00, $00, $00, $00, $84, $85, $86, $87 - db $88, $89, $8a, $8b, $8c, $8d, $8d, $8e, $8f, $8a, $90, $91 - db $00, $92, $93, $8a, $8a, $8a, $8a, $8a, $8a, $94, $95, $00 - db $00, $00, $97, $8a, $8a, $98, $99, $8a, $8a, $9a, $9b, $9c - db $00, $00, $9e, $9f, $a0, $a1, $a2, $a3, $a4, $a5, $a6, $8a - db $00, $a8, $a9, $aa, $8a, $ab, $ac, $8a, $ad, $ae, $af, $b0 - db $00, $b2, $b3, $b4, $8a, $8a, $8a, $8a, $b5, $b6, $b7, $b8 - db $00, $b9, $ba, $8a, $8a, $8a, $8a, $8a, $8a, $bb, $bc, $00 - db $00, $00, $bd, $8a, $8a, $8a, $8a, $8a, $8a, $be, $bf, $00 - -PokemonLogoGraphics: INCBIN "gfx/title/pokemon_logo.2bpp" -PokemonLogoGraphicsEnd: -YellowLogoGraphics: INCBIN "gfx/yellow_titlescreen.2bpp" -YellowLogoGraphicsEnd: - -INCLUDE "engine/menus/link_menu.asm" - -HandleMenuInputDouble: - xor a - ld [wPartyMenuAnimMonEnabled], a - -HandleMenuInputPokemonSelectionDouble: - ldh a, [hDownArrowBlinkCount1] - push af - ldh a, [hDownArrowBlinkCount2] - push af ; save existing values on stack - xor a - ldh [hDownArrowBlinkCount1], a ; blinking down arrow timing value 1 - ld a, $06 - ldh [hDownArrowBlinkCount2], a ; blinking down arrow timing value 2 -.loop1 - xor a - ld [wAnimCounter], a ; counter for pokemon shaking animation - call .UpdateCursorTile - call JoypadLowSensitivity - ldh a, [hJoy5] - and a ; was a key pressed? - jr nz, .keyPressed - pop af - ldh [hDownArrowBlinkCount2], a - pop af - ldh [hDownArrowBlinkCount1], a ; restore previous values - xor a - ld [wMenuWrappingEnabled], a ; disable menu wrapping - ret -.keyPressed - xor a - ld [wCheckFor180DegreeTurn], a - ldh a, [hJoy5] - ld b, a - bit 6, a ; pressed Up key? - jr z, .checkIfDownPressed -.upPressed - ld a, [wCurrentMenuItem] ; selected menu item - and a ; already at the top of the menu? - jr z, .checkOtherKeys -.notAtTop - dec a - ld [wCurrentMenuItem], a ; move selected menu item up one space - jr .checkOtherKeys -.checkIfDownPressed - bit 7, a - jr z, .checkOtherKeys -.downPressed - ld a, [wCurrentMenuItem] - inc a - ld c, a - ld a, [wMaxMenuItem] - cp c - jr c, .checkOtherKeys - ld a, c - ld [wCurrentMenuItem], a -.checkOtherKeys - ld a, [wMenuWatchedKeys] - and b ; does the menu care about any of the pressed keys? - jp z, .loop1 -.checkIfAButtonOrBButtonPressed - ldh a, [hJoy5] - and A_BUTTON | B_BUTTON - jr z, .skipPlayingSound -.AButtonOrBButtonPressed - ld a, SFX_PRESS_AB - call PlaySound ; play sound -.skipPlayingSound - pop af - ldh [hDownArrowBlinkCount2], a - pop af - ldh [hDownArrowBlinkCount1], a ; restore previous values - ldh a, [hJoy5] - ret - -.UpdateCursorTile: - ld a, [wTopMenuItemY] - and a - jr z, .asm_f5ac0 - hlcoord 0, 0 - ld bc, SCREEN_WIDTH -.loop - add hl, bc - dec a - jr nz, .loop -.asm_f5ac0 - ld a, [wTopMenuItemX] - ld b, $0 - ld c, a - add hl, bc - push hl - ld a, [wLastMenuItem] - and a - jr z, .asm_f5ad5 - ld bc, $28 -.loop2 - add hl, bc - dec a - jr nz, .loop2 -.asm_f5ad5 - ld a, [hl] - cp "▶" - jr nz, .asm_f5ade - ld a, [wTileBehindCursor] - ld [hl], a -.asm_f5ade - pop hl - ld a, [wCurrentMenuItem] - and a - jr z, .asm_f5aec - ld bc, $28 -.loop3 - add hl, bc - dec a - jr nz, .loop3 -.asm_f5aec - ld a, [hl] - cp "▶" - jr z, .asm_f5af4 - ld [wTileBehindCursor], a -.asm_f5af4 - ld a, "▶" - ld [hl], a - ld a, l - ld [wMenuCursorLocation], a - ld a, h - ld [wMenuCursorLocation + 1], a - ld a, [wCurrentMenuItem] - ld [wLastMenuItem], a - ret - -INCLUDE "engine/overworld/field_move_messages.asm" - -INCLUDE "engine/items/inventory.asm" - -INCLUDE "gfx/trainer_card.asm" - -ReadSuperRodData: - ld a, [wCurMap] - ld c, a - ld hl, FishingSlots -.loop - ld a, [hli] - cp $ff - jr z, .notfound - cp c - jr z, .found - ld de, $8 - add hl, de - jr .loop -.found - call GenerateRandomFishingEncounter - ret -.notfound - ld de, $0 - ret - -GenerateRandomFishingEncounter: - call Random - cp $66 - jr c, .asm_f5ed6 - inc hl - inc hl - cp $b2 - jr c, .asm_f5ed6 - inc hl - inc hl - cp $e5 - jr c, .asm_f5ed6 - inc hl - inc hl -.asm_f5ed6 - ld e, [hl] - inc hl - ld d, [hl] - ret - -INCLUDE "data/wild/super_rod.asm" -INCLUDE "engine/battle/bank3d_battle.asm" -INCLUDE "engine/items/tm_prices.asm" -INCLUDE "engine/math/multiply_divide.asm" -INCLUDE "engine/events/give_pokemon.asm" -INCLUDE "engine/battle/get_trainer_name.asm" -INCLUDE "engine/math/random.asm" -INCLUDE "engine/predefs.asm" diff --git a/engine/bank3e.asm b/engine/bank3e.asm deleted file mode 100644 index 32f5ebfd..00000000 --- a/engine/bank3e.asm +++ /dev/null @@ -1,5 +0,0 @@ -INCLUDE "engine/surfing_minigame.asm" -INCLUDE "engine/yellow_intro.asm" -INCLUDE "data/animated_objects_3e_2.asm" -YellowIntroGraphics: INCBIN "gfx/yellow_intro.2bpp" -INCLUDE "engine/animated_objects_3e.asm" diff --git a/engine/bank3f.asm b/engine/bank3f.asm deleted file mode 100644 index c26e9834..00000000 --- a/engine/bank3f.asm +++ /dev/null @@ -1,23 +0,0 @@ -INCLUDE "data/maps/songs.asm" -INCLUDE "data/maps/map_header_pointers.asm" -INCLUDE "data/maps/map_header_banks.asm" -INCLUDE "engine/pikachu_follow.asm" -INCLUDE "engine/pikachu_status.asm" -INCLUDE "engine/pikachu_emotions.asm" -INCLUDE "engine/pikachu_movement.asm" -INCLUDE "engine/pikachu_pic_animation.asm" - -Func_fe66e: - ret - -OfficerJennySprite: INCBIN "gfx/sprites/officer_jenny.2bpp" -PikachuSprite: INCBIN "gfx/sprites/pikachu.2bpp" -SandshrewSprite: INCBIN "gfx/sprites/sandshrew.2bpp" -OddishSprite: INCBIN "gfx/sprites/oddish.2bpp" -BulbasaurSprite: INCBIN "gfx/sprites/bulbasaur.2bpp" -JigglypuffSprite: INCBIN "gfx/sprites/jigglypuff.2bpp" -ClefairySprite: INCBIN "gfx/sprites/clefairy.2bpp" -ChanseySprite: INCBIN "gfx/sprites/chansey.2bpp" -SurfingPikachuSprite:: INCBIN "gfx/sprites/surfing_pikachu.2bpp" -JessieSprite: INCBIN "gfx/sprites/jessie.2bpp" -JamesSprite: INCBIN "gfx/sprites/james.2bpp" diff --git a/engine/battle/animations.asm b/engine/battle/animations.asm index 4508dbaa..3b0fd4ec 100755 --- a/engine/battle/animations.asm +++ b/engine/battle/animations.asm @@ -579,16 +579,16 @@ Func_78e98: xor a ldh [hAutoBGTransferEnabled], a call ClearScreen - ld h, vBGMap0 / $100 + ld h, HIGH(vBGMap0) call WriteLowerByteOfBGMapAndEnableBGTransfer call Delay3 xor a ldh [hAutoBGTransferEnabled], a call LoadScreenTilesFromBuffer2 - ld h, vBGMap1 / $100 + ld h, HIGH(vBGMap1) WriteLowerByteOfBGMapAndEnableBGTransfer: - ld l, vBGMap0 & $ff + ld l, LOW(vBGMap0) call BattleAnimCopyTileMapToVRAM ld a, $1 ldh [hAutoBGTransferEnabled], a diff --git a/engine/battle/bank3d_battle.asm b/engine/battle/bank3d_battle.asm deleted file mode 100644 index 48c3cde3..00000000 --- a/engine/battle/bank3d_battle.asm +++ /dev/null @@ -1,292 +0,0 @@ -InitBattle:: - ld a, [wCurOpponent] - and a - jr z, DetermineWildOpponent - -InitOpponent: - ld a, [wCurOpponent] - ld [wcf91], a - ld [wEnemyMonSpecies2], a - jr InitBattleCommon - -DetermineWildOpponent: - ld a, [wd732] - bit 1, a - jr z, .asm_3ef2f - ldh a, [hJoyHeld] - bit 1, a ; B button pressed? - ret nz -.asm_3ef2f - ld a, [wNumberOfNoRandomBattleStepsLeft] - and a - ret nz - callfar TryDoWildEncounter - ret nz -InitBattleCommon: - ld a, [wMapPalOffset] - push af - ld hl, wLetterPrintingDelayFlags - ld a, [hl] - push af - res 1, [hl] - call InitBattleVariables - ld a, [wEnemyMonSpecies2] - sub OPP_ID_OFFSET - jp c, InitWildBattle - ld [wTrainerClass], a - call GetTrainerInformation - callfar ReadTrainer - callfar DoBattleTransitionAndInitBattleVariables - call _LoadTrainerPic - xor a - ld [wEnemyMonSpecies2], a - ldh [hStartTileID], a - dec a - ld [wAICount], a - hlcoord 12, 0 - predef CopyUncompressedPicToTilemap - ld a, $ff - ld [wEnemyMonPartyPos], a - ld a, $2 - ld [wIsInBattle], a - -; Is this a major story battle? - ld a, [wLoneAttackNo] - and a - jp z, _InitBattleCommon - callabd_ModifyPikachuHappiness PIKAHAPPY_GYMLEADER ; useless since already in bank3d - jp _InitBattleCommon - -InitWildBattle: - ld a, $1 - ld [wIsInBattle], a - callfar LoadEnemyMonData - callfar DoBattleTransitionAndInitBattleVariables - ld a, [wCurOpponent] - cp RESTLESS_SOUL - jr z, .isGhost - callfar IsGhostBattle - jr nz, .isNoGhost -.isGhost - ld hl, wMonHSpriteDim - ld a, $66 - ld [hli], a ; write sprite dimensions - ld bc, GhostPic - ld a, c - ld [hli], a ; write front sprite pointer - ld [hl], b - ld hl, wEnemyMonNick ; set name to "GHOST" - ld a, "G" - ld [hli], a - ld a, "H" - ld [hli], a - ld a, "O" - ld [hli], a - ld a, "S" - ld [hli], a - ld a, "T" - ld [hli], a - ld [hl], "@" - ld a, [wcf91] - push af - ld a, MON_GHOST - ld [wcf91], a - ld de, vFrontPic - call LoadMonFrontSprite ; load ghost sprite - pop af - ld [wcf91], a - jr .spriteLoaded -.isNoGhost - ld de, vFrontPic - call LoadMonFrontSprite ; load mon sprite -.spriteLoaded - xor a - ld [wTrainerClass], a - ldh [hStartTileID], a - hlcoord 12, 0 - predef CopyUncompressedPicToTilemap - -; common code that executes after init battle code specific to trainer or wild battles -_InitBattleCommon: - ld b, SET_PAL_BATTLE_BLACK - call RunPaletteCommand - callfar SlidePlayerAndEnemySilhouettesOnScreen - xor a - ldh [hAutoBGTransferEnabled], a - ld hl, .emptyString - call PrintText - call SaveScreenTilesToBuffer1 - call ClearScreen - ld a, $98 - ldh [hAutoBGTransferDest + 1], a - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call Delay3 - ld a, $9c - ldh [hAutoBGTransferDest + 1], a - call LoadScreenTilesFromBuffer1 - hlcoord 9, 7 - lb bc, 5, 10 - call ClearScreenArea - hlcoord 1, 0 - lb bc, 4, 10 - call ClearScreenArea - call ClearSprites - ld a, [wIsInBattle] - dec a ; is it a wild battle? - ld hl, DrawEnemyHUDAndHPBar - ld b, BANK(DrawEnemyHUDAndHPBar) - call z, Bankswitch ; draw enemy HUD and HP bar if it's a wild battle - callfar StartBattle - callfar EndOfBattle - pop af - ld [wLetterPrintingDelayFlags], a - pop af - ld [wMapPalOffset], a - ld a, [wSavedTilesetType] - ldh [hTilesetType], a - scf - ret -.emptyString - db "@" - -_LoadTrainerPic: -; wd033-wd034 contain pointer to pic - ld a, [wTrainerPicPointer] - ld e, a - ld a, [wTrainerPicPointer + 1] - ld d, a ; de contains pointer to trainer pic - ld a, [wLinkState] - and a - ld a, BANK(TrainerPics) ; this is where all the trainer pics are (not counting Red's) - jr z, .loadSprite - ld a, BANK(RedPicFront) -.loadSprite - call UncompressSpriteFromDE - ld de, vFrontPic - ld a, $77 - ld c, a - jp LoadUncompressedSpriteData - -LoadMonBackPic: -; Assumes the monster's attributes have -; been loaded with GetMonHeader. - ld a, [wBattleMonSpecies2] - ld [wcf91], a - hlcoord 1, 5 - lb bc, 7, 8 - call ClearScreenArea - ld hl, wMonHBackSprite - wMonHeader - call UncompressMonSprite - predef ScaleSpriteByTwo - ld de, vBackPic - call InterlaceMergeSpriteBuffers ; combine the two buffers to a single 2bpp sprite - ld hl, vSprites - ld de, vBackPic - ld c, (2*SPRITEBUFFERSIZE)/16 ; count of 16-byte chunks to be copied - ldh a, [hLoadedROMBank] - ld b, a - jp CopyVideoData - -AnimateSendingOutMon: - ld a, [wPredefRegisters] - ld h, a - ld a, [wPredefRegisters + 1] - ld l, a - ldh a, [hStartTileID] - ldh [hDownArrowBlinkCount1], a - ld b, $4c - ld a, [wIsInBattle] - and a - jr z, .asm_f61ef - add b - ld [hl], a - call Delay3 - ld bc, -41 - add hl, bc - ld a, $1 - ld [wNumMovesMinusOne], a - ld bc, $303 - predef CopyDownscaledMonTiles - ld c, $4 - call DelayFrames - ld bc, -41 - add hl, bc - xor a - ld [wNumMovesMinusOne], a - ld bc, $505 - predef CopyDownscaledMonTiles - ld c, $5 - call DelayFrames - ld bc, -41 - jr .asm_f61f2 -.asm_f61ef - ld bc, -123 -.asm_f61f2 - add hl, bc - ldh a, [hDownArrowBlinkCount1] - add $31 - jr CopyUncompressedPicToHL - -CopyUncompressedPicToTilemap: - ld a, [wPredefRegisters] - ld h, a - ld a, [wPredefRegisters + 1] - ld l, a - ldh a, [hStartTileID] -CopyUncompressedPicToHL:: - ld bc, $707 - ld de, $14 - push af - ld a, [wSpriteFlipped] - and a - jr nz, .asm_f6220 - pop af -.asm_f6211 - push bc - push hl -.asm_f6213 - ld [hl], a - add hl, de - inc a - dec c - jr nz, .asm_f6213 - pop hl - inc hl - pop bc - dec b - jr nz, .asm_f6211 - ret - -.asm_f6220 - push bc - ld b, $0 - dec c - add hl, bc - pop bc - pop af -.asm_f6227 - push bc - push hl -.asm_f6229 - ld [hl], a - add hl, de - inc a - dec c - jr nz, .asm_f6229 - pop hl - dec hl - pop bc - dec b - jr nz, .asm_f6227 - ret - -INCLUDE "engine/battle/init_battle_variables.asm" -INCLUDE "engine/battle/move_effects/focus_energy.asm" -INCLUDE "engine/battle/move_effects/heal.asm" -INCLUDE "engine/battle/move_effects/transform.asm" -INCLUDE "engine/battle/move_effects/reflect_light_screen.asm" -INCLUDE "engine/battle/move_effects/mist.asm" -INCLUDE "engine/battle/move_effects/one_hit_ko.asm" -INCLUDE "engine/battle/move_effects/pay_day.asm" -INCLUDE "engine/battle/move_effects/paralyze.asm" diff --git a/engine/battle/init_battle.asm b/engine/battle/init_battle.asm new file mode 100644 index 00000000..d6ba51ed --- /dev/null +++ b/engine/battle/init_battle.asm @@ -0,0 +1,282 @@ +InitBattle:: + ld a, [wCurOpponent] + and a + jr z, DetermineWildOpponent + +InitOpponent: + ld a, [wCurOpponent] + ld [wcf91], a + ld [wEnemyMonSpecies2], a + jr InitBattleCommon + +DetermineWildOpponent: + ld a, [wd732] + bit 1, a + jr z, .asm_3ef2f + ldh a, [hJoyHeld] + bit 1, a ; B button pressed? + ret nz +.asm_3ef2f + ld a, [wNumberOfNoRandomBattleStepsLeft] + and a + ret nz + callfar TryDoWildEncounter + ret nz +InitBattleCommon: + ld a, [wMapPalOffset] + push af + ld hl, wLetterPrintingDelayFlags + ld a, [hl] + push af + res 1, [hl] + call InitBattleVariables + ld a, [wEnemyMonSpecies2] + sub OPP_ID_OFFSET + jp c, InitWildBattle + ld [wTrainerClass], a + call GetTrainerInformation + callfar ReadTrainer + callfar DoBattleTransitionAndInitBattleVariables + call _LoadTrainerPic + xor a + ld [wEnemyMonSpecies2], a + ldh [hStartTileID], a + dec a + ld [wAICount], a + hlcoord 12, 0 + predef CopyUncompressedPicToTilemap + ld a, $ff + ld [wEnemyMonPartyPos], a + ld a, $2 + ld [wIsInBattle], a + +; Is this a major story battle? + ld a, [wLoneAttackNo] + and a + jp z, _InitBattleCommon + callabd_ModifyPikachuHappiness PIKAHAPPY_GYMLEADER ; useless since already in bank3d + jp _InitBattleCommon + +InitWildBattle: + ld a, $1 + ld [wIsInBattle], a + callfar LoadEnemyMonData + callfar DoBattleTransitionAndInitBattleVariables + ld a, [wCurOpponent] + cp RESTLESS_SOUL + jr z, .isGhost + callfar IsGhostBattle + jr nz, .isNoGhost +.isGhost + ld hl, wMonHSpriteDim + ld a, $66 + ld [hli], a ; write sprite dimensions + ld bc, GhostPic + ld a, c + ld [hli], a ; write front sprite pointer + ld [hl], b + ld hl, wEnemyMonNick ; set name to "GHOST" + ld a, "G" + ld [hli], a + ld a, "H" + ld [hli], a + ld a, "O" + ld [hli], a + ld a, "S" + ld [hli], a + ld a, "T" + ld [hli], a + ld [hl], "@" + ld a, [wcf91] + push af + ld a, MON_GHOST + ld [wcf91], a + ld de, vFrontPic + call LoadMonFrontSprite ; load ghost sprite + pop af + ld [wcf91], a + jr .spriteLoaded +.isNoGhost + ld de, vFrontPic + call LoadMonFrontSprite ; load mon sprite +.spriteLoaded + xor a + ld [wTrainerClass], a + ldh [hStartTileID], a + hlcoord 12, 0 + predef CopyUncompressedPicToTilemap + +; common code that executes after init battle code specific to trainer or wild battles +_InitBattleCommon: + ld b, SET_PAL_BATTLE_BLACK + call RunPaletteCommand + callfar SlidePlayerAndEnemySilhouettesOnScreen + xor a + ldh [hAutoBGTransferEnabled], a + ld hl, .emptyString + call PrintText + call SaveScreenTilesToBuffer1 + call ClearScreen + ld a, $98 + ldh [hAutoBGTransferDest + 1], a + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call Delay3 + ld a, $9c + ldh [hAutoBGTransferDest + 1], a + call LoadScreenTilesFromBuffer1 + hlcoord 9, 7 + lb bc, 5, 10 + call ClearScreenArea + hlcoord 1, 0 + lb bc, 4, 10 + call ClearScreenArea + call ClearSprites + ld a, [wIsInBattle] + dec a ; is it a wild battle? + ld hl, DrawEnemyHUDAndHPBar + ld b, BANK(DrawEnemyHUDAndHPBar) + call z, Bankswitch ; draw enemy HUD and HP bar if it's a wild battle + callfar StartBattle + callfar EndOfBattle + pop af + ld [wLetterPrintingDelayFlags], a + pop af + ld [wMapPalOffset], a + ld a, [wSavedTilesetType] + ldh [hTilesetType], a + scf + ret +.emptyString + db "@" + +_LoadTrainerPic: +; wd033-wd034 contain pointer to pic + ld a, [wTrainerPicPointer] + ld e, a + ld a, [wTrainerPicPointer + 1] + ld d, a ; de contains pointer to trainer pic + ld a, [wLinkState] + and a + ld a, BANK(TrainerPics) ; this is where all the trainer pics are (not counting Red's) + jr z, .loadSprite + ld a, BANK(RedPicFront) +.loadSprite + call UncompressSpriteFromDE + ld de, vFrontPic + ld a, $77 + ld c, a + jp LoadUncompressedSpriteData + +LoadMonBackPic: +; Assumes the monster's attributes have +; been loaded with GetMonHeader. + ld a, [wBattleMonSpecies2] + ld [wcf91], a + hlcoord 1, 5 + lb bc, 7, 8 + call ClearScreenArea + ld hl, wMonHBackSprite - wMonHeader + call UncompressMonSprite + predef ScaleSpriteByTwo + ld de, vBackPic + call InterlaceMergeSpriteBuffers ; combine the two buffers to a single 2bpp sprite + ld hl, vSprites + ld de, vBackPic + ld c, (2*SPRITEBUFFERSIZE)/16 ; count of 16-byte chunks to be copied + ldh a, [hLoadedROMBank] + ld b, a + jp CopyVideoData + +AnimateSendingOutMon: + ld a, [wPredefRegisters] + ld h, a + ld a, [wPredefRegisters + 1] + ld l, a + ldh a, [hStartTileID] + ldh [hDownArrowBlinkCount1], a + ld b, $4c + ld a, [wIsInBattle] + and a + jr z, .asm_f61ef + add b + ld [hl], a + call Delay3 + ld bc, -41 + add hl, bc + ld a, $1 + ld [wNumMovesMinusOne], a + ld bc, $303 + predef CopyDownscaledMonTiles + ld c, $4 + call DelayFrames + ld bc, -41 + add hl, bc + xor a + ld [wNumMovesMinusOne], a + ld bc, $505 + predef CopyDownscaledMonTiles + ld c, $5 + call DelayFrames + ld bc, -41 + jr .asm_f61f2 +.asm_f61ef + ld bc, -123 +.asm_f61f2 + add hl, bc + ldh a, [hDownArrowBlinkCount1] + add $31 + jr CopyUncompressedPicToHL + +CopyUncompressedPicToTilemap: + ld a, [wPredefRegisters] + ld h, a + ld a, [wPredefRegisters + 1] + ld l, a + ldh a, [hStartTileID] +CopyUncompressedPicToHL:: + ld bc, $707 + ld de, $14 + push af + ld a, [wSpriteFlipped] + and a + jr nz, .asm_f6220 + pop af +.asm_f6211 + push bc + push hl +.asm_f6213 + ld [hl], a + add hl, de + inc a + dec c + jr nz, .asm_f6213 + pop hl + inc hl + pop bc + dec b + jr nz, .asm_f6211 + ret + +.asm_f6220 + push bc + ld b, $0 + dec c + add hl, bc + pop bc + pop af +.asm_f6227 + push bc + push hl +.asm_f6229 + ld [hl], a + add hl, de + inc a + dec c + jr nz, .asm_f6229 + pop hl + dec hl + pop bc + dec b + jr nz, .asm_f6227 + ret diff --git a/engine/battle/pikachu_entrance_anim.asm b/engine/battle/pikachu_entrance_anim.asm new file mode 100644 index 00000000..8af65cee --- /dev/null +++ b/engine/battle/pikachu_entrance_anim.asm @@ -0,0 +1,47 @@ +StarterPikachuBattleEntranceAnimation: + hlcoord 0, 5 + ld c, 0 +.loop1 + inc c + ld a, c + cp 9 + ret z + ld d, 7 * 13 + push bc + push hl +.loop2 + call .PlaceColumn + dec hl + ld a, d + sub 7 + ld d, a + dec c + jr nz, .loop2 + ld c, 2 + call DelayFrames + pop hl + pop bc + inc hl + jr .loop1 + +.PlaceColumn: + push hl + push de + push bc + ld e, 7 +.loop3 + ld a, d + cp 7 * 7 + jr nc, .okay + ld a, $7f +.okay + ld [hl], a + ld bc, SCREEN_WIDTH + add hl, bc + inc d + dec e + jr nz, .loop3 + pop bc + pop de + pop hl + ret diff --git a/engine/bg_map_attributes.asm b/engine/bg_map_attributes.asm deleted file mode 100644 index 4c50bcf8..00000000 --- a/engine/bg_map_attributes.asm +++ /dev/null @@ -1,219 +0,0 @@ -INCLUDE "data/bg_map_attributes.asm" - -LoadBGMapAttributes:: - ld hl, BGMapAttributesPointers - ld a, c ; c = which packet - push af ; save for later (to determine if we're handling the trainer card or party menu) - dec a ; read this code as: - add a ; dec a - ld e, a ; add a - xor a ; ld e, a - ld d, a ; ld d, 0 - add hl, de ; add hl, de - ld a, [hli] ; ld a, [hli] - ld e, a ; ld h, [hl] - ld a, [hl] ; ld l, a - ld h, a - ld a, e - ld l, a - - di - ld a, $1 - ldh [rVBK], a - push hl - ld a, [hl] - ld c, a ; save attribute count for later - ld de, $10 - add hl, de - ld a, h - ldh [rHDMA1], a - ld a, l - ldh [rHDMA2], a - ld de, vBGMap0 - ld a, d - ldh [rHDMA3], a - ld a, e - ldh [rHDMA4], a - - ldh a, [rLCDC] - and rLCDC_ENABLE_MASK ; is LCD off? - jr z, .lcdOff ; if off, transfer immediately -; wait for VBlank if LCD is on -.waitForVBlankLoop1 - ldh a, [rLY] - cp $90 - jr nz, .waitForVBlankLoop1 -.waitForAccessibleVRAMLoop1 - ldh a, [rSTAT] - and %10 ; are we in HBlank or VBlank? - jr nz, .waitForAccessibleVRAMLoop1 ; loop until we're in a safe period to transfer to VRAM -.lcdOff - ld a, c ; number of BG attributes to transfer, plus 1 times 16 - ldh [rHDMA5], a ; initiate transfer - call Func_3082 ; update audio so it doesn't "lag" - pop hl - ld a, [hli] - ld c, a ; number of BG attributes to transfer, plus 1 times 16 - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a ; offset of the attributes - add hl, de ; hl = new pointer - ld a, h - ldh [rHDMA1], a - ld a, l - ldh [rHDMA2], a - ld de, vBGMap1 ; copy to vBGMap1 - ld a, d - ldh [rHDMA3], a - ld a, e - ldh [rHDMA4], a -; LCD check again - ldh a, [rLCDC] - and rLCDC_ENABLE_MASK ; is LCD off? - jr z, .lcdOff2 ; if off, transfer immediately -; wait for VBlank if LCD is on -.waitForVBlankLoop2 - ldh a, [rLY] - cp $90 - jr nz, .waitForVBlankLoop2 -.waitForAccessibleVRAMLoop2 - ldh a, [rSTAT] - and %10 ; are we in HBlank or VBlank? - jr nz, .waitForAccessibleVRAMLoop2 ; loop until we're in a safe period to transfer to VRAM -.lcdOff2 - ld a, c - ldh [rHDMA5], a - pop af - dec a - dec a - dec a - dec a - jr nz, .checkIfHandlingPartyMenu - call HandleBadgeFaceAttributes - jr .done -.checkIfHandlingPartyMenu - dec a - call z, HandlePartyHPBarAttributes -.done - call Func_3082 - ldh a, [rIF] - res VBLANK, a - ldh [rIF], a - xor a - ldh [rVBK], a - ei - ret - -BGMapAttributesPointers: - dw BGMapAttributes_Unknown1 - dw BGMapAttributes_Unknown2 - dw BGMapAttributes_GameFreakIntro - dw BGMapAttributes_TrainerCard - dw BGMapAttributes_PartyMenu - dw BGMapAttributes_NidorinoIntro - dw BGMapAttributes_TitleScreen - dw BGMapAttributes_Slots - dw BGMapAttributes_Pokedex - dw BGMapAttributes_StatusScreen - dw BGMapAttributes_Battle - dw BGMapAttributes_WholeScreen - dw BGMapAttributes_Unknown13 - -HandleBadgeFaceAttributes: -; zero out the attributes if the player doesn't have the respective badge -; BOULDERBADGE - ld hl, vBGMap1 + $183 - ld de, wTrainerCardBadgeAttributes + 6 * 0 - ld a, [de] - and a - call z, ZeroOutCurrentBadgeAttributes -; CASCADEBADGE - ld hl, vBGMap1 + $187 - ld de, wTrainerCardBadgeAttributes + 6 * 1 - ld a, [de] - and a - call z, ZeroOutCurrentBadgeAttributes -; THUNDERBADGE - ld hl, vBGMap1 + $18b - ld de, wTrainerCardBadgeAttributes + 6 * 2 - ld a, [de] - and a - call z, ZeroOutCurrentBadgeAttributes -; RAINBOWBADGE - ld hl, vBGMap1 + $18f - ld de, wTrainerCardBadgeAttributes + 6 * 3 - ld a, [de] - and a - call z, ZeroOutCurrentBadgeAttributes -; SOULBADGE - ld hl, vBGMap1 + $1e3 - ld de, wTrainerCardBadgeAttributes + 6 * 6 - ld a, [de] - and a - call z, ZeroOutCurrentBadgeAttributes -; MARSHBADGE - ld hl, vBGMap1 + $1e7 - ld de, wTrainerCardBadgeAttributes + 6 * 7 - ld a, [de] - and a - call z, ZeroOutCurrentBadgeAttributes -; VOLCANOBADGE - ld hl, vBGMap1 + $1eb - ld de, wTrainerCardBadgeAttributes + 6 * 8 - ld a, [de] - and a - call z, ZeroOutCurrentBadgeAttributes -; EARTHBADGE - ld hl, vBGMap1 + $1ef - ld de, wTrainerCardBadgeAttributes + 6 * 9 - ld a, [de] - and a - call z, ZeroOutCurrentBadgeAttributes - ret - -ZeroOutCurrentBadgeAttributes: - push hl - xor a - ld [hli], a - ld [hl], a - ld bc, $1f - add hl, bc - ld [hli], a - ld [hl], a - pop hl - ret - -HandlePartyHPBarAttributes: -; hp bars require 3 (green, orange, red) colours, when there are only 2 "free" colours per palette -; therefore, we must transfer individual bg attributes where the locations of the hp bars are in vram - ld hl, vBGMap1 + $25 ; location of start of the HP bar in vram - ld de, wPartyHPBarAttributes - ld c, PARTY_LENGTH -.loop - push bc - push hl - ld a, [de] - and $3 ; 4 possible palettes - rept 7 ; hp bar length in tiles - ld [hli], a - endr - pop hl - ld bc, $40 ; get 2nd party location - add hl, bc - push hl - - push de ; (inefficiently) copy de to hl - pop hl - - ld bc, $6 - add hl, bc ; get the next palette - - push hl - pop de ; copy back to de - - pop hl - pop bc - dec c - jr nz, .loop - ret diff --git a/engine/diploma_3a.asm b/engine/diploma_3a.asm deleted file mode 100755 index 83a7345b..00000000 --- a/engine/diploma_3a.asm +++ /dev/null @@ -1,168 +0,0 @@ -CIRCLE_TILE_ID EQU $10 - -_DisplayDiploma: - call GBPalWhiteOutWithDelay3 - call ClearScreen - ld de, SurfingPikachu3Graphics - ld hl, vChars2 - lb bc, BANK(SurfingPikachu3Graphics), (SurfingPikachu3GraphicsEnd - SurfingPikachu3Graphics) / $10 - call CopyVideoData - - hlcoord 0, 0 - call Func_e9bdf - - hlcoord 0, 0 - call Func_e9beb - - hlcoord 19, 0 - call Func_e9beb - - ld a, $00 - hlcoord 0, 0 - ld [hl], a - hlcoord 19, 0 - ld [hl], a - - ld de, String_e9a73 - hlcoord 5, 2 - call PlaceString - - ld de, String_e9a7d - hlcoord 3, 4 - call PlaceString - - ld de, wPlayerName - hlcoord 10, 4 - call PlaceString - - ld de, String_e9a84 - hlcoord 2, 6 - call PlaceString - - ld de, String_e9ac8 - hlcoord 9, 16 - call PlaceString - - ld b, SET_PAL_GENERIC - call RunPaletteCommand - ld a, $01 - ldh [hAutoBGTransferEnabled], a - call Delay3 - call GBPalNormal - ret - -String_e9a73: - db CIRCLE_TILE_ID, "Diploma", CIRCLE_TILE_ID, "@" - -String_e9a7d: - db "Player@" - -String_e9a84: - db "Congrats! This" - next "diploma certifies" - next "that you have" - next "completed your" - next "#DEX.@" - -String_e9ac8: - db "GAME FREAK@" - -Func_e9ad3: - call ClearScreen - hlcoord 0, 17 - call Func_e9bdf - hlcoord 0, 0 - call Func_e9beb - hlcoord 19, 0 - call Func_e9beb - ld a, $00 - hlcoord 0, 17 - ld [hl], a - hlcoord 19, 17 - ld [hl], a - ld de, Tilemap_e9b3e - hlcoord 6, 2 - lb bc, 10, 12 - call Diploma_Surfing_CopyBox - ld de, Tilemap_e9bb6 - hlcoord 5, 13 - lb bc, 1, 11 - call Diploma_Surfing_CopyBox - ld de, String_e9bd5 - hlcoord 2, 15 - call PlaceString - hlcoord 12, 15 - ld de, wPlayTimeHours - lb bc, $40 | 1, 3 - call PrintNumber - ld [hl], $16 - inc hl - ld de, wPlayTimeMinutes - lb bc, $80 | 1, 2 - call PrintNumber - ld a, [wNumSetBits] - cp 151 - ret nz - ld de, TileMap_e9bc1 - hlcoord 2, 0 - lb bc, 4, 5 - call Diploma_Surfing_CopyBox - ret - -Tilemap_e9b3e: - db $7f, $7f, $7f, $1a, $1b, $7f, $7f, $7f, $7f, $7f - db $7f, $7f, $7f, $7f, $7f, $1c, $1d, $1e, $1f, $20 - db $7f, $21, $22, $23, $7f, $24, $25, $26, $27, $28 - db $29, $2a, $2b, $2c, $2d, $2e, $2f, $30, $31, $32 - db $33, $34, $35, $36, $37, $38, $39, $3a, $3b, $3c - db $7f, $3d, $3e, $3f, $40, $41, $42, $43, $29, $44 - db $45, $46, $47, $48, $49, $4a, $4b, $29, $29, $4c - db $4d, $4e, $4f, $50, $51, $52, $53, $54, $55, $56 - db $57, $58, $59, $7f, $7f, $7f, $5a, $5b, $5c, $5d - db $5e, $5f, $60, $61, $62, $7f, $7f, $7f, $7f, $63 - db $64, $65, $66, $67, $68, $7f, $7f, $7f, $7f, $7f - db $7f, $69, $6a, $6b, $6c, $6d, $6e, $7f, $7f, $7f - -Tilemap_e9bb6: - db $05 - db $06 - db $07 - db $08 - db $09 - db $0a - db $0b - db $0c - db $0d - db $0e - db $0f - -TileMap_e9bc1: - db $70, $71, $7f, $72, $7f - db $73, $74, $75, $76, $77 - db $7f, $78, $11, $12, $13 - db $7f, $7f, $14, $15, $7f - -String_e9bd5: db "PLAY TIME@" - -Func_e9bdf: - ld c, 10 -.asm_e9be1 - ld [hl], $02 - inc hl - ld [hl], $01 - inc hl - dec c - jr nz, .asm_e9be1 - ret - -Func_e9beb: - ld c, 9 - ld de, SCREEN_WIDTH -.asm_e9bed - ld [hl], $04 - add hl, de - ld [hl], $03 - add hl, de - dec c - jr nz, .asm_e9bed - ret diff --git a/engine/events/diploma2.asm b/engine/events/diploma2.asm new file mode 100755 index 00000000..75ac104a --- /dev/null +++ b/engine/events/diploma2.asm @@ -0,0 +1,171 @@ +CIRCLE_TILE_ID EQU $10 + +_DisplayDiploma: + call GBPalWhiteOutWithDelay3 + call ClearScreen + ld de, SurfingPikachu3Graphics + ld hl, vChars2 + lb bc, BANK(SurfingPikachu3Graphics), (SurfingPikachu3GraphicsEnd - SurfingPikachu3Graphics) / $10 + call CopyVideoData + + hlcoord 0, 0 + call Func_e9bdf + + hlcoord 0, 0 + call Func_e9beb + + hlcoord 19, 0 + call Func_e9beb + + ld a, $00 + hlcoord 0, 0 + ld [hl], a + hlcoord 19, 0 + ld [hl], a + + ld de, String_e9a73 + hlcoord 5, 2 + call PlaceString + + ld de, String_e9a7d + hlcoord 3, 4 + call PlaceString + + ld de, wPlayerName + hlcoord 10, 4 + call PlaceString + + ld de, String_e9a84 + hlcoord 2, 6 + call PlaceString + + ld de, String_e9ac8 + hlcoord 9, 16 + call PlaceString + + ld b, SET_PAL_GENERIC + call RunPaletteCommand + ld a, $01 + ldh [hAutoBGTransferEnabled], a + call Delay3 + call GBPalNormal + ret + +String_e9a73: + db CIRCLE_TILE_ID, "Diploma", CIRCLE_TILE_ID, "@" + +String_e9a7d: + db "Player@" + +String_e9a84: + db "Congrats! This" + next "diploma certifies" + next "that you have" + next "completed your" + next "#DEX.@" + +String_e9ac8: + db "GAME FREAK@" + +Func_e9ad3: + call ClearScreen + hlcoord 0, 17 + call Func_e9bdf + hlcoord 0, 0 + call Func_e9beb + hlcoord 19, 0 + call Func_e9beb + ld a, $00 + hlcoord 0, 17 + ld [hl], a + hlcoord 19, 17 + ld [hl], a + ld de, Tilemap_e9b3e + hlcoord 6, 2 + lb bc, 10, 12 + call Diploma_Surfing_CopyBox + ld de, Tilemap_e9bb6 + hlcoord 5, 13 + lb bc, 1, 11 + call Diploma_Surfing_CopyBox + ld de, String_e9bd5 + hlcoord 2, 15 + call PlaceString + hlcoord 12, 15 + ld de, wPlayTimeHours + lb bc, $40 | 1, 3 + call PrintNumber + ld [hl], $16 + inc hl + ld de, wPlayTimeMinutes + lb bc, $80 | 1, 2 + call PrintNumber + ld a, [wNumSetBits] + cp 151 + ret nz + ld de, TileMap_e9bc1 + hlcoord 2, 0 + lb bc, 4, 5 + call Diploma_Surfing_CopyBox + ret + +Tilemap_e9b3e: + db $7f, $7f, $7f, $1a, $1b, $7f, $7f, $7f, $7f, $7f + db $7f, $7f, $7f, $7f, $7f, $1c, $1d, $1e, $1f, $20 + db $7f, $21, $22, $23, $7f, $24, $25, $26, $27, $28 + db $29, $2a, $2b, $2c, $2d, $2e, $2f, $30, $31, $32 + db $33, $34, $35, $36, $37, $38, $39, $3a, $3b, $3c + db $7f, $3d, $3e, $3f, $40, $41, $42, $43, $29, $44 + db $45, $46, $47, $48, $49, $4a, $4b, $29, $29, $4c + db $4d, $4e, $4f, $50, $51, $52, $53, $54, $55, $56 + db $57, $58, $59, $7f, $7f, $7f, $5a, $5b, $5c, $5d + db $5e, $5f, $60, $61, $62, $7f, $7f, $7f, $7f, $63 + db $64, $65, $66, $67, $68, $7f, $7f, $7f, $7f, $7f + db $7f, $69, $6a, $6b, $6c, $6d, $6e, $7f, $7f, $7f + +Tilemap_e9bb6: + db $05 + db $06 + db $07 + db $08 + db $09 + db $0a + db $0b + db $0c + db $0d + db $0e + db $0f + +TileMap_e9bc1: + db $70, $71, $7f, $72, $7f + db $73, $74, $75, $76, $77 + db $7f, $78, $11, $12, $13 + db $7f, $7f, $14, $15, $7f + +String_e9bd5: db "PLAY TIME@" + +Func_e9bdf: + ld c, 10 +.asm_e9be1 + ld [hl], $02 + inc hl + ld [hl], $01 + inc hl + dec c + jr nz, .asm_e9be1 + ret + +Func_e9beb: + ld c, 9 + ld de, SCREEN_WIDTH +.asm_e9bed + ld [hl], $04 + add hl, de + ld [hl], $03 + add hl, de + dec c + jr nz, .asm_e9bed + ret + +SurfingPikachu3Graphics: INCBIN "gfx/surfing_pikachu/surfing_pikachu_3.2bpp" +SurfingPikachu3GraphicsEnd: diff --git a/engine/events/hidden_objects/vermilion_gym_trash2.asm b/engine/events/hidden_objects/vermilion_gym_trash2.asm new file mode 100644 index 00000000..1bc0590b --- /dev/null +++ b/engine/events/hidden_objects/vermilion_gym_trash2.asm @@ -0,0 +1,108 @@ +TrashCanRandom: + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call JumpToAddress + ld e, a + ld d, 0 + ret + +.Jumptable: + dw .zero + dw .one + dw .two + dw .three + dw .four + +.zero +.one + ld a, 0 + ret + +.two + call Random + and $1 + ret + +.three ; should return to a, instead returns to b + call Random + swap a + cp 1 * $ff / 3 + ld b, 0 + ret c + cp 2 * $ff / 3 + ld b, 1 + ret c + ld b, 2 + ret + +.four + call Random + and $3 + ret + +Yellow_SampleSecondTrashCan: + ld hl, GymTrashCans3c + ld a, [wGymTrashCanIndex] + ld c, a + ld b, 0 + ld a, 9 + call AddNTimes + call AddNTimes ; ???? + ld a, [hli] + ldh [hGymTrashCanRandNumMask], a + ld e, a + push hl + call TrashCanRandom + pop hl + add hl, de + add hl, de + ld a, [hli] + ld [wSecondLockTrashCanIndex], a + ld a, [hl] + ld [wSecondLockTrashCanIndex + 1], a + ret + +GymTrashCans3c: +; First byte: number of trashcan entries +; Following four byte pairs: indices for the second trash can. +; BUG: Rows that have 3 trashcan entries are sampled incorrectly. +; The sampling occurs by taking a random number and seeing which +; third of the range 0-255 the number falls in. However, it returns +; that value to the wrong register, so the result is never used. +; Instead of using an offset in [0,1,2], the offset is instead +; in the full range 0-255. This results in truly random behavior. + db 4 + db 1,3, 3,1, 1,-1, 3,-1 + db 3 + db 0,2, 2,4, 4,0, -1,-1 + db 4 + db 1,5, 5,1, 1,-1, 5,-1 + db 3 + db 0,4, 4,6, 6,0, -1,-1 + db 4 + db 1,3, 3,1, 5,5, 7,7 + db 3 + db 2,4, 4,8, 8,2, -1,-1 + db 3 + db 3,7, 7,9, 9,3, -1,-1 + db 4 + db 4,8, 6,10, 8,4, 10,6 + db 3 + db 5,7, 7,11, 11,5, -1,-1 + db 3 + db 6,10, 10,12, 12,6, -1,-1 + db 4 + db 7,9, 9,7, 11,13, 13,11 + db 3 + db 8,10, 10,14, 14,8, -1,-1 + db 4 + db 9,13, 13,9, 9,-1, 13,-1 + db 3 + db 10,12, 12,14, 14,10, -1,-1 + db 4 + db 11,13, 13,11, 11,-1, 13,-1 diff --git a/engine/events/pikachu_happiness.asm b/engine/events/pikachu_happiness.asm new file mode 100644 index 00000000..0d79e32b --- /dev/null +++ b/engine/events/pikachu_happiness.asm @@ -0,0 +1,118 @@ +ModifyPikachuHappiness:: + ld a, d + cp PIKAHAPPY_GYMLEADER + jr z, .checkanywhereinparty + cp PIKAHAPPY_WALKING + jr z, .checkanywhereinparty + push de + callfar IsThisPartymonStarterPikachu_Party + pop de + ret nc + jr .proceed + +.checkanywhereinparty + push de + callfar IsStarterPikachuInOurParty + pop de + ret nc + +.proceed + push de + ; Divide [wPikachuHappiness] by 100. Hold the integer part in e. + ld e, $0 + ld a, [wPikachuHappiness] + cp 100 + jr c, .wPikachuHappiness_div_100 + inc e + cp 200 + jr c, .wPikachuHappiness_div_100 + inc e +.wPikachuHappiness_div_100 + ; Get the (d, e) entry from HappinessChangeTable. + ld c, d + dec c + ld b, $0 + ld hl, HappinessChangeTable + add hl, bc + add hl, bc + add hl, bc + ld d, $0 + add hl, de + ld a, [hl] + ; If [hl] is positive, take min(0xff, [hl] + [wPikachuHappiness]). + ; If [hl] is negative, take max(0x00, [hl] + [wPikachuHappiness]). + ; Inexplicably, we're using 100 as the threshold for comparison. + cp 100 + ld a, [wPikachuHappiness] + jr nc, .negative + add [hl] + jr nc, .okay + ld a, -1 + jr .okay + +.negative + add [hl] + jr c, .okay + xor a +.okay + ld [wPikachuHappiness], a + + ; Restore d and get the d'th entry in PikachuMoods. + pop de + dec d + ld hl, PikachuMoods + ld e, d + ld d, $0 + add hl, de + ld a, [hl] + ld b, a + ; Modify Pikachu's mood + cp $80 + jr z, .done + ld a, [wPikachuMood] + jr c, .decreased + cp b + jr nc, .done + ld a, [wd49c] + and a + jr nz, .done + jr .update_mood + +.decreased + cp b + jr c, .done +.update_mood + ld a, b + ld [wPikachuMood], a +.done + ret + +HappinessChangeTable: + ; Increase + db 5, 3, 2 ; Gained a level + db 5, 3, 2 ; HP restore + db 1, 1, 0 ; Used X item + db 3, 2, 1 ; Challenged Gym Leader + db 1, 1, 0 ; Teach TM/HM + db 2, 1, 1 ; Walking around + ; Decrease + db -3, -3, -5 ; Deposited + db -1, -1, -1 ; Fainted in battle + db -5, -5, -10 ; Fainted due to Poison outside of battle + db -5, -5, -10 ; Fainted to opponent at least 30 levels higher + db -10, -10, -20 ; Traded away + +PikachuMoods: + ; Increase + db $8a ; Gained a level + db $83 ; HP restore + db $80 ; Teach TM/HM + db $80 ; Challenged Gym Leader + db $94 ; Unknown (d = 5) + db $80 ; Unknown (d = 6) + ; Decrease + db $62 ; Deposited + db $6c ; Fainted + db $62 ; Unknown (d = 9) + db $6c ; Unknown (d = 10) + db $00 ; Unknown (d = 11) diff --git a/engine/events/pokecenter_chansey.asm b/engine/events/pokecenter_chansey.asm new file mode 100644 index 00000000..d7c3a95b --- /dev/null +++ b/engine/events/pokecenter_chansey.asm @@ -0,0 +1,11 @@ +PokecenterChanseyText:: + ld hl, NurseChanseyText + call PrintText + ld a, CHANSEY + call PlayCry + call WaitForSoundToFinish + ret + +NurseChanseyText: + text_far _NurseChanseyText + text_end diff --git a/engine/events/try_pikachu_movement.asm b/engine/events/try_pikachu_movement.asm new file mode 100644 index 00000000..70cf65b4 --- /dev/null +++ b/engine/events/try_pikachu_movement.asm @@ -0,0 +1,27 @@ +TryApplyPikachuMovementData:: + ld a, [wd472] + bit 7, a + ret z + ld a, [wWalkBikeSurfState] + and a + ret nz + push hl + push bc + callfar GetPikachuFacingDirectionAndReturnToE + pop bc + pop hl + ld a, b + cp e + ret nz + push hl + ld a, [wUpdateSpritesEnabled] + push af + ld a, $ff + ld [wUpdateSpritesEnabled], a + callfar LoadPikachuShadowIntoVRAM + pop af + ld [wUpdateSpritesEnabled], a + pop hl + call ApplyPikachuMovementData + callfar RefreshPikachuFollow + ret diff --git a/engine/gfx/animated_objects.asm b/engine/gfx/animated_objects.asm new file mode 100755 index 00000000..971af6b5 --- /dev/null +++ b/engine/gfx/animated_objects.asm @@ -0,0 +1,394 @@ +ClearObjectAnimationBuffers: + ld hl, wAnimatedObjectsData + ld bc, wAnimatedObjectsDataEnd - wAnimatedObjectsData + xor a + call FillMemory + ret + +RunObjectAnimations: + ld hl, wAnimatedObjectDataStructs + ld e, 10 +.loop + ld a, [hl] + and a + jr z, .next + ld c, l + ld b, h + push hl + push de + call ExecuteCurrentAnimatedObjectCallback + call UpdateCurrentAnimatedObjectFrame + pop de + pop hl + jr c, .quit +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ld a, [wCurrentAnimatedObjectOAMBufferOffset] + ld l, a + ld h, HIGH(wOAMBuffer) +.deinit_unused_oam_loop + ld a, l + cp LOW(wOAMBufferEnd) + jr nc, .quit + xor a + ld [hli], a + jr .deinit_unused_oam_loop + +.quit + ret + +SpawnAnimatedObject: + push de + push af + ld hl, wAnimatedObjectDataStructs + ld e, 10 +.loop + ld a, [hl] + and a + jr z, .init + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + pop af + pop de + scf + ret + +.init + pop af + ld c, l + ld b, h + ld hl, wNumLoadedAnimatedObjects + inc [hl] + ld e, a + ld d, $0 + ld a, [wAnimatedObjectSpawnStateDataPointer] + ld l, a + ld a, [wAnimatedObjectSpawnStateDataPointer + 1] + ld h, a + add hl, de + add hl, de + add hl, de + ld e, l + ld d, h + ld hl, $0 + add hl, bc + ld a, [wNumLoadedAnimatedObjects] + ld [hli], a + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de + xor a + ld [hli], a + pop de + ld hl, $4 + add hl, bc + ld a, e + ld [hli], a + ld a, d + ld [hli], a + xor a + ld [hli], a + ld [hli], a + xor a + ld [hli], a + ld [hli], a + dec a + ld [hli], a + xor a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ret + +MaskCurrentAnimatedObjectStruct: + ld hl, $0 + add hl, bc + ld [hl], $0 + ret + +MaskAllAnimatedObjectStructs: + ld hl, wAnimatedObjectDataStructs + ld e, 10 +.loop + ld [hl], $0 + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +UpdateCurrentAnimatedObjectFrame: + xor a + ld [wCurAnimatedObjectOAMAttributes], a + ld hl, $3 + add hl, bc + ld a, [hli] + ld [wCurrentAnimatedObjectVTileOffset], a + ld a, [hli] + ld [wCurrentAnimatedObjectXCoord], a + ld a, [hli] + ld [wCurrentAnimatedObjectYCoord], a + ld a, [hli] + ld [wCurrentAnimatedObjectXOffset], a + ld a, [hl] + ld [wCurrentAnimatedObjectYOffset], a + call UpdateDurationTimerAndFrameStateForCurrentAnimatedObject + cp $fd + jr z, .finish + cp $fc + jr z, .delete_animation + call GetCurrentAnimatedObjectOAMDataPointer + ld a, [wCurrentAnimatedObjectVTileOffset] + add [hl] + ld [wCurrentAnimatedObjectVTileOffset], a + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + push bc + ld a, [wCurrentAnimatedObjectOAMBufferOffset] + ld e, a + ld d, HIGH(wOAMBuffer) + ld a, [hli] + ld c, a +.loop + ld a, [wCurrentAnimatedObjectYCoord] + ld b, a + ld a, [wCurrentAnimatedObjectYOffset] + add b + ld b, a + ld a, [wAnimatedObjectGlobalYOffset] + add b + ld b, a + call GetCurrentAnimatedObjectTileYCoordinate + add b + ld [de], a + inc hl + inc de + ld a, [wCurrentAnimatedObjectXCoord] + ld b, a + ld a, [wCurrentAnimatedObjectXOffset] + add b + ld b, a + ld a, [wAnimatedObjectGlobalXOffset] + add b + ld b, a + call GetCurrentAnimatedObjectTileXCoordinate + add b + ld [de], a + inc hl + inc de + ld a, [wCurrentAnimatedObjectVTileOffset] + add [hl] + ld [de], a + inc hl + inc de + call SetCurrentAnimatedObjectOAMAttributes + ld b, a + ld a, [wc634] + cp $7 + ld a, b + jr z, .skip_load + ld [de], a +.skip_load + inc hl + inc de + ld a, e + ld [wCurrentAnimatedObjectOAMBufferOffset], a + cp LOW(wOAMBufferEnd) + jr nc, .oam_is_full + dec c + jr nz, .loop + pop bc + jr .finish + +.delete_animation + call MaskCurrentAnimatedObjectStruct +.finish + and a + ret + +.oam_is_full + pop bc + scf + ret + +GetCurrentAnimatedObjectTileYCoordinate: + push hl + ld a, [hl] + ld hl, wCurAnimatedObjectOAMAttributes + bit 6, [hl] + jr z, .no_flip + add $8 + xor $ff + inc a +.no_flip + pop hl + ret + +GetCurrentAnimatedObjectTileXCoordinate: + push hl + ld a, [hl] + ld hl, wCurAnimatedObjectOAMAttributes + bit 5, [hl] + jr z, .no_flip + add $8 + xor $ff + inc a +.no_flip + pop hl + ret + +SetCurrentAnimatedObjectOAMAttributes: + ld a, [wCurAnimatedObjectOAMAttributes] + ld b, a + ld a, [hl] + xor b + and $e0 + ld b, a + ld a, [hl] + and $10 + or b + bit 4, a + ret z + or $4 + ret + +GetCurrentAnimatedObjectOAMDataPointer: + ld e, a + ld d, $0 + ld a, [wAnimatedObjectOAMDataPointer] + ld l, a + ld a, [wAnimatedObjectOAMDataPointer + 1] + ld h, a + add hl, de + add hl, de + add hl, de + ret + +SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters: + ld hl, $1 + add hl, bc + ld [hl], a + ld hl, $8 + add hl, bc + ld [hl], $0 + ld hl, $9 + add hl, bc + ld [hl], $0 + ld hl, $a + add hl, bc + ld [hl], $ff + ret + +UpdateDurationTimerAndFrameStateForCurrentAnimatedObject: +.loop + ld hl, $8 + add hl, bc + ld a, [hl] + and a + jr z, .next_frame + dec [hl] + call GetPointerToCurrentAnimatedObjectFrameScript + ld a, [hli] + push af + jr .finish + +.next_frame + ld hl, $a + add hl, bc + inc [hl] + call GetPointerToCurrentAnimatedObjectFrameScript + ld a, [hli] + cp $fe + jr z, .restart_anim + cp $ff + jr z, .hold_last_frame_state + push af + ld a, [hl] + push hl + and $3f + ld hl, $9 + add hl, bc + add [hl] + ld hl, $8 + add hl, bc + ld [hl], a + pop hl +.finish + ld a, [hl] + and $c0 + srl a + ld [wCurAnimatedObjectOAMAttributes], a + pop af + ret + +.hold_last_frame_state + xor a + ld hl, $8 + add hl, bc + ld [hl], a + ld hl, $a + add hl, bc + dec [hl] + dec [hl] + jr .loop + +.restart_anim + xor a + ld hl, $8 + add hl, bc + ld [hl], a + dec a + ld hl, $a + add hl, bc + ld [hl], a + jr .loop + +GetPointerToCurrentAnimatedObjectFrameScript: + ld hl, $1 + add hl, bc + ld e, [hl] + ld d, $0 + ld a, [wAnimatedObjectFramesDataPointer] + ld l, a + ld a, [wAnimatedObjectFramesDataPointer + 1] + ld h, a + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $a + add hl, bc + ld l, [hl] + ld h, $0 + add hl, hl + add hl, de + ret + +ExecuteCurrentAnimatedObjectCallback: + ld hl, $2 + add hl, bc + ld e, [hl] + ld d, $0 + ld a, [wAnimatedObjectJumptablePointer] + ld l, a + ld a, [wAnimatedObjectJumptablePointer + 1] + ld h, a + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl diff --git a/engine/gfx/bg_map_attributes.asm b/engine/gfx/bg_map_attributes.asm new file mode 100644 index 00000000..6f81af63 --- /dev/null +++ b/engine/gfx/bg_map_attributes.asm @@ -0,0 +1,219 @@ +INCLUDE "data/cgb/bg_map_attributes.asm" + +LoadBGMapAttributes:: + ld hl, BGMapAttributesPointers + ld a, c ; c = which packet + push af ; save for later (to determine if we're handling the trainer card or party menu) + dec a ; read this code as: + add a ; dec a + ld e, a ; add a + xor a ; ld e, a + ld d, a ; ld d, 0 + add hl, de ; add hl, de + ld a, [hli] ; ld a, [hli] + ld e, a ; ld h, [hl] + ld a, [hl] ; ld l, a + ld h, a + ld a, e + ld l, a + + di + ld a, $1 + ldh [rVBK], a + push hl + ld a, [hl] + ld c, a ; save attribute count for later + ld de, $10 + add hl, de + ld a, h + ldh [rHDMA1], a + ld a, l + ldh [rHDMA2], a + ld de, vBGMap0 + ld a, d + ldh [rHDMA3], a + ld a, e + ldh [rHDMA4], a + + ldh a, [rLCDC] + and rLCDC_ENABLE_MASK ; is LCD off? + jr z, .lcdOff ; if off, transfer immediately +; wait for VBlank if LCD is on +.waitForVBlankLoop1 + ldh a, [rLY] + cp $90 + jr nz, .waitForVBlankLoop1 +.waitForAccessibleVRAMLoop1 + ldh a, [rSTAT] + and %10 ; are we in HBlank or VBlank? + jr nz, .waitForAccessibleVRAMLoop1 ; loop until we're in a safe period to transfer to VRAM +.lcdOff + ld a, c ; number of BG attributes to transfer, plus 1 times 16 + ldh [rHDMA5], a ; initiate transfer + call Func_3082 ; update audio so it doesn't "lag" + pop hl + ld a, [hli] + ld c, a ; number of BG attributes to transfer, plus 1 times 16 + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a ; offset of the attributes + add hl, de ; hl = new pointer + ld a, h + ldh [rHDMA1], a + ld a, l + ldh [rHDMA2], a + ld de, vBGMap1 ; copy to vBGMap1 + ld a, d + ldh [rHDMA3], a + ld a, e + ldh [rHDMA4], a +; LCD check again + ldh a, [rLCDC] + and rLCDC_ENABLE_MASK ; is LCD off? + jr z, .lcdOff2 ; if off, transfer immediately +; wait for VBlank if LCD is on +.waitForVBlankLoop2 + ldh a, [rLY] + cp $90 + jr nz, .waitForVBlankLoop2 +.waitForAccessibleVRAMLoop2 + ldh a, [rSTAT] + and %10 ; are we in HBlank or VBlank? + jr nz, .waitForAccessibleVRAMLoop2 ; loop until we're in a safe period to transfer to VRAM +.lcdOff2 + ld a, c + ldh [rHDMA5], a + pop af + dec a + dec a + dec a + dec a + jr nz, .checkIfHandlingPartyMenu + call HandleBadgeFaceAttributes + jr .done +.checkIfHandlingPartyMenu + dec a + call z, HandlePartyHPBarAttributes +.done + call Func_3082 + ldh a, [rIF] + res VBLANK, a + ldh [rIF], a + xor a + ldh [rVBK], a + ei + ret + +BGMapAttributesPointers: + dw BGMapAttributes_Unknown1 + dw BGMapAttributes_Unknown2 + dw BGMapAttributes_GameFreakIntro + dw BGMapAttributes_TrainerCard + dw BGMapAttributes_PartyMenu + dw BGMapAttributes_NidorinoIntro + dw BGMapAttributes_TitleScreen + dw BGMapAttributes_Slots + dw BGMapAttributes_Pokedex + dw BGMapAttributes_StatusScreen + dw BGMapAttributes_Battle + dw BGMapAttributes_WholeScreen + dw BGMapAttributes_Unknown13 + +HandleBadgeFaceAttributes: +; zero out the attributes if the player doesn't have the respective badge +; BOULDERBADGE + ld hl, vBGMap1 + $183 + ld de, wTrainerCardBadgeAttributes + 6 * 0 + ld a, [de] + and a + call z, ZeroOutCurrentBadgeAttributes +; CASCADEBADGE + ld hl, vBGMap1 + $187 + ld de, wTrainerCardBadgeAttributes + 6 * 1 + ld a, [de] + and a + call z, ZeroOutCurrentBadgeAttributes +; THUNDERBADGE + ld hl, vBGMap1 + $18b + ld de, wTrainerCardBadgeAttributes + 6 * 2 + ld a, [de] + and a + call z, ZeroOutCurrentBadgeAttributes +; RAINBOWBADGE + ld hl, vBGMap1 + $18f + ld de, wTrainerCardBadgeAttributes + 6 * 3 + ld a, [de] + and a + call z, ZeroOutCurrentBadgeAttributes +; SOULBADGE + ld hl, vBGMap1 + $1e3 + ld de, wTrainerCardBadgeAttributes + 6 * 6 + ld a, [de] + and a + call z, ZeroOutCurrentBadgeAttributes +; MARSHBADGE + ld hl, vBGMap1 + $1e7 + ld de, wTrainerCardBadgeAttributes + 6 * 7 + ld a, [de] + and a + call z, ZeroOutCurrentBadgeAttributes +; VOLCANOBADGE + ld hl, vBGMap1 + $1eb + ld de, wTrainerCardBadgeAttributes + 6 * 8 + ld a, [de] + and a + call z, ZeroOutCurrentBadgeAttributes +; EARTHBADGE + ld hl, vBGMap1 + $1ef + ld de, wTrainerCardBadgeAttributes + 6 * 9 + ld a, [de] + and a + call z, ZeroOutCurrentBadgeAttributes + ret + +ZeroOutCurrentBadgeAttributes: + push hl + xor a + ld [hli], a + ld [hl], a + ld bc, $1f + add hl, bc + ld [hli], a + ld [hl], a + pop hl + ret + +HandlePartyHPBarAttributes: +; hp bars require 3 (green, orange, red) colours, when there are only 2 "free" colours per palette +; therefore, we must transfer individual bg attributes where the locations of the hp bars are in vram + ld hl, vBGMap1 + $25 ; location of start of the HP bar in vram + ld de, wPartyHPBarAttributes + ld c, PARTY_LENGTH +.loop + push bc + push hl + ld a, [de] + and $3 ; 4 possible palettes +REPT 7 ; hp bar length in tiles + ld [hli], a +ENDR + pop hl + ld bc, $40 ; get 2nd party location + add hl, bc + push hl + + push de ; (inefficiently) copy de to hl + pop hl + + ld bc, $6 + add hl, bc ; get the next palette + + push hl + pop de ; copy back to de + + pop hl + pop bc + dec c + jr nz, .loop + ret diff --git a/engine/gfx/palettes.asm b/engine/gfx/palettes.asm index dd723afa..c08992d3 100755 --- a/engine/gfx/palettes.asm +++ b/engine/gfx/palettes.asm @@ -752,7 +752,7 @@ index = 0 ld a, [hli] inc hl - IF index < (NUM_ACTIVE_PALS + -1) + IF index < NUM_ACTIVE_PALS - 1 push hl ENDC @@ -823,7 +823,7 @@ DMGPalToGBCPal:: ld [wLastOBP1], a .convert color_index = 0 - REPT NUM_COLORS + REPT NUM_PAL_COLORS ld b, a and %11 call .GetColorAddress @@ -832,7 +832,7 @@ color_index = 0 ld a, [hl] ld [wGBCPal + color_index * 2 + 1], a - IF color_index < (NUM_COLORS + -1) + IF color_index < NUM_PAL_COLORS - 1 ld a, b rrca rrca @@ -863,14 +863,14 @@ TransferCurBGPData:: ldh a, [rLCDC] and rLCDC_ENABLE_MASK jr nz, .lcdEnabled - rept NUM_COLORS - call TransferPalColorLCDDisabled - endr + REPT NUM_PAL_COLORS + call TransferPalColorLCDDisabled + ENDR jr .done .lcdEnabled - rept NUM_COLORS - call TransferPalColorLCDEnabled - endr + REPT NUM_PAL_COLORS + call TransferPalColorLCDEnabled + ENDR .done pop de ret @@ -887,7 +887,7 @@ BufferBGPPal:: ld de, wBGPPalsBuffer add hl, de ld de, wGBCPal - ld c, PAL_SIZE + ld c, PALETTE_SIZE .loop ld a, [de] ld [hli], a @@ -918,7 +918,7 @@ TransferBGPPals:: ldh [rBGPI], a ld de, rBGPD ld hl, wBGPPalsBuffer - ld c, 4 * PAL_SIZE + ld c, 4 * PALETTE_SIZE .loop ld a, [hli] ld [de], a @@ -939,14 +939,14 @@ TransferCurOBPData: ldh a, [rLCDC] and rLCDC_ENABLE_MASK jr nz, .lcdEnabled - rept NUM_COLORS - call TransferPalColorLCDDisabled - endr + REPT NUM_PAL_COLORS + call TransferPalColorLCDDisabled + ENDR jr .done .lcdEnabled - rept NUM_COLORS - call TransferPalColorLCDEnabled - endr + REPT NUM_PAL_COLORS + call TransferPalColorLCDEnabled + ENDR .done pop de ret diff --git a/engine/gfx/sprite_oam.asm b/engine/gfx/sprite_oam.asm index 01b2c412..b62d9d4b 100644 --- a/engine/gfx/sprite_oam.asm +++ b/engine/gfx/sprite_oam.asm @@ -153,7 +153,7 @@ PrepareOAMData:: cp c ret nc ld l, a - ld h, wOAMBuffer / $100 + ld h, HIGH(wOAMBuffer) ld a, c ld de, $4 ; entry size ld b, $a0 diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm index b1b458ab..d4c3ae18 100755 --- a/engine/items/item_effects.asm +++ b/engine/items/item_effects.asm @@ -1037,7 +1037,7 @@ ItemUseMedicine: push hl push de push bc - callfar Func_2fd6a + callfar RespawnOverworldPikachu pop bc pop de pop hl @@ -1542,7 +1542,7 @@ ItemUseMedicine: push af ld a, [wUsedItemOnWhichPokemon] ld [wWhichPokemon], a - callfar Func_2fd6a ; evolve pokemon, if appropriate + callfar RespawnOverworldPikachu ; evolve pokemon, if appropriate pop af ld [wWhichPokemon], a diff --git a/engine/items/super_rod.asm b/engine/items/super_rod.asm new file mode 100644 index 00000000..db82f5fb --- /dev/null +++ b/engine/items/super_rod.asm @@ -0,0 +1,41 @@ +ReadSuperRodData: + ld a, [wCurMap] + ld c, a + ld hl, SuperRodFishingSlots +.loop + ld a, [hli] + cp $ff + jr z, .notfound + cp c + jr z, .found + ld de, $8 + add hl, de + jr .loop +.found + call GenerateRandomFishingEncounter + ret +.notfound + ld de, $0 + ret + +GenerateRandomFishingEncounter: + call Random + cp $66 + jr c, .asm_f5ed6 + inc hl + inc hl + cp $b2 + jr c, .asm_f5ed6 + inc hl + inc hl + cp $e5 + jr c, .asm_f5ed6 + inc hl + inc hl +.asm_f5ed6 + ld e, [hl] + inc hl + ld d, [hl] + ret + +INCLUDE "data/wild/super_rod.asm" diff --git a/engine/menus/draw_badges.asm b/engine/menus/draw_badges.asm index 0bb433cc..5e00a34e 100644 --- a/engine/menus/draw_badges.asm +++ b/engine/menus/draw_badges.asm @@ -49,8 +49,7 @@ DrawBadges: hlcoord 2, 14 ld de, wTempObtainedBadgesBooleans + 4 -; call .DrawBadgeRow -; ret + ; fallthrough .DrawBadgeRow ; Draw 4 badges. diff --git a/engine/menus/start_sub_menus.asm b/engine/menus/start_sub_menus.asm index 84583a69..b9751e1e 100755 --- a/engine/menus/start_sub_menus.asm +++ b/engine/menus/start_sub_menus.asm @@ -324,10 +324,11 @@ StartMenu_Item:: call PrintText jr .exitMenu .notInCableClubRoom + ; store item bag pointer in wListPointer (for DisplayListMenuID) ld hl, wListPointer - ld [hl], wNumBagItems & $ff + ld [hl], LOW(wNumBagItems) inc hl - ld [hl], wNumBagItems / $100 ; store item bag pointer in wListPointer (for DisplayListMenuID) + ld [hl], HIGH(wNumBagItems) xor a ld [wPrintItemPrices], a ld a, ITEMLISTMENU diff --git a/engine/menus/unused_input.asm b/engine/menus/unused_input.asm new file mode 100644 index 00000000..ad5c36df --- /dev/null +++ b/engine/menus/unused_input.asm @@ -0,0 +1,129 @@ +HandleMenuInputDuplicate: ; unreferenced + xor a + ld [wPartyMenuAnimMonEnabled], a + +HandleMenuInputPokemonSelectionDuplicate: ; unreferenced + ldh a, [hDownArrowBlinkCount1] + push af + ldh a, [hDownArrowBlinkCount2] + push af ; save existing values on stack + xor a + ldh [hDownArrowBlinkCount1], a ; blinking down arrow timing value 1 + ld a, 6 + ldh [hDownArrowBlinkCount2], a ; blinking down arrow timing value 2 +.loop1 + xor a + ld [wAnimCounter], a ; counter for pokemon shaking animation + call PlaceMenuCursorDuplicate + call JoypadLowSensitivity + ldh a, [hJoy5] + and a ; was a key pressed? + jr nz, .keyPressed + pop af + ldh [hDownArrowBlinkCount2], a + pop af + ldh [hDownArrowBlinkCount1], a ; restore previous values + xor a + ld [wMenuWrappingEnabled], a ; disable menu wrapping + ret +.keyPressed + xor a + ld [wCheckFor180DegreeTurn], a + ldh a, [hJoy5] + ld b, a + bit 6, a ; pressed Up key? + jr z, .checkIfDownPressed +.upPressed + ld a, [wCurrentMenuItem] ; selected menu item + and a ; already at the top of the menu? + jr z, .checkOtherKeys +.notAtTop + dec a + ld [wCurrentMenuItem], a ; move selected menu item up one space + jr .checkOtherKeys +.checkIfDownPressed + bit 7, a + jr z, .checkOtherKeys +.downPressed + ld a, [wCurrentMenuItem] + inc a + ld c, a + ld a, [wMaxMenuItem] + cp c + jr c, .checkOtherKeys + ld a, c + ld [wCurrentMenuItem], a +.checkOtherKeys + ld a, [wMenuWatchedKeys] + and b ; does the menu care about any of the pressed keys? + jp z, .loop1 +.checkIfAButtonOrBButtonPressed + ldh a, [hJoy5] + and A_BUTTON | B_BUTTON + jr z, .skipPlayingSound +.AButtonOrBButtonPressed + ld a, SFX_PRESS_AB + call PlaySound ; play sound +.skipPlayingSound + pop af + ldh [hDownArrowBlinkCount2], a + pop af + ldh [hDownArrowBlinkCount1], a ; restore previous values + ldh a, [hJoy5] + ret + +PlaceMenuCursorDuplicate: + ld a, [wTopMenuItemY] + and a + jr z, .asm_f5ac0 + hlcoord 0, 0 + ld bc, SCREEN_WIDTH +.loop + add hl, bc + dec a + jr nz, .loop +.asm_f5ac0 + ld a, [wTopMenuItemX] + ld b, $0 + ld c, a + add hl, bc + push hl + ld a, [wLastMenuItem] + and a + jr z, .asm_f5ad5 + ld bc, $28 +.loop2 + add hl, bc + dec a + jr nz, .loop2 +.asm_f5ad5 + ld a, [hl] + cp "▶" + jr nz, .asm_f5ade + ld a, [wTileBehindCursor] + ld [hl], a +.asm_f5ade + pop hl + ld a, [wCurrentMenuItem] + and a + jr z, .asm_f5aec + ld bc, $28 +.loop3 + add hl, bc + dec a + jr nz, .loop3 +.asm_f5aec + ld a, [hl] + cp "▶" + jr z, .asm_f5af4 + ld [wTileBehindCursor], a +.asm_f5af4 + ld a, "▶" + ld [hl], a + ld a, l + ld [wMenuCursorLocation], a + ld a, h + ld [wMenuCursorLocation + 1], a + ld a, [wCurrentMenuItem] + ld [wLastMenuItem], a + ret diff --git a/engine/minigame/surfing_pikachu.asm b/engine/minigame/surfing_pikachu.asm new file mode 100755 index 00000000..6d319867 --- /dev/null +++ b/engine/minigame/surfing_pikachu.asm @@ -0,0 +1,2863 @@ +SurfingPikachuMinigame:: + call SurfingPikachuMinigame_BlankPals + call DelayFrame + call DelayFrame + call DelayFrame + ldh a, [hTilesetType] + push af + xor a + ldh [hTilesetType], a + ld a, [wUpdateSpritesEnabled] + push af + ld a, $ff + ld [wUpdateSpritesEnabled], a + ldh a, [rIE] + push af + xor a + ldh [rIF], a + ld a, $f + ldh [rIE], a + ld a, $8 + ldh [rSTAT], a + ldh a, [hAutoBGTransferDest + 1] + push af + ld a, $98 + ldh [hAutoBGTransferDest + 1], a + call SurfingPikachuMinigameIntro + call SurfingPikachuLoop + xor a + ldh [rBGP], a + ldh [rOBP0], a + ldh [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + call ClearObjectAnimationBuffers + call ClearSprites + xor a + ldh [hLCDCPointer], a + ldh [hSCX], a + ldh [hSCY], a + ld a, $90 + ldh [hWY], a + call DelayFrame + pop af + ldh [hAutoBGTransferDest + 1], a + xor a + ldh [rIF], a + pop af + ldh [rIE], a + xor a + ldh [rSTAT], a + call RunDefaultPaletteCommand + call ReloadMapAfterSurfingMinigame + call PlayDefaultMusic + call GBPalNormal + pop af + ld [wUpdateSpritesEnabled], a + pop af + ldh [hTilesetType], a + ret + +SurfingPikachuLoop: + call SurfingPikachuMinigame_LoadGFXAndLayout + call DelayFrame + ld b, $e + call RunPaletteCommand +.loop + ld a, [wSurfingMinigameRoutineNumber] + bit 7, a + ret nz + call SurfingPikachu_GetJoypad_3FrameBuffer + call SurfingPikachu_CheckPressedSelect + ret nz + call RunSurfingMinigameRoutine + ld a, $3c + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations + call SurfingMinigame_MoveClouds + call .DelayFrame + call SurfingMinigame_UpdateMusicTempo + jr .loop + +.DelayFrame: + call DelayFrame + ret + +SurfingPikachu_CheckPressedSelect: + ld hl, wd492 + bit 1, [hl] + ret z + ldh a, [hJoyPressed] + and SELECT + ret + +Func_f80b7: + ldh a, [hJoyPressed] + and START + ret z + ld hl, wc5e2 + ld a, [hl] + xor $1 + ld [hl], a + ret + +SurfingMinigame_UpdateMusicTempo: + ld a, [wc634] + and a + ret z + + ; check that all channels are on their last frame of note delay + ld hl, wChannelNoteDelayCounters + ld a, $1 + cp [hl] + ret nz + inc hl + cp [hl] + ret nz + inc hl + cp [hl] + ret nz + + ; de = ([wSurfingMinigamePikachuSpeed] & 0x3f) * 2 + ld a, [wSurfingMinigamePikachuSpeed] + ld e, a + ld a, [wSurfingMinigamePikachuSpeed + 1] + and $3 + ld d, a + sla e + rl d + ld e, d + ld d, $0 + ld hl, .Tempos + add hl, de + add hl, de + ld a, [hli] + ld [wMusicTempo + 1], a + ld a, [hl] + ld [wMusicTempo], a + ret + +.Tempos: + dw 117 + dw 109 + dw 101 + dw 93 + dw 85 + +SurfingMinigame_ResetMusicTempo: + ld hl, wChannelNoteDelayCounters + ld a, $1 + cp [hl] + ret nz + inc hl + cp [hl] + ret nz + inc hl + cp [hl] + ret nz + ld a, 117 + ld [wMusicTempo + 1], a + xor a + ld [wMusicTempo], a + ret + +SurfingPikachuMinigame_LoadGFXAndLayout: + call SurfingPikachu_ClearTileMap + call ClearSprites + call DisableLCD + ld hl, wSurfingMinigameData + ld bc, wSurfingMinigameDataEnd - wSurfingMinigameData + xor a + call FillMemory + ld hl, wLYOverrides + ld bc, wLYOverridesBufferEnd - wLYOverrides + xor a + call FillMemory + xor a + ldh [hAutoBGTransferEnabled], a + call ClearObjectAnimationBuffers + + ld hl, SurfingPikachu1Graphics1 + ld de, $9000 + ld bc, $500 + ld a, BANK(SurfingPikachu1Graphics1) + call FarCopyData + + ld hl, SurfingPikachu1Graphics2 + ld de, $8000 + ld bc, $1000 + ld a, BANK(SurfingPikachu1Graphics2) + call FarCopyData + + ld a, LOW(SurfingPikachuSpawnStateDataPointer) + ld [wAnimatedObjectSpawnStateDataPointer], a + ld a, HIGH(SurfingPikachuSpawnStateDataPointer) + ld [wAnimatedObjectSpawnStateDataPointer + 1], a + + ld a, LOW(SurfingPikachuObjectJumptable) + ld [wAnimatedObjectJumptablePointer], a + ld a, HIGH(SurfingPikachuObjectJumptable) + ld [wAnimatedObjectJumptablePointer + 1], a + + ld a, LOW(SurfingPikachuOAMData) + ld [wAnimatedObjectOAMDataPointer], a + ld a, HIGH(SurfingPikachuOAMData) + ld [wAnimatedObjectOAMDataPointer + 1], a + + ld a, LOW(SurfingPikachuFrames) + ld [wAnimatedObjectFramesDataPointer], a + ld a, HIGH(SurfingPikachuFrames) + ld [wAnimatedObjectFramesDataPointer + 1], a + + ld hl, vBGMap0 + ld bc, $80 tiles + ld a, $0 + call FillMemory + + ld hl, $98c0 + ld bc, $18 tiles + ld a, $b + call FillMemory + + ld a, $1 + lb de, $74, $58 + call SpawnAnimatedObject + + ld a, $74 + ld [wSurfingMinigamePikachuObjectHeight], a + + call SurfingMinigame_InitScanlineOverrides + + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7e + ldh [hWY], a + ld a, rSCY - $ff00 + ldh [hLCDCPointer], a + ld a, $40 + ld [wSurfingMinigamePikachuSpeed], a + xor a + ld [wSurfingMinigamePikachuSpeed + 1], a + xor a + ld [wSurfingMinigamePikachuHP], a + ld a, $60 + ld [wSurfingMinigamePikachuHP + 1], a + ld hl, wSurfingMinigameWaveHeight + ld bc, $14 + ld a, $74 + call FillMemory + call Func_f81ff + call Func_f8256 + ld a, $e3 + ldh [rLCDC], a + call SurfingPikachuMinigame_SetBGPals + ld a, $e4 + ldh [rOBP0], a + ld a, $e0 + ldh [rOBP1], a + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +SurfingPikachuMinigame_SetBGPals: + ld a, [wOnSGB] + and a + jr nz, .sgb + ld a, $d0 + ldh [rBGP], a + call UpdateGBCPal_BGP + ret + +.sgb + ld a, $e4 + ldh [rBGP], a + call UpdateGBCPal_BGP + ret + +Func_f81ff: + ld hl, wSpriteDataEnd + ld de, Unkn_f8249 + ld b, $97 + ld c, $80 + ld a, $4 + call Func_f8233 + ld de, Unkn_f8248 + ld b, $96 + ld c, $50 + ld a, $1 + call Func_f8233 + ld de, Unkn_f824d + ld b, $14 + ld c, $20 + ld a, $5 + call Func_f8233 + ld de, Unkn_f8252 + ld b, $20 + ld c, $80 + ld a, $4 + call Func_f8233 + ret + +Func_f8233: +.asm_f8233 + push af + ld [hl], b + inc hl + ld [hl], c + inc hl + ld a, [de] + ld [hl], a + inc hl + ld [hl], $0 + inc hl + ld a, c + add $8 + ld c, a + inc de + pop af + dec a + jr nz, .asm_f8233 + ret + +Unkn_f8248: + db $fe + +Unkn_f8249: + db $d0 + db $d0 + db $d0 + db $d0 + +Unkn_f824d: + db $ec + db $ed + db $ed + db $ee + db $ef + +Unkn_f8252: + db $ec + db $ed + db $ee + db $ef + +Func_f8256: + ld de, $9c21 + ld hl, Unkn_f8279 + ld c, $9 +.asm_f825e + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .asm_f825e + ld hl, $9c01 + ld [hl], $15 + ld hl, $9c02 + ld [hl], $16 + ld hl, $9c2c + ld [hl], $1b + ld hl, $9c2d + ld [hl], $1c + ret + +Unkn_f8279: + db $17 + db $18 + db $19 + db $19 + db $19 + db $19 + db $19 + db $19 + db $19 + +RunSurfingMinigameRoutine: + ld a, [wSurfingMinigameRoutineNumber] + ld e, a + ld d, $0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: + dw SurfingMinigameRoutine_SpawnPikachu ; 0 + dw SurfingMinigame_RunGame ; 1 + dw Func_f8324 ; 2 + dw Func_f835c ; 3 + dw SurfingMinigame_DrawResultsScreenAndWait ; 4 + dw SurfingMinigame_WriteHPLeftAndWait ; 5 + dw SurfingMinigame_WriteRadnessAndWait ; 6 + dw SurfingMinigame_WriteTotalAndWait ; 7 + dw SurfingMinigame_AddRemainingHPToTotalAndWait ; 8 + dw SurfingMinigame_AddRadnessToTotalAndWait ; 9 + dw SurfingMinigame_WaitLast ; a + dw SurfingMinigame_ExitOnPressA ; b + dw SurfingMinigame_GameOver ; c + +SurfingMinigameRoutine_SpawnPikachu: + ld a, $2 + lb de, $48, $e0 + call SpawnAnimatedObject + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ld a, $1 + ld [wc634], a + ret + +SurfingMinigame_RunGame: + ld a, [wc5e5] + cp $18 + jr nc, .asm_f82e8 + ld hl, wSurfingMinigamePikachuHP + ld a, [hli] + or [hl] + and a + jr z, .dead + call Random + ld [wc5d5], a + call SurfingMinigame_UpdateLYOverrides + call SurfingMinigame_SetPikachuHeight + call SurfingMinigame_ReadBGMapBuffer + call SurfingMinigame_ScrollAndGenerateBGMap + call SurfingMinigame_UpdatePikachuDistance + call SurfingMinigame_Deduct1HP + call SurfingMinigame_DrawHP + ret + +.asm_f82e8 + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + xor a + ld [wc634], a + ld a, 192 + ld [wSurfingMinigameRoutineDelay], a + ret + +.dead + ld a, $1 + ld [wc630], a + ld a, $c + ld [wSurfingMinigameRoutineNumber], a + ld a, $80 + ld [wc631], a + ld a, $b + lb de, $88, $58 + call SpawnAnimatedObject + ld hl, ANIM_OBJ_Y_OFFSET + add hl, bc + ld [hl], $80 + ld hl, ANIM_OBJ_FIELD_B + add hl, bc + ld [hl], $80 + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld [hl], $30 + xor a + ld [wc634], a + ret + +Func_f8324: + call SurfingMinigame_RunDelayTimer + jr c, .done_delay + xor a + ld [wc5d5], a + call SurfingMinigame_UpdateLYOverrides + call SurfingMinigame_SetPikachuHeight + call SurfingMinigame_ReadBGMapBuffer + call Func_f8c97 + call SurfingMinigame_ResetMusicTempo + ret + +.done_delay + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ld a, $90 + ldh [hSCX], a + ld a, $72 + ld [wSurfingMinigameWaveFunctionNumber], a + ld a, $4 + ld [wc5d2], a + xor a + ldh [hLCDCPointer], a + ld [wSurfingMinigameSCX], a + ld [wSurfingMinigameSCX + 1], a + ld [wSurfingMinigameSCX + 2], a + ret + +Func_f835c: + ldh a, [hSCX] + and a + jr z, .asm_f837b + call SurfingMinigame_UpdateLYOverrides + call SurfingMinigame_SetPikachuHeight + call SurfingMinigame_ReadBGMapBuffer + ldh a, [hSCX] + dec a + dec a + dec a + dec a + ldh [hSCX], a + ld a, $e0 + ld [wSurfingMinigameXOffset], a + call SurfingMinigame_GenerateBGMap + ret + +.asm_f837b + xor a + ld [wSurfingMinigamePikachuSpeed], a + ld [wSurfingMinigamePikachuSpeed + 1], a + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ld a, $5 + ld [wc5d2], a + ret + +SurfingMinigame_DrawResultsScreenAndWait: + call SurfingMinigame_DrawResultsScreen + ld a, 32 + ld [wSurfingMinigameRoutineDelay], a + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ret + +SurfingMinigame_WriteHPLeftAndWait: + call SurfingMinigame_RunDelayTimer + ret nc + call SurfingMinigame_WriteHPLeft + ld a, 64 + ld [wSurfingMinigameRoutineDelay], a + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ret + +SurfingMinigame_WriteRadnessAndWait: + call SurfingMinigame_RunDelayTimer + ret nc + call SurfingMinigame_WriteRadness + ld a, 64 + ld [wSurfingMinigameRoutineDelay], a + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ret + +SurfingMinigame_WriteTotalAndWait: + call SurfingMinigame_RunDelayTimer + ret nc + call SurfingMinigame_WriteTotal + ld a, 64 + ld [wSurfingMinigameRoutineDelay], a + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ret + +SurfingMinigame_AddRemainingHPToTotalAndWait: + call SurfingMinigame_RunDelayTimer + ret nc + call SurfingMinigame_AddRemainingHPToTotal + push af + call SurfingMinigame_BCDPrintTotalScore + pop af + ret nc + ld a, 64 + ld [wSurfingMinigameRoutineDelay], a + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ret + +SurfingMinigame_AddRadnessToTotalAndWait: + call SurfingMinigame_RunDelayTimer + ret nc + call SurfingMinigame_AddRadnessToTotal + push af + call SurfingMinigame_BCDPrintTotalScore + pop af + ret nc + ld a, 128 + ld [wSurfingMinigameRoutineDelay], a + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + call DidPlayerGetAHighScore + ret nc + call SurfingMinigame_PrintTextHiScore + ld a, $6 + ld [wc5d2], a + ret + +SurfingMinigame_WaitLast: + call SurfingMinigame_RunDelayTimer + ret nc + ld hl, wSurfingMinigameRoutineNumber + inc [hl] + ret + +SurfingMinigame_ExitOnPressA: + call SurfingMinigame_UpdateLYOverrides + ldh a, [hJoyPressed] + and A_BUTTON + ret z + ld hl, wSurfingMinigameRoutineNumber + set 7, [hl] + ret + +SurfingMinigame_GameOver: + call SurfingMinigame_UpdateLYOverrides + call SurfingMinigame_SetPikachuHeight + call SurfingMinigame_ReadBGMapBuffer + call SurfingMinigame_ScrollAndGenerateBGMap + call SurfingMinigame_ResetMusicTempo + ld hl, wc631 + ld a, [hl] + and a + jr z, .wait_press_a + dec [hl] + ret + +.wait_press_a + ldh a, [hJoyPressed] + and A_BUTTON + ret z + ld hl, wSurfingMinigameRoutineNumber + set 7, [hl] + ret + +SurfingMinigame_RunDelayTimer: + ld hl, wSurfingMinigameRoutineDelay + ld a, [hl] + and a + jr z, .set_carry + dec [hl] + and a + ret + +.set_carry + scf + ret + +SurfingMinigame_UpdatePikachuDistance: + ld a, [wc5e5 + 1] + ld h, a + ld a, [wc5e5 + 2] + ld l, a + ld a, [wSurfingMinigamePikachuSpeed] + ld e, a + ld a, [wSurfingMinigamePikachuSpeed + 1] + ld d, a + add hl, de + ld a, h + ld [wc5e5 + 1], a + ld a, l + ld [wc5e5 + 2], a + ret nc + ld hl, wc5e5 + inc [hl] + ld hl, wOAMBuffer + 4 * 4 + 1 + dec [hl] + dec [hl] + ret + +SurfingMinigameAnimatedObjectFn_Pikachu: + ld a, [wc5d2] + ld e, a + ld d, $0 + ld hl, Jumptable_f847f + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +Jumptable_f847f: + dw Func_f848d + dw SurfingMinigame_ScoreCurrentWave + dw Func_f8516 + dw Func_f8545 + dw Func_f8561 + dw Func_f856d + dw Func_f8579 + +Func_f848d: + ld a, [wc630] + and a + jr nz, .asm_f84d2 + call Func_f87b5 + ld a, [wSurfingMinigamePikachuObjectHeight] + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld [hl], a + call Func_f871e + jr c, .splash + call Func_f8742 + call SurfingMinigame_SpeedUpPikachu + ret + +.splash + call Func_f8742 + ld a, $1 ; on a wave + ld [wc5d2], a + xor a + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld [hl], a + ld hl, ANIM_OBJ_FIELD_D + add hl, bc + ld [hl], a + ld hl, ANIM_OBJ_FIELD_E + add hl, bc + ld [hl], a + ld [wSurfingMinigameRadnessMeter], a + ld [wSurfingMinigameTrickFlags], a + xor a + ld [wChannelSoundIDs + Ch8], a + ld a, SFX_SURFING_JUMP + call PlaySound + ret + +.asm_f84d2 + xor a + ld [wSurfingMinigamePikachuSpeed], a + ld [wSurfingMinigamePikachuSpeed + 1], a + ld a, $4 + ld [wc5d2], a + call Func_f8742 + ret + +SurfingMinigame_ScoreCurrentWave: + call SurfingMinigame_DPadAction + call SurfingMinigame_UpdatePikachuHeight + ret nc + call SurfingMinigame_TileInteraction + jr c, .splash + call SurfingMinigame_CalculateAndAddRadnessFromStunt + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld [hl], $0 + ld a, $2 + ld [wc5d2], a + ret + +.splash + ld a, $3 + ld [wc5d2], a + ld a, $60 + ld [wc5e1], a + ld a, $10 + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters + xor a + ld [wChannelSoundIDs + Ch8], a + ld a, SFX_SURFING_CRASH + call PlaySound + ret + +Func_f8516: + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld a, [hl] + cp $20 + jr nc, .asm_f8539 + inc [hl] + inc [hl] + inc [hl] + inc [hl] + ld d, $4 + call SurfingPikachu_Sine + ld hl, ANIM_OBJ_Y_OFFSET + add hl, bc + ld [hl], a + call Func_f87b5 + ld a, [wSurfingMinigamePikachuObjectHeight] + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld [hl], a + ret + +.asm_f8539 + ld hl, ANIM_OBJ_Y_OFFSET + add hl, bc + ld [hl], $0 + ld a, $0 + ld [wc5d2], a + ret + +Func_f8545: + ld hl, wc5e1 + ld a, [hl] + and a + jr z, .asm_f8556 + dec [hl] + ld a, [wSurfingMinigamePikachuObjectHeight] + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld [hl], a + ret + +.asm_f8556 + ld a, $0 + ld [wc5d2], a + ld a, $4 + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters + ret + +Func_f8561: + ld a, [wSurfingMinigamePikachuObjectHeight] + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld [hl], a + call Func_f8742 + ret + +Func_f856d: + ld a, $f + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld [hl], $0 + ret + +Func_f8579: + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld a, [hl] + inc [hl] + inc [hl] + and $3f + cp $20 + jr c, .asm_f8591 + ld d, $10 + call SurfingPikachu_Sine + ld hl, ANIM_OBJ_Y_OFFSET + add hl, bc + ld [hl], a + ret + +.asm_f8591 + ld hl, ANIM_OBJ_Y_OFFSET + add hl, bc + ld [hl], $0 + ret + +SurfingMinigame_DPadAction: + ld de, hJoy5 + ld a, [de] + and D_LEFT + jr nz, .d_left + ld a, [de] + and D_RIGHT + jr nz, .d_right + ret + +.d_left + ld hl, ANIM_OBJ_FIELD_E + add hl, bc + ld [hl], $0 + ld hl, ANIM_OBJ_FIELD_D + add hl, bc + ld a, [hl] + inc [hl] + cp $b + jr c, .d_left_skip + call .StartTrick + ld hl, wSurfingMinigameTrickFlags + set 0, [hl] +.d_left_skip + ld hl, ANIM_OBJ_FRAME_SET + add hl, bc + ld a, [hl] + cp $e + jr nc, .d_left_reset + inc [hl] + ret + +.d_left_reset + ld [hl], $1 + ret + +.d_right + ld hl, ANIM_OBJ_FIELD_D + add hl, bc + ld [hl], $0 + ld hl, ANIM_OBJ_FIELD_E + add hl, bc + ld a, [hl] + inc [hl] + cp $d + jr c, .d_right_skip + call .StartTrick + ld hl, wSurfingMinigameTrickFlags + set 1, [hl] +.d_right_skip + ld hl, ANIM_OBJ_FRAME_SET + add hl, bc + ld a, [hl] + cp $1 + jr z, .d_right_reset + dec [hl] + ret + +.d_right_reset + ld [hl], $e + ret + +.StartTrick: + call SurfingMinigame_IncreaseRadnessMeter + xor a + ld hl, ANIM_OBJ_FIELD_D + add hl, bc + ld [hl], a + ld hl, ANIM_OBJ_FIELD_E + add hl, bc + ld [hl], a + ld a, SFX_SURFING_FLIP + call PlaySound + ret + +SurfingMinigame_TileInteraction: + ld hl, ANIM_OBJ_FRAME_SET + add hl, bc + ld a, [wSurfingMinigameBGMapReadBuffer] + cp $6 + jr z, .tile_06 + cp $14 + jr z, .tile_14 + cp $12 + jr z, .tile_12 + cp $7 + jr z, .tile_07 + ld a, [hl] + cp $1 + jp z, .action_0 + cp $2 + jr z, .action_1 + cp $3 + jr z, .action_2 + cp $4 + jr z, .action_3 + cp $5 + jr z, .action_2 + cp $6 + jr z, .action_1 + cp $7 + jr z, .action_0 + jr .action_0 + +.tile_06 + ld a, [hl] + cp $1 + jr z, .action_0 + cp $2 + jr z, .action_0 + cp $3 + jr z, .action_0 + cp $4 + jr z, .action_1 + cp $5 + jr z, .action_2 + cp $6 + jr z, .action_3 + cp $7 + jr z, .action_2 + jr .action_0 + +.tile_07 + ld a, [hl] + cp $1 + jr z, .action_2 + cp $2 + jr z, .action_3 + cp $3 + jr z, .action_2 + cp $4 + jr z, .action_1 + cp $5 + jr z, .action_0 + cp $6 + jr z, .action_0 + cp $7 + jr z, .action_0 + jr .action_0 + +.tile_12 +.tile_14 + ld a, [hl] + cp $1 + jr z, .action_0 + cp $2 + jr z, .action_1 + cp $3 + jr z, .action_2 + cp $4 + jr z, .action_3 + cp $5 + jr z, .action_3 + cp $6 + jr z, .action_2 + cp $7 + jr z, .action_1 + jr .action_0 + +.action_1 + call SufingMinigame_ReduceSpeedBy128 + jr .action_3 + +.action_2 + call SufingMinigame_ReduceSpeedBy64 +.action_3 + xor a + ld [wChannelSoundIDs + Ch8], a + ld a, SFX_SURFING_LAND + call PlaySound + and a + ret + +.action_0 + ld a, $40 + ld [wSurfingMinigamePikachuSpeed], a + xor a + ld [wSurfingMinigamePikachuSpeed + 1], a + scf + ret + +SurfingMinigame_SpeedUpPikachu: + ld a, [wSurfingMinigamePikachuSpeed + 1] + cp $2 + ret nc + ld h, a + ld a, [wSurfingMinigamePikachuSpeed] + ld l, a + ld de, $2 + add hl, de + ld a, h + ld [wSurfingMinigamePikachuSpeed + 1], a + ld a, l + ld [wSurfingMinigamePikachuSpeed], a + ret + +SufingMinigame_ReduceSpeedBy64: + ld a, [wSurfingMinigamePikachuSpeed + 1] + and a + jr nz, .go + ld a, [wSurfingMinigamePikachuSpeed] + cp $40 + jr nc, .go + xor a + ld [wSurfingMinigamePikachuSpeed], a + ret + +.go + ld a, [wSurfingMinigamePikachuSpeed + 1] + ld h, a + ld a, [wSurfingMinigamePikachuSpeed] + ld l, a + ld de, -$40 + add hl, de + ld a, h + ld [wSurfingMinigamePikachuSpeed + 1], a + ld a, l + ld [wSurfingMinigamePikachuSpeed], a + ret + +SufingMinigame_ReduceSpeedBy128: + ld a, [wSurfingMinigamePikachuSpeed + 1] + and a + jr nz, .go + ld a, [wSurfingMinigamePikachuSpeed] + cp $80 + jr nc, .go + xor a + ld [wSurfingMinigamePikachuSpeed], a + ret + +.go + ld a, [wSurfingMinigamePikachuSpeed + 1] + ld h, a + ld a, [wSurfingMinigamePikachuSpeed] + ld l, a + ld de, -$80 + add hl, de + ld a, h + ld [wSurfingMinigamePikachuSpeed + 1], a + ld a, l + ld [wSurfingMinigamePikachuSpeed], a + ret + +Func_f871e: + ldh a, [hSCX] + and $7 + cp $3 + jr c, .asm_f8740 + cp $5 + jr nc, .asm_f8740 + ld a, [wSurfingMinigameBGMapReadBuffer] + cp $14 + jr nz, .asm_f8740 + call SufingMinigame_GetSpeedDividedBy32 + cp $a + jr c, .asm_f8740 + ld [wc5ec], a + call Func_f9284 + scf + ret + +.asm_f8740 + and a + ret + +Func_f8742: + ldh a, [hSCX] + and $7 + cp $3 + ret c + cp $5 + ret nc + ld a, [wSurfingMinigameBGMapReadBuffer] + cp $6 + jr z, .asm_f8766 + cp $14 + jr z, .asm_f8766 + cp $7 + jr z, .asm_f876a + call Func_f8778 + ld a, $4 + ld hl, ANIM_OBJ_FRAME_SET + add hl, bc + ld [hl], a + ret + +.asm_f8766 + ld a, $6 + jr .asm_f876c + +.asm_f876a + ld a, $2 +.asm_f876c + ld e, a + ld a, [wc5de] + dec a + add e + ld hl, ANIM_OBJ_FRAME_SET + add hl, bc + ld [hl], a + ret + +Func_f8778: + ld hl, wc5e0 + ld a, [hl] + inc [hl] + and $7 + ret nz + ld a, [wc5df] + and a + jr z, .asm_f8796 + ld a, [wc5de] + and a + jr z, .asm_f8791 + dec a + ld [wc5de], a + ret + +.asm_f8791 + xor a + ld [wc5df], a + ret + +.asm_f8796 + ld a, [wc5de] + cp $2 + jr z, .asm_f87a2 + inc a + ld [wc5de], a + ret + +.asm_f87a2 + ld a, $1 + ld [wc5df], a + ret + +SufingMinigame_GetSpeedDividedBy32: + ld a, [wSurfingMinigamePikachuSpeed] + ld l, a + ld a, [wSurfingMinigamePikachuSpeed + 1] + ld h, a + add hl, hl + add hl, hl + add hl, hl + ld a, h + ret + +Func_f87b5: + ld hl, wc5eb + ld a, [hl] + inc [hl] + and $3 + ret nz + call .GetYCoord + ld d, a + ld hl, ANIM_OBJ_X_COORD + add hl, bc + ld e, [hl] + ld a, $a + push bc + call SpawnAnimatedObject + pop bc + ret + +.GetYCoord: + ldh a, [hSCX] + and $8 + jr nz, .get_height_plus_9 + ld hl, wSurfingMinigameWaveHeight + 8 + jr .got_hl + +.get_height_plus_9 + ld hl, wSurfingMinigameWaveHeight + 9 +.got_hl + ld a, [wSurfingMinigameBGMapReadBuffer + 1] + cp $6 + jr z, .six_or_twenty + cp $14 + jr z, .six_or_twenty + cp $7 + jr z, .seven + ld a, [hl] + ret + +.six_or_twenty + ldh a, [hSCX] + and $7 + ld e, a + ld a, [hl] + sub e + ret + +.seven + ldh a, [hSCX] + and $7 + add [hl] + ret + +Func_f87fb: + ld hl, ANIM_OBJ_X_COORD + add hl, bc + ld a, [hl] + cp $58 + ret z + add $4 + ld [hl], a + ret + +Func_f8807: ; unreferenced + call MaskCurrentAnimatedObjectStruct + ret + +SurfingMinigameAnimatedObjectFn_FlippingPika: + ld hl, ANIM_OBJ_FIELD_B + add hl, bc + ld a, [hl] + and a + ret z + dec [hl] + dec [hl] + ld d, a + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld a, [hl] + inc [hl] + call SurfingPikachu_Sine + cp $80 + jr nc, .positive + xor $ff + inc a +.positive + ld hl, ANIM_OBJ_Y_OFFSET + add hl, bc + ld [hl], a + ret + +SurfingMinigameAnimatedObjectFn_IntroAnimationPikachu: + ld hl, ANIM_OBJ_FIELD_B + add hl, bc + ld a, [hl] + inc [hl] + and $1 + ret z + ld hl, ANIM_OBJ_X_COORD + add hl, bc + ld a, [hl] + cp $c0 + jr z, .done + inc [hl] + ret + +.done + ld a, $1 + ld [wSurfingMinigameIntroAnimationFinished], a + call MaskCurrentAnimatedObjectStruct + ret + +SurfingMinigame_MoveClouds: + ld a, [wc635] + ld e, a + ld d, $0 + ld a, [wSurfingMinigamePikachuSpeed] + ld l, a + ld a, [wSurfingMinigamePikachuSpeed + 1] + ld h, a + add hl, de + ld a, l + ld [wc635], a + ld d, h + ld hl, wOAMBuffer + 5 * 4 + 1 + ld e, $9 +.loop + ld a, [hl] + add d + ld [hli], a + inc hl + inc hl + inc hl + dec e + jr nz, .loop + ret + +SurfingMinigame_ReadBGMapBuffer: + ld a, [wSurfingMinigameBGMapReadBuffer] ; ??? + ldh a, [hSCX] + add $48 + ld e, a + srl e + srl e + srl e + ld d, $0 + ld hl, vBGMap0 + add hl, de + ld a, [wSurfingMinigamePikachuObjectHeight] + srl a + srl a + srl a + ld c, a +.loop + ld a, c + and a + jr z, .copy + dec c + ld de, $20 + add hl, de + ld a, h + and $3 + or $98 + ld h, a + jr .loop + +.copy + ld de, wSurfingMinigameBGMapReadBuffer + ld a, e + ldh [hVBlankCopyDest], a + ld a, d + ldh [hVBlankCopyDest + 1], a + ld a, l + ldh [hVBlankCopySource], a + ld a, h + ldh [hVBlankCopySource + 1], a + ld a, 16 / $10 + ldh [hVBlankCopySize], a + ret + +SurfingMinigame_SetPikachuHeight: + ldh a, [hSCX] + and $8 + jr nz, .asm_f88b9 + ld hl, wSurfingMinigameWaveHeight + 7 + jr .asm_f88bc + +.asm_f88b9 + ld hl, wSurfingMinigameWaveHeight + 8 +.asm_f88bc + ld a, [wSurfingMinigameBGMapReadBuffer] + cp $6 + jr z, .asm_f88d0 + cp $14 + jr z, .asm_f88d0 + cp $7 + jr z, .asm_f88db + ld a, [hl] + ld [wSurfingMinigamePikachuObjectHeight], a + ret + +.asm_f88d0 + ldh a, [hSCX] + and $7 + ld e, a + ld a, [hl] + sub e + ld [wSurfingMinigamePikachuObjectHeight], a + ret + +.asm_f88db + ldh a, [hSCX] + and $7 + add [hl] + ld [wSurfingMinigamePikachuObjectHeight], a + ret + +SurfingMinigame_Deduct1HP: + ld hl, wSurfingMinigamePikachuHP + ld e, $99 + call .BCD_Deduct + ret nc + inc hl + ld e, $99 +.BCD_Deduct: + ld a, [hl] + and a + jr z, .roll_over + sub $1 + daa + ld [hl], a + and a + ret + +.roll_over + ld [hl], e + scf + ret + +SurfingMinigame_DrawHP: + ld de, wSurfingMinigamePikachuHP + 1 + ld hl, wOAMBuffer + 0 * 4 + 2 + ld a, [de] + call .PlaceBCDNumber + ld hl, wOAMBuffer + 2 * 4 + 2 + ld a, [de] +.PlaceBCDNumber: + ld c, a + swap a + and $f + add $d0 + ld [hli], a + inc hl + inc hl + inc hl + ld a, c + and $f + add $d0 + ld [hl], a + dec de + ret + +SurfingMinigame_DrawResultsScreen: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call FillMemory + ld hl, .BeachTilemap + decoord 0, 6 + ld bc, .BeachTilemapEnd - .BeachTilemap + call CopyData + call .PlaceTextbox + ld hl, wOAMBuffer + 5 * 4 + 1 + ld bc, 9 * 4 + xor a + call FillMemory + ld a, $1 + ldh [hAutoBGTransferEnabled], a + ret + +.BeachTilemap: +INCBIN "gfx/surfing_pikachu/unknown_f8946.map" +.BeachTilemapEnd: + +.PlaceTextbox: + hlcoord 1, 1 + lb de, $3b, $3c + ld a, $40 + call .place_row + hlcoord 1, 2 + lb de, $3f, $3f + ld a, $ff + call .place_row + hlcoord 1, 3 + lb de, $3f, $3f + ld a, $ff + call .place_row + hlcoord 1, 4 + lb de, $3f, $3f + ld a, $ff + call .place_row + hlcoord 1, 5 + lb de, $3f, $3f + ld a, $ff + call .place_row + hlcoord 1, 6 + lb de, $3f, $3f + ld a, $ff + call .place_row + hlcoord 1, 7 + lb de, $3f, $3f + ld a, $ff + call .place_row + hlcoord 1, 8 + lb de, $3f, $3f + ld a, $ff + call .place_row + hlcoord 1, 9 + lb de, $3d, $3e + ld a, $40 + call .place_row + ret + +.place_row: + ld [hl], d + inc hl + ld c, $10 +.loop + ld [hli], a + dec c + jr nz, .loop + ld [hl], e + ret + +SurfingMinigame_PrintTextHiScore: + ld hl, .Hi_Score + decoord 6, 8 + ld bc, $9 + call CopyData + ret + +.Hi_Score: + db $20,$2e,$2f,$30,$31,$2c,$32,$23,$33 ; Hi-Score!! + +SurfingMinigame_WriteHPLeft: + ld hl, .HP_Left + decoord 2, 2 + ld bc, $7 + call CopyData + call SurfingMinigame_BCDPrintHPLeft + ret + +.HP_Left: + db $20,$21,$ff,$22,$23,$24,$25 ; HP Left + +SurfingMinigame_AddRemainingHPToTotal: + ld c, 99 +.loop + push bc + ld hl, wSurfingMinigamePikachuHP + ld a, [hli] + or [hl] + and a + jr z, .dead + call SurfingMinigame_Deduct1HP + ld e, $1 + call SurfingMinigame_AddPointsToTotal + pop bc + dec c + jr nz, .loop + ld a, SFX_PRESS_AB + call PlaySound + and a + ret + +.dead + pop bc + scf + ret + +SurfingMinigame_BCDPrintHPLeft: + hlcoord 10, 2 + ld de, wSurfingMinigamePikachuHP + 1 + ld a, [de] + call SurfingPikachu_PlaceBCDNumber + inc hl + ld a, [de] + call SurfingPikachu_PlaceBCDNumber + inc hl + inc hl + ld [hl], $21 ; P + inc hl + ld [hl], $25 ; t + inc hl + ld [hl], $26 ; s + ret + +SurfingMinigame_WriteRadness: + ld hl, .Radness + decoord 2, 4 + ld bc, $7 + call CopyData + call SurfingMinigame_BCDPrintRadness + ret + +.Radness: + db $27,$28,$29,$2a,$23,$26,$26 ; Radness + +SurfingMinigame_AddRadnessToTotal: + ld c, 99 +.loop + push bc + ld hl, wSurfingMinigameRadnessScore + ld a, [hli] + ld e, a + or [hl] + jr z, .done + ld d, [hl] + ld a, e + sub $1 + daa + ld e, a + ld a, d + sbc $0 + daa + ld [hld], a + ld [hl], e + ld e, $1 + call SurfingMinigame_AddPointsToTotal + pop bc + dec c + jr nz, .loop + ld a, SFX_PRESS_AB + call PlaySound + and a + ret + +.done + pop bc + scf + ret + +SurfingMinigame_BCDPrintRadness: + ld a, [wSurfingMinigameRadnessScore + 1] + hlcoord 10, 4 + call SurfingPikachu_PlaceBCDNumber + ld a, [wSurfingMinigameRadnessScore] + hlcoord 12, 4 + call SurfingPikachu_PlaceBCDNumber + inc hl + inc hl + ld [hl], $21 ; P + inc hl + ld [hl], $25 ; t + inc hl + ld [hl], $26 ; s + ret + +SurfingMinigame_AddPointsToTotal: + ld a, [wSurfingMinigameTotalScore] + add e + daa + ld [wSurfingMinigameTotalScore], a + ld a, [wSurfingMinigameTotalScore + 1] + adc $0 + daa + ld [wSurfingMinigameTotalScore + 1], a + ret nc + ld a, $99 + ld [wSurfingMinigameTotalScore], a + ld [wSurfingMinigameTotalScore + 1], a + ret + +SurfingMinigame_BCDPrintTotalScore: + ld a, [wSurfingMinigameTotalScore + 1] + hlcoord 10, 6 + call SurfingPikachu_PlaceBCDNumber + ld a, [wSurfingMinigameTotalScore] + hlcoord 12, 6 + call SurfingPikachu_PlaceBCDNumber + inc hl + inc hl + ld [hl], $21 ; P + inc hl + ld [hl], $25 ; t + inc hl + ld [hl], $26 ; s + ret + +SurfingMinigame_WriteTotal: + ld hl, .Total + decoord 2, 6 + ld bc, $5 + call CopyData + call SurfingMinigame_BCDPrintRadness + call SurfingMinigame_BCDPrintTotalScore + ret + +.Total: + db $2b,$2c,$25,$28,$2d ; Total + +DidPlayerGetAHighScore: + ld hl, wSurfingMinigameHiScore + 1 + ld a, [wSurfingMinigameTotalScore + 1] + cp [hl] + jr c, .not_high_score + jr nz, .high_score + dec hl + ld a, [wSurfingMinigameTotalScore] + cp [hl] + jr c, .not_high_score + jr nz, .high_score +.not_high_score + call WaitForSoundToFinish + ldpikacry e, PikachuCry28 + call SurfingMinigame_PlayPikaCryIfSurfingPikaInParty + and a + ret + +.high_score + ld a, [wSurfingMinigameTotalScore] + ld [wSurfingMinigameHiScore], a + ld a, [wSurfingMinigameTotalScore + 1] + ld [wSurfingMinigameHiScore + 1], a + call WaitForSoundToFinish + ldpikacry e, PikachuCry34 + call SurfingMinigame_PlayPikaCryIfSurfingPikaInParty + ld a, SFX_GET_ITEM2_4_2 + call PlaySound + scf + ret + +SurfingMinigame_PlayPikaCryIfSurfingPikaInParty: + push de + callfar IsSurfingPikachuInThePlayersParty + pop de + ret nc + callfar PlayPikachuSoundClip + ret + +SurfingMinigame_IncreaseRadnessMeter: + ld a, [wSurfingMinigameRadnessMeter] + inc a + cp $4 + jr c, .cap + ld a, $3 +.cap + ld [wSurfingMinigameRadnessMeter], a + ret + +SurfingMinigame_CalculateAndAddRadnessFromStunt: + ; Compute the amount of radness points from the + ; current trick based on the number of + ; consecutive flips + ; Single flip: +0050 + ; 2 of the same flip: +0150 + ; 3 or more of the same flip: +0350 + ; 2 different flips: +0180 + ; 3 or more different flips: +0500 + ld a, [wSurfingMinigameRadnessMeter] + and a + ret z + ld a, [wSurfingMinigameTrickFlags] + and $3 + cp $3 ; did a combination of front and back flips + jr z, .mixed_chain + ld a, [wSurfingMinigameRadnessMeter] + ld d, a + ld e, $1 + ld a, $0 +.get_amount_of_radness + add e + sla e + dec d + jr nz, .get_amount_of_radness +.add_radness_50_at_a_time + push af + ld e, $50 + call SurfingMinigame_AddRadness + pop af + dec a + jr nz, .add_radness_50_at_a_time + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld a, [hl] + sub $10 + ld d, a + ld hl, ANIM_OBJ_X_COORD + add hl, bc + ld e, [hl] + ld a, [wSurfingMinigameRadnessMeter] + add $3 + push bc + call SpawnAnimatedObject + pop bc + ret + +.mixed_chain + ld a, [wSurfingMinigameRadnessMeter] + cp $3 + jr c, .add_180_radness_points + ld a, 10 +.add_500_radness_50_at_a_time + push af + ld e, $50 + call SurfingMinigame_AddRadness + pop af + dec a + jr nz, .add_500_radness_50_at_a_time + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld a, [hl] + sub $10 + ld d, a + ld hl, ANIM_OBJ_X_COORD + add hl, bc + ld e, [hl] + ld a, $9 + push bc + call SpawnAnimatedObject + pop bc + ret + +.add_180_radness_points + ld e, $50 + call SurfingMinigame_AddRadness + ld e, $50 + call SurfingMinigame_AddRadness + ld e, $50 + call SurfingMinigame_AddRadness + ld e, $30 + call SurfingMinigame_AddRadness + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld a, [hl] + sub $10 + ld d, a + ld hl, ANIM_OBJ_X_COORD + add hl, bc + ld e, [hl] + ld a, $8 + push bc + call SpawnAnimatedObject + pop bc + ret + +SurfingMinigame_AddRadness: + ld a, [wSurfingMinigameRadnessScore] + add e + daa + ld [wSurfingMinigameRadnessScore], a + ld a, [wSurfingMinigameRadnessScore + 1] + adc $0 + daa + ld [wSurfingMinigameRadnessScore + 1], a + ret nc + ld a, $99 + ld [wSurfingMinigameRadnessScore], a + ld [wSurfingMinigameRadnessScore + 1], a + ret + +Func_f8c97: + ld a, $a0 + ld [wSurfingMinigameXOffset], a + ldh a, [hSCX] + ld h, a + ld a, [wSurfingMinigameSCX] + ld l, a + ld de, $900 + add hl, de + ld a, l + ld [wSurfingMinigameSCX], a + ld a, h + ldh [hSCX], a + jr SurfingMinigame_GenerateBGMap + +SurfingMinigame_ScrollAndGenerateBGMap: + ld a, $a0 + ld [wSurfingMinigameXOffset], a + ldh a, [hSCX] + ld h, a + ld a, [wSurfingMinigameSCX] + ld l, a + ld de, $180 + add hl, de + ld a, l + ld [wSurfingMinigameSCX], a + ld a, h + ldh [hSCX], a +SurfingMinigame_GenerateBGMap: + ld hl, wSurfingMinigameSCX + 1 + ldh a, [hSCX] + cp [hl] + ret z + ld [hl], a + and $f0 + ld hl, wSurfingMinigameSCX + 2 + cp [hl] + ret z + ld [hl], a + call SurfingMinigame_GetWaveDataPointers + ; b and c contain the height of the next wave to appear + ; on screen, in number of pixels from the top of the screen + ld a, b + ld [wSurfingMinigameWaveHeightBuffer], a + ld a, c + ld [wSurfingMinigameWaveHeightBuffer + 1], a + push de + ld hl, wSurfingMinigameWaveHeight + ld de, wSurfingMinigameWaveHeight + 2 + ld c, SCREEN_WIDTH - 2 +.copy_loop + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .copy_loop + ld a, [wSurfingMinigameWaveHeightBuffer] + ld [hli], a + ld a, [wSurfingMinigameWaveHeightBuffer + 1] + ld [hl], a + pop de + ld hl, wRedrawRowOrColumnSrcTiles + ld c, $8 +.loop + ld a, [de] + call .CopyRedrawSrcTiles + inc de + dec c + jr nz, .loop + ld a, [wSurfingMinigameXOffset] + ld e, a + ldh a, [hSCX] + add e + and $f0 + srl a + srl a + srl a + ld e, a + ld d, $0 + ld hl, vBGMap0 + add hl, de + ld a, l + ldh [hRedrawRowOrColumnDest], a + ld a, h + ldh [hRedrawRowOrColumnDest + 1], a + ld a, $1 + ldh [hRedrawRowOrColumnMode], a + ret + +.CopyRedrawSrcTiles: + push de + push hl + ld l, a + ld h, $0 + ld de, Unkn_f96e5 + add hl, hl + add hl, hl + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop de + ret + +SurfingMinigame_GetWaveDataPointers: + ld a, [wSurfingMinigameWaveFunctionNumber] + ld e, a + ld d, $0 + ld hl, Jumptable_f8d53 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +Jumptable_f8d53: + dw SurfingMinigameWaveFunction_NoWave ; 00 + + dw Func_f8f28 ; 01 + dw Func_f8f31 ; 02 + dw Func_f8f3a ; 03 + dw Func_f8f43 ; 04 + dw Func_f8e7d ; 05 + dw Func_f8f4c ; 06 + dw Func_f8f55 ; 07 + dw Func_f8f5e ; 08 + dw Func_f8e7d ; 09 + dw Func_f8e7d ; 0a + dw Func_f8e7d ; 0b + dw Func_f8e7d ; 0c + dw Func_f8f94 ; 0d + + dw Func_f8ec5 ; 0e + dw Func_f8ece ; 0f + dw Func_f8ed7 ; 10 + dw Func_f8ee0 ; 11 + dw Func_f8ee9 ; 12 + dw Func_f8ef2 ; 13 + dw Func_f8e7d ; 14 + dw Func_f8e7d ; 15 + dw Func_f8e7d ; 16 + dw Func_f8e7d ; 17 + dw Func_f8e7d ; 18 + dw Func_f8f94 ; 19 + + dw Func_f8efb ; 1a + dw Func_f8f04 ; 1b + dw Func_f8f0d ; 1c + dw Func_f8f16 ; 1d + dw Func_f8f1f ; 1e + dw Func_f8efb ; 1f + dw Func_f8f04 ; 20 + dw Func_f8f0d ; 21 + dw Func_f8f16 ; 22 + dw Func_f8f1f ; 23 + dw Func_f8e7d ; 24 + dw Func_f8e7d ; 25 + dw Func_f8e7d ; 26 + dw Func_f8e7d ; 27 + dw Func_f8f94 ; 28 + + dw Func_f8f28 ; 29 + dw Func_f8f31 ; 2a + dw Func_f8f3a ; 2b + dw Func_f8f43 ; 2c + dw Func_f8e7d ; 2d + dw Func_f8e7d ; 2e + dw Func_f8e7d ; 2f + dw Func_f8e7d ; 30 + dw Func_f8f94 ; 31 + + dw Func_f8f4c ; 32 + dw Func_f8f55 ; 33 + dw Func_f8f5e ; 34 + dw Func_f8f4c ; 35 + dw Func_f8f55 ; 36 + dw Func_f8f5e ; 37 + dw Func_f8f4c ; 38 + dw Func_f8f55 ; 39 + dw Func_f8f5e ; 3a + dw Func_f8e7d ; 3b + dw Func_f8e7d ; 3c + dw Func_f8e7d ; 3d + dw Func_f8e7d ; 3e + dw Func_f8f94 ; 3f + + dw Func_f8f67 ; 40 + dw Func_f8f70 ; 41 + dw Func_f8efb ; 42 + dw Func_f8f04 ; 43 + dw Func_f8f0d ; 44 + dw Func_f8f16 ; 45 + dw Func_f8f1f ; 46 + dw Func_f8f67 ; 47 + dw Func_f8f70 ; 48 + dw Func_f8e7d ; 49 + dw Func_f8e7d ; 4a + dw Func_f8e7d ; 4b + dw Func_f8f94 ; 4c + + dw Func_f8ec5 ; 4d + dw Func_f8ece ; 4e + dw Func_f8ed7 ; 4f + dw Func_f8ee0 ; 50 + dw Func_f8ee9 ; 51 + dw Func_f8ef2 ; 52 + dw Func_f8e7d ; 53 + dw Func_f8f67 ; 54 + dw Func_f8f70 ; 55 + dw Func_f8f67 ; 56 + dw Func_f8f70 ; 57 + dw Func_f8e7d ; 58 + dw Func_f8e7d ; 59 + dw Func_f8e7d ; 5a + dw Func_f8f94 ; 5b + + dw Func_f8efb ; 5c + dw Func_f8f04 ; 5d + dw Func_f8f0d ; 5e + dw Func_f8f16 ; 5f + dw Func_f8f1f ; 60 + dw Func_f8f28 ; 61 + dw Func_f8f31 ; 62 + dw Func_f8f3a ; 63 + dw Func_f8f43 ; 64 + dw Func_f8e7d ; 65 + dw Func_f8e7d ; 66 + dw Func_f8e7d ; 67 + dw Func_f8e7d ; 68 + dw Func_f8f94 ; 69 + + dw Func_f8e86 ; 6a + dw Func_f8e8f ; 6b + dw Func_f8e98 ; 6c + dw Func_f8ea1 ; 6d + dw Func_f8eaa ; 6e + dw Func_f8eb3 ; 6f + dw Func_f8ebc ; 70 + dw Func_f8f9d ; 71 + + dw Func_f8e7d ; 72 + dw Func_f8f79 ; 73 + dw Func_f8f82 ; 74 + dw Func_f8f82 ; 75 + dw Func_f8f82 ; 76 + dw Func_f8f82 ; 77 + dw Func_f8f82 ; 78 + dw Func_f8f82 ; 79 + dw Func_f8f82 ; 7a + dw Func_f8f8b ; 7b + +SurfingMinigameWaveFunction_NoWave: + ld a, [wc5e5] + cp $16 + jr c, .check_param + jr z, .big_kahuna + jr nc, .got_wave +.big_kahuna + ld a, $6a + jr .got_next_fn + +.check_param + ld a, [wc5d5] + and a + jr z, .got_wave + dec a + and $7 + ld e, a + ld d, $0 + ld hl, Unkn_f8e75 + add hl, de + ld a, [hl] +.got_next_fn + ld [wSurfingMinigameWaveFunctionNumber], a +.got_wave + lb bc, $74, $74 + ld de, Unkn_f973d + ret + +Unkn_f8e75: + db $01,$0e,$1a,$29,$32,$40,$4d,$5c + +Func_f8e7d: + lb bc, $74, $74 + ld de, Unkn_f973d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8e86: + lb bc, $74, $6c + ld de, Unkn_f9745 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8e8f: + lb bc, $64, $5c + ld de, Unkn_f974d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8e98: + lb bc, $54, $4c + ld de, Unkn_f9755 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8ea1: + lb bc, $44, $44 + ld de, Unkn_f975d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8eaa: + lb bc, $44, $4c + ld de, Unkn_f9765 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8eb3: + lb bc, $54, $5c + ld de, Unkn_f976d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8ebc: + lb bc, $64, $6c + ld de, Unkn_f9775 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8ec5: + lb bc, $74, $6c + ld de, Unkn_f977d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8ece: + lb bc, $64, $5c + ld de, Unkn_f9785 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8ed7: + lb bc, $54, $4c + ld de, Unkn_f978d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8ee0: + lb bc, $4c, $4c + ld de, Unkn_f9795 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8ee9: + lb bc, $54, $5c + ld de, Unkn_f979d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8ef2: + lb bc, $64, $6c + ld de, Unkn_f97a5 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8efb: + lb bc, $74, $6c + ld de, Unkn_f97ad + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f04: + lb bc, $64, $5c + ld de, Unkn_f97b5 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f0d: + lb bc, $54, $54 + ld de, Unkn_f97bd + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f16: + lb bc, $54, $5c + ld de, Unkn_f97c5 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f1f: + lb bc, $64, $6c + ld de, Unkn_f97cd + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f28: + lb bc, $74, $6c + ld de, Unkn_f97d5 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f31: + lb bc, $64, $5c + ld de, Unkn_f97dd + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f3a: + lb bc, $5c, $5c + ld de, Unkn_f97e5 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f43: + lb bc, $64, $6c + ld de, Unkn_f97ed + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f4c: + lb bc, $74, $6c + ld de, Unkn_f97f5 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f55: + lb bc, $64, $64 + ld de, Unkn_f97fd + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f5e: + lb bc, $64, $6c + ld de, Unkn_f9805 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f67: + lb bc, $74, $6c + ld de, Unkn_f980d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f70: + lb bc, $6c, $6c + ld de, Unkn_f9815 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f79: + lb bc, $74, $74 + ld de, Unkn_f981d + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f82: + lb bc, $74, $74 + ld de, Unkn_f9825 + jp SurfingMinigameWaveFunction_GoToNextWaveFunction + +Func_f8f8b: + lb bc, $74, $74 + ld de, Unkn_f9825 + jp SurfingMinigameWaveFunction_ResetWaveFunction + +Func_f8f94: + lb bc, $74, $74 + ld de, Unkn_f973d + jp SurfingMinigameWaveFunction_ResetWaveFunction + +Func_f8f9d: + lb bc, $74, $74 + ld de, Unkn_f973d + ret + +Func_f8fa4: ; unused + inc a + ld [wSurfingMinigameWaveFunctionNumber], a + ret + +SurfingMinigameWaveFunction_GoToNextWaveFunction: + ld hl, wSurfingMinigameWaveFunctionNumber + inc [hl] + ret + +SurfingMinigameWaveFunction_ResetWaveFunction: + xor a + ld [wSurfingMinigameWaveFunctionNumber], a + ret + +SurfingPikachuMinigameIntro: + call SurfingPikachu_ClearTileMap + call ClearSprites + call DisableLCD + xor a + ldh [hAutoBGTransferEnabled], a + call ClearObjectAnimationBuffers + ld hl, SurfingPikachu1Graphics3 + ld de, $8800 + ld bc, $900 + ld a, BANK(SurfingPikachu1Graphics3) + call FarCopyData + ld a, LOW(SurfingPikachuSpawnStateDataPointer) + ld [wAnimatedObjectSpawnStateDataPointer], a + ld a, HIGH(SurfingPikachuSpawnStateDataPointer) + ld [wAnimatedObjectSpawnStateDataPointer + 1], a + ld a, LOW(SurfingPikachuObjectJumptable) + ld [wAnimatedObjectJumptablePointer], a + ld a, HIGH(SurfingPikachuObjectJumptable) + ld [wAnimatedObjectJumptablePointer + 1], a + ld a, LOW(SurfingPikachuOAMData) + ld [wAnimatedObjectOAMDataPointer], a + ld a, HIGH(SurfingPikachuOAMData) + ld [wAnimatedObjectOAMDataPointer + 1], a + ld a, LOW(SurfingPikachuFrames) + ld [wAnimatedObjectFramesDataPointer], a + ld a, HIGH(SurfingPikachuFrames) + ld [wAnimatedObjectFramesDataPointer + 1], a + ld a, $c + lb de, $74, $58 + call SpawnAnimatedObject + call DrawSurfingPikachuMinigameIntroBackground + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $90 + ldh [hWY], a + ld b, $f + call RunPaletteCommand + ld a, $e3 + ldh [rLCDC], a + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call DelayFrame + call DelayFrame + call DelayFrame + call SurfingPikachuMinigame_SetBGPals + ld a, $e4 + ldh [rOBP0], a + ld a, $e0 + ldh [rOBP1], a + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + call DelayFrame + ld a, MUSIC_SURFING_PIKACHU + ld c, BANK(Music_SurfingPikachu) + call PlayMusic + xor a + ld [wSurfingMinigameIntroAnimationFinished], a +.loop + ld a, [wSurfingMinigameIntroAnimationFinished] + and a + ret nz + ld a, $0 + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations + call DelayFrame + jr .loop + +DrawSurfingPikachuMinigameIntroBackground: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $ff + call FillMemory + ld hl, Tilemap_f90bc + decoord 0, 6 + ld bc, 12 * SCREEN_WIDTH + call CopyData + ld de, Tilemap_f91c8 + hlcoord 4, 0 + lb bc, 6, 12 + call .CopyBox + hlcoord 3, 7 + lb bc, 3, 15 + call .FillBoxWithFF + ld hl, Tilemap_f91ac + decoord 3, 7 + ld bc, 15 + call CopyData + ld hl, Tilemap_f91bb + decoord 4, 9 + ld bc, 13 + call CopyData + ret + +.CopyBox: +.copy_row + push bc + push hl +.copy_col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .copy_col + ld bc, SCREEN_WIDTH + pop hl + add hl, bc + pop bc + dec b + jr nz, .copy_row + ret + +.FillBoxWithFF: +.fill_row + push bc + push hl +.fill_col + ld [hl], $ff + inc hl + dec c + jr nz, .fill_col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .fill_row + ret + +Tilemap_f90bc: INCBIN "gfx/surfing_pikachu/unknown_f90bc.map" +Tilemap_f91ac: INCBIN "gfx/surfing_pikachu/unknown_f91ac.map" +Tilemap_f91bb: INCBIN "gfx/surfing_pikachu/unknown_f91bb.map" +Tilemap_f91c8: INCBIN "gfx/surfing_pikachu/unknown_f91c8.map" + +SurfingMinigame_UpdateLYOverrides: + ld hl, wLYOverrides + $10 + ld de, wLYOverrides + $11 + ld c, $80 + ld a, [hl] + push af +.loop + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .loop + pop af + ld [hl], a + ret + +SurfingMinigame_InitScanlineOverrides: + ld hl, wLYOverrides + ld bc, wLYOverridesEnd - wLYOverrides + ld de, $0 +.loop + ld a, e + and $1f + ld e, a + push hl + ld hl, SurfingMinigame_LYOverridesInitialSineWave + add hl, de + ld a, [hl] + pop hl + ld [hli], a + inc e + dec bc + ld a, c + or b + jr nz, .loop + ret + +SurfingPikachu_GetJoypad_3FrameBuffer: + call Joypad + ldh a, [hFrameCounter] + and a + jr nz, .delayed + ldh a, [hJoyHeld] + ldh [hJoy5], a + ld a, $2 + ldh [hFrameCounter], a + ret + +.delayed + xor a + ldh [hJoy5], a + ret + +SurfingPikachuMinigame_BlankPals: + xor a + ldh [rBGP], a + ldh [rOBP0], a + ldh [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +SurfingPikachuMinigame_NormalPals: + ld a, $e4 + ldh [rBGP], a + ldh [rOBP0], a + ld a, $e0 + ldh [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +SurfingPikachu_ClearTileMap: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call FillMemory + ret + +Func_f9284: + xor a + ld [wc5ed], a + ld [wc5ee], a + ret + +SurfingMinigame_UpdatePikachuHeight: + ld a, [wc5ed] + and a + jr nz, .positive + ld a, [wc5ec] + ld d, a + ld a, [wc5ee] + or d + jr z, .done + ld a, [wc5ee] + ld e, a + ld hl, -$80 + add hl, de + ld a, l + ld [wc5ee], a + ld a, h + ld [wc5ec], a + + ; -(4 * a ** 2) + ld e, a + ld d, $0 + call SurfingMinigame_NTimesDE + ld e, l + ld d, h + ld a, $4 + call SurfingMinigame_NTimesDE + ld a, l + xor $ff + inc a + ld l, a + ld a, h + xor $ff + ld h, a + + push hl + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld d, [hl] + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld e, [hl] + pop hl + + add hl, de + ld e, l + ld d, h + + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld [hl], d + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld [hl], e + and a + ret + +.done + ld a, $1 + ld [wc5ed], a + and a + ret + +.positive + ld a, [wSurfingMinigamePikachuObjectHeight] + ld e, a + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld a, [hl] + cp $90 + jr nc, .okay + cp e + jr nc, .reset +.okay + ld a, [wc5ec] + ld d, a + ld a, [wc5ee] + ld e, a + ld hl, $80 + add hl, de + ld a, l + ld [wc5ee], a + ld a, h + ld [wc5ec], a + + ; 4 * a ** 2 + ld e, a + ld d, $0 + call SurfingMinigame_NTimesDE + ld e, l + ld d, h + ld a, $4 + call SurfingMinigame_NTimesDE + + push hl + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld d, [hl] + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld e, [hl] + pop hl + + add hl, de + ld e, l + ld d, h + + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld [hl], d + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld [hl], e + and a + ret + +.reset + ld hl, ANIM_OBJ_Y_COORD + add hl, bc + ld a, [wSurfingMinigamePikachuObjectHeight] + ld [hl], a + ld hl, ANIM_OBJ_FIELD_C + add hl, bc + ld [hl], $0 + scf + ret + +SurfingMinigame_NTimesDE: + ld hl, $0 +.loop + srl a + jr nc, .no_add + add hl, de +.no_add + sla e + rl d + and a + jr nz, .loop + ret + +SurfingPikachu_PlaceBCDNumber: + ld c, a + swap a + and $f + add $d0 + ld [hli], a + ld a, c + and $f + add $d0 + ld [hl], a + dec de + ret + +SurfingPikachu_Cosine: ; cosine + add $10 +SurfingPikachu_Sine: ; sine + and $3f + cp $20 + jr nc, .positive + call .GetSine + ld a, h + ret + +.positive + and $1f + call .GetSine + ld a, h + xor $ff + inc a + ret + +.GetSine: + ld e, a + ld a, d + ld d, $0 + ld hl, .SineWave + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $0 +.loop + srl a + jr nc, .no_add + add hl, de +.no_add + sla e + rl d + and a + jr nz, .loop + ret + +.SineWave: + sine_wave $100 + +SurfingPikachuSpawnStateDataPointer: + db $00, $00, $00 ; 0 + db $04, $01, $00 ; 1 + db $11, $02, $00 ; 2 + db $12, $02, $00 ; 3 + db $15, $00, $00 ; 4 + db $16, $00, $00 ; 5 + db $17, $00, $00 ; 6 + db $18, $00, $00 ; 7 + db $19, $00, $00 ; 8 + db $1a, $00, $00 ; 9 + db $14, $00, $00 ; a + db $13, $03, $00 ; b + db $1b, $04, $00 ; c + +SurfingPikachuObjectJumptable: + dw SurfingMinigameAnimatedObjectFn_nop ; 0 + dw SurfingMinigameAnimatedObjectFn_Pikachu ; 1 + dw Func_f87fb ; 2 + dw SurfingMinigameAnimatedObjectFn_FlippingPika ; 3 + dw SurfingMinigameAnimatedObjectFn_IntroAnimationPikachu ; 4 + +SurfingMinigameAnimatedObjectFn_nop: + ret + +INCLUDE "data/sprite_anims/surfing_pikachu_frames.asm" +INCLUDE "data/sprite_anims/surfing_pikachu_oam.asm" + +SurfingMinigame_LYOverridesInitialSineWave: +; a sine wave with amplitude 2 + db 0, 0, 0, 1, 1, 1, 1, 2 + db 2, 2, 1, 1, 1, 1, 0, 0 + db 0, 0, 0, -1, -1, -1, -1, -2 + db -2, -2, -1, -1, -1, -1, 0, 0 + +Unkn_f96e5: + db $00, $00, $00, $00 ; 00 + db $0b, $0b, $0b, $0b ; 01 + db $0b, $02, $02, $06 ; 02 + db $03, $0b, $07, $03 ; 03 + db $06, $06, $06, $06 ; 04 + db $07, $07, $07, $07 ; 05 + db $06, $04, $04, $08 ; 06 + db $05, $07, $08, $05 ; 07 + db $0b, $0b, $11, $12 ; 08 + db $0b, $0b, $13, $03 ; 09 + db $14, $12, $04, $08 ; 0a + db $13, $07, $08, $05 ; 0b + db $06, $14, $06, $14 ; 0c + db $13, $07, $13, $07 ; 0d + db $08, $08, $08, $08 ; 0e + db $14, $12, $14, $12 ; 0f + db $0b, $11, $02, $14 ; 10 + db $06, $14, $06, $14 ; 11 + db $0c, $0c, $0d, $0d ; 12 + db $0d, $0d, $0d, $0d ; 13 + db $0e, $0f, $10, $0b ; 14 + db $12, $13, $12, $13 ; 15 + +Unkn_f973d: + db $00, $00, $00, $01, $01, $01, $01, $01 +Unkn_f9745: + db $00, $00, $00, $01, $01, $02, $04, $06 +Unkn_f974d: + db $00, $00, $00, $01, $02, $04, $06, $0e +Unkn_f9755: + db $00, $00, $00, $10, $11, $06, $0e, $0e +Unkn_f975d: + db $00, $00, $00, $15, $15, $0e, $0e, $0e +Unkn_f9765: + db $00, $00, $00, $03, $05, $07, $0e, $0e +Unkn_f976d: + db $00, $00, $00, $01, $03, $05, $07, $0e +Unkn_f9775: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f977d: + db $00, $00, $00, $01, $01, $02, $04, $06 +Unkn_f9785: + db $00, $00, $00, $01, $02, $04, $06, $0e +Unkn_f978d: + db $00, $00, $00, $08, $0f, $0a, $0e, $0e +Unkn_f9795: + db $00, $00, $00, $09, $0d, $0b, $0e, $0e +Unkn_f979d: + db $00, $00, $00, $01, $03, $05, $07, $0e +Unkn_f97a5: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f97ad: + db $00, $00, $00, $01, $01, $02, $04, $06 +Unkn_f97b5: + db $00, $00, $00, $01, $10, $11, $06, $0e +Unkn_f97bd: + db $00, $00, $00, $01, $15, $15, $0e, $0e +Unkn_f97c5: + db $00, $00, $00, $01, $03, $05, $07, $0e +Unkn_f97cd: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f97d5: + db $00, $00, $00, $01, $01, $02, $04, $06 +Unkn_f97dd: + db $00, $00, $00, $01, $08, $0f, $0a, $0e +Unkn_f97e5: + db $00, $00, $00, $01, $09, $0d, $0b, $0e +Unkn_f97ed: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f97f5: + db $00, $00, $00, $01, $01, $10, $11, $06 +Unkn_f97fd: + db $00, $00, $00, $01, $01, $15, $15, $0e +Unkn_f9805: + db $00, $00, $00, $01, $01, $03, $05, $07 +Unkn_f980d: + db $00, $00, $00, $01, $01, $08, $0f, $0a +Unkn_f9815: + db $00, $00, $00, $01, $01, $09, $0d, $0b +Unkn_f981d: + db $00, $00, $00, $14, $14, $14, $14, $14 +Unkn_f9825: + db $00, $00, $00, $12, $13, $13, $13, $13 diff --git a/engine/movie/intro_yellow.asm b/engine/movie/intro_yellow.asm new file mode 100755 index 00000000..673d207c --- /dev/null +++ b/engine/movie/intro_yellow.asm @@ -0,0 +1,1085 @@ +PlayIntroScene: + ldh a, [rIE] + push af + xor a + ldh [rIF], a + ld a, $f + ldh [rIE], a + ld a, $8 + ldh [rSTAT], a + call InitYellowIntroGFXAndMusic + call DelayFrame +.loop + ld a, [wYellowIntroCurrentScene] + bit 7, a + jr nz, .go_to_title_screen + call JoypadLowSensitivity + ldh a, [hJoyPressed] + and A_BUTTON | B_BUTTON | START + jr nz, .go_to_title_screen + call Func_f98fc + ld a, $0 + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations + ld a, [wYellowIntroCurrentScene] + cp $7 + call z, Func_f98a2 + cp $b + call z, Func_f98cb + call DelayFrame + jr .loop + +.go_to_title_screen + call YellowIntro_BlankPalettes + xor a + ldh [hLCDCPointer], a + call DelayFrame + xor a + ldh [rIF], a + pop af + ldh [rIE], a + ld a, $90 + ldh [hWY], a + call ClearObjectAnimationBuffers + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call Bank3E_FillMemory + call YellowIntro_BlankOAMBuffer + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ldh [hAutoBGTransferEnabled], a + ret + +Func_f98a2: + ld a, [wOAMBuffer + 8 * 4 + 3] + or $1 + ld [wOAMBuffer + 8 * 4 + 3], a + ld a, [wOAMBuffer + 14 * 4 + 3] + or $1 + ld [wOAMBuffer + 14 * 4 + 3], a + ld a, [wOAMBuffer + 16 * 4 + 3] + or $1 + ld [wOAMBuffer + 16 * 4 + 3], a + ld a, [wOAMBuffer + 18 * 4 + 3] + or $1 + ld [wOAMBuffer + 18 * 4 + 3], a + ld a, [wOAMBuffer + 19 * 4 + 3] + or $1 + ld [wOAMBuffer + 19 * 4 + 3], a + ret + +Func_f98cb: + ld a, [wOAMBuffer + 18 * 4 + 3] + or $1 + ld [wOAMBuffer + 18 * 4 + 3], a + ld a, [wOAMBuffer + 19 * 4 + 3] + or $1 + ld [wOAMBuffer + 19 * 4 + 3], a + ld a, [wOAMBuffer + 20 * 4 + 3] + or $1 + ld [wOAMBuffer + 20 * 4 + 3], a + ld a, [wOAMBuffer + 25 * 4 + 3] + or $1 + ld [wOAMBuffer + 25 * 4 + 3], a + ld a, [wOAMBuffer + 26 * 4 + 3] + or $1 + ld [wOAMBuffer + 26 * 4 + 3], a + ld a, [wOAMBuffer + 28 * 4 + 3] + or $1 + ld [wOAMBuffer + 28 * 4 + 3], a + ret + +Func_f98fc: + ld a, [wYellowIntroCurrentScene] + ld hl, Jumptable_f9906 + call Func_fa06e + jp hl + +Jumptable_f9906: + dw YellowIntroScene0 ; running pika 1 + dw YellowIntroScene1 ; wait last + dw YellowIntroScene2 ; pikachu kick + dw YellowIntroScene3 ; wait last + dw YellowIntroScene4 ; running pika 2 + dw YellowIntroScene5 ; wait last + dw YellowIntroScene6 ; surfing pika + dw YellowIntroScene7 ; wait last + dw YellowIntroScene8 ; running pika 3 + dw YellowIntroScene9 ; wait last + dw YellowIntroScene10 ; flying pika + dw YellowIntroScene11 ; wait last + dw YellowIntroScene12 ; pika close up + dw YellowIntroScene13 ; wait last + dw YellowIntroScene14 ; pika thunderbolt + dw YellowIntroScene15 ; wait last + dw YellowIntroScene16 ; fade to white + dw YellowIntroScene17 ; wait and quit + +YellowIntro_NextScene: + ld hl, wYellowIntroCurrentScene + inc [hl] + ret + +YellowIntroScene0: + xor a + ldh [hLCDCPointer], a + lb de, $58, $58 + ld a, $1 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $90 + ldh [hWY], a + ld a, $e4 + ldh [rBGP], a + ldh [rOBP0], a + ld a, $c4 + ldh [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ld a, 130 + ld [wYellowIntroSceneTimer], a + call YellowIntro_NextScene + ret + +YellowIntroScene1: + call YellowIntro_CheckFrameTimerDecrement + ret nc + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroScene2: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $8 + call UpdateMusicCTimes + xor a + ldh [hLCDCPointer], a + ld hl, vBGMap0 + ld bc, $400 + xor a + call Bank3E_FillMemory + call YellowIntroScene2_PlaceGraphic + lb de, $58, $b8 ; overloaded + ld a, $4 ; overloaded + call LoadYellowIntroFlyingSpeedBars + ld a, $1 + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +YellowIntroScene2_PlaceGraphic: + ld hl, $98d4 ; (20, 6) + ld de, $20 + ld b, $6 + ld a, $90 +.row + ld c, $6 + push af + push hl +.col + ld [hli], a + inc a + dec c + jr nz, .col + pop hl + add hl, de + pop af + add $10 + dec b + jr nz, .row + ldh a, [hGBC] + and a + jr z, .dmg_sgb + ; We can actually set palettes! + ld hl, $98d4 ; (20, 6) + ld de, $20 + ld b, $6 + ld a, $1 + ldh [rVBK], a +.attr_row + ld c, $6 + push hl +.attr_col + ld [hli], a + dec c + jr nz, .attr_col + pop hl + add hl, de + dec b + jr nz, .attr_row + xor a + ldh [rVBK], a +.dmg_sgb + ret + +LoadYellowIntroFlyingSpeedBars: + ld hl, YellowIntroFlyingSpeedBarData + ld a, $8 +.loop +; Spawn object $8 at indicated coordinates with indicated speeds + push af + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld a, [hli] + push hl + push af + ld a, $8 + call SpawnAnimatedObject + pop af + ld hl, $b + add hl, bc + ld [hl], a + pop hl + pop af + dec a + jr nz, .loop + ret + +YellowIntroFlyingSpeedBarData: + ; y, x, speed + db $d0, $20, $02 + db $f0, $30, $04 + db $d0, $40, $06 + db $c0, $50, $08 + db $e0, $60, $08 + db $c0, $70, $06 + db $e0, $80, $04 + db $f0, $90, $02 + +YellowIntroScene3: + call YellowIntro_CheckFrameTimerDecrement + jr c, .expired + ldh a, [hSCX] + cp $68 + ret z + add $4 + ldh [hSCX], a + ret + +.expired + call MaskAllAnimatedObjectStructs + call YellowIntro_NextScene + ret + +YellowIntroScene4: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + ldh a, [hGBC] + and a + jr z, .dmg_sgb + ; We can actually set palettes! + ld hl, $98d4 + ld de, $20 + ld b, $6 + ld a, $1 + ldh [rVBK], a + xor a +.attr_row + ld c, $6 + push hl +.attr_col + ld [hli], a + dec c + jr nz, .attr_col + pop hl + add hl, de + dec b + jr nz, .attr_row + xor a + ldh [rVBK], a +.dmg_sgb + xor a + ldh [hLCDCPointer], a + call Func_f9e5f + lb de, $58, $58 + ld a, $2 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + xor a + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +YellowIntroScene5: + call YellowIntro_CheckFrameTimerDecrement + ret nc + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroScene6: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + ld a, LOW(rSCY) + ldh [hLCDCPointer], a + call YellowIntro_Copy8BitSineWave + ld hl, vBGMap0 + ld bc, $60 + xor a + call Bank3E_FillMemory + ld hl, $9860 + ld c, $10 + ld a, $20 +.asm_f9a8b + ld [hli], a + inc a + ld [hli], a + dec a + dec c + jr nz, .asm_f9a8b + ld hl, $9880 + ld bc, $300 + ld a, $10 + call Bank3E_FillMemory + lb de, $40, $f8 + ld a, $5 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + ld a, $1 + call Func_f9e9a + call YellowIntro_SetTimerFor88Frames + call YellowIntro_NextScene + ret + +YellowIntroScene7: + call YellowIntro_CheckFrameTimerDecrement + jr c, .expired + ld hl, hSCX + inc [hl] + inc [hl] + ld hl, wLYOverridesBuffer + ld de, wLYOverridesBuffer + 1 + ld a, [hl] + push af + ld c, $ff +.shift_loop + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .shift_loop + pop af + ld [hl], a + call Request7TileTransferFromC810ToC710 + ret + +.expired + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroScene8: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + xor a + ldh [hLCDCPointer], a + call Func_f9e5f + lb de, $58, $58 + ld a, $3 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + xor a + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +YellowIntroScene9: + call YellowIntro_CheckFrameTimerDecrement + ret nc + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroScene10: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + xor a + ldh [hLCDCPointer], a + ld hl, vBGMap0 + ld bc, $400 + xor a + call Bank3E_FillMemory + ld hl, vBGMap0 + ld bc, $100 + ld a, $2 + call Bank3E_FillMemory + ld hl, $9900 + ld de, Unkn_f9b6e + lb bc, 6, 20 + call .FillBGMapBox + ld hl, $988c + ld de, Unkn_f9be6 + lb bc, 3, 4 + call .FillBGMapBox + ld hl, $98e3 + ld de, Unkn_f9bf2 + lb bc, 2, 2 + call .FillBGMapBox + lb de, $98, $58 + ld a, $6 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + ld a, $1 + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +.FillBGMapBox: +.fill_row + push bc + push hl +.fill_col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .fill_col + pop hl + ld bc, $20 + add hl, bc + pop bc + dec b + jr nz, .fill_row + ret + +Unkn_f9b6e: INCBIN "gfx/intro/unknown_f9b6e.map" +Unkn_f9be6: INCBIN "gfx/intro/unknown_f9be6.map" +Unkn_f9bf2: INCBIN "gfx/intro/unknown_f9bf2.map" + +YellowIntroScene11: + call YellowIntro_CheckFrameTimerDecrement + jr c, .expired + ld a, [wYellowIntroSceneTimer] + and $7 + ret nz + ld a, [wYellowIntroSceneTimer] + and $8 + sla a + sla a + sla a + ld e, a + ld d, $0 + ld hl, YellowIntroCloudGFX + add hl, de + ld a, l + ldh [hVBlankCopySource], a + ld a, h + ldh [hVBlankCopySource + 1], a + xor a + ldh [hVBlankCopyDest], a + ld a, $96 + ldh [hVBlankCopyDest + 1], a + ld a, $4 + ldh [hVBlankCopySize], a + ret + +.expired + call YellowIntro_MaskCurrentAnimatedObjectStruct + call YellowIntro_NextScene + ret + +YellowIntroCloudGFX: INCBIN "gfx/intro/clouds.2bpp" + +YellowIntroScene12: + call YellowIntro_BlankPalsDelay2AndDisableLCD + ld c, $5 + call UpdateMusicCTimes + xor a + ldh [hLCDCPointer], a + ld hl, vBGMap0 + ld bc, $80 + ld a, $1 + call Bank3E_FillMemory + ld hl, $9880 + ld bc, $140 + xor a + call Bank3E_FillMemory + ld hl, $99c0 + ld bc, $80 + ld a, $1 + call Bank3E_FillMemory + + ; paste 8x12 graphic into vBGMap0 at (5, 6) starting at tile 4, skipping 4 vtiles at the end of each row + ld hl, $98c5 + ld de, $20 + ld a, $4 + ld b, 8 +.row + ld c, 12 + push hl +.col + ld [hli], a + inc a + dec c + jr nz, .col + pop hl + add hl, de + add $4 + dec b + jr nz, .row + + ld hl, $98c4 ; (4, 6) + ld [hl], $3 + ld hl, $98e4 ; (4, 7) + ld [hl], $74 + ld hl, $99a5 ; (5, 5) + ld [hl], $0 + lb de, $60, $58 + ld a, $9 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + xor a + call Func_f9e9a + call YellowIntro_SetTimerFor128Frames + call YellowIntro_NextScene + ret + +YellowIntroScene13: + call YellowIntro_CheckFrameTimerDecrement + ret nc + lb de, $68, $58 + ld a, $a + call SpawnAnimatedObject + call YellowIntro_NextScene + ret + +YellowIntroScene14: + ld de, YellowIntroPalSequence_f9dd6 + call YellowIntro_LoadDMGPalAndIncrementCounter + jr c, .expired + ldh [rBGP], a + ldh [rOBP0], a + and $f0 + ldh [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +.expired + call MaskAllAnimatedObjectStructs + call YellowIntro_BlankOAMBuffer + ld hl, wTileMap + ld bc, $50 + ld a, $1 + call Bank3E_FillMemory + hlcoord 0, 4 + ld bc, CopyVideoDataAlternate + xor a + call Bank3E_FillMemory + hlcoord 0, 14 + ld bc, $50 + ld a, $1 + call Bank3E_FillMemory + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ldh [hAutoBGTransferEnabled], a + ld a, $e4 + ldh [rOBP0], a + ldh [rBGP], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + lb de, $58, $58 + ld a, $7 + call YellowIntro_SpawnAnimatedObjectAndSavePointer + call YellowIntro_NextScene + ld a, $28 + ld [wYellowIntroSceneTimer], a + ret + +YellowIntroScene15: + call YellowIntro_CheckFrameTimerDecrement + jr c, .expired + ld a, [wYellowIntroSceneTimer] + and $3 + ret nz + ldh a, [rOBP0] + xor $ff + ldh [rOBP0], a + ldh a, [rBGP] + xor $3 + ldh [rBGP], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + ret + +.expired + xor a + ldh [hLCDCPointer], a + ld a, $e4 + ldh [rBGP], a + ldh [rOBP0], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call YellowIntro_NextScene +YellowIntroScene16: + ld de, YellowIntroPalSequence_f9e0a + call YellowIntro_LoadDMGPalAndIncrementCounter + jr c, .expired + ldh [rOBP0], a + ldh [rBGP], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + ret + +.expired + call YellowIntro_NextScene + ret + +YellowIntroPalSequence_f9dd6: + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $e4 + db $e4, $c0, $c0, $ff + +YellowIntroPalSequence_f9e0a: + db $e4, $90, $90, $40 + db $40, $00, $00, $ff + +YellowIntroScene17: + ld c, 64 + call DelayFrames + ld hl, wYellowIntroCurrentScene + set 7, [hl] + ret + +YellowIntro_SpawnAnimatedObjectAndSavePointer: + call SpawnAnimatedObject + ld a, c + ld [wYellowIntroAnimatedObjectStructPointer], a + ld a, b + ld [wYellowIntroAnimatedObjectStructPointer + 1], a + ret + +YellowIntro_MaskCurrentAnimatedObjectStruct: + ld a, [wYellowIntroAnimatedObjectStructPointer] + ld c, a + ld a, [wYellowIntroAnimatedObjectStructPointer + 1] + ld b, a + call MaskCurrentAnimatedObjectStruct + ret + +YellowIntro_SetTimerFor128Frames: + ld a, 128 + ld [wYellowIntroSceneTimer], a + ret + +YellowIntro_SetTimerFor88Frames: + ld a, 88 + ld [wYellowIntroSceneTimer], a + ret + +YellowIntro_CheckFrameTimerDecrement: + ld hl, wYellowIntroSceneTimer + ld a, [hl] + and a + jr z, .asm_f9e4b + dec [hl] + and a + ret + +.asm_f9e4b + scf + ret + +YellowIntro_LoadDMGPalAndIncrementCounter: + ld hl, wYellowIntroSceneTimer + ld a, [hl] + inc [hl] + ld l, a + ld h, $0 + add hl, de + ld a, [hl] + cp $ff + jr z, .asm_f9e5d + and a + ret + +.asm_f9e5d + scf + ret + +Func_f9e5f: + ld hl, vBGMap0 + ld bc, $80 + ld a, $1 + call Bank3E_FillMemory + ld hl, $9880 + ld bc, $140 + xor a + call Bank3E_FillMemory + ld hl, $99c0 + ld bc, $80 + ld a, $1 + call Bank3E_FillMemory + ret + +YellowIntro_BlankPalsDelay2AndDisableLCD: + xor a + ldh [rBGP], a + ldh [rOBP0], a + ldh [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + call DelayFrame + call DelayFrame + call DisableLCD + ret + +Func_f9e9a: + ld e, a + callfar YellowIntroPaletteAction + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $90 + ldh [hWY], a + ld a, $e3 + ldh [rLCDC], a + ld a, $e4 + ldh [rBGP], a + ldh [rOBP0], a + ld a, $e0 + ldh [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +YellowIntro_Copy8BitSineWave: + ; Copy this sine wave into wLYOverridesBuffer 8 times (end just before wc900) + ld de, wLYOverridesBuffer + ld a, $8 +.loop + push af + ld hl, .SineWave + ld bc, .SineWaveEnd - .SineWave + call Bank3E_CopyData + pop af + dec a + jr nz, .loop + ret + +.SineWave: +; a sine wave with amplitude 4 + db 0, 0, 1, 2, 2, 3, 3, 3 + db 4, 3, 3, 3, 2, 2, 1, 0 + db 0, 0, -1, -2, -2, -3, -3, -3 + db -4, -3, -3, -3, -2, -2, -1, 0 +.SineWaveEnd: + +Request7TileTransferFromC810ToC710: + ld a, $10 + ldh [hVBlankCopySource], a + ld a, HIGH(wLYOverridesBuffer) + ldh [hVBlankCopySource + 1], a + ld a, $10 + ldh [hVBlankCopyDest], a + ld a, HIGH(wLYOverrides) + ldh [hVBlankCopyDest + 1], a + ld a, $7 + ldh [hVBlankCopySize], a + ret + +InitYellowIntroGFXAndMusic: + xor a + ldh [hAutoBGTransferEnabled], a + ldh [hSCX], a + ldh [hSCY], a + ldh [hAutoBGTransferDest], a + ld a, $98 + ldh [hAutoBGTransferDest + 1], a + call YellowIntro_BlankTileMap + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $1 + call Bank3E_FillMemory + hlcoord 0, 4 + ld bc, CopyVideoDataAlternate + xor a + call Bank3E_FillMemory + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ldh [hAutoBGTransferEnabled], a + ld de, YellowIntroGraphics2 + ld hl, vChars0 + lb bc, BANK(YellowIntroGraphics2), (YellowIntroGraphics2End - YellowIntroGraphics2 - $10) / $10 + call CopyVideoData + ld de, YellowIntroGraphics1 + ld hl, vChars2 + lb bc, BANK(YellowIntroGraphics1), (YellowIntroGraphics1End - YellowIntroGraphics1) / $10 + call CopyVideoData + call ClearObjectAnimationBuffers + call LoadYellowIntroObjectAnimationDataPointers + ld b, $8 + call RunPaletteCommand + xor a + ld hl, wYellowIntroCurrentScene + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld a, MUSIC_YELLOW_INTRO + ld c, BANK(Music_YellowIntro) + call PlayMusic + ret + +LoadYellowIntroObjectAnimationDataPointers: + ld a, LOW(YellowIntro_AnimatedObjectSpawnStateData) + ld [wAnimatedObjectSpawnStateDataPointer], a + ld a, HIGH(YellowIntro_AnimatedObjectSpawnStateData) + ld [wAnimatedObjectSpawnStateDataPointer + 1], a + ld a, LOW(YellowIntro_AnimatedObjectJumptable) + ld [wAnimatedObjectJumptablePointer], a + ld a, HIGH(YellowIntro_AnimatedObjectJumptable) + ld [wAnimatedObjectJumptablePointer + 1], a + ld a, LOW(YellowIntro_AnimatedObjectOAMData) + ld [wAnimatedObjectOAMDataPointer], a + ld a, HIGH(YellowIntro_AnimatedObjectOAMData) + ld [wAnimatedObjectOAMDataPointer + 1], a + ld a, LOW(YellowIntro_AnimatedObjectFramesData) + ld [wAnimatedObjectFramesDataPointer], a + ld a, HIGH(YellowIntro_AnimatedObjectFramesData) + ld [wAnimatedObjectFramesDataPointer + 1], a + ret + +YellowIntro_BlankTileMap: + ld hl, wTileMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, $7f + call Bank3E_FillMemory + ret + +Bank3E_CopyData: +.loop + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, c + or b + jr nz, .loop + ret + +Bank3E_FillMemory: + push de + ld e, a +.loop + ld a, e + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + pop de + ret + +YellowIntro_BlankOAMBuffer: + ld hl, wOAMBuffer + ld bc, wOAMBufferEnd - wOAMBuffer + xor a + call Bank3E_FillMemory + ret + +YellowIntro_BlankPalettes: + xor a + ldh [rBGP], a + ldh [rOBP0], a + ldh [rOBP1], a + call UpdateGBCPal_BGP + call UpdateGBCPal_OBP0 + call UpdateGBCPal_OBP1 + ret + +YellowIntro_AnimatedObjectSpawnStateData: + db $00, $00, $00 + db $01, $01, $00 + db $02, $01, $00 + db $03, $01, $00 + db $04, $02, $00 + db $05, $03, $00 + db $06, $04, $00 + db $07, $01, $00 + db $08, $05, $00 + db $09, $01, $00 + db $0a, $01, $00 + +YellowIntro_AnimatedObjectJumptable: + dw Func_fa007 + dw Func_fa007 + dw Func_fa008 + dw Func_fa014 + dw Func_fa02b + dw Func_fa062 + +Func_fa007: + ret + +Func_fa008: + ld hl, $4 + add hl, bc + ld a, [hl] + cp $58 + ret z + sub $4 + ld [hl], a + ret + +Func_fa014: + ld hl, $4 + add hl, bc + ld a, [hl] + cp $58 + jr z, .asm_fa020 + add $4 + ld [hl], a +.asm_fa020 + ld hl, $5 + add hl, bc + cp $58 + ret z + add $1 + ld [hl], a + ret + +Func_fa02b: + ld hl, $b + add hl, bc + ld e, [hl] + ld d, $0 + ld hl, Jumptable_fa03b + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +Jumptable_fa03b: + dw Func_fa03f + dw Func_fa051 + +Func_fa03f: + ld hl, $5 + add hl, bc + ld a, [hl] + cp $58 + jr z, .asm_fa04c + sub $2 + ld [hl], a + ret + +.asm_fa04c + ld hl, $b + add hl, bc + inc [hl] +Func_fa051: + ld hl, $c + add hl, bc + ld a, [hl] + inc [hl] + ld d, $8 + call Func_fa079 + ld hl, $7 + add hl, bc + ld [hl], a + ret + +Func_fa062: + ld hl, $b + add hl, bc + ld a, [hl] + ld hl, $4 + add hl, bc + add [hl] + ld [hl], a + ret + +Func_fa06e: + ld e, a + ld d, $0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ret + +Func_fa077: ; cosine + add $10 +Func_fa079: + and $3f + cp $20 + jr nc, .asm_fa084 + call Func_fa08e + ld a, h + ret + +.asm_fa084 + and $1f + call Func_fa08e + ld a, h + xor $ff + inc a + ret + +Func_fa08e: + ld e, a + ld a, d + ld d, $0 + ld hl, Unkn_fa0aa + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $0 +.asm_fa09d + srl a + jr nc, .asm_fa0a2 + add hl, de +.asm_fa0a2 + sla e + rl d + and a + jr nz, .asm_fa09d + ret + +Unkn_fa0aa: + sine_wave $100 + +INCLUDE "data/sprite_anims/intro_frames.asm" +INCLUDE "data/sprite_anims/intro_oam.asm" + +INCLUDE "gfx/yellow_intro.asm" diff --git a/engine/movie/title.asm b/engine/movie/title.asm index 1f2723a3..0b421d89 100755 --- a/engine/movie/title.asm +++ b/engine/movie/title.asm @@ -38,7 +38,7 @@ DisplayTitleScreen: call FarCopyData ld hl, NineTile ld de, vTitleLogo tile $6e - ld bc, $10 + ld bc, 1 tiles ld a, BANK(NineTile) call FarCopyData ld hl, GamefreakLogoGraphics diff --git a/engine/movie/title2.asm b/engine/movie/title2.asm deleted file mode 100755 index df630b53..00000000 --- a/engine/movie/title2.asm +++ /dev/null @@ -1,122 +0,0 @@ -; Leftover of Red/Blue. Seemingly unused - -TitleScroll_WaitBall: -; Wait around for the TitleBall animation to play out. -; hi: speed -; lo: duration - db $05, $05, 0 - -TitleScroll_In: -; Scroll a TitleMon in from the right. -; hi: speed -; lo: duration - db $a2, $94, $84, $63, $52, $31, $11, 0 - -TitleScroll_Out: -; Scroll a TitleMon out to the left. -; hi: speed -; lo: duration - db $12, $22, $32, $42, $52, $62, $83, $93, 0 - -TitleScroll: - ld a, d - - ld bc, TitleScroll_In - ld d, $88 - ld e, 0 ; don't animate titleball - - and a - jr nz, .ok - - ld bc, TitleScroll_Out - ld d, $00 - ld e, 0 ; don't animate titleball -.ok - -_TitleScroll: - ld a, [bc] - and a - ret z - - inc bc - push bc - - ld b, a - and $f - ld c, a - ld a, b - and $f0 - swap a - ld b, a - -.loop - ld h, d - ld l, $48 - call .ScrollBetween - - ld h, $00 - ld l, $88 - call .ScrollBetween - - ld a, d - add b - ld d, a - - call GetTitleBallY - dec c - jr nz, .loop - - pop bc - jr _TitleScroll - -.ScrollBetween: -.wait - ldh a, [rLY] ; rLY - cp l - jr nz, .wait - - ld a, h - ldh [rSCX], a - -.wait2 - ldh a, [rLY] ; rLY - cp h - jr z, .wait2 - ret - -TitleBallYTable: -; OBJ y-positions for the Poke Ball held by Red in the title screen. -; This is really two 0-terminated lists. Initiated with an index of 1. - db 0, $71, $6f, $6e, $6d, $6c, $6d, $6e, $6f, $71, $74, 0 - -TitleScreenAnimateBallIfStarterOut: -; Animate the TitleBall if a starter just got scrolled out. - ld a, [wTitleScreenScene] - cp STARTER1 - jr z, .ok - cp STARTER2 - jr z, .ok - cp STARTER3 - ret nz -.ok - ld e, 1 ; animate titleball - ld bc, TitleScroll_WaitBall - ld d, 0 - jp _TitleScroll - -GetTitleBallY: -; Get position e from TitleBallYTable - push de - push hl - xor a - ld d, a - ld hl, TitleBallYTable - add hl, de - ld a, [hl] - pop hl - pop de - and a - ret z - ld [wOAMBuffer + $28], a - inc e - ret diff --git a/engine/movie/title_rb.asm b/engine/movie/title_rb.asm new file mode 100755 index 00000000..df630b53 --- /dev/null +++ b/engine/movie/title_rb.asm @@ -0,0 +1,122 @@ +; Leftover of Red/Blue. Seemingly unused + +TitleScroll_WaitBall: +; Wait around for the TitleBall animation to play out. +; hi: speed +; lo: duration + db $05, $05, 0 + +TitleScroll_In: +; Scroll a TitleMon in from the right. +; hi: speed +; lo: duration + db $a2, $94, $84, $63, $52, $31, $11, 0 + +TitleScroll_Out: +; Scroll a TitleMon out to the left. +; hi: speed +; lo: duration + db $12, $22, $32, $42, $52, $62, $83, $93, 0 + +TitleScroll: + ld a, d + + ld bc, TitleScroll_In + ld d, $88 + ld e, 0 ; don't animate titleball + + and a + jr nz, .ok + + ld bc, TitleScroll_Out + ld d, $00 + ld e, 0 ; don't animate titleball +.ok + +_TitleScroll: + ld a, [bc] + and a + ret z + + inc bc + push bc + + ld b, a + and $f + ld c, a + ld a, b + and $f0 + swap a + ld b, a + +.loop + ld h, d + ld l, $48 + call .ScrollBetween + + ld h, $00 + ld l, $88 + call .ScrollBetween + + ld a, d + add b + ld d, a + + call GetTitleBallY + dec c + jr nz, .loop + + pop bc + jr _TitleScroll + +.ScrollBetween: +.wait + ldh a, [rLY] ; rLY + cp l + jr nz, .wait + + ld a, h + ldh [rSCX], a + +.wait2 + ldh a, [rLY] ; rLY + cp h + jr z, .wait2 + ret + +TitleBallYTable: +; OBJ y-positions for the Poke Ball held by Red in the title screen. +; This is really two 0-terminated lists. Initiated with an index of 1. + db 0, $71, $6f, $6e, $6d, $6c, $6d, $6e, $6f, $71, $74, 0 + +TitleScreenAnimateBallIfStarterOut: +; Animate the TitleBall if a starter just got scrolled out. + ld a, [wTitleScreenScene] + cp STARTER1 + jr z, .ok + cp STARTER2 + jr z, .ok + cp STARTER3 + ret nz +.ok + ld e, 1 ; animate titleball + ld bc, TitleScroll_WaitBall + ld d, 0 + jp _TitleScroll + +GetTitleBallY: +; Get position e from TitleBallYTable + push de + push hl + xor a + ld d, a + ld hl, TitleBallYTable + add hl, de + ld a, [hl] + pop hl + pop de + and a + ret z + ld [wOAMBuffer + $28], a + inc e + ret diff --git a/engine/movie/title_yellow.asm b/engine/movie/title_yellow.asm new file mode 100644 index 00000000..c70b87f9 --- /dev/null +++ b/engine/movie/title_yellow.asm @@ -0,0 +1,109 @@ +LoadYellowTitleScreenGFX: + ld hl, PokemonLogoGraphics + ld de, vChars2 + ld bc, PokemonLogoGraphicsEnd - PokemonLogoGraphics + ld a, BANK(PokemonLogoGraphics) + call FarCopyData + ld hl, PokemonLogoCornerGraphics + ld de, vChars1 tile $7d + ld bc, PokemonLogoCornerGraphicsEnd - PokemonLogoCornerGraphics + ld a, BANK(PokemonLogoCornerGraphics) + call FarCopyData + ld hl, TitlePikachuBGGraphics + ld de, vChars1 + ld bc, TitlePikachuBGGraphicsEnd - TitlePikachuBGGraphics + ld a, BANK(TitlePikachuBGGraphics) + call FarCopyData + ld hl, TitlePikachuOBGraphics + ld de, vChars1 tile $70 + ld bc, TitlePikachuOBGraphicsEnd - TitlePikachuOBGraphics + ld a, BANK(TitlePikachuOBGraphics) + call FarCopyData + ret + +TitleScreen_PlacePokemonLogo: + hlcoord 2, 1 + ld de, TitleScreenPokemonLogoTilemap + lb bc, 7, 16 + call Bank3D_CopyBox + ret + +TitleScreen_PlacePikaSpeechBubble: + hlcoord 6, 4 + ld de, TitleScreenPikaBubbleTilemap + lb bc, 4, 7 + call Bank3D_CopyBox + hlcoord 9, 8 + ld [hl], $64 + inc hl + ld [hl], $65 + ret + +TitleScreen_PlacePikachu: + hlcoord 4, 8 + ld de, TitleScreenPikachuTilemap + lb bc, 9, 12 + call Bank3D_CopyBox + hlcoord 16, 10 + ld [hl], $96 + hlcoord 16, 11 + ld [hl], $9d + hlcoord 16, 12 + ld [hl], $a7 + hlcoord 16, 13 + ld [hl], $b1 + ld hl, TitleScreenPikachuEyesOAMData + ld de, wOAMBuffer + ld bc, $20 + call CopyData + ret + +TitleScreenPikachuEyesOAMData: + db $60, $40, $f1, $22 + db $60, $48, $f0, $22 + db $68, $40, $f3, $22 + db $68, $48, $f2, $22 + db $60, $60, $f0, $02 + db $60, $68, $f1, $02 + db $68, $60, $f2, $02 + db $68, $68, $f3, $02 + +Bank3D_CopyBox: +; copy cxb (xy) screen area from de to hl +.row + push bc + push hl +.col + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret + +TitleScreenPokemonLogoTilemap: ; 16x7 + INCBIN "gfx/title/pokemon_logo.tilemap" + +Pointer_f4669: ; unreferenced + db $47, $48, $49, $4a, $4b, $4c, $4d, $4e, $4f, $5f + +TitleScreenPikaBubbleTilemap: ; 7x4 + INCBIN "gfx/title/pika_bubble.tilemap" + +TitleScreenPikachuTilemap: ; 12x9 + INCBIN "gfx/title/pikachu.tilemap" + +PokemonLogoGraphics: INCBIN "gfx/title/pokemon_logo.2bpp" +PokemonLogoGraphicsEnd: +PokemonLogoCornerGraphics: INCBIN "gfx/title/pokemon_logo_corner.2bpp" +PokemonLogoCornerGraphicsEnd: +TitlePikachuBGGraphics: INCBIN "gfx/title/pikachu_bg.2bpp" +TitlePikachuBGGraphicsEnd: +TitlePikachuOBGraphics: INCBIN "gfx/title/pikachu_ob.2bpp" +TitlePikachuOBGraphicsEnd: diff --git a/engine/overworld/healing_machine.asm b/engine/overworld/healing_machine.asm index e5fba7e1..84891353 100755 --- a/engine/overworld/healing_machine.asm +++ b/engine/overworld/healing_machine.asm @@ -34,7 +34,7 @@ AnimateHealingMachine: dec b jr nz, .partyLoop ld a, [wAudioROMBank] - cp BANK(AudioEngine3) + cp BANK("Audio Engine 3") ld [wAudioSavedROMBank], a jr nz, .next call StopAllMusic diff --git a/engine/overworld/missable_objects.asm b/engine/overworld/missable_objects.asm index 358a9b9f..bcaa731b 100644 --- a/engine/overworld/missable_objects.asm +++ b/engine/overworld/missable_objects.asm @@ -15,17 +15,13 @@ MarkTownVisitedAndLoadMissableObjects:: add hl, bc ld a, [hli] ; load missable objects pointer in hl ld h, [hl] - ; fall through - -; LoadMissableObjects: -; seems to not exist in yellow (predef replaced with something near TryPushingBoulder) ld l, a push hl ld a, l - sub MissableObjects & $ff ; calculate difference between out pointer and the base pointer + sub LOW(MissableObjects) ; calculate difference between out pointer and the base pointer ld l, a ld a, h - sbc MissableObjects / $100 + sbc HIGH(MissableObjects) ld h, a ld a, h ldh [hDividend], a diff --git a/engine/overworld/specific_script_flags.asm b/engine/overworld/specific_script_flags.asm new file mode 100644 index 00000000..d6f333ac --- /dev/null +++ b/engine/overworld/specific_script_flags.asm @@ -0,0 +1,25 @@ +SetMapSpecificScriptFlagsOnMapReload:: + ld a, [wCurMap] + cp VERMILION_GYM + jr z, .vermilion_gym + ld c, a + ld hl, Bit5Maps +.search_loop + ld a, [hli] + cp c + jr z, .in_list + cp a, $ff + jr nz, .search_loop + ret + +.vermilion_gym + ld hl, wCurrentMapScriptFlags + set 6, [hl] + ret + +.in_list + ld hl, wCurrentMapScriptFlags + set 5, [hl] + ret + +INCLUDE "data/maps/bit_5_maps.asm" diff --git a/engine/overworld/sprite_collisions.asm b/engine/overworld/sprite_collisions.asm index db81977b..b29dc108 100644 --- a/engine/overworld/sprite_collisions.asm +++ b/engine/overworld/sprite_collisions.asm @@ -1,5 +1,5 @@ _UpdateSprites:: - ld h, wSpriteStateData1 / $100 + ld h, HIGH(wSpriteStateData1) inc h ld a, SPRITESTATEDATA2_IMAGEBASEOFFSET .spriteLoop diff --git a/engine/overworld/unused_load_missable_object_data.asm b/engine/overworld/unused_load_missable_object_data.asm new file mode 100644 index 00000000..ce0c00d1 --- /dev/null +++ b/engine/overworld/unused_load_missable_object_data.asm @@ -0,0 +1,40 @@ +Func_f0a54: ; unreferenced + ret + +LoadMissableObjectData:: +; farcalled by an unreferenced function + ld hl, .MissableObjectsMaps +.loop + ld a, [hli] + cp -1 + ret z + ld b, a + ld a, [wCurMap] + cp b + jr z, .found + inc hl + inc hl + inc hl + jr .loop + +.found + ld a, [hli] + ld c, a + ld b, 0 + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wMissableObjectList + call CopyData + ret + +.MissableObjectsMaps: + dbbw BLUES_HOUSE, .BluesHouseEnd - .BluesHouse, .BluesHouse + db -1 ; end + +.BluesHouse: + db 1, HS_DAISY_SITTING_COPY + db 2, HS_DAISY_WALKING_COPY + db 3, HS_TOWN_MAP_COPY + db -1 ; end +.BluesHouseEnd: diff --git a/engine/pikachu/pikachu_emotions.asm b/engine/pikachu/pikachu_emotions.asm new file mode 100755 index 00000000..1378d383 --- /dev/null +++ b/engine/pikachu/pikachu_emotions.asm @@ -0,0 +1,422 @@ +IsPlayerTalkingToPikachu:: + ld a, [wd436] + and a + ret z + ldh a, [hSpriteIndexOrTextID] + cp $f + ret nz + call InitializePikachuTextID + xor a + ldh [hSpriteIndexOrTextID], a + ld [wd436], a + ret + +InitializePikachuTextID:: + ld a, TEXT_PIKACHU_ANIM ; display + ldh [hSpriteIndexOrTextID], a + xor a + ld [wPlayerMovingDirection], a + ld a, $1 + ld [wAutoTextBoxDrawingControl], a + call DisplayTextID + xor a + ld [wAutoTextBoxDrawingControl], a + ret + +DoStarterPikachuEmotions: + ld e, a + ld d, 0 + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] +.loop + ld a, [de] + inc de + cp $ff + jr z, .done + ld c, a + ld b, 0 + ld hl, StarterPikachuEmotionsJumptable + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call JumpToAddress + jr .loop + +.done + ret + +StarterPikachuEmotionsJumptable: + dw StarterPikachuEmotionCommand_nop ; 0 + dw StarterPikachuEmotionCommand_text ; 1 + dw StarterPikachuEmotionCommand_pcm ; 2 + dw StarterPikachuEmotionCommand_emote ; 3 + dw StarterPikachuEmotionCommand_movement ; 4 + dw StarterPikachuEmotionCommand_pikapic ; 5 + dw StarterPikachuEmotionCommand_subcmd ; 6 + dw StarterPikachuEmotionCommand_delay ; 7 + dw StarterPikachuEmotionCommand_nop2 ; 8 + dw StarterPikachuEmotionCommand_9 ; 9 + dw StarterPikachuEmotionCommand_nop3 ; a + +StarterPikachuEmotionCommand_nop: +StarterPikachuEmotionCommand_nop3: + ret + +StarterPikachuEmotionCommand_text: + ld a, [de] + ld l, a + inc de + ld a, [de] + ld h, a + inc de + push de + call PrintText + pop de + ret + +StarterPikachuEmotionCommand_pcm: + ld a, [de] + inc de + push de + ld e, a + nop + call PlayPikachuSoundClip_ + pop de + ret + +PlayPikachuSoundClip_: + cp $ff + ret z + callfar PlayPikachuSoundClip + ret + +StarterPikachuEmotionCommand_emote: + ld a, [wUpdateSpritesEnabled] + push af + ld a, $ff + ld [wUpdateSpritesEnabled], a + ld a, [de] + inc de + push de + call ShowPikachuEmoteBubble + pop de + pop af + ld [wUpdateSpritesEnabled], a + ret + +ShowPikachuEmoteBubble: + ld [wWhichEmotionBubble], a + ld a, $f ; Pikachu + ld [wEmotionBubbleSpriteIndex], a + predef EmotionBubble + ret + +StarterPikachuEmotionCommand_movement: + ld a, [de] + inc de + ld l, a + ld a, [de] + inc de + ld h, a + push de + ld b, BANK(DoStarterPikachuEmotions) + call ApplyPikachuMovementData_ + pop de + ret + +StarterPikachuEmotionCommand_delay: + ld a, [de] + inc de + push de + ld c, a + call DelayFrames + pop de + ret + +StarterPikachuEmotionCommand_subcmd: + ld a, [de] + inc de + push de + ld e, a + ld d, 0 + ld hl, .Subcommands + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call JumpToAddress + pop de + ret + +.Subcommands: + dw LoadPikachuSpriteIntoVRAM + dw LoadFontTilePatterns + dw Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3 + dw WaitForTextScrollButtonPress + dw PikachuPewterPokecenterCheck + dw PikachuFanClubCheck + dw PikachuBillsHouseCheck + +StarterPikachuEmotionCommand_nop2: + ret + +StarterPikachuEmotionCommand_9: + push de + call StarterPikachuEmotionCommand_turnawayfromplayer + call UpdateSprites + pop de + ret + +StarterPikachuEmotionCommand_turnawayfromplayer: + ld a, [wSpritePlayerStateData1FacingDirection] + xor $4 + ld [wSpritePikachuStateData1FacingDirection], a + ret + +DeletedFunction_fcffb: +; Inexplicably empty. +REPT 5 + nop +ENDR + ret + +PlaySpecificPikachuEmotion: + ld a, e + jr load_expression + +TalkToPikachu:: + call MapSpecificPikachuExpression + jr c, load_expression + call GetPikaPicAnimationScriptIndex + call DeletedFunction_fcffb +load_expression: + ld [wExpressionNumber], a + ld hl, PikachuEmotionTable + call DoStarterPikachuEmotions + ret + +pikaemotion_def: MACRO +\1_id: + dw \1 +ENDM + +PikachuEmotionTable: + pikaemotion_def PikachuEmotion0 + pikaemotion_def PikachuEmotion1 + pikaemotion_def PikachuEmotion2 + pikaemotion_def PikachuEmotion3 + pikaemotion_def PikachuEmotion4 + pikaemotion_def PikachuEmotion5 + pikaemotion_def PikachuEmotion6 + pikaemotion_def PikachuEmotion7 + pikaemotion_def PikachuEmotion8 + pikaemotion_def PikachuEmotion9 + pikaemotion_def PikachuEmotion10 + pikaemotion_def PikachuEmotion11 + pikaemotion_def PikachuEmotion12 + pikaemotion_def PikachuEmotion13 + pikaemotion_def PikachuEmotion14 + pikaemotion_def PikachuEmotion15 + pikaemotion_def PikachuEmotion16 + pikaemotion_def PikachuEmotion17 + pikaemotion_def PikachuEmotion18 + pikaemotion_def PikachuEmotion19 + pikaemotion_def PikachuEmotion20 + pikaemotion_def PikachuEmotion21 ; used a fishing rod + pikaemotion_def PikachuEmotion22 + pikaemotion_def PikachuEmotion23 + pikaemotion_def PikachuEmotion24 + pikaemotion_def PikachuEmotion25 + pikaemotion_def PikachuEmotion26 ; wake up pikachu in pewter pokemon center + pikaemotion_def PikachuEmotion27 + pikaemotion_def PikachuEmotion28 + pikaemotion_def PikachuEmotion29 + pikaemotion_def PikachuEmotion30 + pikaemotion_def PikachuEmotion31 + pikaemotion_def PikachuEmotion32 + pikaemotion_def PikachuEmotion33 + +PikachuEmotion33: + db $ff + +MapSpecificPikachuExpression: + ld a, [wCurMap] + cp POKEMON_FAN_CLUB + jr nz, .notFanClub + ld hl, wd492 + bit 7, [hl] + ldpikaemotion a, PikachuEmotion29 + jr z, .play_emotion + call CheckPikachuFollowingPlayer + ldpikaemotion a, PikachuEmotion30 + jr nz, .play_emotion + jr .check_pikachu_status + +.notFanClub + ld a, [wCurMap] + cp PEWTER_POKECENTER + jr nz, .notPewterPokecenter + call CheckPikachuFollowingPlayer + ldpikaemotion a, PikachuEmotion26 + jr nz, .play_emotion + jr .check_pikachu_status + +.notPewterPokecenter + callfar Func_f24ae + ld a, e + cp $ff + jr nz, .play_emotion + jr .check_pikachu_status ; useless + +.check_pikachu_status + call IsPlayerPikachuAsleepInParty + ldpikaemotion a, PikachuEmotion11 + jr c, .play_emotion + callfar CheckPikachuFaintedOrStatused ; same bank + ldpikaemotion a, PikachuEmotion28 + jr c, .play_emotion + ld a, [wCurMap] + cp POKEMON_TOWER_1F + jr c, .notInLavenderTower + cp POKEMON_TOWER_7F + 1 + ldpikaemotion a, PikachuEmotion22 + jr c, .play_emotion +.notInLavenderTower + ld a, [wd49c] + and a + jr z, .mood_based_emotion + dec a + ld c, a + ld b, $0 + ld hl, .Emotions + add hl, bc + ld a, [hl] + jr .play_emotion + +.mood_based_emotion + and a + ret + +.play_emotion + scf + ret + +.Emotions: + dpikaemotion PikachuEmotion18 + dpikaemotion PikachuEmotion21 + dpikaemotion PikachuEmotion23 + dpikaemotion PikachuEmotion24 + dpikaemotion PikachuEmotion25 + +IsPlayerPikachuAsleepInParty: + xor a + ld [wWhichPokemon], a +.loop + ld a, [wWhichPokemon] + ld c, a + ld b, 0 + ld hl, wPartySpecies + add hl, bc + ld a, [hl] + cp $ff + jr z, .done + cp PIKACHU + jr nz, .curMonNotStarterPikachu + callfar IsThisPartymonStarterPikachu + jr nc, .curMonNotStarterPikachu + ld a, [wWhichPokemon] + ld hl, wPartyMon1Status + ld bc, wPartyMon2 - wPartyMon1 + call AddNTimes + ld a, [hl] + and SLP + jr z, .done + jr .curMonSleepingPikachu + +.curMonNotStarterPikachu + ld a, [wWhichPokemon] + cp PARTY_LENGTH - 1 + jr z, .done + inc a + ld [wWhichPokemon], a + jr .loop + +.curMonSleepingPikachu + scf + ret + +.done + and a + ret + +INCLUDE "data/pikachu/pikachu_emotions.asm" + +PikachuWalksToNurseJoy: + ld a, $40 + ldh [hFFFC], a + call LoadPikachuSpriteIntoVRAM + call .GetMovementData + and a + jr z, .skip + call ApplyPikachuMovementData +.skip + xor a + ldh [hFFFC], a + ret + +.GetMovementData: + ld a, [wSpritePikachuStateData2MapY] + ld e, a + ld a, [wSpritePikachuStateData2MapX] + ld d, a + ld a, [wYCoord] + add 4 + cp e + jr z, .pikachu_at_same_y_as_player + jr nc, .pikachu_above_player + ld hl, .PikaMovementData1 + ld a, 1 + ret + +.pikachu_above_player + xor a + ret + +.pikachu_at_same_y_as_player + ld a, [wXCoord] + add 4 + cp d + jr c, .pikachu_to_right_of_player + ld hl, .PikaMovementData2 + ld a, 2 + ret + +.pikachu_to_right_of_player + ld hl, .PikaMovementData3 + ld a, 3 + ret + +.PikaMovementData1: + db $00 ; init + db $36 ; look up + db $2b ; walk up left + db $34 ; hop up right + db $3f ; ret + +.PikaMovementData2: + db $00 ; init + db $36 ; look up + db $34 ; hop up right + db $3f ; ret + +.PikaMovementData3: + db $00 ; init + db $36 ; look up + db $33 ; hop up left + db $3f ; ret diff --git a/engine/pikachu/pikachu_follow.asm b/engine/pikachu/pikachu_follow.asm new file mode 100755 index 00000000..9575c341 --- /dev/null +++ b/engine/pikachu/pikachu_follow.asm @@ -0,0 +1,1578 @@ +ShouldPikachuSpawn:: +; possibly to test if pika should be out? + ld a, [wPikachuOverworldStateFlags] + bit 5, a + jr nz, .hide + ld a, [wPikachuOverworldStateFlags] + bit 7, a + jr nz, .hide + call IsStarterPikachuInOurParty + jr nc, .hide + ld a, [wWalkBikeSurfState] + and a + jr nz, .hide + scf + ret + +.hide + and a + ret + +SchedulePikachuSpawnForAfterText:: + ld hl, wPikachuOverworldStateFlags + bit 4, [hl] + res 4, [hl] + jr nz, .normal_spawn_state + call EnablePikachuFollowingPlayer + call ClearPikachuSpriteStateData + ld a, $ff + ld [wSpritePikachuStateData1ImageIndex], a + call ClearPikachuFollowCommandBuffer + call CalculatePikachuFacingDirection + ret + +.normal_spawn_state + call CalculatePikachuPlacementCoords + xor a + ld [wPikachuSpawnState], a + ld a, [wSpritePlayerStateData1FacingDirection] + ld [wSpritePikachuStateData1FacingDirection], a + ret + +ClearPikachuSpriteStateData:: + ld hl, wSpritePikachuStateData1PictureID + call .clear + ld hl, wSpritePikachuStateData2 +.clear + ld bc, $10 + xor a + call FillMemory + ret + +CalculatePikachuSpawnCoordsAndFacing:: + call CalculatePikachuPlacementCoords + call CalculatePikachuFacingDirection + xor a + ld [wPikachuSpawnState], a + ret + +CalculatePikachuPlacementCoords:: + ld bc, wSpritePikachuStateData1PictureID + ld a, [wYCoord] + add $4 + ld e, a + ld a, [wXCoord] + add $4 + ld d, a + ld a, [wPikachuSpawnState] + and a + jr z, .load_coords + cp $1 + jr z, .right_of_player + cp $2 + jr z, .check_player_facing2 + cp $3 + jr z, .load_coords + cp $4 + jr z, .below_player + cp $5 + jr z, .above_player + cp $6 + jr z, .left_of_player + cp $7 + jr z, .check_player_facing + jr .right_of_player + +.check_player_facing + ld a, [wSpritePlayerStateData1FacingDirection] + and a ; SPRITE_FACING_DOWN + jr z, .below_player + cp SPRITE_FACING_UP + jr z, .above_player + cp SPRITE_FACING_LEFT + jr z, .left_of_player + cp SPRITE_FACING_RIGHT + jr z, .right_of_player +.check_player_facing2 + ld a, [wSpritePlayerStateData1FacingDirection] + and a + jr nz, .check_up + dec e + jr .load_coords + +.check_up + cp SPRITE_FACING_UP + jr nz, .check_left + inc e + jr .load_coords + +.check_left + cp SPRITE_FACING_LEFT + jr nz, .left_of_player_2 + inc d + jr .load_coords + +.left_of_player_2 + dec d + jr .load_coords + +.right_of_player + inc d + jr .load_coords + +.left_of_player + dec d + jr .load_coords + +.below_player + inc e + jr .load_coords + +.above_player + dec e + jr .load_coords ; useless jr +.load_coords + ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 + add hl, bc + ld [hl], e + inc hl + ld [hl], d + inc hl + ld [hl], $fe + push hl + ld hl, wd472 + set 5, [hl] + pop hl + ret + +CalculatePikachuFacingDirection:: + ld a, $49 + ld [wSpritePikachuStateData1PictureID], a + ld a, $ff + ld [wSpritePikachuStateData1ImageIndex], a + ld a, [wPikachuSpawnState] + and a + jr z, .copy_player_facing + cp $1 + jr z, .copy_player_facing + cp $3 + jr z, .force_facing_down + cp $4 + jr z, .copy_player_facing + cp $6 + jr z, .copy_player_facing + cp $7 + jr z, .face_the_other_way + call ComputePikachuFacingDirection + ret + +.copy_player_facing + ld a, [wSpritePlayerStateData1FacingDirection] + ld [wSpritePikachuStateData1FacingDirection], a + ret + +.force_facing_down + ld a, SPRITE_FACING_DOWN + ld [wSpritePikachuStateData1FacingDirection], a + ret + +.face_the_other_way + ld a, [wSpritePlayerStateData1FacingDirection] + xor $4 + ld [wSpritePikachuStateData1FacingDirection], a + ret + +SetPikachuSpawnOutside:: + ld a, [wCurMap] + cp OAKS_LAB + jr z, .oaks_lab + cp ROUTE_22_GATE + jr z, .route_22_gate + cp MT_MOON_B1F + jr z, .mt_moon_2 + cp ROCK_TUNNEL_1F + jr z, .rock_tunnel_1 + ld a, [wCurMap] + ld hl, Pointer_fc64b + call Pikachu_IsInArray ; similar to IsInArray, but not the same + jr c, .map_list_1 + ld a, [wCurMap] + ld hl, Pointer_fc653 + call Pikachu_IsInArray + jr nc, .not_map_list_2 + ld a, [wSpritePlayerStateData1FacingDirection] + and a + jr nz, .not_map_list_2 + ld a, $3 + jr .load + +.route_22_gate + ld a, [wSpritePlayerStateData1FacingDirection] + and a + jr z, .rock_tunnel_1 + jr .not_map_list_2 + +.mt_moon_2 + ld a, $3 + jr .load + +.map_list_1 + ld a, $4 + jr .load + +.oaks_lab + ld a, $6 + jr .load + +.not_map_list_2 + ld a, $1 + jr .load + +.rock_tunnel_1 + ld a, $3 +.load + ld [wPikachuSpawnState], a + ret + +Pointer_fc64b:: + db VICTORY_ROAD_2F + db ROUTE_7_GATE + db ROUTE_8_GATE + db ROUTE_16_GATE_1F + db ROUTE_18_GATE_1F + db ROUTE_15_GATE_1F + db ROUTE_11_GATE_1F + db $ff + +Pointer_fc653:: + db VIRIDIAN_FOREST_NORTH_GATE + db CERULEAN_BADGE_HOUSE + db CERULEAN_TRASHED_HOUSE + db VERMILION_DOCK + db CELADON_MANSION_1F + db ROUTE_2_GATE + db FUCHSIA_GOOD_ROD_HOUSE + db $ff + +SetPikachuSpawnWarpPad:: + ld a, [wCurMap] + cp VIRIDIAN_FOREST_NORTH_GATE + jr z, .viridian_forest_exit + cp VIRIDIAN_FOREST_SOUTH_GATE + jr z, .viridian_forest_entrance + ld a, [wCurMap] + ld hl, Pointer_fc68e + call Pikachu_IsInArray + jr c, .in_array + jr .not_in_array + +.viridian_forest_exit + ld a, [wSpritePlayerStateData1FacingDirection] + cp SPRITE_FACING_UP + jr z, .in_array + jr .not_in_array + +.viridian_forest_entrance + ld a, [wSpritePlayerStateData1FacingDirection] + and a ; SPRITE_FACING_DOWN + jr z, .not_in_array + jr .in_array + +.not_in_array + ld a, $0 + jr .load_spawn_state + +.in_array + ld a, $1 +.load_spawn_state + ld [wPikachuSpawnState], a + ret + +Pointer_fc68e:: + db VIRIDIAN_FOREST + db SAFARI_ZONE_CENTER_REST_HOUSE + db SAFARI_ZONE_WEST_REST_HOUSE + db SAFARI_ZONE_EAST_REST_HOUSE + db SAFARI_ZONE_NORTH_REST_HOUSE + db SAFARI_ZONE_SECRET_HOUSE + db SILPH_CO_ELEVATOR + db CELADON_MART_ELEVATOR + db CINNABAR_LAB_TRADE_ROOM + db CINNABAR_LAB_METRONOME_ROOM + db CINNABAR_LAB_FOSSIL_ROOM + db $ff + +SetPikachuSpawnBackOutside:: + ld a, [wCurMap] + cp ROUTE_22_GATE + jr z, .asm_fc6a7 + cp ROUTE_2_GATE + jr z, .asm_fc6b0 + jr .asm_fc6bd + +.asm_fc6a7 + ld a, [wSpritePlayerStateData1FacingDirection] + cp SPRITE_FACING_UP + jr z, .asm_fc6b9 + jr .asm_fc6bd + +.asm_fc6b0 + ld a, [wSpritePlayerStateData1FacingDirection] + cp SPRITE_FACING_UP + jr z, .asm_fc6b9 + jr .asm_fc6bd + +.asm_fc6b9 + ld a, $1 + jr .asm_fc6c1 + +.asm_fc6bd + ld a, $3 + jr .asm_fc6c1 + +.asm_fc6c1 + ld [wPikachuSpawnState], a + ret + +SetPikachuOverworldStateFlag2:: + push hl + ld hl, wPikachuOverworldStateFlags + set 2, [hl] + pop hl + ret + +ResetPikachuOverworldStateFlag2:: + push hl + ld hl, wPikachuOverworldStateFlags + res 2, [hl] + pop hl + ret + +SpawnPikachu_:: + call ResetPikachuOverworldStateFlag2 + call TrySpawnPikachu + ret nc + + push bc + call WillPikachuSpawnOnTheScreen + pop bc + ret c + + ld bc, wSpritePikachuStateData1 + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + bit 7, [hl] + jp nz, Func_fc745 + ld a, [wFontLoaded] + bit 0, a + jp nz, Func_fc76a + call CheckPikachuFollowingPlayer + jp nz, Func_fc76a + ld a, [hl] + and $7f + cp $a + jr c, .valid + xor a +.valid + add a + ld e, a + ld d, 0 + ld hl, PointerTable_fc710 + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +PointerTable_fc710: + dw Func_fc793 + dw Func_fc7aa + dw Func_fc803 + dw asm_fc9c3 + dw asm_fca1c + dw asm_fc9ee + dw asm_fc87f + dw asm_fc904 + dw asm_fc937 + dw asm_fc969 + dw .nop + +.nop: + ret + +TrySpawnPikachu: + call ShouldPikachuSpawn + jr nc, .dont_spawn + ld a, [wSpritePikachuStateData1MovementStatus] + and a + jr nz, .already_spawned + push bc + push hl + call CalculatePikachuSpawnCoordsAndFacing + pop hl + pop bc +.already_spawned + scf + ret + +.dont_spawn + ld hl, wSpritePikachuStateData1ImageIndex + ld [hl], $ff + dec hl + ld [hl], $0 + xor a + ret + +Func_fc745: + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + res 7, [hl] + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], a + call CheckPikachuFollowingPlayer + jr nz, .okay + ; Have Pikachu face in the opposite direction of you + ld a, [wSpritePlayerStateData1FacingDirection] + xor $4 + ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 + add hl, bc + ld [hl], a +.okay + xor a + ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 + add hl, bc + ld [hli], a + ld [hl], a + call UpdatePikachuWalkingSprite + ret + +Func_fc76a: + xor a + ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 + add hl, bc + ld [hli], a + ld [hl], a + call UpdatePikachuWalkingSprite + call Func_fc82e + jr c, .skip + push bc + callfar InitializeSpriteScreenPosition + pop bc +.skip + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $1 + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $0 + call RefreshPikachuFollow + ret + +Func_fc793: + call RefreshPikachuFollow + push bc + callfar InitializeSpriteScreenPosition + pop bc + ld hl, wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 + add hl, bc + ld [hl], $ff + dec hl + ld [hl], $1 + ret + +Func_fc7aa: + call Func_fcc92 + jp c, Func_fc803 + dec a + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld de, Pointer_fc7e3 + add hl, de + ld d, h + ld e, l + ld a, [de] + inc de + ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 + add hl, bc + ld [hl], a + ld a, [de] + inc de + ld hl, wSpritePikachuStateData1XStepVector - wSpritePikachuStateData1 + add hl, bc + ld [hl], a + dec hl + dec hl + ld a, [de] + ld [hl], a + inc de + ld a, [de] + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], a + cp $4 + jp z, Func_fca0a + call AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer + jp c, FastPikachuFollow + jp NormalPikachuFollow + +Pointer_fc7e3: + db 0, 0 + db 1, 3 + db 4, 0 + db -1, 3 + db 8, -1 + db 0, 3 + db 12, 1 + db 0, 3 + db 0, 0 + db 1, 4 + db 4, 0 + db -1, 4 + db 8, -1 + db 0, 4 + db 12, 1 + db 0, 4 + +Func_fc803: + call Func_fcae2 + ret c + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + dec [hl] + jr nz, .asm_fc823 + push hl + call GetPikachuFollowCommand + pop hl + cp $5 + jr nc, Func_fc842 + ld [hl], $20 + call Random + and $c + ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 + add hl, bc + ld [hl], a +.asm_fc823 + xor a + ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 + add hl, bc + ld [hli], a + ld [hl], a + call UpdatePikachuWalkingSprite + ret + +Func_fc82e: + ld a, [wWalkCounter] + and a + ret z + scf + ret + +Func_fc835: + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $10 + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $1 + ret + +Func_fc842: + ld hl, $0 + push af + call Random + ldh a, [hRandomAdd] + and %11 + ld e, a + ld d, $0 + ld hl, PointerTable_fc85a + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + pop af + jp hl + +PointerTable_fc85a: + dw Func_fc862 + dw Func_fc8f8 + dw Func_fc92b + dw Func_fc95d + +Func_fc862: + dec a + add a + add a + and $c + ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 + add hl, bc + ld [hl], a + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $6 + xor a + ld [wd432], a + ld [wd433], a + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $11 +asm_fc87f: + ld a, [wd432] + ld e, a + ld a, [wd433] + ld d, a + call Func_fc82e + jr c, Func_fc8c7 + call SetPikachuOverworldStateFlag2 + ld hl, wSpritePikachuStateData1YPixels - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + sub e + ld e, a + inc hl + inc hl + ld a, [hl] + sub d + ld d, a + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + dec a + add a + add LOW(Pointer_fc8d6) + ld l, a + ld a, HIGH(Pointer_fc8d6) + adc 0 + ld h, a + ld a, [hli] + ld [wd432], a + add e + ld e, a + ld a, [hl] + ld [wd433], a + add d + ld d, a + ld hl, wSpritePikachuStateData1YPixels - wSpritePikachuStateData1 + add hl, bc + ld [hl], e + inc hl + inc hl + ld [hl], d + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + dec [hl] + ret nz + jp Func_fc835 + +Func_fc8c7: + ld hl, wSpritePikachuStateData1YPixels - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + sub e + ld [hl], a + inc hl + inc hl + ld a, [hl] + sub d + ld [hl], a + jp Func_fc835 + +Pointer_fc8d6: + db 0, 0 + db -2, 1 + db -4, 2 + db -2, 3 + db 0, 4 + db -2, 3 + db -4, 2 + db -2, 1 + db 0, 0 + db -2, -1 + db -4, -2 + db -2, -3 + db 0, -4 + db -2, -3 + db -4, -2 + db -2, -1 + db 0, 0 + +Func_fc8f8: + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $7 + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $30 +asm_fc904: + call Func_fc82e + jp c, Func_fc835 + call SetPikachuOverworldStateFlag2 + ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + inc a + cp $8 + ld [hl], a + jr nz, .asm_fc91f + xor a + ld [hli], a + ld a, [hl] + inc a + and %11 + ld [hl], a +.asm_fc91f + call UpdatePikachuWalkingSprite + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + dec [hl] + ret nz + jp Func_fc835 + +Func_fc92b: + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $20 + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $8 +asm_fc937: + call Func_fc82e + jp c, Func_fc835 + call SetPikachuOverworldStateFlag2 + ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + inc a + cp $8 + ld [hl], a + jr nz, .asm_fc951 + xor a + ld [hli], a + ld a, [hl] + xor $1 + ld [hl], a +.asm_fc951 + call UpdatePikachuWalkingSprite + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + dec [hl] + ret nz + jp Func_fc835 + +Func_fc95d: + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $20 + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $9 +asm_fc969: + call Func_fc82e + jp c, Func_fc835 + call SetPikachuOverworldStateFlag2 + ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + inc a + cp $8 + ld [hl], a + jr nz, .skip + xor a + ld [hl], a + ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + call .TurnClockwise + ld [hl], a +.skip + call UpdatePikachuWalkingSprite + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + dec [hl] + ret nz + jp Func_fc835 + +.TurnClockwise: + push hl + ld hl, .Facings + ld d, a +.loop + ld a, [hli] + cp d + jr nz, .loop + ld a, [hl] + pop hl + ret + +.TurnCounterclockwise: + push hl + ld hl, .Facings_End + ld d, a +.loop_ + ld a, [hld] + cp d + jr nz, .loop_ + ld a, [hl] + pop hl + ret + +.Facings: + db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT + db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT +.Facings_End: + +NormalPikachuFollow: + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $8 + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $3 + call AddPikachuStepVector +asm_fc9c3: + call TryDoubleAddPikachuStepVectorToScreenPixelCoords + call GetPikachuWalkingAnimationSpeed + call UpdatePikachuWalkingSprite + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + dec [hl] + ret nz + call ResetPikachuStepVector + call ComputePikachuFacingDirection + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $1 + ret + +FastPikachuFollow: + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $4 + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $5 + call AddPikachuStepVector +asm_fc9ee: + call DoubleAddPikachuStepVectorToScreenPixelCoords + call GetPikachuWalkingAnimationSpeed + call UpdatePikachuWalkingSprite + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + dec [hl] + ret nz + call ResetPikachuStepVector + call ComputePikachuFacingDirection + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $1 + ret + +Func_fca0a: + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + ld [hl], $8 + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $4 + call AddPikachuStepVector + call AddPikachuStepVector +asm_fca1c: + call DoubleAddPikachuStepVectorToScreenPixelCoords + call GetPikachuWalkingAnimationSpeed + call UpdatePikachuWalkingSprite + ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 + add hl, bc + dec [hl] + ret nz + call ResetPikachuStepVector + call ComputePikachuFacingDirection + ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 + add hl, bc + ld [hl], $1 + ret + +AddPikachuStepVector: + ld hl, wSpritePikachuStateData1YStepVector - wSpritePikachuStateData1 + add hl, bc + ld e, [hl] + inc hl + inc hl + ld d, [hl] + ld hl, wSpritePikachuStateData2MapY - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + add e + ld [hli], a + ld a, [hl] + add d + ld [hl], a + ret + +TryDoubleAddPikachuStepVectorToScreenPixelCoords: + ld a, [wWalkBikeSurfState] + cp $1 ; biking + jr nz, AddPikachuStepVectorToScreenPixelCoords + ld a, [wd736] + bit 6, a + jr nz, AddPikachuStepVectorToScreenPixelCoords +DoubleAddPikachuStepVectorToScreenPixelCoords: + ld hl, wSpritePikachuStateData1YStepVector - wSpritePikachuStateData1 + add hl, bc + ld a, [hli] + add a + add a + add [hl] + ld [hli], a + ld a, [hli] + add a + add a + add [hl] + ld [hl], a + ret + +AddPikachuStepVectorToScreenPixelCoords: + ld hl, wSpritePikachuStateData1YStepVector - wSpritePikachuStateData1 + add hl, bc + ld a, [hli] + add a + add [hl] + ld [hli], a + ld a, [hli] + add a + add [hl] + ld [hli], a + ret + +ResetPikachuStepVector: + ld hl, wSpritePikachuStateData1YStepVector - wSpritePikachuStateData1 + add hl, bc + xor a + ld [hli], a + inc hl + ld [hl], a + ret + +GetPikachuWalkingAnimationSpeed: + call ComparePikachuHappinessTo80 + ld d, $2 + jr nc, .happy + ld d, $5 +.happy + ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + inc a + cp d + jr nz, .dont_reset + xor a +.dont_reset + ld [hli], a + ret nz + ld a, [hl] + inc a + and $3 + ld [hl], a + ret + +UpdatePikachuWalkingSprite: + ld a, [wPikachuOverworldStateFlags] + bit 3, a + jr nz, .uninitialized + ld hl, wSpritePikachuStateData2ImageBaseOffset - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + dec a + swap a + ld d, a + ld a, [wd736] + bit 7, a + jr nz, .copy_player + ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 + add hl, bc + ld a, [hl] + or d + ld d, a + ld a, [wFontLoaded] + bit 0, a + jr z, .normal_get_sprite_index + call Func_fcae2 + ret c + jr .load_sprite_index + +.normal_get_sprite_index + ld hl, wSpritePikachuStateData1AnimFrameCounter - wSpritePikachuStateData1 + add hl, bc + ld a, d + or [hl] + ld d, a +.load_sprite_index + ld hl, wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 + add hl, bc + ld [hl], d + ret + +.uninitialized + ld hl, wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 + add hl, bc + ld [hl], $ff + ret + +.copy_player + ld a, [wSpritePlayerStateData1ImageIndex] + and $f + or d + ld [wSpritePikachuStateData1ImageIndex], a + ret + +Func_fcae2: + ld hl, wSpritePikachuStateData2MapY - wSpritePikachuStateData1 + add hl, bc + ld a, [wYCoord] + add $4 + cp [hl] + jr nz, .on_screen + inc hl + ld a, [wXCoord] + add $4 + cp [hl] + jr nz, .on_screen + ld hl, wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 + add hl, bc + ld [hl], $ff + scf + ret + +.on_screen + and a + ret + +IsPikachuRightNextToPlayer: + push bc + push de + push hl + ld bc, wSpritePikachuStateData1PictureID + ld a, [wXCoord] + add $4 + ld d, a + ld a, [wYCoord] + add $4 + ld e, a + ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + sub e + and a + jr z, .equal + cp $ff + jr z, .one_away + cp $1 + jr z, .one_away + jr .bad + +.one_away + ld hl, wSpritePlayerStateData2MapX - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + sub d + jr z, .good + jr .bad + +.equal + ld hl, wSpritePlayerStateData2MapX - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + sub d + cp $ff + jr z, .good + cp $1 + jr z, .good + and a + jr z, .good + jr .bad + +.good + pop hl + pop de + pop bc + scf + ret + +.bad + pop hl + pop de + pop bc + xor a + ret + +GetPikachuFacingDirectionAndReturnToE:: + call GetPikachuFacingDirection + ld e, a + ret + +GetPikachuFacingDirection: + ld bc, wSpritePikachuStateData1PictureID + ld a, [wXCoord] + add $4 + ld d, a + ld a, [wYCoord] + add $4 + ld e, a + ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + cp e + jr z, .asm_fcb71 + jr nc, .asm_fcb6e + ld a, SPRITE_FACING_UP + ret + +.asm_fcb6e + ld a, SPRITE_FACING_DOWN + ret + +.asm_fcb71 + ld hl, wSpritePlayerStateData2MapX - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + cp d + jr z, .asm_fcb81 + jr nc, .asm_fcb7e + ld a, SPRITE_FACING_LEFT + ret + +.asm_fcb7e + ld a, SPRITE_FACING_RIGHT + ret + +.asm_fcb81 + ld a, $ff ; standing + ret + +ClearPikachuFollowCommandBuffer: + push bc + ld hl, wPikachuFollowCommandBufferSize + ld [hl], $ff + inc hl + ld bc, $10 + xor a + call FillMemory + pop bc + ret + +AppendPikachuFollowCommandToBuffer: + ld hl, wPikachuFollowCommandBufferSize + inc [hl] + ld e, [hl] + ld d, 0 + ld hl, wPikachuFollowCommandBuffer + add hl, de + ld [hl], a + ret + +RefreshPikachuFollow: + call ClearPikachuFollowCommandBuffer + call ComputePikachuFollowCommand + ret c + call AppendPikachuFollowCommandToBuffer + ret + +ComputePikachuFollowCommand: + ld bc, wSpritePikachuStateData1PictureID + ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 + add hl, bc + ld a, [wYCoord] + add $4 + sub [hl] + jr z, .checkXCoord + jr c, .pikaAbovePlayer + call CheckAbsoluteValueLessThan2 + jr c, .return1 + ld a, $5 + and a + ret + +.return1 + ld a, $1 + and a + ret + +.pikaAbovePlayer + call CheckAbsoluteValueLessThan2 + jr c, .return2 + ld a, $6 + and a + ret + +.return2 + ld a, $2 + and a + ret + +.checkXCoord + ld hl, wSpritePlayerStateData2MapX - wSpritePlayerStateData1 + add hl, bc + ld a, [wXCoord] + add $4 + sub [hl] + jr z, .pikachuOnTopOfPlayer + jr c, .pikaToLeftOfPlayer + call CheckAbsoluteValueLessThan2 + jr c, .return4 + ld a, $8 + and a + ret + +.return4 + ld a, $4 + and a + ret + +.pikaToLeftOfPlayer + call CheckAbsoluteValueLessThan2 + jr c, .return3 + ld a, $7 + and a + ret + +.return3 + ld a, $3 + and a + ret + +.pikachuOnTopOfPlayer + scf + ret + +CheckAbsoluteValueLessThan2: + jr nc, .positive + cpl + inc a +.positive + cp $2 + ret + +Func_fcc08:: + call Func_fcc23 + ret nc + ld a, [wd736] + bit 6, a + jr nz, .asm_fcc1b + call Func_fcc42 + ret c + call AppendPikachuFollowCommandToBuffer + ret + +.asm_fcc1b + call Func_fcc64 + ret c + call AppendPikachuFollowCommandToBuffer + ret + +Func_fcc23: + ld a, [wPikachuOverworldStateFlags] + bit 5, a + jr nz, .asm_fcc40 + ld a, [wPikachuOverworldStateFlags] + bit 7, a + jr nz, .asm_fcc40 + ld a, [wd472] + bit 7, a + jr z, .asm_fcc40 + ld a, [wWalkBikeSurfState] + and a + jr nz, .asm_fcc40 + scf + ret + +.asm_fcc40 + and a + ret + +Func_fcc42: + xor a + ld a, [wPlayerDirection] + bit 3, a + jr nz, .asm_fcc58 + bit 2, a + jr nz, .asm_fcc5b + bit 1, a + jr nz, .asm_fcc5e + bit 0, a + jr nz, .asm_fcc61 + scf + ret + +.asm_fcc58 + ld a, $2 + ret + +.asm_fcc5b + ld a, $1 + ret + +.asm_fcc5e + ld a, $3 + ret + +.asm_fcc61 + ld a, $4 + ret + +Func_fcc64: + ld hl, wPikachuOverworldStateFlags + bit 6, [hl] + jr z, .asm_fcc6e + res 6, [hl] + ret + +.asm_fcc6e + set 6, [hl] + xor a + ld a, [wPlayerDirection] + bit 3, a + jr nz, .asm_fcc86 + bit 2, a + jr nz, .asm_fcc89 + bit 1, a + jr nz, .asm_fcc8c + bit 0, a + jr nz, .asm_fcc8f + scf + ret + +.asm_fcc86 + ld a, $6 + ret + +.asm_fcc89 + ld a, $5 + ret + +.asm_fcc8c + ld a, $7 + ret + +.asm_fcc8f + ld a, $8 + ret + +Func_fcc92: + ld hl, wPikachuFollowCommandBufferSize + ld a, [hl] + cp $ff + jr z, .asm_fccb0 + and a + jr z, .asm_fccb0 + dec [hl] + ld e, a + ld d, 0 + ld hl, wPikachuFollowCommandBuffer + add hl, de + inc e + ld a, $ff +.asm_fcca8 + ld d, [hl] + ldd [hl], a + ld a, d + dec e + jr nz, .asm_fcca8 + and a + ret + +.asm_fccb0 + scf + ret + +ComputePikachuFacingDirection:: + call GetPikachuFollowCommandIfBufferSizeNonzero + and a + jr z, .check_y + dec a + and $3 + add a + add a + jr .load + +.check_y + ld a, [wYCoord] + add $4 + ld d, a + ld a, [wXCoord] + add $4 + ld e, a + ld a, [wSpritePikachuStateData2MapY] + cp d + jr z, .check_x + ld a, SPRITE_FACING_DOWN + jr c, .load + ld a, SPRITE_FACING_UP + jr .load + +.check_x + ld a, [wSpritePikachuStateData2MapX] + cp e + jr z, .copy_from_player + ld a, SPRITE_FACING_RIGHT + jr c, .load + ld a, SPRITE_FACING_LEFT + jr .load + +.copy_from_player + ld a, [wSpritePlayerStateData1FacingDirection] +.load + ld [wSpritePikachuStateData1FacingDirection], a + ret + +GetPikachuFollowCommand: + ld hl, wPikachuFollowCommandBufferSize + ld a, [hl] + cp $ff + jr z, .asm_fccff + ld e, a + ld d, 0 + ld hl, wPikachuFollowCommandBuffer + add hl, de + ld a, [hl] + ret + +.asm_fccff + xor a + ret + +GetPikachuFollowCommandIfBufferSizeNonzero: + ld hl, wPikachuFollowCommandBufferSize + ld a, [hl] + cp $ff + jr z, .default + and a + jr z, .default + ld e, a + ld d, 0 + ld hl, wPikachuFollowCommandBuffer + add hl, de + ld a, [hl] + ret + +.default + xor a + ret + +AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer: + ld a, [wPikachuFollowCommandBufferSize] + cp $ff + ret z + cp $2 + jr nc, .set_carry + and a + ret + +.set_carry + scf + ret + +WillPikachuSpawnOnTheScreen: + ld h, HIGH(wSpriteStateData2) + ldh a, [hCurrentSpriteOffset] ; If we're here, this can only be $f0 + add wSpritePikachuStateData2MapY - wSpritePikachuStateData2 + ld l, a + ld b, [hl] + ld a, [wYCoord] + cp b + jr z, .same_y + jr nc, .not_on_screen + add (SCREEN_HEIGHT / 2) - 1 + cp b + jr c, .not_on_screen +.same_y + inc l + ld b, [hl] + ld a, [wXCoord] + cp b + jr z, .same_x + jr nc, .not_on_screen + add (SCREEN_WIDTH / 2) - 1 + cp b + jr c, .not_on_screen +.same_x + call .GetNPCCurrentTile + ld d, $60 + ld a, [hli] + ld e, a + cp d + jr nc, .not_on_screen + ld a, [hld] + cp d + jr nc, .not_on_screen + ld bc, -20 + add hl, bc + ld a, [hli] + cp d + jr nc, .not_on_screen + ld a, [hl] + cp d + jr c, .on_screen +.not_on_screen + ld h, HIGH(wSpriteStateData1) + ldh a, [hCurrentSpriteOffset] + add wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 + ld l, a + ld [hl], $ff + scf + jr .return + +.on_screen + ld h, HIGH(wSpriteStateData2) + ldh a, [hCurrentSpriteOffset] + add wSpritePikachuStateData2GrassPriority - wSpritePikachuStateData2 + ld l, a + ld a, [wGrassTile] + cp e + ld a, $0 + jr nz, .priority + ld a, $80 +.priority + ld [hl], a + and a +.return + ret + +.GetNPCCurrentTile: + ld h, HIGH(wSpriteStateData1) + ldh a, [hCurrentSpriteOffset] + add wSpritePikachuStateData1YPixels - wSpritePikachuStateData1 + ld l, a + ld a, [hli] + add $4 + and $f0 + srl a + ld c, a + ld b, $0 + inc l + ld a, [hl] + add $2 + srl a + srl a + srl a + add SCREEN_WIDTH + ld d, 0 + ld e, a + ld hl, wTileMap +REPT 5 + add hl, bc +ENDR + add hl, de + ret + +ComparePikachuHappinessTo80: +; preserves a and bc + push bc + push af + ld a, [wPikachuHappiness] + cp 80 + pop bc + ld a, b + pop bc + ret diff --git a/engine/pikachu/pikachu_movement.asm b/engine/pikachu/pikachu_movement.asm new file mode 100755 index 00000000..6b912e61 --- /dev/null +++ b/engine/pikachu/pikachu_movement.asm @@ -0,0 +1,1048 @@ +ApplyPikachuMovementData_:: + ld a, b + ld [wPikachuMovementScriptBank], a + ld a, l + ld [wPikachuMovementScriptAddress], a + ld a, h + ld [wPikachuMovementScriptAddress + 1], a + call .SwapSpriteStateData +.loop + call LoadPikachuMovementCommandData + jr nc, .done + call ExecutePikachuMovementCommand + jr .loop + +.done + call .SwapSpriteStateData + call DelayFrame + ret + +.SwapSpriteStateData: + ld a, [wUpdateSpritesEnabled] + push af + ld a, $ff + ld [wUpdateSpritesEnabled], a + push hl + push de + push bc + + ld hl, wSpritePlayerStateData1 + ld de, wSpritePikachuStateData1 + ld c, $10 + call .SwapBytes + + ld hl, wSpritePlayerStateData2 + ld de, wSpritePikachuStateData2 + ld c, $10 + call .SwapBytes + + pop bc + pop de + pop hl + pop af + ld [wUpdateSpritesEnabled], a + ret + +.SwapBytes: + ld b, [hl] + ld a, [de] + ld [hli], a + ld a, b + ld [de], a + inc de + dec c + jr nz, .SwapBytes + ret + +LoadPikachuMovementCommandData: + call GetPikachuMovementScriptByte + cp $3f + ret z + ld c, a + ld b, 0 + ld hl, PikachuMovementDatabase + add hl, bc + add hl, bc + add hl, bc + add hl, bc + ld a, [hli] + ld [wCurPikaMovementFunc1], a + ld a, [hli] + cp $80 + jr nz, .no_param + call GetPikachuMovementScriptByte +.no_param + ld [wCurPikaMovementParam1], a + ld a, [hli] + ld [wCurPikaMovementFunc2], a + ld a, [hli] + cp $80 + jr nz, .no_param2 + call GetPikachuMovementScriptByte +.no_param2 + ld [wCurPikaMovementParam2], a + xor a + ld [wd451], a + scf + ret + +ExecutePikachuMovementCommand: + xor a + ld [wPikachuMovementFlags], a + ld [wPikachuStepTimer], a + ld [wPikachuStepSubtimer], a + ld a, [wSpritePlayerStateData2GrassPriority] + push af +.loop + ld bc, wSpritePlayerStateData1 ; Currently holds Pikachu's sprite state data + ld a, [wCurPikaMovementFunc1] + ld hl, PikaMovementFunc1Jumptable + call .JumpTable + ld a, [wCurPikaMovementFunc2] + ld hl, PikaMovementFunc2Jumptable + call .JumpTable + call GetCoordsForPikachuShadow + call AnimatePikachuShadow + call DelayFrame + call DelayFrame + ld hl, wPikachuMovementFlags + bit 7, [hl] + jr z, .loop + pop af + ld [wSpritePlayerStateData2GrassPriority], a + scf + ret + +.JumpTable: + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +GetCoordsForPikachuShadow: + ld hl, wSpritePlayerStateData1ImageIndex - wSpritePlayerStateData1 + add hl, bc + ld a, [wCurPikaMovementSpriteImageIdx] + ld [hl], a + ld a, [wPikaSpriteY] + ld d, a + ld a, [wPikachuMovementYOffset] + add d + ld hl, wSpritePlayerStateData1YPixels - wSpritePlayerStateData1 + add hl, bc + ld [hl], a + ld a, [wPikaSpriteX] + ld d, a + ld a, [wPikachuMovementXOffset] + add d + ld hl, wSpritePlayerStateData1XPixels - wSpritePlayerStateData1 + add hl, bc + ld [hl], a + ld hl, wPikachuMovementFlags + bit 6, [hl] + ret z + ld hl, wSpritePlayerStateData2GrassPriority - wSpritePlayerStateData1 + add hl, bc + ld [hl], 0 + ret + +AnimatePikachuShadow: + ld hl, wPikachuMovementFlags + bit 6, [hl] + res 6, [hl] + ld hl, wd736 + res 6, [hl] + ret z + set 6, [hl] + call LoadPikachuShadowOAMData + ret + +PikachuMovementDatabase: + db $01, 1 - 1, $00, 1 - 1 ; $00 start + + db $03, $80, $01, 1 - 1 ; $01 + db $04, $80, $01, 1 - 1 ; $02 + db $05, $80, $01, 1 - 1 ; $03 + db $06, $80, $01, 1 - 1 ; $04 + db $07, $80, $01, 1 - 1 ; $05 + db $08, $80, $01, 1 - 1 ; $06 + db $09, $80, $01, 1 - 1 ; $07 + db $0a, $80, $01, 1 - 1 ; $08 + + db $03, $80, $06, 1 - 1 ; $09 + db $04, $80, $06, 1 - 1 ; $0a + db $05, $80, $06, 1 - 1 ; $0b + db $06, $80, $06, 1 - 1 ; $0c + db $07, $80, $06, 1 - 1 ; $0d + db $08, $80, $06, 1 - 1 ; $0e + db $09, $80, $06, 1 - 1 ; $0f + db $0a, $80, $06, 1 - 1 ; $10 + + db $03, $80, $03, $80 ; $11 + db $04, $80, $03, $80 ; $12 + db $05, $80, $03, $80 ; $13 + db $06, $80, $03, $80 ; $14 + db $07, $80, $03, $80 ; $15 + db $08, $80, $03, $80 ; $16 + db $09, $80, $03, $80 ; $17 + db $0a, $80, $03, $80 ; $18 + + db $03, $80, $07, $80 ; $19 + db $04, $80, $07, $80 ; $1a + db $05, $80, $07, $80 ; $1b + db $06, $80, $07, $80 ; $1c + + db $0b, (1 << 5) | 8 - 1, $02, 1 - 1 ; $1d step down + db $0c, (1 << 5) | 8 - 1, $02, 1 - 1 ; $1e step up + db $0d, (1 << 5) | 8 - 1, $02, 1 - 1 ; $1f step left + db $0e, (1 << 5) | 8 - 1, $02, 1 - 1 ; $20 step right + db $0f, (1 << 5) | 8 - 1, $02, 1 - 1 ; $21 step down left + db $10, (1 << 5) | 8 - 1, $02, 1 - 1 ; $22 step down right + db $11, (1 << 5) | 8 - 1, $02, 1 - 1 ; $23 step up left + db $12, (1 << 5) | 8 - 1, $02, 1 - 1 ; $24 step up right + + db $0b, 16 - 1, $02, 1 - 1 ; $25 slide down + db $0c, 16 - 1, $02, 1 - 1 ; $26 slide up + db $0d, 16 - 1, $02, 1 - 1 ; $27 slide left + db $0e, 16 - 1, $02, 1 - 1 ; $28 slide right + db $0f, 16 - 1, $02, 1 - 1 ; $29 slide down left + db $10, 16 - 1, $02, 1 - 1 ; $2a slide down right + db $11, 16 - 1, $02, 1 - 1 ; $2b slide up left + db $12, 16 - 1, $02, 1 - 1 ; $2c slide up right + + db $0b, 16 - 1, $08, (1 << 4) | 8 - 1 ; $2d hop down + db $0c, 16 - 1, $08, (1 << 4) | 8 - 1 ; $2e hop up + db $0d, 16 - 1, $08, (1 << 4) | 8 - 1 ; $2f hop left + db $0e, 16 - 1, $08, (1 << 4) | 8 - 1 ; $30 hop right + db $0f, 16 - 1, $08, (1 << 4) | 8 - 1 ; $31 hop down left + db $10, 16 - 1, $08, (1 << 4) | 8 - 1 ; $32 hop down right + db $11, 16 - 1, $08, (1 << 4) | 8 - 1 ; $33 hop up left + db $12, 16 - 1, $08, (1 << 4) | 8 - 1 ; $34 hop up right + + db $13, 16 - 1, $06, 1 - 1 ; $35 look down + db $14, 16 - 1, $06, 1 - 1 ; $36 look up + db $15, 16 - 1, $06, 1 - 1 ; $37 look left + db $16, 16 - 1, $06, 1 - 1 ; $38 look right + + db $02, $80, $04, 1 - 1 ; $39 + db $02, $80, $05, 1 - 1 ; $3a + db $02, $80, $03, $80 ; $3b + db $02, $80, $07, $80 ; $3c + db $02, $80, $09, $80 ; $3d + db $02, $80, $06, 1 - 1 ; $3e + +PikaMovementFunc1Jumptable: + dw PikaMovementFunc1_EndCommand_ ; 00 + dw PikaMovementFunc1_LoadPikachuCurrentPosition ; 01 + dw PikaMovementFunc1_DelayFrames ; 02 + dw PikaMovementFunc1_WalkInCurrentFacingDirection ; 03 + dw PikaMovementFunc1_WalkInOppositeFacingDirection ; 04 + dw PikaMovementFunc1_StepTurningCounterclockwise ; 05 + dw PikaMovementFunc1_StepTurningClockwise ; 06 + dw PikaMovementFunc1_StepForwardLeft ; 07 + dw PikaMovementFunc1_StepForwardRight ; 08 + dw PikaMovementFunc1_StepBackwardLeft ; 09 + dw PikaMovementFunc1_StepBackwardRight ; 0a + dw PikaMovementFunc1_MoveDown ; 0b + dw PikaMovementFunc1_MoveUp ; 0c + dw PikaMovementFunc1_MoveLeft ; 0d + dw PikaMovementFunc1_MoveRight ; 0e + dw PikaMovementFunc1_MoveDownLeft ; 0f + dw PikaMovementFunc1_MoveDownRight ; 10 + dw PikaMovementFunc1_MoveUpLeft ; 11 + dw PikaMovementFunc1_MoveUpRight ; 12 + dw PikaMovementFunc1_LookDown ; 13 + dw PikaMovementFunc1_LookUp ; 14 + dw PikaMovementFunc1_LookLeft ; 15 + dw PikaMovementFunc1_LookRight ; 16 + dw PikaMovementFunc1_EndCommand_ ; 17 + +PikaMovementFunc1_EndCommand: + ld a, [wPikachuMovementFlags] + set 7, a + ld [wPikachuMovementFlags], a + ret + +PikaMovementFunc1_EndCommand_: + call PikaMovementFunc1_EndCommand + ret + +PikaMovementFunc1_LoadPikachuCurrentPosition: + ld hl, wSpritePlayerStateData1YPixels - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + ld [wPikaSpriteY], a + ld hl, wSpritePlayerStateData1XPixels - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + ld [wPikaSpriteX], a + xor a + ld [wPikachuMovementYOffset], a + ld [wPikachuMovementXOffset], a + call PikaMovementFunc1_EndCommand + ret + +PikaMovementFunc1_DelayFrames: + call CheckPikachuStepTimer1 + ret nz + call PikaMovementFunc1_EndCommand + ret + +PikaMovementFunc1_WalkInCurrentFacingDirection: + call GetPikachuFacing + jr PikaMovementFunc1_ApplyStepVector + +PikaMovementFunc1_WalkInOppositeFacingDirection: + call GetPikachuFacing + xor %100 + jr PikaMovementFunc1_ApplyStepVector + +PikaMovementFunc1_StepTurningCounterclockwise: + call GetPikachuFacing + ld hl, .Data + call PikaMovementFunc1_GetNextFacing + jr PikaMovementFunc1_ApplyStepVector + +.Data: + db SPRITE_FACING_DOWN, PIKASTEPDIR_RIGHT << 2 + db SPRITE_FACING_UP, PIKASTEPDIR_LEFT << 2 + db SPRITE_FACING_LEFT, PIKASTEPDIR_DOWN << 2 + db SPRITE_FACING_RIGHT, PIKASTEPDIR_UP << 2 + db $ff + +PikaMovementFunc1_StepTurningClockwise: + call GetPikachuFacing + ld hl, .Data + call PikaMovementFunc1_GetNextFacing + jr PikaMovementFunc1_ApplyStepVector + +.Data: + db SPRITE_FACING_DOWN, PIKASTEPDIR_LEFT << 2 + db SPRITE_FACING_UP, PIKASTEPDIR_RIGHT << 2 + db SPRITE_FACING_LEFT, PIKASTEPDIR_UP << 2 + db SPRITE_FACING_RIGHT, PIKASTEPDIR_DOWN << 2 + db $ff + +PikaMovementFunc1_StepForwardLeft: + call GetPikachuFacing + ld hl, .Data + call PikaMovementFunc1_GetNextFacing + jr PikaMovementFunc1_ApplyStepVector + +.Data: + db SPRITE_FACING_DOWN, PIKASTEPDIR_DOWN_RIGHT << 2 + db SPRITE_FACING_UP, PIKASTEPDIR_UP_LEFT << 2 + db SPRITE_FACING_LEFT, PIKASTEPDIR_DOWN_LEFT << 2 + db SPRITE_FACING_RIGHT, PIKASTEPDIR_UP_RIGHT << 2 + +PikaMovementFunc1_StepForwardRight: + call GetPikachuFacing + ld hl, .Data + call PikaMovementFunc1_GetNextFacing + jr PikaMovementFunc1_ApplyStepVector + +.Data: + db SPRITE_FACING_DOWN, PIKASTEPDIR_DOWN_LEFT << 2 + db SPRITE_FACING_UP, PIKASTEPDIR_UP_RIGHT << 2 + db SPRITE_FACING_LEFT, PIKASTEPDIR_UP_LEFT << 2 + db SPRITE_FACING_RIGHT, PIKASTEPDIR_DOWN_RIGHT << 2 + +PikaMovementFunc1_StepBackwardLeft: + call GetPikachuFacing + ld hl, .Data + call PikaMovementFunc1_GetNextFacing + jr PikaMovementFunc1_ApplyStepVector + +.Data: + db SPRITE_FACING_DOWN, PIKASTEPDIR_UP_RIGHT << 2 + db SPRITE_FACING_UP, PIKASTEPDIR_DOWN_LEFT << 2 + db SPRITE_FACING_LEFT, PIKASTEPDIR_DOWN_RIGHT << 2 + db SPRITE_FACING_RIGHT, PIKASTEPDIR_UP_LEFT << 2 + +PikaMovementFunc1_StepBackwardRight: + call GetPikachuFacing + ld hl, .Data + call PikaMovementFunc1_GetNextFacing + jr PikaMovementFunc1_ApplyStepVector + +.Data: + db SPRITE_FACING_DOWN, PIKASTEPDIR_UP_LEFT << 2 + db SPRITE_FACING_UP, PIKASTEPDIR_DOWN_RIGHT << 2 + db SPRITE_FACING_LEFT, PIKASTEPDIR_UP_RIGHT << 2 + db SPRITE_FACING_RIGHT, PIKASTEPDIR_DOWN_LEFT << 2 + +PikaMovementFunc1_ApplyStepVector: + rrca + rrca + and $7 + ld e, a + call GetPikachuStepVectorMagnitude + ld d, a + call UpdatePikachuPosition + call CheckPikachuStepTimer1 + ret nz + call PikaMovementFunc1_EndCommand + ret + +PikaMovementFunc1_GetNextFacing: + push de + ld d, a +.loop + ld a, [hli] + cp d + jr z, .found + inc hl + cp $ff + jr nz, .loop + pop de + ret + +.found + ld a, [hl] + pop de + scf + ret + +PikaMovementFunc1_MoveDown: + ld a, PIKASTEPDIR_DOWN + jr PikaMovementFunc1_ApplyFacingAndMove + +PikaMovementFunc1_MoveUp: + ld a, PIKASTEPDIR_UP + jr PikaMovementFunc1_ApplyFacingAndMove + +PikaMovementFunc1_MoveLeft: + ld a, PIKASTEPDIR_LEFT + jr PikaMovementFunc1_ApplyFacingAndMove + +PikaMovementFunc1_MoveRight: + ld a, PIKASTEPDIR_RIGHT + jr PikaMovementFunc1_ApplyFacingAndMove + +PikaMovementFunc1_MoveDownLeft: + ld e, PIKASTEPDIR_DOWN_LEFT + jr PikaMovementFunc1_MoveDiagonally + +PikaMovementFunc1_MoveDownRight: + ld e, PIKASTEPDIR_DOWN_RIGHT + jr PikaMovementFunc1_MoveDiagonally + +PikaMovementFunc1_MoveUpLeft: + ld e, PIKASTEPDIR_UP_LEFT + jr PikaMovementFunc1_MoveDiagonally + +PikaMovementFunc1_MoveUpRight: + ld e, PIKASTEPDIR_UP_RIGHT + jr PikaMovementFunc1_MoveDiagonally + +PikaMovementFunc1_ApplyFacingAndMove: + ld e, a + call SetPikachuFacing +PikaMovementFunc1_MoveDiagonally: + call GetPikachuStepVectorMagnitude + ld d, a + push de + call UpdatePikachuPosition + pop de + call CheckPikachuStepTimer1 + ret nz + ld a, e + call ApplyPikachuStepVector + call PikaMovementFunc1_EndCommand + ret + +PikaMovementFunc1_LookDown: + ld a, PIKASTEPDIR_DOWN + jr PikaMovementFunc1_ApplyFacing + +PikaMovementFunc1_LookUp: + ld a, PIKASTEPDIR_UP + jr PikaMovementFunc1_ApplyFacing + +PikaMovementFunc1_LookLeft: + ld a, PIKASTEPDIR_LEFT + jr PikaMovementFunc1_ApplyFacing + +PikaMovementFunc1_LookRight: + ld a, PIKASTEPDIR_RIGHT + jr PikaMovementFunc1_ApplyFacing + +PikaMovementFunc1_ApplyFacing: + call SetPikachuFacing + call PikaMovementFunc1_EndCommand + ret + +UpdatePikachuPosition: + push de + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + pop de + ld a, d + jp hl + +.Jumptable: + dw .Down + dw .Up + dw .Left + dw .Right + dw .DownLeft + dw .DownRight + dw .UpLeft + dw .UpRight + +.Down: + ld d, 0 + ld e, a + jr .ApplyVector + +.Up: + ld d, 0 + cpl + inc a + ld e, a + jr .ApplyVector + +.Left: + cpl + inc a + ld d, a + ld e, 0 + jr .ApplyVector + +.Right: + ld d, a + ld e, 0 + jr .ApplyVector + +.DownLeft: + ld e, a + cpl + inc a + ld d, a + jr .ApplyVector + +.DownRight: + ld e, a + ld d, a + jr .ApplyVector + +.UpLeft: + cpl + inc a + ld e, a + ld d, a + jr .ApplyVector + +.UpRight: + ld d, a + cpl + inc a + ld e, a + jr .ApplyVector + +.ApplyVector: + ld a, [wPikaSpriteX] + add d + ld [wPikaSpriteX], a + ld a, [wPikaSpriteY] + add e + ld [wPikaSpriteY], a + ret + +PikaMovementFunc2Jumptable: + dw PikaMovementFunc2_ResetFrameCounterAndFaceCurrent ; 0 + dw PikaMovementFunc2_UpdateSpriteImageIdxWithPreviousImageIdxDirection ; 1 + dw PikaMovementFunc2_UpdateSpriteImageIdxWithFacing ; 2 + dw PikaMovementFunc2_TurnParameter ; 3 + dw PikaMovementFunc2_TurnClockwise ; 4 + dw PikaMovementFunc2_TurnCounterClockwise ; 5 + dw PikaMovementFunc2_CopySpriteImageIdxDirectionToSpriteImageIdx ; 6 + dw PikaMovementFunc2_UpdateJumpWithPreviousImageIdxDirection ; 7 + dw PikaMovementFunc2_UpdateJumpWithFacing ; 8 + dw PikaMovementFunc2_CopyFacingToJump ; 9 + dw PikaMovementFunc2_nop ; 10 + +PikaMovement_SetSpawnShadow: + ld hl, wPikachuMovementFlags + set 6, [hl] + ret + +PikaMovementFunc2_ResetFrameCounterAndFaceCurrent: + ld hl, wSpritePlayerStateData1IntraAnimFrameCounter - wSpritePlayerStateData1 + add hl, bc + xor a + ld [hli], a + ld [hl], a + call PikaMovementFunc2_GetImageBaseOffset + ld d, a + call GetPikachuFacing + or d + ld [wCurPikaMovementSpriteImageIdx], a + ret + +PikaMovementFunc2_nop: + ret + +PikaMovementFunc2_CopySpriteImageIdxDirectionToSpriteImageIdx: + call PikaMovementFunc2_GetImageBaseOffset + ld d, a + call PikaMovementFunc2_GetSpriteImageIdxDirection + or d + ld [wCurPikaMovementSpriteImageIdx], a + ret + +PikaMovementFunc2_UpdateSpriteImageIdxWithFacing: + call PikaMovementFunc2_GetImageBaseOffset + ld d, a + call GetPikachuFacing + or d + ld d, a + jr PikaMovementFunc2_UpdateSpriteImageIdx + +PikaMovementFunc2_UpdateSpriteImageIdxWithPreviousImageIdxDirection: + call PikaMovementFunc2_GetImageBaseOffset + ld d, a + call PikaMovementFunc2_GetSpriteImageIdxDirection + or d + ld d, a +PikaMovementFunc2_UpdateSpriteImageIdx: + ld hl, wSpritePlayerStateData1AnimFrameCounter - wSpritePlayerStateData1 + add hl, bc + call CheckPikachuStepTimer2 ; does not preserve hl + jr nz, .skip + inc [hl] +.skip + ld a, [hl] + rrca + rrca + and 3 + or d + ld [wCurPikaMovementSpriteImageIdx], a + ret + +PikaMovementFunc2_UpdateJumpWithFacing: + call GetPikachuFacing + ld d, a + jr PikaMovementFunc2_UpdateJump + +PikaMovementFunc2_UpdateJumpWithPreviousImageIdxDirection: + call PikaMovementFunc2_GetSpriteImageIdxDirection + ld d, a +PikaMovementFunc2_UpdateJump: + call PikaMovementFunc2_GetImageBaseOffset + or d + ld d, a + call PikaMovementFunc2_Timer + or d + ld [wCurPikaMovementSpriteImageIdx], a + call PikaMovementFunc_Sine + ld [wPikachuMovementYOffset], a + and a + ret z + call PikaMovement_SetSpawnShadow + ret + +PikaMovementFunc2_CopyFacingToJump: + call GetPikachuFacing + ld d, a + call PikaMovementFunc2_GetImageBaseOffset + or d + ld [wCurPikaMovementSpriteImageIdx], a + call PikaMovementFunc_Sine + ld [wPikachuMovementYOffset], a + ret + +PikaMovementFunc2_TurnParameter: + ld a, [wCurPikaMovementParam2] + and $40 + cp $40 + jr z, PikaMovementFunc2_TurnClockwise + jr PikaMovementFunc2_TurnCounterClockwise + +PikaMovementFunc2_TurnClockwise: + call PikaMovementFunc2_GetSpriteImageIdxDirection + ld d, a + call CheckPikachuStepTimer2 + jr nz, .skip + ld hl, Data_fd731 +.loop + ld a, [hli] + cp d + jr nz, .loop + ld d, [hl] +.skip + call PikaMovementFunc2_GetImageBaseOffset + or d + ld [wCurPikaMovementSpriteImageIdx], a + ret + +PikaMovementFunc2_TurnCounterClockwise: + call PikaMovementFunc2_GetSpriteImageIdxDirection + ld d, a + call CheckPikachuStepTimer2 + jr nz, .skip + ld hl, Data_fd731End +.loop + ld a, [hld] + cp d + jr nz, .loop + ld d, [hl] +.skip + call PikaMovementFunc2_GetImageBaseOffset + or d + ld [wCurPikaMovementSpriteImageIdx], a + ret + +Data_fd731: + db SPRITE_FACING_DOWN + db SPRITE_FACING_LEFT + db SPRITE_FACING_UP + db SPRITE_FACING_RIGHT + db SPRITE_FACING_DOWN +Data_fd731End: + +PikaMovementFunc2_Timer: + push hl + ld hl, wSpritePlayerStateData1IntraAnimFrameCounter - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + inc a + and $3 + ld [hli], a + jr nz, .load_pop + ld a, [hl] + inc a + and $3 + ld [hl], a +.load_pop + ld a, [hl] + pop hl + ret + +PikaMovementFunc2_GetImageBaseOffset: + push hl + ld hl, wSpritePlayerStateData2ImageBaseOffset - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + dec a + swap a + pop hl + ret + +PikaMovementFunc2_GetSpriteImageIdxDirection: + push hl + ld hl, wSpritePlayerStateData1ImageIndex - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + and $c + pop hl + ret + +GetPikachuFacing: + push hl + ld hl, wSpritePlayerStateData1FacingDirection - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + and $c + pop hl + ret + +SetPikachuFacing: + push hl + ld hl, wSpritePlayerStateData1FacingDirection - wSpritePlayerStateData1 + add hl, bc + add a + add a + and $c + ld [hl], a + pop hl + ret + +CheckPikachuStepTimer1: + ld hl, wPikachuStepTimer + inc [hl] + ld a, [wCurPikaMovementParam1] + and $1f + inc a + cp [hl] + ret nz + ld [hl], 0 + ret + +GetPikachuStepVectorMagnitude: + ; *XX***** + ld a, [wCurPikaMovementParam1] + swap a + rrca + and $3 + inc a + ret + +CheckPikachuStepTimer2: + ld hl, wPikachuStepSubtimer + inc [hl] + ld a, [wCurPikaMovementParam2] + and $f + inc a + cp [hl] + ret nz + ld [hl], 0 + ret + +PikaMovementFunc_Sine: + call .GetArgument + ld a, [wPikachuStepSubtimer] + add e + ld [wPikachuStepSubtimer], a + add $20 + ld e, a + push hl + push bc + call Sine_e + pop bc + pop hl + ret + +.GetArgument: + ld a, [wCurPikaMovementParam2] + and $f + inc a + ld d, a + ld a, [wCurPikaMovementParam2] + swap a + and $7 + ld e, a + ld a, 1 + jr z, .okay +.loop + add a + dec e + jr nz, .loop +.okay + ld e, a + ret + +ApplyPikachuStepVector: + push bc + ld c, a + ld b, 0 + ld hl, .StepVectors + add hl, bc + add hl, bc + ld d, [hl] + inc hl + ld e, [hl] + pop bc + ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 + add hl, bc + ld a, [hl] + add e + ld [hli], a + ld a, [hl] + add d + ld [hl], a + ret + +.StepVectors: + db 0, 1 + db 0, -1 + db -1, 0 + db 1, 0 + db -1, 1 + db 1, 1 + db -1, -1 + db 1, -1 + +LoadPikachuShadowOAMData: + push bc + push de + push hl + + ld bc, wOAMBuffer + 4 * 36 + ld a, [wPikaSpriteY] + ld e, a + ld a, [wPikaSpriteX] + ld d, a + ld hl, .OAMData + call .LoadOAMData + + pop hl + pop de + pop bc + ret + +.OAMData: + db 2 + db $0c, $00, $ff, 0 + db $0c, $08, $ff, 1 << OAM_X_FLIP + +.LoadOAMData: + ld a, e + add $10 + ld e, a + ld a, d + add $8 + ld d, a + ld a, [hli] +.loop + push af + ld a, [hli] + add e + ld [bc], a + inc bc + ld a, [hli] + add d + ld [bc], a + inc bc + ld a, [hli] + ld [bc], a + inc bc + ld a, [hli] + ld [bc], a + inc bc + pop af + dec a + jr nz, .loop + ret + +LoadPikachuShadowIntoVRAM:: + ld hl, vNPCSprites2 + $7f * $10 + ld de, LedgeHoppingShadowGFX_3F + lb bc, BANK(LedgeHoppingShadowGFX_3F), (LedgeHoppingShadowGFX_3FEnd - LedgeHoppingShadowGFX_3F) / 8 + jp CopyVideoDataDoubleAlternate + +LedgeHoppingShadowGFX_3F: +INCBIN "gfx/overworld/shadow.1bpp" +LedgeHoppingShadowGFX_3FEnd: + +LoadPikachuBallIconIntoVRAM: + ld hl, vNPCSprites2 + $7e * $10 + ld de, OverworldPikachuBallGFX + lb bc, BANK(OverworldPikachuBallGFX), 1 + jp CopyVideoDataDoubleAlternate + +Func_fd851: + ld hl, vNPCSprites + $c * $10 + ld a, 3 +.loop + push af + push hl + ld de, OverworldPikachuBallGFX + lb bc, BANK(OverworldPikachuBallGFX), 4 + call CopyVideoDataAlternate + pop hl + ld de, 4 * $10 + add hl, de + pop af + dec a + jr nz, .loop + ret + +OverworldPikachuBallGFX: +INCBIN "gfx/overworld/pikachu_ball.2bpp" + +LoadPikachuSpriteIntoVRAM: + ld de, PikachuSprite + lb bc, BANK(PikachuSprite), (SandshrewSprite - PikachuSprite) / 32 + ld hl, vNPCSprites + $c * $10 + push bc + call CopyVideoDataAlternate + ld de, PikachuSprite + $c * $10 + ld hl, vNPCSprites2 + $c * $10 + ldh a, [hFFFC] + and a + jr z, .load + ld de, PikachuSprite + $c * $10 + ld hl, vNPCSprites2 + $4c * $10 +.load + pop bc + call CopyVideoDataAlternate + call LoadPikachuShadowIntoVRAM + call LoadPikachuBallIconIntoVRAM + ret + +PikachuPewterPokecenterCheck: + ld a, [wCurMap] + cp PEWTER_POKECENTER + ret nz + call EnablePikachuFollowingPlayer + call StarterPikachuEmotionCommand_turnawayfromplayer + ret + +PikachuFanClubCheck: + ld a, [wCurMap] + cp POKEMON_FAN_CLUB + ret nz + call EnablePikachuFollowingPlayer + call StarterPikachuEmotionCommand_turnawayfromplayer + ret + +PikachuBillsHouseCheck: + ld a, [wCurMap] + cp BILLS_HOUSE + ret nz + call EnablePikachuFollowingPlayer + ret + +Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3: + call LoadCurrentMapView + call UpdateSprites + call Delay3 + ret + +Cosine_e: ; cosine? + ld a, e + add $10 + jr asm_fd908 + +Sine_e: ; sine? + ld a, e +asm_fd908: + and $3f + cp $20 + jr nc, .asm_fd913 + call GetSine + ld a, h + ret + +.asm_fd913 + and $1f + call GetSine + ld a, h + cpl + inc a + ret + +GetSine: + ld e, a + ld a, d + ld d, 0 + ld hl, SineWave_3f + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, 0 +.asm_fd92b + srl a + jr nc, .asm_fd930 + add hl, de +.asm_fd930 + sla e + rl d + and a + jr nz, .asm_fd92b + ret + +SineWave_3f: + sine_wave $100 diff --git a/engine/pikachu/pikachu_pcm.asm b/engine/pikachu/pikachu_pcm.asm new file mode 100755 index 00000000..bf1aa57f --- /dev/null +++ b/engine/pikachu/pikachu_pcm.asm @@ -0,0 +1,154 @@ +PlayPikachuSoundClip:: + ld a, e + ld e, a + ld d, $0 + ld hl, PikachuCriesPointerTable + add hl, de + add hl, de + add hl, de + ld b, [hl] ; bank of pikachu cry data + inc hl + ld a, [hli] ; cry data pointer + ld h, [hl] + ld l, a + ld c, $4 +.loop + dec c + jr z, .done_delay + call DelayFrame + jr .loop + +.done_delay + di + push bc + push hl + ld a, $80 + ldh [rNR52], a + ld a, $77 + ldh [rNR50], a + xor a + ldh [rNR30], a + ld hl, rWave_0 ; wave data + ld de, wRedrawRowOrColumnSrcTiles +.saveWaveDataLoop + ld a, [hl] + ld [de], a + inc de + ld a, $ff + ld [hli], a + ld a, l + cp $40 ; end of wave data + jr nz, .saveWaveDataLoop + ld a, $80 + ldh [rNR30], a + ldh a, [rNR51] + or $44 + ldh [rNR51], a + ld a, $ff + ldh [rNR31], a + ld a, $20 + ldh [rNR32], a + ld a, $ff + ldh [rNR33], a + ld a, $87 + ldh [rNR34], a + pop hl + pop bc + call PlayPikachuPCM + xor a + ld [wc0f3], a + ld [wc0f4], a + ld a, $80 + ldh [rNR52], a + xor a + ldh [rNR30], a + ld hl, rWave_0 + ld de, wRedrawRowOrColumnSrcTiles +.reloadWaveDataLoop + ld a, [de] + inc de + ld [hli], a + ld a, l + cp $40 ; end of wave data + jr nz, .reloadWaveDataLoop + ld a, $80 + ldh [rNR30], a + ldh a, [rNR51] + and $bb + ldh [rNR51], a + xor a + ld [wChannelSoundIDs + Ch5], a + ld [wChannelSoundIDs + Ch6], a + ld [wChannelSoundIDs + Ch7], a + ld [wChannelSoundIDs + Ch8], a + ldh a, [hLoadedROMBank] + ei + ret + +PikachuCriesPointerTable:: +; format: +; db bank +; dw pointer to cry + +; bank 21 + pikacry_def PikachuCry1 + pikacry_def PikachuCry2 + pikacry_def PikachuCry3 + pikacry_def PikachuCry4 + +; bank 22 + pikacry_def PikachuCry5 + pikacry_def PikachuCry6 + pikacry_def PikachuCry7 + +; bank 23 + pikacry_def PikachuCry8 + pikacry_def PikachuCry9 + pikacry_def PikachuCry10 + +; bank 24 + pikacry_def PikachuCry11 + pikacry_def PikachuCry12 + pikacry_def PikachuCry13 + +; bank 25 + pikacry_def PikachuCry14 + pikacry_def PikachuCry15 + +; banks 31-34, in no particular order + + pikacry_def PikachuCry16 + pikacry_def PikachuCry17 + pikacry_def PikachuCry18 + pikacry_def PikachuCry19 + pikacry_def PikachuCry20 + pikacry_def PikachuCry21 + pikacry_def PikachuCry22 + pikacry_def PikachuCry23 + pikacry_def PikachuCry24 + pikacry_def PikachuCry25 + pikacry_def PikachuCry26 + +; bank 35 + pikacry_def PikachuCry27 + pikacry_def PikachuCry28 + pikacry_def PikachuCry29 + pikacry_def PikachuCry30 + pikacry_def PikachuCry31 + +; bank 36 + pikacry_def PikachuCry32 + pikacry_def PikachuCry33 + pikacry_def PikachuCry34 + +; bank 37 + pikacry_def PikachuCry35 + pikacry_def PikachuCry36 + +; banks 36-38 + pikacry_def PikachuCry37 + pikacry_def PikachuCry38 + pikacry_def PikachuCry39 + pikacry_def PikachuCry40 + pikacry_def PikachuCry41 + pikacry_def PikachuCry42 diff --git a/engine/pikachu/pikachu_pic_animation.asm b/engine/pikachu/pikachu_pic_animation.asm new file mode 100755 index 00000000..33a3e504 --- /dev/null +++ b/engine/pikachu/pikachu_pic_animation.asm @@ -0,0 +1,855 @@ +GetPikaPicAnimationScriptIndex: + ld hl, PikachuMoodLookupTable + ld a, [wPikachuMood] + ld d, a +.get_mood_param + ld a, [hli] + inc hl + cp d + jr c, .get_mood_param + dec hl + ld e, [hl] + ld hl, PikaPicAnimationScriptPointerLookupTable + ld a, [wPikachuHappiness] + ld d, a + ld bc, 6 +.get_happiness_param + ld a, [hl] + cp d + jr nc, .got_animation + add hl, bc + jr .get_happiness_param + +.got_animation + ld d, 0 + add hl, de + ld a, [hl] + ret + +PikachuMoodLookupTable: +; First byte: mood threshold +; Second byte: column index in PikaPicAnimationScriptPointerLookupTable + db 40, 1 + db 127, 2 + db 128, 3 + db 210, 4 + db 255, 5 + +PikaPicAnimationScriptPointerLookupTable: +; First byte: happiness threshold +; Remaining bytes: loaded based on Pikachu's mood + db 50 + dpikapic PikaPicAnimScript14 + dpikapic PikaPicAnimScript14 + dpikapic PikaPicAnimScript6 + dpikapic PikaPicAnimScript13 + dpikapic PikaPicAnimScript13 + + db 100 + dpikapic PikaPicAnimScript9 + dpikapic PikaPicAnimScript9 + dpikapic PikaPicAnimScript5 + dpikapic PikaPicAnimScript12 + dpikapic PikaPicAnimScript12 + + db 130 + dpikapic PikaPicAnimScript3 + dpikapic PikaPicAnimScript3 + dpikapic PikaPicAnimScript1 + dpikapic PikaPicAnimScript8 + dpikapic PikaPicAnimScript8 + + db 160 + dpikapic PikaPicAnimScript3 + dpikapic PikaPicAnimScript3 + dpikapic PikaPicAnimScript4 + dpikapic PikaPicAnimScript15 + dpikapic PikaPicAnimScript15 + + db 200 + dpikapic PikaPicAnimScript17 + dpikapic PikaPicAnimScript17 + dpikapic PikaPicAnimScript7 + dpikapic PikaPicAnimScript2 + dpikapic PikaPicAnimScript2 + + db 250 + dpikapic PikaPicAnimScript17 + dpikapic PikaPicAnimScript17 + dpikapic PikaPicAnimScript16 + dpikapic PikaPicAnimScript10 + dpikapic PikaPicAnimScript10 + + db 255 + dpikapic PikaPicAnimScript17 + dpikapic PikaPicAnimScript17 + dpikapic PikaPicAnimScript19 + dpikapic PikaPicAnimScript20 + dpikapic PikaPicAnimScript20 + +StarterPikachuEmotionCommand_pikapic: + ldh a, [hAutoBGTransferEnabled] + push af + xor a + ldh [hAutoBGTransferEnabled], a + ld a, [de] + ld [wPikaPicAnimNumber], a + inc de + push de + call .RunPikapic + pop de + pop af + ldh [hAutoBGTransferEnabled], a + ret + +.RunPikapic: + call PlacePikapicTextBoxBorder + callfar LoadOverworldPikachuFrontpicPalettes + call ResetPikaPicAnimBuffer + call LoadCurrentPikaPicAnimScriptPointer + call ExecutePikaPicAnimScript + call PlacePikapicTextBoxBorder + call RunDefaultPaletteCommand + ret + +ResetPikaPicAnimBuffer: + ld hl, wCurPikaMovementData + ld bc, wCurPikaMovementDataEnd - wCurPikaMovementData + xor a + call FillMemory + ld hl, wPikaPicAnimObjectDataBufferSize + ld bc, wPikaPicAnimObjectDataBufferEnd - wPikaPicAnimObjectDataBufferSize + xor a + call FillMemory + call ClearPikaPicUsedGFXBuffer + ld hl, 100 + ld a, l + ld [wPikaPicAnimTimer], a + ld a, h + ld [wPikaPicAnimTimer + 1], a + ld a, $7 + ld [wPikaPicPikaDrawStartX], a + ld a, $6 + ld [wPikaPicPikaDrawStartY], a + ret + +PlacePikapicTextBoxBorder: + xor a + ldh [hAutoBGTransferEnabled], a + hlcoord 6, 5 + lb bc, 5, 5 + call TextBoxBorder + call Delay3 + call UpdateSprites + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call Delay3 + ret + +LoadCurrentPikaPicAnimScriptPointer: + ld a, [wPikaPicAnimNumber] + cp $1d + jr c, .valid + ld a, $0 +.valid + ld e, a + ld d, 0 + ld hl, PikaPicAnimPointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call UpdatePikaPicAnimPointer + ret + +pikapic_def: MACRO +\1_id: + dw \1 +ENDM + +PikaPicAnimPointers: + pikapic_def PikaPicAnimScript0 ; 00 + pikapic_def PikaPicAnimScript1 ; 01 + pikapic_def PikaPicAnimScript2 ; 02 + pikapic_def PikaPicAnimScript3 ; 03 + pikapic_def PikaPicAnimScript4 ; 04 + pikapic_def PikaPicAnimScript5 ; 05 + pikapic_def PikaPicAnimScript6 ; 06 + pikapic_def PikaPicAnimScript7 ; 07 + pikapic_def PikaPicAnimScript8 ; 08 + pikapic_def PikaPicAnimScript9 ; 09 + pikapic_def PikaPicAnimScript10 ; 0a + pikapic_def PikaPicAnimScript11 ; 0b + pikapic_def PikaPicAnimScript12 ; 0c + pikapic_def PikaPicAnimScript13 ; 0d + pikapic_def PikaPicAnimScript14 ; 0e + pikapic_def PikaPicAnimScript15 ; 0f + pikapic_def PikaPicAnimScript16 ; 10 + pikapic_def PikaPicAnimScript17 ; 11 + pikapic_def PikaPicAnimScript18 ; 12 + pikapic_def PikaPicAnimScript19 ; 13 + pikapic_def PikaPicAnimScript20 ; 14 + pikapic_def PikaPicAnimScript21 ; 15 + pikapic_def PikaPicAnimScript22 ; 16 + pikapic_def PikaPicAnimScript23 ; 17 + pikapic_def PikaPicAnimScript24 ; 18 + pikapic_def PikaPicAnimScript25 ; 19 + pikapic_def PikaPicAnimScript26 ; 1a + pikapic_def PikaPicAnimScript27 ; 1b + pikapic_def PikaPicAnimScript28 ; 1c + pikapic_def PikaPicAnimScript29 ; 1d + +ExecutePikaPicAnimScript: +.loop + xor a + ldh [hAutoBGTransferEnabled], a + call RunPikaPicAnimSetupScript + call DummyFunction_fdad5 + call AnimateCurrentPikaPicAnimFrame + call DummyFunction_fdad5 + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call PikaPicAnimTimerAndJoypad + and a + jr z, .loop + ret + +PikaPicAnimTimerAndJoypad: + call Delay3 + call CheckPikaPicAnimTimer + and a + ret nz + call JoypadLowSensitivity + ldh a, [hJoyPressed] + and A_BUTTON | B_BUTTON + ret + +CheckPikaPicAnimTimer: + ld hl, wPikaPicAnimTimer + dec [hl] + jr nz, .not_done_yet + inc hl + ld a, [hl] + and a + jr z, .timer_expired + dec [hl] +.not_done_yet + xor a + ret + +.timer_expired + ld a, $1 + ret + +DummyFunction_fdad5: + ret + +AnimateCurrentPikaPicAnimFrame: + ld bc, wPikaPicAnimObjectDataBuffer + ld a, 4 +.loop + push af + push bc + ld hl, 0 ; struct index + add hl, bc + ld a, [hli] + and a + jr z, .skip + ld a, [hli] + ld [wCurPikaPicAnimObjectScriptIdx], a + ld a, [hli] + ld [wCurPikaPicAnimObjectFrameIdx], a + ld a, [hli] + ld [wCurPikaPicAnimObjectFrameTimer], a + ld a, [hli] + ld [wCurPikaPicAnimObjectVTileOffset], a + ld a, [hli] + ld [wCurPikaPicAnimObjectXOffset], a + ld a, [hli] + ld [wCurPikaPicAnimObjectYOffset], a + ld a, [hli] + ld [wCurPikaPicAnimObject + 6], a + push bc + call LoadPikaPicAnimObjectData + pop bc + ld hl, 1 ; script index + add hl, bc + ld a, [wCurPikaPicAnimObjectScriptIdx] + ld [hli], a + ld a, [wCurPikaPicAnimObjectFrameIdx] + ld [hli], a + ld a, [wCurPikaPicAnimObjectFrameTimer] + ld [hli], a + ld a, [wCurPikaPicAnimObjectVTileOffset] + ld [hli], a + ld a, [wCurPikaPicAnimObjectXOffset] + ld [hli], a + ld a, [wCurPikaPicAnimObjectYOffset] + ld [hli], a + ld a, [wCurPikaPicAnimObject + 6] + ld [hl], a +.skip + pop bc + ld hl, 8 + add hl, bc + ld b, h + ld c, l + pop af + dec a + jr nz, .loop + ret + +PikaPicAnimCommand_object: + ld hl, wPikaPicAnimObjectDataBuffer + ld de, 8 + ld c, 4 +.loop + ld a, [hl] + and a + jr z, .found + add hl, de + dec c + jr nz, .loop + scf + ret + +.found + ld a, [wPikaPicAnimObjectDataBufferSize] + inc a + ld [wPikaPicAnimObjectDataBufferSize], a + ld [hli], a + call GetPikaPicAnimByte + ld [hli], a + call GetPikaPicAnimByte + ld [hl], a + xor a + ld [hli], a ; overloads + ld [hli], a + call GetPikaPicAnimByte + ld [hli], a + call GetPikaPicAnimByte + ld [hli], a + call GetPikaPicAnimByte + ld [hli], a + and a + ret + +PikaPicAnimCommand_deleteobject: + call GetPikaPicAnimByte + ld b, a + ld hl, wPikaPicAnimObjectDataBuffer + ld de, 8 + ld c, 4 +.search + ld a, [hl] + cp b + jr z, .delete + add hl, de + dec c + jr nz, .search + scf + ret + +.delete + xor a + ld [hl], a + ret + +LoadPikaPicAnimObjectData: +.loop + ld a, [wCurPikaPicAnimObjectScriptIdx] + cp $23 + jr c, .valid + ld a, $4 +.valid + ld e, a + ld d, 0 + ld hl, PikaPicAnimBGFramesPointers + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wCurPikaPicAnimObjectFrameIdx] + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, [hli] + cp $e0 + jr z, .end + jr .init + +.end + xor a + ld [wCurPikaPicAnimObjectFrameIdx], a + ld [wCurPikaPicAnimObjectFrameTimer], a + jr .loop + +.init + push hl + call LoadCurPikaPicObjectTilemap + pop hl + ld a, [hl] + and a + jr z, .not_done ; lasts forever + ld a, [wCurPikaPicAnimObjectFrameTimer] + inc a + ld [wCurPikaPicAnimObjectFrameTimer], a + cp [hl] + jr nz, .not_done + xor a + ld [wCurPikaPicAnimObjectFrameTimer], a + ld a, [wCurPikaPicAnimObjectFrameIdx] + inc a + ld [wCurPikaPicAnimObjectFrameIdx], a +.not_done + ret + +INCLUDE "data/pikachu/pikachu_pic_objects.asm" + +LoadCurPikaPicObjectTilemap: + and a + ret z + ld e, a + ld d, 0 + ld hl, PikaPicTilemapPointers + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld a, [de] + ld c, a + inc de + ld a, [de] + ld b, a + inc de + push de + push bc + call .GetStartCoords + pop bc + pop de +.row + push bc + push hl + ld a, [wCurPikaPicAnimObjectVTileOffset] ; tile id offset + ld c, a +.col + ld a, [de] + inc de + cp $ff + jr z, .skip + add c + ld [hl], a +.skip + inc hl + dec b + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec c + jr nz, .row + ret + +.GetStartCoords: + push bc + ld a, [wCurPikaPicAnimObjectYOffset] ; Y offset + ld b, a + ld a, [wPikaPicPikaDrawStartY] + add b + hlcoord 0, 0 + ld bc, SCREEN_WIDTH + call AddNTimes + ld a, [wCurPikaPicAnimObjectXOffset] ; X offset + ld c, a + ld a, [wPikaPicPikaDrawStartX] + add c + ld c, a + ld b, 0 + add hl, bc + pop bc + ret + +INCLUDE "data/pikachu/pikachu_pic_tilemaps.asm" + +LoadPikaPicAnimGFXHeader: + push hl + ld e, a + ld d, 0 + ld hl, PikaPicAnimGFXHeaders + add hl, de + add hl, de + add hl, de + add hl, de + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + pop hl + ret + +RunPikaPicAnimSetupScript: + call .CheckAndAdvanceTimer + ret c + xor a + ld [wPikaPicAnimPointerSetupFinished], a +.loop + call GetPikaPicAnimByte + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + call JumpToAddress + ld a, [wPikaPicAnimPointerSetupFinished] + and a + jr z, .loop + ret + +.CheckAndAdvanceTimer: + ld a, [wPikaPicAnimDelay] + and a + ret z + dec a + ld [wPikaPicAnimDelay], a + scf + ret + +.Jumptable: + dw PikaPicAnimCommand_nop ; 00, 0 params + dw PikaPicAnimCommand_writebyte ; 01, 1 param + dw PikaPicAnimCommand_loadgfx ; 02, 1 param + dw PikaPicAnimCommand_object ; 03, 5 params + dw PikaPicAnimCommand_nop4 ; 04, 0 params + dw PikaPicAnimCommand_nop5 ; 05, 0 params + dw PikaPicAnimCommand_deleteobject ; 06, 1 param + dw PikaPicAnimCommand_nop7 ; 07, 0 params + dw PikaPicAnimCommand_nop8 ; 08, 0 params + dw PikaPicAnimCommand_jump ; 09, 1 dw param + dw PikaPicAnimCommand_setduration ; 0a, 1 dw param + dw PikaPicAnimCommand_cry ; 0b, 1 param + dw PikaPicAnimCommand_thunderbolt ; 0c, 0 params + dw PikaPicAnimCommand_run ; 0d, 0 params (ret) + dw PikaPicAnimCommand_ret ; 0e, 0 params (ret) + +PikaPicAnimCommand_nop: + ret + +PikaPicAnimCommand_ret: + ld a, 1 + ld [wPikaPicAnimTimer], a + xor a + ld [wPikaPicAnimTimer + 1], a + jr PikaPicAnimCommand_run + +; XXX + ret + +PikaPicAnimCommand_setduration: + call GetPikaPicAnimByte + ld [wPikaPicAnimTimer], a + call GetPikaPicAnimByte + ld [wPikaPicAnimTimer + 1], a + ret + +PikaPicAnimCommand_run: + ld a, $ff + ld [wPikaPicAnimPointerSetupFinished], a + ret + +PikaPicAnimCommand_writebyte: + call GetPikaPicAnimByte + ld [wPikaPicAnimDelay], a + ret + +PikaPicAnimCommand_nop4: +PikaPicAnimCommand_nop5: +PikaPicAnimCommand_nop7: +PikaPicAnimCommand_nop8: + ret + +PikaPicAnimCommand_jump: + call GetPikaPicAnimByte + ld l, a + call GetPikaPicAnimByte + ld h, a + call UpdatePikaPicAnimPointer + ret + +GetPikaPicAnimByte: + push hl + ld hl, wPikaPicAnimPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hli] + call UpdatePikaPicAnimPointer + pop hl + ret + +UpdatePikaPicAnimPointer: + push af + ld a, l + ld [wPikaPicAnimPointer], a + ld a, h + ld [wPikaPicAnimPointer + 1], a + pop af + ret + +PikaPicAnimCommand_loadgfx: + ld a, [wUpdateSpritesEnabled] + push af + ld a, $ff + ld [wUpdateSpritesEnabled], a + ldh a, [hAutoBGTransferEnabled] + push af + xor a + ldh [hAutoBGTransferEnabled], a + ldh a, [hTilesetType] + push af + xor a + ldh [hTilesetType], a + call GetPikaPicAnimByte + ld [wPikaPicAnimCurGraphicID], a + ld a, [wPikaPicAnimCurGraphicID] + call LoadPikaPicAnimGFXHeader + ld a, c + cp a, $ff + jr z, .compressed + call RequestPikaPicAnimGFX + jr .done + +.compressed + call DecompressRequestPikaPicAnimGFX +.done + pop af + ldh [hTilesetType], a + pop af + ldh [hAutoBGTransferEnabled], a + pop af + ld [wUpdateSpritesEnabled], a + ret + +RequestPikaPicAnimGFX: + push de + ld a, [wPikaPicAnimCurGraphicID] + ld d, a + ld e, c + call CheckIfThereIsRoomForPikaPicAnimGFX + pop de + jr c, .failed + call GetPikaPicVRAMAddressForNewGFX + call CopyVideoDataAlternate + and a +.failed + ret + +DecompressRequestPikaPicAnimGFX: + push de + ld a, [wPikaPicAnimCurGraphicID] + ld d, a + ld e, 5 * 5 + call CheckIfThereIsRoomForPikaPicAnimGFX + pop de + jr c, .failed + ld a, b + call UncompressSpriteFromDE + ld a, BANK(sSpriteBuffer1) + call SwitchSRAMBankAndLatchClockData + ld hl, sSpriteBuffer1 + ld de, sSpriteBuffer0 + ld bc, SPRITEBUFFERSIZE * 2 + call CopyData + call PrepareRTCDataAndDisableSRAM + ld a, [wPikaPicAnimCurGraphicID] + call LookUpTileOffsetForCurrentPikaPicAnimGFX + call GetPikaPicVRAMAddressForNewGFX + ld d, h + ld e, l + call InterlaceMergeSpriteBuffers +.failed + ret + +ClearPikaPicUsedGFXBuffer: + ld hl, wPikaPicUsedGFXCount + ld bc, wPikaPicUsedGFXEnd - wPikaPicUsedGFXCount + xor a + call FillMemory + ret + +GetPikaPicVRAMAddressForNewGFX: + ld hl, vNPCSprites + push bc + ld b, a + and $f + swap a + ld c, a + ld a, b + and $f0 + swap a + ld b, a + add hl, bc + pop bc + ret + +CheckIfThereIsRoomForPikaPicAnimGFX: +; d: idx +; e: size +; FATAL: If the graphic has already been loaded, or if there are +; already 8 graphics objects loaded, the game will execute arbitrary +; code. + push bc + push hl + ld hl, wPikaPicUsedGFX + ld c, 8 +.loop + ld a, [hl] + and a + jr z, .empty + cp d + jr z, .found + inc hl + inc hl + dec c + jr nz, .loop + scf + ret ; execute hl, then bc + +.found + inc hl + ld a, [hl] + ret ; execute hl, then bc + +.empty + ld [hl], d + inc hl + ld a, [wPikaPicUsedGFXCount] + add $80 + ld [hl], a + ld a, [wPikaPicUsedGFXCount] + add e + ld [wPikaPicUsedGFXCount], a + cp $80 + jr z, .okay + jr nc, .failed +.okay + ld a, [hl] + and a + jr .pop_ret + +.failed + scf +.pop_ret + pop hl + pop bc + ret + +LookUpTileOffsetForCurrentPikaPicAnimGFX: + push bc + push hl + ld b, a + ld hl, wPikaPicUsedGFX + ld c, 8 +.loop + ld a, [hli] + cp b + jr z, .found + inc hl + dec c + jr nz, .loop + scf + jr .pop_ret + +.found + ld a, [hl] + and a +.pop_ret + pop hl + pop bc + ret + +PikaPicAnimCommand_cry: + call GetPikaPicAnimByte + cp $ff + ret z + ld e, a + callfar PlayPikachuSoundClip + ret + +PikaPicAnimCommand_thunderbolt: + ld a, $1 + ld [wMuteAudioAndPauseMusic], a + call DelayFrame + ld a, [wAudioROMBank] + push af + ld a, BANK(SFX_Battle_2F) + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a + call .LoadAudio + call PlaySound + call .FlashScreen + call WaitForSoundToFinish + pop af + ld [wAudioROMBank], a + ld [wAudioSavedROMBank], a + xor a + ld [wMuteAudioAndPauseMusic], a + ret + +.LoadAudio: + ld hl, MoveSoundTable + ld e, THUNDERBOLT + ld d, 0 + add hl, de + add hl, de + add hl, de + ld a, BANK(MoveSoundTable) + call GetFarByte + ld b, a + inc hl + ld a, BANK(MoveSoundTable) + call GetFarByte + inc hl + ld [wFrequencyModifier], a + ld a, BANK(MoveSoundTable) + call GetFarByte + ld [wTempoModifier], a + ld a, b + ret + +.FlashScreen: + ld hl, PikaPicAnimThunderboltPals +.loop + ld a, [hli] + cp $ff + ret z + ld c, a + ld b, [hl] + inc hl + push hl + call .UpdatePal + pop hl + jr .loop + +.UpdatePal: + ld a, b + ldh [rBGP], a + call UpdateGBCPal_BGP + call DelayFrames + ret + +INCLUDE "data/pikachu/pikachu_pic_animation.asm" + +Func_fe66e: + ret diff --git a/engine/pikachu/pikachu_status.asm b/engine/pikachu/pikachu_status.asm new file mode 100755 index 00000000..c73d3b3f --- /dev/null +++ b/engine/pikachu/pikachu_status.asm @@ -0,0 +1,258 @@ +IsStarterPikachuInOurParty:: + ld hl, wPartySpecies + ld de, wPartyMon1OTID + ld bc, wPartyMonOT + push hl +.loop + pop hl + ld a, [hli] + push hl + inc a + jr z, .noPlayerPikachu + cp PIKACHU + 1 + jr nz, .curMonNotPlayerPikachu + ld h, d + ld l, e + ld a, [wPlayerID] + cp [hl] + jr nz, .curMonNotPlayerPikachu + inc hl + ld a, [wPlayerID+1] + cp [hl] + jr nz, .curMonNotPlayerPikachu + push de + push bc + ld hl, wPlayerName + ld d, $6 ; possible player length - 1 +.nameCompareLoop + dec d + jr z, .sameOT + ld a, [bc] + inc bc + cp [hl] + inc hl + jr z, .nameCompareLoop + pop bc + pop de +.curMonNotPlayerPikachu + ld hl, wPartyMon2 - wPartyMon1 + add hl, de + ld d, h + ld e, l + ld hl, NAME_LENGTH + add hl, bc + ld b, h + ld c, l + jr .loop + +.sameOT + pop bc + pop de + ld h, d + ld l, e + ld bc, -NAME_LENGTH + add hl, bc + ld a, [hli] + or [hl] + jr z, .noPlayerPikachu ; XXX how is this determined? + pop hl + scf + ret + +.noPlayerPikachu + pop hl + and a + ret + +IsThisPartymonStarterPikachu_Box:: + ld hl, wBoxMon1 + ld bc, wBoxMon2 - wBoxMon1 + ld de, wBoxMonOT + jr asm_fce21 + +IsThisPartymonStarterPikachu_Party:: +IsThisPartymonStarterPikachu:: + ld hl, wPartyMon1 + ld bc, wPartyMon2 - wPartyMon1 + ld de, wPartyMonOT +asm_fce21: + ld a, [wWhichPokemon] + call AddNTimes + ld a, [hl] + cp PIKACHU + jr nz, .notPlayerPikachu + ld bc, wPartyMon1OTID - wPartyMon1 + add hl, bc + ld a, [wPlayerID] + cp [hl] + jr nz, .notPlayerPikachu + inc hl + ld a, [wPlayerID+1] + cp [hl] + jr nz, .notPlayerPikachu + ld h, d + ld l, e + ld a, [wWhichPokemon] + ld bc, NAME_LENGTH + call AddNTimes + ld de, wPlayerName + ld b, $6 +.loop + dec b + jr z, .isPlayerPikachu + ld a, [de] + inc de + cp [hl] + inc hl + jr z, .loop +.notPlayerPikachu + and a + ret + +.isPlayerPikachu + scf + ret + +UpdatePikachuMoodAfterBattle:: +; because d is always $82 at this function, it serves to +; ensure Pikachu's mood is at least 130 after battle + push de + call IsStarterPikachuInOurParty + pop de + ret nc + ld a, d + cp 128 + ld a, [wPikachuMood] + jr c, .d_less_than_128 ; we never jump + cp d + jr c, .load_d_into_mood + ret + +.d_less_than_128 + cp d + ret c +.load_d_into_mood + ld a, d + ld [wPikachuMood], a + ret + +CheckPikachuFaintedOrStatused:: +; function to test if Pikachu is alive? + xor a + ld [wWhichPokemon], a + ld hl, wPartyCount +.loop + inc hl + ld a, [hl] + cp $ff + jr z, .dead_or_not_in_party + push hl + call IsThisPartymonStarterPikachu_Party + pop hl + jr nc, .next + ld a, [wWhichPokemon] + ld hl, wPartyMon1HP + ld bc, wPartyMon2 - wPartyMon1 + call AddNTimes + ld a, [hli] + or [hl] + ld d, a + inc hl + inc hl + ld a, [hl] ; status + and a + jr nz, .alive + jr .dead_or_not_in_party + +.next + ld a, [wWhichPokemon] + inc a + ld [wWhichPokemon], a + jr .loop + +.alive + scf + ret + +.dead_or_not_in_party + and a + ret + +IsSurfingPikachuInThePlayersParty:: + ld hl, wPartySpecies + ld de, wPartyMon1Moves + ld bc, wPartyMonOT + push hl +.loop + pop hl + ld a, [hli] + push hl + inc a + jr z, .noSurfingPlayerPikachu + cp PIKACHU+1 + jr nz, .curMonNotSurfingPlayerPikachu + ld h, d + ld l, e + push hl + push bc + ld b, NUM_MOVES +.moveSearchLoop + ld a, [hli] + cp SURF + jr z, .foundSurfingPikachu + dec b + jr nz, .moveSearchLoop + pop bc + pop hl + jr .curMonNotSurfingPlayerPikachu + +.foundSurfingPikachu + pop bc + pop hl + inc hl + inc hl + inc hl + inc hl + ld a, [wPlayerID] + cp [hl] + jr nz, .curMonNotSurfingPlayerPikachu + inc hl + ld a, [wPlayerID+1] + cp [hl] + jr nz, .curMonNotSurfingPlayerPikachu + push de + push bc + ld hl, wPlayerName + ld d, $6 +.nameCompareLoop + dec d + jr z, .foundSurfingPlayerPikachu + ld a, [bc] + inc bc + cp [hl] + inc hl + jr z, .nameCompareLoop + pop bc + pop de +.curMonNotSurfingPlayerPikachu + ld hl, wPartyMon2 - wPartyMon1 + add hl, de + ld d, h + ld e, l + ld hl, NAME_LENGTH + add hl, bc + ld b, h + ld c, l + jr .loop + +.foundSurfingPlayerPikachu + pop bc + pop de + pop hl + scf + ret + +.noSurfingPlayerPikachu + pop hl + and a + ret diff --git a/engine/pikachu/respawn_overworld_pikachu.asm b/engine/pikachu/respawn_overworld_pikachu.asm new file mode 100644 index 00000000..4b610085 --- /dev/null +++ b/engine/pikachu/respawn_overworld_pikachu.asm @@ -0,0 +1,6 @@ +RespawnOverworldPikachu: + callfar IsThisPartymonStarterPikachu_Party + ret nc + ld a, $3 + ld [wPikachuSpawnState], a + ret diff --git a/engine/pikachu_emotions.asm b/engine/pikachu_emotions.asm deleted file mode 100755 index 55262493..00000000 --- a/engine/pikachu_emotions.asm +++ /dev/null @@ -1,421 +0,0 @@ -IsPlayerTalkingToPikachu:: - ld a, [wd436] - and a - ret z - ldh a, [hSpriteIndexOrTextID] - cp $f - ret nz - call InitializePikachuTextID - xor a - ldh [hSpriteIndexOrTextID], a - ld [wd436], a - ret - -InitializePikachuTextID:: - ld a, TEXT_PIKACHU_ANIM ; display - ldh [hSpriteIndexOrTextID], a - xor a - ld [wPlayerMovingDirection], a - ld a, $1 - ld [wAutoTextBoxDrawingControl], a - call DisplayTextID - xor a - ld [wAutoTextBoxDrawingControl], a - ret - -DoStarterPikachuEmotions: - ld e, a - ld d, 0 - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] -.loop - ld a, [de] - inc de - cp $ff - jr z, .done - ld c, a - ld b, 0 - ld hl, StarterPikachuEmotionsJumptable - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - call JumpToAddress - jr .loop - -.done - ret - -StarterPikachuEmotionsJumptable: - dw StarterPikachuEmotionCommand_nop ; 0 - dw StarterPikachuEmotionCommand_text ; 1 - dw StarterPikachuEmotionCommand_pcm ; 2 - dw StarterPikachuEmotionCommand_emote ; 3 - dw StarterPikachuEmotionCommand_movement ; 4 - dw StarterPikachuEmotionCommand_pikapic ; 5 - dw StarterPikachuEmotionCommand_subcmd ; 6 - dw StarterPikachuEmotionCommand_delay ; 7 - dw StarterPikachuEmotionCommand_nop2 ; 8 - dw StarterPikachuEmotionCommand_9 ; 9 - dw StarterPikachuEmotionCommand_nop3 ; a - -StarterPikachuEmotionCommand_nop: -StarterPikachuEmotionCommand_nop3: - ret - -StarterPikachuEmotionCommand_text: - ld a, [de] - ld l, a - inc de - ld a, [de] - ld h, a - inc de - push de - call PrintText - pop de - ret - -StarterPikachuEmotionCommand_pcm: - ld a, [de] - inc de - push de - ld e, a - nop - call PlayPikachuSoundClip_ - pop de - ret - -PlayPikachuSoundClip_: - cp $ff - ret z - callfar PlayPikachuSoundClip - ret - -StarterPikachuEmotionCommand_emote: - ld a, [wUpdateSpritesEnabled] - push af - ld a, $ff - ld [wUpdateSpritesEnabled], a - ld a, [de] - inc de - push de - call ShowPikachuEmoteBubble - pop de - pop af - ld [wUpdateSpritesEnabled], a - ret - -ShowPikachuEmoteBubble: - ld [wWhichEmotionBubble], a - ld a, $f ; Pikachu - ld [wEmotionBubbleSpriteIndex], a - predef EmotionBubble - ret - -StarterPikachuEmotionCommand_movement: - ld a, [de] - inc de - ld l, a - ld a, [de] - inc de - ld h, a - push de - ld b, BANK(DoStarterPikachuEmotions) - call ApplyPikachuMovementData_ - pop de - ret - -StarterPikachuEmotionCommand_delay: - ld a, [de] - inc de - push de - ld c, a - call DelayFrames - pop de - ret - -StarterPikachuEmotionCommand_subcmd: - ld a, [de] - inc de - push de - ld e, a - ld d, 0 - ld hl, .Subcommands - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call JumpToAddress - pop de - ret - -.Subcommands: - dw LoadPikachuSpriteIntoVRAM - dw LoadFontTilePatterns - dw Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3 - dw WaitForTextScrollButtonPress - dw PikachuPewterPokecenterCheck - dw PikachuFanClubCheck - dw PikachuBillsHouseCheck - -StarterPikachuEmotionCommand_nop2: - ret - -StarterPikachuEmotionCommand_9: - push de - call StarterPikachuEmotionCommand_turnawayfromplayer - call UpdateSprites - pop de - ret - -StarterPikachuEmotionCommand_turnawayfromplayer: - ld a, [wSpritePlayerStateData1FacingDirection] - xor $4 - ld [wSpritePikachuStateData1FacingDirection], a - ret - -DeletedFunction_fcffb: -; Inexplicably empty. - rept 5 - nop - endr - ret - -PlaySpecificPikachuEmotion: - ld a, e - jr load_expression - -TalkToPikachu:: - call MapSpecificPikachuExpression - jr c, load_expression - call GetPikaPicAnimationScriptIndex - call DeletedFunction_fcffb -load_expression: - ld [wExpressionNumber], a - ld hl, PikachuEmotionTable - call DoStarterPikachuEmotions - ret - -PikachuEmotionTable: -pikaemotion_def: MACRO -\1_id: dw \1 - endm - - pikaemotion_def PikachuEmotion0 - pikaemotion_def PikachuEmotion1 - pikaemotion_def PikachuEmotion2 - pikaemotion_def PikachuEmotion3 - pikaemotion_def PikachuEmotion4 - pikaemotion_def PikachuEmotion5 - pikaemotion_def PikachuEmotion6 - pikaemotion_def PikachuEmotion7 - pikaemotion_def PikachuEmotion8 - pikaemotion_def PikachuEmotion9 - pikaemotion_def PikachuEmotion10 - pikaemotion_def PikachuEmotion11 - pikaemotion_def PikachuEmotion12 - pikaemotion_def PikachuEmotion13 - pikaemotion_def PikachuEmotion14 - pikaemotion_def PikachuEmotion15 - pikaemotion_def PikachuEmotion16 - pikaemotion_def PikachuEmotion17 - pikaemotion_def PikachuEmotion18 - pikaemotion_def PikachuEmotion19 - pikaemotion_def PikachuEmotion20 - pikaemotion_def PikachuEmotion21 ; used a fishing rod - pikaemotion_def PikachuEmotion22 - pikaemotion_def PikachuEmotion23 - pikaemotion_def PikachuEmotion24 - pikaemotion_def PikachuEmotion25 - pikaemotion_def PikachuEmotion26 ; wake up pikachu in pewter pokemon center - pikaemotion_def PikachuEmotion27 - pikaemotion_def PikachuEmotion28 - pikaemotion_def PikachuEmotion29 - pikaemotion_def PikachuEmotion30 - pikaemotion_def PikachuEmotion31 - pikaemotion_def PikachuEmotion32 - pikaemotion_def PikachuEmotion33 - -PikachuEmotion33: - db $ff - -MapSpecificPikachuExpression: - ld a, [wCurMap] - cp POKEMON_FAN_CLUB - jr nz, .notFanClub - ld hl, wd492 - bit 7, [hl] - ldpikaemotion a, PikachuEmotion29 - jr z, .play_emotion - call CheckPikachuFollowingPlayer - ldpikaemotion a, PikachuEmotion30 - jr nz, .play_emotion - jr .check_pikachu_status - -.notFanClub - ld a, [wCurMap] - cp PEWTER_POKECENTER - jr nz, .notPewterPokecenter - call CheckPikachuFollowingPlayer - ldpikaemotion a, PikachuEmotion26 - jr nz, .play_emotion - jr .check_pikachu_status - -.notPewterPokecenter - callfar Func_f24ae - ld a, e - cp $ff - jr nz, .play_emotion - jr .check_pikachu_status ; useless - -.check_pikachu_status - call IsPlayerPikachuAsleepInParty - ldpikaemotion a, PikachuEmotion11 - jr c, .play_emotion - callfar CheckPikachuFaintedOrStatused ; same bank - ldpikaemotion a, PikachuEmotion28 - jr c, .play_emotion - ld a, [wCurMap] - cp POKEMON_TOWER_1F - jr c, .notInLavenderTower - cp POKEMON_TOWER_7F + 1 - ldpikaemotion a, PikachuEmotion22 - jr c, .play_emotion -.notInLavenderTower - ld a, [wd49c] - and a - jr z, .mood_based_emotion - dec a - ld c, a - ld b, $0 - ld hl, .Emotions - add hl, bc - ld a, [hl] - jr .play_emotion - -.mood_based_emotion - and a - ret - -.play_emotion - scf - ret - -.Emotions: - dpikaemotion PikachuEmotion18 - dpikaemotion PikachuEmotion21 - dpikaemotion PikachuEmotion23 - dpikaemotion PikachuEmotion24 - dpikaemotion PikachuEmotion25 - -IsPlayerPikachuAsleepInParty: - xor a - ld [wWhichPokemon], a -.loop - ld a, [wWhichPokemon] - ld c, a - ld b, 0 - ld hl, wPartySpecies - add hl, bc - ld a, [hl] - cp $ff - jr z, .done - cp PIKACHU - jr nz, .curMonNotStarterPikachu - callfar IsThisPartymonStarterPikachu - jr nc, .curMonNotStarterPikachu - ld a, [wWhichPokemon] - ld hl, wPartyMon1Status - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - ld a, [hl] - and SLP - jr z, .done - jr .curMonSleepingPikachu - -.curMonNotStarterPikachu - ld a, [wWhichPokemon] - cp PARTY_LENGTH - 1 - jr z, .done - inc a - ld [wWhichPokemon], a - jr .loop - -.curMonSleepingPikachu - scf - ret - -.done - and a - ret - -INCLUDE "data/pikachu_emotions.asm" - -PikachuWalksToNurseJoy: - ld a, $40 - ldh [hFFFC], a - call LoadPikachuSpriteIntoVRAM - call .GetMovementData - and a - jr z, .skip - call ApplyPikachuMovementData -.skip - xor a - ldh [hFFFC], a - ret - -.GetMovementData: - ld a, [wSpritePikachuStateData2MapY] - ld e, a - ld a, [wSpritePikachuStateData2MapX] - ld d, a - ld a, [wYCoord] - add 4 - cp e - jr z, .pikachu_at_same_y_as_player - jr nc, .pikachu_above_player - ld hl, .PikaMovementData1 - ld a, 1 - ret - -.pikachu_above_player - xor a - ret - -.pikachu_at_same_y_as_player - ld a, [wXCoord] - add 4 - cp d - jr c, .pikachu_to_right_of_player - ld hl, .PikaMovementData2 - ld a, 2 - ret - -.pikachu_to_right_of_player - ld hl, .PikaMovementData3 - ld a, 3 - ret - -.PikaMovementData1: - db $00 ; init - db $36 ; look up - db $2b ; walk up left - db $34 ; hop up right - db $3f ; ret - -.PikaMovementData2: - db $00 ; init - db $36 ; look up - db $34 ; hop up right - db $3f ; ret - -.PikaMovementData3: - db $00 ; init - db $36 ; look up - db $33 ; hop up left - db $3f ; ret diff --git a/engine/pikachu_follow.asm b/engine/pikachu_follow.asm deleted file mode 100755 index fd2fbc47..00000000 --- a/engine/pikachu_follow.asm +++ /dev/null @@ -1,1578 +0,0 @@ -ShouldPikachuSpawn:: -; possibly to test if pika should be out? - ld a, [wPikachuOverworldStateFlags] - bit 5, a - jr nz, .hide - ld a, [wPikachuOverworldStateFlags] - bit 7, a - jr nz, .hide - call IsStarterPikachuInOurParty - jr nc, .hide - ld a, [wWalkBikeSurfState] - and a - jr nz, .hide - scf - ret - -.hide - and a - ret - -SchedulePikachuSpawnForAfterText:: - ld hl, wPikachuOverworldStateFlags - bit 4, [hl] - res 4, [hl] - jr nz, .normal_spawn_state - call EnablePikachuFollowingPlayer - call ClearPikachuSpriteStateData - ld a, $ff - ld [wSpritePikachuStateData1ImageIndex], a - call ClearPikachuFollowCommandBuffer - call CalculatePikachuFacingDirection - ret - -.normal_spawn_state - call CalculatePikachuPlacementCoords - xor a - ld [wPikachuSpawnState], a - ld a, [wSpritePlayerStateData1FacingDirection] - ld [wSpritePikachuStateData1FacingDirection], a - ret - -ClearPikachuSpriteStateData:: - ld hl, wSpritePikachuStateData1PictureID - call .clear - ld hl, wSpritePikachuStateData2 -.clear - ld bc, $10 - xor a - call FillMemory - ret - -CalculatePikachuSpawnCoordsAndFacing:: - call CalculatePikachuPlacementCoords - call CalculatePikachuFacingDirection - xor a - ld [wPikachuSpawnState], a - ret - -CalculatePikachuPlacementCoords:: - ld bc, wSpritePikachuStateData1PictureID - ld a, [wYCoord] - add $4 - ld e, a - ld a, [wXCoord] - add $4 - ld d, a - ld a, [wPikachuSpawnState] - and a - jr z, .load_coords - cp $1 - jr z, .right_of_player - cp $2 - jr z, .check_player_facing2 - cp $3 - jr z, .load_coords - cp $4 - jr z, .below_player - cp $5 - jr z, .above_player - cp $6 - jr z, .left_of_player - cp $7 - jr z, .check_player_facing - jr .right_of_player - -.check_player_facing - ld a, [wSpritePlayerStateData1FacingDirection] - and a ; SPRITE_FACING_DOWN - jr z, .below_player - cp SPRITE_FACING_UP - jr z, .above_player - cp SPRITE_FACING_LEFT - jr z, .left_of_player - cp SPRITE_FACING_RIGHT - jr z, .right_of_player -.check_player_facing2 - ld a, [wSpritePlayerStateData1FacingDirection] - and a - jr nz, .check_up - dec e - jr .load_coords - -.check_up - cp SPRITE_FACING_UP - jr nz, .check_left - inc e - jr .load_coords - -.check_left - cp SPRITE_FACING_LEFT - jr nz, .left_of_player_2 - inc d - jr .load_coords - -.left_of_player_2 - dec d - jr .load_coords - -.right_of_player - inc d - jr .load_coords - -.left_of_player - dec d - jr .load_coords - -.below_player - inc e - jr .load_coords - -.above_player - dec e - jr .load_coords ; useless jr -.load_coords - ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 - add hl, bc - ld [hl], e - inc hl - ld [hl], d - inc hl - ld [hl], $fe - push hl - ld hl, wd472 - set 5, [hl] - pop hl - ret - -CalculatePikachuFacingDirection:: - ld a, $49 - ld [wSpritePikachuStateData1PictureID], a - ld a, $ff - ld [wSpritePikachuStateData1ImageIndex], a - ld a, [wPikachuSpawnState] - and a - jr z, .copy_player_facing - cp $1 - jr z, .copy_player_facing - cp $3 - jr z, .force_facing_down - cp $4 - jr z, .copy_player_facing - cp $6 - jr z, .copy_player_facing - cp $7 - jr z, .face_the_other_way - call ComputePikachuFacingDirection - ret - -.copy_player_facing - ld a, [wSpritePlayerStateData1FacingDirection] - ld [wSpritePikachuStateData1FacingDirection], a - ret - -.force_facing_down - ld a, SPRITE_FACING_DOWN - ld [wSpritePikachuStateData1FacingDirection], a - ret - -.face_the_other_way - ld a, [wSpritePlayerStateData1FacingDirection] - xor $4 - ld [wSpritePikachuStateData1FacingDirection], a - ret - -SetPikachuSpawnOutside:: - ld a, [wCurMap] - cp OAKS_LAB - jr z, .oaks_lab - cp ROUTE_22_GATE - jr z, .route_22_gate - cp MT_MOON_B1F - jr z, .mt_moon_2 - cp ROCK_TUNNEL_1F - jr z, .rock_tunnel_1 - ld a, [wCurMap] - ld hl, Pointer_fc64b - call Pikachu_IsInArray ; similar to IsInArray, but not the same - jr c, .map_list_1 - ld a, [wCurMap] - ld hl, Pointer_fc653 - call Pikachu_IsInArray - jr nc, .not_map_list_2 - ld a, [wSpritePlayerStateData1FacingDirection] - and a - jr nz, .not_map_list_2 - ld a, $3 - jr .load - -.route_22_gate - ld a, [wSpritePlayerStateData1FacingDirection] - and a - jr z, .rock_tunnel_1 - jr .not_map_list_2 - -.mt_moon_2 - ld a, $3 - jr .load - -.map_list_1 - ld a, $4 - jr .load - -.oaks_lab - ld a, $6 - jr .load - -.not_map_list_2 - ld a, $1 - jr .load - -.rock_tunnel_1 - ld a, $3 -.load - ld [wPikachuSpawnState], a - ret - -Pointer_fc64b:: - db VICTORY_ROAD_2F - db ROUTE_7_GATE - db ROUTE_8_GATE - db ROUTE_16_GATE_1F - db ROUTE_18_GATE_1F - db ROUTE_15_GATE_1F - db ROUTE_11_GATE_1F - db $ff - -Pointer_fc653:: - db VIRIDIAN_FOREST_NORTH_GATE - db CERULEAN_BADGE_HOUSE - db CERULEAN_TRASHED_HOUSE - db VERMILION_DOCK - db CELADON_MANSION_1F - db ROUTE_2_GATE - db FUCHSIA_GOOD_ROD_HOUSE - db $ff - -SetPikachuSpawnWarpPad:: - ld a, [wCurMap] - cp VIRIDIAN_FOREST_NORTH_GATE - jr z, .viridian_forest_exit - cp VIRIDIAN_FOREST_SOUTH_GATE - jr z, .viridian_forest_entrance - ld a, [wCurMap] - ld hl, Pointer_fc68e - call Pikachu_IsInArray - jr c, .in_array - jr .not_in_array - -.viridian_forest_exit - ld a, [wSpritePlayerStateData1FacingDirection] - cp SPRITE_FACING_UP - jr z, .in_array - jr .not_in_array - -.viridian_forest_entrance - ld a, [wSpritePlayerStateData1FacingDirection] - and a ; SPRITE_FACING_DOWN - jr z, .not_in_array - jr .in_array - -.not_in_array - ld a, $0 - jr .load_spawn_state - -.in_array - ld a, $1 -.load_spawn_state - ld [wPikachuSpawnState], a - ret - -Pointer_fc68e:: - db VIRIDIAN_FOREST - db SAFARI_ZONE_CENTER_REST_HOUSE - db SAFARI_ZONE_WEST_REST_HOUSE - db SAFARI_ZONE_EAST_REST_HOUSE - db SAFARI_ZONE_NORTH_REST_HOUSE - db SAFARI_ZONE_SECRET_HOUSE - db SILPH_CO_ELEVATOR - db CELADON_MART_ELEVATOR - db CINNABAR_LAB_TRADE_ROOM - db CINNABAR_LAB_METRONOME_ROOM - db CINNABAR_LAB_FOSSIL_ROOM - db $ff - -SetPikachuSpawnBackOutside:: - ld a, [wCurMap] - cp ROUTE_22_GATE - jr z, .asm_fc6a7 - cp ROUTE_2_GATE - jr z, .asm_fc6b0 - jr .asm_fc6bd - -.asm_fc6a7 - ld a, [wSpritePlayerStateData1FacingDirection] - cp SPRITE_FACING_UP - jr z, .asm_fc6b9 - jr .asm_fc6bd - -.asm_fc6b0 - ld a, [wSpritePlayerStateData1FacingDirection] - cp SPRITE_FACING_UP - jr z, .asm_fc6b9 - jr .asm_fc6bd - -.asm_fc6b9 - ld a, $1 - jr .asm_fc6c1 - -.asm_fc6bd - ld a, $3 - jr .asm_fc6c1 - -.asm_fc6c1 - ld [wPikachuSpawnState], a - ret - -SetPikachuOverworldStateFlag2:: - push hl - ld hl, wPikachuOverworldStateFlags - set 2, [hl] - pop hl - ret - -ResetPikachuOverworldStateFlag2:: - push hl - ld hl, wPikachuOverworldStateFlags - res 2, [hl] - pop hl - ret - -SpawnPikachu_:: - call ResetPikachuOverworldStateFlag2 - call TrySpawnPikachu - ret nc - - push bc - call WillPikachuSpawnOnTheScreen - pop bc - ret c - - ld bc, wSpritePikachuStateData1 - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - bit 7, [hl] - jp nz, Func_fc745 - ld a, [wFontLoaded] - bit 0, a - jp nz, Func_fc76a - call CheckPikachuFollowingPlayer - jp nz, Func_fc76a - ld a, [hl] - and $7f - cp $a - jr c, .valid - xor a -.valid - add a - ld e, a - ld d, 0 - ld hl, PointerTable_fc710 - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -PointerTable_fc710: - dw Func_fc793 - dw Func_fc7aa - dw Func_fc803 - dw asm_fc9c3 - dw asm_fca1c - dw asm_fc9ee - dw asm_fc87f - dw asm_fc904 - dw asm_fc937 - dw asm_fc969 - dw .nop - -.nop: - ret - -TrySpawnPikachu: - call ShouldPikachuSpawn - jr nc, .dont_spawn - ld a, [wSpritePikachuStateData1MovementStatus] - and a - jr nz, .already_spawned - push bc - push hl - call CalculatePikachuSpawnCoordsAndFacing - pop hl - pop bc -.already_spawned - scf - ret - -.dont_spawn - ld hl, wSpritePikachuStateData1ImageIndex - ld [hl], $ff - dec hl - ld [hl], $0 - xor a - ret - -Func_fc745: - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - res 7, [hl] - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], a - call CheckPikachuFollowingPlayer - jr nz, .okay - ; Have Pikachu face in the opposite direction of you - ld a, [wSpritePlayerStateData1FacingDirection] - xor $4 - ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 - add hl, bc - ld [hl], a -.okay - xor a - ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 - add hl, bc - ld [hli], a - ld [hl], a - call UpdatePikachuWalkingSprite - ret - -Func_fc76a: - xor a - ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 - add hl, bc - ld [hli], a - ld [hl], a - call UpdatePikachuWalkingSprite - call Func_fc82e - jr c, .skip - push bc - callfar InitializeSpriteScreenPosition - pop bc -.skip - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $1 - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $0 - call RefreshPikachuFollow - ret - -Func_fc793: - call RefreshPikachuFollow - push bc - callfar InitializeSpriteScreenPosition - pop bc - ld hl, wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 - add hl, bc - ld [hl], $ff - dec hl - ld [hl], $1 - ret - -Func_fc7aa: - call Func_fcc92 - jp c, Func_fc803 - dec a - ld l, a - ld h, $0 - add hl, hl - add hl, hl - ld de, Pointer_fc7e3 - add hl, de - ld d, h - ld e, l - ld a, [de] - inc de - ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 - add hl, bc - ld [hl], a - ld a, [de] - inc de - ld hl, wSpritePikachuStateData1XStepVector - wSpritePikachuStateData1 - add hl, bc - ld [hl], a - dec hl - dec hl - ld a, [de] - ld [hl], a - inc de - ld a, [de] - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], a - cp $4 - jp z, Func_fca0a - call AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer - jp c, FastPikachuFollow - jp NormalPikachuFollow - -Pointer_fc7e3: - db 0, 0 - db 1, 3 - db 4, 0 - db -1, 3 - db 8, -1 - db 0, 3 - db 12, 1 - db 0, 3 - db 0, 0 - db 1, 4 - db 4, 0 - db -1, 4 - db 8, -1 - db 0, 4 - db 12, 1 - db 0, 4 - -Func_fc803: - call Func_fcae2 - ret c - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - dec [hl] - jr nz, .asm_fc823 - push hl - call GetPikachuFollowCommand - pop hl - cp $5 - jr nc, Func_fc842 - ld [hl], $20 - call Random - and $c - ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 - add hl, bc - ld [hl], a -.asm_fc823 - xor a - ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 - add hl, bc - ld [hli], a - ld [hl], a - call UpdatePikachuWalkingSprite - ret - -Func_fc82e: - ld a, [wWalkCounter] - and a - ret z - scf - ret - -Func_fc835: - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $10 - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $1 - ret - -Func_fc842: - ld hl, $0 - push af - call Random - ldh a, [hRandomAdd] - and %11 - ld e, a - ld d, $0 - ld hl, PointerTable_fc85a - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - pop af - jp hl - -PointerTable_fc85a: - dw Func_fc862 - dw Func_fc8f8 - dw Func_fc92b - dw Func_fc95d - -Func_fc862: - dec a - add a - add a - and $c - ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 - add hl, bc - ld [hl], a - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $6 - xor a - ld [wd432], a - ld [wd433], a - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $11 -asm_fc87f: - ld a, [wd432] - ld e, a - ld a, [wd433] - ld d, a - call Func_fc82e - jr c, Func_fc8c7 - call SetPikachuOverworldStateFlag2 - ld hl, wSpritePikachuStateData1YPixels - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - sub e - ld e, a - inc hl - inc hl - ld a, [hl] - sub d - ld d, a - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - dec a - add a - add Pointer_fc8d6 % $100 - ld l, a - ld a, Pointer_fc8d6 / $100 - adc $0 - ld h, a - ld a, [hli] - ld [wd432], a - add e - ld e, a - ld a, [hl] - ld [wd433], a - add d - ld d, a - ld hl, wSpritePikachuStateData1YPixels - wSpritePikachuStateData1 - add hl, bc - ld [hl], e - inc hl - inc hl - ld [hl], d - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - dec [hl] - ret nz - jp Func_fc835 - -Func_fc8c7: - ld hl, wSpritePikachuStateData1YPixels - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - sub e - ld [hl], a - inc hl - inc hl - ld a, [hl] - sub d - ld [hl], a - jp Func_fc835 - -Pointer_fc8d6: - db 0, 0 - db -2, 1 - db -4, 2 - db -2, 3 - db 0, 4 - db -2, 3 - db -4, 2 - db -2, 1 - db 0, 0 - db -2, -1 - db -4, -2 - db -2, -3 - db 0, -4 - db -2, -3 - db -4, -2 - db -2, -1 - db 0, 0 - -Func_fc8f8: - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $7 - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $30 -asm_fc904: - call Func_fc82e - jp c, Func_fc835 - call SetPikachuOverworldStateFlag2 - ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - inc a - cp $8 - ld [hl], a - jr nz, .asm_fc91f - xor a - ld [hli], a - ld a, [hl] - inc a - and %11 - ld [hl], a -.asm_fc91f - call UpdatePikachuWalkingSprite - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - dec [hl] - ret nz - jp Func_fc835 - -Func_fc92b: - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $20 - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $8 -asm_fc937: - call Func_fc82e - jp c, Func_fc835 - call SetPikachuOverworldStateFlag2 - ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - inc a - cp $8 - ld [hl], a - jr nz, .asm_fc951 - xor a - ld [hli], a - ld a, [hl] - xor $1 - ld [hl], a -.asm_fc951 - call UpdatePikachuWalkingSprite - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - dec [hl] - ret nz - jp Func_fc835 - -Func_fc95d: - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $20 - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $9 -asm_fc969: - call Func_fc82e - jp c, Func_fc835 - call SetPikachuOverworldStateFlag2 - ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - inc a - cp $8 - ld [hl], a - jr nz, .skip - xor a - ld [hl], a - ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - call .TurnClockwise - ld [hl], a -.skip - call UpdatePikachuWalkingSprite - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - dec [hl] - ret nz - jp Func_fc835 - -.TurnClockwise: - push hl - ld hl, .Facings - ld d, a -.loop - ld a, [hli] - cp d - jr nz, .loop - ld a, [hl] - pop hl - ret - -.TurnCounterclockwise: - push hl - ld hl, .Facings_End - ld d, a -.loop_ - ld a, [hld] - cp d - jr nz, .loop_ - ld a, [hl] - pop hl - ret - -.Facings: - db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT - db SPRITE_FACING_DOWN, SPRITE_FACING_LEFT, SPRITE_FACING_UP, SPRITE_FACING_RIGHT -.Facings_End: - -NormalPikachuFollow: - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $8 - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $3 - call AddPikachuStepVector -asm_fc9c3: - call TryDoubleAddPikachuStepVectorToScreenPixelCoords - call GetPikachuWalkingAnimationSpeed - call UpdatePikachuWalkingSprite - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - dec [hl] - ret nz - call ResetPikachuStepVector - call ComputePikachuFacingDirection - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $1 - ret - -FastPikachuFollow: - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $4 - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $5 - call AddPikachuStepVector -asm_fc9ee: - call DoubleAddPikachuStepVectorToScreenPixelCoords - call GetPikachuWalkingAnimationSpeed - call UpdatePikachuWalkingSprite - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - dec [hl] - ret nz - call ResetPikachuStepVector - call ComputePikachuFacingDirection - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $1 - ret - -Func_fca0a: - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - ld [hl], $8 - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $4 - call AddPikachuStepVector - call AddPikachuStepVector -asm_fca1c: - call DoubleAddPikachuStepVectorToScreenPixelCoords - call GetPikachuWalkingAnimationSpeed - call UpdatePikachuWalkingSprite - ld hl, wSpritePikachuStateData2WalkAnimationCounter - wSpritePikachuStateData1 - add hl, bc - dec [hl] - ret nz - call ResetPikachuStepVector - call ComputePikachuFacingDirection - ld hl, wSpritePikachuStateData1MovementStatus - wSpritePikachuStateData1 - add hl, bc - ld [hl], $1 - ret - -AddPikachuStepVector: - ld hl, wSpritePikachuStateData1YStepVector - wSpritePikachuStateData1 - add hl, bc - ld e, [hl] - inc hl - inc hl - ld d, [hl] - ld hl, wSpritePikachuStateData2MapY - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - add e - ld [hli], a - ld a, [hl] - add d - ld [hl], a - ret - -TryDoubleAddPikachuStepVectorToScreenPixelCoords: - ld a, [wWalkBikeSurfState] - cp $1 ; biking - jr nz, AddPikachuStepVectorToScreenPixelCoords - ld a, [wd736] - bit 6, a - jr nz, AddPikachuStepVectorToScreenPixelCoords -DoubleAddPikachuStepVectorToScreenPixelCoords: - ld hl, wSpritePikachuStateData1YStepVector - wSpritePikachuStateData1 - add hl, bc - ld a, [hli] - add a - add a - add [hl] - ld [hli], a - ld a, [hli] - add a - add a - add [hl] - ld [hl], a - ret - -AddPikachuStepVectorToScreenPixelCoords: - ld hl, wSpritePikachuStateData1YStepVector - wSpritePikachuStateData1 - add hl, bc - ld a, [hli] - add a - add [hl] - ld [hli], a - ld a, [hli] - add a - add [hl] - ld [hli], a - ret - -ResetPikachuStepVector: - ld hl, wSpritePikachuStateData1YStepVector - wSpritePikachuStateData1 - add hl, bc - xor a - ld [hli], a - inc hl - ld [hl], a - ret - -GetPikachuWalkingAnimationSpeed: - call ComparePikachuHappinessTo80 - ld d, $2 - jr nc, .happy - ld d, $5 -.happy - ld hl, wSpritePikachuStateData1IntraAnimFrameCounter - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - inc a - cp d - jr nz, .dont_reset - xor a -.dont_reset - ld [hli], a - ret nz - ld a, [hl] - inc a - and $3 - ld [hl], a - ret - -UpdatePikachuWalkingSprite: - ld a, [wPikachuOverworldStateFlags] - bit 3, a - jr nz, .uninitialized - ld hl, wSpritePikachuStateData2ImageBaseOffset - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - dec a - swap a - ld d, a - ld a, [wd736] - bit 7, a - jr nz, .copy_player - ld hl, wSpritePikachuStateData1FacingDirection - wSpritePikachuStateData1 - add hl, bc - ld a, [hl] - or d - ld d, a - ld a, [wFontLoaded] - bit 0, a - jr z, .normal_get_sprite_index - call Func_fcae2 - ret c - jr .load_sprite_index - -.normal_get_sprite_index - ld hl, wSpritePikachuStateData1AnimFrameCounter - wSpritePikachuStateData1 - add hl, bc - ld a, d - or [hl] - ld d, a -.load_sprite_index - ld hl, wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 - add hl, bc - ld [hl], d - ret - -.uninitialized - ld hl, wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 - add hl, bc - ld [hl], $ff - ret - -.copy_player - ld a, [wSpritePlayerStateData1ImageIndex] - and $f - or d - ld [wSpritePikachuStateData1ImageIndex], a - ret - -Func_fcae2: - ld hl, wSpritePikachuStateData2MapY - wSpritePikachuStateData1 - add hl, bc - ld a, [wYCoord] - add $4 - cp [hl] - jr nz, .on_screen - inc hl - ld a, [wXCoord] - add $4 - cp [hl] - jr nz, .on_screen - ld hl, wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 - add hl, bc - ld [hl], $ff - scf - ret - -.on_screen - and a - ret - -IsPikachuRightNextToPlayer: - push bc - push de - push hl - ld bc, wSpritePikachuStateData1PictureID - ld a, [wXCoord] - add $4 - ld d, a - ld a, [wYCoord] - add $4 - ld e, a - ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - sub e - and a - jr z, .equal - cp $ff - jr z, .one_away - cp $1 - jr z, .one_away - jr .bad - -.one_away - ld hl, wSpritePlayerStateData2MapX - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - sub d - jr z, .good - jr .bad - -.equal - ld hl, wSpritePlayerStateData2MapX - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - sub d - cp $ff - jr z, .good - cp $1 - jr z, .good - and a - jr z, .good - jr .bad - -.good - pop hl - pop de - pop bc - scf - ret - -.bad - pop hl - pop de - pop bc - xor a - ret - -GetPikachuFacingDirectionAndReturnToE:: - call GetPikachuFacingDirection - ld e, a - ret - -GetPikachuFacingDirection: - ld bc, wSpritePikachuStateData1PictureID - ld a, [wXCoord] - add $4 - ld d, a - ld a, [wYCoord] - add $4 - ld e, a - ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - cp e - jr z, .asm_fcb71 - jr nc, .asm_fcb6e - ld a, SPRITE_FACING_UP - ret - -.asm_fcb6e - ld a, SPRITE_FACING_DOWN - ret - -.asm_fcb71 - ld hl, wSpritePlayerStateData2MapX - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - cp d - jr z, .asm_fcb81 - jr nc, .asm_fcb7e - ld a, SPRITE_FACING_LEFT - ret - -.asm_fcb7e - ld a, SPRITE_FACING_RIGHT - ret - -.asm_fcb81 - ld a, $ff ; standing - ret - -ClearPikachuFollowCommandBuffer: - push bc - ld hl, wPikachuFollowCommandBufferSize - ld [hl], $ff - inc hl - ld bc, $10 - xor a - call FillMemory - pop bc - ret - -AppendPikachuFollowCommandToBuffer: - ld hl, wPikachuFollowCommandBufferSize - inc [hl] - ld e, [hl] - ld d, 0 - ld hl, wPikachuFollowCommandBuffer - add hl, de - ld [hl], a - ret - -RefreshPikachuFollow: - call ClearPikachuFollowCommandBuffer - call ComputePikachuFollowCommand - ret c - call AppendPikachuFollowCommandToBuffer - ret - -ComputePikachuFollowCommand: - ld bc, wSpritePikachuStateData1PictureID - ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 - add hl, bc - ld a, [wYCoord] - add $4 - sub [hl] - jr z, .checkXCoord - jr c, .pikaAbovePlayer - call CheckAbsoluteValueLessThan2 - jr c, .return1 - ld a, $5 - and a - ret - -.return1 - ld a, $1 - and a - ret - -.pikaAbovePlayer - call CheckAbsoluteValueLessThan2 - jr c, .return2 - ld a, $6 - and a - ret - -.return2 - ld a, $2 - and a - ret - -.checkXCoord - ld hl, wSpritePlayerStateData2MapX - wSpritePlayerStateData1 - add hl, bc - ld a, [wXCoord] - add $4 - sub [hl] - jr z, .pikachuOnTopOfPlayer - jr c, .pikaToLeftOfPlayer - call CheckAbsoluteValueLessThan2 - jr c, .return4 - ld a, $8 - and a - ret - -.return4 - ld a, $4 - and a - ret - -.pikaToLeftOfPlayer - call CheckAbsoluteValueLessThan2 - jr c, .return3 - ld a, $7 - and a - ret - -.return3 - ld a, $3 - and a - ret - -.pikachuOnTopOfPlayer - scf - ret - -CheckAbsoluteValueLessThan2: - jr nc, .positive - cpl - inc a -.positive - cp $2 - ret - -Func_fcc08:: - call Func_fcc23 - ret nc - ld a, [wd736] - bit 6, a - jr nz, .asm_fcc1b - call Func_fcc42 - ret c - call AppendPikachuFollowCommandToBuffer - ret - -.asm_fcc1b - call Func_fcc64 - ret c - call AppendPikachuFollowCommandToBuffer - ret - -Func_fcc23: - ld a, [wPikachuOverworldStateFlags] - bit 5, a - jr nz, .asm_fcc40 - ld a, [wPikachuOverworldStateFlags] - bit 7, a - jr nz, .asm_fcc40 - ld a, [wd472] - bit 7, a - jr z, .asm_fcc40 - ld a, [wWalkBikeSurfState] - and a - jr nz, .asm_fcc40 - scf - ret - -.asm_fcc40 - and a - ret - -Func_fcc42: - xor a - ld a, [wPlayerDirection] - bit 3, a - jr nz, .asm_fcc58 - bit 2, a - jr nz, .asm_fcc5b - bit 1, a - jr nz, .asm_fcc5e - bit 0, a - jr nz, .asm_fcc61 - scf - ret - -.asm_fcc58 - ld a, $2 - ret - -.asm_fcc5b - ld a, $1 - ret - -.asm_fcc5e - ld a, $3 - ret - -.asm_fcc61 - ld a, $4 - ret - -Func_fcc64: - ld hl, wPikachuOverworldStateFlags - bit 6, [hl] - jr z, .asm_fcc6e - res 6, [hl] - ret - -.asm_fcc6e - set 6, [hl] - xor a - ld a, [wPlayerDirection] - bit 3, a - jr nz, .asm_fcc86 - bit 2, a - jr nz, .asm_fcc89 - bit 1, a - jr nz, .asm_fcc8c - bit 0, a - jr nz, .asm_fcc8f - scf - ret - -.asm_fcc86 - ld a, $6 - ret - -.asm_fcc89 - ld a, $5 - ret - -.asm_fcc8c - ld a, $7 - ret - -.asm_fcc8f - ld a, $8 - ret - -Func_fcc92: - ld hl, wPikachuFollowCommandBufferSize - ld a, [hl] - cp $ff - jr z, .asm_fccb0 - and a - jr z, .asm_fccb0 - dec [hl] - ld e, a - ld d, 0 - ld hl, wPikachuFollowCommandBuffer - add hl, de - inc e - ld a, $ff -.asm_fcca8 - ld d, [hl] - ldd [hl], a - ld a, d - dec e - jr nz, .asm_fcca8 - and a - ret - -.asm_fccb0 - scf - ret - -ComputePikachuFacingDirection:: - call GetPikachuFollowCommandIfBufferSizeNonzero - and a - jr z, .check_y - dec a - and $3 - add a - add a - jr .load - -.check_y - ld a, [wYCoord] - add $4 - ld d, a - ld a, [wXCoord] - add $4 - ld e, a - ld a, [wSpritePikachuStateData2MapY] - cp d - jr z, .check_x - ld a, SPRITE_FACING_DOWN - jr c, .load - ld a, SPRITE_FACING_UP - jr .load - -.check_x - ld a, [wSpritePikachuStateData2MapX] - cp e - jr z, .copy_from_player - ld a, SPRITE_FACING_RIGHT - jr c, .load - ld a, SPRITE_FACING_LEFT - jr .load - -.copy_from_player - ld a, [wSpritePlayerStateData1FacingDirection] -.load - ld [wSpritePikachuStateData1FacingDirection], a - ret - -GetPikachuFollowCommand: - ld hl, wPikachuFollowCommandBufferSize - ld a, [hl] - cp $ff - jr z, .asm_fccff - ld e, a - ld d, 0 - ld hl, wPikachuFollowCommandBuffer - add hl, de - ld a, [hl] - ret - -.asm_fccff - xor a - ret - -GetPikachuFollowCommandIfBufferSizeNonzero: - ld hl, wPikachuFollowCommandBufferSize - ld a, [hl] - cp $ff - jr z, .default - and a - jr z, .default - ld e, a - ld d, 0 - ld hl, wPikachuFollowCommandBuffer - add hl, de - ld a, [hl] - ret - -.default - xor a - ret - -AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer: - ld a, [wPikachuFollowCommandBufferSize] - cp $ff - ret z - cp $2 - jr nc, .set_carry - and a - ret - -.set_carry - scf - ret - -WillPikachuSpawnOnTheScreen: - ld h, wSpriteStateData2 / $100 - ldh a, [hCurrentSpriteOffset] ; If we're here, this can only be $f0 - add wSpritePikachuStateData2MapY - wSpritePikachuStateData2 - ld l, a - ld b, [hl] - ld a, [wYCoord] - cp b - jr z, .same_y - jr nc, .not_on_screen - add (SCREEN_HEIGHT / 2) - 1 - cp b - jr c, .not_on_screen -.same_y - inc l - ld b, [hl] - ld a, [wXCoord] - cp b - jr z, .same_x - jr nc, .not_on_screen - add (SCREEN_WIDTH / 2) - 1 - cp b - jr c, .not_on_screen -.same_x - call .GetNPCCurrentTile - ld d, $60 - ld a, [hli] - ld e, a - cp d - jr nc, .not_on_screen - ld a, [hld] - cp d - jr nc, .not_on_screen - ld bc, -20 - add hl, bc - ld a, [hli] - cp d - jr nc, .not_on_screen - ld a, [hl] - cp d - jr c, .on_screen -.not_on_screen - ld h, wSpriteStateData1 / $100 - ldh a, [hCurrentSpriteOffset] - add wSpritePikachuStateData1ImageIndex - wSpritePikachuStateData1 - ld l, a - ld [hl], $ff - scf - jr .return - -.on_screen - ld h, wSpriteStateData2 / $100 - ldh a, [hCurrentSpriteOffset] - add wSpritePikachuStateData2GrassPriority - wSpritePikachuStateData2 - ld l, a - ld a, [wGrassTile] - cp e - ld a, $0 - jr nz, .priority - ld a, $80 -.priority - ld [hl], a - and a -.return - ret - -.GetNPCCurrentTile: - ld h, wSpriteStateData1 / $100 - ldh a, [hCurrentSpriteOffset] - add wSpritePikachuStateData1YPixels - wSpritePikachuStateData1 - ld l, a - ld a, [hli] - add $4 - and $f0 - srl a - ld c, a - ld b, $0 - inc l - ld a, [hl] - add $2 - srl a - srl a - srl a - add SCREEN_WIDTH - ld d, 0 - ld e, a - ld hl, wTileMap - rept 5 - add hl, bc - endr - add hl, de - ret - -ComparePikachuHappinessTo80: -; preserves a and bc - push bc - push af - ld a, [wPikachuHappiness] - cp 80 - pop bc - ld a, b - pop bc - ret diff --git a/engine/pikachu_movement.asm b/engine/pikachu_movement.asm deleted file mode 100755 index 2d87e947..00000000 --- a/engine/pikachu_movement.asm +++ /dev/null @@ -1,1048 +0,0 @@ -ApplyPikachuMovementData_:: - ld a, b - ld [wPikachuMovementScriptBank], a - ld a, l - ld [wPikachuMovementScriptAddress], a - ld a, h - ld [wPikachuMovementScriptAddress + 1], a - call .SwapSpriteStateData -.loop - call LoadPikachuMovementCommandData - jr nc, .done - call ExecutePikachuMovementCommand - jr .loop - -.done - call .SwapSpriteStateData - call DelayFrame - ret - -.SwapSpriteStateData: - ld a, [wUpdateSpritesEnabled] - push af - ld a, $ff - ld [wUpdateSpritesEnabled], a - push hl - push de - push bc - - ld hl, wSpritePlayerStateData1 - ld de, wSpritePikachuStateData1 - ld c, $10 - call .SwapBytes - - ld hl, wSpritePlayerStateData2 - ld de, wSpritePikachuStateData2 - ld c, $10 - call .SwapBytes - - pop bc - pop de - pop hl - pop af - ld [wUpdateSpritesEnabled], a - ret - -.SwapBytes: - ld b, [hl] - ld a, [de] - ld [hli], a - ld a, b - ld [de], a - inc de - dec c - jr nz, .SwapBytes - ret - -LoadPikachuMovementCommandData: - call GetPikachuMovementScriptByte - cp $3f - ret z - ld c, a - ld b, 0 - ld hl, PikachuMovementDatabase - add hl, bc - add hl, bc - add hl, bc - add hl, bc - ld a, [hli] - ld [wCurPikaMovementFunc1], a - ld a, [hli] - cp $80 - jr nz, .no_param - call GetPikachuMovementScriptByte -.no_param - ld [wCurPikaMovementParam1], a - ld a, [hli] - ld [wCurPikaMovementFunc2], a - ld a, [hli] - cp $80 - jr nz, .no_param2 - call GetPikachuMovementScriptByte -.no_param2 - ld [wCurPikaMovementParam2], a - xor a - ld [wd451], a - scf - ret - -ExecutePikachuMovementCommand: - xor a - ld [wPikachuMovementFlags], a - ld [wPikachuStepTimer], a - ld [wPikachuStepSubtimer], a - ld a, [wSpritePlayerStateData2GrassPriority] - push af -.loop - ld bc, wSpritePlayerStateData1 ; Currently holds Pikachu's sprite state data - ld a, [wCurPikaMovementFunc1] - ld hl, PikaMovementFunc1Jumptable - call .JumpTable - ld a, [wCurPikaMovementFunc2] - ld hl, PikaMovementFunc2Jumptable - call .JumpTable - call GetCoordsForPikachuShadow - call AnimatePikachuShadow - call DelayFrame - call DelayFrame - ld hl, wPikachuMovementFlags - bit 7, [hl] - jr z, .loop - pop af - ld [wSpritePlayerStateData2GrassPriority], a - scf - ret - -.JumpTable: - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -GetCoordsForPikachuShadow: - ld hl, wSpritePlayerStateData1ImageIndex - wSpritePlayerStateData1 - add hl, bc - ld a, [wCurPikaMovementSpriteImageIdx] - ld [hl], a - ld a, [wPikaSpriteY] - ld d, a - ld a, [wPikachuMovementYOffset] - add d - ld hl, wSpritePlayerStateData1YPixels - wSpritePlayerStateData1 - add hl, bc - ld [hl], a - ld a, [wPikaSpriteX] - ld d, a - ld a, [wPikachuMovementXOffset] - add d - ld hl, wSpritePlayerStateData1XPixels - wSpritePlayerStateData1 - add hl, bc - ld [hl], a - ld hl, wPikachuMovementFlags - bit 6, [hl] - ret z - ld hl, wSpritePlayerStateData2GrassPriority - wSpritePlayerStateData1 - add hl, bc - ld [hl], 0 - ret - -AnimatePikachuShadow: - ld hl, wPikachuMovementFlags - bit 6, [hl] - res 6, [hl] - ld hl, wd736 - res 6, [hl] - ret z - set 6, [hl] - call LoadPikachuShadowOAMData - ret - -PikachuMovementDatabase: - db $01, 1 - 1, $00, 1 - 1 ; $00 start - - db $03, $80, $01, 1 - 1 ; $01 - db $04, $80, $01, 1 - 1 ; $02 - db $05, $80, $01, 1 - 1 ; $03 - db $06, $80, $01, 1 - 1 ; $04 - db $07, $80, $01, 1 - 1 ; $05 - db $08, $80, $01, 1 - 1 ; $06 - db $09, $80, $01, 1 - 1 ; $07 - db $0a, $80, $01, 1 - 1 ; $08 - - db $03, $80, $06, 1 - 1 ; $09 - db $04, $80, $06, 1 - 1 ; $0a - db $05, $80, $06, 1 - 1 ; $0b - db $06, $80, $06, 1 - 1 ; $0c - db $07, $80, $06, 1 - 1 ; $0d - db $08, $80, $06, 1 - 1 ; $0e - db $09, $80, $06, 1 - 1 ; $0f - db $0a, $80, $06, 1 - 1 ; $10 - - db $03, $80, $03, $80 ; $11 - db $04, $80, $03, $80 ; $12 - db $05, $80, $03, $80 ; $13 - db $06, $80, $03, $80 ; $14 - db $07, $80, $03, $80 ; $15 - db $08, $80, $03, $80 ; $16 - db $09, $80, $03, $80 ; $17 - db $0a, $80, $03, $80 ; $18 - - db $03, $80, $07, $80 ; $19 - db $04, $80, $07, $80 ; $1a - db $05, $80, $07, $80 ; $1b - db $06, $80, $07, $80 ; $1c - - db $0b, (1 << 5) | 8 - 1, $02, 1 - 1 ; $1d step down - db $0c, (1 << 5) | 8 - 1, $02, 1 - 1 ; $1e step up - db $0d, (1 << 5) | 8 - 1, $02, 1 - 1 ; $1f step left - db $0e, (1 << 5) | 8 - 1, $02, 1 - 1 ; $20 step right - db $0f, (1 << 5) | 8 - 1, $02, 1 - 1 ; $21 step down left - db $10, (1 << 5) | 8 - 1, $02, 1 - 1 ; $22 step down right - db $11, (1 << 5) | 8 - 1, $02, 1 - 1 ; $23 step up left - db $12, (1 << 5) | 8 - 1, $02, 1 - 1 ; $24 step up right - - db $0b, 16 - 1, $02, 1 - 1 ; $25 slide down - db $0c, 16 - 1, $02, 1 - 1 ; $26 slide up - db $0d, 16 - 1, $02, 1 - 1 ; $27 slide left - db $0e, 16 - 1, $02, 1 - 1 ; $28 slide right - db $0f, 16 - 1, $02, 1 - 1 ; $29 slide down left - db $10, 16 - 1, $02, 1 - 1 ; $2a slide down right - db $11, 16 - 1, $02, 1 - 1 ; $2b slide up left - db $12, 16 - 1, $02, 1 - 1 ; $2c slide up right - - db $0b, 16 - 1, $08, (1 << 4) | 8 - 1 ; $2d hop down - db $0c, 16 - 1, $08, (1 << 4) | 8 - 1 ; $2e hop up - db $0d, 16 - 1, $08, (1 << 4) | 8 - 1 ; $2f hop left - db $0e, 16 - 1, $08, (1 << 4) | 8 - 1 ; $30 hop right - db $0f, 16 - 1, $08, (1 << 4) | 8 - 1 ; $31 hop down left - db $10, 16 - 1, $08, (1 << 4) | 8 - 1 ; $32 hop down right - db $11, 16 - 1, $08, (1 << 4) | 8 - 1 ; $33 hop up left - db $12, 16 - 1, $08, (1 << 4) | 8 - 1 ; $34 hop up right - - db $13, 16 - 1, $06, 1 - 1 ; $35 look down - db $14, 16 - 1, $06, 1 - 1 ; $36 look up - db $15, 16 - 1, $06, 1 - 1 ; $37 look left - db $16, 16 - 1, $06, 1 - 1 ; $38 look right - - db $02, $80, $04, 1 - 1 ; $39 - db $02, $80, $05, 1 - 1 ; $3a - db $02, $80, $03, $80 ; $3b - db $02, $80, $07, $80 ; $3c - db $02, $80, $09, $80 ; $3d - db $02, $80, $06, 1 - 1 ; $3e - -PikaMovementFunc1Jumptable: - dw PikaMovementFunc1_EndCommand_ ; 00 - dw PikaMovementFunc1_LoadPikachuCurrentPosition ; 01 - dw PikaMovementFunc1_DelayFrames ; 02 - dw PikaMovementFunc1_WalkInCurrentFacingDirection ; 03 - dw PikaMovementFunc1_WalkInOppositeFacingDirection ; 04 - dw PikaMovementFunc1_StepTurningCounterclockwise ; 05 - dw PikaMovementFunc1_StepTurningClockwise ; 06 - dw PikaMovementFunc1_StepForwardLeft ; 07 - dw PikaMovementFunc1_StepForwardRight ; 08 - dw PikaMovementFunc1_StepBackwardLeft ; 09 - dw PikaMovementFunc1_StepBackwardRight ; 0a - dw PikaMovementFunc1_MoveDown ; 0b - dw PikaMovementFunc1_MoveUp ; 0c - dw PikaMovementFunc1_MoveLeft ; 0d - dw PikaMovementFunc1_MoveRight ; 0e - dw PikaMovementFunc1_MoveDownLeft ; 0f - dw PikaMovementFunc1_MoveDownRight ; 10 - dw PikaMovementFunc1_MoveUpLeft ; 11 - dw PikaMovementFunc1_MoveUpRight ; 12 - dw PikaMovementFunc1_LookDown ; 13 - dw PikaMovementFunc1_LookUp ; 14 - dw PikaMovementFunc1_LookLeft ; 15 - dw PikaMovementFunc1_LookRight ; 16 - dw PikaMovementFunc1_EndCommand_ ; 17 - -PikaMovementFunc1_EndCommand: - ld a, [wPikachuMovementFlags] - set 7, a - ld [wPikachuMovementFlags], a - ret - -PikaMovementFunc1_EndCommand_: - call PikaMovementFunc1_EndCommand - ret - -PikaMovementFunc1_LoadPikachuCurrentPosition: - ld hl, wSpritePlayerStateData1YPixels - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - ld [wPikaSpriteY], a - ld hl, wSpritePlayerStateData1XPixels - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - ld [wPikaSpriteX], a - xor a - ld [wPikachuMovementYOffset], a - ld [wPikachuMovementXOffset], a - call PikaMovementFunc1_EndCommand - ret - -PikaMovementFunc1_DelayFrames: - call CheckPikachuStepTimer1 - ret nz - call PikaMovementFunc1_EndCommand - ret - -PikaMovementFunc1_WalkInCurrentFacingDirection: - call GetPikachuFacing - jr PikaMovementFunc1_ApplyStepVector - -PikaMovementFunc1_WalkInOppositeFacingDirection: - call GetPikachuFacing - xor %100 - jr PikaMovementFunc1_ApplyStepVector - -PikaMovementFunc1_StepTurningCounterclockwise: - call GetPikachuFacing - ld hl, .Data - call PikaMovementFunc1_GetNextFacing - jr PikaMovementFunc1_ApplyStepVector - -.Data: - db SPRITE_FACING_DOWN, PIKASTEPDIR_RIGHT << 2 - db SPRITE_FACING_UP, PIKASTEPDIR_LEFT << 2 - db SPRITE_FACING_LEFT, PIKASTEPDIR_DOWN << 2 - db SPRITE_FACING_RIGHT, PIKASTEPDIR_UP << 2 - db $ff - -PikaMovementFunc1_StepTurningClockwise: - call GetPikachuFacing - ld hl, .Data - call PikaMovementFunc1_GetNextFacing - jr PikaMovementFunc1_ApplyStepVector - -.Data: - db SPRITE_FACING_DOWN, PIKASTEPDIR_LEFT << 2 - db SPRITE_FACING_UP, PIKASTEPDIR_RIGHT << 2 - db SPRITE_FACING_LEFT, PIKASTEPDIR_UP << 2 - db SPRITE_FACING_RIGHT, PIKASTEPDIR_DOWN << 2 - db $ff - -PikaMovementFunc1_StepForwardLeft: - call GetPikachuFacing - ld hl, .Data - call PikaMovementFunc1_GetNextFacing - jr PikaMovementFunc1_ApplyStepVector - -.Data: - db SPRITE_FACING_DOWN, PIKASTEPDIR_DOWN_RIGHT << 2 - db SPRITE_FACING_UP, PIKASTEPDIR_UP_LEFT << 2 - db SPRITE_FACING_LEFT, PIKASTEPDIR_DOWN_LEFT << 2 - db SPRITE_FACING_RIGHT, PIKASTEPDIR_UP_RIGHT << 2 - -PikaMovementFunc1_StepForwardRight: - call GetPikachuFacing - ld hl, .Data - call PikaMovementFunc1_GetNextFacing - jr PikaMovementFunc1_ApplyStepVector - -.Data: - db SPRITE_FACING_DOWN, PIKASTEPDIR_DOWN_LEFT << 2 - db SPRITE_FACING_UP, PIKASTEPDIR_UP_RIGHT << 2 - db SPRITE_FACING_LEFT, PIKASTEPDIR_UP_LEFT << 2 - db SPRITE_FACING_RIGHT, PIKASTEPDIR_DOWN_RIGHT << 2 - -PikaMovementFunc1_StepBackwardLeft: - call GetPikachuFacing - ld hl, .Data - call PikaMovementFunc1_GetNextFacing - jr PikaMovementFunc1_ApplyStepVector - -.Data: - db SPRITE_FACING_DOWN, PIKASTEPDIR_UP_RIGHT << 2 - db SPRITE_FACING_UP, PIKASTEPDIR_DOWN_LEFT << 2 - db SPRITE_FACING_LEFT, PIKASTEPDIR_DOWN_RIGHT << 2 - db SPRITE_FACING_RIGHT, PIKASTEPDIR_UP_LEFT << 2 - -PikaMovementFunc1_StepBackwardRight: - call GetPikachuFacing - ld hl, .Data - call PikaMovementFunc1_GetNextFacing - jr PikaMovementFunc1_ApplyStepVector - -.Data: - db SPRITE_FACING_DOWN, PIKASTEPDIR_UP_LEFT << 2 - db SPRITE_FACING_UP, PIKASTEPDIR_DOWN_RIGHT << 2 - db SPRITE_FACING_LEFT, PIKASTEPDIR_UP_RIGHT << 2 - db SPRITE_FACING_RIGHT, PIKASTEPDIR_DOWN_LEFT << 2 - -PikaMovementFunc1_ApplyStepVector: - rrca - rrca - and $7 - ld e, a - call GetPikachuStepVectorMagnitude - ld d, a - call UpdatePikachuPosition - call CheckPikachuStepTimer1 - ret nz - call PikaMovementFunc1_EndCommand - ret - -PikaMovementFunc1_GetNextFacing: - push de - ld d, a -.loop - ld a, [hli] - cp d - jr z, .found - inc hl - cp $ff - jr nz, .loop - pop de - ret - -.found - ld a, [hl] - pop de - scf - ret - -PikaMovementFunc1_MoveDown: - ld a, PIKASTEPDIR_DOWN - jr PikaMovementFunc1_ApplyFacingAndMove - -PikaMovementFunc1_MoveUp: - ld a, PIKASTEPDIR_UP - jr PikaMovementFunc1_ApplyFacingAndMove - -PikaMovementFunc1_MoveLeft: - ld a, PIKASTEPDIR_LEFT - jr PikaMovementFunc1_ApplyFacingAndMove - -PikaMovementFunc1_MoveRight: - ld a, PIKASTEPDIR_RIGHT - jr PikaMovementFunc1_ApplyFacingAndMove - -PikaMovementFunc1_MoveDownLeft: - ld e, PIKASTEPDIR_DOWN_LEFT - jr PikaMovementFunc1_MoveDiagonally - -PikaMovementFunc1_MoveDownRight: - ld e, PIKASTEPDIR_DOWN_RIGHT - jr PikaMovementFunc1_MoveDiagonally - -PikaMovementFunc1_MoveUpLeft: - ld e, PIKASTEPDIR_UP_LEFT - jr PikaMovementFunc1_MoveDiagonally - -PikaMovementFunc1_MoveUpRight: - ld e, PIKASTEPDIR_UP_RIGHT - jr PikaMovementFunc1_MoveDiagonally - -PikaMovementFunc1_ApplyFacingAndMove: - ld e, a - call SetPikachuFacing -PikaMovementFunc1_MoveDiagonally: - call GetPikachuStepVectorMagnitude - ld d, a - push de - call UpdatePikachuPosition - pop de - call CheckPikachuStepTimer1 - ret nz - ld a, e - call ApplyPikachuStepVector - call PikaMovementFunc1_EndCommand - ret - -PikaMovementFunc1_LookDown: - ld a, PIKASTEPDIR_DOWN - jr PikaMovementFunc1_ApplyFacing - -PikaMovementFunc1_LookUp: - ld a, PIKASTEPDIR_UP - jr PikaMovementFunc1_ApplyFacing - -PikaMovementFunc1_LookLeft: - ld a, PIKASTEPDIR_LEFT - jr PikaMovementFunc1_ApplyFacing - -PikaMovementFunc1_LookRight: - ld a, PIKASTEPDIR_RIGHT - jr PikaMovementFunc1_ApplyFacing - -PikaMovementFunc1_ApplyFacing: - call SetPikachuFacing - call PikaMovementFunc1_EndCommand - ret - -UpdatePikachuPosition: - push de - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - pop de - ld a, d - jp hl - -.Jumptable: - dw .Down - dw .Up - dw .Left - dw .Right - dw .DownLeft - dw .DownRight - dw .UpLeft - dw .UpRight - -.Down: - ld d, 0 - ld e, a - jr .ApplyVector - -.Up: - ld d, 0 - cpl - inc a - ld e, a - jr .ApplyVector - -.Left: - cpl - inc a - ld d, a - ld e, 0 - jr .ApplyVector - -.Right: - ld d, a - ld e, 0 - jr .ApplyVector - -.DownLeft: - ld e, a - cpl - inc a - ld d, a - jr .ApplyVector - -.DownRight: - ld e, a - ld d, a - jr .ApplyVector - -.UpLeft: - cpl - inc a - ld e, a - ld d, a - jr .ApplyVector - -.UpRight: - ld d, a - cpl - inc a - ld e, a - jr .ApplyVector - -.ApplyVector: - ld a, [wPikaSpriteX] - add d - ld [wPikaSpriteX], a - ld a, [wPikaSpriteY] - add e - ld [wPikaSpriteY], a - ret - -PikaMovementFunc2Jumptable: - dw PikaMovementFunc2_ResetFrameCounterAndFaceCurrent ; 0 - dw PikaMovementFunc2_UpdateSpriteImageIdxWithPreviousImageIdxDirection ; 1 - dw PikaMovementFunc2_UpdateSpriteImageIdxWithFacing ; 2 - dw PikaMovementFunc2_TurnParameter ; 3 - dw PikaMovementFunc2_TurnClockwise ; 4 - dw PikaMovementFunc2_TurnCounterClockwise ; 5 - dw PikaMovementFunc2_CopySpriteImageIdxDirectionToSpriteImageIdx ; 6 - dw PikaMovementFunc2_UpdateJumpWithPreviousImageIdxDirection ; 7 - dw PikaMovementFunc2_UpdateJumpWithFacing ; 8 - dw PikaMovementFunc2_CopyFacingToJump ; 9 - dw PikaMovementFunc2_nop ; 10 - -PikaMovement_SetSpawnShadow: - ld hl, wPikachuMovementFlags - set 6, [hl] - ret - -PikaMovementFunc2_ResetFrameCounterAndFaceCurrent: - ld hl, wSpritePlayerStateData1IntraAnimFrameCounter - wSpritePlayerStateData1 - add hl, bc - xor a - ld [hli], a - ld [hl], a - call PikaMovementFunc2_GetImageBaseOffset - ld d, a - call GetPikachuFacing - or d - ld [wCurPikaMovementSpriteImageIdx], a - ret - -PikaMovementFunc2_nop: - ret - -PikaMovementFunc2_CopySpriteImageIdxDirectionToSpriteImageIdx: - call PikaMovementFunc2_GetImageBaseOffset - ld d, a - call PikaMovementFunc2_GetSpriteImageIdxDirection - or d - ld [wCurPikaMovementSpriteImageIdx], a - ret - -PikaMovementFunc2_UpdateSpriteImageIdxWithFacing: - call PikaMovementFunc2_GetImageBaseOffset - ld d, a - call GetPikachuFacing - or d - ld d, a - jr PikaMovementFunc2_UpdateSpriteImageIdx - -PikaMovementFunc2_UpdateSpriteImageIdxWithPreviousImageIdxDirection: - call PikaMovementFunc2_GetImageBaseOffset - ld d, a - call PikaMovementFunc2_GetSpriteImageIdxDirection - or d - ld d, a -PikaMovementFunc2_UpdateSpriteImageIdx: - ld hl, wSpritePlayerStateData1AnimFrameCounter - wSpritePlayerStateData1 - add hl, bc - call CheckPikachuStepTimer2 ; does not preserve hl - jr nz, .skip - inc [hl] -.skip - ld a, [hl] - rrca - rrca - and 3 - or d - ld [wCurPikaMovementSpriteImageIdx], a - ret - -PikaMovementFunc2_UpdateJumpWithFacing: - call GetPikachuFacing - ld d, a - jr PikaMovementFunc2_UpdateJump - -PikaMovementFunc2_UpdateJumpWithPreviousImageIdxDirection: - call PikaMovementFunc2_GetSpriteImageIdxDirection - ld d, a -PikaMovementFunc2_UpdateJump: - call PikaMovementFunc2_GetImageBaseOffset - or d - ld d, a - call PikaMovementFunc2_Timer - or d - ld [wCurPikaMovementSpriteImageIdx], a - call PikaMovementFunc_Sine - ld [wPikachuMovementYOffset], a - and a - ret z - call PikaMovement_SetSpawnShadow - ret - -PikaMovementFunc2_CopyFacingToJump: - call GetPikachuFacing - ld d, a - call PikaMovementFunc2_GetImageBaseOffset - or d - ld [wCurPikaMovementSpriteImageIdx], a - call PikaMovementFunc_Sine - ld [wPikachuMovementYOffset], a - ret - -PikaMovementFunc2_TurnParameter: - ld a, [wCurPikaMovementParam2] - and $40 - cp $40 - jr z, PikaMovementFunc2_TurnClockwise - jr PikaMovementFunc2_TurnCounterClockwise - -PikaMovementFunc2_TurnClockwise: - call PikaMovementFunc2_GetSpriteImageIdxDirection - ld d, a - call CheckPikachuStepTimer2 - jr nz, .skip - ld hl, Data_fd731 -.loop - ld a, [hli] - cp d - jr nz, .loop - ld d, [hl] -.skip - call PikaMovementFunc2_GetImageBaseOffset - or d - ld [wCurPikaMovementSpriteImageIdx], a - ret - -PikaMovementFunc2_TurnCounterClockwise: - call PikaMovementFunc2_GetSpriteImageIdxDirection - ld d, a - call CheckPikachuStepTimer2 - jr nz, .skip - ld hl, Data_fd731End -.loop - ld a, [hld] - cp d - jr nz, .loop - ld d, [hl] -.skip - call PikaMovementFunc2_GetImageBaseOffset - or d - ld [wCurPikaMovementSpriteImageIdx], a - ret - -Data_fd731: - db SPRITE_FACING_DOWN - db SPRITE_FACING_LEFT - db SPRITE_FACING_UP - db SPRITE_FACING_RIGHT - db SPRITE_FACING_DOWN -Data_fd731End: - -PikaMovementFunc2_Timer: - push hl - ld hl, wSpritePlayerStateData1IntraAnimFrameCounter - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - inc a - and $3 - ld [hli], a - jr nz, .load_pop - ld a, [hl] - inc a - and $3 - ld [hl], a -.load_pop - ld a, [hl] - pop hl - ret - -PikaMovementFunc2_GetImageBaseOffset: - push hl - ld hl, wSpritePlayerStateData2ImageBaseOffset - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - dec a - swap a - pop hl - ret - -PikaMovementFunc2_GetSpriteImageIdxDirection: - push hl - ld hl, wSpritePlayerStateData1ImageIndex - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - and $c - pop hl - ret - -GetPikachuFacing: - push hl - ld hl, wSpritePlayerStateData1FacingDirection - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - and $c - pop hl - ret - -SetPikachuFacing: - push hl - ld hl, wSpritePlayerStateData1FacingDirection - wSpritePlayerStateData1 - add hl, bc - add a - add a - and $c - ld [hl], a - pop hl - ret - -CheckPikachuStepTimer1: - ld hl, wPikachuStepTimer - inc [hl] - ld a, [wCurPikaMovementParam1] - and $1f - inc a - cp [hl] - ret nz - ld [hl], 0 - ret - -GetPikachuStepVectorMagnitude: - ; *XX***** - ld a, [wCurPikaMovementParam1] - swap a - rrca - and $3 - inc a - ret - -CheckPikachuStepTimer2: - ld hl, wPikachuStepSubtimer - inc [hl] - ld a, [wCurPikaMovementParam2] - and $f - inc a - cp [hl] - ret nz - ld [hl], 0 - ret - -PikaMovementFunc_Sine: - call .GetArgument - ld a, [wPikachuStepSubtimer] - add e - ld [wPikachuStepSubtimer], a - add $20 - ld e, a - push hl - push bc - call Sine_e - pop bc - pop hl - ret - -.GetArgument: - ld a, [wCurPikaMovementParam2] - and $f - inc a - ld d, a - ld a, [wCurPikaMovementParam2] - swap a - and $7 - ld e, a - ld a, 1 - jr z, .okay -.loop - add a - dec e - jr nz, .loop -.okay - ld e, a - ret - -ApplyPikachuStepVector: - push bc - ld c, a - ld b, 0 - ld hl, .StepVectors - add hl, bc - add hl, bc - ld d, [hl] - inc hl - ld e, [hl] - pop bc - ld hl, wSpritePlayerStateData2MapY - wSpritePlayerStateData1 - add hl, bc - ld a, [hl] - add e - ld [hli], a - ld a, [hl] - add d - ld [hl], a - ret - -.StepVectors: - db 0, 1 - db 0, -1 - db -1, 0 - db 1, 0 - db -1, 1 - db 1, 1 - db -1, -1 - db 1, -1 - -LoadPikachuShadowOAMData: - push bc - push de - push hl - - ld bc, wOAMBuffer + 4 * 36 - ld a, [wPikaSpriteY] - ld e, a - ld a, [wPikaSpriteX] - ld d, a - ld hl, .OAMData - call .LoadOAMData - - pop hl - pop de - pop bc - ret - -.OAMData: - db 2 - db $0c, $00, $ff, 0 - db $0c, $08, $ff, 1 << OAM_X_FLIP - -.LoadOAMData: - ld a, e - add $10 - ld e, a - ld a, d - add $8 - ld d, a - ld a, [hli] -.loop - push af - ld a, [hli] - add e - ld [bc], a - inc bc - ld a, [hli] - add d - ld [bc], a - inc bc - ld a, [hli] - ld [bc], a - inc bc - ld a, [hli] - ld [bc], a - inc bc - pop af - dec a - jr nz, .loop - ret - -LoadPikachuShadowIntoVRAM:: - ld hl, vNPCSprites2 + $7f * $10 - ld de, LedgeHoppingShadowGFX_3F - lb bc, BANK(LedgeHoppingShadowGFX_3F), (LedgeHoppingShadowGFX_3FEnd - LedgeHoppingShadowGFX_3F) / 8 - jp CopyVideoDataDoubleAlternate - -LedgeHoppingShadowGFX_3F: -INCBIN "gfx/overworld/shadow.1bpp" -LedgeHoppingShadowGFX_3FEnd: - -LoadPikachuBallIconIntoVRAM: - ld hl, vNPCSprites2 + $7e * $10 - ld de, GFX_fd86b - lb bc, BANK(GFX_fd86b), 1 - jp CopyVideoDataDoubleAlternate - -Func_fd851: - ld hl, vNPCSprites + $c * $10 - ld a, 3 -.loop - push af - push hl - ld de, GFX_fd86b - lb bc, BANK(GFX_fd86b), 4 - call CopyVideoDataAlternate - pop hl - ld de, 4 * $10 - add hl, de - pop af - dec a - jr nz, .loop - ret - -GFX_fd86b: -INCBIN "gfx/unknown_fd86b.2bpp" - -LoadPikachuSpriteIntoVRAM: - ld de, PikachuSprite - lb bc, BANK(PikachuSprite), (SandshrewSprite - PikachuSprite) / 32 - ld hl, vNPCSprites + $c * $10 - push bc - call CopyVideoDataAlternate - ld de, PikachuSprite + $c * $10 - ld hl, vNPCSprites2 + $c * $10 - ldh a, [hFFFC] - and a - jr z, .load - ld de, PikachuSprite + $c * $10 - ld hl, vNPCSprites2 + $4c * $10 -.load - pop bc - call CopyVideoDataAlternate - call LoadPikachuShadowIntoVRAM - call LoadPikachuBallIconIntoVRAM - ret - -PikachuPewterPokecenterCheck: - ld a, [wCurMap] - cp PEWTER_POKECENTER - ret nz - call EnablePikachuFollowingPlayer - call StarterPikachuEmotionCommand_turnawayfromplayer - ret - -PikachuFanClubCheck: - ld a, [wCurMap] - cp POKEMON_FAN_CLUB - ret nz - call EnablePikachuFollowingPlayer - call StarterPikachuEmotionCommand_turnawayfromplayer - ret - -PikachuBillsHouseCheck: - ld a, [wCurMap] - cp BILLS_HOUSE - ret nz - call EnablePikachuFollowingPlayer - ret - -Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3: - call LoadCurrentMapView - call UpdateSprites - call Delay3 - ret - -Cosine_e: ; cosine? - ld a, e - add $10 - jr asm_fd908 - -Sine_e: ; sine? - ld a, e -asm_fd908: - and $3f - cp $20 - jr nc, .asm_fd913 - call GetSine - ld a, h - ret - -.asm_fd913 - and $1f - call GetSine - ld a, h - cpl - inc a - ret - -GetSine: - ld e, a - ld a, d - ld d, 0 - ld hl, SineWave_3f - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, 0 -.asm_fd92b - srl a - jr nc, .asm_fd930 - add hl, de -.asm_fd930 - sla e - rl d - and a - jr nz, .asm_fd92b - ret - -SineWave_3f: - sine_wave $100 diff --git a/engine/pikachu_pcm.asm b/engine/pikachu_pcm.asm deleted file mode 100755 index bf1aa57f..00000000 --- a/engine/pikachu_pcm.asm +++ /dev/null @@ -1,154 +0,0 @@ -PlayPikachuSoundClip:: - ld a, e - ld e, a - ld d, $0 - ld hl, PikachuCriesPointerTable - add hl, de - add hl, de - add hl, de - ld b, [hl] ; bank of pikachu cry data - inc hl - ld a, [hli] ; cry data pointer - ld h, [hl] - ld l, a - ld c, $4 -.loop - dec c - jr z, .done_delay - call DelayFrame - jr .loop - -.done_delay - di - push bc - push hl - ld a, $80 - ldh [rNR52], a - ld a, $77 - ldh [rNR50], a - xor a - ldh [rNR30], a - ld hl, rWave_0 ; wave data - ld de, wRedrawRowOrColumnSrcTiles -.saveWaveDataLoop - ld a, [hl] - ld [de], a - inc de - ld a, $ff - ld [hli], a - ld a, l - cp $40 ; end of wave data - jr nz, .saveWaveDataLoop - ld a, $80 - ldh [rNR30], a - ldh a, [rNR51] - or $44 - ldh [rNR51], a - ld a, $ff - ldh [rNR31], a - ld a, $20 - ldh [rNR32], a - ld a, $ff - ldh [rNR33], a - ld a, $87 - ldh [rNR34], a - pop hl - pop bc - call PlayPikachuPCM - xor a - ld [wc0f3], a - ld [wc0f4], a - ld a, $80 - ldh [rNR52], a - xor a - ldh [rNR30], a - ld hl, rWave_0 - ld de, wRedrawRowOrColumnSrcTiles -.reloadWaveDataLoop - ld a, [de] - inc de - ld [hli], a - ld a, l - cp $40 ; end of wave data - jr nz, .reloadWaveDataLoop - ld a, $80 - ldh [rNR30], a - ldh a, [rNR51] - and $bb - ldh [rNR51], a - xor a - ld [wChannelSoundIDs + Ch5], a - ld [wChannelSoundIDs + Ch6], a - ld [wChannelSoundIDs + Ch7], a - ld [wChannelSoundIDs + Ch8], a - ldh a, [hLoadedROMBank] - ei - ret - -PikachuCriesPointerTable:: -; format: -; db bank -; dw pointer to cry - -; bank 21 - pikacry_def PikachuCry1 - pikacry_def PikachuCry2 - pikacry_def PikachuCry3 - pikacry_def PikachuCry4 - -; bank 22 - pikacry_def PikachuCry5 - pikacry_def PikachuCry6 - pikacry_def PikachuCry7 - -; bank 23 - pikacry_def PikachuCry8 - pikacry_def PikachuCry9 - pikacry_def PikachuCry10 - -; bank 24 - pikacry_def PikachuCry11 - pikacry_def PikachuCry12 - pikacry_def PikachuCry13 - -; bank 25 - pikacry_def PikachuCry14 - pikacry_def PikachuCry15 - -; banks 31-34, in no particular order - - pikacry_def PikachuCry16 - pikacry_def PikachuCry17 - pikacry_def PikachuCry18 - pikacry_def PikachuCry19 - pikacry_def PikachuCry20 - pikacry_def PikachuCry21 - pikacry_def PikachuCry22 - pikacry_def PikachuCry23 - pikacry_def PikachuCry24 - pikacry_def PikachuCry25 - pikacry_def PikachuCry26 - -; bank 35 - pikacry_def PikachuCry27 - pikacry_def PikachuCry28 - pikacry_def PikachuCry29 - pikacry_def PikachuCry30 - pikacry_def PikachuCry31 - -; bank 36 - pikacry_def PikachuCry32 - pikacry_def PikachuCry33 - pikacry_def PikachuCry34 - -; bank 37 - pikacry_def PikachuCry35 - pikacry_def PikachuCry36 - -; banks 36-38 - pikacry_def PikachuCry37 - pikacry_def PikachuCry38 - pikacry_def PikachuCry39 - pikacry_def PikachuCry40 - pikacry_def PikachuCry41 - pikacry_def PikachuCry42 diff --git a/engine/pikachu_pic_animation.asm b/engine/pikachu_pic_animation.asm deleted file mode 100755 index 7829c048..00000000 --- a/engine/pikachu_pic_animation.asm +++ /dev/null @@ -1,851 +0,0 @@ -GetPikaPicAnimationScriptIndex: - ld hl, PikachuMoodLookupTable - ld a, [wPikachuMood] - ld d, a -.get_mood_param - ld a, [hli] - inc hl - cp d - jr c, .get_mood_param - dec hl - ld e, [hl] - ld hl, PikaPicAnimationScriptPointerLookupTable - ld a, [wPikachuHappiness] - ld d, a - ld bc, 6 -.get_happiness_param - ld a, [hl] - cp d - jr nc, .got_animation - add hl, bc - jr .get_happiness_param - -.got_animation - ld d, 0 - add hl, de - ld a, [hl] - ret - -PikachuMoodLookupTable: -; First byte: mood threshold -; Second byte: column index in PikaPicAnimationScriptPointerLookupTable - db 40, 1 - db 127, 2 - db 128, 3 - db 210, 4 - db 255, 5 - -PikaPicAnimationScriptPointerLookupTable: -; First byte: happiness threshold -; Remaining bytes: loaded based on Pikachu's mood - db 50 - dpikapic PikaPicAnimScript14 - dpikapic PikaPicAnimScript14 - dpikapic PikaPicAnimScript6 - dpikapic PikaPicAnimScript13 - dpikapic PikaPicAnimScript13 - - db 100 - dpikapic PikaPicAnimScript9 - dpikapic PikaPicAnimScript9 - dpikapic PikaPicAnimScript5 - dpikapic PikaPicAnimScript12 - dpikapic PikaPicAnimScript12 - - db 130 - dpikapic PikaPicAnimScript3 - dpikapic PikaPicAnimScript3 - dpikapic PikaPicAnimScript1 - dpikapic PikaPicAnimScript8 - dpikapic PikaPicAnimScript8 - - db 160 - dpikapic PikaPicAnimScript3 - dpikapic PikaPicAnimScript3 - dpikapic PikaPicAnimScript4 - dpikapic PikaPicAnimScript15 - dpikapic PikaPicAnimScript15 - - db 200 - dpikapic PikaPicAnimScript17 - dpikapic PikaPicAnimScript17 - dpikapic PikaPicAnimScript7 - dpikapic PikaPicAnimScript2 - dpikapic PikaPicAnimScript2 - - db 250 - dpikapic PikaPicAnimScript17 - dpikapic PikaPicAnimScript17 - dpikapic PikaPicAnimScript16 - dpikapic PikaPicAnimScript10 - dpikapic PikaPicAnimScript10 - - db 255 - dpikapic PikaPicAnimScript17 - dpikapic PikaPicAnimScript17 - dpikapic PikaPicAnimScript19 - dpikapic PikaPicAnimScript20 - dpikapic PikaPicAnimScript20 - -StarterPikachuEmotionCommand_pikapic: - ldh a, [hAutoBGTransferEnabled] - push af - xor a - ldh [hAutoBGTransferEnabled], a - ld a, [de] - ld [wPikaPicAnimNumber], a - inc de - push de - call .RunPikapic - pop de - pop af - ldh [hAutoBGTransferEnabled], a - ret - -.RunPikapic: - call PlacePikapicTextBoxBorder - callfar LoadOverworldPikachuFrontpicPalettes - call ResetPikaPicAnimBuffer - call LoadCurrentPikaPicAnimScriptPointer - call ExecutePikaPicAnimScript - call PlacePikapicTextBoxBorder - call RunDefaultPaletteCommand - ret - -ResetPikaPicAnimBuffer: - ld hl, wCurPikaMovementData - ld bc, wCurPikaMovementDataEnd - wCurPikaMovementData - xor a - call FillMemory - ld hl, wPikaPicAnimObjectDataBufferSize - ld bc, wPikaPicAnimObjectDataBufferEnd - wPikaPicAnimObjectDataBufferSize - xor a - call FillMemory - call ClearPikaPicUsedGFXBuffer - ld hl, 100 - ld a, l - ld [wPikaPicAnimTimer], a - ld a, h - ld [wPikaPicAnimTimer + 1], a - ld a, $7 - ld [wPikaPicPikaDrawStartX], a - ld a, $6 - ld [wPikaPicPikaDrawStartY], a - ret - -PlacePikapicTextBoxBorder: - xor a - ldh [hAutoBGTransferEnabled], a - hlcoord 6, 5 - lb bc, 5, 5 - call TextBoxBorder - call Delay3 - call UpdateSprites - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call Delay3 - ret - -LoadCurrentPikaPicAnimScriptPointer: - ld a, [wPikaPicAnimNumber] - cp $1d - jr c, .valid - ld a, $0 -.valid - ld e, a - ld d, 0 - ld hl, PikaPicAnimPointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call UpdatePikaPicAnimPointer - ret - -PikaPicAnimPointers: -pikapic_def: macro -\1_id: dw \1 -endm - - pikapic_def PikaPicAnimScript0 ; 00 - pikapic_def PikaPicAnimScript1 ; 01 - pikapic_def PikaPicAnimScript2 ; 02 - pikapic_def PikaPicAnimScript3 ; 03 - pikapic_def PikaPicAnimScript4 ; 04 - pikapic_def PikaPicAnimScript5 ; 05 - pikapic_def PikaPicAnimScript6 ; 06 - pikapic_def PikaPicAnimScript7 ; 07 - pikapic_def PikaPicAnimScript8 ; 08 - pikapic_def PikaPicAnimScript9 ; 09 - pikapic_def PikaPicAnimScript10 ; 0a - pikapic_def PikaPicAnimScript11 ; 0b - pikapic_def PikaPicAnimScript12 ; 0c - pikapic_def PikaPicAnimScript13 ; 0d - pikapic_def PikaPicAnimScript14 ; 0e - pikapic_def PikaPicAnimScript15 ; 0f - pikapic_def PikaPicAnimScript16 ; 10 - pikapic_def PikaPicAnimScript17 ; 11 - pikapic_def PikaPicAnimScript18 ; 12 - pikapic_def PikaPicAnimScript19 ; 13 - pikapic_def PikaPicAnimScript20 ; 14 - pikapic_def PikaPicAnimScript21 ; 15 - pikapic_def PikaPicAnimScript22 ; 16 - pikapic_def PikaPicAnimScript23 ; 17 - pikapic_def PikaPicAnimScript24 ; 18 - pikapic_def PikaPicAnimScript25 ; 19 - pikapic_def PikaPicAnimScript26 ; 1a - pikapic_def PikaPicAnimScript27 ; 1b - pikapic_def PikaPicAnimScript28 ; 1c - pikapic_def PikaPicAnimScript29 ; 1d - -ExecutePikaPicAnimScript: -.loop - xor a - ldh [hAutoBGTransferEnabled], a - call RunPikaPicAnimSetupScript - call DummyFunction_fdad5 - call AnimateCurrentPikaPicAnimFrame - call DummyFunction_fdad5 - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call PikaPicAnimTimerAndJoypad - and a - jr z, .loop - ret - -PikaPicAnimTimerAndJoypad: - call Delay3 - call CheckPikaPicAnimTimer - and a - ret nz - call JoypadLowSensitivity - ldh a, [hJoyPressed] - and A_BUTTON | B_BUTTON - ret - -CheckPikaPicAnimTimer: - ld hl, wPikaPicAnimTimer - dec [hl] - jr nz, .not_done_yet - inc hl - ld a, [hl] - and a - jr z, .timer_expired - dec [hl] -.not_done_yet - xor a - ret - -.timer_expired - ld a, $1 - ret - -DummyFunction_fdad5: - ret - -AnimateCurrentPikaPicAnimFrame: - ld bc, wPikaPicAnimObjectDataBuffer - ld a, 4 -.loop - push af - push bc - ld hl, 0 ; struct index - add hl, bc - ld a, [hli] - and a - jr z, .skip - ld a, [hli] - ld [wCurPikaPicAnimObjectScriptIdx], a - ld a, [hli] - ld [wCurPikaPicAnimObjectFrameIdx], a - ld a, [hli] - ld [wCurPikaPicAnimObjectFrameTimer], a - ld a, [hli] - ld [wCurPikaPicAnimObjectVTileOffset], a - ld a, [hli] - ld [wCurPikaPicAnimObjectXOffset], a - ld a, [hli] - ld [wCurPikaPicAnimObjectYOffset], a - ld a, [hli] - ld [wCurPikaPicAnimObject + 6], a - push bc - call LoadPikaPicAnimObjectData - pop bc - ld hl, 1 ; script index - add hl, bc - ld a, [wCurPikaPicAnimObjectScriptIdx] - ld [hli], a - ld a, [wCurPikaPicAnimObjectFrameIdx] - ld [hli], a - ld a, [wCurPikaPicAnimObjectFrameTimer] - ld [hli], a - ld a, [wCurPikaPicAnimObjectVTileOffset] - ld [hli], a - ld a, [wCurPikaPicAnimObjectXOffset] - ld [hli], a - ld a, [wCurPikaPicAnimObjectYOffset] - ld [hli], a - ld a, [wCurPikaPicAnimObject + 6] - ld [hl], a -.skip - pop bc - ld hl, 8 - add hl, bc - ld b, h - ld c, l - pop af - dec a - jr nz, .loop - ret - -PikaPicAnimCommand_object: - ld hl, wPikaPicAnimObjectDataBuffer - ld de, 8 - ld c, 4 -.loop - ld a, [hl] - and a - jr z, .found - add hl, de - dec c - jr nz, .loop - scf - ret - -.found - ld a, [wPikaPicAnimObjectDataBufferSize] - inc a - ld [wPikaPicAnimObjectDataBufferSize], a - ld [hli], a - call GetPikaPicAnimByte - ld [hli], a - call GetPikaPicAnimByte - ld [hl], a - xor a - ld [hli], a ; overloads - ld [hli], a - call GetPikaPicAnimByte - ld [hli], a - call GetPikaPicAnimByte - ld [hli], a - call GetPikaPicAnimByte - ld [hli], a - and a - ret - -PikaPicAnimCommand_deleteobject: - call GetPikaPicAnimByte - ld b, a - ld hl, wPikaPicAnimObjectDataBuffer - ld de, 8 - ld c, 4 -.search - ld a, [hl] - cp b - jr z, .delete - add hl, de - dec c - jr nz, .search - scf - ret - -.delete - xor a - ld [hl], a - ret - -LoadPikaPicAnimObjectData: -.loop - ld a, [wCurPikaPicAnimObjectScriptIdx] - cp $23 - jr c, .valid - ld a, $4 -.valid - ld e, a - ld d, 0 - ld hl, PikaPicAnimBGFramesPointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [wCurPikaPicAnimObjectFrameIdx] - ld e, a - ld d, 0 - add hl, de - add hl, de - ld a, [hli] - cp $e0 - jr z, .end - jr .init - -.end - xor a - ld [wCurPikaPicAnimObjectFrameIdx], a - ld [wCurPikaPicAnimObjectFrameTimer], a - jr .loop - -.init - push hl - call LoadCurPikaPicObjectTilemap - pop hl - ld a, [hl] - and a - jr z, .not_done ; lasts forever - ld a, [wCurPikaPicAnimObjectFrameTimer] - inc a - ld [wCurPikaPicAnimObjectFrameTimer], a - cp [hl] - jr nz, .not_done - xor a - ld [wCurPikaPicAnimObjectFrameTimer], a - ld a, [wCurPikaPicAnimObjectFrameIdx] - inc a - ld [wCurPikaPicAnimObjectFrameIdx], a -.not_done - ret - -INCLUDE "data/pikachu_pic_objects.asm" - -LoadCurPikaPicObjectTilemap: - and a - ret z - ld e, a - ld d, 0 - ld hl, PikaPicTilemapPointers - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld a, [de] - ld c, a - inc de - ld a, [de] - ld b, a - inc de - push de - push bc - call .GetStartCoords - pop bc - pop de -.row - push bc - push hl - ld a, [wCurPikaPicAnimObjectVTileOffset] ; tile id offset - ld c, a -.col - ld a, [de] - inc de - cp $ff - jr z, .skip - add c - ld [hl], a -.skip - inc hl - dec b - jr nz, .col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec c - jr nz, .row - ret - -.GetStartCoords: - push bc - ld a, [wCurPikaPicAnimObjectYOffset] ; Y offset - ld b, a - ld a, [wPikaPicPikaDrawStartY] - add b - hlcoord 0, 0 - ld bc, SCREEN_WIDTH - call AddNTimes - ld a, [wCurPikaPicAnimObjectXOffset] ; X offset - ld c, a - ld a, [wPikaPicPikaDrawStartX] - add c - ld c, a - ld b, 0 - add hl, bc - pop bc - ret - -INCLUDE "data/pikachu_pic_tilemaps.asm" - -LoadPikaPicAnimGFXHeader: - push hl - ld e, a - ld d, 0 - ld hl, PikaPicAnimGFXHeaders - add hl, de - add hl, de - add hl, de - add hl, de - ld a, [hli] - ld c, a - ld a, [hli] - ld b, a - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - pop hl - ret - -RunPikaPicAnimSetupScript: - call .CheckAndAdvanceTimer - ret c - xor a - ld [wPikaPicAnimPointerSetupFinished], a -.loop - call GetPikaPicAnimByte - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call JumpToAddress - ld a, [wPikaPicAnimPointerSetupFinished] - and a - jr z, .loop - ret - -.CheckAndAdvanceTimer: - ld a, [wPikaPicAnimDelay] - and a - ret z - dec a - ld [wPikaPicAnimDelay], a - scf - ret - -.Jumptable: - dw PikaPicAnimCommand_nop ; 00, 0 params - dw PikaPicAnimCommand_writebyte ; 01, 1 param - dw PikaPicAnimCommand_loadgfx ; 02, 1 param - dw PikaPicAnimCommand_object ; 03, 5 params - dw PikaPicAnimCommand_nop4 ; 04, 0 params - dw PikaPicAnimCommand_nop5 ; 05, 0 params - dw PikaPicAnimCommand_deleteobject ; 06, 1 param - dw PikaPicAnimCommand_nop7 ; 07, 0 params - dw PikaPicAnimCommand_nop8 ; 08, 0 params - dw PikaPicAnimCommand_jump ; 09, 1 dw param - dw PikaPicAnimCommand_setduration ; 0a, 1 dw param - dw PikaPicAnimCommand_cry ; 0b, 1 param - dw PikaPicAnimCommand_thunderbolt ; 0c, 0 params - dw PikaPicAnimCommand_run ; 0d, 0 params (ret) - dw PikaPicAnimCommand_ret ; 0e, 0 params (ret) - -PikaPicAnimCommand_nop: - ret - -PikaPicAnimCommand_ret: - ld a, 1 - ld [wPikaPicAnimTimer], a - xor a - ld [wPikaPicAnimTimer + 1], a - jr PikaPicAnimCommand_run - -; XXX - ret - -PikaPicAnimCommand_setduration: - call GetPikaPicAnimByte - ld [wPikaPicAnimTimer], a - call GetPikaPicAnimByte - ld [wPikaPicAnimTimer + 1], a - ret - -PikaPicAnimCommand_run: - ld a, $ff - ld [wPikaPicAnimPointerSetupFinished], a - ret - -PikaPicAnimCommand_writebyte: - call GetPikaPicAnimByte - ld [wPikaPicAnimDelay], a - ret - -PikaPicAnimCommand_nop4: -PikaPicAnimCommand_nop5: -PikaPicAnimCommand_nop7: -PikaPicAnimCommand_nop8: - ret - -PikaPicAnimCommand_jump: - call GetPikaPicAnimByte - ld l, a - call GetPikaPicAnimByte - ld h, a - call UpdatePikaPicAnimPointer - ret - -GetPikaPicAnimByte: - push hl - ld hl, wPikaPicAnimPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [hli] - call UpdatePikaPicAnimPointer - pop hl - ret - -UpdatePikaPicAnimPointer: - push af - ld a, l - ld [wPikaPicAnimPointer], a - ld a, h - ld [wPikaPicAnimPointer + 1], a - pop af - ret - -PikaPicAnimCommand_loadgfx: - ld a, [wUpdateSpritesEnabled] - push af - ld a, $ff - ld [wUpdateSpritesEnabled], a - ldh a, [hAutoBGTransferEnabled] - push af - xor a - ldh [hAutoBGTransferEnabled], a - ldh a, [hTilesetType] - push af - xor a - ldh [hTilesetType], a - call GetPikaPicAnimByte - ld [wPikaPicAnimCurGraphicID], a - ld a, [wPikaPicAnimCurGraphicID] - call LoadPikaPicAnimGFXHeader - ld a, c - cp a, $ff - jr z, .compressed - call RequestPikaPicAnimGFX - jr .done - -.compressed - call DecompressRequestPikaPicAnimGFX -.done - pop af - ldh [hTilesetType], a - pop af - ldh [hAutoBGTransferEnabled], a - pop af - ld [wUpdateSpritesEnabled], a - ret - -RequestPikaPicAnimGFX: - push de - ld a, [wPikaPicAnimCurGraphicID] - ld d, a - ld e, c - call CheckIfThereIsRoomForPikaPicAnimGFX - pop de - jr c, .failed - call GetPikaPicVRAMAddressForNewGFX - call CopyVideoDataAlternate - and a -.failed - ret - -DecompressRequestPikaPicAnimGFX: - push de - ld a, [wPikaPicAnimCurGraphicID] - ld d, a - ld e, 5 * 5 - call CheckIfThereIsRoomForPikaPicAnimGFX - pop de - jr c, .failed - ld a, b - call UncompressSpriteFromDE - ld a, BANK(sSpriteBuffer1) - call SwitchSRAMBankAndLatchClockData - ld hl, sSpriteBuffer1 - ld de, sSpriteBuffer0 - ld bc, SPRITEBUFFERSIZE * 2 - call CopyData - call PrepareRTCDataAndDisableSRAM - ld a, [wPikaPicAnimCurGraphicID] - call LookUpTileOffsetForCurrentPikaPicAnimGFX - call GetPikaPicVRAMAddressForNewGFX - ld d, h - ld e, l - call InterlaceMergeSpriteBuffers -.failed - ret - -ClearPikaPicUsedGFXBuffer: - ld hl, wPikaPicUsedGFXCount - ld bc, wPikaPicUsedGFXEnd - wPikaPicUsedGFXCount - xor a - call FillMemory - ret - -GetPikaPicVRAMAddressForNewGFX: - ld hl, vNPCSprites - push bc - ld b, a - and $f - swap a - ld c, a - ld a, b - and $f0 - swap a - ld b, a - add hl, bc - pop bc - ret - -CheckIfThereIsRoomForPikaPicAnimGFX: -; d: idx -; e: size -; FATAL: If the graphic has already been loaded, or if there are -; already 8 graphics objects loaded, the game will execute arbitrary -; code. - push bc - push hl - ld hl, wPikaPicUsedGFX - ld c, 8 -.loop - ld a, [hl] - and a - jr z, .empty - cp d - jr z, .found - inc hl - inc hl - dec c - jr nz, .loop - scf - ret ; execute hl, then bc - -.found - inc hl - ld a, [hl] - ret ; execute hl, then bc - -.empty - ld [hl], d - inc hl - ld a, [wPikaPicUsedGFXCount] - add $80 - ld [hl], a - ld a, [wPikaPicUsedGFXCount] - add e - ld [wPikaPicUsedGFXCount], a - cp $80 - jr z, .okay - jr nc, .failed -.okay - ld a, [hl] - and a - jr .pop_ret - -.failed - scf -.pop_ret - pop hl - pop bc - ret - -LookUpTileOffsetForCurrentPikaPicAnimGFX: - push bc - push hl - ld b, a - ld hl, wPikaPicUsedGFX - ld c, 8 -.loop - ld a, [hli] - cp b - jr z, .found - inc hl - dec c - jr nz, .loop - scf - jr .pop_ret - -.found - ld a, [hl] - and a -.pop_ret - pop hl - pop bc - ret - -PikaPicAnimCommand_cry: - call GetPikaPicAnimByte - cp $ff - ret z - ld e, a - callfar PlayPikachuSoundClip - ret - -PikaPicAnimCommand_thunderbolt: - ld a, $1 - ld [wMuteAudioAndPauseMusic], a - call DelayFrame - ld a, [wAudioROMBank] - push af - ld a, BANK(SFX_Battle_2F) - ld [wAudioROMBank], a - ld [wAudioSavedROMBank], a - call .LoadAudio - call PlaySound - call .FlashScreen - call WaitForSoundToFinish - pop af - ld [wAudioROMBank], a - ld [wAudioSavedROMBank], a - xor a - ld [wMuteAudioAndPauseMusic], a - ret - -.LoadAudio: - ld hl, MoveSoundTable - ld e, THUNDERBOLT - ld d, 0 - add hl, de - add hl, de - add hl, de - ld a, BANK(MoveSoundTable) - call GetFarByte - ld b, a - inc hl - ld a, BANK(MoveSoundTable) - call GetFarByte - inc hl - ld [wFrequencyModifier], a - ld a, BANK(MoveSoundTable) - call GetFarByte - ld [wTempoModifier], a - ld a, b - ret - -.FlashScreen: - ld hl, PikaPicAnimThunderboltPals -.loop - ld a, [hli] - cp $ff - ret z - ld c, a - ld b, [hl] - inc hl - push hl - call .UpdatePal - pop hl - jr .loop - -.UpdatePal: - ld a, b - ldh [rBGP], a - call UpdateGBCPal_BGP - call DelayFrames - ret - -INCLUDE "data/pikachu_pic_animation.asm" diff --git a/engine/pikachu_status.asm b/engine/pikachu_status.asm deleted file mode 100755 index c73d3b3f..00000000 --- a/engine/pikachu_status.asm +++ /dev/null @@ -1,258 +0,0 @@ -IsStarterPikachuInOurParty:: - ld hl, wPartySpecies - ld de, wPartyMon1OTID - ld bc, wPartyMonOT - push hl -.loop - pop hl - ld a, [hli] - push hl - inc a - jr z, .noPlayerPikachu - cp PIKACHU + 1 - jr nz, .curMonNotPlayerPikachu - ld h, d - ld l, e - ld a, [wPlayerID] - cp [hl] - jr nz, .curMonNotPlayerPikachu - inc hl - ld a, [wPlayerID+1] - cp [hl] - jr nz, .curMonNotPlayerPikachu - push de - push bc - ld hl, wPlayerName - ld d, $6 ; possible player length - 1 -.nameCompareLoop - dec d - jr z, .sameOT - ld a, [bc] - inc bc - cp [hl] - inc hl - jr z, .nameCompareLoop - pop bc - pop de -.curMonNotPlayerPikachu - ld hl, wPartyMon2 - wPartyMon1 - add hl, de - ld d, h - ld e, l - ld hl, NAME_LENGTH - add hl, bc - ld b, h - ld c, l - jr .loop - -.sameOT - pop bc - pop de - ld h, d - ld l, e - ld bc, -NAME_LENGTH - add hl, bc - ld a, [hli] - or [hl] - jr z, .noPlayerPikachu ; XXX how is this determined? - pop hl - scf - ret - -.noPlayerPikachu - pop hl - and a - ret - -IsThisPartymonStarterPikachu_Box:: - ld hl, wBoxMon1 - ld bc, wBoxMon2 - wBoxMon1 - ld de, wBoxMonOT - jr asm_fce21 - -IsThisPartymonStarterPikachu_Party:: -IsThisPartymonStarterPikachu:: - ld hl, wPartyMon1 - ld bc, wPartyMon2 - wPartyMon1 - ld de, wPartyMonOT -asm_fce21: - ld a, [wWhichPokemon] - call AddNTimes - ld a, [hl] - cp PIKACHU - jr nz, .notPlayerPikachu - ld bc, wPartyMon1OTID - wPartyMon1 - add hl, bc - ld a, [wPlayerID] - cp [hl] - jr nz, .notPlayerPikachu - inc hl - ld a, [wPlayerID+1] - cp [hl] - jr nz, .notPlayerPikachu - ld h, d - ld l, e - ld a, [wWhichPokemon] - ld bc, NAME_LENGTH - call AddNTimes - ld de, wPlayerName - ld b, $6 -.loop - dec b - jr z, .isPlayerPikachu - ld a, [de] - inc de - cp [hl] - inc hl - jr z, .loop -.notPlayerPikachu - and a - ret - -.isPlayerPikachu - scf - ret - -UpdatePikachuMoodAfterBattle:: -; because d is always $82 at this function, it serves to -; ensure Pikachu's mood is at least 130 after battle - push de - call IsStarterPikachuInOurParty - pop de - ret nc - ld a, d - cp 128 - ld a, [wPikachuMood] - jr c, .d_less_than_128 ; we never jump - cp d - jr c, .load_d_into_mood - ret - -.d_less_than_128 - cp d - ret c -.load_d_into_mood - ld a, d - ld [wPikachuMood], a - ret - -CheckPikachuFaintedOrStatused:: -; function to test if Pikachu is alive? - xor a - ld [wWhichPokemon], a - ld hl, wPartyCount -.loop - inc hl - ld a, [hl] - cp $ff - jr z, .dead_or_not_in_party - push hl - call IsThisPartymonStarterPikachu_Party - pop hl - jr nc, .next - ld a, [wWhichPokemon] - ld hl, wPartyMon1HP - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - ld a, [hli] - or [hl] - ld d, a - inc hl - inc hl - ld a, [hl] ; status - and a - jr nz, .alive - jr .dead_or_not_in_party - -.next - ld a, [wWhichPokemon] - inc a - ld [wWhichPokemon], a - jr .loop - -.alive - scf - ret - -.dead_or_not_in_party - and a - ret - -IsSurfingPikachuInThePlayersParty:: - ld hl, wPartySpecies - ld de, wPartyMon1Moves - ld bc, wPartyMonOT - push hl -.loop - pop hl - ld a, [hli] - push hl - inc a - jr z, .noSurfingPlayerPikachu - cp PIKACHU+1 - jr nz, .curMonNotSurfingPlayerPikachu - ld h, d - ld l, e - push hl - push bc - ld b, NUM_MOVES -.moveSearchLoop - ld a, [hli] - cp SURF - jr z, .foundSurfingPikachu - dec b - jr nz, .moveSearchLoop - pop bc - pop hl - jr .curMonNotSurfingPlayerPikachu - -.foundSurfingPikachu - pop bc - pop hl - inc hl - inc hl - inc hl - inc hl - ld a, [wPlayerID] - cp [hl] - jr nz, .curMonNotSurfingPlayerPikachu - inc hl - ld a, [wPlayerID+1] - cp [hl] - jr nz, .curMonNotSurfingPlayerPikachu - push de - push bc - ld hl, wPlayerName - ld d, $6 -.nameCompareLoop - dec d - jr z, .foundSurfingPlayerPikachu - ld a, [bc] - inc bc - cp [hl] - inc hl - jr z, .nameCompareLoop - pop bc - pop de -.curMonNotSurfingPlayerPikachu - ld hl, wPartyMon2 - wPartyMon1 - add hl, de - ld d, h - ld e, l - ld hl, NAME_LENGTH - add hl, bc - ld b, h - ld c, l - jr .loop - -.foundSurfingPlayerPikachu - pop bc - pop de - pop hl - scf - ret - -.noSurfingPlayerPikachu - pop hl - and a - ret diff --git a/engine/printer.asm b/engine/printer.asm deleted file mode 100644 index f0b681af..00000000 --- a/engine/printer.asm +++ /dev/null @@ -1,999 +0,0 @@ - const_def - const PRINTER_STATUS_BLANK - const PRINTER_STATUS_CHECKING_LINK - const PRINTER_STATUS_TRANSMITTING - const PRINTER_STATUS_PRINTING - const PRINTER_ERROR_1 - const PRINTER_ERROR_2 - const PRINTER_ERROR_3 - const PRINTER_ERROR_4 - const PRINTER_ERROR_WRONG_DEVICE - -INCLUDE "engine/printer/serial.asm" - -PrintPokedexEntry: - ld a, [wUpdateSpritesEnabled] - push af - xor a - ld [wUpdateSpritesEnabled], a - ldh [hCanceledPrinting], a - call Printer_PlayPrinterMusic - ldh a, [rIE] - push af - xor a - ldh [rIF], a - ld a, $9 - ldh [rIE], a - xor a - ldh [hAutoBGTransferEnabled], a - call Printer_GetDexEntryRegisters - call Printer_StartTransmission - ld a, [wPrinterPokedexMonIsOwned] - and a - jr z, .not_caught - ld a, 16 - jr .got_size - -.not_caught - ld a, 19 -.got_size - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call ClearScreen - callfar Pokedex_DrawInterface - callfar Pokedex_PlacePokemonList - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call .TryPrintPage - jr c, .finish_printing - ld a, [wPrinterPokedexMonIsOwned] - and a - jr z, .finish_printing - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - ld c, $c - call DelayFrames - call SaveScreenTilesToBuffer1 - xor a - ldh [hAutoBGTransferEnabled], a - call Printer_PrepareDexEntryForPrinting - ld a, $7 - call Printer_StartTransmission - ld a, $3 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call LoadScreenTilesFromBuffer1 - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call .TryPrintPage -.finish_printing - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - xor a - ldh [rIF], a - pop af - ldh [rIE], a - call ReloadMapAfterPrinter - call Printer_PlayMapMusic - pop af - ld [wUpdateSpritesEnabled], a - ret - -.TryPrintPage: - call Printer_ResetJoypadHRAM -.print_loop - call JoypadLowSensitivity - call Printer_CheckPressingB - jr c, .pressed_b - ld a, [wPrinterSendState] - bit 7, a - jr nz, .completed - call PrinterTransmissionJumptable - call GBPrinter_CheckForErrors - call GBPrinter_UpdateStatusMessage - call DelayFrame - jr .print_loop - -.completed - and a - ret - -.pressed_b - scf - ret - -Printer_GetDexEntryRegisters: - callfar DrawDexEntryOnScreen - ld a, l - ld [wPrinterPokedexEntryTextPointer], a - ld a, h - ld [wPrinterPokedexEntryTextPointer + 1], a - ld a, $0 - rla ; copy carry flag state to bit 0 - ld [wPrinterPokedexMonIsOwned], a - and a - jr z, .not_caught - ld a, $5 - jr .got_num_rows - -.not_caught - ld a, $9 -.got_num_rows - ret - -Printer_PrepareDexEntryForPrinting: - call ClearScreen - callfar Pokedex_PrepareDexEntryForPrinting - ret - -PrintSurfingMinigameHighScore: - xor a - ldh [hCanceledPrinting], a - call Printer_PlayPrinterMusic - call Printer_PrepareSurfingMinigameHighScoreTileMap - ldh a, [rIE] - push af - xor a - ldh [rIF], a - ld a, $9 - ldh [rIE], a - call StartTransmission_Send9Rows - ld a, $13 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call Printer_ResetJoypadHRAM -.loop - call JoypadLowSensitivity - call Printer_CheckPressingB - jr c, .quit - ld a, [wPrinterSendState] - bit 7, a - jr nz, .quit - call PrinterTransmissionJumptable - call GBPrinter_CheckForErrors - call GBPrinter_UpdateStatusMessage - call DelayFrame - jr .loop - -.quit - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - call Printer_CopyTileMapFromPrinterTileBuffer - xor a - ldh [rIF], a - pop af - ldh [rIE], a - call ReloadMapAfterPrinter - call Printer_PlayMapMusic - ret - -PrintDiploma:: - xor a - ldh [hCanceledPrinting], a - call Printer_PlayPrinterMusic - call _DisplayDiploma - ldh a, [rIE] - push af - xor a - ldh [rIF], a - ld a, $9 - ldh [rIE], a - call StartTransmission_Send9Rows - ld a, $10 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call Func_e8d11 - jr c, .asm_e8cfa - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - ld c, $c - call DelayFrames - call SaveScreenTilesToBuffer1 - xor a - ldh [hAutoBGTransferEnabled], a - call Func_e9ad3 - call StartTransmission_Send9Rows - ld a, $3 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call LoadScreenTilesFromBuffer1 - call Func_e8d11 -.asm_e8cfa - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - call Printer_CopyTileMapFromPrinterTileBuffer - xor a - ldh [rIF], a - pop af - ldh [rIE], a - call ReloadMapAfterPrinter - call Printer_PlayMapMusic - ret - -Func_e8d11: - call Printer_ResetJoypadHRAM -.asm_e8d14 - call JoypadLowSensitivity - call Printer_CheckPressingB - jr c, .asm_e8d33 - ld a, [wPrinterSendState] - bit 7, a - jr nz, .asm_e8d31 - call PrinterTransmissionJumptable - call GBPrinter_CheckForErrors - call GBPrinter_UpdateStatusMessage - call DelayFrame - jr .asm_e8d14 - -.asm_e8d31 - and a - ret - -.asm_e8d33 - scf - ret - -PrintPCBox:: - ld a, [wBoxDataStart] - and a - jp z, Func_e8df4 - ld a, [wUpdateSpritesEnabled] - push af - xor a - ld [wUpdateSpritesEnabled], a - ldh [hCanceledPrinting], a - call Printer_PlayPrinterMusic - ldh a, [rIE] - push af - xor a - ldh [rIF], a - ld a, $9 - ldh [rIE], a - call SaveScreenTilesToBuffer1 - xor a - ldh [hAutoBGTransferEnabled], a - call PrintPCBox_DrawPage1 - call StartTransmission_Send9Rows - ld a, $10 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call LoadScreenTilesFromBuffer1 - call Func_e8dfb - jr c, .asm_e8ddc - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - ld c, 12 - call DelayFrames - xor a - ldh [hAutoBGTransferEnabled], a - call PrintPCBox_DrawPage2 - call StartTransmission_Send9Rows - ld a, $0 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call LoadScreenTilesFromBuffer1 - call Func_e8dfb - jr c, .asm_e8ddc - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - ld c, 12 - call DelayFrames - xor a - ldh [hAutoBGTransferEnabled], a - call PrintPCBox_DrawPage3 - call StartTransmission_Send9Rows - ld a, $0 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call LoadScreenTilesFromBuffer1 - call Func_e8dfb - jr c, .asm_e8ddc - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - ld c, 12 - call DelayFrames - xor a - ldh [hAutoBGTransferEnabled], a - call PrintPCBox_DrawPage4 - call StartTransmission_Send9Rows - ld a, $3 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call LoadScreenTilesFromBuffer1 - call Func_e8dfb -.asm_e8ddc - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - xor a - ldh [rIF], a - pop af - ldh [rIE], a - call ReloadMapAfterPrinter - call Printer_PlayMapMusic - pop af - ld [wUpdateSpritesEnabled], a - ret - -Func_e8df4: - ld hl, String_e8e1f - call PrintText - ret - -Func_e8dfb: - call Printer_ResetJoypadHRAM -.asm_e8dfe - call JoypadLowSensitivity - call Printer_CheckPressingB - jr c, .asm_e8e1d - ld a, [wPrinterSendState] - bit 7, a - jr nz, .asm_e8e1b - call PrinterTransmissionJumptable - call GBPrinter_CheckForErrors - call GBPrinter_UpdateStatusMessage - call DelayFrame - jr .asm_e8dfe - -.asm_e8e1b - and a - ret - -.asm_e8e1d - scf - ret - -String_e8e1f: - text_far _NoPokemonText - text_end - -PrintFanClubPortrait:: - xor a - ldh [hCanceledPrinting], a - call Printer_PlayPrinterMusic - call Printer_GetMonStats - ldh a, [rIE] - push af - xor a - ldh [rIF], a - ld a, $9 - ldh [rIE], a - call StartTransmission_Send9Rows - ld a, $13 - ld [wcae2], a - call Printer_CopyTileMapToPrinterTileBuffer - call Printer_ResetJoypadHRAM -.asm_e8e45 - call JoypadLowSensitivity - call Printer_CheckPressingB - jr c, .asm_e8e62 - ld a, [wPrinterSendState] - bit 7, a - jr nz, .asm_e8e62 - call PrinterTransmissionJumptable - call GBPrinter_CheckForErrors - call GBPrinter_UpdateStatusMessage - call DelayFrame - jr .asm_e8e45 - -.asm_e8e62 - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - call Printer_CopyTileMapFromPrinterTileBuffer - xor a - ldh [rIF], a - pop af - ldh [rIE], a - call ReloadMapAfterPrinter - call Printer_PlayMapMusic - ret - -PrinterDebug: - push af - push bc - push de - push hl - call StopAllMusic - ldh a, [rIE] - push af - xor a - ldh [rIF], a - ld a, $9 - ldh [rIE], a - call StartTransmission_Send9Rows - ld a, $13 - ld [wcae2], a - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call Printer_CopyTileMapToPrinterTileBuffer - call PrinterDebug_LoadGFX -.loop - ld a, [wPrinterSendState] - bit 7, a - jr nz, .quit - call PrinterDebug_DoFunction - call PrinterDebug_ConvertStatusFlagsToTiles - call DelayFrame - jr .loop - -.quit - xor a - ld [wPrinterConnectionOpen], a - ld [wPrinterOpcode], a - ld hl, wOAMBuffer + 32 * 4 - ld bc, 8 * 4 - xor a - call FillMemory - xor a - ldh [rIF], a - pop af - ldh [rIE], a - pop hl - pop de - pop bc - pop af - ret - -Printer_CheckPressingB: - ldh a, [hJoyHeld] - and B_BUTTON - jr nz, .quit - and a - ret - -.quit - ld a, [wPrinterSendState] - cp $c - jr nz, .already_done -.wait_current_task - ld a, [wPrinterOpcode] - and a - jr nz, .wait_current_task - ld a, $16 - ld [wPrinterOpcode], a - ld a, $88 - ldh [rSB], a - ld a, $1 - ldh [rSC], a - ld a, $81 - ldh [rSC], a -.wait_send_cancel - ld a, [wPrinterOpcode] - and a - jr nz, .wait_send_cancel -.already_done - ld a, $1 - ldh [hCanceledPrinting], a - scf - ret - -Printer_CopyTileMapToPrinterTileBuffer: - hlcoord 0, 0 - decoord 0, 0, wPrinterTileBuffer - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - call CopyData - ret - -Printer_CopyTileMapFromPrinterTileBuffer: - hlcoord 0, 0, wPrinterTileBuffer - decoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH - call CopyData - ret - -Printer_ResetJoypadHRAM: - xor a - ldh [hJoyLast], a - ldh [hJoyReleased], a - ldh [hJoyPressed], a - ldh [hJoyHeld], a - ldh [hJoy5], a - ldh [hJoy6], a - ret - -Printer_PlayPrinterMusic: - call Printer_FadeOutMusicAndWait - ld a, [wAudioROMBank] - ld [wAudioSavedROMBank], a - ld a, BANK(Music_GBPrinter) - ld [wAudioROMBank], a - ld a, MUSIC_GB_PRINTER - ld [wNewSoundID], a - call PlaySound - ret - -Printer_PlayMapMusic: - call Printer_FadeOutMusicAndWait - call PlayDefaultMusic - ret - -Printer_FadeOutMusicAndWait: - ld a, $4 - ld [wAudioFadeOutControl], a - call StopAllMusic -.wait_music_stop - ld a, [wAudioFadeOutControl] - and a - jr nz, .wait_music_stop - ret - -GBPrinter_CheckForErrors: - ld a, [wPrinterHandshake] - cp $81 - jr z, .check_other_errors - ld a, [wPrinterStatusFlags] - cp $ff - jr z, .error2 - xor a - jr .load_status - -.check_other_errors - ld a, [wPrinterStatusFlags] - and %11100000 - ret z - bit 7, a - jr nz, .error1 - bit 6, a - jr nz, .error4 - ; error 3 - ld a, PRINTER_ERROR_3 - jr .load_status - -.error4 - ld a, PRINTER_ERROR_4 - jr .load_status - -.error1 - ld a, PRINTER_ERROR_1 - jr .load_status - -.error2 - ld a, PRINTER_ERROR_2 -.load_status - ld [wPrinterStatusIndicator], a - ret - -GBPrinter_UpdateStatusMessage: - ld a, [wPrinterStatusIndicator] - and a - ret z - push af - xor a - ldh [hAutoBGTransferEnabled], a - hlcoord 0, 5 - lb bc, 10, 18 - call TextBoxBorder - pop af - ld e, a - ld d, $0 - ld hl, .PrinterStatusMessages - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - hlcoord 1, 7 - call PlaceString - hlcoord 2, 15 - ld de, .PressBToCancel - call PlaceString - ld a, $1 - ldh [hAutoBGTransferEnabled], a - xor a - ld [wPrinterStatusIndicator], a - ret - -.PressBToCancel: - db "Press B to Cancel@" - -.PrinterStatusMessages: - dw .Blank - dw .CheckingLink - dw .Transmitting - dw .Printing - dw .Error1 - dw .Error2 - dw .Error3 - dw .Error4 - dw .WrongDevice - -.Blank: - db "@" -.CheckingLink: - db "" - next " CHECKING LINK...@" -.Transmitting: - db "" - next " TRANSMITTING...@" -.Printing: - db "" - next " PRINTING...@" -.Error1: - db " Printer Error 1" - next "" - next "Check the Game Boy" - next "Printer Manual.@" -.Error2: - db " Printer Error 2" - next "" - next "Check the Game Boy" - next "Printer Manual.@" -.Error3: - db " Printer Error 3" - next "" - next "Check the Game Boy" - next "Printer Manual.@" -.Error4: - db " Printer Error 4" - next "" - next "Check the Game Boy" - next "Printer Manual.@" -.WrongDevice: - db "This is not the" - next "Game Boy Printer!@" - -Printer_PrepareSurfingMinigameHighScoreTileMap: - call GBPalWhiteOutWithDelay3 - call ClearScreen - ld de, SurfingPikachu2Graphics - ld hl, vChars2 - lb bc, BANK(SurfingPikachu2Graphics), (SurfingPikachu2GraphicsEnd - SurfingPikachu2Graphics) / $10 - call CopyVideoData - hlcoord 0, 0 - call .PlaceRowAlternatingTiles - hlcoord 0, 17 - call .PlaceRowAlternatingTiles - hlcoord 0, 0 - call .PlaceColumnAlternatingTiles - hlcoord 19, 0 - call .PlaceColumnAlternatingTiles - ld a, $4 - hlcoord 0, 0 - ld [hl], a - hlcoord 0, 17 - ld [hl], a - hlcoord 19, 0 - ld [hl], a - hlcoord 19, 17 - ld [hl], a - ld de, .Tilemap1 - hlcoord 10, 8 - lb bc, 3, 8 - call Diploma_Surfing_CopyBox - ld de, .Tilemap2 - hlcoord 2, 11 - lb bc, 6, 16 - call Diploma_Surfing_CopyBox - ld de, .PikachusBeachString - hlcoord 3, 2 - call PlaceString - ld de, .HiScoreString - hlcoord 9, 4 - call PlaceString - ld de, .PointsString - hlcoord 12, 6 - call PlaceString - ld de, wPlayerName - ld hl, wPlayerName - ld bc, 0 -.find_end_of_name - ld a, [hli] - inc c - cp "@" - jr nz, .find_end_of_name - ld a, 8 - sub c - jr nc, .got_name_length - xor a -.got_name_length - ld c, a - hlcoord 2, 4 - add hl, bc - call PlaceString - call CopySurfingMinigameScore - ld b, 8 - call RunPaletteCommand - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call Delay3 - call GBPalNormal - ret - -.PlaceRowAlternatingTiles: - ld c, SCREEN_WIDTH / 2 -.row_loop - ld [hl], $0 - inc hl - ld [hl], $1 - inc hl - dec c - jr nz, .row_loop - ret - -.PlaceColumnAlternatingTiles: - ld c, SCREEN_HEIGHT / 2 - ld de, SCREEN_WIDTH -.col_loop - ld [hl], $2 - add hl, de - ld [hl], $3 - add hl, de - dec c - jr nz, .col_loop - ret - -.Tilemap1: - db $7f, $7f, $10, $11, $12, $13, $14, $15 - db $0f, $3c, $3d, $3e, $20, $21, $30, $31 - db $4c, $4d, $4e, $50, $34, $1a, $51, $2d - -.Tilemap2: - db $7f, $7f, $7f, $7f, $7f, $7f, $16, $17, $18, $19, $7f, $1b, $1c, $1d, $1e, $1f - db $7f, $7f, $22, $23, $24, $25, $26, $27, $28, $29, $2a, $2b, $2c, $7f, $2e, $2f - db $7f, $7f, $32, $33, $33, $35, $36, $37, $38, $39, $3a, $3b, $7f, $7f, $7f, $3f - db $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4a, $4b, $40, $40, $40, $4f - db $52, $52, $52, $53, $54, $55, $56, $57, $58, $59, $5a, $5b, $5c, $5d, $5d, $5e - db $7f, $7f, $7f, $05, $06, $07, $08, $09, $0a, $0b, $0c, $0d, $0e, $7f, $7f, $7f - -.PikachusBeachString: - db "Pikachu's Beach@" -.HiScoreString: - db "'s Hi-Score@" -.PointsString: - db "Points@" - -Diploma_Surfing_CopyBox: -.y - push bc - push hl -.x - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .x - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .y - ret - -CopySurfingMinigameScore: - ld de, wSurfingMinigameHiScore + 1 - hlcoord 7, 6 - ld a, [de] - call .BCDConvertScore - ld a, [de] -.BCDConvertScore: - ld c, a - swap a - and $f - add -10 - ld [hli], a - ld a, c - and $f - add -10 - ld [hli], a - dec de - ret - -SurfingPikachu2Graphics: INCBIN "gfx/surfing_pikachu_2.2bpp" -SurfingPikachu2GraphicsEnd: - -PrintPCBox_DrawPage1: - xor a - ld [wBoxNumString], a - call ClearScreen - call PrintPCBox_PlaceHorizontalLines - hlcoord 0, 0 - ld bc, 11 * SCREEN_WIDTH - ld a, " " - call FillMemory - call PrintPCBox_DrawLeftAndRightBorders - call PrintPCBox_DrawTopBorder - hlcoord 4, 4 - ld de, .PokemonListString - call PlaceString - hlcoord 7, 6 - ld de, .BoxString - call PlaceString - hlcoord 11, 6 - ld a, [wCurrentBoxNum] - and $7f - cp 9 - jr c, .less_than_9 - sub 9 - ld [hl], "1" - inc hl - add "0" - jr .placed_box_number - -.less_than_9 - add "1" -.placed_box_number - ld [hl], a - hlcoord 4, 9 - ld de, wBoxSpecies - ld c, $3 - call PrintPCBox_PlaceBoxMonInfo - ret - -.PokemonListString: db "POKéMON LIST@" -.BoxString: db "BOX@" - -PrintPCBox_DrawPage2: - call ClearScreen - call PrintPCBox_PlaceHorizontalLines - call PrintPCBox_DrawLeftAndRightBorders - ld a, [wBoxDataStart] - cp 4 - ret c - hlcoord 4, 0 - ld de, wBoxSpecies + 3 - ld c, 6 - call PrintPCBox_PlaceBoxMonInfo - ret - -PrintPCBox_DrawPage3: - call ClearScreen - call PrintPCBox_PlaceHorizontalLines - call PrintPCBox_DrawLeftAndRightBorders - ld a, [wBoxDataStart] - cp 10 - ret c - hlcoord 4, 0 - ld de, wBoxSpecies + 9 - ld c, 6 - call PrintPCBox_PlaceBoxMonInfo - ret - -PrintPCBox_DrawPage4: - call ClearScreen - call PrintPCBox_PlaceHorizontalLines - call PrintPCBox_DrawLeftAndRightBorders - hlcoord 0, 15 - call PrintPCBox_DrawBottomBorderAtHL - hlcoord 0, 16 - ld bc, 2 * SCREEN_WIDTH - ld a, " " - call FillMemory - ld a, [wBoxDataStart] - cp 16 - ret c - hlcoord 4, 0 - ld de, wBoxSpecies + 15 - ld c, 5 - call PrintPCBox_PlaceBoxMonInfo - ret - -PrintPCBox_PlaceBoxMonInfo: -.loop - ld a, c - and a - jr z, .done - dec c - ld a, [de] - cp $ff - jr z, .done - ld [wd11e], a - push bc - push hl - push de - push hl - ld bc, 12 - ld a, " " - call FillMemory - pop hl - push hl - ld de, SCREEN_WIDTH - add hl, de - ld bc, 12 - ld a, " " - call FillMemory - pop hl - push hl - call GetMonName - pop hl - call PlaceString - push hl - ld hl, wBoxMonNicks - ld bc, NAME_LENGTH - ld a, [wBoxNumString] - call AddNTimes - ld e, l - ld d, h - pop hl - ld bc, SCREEN_WIDTH + 1 - add hl, bc - ld [hl], " " - inc hl - call PlaceString - ld hl, wBoxNumString - inc [hl] - pop de - pop hl - ld bc, 3 * SCREEN_WIDTH - add hl, bc - pop bc - inc de - jr .loop - -.done - ret - -PrintPCBox_DrawTopBorder: - hlcoord 0, 0 - ld a, $79 - ld [hli], a - ld a, $7a - ld c, SCREEN_WIDTH - 2 -.loop - ld [hli], a - dec c - jr nz, .loop - ld a, $7b - ld [hl], a - ret - -PrintPCBox_DrawLeftAndRightBorders: - hlcoord 0, 0 - ld de, SCREEN_WIDTH - 1 - ld c, SCREEN_HEIGHT -.loop - ld a, $7c - ld [hl], a - add hl, de - ld a, $7c - ld [hli], a - dec c - jr nz, .loop - ret - -PrintPCBox_DrawBottomBorder: - hlcoord 0, 17 -PrintPCBox_DrawBottomBorderAtHL: - ld a, $7d - ld [hli], a - ld a, $7a - ld c, SCREEN_WIDTH - 2 -.loop - ld [hli], a - dec c - jr nz, .loop - ld a, $7e - ld [hl], a - ret - -PrintPCBox_PlaceHorizontalLines: - hlcoord 4, 0 - ld c, 6 - call .PlaceHorizontalLine - hlcoord 6, 1 - ld c, 6 -.PlaceHorizontalLine: -.loop - push bc - push hl - ld de, .HorizontalLineString - call PlaceString - pop hl - ld bc, 3 * SCREEN_WIDTH - add hl, bc - pop bc - dec c - jr nz, .loop - ret - -.HorizontalLineString: - db "----------@" diff --git a/engine/printer/printer.asm b/engine/printer/printer.asm new file mode 100644 index 00000000..18bb18a6 --- /dev/null +++ b/engine/printer/printer.asm @@ -0,0 +1,986 @@ +PrintPokedexEntry: + ld a, [wUpdateSpritesEnabled] + push af + xor a + ld [wUpdateSpritesEnabled], a + ldh [hCanceledPrinting], a + call Printer_PlayPrinterMusic + ldh a, [rIE] + push af + xor a + ldh [rIF], a + ld a, $9 + ldh [rIE], a + xor a + ldh [hAutoBGTransferEnabled], a + call Printer_GetDexEntryRegisters + call Printer_StartTransmission + ld a, [wPrinterPokedexMonIsOwned] + and a + jr z, .not_caught + ld a, 16 + jr .got_size + +.not_caught + ld a, 19 +.got_size + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call ClearScreen + callfar Pokedex_DrawInterface + callfar Pokedex_PlacePokemonList + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call .TryPrintPage + jr c, .finish_printing + ld a, [wPrinterPokedexMonIsOwned] + and a + jr z, .finish_printing + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ld c, $c + call DelayFrames + call SaveScreenTilesToBuffer1 + xor a + ldh [hAutoBGTransferEnabled], a + call Printer_PrepareDexEntryForPrinting + ld a, $7 + call Printer_StartTransmission + ld a, $3 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call LoadScreenTilesFromBuffer1 + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call .TryPrintPage +.finish_printing + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + xor a + ldh [rIF], a + pop af + ldh [rIE], a + call ReloadMapAfterPrinter + call Printer_PlayMapMusic + pop af + ld [wUpdateSpritesEnabled], a + ret + +.TryPrintPage: + call Printer_ResetJoypadHRAM +.print_loop + call JoypadLowSensitivity + call Printer_CheckPressingB + jr c, .pressed_b + ld a, [wPrinterSendState] + bit 7, a + jr nz, .completed + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage + call DelayFrame + jr .print_loop + +.completed + and a + ret + +.pressed_b + scf + ret + +Printer_GetDexEntryRegisters: + callfar DrawDexEntryOnScreen + ld a, l + ld [wPrinterPokedexEntryTextPointer], a + ld a, h + ld [wPrinterPokedexEntryTextPointer + 1], a + ld a, $0 + rla ; copy carry flag state to bit 0 + ld [wPrinterPokedexMonIsOwned], a + and a + jr z, .not_caught + ld a, $5 + jr .got_num_rows + +.not_caught + ld a, $9 +.got_num_rows + ret + +Printer_PrepareDexEntryForPrinting: + call ClearScreen + callfar Pokedex_PrepareDexEntryForPrinting + ret + +PrintSurfingMinigameHighScore:: + xor a + ldh [hCanceledPrinting], a + call Printer_PlayPrinterMusic + call Printer_PrepareSurfingMinigameHighScoreTileMap + ldh a, [rIE] + push af + xor a + ldh [rIF], a + ld a, $9 + ldh [rIE], a + call StartTransmission_Send9Rows + ld a, $13 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call Printer_ResetJoypadHRAM +.loop + call JoypadLowSensitivity + call Printer_CheckPressingB + jr c, .quit + ld a, [wPrinterSendState] + bit 7, a + jr nz, .quit + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage + call DelayFrame + jr .loop + +.quit + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + call Printer_CopyTileMapFromPrinterTileBuffer + xor a + ldh [rIF], a + pop af + ldh [rIE], a + call ReloadMapAfterPrinter + call Printer_PlayMapMusic + ret + +PrintDiploma:: + xor a + ldh [hCanceledPrinting], a + call Printer_PlayPrinterMusic + call _DisplayDiploma + ldh a, [rIE] + push af + xor a + ldh [rIF], a + ld a, $9 + ldh [rIE], a + call StartTransmission_Send9Rows + ld a, $10 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call Func_e8d11 + jr c, .asm_e8cfa + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ld c, $c + call DelayFrames + call SaveScreenTilesToBuffer1 + xor a + ldh [hAutoBGTransferEnabled], a + call Func_e9ad3 + call StartTransmission_Send9Rows + ld a, $3 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call LoadScreenTilesFromBuffer1 + call Func_e8d11 +.asm_e8cfa + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + call Printer_CopyTileMapFromPrinterTileBuffer + xor a + ldh [rIF], a + pop af + ldh [rIE], a + call ReloadMapAfterPrinter + call Printer_PlayMapMusic + ret + +Func_e8d11: + call Printer_ResetJoypadHRAM +.asm_e8d14 + call JoypadLowSensitivity + call Printer_CheckPressingB + jr c, .asm_e8d33 + ld a, [wPrinterSendState] + bit 7, a + jr nz, .asm_e8d31 + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage + call DelayFrame + jr .asm_e8d14 + +.asm_e8d31 + and a + ret + +.asm_e8d33 + scf + ret + +PrintPCBox:: + ld a, [wBoxDataStart] + and a + jp z, Func_e8df4 + ld a, [wUpdateSpritesEnabled] + push af + xor a + ld [wUpdateSpritesEnabled], a + ldh [hCanceledPrinting], a + call Printer_PlayPrinterMusic + ldh a, [rIE] + push af + xor a + ldh [rIF], a + ld a, $9 + ldh [rIE], a + call SaveScreenTilesToBuffer1 + xor a + ldh [hAutoBGTransferEnabled], a + call PrintPCBox_DrawPage1 + call StartTransmission_Send9Rows + ld a, $10 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call LoadScreenTilesFromBuffer1 + call Func_e8dfb + jr c, .asm_e8ddc + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ld c, 12 + call DelayFrames + xor a + ldh [hAutoBGTransferEnabled], a + call PrintPCBox_DrawPage2 + call StartTransmission_Send9Rows + ld a, $0 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call LoadScreenTilesFromBuffer1 + call Func_e8dfb + jr c, .asm_e8ddc + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ld c, 12 + call DelayFrames + xor a + ldh [hAutoBGTransferEnabled], a + call PrintPCBox_DrawPage3 + call StartTransmission_Send9Rows + ld a, $0 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call LoadScreenTilesFromBuffer1 + call Func_e8dfb + jr c, .asm_e8ddc + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ld c, 12 + call DelayFrames + xor a + ldh [hAutoBGTransferEnabled], a + call PrintPCBox_DrawPage4 + call StartTransmission_Send9Rows + ld a, $3 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call LoadScreenTilesFromBuffer1 + call Func_e8dfb +.asm_e8ddc + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + xor a + ldh [rIF], a + pop af + ldh [rIE], a + call ReloadMapAfterPrinter + call Printer_PlayMapMusic + pop af + ld [wUpdateSpritesEnabled], a + ret + +Func_e8df4: + ld hl, String_e8e1f + call PrintText + ret + +Func_e8dfb: + call Printer_ResetJoypadHRAM +.asm_e8dfe + call JoypadLowSensitivity + call Printer_CheckPressingB + jr c, .asm_e8e1d + ld a, [wPrinterSendState] + bit 7, a + jr nz, .asm_e8e1b + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage + call DelayFrame + jr .asm_e8dfe + +.asm_e8e1b + and a + ret + +.asm_e8e1d + scf + ret + +String_e8e1f: + text_far _NoPokemonText + text_end + +PrintFanClubPortrait:: + xor a + ldh [hCanceledPrinting], a + call Printer_PlayPrinterMusic + call Printer_GetMonStats + ldh a, [rIE] + push af + xor a + ldh [rIF], a + ld a, $9 + ldh [rIE], a + call StartTransmission_Send9Rows + ld a, $13 + ld [wcae2], a + call Printer_CopyTileMapToPrinterTileBuffer + call Printer_ResetJoypadHRAM +.asm_e8e45 + call JoypadLowSensitivity + call Printer_CheckPressingB + jr c, .asm_e8e62 + ld a, [wPrinterSendState] + bit 7, a + jr nz, .asm_e8e62 + call PrinterTransmissionJumptable + call GBPrinter_CheckForErrors + call GBPrinter_UpdateStatusMessage + call DelayFrame + jr .asm_e8e45 + +.asm_e8e62 + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + call Printer_CopyTileMapFromPrinterTileBuffer + xor a + ldh [rIF], a + pop af + ldh [rIE], a + call ReloadMapAfterPrinter + call Printer_PlayMapMusic + ret + +PrinterDebug: + push af + push bc + push de + push hl + call StopAllMusic + ldh a, [rIE] + push af + xor a + ldh [rIF], a + ld a, $9 + ldh [rIE], a + call StartTransmission_Send9Rows + ld a, $13 + ld [wcae2], a + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call Printer_CopyTileMapToPrinterTileBuffer + call PrinterDebug_LoadGFX +.loop + ld a, [wPrinterSendState] + bit 7, a + jr nz, .quit + call PrinterDebug_DoFunction + call PrinterDebug_ConvertStatusFlagsToTiles + call DelayFrame + jr .loop + +.quit + xor a + ld [wPrinterConnectionOpen], a + ld [wPrinterOpcode], a + ld hl, wOAMBuffer + 32 * 4 + ld bc, 8 * 4 + xor a + call FillMemory + xor a + ldh [rIF], a + pop af + ldh [rIE], a + pop hl + pop de + pop bc + pop af + ret + +Printer_CheckPressingB: + ldh a, [hJoyHeld] + and B_BUTTON + jr nz, .quit + and a + ret + +.quit + ld a, [wPrinterSendState] + cp $c + jr nz, .already_done +.wait_current_task + ld a, [wPrinterOpcode] + and a + jr nz, .wait_current_task + ld a, $16 + ld [wPrinterOpcode], a + ld a, $88 + ldh [rSB], a + ld a, $1 + ldh [rSC], a + ld a, $81 + ldh [rSC], a +.wait_send_cancel + ld a, [wPrinterOpcode] + and a + jr nz, .wait_send_cancel +.already_done + ld a, $1 + ldh [hCanceledPrinting], a + scf + ret + +Printer_CopyTileMapToPrinterTileBuffer: + hlcoord 0, 0 + decoord 0, 0, wPrinterTileBuffer + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + call CopyData + ret + +Printer_CopyTileMapFromPrinterTileBuffer: + hlcoord 0, 0, wPrinterTileBuffer + decoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + call CopyData + ret + +Printer_ResetJoypadHRAM: + xor a + ldh [hJoyLast], a + ldh [hJoyReleased], a + ldh [hJoyPressed], a + ldh [hJoyHeld], a + ldh [hJoy5], a + ldh [hJoy6], a + ret + +Printer_PlayPrinterMusic: + call Printer_FadeOutMusicAndWait + ld a, [wAudioROMBank] + ld [wAudioSavedROMBank], a + ld a, BANK(Music_GBPrinter) + ld [wAudioROMBank], a + ld a, MUSIC_GB_PRINTER + ld [wNewSoundID], a + call PlaySound + ret + +Printer_PlayMapMusic: + call Printer_FadeOutMusicAndWait + call PlayDefaultMusic + ret + +Printer_FadeOutMusicAndWait: + ld a, $4 + ld [wAudioFadeOutControl], a + call StopAllMusic +.wait_music_stop + ld a, [wAudioFadeOutControl] + and a + jr nz, .wait_music_stop + ret + +GBPrinter_CheckForErrors: + ld a, [wPrinterHandshake] + cp $81 + jr z, .check_other_errors + ld a, [wPrinterStatusFlags] + cp $ff + jr z, .error2 + xor a + jr .load_status + +.check_other_errors + ld a, [wPrinterStatusFlags] + and %11100000 + ret z + bit 7, a + jr nz, .error1 + bit 6, a + jr nz, .error4 + ; error 3 + ld a, PRINTER_ERROR_3 + jr .load_status + +.error4 + ld a, PRINTER_ERROR_4 + jr .load_status + +.error1 + ld a, PRINTER_ERROR_1 + jr .load_status + +.error2 + ld a, PRINTER_ERROR_2 +.load_status + ld [wPrinterStatusIndicator], a + ret + +GBPrinter_UpdateStatusMessage: + ld a, [wPrinterStatusIndicator] + and a + ret z + push af + xor a + ldh [hAutoBGTransferEnabled], a + hlcoord 0, 5 + lb bc, 10, 18 + call TextBoxBorder + pop af + ld e, a + ld d, $0 + ld hl, .PrinterStatusMessages + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + hlcoord 1, 7 + call PlaceString + hlcoord 2, 15 + ld de, .PressBToCancel + call PlaceString + ld a, $1 + ldh [hAutoBGTransferEnabled], a + xor a + ld [wPrinterStatusIndicator], a + ret + +.PressBToCancel: + db "Press B to Cancel@" + +.PrinterStatusMessages: + dw .Blank + dw .CheckingLink + dw .Transmitting + dw .Printing + dw .Error1 + dw .Error2 + dw .Error3 + dw .Error4 + dw .WrongDevice + +.Blank: + db "@" +.CheckingLink: + db "" + next " CHECKING LINK...@" +.Transmitting: + db "" + next " TRANSMITTING...@" +.Printing: + db "" + next " PRINTING...@" +.Error1: + db " Printer Error 1" + next "" + next "Check the Game Boy" + next "Printer Manual.@" +.Error2: + db " Printer Error 2" + next "" + next "Check the Game Boy" + next "Printer Manual.@" +.Error3: + db " Printer Error 3" + next "" + next "Check the Game Boy" + next "Printer Manual.@" +.Error4: + db " Printer Error 4" + next "" + next "Check the Game Boy" + next "Printer Manual.@" +.WrongDevice: + db "This is not the" + next "Game Boy Printer!@" + +Printer_PrepareSurfingMinigameHighScoreTileMap:: + call GBPalWhiteOutWithDelay3 + call ClearScreen + ld de, SurfingPikachu2Graphics + ld hl, vChars2 + lb bc, BANK(SurfingPikachu2Graphics), (SurfingPikachu2GraphicsEnd - SurfingPikachu2Graphics) / $10 + call CopyVideoData + hlcoord 0, 0 + call .PlaceRowAlternatingTiles + hlcoord 0, 17 + call .PlaceRowAlternatingTiles + hlcoord 0, 0 + call .PlaceColumnAlternatingTiles + hlcoord 19, 0 + call .PlaceColumnAlternatingTiles + ld a, $4 + hlcoord 0, 0 + ld [hl], a + hlcoord 0, 17 + ld [hl], a + hlcoord 19, 0 + ld [hl], a + hlcoord 19, 17 + ld [hl], a + ld de, .Tilemap1 + hlcoord 10, 8 + lb bc, 3, 8 + call Diploma_Surfing_CopyBox + ld de, .Tilemap2 + hlcoord 2, 11 + lb bc, 6, 16 + call Diploma_Surfing_CopyBox + ld de, .PikachusBeachString + hlcoord 3, 2 + call PlaceString + ld de, .HiScoreString + hlcoord 9, 4 + call PlaceString + ld de, .PointsString + hlcoord 12, 6 + call PlaceString + ld de, wPlayerName + ld hl, wPlayerName + ld bc, 0 +.find_end_of_name + ld a, [hli] + inc c + cp "@" + jr nz, .find_end_of_name + ld a, 8 + sub c + jr nc, .got_name_length + xor a +.got_name_length + ld c, a + hlcoord 2, 4 + add hl, bc + call PlaceString + call CopySurfingMinigameScore + ld b, 8 + call RunPaletteCommand + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call Delay3 + call GBPalNormal + ret + +.PlaceRowAlternatingTiles: + ld c, SCREEN_WIDTH / 2 +.row_loop + ld [hl], $0 + inc hl + ld [hl], $1 + inc hl + dec c + jr nz, .row_loop + ret + +.PlaceColumnAlternatingTiles: + ld c, SCREEN_HEIGHT / 2 + ld de, SCREEN_WIDTH +.col_loop + ld [hl], $2 + add hl, de + ld [hl], $3 + add hl, de + dec c + jr nz, .col_loop + ret + +.Tilemap1: + db $7f, $7f, $10, $11, $12, $13, $14, $15 + db $0f, $3c, $3d, $3e, $20, $21, $30, $31 + db $4c, $4d, $4e, $50, $34, $1a, $51, $2d + +.Tilemap2: + db $7f, $7f, $7f, $7f, $7f, $7f, $16, $17, $18, $19, $7f, $1b, $1c, $1d, $1e, $1f + db $7f, $7f, $22, $23, $24, $25, $26, $27, $28, $29, $2a, $2b, $2c, $7f, $2e, $2f + db $7f, $7f, $32, $33, $33, $35, $36, $37, $38, $39, $3a, $3b, $7f, $7f, $7f, $3f + db $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4a, $4b, $40, $40, $40, $4f + db $52, $52, $52, $53, $54, $55, $56, $57, $58, $59, $5a, $5b, $5c, $5d, $5d, $5e + db $7f, $7f, $7f, $05, $06, $07, $08, $09, $0a, $0b, $0c, $0d, $0e, $7f, $7f, $7f + +.PikachusBeachString: + db "Pikachu's Beach@" +.HiScoreString: + db "'s Hi-Score@" +.PointsString: + db "Points@" + +Diploma_Surfing_CopyBox: +.y + push bc + push hl +.x + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .x + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .y + ret + +CopySurfingMinigameScore: + ld de, wSurfingMinigameHiScore + 1 + hlcoord 7, 6 + ld a, [de] + call .BCDConvertScore + ld a, [de] +.BCDConvertScore: + ld c, a + swap a + and $f + add -10 + ld [hli], a + ld a, c + and $f + add -10 + ld [hli], a + dec de + ret + +SurfingPikachu2Graphics: INCBIN "gfx/surfing_pikachu/surfing_pikachu_2.2bpp" +SurfingPikachu2GraphicsEnd: + +PrintPCBox_DrawPage1: + xor a + ld [wBoxNumString], a + call ClearScreen + call PrintPCBox_PlaceHorizontalLines + hlcoord 0, 0 + ld bc, 11 * SCREEN_WIDTH + ld a, " " + call FillMemory + call PrintPCBox_DrawLeftAndRightBorders + call PrintPCBox_DrawTopBorder + hlcoord 4, 4 + ld de, .PokemonListString + call PlaceString + hlcoord 7, 6 + ld de, .BoxString + call PlaceString + hlcoord 11, 6 + ld a, [wCurrentBoxNum] + and $7f + cp 9 + jr c, .less_than_9 + sub 9 + ld [hl], "1" + inc hl + add "0" + jr .placed_box_number + +.less_than_9 + add "1" +.placed_box_number + ld [hl], a + hlcoord 4, 9 + ld de, wBoxSpecies + ld c, $3 + call PrintPCBox_PlaceBoxMonInfo + ret + +.PokemonListString: db "POKéMON LIST@" +.BoxString: db "BOX@" + +PrintPCBox_DrawPage2: + call ClearScreen + call PrintPCBox_PlaceHorizontalLines + call PrintPCBox_DrawLeftAndRightBorders + ld a, [wBoxDataStart] + cp 4 + ret c + hlcoord 4, 0 + ld de, wBoxSpecies + 3 + ld c, 6 + call PrintPCBox_PlaceBoxMonInfo + ret + +PrintPCBox_DrawPage3: + call ClearScreen + call PrintPCBox_PlaceHorizontalLines + call PrintPCBox_DrawLeftAndRightBorders + ld a, [wBoxDataStart] + cp 10 + ret c + hlcoord 4, 0 + ld de, wBoxSpecies + 9 + ld c, 6 + call PrintPCBox_PlaceBoxMonInfo + ret + +PrintPCBox_DrawPage4: + call ClearScreen + call PrintPCBox_PlaceHorizontalLines + call PrintPCBox_DrawLeftAndRightBorders + hlcoord 0, 15 + call PrintPCBox_DrawBottomBorderAtHL + hlcoord 0, 16 + ld bc, 2 * SCREEN_WIDTH + ld a, " " + call FillMemory + ld a, [wBoxDataStart] + cp 16 + ret c + hlcoord 4, 0 + ld de, wBoxSpecies + 15 + ld c, 5 + call PrintPCBox_PlaceBoxMonInfo + ret + +PrintPCBox_PlaceBoxMonInfo: +.loop + ld a, c + and a + jr z, .done + dec c + ld a, [de] + cp $ff + jr z, .done + ld [wd11e], a + push bc + push hl + push de + push hl + ld bc, 12 + ld a, " " + call FillMemory + pop hl + push hl + ld de, SCREEN_WIDTH + add hl, de + ld bc, 12 + ld a, " " + call FillMemory + pop hl + push hl + call GetMonName + pop hl + call PlaceString + push hl + ld hl, wBoxMonNicks + ld bc, NAME_LENGTH + ld a, [wBoxNumString] + call AddNTimes + ld e, l + ld d, h + pop hl + ld bc, SCREEN_WIDTH + 1 + add hl, bc + ld [hl], " " + inc hl + call PlaceString + ld hl, wBoxNumString + inc [hl] + pop de + pop hl + ld bc, 3 * SCREEN_WIDTH + add hl, bc + pop bc + inc de + jr .loop + +.done + ret + +PrintPCBox_DrawTopBorder: + hlcoord 0, 0 + ld a, $79 + ld [hli], a + ld a, $7a + ld c, SCREEN_WIDTH - 2 +.loop + ld [hli], a + dec c + jr nz, .loop + ld a, $7b + ld [hl], a + ret + +PrintPCBox_DrawLeftAndRightBorders: + hlcoord 0, 0 + ld de, SCREEN_WIDTH - 1 + ld c, SCREEN_HEIGHT +.loop + ld a, $7c + ld [hl], a + add hl, de + ld a, $7c + ld [hli], a + dec c + jr nz, .loop + ret + +PrintPCBox_DrawBottomBorder: + hlcoord 0, 17 +PrintPCBox_DrawBottomBorderAtHL: + ld a, $7d + ld [hli], a + ld a, $7a + ld c, SCREEN_WIDTH - 2 +.loop + ld [hli], a + dec c + jr nz, .loop + ld a, $7e + ld [hl], a + ret + +PrintPCBox_PlaceHorizontalLines: + hlcoord 4, 0 + ld c, 6 + call .PlaceHorizontalLine + hlcoord 6, 1 + ld c, 6 +.PlaceHorizontalLine: +.loop + push bc + push hl + ld de, .HorizontalLineString + call PlaceString + pop hl + ld bc, 3 * SCREEN_WIDTH + add hl, bc + pop bc + dec c + jr nz, .loop + ret + +.HorizontalLineString: + db "----------@" diff --git a/engine/printer/printer2.asm b/engine/printer/printer2.asm new file mode 100755 index 00000000..180f044c --- /dev/null +++ b/engine/printer/printer2.asm @@ -0,0 +1,973 @@ +Printer_GetMonStats: + call GBPalWhiteOutWithDelay3 + call ClearScreen + call LoadHpBarAndStatusTilePatterns + ld de, GFX_ea563 + ld hl, vChars2 + $710 + lb bc, BANK(GFX_ea563), (GFX_ea563End - GFX_ea563) / 8 + call CopyVideoDataDouble + + ld de, GFX_ea56b + ld hl, vChars2 + $6e0 + lb bc, BANK(GFX_ea56b), (GFX_ea56bEnd - GFX_ea56b) / 8 + call CopyVideoDataDouble + + xor a + ldh [hAutoBGTransferEnabled], a + xor a + ld [wWhichTradeMonSelectionMenu], a + call LoadMonData + + ld hl, wTileMap + lb bc, 16, 18 + call TextBoxBorder + + hlcoord 0, 12 + lb bc, 4, 18 + call TextBoxBorder + + hlcoord 3, 10 + call PrintLevelFull + + hlcoord 2, 10 + ld a, $6e + ld [hli], a + ld [hl], " " + + hlcoord 2, 11 + ld [hl], "’" + + hlcoord 4, 11 + ld de, wLoadedMonMaxHP + lb bc, 2, 3 + call PrintNumber + + ld a, [wMonHeader] + ld [wPokeBallAnimData], a + ld [wd0b5], a + ld hl, wPartyMonNicks + call .GetNamePointer + hlcoord 8, 2 + call PlaceString + + call GetMonName + hlcoord 9, 3 + call PlaceString + + predef IndexToPokedex + hlcoord 2, 8 + ld [hl], "№" + inc hl + ld [hl], $f2 + inc hl + ld de, wPokeBallAnimData + lb bc, $80 | 1, 3 + call PrintNumber + + hlcoord 8, 4 + ld de, .OT + call PlaceString + + ld hl, wPartyMonOT + call .GetNamePointer + hlcoord 9, 5 + call PlaceString + + hlcoord 9, 6 + ld de, .IDNo + call PlaceString + + hlcoord 13, 6 + ld de, wLoadedMonOTID + lb bc, $80 | 2, 5 + call PrintNumber + + hlcoord 9, 8 + ld de, .Stats + ldh a, [hFlagsFFFA] + set 2, a + ldh [hFlagsFFFA], a + call PlaceString + ldh a, [hFlagsFFFA] + res 2, a + ldh [hFlagsFFFA], a + + hlcoord 16, 8 + ld de, wLoadedMonAttack + ld a, 4 +.loop + push af + push de + + push hl + lb bc, 2, 3 + call PrintNumber + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + + pop de + inc de + inc de + pop af + dec a + jr nz, .loop + + hlcoord 1, 13 + ld a, [wLoadedMonMoves] + call .PlaceMoveName + + hlcoord 1, 14 + ld a, [wLoadedMonMoves + 1] + call .PlaceMoveName + + hlcoord 1, 15 + ld a, [wLoadedMonMoves + 2] + call .PlaceMoveName + + hlcoord 1, 16 + ld a, [wLoadedMonMoves + 3] + call .PlaceMoveName + + ld b, $4 ; SET_PAL_STATUS_SCREEN + call RunPaletteCommand + + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call Delay3 + call GBPalNormal + hlcoord 1, 1 + call LoadFlippedFrontSpriteByMonIndex + ret + +.GetNamePointer: + ld bc, NAME_LENGTH + ld a, [wWhichPokemon] + call AddNTimes + ld e, l + ld d, h + ret + +.PlaceMoveName: + and a + jr z, .no_move + ld [wPokeBallAnimData], a + call GetMoveName + jr .place_string + +.no_move + ld de, .Blank +.place_string + call PlaceString + ret + +.OT: + db "OT/@" + +.IDNo: + db $73, "№/@" + +.Stats: + db "ATTACK" + next "DEFENSE" + next "SPEED" + next "SPECIAL@" + +.Blank: + db "--------------@" + +GFX_ea563: +INCBIN "gfx/printer/hp.1bpp" +GFX_ea563End: + +GFX_ea56b: +INCBIN "gfx/printer/lv.1bpp" +GFX_ea56bEnd: + +PrinterDebug_LoadGFX: + ld hl, vChars1 + $7e0 + ld de, GFX_ea597 + lb bc, BANK(GFX_ea597), (GFX_ea597End - GFX_ea597) / 16 + call CopyVideoData + + ld hl, wOAMBuffer + 32 * 4 + ld a, $8 + ld c, $8 +.loop + ld [hl], $10 + inc hl + ld [hl], a + inc hl + ld [hl], $fe + inc hl + ld [hl], $0 + inc hl + add $8 + dec c + jr nz, .loop + ret + +GFX_ea597: +INCBIN "gfx/printer/01.2bpp" +GFX_ea597End: + +PrinterDebug_ConvertStatusFlagsToTiles: + ld hl, wOAMBuffer + 32 * 4 + 2 + ld de, 4 + ld a, [wPrinterStatusFlags] + ld c, 8 +.loop + sla a + jr c, .place_1 + ld [hl], $fe + jr .okay + +.place_1 + ld [hl], $ff +.okay + add hl, de + dec c + jr nz, .loop + ret + +PrinterDebug_DoFunction: + ld a, [wPrinterSendState] + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: + dw Func_ea623 + dw Func_ea6d2 + dw Func_ea6af + dw Func_ea645 + dw Func_ea701 + dw Func_ea6bd + dw Func_ea671 + dw Func_ea701 + dw Func_ea6af + dw Func_ea68a + dw Func_ea701 + dw Func_ea6af + dw Func_ea721 + dw Func_ea610 + dw Func_ea61a + dw Func_ea6af + dw Func_ea61e + dw Func_ea72f + dw Func_ea732 + +Func_ea606: + ld hl, wPrinterSendState + inc [hl] + ret + +Func_ea60b: + ld hl, wPrinterSendState + dec [hl] + ret + +Func_ea610: + xor a + ld [wPrinterStatusFlags], a + ld hl, wPrinterSendState + set 7, [hl] + ret + +Func_ea61a: + call Func_ea606 + ret + +Func_ea61e: + xor a + ld [wPrinterSendState], a + ret + +Func_ea623: + call Func_ea784 + ld hl, Data_ea9de + call Func_ea76b + xor a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + ld a, [wPrinterQueueLength] + ld [wPrinterRowIndex], a + call Func_ea606 + call Func_ea74c + ld a, $1 + ld [wPrinterStatusIndicator], a + ret + +Func_ea645: + call Func_ea784 + ld hl, wPrinterRowIndex + ld a, [hl] + and a + jr z, Func_ea671 + ld hl, Data_ea9ea + call Func_ea76b + call PrinterDebug_PrepOAMForPrinting + ld a, $80 + ld [wPrinterDataSize], a + ld a, $2 + ld [wPrinterDataSize + 1], a + call Func_ea7a2 + call Func_ea606 + call Func_ea74c + ld a, $2 + ld [wPrinterStatusIndicator], a + ret + +Func_ea671: + ld a, $6 + ld [wPrinterSendState], a + ld hl, Data_ea9f0 + call Func_ea76b + xor a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + call Func_ea606 + call Func_ea74c + ret + +Func_ea68a: + call Func_ea784 + ld hl, Data_ea9e4 + call Func_ea76b + call Func_ea7d2 + ld a, $4 + ld [wPrinterDataSize], a + ld a, $0 + ld [wPrinterDataSize + 1], a + call Func_ea7a2 + call Func_ea606 + call Func_ea74c + ld a, $3 + ld [wPrinterStatusIndicator], a + ret + +Func_ea6af: + ld hl, wPrinterSerialFrameDelay + inc [hl] + ld a, [hl] + cp a, $6 + ret c + xor a + ld [hl], a + call Func_ea606 + ret + +Func_ea6bd: + ld hl, wPrinterSerialFrameDelay + inc [hl] + ld a, [hl] + cp 6 + ret c + xor a + ld [hl], a + ld hl, wPrinterRowIndex + dec [hl] + call Func_ea60b + call Func_ea60b + ret + +Func_ea6d2: + call Func_ea742 + ret c + ld a, [wPrinterHandshake] + cp a, $ff + jr nz, .asm_ea6e4 + ld a, [wPrinterStatusFlags] + cp a, $ff + jr z, .asm_ea6fb +.asm_ea6e4 + ld a, [wPrinterHandshake] + cp a, $81 + jr nz, .asm_ea6fb + ld a, [wPrinterStatusFlags] + cp a, $0 + jr nz, .asm_ea6fb + ld hl, wPrinterConnectionOpen + set 1, [hl] + call Func_ea606 + ret + +.asm_ea6fb + ld a, $e + ld [wPrinterSendState], a + ret + +Func_ea701: + call Func_ea742 + ret c + ld a, [wPrinterStatusFlags] + and $f0 + jr nz, .asm_ea71b + ld a, [wPrinterStatusFlags] + and $1 + jr nz, .asm_ea717 + call Func_ea606 + ret + +.asm_ea717 + call Func_ea60b + ret + +.asm_ea71b + ld a, $11 + ld [wPrinterSendState], a + ret + +Func_ea721: + call Func_ea742 + ret c + ld a, [wPrinterStatusFlags] + and $f3 + ret nz + call Func_ea606 + ret + +Func_ea72f: + call Func_ea606 +Func_ea732: + ld a, [wPrinterOpcode] + and a + ret nz + ld a, [wPrinterStatusFlags] + and $f0 + ret nz + xor a + ld [wPrinterSendState], a + ret + +Func_ea742: + ld a, [wPrinterOpcode] + and a + jr nz, .asm_ea74a + and a + ret + +.asm_ea74a + scf + ret + +Func_ea74c: +.asm_ea74c + ld a, [wPrinterOpcode] + and a + jr nz, .asm_ea74c + ld a, $1 + ld [wPrinterOpcode], a + xor a + ld [wPrinterSendByteOffset], a + ld [wPrinterSendByteOffset + 1], a + ld a, $88 + ldh [rSB], a + ld a, $1 + ldh [rSC], a + ld a, $81 + ldh [rSC], a + ret + +Func_ea76b: + ld a, [hli] + ld [wPrinterDataHeader], a + ld a, [hli] + ld [wPrinterDataHeader + 1], a + ld a, [hli] + ld [wPrinterDataHeader + 2], a + ld a, [hli] + ld [wPrinterDataHeader + 3], a + ld a, [hli] + ld [wPrinterDataHeader + 4], a + ld a, [hl] + ld [wPrinterDataHeader + 5], a + ret + +Func_ea784: + xor a + ld hl, wPrinterDataHeader + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, wPrinterDataHeader + 4 + ld [hli], a + ld [hl], a + xor a + ld [wPrinterDataSize], a + ld [wPrinterDataSize + 1], a + ld hl, wPrinterSendDataSource1 + ld bc, $280 + call FillMemory + ret + +Func_ea7a2: + ld hl, $0 + ld bc, $4 + ld de, wPrinterDataHeader + call Func_ea7c5 + ld a, [wPrinterDataSize] + ld c, a + ld a, [wPrinterDataSize + 1] + ld b, a + ld de, wPrinterSendDataSource1 + call Func_ea7c5 + ld a, l + ld [wPrinterDataHeader + 4], a + ld a, h + ld [wPrinterDataHeader + 5], a + ret + +Func_ea7c5: +.asm_ea7c5 + ld a, [de] + inc de + add l + jr nc, .asm_ea7cb + inc h +.asm_ea7cb + ld l, a + dec bc + ld a, c + or b + jr nz, .asm_ea7c5 + ret + +Func_ea7d2: + ld a, $1 + ld [wPrinterSendDataSource1], a + ld a, [wcae2] + ld [wPrinterStatusReceived], a + ld a, $e4 + ld [wc6f2], a + ld a, [wPrinterSettingsTempCopy] + ld [wc6f3], a + ret + +PrinterDebug_PrepOAMForPrinting: + ld a, [wPrinterRowIndex] + ld b, a + ld a, [wPrinterQueueLength] + sub b + ld hl, wPrinterTileBuffer + ld de, $28 +.get_start_addr + and a + jr z, .start_working + add hl, de + dec a + jr .get_start_addr + +.start_working + ld e, l + ld d, h + ld hl, wPrinterSendDataSource1 + ld c, $28 +.prep_loop + ld a, [de] + inc de + push bc + push de + push hl + swap a + ld d, a + and $f0 + ld e, a + ld a, d + and $f + ld d, a + and $8 + ld a, d + jr nz, .vtiles1 + or $90 + jr .got_vram_address + +.vtiles1 + or $80 +.got_vram_address + ld d, a + lb bc, BANK(PrinterDebug_PrepOAMForPrinting), $1 + call CopyVideoData + pop hl + ld de, $10 + add hl, de + pop de + pop bc + dec c + jr nz, .prep_loop + call .UnnecessaryCall + ret + +.UnnecessaryCall: + ld hl, wcbdc + ld bc, $20 + xor a + call FillMemory + ld hl, wOAMBuffer + ld c, $28 +.master_loop + push bc + push hl + call .AreWePrintingThisSegment + jr nc, .skip_segment + call .GetVRAMAddress + call .GetOAMFlags + call .ApplyObjectPalettes + call .PlaceObject +.skip_segment + pop hl + inc hl + inc hl + inc hl + inc hl + pop bc + dec c + jr nz, .master_loop + ret + +.AreWePrintingThisSegment: + ld a, [wPrinterRowIndex] + ld b, a + ld a, [wPrinterQueueLength] + sub b + ld c, a + ld b, $10 +.add_n_times + ld a, c + and a + jr z, .check + ld a, b + add $10 + ld b, a + dec c + jr .add_n_times + +.check + ld a, b + ld e, a + add $10 + ld d, a + ld a, [hl] + cp e + jr c, .not_printing + cp d + jr nc, .not_printing + scf + ret + +.not_printing + and a + ret + +.GetVRAMAddress: + push hl + inc hl + inc hl + ld a, [hl] + swap a + ld d, a + and $f0 + ld e, a + ld a, d + and $f + or $80 + ld d, a + ld hl, wcbdc + lb bc, BANK(.GetVRAMAddress), $1 + call CopyVideoData + pop hl + ret + +.GetOAMFlags: + push hl + inc hl + inc hl + inc hl + ld a, [hl] + call .DoBitOperation + pop hl + ret + +.DoBitOperation: + and $60 + swap a + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: + dw .nop + dw .xflip + dw .yflip + dw .both + +.nop: + ret + +.xflip: + call .XFlip + ret + +.yflip: + call .YFlip + ret + +.both: + call .XFlip + call .YFlip + ret + +.XFlip: + ld hl, wcbdc + ld c, 16 +.byte_loop + ld d, [hl] + ld a, 0 + ld b, 8 +.bit_loop + sla d + rr a + dec b + jr nz, .bit_loop + ld [hli], a + dec c + jr nz, .byte_loop + ret + +.YFlip: + ld hl, wcbdc + ld de, wcbea + ld c, $4 +.swap_loop + ld b, [hl] + ld a, [de] + ld [hli], a + ld a, b + ld [de], a + inc de + ld b, [hl] + ld a, [de] + ld [hli], a + ld a, b + ld [de], a + dec de + dec de + dec de + dec c + jr nz, .swap_loop + ret + +.ApplyObjectPalettes: + push hl + ld hl, wcbdc + ld de, wcbec + ld a, 8 +.loop1 + push af + ld bc, $0 + ld a, 8 +.loop2 + push af + xor a + rlc [hl] + rl a + inc hl + rlc [hl] + rl a + dec hl + push hl + push de + call .ExpandPalettesToBC + pop de + pop hl + pop af + dec a + jr nz, .loop2 + inc hl + inc hl + ld a, b + ld [de], a + inc de + ld a, c + ld [de], a + inc de + pop af + dec a + jr nz, .loop1 + pop hl + ret + +.ExpandPalettesToBC: + call .GetPaletteFunction + call .ApplyPaletteFunction + ret + +.GetPaletteFunction: + ld e, a + ld d, 0 + ld hl, .PalJumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.PalJumptable: + dw .Pal0 + dw .Pal1 + dw .Pal2 + dw .Pal3 + +.Pal0: + ldh a, [rOBP0] + and $3 + ret + +.Pal2: + ldh a, [rOBP0] + and $c + srl a + srl a + ret + +.Pal1: + ldh a, [rOBP0] + and $30 + swap a + ret + +.Pal3: + ldh a, [rOBP0] + and $c0 + rlca + rlca + ret + +.ApplyPaletteFunction: + ld e, a + ld d, 0 + ld hl, .PalFunJumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.PalFunJumptable: + dw .zero_zero + dw .xflip_zero + dw .zero_xflip + dw .xflip_xflip + +.zero_zero: + sla b + sla c + ret + +.xflip_zero: + scf + rl b + sla c + ret + +.zero_xflip: + sla b + scf + rl c + ret + +.xflip_xflip: + scf + rl b + scf + rl c + ret + +.PlaceObject: + push hl + ld a, [hli] + ld c, [hl] + and $8 + jr nz, .use_source_2 + ld hl, wPrinterSendDataSource1 + jr .got_data_source + +.use_source_2 + ld hl, wPrinterSendDataSource2 +.got_data_source + ld b, $0 + ld a, c + and %11111000 + sub $8 + ld c, a + sla c + rl b + add hl, bc + ld e, l + ld d, h + ld hl, wcbec + ld c, $8 +.coord_copy_loop + call .GetBitMask + ld a, [de] + and b + or [hl] + ld [de], a + inc hl + inc de + ld a, [de] + and b + or [hl] + ld [de], a + inc hl + inc de + dec c + jr nz, .coord_copy_loop + pop hl + ret + +.GetBitMask: + push hl + push de + ld de, -$10 + add hl, de + ld a, [hli] + or [hl] + xor $ff + ld b, a + pop de + pop hl + ret + +Data_ea9de: + db 1, 0, $00, 0 + dw 1 +Data_ea9e4: + db 2, 0, $04, 0 + dw 0 +Data_ea9ea: + db 4, 0, $80, 2 + dw 0 +Data_ea9f0: + db 4, 0, $00, 0 + dw 4 +Data_ea9f6: + db 8, 0, $00, 0 + dw 8 +Data_ea9fc: + db 15, 0, $00, 0 + dw 15 diff --git a/engine/printer/serial.asm b/engine/printer/serial.asm index 97f655bb..fd4dd056 100755 --- a/engine/printer/serial.asm +++ b/engine/printer/serial.asm @@ -1,3 +1,14 @@ + const_def + const PRINTER_STATUS_BLANK + const PRINTER_STATUS_CHECKING_LINK + const PRINTER_STATUS_TRANSMITTING + const PRINTER_STATUS_PRINTING + const PRINTER_ERROR_1 + const PRINTER_ERROR_2 + const PRINTER_ERROR_3 + const PRINTER_ERROR_4 + const PRINTER_ERROR_WRONG_DEVICE + StartTransmission_Send9Rows: ld a, 9 Printer_StartTransmission: @@ -104,9 +115,9 @@ Printer_StartTransmittingTilemap: ld hl, PrinterDataPacket3 call CopyPrinterDataHeader call Printer_Convert2RowsTo2bpp - ld a, (wPrinterSendDataSource1End - wPrinterSendDataSource1) % $100 + ld a, LOW(wPrinterSendDataSource1End - wPrinterSendDataSource1) ld [wPrinterDataSize], a - ld a, (wPrinterSendDataSource1End - wPrinterSendDataSource1) / $100 + ld a, HIGH(wPrinterSendDataSource1End - wPrinterSendDataSource1) ld [wPrinterDataSize + 1], a call ComputePrinterChecksum call Printer_Next diff --git a/engine/surfing_minigame.asm b/engine/surfing_minigame.asm deleted file mode 100755 index 578e6b1e..00000000 --- a/engine/surfing_minigame.asm +++ /dev/null @@ -1,2862 +0,0 @@ -SurfingPikachuMinigame: - call SurfingPikachuMinigame_BlankPals - call DelayFrame - call DelayFrame - call DelayFrame - ldh a, [hTilesetType] - push af - xor a - ldh [hTilesetType], a - ld a, [wUpdateSpritesEnabled] - push af - ld a, $ff - ld [wUpdateSpritesEnabled], a - ldh a, [rIE] - push af - xor a - ldh [rIF], a - ld a, $f - ldh [rIE], a - ld a, $8 - ldh [rSTAT], a - ldh a, [hAutoBGTransferDest + 1] - push af - ld a, $98 - ldh [hAutoBGTransferDest + 1], a - call SurfingPikachuMinigameIntro - call SurfingPikachuLoop - xor a - ldh [rBGP], a - ldh [rOBP0], a - ldh [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - call ClearObjectAnimationBuffers - call ClearSprites - xor a - ldh [hLCDCPointer], a - ldh [hSCX], a - ldh [hSCY], a - ld a, $90 - ldh [hWY], a - call DelayFrame - pop af - ldh [hAutoBGTransferDest + 1], a - xor a - ldh [rIF], a - pop af - ldh [rIE], a - xor a - ldh [rSTAT], a - call RunDefaultPaletteCommand - call ReloadMapAfterSurfingMinigame - call PlayDefaultMusic - call GBPalNormal - pop af - ld [wUpdateSpritesEnabled], a - pop af - ldh [hTilesetType], a - ret - -SurfingPikachuLoop: - call SurfingPikachuMinigame_LoadGFXAndLayout - call DelayFrame - ld b, $e - call RunPaletteCommand -.loop - ld a, [wSurfingMinigameRoutineNumber] - bit 7, a - ret nz - call SurfingPikachu_GetJoypad_3FrameBuffer - call SurfingPikachu_CheckPressedSelect - ret nz - call RunSurfingMinigameRoutine - ld a, $3c - ld [wCurrentAnimatedObjectOAMBufferOffset], a - call RunObjectAnimations - call SurfingMinigame_MoveClouds - call .DelayFrame - call SurfingMinigame_UpdateMusicTempo - jr .loop - -.DelayFrame: - call DelayFrame - ret - -SurfingPikachu_CheckPressedSelect: - ld hl, wd492 - bit 1, [hl] - ret z - ldh a, [hJoyPressed] - and SELECT - ret - -Func_f80b7: - ldh a, [hJoyPressed] - and START - ret z - ld hl, wc5e2 - ld a, [hl] - xor $1 - ld [hl], a - ret - -SurfingMinigame_UpdateMusicTempo: - ld a, [wc634] - and a - ret z - - ; check that all channels are on their last frame of note delay - ld hl, wChannelNoteDelayCounters - ld a, $1 - cp [hl] - ret nz - inc hl - cp [hl] - ret nz - inc hl - cp [hl] - ret nz - - ; de = ([wSurfingMinigamePikachuSpeed] & 0x3f) * 2 - ld a, [wSurfingMinigamePikachuSpeed] - ld e, a - ld a, [wSurfingMinigamePikachuSpeed + 1] - and $3 - ld d, a - sla e - rl d - ld e, d - ld d, $0 - ld hl, .Tempos - add hl, de - add hl, de - ld a, [hli] - ld [wMusicTempo + 1], a - ld a, [hl] - ld [wMusicTempo], a - ret - -.Tempos: - dw 117 - dw 109 - dw 101 - dw 93 - dw 85 - -SurfingMinigame_ResetMusicTempo: - ld hl, wChannelNoteDelayCounters - ld a, $1 - cp [hl] - ret nz - inc hl - cp [hl] - ret nz - inc hl - cp [hl] - ret nz - ld a, 117 - ld [wMusicTempo + 1], a - xor a - ld [wMusicTempo], a - ret - -SurfingPikachuMinigame_LoadGFXAndLayout: - call SurfingPikachu_ClearTileMap - call ClearSprites - call DisableLCD - ld hl, wSurfingMinigameData - ld bc, wSurfingMinigameDataEnd - wSurfingMinigameData - xor a - call FillMemory - ld hl, wLYOverrides - ld bc, wLYOverridesBufferEnd - wLYOverrides - xor a - call FillMemory - xor a - ldh [hAutoBGTransferEnabled], a - call ClearObjectAnimationBuffers - - ld hl, SurfingPikachu1Graphics1 - ld de, $9000 - ld bc, $500 - ld a, BANK(SurfingPikachu1Graphics1) - call FarCopyData - - ld hl, SurfingPikachu1Graphics2 - ld de, $8000 - ld bc, $1000 - ld a, BANK(SurfingPikachu1Graphics2) - call FarCopyData - - ld a, SurfingPikachuSpawnStateDataPointer % $100 - ld [wAnimatedObjectSpawnStateDataPointer], a - ld a, SurfingPikachuSpawnStateDataPointer / $100 - ld [wAnimatedObjectSpawnStateDataPointer + 1], a - - ld a, SurfingPikachuObjectJumptable % $100 - ld [wAnimatedObjectJumptablePointer], a - ld a, SurfingPikachuObjectJumptable / $100 - ld [wAnimatedObjectJumptablePointer + 1], a - - ld a, SurfingPikachuOAMData % $100 - ld [wAnimatedObjectOAMDataPointer], a - ld a, SurfingPikachuOAMData / $100 - ld [wAnimatedObjectOAMDataPointer + 1], a - - ld a, SurfingPikachuFrames % $100 - ld [wAnimatedObjectFramesDataPointer], a - ld a, SurfingPikachuFrames / $100 - ld [wAnimatedObjectFramesDataPointer + 1], a - - ld hl, vBGMap0 - ld bc, $800 - ld a, $0 - call FillMemory - - ld hl, $98c0 - ld bc, $180 - ld a, $b - call FillMemory - - ld a, $1 - lb de, $74, $58 - call SpawnAnimatedObject - - ld a, $74 - ld [wSurfingMinigamePikachuObjectHeight], a - - call SurfingMinigame_InitScanlineOverrides - - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7e - ldh [hWY], a - ld a, rSCY - $ff00 - ldh [hLCDCPointer], a - ld a, $40 - ld [wSurfingMinigamePikachuSpeed], a - xor a - ld [wSurfingMinigamePikachuSpeed + 1], a - xor a - ld [wSurfingMinigamePikachuHP], a - ld a, $60 - ld [wSurfingMinigamePikachuHP + 1], a - ld hl, wSurfingMinigameWaveHeight - ld bc, $14 - ld a, $74 - call FillMemory - call Func_f81ff - call Func_f8256 - ld a, $e3 - ldh [rLCDC], a - call SurfingPikachuMinigame_SetBGPals - ld a, $e4 - ldh [rOBP0], a - ld a, $e0 - ldh [rOBP1], a - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -SurfingPikachuMinigame_SetBGPals: - ld a, [wOnSGB] - and a - jr nz, .sgb - ld a, $d0 - ldh [rBGP], a - call UpdateGBCPal_BGP - ret - -.sgb - ld a, $e4 - ldh [rBGP], a - call UpdateGBCPal_BGP - ret - -Func_f81ff: - ld hl, wSpriteDataEnd - ld de, Unkn_f8249 - ld b, $97 - ld c, $80 - ld a, $4 - call Func_f8233 - ld de, Unkn_f8248 - ld b, $96 - ld c, $50 - ld a, $1 - call Func_f8233 - ld de, Unkn_f824d - ld b, $14 - ld c, $20 - ld a, $5 - call Func_f8233 - ld de, Unkn_f8252 - ld b, $20 - ld c, $80 - ld a, $4 - call Func_f8233 - ret - -Func_f8233: -.asm_f8233 - push af - ld [hl], b - inc hl - ld [hl], c - inc hl - ld a, [de] - ld [hl], a - inc hl - ld [hl], $0 - inc hl - ld a, c - add $8 - ld c, a - inc de - pop af - dec a - jr nz, .asm_f8233 - ret - -Unkn_f8248: - db $fe - -Unkn_f8249: - db $d0 - db $d0 - db $d0 - db $d0 - -Unkn_f824d: - db $ec - db $ed - db $ed - db $ee - db $ef - -Unkn_f8252: - db $ec - db $ed - db $ee - db $ef - -Func_f8256: - ld de, $9c21 - ld hl, Unkn_f8279 - ld c, $9 -.asm_f825e - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .asm_f825e - ld hl, $9c01 - ld [hl], $15 - ld hl, $9c02 - ld [hl], $16 - ld hl, $9c2c - ld [hl], $1b - ld hl, $9c2d - ld [hl], $1c - ret - -Unkn_f8279: - db $17 - db $18 - db $19 - db $19 - db $19 - db $19 - db $19 - db $19 - db $19 - -RunSurfingMinigameRoutine: - ld a, [wSurfingMinigameRoutineNumber] - ld e, a - ld d, $0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.Jumptable: - dw SurfingMinigameRoutine_SpawnPikachu ; 0 - dw SurfingMinigame_RunGame ; 1 - dw Func_f8324 ; 2 - dw Func_f835c ; 3 - dw SurfingMinigame_DrawResultsScreenAndWait ; 4 - dw SurfingMinigame_WriteHPLeftAndWait ; 5 - dw SurfingMinigame_WriteRadnessAndWait ; 6 - dw SurfingMinigame_WriteTotalAndWait ; 7 - dw SurfingMinigame_AddRemainingHPToTotalAndWait ; 8 - dw SurfingMinigame_AddRadnessToTotalAndWait ; 9 - dw SurfingMinigame_WaitLast ; a - dw SurfingMinigame_ExitOnPressA ; b - dw SurfingMinigame_GameOver ; c - -SurfingMinigameRoutine_SpawnPikachu: - ld a, $2 - lb de, $48, $e0 - call SpawnAnimatedObject - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ld a, $1 - ld [wc634], a - ret - -SurfingMinigame_RunGame: - ld a, [wc5e5] - cp $18 - jr nc, .asm_f82e8 - ld hl, wSurfingMinigamePikachuHP - ld a, [hli] - or [hl] - and a - jr z, .dead - call Random - ld [wc5d5], a - call SurfingMinigame_UpdateLYOverrides - call SurfingMinigame_SetPikachuHeight - call SurfingMinigame_ReadBGMapBuffer - call SurfingMinigame_ScrollAndGenerateBGMap - call SurfingMinigame_UpdatePikachuDistance - call SurfingMinigame_Deduct1HP - call SurfingMinigame_DrawHP - ret - -.asm_f82e8 - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - xor a - ld [wc634], a - ld a, 192 - ld [wSurfingMinigameRoutineDelay], a - ret - -.dead - ld a, $1 - ld [wc630], a - ld a, $c - ld [wSurfingMinigameRoutineNumber], a - ld a, $80 - ld [wc631], a - ld a, $b - lb de, $88, $58 - call SpawnAnimatedObject - ld hl, ANIM_OBJ_Y_OFFSET - add hl, bc - ld [hl], $80 - ld hl, ANIM_OBJ_FIELD_B - add hl, bc - ld [hl], $80 - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld [hl], $30 - xor a - ld [wc634], a - ret - -Func_f8324: - call SurfingMinigame_RunDelayTimer - jr c, .done_delay - xor a - ld [wc5d5], a - call SurfingMinigame_UpdateLYOverrides - call SurfingMinigame_SetPikachuHeight - call SurfingMinigame_ReadBGMapBuffer - call Func_f8c97 - call SurfingMinigame_ResetMusicTempo - ret - -.done_delay - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ld a, $90 - ldh [hSCX], a - ld a, $72 - ld [wSurfingMinigameWaveFunctionNumber], a - ld a, $4 - ld [wc5d2], a - xor a - ldh [hLCDCPointer], a - ld [wSurfingMinigameSCX], a - ld [wSurfingMinigameSCX + 1], a - ld [wSurfingMinigameSCX + 2], a - ret - -Func_f835c: - ldh a, [hSCX] - and a - jr z, .asm_f837b - call SurfingMinigame_UpdateLYOverrides - call SurfingMinigame_SetPikachuHeight - call SurfingMinigame_ReadBGMapBuffer - ldh a, [hSCX] - dec a - dec a - dec a - dec a - ldh [hSCX], a - ld a, $e0 - ld [wSurfingMinigameXOffset], a - call SurfingMinigame_GenerateBGMap - ret - -.asm_f837b - xor a - ld [wSurfingMinigamePikachuSpeed], a - ld [wSurfingMinigamePikachuSpeed + 1], a - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ld a, $5 - ld [wc5d2], a - ret - -SurfingMinigame_DrawResultsScreenAndWait: - call SurfingMinigame_DrawResultsScreen - ld a, 32 - ld [wSurfingMinigameRoutineDelay], a - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ret - -SurfingMinigame_WriteHPLeftAndWait: - call SurfingMinigame_RunDelayTimer - ret nc - call SurfingMinigame_WriteHPLeft - ld a, 64 - ld [wSurfingMinigameRoutineDelay], a - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ret - -SurfingMinigame_WriteRadnessAndWait: - call SurfingMinigame_RunDelayTimer - ret nc - call SurfingMinigame_WriteRadness - ld a, 64 - ld [wSurfingMinigameRoutineDelay], a - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ret - -SurfingMinigame_WriteTotalAndWait: - call SurfingMinigame_RunDelayTimer - ret nc - call SurfingMinigame_WriteTotal - ld a, 64 - ld [wSurfingMinigameRoutineDelay], a - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ret - -SurfingMinigame_AddRemainingHPToTotalAndWait: - call SurfingMinigame_RunDelayTimer - ret nc - call SurfingMinigame_AddRemainingHPToTotal - push af - call SurfingMinigame_BCDPrintTotalScore - pop af - ret nc - ld a, 64 - ld [wSurfingMinigameRoutineDelay], a - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ret - -SurfingMinigame_AddRadnessToTotalAndWait: - call SurfingMinigame_RunDelayTimer - ret nc - call SurfingMinigame_AddRadnessToTotal - push af - call SurfingMinigame_BCDPrintTotalScore - pop af - ret nc - ld a, 128 - ld [wSurfingMinigameRoutineDelay], a - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - call DidPlayerGetAHighScore - ret nc - call SurfingMinigame_PrintTextHiScore - ld a, $6 - ld [wc5d2], a - ret - -SurfingMinigame_WaitLast: - call SurfingMinigame_RunDelayTimer - ret nc - ld hl, wSurfingMinigameRoutineNumber - inc [hl] - ret - -SurfingMinigame_ExitOnPressA: - call SurfingMinigame_UpdateLYOverrides - ldh a, [hJoyPressed] - and A_BUTTON - ret z - ld hl, wSurfingMinigameRoutineNumber - set 7, [hl] - ret - -SurfingMinigame_GameOver: - call SurfingMinigame_UpdateLYOverrides - call SurfingMinigame_SetPikachuHeight - call SurfingMinigame_ReadBGMapBuffer - call SurfingMinigame_ScrollAndGenerateBGMap - call SurfingMinigame_ResetMusicTempo - ld hl, wc631 - ld a, [hl] - and a - jr z, .wait_press_a - dec [hl] - ret - -.wait_press_a - ldh a, [hJoyPressed] - and A_BUTTON - ret z - ld hl, wSurfingMinigameRoutineNumber - set 7, [hl] - ret - -SurfingMinigame_RunDelayTimer: - ld hl, wSurfingMinigameRoutineDelay - ld a, [hl] - and a - jr z, .set_carry - dec [hl] - and a - ret - -.set_carry - scf - ret - -SurfingMinigame_UpdatePikachuDistance: - ld a, [wc5e5 + 1] - ld h, a - ld a, [wc5e5 + 2] - ld l, a - ld a, [wSurfingMinigamePikachuSpeed] - ld e, a - ld a, [wSurfingMinigamePikachuSpeed + 1] - ld d, a - add hl, de - ld a, h - ld [wc5e5 + 1], a - ld a, l - ld [wc5e5 + 2], a - ret nc - ld hl, wc5e5 - inc [hl] - ld hl, wOAMBuffer + 4 * 4 + 1 - dec [hl] - dec [hl] - ret - -SurfingMinigameAnimatedObjectFn_Pikachu: - ld a, [wc5d2] - ld e, a - ld d, $0 - ld hl, Jumptable_f847f - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -Jumptable_f847f: - dw Func_f848d - dw SurfingMinigame_ScoreCurrentWave - dw Func_f8516 - dw Func_f8545 - dw Func_f8561 - dw Func_f856d - dw Func_f8579 - -Func_f848d: - ld a, [wc630] - and a - jr nz, .asm_f84d2 - call Func_f87b5 - ld a, [wSurfingMinigamePikachuObjectHeight] - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld [hl], a - call Func_f871e - jr c, .splash - call Func_f8742 - call SurfingMinigame_SpeedUpPikachu - ret - -.splash - call Func_f8742 - ld a, $1 ; on a wave - ld [wc5d2], a - xor a - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld [hl], a - ld hl, ANIM_OBJ_FIELD_D - add hl, bc - ld [hl], a - ld hl, ANIM_OBJ_FIELD_E - add hl, bc - ld [hl], a - ld [wSurfingMinigameRadnessMeter], a - ld [wSurfingMinigameTrickFlags], a - xor a - ld [wChannelSoundIDs + Ch8], a - ld a, SFX_SURFING_JUMP - call PlaySound - ret - -.asm_f84d2 - xor a - ld [wSurfingMinigamePikachuSpeed], a - ld [wSurfingMinigamePikachuSpeed + 1], a - ld a, $4 - ld [wc5d2], a - call Func_f8742 - ret - -SurfingMinigame_ScoreCurrentWave: - call SurfingMinigame_DPadAction - call SurfingMinigame_UpdatePikachuHeight - ret nc - call SurfingMinigame_TileInteraction - jr c, .splash - call SurfingMinigame_CalculateAndAddRadnessFromStunt - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld [hl], $0 - ld a, $2 - ld [wc5d2], a - ret - -.splash - ld a, $3 - ld [wc5d2], a - ld a, $60 - ld [wc5e1], a - ld a, $10 - call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters - xor a - ld [wChannelSoundIDs + Ch8], a - ld a, SFX_SURFING_CRASH - call PlaySound - ret - -Func_f8516: - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld a, [hl] - cp $20 - jr nc, .asm_f8539 - inc [hl] - inc [hl] - inc [hl] - inc [hl] - ld d, $4 - call SurfingPikachu_Sine - ld hl, ANIM_OBJ_Y_OFFSET - add hl, bc - ld [hl], a - call Func_f87b5 - ld a, [wSurfingMinigamePikachuObjectHeight] - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld [hl], a - ret - -.asm_f8539 - ld hl, ANIM_OBJ_Y_OFFSET - add hl, bc - ld [hl], $0 - ld a, $0 - ld [wc5d2], a - ret - -Func_f8545: - ld hl, wc5e1 - ld a, [hl] - and a - jr z, .asm_f8556 - dec [hl] - ld a, [wSurfingMinigamePikachuObjectHeight] - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld [hl], a - ret - -.asm_f8556 - ld a, $0 - ld [wc5d2], a - ld a, $4 - call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters - ret - -Func_f8561: - ld a, [wSurfingMinigamePikachuObjectHeight] - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld [hl], a - call Func_f8742 - ret - -Func_f856d: - ld a, $f - call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld [hl], $0 - ret - -Func_f8579: - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld a, [hl] - inc [hl] - inc [hl] - and $3f - cp $20 - jr c, .asm_f8591 - ld d, $10 - call SurfingPikachu_Sine - ld hl, ANIM_OBJ_Y_OFFSET - add hl, bc - ld [hl], a - ret - -.asm_f8591 - ld hl, ANIM_OBJ_Y_OFFSET - add hl, bc - ld [hl], $0 - ret - -SurfingMinigame_DPadAction: - ld de, hJoy5 - ld a, [de] - and D_LEFT - jr nz, .d_left - ld a, [de] - and D_RIGHT - jr nz, .d_right - ret - -.d_left - ld hl, ANIM_OBJ_FIELD_E - add hl, bc - ld [hl], $0 - ld hl, ANIM_OBJ_FIELD_D - add hl, bc - ld a, [hl] - inc [hl] - cp $b - jr c, .d_left_skip - call .StartTrick - ld hl, wSurfingMinigameTrickFlags - set 0, [hl] -.d_left_skip - ld hl, ANIM_OBJ_FRAME_SET - add hl, bc - ld a, [hl] - cp $e - jr nc, .d_left_reset - inc [hl] - ret - -.d_left_reset - ld [hl], $1 - ret - -.d_right - ld hl, ANIM_OBJ_FIELD_D - add hl, bc - ld [hl], $0 - ld hl, ANIM_OBJ_FIELD_E - add hl, bc - ld a, [hl] - inc [hl] - cp $d - jr c, .d_right_skip - call .StartTrick - ld hl, wSurfingMinigameTrickFlags - set 1, [hl] -.d_right_skip - ld hl, ANIM_OBJ_FRAME_SET - add hl, bc - ld a, [hl] - cp $1 - jr z, .d_right_reset - dec [hl] - ret - -.d_right_reset - ld [hl], $e - ret - -.StartTrick: - call SurfingMinigame_IncreaseRadnessMeter - xor a - ld hl, ANIM_OBJ_FIELD_D - add hl, bc - ld [hl], a - ld hl, ANIM_OBJ_FIELD_E - add hl, bc - ld [hl], a - ld a, SFX_SURFING_FLIP - call PlaySound - ret - -SurfingMinigame_TileInteraction: - ld hl, ANIM_OBJ_FRAME_SET - add hl, bc - ld a, [wSurfingMinigameBGMapReadBuffer] - cp $6 - jr z, .tile_06 - cp $14 - jr z, .tile_14 - cp $12 - jr z, .tile_12 - cp $7 - jr z, .tile_07 - ld a, [hl] - cp $1 - jp z, .action_0 - cp $2 - jr z, .action_1 - cp $3 - jr z, .action_2 - cp $4 - jr z, .action_3 - cp $5 - jr z, .action_2 - cp $6 - jr z, .action_1 - cp $7 - jr z, .action_0 - jr .action_0 - -.tile_06 - ld a, [hl] - cp $1 - jr z, .action_0 - cp $2 - jr z, .action_0 - cp $3 - jr z, .action_0 - cp $4 - jr z, .action_1 - cp $5 - jr z, .action_2 - cp $6 - jr z, .action_3 - cp $7 - jr z, .action_2 - jr .action_0 - -.tile_07 - ld a, [hl] - cp $1 - jr z, .action_2 - cp $2 - jr z, .action_3 - cp $3 - jr z, .action_2 - cp $4 - jr z, .action_1 - cp $5 - jr z, .action_0 - cp $6 - jr z, .action_0 - cp $7 - jr z, .action_0 - jr .action_0 - -.tile_12 -.tile_14 - ld a, [hl] - cp $1 - jr z, .action_0 - cp $2 - jr z, .action_1 - cp $3 - jr z, .action_2 - cp $4 - jr z, .action_3 - cp $5 - jr z, .action_3 - cp $6 - jr z, .action_2 - cp $7 - jr z, .action_1 - jr .action_0 - -.action_1 - call SufingMinigame_ReduceSpeedBy128 - jr .action_3 - -.action_2 - call SufingMinigame_ReduceSpeedBy64 -.action_3 - xor a - ld [wChannelSoundIDs + Ch8], a - ld a, SFX_SURFING_LAND - call PlaySound - and a - ret - -.action_0 - ld a, $40 - ld [wSurfingMinigamePikachuSpeed], a - xor a - ld [wSurfingMinigamePikachuSpeed + 1], a - scf - ret - -SurfingMinigame_SpeedUpPikachu: - ld a, [wSurfingMinigamePikachuSpeed + 1] - cp $2 - ret nc - ld h, a - ld a, [wSurfingMinigamePikachuSpeed] - ld l, a - ld de, $2 - add hl, de - ld a, h - ld [wSurfingMinigamePikachuSpeed + 1], a - ld a, l - ld [wSurfingMinigamePikachuSpeed], a - ret - -SufingMinigame_ReduceSpeedBy64: - ld a, [wSurfingMinigamePikachuSpeed + 1] - and a - jr nz, .go - ld a, [wSurfingMinigamePikachuSpeed] - cp $40 - jr nc, .go - xor a - ld [wSurfingMinigamePikachuSpeed], a - ret - -.go - ld a, [wSurfingMinigamePikachuSpeed + 1] - ld h, a - ld a, [wSurfingMinigamePikachuSpeed] - ld l, a - ld de, -$40 - add hl, de - ld a, h - ld [wSurfingMinigamePikachuSpeed + 1], a - ld a, l - ld [wSurfingMinigamePikachuSpeed], a - ret - -SufingMinigame_ReduceSpeedBy128: - ld a, [wSurfingMinigamePikachuSpeed + 1] - and a - jr nz, .go - ld a, [wSurfingMinigamePikachuSpeed] - cp $80 - jr nc, .go - xor a - ld [wSurfingMinigamePikachuSpeed], a - ret - -.go - ld a, [wSurfingMinigamePikachuSpeed + 1] - ld h, a - ld a, [wSurfingMinigamePikachuSpeed] - ld l, a - ld de, -$80 - add hl, de - ld a, h - ld [wSurfingMinigamePikachuSpeed + 1], a - ld a, l - ld [wSurfingMinigamePikachuSpeed], a - ret - -Func_f871e: - ldh a, [hSCX] - and $7 - cp $3 - jr c, .asm_f8740 - cp $5 - jr nc, .asm_f8740 - ld a, [wSurfingMinigameBGMapReadBuffer] - cp $14 - jr nz, .asm_f8740 - call SufingMinigame_GetSpeedDividedBy32 - cp $a - jr c, .asm_f8740 - ld [wc5ec], a - call Func_f9284 - scf - ret - -.asm_f8740 - and a - ret - -Func_f8742: - ldh a, [hSCX] - and $7 - cp $3 - ret c - cp $5 - ret nc - ld a, [wSurfingMinigameBGMapReadBuffer] - cp $6 - jr z, .asm_f8766 - cp $14 - jr z, .asm_f8766 - cp $7 - jr z, .asm_f876a - call Func_f8778 - ld a, $4 - ld hl, ANIM_OBJ_FRAME_SET - add hl, bc - ld [hl], a - ret - -.asm_f8766 - ld a, $6 - jr .asm_f876c - -.asm_f876a - ld a, $2 -.asm_f876c - ld e, a - ld a, [wc5de] - dec a - add e - ld hl, ANIM_OBJ_FRAME_SET - add hl, bc - ld [hl], a - ret - -Func_f8778: - ld hl, wc5e0 - ld a, [hl] - inc [hl] - and $7 - ret nz - ld a, [wc5df] - and a - jr z, .asm_f8796 - ld a, [wc5de] - and a - jr z, .asm_f8791 - dec a - ld [wc5de], a - ret - -.asm_f8791 - xor a - ld [wc5df], a - ret - -.asm_f8796 - ld a, [wc5de] - cp $2 - jr z, .asm_f87a2 - inc a - ld [wc5de], a - ret - -.asm_f87a2 - ld a, $1 - ld [wc5df], a - ret - -SufingMinigame_GetSpeedDividedBy32: - ld a, [wSurfingMinigamePikachuSpeed] - ld l, a - ld a, [wSurfingMinigamePikachuSpeed + 1] - ld h, a - add hl, hl - add hl, hl - add hl, hl - ld a, h - ret - -Func_f87b5: - ld hl, wc5eb - ld a, [hl] - inc [hl] - and $3 - ret nz - call .GetYCoord - ld d, a - ld hl, ANIM_OBJ_X_COORD - add hl, bc - ld e, [hl] - ld a, $a - push bc - call SpawnAnimatedObject - pop bc - ret - -.GetYCoord: - ldh a, [hSCX] - and $8 - jr nz, .get_height_plus_9 - ld hl, wSurfingMinigameWaveHeight + 8 - jr .got_hl - -.get_height_plus_9 - ld hl, wSurfingMinigameWaveHeight + 9 -.got_hl - ld a, [wSurfingMinigameBGMapReadBuffer + 1] - cp $6 - jr z, .six_or_twenty - cp $14 - jr z, .six_or_twenty - cp $7 - jr z, .seven - ld a, [hl] - ret - -.six_or_twenty - ldh a, [hSCX] - and $7 - ld e, a - ld a, [hl] - sub e - ret - -.seven - ldh a, [hSCX] - and $7 - add [hl] - ret - -Func_f87fb: - ld hl, ANIM_OBJ_X_COORD - add hl, bc - ld a, [hl] - cp $58 - ret z - add $4 - ld [hl], a - ret - -Func_f8807: ; unreferenced - call MaskCurrentAnimatedObjectStruct - ret - -SurfingMinigameAnimatedObjectFn_FlippingPika: - ld hl, ANIM_OBJ_FIELD_B - add hl, bc - ld a, [hl] - and a - ret z - dec [hl] - dec [hl] - ld d, a - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld a, [hl] - inc [hl] - call SurfingPikachu_Sine - cp $80 - jr nc, .positive - xor $ff - inc a -.positive - ld hl, ANIM_OBJ_Y_OFFSET - add hl, bc - ld [hl], a - ret - -SurfingMinigameAnimatedObjectFn_IntroAnimationPikachu: - ld hl, ANIM_OBJ_FIELD_B - add hl, bc - ld a, [hl] - inc [hl] - and $1 - ret z - ld hl, ANIM_OBJ_X_COORD - add hl, bc - ld a, [hl] - cp $c0 - jr z, .done - inc [hl] - ret - -.done - ld a, $1 - ld [wSurfingMinigameIntroAnimationFinished], a - call MaskCurrentAnimatedObjectStruct - ret - -SurfingMinigame_MoveClouds: - ld a, [wc635] - ld e, a - ld d, $0 - ld a, [wSurfingMinigamePikachuSpeed] - ld l, a - ld a, [wSurfingMinigamePikachuSpeed + 1] - ld h, a - add hl, de - ld a, l - ld [wc635], a - ld d, h - ld hl, wOAMBuffer + 5 * 4 + 1 - ld e, $9 -.loop - ld a, [hl] - add d - ld [hli], a - inc hl - inc hl - inc hl - dec e - jr nz, .loop - ret - -SurfingMinigame_ReadBGMapBuffer: - ld a, [wSurfingMinigameBGMapReadBuffer] ; ??? - ldh a, [hSCX] - add $48 - ld e, a - srl e - srl e - srl e - ld d, $0 - ld hl, vBGMap0 - add hl, de - ld a, [wSurfingMinigamePikachuObjectHeight] - srl a - srl a - srl a - ld c, a -.loop - ld a, c - and a - jr z, .copy - dec c - ld de, $20 - add hl, de - ld a, h - and $3 - or $98 - ld h, a - jr .loop - -.copy - ld de, wSurfingMinigameBGMapReadBuffer - ld a, e - ldh [hVBlankCopyDest], a - ld a, d - ldh [hVBlankCopyDest + 1], a - ld a, l - ldh [hVBlankCopySource], a - ld a, h - ldh [hVBlankCopySource + 1], a - ld a, 16 / $10 - ldh [hVBlankCopySize], a - ret - -SurfingMinigame_SetPikachuHeight: - ldh a, [hSCX] - and $8 - jr nz, .asm_f88b9 - ld hl, wSurfingMinigameWaveHeight + 7 - jr .asm_f88bc - -.asm_f88b9 - ld hl, wSurfingMinigameWaveHeight + 8 -.asm_f88bc - ld a, [wSurfingMinigameBGMapReadBuffer] - cp $6 - jr z, .asm_f88d0 - cp $14 - jr z, .asm_f88d0 - cp $7 - jr z, .asm_f88db - ld a, [hl] - ld [wSurfingMinigamePikachuObjectHeight], a - ret - -.asm_f88d0 - ldh a, [hSCX] - and $7 - ld e, a - ld a, [hl] - sub e - ld [wSurfingMinigamePikachuObjectHeight], a - ret - -.asm_f88db - ldh a, [hSCX] - and $7 - add [hl] - ld [wSurfingMinigamePikachuObjectHeight], a - ret - -SurfingMinigame_Deduct1HP: - ld hl, wSurfingMinigamePikachuHP - ld e, $99 - call .BCD_Deduct - ret nc - inc hl - ld e, $99 -.BCD_Deduct: - ld a, [hl] - and a - jr z, .roll_over - sub $1 - daa - ld [hl], a - and a - ret - -.roll_over - ld [hl], e - scf - ret - -SurfingMinigame_DrawHP: - ld de, wSurfingMinigamePikachuHP + 1 - ld hl, wOAMBuffer + 0 * 4 + 2 - ld a, [de] - call .PlaceBCDNumber - ld hl, wOAMBuffer + 2 * 4 + 2 - ld a, [de] -.PlaceBCDNumber: - ld c, a - swap a - and $f - add $d0 - ld [hli], a - inc hl - inc hl - inc hl - ld a, c - and $f - add $d0 - ld [hl], a - dec de - ret - -SurfingMinigame_DrawResultsScreen: - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call FillMemory - ld hl, .BeachTilemap - decoord 0, 6 - ld bc, .BeachTilemapEnd - .BeachTilemap - call CopyData - call .PlaceTextbox - ld hl, wOAMBuffer + 5 * 4 + 1 - ld bc, 9 * 4 - xor a - call FillMemory - ld a, $1 - ldh [hAutoBGTransferEnabled], a - ret - -.BeachTilemap: -INCBIN "gfx/unknown_f8946.map" -.BeachTilemapEnd: - -.PlaceTextbox: - hlcoord 1, 1 - lb de, $3b, $3c - ld a, $40 - call .place_row - hlcoord 1, 2 - lb de, $3f, $3f - ld a, $ff - call .place_row - hlcoord 1, 3 - lb de, $3f, $3f - ld a, $ff - call .place_row - hlcoord 1, 4 - lb de, $3f, $3f - ld a, $ff - call .place_row - hlcoord 1, 5 - lb de, $3f, $3f - ld a, $ff - call .place_row - hlcoord 1, 6 - lb de, $3f, $3f - ld a, $ff - call .place_row - hlcoord 1, 7 - lb de, $3f, $3f - ld a, $ff - call .place_row - hlcoord 1, 8 - lb de, $3f, $3f - ld a, $ff - call .place_row - hlcoord 1, 9 - lb de, $3d, $3e - ld a, $40 - call .place_row - ret - -.place_row: - ld [hl], d - inc hl - ld c, $10 -.loop - ld [hli], a - dec c - jr nz, .loop - ld [hl], e - ret - -SurfingMinigame_PrintTextHiScore: - ld hl, .Hi_Score - decoord 6, 8 - ld bc, $9 - call CopyData - ret - -.Hi_Score: - db $20,$2e,$2f,$30,$31,$2c,$32,$23,$33 ; Hi-Score!! - -SurfingMinigame_WriteHPLeft: - ld hl, .HP_Left - decoord 2, 2 - ld bc, $7 - call CopyData - call SurfingMinigame_BCDPrintHPLeft - ret - -.HP_Left: - db $20,$21,$ff,$22,$23,$24,$25 ; HP Left - -SurfingMinigame_AddRemainingHPToTotal: - ld c, 99 -.loop - push bc - ld hl, wSurfingMinigamePikachuHP - ld a, [hli] - or [hl] - and a - jr z, .dead - call SurfingMinigame_Deduct1HP - ld e, $1 - call SurfingMinigame_AddPointsToTotal - pop bc - dec c - jr nz, .loop - ld a, SFX_PRESS_AB - call PlaySound - and a - ret - -.dead - pop bc - scf - ret - -SurfingMinigame_BCDPrintHPLeft: - hlcoord 10, 2 - ld de, wSurfingMinigamePikachuHP + 1 - ld a, [de] - call SurfingPikachu_PlaceBCDNumber - inc hl - ld a, [de] - call SurfingPikachu_PlaceBCDNumber - inc hl - inc hl - ld [hl], $21 ; P - inc hl - ld [hl], $25 ; t - inc hl - ld [hl], $26 ; s - ret - -SurfingMinigame_WriteRadness: - ld hl, .Radness - decoord 2, 4 - ld bc, $7 - call CopyData - call SurfingMinigame_BCDPrintRadness - ret - -.Radness: - db $27,$28,$29,$2a,$23,$26,$26 ; Radness - -SurfingMinigame_AddRadnessToTotal: - ld c, 99 -.loop - push bc - ld hl, wSurfingMinigameRadnessScore - ld a, [hli] - ld e, a - or [hl] - jr z, .done - ld d, [hl] - ld a, e - sub $1 - daa - ld e, a - ld a, d - sbc $0 - daa - ld [hld], a - ld [hl], e - ld e, $1 - call SurfingMinigame_AddPointsToTotal - pop bc - dec c - jr nz, .loop - ld a, SFX_PRESS_AB - call PlaySound - and a - ret - -.done - pop bc - scf - ret - -SurfingMinigame_BCDPrintRadness: - ld a, [wSurfingMinigameRadnessScore + 1] - hlcoord 10, 4 - call SurfingPikachu_PlaceBCDNumber - ld a, [wSurfingMinigameRadnessScore] - hlcoord 12, 4 - call SurfingPikachu_PlaceBCDNumber - inc hl - inc hl - ld [hl], $21 ; P - inc hl - ld [hl], $25 ; t - inc hl - ld [hl], $26 ; s - ret - -SurfingMinigame_AddPointsToTotal: - ld a, [wSurfingMinigameTotalScore] - add e - daa - ld [wSurfingMinigameTotalScore], a - ld a, [wSurfingMinigameTotalScore + 1] - adc $0 - daa - ld [wSurfingMinigameTotalScore + 1], a - ret nc - ld a, $99 - ld [wSurfingMinigameTotalScore], a - ld [wSurfingMinigameTotalScore + 1], a - ret - -SurfingMinigame_BCDPrintTotalScore: - ld a, [wSurfingMinigameTotalScore + 1] - hlcoord 10, 6 - call SurfingPikachu_PlaceBCDNumber - ld a, [wSurfingMinigameTotalScore] - hlcoord 12, 6 - call SurfingPikachu_PlaceBCDNumber - inc hl - inc hl - ld [hl], $21 ; P - inc hl - ld [hl], $25 ; t - inc hl - ld [hl], $26 ; s - ret - -SurfingMinigame_WriteTotal: - ld hl, .Total - decoord 2, 6 - ld bc, $5 - call CopyData - call SurfingMinigame_BCDPrintRadness - call SurfingMinigame_BCDPrintTotalScore - ret - -.Total: - db $2b,$2c,$25,$28,$2d ; Total - -DidPlayerGetAHighScore: - ld hl, wSurfingMinigameHiScore + 1 - ld a, [wSurfingMinigameTotalScore + 1] - cp [hl] - jr c, .not_high_score - jr nz, .high_score - dec hl - ld a, [wSurfingMinigameTotalScore] - cp [hl] - jr c, .not_high_score - jr nz, .high_score -.not_high_score - call WaitForSoundToFinish - ldpikacry e, PikachuCry28 - call SurfingMinigame_PlayPikaCryIfSurfingPikaInParty - and a - ret - -.high_score - ld a, [wSurfingMinigameTotalScore] - ld [wSurfingMinigameHiScore], a - ld a, [wSurfingMinigameTotalScore + 1] - ld [wSurfingMinigameHiScore + 1], a - call WaitForSoundToFinish - ldpikacry e, PikachuCry34 - call SurfingMinigame_PlayPikaCryIfSurfingPikaInParty - ld a, SFX_GET_ITEM2_4_2 - call PlaySound - scf - ret - -SurfingMinigame_PlayPikaCryIfSurfingPikaInParty: - push de - callfar IsSurfingPikachuInThePlayersParty - pop de - ret nc - callfar PlayPikachuSoundClip - ret - -SurfingMinigame_IncreaseRadnessMeter: - ld a, [wSurfingMinigameRadnessMeter] - inc a - cp $4 - jr c, .cap - ld a, $3 -.cap - ld [wSurfingMinigameRadnessMeter], a - ret - -SurfingMinigame_CalculateAndAddRadnessFromStunt: - ; Compute the amount of radness points from the - ; current trick based on the number of - ; consecutive flips - ; Single flip: +0050 - ; 2 of the same flip: +0150 - ; 3 or more of the same flip: +0350 - ; 2 different flips: +0180 - ; 3 or more different flips: +0500 - ld a, [wSurfingMinigameRadnessMeter] - and a - ret z - ld a, [wSurfingMinigameTrickFlags] - and $3 - cp $3 ; did a combination of front and back flips - jr z, .mixed_chain - ld a, [wSurfingMinigameRadnessMeter] - ld d, a - ld e, $1 - ld a, $0 -.get_amount_of_radness - add e - sla e - dec d - jr nz, .get_amount_of_radness -.add_radness_50_at_a_time - push af - ld e, $50 - call SurfingMinigame_AddRadness - pop af - dec a - jr nz, .add_radness_50_at_a_time - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld a, [hl] - sub $10 - ld d, a - ld hl, ANIM_OBJ_X_COORD - add hl, bc - ld e, [hl] - ld a, [wSurfingMinigameRadnessMeter] - add $3 - push bc - call SpawnAnimatedObject - pop bc - ret - -.mixed_chain - ld a, [wSurfingMinigameRadnessMeter] - cp $3 - jr c, .add_180_radness_points - ld a, 10 -.add_500_radness_50_at_a_time - push af - ld e, $50 - call SurfingMinigame_AddRadness - pop af - dec a - jr nz, .add_500_radness_50_at_a_time - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld a, [hl] - sub $10 - ld d, a - ld hl, ANIM_OBJ_X_COORD - add hl, bc - ld e, [hl] - ld a, $9 - push bc - call SpawnAnimatedObject - pop bc - ret - -.add_180_radness_points - ld e, $50 - call SurfingMinigame_AddRadness - ld e, $50 - call SurfingMinigame_AddRadness - ld e, $50 - call SurfingMinigame_AddRadness - ld e, $30 - call SurfingMinigame_AddRadness - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld a, [hl] - sub $10 - ld d, a - ld hl, ANIM_OBJ_X_COORD - add hl, bc - ld e, [hl] - ld a, $8 - push bc - call SpawnAnimatedObject - pop bc - ret - -SurfingMinigame_AddRadness: - ld a, [wSurfingMinigameRadnessScore] - add e - daa - ld [wSurfingMinigameRadnessScore], a - ld a, [wSurfingMinigameRadnessScore + 1] - adc $0 - daa - ld [wSurfingMinigameRadnessScore + 1], a - ret nc - ld a, $99 - ld [wSurfingMinigameRadnessScore], a - ld [wSurfingMinigameRadnessScore + 1], a - ret - -Func_f8c97: - ld a, $a0 - ld [wSurfingMinigameXOffset], a - ldh a, [hSCX] - ld h, a - ld a, [wSurfingMinigameSCX] - ld l, a - ld de, $900 - add hl, de - ld a, l - ld [wSurfingMinigameSCX], a - ld a, h - ldh [hSCX], a - jr SurfingMinigame_GenerateBGMap - -SurfingMinigame_ScrollAndGenerateBGMap: - ld a, $a0 - ld [wSurfingMinigameXOffset], a - ldh a, [hSCX] - ld h, a - ld a, [wSurfingMinigameSCX] - ld l, a - ld de, $180 - add hl, de - ld a, l - ld [wSurfingMinigameSCX], a - ld a, h - ldh [hSCX], a -SurfingMinigame_GenerateBGMap: - ld hl, wSurfingMinigameSCX + 1 - ldh a, [hSCX] - cp [hl] - ret z - ld [hl], a - and $f0 - ld hl, wSurfingMinigameSCX + 2 - cp [hl] - ret z - ld [hl], a - call SurfingMinigame_GetWaveDataPointers - ; b and c contain the height of the next wave to appear - ; on screen, in number of pixels from the top of the screen - ld a, b - ld [wSurfingMinigameWaveHeightBuffer], a - ld a, c - ld [wSurfingMinigameWaveHeightBuffer + 1], a - push de - ld hl, wSurfingMinigameWaveHeight - ld de, wSurfingMinigameWaveHeight + 2 - ld c, SCREEN_WIDTH - 2 -.copy_loop - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .copy_loop - ld a, [wSurfingMinigameWaveHeightBuffer] - ld [hli], a - ld a, [wSurfingMinigameWaveHeightBuffer + 1] - ld [hl], a - pop de - ld hl, wRedrawRowOrColumnSrcTiles - ld c, $8 -.loop - ld a, [de] - call .CopyRedrawSrcTiles - inc de - dec c - jr nz, .loop - ld a, [wSurfingMinigameXOffset] - ld e, a - ldh a, [hSCX] - add e - and $f0 - srl a - srl a - srl a - ld e, a - ld d, $0 - ld hl, vBGMap0 - add hl, de - ld a, l - ldh [hRedrawRowOrColumnDest], a - ld a, h - ldh [hRedrawRowOrColumnDest + 1], a - ld a, $1 - ldh [hRedrawRowOrColumnMode], a - ret - -.CopyRedrawSrcTiles: - push de - push hl - ld l, a - ld h, $0 - ld de, Unkn_f96e5 - add hl, hl - add hl, hl - add hl, de - ld e, l - ld d, h - pop hl - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - pop de - ret - -SurfingMinigame_GetWaveDataPointers: - ld a, [wSurfingMinigameWaveFunctionNumber] - ld e, a - ld d, $0 - ld hl, Jumptable_f8d53 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -Jumptable_f8d53: - dw SurfingMinigameWaveFunction_NoWave ; 00 - - dw Func_f8f28 ; 01 - dw Func_f8f31 ; 02 - dw Func_f8f3a ; 03 - dw Func_f8f43 ; 04 - dw Func_f8e7d ; 05 - dw Func_f8f4c ; 06 - dw Func_f8f55 ; 07 - dw Func_f8f5e ; 08 - dw Func_f8e7d ; 09 - dw Func_f8e7d ; 0a - dw Func_f8e7d ; 0b - dw Func_f8e7d ; 0c - dw Func_f8f94 ; 0d - - dw Func_f8ec5 ; 0e - dw Func_f8ece ; 0f - dw Func_f8ed7 ; 10 - dw Func_f8ee0 ; 11 - dw Func_f8ee9 ; 12 - dw Func_f8ef2 ; 13 - dw Func_f8e7d ; 14 - dw Func_f8e7d ; 15 - dw Func_f8e7d ; 16 - dw Func_f8e7d ; 17 - dw Func_f8e7d ; 18 - dw Func_f8f94 ; 19 - - dw Func_f8efb ; 1a - dw Func_f8f04 ; 1b - dw Func_f8f0d ; 1c - dw Func_f8f16 ; 1d - dw Func_f8f1f ; 1e - dw Func_f8efb ; 1f - dw Func_f8f04 ; 20 - dw Func_f8f0d ; 21 - dw Func_f8f16 ; 22 - dw Func_f8f1f ; 23 - dw Func_f8e7d ; 24 - dw Func_f8e7d ; 25 - dw Func_f8e7d ; 26 - dw Func_f8e7d ; 27 - dw Func_f8f94 ; 28 - - dw Func_f8f28 ; 29 - dw Func_f8f31 ; 2a - dw Func_f8f3a ; 2b - dw Func_f8f43 ; 2c - dw Func_f8e7d ; 2d - dw Func_f8e7d ; 2e - dw Func_f8e7d ; 2f - dw Func_f8e7d ; 30 - dw Func_f8f94 ; 31 - - dw Func_f8f4c ; 32 - dw Func_f8f55 ; 33 - dw Func_f8f5e ; 34 - dw Func_f8f4c ; 35 - dw Func_f8f55 ; 36 - dw Func_f8f5e ; 37 - dw Func_f8f4c ; 38 - dw Func_f8f55 ; 39 - dw Func_f8f5e ; 3a - dw Func_f8e7d ; 3b - dw Func_f8e7d ; 3c - dw Func_f8e7d ; 3d - dw Func_f8e7d ; 3e - dw Func_f8f94 ; 3f - - dw Func_f8f67 ; 40 - dw Func_f8f70 ; 41 - dw Func_f8efb ; 42 - dw Func_f8f04 ; 43 - dw Func_f8f0d ; 44 - dw Func_f8f16 ; 45 - dw Func_f8f1f ; 46 - dw Func_f8f67 ; 47 - dw Func_f8f70 ; 48 - dw Func_f8e7d ; 49 - dw Func_f8e7d ; 4a - dw Func_f8e7d ; 4b - dw Func_f8f94 ; 4c - - dw Func_f8ec5 ; 4d - dw Func_f8ece ; 4e - dw Func_f8ed7 ; 4f - dw Func_f8ee0 ; 50 - dw Func_f8ee9 ; 51 - dw Func_f8ef2 ; 52 - dw Func_f8e7d ; 53 - dw Func_f8f67 ; 54 - dw Func_f8f70 ; 55 - dw Func_f8f67 ; 56 - dw Func_f8f70 ; 57 - dw Func_f8e7d ; 58 - dw Func_f8e7d ; 59 - dw Func_f8e7d ; 5a - dw Func_f8f94 ; 5b - - dw Func_f8efb ; 5c - dw Func_f8f04 ; 5d - dw Func_f8f0d ; 5e - dw Func_f8f16 ; 5f - dw Func_f8f1f ; 60 - dw Func_f8f28 ; 61 - dw Func_f8f31 ; 62 - dw Func_f8f3a ; 63 - dw Func_f8f43 ; 64 - dw Func_f8e7d ; 65 - dw Func_f8e7d ; 66 - dw Func_f8e7d ; 67 - dw Func_f8e7d ; 68 - dw Func_f8f94 ; 69 - - dw Func_f8e86 ; 6a - dw Func_f8e8f ; 6b - dw Func_f8e98 ; 6c - dw Func_f8ea1 ; 6d - dw Func_f8eaa ; 6e - dw Func_f8eb3 ; 6f - dw Func_f8ebc ; 70 - dw Func_f8f9d ; 71 - - dw Func_f8e7d ; 72 - dw Func_f8f79 ; 73 - dw Func_f8f82 ; 74 - dw Func_f8f82 ; 75 - dw Func_f8f82 ; 76 - dw Func_f8f82 ; 77 - dw Func_f8f82 ; 78 - dw Func_f8f82 ; 79 - dw Func_f8f82 ; 7a - dw Func_f8f8b ; 7b - -SurfingMinigameWaveFunction_NoWave: - ld a, [wc5e5] - cp $16 - jr c, .check_param - jr z, .big_kahuna - jr nc, .got_wave -.big_kahuna - ld a, $6a - jr .got_next_fn - -.check_param - ld a, [wc5d5] - and a - jr z, .got_wave - dec a - and $7 - ld e, a - ld d, $0 - ld hl, Unkn_f8e75 - add hl, de - ld a, [hl] -.got_next_fn - ld [wSurfingMinigameWaveFunctionNumber], a -.got_wave - lb bc, $74, $74 - ld de, Unkn_f973d - ret - -Unkn_f8e75: - db $01,$0e,$1a,$29,$32,$40,$4d,$5c - -Func_f8e7d: - lb bc, $74, $74 - ld de, Unkn_f973d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8e86: - lb bc, $74, $6c - ld de, Unkn_f9745 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8e8f: - lb bc, $64, $5c - ld de, Unkn_f974d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8e98: - lb bc, $54, $4c - ld de, Unkn_f9755 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8ea1: - lb bc, $44, $44 - ld de, Unkn_f975d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8eaa: - lb bc, $44, $4c - ld de, Unkn_f9765 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8eb3: - lb bc, $54, $5c - ld de, Unkn_f976d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8ebc: - lb bc, $64, $6c - ld de, Unkn_f9775 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8ec5: - lb bc, $74, $6c - ld de, Unkn_f977d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8ece: - lb bc, $64, $5c - ld de, Unkn_f9785 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8ed7: - lb bc, $54, $4c - ld de, Unkn_f978d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8ee0: - lb bc, $4c, $4c - ld de, Unkn_f9795 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8ee9: - lb bc, $54, $5c - ld de, Unkn_f979d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8ef2: - lb bc, $64, $6c - ld de, Unkn_f97a5 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8efb: - lb bc, $74, $6c - ld de, Unkn_f97ad - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f04: - lb bc, $64, $5c - ld de, Unkn_f97b5 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f0d: - lb bc, $54, $54 - ld de, Unkn_f97bd - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f16: - lb bc, $54, $5c - ld de, Unkn_f97c5 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f1f: - lb bc, $64, $6c - ld de, Unkn_f97cd - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f28: - lb bc, $74, $6c - ld de, Unkn_f97d5 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f31: - lb bc, $64, $5c - ld de, Unkn_f97dd - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f3a: - lb bc, $5c, $5c - ld de, Unkn_f97e5 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f43: - lb bc, $64, $6c - ld de, Unkn_f97ed - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f4c: - lb bc, $74, $6c - ld de, Unkn_f97f5 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f55: - lb bc, $64, $64 - ld de, Unkn_f97fd - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f5e: - lb bc, $64, $6c - ld de, Unkn_f9805 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f67: - lb bc, $74, $6c - ld de, Unkn_f980d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f70: - lb bc, $6c, $6c - ld de, Unkn_f9815 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f79: - lb bc, $74, $74 - ld de, Unkn_f981d - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f82: - lb bc, $74, $74 - ld de, Unkn_f9825 - jp SurfingMinigameWaveFunction_GoToNextWaveFunction - -Func_f8f8b: - lb bc, $74, $74 - ld de, Unkn_f9825 - jp SurfingMinigameWaveFunction_ResetWaveFunction - -Func_f8f94: - lb bc, $74, $74 - ld de, Unkn_f973d - jp SurfingMinigameWaveFunction_ResetWaveFunction - -Func_f8f9d: - lb bc, $74, $74 - ld de, Unkn_f973d - ret - -Func_f8fa4: ; unused - inc a - ld [wSurfingMinigameWaveFunctionNumber], a - ret - -SurfingMinigameWaveFunction_GoToNextWaveFunction: - ld hl, wSurfingMinigameWaveFunctionNumber - inc [hl] - ret - -SurfingMinigameWaveFunction_ResetWaveFunction: - xor a - ld [wSurfingMinigameWaveFunctionNumber], a - ret - -SurfingPikachuMinigameIntro: - call SurfingPikachu_ClearTileMap - call ClearSprites - call DisableLCD - xor a - ldh [hAutoBGTransferEnabled], a - call ClearObjectAnimationBuffers - ld hl, SurfingPikachu1Graphics3 - ld de, $8800 - ld bc, $900 - ld a, BANK(SurfingPikachu1Graphics3) - call FarCopyData - ld a, SurfingPikachuSpawnStateDataPointer % $100 - ld [wAnimatedObjectSpawnStateDataPointer], a - ld a, SurfingPikachuSpawnStateDataPointer / $100 - ld [wAnimatedObjectSpawnStateDataPointer + 1], a - ld a, SurfingPikachuObjectJumptable % $100 - ld [wAnimatedObjectJumptablePointer], a - ld a, SurfingPikachuObjectJumptable / $100 - ld [wAnimatedObjectJumptablePointer + 1], a - ld a, SurfingPikachuOAMData % $100 - ld [wAnimatedObjectOAMDataPointer], a - ld a, SurfingPikachuOAMData / $100 - ld [wAnimatedObjectOAMDataPointer + 1], a - ld a, SurfingPikachuFrames % $100 - ld [wAnimatedObjectFramesDataPointer], a - ld a, SurfingPikachuFrames / $100 - ld [wAnimatedObjectFramesDataPointer + 1], a - ld a, $c - lb de, $74, $58 - call SpawnAnimatedObject - call DrawSurfingPikachuMinigameIntroBackground - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $90 - ldh [hWY], a - ld b, $f - call RunPaletteCommand - ld a, $e3 - ldh [rLCDC], a - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call DelayFrame - call DelayFrame - call DelayFrame - call SurfingPikachuMinigame_SetBGPals - ld a, $e4 - ldh [rOBP0], a - ld a, $e0 - ldh [rOBP1], a - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - call DelayFrame - ld a, MUSIC_SURFING_PIKACHU - ld c, BANK(Music_SurfingPikachu) - call PlayMusic - xor a - ld [wSurfingMinigameIntroAnimationFinished], a -.loop - ld a, [wSurfingMinigameIntroAnimationFinished] - and a - ret nz - ld a, $0 - ld [wCurrentAnimatedObjectOAMBufferOffset], a - call RunObjectAnimations - call DelayFrame - jr .loop - -DrawSurfingPikachuMinigameIntroBackground: - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $ff - call FillMemory - ld hl, Tilemap_f90bc - decoord 0, 6 - ld bc, 12 * SCREEN_WIDTH - call CopyData - ld de, Tilemap_f91c8 - hlcoord 4, 0 - lb bc, 6, 12 - call .CopyBox - hlcoord 3, 7 - lb bc, 3, 15 - call .FillBoxWithFF - ld hl, Tilemap_f91ac - decoord 3, 7 - ld bc, 15 - call CopyData - ld hl, Tilemap_f91bb - decoord 4, 9 - ld bc, 13 - call CopyData - ret - -.CopyBox: -.copy_row - push bc - push hl -.copy_col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .copy_col - ld bc, SCREEN_WIDTH - pop hl - add hl, bc - pop bc - dec b - jr nz, .copy_row - ret - -.FillBoxWithFF: -.fill_row - push bc - push hl -.fill_col - ld [hl], $ff - inc hl - dec c - jr nz, .fill_col - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .fill_row - ret - -Tilemap_f90bc: INCBIN "gfx/unknown_f90bc.map" -Tilemap_f91ac: INCBIN "gfx/unknown_f91ac.map" -Tilemap_f91bb: INCBIN "gfx/unknown_f91bb.map" -Tilemap_f91c8: INCBIN "gfx/unknown_f91c8.map" - -SurfingMinigame_UpdateLYOverrides: - ld hl, wLYOverrides + $10 - ld de, wLYOverrides + $11 - ld c, $80 - ld a, [hl] - push af -.loop - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .loop - pop af - ld [hl], a - ret - -SurfingMinigame_InitScanlineOverrides: - ld hl, wLYOverrides - ld bc, wLYOverridesEnd - wLYOverrides - ld de, $0 -.loop - ld a, e - and $1f - ld e, a - push hl - ld hl, SurfingMinigame_LYOverridesInitialSineWave - add hl, de - ld a, [hl] - pop hl - ld [hli], a - inc e - dec bc - ld a, c - or b - jr nz, .loop - ret - -SurfingPikachu_GetJoypad_3FrameBuffer: - call Joypad - ldh a, [hFrameCounter] - and a - jr nz, .delayed - ldh a, [hJoyHeld] - ldh [hJoy5], a - ld a, $2 - ldh [hFrameCounter], a - ret - -.delayed - xor a - ldh [hJoy5], a - ret - -SurfingPikachuMinigame_BlankPals: - xor a - ldh [rBGP], a - ldh [rOBP0], a - ldh [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -SurfingPikachuMinigame_NormalPals: - ld a, $e4 - ldh [rBGP], a - ldh [rOBP0], a - ld a, $e0 - ldh [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -SurfingPikachu_ClearTileMap: - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call FillMemory - ret - -Func_f9284: - xor a - ld [wc5ed], a - ld [wc5ee], a - ret - -SurfingMinigame_UpdatePikachuHeight: - ld a, [wc5ed] - and a - jr nz, .positive - ld a, [wc5ec] - ld d, a - ld a, [wc5ee] - or d - jr z, .done - ld a, [wc5ee] - ld e, a - ld hl, -$80 - add hl, de - ld a, l - ld [wc5ee], a - ld a, h - ld [wc5ec], a - - ; -(4 * a ** 2) - ld e, a - ld d, $0 - call SurfingMinigame_NTimesDE - ld e, l - ld d, h - ld a, $4 - call SurfingMinigame_NTimesDE - ld a, l - xor $ff - inc a - ld l, a - ld a, h - xor $ff - ld h, a - - push hl - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld d, [hl] - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld e, [hl] - pop hl - - add hl, de - ld e, l - ld d, h - - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld [hl], d - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld [hl], e - and a - ret - -.done - ld a, $1 - ld [wc5ed], a - and a - ret - -.positive - ld a, [wSurfingMinigamePikachuObjectHeight] - ld e, a - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld a, [hl] - cp $90 - jr nc, .okay - cp e - jr nc, .reset -.okay - ld a, [wc5ec] - ld d, a - ld a, [wc5ee] - ld e, a - ld hl, $80 - add hl, de - ld a, l - ld [wc5ee], a - ld a, h - ld [wc5ec], a - - ; 4 * a ** 2 - ld e, a - ld d, $0 - call SurfingMinigame_NTimesDE - ld e, l - ld d, h - ld a, $4 - call SurfingMinigame_NTimesDE - - push hl - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld d, [hl] - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld e, [hl] - pop hl - - add hl, de - ld e, l - ld d, h - - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld [hl], d - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld [hl], e - and a - ret - -.reset - ld hl, ANIM_OBJ_Y_COORD - add hl, bc - ld a, [wSurfingMinigamePikachuObjectHeight] - ld [hl], a - ld hl, ANIM_OBJ_FIELD_C - add hl, bc - ld [hl], $0 - scf - ret - -SurfingMinigame_NTimesDE: - ld hl, $0 -.loop - srl a - jr nc, .no_add - add hl, de -.no_add - sla e - rl d - and a - jr nz, .loop - ret - -SurfingPikachu_PlaceBCDNumber: - ld c, a - swap a - and $f - add $d0 - ld [hli], a - ld a, c - and $f - add $d0 - ld [hl], a - dec de - ret - -SurfingPikachu_Cosine: ; cosine - add $10 -SurfingPikachu_Sine: ; sine - and $3f - cp $20 - jr nc, .positive - call .GetSine - ld a, h - ret - -.positive - and $1f - call .GetSine - ld a, h - xor $ff - inc a - ret - -.GetSine: - ld e, a - ld a, d - ld d, $0 - ld hl, .SineWave - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $0 -.loop - srl a - jr nc, .no_add - add hl, de -.no_add - sla e - rl d - and a - jr nz, .loop - ret - -.SineWave: - sine_wave $100 - -SurfingPikachuSpawnStateDataPointer: - db $00, $00, $00 ; 0 - db $04, $01, $00 ; 1 - db $11, $02, $00 ; 2 - db $12, $02, $00 ; 3 - db $15, $00, $00 ; 4 - db $16, $00, $00 ; 5 - db $17, $00, $00 ; 6 - db $18, $00, $00 ; 7 - db $19, $00, $00 ; 8 - db $1a, $00, $00 ; 9 - db $14, $00, $00 ; a - db $13, $03, $00 ; b - db $1b, $04, $00 ; c - -SurfingPikachuObjectJumptable: - dw SurfingMinigameAnimatedObjectFn_nop ; 0 - dw SurfingMinigameAnimatedObjectFn_Pikachu ; 1 - dw Func_f87fb ; 2 - dw SurfingMinigameAnimatedObjectFn_FlippingPika ; 3 - dw SurfingMinigameAnimatedObjectFn_IntroAnimationPikachu ; 4 - -SurfingMinigameAnimatedObjectFn_nop: - ret - -INCLUDE "data/animated_objects_3e_1.asm" - -SurfingMinigame_LYOverridesInitialSineWave: -; a sine wave with amplitude 2 - db 0, 0, 0, 1, 1, 1, 1, 2 - db 2, 2, 1, 1, 1, 1, 0, 0 - db 0, 0, 0, -1, -1, -1, -1, -2 - db -2, -2, -1, -1, -1, -1, 0, 0 - -Unkn_f96e5: - db $00, $00, $00, $00 ; 00 - db $0b, $0b, $0b, $0b ; 01 - db $0b, $02, $02, $06 ; 02 - db $03, $0b, $07, $03 ; 03 - db $06, $06, $06, $06 ; 04 - db $07, $07, $07, $07 ; 05 - db $06, $04, $04, $08 ; 06 - db $05, $07, $08, $05 ; 07 - db $0b, $0b, $11, $12 ; 08 - db $0b, $0b, $13, $03 ; 09 - db $14, $12, $04, $08 ; 0a - db $13, $07, $08, $05 ; 0b - db $06, $14, $06, $14 ; 0c - db $13, $07, $13, $07 ; 0d - db $08, $08, $08, $08 ; 0e - db $14, $12, $14, $12 ; 0f - db $0b, $11, $02, $14 ; 10 - db $06, $14, $06, $14 ; 11 - db $0c, $0c, $0d, $0d ; 12 - db $0d, $0d, $0d, $0d ; 13 - db $0e, $0f, $10, $0b ; 14 - db $12, $13, $12, $13 ; 15 - -Unkn_f973d: - db $00, $00, $00, $01, $01, $01, $01, $01 -Unkn_f9745: - db $00, $00, $00, $01, $01, $02, $04, $06 -Unkn_f974d: - db $00, $00, $00, $01, $02, $04, $06, $0e -Unkn_f9755: - db $00, $00, $00, $10, $11, $06, $0e, $0e -Unkn_f975d: - db $00, $00, $00, $15, $15, $0e, $0e, $0e -Unkn_f9765: - db $00, $00, $00, $03, $05, $07, $0e, $0e -Unkn_f976d: - db $00, $00, $00, $01, $03, $05, $07, $0e -Unkn_f9775: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f977d: - db $00, $00, $00, $01, $01, $02, $04, $06 -Unkn_f9785: - db $00, $00, $00, $01, $02, $04, $06, $0e -Unkn_f978d: - db $00, $00, $00, $08, $0f, $0a, $0e, $0e -Unkn_f9795: - db $00, $00, $00, $09, $0d, $0b, $0e, $0e -Unkn_f979d: - db $00, $00, $00, $01, $03, $05, $07, $0e -Unkn_f97a5: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f97ad: - db $00, $00, $00, $01, $01, $02, $04, $06 -Unkn_f97b5: - db $00, $00, $00, $01, $10, $11, $06, $0e -Unkn_f97bd: - db $00, $00, $00, $01, $15, $15, $0e, $0e -Unkn_f97c5: - db $00, $00, $00, $01, $03, $05, $07, $0e -Unkn_f97cd: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f97d5: - db $00, $00, $00, $01, $01, $02, $04, $06 -Unkn_f97dd: - db $00, $00, $00, $01, $08, $0f, $0a, $0e -Unkn_f97e5: - db $00, $00, $00, $01, $09, $0d, $0b, $0e -Unkn_f97ed: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f97f5: - db $00, $00, $00, $01, $01, $10, $11, $06 -Unkn_f97fd: - db $00, $00, $00, $01, $01, $15, $15, $0e -Unkn_f9805: - db $00, $00, $00, $01, $01, $03, $05, $07 -Unkn_f980d: - db $00, $00, $00, $01, $01, $08, $0f, $0a -Unkn_f9815: - db $00, $00, $00, $01, $01, $09, $0d, $0b -Unkn_f981d: - db $00, $00, $00, $14, $14, $14, $14, $14 -Unkn_f9825: - db $00, $00, $00, $12, $13, $13, $13, $13 diff --git a/engine/unknown_ea3ea.asm b/engine/unknown_ea3ea.asm deleted file mode 100755 index c10f1555..00000000 --- a/engine/unknown_ea3ea.asm +++ /dev/null @@ -1,973 +0,0 @@ -Printer_GetMonStats: - call GBPalWhiteOutWithDelay3 - call ClearScreen - call LoadHpBarAndStatusTilePatterns - ld de, GFX_ea563 - ld hl, vChars2 + $710 - lb bc, BANK(GFX_ea563), (GFX_ea563End - GFX_ea563) / 8 - call CopyVideoDataDouble - - ld de, GFX_ea56b - ld hl, vChars2 + $6e0 - lb bc, BANK(GFX_ea56b), (GFX_ea56bEnd - GFX_ea56b) / 8 - call CopyVideoDataDouble - - xor a - ldh [hAutoBGTransferEnabled], a - xor a - ld [wWhichTradeMonSelectionMenu], a - call LoadMonData - - ld hl, wTileMap - lb bc, 16, 18 - call TextBoxBorder - - hlcoord 0, 12 - lb bc, 4, 18 - call TextBoxBorder - - hlcoord 3, 10 - call PrintLevelFull - - hlcoord 2, 10 - ld a, $6e - ld [hli], a - ld [hl], " " - - hlcoord 2, 11 - ld [hl], "’" - - hlcoord 4, 11 - ld de, wLoadedMonMaxHP - lb bc, 2, 3 - call PrintNumber - - ld a, [wMonHeader] - ld [wPokeBallAnimData], a - ld [wd0b5], a - ld hl, wPartyMonNicks - call .GetNamePointer - hlcoord 8, 2 - call PlaceString - - call GetMonName - hlcoord 9, 3 - call PlaceString - - predef IndexToPokedex - hlcoord 2, 8 - ld [hl], "№" - inc hl - ld [hl], $f2 - inc hl - ld de, wPokeBallAnimData - lb bc, $80 | 1, 3 - call PrintNumber - - hlcoord 8, 4 - ld de, .OT - call PlaceString - - ld hl, wPartyMonOT - call .GetNamePointer - hlcoord 9, 5 - call PlaceString - - hlcoord 9, 6 - ld de, .IDNo - call PlaceString - - hlcoord 13, 6 - ld de, wLoadedMonOTID - lb bc, $80 | 2, 5 - call PrintNumber - - hlcoord 9, 8 - ld de, .Stats - ldh a, [hFlagsFFFA] - set 2, a - ldh [hFlagsFFFA], a - call PlaceString - ldh a, [hFlagsFFFA] - res 2, a - ldh [hFlagsFFFA], a - - hlcoord 16, 8 - ld de, wLoadedMonAttack - ld a, 4 -.loop - push af - push de - - push hl - lb bc, 2, 3 - call PrintNumber - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - - pop de - inc de - inc de - pop af - dec a - jr nz, .loop - - hlcoord 1, 13 - ld a, [wLoadedMonMoves] - call .PlaceMoveName - - hlcoord 1, 14 - ld a, [wLoadedMonMoves + 1] - call .PlaceMoveName - - hlcoord 1, 15 - ld a, [wLoadedMonMoves + 2] - call .PlaceMoveName - - hlcoord 1, 16 - ld a, [wLoadedMonMoves + 3] - call .PlaceMoveName - - ld b, $4 ; SET_PAL_STATUS_SCREEN - call RunPaletteCommand - - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call Delay3 - call GBPalNormal - hlcoord 1, 1 - call LoadFlippedFrontSpriteByMonIndex - ret - -.GetNamePointer: - ld bc, NAME_LENGTH - ld a, [wWhichPokemon] - call AddNTimes - ld e, l - ld d, h - ret - -.PlaceMoveName: - and a - jr z, .no_move - ld [wPokeBallAnimData], a - call GetMoveName - jr .place_string - -.no_move - ld de, .Blank -.place_string - call PlaceString - ret - -.OT: - db "OT/@" - -.IDNo: - db $73, "№/@" - -.Stats: - db "ATTACK" - next "DEFENSE" - next "SPEED" - next "SPECIAL@" - -.Blank: - db "--------------@" - -GFX_ea563: -INCBIN "gfx/stats_screen_hp.1bpp" -GFX_ea563End: - -GFX_ea56b: -INCBIN "gfx/stats_screen_lv.1bpp" -GFX_ea56bEnd: - -PrinterDebug_LoadGFX: - ld hl, vChars1 + $7e0 - ld de, GFX_ea597 - lb bc, BANK(GFX_ea597), (GFX_ea597End - GFX_ea597) / 16 - call CopyVideoData - - ld hl, wOAMBuffer + 32 * 4 - ld a, $8 - ld c, $8 -.loop - ld [hl], $10 - inc hl - ld [hl], a - inc hl - ld [hl], $fe - inc hl - ld [hl], $0 - inc hl - add $8 - dec c - jr nz, .loop - ret - -GFX_ea597: -INCBIN "gfx/zero_one_ea597.2bpp" -GFX_ea597End: - -PrinterDebug_ConvertStatusFlagsToTiles: - ld hl, wOAMBuffer + 32 * 4 + 2 - ld de, 4 - ld a, [wPrinterStatusFlags] - ld c, 8 -.loop - sla a - jr c, .place_1 - ld [hl], $fe - jr .okay - -.place_1 - ld [hl], $ff -.okay - add hl, de - dec c - jr nz, .loop - ret - -PrinterDebug_DoFunction: - ld a, [wPrinterSendState] - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.Jumptable: - dw Func_ea623 - dw Func_ea6d2 - dw Func_ea6af - dw Func_ea645 - dw Func_ea701 - dw Func_ea6bd - dw Func_ea671 - dw Func_ea701 - dw Func_ea6af - dw Func_ea68a - dw Func_ea701 - dw Func_ea6af - dw Func_ea721 - dw Func_ea610 - dw Func_ea61a - dw Func_ea6af - dw Func_ea61e - dw Func_ea72f - dw Func_ea732 - -Func_ea606: - ld hl, wPrinterSendState - inc [hl] - ret - -Func_ea60b: - ld hl, wPrinterSendState - dec [hl] - ret - -Func_ea610: - xor a - ld [wPrinterStatusFlags], a - ld hl, wPrinterSendState - set 7, [hl] - ret - -Func_ea61a: - call Func_ea606 - ret - -Func_ea61e: - xor a - ld [wPrinterSendState], a - ret - -Func_ea623: - call Func_ea784 - ld hl, Data_ea9de - call Func_ea76b - xor a - ld [wPrinterDataSize], a - ld [wPrinterDataSize + 1], a - ld a, [wPrinterQueueLength] - ld [wPrinterRowIndex], a - call Func_ea606 - call Func_ea74c - ld a, $1 - ld [wPrinterStatusIndicator], a - ret - -Func_ea645: - call Func_ea784 - ld hl, wPrinterRowIndex - ld a, [hl] - and a - jr z, Func_ea671 - ld hl, Data_ea9ea - call Func_ea76b - call PrinterDebug_PrepOAMForPrinting - ld a, $80 - ld [wPrinterDataSize], a - ld a, $2 - ld [wPrinterDataSize + 1], a - call Func_ea7a2 - call Func_ea606 - call Func_ea74c - ld a, $2 - ld [wPrinterStatusIndicator], a - ret - -Func_ea671: - ld a, $6 - ld [wPrinterSendState], a - ld hl, Data_ea9f0 - call Func_ea76b - xor a - ld [wPrinterDataSize], a - ld [wPrinterDataSize + 1], a - call Func_ea606 - call Func_ea74c - ret - -Func_ea68a: - call Func_ea784 - ld hl, Data_ea9e4 - call Func_ea76b - call Func_ea7d2 - ld a, $4 - ld [wPrinterDataSize], a - ld a, $0 - ld [wPrinterDataSize + 1], a - call Func_ea7a2 - call Func_ea606 - call Func_ea74c - ld a, $3 - ld [wPrinterStatusIndicator], a - ret - -Func_ea6af: - ld hl, wPrinterSerialFrameDelay - inc [hl] - ld a, [hl] - cp a, $6 - ret c - xor a - ld [hl], a - call Func_ea606 - ret - -Func_ea6bd: - ld hl, wPrinterSerialFrameDelay - inc [hl] - ld a, [hl] - cp 6 - ret c - xor a - ld [hl], a - ld hl, wPrinterRowIndex - dec [hl] - call Func_ea60b - call Func_ea60b - ret - -Func_ea6d2: - call Func_ea742 - ret c - ld a, [wPrinterHandshake] - cp a, $ff - jr nz, .asm_ea6e4 - ld a, [wPrinterStatusFlags] - cp a, $ff - jr z, .asm_ea6fb -.asm_ea6e4 - ld a, [wPrinterHandshake] - cp a, $81 - jr nz, .asm_ea6fb - ld a, [wPrinterStatusFlags] - cp a, $0 - jr nz, .asm_ea6fb - ld hl, wPrinterConnectionOpen - set 1, [hl] - call Func_ea606 - ret - -.asm_ea6fb - ld a, $e - ld [wPrinterSendState], a - ret - -Func_ea701: - call Func_ea742 - ret c - ld a, [wPrinterStatusFlags] - and $f0 - jr nz, .asm_ea71b - ld a, [wPrinterStatusFlags] - and $1 - jr nz, .asm_ea717 - call Func_ea606 - ret - -.asm_ea717 - call Func_ea60b - ret - -.asm_ea71b - ld a, $11 - ld [wPrinterSendState], a - ret - -Func_ea721: - call Func_ea742 - ret c - ld a, [wPrinterStatusFlags] - and $f3 - ret nz - call Func_ea606 - ret - -Func_ea72f: - call Func_ea606 -Func_ea732: - ld a, [wPrinterOpcode] - and a - ret nz - ld a, [wPrinterStatusFlags] - and $f0 - ret nz - xor a - ld [wPrinterSendState], a - ret - -Func_ea742: - ld a, [wPrinterOpcode] - and a - jr nz, .asm_ea74a - and a - ret - -.asm_ea74a - scf - ret - -Func_ea74c: -.asm_ea74c - ld a, [wPrinterOpcode] - and a - jr nz, .asm_ea74c - ld a, $1 - ld [wPrinterOpcode], a - xor a - ld [wPrinterSendByteOffset], a - ld [wPrinterSendByteOffset + 1], a - ld a, $88 - ldh [rSB], a - ld a, $1 - ldh [rSC], a - ld a, $81 - ldh [rSC], a - ret - -Func_ea76b: - ld a, [hli] - ld [wPrinterDataHeader], a - ld a, [hli] - ld [wPrinterDataHeader + 1], a - ld a, [hli] - ld [wPrinterDataHeader + 2], a - ld a, [hli] - ld [wPrinterDataHeader + 3], a - ld a, [hli] - ld [wPrinterDataHeader + 4], a - ld a, [hl] - ld [wPrinterDataHeader + 5], a - ret - -Func_ea784: - xor a - ld hl, wPrinterDataHeader - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld hl, wPrinterDataHeader + 4 - ld [hli], a - ld [hl], a - xor a - ld [wPrinterDataSize], a - ld [wPrinterDataSize + 1], a - ld hl, wPrinterSendDataSource1 - ld bc, $280 - call FillMemory - ret - -Func_ea7a2: - ld hl, $0 - ld bc, $4 - ld de, wPrinterDataHeader - call Func_ea7c5 - ld a, [wPrinterDataSize] - ld c, a - ld a, [wPrinterDataSize + 1] - ld b, a - ld de, wPrinterSendDataSource1 - call Func_ea7c5 - ld a, l - ld [wPrinterDataHeader + 4], a - ld a, h - ld [wPrinterDataHeader + 5], a - ret - -Func_ea7c5: -.asm_ea7c5 - ld a, [de] - inc de - add l - jr nc, .asm_ea7cb - inc h -.asm_ea7cb - ld l, a - dec bc - ld a, c - or b - jr nz, .asm_ea7c5 - ret - -Func_ea7d2: - ld a, $1 - ld [wPrinterSendDataSource1], a - ld a, [wcae2] - ld [wPrinterStatusReceived], a - ld a, $e4 - ld [wc6f2], a - ld a, [wPrinterSettingsTempCopy] - ld [wc6f3], a - ret - -PrinterDebug_PrepOAMForPrinting: - ld a, [wPrinterRowIndex] - ld b, a - ld a, [wPrinterQueueLength] - sub b - ld hl, wPrinterTileBuffer - ld de, $28 -.get_start_addr - and a - jr z, .start_working - add hl, de - dec a - jr .get_start_addr - -.start_working - ld e, l - ld d, h - ld hl, wPrinterSendDataSource1 - ld c, $28 -.prep_loop - ld a, [de] - inc de - push bc - push de - push hl - swap a - ld d, a - and $f0 - ld e, a - ld a, d - and $f - ld d, a - and $8 - ld a, d - jr nz, .vtiles1 - or $90 - jr .got_vram_address - -.vtiles1 - or $80 -.got_vram_address - ld d, a - lb bc, BANK(PrinterDebug_PrepOAMForPrinting), $1 - call CopyVideoData - pop hl - ld de, $10 - add hl, de - pop de - pop bc - dec c - jr nz, .prep_loop - call .UnnecessaryCall - ret - -.UnnecessaryCall: - ld hl, wcbdc - ld bc, $20 - xor a - call FillMemory - ld hl, wOAMBuffer - ld c, $28 -.master_loop - push bc - push hl - call .AreWePrintingThisSegment - jr nc, .skip_segment - call .GetVRAMAddress - call .GetOAMFlags - call .ApplyObjectPalettes - call .PlaceObject -.skip_segment - pop hl - inc hl - inc hl - inc hl - inc hl - pop bc - dec c - jr nz, .master_loop - ret - -.AreWePrintingThisSegment: - ld a, [wPrinterRowIndex] - ld b, a - ld a, [wPrinterQueueLength] - sub b - ld c, a - ld b, $10 -.add_n_times - ld a, c - and a - jr z, .check - ld a, b - add $10 - ld b, a - dec c - jr .add_n_times - -.check - ld a, b - ld e, a - add $10 - ld d, a - ld a, [hl] - cp e - jr c, .not_printing - cp d - jr nc, .not_printing - scf - ret - -.not_printing - and a - ret - -.GetVRAMAddress: - push hl - inc hl - inc hl - ld a, [hl] - swap a - ld d, a - and $f0 - ld e, a - ld a, d - and $f - or $80 - ld d, a - ld hl, wcbdc - lb bc, BANK(.GetVRAMAddress), $1 - call CopyVideoData - pop hl - ret - -.GetOAMFlags: - push hl - inc hl - inc hl - inc hl - ld a, [hl] - call .DoBitOperation - pop hl - ret - -.DoBitOperation: - and $60 - swap a - ld e, a - ld d, 0 - ld hl, .Jumptable - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.Jumptable: - dw .nop - dw .xflip - dw .yflip - dw .both - -.nop: - ret - -.xflip: - call .XFlip - ret - -.yflip: - call .YFlip - ret - -.both: - call .XFlip - call .YFlip - ret - -.XFlip: - ld hl, wcbdc - ld c, 16 -.byte_loop - ld d, [hl] - ld a, 0 - ld b, 8 -.bit_loop - sla d - rr a - dec b - jr nz, .bit_loop - ld [hli], a - dec c - jr nz, .byte_loop - ret - -.YFlip: - ld hl, wcbdc - ld de, wcbea - ld c, $4 -.swap_loop - ld b, [hl] - ld a, [de] - ld [hli], a - ld a, b - ld [de], a - inc de - ld b, [hl] - ld a, [de] - ld [hli], a - ld a, b - ld [de], a - dec de - dec de - dec de - dec c - jr nz, .swap_loop - ret - -.ApplyObjectPalettes: - push hl - ld hl, wcbdc - ld de, wcbec - ld a, 8 -.loop1 - push af - ld bc, $0 - ld a, 8 -.loop2 - push af - xor a - rlc [hl] - rl a - inc hl - rlc [hl] - rl a - dec hl - push hl - push de - call .ExpandPalettesToBC - pop de - pop hl - pop af - dec a - jr nz, .loop2 - inc hl - inc hl - ld a, b - ld [de], a - inc de - ld a, c - ld [de], a - inc de - pop af - dec a - jr nz, .loop1 - pop hl - ret - -.ExpandPalettesToBC: - call .GetPaletteFunction - call .ApplyPaletteFunction - ret - -.GetPaletteFunction: - ld e, a - ld d, 0 - ld hl, .PalJumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.PalJumptable: - dw .Pal0 - dw .Pal1 - dw .Pal2 - dw .Pal3 - -.Pal0: - ldh a, [rOBP0] - and $3 - ret - -.Pal2: - ldh a, [rOBP0] - and $c - srl a - srl a - ret - -.Pal1: - ldh a, [rOBP0] - and $30 - swap a - ret - -.Pal3: - ldh a, [rOBP0] - and $c0 - rlca - rlca - ret - -.ApplyPaletteFunction: - ld e, a - ld d, 0 - ld hl, .PalFunJumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.PalFunJumptable: - dw .zero_zero - dw .xflip_zero - dw .zero_xflip - dw .xflip_xflip - -.zero_zero: - sla b - sla c - ret - -.xflip_zero: - scf - rl b - sla c - ret - -.zero_xflip: - sla b - scf - rl c - ret - -.xflip_xflip: - scf - rl b - scf - rl c - ret - -.PlaceObject: - push hl - ld a, [hli] - ld c, [hl] - and $8 - jr nz, .use_source_2 - ld hl, wPrinterSendDataSource1 - jr .got_data_source - -.use_source_2 - ld hl, wPrinterSendDataSource2 -.got_data_source - ld b, $0 - ld a, c - and %11111000 - sub $8 - ld c, a - sla c - rl b - add hl, bc - ld e, l - ld d, h - ld hl, wcbec - ld c, $8 -.coord_copy_loop - call .GetBitMask - ld a, [de] - and b - or [hl] - ld [de], a - inc hl - inc de - ld a, [de] - and b - or [hl] - ld [de], a - inc hl - inc de - dec c - jr nz, .coord_copy_loop - pop hl - ret - -.GetBitMask: - push hl - push de - ld de, -$10 - add hl, de - ld a, [hli] - or [hl] - xor $ff - ld b, a - pop de - pop hl - ret - -Data_ea9de: - db 1, 0, $00, 0 - dw 1 -Data_ea9e4: - db 2, 0, $04, 0 - dw 0 -Data_ea9ea: - db 4, 0, $80, 2 - dw 0 -Data_ea9f0: - db 4, 0, $00, 0 - dw 4 -Data_ea9f6: - db 8, 0, $00, 0 - dw 8 -Data_ea9fc: - db 15, 0, $00, 0 - dw 15 diff --git a/engine/vermilion_gym_trash_cans.asm b/engine/vermilion_gym_trash_cans.asm deleted file mode 100755 index 1bc0590b..00000000 --- a/engine/vermilion_gym_trash_cans.asm +++ /dev/null @@ -1,108 +0,0 @@ -TrashCanRandom: - ld d, 0 - ld hl, .Jumptable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - call JumpToAddress - ld e, a - ld d, 0 - ret - -.Jumptable: - dw .zero - dw .one - dw .two - dw .three - dw .four - -.zero -.one - ld a, 0 - ret - -.two - call Random - and $1 - ret - -.three ; should return to a, instead returns to b - call Random - swap a - cp 1 * $ff / 3 - ld b, 0 - ret c - cp 2 * $ff / 3 - ld b, 1 - ret c - ld b, 2 - ret - -.four - call Random - and $3 - ret - -Yellow_SampleSecondTrashCan: - ld hl, GymTrashCans3c - ld a, [wGymTrashCanIndex] - ld c, a - ld b, 0 - ld a, 9 - call AddNTimes - call AddNTimes ; ???? - ld a, [hli] - ldh [hGymTrashCanRandNumMask], a - ld e, a - push hl - call TrashCanRandom - pop hl - add hl, de - add hl, de - ld a, [hli] - ld [wSecondLockTrashCanIndex], a - ld a, [hl] - ld [wSecondLockTrashCanIndex + 1], a - ret - -GymTrashCans3c: -; First byte: number of trashcan entries -; Following four byte pairs: indices for the second trash can. -; BUG: Rows that have 3 trashcan entries are sampled incorrectly. -; The sampling occurs by taking a random number and seeing which -; third of the range 0-255 the number falls in. However, it returns -; that value to the wrong register, so the result is never used. -; Instead of using an offset in [0,1,2], the offset is instead -; in the full range 0-255. This results in truly random behavior. - db 4 - db 1,3, 3,1, 1,-1, 3,-1 - db 3 - db 0,2, 2,4, 4,0, -1,-1 - db 4 - db 1,5, 5,1, 1,-1, 5,-1 - db 3 - db 0,4, 4,6, 6,0, -1,-1 - db 4 - db 1,3, 3,1, 5,5, 7,7 - db 3 - db 2,4, 4,8, 8,2, -1,-1 - db 3 - db 3,7, 7,9, 9,3, -1,-1 - db 4 - db 4,8, 6,10, 8,4, 10,6 - db 3 - db 5,7, 7,11, 11,5, -1,-1 - db 3 - db 6,10, 10,12, 12,6, -1,-1 - db 4 - db 7,9, 9,7, 11,13, 13,11 - db 3 - db 8,10, 10,14, 14,8, -1,-1 - db 4 - db 9,13, 13,9, 9,-1, 13,-1 - db 3 - db 10,12, 12,14, 14,10, -1,-1 - db 4 - db 11,13, 13,11, 11,-1, 13,-1 diff --git a/engine/yellow_intro.asm b/engine/yellow_intro.asm deleted file mode 100755 index 324ba86d..00000000 --- a/engine/yellow_intro.asm +++ /dev/null @@ -1,1081 +0,0 @@ -PlayIntroScene: - ldh a, [rIE] - push af - xor a - ldh [rIF], a - ld a, $f - ldh [rIE], a - ld a, $8 - ldh [rSTAT], a - call InitYellowIntroGFXAndMusic - call DelayFrame -.loop - ld a, [wYellowIntroCurrentScene] - bit 7, a - jr nz, .go_to_title_screen - call JoypadLowSensitivity - ldh a, [hJoyPressed] - and A_BUTTON | B_BUTTON | START - jr nz, .go_to_title_screen - call Func_f98fc - ld a, $0 - ld [wCurrentAnimatedObjectOAMBufferOffset], a - call RunObjectAnimations - ld a, [wYellowIntroCurrentScene] - cp $7 - call z, Func_f98a2 - cp $b - call z, Func_f98cb - call DelayFrame - jr .loop - -.go_to_title_screen - call YellowIntro_BlankPalettes - xor a - ldh [hLCDCPointer], a - call DelayFrame - xor a - ldh [rIF], a - pop af - ldh [rIE], a - ld a, $90 - ldh [hWY], a - call ClearObjectAnimationBuffers - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - xor a - call Bank3E_FillMemory - call YellowIntro_BlankOAMBuffer - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ldh [hAutoBGTransferEnabled], a - ret - -Func_f98a2: - ld a, [wOAMBuffer + 8 * 4 + 3] - or $1 - ld [wOAMBuffer + 8 * 4 + 3], a - ld a, [wOAMBuffer + 14 * 4 + 3] - or $1 - ld [wOAMBuffer + 14 * 4 + 3], a - ld a, [wOAMBuffer + 16 * 4 + 3] - or $1 - ld [wOAMBuffer + 16 * 4 + 3], a - ld a, [wOAMBuffer + 18 * 4 + 3] - or $1 - ld [wOAMBuffer + 18 * 4 + 3], a - ld a, [wOAMBuffer + 19 * 4 + 3] - or $1 - ld [wOAMBuffer + 19 * 4 + 3], a - ret - -Func_f98cb: - ld a, [wOAMBuffer + 18 * 4 + 3] - or $1 - ld [wOAMBuffer + 18 * 4 + 3], a - ld a, [wOAMBuffer + 19 * 4 + 3] - or $1 - ld [wOAMBuffer + 19 * 4 + 3], a - ld a, [wOAMBuffer + 20 * 4 + 3] - or $1 - ld [wOAMBuffer + 20 * 4 + 3], a - ld a, [wOAMBuffer + 25 * 4 + 3] - or $1 - ld [wOAMBuffer + 25 * 4 + 3], a - ld a, [wOAMBuffer + 26 * 4 + 3] - or $1 - ld [wOAMBuffer + 26 * 4 + 3], a - ld a, [wOAMBuffer + 28 * 4 + 3] - or $1 - ld [wOAMBuffer + 28 * 4 + 3], a - ret - -Func_f98fc: - ld a, [wYellowIntroCurrentScene] - ld hl, Jumptable_f9906 - call Func_fa06e - jp hl - -Jumptable_f9906: - dw YellowIntroScene0 ; running pika 1 - dw YellowIntroScene1 ; wait last - dw YellowIntroScene2 ; pikachu kick - dw YellowIntroScene3 ; wait last - dw YellowIntroScene4 ; running pika 2 - dw YellowIntroScene5 ; wait last - dw YellowIntroScene6 ; surfing pika - dw YellowIntroScene7 ; wait last - dw YellowIntroScene8 ; running pika 3 - dw YellowIntroScene9 ; wait last - dw YellowIntroScene10 ; flying pika - dw YellowIntroScene11 ; wait last - dw YellowIntroScene12 ; pika close up - dw YellowIntroScene13 ; wait last - dw YellowIntroScene14 ; pika thunderbolt - dw YellowIntroScene15 ; wait last - dw YellowIntroScene16 ; fade to white - dw YellowIntroScene17 ; wait and quit - -YellowIntro_NextScene: - ld hl, wYellowIntroCurrentScene - inc [hl] - ret - -YellowIntroScene0: - xor a - ldh [hLCDCPointer], a - lb de, $58, $58 - ld a, $1 - call YellowIntro_SpawnAnimatedObjectAndSavePointer - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $90 - ldh [hWY], a - ld a, $e4 - ldh [rBGP], a - ldh [rOBP0], a - ld a, $c4 - ldh [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ld a, 130 - ld [wYellowIntroSceneTimer], a - call YellowIntro_NextScene - ret - -YellowIntroScene1: - call YellowIntro_CheckFrameTimerDecrement - ret nc - call YellowIntro_MaskCurrentAnimatedObjectStruct - call YellowIntro_NextScene - ret - -YellowIntroScene2: - call YellowIntro_BlankPalsDelay2AndDisableLCD - ld c, $8 - call UpdateMusicCTimes - xor a - ldh [hLCDCPointer], a - ld hl, vBGMap0 - ld bc, $400 - xor a - call Bank3E_FillMemory - call YellowIntroScene2_PlaceGraphic - lb de, $58, $b8 ; overloaded - ld a, $4 ; overloaded - call LoadYellowIntroFlyingSpeedBars - ld a, $1 - call Func_f9e9a - call YellowIntro_SetTimerFor128Frames - call YellowIntro_NextScene - ret - -YellowIntroScene2_PlaceGraphic: - ld hl, $98d4 ; (20, 6) - ld de, $20 - ld b, $6 - ld a, $90 -.row - ld c, $6 - push af - push hl -.col - ld [hli], a - inc a - dec c - jr nz, .col - pop hl - add hl, de - pop af - add $10 - dec b - jr nz, .row - ldh a, [hGBC] - and a - jr z, .dmg_sgb - ; We can actually set palettes! - ld hl, $98d4 ; (20, 6) - ld de, $20 - ld b, $6 - ld a, $1 - ldh [rVBK], a -.attr_row - ld c, $6 - push hl -.attr_col - ld [hli], a - dec c - jr nz, .attr_col - pop hl - add hl, de - dec b - jr nz, .attr_row - xor a - ldh [rVBK], a -.dmg_sgb - ret - -LoadYellowIntroFlyingSpeedBars: - ld hl, YellowIntroFlyingSpeedBarData - ld a, $8 -.loop -; Spawn object $8 at indicated coordinates with indicated speeds - push af - ld e, [hl] - inc hl - ld d, [hl] - inc hl - ld a, [hli] - push hl - push af - ld a, $8 - call SpawnAnimatedObject - pop af - ld hl, $b - add hl, bc - ld [hl], a - pop hl - pop af - dec a - jr nz, .loop - ret - -YellowIntroFlyingSpeedBarData: - ; y, x, speed - db $d0, $20, $02 - db $f0, $30, $04 - db $d0, $40, $06 - db $c0, $50, $08 - db $e0, $60, $08 - db $c0, $70, $06 - db $e0, $80, $04 - db $f0, $90, $02 - -YellowIntroScene3: - call YellowIntro_CheckFrameTimerDecrement - jr c, .expired - ldh a, [hSCX] - cp $68 - ret z - add $4 - ldh [hSCX], a - ret - -.expired - call MaskAllAnimatedObjectStructs - call YellowIntro_NextScene - ret - -YellowIntroScene4: - call YellowIntro_BlankPalsDelay2AndDisableLCD - ld c, $5 - call UpdateMusicCTimes - ldh a, [hGBC] - and a - jr z, .dmg_sgb - ; We can actually set palettes! - ld hl, $98d4 - ld de, $20 - ld b, $6 - ld a, $1 - ldh [rVBK], a - xor a -.attr_row - ld c, $6 - push hl -.attr_col - ld [hli], a - dec c - jr nz, .attr_col - pop hl - add hl, de - dec b - jr nz, .attr_row - xor a - ldh [rVBK], a -.dmg_sgb - xor a - ldh [hLCDCPointer], a - call Func_f9e5f - lb de, $58, $58 - ld a, $2 - call YellowIntro_SpawnAnimatedObjectAndSavePointer - xor a - call Func_f9e9a - call YellowIntro_SetTimerFor128Frames - call YellowIntro_NextScene - ret - -YellowIntroScene5: - call YellowIntro_CheckFrameTimerDecrement - ret nc - call YellowIntro_MaskCurrentAnimatedObjectStruct - call YellowIntro_NextScene - ret - -YellowIntroScene6: - call YellowIntro_BlankPalsDelay2AndDisableLCD - ld c, $5 - call UpdateMusicCTimes - ld a, rSCY - $ff00 - ldh [hLCDCPointer], a - call YellowIntro_Copy8BitSineWave - ld hl, vBGMap0 - ld bc, $60 - xor a - call Bank3E_FillMemory - ld hl, $9860 - ld c, $10 - ld a, $20 -.asm_f9a8b - ld [hli], a - inc a - ld [hli], a - dec a - dec c - jr nz, .asm_f9a8b - ld hl, $9880 - ld bc, $300 - ld a, $10 - call Bank3E_FillMemory - lb de, $40, $f8 - ld a, $5 - call YellowIntro_SpawnAnimatedObjectAndSavePointer - ld a, $1 - call Func_f9e9a - call YellowIntro_SetTimerFor88Frames - call YellowIntro_NextScene - ret - -YellowIntroScene7: - call YellowIntro_CheckFrameTimerDecrement - jr c, .expired - ld hl, hSCX - inc [hl] - inc [hl] - ld hl, wLYOverridesBuffer - ld de, wLYOverridesBuffer + 1 - ld a, [hl] - push af - ld c, $ff -.shift_loop - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .shift_loop - pop af - ld [hl], a - call Request7TileTransferFromC810ToC710 - ret - -.expired - call YellowIntro_MaskCurrentAnimatedObjectStruct - call YellowIntro_NextScene - ret - -YellowIntroScene8: - call YellowIntro_BlankPalsDelay2AndDisableLCD - ld c, $5 - call UpdateMusicCTimes - xor a - ldh [hLCDCPointer], a - call Func_f9e5f - lb de, $58, $58 - ld a, $3 - call YellowIntro_SpawnAnimatedObjectAndSavePointer - xor a - call Func_f9e9a - call YellowIntro_SetTimerFor128Frames - call YellowIntro_NextScene - ret - -YellowIntroScene9: - call YellowIntro_CheckFrameTimerDecrement - ret nc - call YellowIntro_MaskCurrentAnimatedObjectStruct - call YellowIntro_NextScene - ret - -YellowIntroScene10: - call YellowIntro_BlankPalsDelay2AndDisableLCD - ld c, $5 - call UpdateMusicCTimes - xor a - ldh [hLCDCPointer], a - ld hl, vBGMap0 - ld bc, $400 - xor a - call Bank3E_FillMemory - ld hl, vBGMap0 - ld bc, $100 - ld a, $2 - call Bank3E_FillMemory - ld hl, $9900 - ld de, Unkn_f9b6e - lb bc, 6, 20 - call .FillBGMapBox - ld hl, $988c - ld de, Unkn_f9be6 - lb bc, 3, 4 - call .FillBGMapBox - ld hl, $98e3 - ld de, Unkn_f9bf2 - lb bc, 2, 2 - call .FillBGMapBox - lb de, $98, $58 - ld a, $6 - call YellowIntro_SpawnAnimatedObjectAndSavePointer - ld a, $1 - call Func_f9e9a - call YellowIntro_SetTimerFor128Frames - call YellowIntro_NextScene - ret - -.FillBGMapBox: -.fill_row - push bc - push hl -.fill_col - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .fill_col - pop hl - ld bc, $20 - add hl, bc - pop bc - dec b - jr nz, .fill_row - ret - -Unkn_f9b6e: INCBIN "gfx/unknown_f9b6e.map" -Unkn_f9be6: INCBIN "gfx/unknown_f9be6.map" -Unkn_f9bf2: INCBIN "gfx/unknown_f9bf2.map" - -YellowIntroScene11: - call YellowIntro_CheckFrameTimerDecrement - jr c, .expired - ld a, [wYellowIntroSceneTimer] - and $7 - ret nz - ld a, [wYellowIntroSceneTimer] - and $8 - sla a - sla a - sla a - ld e, a - ld d, $0 - ld hl, YellowIntroCloudGFX1 - add hl, de - ld a, l - ldh [hVBlankCopySource], a - ld a, h - ldh [hVBlankCopySource + 1], a - xor a - ldh [hVBlankCopyDest], a - ld a, $96 - ldh [hVBlankCopyDest + 1], a - ld a, $4 - ldh [hVBlankCopySize], a - ret - -.expired - call YellowIntro_MaskCurrentAnimatedObjectStruct - call YellowIntro_NextScene - ret - -YellowIntroCloudGFX1: INCBIN "gfx/unknown_f9c2c.2bpp" -YellowIntroCloudGFX2: INCBIN "gfx/unknown_f9c6c.2bpp" ; indirectly referenced - -YellowIntroScene12: - call YellowIntro_BlankPalsDelay2AndDisableLCD - ld c, $5 - call UpdateMusicCTimes - xor a - ldh [hLCDCPointer], a - ld hl, vBGMap0 - ld bc, $80 - ld a, $1 - call Bank3E_FillMemory - ld hl, $9880 - ld bc, $140 - xor a - call Bank3E_FillMemory - ld hl, $99c0 - ld bc, $80 - ld a, $1 - call Bank3E_FillMemory - - ; paste 8x12 graphic into vBGMap0 at (5, 6) starting at tile 4, skipping 4 vtiles at the end of each row - ld hl, $98c5 - ld de, $20 - ld a, $4 - ld b, 8 -.row - ld c, 12 - push hl -.col - ld [hli], a - inc a - dec c - jr nz, .col - pop hl - add hl, de - add $4 - dec b - jr nz, .row - - ld hl, $98c4 ; (4, 6) - ld [hl], $3 - ld hl, $98e4 ; (4, 7) - ld [hl], $74 - ld hl, $99a5 ; (5, 5) - ld [hl], $0 - lb de, $60, $58 - ld a, $9 - call YellowIntro_SpawnAnimatedObjectAndSavePointer - xor a - call Func_f9e9a - call YellowIntro_SetTimerFor128Frames - call YellowIntro_NextScene - ret - -YellowIntroScene13: - call YellowIntro_CheckFrameTimerDecrement - ret nc - lb de, $68, $58 - ld a, $a - call SpawnAnimatedObject - call YellowIntro_NextScene - ret - -YellowIntroScene14: - ld de, YellowIntroPalSequence_f9dd6 - call YellowIntro_LoadDMGPalAndIncrementCounter - jr c, .expired - ldh [rBGP], a - ldh [rOBP0], a - and $f0 - ldh [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -.expired - call MaskAllAnimatedObjectStructs - call YellowIntro_BlankOAMBuffer - ld hl, wTileMap - ld bc, $50 - ld a, $1 - call Bank3E_FillMemory - hlcoord 0, 4 - ld bc, CopyVideoDataAlternate - xor a - call Bank3E_FillMemory - hlcoord 0, 14 - ld bc, $50 - ld a, $1 - call Bank3E_FillMemory - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ldh [hAutoBGTransferEnabled], a - ld a, $e4 - ldh [rOBP0], a - ldh [rBGP], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - lb de, $58, $58 - ld a, $7 - call YellowIntro_SpawnAnimatedObjectAndSavePointer - call YellowIntro_NextScene - ld a, $28 - ld [wYellowIntroSceneTimer], a - ret - -YellowIntroScene15: - call YellowIntro_CheckFrameTimerDecrement - jr c, .expired - ld a, [wYellowIntroSceneTimer] - and $3 - ret nz - ldh a, [rOBP0] - xor $ff - ldh [rOBP0], a - ldh a, [rBGP] - xor $3 - ldh [rBGP], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - ret - -.expired - xor a - ldh [hLCDCPointer], a - ld a, $e4 - ldh [rBGP], a - ldh [rOBP0], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call YellowIntro_NextScene -YellowIntroScene16: - ld de, YellowIntroPalSequence_f9e0a - call YellowIntro_LoadDMGPalAndIncrementCounter - jr c, .expired - ldh [rOBP0], a - ldh [rBGP], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - ret - -.expired - call YellowIntro_NextScene - ret - -YellowIntroPalSequence_f9dd6: - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $e4 - db $e4, $c0, $c0, $ff - -YellowIntroPalSequence_f9e0a: - db $e4, $90, $90, $40 - db $40, $00, $00, $ff - -YellowIntroScene17: - ld c, 64 - call DelayFrames - ld hl, wYellowIntroCurrentScene - set 7, [hl] - ret - -YellowIntro_SpawnAnimatedObjectAndSavePointer: - call SpawnAnimatedObject - ld a, c - ld [wYellowIntroAnimatedObjectStructPointer], a - ld a, b - ld [wYellowIntroAnimatedObjectStructPointer + 1], a - ret - -YellowIntro_MaskCurrentAnimatedObjectStruct: - ld a, [wYellowIntroAnimatedObjectStructPointer] - ld c, a - ld a, [wYellowIntroAnimatedObjectStructPointer + 1] - ld b, a - call MaskCurrentAnimatedObjectStruct - ret - -YellowIntro_SetTimerFor128Frames: - ld a, 128 - ld [wYellowIntroSceneTimer], a - ret - -YellowIntro_SetTimerFor88Frames: - ld a, 88 - ld [wYellowIntroSceneTimer], a - ret - -YellowIntro_CheckFrameTimerDecrement: - ld hl, wYellowIntroSceneTimer - ld a, [hl] - and a - jr z, .asm_f9e4b - dec [hl] - and a - ret - -.asm_f9e4b - scf - ret - -YellowIntro_LoadDMGPalAndIncrementCounter: - ld hl, wYellowIntroSceneTimer - ld a, [hl] - inc [hl] - ld l, a - ld h, $0 - add hl, de - ld a, [hl] - cp $ff - jr z, .asm_f9e5d - and a - ret - -.asm_f9e5d - scf - ret - -Func_f9e5f: - ld hl, vBGMap0 - ld bc, $80 - ld a, $1 - call Bank3E_FillMemory - ld hl, $9880 - ld bc, $140 - xor a - call Bank3E_FillMemory - ld hl, $99c0 - ld bc, $80 - ld a, $1 - call Bank3E_FillMemory - ret - -YellowIntro_BlankPalsDelay2AndDisableLCD: - xor a - ldh [rBGP], a - ldh [rOBP0], a - ldh [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - call DelayFrame - call DelayFrame - call DisableLCD - ret - -Func_f9e9a: - ld e, a - callfar YellowIntroPaletteAction - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $90 - ldh [hWY], a - ld a, $e3 - ldh [rLCDC], a - ld a, $e4 - ldh [rBGP], a - ldh [rOBP0], a - ld a, $e0 - ldh [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -YellowIntro_Copy8BitSineWave: - ; Copy this sine wave into wLYOverridesBuffer 8 times (end just before wc900) - ld de, wLYOverridesBuffer - ld a, $8 -.loop - push af - ld hl, .SineWave - ld bc, .SineWaveEnd - .SineWave - call Bank3E_CopyData - pop af - dec a - jr nz, .loop - ret - -.SineWave: -; a sine wave with amplitude 4 - db 0, 0, 1, 2, 2, 3, 3, 3 - db 4, 3, 3, 3, 2, 2, 1, 0 - db 0, 0, -1, -2, -2, -3, -3, -3 - db -4, -3, -3, -3, -2, -2, -1, 0 -.SineWaveEnd: - -Request7TileTransferFromC810ToC710: - ld a, $10 - ldh [hVBlankCopySource], a - ld a, wLYOverridesBuffer / $100 - ldh [hVBlankCopySource + 1], a - ld a, $10 - ldh [hVBlankCopyDest], a - ld a, wLYOverrides / $100 - ldh [hVBlankCopyDest + 1], a - ld a, $7 - ldh [hVBlankCopySize], a - ret - -InitYellowIntroGFXAndMusic: - xor a - ldh [hAutoBGTransferEnabled], a - ldh [hSCX], a - ldh [hSCY], a - ldh [hAutoBGTransferDest], a - ld a, $98 - ldh [hAutoBGTransferDest + 1], a - call YellowIntro_BlankTileMap - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $1 - call Bank3E_FillMemory - hlcoord 0, 4 - ld bc, CopyVideoDataAlternate - xor a - call Bank3E_FillMemory - ld a, $1 - ldh [hAutoBGTransferEnabled], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ldh [hAutoBGTransferEnabled], a - ld de, $6b5a - ld hl, $8000 - ld bc, $3eff - call CopyVideoData - ld de, $635a - ld hl, $9000 - ld bc, $3e80 - call CopyVideoData - call ClearObjectAnimationBuffers - call LoadYellowIntroObjectAnimationDataPointers - ld b, $8 - call RunPaletteCommand - xor a - ld hl, wYellowIntroCurrentScene - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld a, MUSIC_YELLOW_INTRO - ld c, BANK(Music_YellowIntro) - call PlayMusic - ret - -LoadYellowIntroObjectAnimationDataPointers: - ld a, YellowIntro_AnimatedObjectSpawnStateData % $100 - ld [wAnimatedObjectSpawnStateDataPointer], a - ld a, YellowIntro_AnimatedObjectSpawnStateData / $100 - ld [wAnimatedObjectSpawnStateDataPointer + 1], a - ld a, YellowIntro_AnimatedObjectJumptable % $100 - ld [wAnimatedObjectJumptablePointer], a - ld a, YellowIntro_AnimatedObjectJumptable / $100 - ld [wAnimatedObjectJumptablePointer + 1], a - ld a, YellowIntro_AnimatedObjectOAMData % $100 - ld [wAnimatedObjectOAMDataPointer], a - ld a, YellowIntro_AnimatedObjectOAMData / $100 - ld [wAnimatedObjectOAMDataPointer + 1], a - ld a, YellowIntro_AnimatedObjectFramesData % $100 - ld [wAnimatedObjectFramesDataPointer], a - ld a, YellowIntro_AnimatedObjectFramesData / $100 - ld [wAnimatedObjectFramesDataPointer + 1], a - ret - -YellowIntro_BlankTileMap: - ld hl, wTileMap - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - ld a, $7f - call Bank3E_FillMemory - ret - -Bank3E_CopyData: -.loop - ld a, [hli] - ld [de], a - inc de - dec bc - ld a, c - or b - jr nz, .loop - ret - -Bank3E_FillMemory: - push de - ld e, a -.loop - ld a, e - ld [hli], a - dec bc - ld a, c - or b - jr nz, .loop - pop de - ret - -YellowIntro_BlankOAMBuffer: - ld hl, wOAMBuffer - ld bc, wOAMBufferEnd - wOAMBuffer - xor a - call Bank3E_FillMemory - ret - -YellowIntro_BlankPalettes: - xor a - ldh [rBGP], a - ldh [rOBP0], a - ldh [rOBP1], a - call UpdateGBCPal_BGP - call UpdateGBCPal_OBP0 - call UpdateGBCPal_OBP1 - ret - -YellowIntro_AnimatedObjectSpawnStateData: - db $00, $00, $00 - db $01, $01, $00 - db $02, $01, $00 - db $03, $01, $00 - db $04, $02, $00 - db $05, $03, $00 - db $06, $04, $00 - db $07, $01, $00 - db $08, $05, $00 - db $09, $01, $00 - db $0a, $01, $00 - -YellowIntro_AnimatedObjectJumptable: - dw Func_fa007 - dw Func_fa007 - dw Func_fa008 - dw Func_fa014 - dw Func_fa02b - dw Func_fa062 - -Func_fa007: - ret - -Func_fa008: - ld hl, $4 - add hl, bc - ld a, [hl] - cp $58 - ret z - sub $4 - ld [hl], a - ret - -Func_fa014: - ld hl, $4 - add hl, bc - ld a, [hl] - cp $58 - jr z, .asm_fa020 - add $4 - ld [hl], a -.asm_fa020 - ld hl, $5 - add hl, bc - cp $58 - ret z - add $1 - ld [hl], a - ret - -Func_fa02b: - ld hl, $b - add hl, bc - ld e, [hl] - ld d, $0 - ld hl, Jumptable_fa03b - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -Jumptable_fa03b: - dw Func_fa03f - dw Func_fa051 - -Func_fa03f: - ld hl, $5 - add hl, bc - ld a, [hl] - cp $58 - jr z, .asm_fa04c - sub $2 - ld [hl], a - ret - -.asm_fa04c - ld hl, $b - add hl, bc - inc [hl] -Func_fa051: - ld hl, $c - add hl, bc - ld a, [hl] - inc [hl] - ld d, $8 - call Func_fa079 - ld hl, $7 - add hl, bc - ld [hl], a - ret - -Func_fa062: - ld hl, $b - add hl, bc - ld a, [hl] - ld hl, $4 - add hl, bc - add [hl] - ld [hl], a - ret - -Func_fa06e: - ld e, a - ld d, $0 - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ret - -Func_fa077: ; cosine - add $10 -Func_fa079: - and $3f - cp $20 - jr nc, .asm_fa084 - call Func_fa08e - ld a, h - ret - -.asm_fa084 - and $1f - call Func_fa08e - ld a, h - xor $ff - inc a - ret - -Func_fa08e: - ld e, a - ld a, d - ld d, $0 - ld hl, Unkn_fa0aa - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $0 -.asm_fa09d - srl a - jr nc, .asm_fa0a2 - add hl, de -.asm_fa0a2 - sla e - rl d - and a - jr nz, .asm_fa09d - ret - -Unkn_fa0aa: - sine_wave $100 -- cgit v1.3.1-sl0p