pokeyellow/scripts/OaksLab.asm
dannye bc2354dd66
Some checks failed
CI / build (push) Has been cancelled
CI / build-macos (push) Has been cancelled
Merge branch 'master' of https://github.com/pret/pokered
2026-01-17 22:38:33 -06:00

1152 lines
27 KiB
NASM

OaksLab_Script:
CheckEvent EVENT_PALLET_AFTER_GETTING_POKEBALLS_2
call nz, OaksLabLoadTextPointers2Script
ld a, 1 << BIT_NO_AUTO_TEXT_BOX
ld [wAutoTextBoxDrawingControl], a
xor a
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
ld hl, OaksLab_ScriptPointers
ld a, [wOaksLabCurScript]
call CallFunctionInTable
ret
OaksLab_ScriptPointers:
def_script_pointers
dw_const OaksLabDefaultScript, SCRIPT_OAKSLAB_DEFAULT
dw_const OaksLabOakEntersLabScript, SCRIPT_OAKSLAB_OAK_ENTERS_LAB
dw_const OaksLabToggleOaksScript, SCRIPT_OAKSLAB_TOGGLE_OAKS
dw_const OaksLabPlayerEntersLabScript, SCRIPT_OAKSLAB_PLAYER_ENTERS_LAB
dw_const OaksLabFollowedOakScript, SCRIPT_OAKSLAB_FOLLOWED_OAK
dw_const OaksLabOakChooseMonSpeechScript, SCRIPT_OAKSLAB_OAK_CHOOSE_MON_SPEECH
dw_const OaksLabPlayerDontGoAwayScript, SCRIPT_OAKSLAB_PLAYER_DONT_GO_AWAY_SCRIPT
dw_const OaksLabPlayerForcedToWalkBackScript, SCRIPT_OAKSLAB_PLAYER_FORCED_TO_WALK_BACK_SCRIPT
dw_const OaksLabChoseStarterScript, SCRIPT_OAKSLAB_CHOSE_STARTER_SCRIPT
dw_const OaksLabRivalTakesPokeballScript, SCRIPT_OAKSLAB_RIVAL_TAKES_POKEBALL
dw_const OaksLabPlayerWalksToOakScript, SCRIPT_OAKSLAB_PLAYER_WALKS_TO_OAK
dw_const OaksLabPlayerReceivesPikachuScript, SCRIPT_OAKSLAB_PLAYER_RECEIVES_PIKACHU
dw_const OaksLabRivalChallengesPlayerScript, SCRIPT_OAKSLAB_RIVAL_CHALLENGES_PLAYER
dw_const OaksLabRivalStartBattleScript, SCRIPT_OAKSLAB_RIVAL_START_BATTLE
dw_const OaksLabRivalEndBattleScript, SCRIPT_OAKSLAB_RIVAL_END_BATTLE
dw_const OaksLabRivalStartsExitScript, SCRIPT_OAKSLAB_RIVAL_STARTS_EXIT
dw_const OaksLabPlayerWatchRivalExitScript, SCRIPT_OAKSLAB_PLAYER_WATCH_RIVAL_EXIT
dw_const OaksLabPikachuEscapesPokeballScript, SCRIPT_OAKSLAB_PIKACHU_ESCAPES_POKEBALL
dw_const OaksLabPikachuDislikesPokeballsScript, SCRIPT_OAKSLAB_PIKACHU_DISLIKES_POKEBALLS
dw_const OaksLabRivalArrivesAtOaksRequestScript, SCRIPT_OAKSLAB_RIVAL_ARRIVES_AT_OAKS_REQUEST
dw_const OaksLabOakGivesPokedexScript, SCRIPT_OAKSLAB_OAK_GIVES_POKEDEX
dw_const OaksLabRivalLeavesWithPokedexScript, SCRIPT_OAKSLAB_RIVAL_LEAVES_WITH_POKEDEX
dw_const OaksLabNoopScript, SCRIPT_OAKSLAB_NOOP
OaksLabDefaultScript:
CheckEvent EVENT_OAK_APPEARED_IN_PALLET
ret z
ld a, [wNPCMovementScriptFunctionNum]
and a
ret nz
ld a, TOGGLE_OAKS_LAB_OAK_2
ld [wToggleableObjectIndex], a
predef ShowObject
ld hl, wStatusFlags4
res BIT_NO_BATTLES, [hl]
ld a, SCRIPT_OAKSLAB_OAK_ENTERS_LAB
ld [wOaksLabCurScript], a
ret
OaksLabOakEntersLabScript:
ld a, OAKSLAB_OAK2
ldh [hSpriteIndex], a
ld de, OakEntryMovement
call MoveSprite
ld a, SCRIPT_OAKSLAB_TOGGLE_OAKS
ld [wOaksLabCurScript], a
ret
OakEntryMovement:
db NPC_MOVEMENT_UP
db NPC_MOVEMENT_UP
db NPC_MOVEMENT_UP
db -1 ; end
OaksLabToggleOaksScript:
ld a, [wStatusFlags5]
bit BIT_SCRIPTED_NPC_MOVEMENT, a
ret nz
ld a, TOGGLE_OAKS_LAB_OAK_2
ld [wToggleableObjectIndex], a
predef HideObject
ld a, TOGGLE_OAKS_LAB_OAK_1
ld [wToggleableObjectIndex], a
predef ShowObject
ld a, SCRIPT_OAKSLAB_PLAYER_ENTERS_LAB
ld [wOaksLabCurScript], a
ret
OaksLabPlayerEntersLabScript:
call Delay3
ld hl, wSimulatedJoypadStatesEnd
ld de, PlayerEntryMovementRLE
call DecodeRLEList
dec a
ld [wSimulatedJoypadStatesIndex], a
call StartSimulatingJoypadStates
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
xor a
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ld a, OAKSLAB_OAK1
ldh [hSpriteIndex], a
xor a
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ld a, SCRIPT_OAKSLAB_FOLLOWED_OAK
ld [wOaksLabCurScript], a
ret
PlayerEntryMovementRLE:
db PAD_UP, 8
db -1 ; end
OaksLabFollowedOakScript:
ld a, [wSimulatedJoypadStatesIndex]
and a
ret nz
SetEvent EVENT_FOLLOWED_OAK_INTO_LAB
SetEvent EVENT_FOLLOWED_OAK_INTO_LAB_2
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
ld a, SPRITE_FACING_UP
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ld hl, wStatusFlags7
res BIT_NO_MAP_MUSIC, [hl]
call PlayDefaultMusic
ld a, SCRIPT_OAKSLAB_OAK_CHOOSE_MON_SPEECH
ld [wOaksLabCurScript], a
ret
OaksLabOakChooseMonSpeechScript:
SetEvent EVENT_OAK_ASKED_TO_CHOOSE_MON
ld a, PAD_SELECT | PAD_START | PAD_CTRL_PAD
ld [wJoyIgnore], a
ld a, TEXT_OAKSLAB_RIVAL_FED_UP_WITH_WAITING
ldh [hTextID], a
call DisplayTextID
call Delay3
ld a, TEXT_OAKSLAB_OAK_CHOOSE_MON
ldh [hTextID], a
call DisplayTextID
call Delay3
ld a, $2
ld [wSprite01StateData1MovementStatus], a
ld a, SPRITE_FACING_UP
ld [wSprite01StateData1FacingDirection], a
ld a, TEXT_OAKSLAB_RIVAL_WHAT_ABOUT_ME
ldh [hTextID], a
call DisplayTextID
call Delay3
ld a, TEXT_OAKSLAB_OAK_BE_PATIENT
ldh [hTextID], a
call DisplayTextID
xor a
ld [wJoyIgnore], a
ld a, SCRIPT_OAKSLAB_PLAYER_DONT_GO_AWAY_SCRIPT
ld [wOaksLabCurScript], a
ret
OaksLabPlayerDontGoAwayScript:
ld a, [wYCoord]
cp 6
ret nz
ld a, OAKSLAB_OAK1
ldh [hSpriteIndex], a
xor a ; SPRITE_FACING_DOWN
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
xor a
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
call UpdateSprites
ld a, TEXT_OAKSLAB_OAK_DONT_GO_AWAY_YET
ldh [hTextID], a
call DisplayTextID
ld a, $1
ld [wSimulatedJoypadStatesIndex], a
ld a, PAD_UP
ld [wSimulatedJoypadStatesEnd], a
call StartSimulatingJoypadStates
ld a, PLAYER_DIR_UP
ld [wPlayerMovingDirection], a
ld a, SCRIPT_OAKSLAB_PLAYER_FORCED_TO_WALK_BACK_SCRIPT
ld [wOaksLabCurScript], a
ret
OaksLabPlayerForcedToWalkBackScript:
ld a, [wSimulatedJoypadStatesIndex]
and a
ret nz
call Delay3
ld a, SCRIPT_OAKSLAB_PLAYER_DONT_GO_AWAY_SCRIPT
ld [wOaksLabCurScript], a
ret
OaksLabChoseStarterScript:
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
ld de, .RivalPushesPlayerAwayFromEeveeBall
call MoveSprite
ld a, SCRIPT_OAKSLAB_RIVAL_TAKES_POKEBALL
ld [wOaksLabCurScript], a
ret
.RivalPushesPlayerAwayFromEeveeBall
db $00
db $07
db $07
db $07
db $FF
OaksLabRivalTakesPokeballScript:
ld a, [wStatusFlags5]
bit BIT_SCRIPTED_NPC_MOVEMENT, a
jr nz, .asm_1c564
ld a, TOGGLE_STARTER_BALL_1
ld [wToggleableObjectIndex], a
predef HideObject
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
ld a, SPRITE_FACING_UP
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ld a, RIVAL_STARTER_JOLTEON
ld [wRivalStarter], a
ld a, EEVEE
ld [wNamedObjectIndex], a
call GetMonName
ld a, PAD_SELECT | PAD_START | PAD_CTRL_PAD
ld [wJoyIgnore], a
ld a, TEXT_OAKSLAB_RIVAL_RECEIVED_MON
ldh [hTextID], a
call DisplayTextID
ld a, SCRIPT_OAKSLAB_PLAYER_WALKS_TO_OAK
ld [wOaksLabCurScript], a
ret
.asm_1c564
ld a, [wYCoord]
cp 4
ret nz
ld a, [wNPCNumScriptedSteps]
cp 1
ret nz
ld a, PLAYER_DIR_LEFT
ld [wPlayerMovingDirection], a
ld a, $2
ld [wSimulatedJoypadStatesIndex], a
ld a, PAD_RIGHT
ld [wSimulatedJoypadStatesEnd], a
ld [wSimulatedJoypadStatesEnd + 1], a
call StartSimulatingJoypadStates
ret
OaksLabPlayerWalksToOakScript:
ld a, [wYCoord]
cp 4
jr z, .asm_1c599
ld a, $1
ld [wSimulatedJoypadStatesIndex], a
ld a, PAD_LEFT
ld [wSimulatedJoypadStatesEnd], a
jr .asm_1c5a6
.asm_1c599
ld hl, wSimulatedJoypadStatesEnd
ld de, OaksLabRLE_PlayerWalksToOak
call DecodeRLEList
dec a
ld [wSimulatedJoypadStatesIndex], a
.asm_1c5a6
call StartSimulatingJoypadStates
ld a, SCRIPT_OAKSLAB_PLAYER_RECEIVES_PIKACHU
ld [wOaksLabCurScript], a
ret
OaksLabRLE_PlayerWalksToOak:
db PAD_UP, 2
db PAD_LEFT, 3
db PAD_DOWN, 1
db PAD_LEFT, 1
db $FF
OaksLabPlayerReceivesPikachuScript:
ld a, [wSimulatedJoypadStatesIndex]
and a
ret nz
ld a, TEXT_OAKSLAB_PLAYER_RECEIVED_MON
ldh [hTextID], a
call DisplayTextID
xor a
ld [wJoyIgnore], a
ld a, SCRIPT_OAKSLAB_RIVAL_CHALLENGES_PLAYER
ld [wOaksLabCurScript], a
ret
OaksLabRivalChallengesPlayerScript:
ld a, [wYCoord]
cp 6
ret nz
ld a, PLAYER_DIR_UP
ld [wPlayerMovingDirection], a
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
xor a ; SPRITE_FACING_DOWN
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ld c, BANK(Music_MeetRival)
ld a, MUSIC_MEET_RIVAL
call PlayMusic
ld a, TEXT_OAKSLAB_RIVAL_ILL_TAKE_YOU_ON
ldh [hTextID], a
call DisplayTextID
ld a, $1
ldh [hNPCPlayerRelativePosPerspective], a
ld a, $1
swap a
ldh [hNPCPlayerYDistance], a
predef CalcPositionOfPlayerRelativeToNPC
ldh a, [hNPCPlayerYDistance]
dec a
ldh [hNPCPlayerYDistance], a
predef FindPathToPlayer
ld de, wNPCMovementDirections2
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
call MoveSprite
ld a, SCRIPT_OAKSLAB_RIVAL_START_BATTLE
ld [wOaksLabCurScript], a
ret
OaksLabRivalStartBattleScript:
ld a, [wStatusFlags5]
bit BIT_SCRIPTED_NPC_MOVEMENT, a
ret nz
ld a, OAKSLAB_RIVAL
ld [wSpriteIndex], a
call GetSpritePosition1
ld a, OPP_RIVAL1
ld [wCurOpponent], a
ld a, $1
ld [wTrainerNo], a
ld hl, OaksLabRivalIPickedTheWrongPokemonText
ld de, OaksLabRivalAmIGreatOrWhatText
call SaveEndBattleTextPointers
ld hl, wStatusFlags3
set BIT_TALKED_TO_TRAINER, [hl]
set BIT_PRINT_END_BATTLE_TEXT, [hl]
xor a
ld [wJoyIgnore], a
ld a, PLAYER_DIR_UP
ld [wPlayerMovingDirection], a
ld a, SCRIPT_OAKSLAB_RIVAL_END_BATTLE
ld [wOaksLabCurScript], a
ret
OaksLabRivalEndBattleScript:
ld a, PAD_BUTTONS | PAD_CTRL_PAD
ld [wJoyIgnore], a
; If you beat your rival here, his Eevee will evolve into
; Jolteon if you beat him on Route 22, or Flareon if you
; skip or lose that battle.
; Otherwise, it will evolve into Vaporeon.
ld a, [wBattleResult]
and a
ld b, RIVAL_STARTER_VAPOREON
jr nz, .got_rival_starter
ld b, RIVAL_STARTER_FLAREON
.got_rival_starter
ld a, b
ld [wRivalStarter], a
ld a, PAD_SELECT | PAD_START | PAD_CTRL_PAD
ld [wJoyIgnore], a
ld a, PLAYER_DIR_UP
ld [wPlayerMovingDirection], a
call UpdateSprites
ld a, OAKSLAB_RIVAL
ld [wSpriteIndex], a
call SetSpritePosition1
ld a, $2
ld [wSprite01StateData1MovementStatus], a
xor a
ld [wSprite01StateData1FacingDirection], a
predef HealParty
SetEvent EVENT_BATTLED_RIVAL_IN_OAKS_LAB
ld a, SCRIPT_OAKSLAB_RIVAL_STARTS_EXIT
ld [wOaksLabCurScript], a
ret
OaksLabRivalStartsExitScript:
ld c, 20
call DelayFrames
ld a, TEXT_OAKSLAB_RIVAL_SMELL_YOU_LATER
ldh [hTextID], a
call DisplayTextID
farcall Music_RivalAlternateStart
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
ld de, .RivalExitMovement
call MoveSprite
ld a, [wXCoord]
cp 4
; move left or right depending on where the player is standing
jr nz, .moveLeft
ld a, NPC_MOVEMENT_RIGHT
jr .next
.moveLeft
ld a, NPC_MOVEMENT_LEFT
.next
ld [wNPCMovementDirections], a
ld a, SCRIPT_OAKSLAB_PLAYER_WATCH_RIVAL_EXIT
ld [wOaksLabCurScript], a
ret
.RivalExitMovement
db NPC_CHANGE_FACING
db NPC_MOVEMENT_DOWN
db $04
db $04
db $04
db $04
db $04
db -1 ; end
OaksLabPlayerWatchRivalExitScript:
ld a, [wStatusFlags5]
bit BIT_SCRIPTED_NPC_MOVEMENT, a
jr nz, .checkRivalPosition
ld a, PAD_SELECT | PAD_START | PAD_CTRL_PAD
ld [wJoyIgnore], a
ld a, TOGGLE_OAKS_LAB_RIVAL
ld [wToggleableObjectIndex], a
predef HideObject
call PlayDefaultMusic
ld a, SCRIPT_OAKSLAB_PIKACHU_ESCAPES_POKEBALL
ld [wOaksLabCurScript], a
ret
; make the player keep facing the rival as he walks away
.checkRivalPosition
ld a, [wNPCNumScriptedSteps]
cp $5
jr nz, .turnPlayerDown
ld a, [wXCoord]
cp 4
jr nz, .turnPlayerLeft
ld a, SPRITE_FACING_RIGHT
jr .done
.turnPlayerLeft
ld a, SPRITE_FACING_LEFT
jr .done
.turnPlayerDown
cp $4
ret nz
xor a ; ld a, SPRITE_FACING_DOWN
.done
ld [wSpritePlayerStateData1FacingDirection], a
ret
OaksLabPikachuEscapesPokeballScript:
; Pikachu comes out
ld a, SPRITE_FACING_UP
ld [wSpritePlayerStateData1FacingDirection], a
ld a, $2
ld [wPikachuSpawnState], a
farcall SchedulePikachuSpawnForAfterText
call EnablePikachuOverworldSpriteDrawing
ld a, TEXT_OAKSLAB_PIKACHU_DISLIKES_POKEBALLS1
ldh [hTextID], a
call DisplayTextID
ld a, SCRIPT_OAKSLAB_PIKACHU_DISLIKES_POKEBALLS
ld [wOaksLabCurScript], a
ret
OaksLabPikachuDislikesPokeballsScript:
ld a, TEXT_OAKSLAB_PIKACHU_DISLIKES_POKEBALLS2
ldh [hTextID], a
call DisplayTextID
xor a
ld [wJoyIgnore], a
ld a, SCRIPT_OAKSLAB_NOOP
ld [wOaksLabCurScript], a
ret
OaksLabRivalArrivesAtOaksRequestScript:
xor a
ldh [hJoyHeld], a
call EnableAutoTextBoxDrawing
call StopAllMusic
farcall Music_RivalAlternateStart
ld a, TEXT_OAKSLAB_RIVAL_GRAMPS
ldh [hTextID], a
call DisplayTextID
callfar OaksLabPikachuMovementScript
call OaksLabCalcRivalMovementScript
ld a, TOGGLE_OAKS_LAB_RIVAL
ld [wToggleableObjectIndex], a
predef ShowObject
ld a, [wNPCMovementDirections2Index]
ld [wSavedNPCMovementDirections2Index], a
ld b, 0
ld c, a
ld hl, wNPCMovementDirections2
ld a, NPC_MOVEMENT_UP
call FillMemory
ld [hl], $ff
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
ld de, wNPCMovementDirections2
call MoveSprite
ld a, SCRIPT_OAKSLAB_OAK_GIVES_POKEDEX
ld [wOaksLabCurScript], a
ret
OaksLabRivalFaceUpOakFaceDownScript:
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
ld a, SPRITE_FACING_UP
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ld a, OAKSLAB_OAK2
ldh [hSpriteIndex], a
xor a ; SPRITE_FACING_DOWN
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
ret
OaksLabOakGivesPokedexScript:
ld a, [wStatusFlags5]
bit BIT_SCRIPTED_NPC_MOVEMENT, a
ret nz
call EnableAutoTextBoxDrawing
call PlayDefaultMusic
ld a, PAD_SELECT | PAD_START | PAD_CTRL_PAD
ld [wJoyIgnore], a
call OaksLabRivalFaceUpOakFaceDownScript
ld a, TEXT_OAKSLAB_RIVAL_MY_POKEMON_HAS_GROWN_STRONGER
ldh [hTextID], a
call DisplayTextID
call DelayFrame
call OaksLabRivalFaceUpOakFaceDownScript
ld a, TEXT_OAKSLAB_OAK_I_HAVE_A_REQUEST
ldh [hTextID], a
call DisplayTextID
call DelayFrame
call OaksLabRivalFaceUpOakFaceDownScript
ld a, TEXT_OAKSLAB_OAK_MY_INVENTION_POKEDEX
ldh [hTextID], a
call DisplayTextID
call DelayFrame
ld a, TEXT_OAKSLAB_OAK_GOT_POKEDEX
ldh [hTextID], a
call DisplayTextID
call Delay3
ld a, TOGGLE_POKEDEX_1
ld [wToggleableObjectIndex], a
predef HideObject
ld a, TOGGLE_POKEDEX_2
ld [wToggleableObjectIndex], a
predef HideObject
call OaksLabRivalFaceUpOakFaceDownScript
ld a, TEXT_OAKSLAB_OAK_THAT_WAS_MY_DREAM
ldh [hTextID], a
call DisplayTextID
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
ld a, SPRITE_FACING_RIGHT
ldh [hSpriteFacingDirection], a
call SetSpriteFacingDirectionAndDelay
call Delay3
ld a, TEXT_OAKSLAB_RIVAL_LEAVE_IT_ALL_TO_ME
ldh [hTextID], a
call DisplayTextID
SetEvent EVENT_GOT_POKEDEX
ld a, SCRIPT_VIRIDIANCITY_AFTER_POKEDEX
ld [wViridianCityCurScript], a
SetEvent EVENT_OAK_GOT_PARCEL
ld a, TOGGLE_LYING_OLD_MAN
ld [wToggleableObjectIndex], a
predef HideObject
ld a, TOGGLE_OLD_MAN_2
ld [wToggleableObjectIndex], a
predef ShowObject
ld a, [wSavedNPCMovementDirections2Index]
ld b, 0
ld c, a
ld hl, wNPCMovementDirections2
xor a ; NPC_MOVEMENT_DOWN
call FillMemory
ld [hl], $ff
call StopAllMusic
farcall Music_RivalAlternateStart
ld a, OAKSLAB_RIVAL
ldh [hSpriteIndex], a
ld de, wNPCMovementDirections2
call MoveSprite
ld a, SCRIPT_OAKSLAB_RIVAL_LEAVES_WITH_POKEDEX
ld [wOaksLabCurScript], a
ret
OaksLabRivalLeavesWithPokedexScript:
ld a, [wStatusFlags5]
bit BIT_SCRIPTED_NPC_MOVEMENT, a
ret nz
call PlayDefaultMusic
ld a, TOGGLE_OAKS_LAB_RIVAL
ld [wToggleableObjectIndex], a
predef HideObject
SetEvent EVENT_1ST_ROUTE22_RIVAL_BATTLE
ResetEventReuseHL EVENT_2ND_ROUTE22_RIVAL_BATTLE
SetEventReuseHL EVENT_ROUTE22_RIVAL_WANTS_BATTLE
ld a, TOGGLE_ROUTE_22_RIVAL_1
ld [wToggleableObjectIndex], a
predef ShowObject
xor a
ld [wJoyIgnore], a
ld a, SCRIPT_OAKSLAB_NOOP
ld [wOaksLabCurScript], a
ret
OaksLabNoopScript:
ret
OaksLabScript_RemoveParcel:
ld hl, wBagItems
ld bc, 0
.loop
ld a, [hli]
cp $ff
ret z
cp OAKS_PARCEL
jr z, .foundParcel
inc hl
inc c
jr .loop
.foundParcel
ld hl, wNumBagItems
ld a, c
ld [wWhichPokemon], a
ld a, 1
ld [wItemQuantity], a
call RemoveItemFromInventory
ret
OaksLabCalcRivalMovementScript:
ld a, $7c
ldh [hSpriteScreenYCoord], a
ld a, 8
ldh [hSpriteMapXCoord], a
ld a, [wYCoord]
cp 3
jr nz, .not_below_oak
ld a, $4
ld [wNPCMovementDirections2Index], a
ld a, $30
ld b, 11
jr .done
.not_below_oak
cp 1
jr nz, .not_above_oak
ld a, $2
ld [wNPCMovementDirections2Index], a
ld a, $30
ld b, 9
jr .done
.not_above_oak
ld a, $3
ld [wNPCMovementDirections2Index], a
ld b, 10
ld a, [wXCoord]
cp 4
jr nz, .not_left_of_oak
ld a, $40
jr .done
.not_left_of_oak
ld a, $20
.done
ldh [hSpriteScreenXCoord], a
ld a, b
ldh [hSpriteMapYCoord], a
ld a, OAKSLAB_RIVAL
ld [wSpriteIndex], a
call SetSpritePosition1
ret
OaksLabLoadTextPointers2Script:
ld hl, OaksLab_TextPointers2
ld a, l
ld [wCurMapTextPtr], a
ld a, h
ld [wCurMapTextPtr + 1], a
ret
OaksLab_TextPointers:
def_text_pointers
dw_const OaksLabRivalText, TEXT_OAKSLAB_RIVAL
dw_const OaksLabEeveePokeBallText, TEXT_OAKSLAB_EEVEE_POKE_BALL
dw_const OaksLabOak1Text, TEXT_OAKSLAB_OAK1
dw_const OaksLabPokedexText, TEXT_OAKSLAB_POKEDEX1
dw_const OaksLabPokedexText, TEXT_OAKSLAB_POKEDEX2
dw_const OaksLabOak2Text, TEXT_OAKSLAB_OAK2
dw_const OaksLabGirlText, TEXT_OAKSLAB_GIRL
dw_const OaksLabScientistText, TEXT_OAKSLAB_SCIENTIST1
dw_const OaksLabScientistText, TEXT_OAKSLAB_SCIENTIST2
dw_const OaksLabOakDontGoAwayYetText, TEXT_OAKSLAB_OAK_DONT_GO_AWAY_YET
dw_const OaksLabRivalIllTakeYouOnText, TEXT_OAKSLAB_RIVAL_ILL_TAKE_YOU_ON
dw_const OaksLabRivalSmellYouLaterText, TEXT_OAKSLAB_RIVAL_SMELL_YOU_LATER
dw_const OaksLabRivalFedUpWithWaitingText, TEXT_OAKSLAB_RIVAL_FED_UP_WITH_WAITING
dw_const OaksLabOakChooseMonText, TEXT_OAKSLAB_OAK_CHOOSE_MON
dw_const OaksLabRivalWhatAboutMeText, TEXT_OAKSLAB_RIVAL_WHAT_ABOUT_ME
dw_const OaksLabOakBePatientText, TEXT_OAKSLAB_OAK_BE_PATIENT
dw_const OaksLabRivalReceivedMonText, TEXT_OAKSLAB_RIVAL_RECEIVED_MON
dw_const OaksLabPlayerReceivedMonText, TEXT_OAKSLAB_PLAYER_RECEIVED_MON
dw_const OaksLabRivalGrampsText, TEXT_OAKSLAB_RIVAL_GRAMPS
dw_const OaksLabRivalMyPokemonHasGrownStrongerText, TEXT_OAKSLAB_RIVAL_MY_POKEMON_HAS_GROWN_STRONGER
dw_const OaksLabOakIHaveARequestText, TEXT_OAKSLAB_OAK_I_HAVE_A_REQUEST
dw_const OaksLabOakMyInventionPokedexText, TEXT_OAKSLAB_OAK_MY_INVENTION_POKEDEX
dw_const OaksLabOakGotPokedexText, TEXT_OAKSLAB_OAK_GOT_POKEDEX
dw_const OaksLabOakThatWasMyDreamText, TEXT_OAKSLAB_OAK_THAT_WAS_MY_DREAM
dw_const OaksLabRivalLeaveItAllToMeText, TEXT_OAKSLAB_RIVAL_LEAVE_IT_ALL_TO_ME
dw_const OaksLabPikachuDislikesPokeballsText1, TEXT_OAKSLAB_PIKACHU_DISLIKES_POKEBALLS1
dw_const OaksLabPikachuDislikesPokeballsText2, TEXT_OAKSLAB_PIKACHU_DISLIKES_POKEBALLS2
OaksLab_TextPointers2:
dw OaksLabRivalText
dw OaksLabEeveePokeBallText
dw OaksLabOak1Text
dw OaksLabPokedexText
dw OaksLabPokedexText
dw OaksLabOak2Text
dw OaksLabGirlText
dw OaksLabScientistText
dw OaksLabScientistText
OaksLabRivalText:
text_asm
CheckEvent EVENT_FOLLOWED_OAK_INTO_LAB_2
jr nz, .beforeChooseMon
ld hl, .GrampsIsntAroundText
call PrintText
jr .done
.beforeChooseMon
CheckEventReuseA EVENT_GOT_STARTER
jr nz, .afterChooseMon
ld hl, .IllGetABetterPokemonThanYou
call PrintText
jr .done
.afterChooseMon
ld hl, .MyPokemonLooksStrongerText
call PrintText
.done
jp TextScriptEnd
.GrampsIsntAroundText:
text_far _OaksLabRivalGrampsIsntAroundText
text_end
.IllGetABetterPokemonThanYou:
text_far _OaksLabRivalIllGetABetterPokemonThanYou
text_end
.MyPokemonLooksStrongerText:
text_far _OaksLabRivalMyPokemonLooksStrongerText
text_end
OaksLabEeveePokeBallText:
text_asm
ld a, $1
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
CheckEvent EVENT_OAK_ASKED_TO_CHOOSE_MON
jr nz, OaksLabRivalExclamationScript
ld a, $0
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabThatsAPokeball
text_end
OaksLabRivalExclamationScript:
ld a, OAKSLAB_RIVAL
ld [wEmotionBubbleSpriteIndex], a
xor a ; EXCLAMATION_BUBBLE
ld [wWhichEmotionBubble], a
predef EmotionBubble
ld a, SCRIPT_OAKSLAB_CHOSE_STARTER_SCRIPT
ld [wOaksLabCurScript], a
jp TextScriptEnd
OaksLabOak1Text:
text_asm
CheckEvent EVENT_PALLET_AFTER_GETTING_POKEBALLS
jr nz, .already_got_poke_balls
ld hl, wPokedexOwned
ld b, wPokedexOwnedEnd - wPokedexOwned
call CountSetBits
ld a, [wNumSetBits]
cp 2
jr c, .check_for_poke_balls
.already_got_poke_balls
ld hl, .HowIsYourPokedexComingText
call PrintText
ld a, $1
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
predef DisplayDexRating
jp .done
.check_for_poke_balls
ld b, POKE_BALL
call IsItemInBag
jr nz, .come_see_me_sometimes
ld hl, wPokedexOwned
ld b, wPokedexOwnedEnd - wPokedexOwned
call CountSetBits
ld a, [wNumSetBits]
cp 2
jr nc, .come_see_me_sometimes
CheckEvent EVENT_BEAT_ROUTE22_RIVAL_1ST_BATTLE
jr nz, .give_poke_balls
CheckEvent EVENT_GOT_POKEDEX
jr nz, .mon_around_the_world
CheckEventReuseA EVENT_BATTLED_RIVAL_IN_OAKS_LAB
jr nz, .check_got_parcel
ld a, [wStatusFlags4]
bit BIT_GOT_STARTER, a
jr nz, .already_got_pokemon
ld hl, .GoAheadItsYours
call PrintText
jr .done
.already_got_pokemon
ld hl, .YourPokemonCanFightText
call PrintText
jr .done
.check_got_parcel
ld b, OAKS_PARCEL
call IsItemInBag
jr nz, .got_parcel
ld hl, .YouShouldTalkToIt
call PrintText
jr .done
.got_parcel
ld hl, .DeliverParcelText
call PrintText
call OaksLabScript_RemoveParcel
ld a, SCRIPT_OAKSLAB_RIVAL_ARRIVES_AT_OAKS_REQUEST
ld [wOaksLabCurScript], a
jr .done
.mon_around_the_world
ld hl, .PokemonAroundTheWorldText
call PrintText
jr .done
.give_poke_balls
CheckAndSetEvent EVENT_GOT_POKEBALLS_FROM_OAK
jr nz, .come_see_me_sometimes
lb bc, POKE_BALL, 5
call GiveItem
ld hl, .GivePokeballsText
call PrintText
jr .done
.come_see_me_sometimes
ld hl, .ComeSeeMeSometimesText
call PrintText
.done
jp TextScriptEnd
.GoAheadItsYours:
text_far _OaksLabOak1GoAheadItsYours
text_end
.YourPokemonCanFightText:
text_far _OaksLabOak1YourPokemonCanFightText
text_end
.YouShouldTalkToIt:
text_far _OaksLabOak1YouShouldTalkToIt
text_end
.DeliverParcelText:
text_far _OaksLabOak1DeliverParcelText
sound_get_key_item
text_far _OaksLabOak1ParcelThanksText
text_end
.PokemonAroundTheWorldText:
text_far _OaksLabOak1PokemonAroundTheWorldText
text_end
.GivePokeballsText:
text_far _OaksLabOak1ReceivedPokeballsText
sound_get_key_item
text_far _OaksLabGivePokeballsExplanationText
text_end
.ComeSeeMeSometimesText:
text_far _OaksLabOak1ComeSeeMeSometimesText
text_end
.HowIsYourPokedexComingText:
text_far _OaksLabOak1HowIsYourPokedexComingText
text_end
OaksLabPokedexText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabPokedexText
text_end
OaksLabOak2Text:
text_far _OaksLabOak2Text
text_end
OaksLabGirlText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabGirlText
text_end
OaksLabRivalFedUpWithWaitingText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabRivalFedUpWithWaitingText
text_end
OaksLabOakChooseMonText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabOakChooseMonText
text_end
OaksLabRivalWhatAboutMeText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabRivalWhatAboutMeText
text_end
OaksLabOakBePatientText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabOakBePatientText
text_end
OaksLabRivalReceivedMonText:
text_asm
ld hl, OaksLabRivalTakesText1
call PrintText
ld hl, OaksLabRivalTakesText2
call PrintText
ld hl, OaksLabRivalTakesText3
call PrintText
ld hl, OaksLabRivalTakesText4
call PrintText
ld hl, OaksLabRivalTakesText5
call PrintText
jp TextScriptEnd
OaksLabRivalTakesText1:
text_far _OaksLabRivalTakesText1
text_end
OaksLabRivalTakesText2:
text_far _OaksLabRivalTakesText2
sound_get_key_item
text_end
OaksLabRivalTakesText3:
text_far _OaksLabRivalTakesText3
text_end
OaksLabRivalTakesText4:
text_far _OaksLabRivalTakesText4
text_end
OaksLabRivalTakesText5:
text_far _OaksLabRivalTakesText5
text_end
OaksLabPlayerReceivedMonText:
text_asm
ld a, STARTER_PIKACHU
ld [wPlayerStarter], a
ld [wNamedObjectIndex], a
call GetMonName
ld a, $1
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
ld hl, OaksLabOakGivesText
call PrintText
ld hl, OaksLabReceivedText
call PrintText
xor a
ld [wMonDataLocation], a
ld a, 5
ld [wCurEnemyLevel], a
ld a, STARTER_PIKACHU
ld [wPokedexNum], a
ld [wCurPartySpecies], a
call AddPartyMon
ld a, LIGHT_BALL_GSC
ld [wPartyMon1CatchRate], a
call DisablePikachuOverworldSpriteDrawing
SetEvent EVENT_GOT_STARTER
ld hl, wStatusFlags4
set BIT_GOT_STARTER, [hl]
jp TextScriptEnd
OaksLabOakGivesText:
text_far _OaksLabOakGivesText
text_end
OaksLabReceivedText:
text_far _OaksLabReceivedText
sound_get_key_item
text_end
OaksLabOakDontGoAwayYetText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabOakDontGoAwayYetText
text_end
OaksLabRivalIllTakeYouOnText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabRivalIllTakeYouOnText
text_end
OaksLabRivalIPickedTheWrongPokemonText:
text_far _OaksLabRivalIPickedTheWrongPokemonText
text_end
OaksLabRivalAmIGreatOrWhatText:
text_far _OaksLabRivalAmIGreatOrWhatText
text_end
OaksLabRivalSmellYouLaterText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabRivalSmellYouLaterText
text_end
OaksLabPikachuDislikesPokeballsText1:
text_asm
ldpikacry e, PikachuCry2
callfar PlayPikachuSoundClip
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabPikachuDislikesPokeballsText1
text_end
OaksLabPikachuDislikesPokeballsText2:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabPikachuDislikesPokeballsText2
text_end
OaksLabRivalGrampsText:
text_far _OaksLabRivalGrampsText
text_end
OaksLabRivalMyPokemonHasGrownStrongerText:
text_far _OaksLabRivalMyPokemonHasGrownStrongerText
text_end
OaksLabOakIHaveARequestText:
text_far _OaksLabOakIHaveARequestText
text_end
OaksLabOakMyInventionPokedexText:
text_far _OaksLabOakMyInventionPokedexText
text_end
OaksLabOakGotPokedexText:
text_far _OaksLabOakGotPokedexText
sound_get_key_item
text_end
OaksLabOakThatWasMyDreamText:
text_far _OaksLabOakThatWasMyDreamText
text_end
OaksLabRivalLeaveItAllToMeText:
text_far _OaksLabRivalLeaveItAllToMeText
text_end
OaksLabScientistText:
text_asm
ld hl, .Text
call PrintText
jp TextScriptEnd
.Text:
text_far _OaksLabScientistText
text_end