diff --git a/scripts/storyboard/ch1/ch1_1_preassign.dsc b/scripts/storyboard/ch1/ch1_1_preassign.dsc index 45afbaa..fea857d 100644 --- a/scripts/storyboard/ch1/ch1_1_preassign.dsc +++ b/scripts/storyboard/ch1/ch1_1_preassign.dsc @@ -34,6 +34,7 @@ ch1_1_marie_interact: 1: click trigger: script: + - run storyboard_player_begin_atomic_sequence def.queue: def.player: - if != null: - stop - engage player duration:999999s @@ -97,9 +98,11 @@ ch1_1_marie_interact: - run storyboard_npc_state_set def.player: def.name:marie def.key:opinion def.value:-1 - zap 2 - disengage player + - run storyboard_player_end_atomic_sequence def.queue: def.player: 2: click trigger: script: + - run storyboard_player_begin_atomic_sequence def.queue: def.player: - if != null: - stop - engage player duration:999999s @@ -235,3 +238,4 @@ ch1_1_marie_interact: - inventory update - zap 3 - disengage player + - run storyboard_player_end_atomic_sequence def.queue: def.player: diff --git a/scripts/storyboard/dialogue/dialogue_npc_kobayashi.dsc b/scripts/storyboard/dialogue/dialogue_npc_kobayashi.dsc index 632faf6..b3d252b 100644 --- a/scripts/storyboard/dialogue/dialogue_npc_kobayashi.dsc +++ b/scripts/storyboard/dialogue/dialogue_npc_kobayashi.dsc @@ -14,6 +14,7 @@ dialogue_npc_kobayashi: 1: click trigger: script: + - run storyboard_player_begin_atomic_sequence def.queue: def.player: - if != null: - stop - engage player @@ -45,3 +46,4 @@ dialogue_npc_kobayashi: - ~run textbox_write def.player: def.queue: "def.line3s:Indeed, luv." - wait 1s - disengage player + - run storyboard_player_end_atomic_sequence def.queue: def.player: diff --git a/scripts/storyboard/dialogue/dialogue_npc_patchouli.dsc b/scripts/storyboard/dialogue/dialogue_npc_patchouli.dsc index a65c9a5..9a259cb 100644 --- a/scripts/storyboard/dialogue/dialogue_npc_patchouli.dsc +++ b/scripts/storyboard/dialogue/dialogue_npc_patchouli.dsc @@ -14,6 +14,7 @@ dialogue_npc_patchouli: 1: click trigger: script: + - run storyboard_player_begin_atomic_sequence def.queue: def.player: - if != null: - stop - engage player @@ -23,3 +24,4 @@ dialogue_npc_patchouli: - wait 1s - disengage player - ratelimit 10t + - run storyboard_player_end_atomic_sequence def.queue: def.player: diff --git a/scripts/storyboard/dialogue/dialogue_npc_ryuko.dsc b/scripts/storyboard/dialogue/dialogue_npc_ryuko.dsc index d2343cb..33d56ee 100644 --- a/scripts/storyboard/dialogue/dialogue_npc_ryuko.dsc +++ b/scripts/storyboard/dialogue/dialogue_npc_ryuko.dsc @@ -14,6 +14,7 @@ dialogue_npc_ryuko: 1: click trigger: script: + - run storyboard_player_begin_atomic_sequence def.queue: def.player: - if != null: - stop - engage player @@ -29,3 +30,4 @@ dialogue_npc_ryuko: - wait 1s - disengage player - ratelimit 10t + - run storyboard_player_end_atomic_sequence def.queue: def.player: diff --git a/scripts/storyboard/intro/intro_interactions.dsc b/scripts/storyboard/intro/intro_interactions.dsc index 16a90fd..4145a2f 100644 --- a/scripts/storyboard/intro/intro_interactions.dsc +++ b/scripts/storyboard/intro/intro_interactions.dsc @@ -15,11 +15,13 @@ intro_interact_posters_task: debug: false type: task script: + - run storyboard_player_begin_atomic_sequence def.queue: def.player: - ~run textbox_write def.player: def.queue: "def.line3s:Book-related posters are on the wall." - ~run textbox_write def.player: def.queue: "def.line3s:<&o><&dq>Screw that. I'm running away.<&dq>" - ~run textbox_write def.player: def.queue: def.line3s:<&o><&dq>Where?<&dq> - ~run textbox_write def.player: def.queue: "def.line3s:<&o><&dq>Dunno. Do you want to come?<&dq>" - ~run textbox_write def.player: def.queue: "def.line3s:<&o><&dq>Yes,<&dq> I said without thinking." + - run storyboard_player_end_atomic_sequence def.queue: def.player: # Cirno intro_interact_cirno: @@ -38,8 +40,10 @@ intro_interact_cirno_task: debug: false type: task script: + - run storyboard_player_begin_atomic_sequence def.queue: def.player: - ~run textbox_write def.player: def.queue: "def.line3s:A quality, soft plushie of a beloved$$nlcharacter." - ~run textbox_write def.player: def.queue: "def.line3s:It seems familiar, as if there are a$$nlsubstantial amount of images circulating$$nlaround with this character." + - run storyboard_player_end_atomic_sequence def.queue: def.player: # Laptop intro_interact_laptop: @@ -58,6 +62,7 @@ intro_interact_laptop_task: debug: false type: task script: + - run storyboard_player_begin_atomic_sequence def.queue: def.player: - ~run textbox_write def.player: def.queue: "def.line3s:It looks like a game is booted up.$$nlYou can see a city, and it looks like..." - ~run textbox_write def.player: def.queue: "def.line3s:. . ." - ~run textbox_write def.player: def.queue: "def.line3s:It's you!$$nl. . .$$nlWell, it's your character." @@ -197,3 +202,4 @@ intro_interact_laptop_task_role_callback: - adjust show_to_players - flag intro:done - execute as_player player: spawn + - run storyboard_player_end_atomic_sequence def.queue: def.player: diff --git a/scripts/storyboard/tasks/storyboard_player_tasks.dsc b/scripts/storyboard/tasks/storyboard_player_tasks.dsc index 9023fbd..1295fd1 100644 --- a/scripts/storyboard/tasks/storyboard_player_tasks.dsc +++ b/scripts/storyboard/tasks/storyboard_player_tasks.dsc @@ -60,6 +60,36 @@ storyboard_player_unfreeze: - adjust walk_speed: - flag storyboard_freeze_speed:! +# Marks the script after this task as an atomic sequence, meaning that +# the script either fully completes or is restored back to this point. +# This task does not ensure the atomicity, instead it will block any +# futher executions of the given script (deduced from the queue) until +# storyboard_player_end_atomic_sequence is called, or until the player +# logs off (which basically negates the atomicity). The developer must +# ensure that the script enclosed by the begin and end tasks is atomic. +storyboard_player_begin_atomic_sequence: + debug: false + type: task + definitions: queue|player + script: + - announce to_ops <[queue].script.name> + - if <[player].flag[storyboard_atomic].if_null[].contains[<[queue].script.name>]>: + - queue <[queue]> stop + - stop + - flag <[player]> storyboard_atomic:<[player].flag[storyboard_atomic].if_null[].with[<[queue].script.name>].as[]> + +# Ends the atomic sequence above this task. See the sibling task +# storyboard_player_begin_atomic_sequence for more details. +storyboard_player_end_atomic_sequence: + debug: false + type: task + definitions: queue|player + script: + - if !<[player].flag[storyboard_atomic].if_null[].contains[<[queue].script.name>]>: + - debug error "Tried ending storyboard atomic sequence <[queue].script.name> before storyboard_player_begin_atomic_sequence was called! (Player UUID <[player].uuid>)" + - stop + - flag <[player]> storyboard_atomic:<[player].flag[storyboard_atomic].if_null[].exclude[<[queue].script.name>]> + ## Internal only! storyboard_player_freeze_check: debug: false @@ -68,3 +98,12 @@ storyboard_player_freeze_check: on player joins: - if : - run storyboard_player_unfreeze def.player: + +storyboard_player_atomic_sequence_disconnect_handler: + debug: false + type: world + events: + on player quit: + - flag storyboard_atomic:! + on player joins: + - flag storyboard_atomic:!