diff options
Diffstat (limited to 'engine/scripting.asm')
-rw-r--r-- | engine/scripting.asm | 149 |
1 files changed, 79 insertions, 70 deletions
diff --git a/engine/scripting.asm b/engine/scripting.asm index 60618abab..a0acbf75c 100644 --- a/engine/scripting.asm +++ b/engine/scripting.asm @@ -241,7 +241,7 @@ ENDC dw Script_trainerclassname dw Script_name dw Script_wait - dw Script_unknown0xa9 + dw Script_check_save ; 0x96e05 StartScript: ; 0x96e05 @@ -415,10 +415,10 @@ Script_repeattext: ; 0x96ebb call GetScriptByte ld h, a cp -1 - jr nz, .done ; 0x96ec5 $11 + jr nz, .done ld a, l cp -1 - jr nz, .done ; 0x96eca $c + jr nz, .done ld hl, wd44e ld a, [hli] ld b, a @@ -456,7 +456,7 @@ Script_yesorno: ; 0x96eed call YesNoBox ld a, 0 - jr c, .no ; 0x96ef2 $2 + jr c, .no ld a, 1 .no ld [ScriptVar], a @@ -567,12 +567,12 @@ Script_verbosegiveitem: ; 0x96f60 ; 0x96f76 -Function96f76: ; 96f76 +ret_96f76: ; 96f76 ret ; 96f77 GiveItemScript: ; 96f77 - callasm Function96f76 + callasm ret_96f76 writetext ReceivedItemText iffalse .Full waitbutton @@ -792,16 +792,16 @@ Script_askforphonenumber: ; 0x970be ; number (SingleByteParam) call YesNoBox - jr c, .refused ; 0x970c1 $13 + jr c, .refused call GetScriptByte ld c, a callba AddPhoneNumber - jr c, .phonefull ; 0x970cd $3 + jr c, .phonefull xor a - jr .done ; 0x970d0 $9 + jr .done .phonefull ld a, 1 - jr .done ; 0x970d4 $5 + jr .done .refused call GetScriptByte ld a, 2 @@ -1196,7 +1196,7 @@ ApplyPersonFacing: ; 0x9728b ld a, d push de call CheckObjectVisibility - jr c, .not_visible ; 0x97290 $27 + jr c, .not_visible ld hl, OBJECT_SPRITE add hl, bc ld a, [hl] @@ -1207,13 +1207,13 @@ ApplyPersonFacing: ; 0x9728b ld hl, OBJECT_FLAGS1 add hl, bc bit 2, [hl] - jr nz, .not_visible ; 0x972a4 $13 + jr nz, .not_visible pop de ld a, e call SetSpriteDirection ld hl, VramState bit 6, [hl] - jr nz, .text_state ; 0x972b0 $3 + jr nz, .text_state call .DisableTextTiles .text_state call UpdateSprites @@ -1235,7 +1235,7 @@ ApplyPersonFacing: ; 0x9728b dec bc ld a, b or c - jr nz, .loop ; 0x972cb $f8 + jr nz, .loop ret ; 0x972ce @@ -1299,9 +1299,9 @@ ApplyEventActionAppearDisappear: ; 0x9730b ld d, [hl] ld a, -1 cp e - jr nz, .okay ; 0x9731a $5 + jr nz, .okay cp d - jr nz, .okay ; 0x9731d $2 + jr nz, .okay xor a ret .okay @@ -1391,7 +1391,7 @@ Script_loademote: ; 0x97384 call GetScriptByte cp -1 - jr nz, .not_var_emote ; 0x97389 $3 + jr nz, .not_var_emote ld a, [ScriptVar] .not_var_emote ld c, a @@ -1563,21 +1563,21 @@ Script_returnafterbattle: ; 0x97459 ld a, [wBattleResult] and $3f cp $1 - jr nz, .notblackedout ; 0x97466 $8 + jr nz, .notblackedout ld b, BANK(Script_BattleWhiteout) ld hl, Script_BattleWhiteout jp ScriptJump .notblackedout bit 0, d - jr z, .was_wild ; 0x97472 $8 + jr z, .was_wild callba MomTriesToBuySomething - jr .done ; 0x9747a $12 + jr .done .was_wild ld a, [wBattleResult] bit 7, a - jr z, .done ; 0x97481 $b + jr z, .done ld b, BANK(Script_SpecialBillCall) ld de, Script_SpecialBillCall callba LoadScriptBDE @@ -1643,12 +1643,18 @@ Script_2ptcall: ; 0x974be ; fallthrough ScriptCall: ; 0x974cb +; 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 ScriptDelay, causing the script to return to the rst/interrupt +; space. + push de - ld hl, wd43c + ld hl, wScriptStackSize ld e, [hl] inc [hl] ld d, $0 - ld hl, wd43d + ld hl, wScriptStackBA1 rept 3 add hl, de endr @@ -1751,8 +1757,8 @@ Script_if_equal: ; 0x97540 call GetScriptByte ld hl, ScriptVar cp [hl] - jr z, Script_2jump ; 0x97547 $b5 - jr SkipTwoScriptBytes ; 0x97549 $4b + jr z, Script_2jump + jr SkipTwoScriptBytes ; 0x9754b Script_if_not_equal: ; 0x9754b @@ -1764,8 +1770,8 @@ Script_if_not_equal: ; 0x9754b call GetScriptByte ld hl, ScriptVar cp [hl] - jr nz, Script_2jump ; 0x97552 $aa - jr SkipTwoScriptBytes ; 0x97554 $40 + jr nz, Script_2jump + jr SkipTwoScriptBytes ; 0x97556 Script_if_greater_than: ; 0x97556 @@ -1778,8 +1784,8 @@ Script_if_greater_than: ; 0x97556 ld b, a call GetScriptByte cp b - jr c, Script_2jump ; 0x9755e $9e - jr SkipTwoScriptBytes ; 0x97560 $34 + jr c, Script_2jump + jr SkipTwoScriptBytes ; 0x97562 Script_if_less_than: ; 0x97562 @@ -1792,8 +1798,8 @@ Script_if_less_than: ; 0x97562 ld b, a ld a, [ScriptVar] cp b - jr c, Script_2jump ; 0x9756a $92 - jr SkipTwoScriptBytes ; 0x9756c $28 + jr c, Script_2jump + jr SkipTwoScriptBytes ; 0x9756e Script_jumpstd: ; 0x9756e @@ -1802,7 +1808,7 @@ Script_jumpstd: ; 0x9756e ; predefined_script (MultiByteParam) call StdScript - jr ScriptJump ; 0x97571 $2a + jr ScriptJump ; 0x97573 Script_callstd: ; 0x97573 @@ -1870,7 +1876,7 @@ Script_checktriggers: ; 0x975c2 ; script command 0x13 call CheckTriggers - jr z, .asm_975cb ; 0x975c5 $4 + jr z, .asm_975cb ld [ScriptVar], a ret .asm_975cb @@ -1892,7 +1898,7 @@ Script_checkmaptriggers: ; 0x975d1 call GetMapTrigger ld a, d or e - jr z, .asm_975e5 ; 0x975de $5 + jr z, .asm_975e5 ld a, [de] ld [ScriptVar], a ret @@ -1911,7 +1917,7 @@ Script_dotrigger: ; 0x975eb ld b, a ld a, [MapNumber] ld c, a - jr Unknown_975fd ; 0x975f3 $8 + jr Unknown_975fd ; 0x975f5 Script_domaptrigger: ; 0x975f5 @@ -1931,7 +1937,7 @@ Unknown_975fd: ; 0x975fd call GetMapTrigger ld a, d or e - jr z, .asm_97608 ; 0x97602 $4 + jr z, .asm_97608 call GetScriptByte ld [de], a .asm_97608 @@ -2012,28 +2018,31 @@ Script_random: ; 0x97640 ld [ScriptVar], a and a ret z + ld c, a - call Function97673 + call .Divide256byC and a - jr z, .asm_9765f ; 0x9764d $10 + jr z, .no_restriction ; 256 % b == 0 ld b, a xor a sub b ld b, a -.asm_97653 +.loop push bc call Random pop bc - ld a, [$ffe1] + ld a, [hRandomAdd] cp b - jr nc, .asm_97653 ; 0x9765b $f6 - jr .asm_97666 ; 0x9765d $7 -.asm_9765f + jr nc, .loop + jr .finish + +.no_restriction push bc call Random pop bc - ld a, [$ffe1] -.asm_97666 + ld a, [hRandomAdd] + +.finish push af ld a, [ScriptVar] ld c, a @@ -2043,14 +2052,14 @@ Script_random: ; 0x97640 ret ; 0x97673 -Function97673: ; 0x97673 +.Divide256byC: ; 0x97673 xor a ld b, a sub c -.asm_97676 +.mod_loop inc b sub c - jr nc, .asm_97676 ; 0x97678 $fc + jr nc, .mod_loop dec b add c ret @@ -2119,7 +2128,7 @@ Script_pokenamemem: ; 0x976ae call GetScriptByte and a - jr nz, .gotit ; 0x976b2 $3 + jr nz, .gotit ld a, [ScriptVar] .gotit ld [wd265], a @@ -2149,13 +2158,13 @@ Script_itemtotext: ; 0x976d5 call GetScriptByte and a - jr nz, .ok ; 0x976d9 $3 + jr nz, .ok ld a, [ScriptVar] .ok ld [wd265], a call GetItemName ld de, StringBuffer1 - jr ConvertMemToText ; 0x976e7 $d7 + jr ConvertMemToText ; 0x976e9 Script_mapnametotext: ; 0x976e9 @@ -2183,7 +2192,7 @@ Script_displaylocation: ; 0x97701 ; memory (SingleByteParam) call GetScriptByte - jr ConvertLandmarkToText ; 0x97704 $ee + jr ConvertLandmarkToText ; 0x97706 Script_trainertotext: ; 0x97706 @@ -2198,7 +2207,7 @@ Script_trainertotext: ; 0x97706 call GetScriptByte ld b, a callba GetTrainerName - jr ConvertMemToText ; 0x97714 $aa + jr ConvertMemToText ; 0x97716 Script_name: ; 0x97716 @@ -2227,7 +2236,7 @@ Script_trainerclassname: ; 0x9772b ld a, TRAINER_NAME ld [wNamedObjectTypeBuffer], a - jr ContinueToGetName ; 0x97730 $ea + jr ContinueToGetName ; 0x97732 Script_readmoney: ; 0x97732 @@ -2344,7 +2353,7 @@ Script_giveitem: ; 0x977ca call GetScriptByte cp ITEM_FROM_MEM - jr nz, .ok ; 0x977cf $3 + jr nz, .ok ld a, [ScriptVar] .ok ld [CurItem], a @@ -2352,7 +2361,7 @@ Script_giveitem: ; 0x977ca ld [wItemQuantityChangeBuffer], a ld hl, NumItems call ReceiveItem - jr nc, .full ; 0x977e3 $6 + jr nc, .full ld a, $1 ld [ScriptVar], a ret @@ -2718,7 +2727,7 @@ Script_checkevent: ; 0x979a4 call EventFlagAction ld a, c and a - jr z, .false ; 0x979b3 $2 + jr z, .false ld a, 1 .false ld [ScriptVar], a @@ -2766,7 +2775,7 @@ Script_checkflag: ; 0x979d7 call _EngineFlagAction ld a, c and a - jr z, .false ; 0x979e6 $2 + jr z, .false ld a, 1 .false ld [ScriptVar], a @@ -2835,7 +2844,7 @@ Script_warp: ; 0x97a1d ; This seems to be some sort of error handling case. call GetScriptByte and a - jr z, .not_ok ; 0x97a21 $27 + jr z, .not_ok ld [MapGroup], a call GetScriptByte ld [MapNumber], a @@ -3080,14 +3089,14 @@ Script_pause: ; 0x97b47 call GetScriptByte and a - jr z, .loop ; 0x97b4b $3 + jr z, .loop ld [ScriptDelay], a .loop ld c, 2 call DelayFrames ld hl, ScriptDelay dec [hl] - jr nz, .loop ; 0x97b59 $f5 + jr nz, .loop ret ; 0x97b5c @@ -3098,7 +3107,7 @@ Script_deactivatefacing: ; 0x97b5c call GetScriptByte and a - jr z, .no_time ; 0x97b60 $3 + jr z, .no_time ld [ScriptDelay], a .no_time ld a, SCRIPT_WAIT @@ -3149,14 +3158,14 @@ Script_return: ; 0x97b8c ExitScriptSubroutine: ; 0x97b9a ; Return carry if there's no parent to return to. - ld hl, wd43c + ld hl, wScriptStackSize ld a, [hl] and a - jr z, .done ; 0x97b9f $1d + jr z, .done dec [hl] ld e, [hl] ld d, $0 - ld hl, wd43d + ld hl, wScriptStackBA1 rept 3 add hl,de endr @@ -3181,7 +3190,7 @@ Script_resetfuncs: ; 0x97bc0 ; script command 0x93 xor a - ld [wd43c], a + ld [wScriptStackSize], a ld [ScriptRunning], a ld a, SCRIPT_OFF ld [ScriptMode], a @@ -3231,22 +3240,22 @@ Script_wait: ; 0x97c05 call DelayFrames pop af dec a - jr nz, .loop ; 0x97c11 $f6 + jr nz, .loop pop bc ret ; 0x97c15 -Script_unknown0xa9: ; 0x97c15 +Script_check_save: ; 0x97c15 ; script command 0xa9 - callba Function4cffe + callba CheckSave ld a, c ld [ScriptVar], a ret ; 0x97c20 -Function97c20: ; 97c20 unreferenced +; 97c20 unreferenced ld a, [.byte] ld [ScriptVar], a ret |