Project2/debug/Debug.gd

131 lines
4 KiB
GDScript

# The global hub for all the stats.
extends CanvasLayer
@onready var control_root = $Root
@onready var categories = $Root/Stats/Categories
@onready var logs = $Root/LogScroll/Log
@onready var scroll_bar = $Root/LogScroll.get_v_scroll_bar()
@onready var log_title = $Root/LogTitle
var show_gizmos = false
func _ready():
control_root.hide()
scroll_bar.changed.connect(_on_scroll_bar_update)
func _on_scroll_bar_update():
scroll_bar.value = scroll_bar.max_value
func put_log(value: Dictionary):
var new_label = Label.new()
#new_label.bbcode_enabled = true
#new_label.fit_content = true
new_label.text = value["description"] + " | " + value["text"]
logs.add_child(new_label)
new_label.use_parent_material = true
log_title.text = "Log +"
get_tree().create_timer(0.1).connect("timeout", _on_log_update_timeout)
# Called to reset the log's "udpated" indicator
func _on_log_update_timeout():
log_title.text = "Log"
func maybe_put_log(value, text: String):
if value != null:
value["text"] = text
put_log(value)
# The key and string is shown like this 'key: value'
func stat_set(stat: Dictionary):
# Check if label exists
var found_key = false
for child in categories.get_children():
if child.name == stat["key"]:
set_text(child, stat)
found_key = true
if not found_key:
var new_label = RichTextLabel.new()
new_label.name = stat["key"]
categories.add_child(new_label)
new_label.use_parent_material = true
set_text(new_label, stat)
func set_text(node, stat):
var key = ""
var body = ""
var end = ""
# Make sure key exists
if stat.has("key"):
key = stat["key"]
else:
printerr("dictionary must have key")
# Optional body
if stat.has("value"):
body = stat["value"]
# Immediate indicators
if stat.has("indicate"):
end = "[color=orange]*[/color] "
node.bbcode_enabled = true
node.fit_content = true
node.text = key + ": " + body + " " + end
if stat.has("indicate"):
await get_tree().create_timer(0.5).timeout
node.text = key + ": " + body
# Utility function for your leasure
func maybe_put_stat(stat_key, value: String):
if stat_key != null:
stat_key["value"] = value
stat_set(stat_key)
func _process(_delta):
if Input.is_action_just_pressed("show_stats"):
control_root.visible = !control_root.visible
if Input.is_action_just_pressed("debug_show_gizmos"):
show_gizmos = !show_gizmos
if Input.is_action_just_pressed("debug_respawn_enemies"):
for node in get_tree().get_nodes_in_group("debug_enemy_respawn"):
node.position = node.get_node("EnemyDebug").original_position
# Add fps stat
stat_set({ "key": "fps", "value": str(Engine.get_frames_per_second()) })
# Clear logs on input
if Input.is_action_just_pressed("debug_clear_log"):
clear_log()
# Debug properties of things in the world
process_debug_property("debug_state", func(): return Label.new(), func(item):
item.text = item.get_parent().get_node("StateMachine").state.name
)
process_debug_property("debug_trail",
func(): return preload("res://debug/Trail.tscn").instantiate(), func(_item): )
# Respawn player
if Input.is_action_just_pressed("debug_respawn"):
var old_player = get_tree().get_first_node_in_group("player")
old_player.queue_free()
await old_player.tree_exited
var p = preload("res://player/Player.tscn")
var new_player = p.instantiate()
var respawn_point_node = get_tree().get_first_node_in_group("debug_player_respawn")
if respawn_point_node:
new_player.position = respawn_point_node.position
get_node("/root").add_child(new_player)
func process_debug_property(debug_name, create_func, process_func):
for node in get_tree().get_nodes_in_group(debug_name):
var item
if !node.has_node(debug_name):
item = create_func.call()
item.name = debug_name
node.add_child(item)
else:
item = node.get_node(debug_name)
item.visible = show_gizmos
item.process_mode = PROCESS_MODE_INHERIT if show_gizmos else PROCESS_MODE_DISABLED
process_func.call(item)
return item
func clear_log() -> void:
for child in logs.get_children():
logs.remove_child(child)