From 23c00ff32505a1f639649761de2868bfc56d9f6e Mon Sep 17 00:00:00 2001 From: Bram Dingelstad Date: Sun, 12 Dec 2021 13:12:29 +0100 Subject: [PATCH] feat: made a bunch of changes for a web version --- addons/Wol/core/compiler/Compiler.gd | 2 +- addons/Wol/core/compiler/Lexer.gd | 8 +- addons/Wol/core/compiler/Parser.gd | 10 +- addons/Wol/editor/Javascript.gd | 59 ++++++++++ addons/Wol/editor/Preview.gd | 1 + addons/Wol/editor/WolEditor.gd | 50 ++++---- addons/Wol/editor/WolEditor.tscn | 110 +++++++++++++++--- addons/Wol/plugin.gd | 12 +- addons/Wol/splash.png | Bin 0 -> 24059 bytes .../Wol/splash.png.import | 6 +- change-version.sh | 5 + dialogue.wol | 57 ++++----- export_presets.cfg | 90 ++++++++++++-- icon.png | Bin 3305 -> 0 bytes project.godot | 2 + 15 files changed, 312 insertions(+), 100 deletions(-) create mode 100644 addons/Wol/editor/Javascript.gd create mode 100644 addons/Wol/splash.png rename icon.png.import => addons/Wol/splash.png.import (72%) create mode 100755 change-version.sh delete mode 100644 icon.png diff --git a/addons/Wol/core/compiler/Compiler.gd b/addons/Wol/core/compiler/Compiler.gd index 88a7efa..f2f143f 100644 --- a/addons/Wol/core/compiler/Compiler.gd +++ b/addons/Wol/core/compiler/Compiler.gd @@ -116,7 +116,7 @@ func get_nodes(): nodes.append(headers) - # Add +2 to the final line to skip the === from that node + # Add +1 to the final line to skip the === from that node line_number = Array(source_lines).find('===', line_number) + 1 while line_number < source_lines.size() and source_lines[line_number].empty(): diff --git a/addons/Wol/core/compiler/Lexer.gd b/addons/Wol/core/compiler/Lexer.gd index b651b99..ad7e06a 100644 --- a/addons/Wol/core/compiler/Lexer.gd +++ b/addons/Wol/core/compiler/Lexer.gd @@ -309,10 +309,12 @@ func tokenize_line(line, line_number): var start_index = indentation - if token_stack.size() > 0 : - while token_stack.front().type == Constants.TokenType.Identifier: + if token_stack.size() > 0: + while token_stack.size() > 0 and token_stack.front().type == Constants.TokenType.Identifier: token_stack.pop_front() - + if token_stack.size() == 0: + return + var start_delimit_token = token_stack.front() start_index = start_delimit_token.column diff --git a/addons/Wol/core/compiler/Parser.gd b/addons/Wol/core/compiler/Parser.gd index e266b54..8a67956 100644 --- a/addons/Wol/core/compiler/Parser.gd +++ b/addons/Wol/core/compiler/Parser.gd @@ -247,18 +247,18 @@ class FormatFunctionNode extends ParseNode: var format_text = '' var expression_value - func _init(parent:ParseNode, parser, expressionCount:int).(parent, parser): - format_text="[" + func _init(parent, parser, expression_count).(parent, parser): + format_text = '[' parser.expect_symbol([Constants.TokenType.FormatFunctionStart]) - # FIXME: Add exit condition in case of failure while parser.tokens.size() > 0 and not parser.next_symbol_is([Constants.TokenType.FormatFunctionEnd]): if parser.next_symbol_is([Constants.TokenType.Text]): format_text += parser.expect_symbol().value if InlineExpression.can_parse(parser): expression_value = InlineExpression.new(self, parser) - format_text +=" \"{%d}\" " % expressionCount + format_text +=" \"{%d}\" " % expression_count + parser.expect_symbol() format_text+="]" @@ -346,7 +346,6 @@ class CustomCommand extends ParseNode: var command_tokens = [] command_tokens.append(parser.expect_symbol()) - # FIXME: add exit condition while parser.tokens.size() > 0 and not parser.next_symbol_is([Constants.TokenType.EndCommand]): command_tokens.append(parser.expect_symbol()) @@ -470,7 +469,6 @@ class Block extends ParseNode: parser.expect_symbol([Constants.TokenType.Indent]) #keep reading statements until we hit a dedent - # FIXME: find exit condition while parser.tokens.size() > 0 and not parser.next_symbol_is([Constants.TokenType.Dedent]): #parse all statements including nested blocks statements.append(Statement.new(self, parser)) diff --git a/addons/Wol/editor/Javascript.gd b/addons/Wol/editor/Javascript.gd new file mode 100644 index 0000000..cdbdf8e --- /dev/null +++ b/addons/Wol/editor/Javascript.gd @@ -0,0 +1,59 @@ +extends Control + +var open_callback + +func _ready(): + if OS.get_name() != 'HTML5': + return queue_free() + + open_callback = JavaScript.create_callback(self, 'open') + + JavaScript.eval(""" + window.glue = { + register: function(callback) { + document.querySelector('html').ondrop = function(event) { + console.log('Dropped something!', arguments) + if (event.dataTransfer.files.length) { + var file = event.dataTransfer.files[0] + var extension = file.name.split('.').pop() + + if (['wol', 'yarn'].indexOf(extension) === -1) + return console.error('Dropped file wasn\\'t a .yarn or .wol file') + + file.text().then( + function (text) { + callback(text, file.name) + } + ) + } else { + console.error('Dropped something that wasn\\'t a file!') + } + } + } + } +""", true) + + JavaScript.get_interface('glue').register(open_callback) + var file_menu = get_parent().find_node('Menu').get_node('File').get_popup() + file_menu.remove_item(2) # Save as + file_menu.remove_item(1) # Open + +func open(arguments): + var text = arguments[0] + var filename = arguments[1] + var file = File.new() + + var path = 'user://%s' % filename + file.open(path, File.WRITE) + file.store_string(text) + file.close() + + get_parent().open(path) + + $Label.hide() + +func save_as(file_path): + if not file_path: + file_path = 'UnnamedDialogue.wol' + + JavaScript.download_buffer(get_parent().serialize_to_file().to_utf8(), file_path.get_file()) diff --git a/addons/Wol/editor/Preview.gd b/addons/Wol/editor/Preview.gd index c76a5cb..9d8e146 100644 --- a/addons/Wol/editor/Preview.gd +++ b/addons/Wol/editor/Preview.gd @@ -152,6 +152,7 @@ func _on_options(options): button.text = option.line.text button.connect('pressed', self, '_on_option_pressed', [option]) button.show() + button.grab_focus() func _on_option_pressed(option): add_message('Selected option "%s"' % option.line.text) diff --git a/addons/Wol/editor/WolEditor.gd b/addons/Wol/editor/WolEditor.gd index 904d3c9..d5ecd9f 100644 --- a/addons/Wol/editor/WolEditor.gd +++ b/addons/Wol/editor/WolEditor.gd @@ -14,10 +14,6 @@ onready var original_delete_node_dialog = $DeleteNodeDialog.dialog_text onready var original_unsaved_dialog = $UnsavedDialog.dialog_text onready var inside_godot_editor = not get_tree().current_scene and Engine.editor_hint -# Standalone -# TODO: Make arrow keys select options in preview -# FIXME: Fix focus issues while being in-editor - # Godot Editor # FIXME: Make all parts of the code "tool"s and safekeep its execution while in editora # FIXME: Hide console when viewing Wol main screen @@ -76,8 +72,7 @@ func _ready(): $HBoxContainer.set('custom_constants/seperation', 0) - open('res://dialogue.wol') - + update_title() func create_node(position = Vector2.ZERO): var graph_node = GraphNodeTemplate.duplicate() @@ -161,19 +156,22 @@ func serialize_to_file(): return PoolStringArray(buffer).join('\n') func save_as(file_path = null): - if not file_path: - $FileDialog.mode = $FileDialog.MODE_SAVE_FILE - # TODO: Set up path based on context (Godot editor, standalone or web) - $FileDialog.popup_centered() - file_path = yield($FileDialog, 'file_selected') - + if $Javascript: + $Javascript.save_as(file_path) + else: if not file_path: - return - - var file = File.new() - file.open(file_path, File.WRITE) - file.store_string(serialize_to_file()) - file.close() + $FileDialog.mode = $FileDialog.MODE_SAVE_FILE + # TODO: Set up path based on context (Godot editor, standalone or web) + $FileDialog.popup_centered() + file_path = yield($FileDialog, 'file_selected') + + if not file_path: + return + + var file = File.new() + file.open(file_path, File.WRITE) + file.store_string(serialize_to_file()) + file.close() saved_all_changes = true last_save = serialize_to_file() @@ -352,8 +350,9 @@ func move_focus(): > node.center.distance_to(current_focussed.center + focus_pan): closest = node - $GraphEdit.set_selected(closest) - closest.grab_focus() + if closest: + $GraphEdit.set_selected(closest) + closest.grab_focus() focus_pan = null @@ -435,8 +434,9 @@ func _input(event): return save_as() 'Control+O': return open() - - if event.pressed: - focus_pan = Input.get_vector('ui_left', 'ui_right', 'ui_up', 'ui_down') * 500 - elif focus_pan: - move_focus() + + if not $HBoxContainer/Editor.visible: + if event.pressed: + focus_pan = Input.get_vector('ui_left', 'ui_right', 'ui_up', 'ui_down') * 500 + elif focus_pan: + move_focus() diff --git a/addons/Wol/editor/WolEditor.tscn b/addons/Wol/editor/WolEditor.tscn index 7004649..a9f520a 100644 --- a/addons/Wol/editor/WolEditor.tscn +++ b/addons/Wol/editor/WolEditor.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=25 format=2] +[gd_scene load_steps=29 format=2] [ext_resource path="res://addons/Wol/editor/Editor.gd" type="Script" id=1] [ext_resource path="res://addons/Wol/editor/WolEditor.gd" type="Script" id=2] @@ -17,9 +17,22 @@ [ext_resource path="res://addons/Wol/font/Aileron-SemiBoldItalic.otf" type="DynamicFontData" id=15] [ext_resource path="res://addons/Wol/font/Aileron-Italic.otf" type="DynamicFontData" id=16] [ext_resource path="res://addons/Wol/editor/Help.gd" type="Script" id=17] +[ext_resource path="res://addons/Wol/logo.svg" type="Texture" id=18] +[ext_resource path="res://addons/Wol/editor/Javascript.gd" type="Script" id=19] [sub_resource type="StyleBoxEmpty" id=2] +[sub_resource type="Shader" id=334] +code = "shader_type canvas_item; + +void fragment() { + vec4 color = texture(TEXTURE, UV); + COLOR = vec4(1.0 - color.rgb, color.a); +}" + +[sub_resource type="ShaderMaterial" id=335] +shader = SubResource( 334 ) + [sub_resource type="StyleBoxFlat" id=328] bg_color = Color( 0.345098, 0.345098, 0.345098, 1 ) corner_radius_top_left = 8 @@ -68,6 +81,30 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="Javascript" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +input_pass_on_modal_close_click = false +script = ExtResource( 19 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="Javascript"] +modulate = Color( 1, 1, 1, 0.3 ) +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -20.0 +margin_top = -10.0 +margin_right = 20.0 +margin_bottom = 10.0 +grow_horizontal = 2 +grow_vertical = 2 +text = "Drag in a file to get started!" + [node name="Tween" type="Tween" parent="."] [node name="Menu" type="HBoxContainer" parent="."] @@ -77,16 +114,23 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="FrontPadding" type="Control" parent="Menu"] +margin_bottom = 32.0 +__meta__ = { +"_edit_use_anchors_": false +} + [node name="File" type="MenuButton" parent="Menu"] -margin_right = 38.0 +margin_left = 8.0 +margin_right = 46.0 margin_bottom = 32.0 text = "File" items = [ "New", null, 0, false, false, 0, 0, null, "", false, "Open", null, 0, false, false, 1, 0, null, "", false, "Save", null, 0, false, false, 2, 0, null, "", false, "Save as...", null, 0, false, false, 3, 0, null, "", false ] switch_on_hover = true [node name="Settings" type="Button" parent="Menu"] -margin_left = 46.0 -margin_right = 116.0 +margin_left = 54.0 +margin_right = 124.0 margin_bottom = 32.0 focus_mode = 0 enabled_focus_mode = 0 @@ -94,8 +138,8 @@ text = "Settings" flat = true [node name="Help" type="Button" parent="Menu"] -margin_left = 124.0 -margin_right = 171.0 +margin_left = 132.0 +margin_right = 179.0 margin_bottom = 32.0 focus_mode = 0 enabled_focus_mode = 0 @@ -103,8 +147,8 @@ text = "Help" flat = true [node name="About" type="Button" parent="Menu"] -margin_left = 179.0 -margin_right = 234.0 +margin_left = 187.0 +margin_right = 242.0 margin_bottom = 32.0 focus_mode = 0 enabled_focus_mode = 0 @@ -121,7 +165,7 @@ size_flags_horizontal = 10 text = "By @bram_dingelstad" flat = true -[node name="Padding" type="Control" parent="Menu"] +[node name="BackPadding" type="Control" parent="Menu"] margin_left = 1024.0 margin_right = 1024.0 margin_bottom = 32.0 @@ -216,13 +260,37 @@ anchor_right = 1.0 anchor_bottom = 1.0 margin_top = 32.0 custom_styles/bg = SubResource( 2 ) -scroll_offset = Vector2( 0, -511 ) snap_distance = 100 show_zoom_label = true __meta__ = { "_edit_use_anchors_": false } +[node name="TextureRect" type="TextureRect" parent="GraphEdit"] +modulate = Color( 1, 1, 1, 0.2 ) +material = SubResource( 335 ) +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_left = 16.9979 +margin_top = -92.0011 +margin_right = 141.998 +margin_bottom = -29.001 +texture = ExtResource( 18 ) +expand = true +stretch_mode = 7 + +[node name="Label" type="Label" parent="GraphEdit/TextureRect"] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_left = 10.0013 +margin_top = -2.00079 +margin_right = 116.001 +margin_bottom = 17.9992 +text = "version alpha2" +__meta__ = { +"_edit_use_anchors_": false +} + [node name="HBoxContainer" type="HBoxContainer" parent="."] anchor_top = 0.053 anchor_right = 1.0 @@ -590,7 +658,11 @@ margin_right = 297.0 margin_bottom = 231.0 rect_min_size = Vector2( 400, 140 ) resizable = true +access = 2 filters = PoolStringArray( "*.yarn", "*.wol" ) +current_dir = "/Users/bram/Development/Wol" +current_file = "Users" +current_path = "/Users/bram/Development/Wol/Users" __meta__ = { "_edit_use_anchors_": false } @@ -678,7 +750,7 @@ margin_right = 26.5 margin_bottom = 8.0 grow_horizontal = 2 grow_vertical = 2 -text = "Wol (alpha1)" +text = "Wol (alpha2)" align = 1 valign = 1 @@ -720,7 +792,6 @@ custom_fonts/bold_font = SubResource( 333 ) custom_fonts/normal_font = SubResource( 329 ) bbcode_enabled = true bbcode_text = "[b]Keyboard shortcuts[/b] -[s]Line through = not yet implemented[/s] [i]Anywhere[/i] New @@ -733,15 +804,19 @@ Open [right]Ctrl/Cmd + O[/right] [i]Node view[/i] -[s]WASD / Arrows[/s] +WASD / Arrows [right]move focus[/right] -[s]Enter / Dbl click[/s] +Enter / Dbl click [right]open node in editor[/right] +Dbl click background +[right]New node[/right] +Delete +[right]Delete selected node[/right] [i]Editor[/i] Escape [right]Close editor[/right] -[s]Ctrl/Cmd + P[/s] +Ctrl/Cmd + P [right]Play node[/right] [i]Preview[/i] @@ -750,7 +825,6 @@ Space ." text = "Keyboard shortcuts -Line through = not yet implemented Anywhere New @@ -767,6 +841,10 @@ WASD / Arrows move focus Enter / Dbl click open node in editor +Dbl click background +New node +Delete +Delete selected node Editor Escape diff --git a/addons/Wol/plugin.gd b/addons/Wol/plugin.gd index 9e95aa0..81e47df 100644 --- a/addons/Wol/plugin.gd +++ b/addons/Wol/plugin.gd @@ -13,8 +13,8 @@ func _enter_tree(): load('res://addons/Wol/icon-white.svg') ) - wol_editor_instance = WolEditor.instance() - get_editor_interface().get_editor_viewport().add_child(wol_editor_instance) + # wol_editor_instance = WolEditor.instance() + # get_editor_interface().get_editor_viewport().add_child(wol_editor_instance) make_visible(false) @@ -37,11 +37,11 @@ func make_visible(visible): func _exit_tree(): remove_custom_type('Wol') - if wol_editor_instance: - wol_editor_instance.queue_free() + # if wol_editor_instance: + # wol_editor_instance.queue_free() -func has_main_screen(): - return true +# func has_main_screen(): +# return true func get_plugin_name(): return 'Wol' diff --git a/addons/Wol/splash.png b/addons/Wol/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..e43ecd0ec3bae6cbe5f164e80fd18a3b65776671 GIT binary patch literal 24059 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/dev/null | cut -d : -f1 | uniq | while read -r file; do gsed -i "s/$old_version/ +$new_version/g" "$file"; done diff --git a/dialogue.wol b/dialogue.wol index 7793c6d..b62b614 100644 --- a/dialogue.wol +++ b/dialogue.wol @@ -10,34 +10,6 @@ Narrator: Do you want to continue talking? [[Start]] -> No === -title: Start -tags: -colorID: -position: 500, -400 ---- -<> -<> - -// remove "to" to trigger error -<> -<> - -// Implement inline expressions -<> -Narrator: You, {$direction} way! -<> -Narrator: Do you know you've been here {visit_count()} times? -You: Did you know one + one equals {$one + $one}? -Narrator: You wanna go somewhere? - --> Go to the store - [[TheStore]] --> How much did I visit the store? - Narrator: You've been to the store { visit_count("TheStore") } times. - [[Start]] --> Lets stay here and talk - [[Talk]] -=== title: TheStore tags: colorID: @@ -68,4 +40,33 @@ You: IM AT THE SOUP STORE!! Guy: WHY ARE YOU BUYING CLOTHES AT THE SOUP STORE?! You: FUCK YOU! [[Go home|Start]] +=== +title: Start +tags: +colorID: +position: 500, -400 +--- +<> +<> + +// remove "to" to trigger error +<> +<> + +// Implement inline expressions +<> +Narrator: You, {$direction} way! +<> +Narrator: Do you know you've been here {visit_count()} times? +You: Did you know one + one equals {$one + $one}? +<> +Narrator: You wanna go somewhere [select {$value} option1="yonder" option2="here"]? + +-> Go to the store + [[TheStore]] +-> How much did I visit the store? + Narrator: You've been to the store { visit_count("TheStore") } times. + [[Start]] +-> Lets stay here and talk + [[Talk]] === \ No newline at end of file diff --git a/export_presets.cfg b/export_presets.cfg index 8d42d97..d8ca812 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -2,12 +2,12 @@ name="Mac OSX" platform="Mac OSX" -runnable=true +runnable=false custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="export/osx/Wol.dmg" +export_path="export/osx/WolEditor.dmg" script_export_mode=1 script_encryption_key="" @@ -16,21 +16,21 @@ script_encryption_key="" custom_template/debug="" custom_template/release="" application/name="Wol Editor" -application/info="Wol Editor: a editor for Yarn and Wol files" +application/info="Wol Editor: an editor for Yarn and Wol files" application/icon="" application/identifier="works.dingelstad.bram.woleditor" application/signature="" application/app_category="Developer-tools" -application/short_version="1.0" -application/version="1.0" -application/copyright="© Bram Dingelstad" +application/short_version="alpha2" +application/version="alpha2" +application/copyright="MIT License: Bram Dingelstad, kyperbelt, Secret Labs" display/high_res=true privacy/camera_usage_description="" privacy/microphone_usage_description="" -codesign/enable=false -codesign/identity="" +codesign/enable=true +codesign/identity="WolEditor" codesign/timestamp=false -codesign/hardened_runtime=false +codesign/hardened_runtime=true codesign/replace_existing_signature=false codesign/entitlements/custom_file="" codesign/entitlements/allow_jit_code_execution=false @@ -45,7 +45,7 @@ codesign/entitlements/calendars=false codesign/entitlements/photos_library=false codesign/entitlements/apple_events=false codesign/entitlements/debugging=false -codesign/entitlements/app_sandbox/enabled=false +codesign/entitlements/app_sandbox/enabled=true codesign/entitlements/app_sandbox/network_server=false codesign/entitlements/app_sandbox/network_client=false codesign/entitlements/app_sandbox/device_usb=false @@ -56,8 +56,8 @@ codesign/entitlements/app_sandbox/files_music=0 codesign/entitlements/app_sandbox/files_movies=0 codesign/custom_options=PoolStringArray( ) notarization/enable=false -notarization/apple_id_name="" -notarization/apple_id_password="" +notarization/apple_id_name="bram.dingelstad+apple@pm.me" +notarization/apple_id_password="?00f493b9945fDDB7Fb!" notarization/apple_team_id="" texture_format/s3tc=true texture_format/etc=false @@ -97,3 +97,69 @@ progressive_web_app/icon_144x144="" progressive_web_app/icon_180x180="" progressive_web_app/icon_512x512="" progressive_web_app/background_color=Color( 0, 0, 0, 1 ) + +[preset.2] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="export/windows/WolEditor.exe" +script_export_mode=1 +script_encryption_key="" + +[preset.2.options] + +custom_template/debug="" +custom_template/release="" +binary_format/64_bits=true +binary_format/embed_pck=true +texture_format/bptc=false +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +texture_format/no_bptc_fallbacks=true +codesign/enable=false +codesign/identity="" +codesign/password="" +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PoolStringArray( ) +application/icon="" +application/file_version="alpha2" +application/product_version="alpha2" +application/company_name="Dingelstad Works" +application/product_name="Wol Editor" +application/file_description="" +application/copyright="MIT: Bram Dingelstad, kyperbelt, Secret Labs" +application/trademarks="" + +[preset.3] + +name="Linux/X11" +platform="Linux/X11" +runnable=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="export/linux/WolEditor" +script_export_mode=1 +script_encryption_key="" + +[preset.3.options] + +custom_template/debug="" +custom_template/release="" +binary_format/64_bits=true +binary_format/embed_pck=true +texture_format/bptc=false +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +texture_format/no_bptc_fallbacks=true diff --git a/icon.png b/icon.png deleted file mode 100644 index c98fbb601c83c81ec8c22b1dba7d1d57c62b323c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3305 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 diff --git a/project.godot b/project.godot index ac2c9e7..4007155 100644 --- a/project.godot +++ b/project.godot @@ -20,6 +20,8 @@ Yarn's similar in style to Twine, so if you already know that, you'll be right a Wol is actively maintained by Bram Dingelstad, if you need a programmer or designer for your next (Godot) project, you can hire him!" run/main_scene="res://addons/Wol/editor/WolEditor.tscn" run/low_processor_mode=true +boot_splash/image="res://addons/Wol/splash.png" +boot_splash/fullsize=false config/icon="res://addons/Wol/icon-white-with-stroke.svg" [debug]