Somewhat working first test
Build and Deploy Ren'Py Web / deploy (push) Successful in 37s

This commit is contained in:
Dynamitos
2026-09-13 22:03:10 +02:00
parent 077890d752
commit 38fc15c175
5 changed files with 91 additions and 108 deletions
+24 -15
View File
@@ -30,16 +30,21 @@ label arrival:
luno "So. Money, glory, or are you just bored?" luno "So. Money, glory, or are you just bored?"
jump .choice_screen jump .choice_screen
# Per-checkpoint reset: called by the shared rewind mechanic before it lands.
label .arrival_rewind_reset:
$ rewind_used = True
return
label .rewind_choice: label .rewind_choice:
if checkpoint is None: if checkpoint is None:
# No checkpoint created yet — can't rewind, move on. # No checkpoint created yet — can't rewind, move on.
jump .kaeros_arrives jump .kaeros_arrives
# The shared screen handles both buttons: menu:
# Rewind -> .do_rewind -> rewind_to(checkpoint) (teal wash, then lands here) "[[Rewind]":
# Continue -> hides the screen, and we resume below. jump rewind_to
show screen rewind_prompt "Continue":
hide screen rewind_prompt pass
# Resuming after "Continue": clear the checkpoint and move on. # Resuming after "Continue": clear the checkpoint and move on.
$ checkpoint = None $ checkpoint = None
@@ -47,12 +52,19 @@ label .rewind_choice:
jump .kaeros_arrives jump .kaeros_arrives
label .choice_screen: label .choice_screen:
scene bg training_yard
with fade
show sara neutral at left
show luno curious at right
menu: menu:
"Why are you here?" "Why are you here?"
"[[ Create Checkpoint ]" if checkpoint is None: "[[ Create Checkpoint ]" if checkpoint is None:
# Store where a rewind should land, plus what to reset on rewind. # Store where a rewind should land, plus the reset label to call.
$ checkpoint = ".choice_screen" $ checkpoint = "arrival.choice_screen"
$ rewind_reset = ["rewind_used = True"] $ rewind_reset_label = "arrival.arrival_rewind_reset"
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."
@@ -152,14 +164,12 @@ label .branch_sharp:
label .kaeros_arrives: label .kaeros_arrives:
"Before the silence can settle, footsteps at the gate." "Before the silence can settle, footsteps at the gate."
show kaeros guarded at right show kaeros guarded at right
show mira curious at left
kaeros "Is this the Iron Hollow?" kaeros "Is this the Iron Hollow?"
luno "Looks like quite a few people are interested. You are at the right place." luno "Looks like quite a few people are interested. You are at the right place."
luno "Why do you want to join the Hollow?" luno "Why do you want to join the Hollow?"
mira "To protect people from evil---" mira "To protect people from evil---"
kaeros "To make some money. Have to live off something around here." kaeros "To make some money. Have to live off something around here."
show mira timit at left show luno laugh at right
show luno laughing at right
luno "I see, you have you priorities in order." luno "I see, you have you priorities in order."
show luno neutral at right show luno neutral at right
luno "I like that. I am Luno, I arrived a while a go. Give the man over there your names and wait." luno "I like that. I am Luno, I arrived a while a go. Give the man over there your names and wait."
@@ -169,17 +179,16 @@ label .kaeros_arrives:
scene black scene black
with dissolve with dissolve
scene bg table scene bg table
show sara at left show sara neutral at left
show iron_hollow_mercenary at right # show iron_hollow_mercenary at right
sara "The three of us are here to register." sara "The three of us are here to register."
mercenary "Tell me your names and blessing." mercenary "Tell me your names and blessing."
show mira excited at left
mira "I'm Mira, and I have a fire blessing. I can do a lot of things with it, like make bursts---" mira "I'm Mira, and I have a fire blessing. I can do a lot of things with it, like make bursts---"
show kaeros guarded at left show kaeros guarded at left
kaeros "I'm Kaeros, and I have a water blessing." kaeros "I'm Kaeros, and I have a water blessing."
kaeros "..." kaeros "..."
mercenary "Alright, what about you?" mercenary "Alright, what about you?"
show sara at left show sara neutral at left
sara "My name is Sara, I have a wind blessing, but its really weak. My expertise is more with strategy." sara "My name is Sara, I have a wind blessing, but its really weak. My expertise is more with strategy."
mercenary "It's rare to have a strategist join a band of mercenaries. I hope you can at least hold your own in combat." mercenary "It's rare to have a strategist join a band of mercenaries. I hope you can at least hold your own in combat."
mercenary "I think fo-- five people are enough for now, grab Luno and that guy over there and we'll get started." mercenary "I think fo-- five people are enough for now, grab Luno and that guy over there and we'll get started."
+34 -33
View File
@@ -2,24 +2,23 @@ label first_test:
scene black scene black
with dissolve with dissolve
scene bg training_yard scene bg training_yard
mercenary "It's time to prove you worth. We are gonna start with a simple test, so everyone gets a feel for each other." mercenary "It's time to see what you are made of. We are gonna start with a simple test, so we can get a feel for what you can do."
mercenary "One-on-one fights, but since we are an uneven number, one person will have to fight twice." mercenary "One-on-one fights, but since we are an uneven number, one person will have to fight twice."
mercenary "It will be a friendly spar, so using wooden weapons, and no permanent injuries allowed. First contact wins." mercenary "It will be a friendly spar, so using wooden weapons, make your opponent give up, but no killing allowed. Try to avoid injuring them too much, but if they refuse to give up, it is what it is."
mercenary "And also, no blessings." mercenary "And also, no blessings."
eron "Seems easy, can I go first?" eron "Seems easy, can I go first?"
thinking "I'm not sure if this test is that simple. Since none of us know each other, aside from maybe these two, it is hard to judge how much to hold back without loosing instantly." thinking "I'm not sure if this test is that simple. Since none of us know each other, aside from maybe these two, it is hard to judge how much to hold back without loosing instantly."
thinking "If you go all out and injure the opponent, you probably get disqualified. But if you hold back too much, you might loose in the first strike." thinking "If you go all out and seriously injure the opponent, you probably get disqualified. But if you hold back too much, you might loose in the first strike."
mercenary "Since you seem to be so eager, you can go first, and your opponent will be Sara." mercenary "Since you seem to be so eager, you can go first, and your opponent will be Sara."
thinking "Why does it have to b:e me? That guy seems to be really strong." thinking "Why does it have to be me? That guy seems to be really strong."
thinking "Maybe it's not so bad, since I can display any gift, it will be a good chance to prove my worth."
sara "Are we allowed to use the surroundings?" sara "Are we allowed to use the surroundings?"
mercenary "This is a sparring match without blessings, you are supposed to show your weapons techinques, so no." mercenary "This is a sparring match without blessings, you are supposed to show your weapon techinques, so no."
thinking "That makes things even harder. One on one without being able to use the environment gives me not a lot of room to work with." thinking "That makes things even harder. One on one without being able to use the environment doesn't give me a lot of room to work with."
thinking "I don't think I can win against him in direct combat. At first glance he might seem arrogant, but from his stance I can tell he is not an amateur." thinking "I don't think I can win against him in direct combat. At first glance he might seem arrogant, but from his stance I can tell he is not an amateur."
thinking "My only advantage is that he cannot use his blessing, while I can, since noone will remember." thinking "My only advantage is that he cannot use his blessing, while I can, since noone will remember."
thinking "But rewinding after every strike will consume way too much energy, I will have to use as much of my own skill as possible." thinking "But rewinding after every strike will consume way too much energy, I will have to use as much of my own skill as possible."
with dissolve with dissolve
scene bg eron_ready # scene bg eron_ready
mercenary "Begin the match!" mercenary "Begin the match!"
scene black scene black
with dissolve with dissolve
@@ -27,16 +26,17 @@ label first_test:
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 # 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 # exchange. No reset label needed — the spar's state is re-derived from
# the choices, so there are no flags to reset. # the choices, so there are no flags to reset (rewind_reset_label stays None).
$ checkpoint = ".first_attack_choice" $ checkpoint = "first_test.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." scene bg training_yard
with dissolve
"Eron dashes with his sword raised over his right shoulder."
menu: menu:
thinking "Fast!" thinking "Fast!"
"Dodge left": "Dodge left":
@@ -66,13 +66,13 @@ label .dodge_left_counterattack:
"[[Rewind]": "[[Rewind]":
# Shared mechanic: reads `checkpoint` (".first_attack_choice") and # Shared mechanic: reads `checkpoint` (".first_attack_choice") and
# rewinds there via the teal-wash effect, then returns here. # rewinds there via the teal-wash effect, then returns here.
call do_rewind jump rewind_to
"Press the attack": "Press the attack":
jump .dodge_left_counterattack_press jump .dodge_left_counterattack_press
label .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." "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 scene black with dissolve
jump .after_spar jump .after_spar
## Left -> anticipate ## Left -> anticipate
@@ -89,22 +89,22 @@ label .dodge_left_anticipate:
## Left -> anticipate -> left ## Left -> anticipate -> left
label .dodge_left_anticipate_left: label .dodge_left_anticipate_left:
"Erons sword that narrowly missed her right side quickly turns and aims for her legs." "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." "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" "Eron upswings under her raised arms squarely into Saras stomach"
sara "Ugh!" sara "Ugh!"
thinking "That knocked the air out of me! I need to catch my breath. Or should I rewind?" thinking "That knocked the air out of me! I need to catch my breath. Or should I rewind?"
menu: menu:
"[[Rewind]": "[[Rewind]":
call do_rewind jump rewind_to
"Create distance": "Create distance":
jump .dodge_left_anticipate_left_distance jump .dodge_left_anticipate_left_distance
label .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." "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 scene black with dissolve
jump .after_spar jump .after_spar
label .dodgle_left_anticipate_jump: label .dodge_left_anticipate_jump:
"Sara leaps into the air, narrowly avoiding the strike." "Sara leaps into the air, narrowly avoiding the strike."
"Eron uses the momentum of the missed strike to do a spinning attack" "Eron uses the momentum of the missed strike to do a spinning attack"
menu: menu:
@@ -118,20 +118,16 @@ label .dodge_left_anticipate_jump_attack:
"Sara tries to go for the opening" "Sara tries to go for the opening"
"But she is simply too slow, she lacks combat experience." "But she is simply too slow, she lacks combat experience."
"Eron hits her temple with the spinning attack before she can hit is back" "Eron hits her temple with the spinning attack before she can hit is back"
screen black with dissolve scene black with dissolve
jump .after_spar jump .after_spar
label .dodge_left_anticipate_jump:
"Sara jumps over the incoming strike, landing gracefully."
jump .eron_adjusts
# Initial right # Initial right
label .dodge_right: label .dodge_right:
"Sara dodges straight into Eron's attack, and gets hit on the shoulder." "Sara dodges straight into Eron's attack, and gets hit on the shoulder."
thinking "Ugh! That was a heavy hit, should I rewind? No, I should gather more information first" thinking "Ugh! That was a heavy hit, should I rewind? No, I should gather more information first"
menu: menu:
"[[Rewind]": "[[Rewind]":
call do_rewind jump rewind_to
"Create distance": "Create distance":
jump .dodge_right_distance jump .dodge_right_distance
@@ -147,7 +143,7 @@ label .dodge_right_distance:
label .dodge_right_distance_distance: label .dodge_right_distance_distance:
"Sara manages to create some distance, but Eron is relentless and quickly closes the gap again." "Sara manages to create some distance, but Eron is relentless and quickly closes the gap again."
"Before she can further react, he strikes her temple." "Before she can further react, he strikes her temple."
screen black with dissolve scene black with dissolve
jump .after_spar jump .after_spar
# Initial parry # Initial parry
@@ -157,7 +153,7 @@ label .parry:
thinking "Ugh! How heavy was that strike? I am already loosing my grip. Should I rewind right way?" thinking "Ugh! How heavy was that strike? I am already loosing my grip. Should I rewind right way?"
menu: menu:
"[[Rewind]": "[[Rewind]":
call do_rewind jump rewind_to
"Recover": "Recover":
jump .parry_recover jump .parry_recover
"Create distance": "Create distance":
@@ -173,16 +169,21 @@ label .parry_recover:
label .parry_recover_parry: label .parry_recover_parry:
"Sara attempts to parry again, but Eron strikes through her defense, hitting her temple." "Sara attempts to parry again, but Eron strikes through her defense, hitting her temple."
screen black with dissolve scene black with dissolve
jump .after_spar jump .after_spar
label .parry_recover_dodge: label .parry_recover_dodge:
"Sara attempts to dodge, but Eron anticipates her movement and strikes her temple." "Sara attempts to dodge, but Eron anticipates her movement and strikes her temple."
screen black with dissolve scene black with dissolve
jump .after_spar
label .parry_create_distance:
"Sara tries to create distance between herself and Eron, but he lunges after her."
"Before she can react, he strikes her temple"
scene black with dissolve
jump .after_spar jump .after_spar
label .after_spar: label .after_spar:
"Sara lies on the ground, trying to recover from the intense sparring session with Eron." "Sara lies on the ground, trying to recover from the intense sparring session with Eron."
thinking "I need to analyze his movements more carefully next time." thinking "I need to analyze his movements more carefully next time."
return jump quit
+3 -1
View File
@@ -2,5 +2,7 @@ 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 eron = Character("Eron", color="#c98a3a")
define kaeros = Character("Kaeros", color="#96d08c")
define mira = Character("Mira", color="#c42626")
define narrator = Character(None) define narrator = Character(None)
define mercenary = Character("Iron Hollow Mercenary", color="#ff0000") define mercenary = Character("Iron Hollow Mercenary", color="#3a6998")
+30
View File
@@ -0,0 +1,30 @@
# ── Rewind mechanic (shared across all scripts) ──────────────────────────────
# Where the next rewind lands. Set this to a label string at each checkpoint.
default checkpoint = None
# Optional: a label to `call` for per-checkpoint flag resets, or None.
# Define it like: label .my_checkpoint_reset: $ some_flag = False return
default rewind_reset_label = None
# Plays the shared rewind effect, then returns to `destination` (a label string).
# 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:
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)
if rewind_reset_label is not None:
call expression rewind_reset_label
call expression checkpoint
screen teal_wash():
zorder 20
add Solid("#1a4a4a") alpha 0.7
-59
View File
@@ -3,62 +3,3 @@
label start: 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 ───────────────────────────────────────────────────────────────────
# 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():
zorder 10
textbutton "⟲ Rewind" action Jump(".do_rewind"):
xalign 0.05
yalign 0.95
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():
zorder 20
add Solid("#1a4a4a") alpha 0.7