This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
# ── Persistent flags ──────────────────────────────────────────────────────────
|
# ── Persistent flags ──────────────────────────────────────────────────────────
|
||||||
default checkpoint_set = False
|
# `checkpoint` (the rewind destination) is defined globally in script.rpy.
|
||||||
default rewind_used = False
|
default rewind_used = False
|
||||||
default purpose_chosen = False
|
default purpose_chosen = False
|
||||||
default silence_chosen = False # here Sara learns that Luno asks everyone the same question
|
default silence_chosen = False # here Sara learns that Luno asks everyone the same question
|
||||||
@@ -31,38 +31,28 @@ label arrival:
|
|||||||
jump .choice_screen
|
jump .choice_screen
|
||||||
|
|
||||||
label .rewind_choice:
|
label .rewind_choice:
|
||||||
if not checkpoint_set:
|
if checkpoint is None:
|
||||||
|
# No checkpoint created yet — can't rewind, move on.
|
||||||
jump .kaeros_arrives
|
jump .kaeros_arrives
|
||||||
|
|
||||||
|
# The shared screen handles both buttons:
|
||||||
|
# Rewind -> .do_rewind -> rewind_to(checkpoint) (teal wash, then lands here)
|
||||||
|
# Continue -> hides the screen, and we resume below.
|
||||||
show screen rewind_prompt
|
show screen rewind_prompt
|
||||||
menu:
|
hide screen rewind_prompt
|
||||||
"[[ Rewind ]":
|
|
||||||
hide screen rewind_prompt
|
# Resuming after "Continue": clear the checkpoint and move on.
|
||||||
$ rewind_used = True
|
$ checkpoint = None
|
||||||
scene black
|
$ rewind_used = False
|
||||||
with dissolve
|
jump .kaeros_arrives
|
||||||
show screen teal_wash
|
|
||||||
"The world pulls back."
|
|
||||||
"Colour drains to teal. Sound slows to nothing."
|
|
||||||
hide screen teal_wash
|
|
||||||
scene bg training_yard
|
|
||||||
with dissolve
|
|
||||||
show sara neutral at left
|
|
||||||
show luno curious at right
|
|
||||||
thinking "Let's try this again."
|
|
||||||
jump .choice_screen
|
|
||||||
"[[ Continue ]":
|
|
||||||
hide screen rewind_prompt
|
|
||||||
# reset flags
|
|
||||||
$ checkpoint_set = False
|
|
||||||
$ rewind_used = False
|
|
||||||
jump .kaeros_arrives
|
|
||||||
|
|
||||||
label .choice_screen:
|
label .choice_screen:
|
||||||
menu:
|
menu:
|
||||||
"Why are you here?"
|
"Why are you here?"
|
||||||
"[[ Create Checkpoint ]" if not checkpoint_set:
|
"[[ Create Checkpoint ]" if checkpoint is None:
|
||||||
$ checkpoint_set = True
|
# Store where a rewind should land, plus what to reset on rewind.
|
||||||
|
$ checkpoint = ".choice_screen"
|
||||||
|
$ rewind_reset = ["rewind_used = True"]
|
||||||
scene black
|
scene black
|
||||||
with dissolve
|
with dissolve
|
||||||
"A flash. Sara's hand, signing something. A contract. The ink is red."
|
"A flash. Sara's hand, signing something. A contract. The ink is red."
|
||||||
|
|||||||
@@ -23,24 +23,95 @@ label first_test:
|
|||||||
mercenary "Begin the match!"
|
mercenary "Begin the match!"
|
||||||
scene black
|
scene black
|
||||||
with dissolve
|
with dissolve
|
||||||
"TODO: premonition"
|
"The feeling of a cold thread. The feeling of the air thickening."
|
||||||
scene bg training_yard
|
scene bg training_yard
|
||||||
with dissolve
|
with dissolve
|
||||||
|
# Checkpoint: a rewind from anywhere in the spar lands back at the first
|
||||||
|
# exchange. `rewind_reset` is empty — the spar's state is re-derived from
|
||||||
|
# the choices, so there are no flags to reset.
|
||||||
|
$ checkpoint = ".first_attack_choice"
|
||||||
|
$ rewind_reset = []
|
||||||
eron "Hyaaa"
|
eron "Hyaaa"
|
||||||
jump .first_attack_choice
|
jump .first_attack_choice
|
||||||
|
|
||||||
|
|
||||||
label .first_attack_choice:
|
label .first_attack_choice:
|
||||||
|
"Eron raises his sword over his right shoulder."
|
||||||
menu:
|
menu:
|
||||||
thinking "Fast!"
|
thinking "Fast!"
|
||||||
"Dodge left":
|
"Dodge left":
|
||||||
jump .first_attack_left
|
jump .dodge_left
|
||||||
"Dodge right":
|
"Dodge right":
|
||||||
jump .first_attack_right
|
jump .dodge_right
|
||||||
"Parry":
|
"Parry":
|
||||||
jump .first_attack_parry
|
jump .parry
|
||||||
|
|
||||||
label .first_attack_left:
|
|
||||||
thinking "Hairs breadth!"
|
|
||||||
thinking "I need to regain my balance and counter"
|
|
||||||
|
|
||||||
|
# Initial left
|
||||||
|
label .dodge_left:
|
||||||
|
"Whizz! The sword almost grazes her right shoulder."
|
||||||
|
thinking "Hairs breadth!"
|
||||||
|
menu:
|
||||||
|
thinking "I need to regain my balance and counter."
|
||||||
|
"Counterattack":
|
||||||
|
jump .dodge_left_counterattack
|
||||||
|
"Anticipate next attack":
|
||||||
|
jump .dodge_left_anticipate
|
||||||
|
|
||||||
|
## Left -> counter
|
||||||
|
label .dodge_left_counterattack:
|
||||||
|
"Whack! The sword turns quickly and strikes her leg."
|
||||||
|
sara "Ugh!"
|
||||||
|
thinking "He hit my leg! Should i try another attack or go back?"
|
||||||
|
menu:
|
||||||
|
"[[Rewind]":
|
||||||
|
# Shared mechanic: reads `checkpoint` (".first_attack_choice") and
|
||||||
|
# rewinds there via the teal-wash effect, then returns here.
|
||||||
|
call .do_rewind
|
||||||
|
"Press the attack":
|
||||||
|
jump .dodge_left_counterattack_press
|
||||||
|
|
||||||
|
label .dodge_left_counterattack_press:
|
||||||
|
"Whack! Eron takes the momentum of the recoil from the leg strike and makes a lightning fast spinning attack for Saras temple."
|
||||||
|
screen black with dissolve
|
||||||
|
jump .after_spar
|
||||||
|
|
||||||
|
## Left -> anticipate
|
||||||
|
label .dodge_left_anticipate:
|
||||||
|
thinking "I dodged to the left, so the next attack will come from the right."
|
||||||
|
menu:
|
||||||
|
"Dodge further left":
|
||||||
|
jump .dodge_left_anticipate_left
|
||||||
|
"Jump":
|
||||||
|
jump .dodge_left_anticipate_jump
|
||||||
|
"Parry":
|
||||||
|
jump .dodge_left_anticipate_parry
|
||||||
|
|
||||||
|
## Left -> anticipate -> left
|
||||||
|
label .dodge_left_anticipate_left:
|
||||||
|
"Erons sword that narrowly missed her right side quickly turns and aims for her legs."
|
||||||
|
"The tradjectory of the sword is faster than she can dodge away but the increased distance allows eron to adjust the trajectory."
|
||||||
|
"Eron upswings unter her raised arms quarely into Saras stomach"
|
||||||
|
sara "Ugh!"
|
||||||
|
thinking "That knocked the air out of me! I need to catch my breath. Or should I rewind?"
|
||||||
|
menu:
|
||||||
|
"[[Rewind]":
|
||||||
|
call .do_rewind
|
||||||
|
"Create distance":
|
||||||
|
jump .dodge_left_anticipate_left_distance
|
||||||
|
|
||||||
|
label .dodge_left_anticipate_left_distance:
|
||||||
|
"Whack! Eron takes the momentum of the recoil from the stomach strike and makes a lightning fast spinning attack for Saras temple."
|
||||||
|
screen black with dissolve
|
||||||
|
jump .after_spar
|
||||||
|
|
||||||
|
label .dodge_left_anticipate_jump:
|
||||||
|
"Sara jumps over the incoming strike, landing gracefully."
|
||||||
|
jump .eron_adjusts
|
||||||
|
|
||||||
|
# Initial right
|
||||||
|
label .dodge_right:
|
||||||
|
|
||||||
|
label .parry:
|
||||||
|
|
||||||
|
|
||||||
|
label .after_spar:
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
define sara = Character("Sara", color="#5acbd5")
|
define sara = Character("Sara", color="#5acbd5")
|
||||||
define thinking = Character("Sara", color="#1d9fa4", what_italic=True)
|
define thinking = Character("Sara", color="#1d9fa4", what_italic=True)
|
||||||
define luno = Character("Luno", color="#1b449d")
|
define luno = Character("Luno", color="#1b449d")
|
||||||
|
define eron = Character("Eron", color="#c98a3a")
|
||||||
define narrator = Character(None)
|
define narrator = Character(None)
|
||||||
define mercenary = Character("Iron Hollow Mercenary", color="#ff0000")
|
define mercenary = Character("Iron Hollow Mercenary", color="#ff0000")
|
||||||
+47
-2
@@ -4,15 +4,60 @@ label start:
|
|||||||
jump arrival
|
jump arrival
|
||||||
|
|
||||||
|
|
||||||
|
# ── Rewind mechanic (shared across all scripts) ──────────────────────────────
|
||||||
|
# Where the next rewind lands. Set this at every checkpoint you create.
|
||||||
|
default checkpoint = None
|
||||||
|
|
||||||
|
# Optional: a list of $-statements to run when rewinding (reset flags, etc.).
|
||||||
|
# Kept separate from `checkpoint` so the destination label stays a plain string.
|
||||||
|
default rewind_reset = []
|
||||||
|
|
||||||
|
# Plays the shared rewind effect, then returns to `destination`.
|
||||||
|
# Uses `call` (not `jump`) so it is re-entrant: rewinding to a label that is
|
||||||
|
# already on the call stack (e.g. back to a choice mid-spar) returns cleanly
|
||||||
|
# to the caller instead of corrupting the stack.
|
||||||
|
# Call as: call rewind_to .some_label
|
||||||
|
label rewind_to(destination):
|
||||||
|
scene black
|
||||||
|
with dissolve
|
||||||
|
show screen teal_wash
|
||||||
|
"The world pulls back."
|
||||||
|
"Colour drains to teal. Sound slows to nothing."
|
||||||
|
hide screen teal_wash
|
||||||
|
scene black
|
||||||
|
with dissolve
|
||||||
|
# Run any per-checkpoint reset statements (e.g. $ rewind_used = False)
|
||||||
|
for _stmt in rewind_reset:
|
||||||
|
$ eval(_stmt)
|
||||||
|
call destination
|
||||||
|
|
||||||
|
|
||||||
# ── Screens ───────────────────────────────────────────────────────────────────
|
# ── Screens ───────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Shared rewind prompt. "Rewind" jumps to .do_rewind, which reads the
|
||||||
|
# current `checkpoint` and routes through the reusable rewind_to label.
|
||||||
|
# "Continue" just hides the screen and lets the calling script resume.
|
||||||
screen rewind_prompt():
|
screen rewind_prompt():
|
||||||
zorder 10
|
zorder 10
|
||||||
text "Rewind available":
|
textbutton "⟲ Rewind" action Jump(".do_rewind"):
|
||||||
xalign 0.05
|
xalign 0.05
|
||||||
yalign 0.95
|
yalign 0.95
|
||||||
color "#4ab8b8"
|
|
||||||
size 22
|
size 22
|
||||||
|
color "#4ab8b8"
|
||||||
|
textbutton "Continue" action Hide("rewind_prompt"):
|
||||||
|
xalign 0.05
|
||||||
|
xoffset 120
|
||||||
|
yalign 0.95
|
||||||
|
size 22
|
||||||
|
color "#4ab8b8"
|
||||||
|
|
||||||
|
# Reads the stored checkpoint and rewinds to it.
|
||||||
|
label .do_rewind:
|
||||||
|
hide screen rewind_prompt
|
||||||
|
if checkpoint is None:
|
||||||
|
# No checkpoint set — just resume.
|
||||||
|
return
|
||||||
|
call rewind_to checkpoint
|
||||||
|
|
||||||
screen teal_wash():
|
screen teal_wash():
|
||||||
zorder 20
|
zorder 20
|
||||||
|
|||||||
Reference in New Issue
Block a user