Route scenes/ui/ingame_menu.gd (4) and scenes/ui/lens_switcher.gd (4) off inline Color() literals onto existing design tokens (no token additions, no theme rebuild needed). - ingame_menu save status: green/red → semantic.positive / semantic.negative. - lens_switcher active-lens font → semantic.positive; panel bg → background.deepest (alpha 0.82 preserved) + border → border.panel. - Wrap two _show_status calls to satisfy max-line-length. Both files gdlint-clean; all token refs resolve. 0 inline Color() remain. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
128 lines
4.5 KiB
GDScript
128 lines
4.5 KiB
GDScript
extends Control
|
|
## In-game pause menu. Opened with ESC or a menu button.
|
|
## Provides: Resume, Quick Save, Save As, Load, Statistics, Options, Report Bug, Quit to Menu.
|
|
|
|
const SaveManagerScript = preload("res://engine/src/core/save_manager.gd")
|
|
|
|
@onready var _title_label: Label = get_node(
|
|
"CenterContainer/PanelContainer/MarginContainer/VBoxContainer/TitleLabel"
|
|
)
|
|
@onready var _resume_button: Button = %ResumeButton
|
|
@onready var _quick_save_button: Button = %QuickSaveButton
|
|
@onready var _save_button: Button = %SaveButton
|
|
@onready var _load_button: Button = %LoadButton
|
|
@onready var _stats_button: Button = %StatsButton
|
|
@onready var _options_button: Button = %OptionsButton
|
|
@onready var _bug_report_button: Button = %BugReportButton
|
|
@onready var _quit_button: Button = %QuitToMenuButton
|
|
@onready var _status_label: Label = %MenuStatusLabel
|
|
|
|
|
|
func _ready() -> void:
|
|
_title_label.text = ThemeVocabulary.lookup("ingame_menu_title")
|
|
_resume_button.text = ThemeVocabulary.lookup("ingame_menu_resume")
|
|
_quick_save_button.text = ThemeVocabulary.lookup("ingame_menu_quick_save")
|
|
_save_button.text = ThemeVocabulary.lookup("ingame_menu_save_game")
|
|
_load_button.text = ThemeVocabulary.lookup("ingame_menu_load_game")
|
|
_stats_button.text = ThemeVocabulary.lookup("ingame_menu_statistics")
|
|
_options_button.text = ThemeVocabulary.lookup("ingame_menu_options")
|
|
_bug_report_button.text = ThemeVocabulary.lookup("ingame_menu_report_bug")
|
|
_quit_button.text = ThemeVocabulary.lookup("ingame_menu_quit_to_menu")
|
|
_resume_button.pressed.connect(_on_resume)
|
|
_quick_save_button.pressed.connect(_on_quick_save)
|
|
_save_button.pressed.connect(_on_save)
|
|
_load_button.pressed.connect(_on_load)
|
|
_stats_button.pressed.connect(_on_stats)
|
|
_options_button.pressed.connect(_on_options)
|
|
_bug_report_button.pressed.connect(_on_bug_report)
|
|
_quit_button.pressed.connect(_on_quit_to_menu)
|
|
_status_label.text = ""
|
|
_resume_button.grab_focus()
|
|
get_tree().paused = true
|
|
EventBus.overlay_opened.emit("ingame_menu")
|
|
|
|
|
|
func _on_resume() -> void:
|
|
_close()
|
|
|
|
|
|
func _on_quick_save() -> void:
|
|
var turn: int = GameState.turn_number
|
|
var err: Error = SaveManagerScript.save_to_named_slot("quicksave")
|
|
if err == OK:
|
|
_show_status(
|
|
ThemeVocabulary.lookup("fmt_saved_turn") % turn,
|
|
ThemeAssets.color("semantic.positive"),
|
|
)
|
|
else:
|
|
_show_status(ThemeVocabulary.lookup("save_failed"), ThemeAssets.color("semantic.negative"))
|
|
|
|
|
|
func _on_save() -> void:
|
|
var turn: int = GameState.turn_number
|
|
var timestamp: String = Time.get_datetime_string_from_system().replace(":", "-")
|
|
var slot: String = "save_t%d_%s" % [turn, timestamp]
|
|
var err: Error = SaveManagerScript.save_to_named_slot(slot)
|
|
if err == OK:
|
|
_show_status(
|
|
ThemeVocabulary.lookup("fmt_saved_slot") % slot,
|
|
ThemeAssets.color("semantic.positive"),
|
|
)
|
|
else:
|
|
_show_status(ThemeVocabulary.lookup("save_failed"), ThemeAssets.color("semantic.negative"))
|
|
|
|
|
|
func _on_load() -> void:
|
|
_close()
|
|
var main: Node = get_tree().root.get_node_or_null("Main")
|
|
if main != null and main.has_method("change_scene"):
|
|
main.change_scene("res://engine/scenes/menus/load_game.tscn")
|
|
|
|
|
|
func _on_stats() -> void:
|
|
_close()
|
|
var main: Node = get_tree().root.get_node_or_null("Main")
|
|
if main != null and main.has_method("push_overlay"):
|
|
main.push_overlay("res://engine/scenes/statistics/statistics.tscn")
|
|
|
|
|
|
func _on_options() -> void:
|
|
_close()
|
|
var main: Node = get_tree().root.get_node_or_null("Main")
|
|
if main != null and main.has_method("push_overlay"):
|
|
main.push_overlay("res://engine/scenes/menus/options.tscn")
|
|
|
|
|
|
func _on_bug_report() -> void:
|
|
_close()
|
|
var main: Node = get_tree().root.get_node_or_null("Main")
|
|
if main != null and main.has_method("push_overlay"):
|
|
main.push_overlay("res://engine/scenes/ui/bug_report.tscn")
|
|
|
|
|
|
func _on_quit_to_menu() -> void:
|
|
get_tree().paused = false
|
|
var main: Node = get_tree().root.get_node_or_null("Main")
|
|
if main != null and main.has_method("change_scene"):
|
|
main.change_scene("res://engine/scenes/menus/main_menu.tscn")
|
|
|
|
|
|
func _show_status(text: String, color: Color) -> void:
|
|
_status_label.text = text
|
|
_status_label.add_theme_color_override("font_color", color)
|
|
|
|
|
|
func _close() -> void:
|
|
get_tree().paused = false
|
|
EventBus.overlay_closed.emit("ingame_menu")
|
|
var main: Node = get_tree().root.get_node_or_null("Main")
|
|
if main != null and main.has_method("pop_overlay"):
|
|
main.pop_overlay()
|
|
else:
|
|
queue_free()
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event is InputEventKey and event.pressed and event.keycode == KEY_ESCAPE:
|
|
get_viewport().set_input_as_handled()
|
|
_close()
|