necra-prototypes/cut_sequence.gd

50 lines
1.4 KiB
GDScript

class_name CutSequence
extends Node2D
signal sequence_failed
signal sequence_succeeded
var cut_sequence_points: Array[CutSequencePoint] = []
func _ready():
_build_sequence()
func _build_sequence():
for c in get_children():
if c is CutSequencePoint:
c.point_cut.connect(_trigger_point_cut.bind(c))
cut_sequence_points.push_back(c)
var cut_indices: Array[int] = []
func _trigger_point_cut(point: CutSequencePoint):
var cut_index = cut_sequence_points.find(point)
var is_cut_valid = false
if cut_indices.is_empty():
is_cut_valid = cut_index == 0 or cut_index == cut_sequence_points.size() - 1
if not is_cut_valid:
print("Failed cut: Expected %i or %i as first point, but got %i." % [0, cut_sequence_points.size() - 1, cut_index])
else:
var direction = -1 if cut_indices[0] == 0 else 1
is_cut_valid = cut_index + direction == cut_indices[-1] # Expect the next index
if not is_cut_valid:
print("Failed cut: Expected %i as next point, but got %i." % [cut_indices[-1] - direction, cut_index])
if not is_cut_valid:
_fail_sequence()
return
point.confirm_cut()
cut_indices.push_back(cut_index)
if cut_indices.size() == cut_sequence_points.size():
_succeed_sequence()
func _fail_sequence():
print("Fail cut sequence")
for i in cut_indices:
cut_sequence_points[i].reset_cut()
cut_indices.clear()
sequence_failed.emit()
func _succeed_sequence():
sequence_succeeded.emit()