This repository has been archived on 2024-02-25. You can view files and clone it, but cannot push or open issues or pull requests.
Wol/addons/Wol/Wol.gd

108 lines
2.6 KiB
GDScript

tool
extends Node
class_name Wol
signal node_started(node)
signal node_finished(node)
# NOTE: Warning is ignored because they get call_deferred
# warning-ignore:unused_signal
signal line(line)
# warning-ignore:unused_signal
signal options(options)
# warning-ignore:unused_signal
signal command(command)
signal started
signal finished
export(String, FILE, '*.wol,*.yarn') var path setget set_path
export var starting_node = 'Start'
export var auto_start = false
export var auto_show_options = true
export var auto_substitute = true
export(Dictionary) var variable_storage = {}
const Constants = preload('res://addons/Wol/core/Constants.gd')
const Compiler = preload('res://addons/Wol/core/compiler/Compiler.gd')
const Library = preload('res://addons/Wol/core/Library.gd')
const VirtualMachine = preload('res://addons/Wol/core/VirtualMachine.gd')
const StandardLibrary = preload('res://addons/Wol/core/StandardLibrary.gd')
var virtual_machine
func _ready():
if Engine.editor_hint:
return
var libraries = Library.new()
virtual_machine = VirtualMachine.new(self, libraries)
libraries.import_library(StandardLibrary.new())
set_path(path)
if auto_start:
start()
func set_path(_path):
path = _path
if not Engine.editor_hint and virtual_machine:
var compiler = Compiler.new(path)
virtual_machine.program = compiler.compile()
func _on_line(line):
if auto_substitute:
var index = 0
for substitute in line.substitutions:
line.text = line.text.replace('{%d}' % index, substitute)
index += 1
call_deferred('emit_signal', 'line', line)
if auto_show_options \
and virtual_machine.get_next_instruction().operation == Constants.ByteCode.AddOption:
return Constants.HandlerState.ContinueExecution
else:
return Constants.HandlerState.PauseExecution
func _on_command(command):
call_deferred('emit_signal', 'command', command)
if get_signal_connection_list('command').size() > 0:
return Constants.HandlerState.PauseExecution
else:
return Constants.HandlerState.ContinueExecution
func _on_options(options):
call_deferred('emit_signal', 'options', options)
return Constants.HandlerState.PauseExecution
func _on_dialogue_finished():
emit_signal('finished')
func _on_node_start(node):
emit_signal('node_started', node)
func _on_node_finished(node):
emit_signal('node_finished', node)
return Constants.HandlerState.ContinueExecution
func select_option(id):
virtual_machine.set_selected_option(id)
resume()
func pause():
virtual_machine.call_deferred('pause')
func start(node = starting_node):
emit_signal('started')
virtual_machine.set_node(node)
virtual_machine.start()
func resume():
virtual_machine.call_deferred('resume')