50 lines
1.4 KiB
GDScript
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()
|