154 lines
4.9 KiB
GDScript
154 lines
4.9 KiB
GDScript
# warning-ignore-all:shadowed_variable
|
|
# ############################################################################ #
|
|
# Copyright © 2015-2021 inkle Ltd.
|
|
# Copyright © 2019-2022 Frédéric Maquin <fred@ephread.com>
|
|
# All Rights Reserved
|
|
#
|
|
# This file is part of inkgd.
|
|
# inkgd is licensed under the terms of the MIT license.
|
|
# ############################################################################ #
|
|
|
|
extends InkBase
|
|
|
|
class_name InkFlow
|
|
|
|
# ############################################################################ #
|
|
# Imports
|
|
# ############################################################################ #
|
|
|
|
var CallStack = load("res://addons/inkgd/runtime/callstack.gd")
|
|
|
|
# ############################################################################ #
|
|
# Self-reference
|
|
# ############################################################################ #
|
|
|
|
static func Flow():
|
|
return load("res://addons/inkgd/runtime/flow.gd")
|
|
|
|
# ############################################################################ #
|
|
|
|
var name # string
|
|
var callstack # CallStack
|
|
var output_stream # Array<InkObject>
|
|
var current_choices # Array<Choice>
|
|
|
|
func _init(static_json = null):
|
|
get_static_json(static_json)
|
|
|
|
# (String, Story) -> Flow
|
|
func _init_with_name(name, story):
|
|
self.name = name
|
|
self.callstack = CallStack.new(story, self.StaticJSON)
|
|
self.output_stream = []
|
|
self.current_choices = []
|
|
|
|
# (String, Story, Dictionary<String, Variant>) -> Flow
|
|
func _init_with_name_and_jobject(name, story, jobject):
|
|
self.name = name
|
|
self.callstack = CallStack.new(story, self.StaticJSON)
|
|
self.callstack.set_json_token(jobject["callstack"], story)
|
|
self.output_stream = self.StaticJSON.jarray_to_runtime_obj_list(jobject["outputStream"])
|
|
self.current_choices = self.StaticJSON.jarray_to_runtime_obj_list(jobject["currentChoices"])
|
|
|
|
# jchoice_threads_obj is null if 'choiceThreads' doesn't exist.
|
|
var jchoice_threads_obj = jobject.get("choiceThreads");
|
|
self.load_flow_choice_threads(jchoice_threads_obj, story)
|
|
|
|
# (SimpleJson.Writer) -> void
|
|
func write_json(writer):
|
|
writer.write_object_start()
|
|
writer.write_property("callstack", Callable(self.callstack, "write_json"))
|
|
writer.write_property(
|
|
"outputStream",
|
|
Callable(self, "_anonymous_write_property_output_stream")
|
|
)
|
|
|
|
var has_choice_threads = false
|
|
for c in self.current_choices:
|
|
c.original_thread_index = c.thread_at_generation.thread_index
|
|
|
|
if self.callstack.thread_with_index(c.original_thread_index) == null:
|
|
if !has_choice_threads:
|
|
has_choice_threads = true
|
|
writer.write_property_start("choiceThreads")
|
|
writer.write_object_start()
|
|
|
|
writer.write_property_start(c.original_thread_index)
|
|
c.thread_at_generation.write_json(writer)
|
|
writer.write_property_end()
|
|
|
|
if has_choice_threads:
|
|
writer.write_object_end()
|
|
writer.write_property_end()
|
|
|
|
writer.write_property(
|
|
"currentChoices",
|
|
Callable(self, "_anonymous_write_property_current_choices")
|
|
)
|
|
|
|
writer.write_object_end()
|
|
|
|
# (Dictionary, Story) -> void
|
|
func load_flow_choice_threads(jchoice_threads, story):
|
|
for choice in self.current_choices:
|
|
var found_active_thread = self.callstack.thread_with_index(choice.original_thread_index)
|
|
if found_active_thread != null:
|
|
choice.thread_at_generation = found_active_thread.copy()
|
|
else:
|
|
var jsaved_choice_thread = jchoice_threads[str(choice.original_thread_index)]
|
|
choice.thread_at_generation = CallStack.InkThread.new_with(jsaved_choice_thread, story)
|
|
|
|
# (SimpleJson.Writer) -> void
|
|
func _anonymous_write_property_output_stream(w):
|
|
self.StaticJSON.write_list_runtime_objs(w, self.output_stream)
|
|
|
|
# (SimpleJson.Writer) -> void
|
|
func _anonymous_write_property_current_choices(w):
|
|
w.write_array_start()
|
|
for c in self.current_choices:
|
|
self.StaticJSON.write_choice(w, c)
|
|
w.write_array_end()
|
|
|
|
func equals(ink_base) -> bool:
|
|
return false
|
|
|
|
func _to_string() -> String:
|
|
return str(self)
|
|
|
|
# ############################################################################ #
|
|
# GDScript extra methods
|
|
# ############################################################################ #
|
|
|
|
func is_ink_class(type):
|
|
return type == "Flow" || super.is_ink_class(type)
|
|
|
|
func get_ink_class():
|
|
return "Flow"
|
|
|
|
static func new_with_name(name, story, static_json = null):
|
|
var flow = Flow().new(static_json)
|
|
flow._init_with_name(name, story)
|
|
return flow
|
|
|
|
static func new_with_name_and_jobject(name, story, jobject, static_json = null):
|
|
var flow = Flow().new(static_json)
|
|
flow._init_with_name_and_jobject(name, story, jobject)
|
|
return flow
|
|
|
|
# ############################################################################ #
|
|
var StaticJSON: InkStaticJSON:
|
|
get: return _static_json.get_ref()
|
|
|
|
var _static_json = WeakRef.new()
|
|
|
|
func get_static_json(static_json = null):
|
|
if static_json != null:
|
|
_static_json = weakref(static_json)
|
|
return
|
|
|
|
var InkRuntime = Engine.get_main_loop().root.get_node("__InkRuntime")
|
|
|
|
InkUtils.__assert__(InkRuntime != null,
|
|
str("[InkFlow] Could not retrieve 'InkRuntime' singleton from the scene tree."))
|
|
|
|
_static_json = weakref(InkRuntime.json)
|