generated from mstar/godot-template
149 lines
6.4 KiB
GDScript
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()
|