diff options
Diffstat (limited to 'engine/overworld/scripting.asm')
-rw-r--r-- | engine/overworld/scripting.asm | 2673 |
1 files changed, 2673 insertions, 0 deletions
diff --git a/engine/overworld/scripting.asm b/engine/overworld/scripting.asm new file mode 100644 index 00000000..7c5bfe55 --- /dev/null +++ b/engine/overworld/scripting.asm @@ -0,0 +1,2673 @@ +; Event scripting commands. + +EnableScriptMode:: + push af + ld a, SCRIPT_READ + ld [wScriptMode], a + pop af + ret + +ScriptEvents:: + call StartScript +.loop + ld a, [wScriptMode] + ld hl, .modes + rst JumpTable + call CheckScript + jr nz, .loop + ret + +.modes + dw EndScript + dw RunScriptCommand + dw WaitScriptMovement + dw WaitScript + +EndScript: + call StopScript + ret + +WaitScript: + call StopScript + + ld hl, wScriptDelay + dec [hl] + ret nz + + farcall Function582f + + ld a, SCRIPT_READ + ld [wScriptMode], a + call StartScript + ret + +WaitScriptMovement: + call StopScript + + ld hl, wVramState + bit 7, [hl] + ret nz + + farcall Function582f + + ld a, SCRIPT_READ + ld [wScriptMode], a + call StartScript + ret + +RunScriptCommand: + call GetScriptByte + ld hl, ScriptCommandTable + rst JumpTable + ret + +ScriptCommandTable: +; entries correspond to macros/scripts/events.asm enumeration + dw Script_scall ; 00 + dw Script_farscall ; 01 + dw Script_memcall ; 02 + dw Script_sjump ; 03 + dw Script_farsjump ; 04 + dw Script_memjump ; 05 + dw Script_ifequal ; 06 + dw Script_ifnotequal ; 07 + dw Script_iffalse ; 08 + dw Script_iftrue ; 09 + dw Script_ifgreater ; 0a + dw Script_ifless ; 0b + dw Script_jumpstd ; 0c + dw Script_callstd ; 0d + dw Script_callasm ; 0e + dw Script_special ; 0f + dw Script_memcallasm ; 10 + dw Script_checkmapscene ; 11 + dw Script_setmapscene ; 12 + dw Script_checkscene ; 13 + dw Script_setscene ; 14 + dw Script_setval ; 15 + dw Script_addval ; 16 + dw Script_random ; 17 + dw Script_checkver ; 18 + dw Script_readmem ; 19 + dw Script_writemem ; 1a + dw Script_loadmem ; 1b + dw Script_readvar ; 1c + dw Script_writevar ; 1d + dw Script_loadvar ; 1e + dw Script_giveitem ; 1f + dw Script_takeitem ; 20 + dw Script_checkitem ; 21 + dw Script_givemoney ; 22 + dw Script_takemoney ; 23 + dw Script_checkmoney ; 24 + dw Script_givecoins ; 25 + dw Script_takecoins ; 26 + dw Script_checkcoins ; 27 + dw Script_addcellnum ; 28 + dw Script_delcellnum ; 29 + dw Script_checkcellnum ; 2a + dw Script_checktime ; 2b + dw Script_checkpoke ; 2c + dw Script_givepoke ; 2d + dw Script_giveegg ; 2e + dw Script_givepokemail ; 2f + dw Script_checkpokemail ; 30 + dw Script_checkevent ; 31 + dw Script_clearevent ; 32 + dw Script_setevent ; 33 + dw Script_checkflag ; 34 + dw Script_clearflag ; 35 + dw Script_setflag ; 36 + dw Script_wildon ; 37 + dw Script_wildoff ; 38 + dw Script_xycompare ; 39 + dw Script_warpmod ; 3a + dw Script_blackoutmod ; 3b + dw Script_warp ; 3c + dw Script_getmoney ; 3d + dw Script_getcoins ; 3e + dw Script_getnum ; 3f + dw Script_getmonname ; 40 + dw Script_getitemname ; 41 + dw Script_getcurlandmarkname ; 42 + dw Script_gettrainername ; 43 + dw Script_getstring ; 44 + dw Script_itemnotify ; 45 + dw Script_pocketisfull ; 46 + dw Script_opentext ; 47 + dw Script_refreshscreen ; 48 + dw Script_closetext ; 49 + dw Script_writeunusedbytebuffer ; 4a + dw Script_farwritetext ; 4b + dw Script_writetext ; 4c + dw Script_repeattext ; 4d + dw Script_yesorno ; 4e + dw Script_loadmenu ; 4f + dw Script_closewindow ; 50 + dw Script_jumptextfaceplayer ; 51 + dw Script_jumptext ; 52 + dw Script_waitbutton ; 53 + dw Script_promptbutton ; 54 + dw Script_pokepic ; 55 + dw Script_closepokepic ; 56 + dw Script__2dmenu ; 57 + dw Script_verticalmenu ; 58 + dw Script_loadpikachudata ; 59 + dw Script_randomwildmon ; 5a + dw Script_loadtemptrainer ; 5b + dw Script_loadwildmon ; 5c + dw Script_loadtrainer ; 5d + dw Script_startbattle ; 5e + dw Script_reloadmapafterbattle ; 5f + dw Script_catchtutorial ; 60 + dw Script_trainertext ; 61 + dw Script_trainerflagaction ; 62 + dw Script_winlosstext ; 63 + dw Script_scripttalkafter ; 64 + dw Script_endifjustbattled ; 65 + dw Script_checkjustbattled ; 66 + dw Script_setlasttalked ; 67 + dw Script_applymovement ; 68 + dw Script_applymovementlasttalked ; 69 + dw Script_faceplayer ; 6a + dw Script_faceobject ; 6b + dw Script_variablesprite ; 6c + dw Script_disappear ; 6d + dw Script_appear ; 6e + dw Script_follow ; 6f + dw Script_stopfollow ; 70 + dw Script_moveobject ; 71 + dw Script_writeobjectxy ; 72 + dw Script_loademote ; 73 + dw Script_showemote ; 74 + dw Script_turnobject ; 75 + dw Script_follownotexact ; 76 + dw Script_earthquake ; 77 + dw Script_changemapblocks ; 78 + dw Script_changeblock ; 79 + dw Script_reloadmap ; 7a + dw Script_reloadmappart ; 7b + dw Script_writecmdqueue ; 7c + dw Script_delcmdqueue ; 7d + dw Script_playmusic ; 7e + dw Script_encountermusic ; 7f + dw Script_musicfadeout ; 80 + dw Script_playmapmusic ; 81 + dw Script_dontrestartmapmusic ; 82 + dw Script_cry ; 83 + dw Script_playsound ; 84 + dw Script_waitsfx ; 85 + dw Script_warpsound ; 86 + dw Script_specialsound ; 87 + dw Script_autoinput ; 88 + dw Script_newloadmap ; 89 + dw Script_pause ; 8a + dw Script_deactivatefacing ; 8b + dw Script_prioritysjump ; 8c + dw Script_warpcheck ; 8d + dw Script_stopandsjump ; 8e + dw Script_return ; 8f + dw Script_end ; 90 + dw Script_reloadandreturn ; 91 + dw Script_endall ; 92 + dw Script_pokemart ; 93 + dw Script_elevator ; 94 + dw Script_trade ; 95 + dw Script_askforphonenumber ; 96 + dw Script_phonecall ; 97 + dw Script_hangup ; 98 + dw Script_describedecoration ; 99 + dw Script_fruittree ; 9a + dw Script_specialphonecall ; 9b + dw Script_checkphonecall ; 9c + dw Script_verbosegiveitem ; 9d + dw Script_swarm ; 9e + dw Script_halloffame ; 9f + dw Script_credits ; a0 + dw Script_warpfacing ; a1 + +StartScript: + ld hl, wScriptFlags + set SCRIPT_RUNNING, [hl] + ret + +CheckScript: + ld hl, wScriptFlags + bit SCRIPT_RUNNING, [hl] + ret + +StopScript: + ld hl, wScriptFlags + res SCRIPT_RUNNING, [hl] + ret + +Script_callasm: +; script command 0xe +; parameters: asm + + call GetScriptByte + ld b, a + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, b + rst FarCall + ret + +Script_special: +; script command 0xf +; parameters: predefined_script + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + farcall Special + ret + +Script_memcallasm: +; script command 0x10 +; parameters: asm + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld b, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ld a, b + rst FarCall + ret + +Script_jumptextfaceplayer: +; script command 0x51 +; parameters: text_pointer + + ld a, [wScriptBank] + ld [wScriptTextBank], a + call GetScriptByte + ld [wScriptTextAddr], a + call GetScriptByte + ld [wScriptTextAddr + 1], a + ld b, BANK(JumpTextFacePlayerScript) + ld hl, JumpTextFacePlayerScript + jp ScriptJump + +Script_jumptext: +; script command 0x52 +; parameters: text_pointer + + ld a, [wScriptBank] + ld [wScriptTextBank], a + call GetScriptByte + ld [wScriptTextAddr], a + call GetScriptByte + ld [wScriptTextAddr + 1], a + ld b, BANK(JumpTextScript) + ld hl, JumpTextScript + jp ScriptJump + +JumpTextFacePlayerScript: + faceplayer +JumpTextScript: + opentext + repeattext -1, -1 + waitbutton + closetext + end + +Script_writetext: +; script command 0x4c +; parameters: text_pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptBank] + ld b, a + call MapTextbox + ret + +Script_farwritetext: +; script command 0x4b +; parameters: text_pointer + + call GetScriptByte + ld b, a + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + call MapTextbox + ret + +Script_repeattext: +; script command 0x4d +; parameters: byte, byte + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + cp -1 + jr nz, .done + ld a, l + cp -1 + jr nz, .done + ld hl, wScriptTextBank + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a + call MapTextbox + ret + +.done + ret + +Script_waitbutton: +; script command 0x53 + + jp WaitButton + +Script_promptbutton: +; script command 0x54 + + ldh a, [hOAMUpdate] + push af + ld a, $1 + ldh [hOAMUpdate], a + call WaitBGMap + call PromptButton + pop af + ldh [hOAMUpdate], a + ret + +Script_yesorno: +; script command 0x4e + + call YesNoBox + ld a, FALSE + jr c, .no + ld a, TRUE +.no + ld [wScriptVar], a + ret + +Script_loadmenu: +; script command 0x4f +; parameters: menu_header + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld de, LoadMenuHeader + ld a, [wScriptBank] + call Call_a_de + call UpdateSprites + ret + +Script_closewindow: +; script command 0x50 + + call CloseWindow + call UpdateSprites + ret + +Script_pokepic: +; script command 0x55 +; parameters: pokemon + + call GetScriptByte + and a + jr nz, .ok + ld a, [wScriptVar] +.ok + ld [wCurPartySpecies], a + farcall Pokepic + ret + +Script_closepokepic: +; script command 0x56 + + farcall ClosePokepic + ret + +Script_verticalmenu: +; script command 0x58 + + ld a, [wScriptBank] + ld hl, VerticalMenu + rst FarCall + ld a, [wMenuCursorY] + jr nc, .ok + xor a +.ok + ld [wScriptVar], a + ret + +Script__2dmenu: +; script command 0x57 + + ld a, [wScriptBank] + ld hl, _2DMenu + rst FarCall + ld a, [wMenuCursorBuffer] + jr nc, .ok + xor a +.ok + ld [wScriptVar], a + ret + +Script_verbosegiveitem: +; script command 0x9d +; parameters: item, quantity + + call Script_giveitem + call CurItemName + ld de, wStringBuffer1 + ld a, STRING_BUFFER_4 + call CopyConvertedText + ld b, BANK(GiveItemScript) + ld de, GiveItemScript + jp ScriptCall + +ret_96f76: + ret + +GiveItemScript: + callasm ret_96f76 + writetext ReceivedItemText + iffalse .Full + waitsfx + specialsound + waitbutton + itemnotify + end + +.Full: + promptbutton + pocketisfull + end + +ReceivedItemText: + text_far _ReceivedItemText + text_end + +Script_itemnotify: +; script command 0x45 + + call GetPocketName + call CurItemName + ld b, BANK(PutItemInPocketText) + ld hl, PutItemInPocketText + call MapTextbox + ret + +Script_pocketisfull: +; script command 0x46 + + call GetPocketName + call CurItemName + ld b, BANK(PocketIsFullText) + ld hl, PocketIsFullText + call MapTextbox + ret + +Script_specialsound: +; script command 0x87 + + farcall CheckItemPocket + ld a, [wItemAttributeParamBuffer] + cp TM_HM + ld de, SFX_GET_TM + jr z, .play + ld de, SFX_ITEM +.play + call PlaySFX + call WaitSFX + ret + +GetPocketName: + farcall CheckItemPocket + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, ItemPocketNames + maskbits NUM_POCKETS + add a + ld e, a + ld d, 0 + add hl, de + ld a, [hli] + ld d, [hl] + ld e, a + ld hl, wStringBuffer3 + call CopyName2 + ret + +INCLUDE "data/items/pocket_names.asm" + +CurItemName: + ld a, [wCurItem] + ld [wNamedObjectIndexBuffer], a + call GetItemName + ret + +PutItemInPocketText: + text_far _PutItemInPocketText + text_end + +PocketIsFullText: + text_far _PocketIsFullText + text_end + +Script_pokemart: +; script command 0x93 +; parameters: mart_type, mart_id + + call GetScriptByte + ld c, a + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall OpenMartDialog + ret + +Script_elevator: +; script command 0x94 +; parameters: floor_list_pointer + + xor a + ld [wScriptVar], a + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall Elevator + ret c + ld a, TRUE + ld [wScriptVar], a + ret + +Script_trade: +; script command 0x95 +; parameters: trade_id + + call GetScriptByte + ld e, a + farcall NPCTrade + ret + +Script_phonecall: +; script command 0x97 +; parameters: caller_name + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall PhoneCall + ret + +Script_hangup: +; script command 0x98 + + farcall HangUp + ret + +Script_askforphonenumber: +; script command 0x96 +; parameters: number + + call YesNoBox + jr c, .refused + call GetScriptByte + ld c, a + farcall AddPhoneNumber + jr c, .phonefull + xor a ; PHONE_CONTACT_GOT + jr .done +.phonefull + ld a, PHONE_CONTACTS_FULL + jr .done +.refused + call GetScriptByte + ld a, PHONE_CONTACT_REFUSED +.done + ld [wScriptVar], a + ret + +Script_describedecoration: +; script command 0x99 +; parameters: byte + + call GetScriptByte + ld b, a + farcall DescribeDecoration + ld h, d + ld l, e + jp ScriptJump + +Script_fruittree: +; script command 0x9a +; parameters: tree_id + + call GetScriptByte + ld [wCurFruitTree], a + ld b, BANK(FruitTreeScript) + ld hl, FruitTreeScript + jp ScriptJump + +Script_swarm: +; script command 0x9e +; parameters: map_group, map_id + + call GetScriptByte + ld d, a + call GetScriptByte + ld e, a + farcall StoreSwarmMapIndices + ret + +Script_trainertext: +; script command 0x61 +; parameters: text_id + + call GetScriptByte + ld c, a + ld b, 0 + ld hl, wSeenTextPointer + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wSeenTrainerBank] + ld b, a + call MapTextbox + ret + +Script_scripttalkafter: +; script command 0x64 + + ld hl, wScriptAfterPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wSeenTrainerBank] + ld b, a + jp ScriptJump + +Script_trainerflagaction: +; script command 0x62 +; parameters: action + + xor a + ld [wScriptVar], a + ld hl, wTempTrainerEventFlag + ld e, [hl] + inc hl + ld d, [hl] + call GetScriptByte + ld b, a + call EventFlagAction + ld a, c + and a + ret z + ld a, TRUE + ld [wScriptVar], a + ret + +Script_winlosstext: +; script command 0x63 +; parameters: win_text_pointer, loss_text_pointer + + ld hl, wWinTextPointer + call GetScriptByte + ld [hli], a + call GetScriptByte + ld [hli], a + ld hl, wLossTextPointer + call GetScriptByte + ld [hli], a + call GetScriptByte + ld [hli], a + ret + +Script_endifjustbattled: +; script command 0x65 + + ld a, [wRunningTrainerBattleScript] + and a + ret z + jp Script_end + +Script_checkjustbattled: +; script command 0x66 + + ld a, TRUE + ld [wScriptVar], a + ld a, [wRunningTrainerBattleScript] + and a + ret nz + xor a + ld [wScriptVar], a + ret + +Script_encountermusic: +; script command 0x7f + + ld a, [wOtherTrainerClass] + ld e, a + farcall PlayTrainerEncounterMusic + ret + +Script_playmapmusic: +; script command 0x81 + + call PlayMapMusic + ret + +Script_playmusic: +; script command 0x7e +; parameters: music_pointer + + ld de, MUSIC_NONE + call PlayMusic + xor a + ld [wMusicFade], a + call MaxVolume + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + call PlayMusic + ret + +Script_musicfadeout: +; script command 0x80 +; parameters: music, fadetime + + call GetScriptByte + ld [wMusicFadeID], a + call GetScriptByte + ld [wMusicFadeID + 1], a + call GetScriptByte + and $ff ^ (1 << MUSIC_FADE_IN_F) + ld [wMusicFade], a + ret + +Script_playsound: +; script command 0x84 +; parameters: sound_pointer + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + call PlaySFX + ret + +Script_waitsfx: +; script command 0x85 + + call WaitSFX + ret + +Script_warpsound: +; script command 0x86 + + farcall GetWarpSFX + call PlaySFX + ret + +Script_cry: +; script command 0x83 +; parameters: cry_id + + call GetScriptByte + push af + call GetScriptByte + pop af + and a + jr nz, .ok + ld a, [wScriptVar] +.ok + call PlayMonCry + ret + +Script_setlasttalked: +; script command 0x67 +; parameters: object_id + + call GetScriptByte + ldh [hLastTalked], a + ret + +Script_applymovement: +; script command 0x68 +; parameters: object_id, data + + call GetScriptByte + ld c, a + +ApplyMovement: + push bc + ld a, c + farcall SetFlagsForMovement_1 + pop bc + + push bc + call SetFlagsForMovement_2 + pop bc + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptBank] + ld b, a + call GetMovementData + ret c + + ld a, SCRIPT_WAIT_MOVEMENT + ld [wScriptMode], a + call StopScript + ret + +SetFlagsForMovement_2: + farcall _SetFlagsForMovement_2 + ret + +Script_applymovementlasttalked: +; script command 0x69 +; parameters: data +; apply movement to last talked + + ldh a, [hLastTalked] + ld c, a + jp ApplyMovement + +Script_faceplayer: +; script command 0x6a + + ldh a, [hLastTalked] + and a + ret z + ld d, $0 + ldh a, [hLastTalked] + ld e, a + farcall GetRelativeFacing + ld a, d + add a + add a + ld e, a + ldh a, [hLastTalked] + ld d, a + call ApplyObjectFacing + ret + +Script_faceobject: +; script command 0x6b +; parameters: object1, object2 + + call GetScriptByte + cp LAST_TALKED + jr c, .ok + ldh a, [hLastTalked] +.ok + ld e, a + call GetScriptByte + cp LAST_TALKED + jr nz, .ok2 + ldh a, [hLastTalked] +.ok2 + ld d, a + push de + farcall GetRelativeFacing + pop bc + ret c + ld a, d + add a + add a + ld e, a + ld d, c + call ApplyObjectFacing + ret + +Script_turnobject: +; script command 0x75 +; parameters: object_id, facing + + call GetScriptByte + cp LAST_TALKED + jr nz, .ok + ldh a, [hLastTalked] +.ok + ld d, a + call GetScriptByte + add a + add a + ld e, a + call ApplyObjectFacing + ret + +ApplyObjectFacing: + ld a, d + push de + call CheckObjectVisibility + jr c, .not_visible + ld hl, OBJECT_SPRITE + add hl, bc + ld a, [hl] + push bc + call DoesSpriteHaveFacings + pop bc + jr c, .not_visible ; STILL_SPRITE + ld hl, OBJECT_FLAGS1 + add hl, bc + bit FIXED_FACING_F, [hl] + jr nz, .not_visible + pop de + ld a, e + call SetSpriteDirection + call UpdateSprites + ret + +.not_visible + pop de + scf + ret + +Script_variablesprite: +; script command 0x6c +; parameters: byte, sprite + + call GetScriptByte + ld e, a + ld d, $0 + ld hl, wVariableSprites + add hl, de + call GetScriptByte + ld [hl], a + ret + +Script_appear: +; script command 0x6e +; parameters: object_id + + call GetScriptByte + call _CopyObjectStruct + ldh a, [hMapObjectIndexBuffer] + ld b, 0 ; clear + call ApplyEventActionAppearDisappear + ret + +Script_disappear: +; script command 0x6d +; parameters: object_id + + call GetScriptByte + cp LAST_TALKED + jr nz, .ok + ldh a, [hLastTalked] +.ok + call DeleteObjectStruct + ldh a, [hMapObjectIndexBuffer] + ld b, 1 ; set + call ApplyEventActionAppearDisappear + farcall _UpdateSprites + ret + +ApplyEventActionAppearDisappear: + push bc + call GetMapObject + ld hl, MAPOBJECT_EVENT_FLAG + add hl, bc + pop bc + ld e, [hl] + inc hl + ld d, [hl] + ld a, -1 + cp e + jr nz, .okay + cp d + jr nz, .okay + xor a + ret +.okay + call EventFlagAction + ret + +Script_follow: +; script command 0x6f +; parameters: object2, object1 + + call GetScriptByte + ld b, a + call GetScriptByte + ld c, a + farcall StartFollow + ret + +Script_stopfollow: +; script command 0x70 + + farcall StopFollow + ret + +Script_moveobject: +; script command 0x71 +; parameters: object id, x, y + + call GetScriptByte + ld b, a + call GetScriptByte + add 4 + ld d, a + call GetScriptByte + add 4 + ld e, a + farcall CopyDECoordsToMapObject + ret + +Script_writeobjectxy: +; script command 0x72 +; parameters: object_id + + call GetScriptByte + cp LAST_TALKED + jr nz, .ok + ldh a, [hLastTalked] +.ok + ld b, a + farcall WriteObjectXY + ret + +Script_follownotexact: +; script command 0x76 +; parameters: object2, object1 + + call GetScriptByte + ld b, a + call GetScriptByte + ld c, a + farcall FollowNotExact + ret + +Script_loademote: +; script command 0x73 +; parameters: bubble + + call GetScriptByte + cp EMOTE_FROM_MEM + jr nz, .not_var_emote + ld a, [wScriptVar] +.not_var_emote + ld c, a + farcall LoadEmote + ret + +Script_showemote: +; script command 0x74 +; parameters: bubble, object_id, time + + call GetScriptByte + ld [wScriptVar], a + call GetScriptByte + cp LAST_TALKED + jr z, .ok + ldh [hLastTalked], a +.ok + call GetScriptByte + ld [wScriptDelay], a + ld b, BANK(ShowEmoteScript) + ld de, ShowEmoteScript + jp ScriptCall + +ShowEmoteScript: + loademote EMOTE_FROM_MEM + applymovementlasttalked .Show + pause 0 + applymovementlasttalked .Hide + end + +.Show: + show_emote + step_sleep 1 + step_end + +.Hide: + hide_emote + step_sleep 1 + step_end + +Script_earthquake: +; script command 0x77 +; parameters: param + + ld hl, EarthquakeMovement + ld de, wEarthquakeMovementDataBuffer + ld bc, EarthquakeMovement.End - EarthquakeMovement + call CopyBytes + call GetScriptByte + ld [wEarthquakeMovementDataBuffer + 1], a + and %00111111 + ld [wEarthquakeMovementDataBuffer + 3], a + ld b, BANK(.script) + ld de, .script + jp ScriptCall + +.script + applymovement PLAYER, wEarthquakeMovementDataBuffer + end + +EarthquakeMovement: + step_shake 16 ; the 16 gets overwritten with the script byte + step_sleep 16 ; the 16 gets overwritten with the lower 6 bits of the script byte + step_end +.End + +Script_loadpikachudata: +; script command 0x59 + + ld a, PIKACHU + ld [wTempWildMonSpecies], a + ld a, 5 + ld [wCurPartyLevel], a + ret + +Script_randomwildmon: +; script command 0x5a + + xor a + ld [wBattleScriptFlags], a + ret + +Script_loadtemptrainer: +; script command 0x5b + + ld a, (1 << 7) | 1 + ld [wBattleScriptFlags], a + ld a, [wTempTrainerClass] + ld [wOtherTrainerClass], a + ld a, [wTempTrainerID] + ld [wOtherTrainerID], a + ret + +Script_loadwildmon: +; script command 0x5c +; parameters: pokemon, level + + ld a, (1 << 7) + ld [wBattleScriptFlags], a + call GetScriptByte + ld [wTempWildMonSpecies], a + call GetScriptByte + ld [wCurPartyLevel], a + ret + +Script_loadtrainer: +; script command 0x5d +; parameters: trainer_group, trainer_id + + ld a, (1 << 7) | 1 + ld [wBattleScriptFlags], a + call GetScriptByte + ld [wOtherTrainerClass], a + call GetScriptByte + ld [wOtherTrainerID], a + ret + +Script_startbattle: +; script command 0x5e + + call BufferScreen + predef StartBattle + ld a, [wBattleResult] + and $ff ^ BATTLERESULT_BITMASK + ld [wScriptVar], a + ret + +Script_catchtutorial: +; script command 0x60 +; parameters: byte + + call GetScriptByte + ld [wBattleType], a + call BufferScreen + farcall CatchTutorial + jp Script_reloadmap + +Script_reloadmapafterbattle: +; script command 0x5f + + ld hl, wBattleScriptFlags + ld d, [hl] + ld [hl], 0 + ld a, [wBattleResult] + and $ff ^ BATTLERESULT_BITMASK + cp LOSE + jr nz, .notblackedout + ld b, BANK(Script_BattleWhiteout) + ld hl, Script_BattleWhiteout + jp ScriptJump + +.notblackedout + bit 0, d + jr z, .was_wild + farcall MomTriesToBuySomething + jr .done + +.was_wild + ld a, [wBattleResult] + bit BATTLERESULT_BOX_FULL, a + jr z, .done + ld b, BANK(Script_SpecialBillCall) + ld de, Script_SpecialBillCall + farcall LoadScriptBDE +.done + jp Script_reloadmap + +Script_reloadmap: +; script command 0x7a + + xor a + ld [wBattleScriptFlags], a + ld a, MAPSETUP_RELOADMAP + ldh [hMapEntryMethod], a + ld a, MAPSTATUS_ENTER + call LoadMapStatus + call StopScript + ret + +Script_scall: +; script command 0x0 +; parameters: pointer + + ld a, [wScriptBank] + ld b, a + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + jr ScriptCall + +Script_farscall: +; script command 0x1 +; parameters: pointer + + call GetScriptByte + ld b, a + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + jr ScriptCall + +Script_memcall: +; script command 0x2 +; parameters: pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld b, [hl] + inc hl + ld e, [hl] + inc hl + ld d, [hl] + ; fallthrough + +ScriptCall: +; Bug: The script stack has a capacity of 5 scripts, yet there is +; nothing to stop you from pushing a sixth script. The high part +; of the script address can then be overwritten by modifications +; to wScriptDelay, causing the script to return to the rst/interrupt +; space. + + push de + ld hl, wScriptStackSize + ld e, [hl] + inc [hl] + ld d, 0 + ld hl, wScriptStack + add hl, de + add hl, de + add hl, de + pop de + ld a, [wScriptBank] + ld [hli], a + ld a, [wScriptPos] + ld [hli], a + ld a, [wScriptPos + 1] + ld [hl], a + ld a, b + ld [wScriptBank], a + ld a, e + ld [wScriptPos], a + ld a, d + ld [wScriptPos + 1], a + ret + +CallCallback:: + ld a, [wScriptBank] + or $80 + ld [wScriptBank], a + jp ScriptCall + +Script_sjump: +; script command 0x3 +; parameters: pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptBank] + ld b, a + jp ScriptJump + +Script_farsjump: +; script command 0x4 +; parameters: pointer + + call GetScriptByte + ld b, a + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + jp ScriptJump + +Script_memjump: +; script command 0x5 +; parameters: pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld b, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + jp ScriptJump + +Script_iffalse: +; script command 0x8 +; parameters: pointer + + ld a, [wScriptVar] + and a + jp nz, SkipTwoScriptBytes + jp Script_sjump + +Script_iftrue: +; script command 0x9 +; parameters: pointer + + ld a, [wScriptVar] + and a + jp nz, Script_sjump + jp SkipTwoScriptBytes + +Script_ifequal: +; script command 0x6 +; parameters: byte, pointer + + call GetScriptByte + ld hl, wScriptVar + cp [hl] + jr z, Script_sjump + jr SkipTwoScriptBytes + +Script_ifnotequal: +; script command 0x7 +; parameters: byte, pointer + + call GetScriptByte + ld hl, wScriptVar + cp [hl] + jr nz, Script_sjump + jr SkipTwoScriptBytes + +Script_ifgreater: +; script command 0xa +; parameters: byte, pointer + + ld a, [wScriptVar] + ld b, a + call GetScriptByte + cp b + jr c, Script_sjump + jr SkipTwoScriptBytes + +Script_ifless: +; script command 0xb +; parameters: byte, pointer + + call GetScriptByte + ld b, a + ld a, [wScriptVar] + cp b + jr c, Script_sjump + jr SkipTwoScriptBytes + +Script_jumpstd: +; script command 0xc +; parameters: predefined_script + + call StdScript + jr ScriptJump + +Script_callstd: +; script command 0xd +; parameters: predefined_script + + call StdScript + ld d, h + ld e, l + jp ScriptCall + +StdScript: + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld hl, StdScripts + add hl, de + add hl, de + add hl, de + ld a, BANK(StdScripts) + call GetFarByte + ld b, a + inc hl + ld a, BANK(StdScripts) + call GetFarHalfword + ret + +SkipTwoScriptBytes: + call GetScriptByte + call GetScriptByte + ret + +ScriptJump: + ld a, b + ld [wScriptBank], a + ld a, l + ld [wScriptPos], a + ld a, h + ld [wScriptPos + 1], a + ret + +Script_prioritysjump: +; script command 0x8c +; parameters: pointer + + ld a, [wScriptBank] + ld [wPriorityScriptBank], a + call GetScriptByte + ld [wPriorityScriptAddr], a + call GetScriptByte + ld [wPriorityScriptAddr + 1], a + ld hl, wScriptFlags + set 3, [hl] + ret + +Script_checkscene: +; script command 0x13 + + call CheckScenes + jr z, .no_scene + ld [wScriptVar], a + ret + +.no_scene + ld a, $ff + ld [wScriptVar], a + ret + +Script_checkmapscene: +; script command 0x11 +; parameters: map_group, map_id + + call GetScriptByte + ld b, a + call GetScriptByte + ld c, a + call GetMapSceneID + ld a, d + or e + jr z, .no_scene + ld a, [de] + ld [wScriptVar], a + ret + +.no_scene + ld a, $ff + ld [wScriptVar], a + ret + +Script_setscene: +; script command 0x14 +; parameters: scene_id + + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + jr DoScene + +Script_setmapscene: +; script command 0x12 +; parameters: map_group, map_id, scene_id + + call GetScriptByte + ld b, a + call GetScriptByte + ld c, a +DoScene: + call GetMapSceneID + ld a, d + or e + jr z, .no_scene + call GetScriptByte + ld [de], a +.no_scene + ret + +Script_readmem: +; script command 0x19 +; parameters: address + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [hl] + ld [wScriptVar], a + ret + +Script_writemem: +; script command 0x1a +; parameters: address + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptVar] + ld [hl], a + ret + +Script_loadmem: +; script command 0x1b +; parameters: address, value + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + call GetScriptByte + ld [hl], a + ret + +Script_setval: +; script command 0x15 +; parameters: value + + call GetScriptByte + ld [wScriptVar], a + ret + +Script_addval: +; script command 0x16 +; parameters: value + + call GetScriptByte + ld hl, wScriptVar + add [hl] + ld [hl], a + ret + +Script_random: +; script command 0x17 +; parameters: input + + call GetScriptByte + ld [wScriptVar], a + and a + ret z + + ld c, a + call .Divide256byC + and a + jr z, .no_restriction ; 256 % b == 0 + ld b, a + xor a + sub b + ld b, a +.loop + push bc + call Random + pop bc + ldh a, [hRandomAdd] + cp b + jr nc, .loop + jr .finish + +.no_restriction + push bc + call Random + pop bc + ldh a, [hRandomAdd] + +.finish + push af + ld a, [wScriptVar] + ld c, a + pop af + call SimpleDivide + ld [wScriptVar], a + ret + +.Divide256byC: + xor a + ld b, a + sub c +.mod_loop + inc b + sub c + jr nc, .mod_loop + dec b + add c + ret + +Script_readvar: +; script command 0x1c +; parameters: variable_id + + call GetScriptByte + call GetVarAction + ld a, [de] + ld [wScriptVar], a + ret + +Script_writevar: +; script command 0x1d +; parameters: variable_id + + call GetScriptByte + call GetVarAction + ld a, [wScriptVar] + ld [de], a + ret + +Script_loadvar: +; script command 0x1e +; parameters: variable_id, value + + call GetScriptByte + call GetVarAction + call GetScriptByte + ld [de], a + ret + +GetVarAction: + ld c, a + farcall _GetVarAction + ret + +Script_checkver: +; script command 0x18 + + ld a, [.gs_version] + ld [wScriptVar], a + ret + +.gs_version: + db GS_VERSION + +Script_getmonname: +; script command 0x40 +; parameters: string_buffer, mon_id (0 aka USE_SCRIPT_VAR to use wScriptVar) + + call GetScriptByte + and a + jr nz, .gotit + ld a, [wScriptVar] +.gotit + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld de, wStringBuffer1 + +GetStringBuffer: + call GetScriptByte + cp NUM_STRING_BUFFERS + jr c, .ok + xor a +.ok + +CopyConvertedText: + ld hl, wStringBuffer3 + ld bc, wStringBuffer4 - wStringBuffer3 + call AddNTimes + call CopyName2 + ret + +Script_getitemname: +; script command 0x41 +; parameters: string_buffer, item_id (0 aka USE_SCRIPT_VAR to use wScriptVar) + + call GetScriptByte + and a ; USE_SCRIPT_VAR + jr nz, .ok + ld a, [wScriptVar] +.ok + ld [wNamedObjectIndexBuffer], a + call GetItemName + ld de, wStringBuffer1 + jr GetStringBuffer + +Script_getcurlandmarkname: +; script command 0x42 +; parameters: string_buffer + + ld a, [wMapGroup] + ld b, a + ld a, [wMapNumber] + ld c, a + call GetWorldMapLocation + +ConvertLandmarkToText: + ld e, a + farcall GetLandmarkName + ld de, wStringBuffer1 + jp GetStringBuffer + +Script_gettrainername: +; script command 0x43 +; parameters: string_buffer, trainer_group, trainer_id + + call GetScriptByte + ld c, a + call GetScriptByte + ld b, a + farcall GetTrainerName + jr GetStringBuffer + +Script_getmoney: +; script command 0x3d +; parameters: string_buffer, account + + call ResetStringBuffer1 + call GetMoneyAccount + ld hl, wStringBuffer1 + lb bc, PRINTNUM_LEFTALIGN | 3, 6 + call PrintNum + ld de, wStringBuffer1 + jp GetStringBuffer + +Script_getcoins: +; script command 0x3e +; parameters: string_buffer + + call ResetStringBuffer1 + ld hl, wStringBuffer1 + ld de, wCoins + lb bc, PRINTNUM_LEFTALIGN | 2, 6 + call PrintNum + ld de, wStringBuffer1 + jp GetStringBuffer + +Script_getnum: +; script command 0x3f +; parameters: string_buffer + + call ResetStringBuffer1 + ld de, wScriptVar + ld hl, wStringBuffer1 + lb bc, PRINTNUM_LEFTALIGN | 1, 3 + call PrintNum + ld de, wStringBuffer1 + jp GetStringBuffer + +ResetStringBuffer1: + ld hl, wStringBuffer1 + ld bc, NAME_LENGTH + 2 + ld a, "@" + call ByteFill + ret + +Script_getstring: +; script command 0x44 +; parameters: string_buffer, text_pointer + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld hl, CopyName1 + rst FarCall + ld de, wStringBuffer2 + jp GetStringBuffer + +Script_givepokemail: +; script command 0x2f +; parameters: pointer + + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + ld a, [wScriptBank] + call GetFarByte + ld b, a + push bc + inc hl + ld bc, MAIL_MSG_LENGTH + ld de, wceed + ld a, [wScriptBank] + call FarCopyBytes + pop bc + farcall GivePokeMail + ret + +Script_checkpokemail: +; script command 0x30 +; parameters: pointer + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall CheckPokeMail + ret + +Script_giveitem: +; script command 0x1f +; parameters: item, quantity + + call GetScriptByte + cp ITEM_FROM_MEM + jr nz, .ok + ld a, [wScriptVar] +.ok + ld [wCurItem], a + call GetScriptByte + ld [wItemQuantityChangeBuffer], a + ld hl, wNumItems + call ReceiveItem + jr nc, .full + ld a, TRUE + ld [wScriptVar], a + ret +.full + xor a + ld [wScriptVar], a + ret + +Script_takeitem: +; script command 0x20 +; parameters: item, quantity + + xor a + ld [wScriptVar], a + call GetScriptByte + ld [wCurItem], a + call GetScriptByte + ld [wItemQuantityChangeBuffer], a + ld a, -1 + ld [wCurItemQuantity], a + ld hl, wNumItems + call TossItem + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_checkitem: +; script command 0x21 +; parameters: item + + xor a + ld [wScriptVar], a + call GetScriptByte + ld [wCurItem], a + ld hl, wNumItems + call CheckItem + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_givemoney: +; script command 0x22 +; parameters: account, money + + call GetMoneyAccount + call LoadMoneyAmountToMem + farcall GiveMoney + ret + +Script_takemoney: +; script command 0x23 +; parameters: account, money + + call GetMoneyAccount + call LoadMoneyAmountToMem + farcall TakeMoney + ret + +Script_checkmoney: +; script command 0x24 +; parameters: account, money + + call GetMoneyAccount + call LoadMoneyAmountToMem + farcall CompareMoney + +CompareMoneyAction: + jr c, .less + jr z, .exact + ld a, HAVE_MORE + jr .done +.exact + ld a, HAVE_AMOUNT + jr .done +.less + ld a, HAVE_LESS +.done + ld [wScriptVar], a + ret + +GetMoneyAccount: + call GetScriptByte + and a + ld de, wMoney ; YOUR_MONEY + ret z + ld de, wMomsMoney ; MOMS_MONEY + ret + +LoadMoneyAmountToMem: + ld bc, hMoneyTemp + push bc + call GetScriptByte + ld [bc], a + inc bc + call GetScriptByte + ld [bc], a + inc bc + call GetScriptByte + ld [bc], a + pop bc + ret + +Script_givecoins: +; script command 0x25 +; parameters: coins + + call LoadCoinAmountToMem + farcall GiveCoins + ret + +Script_takecoins: +; script command 0x26 +; parameters: coins + + call LoadCoinAmountToMem + farcall TakeCoins + ret + +Script_checkcoins: +; script command 0x27 +; parameters: coins + + call LoadCoinAmountToMem + farcall CheckCoins + jr CompareMoneyAction + +LoadCoinAmountToMem: + call GetScriptByte + ldh [hMoneyTemp + 1], a + call GetScriptByte + ldh [hMoneyTemp], a + ld bc, hMoneyTemp + ret + +Script_checktime: +; script command 0x2b +; parameters: time + + xor a + ld [wScriptVar], a + farcall CheckTime + call GetScriptByte + and c + ret z + ld a, TRUE + ld [wScriptVar], a + ret + +Script_checkpoke: +; script command 0x2c +; parameters: pokemon + + xor a + ld [wScriptVar], a + call GetScriptByte + ld hl, wPartySpecies + ld de, 1 + call IsInArray + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_addcellnum: +; script command 0x28 +; parameters: person + + xor a + ld [wScriptVar], a + call GetScriptByte + ld c, a + farcall AddPhoneNumber + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_delcellnum: +; script command 0x29 +; parameters: person + + xor a + ld [wScriptVar], a + call GetScriptByte + ld c, a + farcall DelCellNum + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_checkcellnum: +; script command 0x2a +; parameters: person +; returns false if the cell number is not in your phone + + xor a + ld [wScriptVar], a + call GetScriptByte + ld c, a + farcall CheckCellNum + ret nc + ld a, TRUE + ld [wScriptVar], a + ret + +Script_specialphonecall: +; script command 0x9b +; parameters: call_id + + call GetScriptByte + ld [wSpecialPhoneCallID], a + call GetScriptByte + ld [wSpecialPhoneCallID + 1], a + ret + +Script_checkphonecall: +; script command 0x9c +; returns false if no special phone call is stored + + ld a, [wSpecialPhoneCallID] + and a + jr z, .ok + ld a, TRUE +.ok + ld [wScriptVar], a + ret + +Script_givepoke: +; script command 0x2d +; parameters: pokemon, level, item, trainer, trainer_name_pointer, pkmn_nickname + + call GetScriptByte + ld [wCurPartySpecies], a + call GetScriptByte + ld [wCurPartyLevel], a + call GetScriptByte + ld [wCurItem], a + call GetScriptByte + and a + ld b, a + jr z, .ok + ld hl, wScriptPos + ld e, [hl] + inc hl + ld d, [hl] + call GetScriptByte + call GetScriptByte + call GetScriptByte + call GetScriptByte +.ok + farcall GivePoke + ld a, b + ld [wScriptVar], a + ret + +Script_giveegg: +; script command 0x2e +; parameters: pokemon, level +; if no room in the party, return 0 in wScriptVar; else, return 2 + + xor a ; PARTYMON + ld [wScriptVar], a + ld [wMonType], a + call GetScriptByte + ld [wCurPartySpecies], a + call GetScriptByte + ld [wCurPartyLevel], a + farcall GiveEgg + ret nc + ld a, 2 + ld [wScriptVar], a + ret + +Script_setevent: +; script command 0x33 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, SET_FLAG + call EventFlagAction + ret + +Script_clearevent: +; script command 0x32 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, RESET_FLAG + call EventFlagAction + ret + +Script_checkevent: +; script command 0x31 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, CHECK_FLAG + call EventFlagAction + ld a, c + and a + jr z, .false + ld a, TRUE +.false + ld [wScriptVar], a + ret + +Script_setflag: +; script command 0x36 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, SET_FLAG + call _EngineFlagAction + ret + +Script_clearflag: +; script command 0x35 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, RESET_FLAG + call _EngineFlagAction + ret + +Script_checkflag: +; script command 0x34 +; parameters: bit_number + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld b, CHECK_FLAG + call _EngineFlagAction + ld a, c + and a + jr z, .false + ld a, TRUE +.false + ld [wScriptVar], a + ret + +_EngineFlagAction: + farcall EngineFlagAction + ret + +Script_wildoff: +; script command 0x38 + + ld hl, wStatusFlags + set STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] + ret + +Script_wildon: +; script command 0x37 + + ld hl, wStatusFlags + res STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] + ret + +Script_xycompare: +; script command 0x39 +; parameters: pointer + + call GetScriptByte + ld [wXYComparePointer], a + call GetScriptByte + ld [wXYComparePointer + 1], a + ret + +Script_warpfacing: +; script command 0xa1 +; parameters: facing, map_group, map_id, x, y + + call GetScriptByte + maskbits NUM_DIRECTIONS + ld c, a + ld a, [wPlayerSpriteSetupFlags] + set PLAYERSPRITESETUP_CUSTOM_FACING_F, a + or c + ld [wPlayerSpriteSetupFlags], a +; fall through + +Script_warp: +; script command 0x3c +; parameters: map_group, map_id, x, y + +; This seems to be some sort of error handling case. + call GetScriptByte + and a + jr z, .not_ok + ld [wMapGroup], a + call GetScriptByte + ld [wMapNumber], a + call GetScriptByte + ld [wXCoord], a + call GetScriptByte + ld [wYCoord], a + ld a, SPAWN_N_A + ld [wDefaultSpawnpoint], a + ld a, MAPSETUP_WARP + ldh [hMapEntryMethod], a + ld a, MAPSTATUS_ENTER + call LoadMapStatus + call StopScript + ret + +.not_ok + call GetScriptByte + call GetScriptByte + call GetScriptByte + ld a, SPAWN_N_A + ld [wDefaultSpawnpoint], a + ld a, MAPSETUP_BADWARP + ldh [hMapEntryMethod], a + ld a, MAPSTATUS_ENTER + call LoadMapStatus + call StopScript + ret + +Script_warpmod: +; script command 0x3a +; parameters: warp_id, map_group, map_id + + call GetScriptByte + ld [wBackupWarpNumber], a + call GetScriptByte + ld [wBackupMapGroup], a + call GetScriptByte + ld [wBackupMapNumber], a + ret + +Script_blackoutmod: +; script command 0x3b +; parameters: map_group, map_id + + call GetScriptByte + ld [wLastSpawnMapGroup], a + call GetScriptByte + ld [wLastSpawnMapNumber], a + ret + +Script_dontrestartmapmusic: +; script command 0x82 + + ld a, TRUE + ld [wDontPlayMapMusicOnReload], a + ret + +Script_writecmdqueue: +; script command 0x7c +; parameters: queue_pointer + + call GetScriptByte + ld e, a + call GetScriptByte + ld d, a + ld a, [wScriptBank] + ld b, a + farcall WriteCmdQueue ; no need to farcall + ret + +Script_delcmdqueue: +; script command 0x7d +; parameters: byte + + xor a + ld [wScriptVar], a + call GetScriptByte + ld b, a + farcall DelCmdQueue ; no need to farcall + ret c + ld a, TRUE + ld [wScriptVar], a + ret + +Script_changemapblocks: +; script command 0x78 +; parameters: map_data_pointer + + call GetScriptByte + ld [wMapBlocksBank], a + call GetScriptByte + ld [wMapBlocksPointer], a + call GetScriptByte + ld [wMapBlocksPointer + 1], a + call ChangeMap + call BufferScreen + ret + +Script_changeblock: +; script command 0x79 +; parameters: x, y, block + + call GetScriptByte + add 4 + ld d, a + call GetScriptByte + add 4 + ld e, a + call GetBlockLocation + call GetScriptByte + ld [hl], a + call BufferScreen + ret + +Script_reloadmappart:: +; script command 0x7b + + xor a + ldh [hBGMapMode], a + call OverworldTextModeSwitch + call GetMovementPermissions + call ApplyTilemap + call UpdateSprites + ret + +Script_warpcheck: +; script command 0x8d + + call WarpCheck + ret nc + farcall EnableEvents + ret + +Script_enableevents: +; unused + farcall EnableEvents + ret + +Script_newloadmap: +; script command 0x89 +; parameters: which_method + + call GetScriptByte + ldh [hMapEntryMethod], a + ld a, MAPSTATUS_ENTER + call LoadMapStatus + call StopScript + ret + +Script_reloadandreturn: +; script command 0x91 + + call Script_newloadmap + jp Script_end + +Script_opentext: +; script command 0x47 + + call OpenText + ret + +Script_refreshscreen: +; script command 0x48 +; parameters: dummy + + call RefreshScreen + call GetScriptByte + ret + +Script_writeunusedbytebuffer: +; script command 0x4a +; parameters: byte + + call GetScriptByte + ld [wUnusedScriptByteBuffer], a + ret + + db closetext_command ; unused + +Script_closetext: +; script command 0x49 + + ldh a, [hOAMUpdate] + push af + ld a, $01 + ldh [hOAMUpdate], a + call WaitBGMap + pop af + ldh [hOAMUpdate], a + call CloseText + ret + +Script_autoinput: +; script command 0x88 +; parameters: input_pointer + + call GetScriptByte + push af + call GetScriptByte + ld l, a + call GetScriptByte + ld h, a + pop af + call StartAutoInput + ret + +Script_pause: +; script command 0x8a +; parameters: length + + call GetScriptByte + and a + jr z, .loop + ld [wScriptDelay], a +.loop + ld c, 2 + call DelayFrames + ld hl, wScriptDelay + dec [hl] + jr nz, .loop + ret + +Script_deactivatefacing: +; script command 0x8b +; parameters: time + + call GetScriptByte + and a + jr z, .no_time + ld [wScriptDelay], a +.no_time + ld a, SCRIPT_WAIT + ld [wScriptMode], a + call StopScript + ret + +Script_stopandsjump: +; script command 0x8e +; parameters: pointer + + call StopScript + jp Script_sjump + +Script_end: +; script command 0x90 + + call ExitScriptSubroutine + jr c, .resume + ret + +.resume + xor a + ld [wScriptRunning], a + ld a, SCRIPT_OFF + ld [wScriptMode], a + ld hl, wScriptFlags + res 0, [hl] + call StopScript + ret + +Script_return: +; script command 0x8f + + call ExitScriptSubroutine + jr c, .dummy +.dummy + ld hl, wScriptFlags + res 0, [hl] + call StopScript + ret + +ExitScriptSubroutine: +; Return carry if there's no parent to return to. + + ld hl, wScriptStackSize + ld a, [hl] + and a + jr z, .done + dec [hl] + ld e, [hl] + ld d, $0 + ld hl, wScriptStack + add hl, de + add hl, de + add hl, de + ld a, [hli] + ld b, a + and " " + ld [wScriptBank], a + ld a, [hli] + ld e, a + ld [wScriptPos], a + ld a, [hl] + ld d, a + ld [wScriptPos + 1], a + and a + ret +.done + scf + ret + +Script_endall: +; script command 0x92 + + xor a + ld [wScriptStackSize], a + ld [wScriptRunning], a + ld a, SCRIPT_OFF + ld [wScriptMode], a + ld hl, wScriptFlags + res 0, [hl] + call StopScript + ret + +Script_halloffame: +; script command 0x9f + + ld hl, wGameTimerPause + res GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] + farcall HallOfFame + ld hl, wGameTimerPause + set GAMETIMERPAUSE_TIMER_PAUSED_F, [hl] + jr ReturnFromCredits + +Script_credits: +; script command 0xa0 + + farcall RedCredits +ReturnFromCredits: + call Script_endall + ld a, MAPSTATUS_DONE + call LoadMapStatus + call StopScript + ret + +; unused + ld a, [.gs_version] + ld [wScriptVar], a + ret + +.gs_version: + db GS_VERSION |