Files
Dawn-Godot/cutscene/Cutscene.gd

77 lines
1.8 KiB
GDScript

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] = []
# 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 addCallables(params:Dictionary) -> Array[int]:
assert(params.has("functions"))
var indexes:Array[int] = []
for element in params['functions']:
var newDict = element.merged(params, false)
newDict.erase('functions')
indexes.append(addCallable(newDict))
return indexes
func addConversation(resources:Array[ConversationResource]) -> Array[int]:
var callables:Array[Dictionary] = []
for resource in resources:
callables.append(resource.toCallable())
return addCallables({ 'functions': callables })
func start() -> void:
if queue.size() == 0:
return
assert(!running)
running = true
index = 0
while index < queue.size():
var queueItem = queue[index]
var result = await queueItem['function'].call(queueItem)
match result:
CUTSCENE_CONTINUE:
index += 1
CUTSCENE_END:
break
_:
index = result
if index < 0:
break
running = false