47 lines
1.1 KiB
GDScript
47 lines
1.1 KiB
GDScript
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()
|