diff --git a/scripts/Cutscene/Event/CutsceneConcurrentEvent.gd b/scripts/Cutscene/Event/CutsceneConcurrentEvent.gd new file mode 100644 index 0000000..115b5a3 --- /dev/null +++ b/scripts/Cutscene/Event/CutsceneConcurrentEvent.gd @@ -0,0 +1,75 @@ +class_name CutsceneConcurrentEvent extends "res://scripts/Cutscene/CutsceneEvent.gd" + +enum ConcurrentType { + SEQUENTIAL, + PARALLEL, + FIRST_DONE +} + +var events:Array[CutsceneEvent] = [] +var type:ConcurrentType = ConcurrentType.SEQUENTIAL +var current:int = 0 + +func _init(t:ConcurrentType, evts:Array[CutsceneEvent]) -> void: + super._init(); + self.events = evts; + self.type = t; + +func update(delta:float) -> void: + if self.type == ConcurrentType.PARALLEL: + for event in self.events: + if !event.started: + event.start() + event.started = true + + if !event.isDone(): + event.update(delta) + + if event.isDone(): + event.end() + + elif self.type == ConcurrentType.FIRST_DONE: + for event in self.events: + if !event.started: + event.start() + event.started = true + + if !event.isDone(): + event.update(delta) + + if event.isDone(): + event.end() + break + + elif self.type == ConcurrentType.SEQUENTIAL: + if self.current >= self.events.size(): + return; + + var evt = self.events[self.current] + if !evt.started: + evt.start() + evt.started = true + + if !evt.isDone(): + evt.update(delta) + + if evt.isDone(): + evt.end() + self.current += 1 + +func isDone() -> bool: + if self.type == ConcurrentType.SEQUENTIAL: + return self.current >= self.events.size(); + elif self.type == ConcurrentType.PARALLEL: + for evt in self.events: + if !evt.isDone(): + return false; + return true; + elif self.type == ConcurrentType.FIRST_DONE: + for evt in self.events: + if evt.isDone(): + return true; + return false; + + printerr("Invalid ConcurrentType") + return false; \ No newline at end of file diff --git a/scripts/Cutscene/Event/CutscenePrintEvent.gd b/scripts/Cutscene/Event/CutscenePrintEvent.gd index 2b443ac..c63c401 100644 --- a/scripts/Cutscene/Event/CutscenePrintEvent.gd +++ b/scripts/Cutscene/Event/CutscenePrintEvent.gd @@ -3,6 +3,7 @@ class_name CutscenePrintEvent extends "res://scripts/Cutscene/CutsceneEvent.gd" var text:String = "" func _init(text:String) -> void: + super._init() self.text = text func start() -> void: diff --git a/scripts/Cutscene/Event/CutsceneWaitEvent.gd b/scripts/Cutscene/Event/CutsceneWaitEvent.gd index 86fb265..67934f0 100644 --- a/scripts/Cutscene/Event/CutsceneWaitEvent.gd +++ b/scripts/Cutscene/Event/CutsceneWaitEvent.gd @@ -2,8 +2,9 @@ class_name CutsceneWaitEvent extends "res://scripts/Cutscene/CutsceneEvent.gd" var wait:float = 0.0 -func _init(wait:float) -> void: - self.wait = wait +func _init(time:float) -> void: + super._init() + self.wait = time func update(delta:float) -> void: self.wait -= delta diff --git a/scripts/Cutscene/TestCutscene.gd b/scripts/Cutscene/TestCutscene.gd index 36f6a81..b6cdd5a 100644 --- a/scripts/Cutscene/TestCutscene.gd +++ b/scripts/Cutscene/TestCutscene.gd @@ -1,10 +1,13 @@ class_name TestCutscene extends "res://scripts/Cutscene/Cutscene.gd" const CutscenePrintEvent = preload("res://scripts/Cutscene/Event/CutscenePrintEvent.gd"); const CutsceneWaitEvent = preload("res://scripts/Cutscene/Event/CutsceneWaitEvent.gd"); +const CutsceneConcurrentEvent = preload("res://scripts/Cutscene/Event/CutsceneConcurrentEvent.gd"); func setupCutscene() -> void: add([ - CutsceneWaitEvent.new(4.0), - CutscenePrintEvent.new("Hello, World!") + CutsceneConcurrentEvent.new(CutsceneConcurrentEvent.ConcurrentType.PARALLEL, [ + CutscenePrintEvent.new("Hello, World1"), + CutscenePrintEvent.new("Hello, World2") + ]) ]); pass \ No newline at end of file