diff --git a/project.godot b/project.godot index ca77fdc..d1fa8ba 100644 --- a/project.godot +++ b/project.godot @@ -59,11 +59,6 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://jrpg/scripts/misc/test_level.gd" }, { -"base": "Node", -"class": "YarnImporter", -"language": "GDScript", -"path": "res://yarn/scripts/yarn-importer.gd" -}, { "base": "Object", "class": "YarnRunner", "language": "GDScript", @@ -90,7 +85,6 @@ _global_script_class_icons={ "SpeechPanel": "", "SpeechText": "", "TestLevel": "", -"YarnImporter": "", "YarnRunner": "", "YarnRunnerNode": "", "YarnScript": "" diff --git a/yarn/onivim2-crash.log b/yarn/onivim2-crash.log deleted file mode 100644 index d082e2a..0000000 --- a/yarn/onivim2-crash.log +++ /dev/null @@ -1 +0,0 @@ -Yojson.Json_error("Line 100, bytes 20-53:\nInvalid escape sequence 'Users\\Arnaud\\scoop\\apps\\godot\\cur'"): diff --git a/yarn/scenes/YarnSpinner.tscn b/yarn/scenes/YarnSpinner.tscn deleted file mode 100644 index 229d048..0000000 --- a/yarn/scenes/YarnSpinner.tscn +++ /dev/null @@ -1,19 +0,0 @@ -[gd_scene load_steps=4 format=2] - -[ext_resource path="res://jrpg/scenes/ui/ChoicesBox.tscn" type="PackedScene" id=1] -[ext_resource path="res://main/scenes/LogPanel.tscn" type="PackedScene" id=2] -[ext_resource path="res://yarn/scripts/YarnSpinner.gd" type="Script" id=3] - - - -[node name="YarnSpinner" type="Control"] -anchor_right = 1.0 -anchor_bottom = 1.0 -script = ExtResource( 3 ) -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="ChoicesBox" parent="." instance=ExtResource( 1 )] - -[node name="LogPanel" parent="." instance=ExtResource( 2 )] diff --git a/yarn/scripts/YarnSpinner.gd b/yarn/scripts/YarnSpinner.gd deleted file mode 100644 index 078c804..0000000 --- a/yarn/scripts/YarnSpinner.gd +++ /dev/null @@ -1,25 +0,0 @@ -extends YarnImporter - -export var yarn_file = "" - -func _ready(): - $ChoicesBox.hide() - $LogPanel.hide() - -func on_dialogue_start(): - yield(.on_dialogue_start(), "completed") - $LogPanel.show() - $ChoicesBox.show() - $LogPanel.clear() - $ChoicesBox.clear() - -func on_new_line(line): - yield($LogPanel.on_new_line(line), "completed") - -func on_choices(choices_list): - return yield($ChoicesBox.on_choices(choices_list), "completed") - -func on_dialogue_end(): - yield(.on_dialogue_end(), "completed") - $ChoicesBox.hide() - $LogPanel.hide() diff --git a/yarn/scripts/yarn-importer.gd b/yarn/scripts/yarn-importer.gd deleted file mode 100644 index 7d8b313..0000000 --- a/yarn/scripts/yarn-importer.gd +++ /dev/null @@ -1,355 +0,0 @@ -extends Node -class_name YarnImporter - -# -# A YARN Importer for Godot -# -# Credits: -# - Dave Kerr (http://www.naturallyintelligent.com) -# -# Latest: https://github.com/naturally-intelligent/godot-yarn-importer -# -# Yarn: https://github.com/InfiniteAmmoInc/Yarn -# Twine: http://twinery.org -# -# Yarn: a ball of threads (Yarn file) -# Thread: a series of fibres (Yarn node) -# Fibre: a text or choice or logic (Yarn line) - -var yarn = {} - -# OVERRIDE METHODS -# -# called to request new dialog -func on_new_line(text): - pass - -# called to request new choice button -func on_choices(choices_list): - pass - -# called to request internal logic handling -func logic(instruction, command): - pass - -# called for each line of text -func yarn_text_variables(text): - return text - -# called when "settings" node parsed -func story_setting(setting, value): - pass - -# called for each node name -func on_node_start(to): - pass - yield(get_tree(), "idle_frame") - -# called for each node name (after) -func on_node_end(to): - pass - yield(get_tree(), "idle_frame") - -# START SPINNING YOUR YARN -# -func spin_yarn(file, start_thread = false): - yarn = load_yarn(file) - # Find the starting thread... - if not start_thread: - start_thread = yarn['start'] - # Load any scene-specific settings - # (Not part of official Yarn standard) - if 'settings' in yarn['threads']: - var settings = yarn['threads']['settings'] - for fibre in settings['fibres']: - var line = fibre['text'] - var split = line.split('=') - var setting = split[0].strip_edges(true, true) - var value = split[1].strip_edges(true, true) - story_setting(setting, value) - # First thread unravel... - yield(on_dialogue_start(), "completed") - yield(yarn_unravel(start_thread), "completed") - -# Internally create a new thread (during loading) -func new_yarn_thread(): - var thread = {} - thread['title'] = '' - thread['kind'] = 'branch' # 'branch' for standard dialog, 'code' for gdscript - thread['tags'] = [] # unused - thread['fibres'] = [] - return thread - -func exec(stri): - var expr := Expression.new() - print("input : " + stri) - var err := expr.parse(stri) - if err == OK: - var res = expr.execute() - print("res : " + str(res)) - else: - print("err : " + str(err)) - -func jajoujaj(): - print("jaaaja") - -# Internally create a new fibre (during loading) -func new_yarn_fibre(line:String): - # choice fibre - if line.substr(0,2) == '[[': - if line.find('|') != -1: - var fibre = {} - fibre['kind'] = 'choice' - line = line.replace('[[', '') - line = line.replace(']]', '') - var split = line.split('|') - fibre['text'] = split[0] - fibre['marker'] = split[1] - return fibre - else: - var fibre = {} - fibre['kind'] = 'jump' - line = line.replace('[[', '') - line = line.replace(']]', '') - fibre['marker'] = line - return fibre - # logic instruction (not part of official Yarn standard) - elif line.substr(0,2) == '<<': - line = line.replace('<<', '') - line = line.replace('>>', '') - var line_split = line.split(' ') - print (line_split) - var command = line.substr(line.find(' ')) - exec(command) - -# if line.find(':') != -1: -# fibre['kind'] = 'logic' -# line = line.replace('<<', '') -# line = line.replace('>>', '') -# var split = line.split(':') -# fibre['instruction'] = split[0] -# fibre['command'] = split[1] -# #print(line, split[0], split[1]) -# return fibre - # text fibre - var fibre = {} - fibre['kind'] = 'text' - fibre['text'] = line - return fibre - -# Create Yarn data structure from file (must be *.yarn.txt Yarn format) -func load_yarn(path): - var yarn = {} - yarn['threads'] = {} - yarn['start'] = false - yarn['file'] = path - var file = File.new() - file.open(path, file.READ) - if file.is_open(): - # yarn reading flags - var start = false - var header = true - var thread = new_yarn_thread() - # loop - while !file.eof_reached(): - # read a line - var line = file.get_line() - # header read mode - if header: - if line == '---': - header = false - else: - var split = line.split(': ') - if split[0] == 'title': - var title_split = split[1].split(':') - var thread_title = '' - var thread_kind = 'branch' - if len(title_split) == 1: - thread_title = split[1] - else: - thread_title = title_split[1] - thread_kind = title_split[0] - thread['title'] = thread_title - thread['kind'] = thread_kind - if not yarn['start']: - yarn['start'] = thread_title - # end of thread - elif line == '===': - header = true - yarn['threads'][thread['title']] = thread - thread = new_yarn_thread() - # fibre read mode - else: - var fibre = new_yarn_fibre(line) - if fibre: - thread['fibres'].append(fibre) - else: - print('ERROR: Yarn file missing: ', filename) - return yarn - -# Main logic for node handling -# -func yarn_unravel(to, from=false): - if not to in yarn['threads']: - print('WARNING: Missing Yarn thread: ', to, ' in file ',yarn['file']) - return - - while to != null and to in yarn['threads']: - yield (on_node_start(to), "completed") - if to in yarn['threads']: - var thread = yarn['threads'][to] - to = null - match thread['kind']: - 'branch': - var i = 0 - while i < thread['fibres'].size(): - match thread['fibres'][i]['kind']: - 'text': - var fibre = thread['fibres'][i] - var text = yarn_text_variables(fibre['text']) - yield(on_new_line(text), "completed") - 'choice': - var choices = [] - while i < thread['fibres'].size() and thread['fibres'][i]['kind'] == 'choice' : - var fibre = thread['fibres'][i] - var text = yarn_text_variables(fibre['text']) - choices.push_back({"text": text, "marker": fibre['marker']}) - i += 1 - to = yield(on_choices(choices), "completed") - break - 'logic': - var fibre = thread['fibres'][i] - var instruction = fibre['instruction'] - var command = fibre['command'] - yield(logic(instruction, command), "completed") - 'jump': - var fibre = thread['fibres'][i] - to = fibre['marker'] - break - i += 1 - 'code': - yarn_code(to) - yield(on_node_end(to), "completed") - - yield (on_dialogue_end(), "completed") - -func on_dialogue_start(): - pass - yield(get_tree(), "idle_frame") - -func on_dialogue_end(): - pass - yield(get_tree(), "idle_frame") - -# -# RUN GDSCRIPT CODE FROM YARN NODE - Special node = code:title -# - Not part of official Yarn standard -# -func yarn_code(title, run=true, parent='parent.', tabs="\t", next_func="yarn_unravel"): - if title in yarn['threads']: - var thread = yarn['threads'][title] - var code = '' - for fibre in thread['fibres']: - match fibre['kind']: - 'text': - var line = yarn_text_variables(fibre['text']) - line = yarn_code_replace(line, parent, next_func) - code += tabs + line + "\n" - 'choice': - var line = parent+next_func+"('"+fibre['marker']+"')" - print(line) - code += tabs + line + "\n" - if run: - run_yarn_code(code) - else: - return code - else: - print('WARNING: Title missing in yarn ball: ', title) - -# override to replace convenience variables -func yarn_code_replace(code, parent='parent.', next_func="yarn_unravel"): - if code.find("[[") != -1: - code = code.replace("[[", parent+next_func+"('") - code = code.replace("]]", "')") - code = code.replace("say(", parent+"say(") - code = code.replace("choice(", parent+"choice(") - return code - -func run_yarn_code(code): - var front = "extends Node\n" - front += "func dynamic_code():\n" - front += "\tvar parent = get_parent()\n\n" - code = front + code - #print("CODE BLOCK: \n", code) - - var script = GDScript.new() - script.set_source_code(code) - script.reload() - - #print("Executing code...") - var node = Node.new() - node.set_script(script) - add_child(node) - var result = node.dynamic_code() - remove_child(node) - - return result - -# EXPORTING TO GDSCRIPT -# -# This code may not be directly usable -# Use if you need an exit from Yarn - -func export_to_gdscript(): - var script = '' - script += "func start_story():\n\n" - if 'settings' in yarn['threads']: - var settings = yarn['threads']['settings'] - for fibre in settings['fibres']: - var line = fibre['text'] - var split = line.split('=') - var setting = split[0].strip_edges(true, true) - var value = split[1].strip_edges(true, true) - script += "\t" + 'story_setting("' + setting + '", "' + value + '")' + "\n" - script += "\tstory_logic('" + yarn['start'] + "')\n\n" - # story logic choice/press event - script += "func story_logic(marker):\n\n" - script += "\tmatch marker:\n" - for title in yarn['threads']: - var thread = yarn['threads'][title] - match thread['kind']: - 'branch': - var code = "\n\t\t'" + thread['title'] + "':" - var tabs = "\n\t\t\t" - for fibre in thread['fibres']: - match fibre['kind']: - 'text': - code += tabs + 'say("' + fibre['text'] + '")' - 'choice': - code += tabs + 'choice("' + fibre['text'] + '", "' + fibre['marker'] + '")' - 'logic': - code += tabs + 'logic("' + fibre['instruction'] + '", "' + fibre['command'] + '")' - script += code + "\n" - 'code': - var code = "\n\t\t'" + thread['title'] + "':" - var tabs = "\n\t\t\t" - code += "\n" - code += yarn_code(thread['title'], false, '', "\t\t\t", "story_logic") - script += code + "\n" - # done - return script - -func print_gdscript_to_console(): - print(export_to_gdscript()) - -func save_to_gdscript(filename): - var script = export_to_gdscript() - # write to file - var file = File.new() - file.open(filename, file.WRITE) - if not file.is_open(): - print('ERROR: Cant open file ', filename) - return false - file.store_string(script) - file.close() -