From 4e52d1383bc698cefa2eb61970cb8c78aab60b36 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Sun, 5 Jan 2025 19:39:05 -0600 Subject: [PATCH] Add cutscene change event --- scripts/Cutscene/CutsceneEvent.gd | 5 ++- scripts/Cutscene/Event/CutsceneChangeEvent.gd | 18 ++++++++ .../Cutscene/Event/CutsceneConcurrentEvent.gd | 20 ++++----- scripts/Cutscene/Event/CutsceneIfEvent.gd | 32 ++++++++++++++ scripts/Cutscene/Event/CutsceneWaitEvent.gd | 2 +- scripts/Cutscene/Event/CutsceneWhileEvent.gd | 43 +++++++++++++++++++ scripts/Cutscene/TestCutscene.gd | 15 ++++--- 7 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 scripts/Cutscene/Event/CutsceneChangeEvent.gd create mode 100644 scripts/Cutscene/Event/CutsceneIfEvent.gd create mode 100644 scripts/Cutscene/Event/CutsceneWhileEvent.gd diff --git a/scripts/Cutscene/CutsceneEvent.gd b/scripts/Cutscene/CutsceneEvent.gd index b68d933..9afe2b0 100644 --- a/scripts/Cutscene/CutsceneEvent.gd +++ b/scripts/Cutscene/CutsceneEvent.gd @@ -6,7 +6,7 @@ func _init() -> void: pass func start() -> void: - pass + started = true func update(delta:float) -> void: pass @@ -16,3 +16,6 @@ func isDone() -> bool: func end() -> void: pass + +func reset() -> void: + started = false diff --git a/scripts/Cutscene/Event/CutsceneChangeEvent.gd b/scripts/Cutscene/Event/CutsceneChangeEvent.gd new file mode 100644 index 0000000..547f989 --- /dev/null +++ b/scripts/Cutscene/Event/CutsceneChangeEvent.gd @@ -0,0 +1,18 @@ +class_name CutsceneChangeEvent extends "res://scripts/Cutscene/CutsceneEvent.gd" + +var getCutscene:Callable +var cutsceneNext:Cutscene + +func _init(getCutscene:Callable) -> void: + super._init(); + self.getCutscene = getCutscene; + +func start() -> void: + super.start(); + self.cutsceneNext = self.getCutscene.call(self); + +func end() -> void: + self.cutsceneNext.setupCutscene(); + self.cutsceneNext.start(); + var systems = get_tree().current_scene.get_node("Systems") as Systems; + systems.CUTSCENE.setCurrentCutscene(self.cutsceneNext); \ No newline at end of file diff --git a/scripts/Cutscene/Event/CutsceneConcurrentEvent.gd b/scripts/Cutscene/Event/CutsceneConcurrentEvent.gd index 115b5a3..84e16e2 100644 --- a/scripts/Cutscene/Event/CutsceneConcurrentEvent.gd +++ b/scripts/Cutscene/Event/CutsceneConcurrentEvent.gd @@ -34,12 +34,11 @@ func update(delta:float) -> void: event.start() event.started = true - if !event.isDone(): - event.update(delta) + event.update(delta) - if event.isDone(): - event.end() - break + if event.isDone(): + event.end() + break elif self.type == ConcurrentType.SEQUENTIAL: if self.current >= self.events.size(): @@ -50,12 +49,11 @@ func update(delta:float) -> void: evt.start() evt.started = true - if !evt.isDone(): - evt.update(delta) + evt.update(delta) - if evt.isDone(): - evt.end() - self.current += 1 + if evt.isDone(): + evt.end() + self.current += 1 func isDone() -> bool: if self.type == ConcurrentType.SEQUENTIAL: @@ -72,4 +70,4 @@ func isDone() -> bool: return false; printerr("Invalid ConcurrentType") - return false; \ No newline at end of file + return false; diff --git a/scripts/Cutscene/Event/CutsceneIfEvent.gd b/scripts/Cutscene/Event/CutsceneIfEvent.gd new file mode 100644 index 0000000..a8e6b85 --- /dev/null +++ b/scripts/Cutscene/Event/CutsceneIfEvent.gd @@ -0,0 +1,32 @@ +class_name CutsceneIfEvent extends "res://scripts/Cutscene/CutsceneEvent.gd" + +var eventTrue:CutsceneEvent +var eventFalse:CutsceneEvent +var condition:Callable +var result:bool = false + +func _init(cond:Callable, evtTrue:CutsceneEvent, evtFalse:CutsceneEvent) -> void: + super._init(); + condition = cond; + eventTrue = evtTrue; + eventFalse = evtFalse; + +func start() -> void: + super.start(); + result = self.condition.call(self); + + if result: + eventTrue.start(); + else: + eventFalse.start(); + +func getEvent() -> CutsceneEvent: + if result: + return eventTrue; + return eventFalse; + +func update(delta:float) -> void: + getEvent().update(delta); + +func isDone() -> bool: + return getEvent().isDone(); diff --git a/scripts/Cutscene/Event/CutsceneWaitEvent.gd b/scripts/Cutscene/Event/CutsceneWaitEvent.gd index 67934f0..457d4fe 100644 --- a/scripts/Cutscene/Event/CutsceneWaitEvent.gd +++ b/scripts/Cutscene/Event/CutsceneWaitEvent.gd @@ -10,4 +10,4 @@ func update(delta:float) -> void: self.wait -= delta func isDone() -> bool: - return self.wait <= 0.0 \ No newline at end of file + return self.wait <= 0.0 diff --git a/scripts/Cutscene/Event/CutsceneWhileEvent.gd b/scripts/Cutscene/Event/CutsceneWhileEvent.gd new file mode 100644 index 0000000..fedf984 --- /dev/null +++ b/scripts/Cutscene/Event/CutsceneWhileEvent.gd @@ -0,0 +1,43 @@ +class_name CutsceneWhileEvent extends "res://scripts/Cutscene/CutsceneEvent.gd" + +var events:Array[CutsceneEvent] = [] +var callback:Callable +var current:int = 0 + +func _init(callback:Callable, evt:Array[CutsceneEvent]) -> void: + super._init(); + self.events = evt; + self.callback = callback; + +func shouldLoop() -> bool: + return self.callback.call(self) + +func update(delta:float) -> void: + if self.current >= self.events.size(): + return; + + var evt = self.events[self.current] + if !evt.started: + evt.start() + evt.started = true + + evt.update(delta) + + if evt.isDone(): + evt.end() + self.current += 1 + + if self.current < self.events.size(): + return + + if !self.shouldLoop(): + return + + self.current = 0 + for event in self.events: + event.reset() + +func isDone() -> bool: + if self.shouldLoop(): + return false; + return self.current >= self.events.size(); diff --git a/scripts/Cutscene/TestCutscene.gd b/scripts/Cutscene/TestCutscene.gd index b6cdd5a..7c2e779 100644 --- a/scripts/Cutscene/TestCutscene.gd +++ b/scripts/Cutscene/TestCutscene.gd @@ -2,12 +2,17 @@ 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"); +const CutsceneIfEvent = preload("res://scripts/Cutscene/Event/CutsceneIfEvent.gd"); +const CutsceneWhileEvent = preload("res://scripts/Cutscene/Event/CutsceneWhileEvent.gd"); + +func testIf() -> bool: + print("Test if"); + return true; func setupCutscene() -> void: add([ - CutsceneConcurrentEvent.new(CutsceneConcurrentEvent.ConcurrentType.PARALLEL, [ - CutscenePrintEvent.new("Hello, World1"), - CutscenePrintEvent.new("Hello, World2") - ]) + CutsceneWhileEvent.new(testIf,[ + CutscenePrintEvent.new("While") + ]), ]); - pass \ No newline at end of file + pass