Files
SurvivalOfTheSnippest/level/ui/scripts/run_results.gd
T

135 lines
4.4 KiB
GDScript
Raw Normal View History

extends Control
class_name RunResults
## End-of-run results screen for the gladiator arena.
## Shown by the HUD when the local player dies. Displays survival stats and
## the death settlement (keep 10% of total value, floored at the fresh-start
## default), then returns the player to the menu/camp.
var stats: Dictionary = {}
func setup(run_stats: Dictionary):
stats = run_stats
func _ready():
# Full-screen dark backdrop
set_anchors_preset(Control.PRESET_FULL_RECT)
mouse_filter = Control.MOUSE_FILTER_STOP
var backdrop = ColorRect.new()
backdrop.color = Color(0.0, 0.0, 0.0, 0.75)
backdrop.set_anchors_preset(Control.PRESET_FULL_RECT)
add_child(backdrop)
# Centered panel
var center = CenterContainer.new()
center.set_anchors_preset(Control.PRESET_FULL_RECT)
add_child(center)
var panel = PanelContainer.new()
panel.custom_minimum_size = Vector2(460, 0)
center.add_child(panel)
var margin = MarginContainer.new()
margin.add_theme_constant_override("margin_left", 30)
margin.add_theme_constant_override("margin_right", 30)
margin.add_theme_constant_override("margin_top", 24)
margin.add_theme_constant_override("margin_bottom", 24)
panel.add_child(margin)
var vbox = VBoxContainer.new()
vbox.add_theme_constant_override("separation", 8)
margin.add_child(vbox)
# Title
var title = Label.new()
title.text = "YOU HAVE FALLEN"
title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
title.add_theme_font_size_override("font_size", 36)
title.add_theme_color_override("font_color", Color(0.9, 0.2, 0.2))
vbox.add_child(title)
var subtitle = Label.new()
subtitle.text = "The arena claims another gladiator"
subtitle.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
subtitle.add_theme_font_size_override("font_size", 16)
subtitle.add_theme_color_override("font_color", Color(0.7, 0.7, 0.7))
vbox.add_child(subtitle)
_add_spacer(vbox, 12)
# Survival stats
_add_header(vbox, "=== SURVIVAL ===")
_add_stat_row(vbox, "Waves Survived", str(int(stats.get("waves", 0))))
_add_stat_row(vbox, "Time in Arena", _format_time(stats.get("time", 0.0)))
_add_stat_row(vbox, "Kills", str(int(stats.get("kills", 0))))
_add_spacer(vbox, 12)
# Settlement
_add_header(vbox, "=== SETTLEMENT ===")
_add_stat_row(vbox, "Gold Earned This Run", str(int(stats.get("gold_earned", 0))))
_add_stat_row(vbox, "Total Value at Death", str(int(stats.get("total_value", 0))))
var kept = int(stats.get("kept", 0))
var kept_row = Label.new()
kept_row.text = "The arena takes its cut... you keep " + str(kept) + " gold"
kept_row.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
kept_row.add_theme_font_size_override("font_size", 18)
kept_row.add_theme_color_override("font_color", Color(1.0, 0.8, 0.0))
vbox.add_child(kept_row)
_add_spacer(vbox, 16)
# Return button
var return_button = Button.new()
return_button.text = "Return to Camp"
return_button.custom_minimum_size = Vector2(0, 44)
return_button.pressed.connect(_on_return_pressed)
vbox.add_child(return_button)
# Make sure the mouse is usable on the overlay
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
func _add_header(parent: Control, text: String):
var label = Label.new()
label.text = text
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
label.add_theme_font_size_override("font_size", 16)
label.add_theme_color_override("font_color", Color(0.8, 0.8, 0.8))
parent.add_child(label)
func _add_stat_row(parent: Control, label_text: String, value_text: String):
var row = HBoxContainer.new()
var label = Label.new()
label.text = label_text
label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
label.add_theme_font_size_override("font_size", 16)
row.add_child(label)
var value = Label.new()
value.text = value_text
value.add_theme_font_size_override("font_size", 16)
value.add_theme_color_override("font_color", Color(1.0, 0.8, 0.0))
row.add_child(value)
parent.add_child(row)
func _add_spacer(parent: Control, height: int):
var spacer = Control.new()
spacer.custom_minimum_size = Vector2(0, height)
parent.add_child(spacer)
func _format_time(seconds: float) -> String:
var total = int(seconds)
return "%dm %02ds" % [total / 60, total % 60]
func _on_return_pressed():
# Tear down the multiplayer session and go back to the menu.
# (Host quitting ends the session for connected clients - acceptable for now.)
multiplayer.multiplayer_peer = null
Network.players.clear()
if has_node("/root/HUD"):
get_node("/root/HUD").reset()
get_tree().reload_current_scene()