diff --git a/scenes/Systems.tscn b/scenes/Systems.tscn index e8ace88..3c1e18b 100644 --- a/scenes/Systems.tscn +++ b/scenes/Systems.tscn @@ -1,6 +1,14 @@ -[gd_scene load_steps=2 format=3 uid="uid://iibqlagufwhm"] +[gd_scene load_steps=4 format=3 uid="uid://iibqlagufwhm"] [ext_resource type="Script" path="res://scripts/Systems/Systems.gd" id="1_uen2c"] +[ext_resource type="Script" path="res://scripts/Systems/CutsceneSystem.gd" id="2_sf62c"] +[ext_resource type="Script" path="res://scripts/Systems/ItemSystem.gd" id="3_nwp6i"] [node name="Systems" type="Node3D"] script = ExtResource("1_uen2c") + +[node name="Cutscene" type="Node3D" parent="."] +script = ExtResource("2_sf62c") + +[node name="Item" type="Node3D" parent="."] +script = ExtResource("3_nwp6i") diff --git a/scenes/TestScene.tscn b/scenes/TestScene.tscn index 89bd8cc..27ca132 100644 --- a/scenes/TestScene.tscn +++ b/scenes/TestScene.tscn @@ -16,8 +16,8 @@ ground_horizon_color = Color(0.59625, 0.6135, 0.6375, 1) sky_material = SubResource("ProceduralSkyMaterial_1b6it") [sub_resource type="Environment" id="Environment_18twt"] -background_mode = 2 sky = SubResource("Sky_weucl") +ambient_light_source = 1 [node name="TestSceneRoot" type="Node3D"] @@ -37,7 +37,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -38.1432, 54.7591, -25.7675) light_energy = 15.315 omni_range = 281.646 -[node name="test" parent="." instance=ExtResource("4_18e1y")] +[node name="Map" parent="." instance=ExtResource("4_18e1y")] [node name="MapBounds" parent="." instance=ExtResource("4_gv7tl")] transform = Transform3D(22.0363, 0, 0, 0, 7.5201, 0, 0, 0, 19.278, 1.48402, 2.89779, 1.65935) diff --git a/scripts/Cutscene/Cutscene.gd b/scripts/Cutscene/Cutscene.gd new file mode 100644 index 0000000..2499549 --- /dev/null +++ b/scripts/Cutscene/Cutscene.gd @@ -0,0 +1,39 @@ +class_name Cutscene +const CutsceneEvent = preload("res://scripts/Cutscene/CutsceneEvent.gd"); + +var queue:Array[CutsceneEvent] = []; + +func setupCutscene() -> void: + print_debug("Cutscene setup has not been overriden"); + pass + +func update(delta:float) -> void: + if queue.size() == 0: + return + + var item = queue[0] + if !item.started: + item.start() + item.started = true + + item.update(delta) + + if item.isDone(): + item.end() + queue.erase(item) + + pass + +func add(items:Array[CutsceneEvent]) -> void: + queue.append_array(items) + +func clear() -> void: + if queue.size() == 0: + return + + var item = queue[0] + if item.started: + item.end() + item.started = false + + queue.clear() diff --git a/scripts/Cutscene/CutsceneEvent.gd b/scripts/Cutscene/CutsceneEvent.gd new file mode 100644 index 0000000..b68d933 --- /dev/null +++ b/scripts/Cutscene/CutsceneEvent.gd @@ -0,0 +1,18 @@ +class_name CutsceneEvent + +var started:bool = false; + +func _init() -> void: + pass + +func start() -> void: + pass + +func update(delta:float) -> void: + pass + +func isDone() -> bool: + return true + +func end() -> void: + pass diff --git a/scripts/Cutscene/Event/CutscenePrintEvent.gd b/scripts/Cutscene/Event/CutscenePrintEvent.gd new file mode 100644 index 0000000..2b443ac --- /dev/null +++ b/scripts/Cutscene/Event/CutscenePrintEvent.gd @@ -0,0 +1,9 @@ +class_name CutscenePrintEvent extends "res://scripts/Cutscene/CutsceneEvent.gd" + +var text:String = "" + +func _init(text:String) -> void: + self.text = text + +func start() -> void: + print(self.text) diff --git a/scripts/Cutscene/Event/CutsceneWaitEvent.gd b/scripts/Cutscene/Event/CutsceneWaitEvent.gd new file mode 100644 index 0000000..86fb265 --- /dev/null +++ b/scripts/Cutscene/Event/CutsceneWaitEvent.gd @@ -0,0 +1,12 @@ +class_name CutsceneWaitEvent extends "res://scripts/Cutscene/CutsceneEvent.gd" + +var wait:float = 0.0 + +func _init(wait:float) -> void: + self.wait = wait + +func update(delta:float) -> void: + self.wait -= delta + +func isDone() -> bool: + return self.wait <= 0.0 \ No newline at end of file diff --git a/scripts/Cutscene/TestCutscene.gd b/scripts/Cutscene/TestCutscene.gd new file mode 100644 index 0000000..36f6a81 --- /dev/null +++ b/scripts/Cutscene/TestCutscene.gd @@ -0,0 +1,10 @@ +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"); + +func setupCutscene() -> void: + add([ + CutsceneWaitEvent.new(4.0), + CutscenePrintEvent.new("Hello, World!") + ]); + pass \ No newline at end of file diff --git a/scripts/Entities/TestNPCController.gd b/scripts/Entities/TestNPCController.gd index 25fa899..e09b3cb 100644 --- a/scripts/Entities/TestNPCController.gd +++ b/scripts/Entities/TestNPCController.gd @@ -1,8 +1,10 @@ class_name TestNPCController extends "res://scripts/Entities/OverworldEntity.gd" +const TestCutscene = preload("res://scripts/Cutscene/TestCutscene.gd") func interact(interactor) -> void: var systems = getSystems(); - systems.ITEM.addItem(systems.ITEM.ITEM_POTION, 1); + systems.CUTSCENE.setCurrentCutscene(TestCutscene.new()) + #systems.ITEM.addItem(systems.ITEM.ITEM_POTION, 1); #var itemSystem = (get_node("Systems") as Systems).ITEM; #itemSystem.addItem(itemSystem.ITEM_POTION, 1); #pass diff --git a/scripts/Systems/CutsceneSystem.gd b/scripts/Systems/CutsceneSystem.gd new file mode 100644 index 0000000..508c98a --- /dev/null +++ b/scripts/Systems/CutsceneSystem.gd @@ -0,0 +1,19 @@ +class_name CutsceneSystem extends Node +const Cutscene = preload("res://scripts/Cutscene/Cutscene.gd"); + +var currentCutscene:Cutscene = null; + +func _process(delta: float) -> void: + if currentCutscene != null: + currentCutscene.update(delta); + +func _exit_tree() -> void: + if currentCutscene != null: + currentCutscene.clear(); + +func setCurrentCutscene(cutscene:Cutscene) -> void: + if currentCutscene != null: + currentCutscene.clear(); + + currentCutscene = cutscene; + currentCutscene.setupCutscene(); \ No newline at end of file diff --git a/scripts/Systems/ItemSystem.gd b/scripts/Systems/ItemSystem.gd index 5696c21..d8ddb5a 100644 --- a/scripts/Systems/ItemSystem.gd +++ b/scripts/Systems/ItemSystem.gd @@ -1,4 +1,4 @@ -class_name ItemSystem +class_name ItemSystem extends Node const Item = preload("res://scripts/Items/Item.gd"); const ItemStack = preload("res://scripts/Items/ItemStack.gd"); @@ -17,7 +17,7 @@ class ItemStackTypeComparator: # Constants const ITEM_STACK_SIZE_MAX = 99; -var ITEM_POTION = preload("res://scripts/Items/Potion.gd").new() +var ITEM_POTION = preload("res://scripts/Items/Potion.gd").new(); var inventory:Array[ItemStack] = []; # Methods diff --git a/scripts/Systems/Systems.gd b/scripts/Systems/Systems.gd index 3829581..1fb1a33 100644 --- a/scripts/Systems/Systems.gd +++ b/scripts/Systems/Systems.gd @@ -1,3 +1,14 @@ class_name Systems extends Node +const ItemSystem = preload("res://scripts/Systems/ItemSystem.gd"); +const CutsceneSystem = preload("res://scripts/Systems/CutsceneSystem.gd") -var ITEM = preload("res://scripts/Systems/ItemSystem.gd").new() +var ITEM:ItemSystem; +var CUTSCENE:CutsceneSystem; + +func _ready(): + ITEM = $Item; + CUTSCENE = $Cutscene; + pass + +func _process(delta): + pass