From 6f4fcf580a0a8e06b82e53afb78e8929e2b564fa Mon Sep 17 00:00:00 2001 From: xCrystal Date: Tue, 28 Nov 2023 21:36:51 +0100 Subject: [PATCH] Implement talker events [commit 3] (#30) --- constants/script_constants.asm | 9 +++++---- constants/trainer_data_constants.asm | 5 ++--- docs/event_commands.md | 2 +- engine/board/menu.asm | 4 ++-- engine/events/trainer_scripts.asm | 29 +++++++++++++++++++++++++--- engine/overworld/scripting.asm | 8 ++++++-- macros/scripts/events.asm | 6 +++--- macros/scripts/maps.asm | 6 +++--- maps/DebugLevel5_Map1.asm | 17 +++++++--------- ram/wram.asm | 2 +- 10 files changed, 56 insertions(+), 32 deletions(-) diff --git a/constants/script_constants.asm b/constants/script_constants.asm index 78129593e..a2cde0fc6 100644 --- a/constants/script_constants.asm +++ b/constants/script_constants.asm @@ -36,11 +36,12 @@ DEF STRING_BUFFER_LENGTH EQU 19 const PHONE_CONTACTS_FULL ; 1 const PHONE_CONTACT_REFUSED ; 2 -; trainertext arguments +; trainerortalkertext arguments const_def - const TRAINERTEXT_SEEN - const TRAINERTEXT_WIN - const TRAINERTEXT_LOSS + const TRAINERORTALKERTEXT_TRAINER_SEEN + const TRAINERORTALKERTEXT_TRAINER_WIN + const TRAINERORTALKERTEXT_TRAINER_LOSS +DEF TRAINERORTALKERTEXT_TALKER EQU -1 ; readvar/writevar/loadvar arguments ; _GetVarAction.VarActionTable indexes (see engine/overworld/variables.asm) diff --git a/constants/trainer_data_constants.asm b/constants/trainer_data_constants.asm index 639b2d61a..dbb9eab1d 100644 --- a/constants/trainer_data_constants.asm +++ b/constants/trainer_data_constants.asm @@ -48,12 +48,11 @@ DEF CONTEXT_USE EQU 1 << CONTEXT_USE_F ; talker events (from talker macro and high bit of wTempTalkerType) DEF TALKEREVENTTYPE_MASK EQU %10000000 -DEF TALKEREVENTTYPE_OPTIONAL EQU %0 -DEF TALKEREVENTTYPE_MANDATORY EQU %1 +DEF TALKEREVENTTYPE_OPTIONAL EQU %00000000 ; masked +DEF TALKEREVENTTYPE_MANDATORY EQU %10000000 ; masked ; talker types (from talker macro and low seven bits of wTempTalkerType) DEF TALKERTYPE_MASK EQU %01111111 const_def const TALKERTYPE_TEXT - const TALKERTYPE_MODAL_TEXT const TALKERTYPE_SCRIPT diff --git a/docs/event_commands.md b/docs/event_commands.md index 29cc2520f..a1eb56e65 100644 --- a/docs/event_commands.md +++ b/docs/event_commands.md @@ -339,7 +339,7 @@ If item_id = `USE_SCRIPT_VAR`, then it uses `[hScriptVar]` i ## `$61`: catchtutorial byte -## `$62`: trainertext text_id +## `$62`: trainerortalkertext text_id ## `$63`: trainerortalkerflagaction action diff --git a/engine/board/menu.asm b/engine/board/menu.asm index e20a88b5a..257e4e73c 100755 --- a/engine/board/menu.asm +++ b/engine/board/menu.asm @@ -28,8 +28,8 @@ BoardMenuScript:: ld hl, wCurTurn inc [hl] ; reset turn-scoped event flags - ld hl, wEventFlags + EVENT_LEVEL_SCOPED_FLAGS_START / 8 - ld c, (EVENT_LEVEL_SCOPED_FLAGS_END / 8) - (EVENT_LEVEL_SCOPED_FLAGS_START / 8) + ld hl, wEventFlags + EVENT_TURN_SCOPED_FLAGS_START / 8 + ld c, (EVENT_TURN_SCOPED_FLAGS_END / 8) - (EVENT_TURN_SCOPED_FLAGS_START / 8) xor a .loop ld [hli], a diff --git a/engine/events/trainer_scripts.asm b/engine/events/trainer_scripts.asm index 9f2b16248..0a702043c 100644 --- a/engine/events/trainer_scripts.asm +++ b/engine/events/trainer_scripts.asm @@ -19,7 +19,7 @@ SeenByTrainerScript:: StartBattleWithMapTrainerScript: opentext - trainertext TRAINERTEXT_SEEN + trainerortalkertext TRAINERORTALKERTEXT_TRAINER_SEEN waitbutton closetext loadtemptrainer @@ -33,6 +33,7 @@ AlreadyBeatenTrainerScript: SeenByTalkerScript:: waitsfx ; wait for any pending space-related sfx +; playsound SFX_ showemote EMOTE_TALK, LAST_TALKED, 20 callasm .TalkOrSkipTalker iffalse .skipped @@ -40,15 +41,31 @@ SeenByTalkerScript:: applymovementlasttalked wMovementBuffer writeobjectxy LAST_TALKED faceobject PLAYER, LAST_TALKED + callasm .GetTalkerType + ifequal TALKERTYPE_TEXT, .Text + ifequal TALKERTYPE_SCRIPT, .Script .skipped + trainerortalkerflagaction SET_FLAG + end + +.Text + opentext + trainerortalkertext TRAINERORTALKERTEXT_TALKER + waitbutton + closetext + trainerortalkerflagaction SET_FLAG + end + +.Script + trainerortalkerflagaction SET_FLAG end .TalkOrSkipTalker: ld a, [wTempTalkerType] - and %1 + and TALKEREVENTTYPE_MASK cp TALKEREVENTTYPE_MANDATORY jr z, .skip - call WaitButton + call JoyWaitAorB call PlayClickSFX call WaitSFX ldh a, [hJoyPressed] @@ -61,3 +78,9 @@ SeenByTalkerScript:: .done ld [hScriptVar], a ret + +.GetTalkerType: + ld a, [wTempTalkerType] + and TALKERTYPE_MASK + ld [hScriptVar], a + ret \ No newline at end of file diff --git a/engine/overworld/scripting.asm b/engine/overworld/scripting.asm index 18cc56d10..cc329d652 100644 --- a/engine/overworld/scripting.asm +++ b/engine/overworld/scripting.asm @@ -162,7 +162,7 @@ ScriptCommandTable: dw Script_startbattle ; 5f dw Script_reloadmapafterbattle ; 60 dw Script_catchtutorial ; 61 - dw Script_trainertext ; 62 + dw Script_trainerortalkertext ; 62 dw Script_trainerortalkerflagaction ; 63 dw Script_winlosstext ; 64 dw Script_scripttalkafter ; 65 @@ -661,13 +661,17 @@ Script_swarm: farcall StoreSwarmMapIndices ret -Script_trainertext: +Script_trainerortalkertext: call GetScriptByte + cp TRAINERORTALKERTEXT_TALKER + ld hl, wTempTalkerTextOrScriptPointer + jr z, .next ld c, a ld b, 0 ld hl, wSeenTextPointer add hl, bc add hl, bc +.next ld a, [hli] ld h, [hl] ld l, a diff --git a/macros/scripts/events.asm b/macros/scripts/events.asm index adf4e8442..7dfe2466e 100644 --- a/macros/scripts/events.asm +++ b/macros/scripts/events.asm @@ -626,9 +626,9 @@ MACRO catchtutorial db \1 ; byte ENDM - const trainertext_command ; $62 -MACRO trainertext - db trainertext_command + const trainerortalkertext_command ; $62 +MACRO trainerortalkertext + db trainerortalkertext_command db \1 ; text_id ENDM diff --git a/macros/scripts/maps.asm b/macros/scripts/maps.asm index 2438e661a..5e0778a2c 100644 --- a/macros/scripts/maps.asm +++ b/macros/scripts/maps.asm @@ -245,10 +245,10 @@ ENDM MACRO talker ;\1: flag: an EVENT_* constant ;\2: OPTIONAL or MANDATORY -;\3: talker type: TEXT, MODAL_TEXT, SCRIPT -;\4: pointer to talker data +;\3: talker type: TEXT, SCRIPT +;\4: pointer to talker text or script dw \1 - db \2 | \3 + db TALKEREVENTTYPE_\2 | TALKERTYPE_\3 dw \4 ENDM diff --git a/maps/DebugLevel5_Map1.asm b/maps/DebugLevel5_Map1.asm index 196623344..d8524bef4 100755 --- a/maps/DebugLevel5_Map1.asm +++ b/maps/DebugLevel5_Map1.asm @@ -20,7 +20,7 @@ DebugLevel5_Map1_MapEvents: def_object_events object_event 10, 2, SPRITE_YOUNGSTER, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_TRAINER, 2, .DebugLevel5_Map1TrainerYoungsterMikey1, -1 - object_event 9, 2, SPRITE_YOUNGSTER, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_TRAINER, 2, .DebugLevel5_Map1TrainerYoungsterMikey2, -1 + object_event 9, 2, SPRITE_YOUNGSTER, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_TALKER, 2, .DebugLevel5_Map1Talker1, -1 .DebugLevel5_Map1TrainerYoungsterMikey1: trainer YOUNGSTER, MIKEY, EVENT_LEVEL_SCOPED_1, .YoungsterMikeySeenText, .YoungsterMikeyBeatenText, 0, .Script @@ -28,15 +28,12 @@ DebugLevel5_Map1_MapEvents: .DebugLevel5_Map1TrainerYoungsterMikey2: trainer YOUNGSTER, MIKEY, EVENT_LEVEL_SCOPED_2, .YoungsterMikeySeenText, .YoungsterMikeyBeatenText, 0, .Script -; talker EVENT_TURN_SCOPED_*, OPTIONAL/MANDATORY | TEXT/MODAL_TEXT/SCRIPT, .Data -; .Data: ; Text -; db .Text -; .Data: ; Modal text -; dw EVENT_*, .Text1 -; dw EVENT_*, .Text2 -; dw DEFAULT_TEXT, .DefaultText -; .Data: ; Script -; end +.DebugLevel5_Map1Talker1: + talker EVENT_TURN_SCOPED_1, OPTIONAL, TEXT, .Text + +.Text: + text "I'm a talker!" + done .Script: endifjustbattled diff --git a/ram/wram.asm b/ram/wram.asm index fb1f6b28f..ea7cb2c7a 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -1576,7 +1576,7 @@ NEXTU wTempTalker:: wTempTalkerEventFlag:: dw wTempTalkerType:: db -wTempTalkerDataPointer:: dw +wTempTalkerTextOrScriptPointer:: dw wTempTalkerEnd:: NEXTU