magicciv/src/game/engine/scenes/ui/ingame_menu.gd
Natalie 1b67eba7b4 refactor(@projects/@magic-civilization): 🎨 tokenize ui menu colours (p2-74 cluster 5)
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>
2026-06-15 22:17:49 -05:00

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()