pokemon-base/addons/imjp94.yafsm/scenes/StateMachineEditorLayer.gd
2025-01-26 20:23:56 +01:00

149 lines
6.4 KiB
GDScript

@tool
extends "res://addons/imjp94.yafsm/scenes/flowchart/FlowChartLayer.gd"
const Utils = preload("res://addons/imjp94.yafsm/scripts/Utils.gd")
const StateNode = preload("res://addons/imjp94.yafsm/scenes/state_nodes/StateNode.tscn")
const StateNodeScript = preload("res://addons/imjp94.yafsm/scenes/state_nodes/StateNode.gd")
const StateDirectory = preload("../src/StateDirectory.gd")
var editor_accent_color: = Color.WHITE:
set = set_editor_accent_color
var editor_complementary_color = Color.WHITE
var state_machine
var tween_lines
var tween_labels
var tween_nodes
func debug_update(current_state, parameters, local_parameters):
_init_tweens()
if not state_machine:
return
var current_dir = StateDirectory.new(current_state)
var transitions = state_machine.transitions.get(current_state, {})
if current_dir.is_nested():
transitions = state_machine.transitions.get(current_dir.get_end(), {})
for transition in transitions.values():
# Check all possible transitions from current state, update labels, color them accordingly
var line = content_lines.get_node_or_null(NodePath("%s>%s" % [transition.from, transition.to]))
if line:
# Blinking alpha of TransitionLine
var color1 = Color.WHITE
color1.a = 0.1
var color2 = Color.WHITE
color2.a = 0.5
if line.self_modulate == color1:
tween_lines.tween_property(line, "self_modulate", color2, 0.5)
elif line.self_modulate == color2:
tween_lines.tween_property(line, "self_modulate", color1, 0.5)
elif line.self_modulate == Color.WHITE:
tween_lines.tween_property(line, "self_modulate", color2, 0.5)
# Update TransitionLine condition labels
for condition in transition.conditions.values():
if not ("value" in condition): # Ignore trigger
continue
var value = parameters.get(str(condition.name))
value = str(value) if value != null else "?"
var label = line.vbox.get_node_or_null(NodePath(str(condition.name)))
var override_template_var = line._template_var.get(str(condition.name))
if override_template_var == null:
override_template_var = {}
line._template_var[str(condition.name)] = override_template_var
override_template_var["value"] = str(value)
line.update_label()
# Condition label color based on comparation
var cond_1: bool = condition.compare(parameters.get(str(condition.name)))
var cond_2: bool = condition.compare(local_parameters.get(str(condition.name)))
if cond_1 or cond_2:
tween_labels.tween_property(label, "self_modulate", Color.GREEN.lightened(0.5), 0.01)
else:
tween_labels.tween_property(label, "self_modulate", Color.RED.lightened(0.5), 0.01)
_start_tweens()
func debug_transit_out(from, to):
_init_tweens()
var from_dir = StateDirectory.new(from)
var to_dir = StateDirectory.new(to)
var from_node = content_nodes.get_node_or_null(NodePath(from_dir.get_end()))
if from_node != null:
tween_nodes.tween_property(from_node, "self_modulate", editor_complementary_color, 0.01)
tween_nodes.tween_property(from_node, "self_modulate", Color.WHITE, 1)
var transitions = state_machine.transitions.get(from, {})
if from_dir.is_nested():
transitions = state_machine.transitions.get(from_dir.get_end(), {})
# Fade out color of StateNode
for transition in transitions.values():
var line = content_lines.get_node_or_null(NodePath("%s>%s" % [transition.from, transition.to]))
if line:
line.template = "{condition_name} {condition_comparation} {condition_value}"
line.update_label()
if transition.to == to_dir.get_end():
tween_lines.tween_property(line, "self_modulate", editor_complementary_color, 0.01)
tween_lines.tween_property(line, "self_modulate", Color.WHITE, 1).set_trans(Tween.TRANS_EXPO).set_ease(Tween.EASE_IN)
# Highlight all the conditions of the transition that just happened
for condition in transition.conditions.values():
if not ("value" in condition): # Ignore trigger
continue
var label = line.vbox.get_node_or_null(NodePath(condition.name))
tween_labels.tween_property(label, "self_modulate", editor_complementary_color, 0.01)
tween_labels.tween_property(label, "self_modulate", Color.WHITE, 1)
else:
tween_lines.tween_property(line, "self_modulate", Color.WHITE, 0.1)
# Revert color of TransitionLine condition labels
for condition in transition.conditions.values():
if not ("value" in condition): # Ignore trigger
continue
var label = line.vbox.get_node_or_null(NodePath(condition.name))
if label.self_modulate != Color.WHITE:
tween_labels.tween_property(label, "self_modulate", Color.WHITE, 0.5)
if from_dir.is_nested() and from_dir.is_exit():
# Transition from nested state
transitions = state_machine.transitions.get(from_dir.get_base(), {})
tween_lines.set_parallel(true)
for transition in transitions.values():
var line = content_lines.get_node_or_null(NodePath("%s>%s" % [transition.from, transition.to]))
if line:
tween_lines.tween_property(line, "self_modulate", editor_complementary_color.lightened(0.5), 0.1)
for transition in transitions.values():
var line = content_lines.get_node_or_null(NodePath("%s>%s" % [transition.from, transition.to]))
if line:
tween_lines.tween_property(line, "self_modulate", Color.WHITE, 0.1)
_start_tweens()
func debug_transit_in(from, to):
_init_tweens()
var to_dir = StateDirectory.new(to)
var to_node = content_nodes.get_node_or_null(NodePath(to_dir.get_end()))
if to_node:
tween_nodes.tween_property(to_node, "self_modulate", editor_complementary_color, 0.5)
var transitions = state_machine.transitions.get(to, {})
if to_dir.is_nested():
transitions = state_machine.transitions.get(to_dir.get_end(), {})
# Change string template for current TransitionLines
for transition in transitions.values():
var line = content_lines.get_node_or_null(NodePath("%s>%s" % [transition.from, transition.to]))
line.template = "{condition_name} {condition_comparation} {condition_value}({value})"
_start_tweens()
func set_editor_accent_color(color):
editor_accent_color = color
editor_complementary_color = Utils.get_complementary_color(color)
func _init_tweens():
tween_lines = get_tree().create_tween()
tween_lines.stop()
tween_labels = get_tree().create_tween()
tween_labels.stop()
tween_nodes = get_tree().create_tween()
tween_nodes.stop()
func _start_tweens():
tween_lines.tween_interval(0.001)
tween_lines.play()
tween_labels.tween_interval(0.001)
tween_labels.play()
tween_nodes.tween_interval(0.001)
tween_nodes.play()