Refactor cutscene queue
This commit is contained in:
@@ -1,25 +1,55 @@
|
||||
class_name CutsceneSingleton extends Node
|
||||
class_name Cutscene
|
||||
|
||||
const CUTSCENE_CONTINUE = -1
|
||||
const CUTSCENE_END = -2
|
||||
|
||||
const CUTSCENE_ADD_END = -1
|
||||
const CUTSCENE_ADD_NEXT = -2
|
||||
|
||||
var running:bool = false
|
||||
var index:int = 0
|
||||
var queue:Array[Dictionary] = []
|
||||
|
||||
func setConversation(conversation:Array[ConversationElement]) -> void:
|
||||
var functions:Array[Callable] = []
|
||||
# Accepts;
|
||||
# function:Callable - The function to add
|
||||
# position:int - Where to add the function (default: end)
|
||||
# data:Dictionary - Data to pass to the function when called
|
||||
func addCallable(params:Dictionary) -> int:
|
||||
assert(params.has("function"))
|
||||
|
||||
if !params.has("position"):
|
||||
params["position"] = CUTSCENE_ADD_END
|
||||
|
||||
params['cutscene'] = self
|
||||
|
||||
if params["position"] == CUTSCENE_ADD_END || params["position"] >= queue.size():
|
||||
queue.append(params)
|
||||
return queue.size() - 1
|
||||
|
||||
elif params["position"] == CUTSCENE_ADD_NEXT:
|
||||
queue.insert(index + 1, params)
|
||||
return index + 1
|
||||
|
||||
queue.insert(params["position"], params)
|
||||
return params["position"]
|
||||
|
||||
|
||||
func addConversation(conversation:Array[ConversationElement]) -> Array[int]:
|
||||
var indexes:Array[int] = []
|
||||
for element in conversation:
|
||||
functions.append(element.sceneItem)
|
||||
setScene(functions)
|
||||
indexes.append(addCallable({ 'function': element.start }))
|
||||
return indexes
|
||||
|
||||
func setScene(functions:Array[Callable]) -> void:
|
||||
if functions.size() == 0:
|
||||
func start() -> void:
|
||||
if queue.size() == 0:
|
||||
return
|
||||
|
||||
assert(!running)
|
||||
running = true
|
||||
|
||||
var index = 0
|
||||
index = 0
|
||||
while true:
|
||||
var result = await functions[index].call()
|
||||
var queueItem = queue[index]
|
||||
var result = await queueItem['function'].call(queueItem)
|
||||
|
||||
match result:
|
||||
CUTSCENE_CONTINUE:
|
||||
@@ -31,7 +61,7 @@ func setScene(functions:Array[Callable]) -> void:
|
||||
_:
|
||||
index = result
|
||||
|
||||
if index >= functions.size() || index < 0:
|
||||
if index >= queue.size() || index < 0:
|
||||
break
|
||||
|
||||
running = false
|
||||
|
||||
1
cutscene/CutsceneSingleton.gd
Normal file
1
cutscene/CutsceneSingleton.gd
Normal file
@@ -0,0 +1 @@
|
||||
class_name CutsceneSingleton extends Node
|
||||
1
cutscene/CutsceneSingleton.gd.uid
Normal file
1
cutscene/CutsceneSingleton.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dtq6p6mop3xfo
|
||||
7
cutscene/battle/CutsceneBattleAction.gd
Normal file
7
cutscene/battle/CutsceneBattleAction.gd
Normal file
@@ -0,0 +1,7 @@
|
||||
class_name CutsceneBattleAction
|
||||
|
||||
static func playerDecision(_params:Dictionary) -> int:
|
||||
BATTLE.battleScene.actionBox.visible = true
|
||||
var move = await BATTLE.battleScene.actionBox.decisionMade
|
||||
BATTLE.battleScene.actionBox.visible = false
|
||||
return Cutscene.CUTSCENE_CONTINUE
|
||||
1
cutscene/battle/CutsceneBattleAction.gd.uid
Normal file
1
cutscene/battle/CutsceneBattleAction.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cj38yci04aylm
|
||||
@@ -4,6 +4,6 @@ class_name ConversationElement
|
||||
@export_node_path("Entity") var entity:NodePath
|
||||
@export_multiline var label: String
|
||||
|
||||
func sceneItem() -> int:
|
||||
func start(_params:Dictionary) -> int:
|
||||
await UI.TEXTBOX.setTextAndWait(label)
|
||||
return CutsceneSingleton.CUTSCENE_CONTINUE
|
||||
return Cutscene.CUTSCENE_CONTINUE
|
||||
|
||||
Reference in New Issue
Block a user