146 lines
3.9 KiB
GDScript
146 lines
3.9 KiB
GDScript
extends Control
|
|
|
|
@export_category("Settings")
|
|
@export_multiline var welcome_message: String
|
|
@export var pause_tree_when_open: bool = true
|
|
@export_subgroup("Log Colors")
|
|
@export var default_color: Color = Color.WHITE
|
|
@export var log_color: Color = Color.BLUE
|
|
@export var warning_color: Color = Color.YELLOW
|
|
@export var error_color: Color = Color.RED
|
|
@export_subgroup("Keybinds")
|
|
@export var toggle_key_action: String = "debug"
|
|
@export var enter_key_action: String = "accept"
|
|
|
|
@onready var log_label = $Panel/VBoxContainer/MarginContainer/LogLabel
|
|
@onready var input_field = $Panel/VBoxContainer/InputField
|
|
|
|
var registered_commands: Dictionary
|
|
|
|
|
|
func _ready():
|
|
visible = false
|
|
registered_commands.clear()
|
|
log_label.append_text(welcome_message + "\n")
|
|
register_builtin_commands()
|
|
|
|
|
|
func _process(delta):
|
|
if (Input.is_action_just_pressed(toggle_key_action)):
|
|
toggle_console()
|
|
|
|
if (Input.is_action_just_pressed("accept") and input_field.has_focus()):
|
|
submit_input()
|
|
|
|
|
|
func toggle_console():
|
|
visible = !visible
|
|
if (pause_tree_when_open): get_tree().paused = visible
|
|
|
|
if (visible):
|
|
input_field.grab_focus()
|
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
|
|
|
input_field.clear()
|
|
|
|
|
|
func register_command(command:Command):
|
|
if (registered_commands.has(command.name)):
|
|
log_error("Command already registered with name: " + command.name)
|
|
return
|
|
else:
|
|
registered_commands[command.name] = command
|
|
|
|
|
|
func submit_input():
|
|
if (input_field.text == ""): return
|
|
|
|
print_line("> " + input_field.text)
|
|
run_command(input_field.text)
|
|
|
|
input_field.text = ""
|
|
|
|
|
|
func run_command(input:String):
|
|
var parsed_input:Dictionary = parse_input(input)
|
|
var command_name:String = parsed_input["name"]
|
|
var args:Array[String] = parsed_input["args"]
|
|
|
|
if (registered_commands.has(command_name)):
|
|
if args.size() == 0:
|
|
registered_commands[command_name].INVOKE()
|
|
else:
|
|
registered_commands[command_name].INVOKE(args)
|
|
else:
|
|
log_error("Command " + command_name + " not recognized")
|
|
|
|
|
|
func parse_input(input:String) -> Dictionary:
|
|
input = input.to_lower()
|
|
var input_array = input.split(' ')
|
|
var command_name = input_array[0]
|
|
var args: Array[String]
|
|
|
|
for i in input_array.size():
|
|
if i == 0: continue
|
|
args.append(input_array[i])
|
|
|
|
return {"name": command_name, "args": args}
|
|
|
|
|
|
func command_lookup(command_name:String) -> Command:
|
|
if (registered_commands.has(command_name)):
|
|
return registered_commands[command_name]
|
|
else:
|
|
log_error("No command '" + command_name + "' found.")
|
|
return null
|
|
|
|
|
|
func print_line(message:String):
|
|
log_label.append_text(str("[color=" + default_color.to_html(true) + "]" + message + "[/color]\n"))
|
|
|
|
|
|
func log_debug(message:String):
|
|
log_label.append_text(str("[color=" + log_color.to_html(true) + "]" + "[LOG] " + message + "[/color]\n"))
|
|
|
|
|
|
func log_error(message:String):
|
|
log_label.append_text(str("[color=" + error_color.to_html(true) + "]" + "[ERROR] " + message + "[/color]\n"))
|
|
|
|
|
|
func log_warning(message:String):
|
|
log_label.append_text(str("[color=" + warning_color.to_html(true) + "]" + "[WARNING] " + message + "[/color]\n"))
|
|
|
|
|
|
func register_builtin_commands():
|
|
register_command(Command.new("clear", clear_command, [], "Clears the console"))
|
|
register_command(Command.new("help", help_command, ["command_name"], "Shows help for given command"))
|
|
register_command(Command.new("list", list_command, [], "Lists all registered commands."))
|
|
|
|
|
|
func clear_command():
|
|
log_label.clear()
|
|
|
|
|
|
func help_command(args:Dictionary):
|
|
if (args.size() == 0 or !args.has("command_name")):
|
|
log_error("Invalid arguments")
|
|
return
|
|
|
|
var command_name = args["command_name"]
|
|
var command: Command = command_lookup(command_name)
|
|
if (command == null): return
|
|
|
|
print_line("-- HELP for " + command_name + " --")
|
|
print_line(command.description)
|
|
var args_string: String
|
|
for name in command.arg_names:
|
|
args_string += "[" + name + "] "
|
|
print_line("Args: " + args_string + "\n")
|
|
|
|
|
|
func list_command():
|
|
print_line("-- REGISTERED COMMANDS --")
|
|
for command in registered_commands:
|
|
print_line(command)
|