106 lines
3.0 KiB
GDScript
106 lines
3.0 KiB
GDScript
class_name DebugMenu extends CanvasLayer
|
|
|
|
signal close_requested
|
|
|
|
var active_scene_container: Node
|
|
|
|
var scene_registry: Array = [
|
|
{ "name": "Battle Test", "path": "res://scenes/strategy_phase.tscn" },
|
|
{ "name": "Main Menu", "path": "res://scenes/main_menu.tscn" },
|
|
{ "name": "Dialogue Test", "path": "res://scenes/dialogue_scene.tscn" },
|
|
]
|
|
|
|
var commands: Array[ConsoleCommand] = []
|
|
var _result_tween: Tween
|
|
|
|
@onready var panel: PanelContainer = %Panel
|
|
@onready var scene_list: VBoxContainer = %SceneList
|
|
@onready var command_input: LineEdit = %CommandInput
|
|
@onready var result_label: Label = %ResultLabel
|
|
|
|
func _ready() -> void:
|
|
commands = [
|
|
HelpCommand.new(),
|
|
ListScenesCommand.new(),
|
|
SwapCommand.new(),
|
|
]
|
|
_build_scene_buttons()
|
|
command_input.text_submitted.connect(_on_command_submitted)
|
|
result_label.text = ""
|
|
|
|
func _build_scene_buttons() -> void:
|
|
for child in scene_list.get_children():
|
|
child.queue_free()
|
|
for entry: Dictionary in scene_registry:
|
|
var button := Button.new()
|
|
button.text = entry["name"]
|
|
button.pressed.connect(swap_scene.bind(entry))
|
|
scene_list.add_child(button)
|
|
|
|
func swap_scene(entry: Dictionary) -> void:
|
|
for child in active_scene_container.get_children():
|
|
active_scene_container.remove_child(child)
|
|
child.queue_free()
|
|
var scene: PackedScene = load(entry["path"])
|
|
var instance := scene.instantiate()
|
|
active_scene_container.add_child(instance)
|
|
if entry.has("setup"):
|
|
_apply_setup(entry["setup"], instance)
|
|
close_requested.emit()
|
|
|
|
func _apply_setup(setup_key: String, scene_instance: Node) -> void:
|
|
match setup_key:
|
|
_:
|
|
push_warning("Unknown setup key: %s" % setup_key)
|
|
|
|
func _on_command_submitted(text: String) -> void:
|
|
command_input.text = ""
|
|
if text.strip_edges().is_empty():
|
|
return
|
|
var result := _execute_command(text.strip_edges())
|
|
_show_result(result)
|
|
|
|
func _execute_command(input: String) -> String:
|
|
var parts := input.split(" ", false)
|
|
var command_name := parts[0]
|
|
var args: Array = []
|
|
if parts.size() > 1:
|
|
args = Array(parts.slice(1))
|
|
|
|
var context := {
|
|
"commands": commands,
|
|
"scene_registry": scene_registry,
|
|
"debug_menu": self,
|
|
"active_scene_container": active_scene_container,
|
|
}
|
|
|
|
for command: ConsoleCommand in commands:
|
|
if command.get_command_name() == command_name:
|
|
return command.run(args, context)
|
|
|
|
return _eval_expression(input)
|
|
|
|
func _eval_expression(input: String) -> String:
|
|
var expression := Expression.new()
|
|
var error := expression.parse(input)
|
|
if error != OK:
|
|
return "Parse error: %s" % expression.get_error_text()
|
|
|
|
var active_scene: Node = null
|
|
if active_scene_container.get_child_count() > 0:
|
|
active_scene = active_scene_container.get_child(0)
|
|
|
|
var result = expression.execute([], active_scene)
|
|
if expression.has_execute_failed():
|
|
return "Error: %s" % expression.get_error_text()
|
|
|
|
return str(result)
|
|
|
|
func _show_result(text: String) -> void:
|
|
result_label.text = text
|
|
if _result_tween and _result_tween.is_valid():
|
|
_result_tween.kill()
|
|
_result_tween = create_tween()
|
|
_result_tween.tween_interval(2.0)
|
|
_result_tween.tween_callback(func(): result_label.text = "")
|