mirror of
https://github.com/yeslayla/simple-dialogue.git
synced 2025-12-07 01:23:25 +01:00
Initial commit
This commit is contained in:
83
addons/simple_dialogue/scripts/stimeline.gd
Normal file
83
addons/simple_dialogue/scripts/stimeline.gd
Normal file
@@ -0,0 +1,83 @@
|
||||
class_name STimeline
|
||||
|
||||
export(String) var file_path = ""
|
||||
export(Array) var events = []
|
||||
|
||||
var _event_stream = []
|
||||
var _pos_lifo = []
|
||||
var _event_lifo = []
|
||||
var _pos : int = 0
|
||||
var _yaml = preload("res://addons/godot-yaml/gdyaml.gdns").new()
|
||||
|
||||
func _init(path : String):
|
||||
var file : File = File.new()
|
||||
if !file.file_exists(path):
|
||||
push_error("Could not load timeline at path: %s" % path)
|
||||
return
|
||||
file_path = path
|
||||
file.open(path, File.READ)
|
||||
|
||||
var raw_data = _yaml.parse(file.get_as_text())
|
||||
file.close()
|
||||
|
||||
if not "apiVersion" in raw_data or raw_data["apiVersion"] != 1.0:
|
||||
push_error("'%s' is using an outdated timeline!" % file_path)
|
||||
return
|
||||
if not "kind" in raw_data or raw_data["kind"] != "timeline":
|
||||
push_error("'%s' is not a timeline!" % file_path)
|
||||
return
|
||||
if "events" in raw_data:
|
||||
for event in raw_data["events"]:
|
||||
var dialogue = SEvent.new(event)
|
||||
events.push_back(dialogue)
|
||||
else:
|
||||
push_warning("'%s' timeline does not have any events!" % file_path)
|
||||
|
||||
_event_stream = events
|
||||
_pos = 0
|
||||
|
||||
func get_cursor() -> int:
|
||||
return _pos
|
||||
|
||||
func seek(new_pos : int) -> void:
|
||||
_pos = new_pos
|
||||
|
||||
func get_event(offset : int = 0) -> SEvent:
|
||||
if _pos + offset < len(_event_stream):
|
||||
return _event_stream[_pos + offset]
|
||||
return null
|
||||
|
||||
func read() -> SEvent:
|
||||
var event = get_event()
|
||||
if event == null and len(_event_lifo) > 0:
|
||||
_event_stream = _event_lifo.pop_back()
|
||||
_pos = _pos_lifo.pop_back()
|
||||
event = get_event()
|
||||
_pos += 1
|
||||
return event
|
||||
|
||||
func get_choices() -> Array:
|
||||
var choices = []
|
||||
var event = get_event(-1)
|
||||
if event:
|
||||
for choice in event.choices : choices.append(choice.choice)
|
||||
return choices
|
||||
|
||||
func is_choice() -> bool:
|
||||
return len(get_choices()) > 0
|
||||
|
||||
func make_choice(choice : int) -> void:
|
||||
var event = get_event(-1)
|
||||
if not event:
|
||||
push_error("Attempted to find choice at invalid event! Pos '%s' Event Stream: %s"
|
||||
% [_pos, _event_stream])
|
||||
return
|
||||
if choice > len(event.choices):
|
||||
push_error("Attempted to make an out of bounds choice! Timeline '%s': choice '%s' while expected size is '%s'"
|
||||
% [self.file_path, choice, len(event.choices)])
|
||||
return
|
||||
var choice_obj : SChoice = event.choices[choice]
|
||||
_event_lifo.push_back(_event_stream)
|
||||
_event_stream = choice_obj.events
|
||||
_pos_lifo.push_back(_pos)
|
||||
_pos = 0
|
||||
Reference in New Issue
Block a user