diff options
author | dannye <33dannye@gmail.com> | 2021-10-10 14:35:37 -0500 |
---|---|---|
committer | dannye <33dannye@gmail.com> | 2021-10-10 14:35:37 -0500 |
commit | 40d32ea4e266fa2e87f344d50ba854d53b02fba3 (patch) | |
tree | 56dc343bff6be04c7763459b9336f59424d73101 /src/engine/overworld/scripting.asm | |
parent | 3ceaa8f66011c828daab46fd251d238ce9494131 (diff) |
Split bank 3
Diffstat (limited to 'src/engine/overworld/scripting.asm')
-rw-r--r-- | src/engine/overworld/scripting.asm | 2092 |
1 files changed, 2092 insertions, 0 deletions
diff --git a/src/engine/overworld/scripting.asm b/src/engine/overworld/scripting.asm new file mode 100644 index 0000000..0010a77 --- /dev/null +++ b/src/engine/overworld/scripting.asm @@ -0,0 +1,2092 @@ +SetNextNPCAndScript: + push bc + call FindLoadedNPC + ld a, [wLoadedNPCTempIndex] + ld [wScriptNPC], a + farcall SetNewScriptNPC + pop bc +; fallthrough + +SetNextScript: + push hl + ld hl, wNextScript + ld [hl], c + inc hl + ld [hl], b + ld a, OWMODE_SCRIPT + ld [wOverworldMode], a + pop hl + ret + +Func_c943: + push hl + push bc + push de + ld l, MAP_SCRIPT_NPCS + call GetMapScriptPointer + jr nc, .quit +.load_npc_loop + ld a, l + ld [wTempPointer], a + ld a, h + ld [wTempPointer + 1], a + ld a, BANK(MapScripts) + ld [wTempPointerBank], a + ld de, wTempNPC + ld bc, NPC_MAP_SIZE + call CopyBankedDataToDE + ld a, [wTempNPC] + or a + jr z, .quit + push hl + ld a, [wLoadNPCFunction] + ld l, a + ld a, [wLoadNPCFunction + 1] + ld h, a + or l + jr z, .no_script + call CallHL2 + jr nc, .next_npc +.no_script + ld a, [wTempNPC] + farcall LoadNPCSpriteData + call Func_c998 + farcall LoadNPC +.next_npc + pop hl + ld bc, NPC_MAP_SIZE + add hl, bc + jr .load_npc_loop +.quit + ld l, MAP_SCRIPT_POST_NPC + call CallMapScriptPointerIfExists + pop de + pop bc + pop hl + ret + +Func_c998: + ld a, [wTempNPC] + cp NPC_AMY + ret nz + ld a, [wd3d0] + or a + ret z + ld b, $4 + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .not_cgb + ld b, $e +.not_cgb + ld a, b + ld [wNPCAnim], a + ld a, $0 + ld [wNPCAnimFlags], a + ret + +Func_c9b8: + ld l, MAP_SCRIPT_LOAD_MAP + jr CallMapScriptPointerIfExists + +Func_c9bc: + ld l, MAP_SCRIPT_AFTER_DUEL + jr CallMapScriptPointerIfExists + +Func_c9c0: + ld l, MAP_SCRIPT_MOVED_PLAYER + +CallMapScriptPointerIfExists: + call GetMapScriptPointer + ret nc + jp hl + +Func_c9c7: + ld l, MAP_SCRIPT_CLOSE_TEXTBOX + jr CallMapScriptPointerIfExists + +ClearEvents: + push hl + push bc + ld hl, wEventVars + ld bc, EVENT_VAR_BYTES +.loop + xor a + ld [hli], a + dec bc + ld a, b + or c + jr nz, .loop + pop bc + pop hl + ret + +; Clears temporary event vars before determining Imakuni Room +DetermineImakuniAndChallengeHall: + xor a + ld [wEventVars + EVENT_VAR_BYTES - 1], a + call DetermineImakuniRoom + call DetermineChallengeHallEvent + ret + +; Determines what room Imakuni is in when you reset +; Skips current room and does not occur if you haven't talked to Imakuni +DetermineImakuniRoom: + ld c, IMAKUNI_FIGHTING_CLUB + get_event_value EVENT_IMAKUNI_STATE + cp IMAKUNI_TALKED + jr c, .skip +.loop + call UpdateRNGSources + and %11 + ld c, a + ld b, 0 + ld hl, ImakuniPossibleRooms + add hl, bc + ld a, [wTempMap] + cp [hl] + jr z, .loop +.skip + ld a, c + set_event_value EVENT_IMAKUNI_ROOM + ret + +ImakuniPossibleRooms: + db FIGHTING_CLUB_LOBBY + db SCIENCE_CLUB_LOBBY + db LIGHTNING_CLUB_LOBBY + db WATER_CLUB_LOBBY + +DetermineChallengeHallEvent: + ld a, [wOverworldMapSelection] + cp OWMAP_CHALLENGE_HALL + jr z, .done + get_event_value EVENT_RECEIVED_LEGENDARY_CARDS + or a + jr nz, .challenge_cup_three +; challenge cup two + get_event_value EVENT_CHALLENGE_CUP_2_STATE + cp CHALLENGE_CUP_OVER + jr z, .done + or a ; cp CHALLENGE_CUP_NOT_STARTED + jr z, .challenge_cup_one + cp CHALLENGE_CUP_WON + jr z, .close_challenge_cup_one + ld c, CHALLENGE_CUP_READY_TO_START + set_event_value EVENT_CHALLENGE_CUP_2_STATE + jr .close_challenge_cup_one +.challenge_cup_one + get_event_value EVENT_CHALLENGE_CUP_1_STATE + cp CHALLENGE_CUP_OVER + jr z, .done + or a ; cp CHALLENGE_CUP_NOT_STARTED + jr z, .done + cp CHALLENGE_CUP_WON + jr z, .done + ld c, CHALLENGE_CUP_READY_TO_START + set_event_value EVENT_CHALLENGE_CUP_1_STATE + jr .done +.challenge_cup_three + call UpdateRNGSources + ld c, CHALLENGE_CUP_READY_TO_START + and %11 + or a + jr z, .start_challenge_cup_three + ld c, CHALLENGE_CUP_NOT_STARTED +.start_challenge_cup_three + set_event_value EVENT_CHALLENGE_CUP_3_STATE + jr .close_challenge_cup_two +.close_challenge_cup_two + ld c, CHALLENGE_CUP_OVER + set_event_value EVENT_CHALLENGE_CUP_2_STATE +.close_challenge_cup_one + ld c, CHALLENGE_CUP_OVER + set_event_value EVENT_CHALLENGE_CUP_1_STATE +.done + ret + +GetStackEventValue: + call GetByteAfterCall +; fallthrough + +; returns the event var's value in a +; also ors it with itself before returning +GetEventValue: + push hl + push bc + call GetEventVar + ld c, [hl] + ld a, [wLoadedEventBits] +.loop + bit 0, a + jr nz, .done + srl a + srl c + jr .loop +.done + and c + pop bc + pop hl + or a + ret + +SetStackEventZero: + call GetByteAfterCall + push bc + ld c, 0 + call SetEventValue + pop bc + ret + +; Use macro set_event_value. The byte db'd after this func is called +; is used as the event value argument for SetEventValue +SetStackEventValue: + call GetByteAfterCall +; fallthrough + +; a - event +; c - value - truncated to fit only the event var's bounds +SetEventValue: + push hl + push bc + call GetEventVar + ld a, [wLoadedEventBits] +.loop + bit 0, a + jr nz, .done + srl a + sla c + jr .loop +.done + ld a, [wLoadedEventBits] + and c + ld c, a + ld a, [wLoadedEventBits] + cpl + and [hl] + or c + ld [hl], a + pop bc + pop hl + ret + +; returns in a the byte db'd after the call to a function that calls this +GetByteAfterCall: + push hl + ld hl, sp+4 + push bc + ld c, [hl] + inc hl + ld b, [hl] + ld a, [bc] + inc bc + ld [hl], b + dec hl + ld [hl], c + pop bc + pop hl + ret + +MaxStackEventValue: + call GetByteAfterCall +; fallthrough + +MaxOutEventValue: + push bc + ld c, $ff + call SetEventValue + pop bc + ret + +SetStackEventFalse: + call GetByteAfterCall +; fallthrough + +ZeroOutEventValue: + push bc + ld c, 0 + call SetEventValue + pop bc + ret + +TryGiveMedalPCPacks: + push hl + push bc + ld hl, MedalEvents + lb bc, 0, 8 +.loop + ld a, [hli] + call GetEventValue + jr z, .no_medal + inc b +.no_medal + dec c + jr nz, .loop + + ld c, b + set_event_value EVENT_MEDAL_COUNT + ld a, c + push af + cp 8 + jr nc, .give_packs_for_eight_medals + cp 7 + jr nc, .give_packs_for_seven_medals + cp 3 + jr nc, .give_packs_for_three_medals + jr .done + +.give_packs_for_eight_medals + ld a, $c + farcall TryGivePCPack + +.give_packs_for_seven_medals + ld a, $b + farcall TryGivePCPack + +.give_packs_for_three_medals + ld a, $a + farcall TryGivePCPack + +.done + pop af + pop bc + pop hl + ret + +MedalEvents: + db EVENT_BEAT_NIKKI + db EVENT_BEAT_RICK + db EVENT_BEAT_KEN + db EVENT_BEAT_AMY + db EVENT_BEAT_ISAAC + db EVENT_BEAT_MURRAY + db EVENT_BEAT_GENE + db EVENT_BEAT_MITCH + +; returns wEventVars byte in hl, related bits in wLoadedEventBits +GetEventVar: + push bc + ld c, a + ld b, 0 + sla c + rl b + ld hl, EventVarMasks + add hl, bc + ld a, [hli] + ld c, a + ld a, [hl] + ld [wLoadedEventBits], a + ld b, 0 + ld hl, wEventVars + add hl, bc + pop bc + ret + +; location in wEventVars of each event var: +; offset - which byte holds the event value +; mask - which bits in the byte hold the value +; events 0-7 are reset when game resets +EventVarMasks: + event_def $3f, %10000000 ; EVENT_TEMP_TRADED_WITH_ISHIHARA + event_def $3f, %01000000 ; EVENT_TEMP_GIFTED_TO_MAN1 + event_def $3f, %00100000 ; EVENT_TEMP_TALKED_TO_IMAKUNI + event_def $3f, %00010000 ; EVENT_TEMP_DUELED_IMAKUNI + event_def $3f, %00001000 ; EVENT_TEMP_TRADED_WITH_LASS2 + event_def $3f, %00000100 ; EVENT_TEMP_05 unused? + event_def $3f, %00000010 ; EVENT_TEMP_06 unused? + event_def $3f, %00000001 ; EVENT_TEMP_07 unused? + event_def $00, %10000000 ; EVENT_BEAT_NIKKI + event_def $00, %01000000 ; EVENT_BEAT_RICK + event_def $00, %00100000 ; EVENT_BEAT_KEN + event_def $00, %00010000 ; EVENT_BEAT_AMY + event_def $00, %00001000 ; EVENT_BEAT_ISAAC + event_def $00, %00000100 ; EVENT_BEAT_MURRAY + event_def $00, %00000010 ; EVENT_BEAT_GENE + event_def $00, %00000001 ; EVENT_BEAT_MITCH + event_def $00, %11111111 ; EVENT_MEDAL_FLAGS + event_def $01, %11110000 ; EVENT_PUPIL_MICHAEL_STATE + event_def $01, %00001111 ; EVENT_GAL1_TRADE_STATE + event_def $02, %11000000 ; EVENT_IMAKUNI_STATE + event_def $02, %00110000 ; EVENT_LASS1_MENTIONED_IMAKUNI + event_def $02, %00001000 ; EVENT_BEAT_SARA + event_def $02, %00000100 ; EVENT_BEAT_AMANDA + event_def $03, %11110000 ; EVENT_PUPIL_CHRIS_STATE + event_def $03, %00001111 ; EVENT_MATTHEW_STATE + event_def $04, %11110000 ; EVENT_CHAP2_TRADE_STATE + event_def $04, %00001111 ; EVENT_DAVID_STATE + event_def $05, %10000000 ; EVENT_BEAT_JOSEPH + event_def $05, %01000000 ; EVENT_ISHIHARA_MENTIONED + event_def $05, %00100000 ; EVENT_ISHIHARA_MET + event_def $05, %00010000 ; EVENT_ISHIHARAS_HOUSE_MENTIONED + event_def $05, %00001111 ; EVENT_ISHIHARA_TRADE_STATE + event_def $06, %11110000 ; EVENT_PUPIL_JESSICA_STATE + event_def $06, %00001100 ; EVENT_LAD2_STATE + event_def $06, %00000010 ; EVENT_RECEIVED_LEGENDARY_CARDS + event_def $06, %00000001 ; EVENT_KEN_HAD_ENOUGH_CARDS + event_def $07, %11000000 ; EVENT_KEN_TALKED + event_def $07, %00100000 ; EVENT_BEAT_JENNIFER + event_def $07, %00010000 ; EVENT_BEAT_NICHOLAS + event_def $07, %00001000 ; EVENT_BEAT_BRANDON + event_def $07, %00000100 ; EVENT_ISAAC_TALKED + event_def $07, %00000010 ; EVENT_MAN1_TALKED + event_def $07, %00000001 ; EVENT_MAN1_WAITING_FOR_CARD + event_def $08, %11111111 ; EVENT_MAN1_REQUESTED_CARD_ID + event_def $09, %11100000 ; EVENT_MAN1_GIFT_SEQUENCE_STATE + event_def $09, %00011111 ; EVENT_MAN1_GIFTED_CARD_FLAGS + event_def $0a, %11110000 ; EVENT_MEDAL_COUNT + event_def $0a, %00001000 ; EVENT_DANIEL_TALKED + event_def $0a, %00000100 ; EVENT_MURRAY_TALKED + event_def $0a, %00000011 ; EVENT_PAPPY1_STATE + event_def $0b, %10000000 ; EVENT_RONALD_PSYCHIC_CLUB_LOBBY_ENCOUNTER + event_def $0b, %01110000 ; EVENT_JOSHUA_STATE + event_def $0b, %00001100 ; EVENT_IMAKUNI_ROOM + event_def $0b, %00000011 ; EVENT_NIKKI_STATE + event_def $0c, %11100000 ; EVENT_IMAKUNI_WIN_COUNT + event_def $0c, %00011100 ; EVENT_LASS2_TRADE_STATE + event_def $0c, %00000010 ; EVENT_ISHIHARA_WANTS_TO_TRADE + event_def $0c, %00000001 ; EVENT_ISHIHARA_CONGRATULATED_PLAYER + event_def $0d, %10000000 ; EVENT_BEAT_KRISTIN + event_def $0d, %01000000 ; EVENT_BEAT_HEATHER + event_def $0d, %00100000 ; EVENT_BEAT_BRITTANY + event_def $0d, %00010000 ; EVENT_DRMASON_CONGRATULATED_PLAYER + event_def $0d, %00001110 ; EVENT_MASON_LAB_STATE + event_def $0e, %11100000 ; EVENT_CHALLENGE_CUP_1_STATE + event_def $0e, %00011100 ; EVENT_CHALLENGE_CUP_2_STATE + event_def $0f, %11100000 ; EVENT_CHALLENGE_CUP_3_STATE + event_def $10, %10000000 ; EVENT_CHALLENGE_CUP_STARTING + event_def $10, %01000000 ; EVENT_CHALLENGE_CUP_STAGE_VISITED + event_def $10, %00110000 ; EVENT_CHALLENGE_CUP_NUMBER + event_def $10, %00001100 ; EVENT_CHALLENGE_CUP_OPPONENT_NUMBER + event_def $10, %00000010 ; EVENT_CHALLENGE_CUP_OPPONENT_CHOSEN + event_def $10, %00000001 ; EVENT_CHALLENGE_CUP_IN_MENU + event_def $11, %11100000 ; EVENT_CHALLENGE_CUP_1_RESULT + event_def $11, %00011100 ; EVENT_CHALLENGE_CUP_2_RESULT + event_def $12, %11100000 ; EVENT_CHALLENGE_CUP_3_RESULT + event_def $13, %10000000 ; EVENT_RONALD_FIRST_CLUB_ENTRANCE_ENCOUNTER + event_def $13, %01100000 ; EVENT_RONALD_FIRST_DUEL_STATE + event_def $13, %00011000 ; EVENT_RONALD_SECOND_DUEL_STATE + event_def $13, %00000100 ; EVENT_RONALD_TALKED + event_def $13, %00000010 ; EVENT_RONALD_POKEMON_DOME_ENTRANCE_ENCOUNTER + event_def $14, %10000000 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_CONVO_1 + event_def $14, %01000000 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_CONVO_2 + event_def $14, %00100000 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_CONVO_3 + event_def $14, %00010000 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_CONVO_4 + event_def $14, %00001000 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_CONVO_5 + event_def $14, %00000100 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_CONVO_6 + event_def $14, %00000010 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_CONVO_7 + event_def $14, %00000001 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_CONVO_8 + event_def $15, %11110000 ; EVENT_RONALD_CHALLENGE_HALL_LOBBY_STATE + event_def $15, %00001000 ; EVENT_PLAYER_ENTERED_CHALLENGE_CUP + event_def $16, %10000000 ; EVENT_FIGHTING_DECK_MACHINE_ACTIVE + event_def $16, %01000000 ; EVENT_ROCK_DECK_MACHINE_ACTIVE + event_def $16, %00100000 ; EVENT_WATER_DECK_MACHINE_ACTIVE + event_def $16, %00010000 ; EVENT_LIGHTNING_DECK_MACHINE_ACTIVE + event_def $16, %00001000 ; EVENT_GRASS_DECK_MACHINE_ACTIVE + event_def $16, %00000100 ; EVENT_PSYCHIC_DECK_MACHINE_ACTIVE + event_def $16, %00000010 ; EVENT_SCIENCE_DECK_MACHINE_ACTIVE + event_def $16, %00000001 ; EVENT_FIRE_DECK_MACHINE_ACTIVE + event_def $16, %11111111 ; EVENT_ALL_DECK_MACHINE_FLAGS + event_def $17, %10000000 ; EVENT_HALL_OF_HONOR_DOORS_OPEN + event_def $17, %01000000 ; EVENT_CHALLENGED_GRAND_MASTERS + event_def $17, %00110000 ; EVENT_POKEMON_DOME_STATE + event_def $17, %00001000 ; EVENT_POKEMON_DOME_IN_MENU + event_def $17, %00000100 ; EVENT_CHALLENGED_RONALD + event_def $18, %11000000 ; EVENT_COURTNEY_STATE + event_def $18, %00110000 ; EVENT_STEVE_STATE + event_def $18, %00001100 ; EVENT_JACK_STATE + event_def $18, %00000011 ; EVENT_ROD_STATE + event_def $19, %11000000 ; EVENT_RONALD_POKEMON_DOME_STATE + event_def $19, %00100000 ; EVENT_RECEIVED_ZAPDOS + event_def $19, %00010000 ; EVENT_RECEIVED_MOLTRES + event_def $19, %00001000 ; EVENT_RECEIVED_ARTICUNO + event_def $19, %00000100 ; EVENT_RECEIVED_DRAGONITE + event_def $19, %00111100 ; EVENT_LEGENDARY_CARDS_RECEIVED_FLAGS + event_def $1a, %11111100 ; EVENT_GIFT_CENTER_MENU_CHOICE + event_def $1a, %00000011 ; EVENT_AARON_BOOSTER_REWARD + event_def $1b, %11111111 ; EVENT_CONSOLE + event_def $1c, %11110000 ; EVENT_SAM_MENU_CHOICE + event_def $1c, %00001111 ; EVENT_AARON_DECK_MENU_CHOICE + +; Used for basic level objects that just print text and quit +PrintInteractableObjectText: + ld hl, wDefaultObjectText + ld a, [hli] + ld h, [hl] + ld l, a + call Func_cc32 + call CloseAdvancedDialogueBox + ret + +Func_cc32: + push hl + ld hl, wCurrentNPCNameTx + ld e, [hl] + inc hl + ld d, [hl] + pop hl + call Func_c8ba + ret + +; Used for things that are represented as NPCs but don't have a Script +; EX: Clerks and legendary cards that interact through Level Objects +Script_Clerk10: +Script_GiftCenterClerk: +Script_Woman2: +Script_Torch: +Script_LegendaryCardTopLeft: +Script_LegendaryCardTopRight: +Script_LegendaryCardLeftSpark: +Script_LegendaryCardBottomLeft: +Script_LegendaryCardBottomRight: +Script_LegendaryCardRightSpark: + call CloseAdvancedDialogueBox + ret + +; Enters into the script loop, continuing until wBreakScriptLoop > 0 +; When the loop is broken, it resumes normal code execution where script ended +; Note: Some scripts "double return" and skip this. +RST20: + pop hl + ld a, l + ld [wScriptPointer], a + ld a, h + ld [wScriptPointer + 1], a + xor a + ld [wBreakScriptLoop], a +.loop + call RunOverworldScript + ld a, [wBreakScriptLoop] ; if you break out, it jumps + or a + jr z, .loop + ld hl, wScriptPointer + ld a, [hli] + ld c, a + ld b, [hl] + retbc + +IncreaseScriptPointerBy1: + ld a, 1 + jr IncreaseScriptPointer + +IncreaseScriptPointerBy2: + ld a, 2 + jr IncreaseScriptPointer + +IncreaseScriptPointerBy4: + ld a, 4 + jr IncreaseScriptPointer + +IncreaseScriptPointerBy5: + ld a, 5 + jr IncreaseScriptPointer + +IncreaseScriptPointerBy6: + ld a, 6 + jr IncreaseScriptPointer + +IncreaseScriptPointerBy7: + ld a, 7 + jr IncreaseScriptPointer + +IncreaseScriptPointerBy3: + ld a, 3 +IncreaseScriptPointer: + ld c, a + ld a, [wScriptPointer] + add c + ld [wScriptPointer], a + ld a, [wScriptPointer + 1] + adc 0 + ld [wScriptPointer + 1], a + ret + +SetScriptPointer: + ld hl, wScriptPointer + ld [hl], c + inc hl + ld [hl], b + ret + +GetScriptArgs5AfterPointer: + ld a, 5 + jr GetScriptArgsAfterPointer + +GetScriptArgs1AfterPointer: + ld a, 1 + jr GetScriptArgsAfterPointer + +GetScriptArgs2AfterPointer: + ld a, 2 + jr GetScriptArgsAfterPointer + +GetScriptArgs3AfterPointer: + ld a, 3 +GetScriptArgsAfterPointer: + push hl + ld l, a + ld a, [wScriptPointer] + add l + ld l, a + ld a, [wScriptPointer + 1] + adc 0 + ld h, a + ld a, [hli] + ld c, a + ld b, [hl] + pop hl + or b + ret + +SetScriptControlBytePass: + ld a, $ff + ld [wScriptControlByte], a + ret + +SetScriptControlByteFail: + xor a + ld [wScriptControlByte], a + ret + +; Exits Script mode and runs the next instruction like normal +ScriptCommand_EndScript: + ld a, TRUE + ld [wBreakScriptLoop], a + jp IncreaseScriptPointerBy1 + +ScriptCommand_CloseAdvancedTextBox: + call CloseAdvancedDialogueBox + jp IncreaseScriptPointerBy1 + +ScriptCommand_QuitScriptFully: + call ScriptCommand_CloseAdvancedTextBox + call ScriptCommand_EndScript + pop hl + ret + +; args: 2-Text String Index +ScriptCommand_PrintNPCText: + ld l, c + ld h, b + call Func_cc32 + jp IncreaseScriptPointerBy3 + +ScriptCommand_PrintText: + ld l, c + ld h, b + call Func_c891 + jp IncreaseScriptPointerBy3 + +ScriptCommand_AskQuestionJumpDefaultYes: + ld a, TRUE + ld [wDefaultYesOrNo], a +; fallthrough + +; Asks the player a question then jumps if they answer yes. Seem to be able to +; take a text of 0000 (NULL) to overwrite last with (yes no) prompt at the bottom +ScriptCommand_AskQuestionJump: + ld l, c + ld h, b + call Func_c8ed + ld a, [hCurMenuItem] + ld [wScriptControlByte], a + jr c, .no_jump + call GetScriptArgs3AfterPointer + jr z, .no_jump + jp SetScriptPointer + +.no_jump + jp IncreaseScriptPointerBy5 + +; args - prize cards, deck id, duel theme index +; sets a duel up, doesn't start until we break out of the script system. +ScriptCommand_StartDuel: + call SetNPCDuelParams + ld a, [wScriptNPC] + ld l, LOADED_NPC_ID + call GetItemInLoadedNPCIndex + ld a, [hl] + farcall SetNPCMatchStartTheme + ld a, [wNPCDuelDeckID] + cp $ff + jr nz, .not_aaron_duel + ld a, [wMultichoiceTextboxResult_ChooseDeckToDuelAgainst] + ld c, a + ld b, 0 + ld hl, AaronDeckIDs + add hl, bc + ld a, [hl] + ld [wNPCDuelDeckID], a +.not_aaron_duel + ld a, [wScriptNPC] + ld l, LOADED_NPC_ID + call GetItemInLoadedNPCIndex + ld a, [hl] +.start_duel + ld [wNPCDuelist], a + ld [wNPCDuelistCopy], a + push af + farcall Func_1c557 + ld [wNPCDuelistDirection], a + pop af + farcall SetNPCOpponentNameAndPortrait + ld a, GAME_EVENT_DUEL + ld [wGameEvent], a + ld hl, wOverworldTransition + set 6, [hl] + jp IncreaseScriptPointerBy4 + +ScriptCommand_StartChallengeHallDuel: + call SetNPCDuelParams + ld a, [wChallengeHallNPC] + farcall SetNPCDeckIDAndDuelTheme + ld a, MUSIC_MATCH_START_2 + ld [wMatchStartTheme], a + ld a, [wChallengeHallNPC] + jr ScriptCommand_StartDuel.start_duel + +AaronDeckIDs: + db LIGHTNING_AND_FIRE_DECK_ID + db WATER_AND_FIGHTING_DECK_ID + db GRASS_AND_PSYCHIC_DECK_ID + +SetNPCDuelParams: + ld a, c + ld [wNPCDuelPrizes], a + ld a, b + ld [wNPCDuelDeckID], a + call GetScriptArgs3AfterPointer + ld a, c + ld [wDuelTheme], a + ret + +ScriptCommand_BattleCenter: + ld a, GAME_EVENT_BATTLE_CENTER + ld [wGameEvent], a + ld hl, wOverworldTransition + set 6, [hl] + jp IncreaseScriptPointerBy1 + +; prints text arg 1 or arg 2 depending on wScriptControlByte. +ScriptCommand_PrintVariableNPCText: + ld a, [wScriptControlByte] + or a + jr nz, .print_text + call GetScriptArgs3AfterPointer +.print_text + ld l, c + ld h, b + call Func_cc32 + jp IncreaseScriptPointerBy5 + +ScriptCommand_PrintTextForChallengeCup: + get_event_value EVENT_CHALLENGE_CUP_NUMBER + dec a + and %11 + add a + inc a + call GetScriptArgsAfterPointer + ld l, c + ld h, b + call Func_cc32 + jp IncreaseScriptPointerBy7 + +ScriptCommand_PrintVariableText: + ld a, [wScriptControlByte] + or a + jr nz, .print_text + call GetScriptArgs3AfterPointer +.print_text + ld l, c + ld h, b + call Func_c891 + jp IncreaseScriptPointerBy5 + +; Does not return to RST20 - pops an extra time to skip that. +ScriptCommand_PrintTextQuitFully: + ld l, c + ld h, b + call Func_cc32 + call CloseAdvancedDialogueBox + ld a, TRUE + ld [wBreakScriptLoop], a + call IncreaseScriptPointerBy3 + pop hl + ret + +ScriptCommand_UnloadActiveNPC: + ld a, [wScriptNPC] + ld [wLoadedNPCTempIndex], a +Func_cdd1: + farcall UnloadNPC + jp IncreaseScriptPointerBy1 + +ScriptCommand_UnloadChallengeHallNPC: + ld a, [wLoadedNPCTempIndex] + push af + ld a, [wTempNPC] + push af + ld a, [wChallengeHallNPC] + ld [wTempNPC], a + call FindLoadedNPC + call Func_cdd1 + pop af + ld [wTempNPC], a + pop af + ld [wLoadedNPCTempIndex], a + ret + +ScriptCommand_SetChallengeHallNPCCoords: + ld a, [wLoadedNPCTempIndex] + push af + ld a, [wTempNPC] + push af + ld a, [wChallengeHallNPC] + ld [wTempNPC], a + ld a, c + ld [wLoadNPCXPos], a + ld a, b + ld [wLoadNPCYPos], a + ld a, SOUTH + ld [wLoadNPCDirection], a + ld a, [wTempNPC] + farcall LoadNPCSpriteData + farcall LoadNPC + pop af + ld [wTempNPC], a + pop af + ld [wLoadedNPCTempIndex], a + jp IncreaseScriptPointerBy3 + +; Finds and executes an NPCMovement script in the table provided in bc +; based on the active NPC's current direction +ScriptCommand_MoveActiveNPCByDirection: + ld a, [wScriptNPC] + ld [wLoadedNPCTempIndex], a + farcall GetNPCDirection + rlca + add c + ld l, a + ld a, b + adc 0 + ld h, a + ld c, [hl] + inc hl + ld b, [hl] +; fallthrough + +; Moves an NPC given the list of directions pointed to by bc +; set bit 7 to only rotate the NPC +ExecuteNPCMovement: + farcall StartNPCMovement +.loop + call DoFrameIfLCDEnabled + farcall CheckIsAnNPCMoving + jr nz, .loop + jp IncreaseScriptPointerBy3 + +; Begin a series of NPC movements on the currently talking NPC +; based on the series of directions pointed to by bc +ScriptCommand_MoveActiveNPC: + ld a, [wScriptNPC] + ld [wLoadedNPCTempIndex], a + jr ExecuteNPCMovement + +; Begin a series of NPC movements on the Challenge Hall opponent NPC +; based on the series of directions pointed to by bc +ScriptCommand_MoveChallengeHallNPC: + ld a, [wLoadedNPCTempIndex] + push af + ld a, [wTempNPC] + push af + ld a, [wChallengeHallNPC] +; fallthrough + +; Executes movement on an arbitrary NPC using values in a and on the stack +; Changes and fixes Temp NPC using stack values +ExecuteArbitraryNPCMovementFromStack: + ld [wTempNPC], a + call FindLoadedNPC + call ExecuteNPCMovement + pop af + ld [wTempNPC], a + pop af + ld [wLoadedNPCTempIndex], a + ret + +ScriptCommand_MoveArbitraryNPC: + ld a, [wLoadedNPCTempIndex] + push af + ld a, [wTempNPC] + push af + ld a, c + push af + call GetScriptArgs2AfterPointer + push bc + call IncreaseScriptPointerBy1 + pop bc + pop af + jr ExecuteArbitraryNPCMovementFromStack + +ScriptCommand_CloseTextBox: + call CloseTextBox + jp IncreaseScriptPointerBy1 + +; args: booster pack index, booster pack index, booster pack index +ScriptCommand_GiveBoosterPacks: + xor a + ld [wAnotherBoosterPack], a + push bc + call Func_c2a3 + pop bc + push bc + ld a, c + farcall GiveBoosterPack + ld a, TRUE + ld [wAnotherBoosterPack], a + pop bc + ld a, b + cp NO_BOOSTER + jr z, .done + farcall GiveBoosterPack + call GetScriptArgs3AfterPointer + ld a, c + cp NO_BOOSTER + jr z, .done + farcall GiveBoosterPack +.done + call ReturnToOverworldNoCallback + jp IncreaseScriptPointerBy4 + +ScriptCommand_GiveOneOfEachTrainerBooster: + xor a + ld [wAnotherBoosterPack], a + call Func_c2a3 + ld hl, .booster_type_table +.loop + ld a, [hl] + cp NO_BOOSTER + jr z, .done + push hl + farcall GiveBoosterPack + ld a, TRUE + ld [wAnotherBoosterPack], a + pop hl + inc hl + jr .loop +.done + call ReturnToOverworldNoCallback + jp IncreaseScriptPointerBy1 + +.booster_type_table + db BOOSTER_COLOSSEUM_TRAINER + db BOOSTER_EVOLUTION_TRAINER + db BOOSTER_MYSTERY_TRAINER_COLORLESS + db BOOSTER_LABORATORY_TRAINER + db NO_BOOSTER ; $ff + +; Shows the card received screen for a given promotional card +; arg can either be the card, $00 for a wram card, or $ff for the 4 legendary cards +ScriptCommand_ShowCardReceivedScreen: + call Func_c2a3 + ld a, c + cp $ff + jr z, .legendary_card + or a + jr nz, .show_card + ld a, [wCardReceived] + +.show_card + push af + farcall Func_10000 + farcall FlashWhiteScreen + pop af + bank1call Func_7594 + call WhiteOutDMGPals + call DoFrameIfLCDEnabled + call ReturnToOverworldNoCallback + jp IncreaseScriptPointerBy2 + +.legendary_card + xor a + jr .show_card + +ScriptCommand_JumpIfCardOwned: + ld a, c + call GetCardCountInCollectionAndDecks + jr ScriptCommand_JumpIfCardInCollection.count_check + +ScriptCommand_JumpIfCardInCollection: + ld a, c + call GetCardCountInCollection + +.count_check + or a + jr nz, .pass_try_jump + +.fail + call SetScriptControlByteFail + jp IncreaseScriptPointerBy4 + +.pass_try_jump + call SetScriptControlBytePass + call GetScriptArgs2AfterPointer + jr z, .no_jump + jp SetScriptPointer + +.no_jump + jp IncreaseScriptPointerBy4 + +ScriptCommand_JumpIfEnoughCardsOwned: + push bc + call IncreaseScriptPointerBy1 + pop bc + call GetAmountOfCardsOwned + ld a, h + cp b + jr nz, .high_byte_not_equal + ld a, l + cp c + +.high_byte_not_equal + jr nc, ScriptCommand_JumpIfCardInCollection.pass_try_jump + jr ScriptCommand_JumpIfCardInCollection.fail + +; Gives the first arg as a card. If that's 0 pulls from wCardReceived +ScriptCommand_GiveCard: + ld a, c + or a + jr nz, .give_card + ld a, [wCardReceived] + +.give_card + call AddCardToCollection + jp IncreaseScriptPointerBy2 + +ScriptCommand_TakeCard: + ld a, c + call RemoveCardFromCollection + jp IncreaseScriptPointerBy2 + +ScriptCommand_JumpIfAnyEnergyCardsInCollection: + ld c, GRASS_ENERGY + ld b, 0 +.loop + ld a, c + call GetCardCountInCollection + add b + ld b, a + inc c + ld a, c + cp DOUBLE_COLORLESS_ENERGY + 1 + jr c, .loop + ld a, b + or a + jr nz, .pass_try_jump + +.fail + call SetScriptControlByteFail + jp IncreaseScriptPointerBy3 + +.pass_try_jump + call SetScriptControlBytePass + call GetScriptArgs1AfterPointer + jr z, .no_jump + jp SetScriptPointer + +.no_jump + jp IncreaseScriptPointerBy3 + +ScriptCommand_RemoveAllEnergyCardsFromCollection: + ld c, GRASS_ENERGY +.next_energy + push bc + ld a, c + call GetCardCountInCollection + jr c, .no_energy + ld b, a +.remove_loop + ld a, c + call RemoveCardFromCollection + dec b + jr nz, .remove_loop + +.no_energy + pop bc + inc c + ld a, c + cp DOUBLE_COLORLESS_ENERGY + 1 + jr c, .next_energy + jp IncreaseScriptPointerBy1 + +ScriptCommand_JumpBasedOnFightingClubPupilStatus: + ld c, 0 + get_event_value EVENT_PUPIL_MICHAEL_STATE + or a ; cp PUPIL_INACTIVE + jr z, .first_interaction + cp PUPIL_DEFEATED + jr c, .pupil1_not_defeated + inc c +.pupil1_not_defeated + get_event_value EVENT_PUPIL_CHRIS_STATE + cp PUPIL_DEFEATED + jr c, .pupil2_not_defeated + inc c +.pupil2_not_defeated + get_event_value EVENT_PUPIL_JESSICA_STATE + cp PUPIL_DEFEATED + jr c, .pupil3_not_defeated + inc c +.pupil3_not_defeated + ld a, c + rlca + add 3 + call GetScriptArgsAfterPointer + jp SetScriptPointer + +.first_interaction + call GetScriptArgs1AfterPointer + jp SetScriptPointer + +ScriptCommand_SetActiveNPCDirection: + ld a, [wScriptNPC] + ld [wLoadedNPCTempIndex], a + ld a, c + farcall Func_1c52e + jp IncreaseScriptPointerBy2 + +ScriptCommand_PickNextMan1RequestedCard: + get_event_value EVENT_MAN1_GIFTED_CARD_FLAGS + ld b, a +.choose_again + ld a, Man1RequestedCardsList.end - Man1RequestedCardsList + call Random + ld e, 1 + ld c, a + push bc + or a + jr z, .skip_shift +.shift_loop + sla e + dec c + jr nz, .shift_loop +.skip_shift + ld a, e + and b ; has this card already been chosen before? + pop bc + jr nz, .choose_again + ld a, e + or b + push bc + ld c, a + set_event_value EVENT_MAN1_GIFTED_CARD_FLAGS + pop bc + ld b, 0 + ld hl, Man1RequestedCardsList + add hl, bc + ld c, [hl] + set_event_value EVENT_MAN1_REQUESTED_CARD_ID + jp IncreaseScriptPointerBy1 + +Man1RequestedCardsList: + db GRAVELER + db OMASTAR + db PARASECT + db RAPIDASH + db WEEZING +.end + +ScriptCommand_LoadMan1RequestedCardIntoTxRamSlot: + sla c + ld b, 0 + ld hl, wTxRam2 + add hl, bc + push hl + get_event_value EVENT_MAN1_REQUESTED_CARD_ID + ld e, a + ld d, 0 + call GetCardName + pop hl + ld [hl], e + inc hl + ld [hl], d + jp IncreaseScriptPointerBy2 + +ScriptCommand_JumpIfMan1RequestedCardOwned: + get_event_value EVENT_MAN1_REQUESTED_CARD_ID + call GetCardCountInCollectionAndDecks + jp c, ScriptCommand_JumpIfAnyEnergyCardsInCollection.fail + jp ScriptCommand_JumpIfAnyEnergyCardsInCollection.pass_try_jump + +ScriptCommand_JumpIfMan1RequestedCardInCollection: + get_event_value EVENT_MAN1_REQUESTED_CARD_ID + call GetCardCountInCollection + jp c, ScriptCommand_JumpIfAnyEnergyCardsInCollection.fail + jp ScriptCommand_JumpIfAnyEnergyCardsInCollection.pass_try_jump + +ScriptCommand_RemoveMan1RequestedCardFromCollection: + get_event_value EVENT_MAN1_REQUESTED_CARD_ID + call RemoveCardFromCollection + jp IncreaseScriptPointerBy1 + +ScriptCommand_Jump: + call GetScriptArgs1AfterPointer + jp SetScriptPointer + +ScriptCommand_TryGiveMedalPCPacks: + call TryGiveMedalPCPacks + jp IncreaseScriptPointerBy1 + +ScriptCommand_SetPlayerDirection: + ld a, c + call UpdatePlayerDirection + jp IncreaseScriptPointerBy2 + +; arg1 - Direction (index in PlayerMovementOffsetTable_Tiles) +; arg2 - Tiles Moves (Speed) +ScriptCommand_MovePlayer: + ld a, c + ld [wd339], a + ld a, b + ld [wd33a], a + call StartScriptedMovement +.wait + call DoFrameIfLCDEnabled + call SetScreenScroll + call Func_c53d + ld a, [wPlayerCurrentlyMoving] + and $03 + jr nz, .wait + call DoFrameIfLCDEnabled + call SetScreenScroll + jp IncreaseScriptPointerBy3 + +ScriptCommand_SetDialogNPC: + ld a, c + farcall SetNPCDialogName + jp IncreaseScriptPointerBy2 + +ScriptCommand_SetNextNPCAndScript: + ld a, c + ld [wTempNPC], a + call GetScriptArgs2AfterPointer + call SetNextNPCAndScript + jp IncreaseScriptPointerBy4 + +ScriptCommand_SetSpriteAttributes: + ld a, [wScriptNPC] + ld [wLoadedNPCTempIndex], a + push bc + call GetScriptArgs3AfterPointer + ld a, [wScriptNPC] + ld l, LOADED_NPC_FLAGS + call GetItemInLoadedNPCIndex + res NPC_FLAG_DIRECTIONLESS_F, [hl] + ld a, [hl] + or c + ld [hl], a + pop bc + ld e, c + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .not_cgb + ld e, b +.not_cgb + ld a, e + farcall SetNPCAnimation + jp IncreaseScriptPointerBy4 + +ScriptCommand_SetActiveNPCCoords: + ld a, [wScriptNPC] + ld [wLoadedNPCTempIndex], a + ld a, c + ld c, b + ld b, a + farcall SetNPCPosition + jp IncreaseScriptPointerBy3 + +ScriptCommand_DoFrames: + push bc + call DoFrameIfLCDEnabled + pop bc + dec c + jr nz, ScriptCommand_DoFrames + jp IncreaseScriptPointerBy2 + +ScriptCommand_JumpIfActiveNPCCoordsMatch: + ld a, [wScriptNPC] + ld [wLoadedNPCTempIndex], a + ld d, c + ld e, b + farcall GetNPCPosition + ld a, e + cp c + jp nz, ScriptCommand_JumpIfEventEqual.fail + ld a, d + cp b + jp nz, ScriptCommand_JumpIfEventEqual.fail + jp ScriptCommand_JumpIfEventEqual.pass_try_jump + +ScriptCommand_JumpIfPlayerCoordsMatch: + ld a, [wPlayerXCoord] + cp c + jp nz, ScriptCommand_JumpIfEventEqual.fail + ld a, [wPlayerYCoord] + cp b + jp nz, ScriptCommand_JumpIfEventEqual.fail + jp ScriptCommand_JumpIfEventEqual.pass_try_jump + +ScriptCommand_JumpIfNPCLoaded: + ld a, [wLoadedNPCTempIndex] + push af + ld a, [wTempNPC] + push af + ld a, c + ld [wTempNPC], a + call FindLoadedNPC + jr c, .not_loaded + call ScriptCommand_JumpIfEventTrue.pass_try_jump + jr .done + +.not_loaded + call ScriptCommand_JumpIfEventFalse.fail + +.done + pop af + ld [wTempNPC], a + pop af + ld [wLoadedNPCTempIndex], a + ret + +ScriptCommand_ShowMedalReceivedScreen: + ld a, c + push af + call Func_c2a3 + pop af + farcall ShowMedalReceivedScreen + call ReturnToOverworldNoCallback + jp IncreaseScriptPointerBy2 + +ScriptCommand_LoadCurrentMapNameIntoTxRamSlot: + sla c + ld b, 0 + ld hl, wTxRam2 + add hl, bc + push hl + ld a, [wOverworldMapSelection] + rlca + ld c, a + ld b, 0 + ld hl, MapNames - 2 + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + pop hl + ld [hl], e + inc hl + ld [hl], d + jp IncreaseScriptPointerBy2 + +MapNames: + tx MasonLaboratoryMapNameText + tx MrIshiharasHouseMapNameText + tx FightingClubMapNameText + tx RockClubMapNameText + tx WaterClubMapNameText + tx LightningClubMapNameText + tx GrassClubMapNameText + tx PsychicClubMapNameText + tx ScienceClubMapNameText + tx FireClubMapNameText + tx ChallengeHallMapNameText + tx PokemonDomeMapNameText + +ScriptCommand_LoadChallengeHallNPCIntoTxRamSlot: + ld hl, wCurrentNPCNameTx + ld e, [hl] + inc hl + ld d, [hl] + push de + sla c + ld b, 0 + ld hl, wTxRam2 + add hl, bc + push hl + ld a, [wChallengeHallNPC] + farcall SetNPCDialogName + pop hl + ld a, [wCurrentNPCNameTx] + ld [hli], a + ld a, [wCurrentNPCNameTx + 1] + ld [hl], a + pop de + ld hl, wCurrentNPCNameTx + ld [hl], e + inc hl + ld [hl], d + jp IncreaseScriptPointerBy2 + +ScriptCommand_PickChallengeHallOpponent: + ld a, [wTempNPC] + push af + get_event_value EVENT_CHALLENGE_CUP_OPPONENT_NUMBER + inc a + ld c, a + set_event_value EVENT_CHALLENGE_CUP_OPPONENT_NUMBER + call Func_f580 + pop af + ld [wTempNPC], a + jp IncreaseScriptPointerBy1 + +ScriptCommand_OpenMenu: + call PauseMenu + jp IncreaseScriptPointerBy1 + +ScriptCommand_PickChallengeCupPrizeCard: + get_event_value EVENT_CHALLENGE_CUP_NUMBER + dec a + cp 2 + jr c, .first_or_second_cup + ld a, (ChallengeCupPrizeCards.end - ChallengeCupPrizeCards) / 3 - 2 + call Random + add 2 +.first_or_second_cup + ld hl, ChallengeCupPrizeCards +.get_card_from_list + ld e, a + add a + add e + ld e, a + ld d, 0 + add hl, de + ld a, [hli] + ld [wCardReceived], a + ld a, [hli] + ld [wTxRam2], a + ld a, [hl] + ld [wTxRam2 + 1], a + jp IncreaseScriptPointerBy1 + +ChallengeCupPrizeCards: + db MEWTWO2 + tx MewtwoTradeCardName + + db MEW1 + tx MewTradeCardName + + db ARCANINE1 + tx ArcanineTradeCardName + + db PIKACHU3 + tx PikachuTradeCardName + + db PIKACHU4 + tx PikachuTradeCardName + + db SURFING_PIKACHU1 + tx SurfingPikachuTradeCardName + + db SURFING_PIKACHU2 + tx SurfingPikachuTradeCardName + + db ELECTABUZZ1 + tx ElectabuzzTradeCardName + + db SLOWPOKE1 + tx SlowpokeTradeCardName + + db MEWTWO3 + tx MewtwoTradeCardName + + db MEWTWO2 + tx MewtwoTradeCardName + + db MEW1 + tx MewTradeCardName + + db JIGGLYPUFF1 + tx JigglypuffTradeCardName + + db SUPER_ENERGY_RETRIEVAL + tx SuperEnergyRetrievalTradeCardName + + db FLYING_PIKACHU + tx FlyingPikachuTradeCardName +.end + +ScriptCommand_PickLegendaryCard: + get_event_value EVENT_LEGENDARY_CARDS_RECEIVED_FLAGS + ld e, a +.new_random + call UpdateRNGSources + ld d, %00001000 + and %11 + ld c, a + ld b, a +.loop + jr z, .done + srl d + dec b + jr .loop +.done + ld a, d + and e ; has this legendary been given already? + jr nz, .new_random + push bc + ld b, 0 + ld hl, LegendaryCardEvents + add hl, bc + ld a, [hl] + call MaxOutEventValue ; also modifies EVENT_LEGENDARY_CARDS_RECEIVED_FLAGS + pop bc + ld hl, LegendaryCards + ld a, c + jr ScriptCommand_PickChallengeCupPrizeCard.get_card_from_list + +LegendaryCards: + db ZAPDOS3 + tx ZapdosLegendaryCardName + + db MOLTRES2 + tx MoltresLegendaryCardName + + db ARTICUNO2 + tx ArticunoLegendaryCardName + + db DRAGONITE1 + tx DragoniteLegendaryCardName + +LegendaryCardEvents: + db EVENT_RECEIVED_ZAPDOS + db EVENT_RECEIVED_MOLTRES + db EVENT_RECEIVED_ARTICUNO + db EVENT_RECEIVED_DRAGONITE + +ScriptCommand_ReplaceMapBlocks: + ld a, c + farcall Func_80ba4 + jp IncreaseScriptPointerBy2 + +ScriptCommand_ChooseDeckToDuelAgainstMultichoice: + ld hl, .multichoice_menu_args + xor a + call ShowMultichoiceTextbox + ld a, [wMultichoiceTextboxResult_ChooseDeckToDuelAgainst] + ld c, a + set_event_value EVENT_AARON_DECK_MENU_CHOICE + jp IncreaseScriptPointerBy1 + +.multichoice_menu_args ; d25e + dw NULL ; NPC title for textbox under menu + tx SelectDeckToDuelText ; text for textbox under menu + dw MultichoiceTextbox_ConfigTable_ChooseDeckToDuelAgainst ; location of table configuration in bank 4 + db AARON_DECK_MENU_CANCEL ; the value to return when b is pressed + dw wMultichoiceTextboxResult_ChooseDeckToDuelAgainst ; ram location to return result into + dw .text_entries ; location of table containing text entries + +.text_entries ; d269 + tx LightningAndFireDeckChoiceText + tx WaterAndFightingDeckChoiceText + tx GrassAndPsychicDeckChoiceText + + dw NULL + +ScriptCommand_ChooseStarterDeckMultichoice: + ld hl, .multichoice_menu_args + xor a + call ShowMultichoiceTextbox + jp IncreaseScriptPointerBy1 + +.multichoice_menu_args ; d27b + dw NULL ; NPC title for textbox under menu + tx SelectDeckToTakeText ; text for textbox under menu + dw MultichoiceTextbox_ConfigTable_ChooseDeckStarterDeck ; location of table configuration in bank 4 + db $00 ; the value to return when b is pressed + dw wStarterDeckChoice ; ram location to return result into + dw .text_entries ; location of table containing text entries + +.text_entries + tx CharmanderAndFriendsDeckChoiceText + tx SquirtleAndFriendsDeckChoiceText + tx BulbasaurAndFriendsDeckChoiceText + +; displays a textbox with multiple choices and a cursor. +; takes as an argument in h1 a pointer to a table +; dw text id for NPC title for textbox under menu +; dw text id for textbox under menu +; dw location of table configuration in bank 4 +; db the value to return when b is pressed +; dw ram location to return result into +; dw location of table containing text entries (optional) + +ShowMultichoiceTextbox: + ld [wd416], a + push hl + call Func_c241 + call Func_c915 + call DoFrameIfLCDEnabled + pop hl + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + push hl + ld h, [hl] + ld l, a + or h + jr z, .no_text + call Func_c8ba +.no_text + ld a, 1 << AUTO_CLOSE_TEXTBOX + call SetOverworldNPCFlags + pop hl + inc hl + ld a, [hli] + push hl + ld h, [hl] + ld l, a + ld a, [wd416] + farcall InitAndPrintPauseMenu + pop hl + inc hl + ld a, [hli] + ld [wd417], a + push hl + +.wait_input + call DoFrameIfLCDEnabled + call HandleMenuInput + jr nc, .wait_input + ld a, [hCurMenuItem] + cp e + jr z, .got_result + ld a, [wd417] + or a + jr z, .wait_input + ld e, a + ld [hCurMenuItem], a + +.got_result + pop hl + ld a, [hli] + push hl + ld h, [hl] + ld l, a + ld a, e + ld [hl], a ; store result + add a + ld c, a + ld b, $0 + pop hl + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + or h + jr z, .no_text_2 + add hl, bc + ld a, [hli] + ld [wTxRam2], a + ld a, [hl] + ld [wTxRam2 + 1], a +.no_text_2 + ret + +ScriptCommand_ShowSamNormalMultichoice: + ld hl, .multichoice_menu_args + xor a + call ShowMultichoiceTextbox + ld a, [wMultichoiceTextboxResult_Sam] + ld c, a + set_event_value EVENT_SAM_MENU_CHOICE + xor a + ld [wMultichoiceTextboxResult_Sam], a + jp IncreaseScriptPointerBy1 + +.multichoice_menu_args ; d30c + tx SamNPCName ; NPC title for textbox under menu + tx HowCanIHelpText ; text for textbox under menu + dw SamNormalMultichoice_ConfigurationTable ; location of table configuration in bank 4 + db SAM_MENU_NOTHING ; the value to return when b is pressed + dw wMultichoiceTextboxResult_Sam ; ram location to return result into + dw NULL ; location of table containing text entries + +ScriptCommand_ShowSamRulesMultichoice: + ld hl, .multichoice_menu_args + ld a, [wMultichoiceTextboxResult_Sam] + call ShowMultichoiceTextbox + ld a, [wMultichoiceTextboxResult_Sam] + ld c, a + set_event_value EVENT_SAM_MENU_CHOICE + jp IncreaseScriptPointerBy1 + +.multichoice_menu_args + dw NULL ; NPC title for textbox under menu + dw NULL ; text for textbox under menu + dw SamRulesMultichoice_ConfigurationTable ; location of table configuration in bank 4 + db SAM_MENU_NOTHING_TO_ASK ; the value to return when b is pressed + dw wMultichoiceTextboxResult_Sam ; ram location to return result into + dw NULL ; location of table containing text entries + +ScriptCommand_OpenDeckMachine: + push bc + call Func_c2a3 + call PauseSong + ld a, MUSIC_DECK_MACHINE + call PlaySong + call EmptyScreen + xor a + ldh [hSCX], a + ldh [hSCY], a + farcall Func_1288c + call EnableLCD + pop bc + ld a, c + or a + jr z, .asm_d360 + dec a + ld [wCurAutoDeckMachine], a + farcall HandleAutoDeckMenu + jr .asm_d364 +.asm_d360 + farcall HandleDeckSaveMachineMenu +.asm_d364 + call ResumeSong + call ReturnToOverworldNoCallback + jp IncreaseScriptPointerBy2 + +; args: unused, room, new player x, new player y, new player direction +ScriptCommand_EnterMap: + ld a, [wScriptPointer] + ld l, a + ld a, [wScriptPointer + 1] + ld h, a + inc hl + ld a, [hli] + ld a, [hli] + ld [wTempMap], a + ld a, [hli] + ld [wTempPlayerXCoord], a + ld a, [hli] + ld [wTempPlayerYCoord], a + ld a, [hli] + ld [wTempPlayerDirection], a + ld hl, wOverworldTransition + set 4, [hl] + jp IncreaseScriptPointerBy6 + +ScriptCommand_FlashScreen: + farcall Func_10c96 + jp IncreaseScriptPointerBy2 + +ScriptCommand_SaveGame: + farcall _SaveGame + jp IncreaseScriptPointerBy2 + +ScriptCommand_GiftCenter: + ld a, c + or a + jr nz, .load_gift_center + ; show menu + farcall Func_10dba + ld c, a + set_event_value EVENT_GIFT_CENTER_MENU_CHOICE + jr .done + +.load_gift_center + ld a, GAME_EVENT_GIFT_CENTER + ld [wGameEvent], a + ld hl, wOverworldTransition + set 6, [hl] +.done + jp IncreaseScriptPointerBy2 + +ScriptCommand_PlayCredits: + call GetReceivedLegendaryCards + ld a, GAME_EVENT_CREDITS + ld [wGameEvent], a + ld hl, wOverworldTransition + set 6, [hl] + jp IncreaseScriptPointerBy1 + +ScriptCommand_TryGivePCPack: + ld a, c + farcall TryGivePCPack + jp IncreaseScriptPointerBy2 + +ScriptCommand_nop: + jp IncreaseScriptPointerBy1 + +ScriptCommand_GiveStarterDeck: + ld a, [wStarterDeckChoice] + bank1call Func_7576 + jp IncreaseScriptPointerBy1 + +Unknown_d3dd: + db $03, $05, $07 + +ScriptCommand_WalkPlayerToMasonLaboratory: + ld a, OWMAP_MASON_LABORATORY + ld [wOverworldMapSelection], a + farcall OverworldMap_BeginPlayerMovement +.asm_d3e9 + call DoFrameIfLCDEnabled + farcall OverworldMap_UpdatePlayerWalkingAnimation + ld a, [wOverworldMapPlayerAnimationState] + cp $2 + jr nz, .asm_d3e9 + farcall OverworldMap_PrintMapName + jp IncreaseScriptPointerBy1 + +ScriptCommand_OverrideSong: + ld a, c + ld [wSongOverride], a + call PlaySong + jp IncreaseScriptPointerBy2 + +ScriptCommand_SetDefaultSong: + ld a, c + ld [wDefaultSong], a + jp IncreaseScriptPointerBy2 + +ScriptCommand_PlaySong: + ld a, c + call ScriptPlaySong + jp IncreaseScriptPointerBy2 + +ScriptCommand_PlaySFX: + ld a, c + call PlaySFX + jp IncreaseScriptPointerBy2 + +ScriptCommand_PlayDefaultSong: + call PlayDefaultSong + jp IncreaseScriptPointerBy1 + +ScriptCommand_PauseSong: + call PauseSong + jp IncreaseScriptPointerBy1 + +ScriptCommand_ResumeSong: + call ResumeSong + jp IncreaseScriptPointerBy1 + +ScriptCommand_WaitForSongToFinish: + call WaitForSongToFinish + jp IncreaseScriptPointerBy1 + +ScriptCommand_RecordMasterWin: + ld a, c + farcall AddMasterBeatenToList + jp IncreaseScriptPointerBy2 + +ScriptCommand_ChallengeMachine: + ld a, GAME_EVENT_CHALLENGE_MACHINE + ld [wGameEvent], a + ld hl, wOverworldTransition + set 6, [hl] + jp IncreaseScriptPointerBy1 + +; sets the event var in arg 1 to the value in arg 2 +ScriptCommand_SetEventValue: + ld a, c + ld c, b + call SetEventValue + jp IncreaseScriptPointerBy3 + +ScriptCommand_IncrementEventValue: + ld a, c + push af + call GetEventValue + inc a + ld c, a + pop af + call SetEventValue + jp IncreaseScriptPointerBy2 + +ScriptCommand_JumpIfEventZero: + ld a, c + call GetEventValue + or a + jr z, .pass_try_jump + +.fail + call SetScriptControlByteFail + jp IncreaseScriptPointerBy4 + +.pass_try_jump + call SetScriptControlBytePass + call GetScriptArgs2AfterPointer + jr z, .no_jump + jp SetScriptPointer + +.no_jump + jp IncreaseScriptPointerBy4 + +ScriptCommand_JumpIfEventNonzero: + ld a, c + call GetEventValue + or a + jr nz, ScriptCommand_JumpIfEventZero.pass_try_jump + jr ScriptCommand_JumpIfEventZero.fail + +; args - event var, value, jump address +ScriptCommand_JumpIfEventEqual: + call GetEventValueBC + cp c + jr z, .pass_try_jump + +.fail + call SetScriptControlByteFail + jp IncreaseScriptPointerBy5 + +.pass_try_jump + call SetScriptControlBytePass + call GetScriptArgs3AfterPointer + jr z, .no_jump + jp SetScriptPointer + +.no_jump + jp IncreaseScriptPointerBy5 + +ScriptCommand_JumpIfEventNotEqual: + call GetEventValueBC + cp c + jr nz, ScriptCommand_JumpIfEventEqual.pass_try_jump + jr ScriptCommand_JumpIfEventEqual.fail + +ScriptCommand_JumpIfEventGreaterOrEqual: + call GetEventValueBC + cp c + jr nc, ScriptCommand_JumpIfEventEqual.pass_try_jump + jr ScriptCommand_JumpIfEventEqual.fail + +ScriptCommand_JumpIfEventLessThan: + call GetEventValueBC + cp c + jr c, ScriptCommand_JumpIfEventEqual.pass_try_jump + jr ScriptCommand_JumpIfEventEqual.fail + +; Gets event value at c (Script defaults) +; c takes on the value of b as a side effect +GetEventValueBC: + ld a, c + ld c, b + call GetEventValue + ret + +ScriptCommand_MaxOutEventValue: + ld a, c + call MaxOutEventValue + jp IncreaseScriptPointerBy2 + +ScriptCommand_ZeroOutEventValue: + ld a, c + call ZeroOutEventValue + jp IncreaseScriptPointerBy2 + +ScriptCommand_JumpIfEventTrue: + ld a, c + call GetEventValue + or a + jr z, ScriptCommand_JumpIfEventFalse.fail + +.pass_try_jump + call SetScriptControlBytePass + call GetScriptArgs2AfterPointer + jr z, .no_jump + jp SetScriptPointer + +.no_jump + jp IncreaseScriptPointerBy4 + +ScriptCommand_JumpIfEventFalse: + ld a, c + call GetEventValue + or a + jr z, ScriptCommand_JumpIfEventTrue.pass_try_jump + +.fail + call SetScriptControlByteFail + jp IncreaseScriptPointerBy4 + +LoadOverworld: + call Func_d4fb + get_event_value EVENT_MASON_LAB_STATE + or a + ret nz + ld bc, Script_BeginGame + jp SetNextScript + +Func_d4fb: + set_event_false EVENT_PLAYER_ENTERED_CHALLENGE_CUP + call Func_f602 + get_event_value EVENT_CHALLENGE_CUP_1_STATE + cp CHALLENGE_CUP_WON + jr z, .close_challenge_cup_one + get_event_value EVENT_CHALLENGE_CUP_2_STATE + cp CHALLENGE_CUP_WON + jr z, .close_challenge_cup_two + get_event_value EVENT_CHALLENGE_CUP_3_STATE + cp CHALLENGE_CUP_WON + jr z, .close_challenge_cup_three + ret + +.close_challenge_cup_three + ld c, CHALLENGE_CUP_OVER + set_event_value EVENT_CHALLENGE_CUP_3_STATE +.close_challenge_cup_two + ld c, CHALLENGE_CUP_OVER + set_event_value EVENT_CHALLENGE_CUP_2_STATE +.close_challenge_cup_one + ld c, CHALLENGE_CUP_OVER + set_event_value EVENT_CHALLENGE_CUP_1_STATE + ret + +INCLUDE "scripts/mason_laboratory.asm" +INCLUDE "scripts/deck_machine_room.asm" + +INCLUDE "scripts/ishiharas_house.asm" + +INCLUDE "scripts/fighting_club_entrance.asm" +INCLUDE "scripts/fighting_club_lobby.asm" +INCLUDE "scripts/fighting_club.asm" + +INCLUDE "scripts/rock_club_entrance.asm" +INCLUDE "scripts/rock_club_lobby.asm" +INCLUDE "scripts/rock_club.asm" + +INCLUDE "scripts/water_club_entrance.asm" +INCLUDE "scripts/water_club_lobby.asm" +INCLUDE "scripts/water_club.asm" + +INCLUDE "scripts/lightning_club_entrance.asm" +INCLUDE "scripts/lightning_club_lobby.asm" +INCLUDE "scripts/lightning_club.asm" + +INCLUDE "scripts/grass_club_entrance.asm" +INCLUDE "scripts/grass_club_lobby.asm" +INCLUDE "scripts/grass_club.asm" + +INCLUDE "scripts/psychic_club_entrance.asm" +INCLUDE "scripts/psychic_club_lobby.asm" +INCLUDE "scripts/psychic_club.asm" + +INCLUDE "scripts/science_club_entrance.asm" +INCLUDE "scripts/science_club_lobby.asm" +INCLUDE "scripts/science_club.asm" + +INCLUDE "scripts/fire_club_entrance.asm" +INCLUDE "scripts/fire_club_lobby.asm" +INCLUDE "scripts/fire_club.asm" + +INCLUDE "scripts/challenge_hall_entrance.asm" +INCLUDE "scripts/challenge_hall_lobby.asm" +INCLUDE "scripts/challenge_hall.asm" + +INCLUDE "scripts/pokemon_dome_entrance.asm" +INCLUDE "scripts/pokemon_dome.asm" +INCLUDE "scripts/hall_of_honor.asm" + +INCLUDE "scripts/battle_center.asm" +INCLUDE "scripts/gift_center.asm" |