Func_fc4dd:: ; fc4dd (3f:44dd) ; possibly to test if pika should be out? ld a, [wPikachuOverworldStateFlags] bit 5, a jr nz, .hide ; 3f:44f8 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 Func_fc4fa:: ; fc4fa (3f:44fa) ld hl, wPikachuOverworldStateFlags bit 4, [hl] res 4, [hl] jr nz, .normal_spawn_state call EnablePikachuFollowingPlayer call ClearPikachuSpriteStateData ld a, $ff ld [wPikachuSpriteImageIdx], a call ClearPikachuFollowCommandBuffer call CalculatePikachuFacingDirection ret .normal_spawn_state call CalculatePikachuPlacementCoords xor a ld [wPikachuSpawnState], a ld a, [wPlayerFacingDirection] ld [wPikachuFacingDirection], a ret ClearPikachuSpriteStateData:: ; fc523 (3f:4523) ld hl, wPikachuPictureID call .clear ld hl, wPikachuSpriteStateData2 .clear ld bc, $10 xor a call FillMemory ret Func_fc534:: ; fc534 (3f:4534) call CalculatePikachuPlacementCoords call CalculatePikachuFacingDirection xor a ld [wPikachuSpawnState], a ret CalculatePikachuPlacementCoords:: ; fc53f (3f:453f) ld bc, wPikachuPictureID 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, [wPlayerFacingDirection] 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, [wPlayerFacingDirection] 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, wPlayerMapY - wPlayerSpriteStateData1 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:: ; fc5bc (3f:45bc) ld a, $49 ld [wPikachuPictureID], a ld a, $ff ld [wPikachuSpriteImageIdx], 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, [wPlayerFacingDirection] ld [wPikachuFacingDirection], a ret .force_facing_down ld a, SPRITE_FACING_DOWN ld [wPikachuFacingDirection], a ret .face_the_other_way ld a, [wPlayerFacingDirection] xor $4 ld [wPikachuFacingDirection], a ret CalculatePikachuSpawnState1:: ; fc5fa (3f:45fa) ld a, [wCurMap] cp OAKS_LAB jr z, .oaks_lab cp ROUTE_22_GATE jr z, .route_22_gate cp MT_MOON_2 jr z, .mt_moon_2 cp ROCK_TUNNEL_1 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, [wPlayerFacingDirection] and a jr nz, .not_map_list_2 ld a, $3 jr .load .route_22_gate ld a, [wPlayerFacingDirection] 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:: ; fc64b (3f:464b) db VICTORY_ROAD_2 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:: ; fc653 (3f:4653) db VIRIDIAN_FOREST_EXIT db CERULEAN_HOUSE_2 db TRASHED_HOUSE db VERMILION_DOCK db CELADON_MANSION_1 db ROUTE_2_GATE db FUCHSIA_HOUSE_3 db $ff CalculatePikachuSpawnState2:: ; fc65b (3f:465b) ld a, [wCurMap] cp VIRIDIAN_FOREST_EXIT jr z, .viridian_forest_exit cp VIRIDIAN_FOREST_ENTRANCE 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, [wPlayerFacingDirection] cp SPRITE_FACING_UP jr z, .in_array jr .not_in_array .viridian_forest_entrance ld a, [wPlayerFacingDirection] 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:: ; fc68e (3f:468e) db VIRIDIAN_FOREST db SAFARI_ZONE_REST_HOUSE_1 db SAFARI_ZONE_REST_HOUSE_2 db SAFARI_ZONE_REST_HOUSE_3 db SAFARI_ZONE_REST_HOUSE_4 db SAFARI_ZONE_SECRET_HOUSE db SILPH_CO_ELEVATOR db CELADON_MART_ELEVATOR db CINNABAR_LAB_2 db CINNABAR_LAB_3 db CINNABAR_LAB_4 db $ff CalculatePikachuSpawnState3:: ; fc69a (3f:469a) 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, [wPlayerFacingDirection] cp SPRITE_FACING_UP jr z, .asm_fc6b9 jr .asm_fc6bd .asm_fc6b0 ld a, [wPlayerFacingDirection] 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:: ; fc6c5 (3f:46c5) push hl ld hl, wPikachuOverworldStateFlags set 2, [hl] pop hl ret ResetPikachuOverworldStateFlag2:: ; fc6cd (3f:46cd) push hl ld hl, wPikachuOverworldStateFlags res 2, [hl] pop hl ret SpawnPikachu_:: ; fc6d5 (3f:46d5) call ResetPikachuOverworldStateFlag2 call Func_fc727 ret nc push bc call WillPikachuSpawnOnTheScreen pop bc ret c ld bc, wPikachuPictureID ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc bit 7, [hl] jp nz, asm_fc745 ld a, [wFontLoaded] bit 0, a jp nz, asm_fc76a call CheckPikachuFollowingPlayer jp nz, asm_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: ; fc710 (3f:4710) 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 Func_fc726 Func_fc726: ; fc726 (3f:4726) ret Func_fc727: ; fc727 (3f:4727) call Func_fc4dd jr nc, .dont_spawn ld a, [wPikachuMovementStatus] and a jr nz, .already_spawned push bc push hl call Func_fc534 pop hl pop bc .already_spawned scf ret .dont_spawn ld hl, wPikachuSpriteImageIdx ld [hl], $ff dec hl ld [hl], $0 xor a ret asm_fc745: ; fc745 (3f:4745) ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc res 7, [hl] ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], a call CheckPikachuFollowingPlayer jr nz, .asm_fc75f ld a, [wPlayerFacingDirection] xor $4 ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 add hl, bc ld [hl], a .asm_fc75f xor a ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 add hl, bc ld [hli], a ld [hl], a call UpdatePikachuWalkingSprite ret asm_fc76a: ; fc76a (3f:476a) xor a ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 add hl, bc ld [hli], a ld [hl], a call UpdatePikachuWalkingSprite call Func_fc82e jr c, .asm_fc783 push bc callab InitializeSpriteScreenPosition pop bc .asm_fc783 ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $1 ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $0 call RefreshPikachuFollow ret Func_fc793: ; fc793 (3f:4793) call RefreshPikachuFollow push bc callab InitializeSpriteScreenPosition pop bc ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1 add hl, bc ld [hl], $ff dec hl ld [hl], $1 ret Func_fc7aa: ; fc7aa (3f:47aa) 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, wSprite01FacingDirection - wSprite01SpriteStateData1 add hl, bc ld [hl], a ld a, [de] inc de ld hl, wSprite01XStepVector - wSprite01SpriteStateData1 add hl, bc ld [hl], a dec hl dec hl ld a, [de] ld [hl], a inc de ld a, [de] ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], a cp $4 jp z, Func_fca0a call AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer jp c, FastPikachuFollow jp NormalPikachuFollow Pointer_fc7e3: ; fc7e3 (3f:47e3) 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: ; fc803 (3f:4803) call Func_fcae2 ret c ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 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, wSprite01FacingDirection - wSprite01SpriteStateData1 add hl, bc ld [hl], a .asm_fc823 xor a ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 add hl, bc ld [hli], a ld [hl], a call UpdatePikachuWalkingSprite ret Func_fc82e: ; fc82e (3f:482e) ld a, [wWalkCounter] and a ret z scf ret Func_fc835: ; fc835 (3f:4835) ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $10 ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $1 ret Func_fc842: ; fc842 (3f:4842) ld hl, $0 push af call Random ld 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: ; fc85a (3f:485a) dw Func_fc862 dw Func_fc8f8 dw Func_fc92b dw Func_fc95d Func_fc862: ; fc862 (3f:4862) dec a add a add a and $c ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 add hl, bc ld [hl], a ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $6 xor a ld [wd432], a ld [wd433], a ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $11 asm_fc87f: ; fc87f (3f:487f) ld a, [wd432] ld e, a ld a, [wd433] ld d, a call Func_fc82e jr c, Func_fc8c7 call SetPikachuOverworldStateFlag2 ld hl, wSprite01YPixels - wSprite01SpriteStateData1 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, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 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, wSprite01YPixels - wSprite01SpriteStateData1 add hl, bc ld [hl], e inc hl inc hl ld [hl], d ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc dec [hl] ret nz jp Func_fc835 Func_fc8c7: ; fc8c7 (3f:48c7) ld hl, wSprite01YPixels - wSprite01SpriteStateData1 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: ; fc8d6 (3f:48d6) 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: ; fc8f8 (3f:48f8) ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $7 ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $30 asm_fc904: ; fc904 (3f:4904) call Func_fc82e jp c, Func_fc835 call SetPikachuOverworldStateFlag2 ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 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, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc dec [hl] ret nz jp Func_fc835 Func_fc92b: ; fc92b (3f:492b) ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $20 ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $8 asm_fc937: ; fc937 (3f:4937) call Func_fc82e jp c, Func_fc835 call SetPikachuOverworldStateFlag2 ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 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, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc dec [hl] ret nz jp Func_fc835 Func_fc95d: ; fc95d (3f:495d) ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $20 ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $9 asm_fc969: ; fc969 (3f:4969) call Func_fc82e jp c, Func_fc835 call SetPikachuOverworldStateFlag2 ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 add hl, bc ld a, [hl] inc a cp $8 ld [hl], a jr nz, .asm_fc988 xor a ld [hl], a ld hl, wSprite01FacingDirection - wSprite01SpriteStateData1 add hl, bc ld a, [hl] call Func_fc994 ld [hl], a .asm_fc988 call UpdatePikachuWalkingSprite ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc dec [hl] ret nz jp Func_fc835 Func_fc994: ; fc994 (3f:4994) push hl ld hl, Pointer_fc9ac ld d, a .loop ld a, [hli] cp d jr nz, .loop ld a, [hl] pop hl ret Func_fc9a0: ; fc9a0 (3f:49a0) push hl ld hl, Pointer_fc9ac_End ld d, a .loop ld a, [hld] cp d jr nz, .loop ld a, [hl] pop hl ret Pointer_fc9ac: ; fc9ac (3f:49ac) 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 Pointer_fc9ac_End: NormalPikachuFollow: ; fc9b4 (3f:49b4) ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $8 ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $3 call AddPikachuStepVector asm_fc9c3: ; fc9c3 (3f:49c3) call TryDoubleAddPikachuStepVectorToScreenPixelCoords call GetPikachuWalkingAnimationSpeed call UpdatePikachuWalkingSprite ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc dec [hl] ret nz call ResetPikachuStepVector call ComputePikachuFacingDirection ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $1 ret FastPikachuFollow: ; fc9df (3f:49df) ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $4 ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $5 call AddPikachuStepVector asm_fc9ee: ; fc9ee (3f:49ee) call DoubleAddPikachuStepVectorToScreenPixelCoords call GetPikachuWalkingAnimationSpeed call UpdatePikachuWalkingSprite ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc dec [hl] ret nz call ResetPikachuStepVector call ComputePikachuFacingDirection ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $1 ret Func_fca0a: ; fca0a (3f:4a0a) ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc ld [hl], $8 ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $4 call AddPikachuStepVector call AddPikachuStepVector asm_fca1c: ; fca1c (3f:4a1c) call DoubleAddPikachuStepVectorToScreenPixelCoords call GetPikachuWalkingAnimationSpeed call UpdatePikachuWalkingSprite ld hl, wSprite01WalkAnimationCounter - wSprite01SpriteStateData1 add hl, bc dec [hl] ret nz call ResetPikachuStepVector call ComputePikachuFacingDirection ld hl, wSprite01MovementStatus - wSprite01SpriteStateData1 add hl, bc ld [hl], $1 ret AddPikachuStepVector: ; fca38 (3f:4a38) ld hl, wSprite01YStepVector - wSprite01SpriteStateData1 add hl, bc ld e, [hl] inc hl inc hl ld d, [hl] ld hl, wSprite01MapY - wSprite01SpriteStateData1 add hl, bc ld a, [hl] add e ld [hli], a ld a, [hl] add d ld [hl], a ret TryDoubleAddPikachuStepVectorToScreenPixelCoords: ; fca4b (3f:4a4b) ld a, [wWalkBikeSurfState] cp $1 ; biking jr nz, AddPikachuStepVectorToScreenPixelCoords ld a, [wd736] bit 6, a jr nz, AddPikachuStepVectorToScreenPixelCoords DoubleAddPikachuStepVectorToScreenPixelCoords: ; fca59 (3f:4a59) ld hl, wSprite01YStepVector - wSprite01SpriteStateData1 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: ; fca68 (3f:4a68) ld hl, wSprite01YStepVector - wSprite01SpriteStateData1 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: ; fca75 (3f:4a75) ld hl, wSprite01YStepVector - wSprite01SpriteStateData1 add hl, bc xor a ld [hli], a inc hl ld [hl], a ret GetPikachuWalkingAnimationSpeed: ; fca7e (3f:4a7e) call ComparePikachuHappinessTo80 ld d, $2 jr nc, .happy ld d, $5 .happy ld hl, wSprite01IntraAnimFrameCounter - wSprite01SpriteStateData1 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: ; fca99 (3f:4a99) ld a, [wPikachuOverworldStateFlags] bit 3, a jr nz, .uninitialized ld hl, wSprite01SpriteImageBaseOffset - wSprite01SpriteStateData1 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, wSprite01FacingDirection - wSprite01SpriteStateData1 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, wSprite01AnimFrameCounter - wSprite01SpriteStateData1 add hl, bc ld a, d or [hl] ld d, a .load_sprite_index ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1 add hl, bc ld [hl], d ret .uninitialized ld hl, wSprite01SpriteImageIdx - wSprite01SpriteStateData1 add hl, bc ld [hl], $ff ret .copy_player ld a, [wPlayerSpriteImageIdx] and $f or d ld [wPikachuSpriteImageIdx], a ret Func_fcae2: ; fcae2 (3f:4ae2) ld hl, wSprite01MapY - wSprite01SpriteStateData1 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, wSprite01SpriteImageIdx - wSprite01SpriteStateData1 add hl, bc ld [hl], $ff scf ret .on_screen and a ret IsPikachuRightNextToPlayer: ; fcb01 (3f:4b01) push bc push de push hl ld bc, wPikachuPictureID ld a, [wXCoord] add $4 ld d, a ld a, [wYCoord] add $4 ld e, a ld hl, wPlayerMapY - wPlayerSpriteStateData1 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, wPlayerMapX - wPlayerSpriteStateData1 add hl, bc ld a, [hl] sub d jr z, .good jr .bad .equal ld hl, wPlayerMapX - wPlayerSpriteStateData1 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: ; fcb4d (3f:4b4d) call GetPikachuFacingDirection ld e, a ret GetPikachuFacingDirection: ; fcb52 (3f:4b52) ld bc, wPikachuPictureID ld a, [wXCoord] add $4 ld d, a ld a, [wYCoord] add $4 ld e, a ld hl, wPlayerMapY - wPlayerSpriteStateData1 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, wPlayerMapX - wPlayerSpriteStateData1 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: ; fcb84 (3f:4b84) push bc ld hl, wPikachuFollowCommandBufferSize ld [hl], $ff inc hl ld bc, $10 xor a call FillMemory pop bc ret AppendPikachuFollowCommandToBuffer: ; fcb94 (3f:4b94) ld hl, wPikachuFollowCommandBufferSize inc [hl] ld e, [hl] ld d, 0 ld hl, wPikachuFollowCommandBuffer add hl, de ld [hl], a ret RefreshPikachuFollow: ; fcba1 (3f:4ba1) call ClearPikachuFollowCommandBuffer call ComputePikachuFollowCommand ret c call AppendPikachuFollowCommandToBuffer ret ComputePikachuFollowCommand: ; fcbac (3f:4bac) ld bc, wPikachuPictureID ld hl, wPlayerMapY - wPlayerSpriteStateData1 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, wPlayerMapX - wPlayerSpriteStateData1 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: ; fcc01 (3f:4c01) jr nc, .positive cpl inc a .positive cp $2 ret Func_fcc08:: ; fcc08 (3f:4c08) 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: ; fcc23 (3f:4c28) 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: ; fcc42 (3f:4c42) 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: ; fcc64 (3f:4c64) 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: ; fcc92 (3f:4c92) 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:: ; fccb2 (3f:4cb2) 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, [wPikachuMapY] 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, [wPikachuMapX] 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, [wPlayerFacingDirection] .load ld [wPikachuFacingDirection], a ret GetPikachuFollowCommand: ; fccee (3f:4cee) 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: ; fcd01 (3f:4d01) 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: ; fcd17 (3f:4d17) ld a, [wPikachuFollowCommandBufferSize] cp $ff ret z cp $2 jr nc, .set_carry and a ret .set_carry scf ret WillPikachuSpawnOnTheScreen: ; fcd25 (3f:4d25) ld h, wSpriteStateData2 / $100 ld a, [H_CURRENTSPRITEOFFSET] ; If we're here, this can only be $f0 add wPikachuMapY - wPikachuSpriteStateData2 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 ld a, [H_CURRENTSPRITEOFFSET] add wPikachuSpriteImageIdx - wPikachuSpriteStateData1 ld l, a ld [hl], $ff scf jr .return .on_screen ld h, wSpriteStateData2 / $100 ld a, [H_CURRENTSPRITEOFFSET] add wPikachuGrassPriority - wPikachuSpriteStateData2 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: ; fcd83 (3f:4d83) ld h, wSpriteStateData1 / $100 ld a, [H_CURRENTSPRITEOFFSET] add wPikachuYPixels - wPikachuSpriteStateData1 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: ; fcdad (3f:4dad) ; preserves a and bc push bc push af ld a, [wPikachuHappiness] cp 80 pop bc ld a, b pop bc ret