class_name CutSequence extends Node2D signal sequence_failed signal sequence_succeeded @export var is_skipped = false 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 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: _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(): for i in cut_indices: cut_sequence_points[i].reset_cut() cut_indices.clear() sequence_failed.emit() func _succeed_sequence(): sequence_succeeded.emit()