frame-of-mind/src/singletons/scene_reference.gd

66 lines
2.3 KiB
GDScript3
Raw Normal View History

2023-07-09 20:27:07 +00:00
extends Node
2025-02-06 17:55:05 +00:00
var sequence_actors:Array[Array] = []
var started_sequences: int = 0
var current_sequence: int = -1
var current_sequence_index: int = 0
2023-07-13 14:14:53 +00:00
enum id {
2025-02-06 17:55:05 +00:00
YOUTH_DRAEVEN,
2024-09-15 09:30:31 +00:00
YOUTH_CHILDHOOD,
YOUTH_VOICE_TRAINING,
YOUTH_JUI_JUTSU,
ADULT_DND,
ADULD_VOLUNTARY,
ADULD_CHRISTMAS
2023-07-09 20:27:07 +00:00
}
2025-02-06 17:55:05 +00:00
signal scene_starting(scene_id: id, is_repeating: bool)
signal scene_continuing(scene_id: id, scene_index: int, is_repeating: bool)
signal scene_finished(scene_id: id, is_repeating: bool)
func _ready() -> void:
for i in range(id.keys().size()):
sequence_actors.append([null, null])
func sign_up_for_sequence(callable: Callable, sequence_id: id, index: int):
# if this assertion fails, two objects tried to sign up for the same sequence or an empty slot has been missing.
assert(sequence_actors[sequence_id][index] == null)
sequence_actors[sequence_id][index] = callable
func start_sequence(index: id):
if State.pass_stage_to(sequence_actors[index][0].get_object()):
sequence_actors[index][0].call(index)
current_sequence = index
started_sequences &= 1 << index
scene_starting.emit(current_sequence, is_sequence_repeating(index))
else:
push_error("Sequence could not be started.")
# Leaves stage to pass it to the next element wanting to catch focus.
func continue_sequence(former_actor: Object):
# if this fails, pass next was called without a sequencce having been started.
assert(current_sequence != -1)
if former_actor == State.stage_list[0] and former_actor == sequence_actors[current_sequence][current_sequence_index].get_object():
former_actor.has_stage = false
current_sequence_index += 1
State.stage_list[0] = sequence_actors[current_sequence][current_sequence_index].get_object()
print(sequence_actors[current_sequence][current_sequence_index].get_object().name)
State.stage_list[0].has_stage = true
sequence_actors[current_sequence][current_sequence_index].call(current_sequence, is_sequence_repeating(current_sequence))
scene_continuing.emit(current_sequence, current_sequence_index, is_sequence_repeating(current_sequence))
func end_current_sequence():
current_sequence = -1
current_sequence_index = 0
State.leave_stage(State.stage_list[0])
scene_finished.emit(current_sequence, is_sequence_repeating(current_sequence))
func is_sequence_repeating(index: int) -> bool: return started_sequences && 1 << index > 0