39 lines
1.1 KiB
GDScript
39 lines
1.1 KiB
GDScript
extends Node
|
|
|
|
const PAST := &"past"
|
|
const FUTURE := &"future"
|
|
|
|
var current_time_phase: StringName = PAST
|
|
|
|
|
|
func set_time_phase(next: StringName, reason: StringName) -> void:
|
|
if next != PAST and next != FUTURE:
|
|
return
|
|
if next == current_time_phase:
|
|
return
|
|
var previous := current_time_phase
|
|
current_time_phase = next
|
|
var bus := _event_bus_or_null()
|
|
if bus != null and bus.has_signal("time_phase_changed"):
|
|
bus.emit_signal("time_phase_changed", previous, current_time_phase, reason)
|
|
|
|
|
|
func toggle_time_phase(reason: StringName) -> void:
|
|
set_time_phase(FUTURE if current_time_phase == PAST else PAST, reason)
|
|
|
|
|
|
func reset_to_initial(initial: StringName) -> void:
|
|
var target := initial if (initial == PAST or initial == FUTURE) else PAST
|
|
set_time_phase(target, &"chart_init")
|
|
|
|
|
|
func _event_bus_or_null() -> Node:
|
|
if not is_inside_tree():
|
|
return null
|
|
var children := get_tree().root.get_children()
|
|
for index: int in range(children.size() - 1, -1, -1):
|
|
var child: Node = children[index]
|
|
if child.has_signal("time_phase_changed") and child.has_signal("chart_event_triggered"):
|
|
return child
|
|
return null
|