Added atomic handling for storyboard operations and fixed various bugs #4

Merged
bqkitcat merged 2 commits from feature-storyboard-atomic into main 2026-01-09 12:25:07 +01:00
6 changed files with 55 additions and 0 deletions
Showing only changes of commit 37268060a2 - Show all commits

View File

@@ -34,6 +34,7 @@ ch1_1_marie_interact:
1:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player duration:999999s
@@ -97,9 +98,11 @@ ch1_1_marie_interact:
- run storyboard_npc_state_set def.player:<player> def.name:marie def.key:opinion def.value:-1
- zap 2
- disengage player
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>
2:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != 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:<queue> def.player:<player>

View File

@@ -14,6 +14,7 @@ dialogue_npc_kobayashi:
1:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
@@ -45,3 +46,4 @@ dialogue_npc_kobayashi:
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Indeed, luv."
- wait 1s
- disengage player
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -14,6 +14,7 @@ dialogue_npc_patchouli:
1:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
@@ -23,3 +24,4 @@ dialogue_npc_patchouli:
- wait 1s
- disengage player
- ratelimit <player> 10t
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -14,6 +14,7 @@ dialogue_npc_ryuko:
1:
click trigger:
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- if <player.flag[textbox_state].if_null[null]> != null:
- stop
- engage player
@@ -29,3 +30,4 @@ dialogue_npc_ryuko:
- wait 1s
- disengage player
- ratelimit <player> 10t
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -15,11 +15,13 @@ intro_interact_posters_task:
debug: false
type: task
script:
- run storyboard_player_begin_atomic_sequence def.queue:<queue> def.player:<player>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:Book-related posters are on the wall."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Screw that. I'm running away.<&dq>"
- ~run textbox_write def.player:<player> def.queue:<queue> def.line3s:<&o><&dq>Where?<&dq>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Dunno. Do you want to come?<&dq>"
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:<&o><&dq>Yes,<&dq> I said without thinking."
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<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:<queue> def.player:<player>
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:A quality, soft plushie of a beloved$$nlcharacter."
- ~run textbox_write def.player:<player> def.queue:<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:<queue> def.player:<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:<queue> def.player:<player>
- ~run textbox_write def.player:<player> def.queue:<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:<player> def.queue:<queue> "def.line3s:. . ."
- ~run textbox_write def.player:<player> def.queue:<queue> "def.line3s:It's <bold>you!$$nl. . .$$nlWell, it's your character."
@@ -197,3 +202,4 @@ intro_interact_laptop_task_role_callback:
- adjust <player> show_to_players
- flag <player> intro:done
- execute as_player player:<player> spawn
- run storyboard_player_end_atomic_sequence def.queue:<queue> def.player:<player>

View File

@@ -60,6 +60,36 @@ storyboard_player_unfreeze:
- adjust <player> walk_speed:<player.flag[storyboard_freeze_speed]>
- flag <player> 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[<map[]>].contains[<[queue].script.name>]>:
- queue <[queue]> stop
- stop
- flag <[player]> storyboard_atomic:<[player].flag[storyboard_atomic].if_null[<map[]>].with[<[queue].script.name>].as[<util.time_now>]>
# 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[<map[]>].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[<map[]>].exclude[<[queue].script.name>]>
## Internal only!
storyboard_player_freeze_check:
debug: false
@@ -68,3 +98,12 @@ storyboard_player_freeze_check:
on player joins:
- if <player.has_flag[storyboard_freeze_speed]>:
- run storyboard_player_unfreeze def.player:<player>
storyboard_player_atomic_sequence_disconnect_handler:
debug: false
type: world
events:
on player quit:
- flag <player> storyboard_atomic:!
on player joins:
- flag <player> storyboard_atomic:!