Add thank-you ending screen and a run timer
Defeating the bear (the run's final boss) now plays a dedicated "Thank You For Playing" clip on the completion screen instead of the generic bull-win video, with the run's finish time shown in place of the usual "Bull Won!" title. A run clock also starts when the player enters the arena (the run's first fight), shown top-left on desktop only, and freezes the instant the bear falls. Re-entering the arena after finishing a run restarts the clock instead of leaving it stuck on the previous run's time. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MXBNaEBmrYDSMcv4NgUWtV
This commit is contained in:
@@ -33,6 +33,14 @@ var cleared: Dictionary = {}
|
||||
## loads — the player reads it on spawn — and is capped so it can't stack past BONUS_HP_CAP.
|
||||
var bonus_hp: int = 0
|
||||
const BONUS_HP_CAP: int = 2
|
||||
|
||||
## Wall-clock run timer: starts the moment the player walks through the arena gate (the
|
||||
## run's first fight) and freezes the instant the bear falls, so the completion screen can
|
||||
## show a final time. Time.get_ticks_msec()-based — real time, not delta-summed — so it
|
||||
## keeps ticking correctly across the scene reload between the arena and the bear's den.
|
||||
var _timer_start_msec: int = -1
|
||||
var _timer_end_msec: int = -1
|
||||
var _timer_running: bool = false
|
||||
## True once start_new_run() has built a run. Lets ensure_run() avoid wiping an active run
|
||||
## when the shell reloads for each fight.
|
||||
var _run_active: bool = false
|
||||
@@ -105,6 +113,9 @@ func start_new_run() -> void:
|
||||
lobby_choice = null
|
||||
cleared = {}
|
||||
bonus_hp = 0
|
||||
_timer_start_msec = -1
|
||||
_timer_end_msec = -1
|
||||
_timer_running = false
|
||||
_run_active = true
|
||||
run_started.emit()
|
||||
|
||||
@@ -154,3 +165,39 @@ func add_bonus_hp(amount: int) -> int:
|
||||
var before := bonus_hp
|
||||
bonus_hp = clampi(bonus_hp + amount, 0, BONUS_HP_CAP)
|
||||
return bonus_hp - before
|
||||
|
||||
|
||||
## Begin the run clock. No-op while the clock is already running, so walking back through
|
||||
## the arena gate mid-run can't restart it — but once it's been stopped (the bear is dead
|
||||
## and the player has looped back to the arena to go again), the next call restarts it from
|
||||
## zero rather than staying stuck showing the previous run's final time.
|
||||
func start_run_timer() -> void:
|
||||
if _timer_running:
|
||||
return
|
||||
_timer_start_msec = Time.get_ticks_msec()
|
||||
_timer_end_msec = -1
|
||||
_timer_running = true
|
||||
|
||||
|
||||
## Freeze the run clock — called the instant the bear falls, so the recorded time is the
|
||||
## kill moment itself, not whatever the win-screen's celebratory delay adds on top.
|
||||
func stop_run_timer() -> void:
|
||||
if not _timer_running:
|
||||
return
|
||||
_timer_end_msec = Time.get_ticks_msec()
|
||||
_timer_running = false
|
||||
|
||||
|
||||
## Seconds elapsed since the timer started (live while running, held steady once
|
||||
## stop_run_timer() has been called). 0 before the timer has ever started.
|
||||
func run_elapsed() -> float:
|
||||
if _timer_start_msec < 0:
|
||||
return 0.0
|
||||
var end_msec := Time.get_ticks_msec() if _timer_running else _timer_end_msec
|
||||
return float(end_msec - _timer_start_msec) / 1000.0
|
||||
|
||||
|
||||
## Whether the run clock has been started (the player has entered the arena at least once
|
||||
## this run). Lets the HUD hide the timer readout until there's a time worth showing.
|
||||
func run_timer_started() -> bool:
|
||||
return _timer_start_msec >= 0
|
||||
|
||||
@@ -8,5 +8,6 @@ func _ready() -> void:
|
||||
func _on_body_entered(body: Node3D) -> void:
|
||||
if not body.is_in_group("player"):
|
||||
return
|
||||
Run.start_run_timer()
|
||||
Run.choose_level(&"arena")
|
||||
get_tree().change_scene_to_file(Run.active_level().scene_path)
|
||||
|
||||
Reference in New Issue
Block a user