63 lines
1.7 KiB
GDScript
63 lines
1.7 KiB
GDScript
class_name cCommandLine
|
|
extends CanvasLayer
|
|
|
|
var commands_directory = DirAccess.open("res://Scripts/Gameplay/CommandLine/Commands/")
|
|
|
|
@export var output_text: TextEdit
|
|
@export var input_line: LineEdit
|
|
var commands: Dictionary = {}
|
|
|
|
func _ready():
|
|
_load_commands()
|
|
input_line.text_submitted.connect(self._on_command_entered)
|
|
|
|
# To make a new command, write it in ./Commands with a main() function for entry.
|
|
# This function will automatically find and register all command files
|
|
func _load_commands():
|
|
if not commands_directory:
|
|
push_error("Failed to open commands folder!")
|
|
return
|
|
|
|
commands_directory.list_dir_begin()
|
|
var file_name = commands_directory.get_next()
|
|
|
|
while file_name != "":
|
|
if file_name.ends_with(".gd"):
|
|
var command_name = file_name.get_basename().to_lower()
|
|
var script = load("res://Scripts/Gameplay/CommandLine/Commands/" + file_name)
|
|
commands[command_name] = script
|
|
file_name = commands_directory.get_next()
|
|
commands_directory.list_dir_end()
|
|
|
|
func _print(text: String) -> void:
|
|
var line = output_text.get_line_count() - 1
|
|
output_text.insert_text(text + "\n", line, 0)
|
|
|
|
func _on_command_entered(new_text: String) -> void:
|
|
input_line.clear()
|
|
_print("> " + new_text)
|
|
|
|
var parts = new_text.strip_edges().split(" ")
|
|
if parts.size() == 0:
|
|
return
|
|
|
|
# Parse command and arguments
|
|
var cmd = parts[0].to_lower()
|
|
var args = parts.slice(1, parts.size())
|
|
|
|
if commands.has(cmd):
|
|
var cmd_script = commands[cmd].new()
|
|
if cmd_script.has_method("main"):
|
|
cmd_script.main(args, self)
|
|
else:
|
|
_print("DEV ERROR !\nCommand '%s' has no main() function!" % cmd)
|
|
else:
|
|
_print("Unknown command: %s" % cmd)
|
|
input_line.clear()
|
|
|
|
func _button_shock():
|
|
_print("Shocked")
|
|
|
|
func _button_alarm():
|
|
_print("Alarm Triggered")
|