From 1c4873e10368e4e315112ce3439b666062479458 Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Sun, 16 Aug 2020 08:50:04 +0200 Subject: [PATCH] Add sources --- .gitignore | 15 + addons/aseprite_importer/LICENSE | 21 + .../classes/AsepriteImportData.gd | 174 ++++++ .../classes/AsepriteImporter.gd | 153 +++++ .../aseprite_importer/classes/EditorTheme.gd | 26 + addons/aseprite_importer/interface/Main.gd | 156 +++++ addons/aseprite_importer/interface/Main.tscn | 100 ++++ .../interface/icons/dark_icon.png | Bin 0 -> 226 bytes .../interface/icons/dark_icon.png.import | 34 ++ .../interface/icons/light_icon.png | Bin 0 -> 225 bytes .../interface/icons/light_icon.png.import | 34 ++ .../interface/import_menu/JSONImportMenu.gd | 75 +++ .../interface/import_menu/JSONImportMenu.tscn | 78 +++ .../import_menu/SelectAnimationPlayerMenu.gd | 64 ++ .../SelectAnimationPlayerMenu.tscn | 53 ++ .../interface/import_menu/SelectNodeDialog.gd | 144 +++++ .../import_menu/SelectNodeDialog.tscn | 98 ++++ .../interface/import_menu/SelectSpriteMenu.gd | 81 +++ .../import_menu/SelectSpriteMenu.tscn | 43 ++ .../interface/import_menu/TagsMenu.gd | 202 +++++++ .../interface/import_menu/TagsMenu.tscn | 41 ++ .../spritesheet_inspector/ColorMenuItem.gd | 95 +++ .../spritesheet_inspector/ColorMenuItem.tscn | 37 ++ .../spritesheet_inspector/SettingsMenu.gd | 74 +++ .../SpritesheetInspector.gd | 246 ++++++++ .../SpritesheetInspector.tscn | 255 ++++++++ .../spritesheet_inspector/SpritesheetView.gd | 315 ++++++++++ .../SpritesheetView.tscn | 48 ++ .../godot_button/godot_hover.png | Bin 0 -> 230 bytes .../godot_button/godot_hover.png.import | 34 ++ .../godot_button/godot_normal.png | Bin 0 -> 224 bytes .../godot_button/godot_normal.png.import | 34 ++ .../godot_button/godot_pressed.png | Bin 0 -> 212 bytes .../godot_button/godot_pressed.png.import | 34 ++ addons/aseprite_importer/plugin.cfg | 7 + addons/aseprite_importer/plugin.gd | 101 ++++ default_env.tres | 7 + dialogues/intro_1.json | 8 + fonts/EnterCommand-Bold.ttf | Bin 0 -> 39616 bytes fonts/EnterCommand-Italic.ttf | Bin 0 -> 45808 bytes fonts/EnterCommand.ttf | Bin 0 -> 40056 bytes fonts/dialog_default_font.tres | 7 + icon.png | Bin 0 -> 3305 bytes icon.png.import | 34 ++ images/Ely_Sitting.png | Bin 0 -> 42796 bytes images/Ely_Sitting.png.import | 34 ++ images/campfire.png | Bin 0 -> 35705 bytes images/campfire.png.import | 34 ++ images/campfire.tres | 107 ++++ images/ely.tres | 555 ++++++++++++++++++ images/herbert_Eyes.png | Bin 0 -> 5068 bytes images/herbert_Eyes.png.import | 34 ++ images/herbert_FirstStep.png | Bin 0 -> 10490 bytes images/herbert_FirstStep.png.import | 34 ++ images/herbert_SecondStep.png | Bin 0 -> 8968 bytes images/herbert_SecondStep.png.import | 34 ++ images/menu.png | Bin 0 -> 1232 bytes images/menu.png.import | 34 ++ images/titleCampfire_loop.png | Bin 0 -> 14460 bytes images/titleCampfire_loop.png.import | 34 ++ images/titleCampfire_start.png | Bin 0 -> 13072 bytes images/titleCampfire_start.png.import | 34 ++ images/titleCrab.png | Bin 0 -> 1630 bytes images/titleCrab.png.import | 34 ++ images/titleEly_idle.png | Bin 0 -> 31446 bytes images/titleEly_idle.png.import | 34 ++ images/titleEly_start.png | Bin 0 -> 32316 bytes images/titleEly_start.png.import | 34 ++ images/title_background.tres | 401 +++++++++++++ images/title_background_campfire.tres | 497 ++++++++++++++++ images/ui/brassy_frame.png | Bin 0 -> 4886 bytes images/ui/brassy_frame.png.import | 34 ++ images/ui/dialogue_bg.png | Bin 0 -> 108 bytes images/ui/dialogue_bg.png.import | 34 ++ project.godot | 87 +++ scenes/campfire.tscn | 35 ++ scenes/dialogue.tscn | 196 +++++++ scenes/main_menu.tscn | 90 +++ scenes/startup.tscn | 6 + scripts/DialogueAction.gd | 22 + scripts/DialogueBox.gd | 45 ++ scripts/DialogueDatabase.gd | 26 + scripts/menu/MainMenu.gd | 12 + scripts/menu/MenuButton.gd | 3 + scripts/menu/title_background.gd | 10 + scripts/pause_menu.gd | 6 + scripts/scenes/IntroScript.gd | 15 + scripts/scenes/startup.gd | 4 + 88 files changed, 5487 insertions(+) create mode 100644 .gitignore create mode 100644 addons/aseprite_importer/LICENSE create mode 100644 addons/aseprite_importer/classes/AsepriteImportData.gd create mode 100644 addons/aseprite_importer/classes/AsepriteImporter.gd create mode 100644 addons/aseprite_importer/classes/EditorTheme.gd create mode 100644 addons/aseprite_importer/interface/Main.gd create mode 100644 addons/aseprite_importer/interface/Main.tscn create mode 100644 addons/aseprite_importer/interface/icons/dark_icon.png create mode 100644 addons/aseprite_importer/interface/icons/dark_icon.png.import create mode 100644 addons/aseprite_importer/interface/icons/light_icon.png create mode 100644 addons/aseprite_importer/interface/icons/light_icon.png.import create mode 100644 addons/aseprite_importer/interface/import_menu/JSONImportMenu.gd create mode 100644 addons/aseprite_importer/interface/import_menu/JSONImportMenu.tscn create mode 100644 addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.gd create mode 100644 addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.tscn create mode 100644 addons/aseprite_importer/interface/import_menu/SelectNodeDialog.gd create mode 100644 addons/aseprite_importer/interface/import_menu/SelectNodeDialog.tscn create mode 100644 addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.gd create mode 100644 addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.tscn create mode 100644 addons/aseprite_importer/interface/import_menu/TagsMenu.gd create mode 100644 addons/aseprite_importer/interface/import_menu/TagsMenu.tscn create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.gd create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.tscn create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/SettingsMenu.gd create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.gd create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.tscn create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.gd create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.tscn create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png.import create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_normal.png create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_normal.png.import create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_pressed.png create mode 100644 addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_pressed.png.import create mode 100644 addons/aseprite_importer/plugin.cfg create mode 100644 addons/aseprite_importer/plugin.gd create mode 100644 default_env.tres create mode 100644 dialogues/intro_1.json create mode 100644 fonts/EnterCommand-Bold.ttf create mode 100644 fonts/EnterCommand-Italic.ttf create mode 100644 fonts/EnterCommand.ttf create mode 100644 fonts/dialog_default_font.tres create mode 100644 icon.png create mode 100644 icon.png.import create mode 100644 images/Ely_Sitting.png create mode 100644 images/Ely_Sitting.png.import create mode 100644 images/campfire.png create mode 100644 images/campfire.png.import create mode 100644 images/campfire.tres create mode 100644 images/ely.tres create mode 100644 images/herbert_Eyes.png create mode 100644 images/herbert_Eyes.png.import create mode 100644 images/herbert_FirstStep.png create mode 100644 images/herbert_FirstStep.png.import create mode 100644 images/herbert_SecondStep.png create mode 100644 images/herbert_SecondStep.png.import create mode 100644 images/menu.png create mode 100644 images/menu.png.import create mode 100644 images/titleCampfire_loop.png create mode 100644 images/titleCampfire_loop.png.import create mode 100644 images/titleCampfire_start.png create mode 100644 images/titleCampfire_start.png.import create mode 100644 images/titleCrab.png create mode 100644 images/titleCrab.png.import create mode 100644 images/titleEly_idle.png create mode 100644 images/titleEly_idle.png.import create mode 100644 images/titleEly_start.png create mode 100644 images/titleEly_start.png.import create mode 100644 images/title_background.tres create mode 100644 images/title_background_campfire.tres create mode 100644 images/ui/brassy_frame.png create mode 100644 images/ui/brassy_frame.png.import create mode 100644 images/ui/dialogue_bg.png create mode 100644 images/ui/dialogue_bg.png.import create mode 100644 project.godot create mode 100644 scenes/campfire.tscn create mode 100644 scenes/dialogue.tscn create mode 100644 scenes/main_menu.tscn create mode 100644 scenes/startup.tscn create mode 100644 scripts/DialogueAction.gd create mode 100644 scripts/DialogueBox.gd create mode 100644 scripts/DialogueDatabase.gd create mode 100644 scripts/menu/MainMenu.gd create mode 100644 scripts/menu/MenuButton.gd create mode 100644 scripts/menu/title_background.gd create mode 100644 scripts/pause_menu.gd create mode 100644 scripts/scenes/IntroScript.gd create mode 100644 scripts/scenes/startup.gd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a61cf15 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +.idea/ + +### Godot ### + +# Godot-specific ignores +.import/ +export.cfg +export_presets.cfg + +# Imported translations (automatically generated from CSV files) +*.translation + +# Mono-specific ignores +.mono/ +data_*/ diff --git a/addons/aseprite_importer/LICENSE b/addons/aseprite_importer/LICENSE new file mode 100644 index 0000000..2406b07 --- /dev/null +++ b/addons/aseprite_importer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Hector Margittay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/addons/aseprite_importer/classes/AsepriteImportData.gd b/addons/aseprite_importer/classes/AsepriteImportData.gd new file mode 100644 index 0000000..ad21631 --- /dev/null +++ b/addons/aseprite_importer/classes/AsepriteImportData.gd @@ -0,0 +1,174 @@ +tool +extends Node +class_name AsepriteImportData + + +enum Error{ + OK, + ERR_JSON_PARSE_ERROR, + ERR_INVALID_JSON_DATA, +} + + +const FRAME_TEMPLATE = { + frame = { + x = TYPE_INT, + y = TYPE_INT, + w = TYPE_INT, + h = TYPE_INT, + }, + spriteSourceSize = { + x = TYPE_INT, + y = TYPE_INT, + w = TYPE_INT, + h = TYPE_INT, + }, + sourceSize = { + w = TYPE_INT, + h = TYPE_INT, + }, + duration = TYPE_INT, +} + +const META_TEMPLATE = { + frameTags = [ + { + name = TYPE_STRING, + from = TYPE_INT, + to = TYPE_INT, + direction = TYPE_STRING + }, + ], + size = { + w = TYPE_INT, + h = TYPE_INT, + }, +} + + +var json_filepath : String +var json_data : Dictionary + + +func load(filepath : String) -> int: + var file := File.new() + + var error := file.open(filepath, File.READ) + if error != OK: + return error + + var file_text = file.get_as_text() + file.close() + + var json := JSON.parse(file_text) + if json.error != OK: + return Error.ERR_JSON_PARSE_ERROR + + if not _validate_json(json): + return Error.ERR_INVALID_JSON_DATA + + json_filepath = filepath + json_data = json.result + + return OK + + +func get_frame_array() -> Array: + if not json_data: + return [] + + var frame_data = json_data.frames + if frame_data is Dictionary: + return frame_data.values() + + return frame_data + + +func get_image_filename() -> String: + if not (json_data and json_data.meta.has("image")): + return "" + + return json_data.meta.image + + +func get_image_size() -> Vector2: + if not json_data: + return Vector2.ZERO + + var image_size : Dictionary = json_data.meta.size + return Vector2( + image_size.w, + image_size.h + ) + + +func get_tag(tag_idx : int) -> Dictionary: + var tags := get_tags() + + if tag_idx >= 0 and tag_idx < tags.size(): + return tags[tag_idx] + + return {} + + +func get_tags() -> Array: + if not json_data: + return [] + + return json_data.meta.frameTags + + +static func _validate_json(json : JSONParseResult) -> bool: + var data : Dictionary = json.result + + if not (data is Dictionary and data.has_all(["frames", "meta"])): + return false + + # "frames" validation + var frames = data.frames + var is_hash := frames is Dictionary + + for frame in frames: + if is_hash: + frame = frames[frame] + + if not _match_template(frame, FRAME_TEMPLATE): + return false + + # "meta" validation + return _match_template(data.meta, META_TEMPLATE) + + +""" +This helper function recursively walks an Array or a Dictionary checking if each +children's type matches the template +""" +static func _match_template(data, template) -> bool: + match typeof(template): + TYPE_INT: + # When parsed, the JSON interprets integer values as floats + if template == TYPE_INT and typeof(data) == TYPE_REAL: + return true + return typeof(data) == template + TYPE_DICTIONARY: + if typeof(data) != TYPE_DICTIONARY: + return false + + if not data.has_all(template.keys()): + return false + + for key in template: + if not _match_template(data[key], template[key]): + return false + TYPE_ARRAY: + if typeof(data) != TYPE_ARRAY: + return false + + if data.empty(): + return false + + for element in data: + if not _match_template(element, template[0]): + return false + + return true diff --git a/addons/aseprite_importer/classes/AsepriteImporter.gd b/addons/aseprite_importer/classes/AsepriteImporter.gd new file mode 100644 index 0000000..dd4d8d6 --- /dev/null +++ b/addons/aseprite_importer/classes/AsepriteImporter.gd @@ -0,0 +1,153 @@ +tool +extends Node +class_name AsepriteImporter + + +enum Error{ + OK, + INVALID_JSON_DATA, + MISSING_JSON_DATA, + MISSING_ANIMATION_PLAYER, + MISSING_SPRITE, + NO_TAGS_SELECTED, + DUPLICATE_TAG_NAME, + MISSING_TEXTURE, +} + + +static func generate_animations(import_data : AsepriteImportData, selected_tags : Array, + animation_player : AnimationPlayer, sprite : Node, texture : Texture) -> int: + + if not(import_data and import_data.json_data): + return Error.MISSING_JSON_DATA + + var frame_tags : Array = import_data.get_tags() + + if not selected_tags: + return Error.NO_TAGS_SELECTED + else: + var tag_names := [] + for tag_idx in selected_tags: + var tag_name : String = frame_tags[tag_idx].name + + if tag_names.has(tag_name): + return Error.DUPLICATE_TAG_NAME + else: + tag_names.append(tag_name) + + if not animation_player: + return Error.MISSING_ANIMATION_PLAYER + + if not(sprite is Sprite or sprite is Sprite3D): + return Error.MISSING_SPRITE + + if texture == null: + return Error.MISSING_TEXTURE + + var animation_root_path := animation_player.root_node + var animation_root_node := animation_player.get_node(animation_root_path) + var sprite_relative_path := str(animation_root_node.get_path_to(sprite)) + + # These are tracks that will be used + var tracks := { + "region" : { + path = (sprite_relative_path + ":region_rect"), + }, + "offset" : { + path = (sprite_relative_path + ":offset") + } + } + + var frames := import_data.get_frame_array() + var is_sprite3d := sprite is Sprite3D + + # Iterate over each tag (animation) + for tag_idx in selected_tags: + var tag : Dictionary = frame_tags[tag_idx] + + var animation : Animation + # Check if the animation already exists + if animation_player.has_animation(tag.name): + animation = animation_player.get_animation(tag.name) + else: + # If it doesn't, adds a new one + animation = Animation.new() + # warning-ignore:return_value_discarded + animation_player.add_animation(tag.name, animation) + + # Setup the animation tracks + for track_name in tracks: + var track : Dictionary = tracks[track_name] + + track.idx = animation.find_track(track.path) + + # Checks if the track doesn't exist + if track.idx == -1: + # Create a new_track + track.idx = animation.add_track(Animation.TYPE_VALUE) + animation.track_set_path(track.idx, track.path) + else: + # Remove all existing keys from the track + for key_idx in range(animation.track_get_key_count(track.idx)): + animation.track_remove_key(track.idx, 0) + + # Set the track Interpolation Mode to Nearest + animation.track_set_interpolation_type(track.idx, Animation.INTERPOLATION_NEAREST) + #Enable the track + animation.track_set_enabled(track.idx, true) + + var time := 0.0 + var frame_idxs := range(tag.from, tag.to + 1) + + # Modify the frame order based on the tag's direction + match tag.direction: + "reverse": + frame_idxs.invert() + "pingpong": + var pong_frame_idxs := range(tag.from + 1, tag.to) + pong_frame_idxs.invert() + frame_idxs += pong_frame_idxs + + # Insert the new keys + for i in frame_idxs: + var frame : Dictionary = frames[i] + + # Get the region of the spritesheet that has the frame + var rect = frame.frame + var region = Rect2(rect.x, rect.y, rect.w, rect.h) + + # Insert the new key for the region track + animation.track_insert_key(tracks.region.idx, time, region) + + # Get the center of the frame in the original size + var source_size : Dictionary = frame.sourceSize + var source_center_x : float = source_size.w / 2 + var source_center_y : float = source_size.h / 2 + + # Get the center of the trimmed frame in the spritesheet + var trim_rect : Dictionary = frame.spriteSourceSize + var trim_rect_center_x : float = trim_rect.x + (trim_rect.w / 2) + var trim_rect_center_y : float = trim_rect.y + (trim_rect.h / 2) + + # Calculate the offset between the trimmed frame center and original frame center + var offset_x := trim_rect_center_x - source_center_x + var offset_y := trim_rect_center_y - source_center_y + + # Invert the vertical offset when the selected sprite is a Sprite3D + if is_sprite3d: + offset_y *= -1 + + # Insert the new key for the offset track + animation.track_insert_key(tracks.offset.idx, time, Vector2(offset_x, offset_y)) + + # Add up the current frame's duration for the next key position + time += frame.duration / 1000 + + # Set the animation length equal to the sum of all frame's durations + animation.length = time + + sprite.texture = texture + sprite.region_enabled = true + sprite.centered = true + + return OK diff --git a/addons/aseprite_importer/classes/EditorTheme.gd b/addons/aseprite_importer/classes/EditorTheme.gd new file mode 100644 index 0000000..55ef661 --- /dev/null +++ b/addons/aseprite_importer/classes/EditorTheme.gd @@ -0,0 +1,26 @@ +tool +extends Node +class_name EditorTheme + + +var _theme : Theme + + +func _init(theme : Theme) -> void: + _theme = theme + + +func get_color(color_name : String, color_list := "Editor") -> Color: + return _theme.get_color(color_name, color_list) + + +func get_font(font_name : String, font_list := "EditorFonts") -> Font: + return _theme.get_font(font_name, font_list) + + +func get_icon(icon_name : String, icon_list := "EditorIcons") -> Texture: + return _theme.get_icon(icon_name, icon_list) + + +func get_stylebox(stylebox_name : String, stylebox_list := "EditorStyles") -> StyleBox: + return _theme.get_stylebox(stylebox_name, stylebox_list) diff --git a/addons/aseprite_importer/interface/Main.gd b/addons/aseprite_importer/interface/Main.gd new file mode 100644 index 0000000..6750d18 --- /dev/null +++ b/addons/aseprite_importer/interface/Main.gd @@ -0,0 +1,156 @@ +tool +extends PanelContainer + +onready var import_menu : Container = $Body/ImportMenu +onready var steps : Container = import_menu.get_node("Steps") +onready var json_import_menu : Container = steps.get_node("JSONImportMenu") +onready var tags_menu : Container = steps.get_node("TagsMenu") +onready var select_animation_player_menu = steps.get_node("SelectAnimationPlayerMenu") +onready var select_sprite_menu = steps.get_node("SelectSpriteMenu") +onready var generate_button : Button = steps.get_node("GenerateButton") + +onready var spritesheet_inspector : Container = $Body/SpritesheetInspector + +onready var alert_dialog : AcceptDialog = $AlertDialog + + +const ERROR_MSG := { + AsepriteImporter.Error.MISSING_JSON_DATA : "Missing JSON Data!", + AsepriteImporter.Error.MISSING_ANIMATION_PLAYER : "Select an AnimationPlayer node!", + AsepriteImporter.Error.MISSING_SPRITE : "Select a Sprite node!", + AsepriteImporter.Error.NO_TAGS_SELECTED : "No tags selected to import!", + AsepriteImporter.Error.DUPLICATE_TAG_NAME : "Two or more of the selected tags share the same name\nSelect only tags with distinct names", + AsepriteImporter.Error.MISSING_TEXTURE: "No texture selected!", +} + +const IMPORT_MENU_INITIAL_WIDTH := 300 + + +var import_data : AsepriteImportData + +var _is_ready := false + + +signal animations_generated(animation_player) + + +func _ready() -> void: + import_menu.rect_size.x = IMPORT_MENU_INITIAL_WIDTH + + alert_dialog.set_as_toplevel(true) + + json_import_menu.connect("data_imported", self, "_on_JSONImportMenu_data_imported") + json_import_menu.connect("data_cleared", self, "_on_JSONImportMenu_data_cleared") + tags_menu.connect("frame_selected", self, "_on_TagSelectMenu_frame_selected") + tags_menu.connect("tag_selected", self, "_on_TagSelectMenu_tag_selected") + generate_button.connect("pressed", self, "_on_GenerateButton_pressed") + + +func get_state() -> Dictionary: + var state := { + "import_data" : import_data, + "tags_menu" : tags_menu.get_state(), + "select_sprite_menu" : select_sprite_menu.get_state(), + "select_animation_player_menu" : select_animation_player_menu.get_state(), + "spritesheet_inspector" : spritesheet_inspector.get_state(), + } + + return state + + +func set_state(new_state : Dictionary) -> void: + var json_filepath := "" + var tags := [] + var selected_tags := [] + + if new_state.get("import_data", false): + import_data = new_state.import_data + json_filepath = import_data.json_filepath + tags = import_data.get_tags() + spritesheet_inspector.frames = import_data.get_frame_array() + +# var selected_tag := import_data.get_tag(tag_name) +# if selected_tag: +# spritesheet_inspector.select_frames(range(selected_tag.from, selected_tag.to + 1)) + else: + import_data = null + new_state.erase("tags_menu") +# new_state.erase("spritesheet_inspector") + + json_import_menu.set_json_filepath(json_filepath) + + select_sprite_menu.set_state(new_state.get("select_sprite_menu", {})) + + select_animation_player_menu.set_state(new_state.get("select_animation_player_menu", {})) + + spritesheet_inspector.set_state(new_state.get("spritesheet_inspector", {})) + + tags_menu.load_tags(tags) + tags_menu.set_state(new_state.get("tags_menu", {})) + + +func _show_alert(message : String) -> void: + alert_dialog.dialog_text = message + alert_dialog.popup_centered() + + +func _update_theme(editor_theme : EditorTheme) -> void: + generate_button.icon = editor_theme.get_icon("ImportCheck") + + +# Signal Callbacks +func _on_GenerateButton_pressed() -> void: + var selected_tags : Array = tags_menu.get_selected_tags() + var animation_player : AnimationPlayer = select_animation_player_menu.animation_player + var sprite : Node = select_sprite_menu.sprite + var texture : Texture = spritesheet_inspector.get_texture() + + var error := AsepriteImporter.generate_animations(import_data, selected_tags, animation_player, sprite, texture) + + if error != OK: + var error_msg : String + + if ERROR_MSG.has(error): + error_msg = ERROR_MSG[error] + else: + error_msg = "An error ocurred!" + + _show_alert(error_msg) + else: + emit_signal("animations_generated", animation_player) + + +func _on_JSONImportMenu_data_imported(new_import_data : AsepriteImportData) -> void: + import_data = new_import_data + + var tags : Array = import_data.get_tags() + tags_menu.load_tags(tags) + + var json_filepath := import_data.json_filepath + var json_dir_path := json_filepath.rsplit("/", true, 1)[0] + + var image_filepath := "" + + var image_filename := import_data.get_image_filename() + + image_filepath = str(json_dir_path, "/", image_filename) + + spritesheet_inspector.texture_size = import_data.get_image_size() + spritesheet_inspector.frames = import_data.get_frame_array() + spritesheet_inspector.load_texture(image_filepath) + + +func _on_JSONImportMenu_data_cleared() -> void: + import_data = null + + spritesheet_inspector.clear_texture() + tags_menu.clear_options() + + +func _on_TagSelectMenu_frame_selected(idx : int) -> void: + spritesheet_inspector.select_frames([idx]) + + +func _on_TagSelectMenu_tag_selected(tag_idx : int) -> void: + var selected_tag := import_data.get_tag(tag_idx) + spritesheet_inspector.select_frames(range(selected_tag.from, selected_tag.to + 1)) diff --git a/addons/aseprite_importer/interface/Main.tscn b/addons/aseprite_importer/interface/Main.tscn new file mode 100644 index 0000000..9d93c63 --- /dev/null +++ b/addons/aseprite_importer/interface/Main.tscn @@ -0,0 +1,100 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/Main.gd" type="Script" id=1] +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/JSONImportMenu.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/TagsMenu.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.tscn" type="PackedScene" id=5] +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.tscn" type="PackedScene" id=6] + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 229, 127, 0, 113, 241, 127, 0, 113, 240, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 229, 127, 0, 114, 229, 127, 20, 113, 241, 127, 184, 113, 240, 127, 144, 113, 240, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 229, 127, 0, 114, 229, 127, 20, 114, 241, 127, 210, 115, 242, 128, 255, 114, 241, 127, 170, 114, 241, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 229, 127, 0, 114, 229, 127, 20, 114, 241, 126, 209, 115, 242, 128, 255, 114, 241, 127, 210, 109, 230, 121, 21, 109, 230, 121, 0, 0, 0, 0, 0, 113, 240, 127, 0, 113, 241, 127, 0, 114, 229, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 235, 123, 0, 114, 229, 127, 20, 114, 241, 127, 208, 115, 242, 128, 255, 114, 241, 127, 210, 104, 231, 127, 22, 106, 230, 124, 0, 0, 0, 0, 0, 113, 240, 127, 0, 113, 240, 127, 144, 113, 241, 127, 184, 114, 229, 127, 20, 114, 229, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 240, 123, 0, 107, 241, 120, 19, 114, 241, 126, 207, 115, 242, 128, 255, 114, 241, 126, 211, 104, 231, 127, 22, 104, 231, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 241, 127, 0, 114, 241, 127, 170, 115, 242, 128, 255, 114, 241, 127, 210, 114, 229, 127, 20, 114, 229, 127, 0, 113, 240, 127, 0, 113, 240, 127, 18, 114, 241, 126, 207, 115, 242, 128, 255, 114, 241, 127, 212, 104, 231, 127, 22, 104, 231, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 230, 121, 0, 109, 230, 121, 21, 114, 241, 127, 210, 115, 242, 128, 255, 114, 241, 126, 209, 114, 229, 127, 20, 113, 240, 127, 18, 114, 241, 126, 207, 115, 242, 128, 255, 114, 241, 126, 213, 104, 231, 127, 22, 104, 231, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 230, 124, 0, 104, 231, 127, 22, 114, 241, 127, 210, 115, 242, 128, 255, 114, 241, 126, 207, 113, 241, 127, 206, 115, 242, 128, 255, 114, 241, 126, 213, 110, 232, 121, 23, 107, 231, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 231, 127, 0, 104, 231, 127, 22, 114, 241, 127, 212, 115, 242, 128, 255, 115, 242, 128, 255, 114, 241, 126, 213, 106, 233, 127, 24, 108, 232, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 231, 127, 0, 104, 231, 127, 22, 113, 241, 127, 186, 114, 241, 126, 187, 106, 233, 127, 24, 106, 233, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 231, 127, 0, 113, 241, 127, 0, 114, 241, 126, 0, 106, 233, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 0 +flags = 0 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[node name="Main" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Body" type="HSplitContainer" parent="."] +margin_left = 7.0 +margin_top = 7.0 +margin_right = 1017.0 +margin_bottom = 593.0 +size_flags_vertical = 3 + +[node name="ImportMenu" type="ScrollContainer" parent="Body"] +margin_right = 300.0 +margin_bottom = 586.0 +rect_min_size = Vector2( 300, 0 ) +size_flags_vertical = 3 +follow_focus = true +scroll_horizontal_enabled = false +scroll_horizontal = 100 + +[node name="Steps" type="VBoxContainer" parent="Body/ImportMenu"] +margin_right = 300.0 +margin_bottom = 586.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 12 + +[node name="JSONImportMenu" parent="Body/ImportMenu/Steps" instance=ExtResource( 3 )] +margin_right = 300.0 + +[node name="TagsMenu" parent="Body/ImportMenu/Steps" instance=ExtResource( 4 )] +margin_top = 50.0 +margin_right = 300.0 +margin_bottom = 432.0 + +[node name="SelectAnimationPlayerMenu" parent="Body/ImportMenu/Steps" instance=ExtResource( 2 )] +margin_top = 444.0 +margin_right = 300.0 +margin_bottom = 484.0 + +[node name="SelectSpriteMenu" parent="Body/ImportMenu/Steps" instance=ExtResource( 5 )] +margin_top = 496.0 +margin_right = 300.0 +margin_bottom = 536.0 + +[node name="HSeparator" type="HSeparator" parent="Body/ImportMenu/Steps"] +margin_top = 548.0 +margin_right = 300.0 +margin_bottom = 552.0 + +[node name="GenerateButton" type="Button" parent="Body/ImportMenu/Steps"] +margin_top = 564.0 +margin_right = 300.0 +margin_bottom = 586.0 +hint_tooltip = "Generate the animations in the selected AnimationPlayer node" +size_flags_horizontal = 3 +text = "Generate Animations" +icon = SubResource( 2 ) + +[node name="SpritesheetInspector" parent="Body" instance=ExtResource( 6 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 312.0 +margin_right = 1010.0 +margin_bottom = 586.0 + +[node name="AlertDialog" type="AcceptDialog" parent="."] +margin_right = 83.0 +margin_bottom = 58.0 +popup_exclusive = true diff --git a/addons/aseprite_importer/interface/icons/dark_icon.png b/addons/aseprite_importer/interface/icons/dark_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dddc808c616fe26fb6dada7fd480696702b47d53 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~l>na*S9ON} zBK%VJb`Gw+2aIBS{{R2~Vd`0TcXw@V?FSDYOq@6|bIuEO<3lAt^*kj(e!&bt6)?bg zBtQ))9^&cZ7$Pw>x8IZRfB^^dW9Cgi|F@r3+q!Z_bF-|&qd5!*JeVhGSbjdc(7Liw zRp6}7>zWW_wN!=3wXsdvt}O2YdwtrM>)v$#QdRn4;ktw8uU9(HU@u@~Io`~p%n3A~ N!PC{xWt~$(69CFQReAsb literal 0 HcmV?d00001 diff --git a/addons/aseprite_importer/interface/icons/dark_icon.png.import b/addons/aseprite_importer/interface/icons/dark_icon.png.import new file mode 100644 index 0000000..abd464a --- /dev/null +++ b/addons/aseprite_importer/interface/icons/dark_icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/dark_icon.png-bd7f807ed17ce703bf3818e1cafe2892.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/aseprite_importer/interface/icons/dark_icon.png" +dest_files=[ "res://.import/dark_icon.png-bd7f807ed17ce703bf3818e1cafe2892.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/addons/aseprite_importer/interface/icons/light_icon.png b/addons/aseprite_importer/interface/icons/light_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8502f1956c28ee5c9809a5dd0ed3e5f07fb73091 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~l>na*S9ON} zBK%VJb`Gw+2aIBS{{R2~Vd`0TcXw@V?FSDYOq@6|bIuEO<3lAt^*kj(e!&bt6)?bg zBtQ))9_;Dj7$Pw>x8IwOL6O5*le4?%KXbo`nz7XVMYm3=&(dY+F;U>`JZs#(?g^Wo zqmk09IQLcRceD%md-t;3?kInIB19v5=e8%$H#f`w;^kX!d)SD7YbdL|D(@L3pz#cz Lu6{1-oD!M void: + if new_filepath: + import_button.text = new_filepath + clear_button.show() + else: + import_button.text = IMPORT_BUTTON_DEFAULT_TEXT + clear_button.hide() + + +func _update_theme(editor_theme : EditorTheme) -> void: + import_button.icon = editor_theme.get_icon("Load") + clear_button.icon = editor_theme.get_icon("Clear") + + +#Signal Callbacks +func _on_ImportButton_pressed() -> void: + file_dialog.popup_centered_ratio(0.5) + + +func _on_ClearButton_pressed() -> void: + set_json_filepath("") + emit_signal("data_cleared") + + +func _on_FileDialog_file_selected(path : String) -> void: + var import_data := AsepriteImportData.new() + var error := import_data.load(path) + + if error != OK: + var error_msg : String + + match error: + AsepriteImportData.Error.JSON_PARSE_ERROR: + error_msg = "Error parsing the file" + AsepriteImportData.Error.INVALID_JSON_DATA: + error_msg = "Invalid Aseprite JSON file" + var code: + error_msg = "An error occurred!\nerror code: %d" % code + + set_json_filepath("") + + yield(get_tree(), "idle_frame") + alert_dialog.dialog_text = error_msg + alert_dialog.popup_centered() + else: + set_json_filepath(path) + + emit_signal("data_imported", import_data) diff --git a/addons/aseprite_importer/interface/import_menu/JSONImportMenu.tscn b/addons/aseprite_importer/interface/import_menu/JSONImportMenu.tscn new file mode 100644 index 0000000..638092e --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/JSONImportMenu.tscn @@ -0,0 +1,78 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/JSONImportMenu.gd" type="Script" id=1] + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 179, 223, 223, 223, 179, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 0, 220, 220, 220, 59, 223, 223, 223, 201, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 200, 220, 220, 220, 59, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 222, 222, 222, 199, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 222, 222, 222, 198, 222, 222, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 203, 223, 223, 223, 203, 223, 223, 223, 152, 223, 223, 223, 152, 222, 222, 222, 101, 222, 222, 222, 101, 219, 219, 219, 50, 219, 219, 219, 50, 221, 221, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 222, 222, 222, 0, 222, 222, 222, 0, 219, 219, 219, 0, 219, 219, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 0 +flags = 0 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[node name="JSONImport" type="VBoxContainer"] +margin_right = 91.0 +margin_bottom = 38.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_right = 91.0 +margin_bottom = 14.0 +text = "JSON Data" +valign = 1 + +[node name="InputContainer" type="HBoxContainer" parent="."] +margin_top = 18.0 +margin_right = 91.0 +margin_bottom = 38.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ImportButton" type="Button" parent="InputContainer"] +margin_right = 91.0 +margin_bottom = 20.0 +hint_tooltip = "Import a Aseprite JSON file" +size_flags_horizontal = 3 +text = "Import JSON" + +[node name="ClearButton" type="Button" parent="InputContainer"] +visible = false +margin_left = 143.0 +margin_top = -18.0 +margin_right = 187.0 +margin_bottom = 2.0 +text = "Clear" +icon = SubResource( 2 ) + +[node name="FileDialog" type="FileDialog" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_bottom = 110.0 +window_title = "Select the JSON file" +resizable = true +mode_overrides_title = false +mode = 0 +filters = PoolStringArray( "*.json ; JSON Files" ) +show_hidden_files = true + +[node name="AlertDialog" type="AcceptDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_top = 42.0 +margin_right = 400.0 +margin_bottom = 100.0 +popup_exclusive = true diff --git a/addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.gd b/addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.gd new file mode 100644 index 0000000..cfdfc33 --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.gd @@ -0,0 +1,64 @@ +tool +extends Container + + +onready var select_button : Button = $Button +onready var select_node_dialog : WindowDialog = $SelectNodeDialog + + +const SELECT_BUTTON_DEFAULT_TEXT := "Select a Node" + + +var animation_player : AnimationPlayer setget set_animation_player + + +signal node_selected(animation_player) + + +func _ready(): + select_node_dialog.class_filters = ["AnimationPlayer"] + + select_button.connect("pressed", self, "_on_SelectButton_pressed") + select_node_dialog.connect("node_selected", self, "_on_SelectNodeDialog_node_selected") + + +func get_state() -> Dictionary: + var state := {} + + if animation_player: + state.animation_player = animation_player + + return state + + +func set_state(new_state : Dictionary) -> void: + var new_animation_player : Node = new_state.get("animation_player") + + if new_animation_player != null : + self.animation_player = new_animation_player + else: + animation_player = null + select_button.text = SELECT_BUTTON_DEFAULT_TEXT + + +func _update_theme(editor_theme : EditorTheme) -> void: + select_button.icon = editor_theme.get_icon("AnimationPlayer") + + +# Setters and Getters +func set_animation_player(node : AnimationPlayer) -> void: + animation_player = node + + var node_path := node.owner.get_parent().get_path_to(node) + select_button.text = node_path + + +# Signal Callbacks +func _on_SelectButton_pressed() -> void: + if select_node_dialog.initialize(): + select_node_dialog.popup_centered_ratio(.5) + + +func _on_SelectNodeDialog_node_selected(selected_node : Node) -> void: + self.animation_player = selected_node + emit_signal("node_selected", selected_node) diff --git a/addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.tscn b/addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.tscn new file mode 100644 index 0000000..b8b67b2 --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.tscn @@ -0,0 +1,53 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/SelectNodeDialog.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/SelectAnimationPlayerMenu.gd" type="Script" id=2] + +[sub_resource type="Image" id=1] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 206, 164, 241, 0, 204, 159, 235, 0, 0, 0, 0, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 164, 241, 0, 0, 0, 0, 0, 206, 164, 241, 0, 206, 164, 241, 255, 204, 159, 235, 40, 205, 161, 238, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 204, 159, 235, 40, 205, 162, 239, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 204, 159, 235, 40, 205, 162, 239, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 204, 159, 235, 40, 205, 162, 239, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 204, 159, 235, 40, 205, 162, 239, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 204, 159, 235, 40, 205, 162, 239, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 204, 159, 235, 40, 205, 162, 239, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 204, 159, 235, 40, 205, 161, 238, 0, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 255, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 255, 206, 164, 241, 0, 0, 0, 0, 0, 206, 164, 241, 0, 204, 159, 235, 0, 0, 0, 0, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 206, 164, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 164, 241, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 0 +flags = 0 +image = SubResource( 1 ) +size = Vector2( 16, 16 ) + +[node name="SelectAnimationPlayer" type="VBoxContainer"] +margin_right = 148.0 +margin_bottom = 38.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_right = 148.0 +margin_bottom = 14.0 +text = "Select AnimationPlayer" + +[node name="Button" type="Button" parent="."] +margin_top = 18.0 +margin_right = 148.0 +margin_bottom = 40.0 +hint_tooltip = "Select a AnimationPlayer node from the current scene" +text = "Select Node" +icon = SubResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SelectNodeDialog" parent="." instance=ExtResource( 1 )] +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 42.0 +margin_right = 245.0 +margin_bottom = 43.0 +window_title = "Select the AnimationPlayer Node" diff --git a/addons/aseprite_importer/interface/import_menu/SelectNodeDialog.gd b/addons/aseprite_importer/interface/import_menu/SelectNodeDialog.gd new file mode 100644 index 0000000..9ddd97f --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/SelectNodeDialog.gd @@ -0,0 +1,144 @@ +tool +extends WindowDialog + + +onready var body : VBoxContainer = $MarginContainer/Body + +onready var edited_scene_view : Container = body.get_node('EditedSceneView') +onready var scene_tree : Tree = edited_scene_view.get_node('SceneTree') + +onready var footer : HBoxContainer = body.get_node('Footer') +onready var confirm_button : Button = footer.get_node('ConfirmButton') +onready var cancel_button : Button = footer.get_node('CancelButton') + +onready var alert_dialog : AcceptDialog = $AlertDialog + + +enum Columns { + NAME, + PATH, +} + + +const MSG_EMPTY_SCENE = 'The current scene is empty!' +const MSG_UNSAVED_SCENE = 'The current scene is still not saved!' +const MSG_NO_FILTERED_NODES_IN_SCENE = "There aren't any %s nodes in the current scene" + +const WINDOW_TITLE_DEFAULT = 'Select a Node' +const WINDOW_TITLE_WITH_FILTER = "Select the %s Node" + +const DISABLED_ICON_MODULATE := Color(1, 1, 1, .5) + + +var class_filters : Array setget set_class_filters +var edited_scene_root : Node + + +var _editor_theme : EditorTheme + + +signal node_selected(selected_node) + + +func _ready(): + self.class_filters = class_filters + + scene_tree.columns = Columns.size() + scene_tree.set_column_expand(Columns.PATH, false) + + alert_dialog.set_as_toplevel(true) + + scene_tree.connect('item_activated', self, '_on_node_selected') + confirm_button.connect('pressed', self, '_on_node_selected') + cancel_button.connect('pressed', self, 'hide') + + +func initialize() -> bool: + edited_scene_root = get_tree().get_edited_scene_root() + if edited_scene_root == null: + _show_alert(MSG_EMPTY_SCENE) + return false + + var scene_filename := edited_scene_root.filename + if not scene_filename: + _show_alert(MSG_UNSAVED_SCENE) + return false + + scene_tree.clear() + + var filtered_node_count := _add_node_to_scene_tree(edited_scene_root) + + if class_filters and filtered_node_count == 0: + var filters_str := PoolStringArray(class_filters).join(" / ") + _show_alert(MSG_NO_FILTERED_NODES_IN_SCENE % filters_str) + return false + + return true + + +func _add_node_to_scene_tree(node : Node, parent : TreeItem = null) -> int: + var tree_item := scene_tree.create_item(parent) + + var node_class := node.get_class() + + tree_item.set_icon(Columns.NAME, _editor_theme.get_icon(node_class)) + tree_item.set_text(Columns.NAME, node.name) + + tree_item.set_text(Columns.PATH, edited_scene_root.get_path_to(node)) + + var disabled_font_color := _editor_theme.get_color("disabled_font_color") + + var filtered_node_count := 0 + if class_filters: + var is_valid := false + + for filter in class_filters: + if node.is_class(filter): + is_valid = true + filtered_node_count += 1 + break + + if not is_valid: + tree_item.set_selectable(Columns.NAME, false) + tree_item.set_icon_modulate(Columns.NAME, DISABLED_ICON_MODULATE) + tree_item.set_custom_color(Columns.NAME, disabled_font_color) + + + for child in node.get_children(): + if child.owner == edited_scene_root: + filtered_node_count += _add_node_to_scene_tree(child, tree_item) + + return filtered_node_count + + +func _show_alert(message : String) -> void: + alert_dialog.dialog_text = message + alert_dialog.popup_centered() + + +func _update_theme(editor_theme : EditorTheme) -> void: + _editor_theme = editor_theme + + +# Setters and Getters +func set_class_filters(filters : Array) -> void: + class_filters = filters + + if class_filters != []: + var filters_str := PoolStringArray(class_filters).join(" / ") + window_title = WINDOW_TITLE_WITH_FILTER % filters_str + else: + window_title = WINDOW_TITLE_DEFAULT + + +# Signal Callbacks +func _on_node_selected() -> void: + var selected_item := scene_tree.get_selected() + + if selected_item: + var node_path := selected_item.get_text(Columns.PATH) + var selected_node := edited_scene_root.get_node(node_path) + + emit_signal('node_selected', selected_node) + + hide() diff --git a/addons/aseprite_importer/interface/import_menu/SelectNodeDialog.tscn b/addons/aseprite_importer/interface/import_menu/SelectNodeDialog.tscn new file mode 100644 index 0000000..be818a3 --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/SelectNodeDialog.tscn @@ -0,0 +1,98 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/SelectNodeDialog.gd" type="Script" id=1] + +[node name="SelectNodeDialog" type="WindowDialog"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -150.0 +margin_top = -100.0 +margin_right = 150.0 +margin_bottom = 100.0 +rect_min_size = Vector2( 300, 200 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +window_title = "Select a Node" +resizable = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_constants/margin_right = 8 +custom_constants/margin_top = 8 +custom_constants/margin_left = 8 +custom_constants/margin_bottom = 8 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Body" type="VBoxContainer" parent="MarginContainer"] +margin_left = 8.0 +margin_top = 8.0 +margin_right = 292.0 +margin_bottom = 192.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="EditedSceneView" type="VBoxContainer" parent="MarginContainer/Body"] +margin_right = 284.0 +margin_bottom = 160.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="MarginContainer/Body/EditedSceneView"] +margin_right = 284.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 +text = "Current Edited Scene:" + +[node name="SceneTree" type="Tree" parent="MarginContainer/Body/EditedSceneView"] +margin_top = 18.0 +margin_right = 284.0 +margin_bottom = 160.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Footer" type="HBoxContainer" parent="MarginContainer/Body"] +margin_top = 164.0 +margin_right = 284.0 +margin_bottom = 184.0 +size_flags_horizontal = 3 + +[node name="ConfirmButton" type="Button" parent="MarginContainer/Body/Footer"] +margin_left = 25.0 +margin_right = 114.0 +margin_bottom = 20.0 +size_flags_horizontal = 6 +text = "Select Node" + +[node name="CancelButton" type="Button" parent="MarginContainer/Body/Footer"] +margin_left = 187.0 +margin_right = 241.0 +margin_bottom = 20.0 +size_flags_horizontal = 6 +text = "Cancel" + +[node name="AlertDialog" type="AcceptDialog" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -41.5 +margin_top = -29.0 +margin_right = 41.5 +margin_bottom = 29.0 +popup_exclusive = true diff --git a/addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.gd b/addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.gd new file mode 100644 index 0000000..1845071 --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.gd @@ -0,0 +1,81 @@ +tool +extends Container + + +onready var select_button : Button = $Button +onready var select_node_dialog : WindowDialog = $SelectNodeDialog + + +const SELECT_BUTTON_DEFAULT_TEXT := "Select a Node" + + +var sprite : Node setget set_sprite + +var _sprite_icon : Texture +var _sprite3d_icon : Texture + + +signal node_selected(sprite) + + +func _ready(): + select_node_dialog.class_filters = ["Sprite", "Sprite3D"] + + select_button.connect("pressed", self, "_on_SelectButton_pressed") + select_node_dialog.connect("node_selected", self, "_on_SelectNodeDialog_node_selected") + + +func get_state() -> Dictionary: + var state := {} + + if sprite: + state.sprite = sprite + + return state + + +func set_state(new_state : Dictionary) -> void: + var new_sprite : Node = new_state.get("sprite") + + if new_sprite != null: + self.sprite = new_sprite + else: + sprite = null + select_button.text = SELECT_BUTTON_DEFAULT_TEXT + select_button.icon = _sprite_icon + + +func _update_theme(editor_theme : EditorTheme) -> void: + var is_sprite3d := select_button.icon == _sprite3d_icon + + _sprite_icon = editor_theme.get_icon("Sprite") + _sprite3d_icon = editor_theme.get_icon("Sprite3D") + + if is_sprite3d: + select_button.icon = _sprite3d_icon + else: + select_button.icon = _sprite_icon + + +# Setters and Getters +func set_sprite(node : Node) -> void: + sprite = node + + var node_path := node.owner.get_parent().get_path_to(node) + select_button.text = node_path + + if node.is_class("Sprite"): + select_button.icon = _sprite_icon + elif node.is_class("Sprite3D"): + select_button.icon = _sprite3d_icon + + +# Signal Callbacks +func _on_SelectButton_pressed() -> void: + if select_node_dialog.initialize(): + select_node_dialog.popup_centered_ratio(.5) + + +func _on_SelectNodeDialog_node_selected(selected_node : Node) -> void: + self.sprite = selected_node + emit_signal("node_selected", selected_node) diff --git a/addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.tscn b/addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.tscn new file mode 100644 index 0000000..40332c6 --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/SelectNodeDialog.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/SelectSpriteMenu.gd" type="Script" id=2] + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 163, 182, 236, 0, 164, 182, 242, 0, 164, 182, 242, 0, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 0, 164, 182, 242, 0, 164, 182, 242, 0, 160, 179, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 161, 180, 236, 0, 163, 182, 236, 28, 164, 182, 242, 169, 164, 182, 242, 229, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 242, 229, 164, 182, 242, 169, 160, 179, 236, 27, 160, 179, 236, 0, 0, 0, 0, 0, 160, 179, 236, 0, 160, 179, 236, 27, 164, 182, 242, 236, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 242, 236, 160, 179, 236, 27, 160, 179, 236, 0, 164, 181, 242, 0, 164, 181, 242, 164, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 164, 181, 242, 163, 164, 181, 242, 0, 164, 182, 242, 0, 164, 182, 242, 225, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 242, 225, 164, 182, 242, 0, 165, 183, 243, 0, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 255, 165, 183, 243, 255, 163, 182, 240, 70, 163, 182, 240, 70, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 163, 182, 240, 70, 163, 182, 240, 70, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 241, 0, 164, 182, 241, 0, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 241, 0, 164, 182, 241, 0, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 241, 0, 164, 182, 241, 0, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 241, 0, 164, 182, 241, 0, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 255, 165, 183, 243, 255, 163, 182, 240, 70, 163, 182, 240, 70, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 163, 182, 240, 70, 163, 182, 240, 70, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 0, 164, 182, 242, 0, 164, 182, 242, 226, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 242, 252, 163, 182, 241, 95, 163, 182, 241, 95, 164, 182, 242, 201, 164, 182, 242, 201, 163, 182, 241, 95, 163, 182, 241, 95, 164, 182, 242, 251, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 242, 225, 164, 182, 242, 0, 164, 181, 242, 0, 164, 181, 242, 164, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 163, 182, 236, 28, 163, 182, 239, 0, 163, 177, 238, 0, 163, 177, 238, 0, 163, 181, 240, 0, 161, 178, 238, 30, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 164, 181, 242, 164, 164, 181, 242, 0, 160, 179, 236, 0, 160, 179, 236, 27, 164, 182, 242, 237, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 242, 226, 163, 182, 242, 84, 163, 173, 234, 25, 163, 173, 234, 25, 165, 183, 243, 85, 164, 182, 242, 226, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 242, 237, 160, 179, 236, 27, 160, 179, 236, 0, 0, 0, 0, 0, 161, 180, 236, 0, 163, 182, 236, 28, 164, 182, 242, 169, 164, 182, 242, 229, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 165, 183, 243, 255, 164, 182, 242, 229, 164, 182, 242, 169, 160, 179, 236, 27, 160, 179, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 182, 236, 0, 164, 182, 242, 0, 164, 182, 242, 0, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 0, 165, 183, 243, 0, 164, 182, 242, 0, 164, 182, 242, 0, 160, 179, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 0 +flags = 0 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[node name="SelectSprite" type="VBoxContainer"] +margin_right = 89.0 +margin_bottom = 38.0 +size_flags_horizontal = 3 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_right = 107.0 +margin_bottom = 14.0 +text = "Select Sprite" + +[node name="Button" type="Button" parent="."] +margin_top = 18.0 +margin_right = 107.0 +margin_bottom = 40.0 +hint_tooltip = "Select a Sprite node from the current scene" +text = "Select Node" +icon = SubResource( 2 ) + +[node name="SelectNodeDialog" parent="." instance=ExtResource( 1 )] diff --git a/addons/aseprite_importer/interface/import_menu/TagsMenu.gd b/addons/aseprite_importer/interface/import_menu/TagsMenu.gd new file mode 100644 index 0000000..866b009 --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/TagsMenu.gd @@ -0,0 +1,202 @@ +tool +extends Container + + +onready var select_all_button : CheckBox = find_node("SelectAllButton") +onready var options_list : VBoxContainer = find_node("OptionsList") +onready var tree : Tree = $Tree + + +enum Columns { + SELECTED, + NAME, + START, + END, + DIRECTION, +} + + +var _tree_root : TreeItem +var _options := [] +var _toggling_option := false + + +signal frame_selected(idx) +signal selected_tags_changed(selected_tags) +signal tag_selected(tag_name) + + +func _ready(): + clear_options() + + tree.columns = Columns.size() + + tree.set_column_expand(Columns.SELECTED, false) + tree.set_column_min_width(Columns.SELECTED, 32) + + tree.set_column_title(Columns.NAME, "Name") + tree.set_column_expand(Columns.NAME, true) + tree.set_column_min_width(Columns.START, 48) + + tree.set_column_title(Columns.START, "Start") + tree.set_column_expand(Columns.START, false) + tree.set_column_min_width(Columns.START, 48) + + tree.set_column_title(Columns.END, "End") + tree.set_column_expand(Columns.END, false) + tree.set_column_min_width(Columns.END, 48) + + tree.set_column_title(Columns.DIRECTION, "Direction") + tree.set_column_expand(Columns.DIRECTION, false) + tree.set_column_min_width(Columns.DIRECTION, 84) + + tree.set_column_titles_visible(true) + + select_all_button.connect("toggled", self, "_on_SelectAllButton_toggled") + tree.connect("cell_selected", self, "_on_Tree_cell_selected") + tree.connect("item_edited", self, "_on_Tree_item_edited") + + +func clear_options() -> void: + select_all_button.hide() + + for option in _options: + option.free() + _options.clear() + + tree.clear() + + _tree_root = tree.create_item() + + +func load_tags(tags : Array) -> void: + clear_options() + + if tags == []: + return + + for tag in tags: + var new_tree_item := tree.create_item(_tree_root) + + new_tree_item.set_cell_mode(Columns.SELECTED, TreeItem.CELL_MODE_CHECK) + new_tree_item.set_editable(Columns.SELECTED, true) + new_tree_item.set_checked(Columns.SELECTED, true) + new_tree_item.set_selectable(Columns.SELECTED, false) + + new_tree_item.set_text(Columns.NAME, tag.name) + + new_tree_item.set_text(Columns.START, str(floor(tag.from))) + new_tree_item.set_text_align(Columns.START, TreeItem.ALIGN_CENTER) + + new_tree_item.set_text(Columns.END, str(floor(tag.to))) + new_tree_item.set_text_align(Columns.END, TreeItem.ALIGN_CENTER) + + new_tree_item.set_text(Columns.DIRECTION, " %s" % tag.direction) + new_tree_item.set_selectable(Columns.DIRECTION, false) + + _options.append(new_tree_item) + + select_all_button.pressed = true + select_all_button.show() + + +func get_selected_tags() -> Array: + var selected_tags := [] + + for i in range(_options.size()): + var item : TreeItem = _options[i] + if item.is_checked(Columns.SELECTED): + selected_tags.append(i) + + return selected_tags + + +func get_state() -> Dictionary: + var state := { + selected_tags = get_selected_tags() + } + + var selected_item := tree.get_selected() + if selected_item != null: + var selected_column := tree.get_selected_column() + + var item_idx := _options.find(selected_item) + + state.selected_cell = Vector2(selected_column, item_idx) + + return state + + +func set_state(new_state : Dictionary) -> void: + if new_state.has("selected_tags") and _options != []: + select_all_button.pressed = false + + for tag in new_state.selected_tags: + _options[tag].set_checked(Columns.SELECTED, true) + + if new_state.has("selected_cell"): + var selected_cell : Vector2 = new_state.selected_cell + var tree_item : TreeItem = _options[selected_cell.y] + var column : int = selected_cell.x + + tree_item.select(column) + + match column: + Columns.NAME: + emit_signal("tag_selected", selected_cell.y) + Columns.START, Columns.END: + emit_signal("frame_selected", int(tree_item.get_text(column))) + + + for option in _options: + if not option.is_checked(Columns.SELECTED): + return + + _toggling_option = true + select_all_button.pressed = true + _toggling_option = false + + +# Signal Callbacks +func _on_SelectAllButton_toggled(button_pressed : bool) -> void: + if _toggling_option: + return + + for option in _options: + option.set_checked(Columns.SELECTED, button_pressed) + + emit_signal("selected_tags_changed", get_selected_tags()) + + +func _on_Tree_cell_selected() -> void: + var selected_column := tree.get_selected_column() + var selected_item := tree.get_selected() + + match selected_column: + Columns.NAME: + emit_signal("tag_selected", _options.find(selected_item)) + Columns.START, Columns.END: + emit_signal("frame_selected", int(selected_item.get_text(selected_column))) + + +func _on_Tree_item_edited() -> void: + _toggling_option = true + + if select_all_button.pressed: + for option in _options: + if option.is_checked(Columns.SELECTED): + select_all_button.pressed = false + break + else: + var is_all_selected := true + for option in _options: + if not option.is_checked(Columns.SELECTED): + is_all_selected = false + break + + if is_all_selected: + select_all_button.pressed = true + + _toggling_option = false + + emit_signal("selected_tags_changed", get_selected_tags()) diff --git a/addons/aseprite_importer/interface/import_menu/TagsMenu.tscn b/addons/aseprite_importer/interface/import_menu/TagsMenu.tscn new file mode 100644 index 0000000..499ea33 --- /dev/null +++ b/addons/aseprite_importer/interface/import_menu/TagsMenu.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/import_menu/TagsMenu.gd" type="Script" id=1] + + + +[node name="TagSelectMenu" type="VBoxContainer"] +rect_min_size = Vector2( 0, 120 ) +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Header" type="HBoxContainer" parent="."] +margin_right = 28.0 +margin_bottom = 14.0 + +[node name="Label" type="Label" parent="Header"] +margin_right = 28.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 +text = "Tags" +valign = 1 + +[node name="SelectAllButton" type="CheckBox" parent="Header"] +visible = false +margin_left = 32.0 +margin_right = 120.0 +margin_bottom = 24.0 +size_flags_horizontal = 8 +text = "Select All" + +[node name="Tree" type="Tree" parent="."] +margin_top = 18.0 +margin_right = 28.0 +margin_bottom = 120.0 +size_flags_vertical = 3 +columns = 5 +hide_folding = true +hide_root = true diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.gd b/addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.gd new file mode 100644 index 0000000..c1415ae --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.gd @@ -0,0 +1,95 @@ +tool +extends Container + + +onready var label : Label = $Header/Label +onready var visibility_button: Button = $Header/VisibilityButton +onready var color_picker : ColorPickerButton = $ColorPicker + + +export var label_text := '' setget set_label_text +export var visibility := true setget set_visibility +export var show_visibility_button := true setget set_show_visibility_button +export var color_value := Color.black setget set_color_value +export var color_edit_alpha := true setget set_color_edit_alpha +export(String, MULTILINE) var color_picker_tooltip := "" setget set_color_picker_tooltip + + +var _visible_icon : Texture +var _hidden_icon : Texture + + +signal property_changed(color_menu_item) + + +func _ready(): + self.label_text = label_text + self.visibility = visibility + self.show_visibility_button = show_visibility_button + self.color_value = color_value + self.color_edit_alpha = color_edit_alpha + self.color_picker_tooltip = color_picker_tooltip + + visibility_button.connect('pressed', self, '_on_ViewButton_pressed') + color_picker.connect('color_changed', self, '_on_ColorPicker_color_changed') + + +func _update_theme(editor_theme : EditorTheme) -> void: + _visible_icon = editor_theme.get_icon('GuiVisibilityVisible') + _hidden_icon = editor_theme.get_icon('GuiVisibilityHidden') + + self.visibility = visibility + + +# Setters and Getters +func set_color_picker_tooltip(text : String) -> void: + color_picker_tooltip = text + if color_picker: + color_picker.hint_tooltip = text + + +func set_color_value(color: Color) -> void: + color_value = color + if color_picker: + color_picker.color = color_value + + +func set_color_edit_alpha(value : bool) -> void: + color_edit_alpha = value + if color_picker: + color_picker.edit_alpha = color_edit_alpha + + +func set_label_text(text : String) -> void: + label_text = text + if label: + label.text = label_text + + +func set_show_visibility_button(show_button : bool) -> void: + show_visibility_button = show_button + if visibility_button: + visibility_button.visible = show_visibility_button + + +func set_visibility(value : bool) -> void: + visibility = value + + if visibility_button: + if visibility: + visibility_button.icon = _visible_icon + visibility_button.modulate.a = 1 + else: + visibility_button.icon = _hidden_icon + visibility_button.modulate.a = .5 + + +# Signal Callbacks +func _on_ColorPicker_color_changed(color : Color) -> void: + color_value = color + emit_signal('property_changed', self) + + +func _on_ViewButton_pressed() -> void: + self.visibility = !visibility + emit_signal('property_changed', self) diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.tscn b/addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.tscn new file mode 100644 index 0000000..65a46a7 --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.gd" type="Script" id=1] + +[node name="ColorMenuItem" type="VBoxContainer"] +margin_right = 103.0 +margin_bottom = 46.0 +size_flags_horizontal = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Header" type="HBoxContainer" parent="."] +margin_right = 116.0 +margin_bottom = 22.0 +rect_min_size = Vector2( 0, 22 ) + +[node name="Label" type="Label" parent="Header"] +margin_top = 4.0 +margin_right = 100.0 +margin_bottom = 18.0 +size_flags_horizontal = 3 +text = "ColorMenuItem" + +[node name="VisibilityButton" type="ToolButton" parent="Header"] +margin_left = 104.0 +margin_right = 116.0 +margin_bottom = 22.0 +hint_tooltip = "Toggle Visibility" +size_flags_horizontal = 8 +shortcut_in_tooltip = false + +[node name="ColorPicker" type="ColorPickerButton" parent="."] +margin_top = 26.0 +margin_right = 116.0 +margin_bottom = 46.0 diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/SettingsMenu.gd b/addons/aseprite_importer/interface/spritesheet_inspector/SettingsMenu.gd new file mode 100644 index 0000000..1d1fd3a --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/SettingsMenu.gd @@ -0,0 +1,74 @@ +tool +extends Container + + +onready var options : Container = $Options + + +const PROP_TO_COLOR_MENU := { + frame_border = "FrameBorder", + selection_border = "SelectionBorder", + texture_background = "TextureBackground", + inspector_background = "InspectorBackground", +} + +const DEFAULT_SETTINGS :={ + frame_border = { + color = Color("#808080"), + visibility = true, + }, + selection_border = { + color = Color.yellow, + visibility = true, + }, + texture_background = { + color = Color("#404040"), + visibility = true, + }, + inspector_background = { + color = Color.black, + }, +} + + +var settings := DEFAULT_SETTINGS.duplicate(true) setget set_settings + + +signal settings_changed(settings) + + +func _ready(): + for property in PROP_TO_COLOR_MENU: + var node_name : String = PROP_TO_COLOR_MENU[property] + var color_menu = options.get_node(node_name) + + color_menu.set_meta("property", property) + + color_menu.connect("property_changed", self, "_on_ColorMenuItem_property_changed") + + +# Setters and Getters +func set_settings(new_settings : Dictionary) -> void: + if new_settings: + settings = new_settings + else: + settings = DEFAULT_SETTINGS.duplicate(true) + + for property in PROP_TO_COLOR_MENU: + var node_name : String = PROP_TO_COLOR_MENU[property] + var color_menu = options.get_node(node_name) + + color_menu.color_value = settings[property].color + color_menu.visibility = settings[property].get("visibility", false) + + emit_signal("settings_changed", settings) + + +# Signal Callbacks +func _on_ColorMenuItem_property_changed(color_menu_item : Node) -> void: + var property : String = color_menu_item.get_meta("property") + + settings[property]["color"] = color_menu_item.color_value + settings[property]["visibility"] = color_menu_item.visibility + + emit_signal("settings_changed", settings) diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.gd b/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.gd new file mode 100644 index 0000000..a51a1eb --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.gd @@ -0,0 +1,246 @@ +tool +extends Container + + +onready var header : HBoxContainer= $Header +onready var filename_label : Label = header.find_node("Filename") +onready var settings_button : Button = header.find_node("SettingsButton") + +onready var body : Container = $Body +onready var warning_message : Label = body.find_node("WarningMessage") +onready var search_file_button : Button = body.find_node("SearchFileButton") + +onready var spritesheet_view : Container = body.find_node("SpritesheetView") + +onready var settings_menu : Container = body.get_node("SettingsMenu") + +onready var footer : HBoxContainer = $Footer +onready var frame_count : Label = footer.get_node("FrameCount") +onready var zoom_button : Button = footer.get_node("ZoomButton") +onready var zoom_slider : HSlider = footer.get_node("ZoomSlider") + +onready var file_dialog : FileDialog = $FileDialog + + +const MSG_MISSING_IMAGE_PARAMETER = "The imported JSON doesn't contain the spritesheet file name" +const MSG_IMPORT_JSON = "Import a Aseprite JSON file to \npreview the spritesheet" +const MSG_INVALID_TEXTURE_SIZE = "The selected texture size %s doesn't match the JSON %s" +const MSG_LOAD_ERROR = "Error on loading the file!" +const MSG_SPRITESHEET_NOT_FOUND = "Spritesheet \"%s\" not found!" + + +var texture_size : Vector2 setget set_texture_size +var frames := [] + +var _zoom_update := false + + +func _ready() -> void: + clear_texture() + + settings_button.pressed = false + warning_message.text = MSG_IMPORT_JSON + search_file_button.hide() + spritesheet_view.hide() + settings_menu.hide() + + var settings = settings_menu.settings + spritesheet_view.load_settings(settings) + + settings_button.connect("toggled", self, "_on_SettingsButton_toggled") + search_file_button.connect("pressed", self, "_on_SearchFileButton_pressed") + spritesheet_view.connect("zoom_changed", self, "_on_SpritesheetInspector_zoom_changed") + settings_menu.connect("settings_changed", self, "_on_SettingsMenu_settings_changed") + zoom_button.connect("pressed", self, "_on_ZoomButton_pressed") + zoom_slider.connect("value_changed", self, "_on_ZoomSlider_value_changed") + file_dialog.connect("file_selected", self, "_on_FileDialog_file_selected") + + +func clear_texture() -> void: + filename_label.text = "" + spritesheet_view.hide() + spritesheet_view.texture = null + + warning_message.text = MSG_IMPORT_JSON + search_file_button.hide() + + footer.hide() + + +func get_state() -> Dictionary: + var state := {} + + if spritesheet_view.texture: + state.texture = spritesheet_view.texture + state.zoom = spritesheet_view.zoom + state.offset = spritesheet_view.offset + + state.warning_msg = warning_message.text + state.search_file_button_visible =search_file_button.visible + state.settings = settings_menu.settings + + return state + + +func get_texture() -> Texture: + return spritesheet_view.texture + + +func load_texture(path : String) -> int: + if not path: + _show_find_file_prompt(MSG_MISSING_IMAGE_PARAMETER) + + return ERR_INVALID_DATA + + clear_texture() + + var split_path := path.rsplit("/", true, 1) + var dir_path := split_path[0] + var file_name := split_path[1] + + if file_name == "": + _show_find_file_prompt(MSG_MISSING_IMAGE_PARAMETER) + file_dialog.current_dir = dir_path + + return ERR_INVALID_DATA + + var file := File.new() + + if !file.file_exists(path): + _show_find_file_prompt(MSG_SPRITESHEET_NOT_FOUND % file_name) + file_dialog.current_dir = dir_path + + return ERR_FILE_NOT_FOUND + + var new_texture : Texture = load(path) + + if new_texture == null: + _show_find_file_prompt(MSG_LOAD_ERROR) + + return ERR_INVALID_DATA + + var new_texture_size := new_texture.get_size() + if new_texture_size != texture_size: + var message := MSG_INVALID_TEXTURE_SIZE % [new_texture.get_size(), texture_size] + _show_find_file_prompt(message) + + return ERR_INVALID_DATA + + spritesheet_view.texture = new_texture + spritesheet_view.frames = frames + spritesheet_view.selected_frames = [] + + filename_label.text = file_name + + _update_frames_count() + + spritesheet_view.show() + footer.show() + + return OK + + +func select_frames(selected_frames : Array) -> void: + spritesheet_view.selected_frames = selected_frames + + +func set_state(new_state : Dictionary) -> void: + if new_state.get("texture", false): + spritesheet_view.texture = new_state.texture + + spritesheet_view.zoom = new_state.zoom + spritesheet_view.offset = new_state.offset + + spritesheet_view.frames = frames + spritesheet_view.selected_frames = new_state.get("selected_frames", []) + + filename_label.text = new_state.texture.resource_path + + _update_frames_count() + + spritesheet_view.show() + footer.show() + else: + clear_texture() + + warning_message.text = new_state.get("warning_msg", MSG_IMPORT_JSON) + search_file_button.visible = new_state.get("search_file_button_visible", (warning_message.text != MSG_IMPORT_JSON)) + settings_menu.settings = new_state.get("settings", {}) + + +func _show_find_file_prompt(message : String) -> void: + clear_texture() + warning_message.text = message + search_file_button.show() + + +func _update_frames_count() -> void: + var frames_size := frames.size() + + if frames_size <= 0: + frame_count.text = "" + return + + frame_count.text = "%d frames" % frames_size + + var distinct_regions := [] + + for frame in frames: + var region : Dictionary = frame.frame + var rect := Rect2(region.x, region.y, region.w, region.h) + + if distinct_regions.find(rect) == -1: + distinct_regions.append(rect) + + var distinct_frames_size := distinct_regions.size() + + if frames_size > distinct_frames_size: + var merged_frames_count := frames_size - distinct_frames_size + + frame_count.text += " (%d merged)" % merged_frames_count + + +func _update_theme(editor_theme : EditorTheme) -> void: + settings_button.icon = editor_theme.get_icon("Tools") + search_file_button.icon = editor_theme.get_icon("Load") + zoom_button.icon = editor_theme.get_icon("Zoom") + + +# Setters and Getters +func set_texture_size(value : Vector2) -> void: + texture_size = value + + +# Signal Callbacks +func _on_FileDialog_file_selected(path) -> void: + load_texture(path) + + +func _on_SearchFileButton_pressed() -> void: + file_dialog.popup_centered_ratio(.5) + + +func _on_SettingsButton_toggled(button_pressed : bool) -> void: + settings_menu.visible = button_pressed + + +func _on_SettingsMenu_settings_changed(settings : Dictionary) -> void: + spritesheet_view.load_settings(settings) + + +func _on_SpritesheetInspector_zoom_changed(new_zoom : int) -> void: + _zoom_update = true + + zoom_button.text = "%d X" % new_zoom + zoom_slider.value = new_zoom + + _zoom_update = false + + +func _on_ZoomButton_pressed() -> void: + zoom_slider.value = 1 + + +func _on_ZoomSlider_value_changed(value : float) -> void: + if not _zoom_update: + spritesheet_view.zoom = round(value) diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.tscn b/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.tscn new file mode 100644 index 0000000..fd89a39 --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.tscn @@ -0,0 +1,255 @@ +[gd_scene load_steps=14 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/ColorMenuItem.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/SettingsMenu.gd" type="Script" id=3] +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetInspector.gd" type="Script" id=4] +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png" type="Texture" id=5] +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_normal.png" type="Texture" id=6] +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_pressed.png" type="Texture" id=7] + +[sub_resource type="Image" id=7] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 221, 221, 0, 224, 224, 224, 0, 221, 221, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 221, 221, 0, 221, 221, 221, 60, 224, 224, 224, 255, 221, 221, 221, 60, 221, 221, 221, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 112, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 112, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 189, 224, 224, 224, 255, 223, 223, 223, 189, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 122, 224, 224, 224, 255, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 255, 223, 223, 223, 122, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 222, 222, 222, 190, 224, 224, 224, 255, 222, 222, 222, 190, 222, 222, 222, 0, 223, 223, 223, 0, 223, 223, 223, 212, 224, 224, 224, 255, 223, 223, 223, 0, 223, 223, 223, 0, 224, 224, 224, 255, 223, 223, 223, 211, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 221, 221, 0, 221, 221, 221, 61, 224, 224, 224, 255, 221, 221, 221, 61, 221, 221, 221, 0, 223, 223, 223, 0, 223, 223, 223, 212, 224, 224, 224, 255, 222, 222, 222, 70, 222, 222, 222, 70, 224, 224, 224, 255, 223, 223, 223, 212, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 224, 224, 224, 255, 222, 222, 222, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 122, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 122, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 114, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 113, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 222, 222, 222, 247, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 247, 222, 222, 222, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 185, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 185, 223, 223, 223, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 221, 221, 0, 221, 221, 221, 30, 222, 222, 222, 181, 223, 223, 223, 254, 222, 222, 222, 181, 221, 221, 221, 30, 221, 221, 221, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 180, 223, 223, 223, 180, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 221, 221, 0, 222, 222, 222, 0, 223, 223, 223, 0, 222, 222, 222, 0, 221, 221, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 0 +flags = 0 +image = SubResource( 7 ) +size = Vector2( 16, 16 ) + +[sub_resource type="Image" id=8] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 221, 221, 0, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 0, 223, 223, 223, 0, 221, 221, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 221, 221, 0, 221, 221, 221, 60, 223, 223, 223, 201, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 201, 221, 221, 221, 60, 221, 221, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 222, 222, 222, 199, 222, 222, 222, 70, 223, 223, 223, 0, 223, 223, 223, 0, 222, 222, 222, 70, 222, 222, 222, 199, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 223, 223, 223, 180, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 180, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 0, 222, 222, 222, 0, 0, 0, 0, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 0, 0, 0, 0, 217, 217, 217, 0, 222, 222, 222, 173, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 173, 222, 222, 222, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 212, 212, 212, 0, 212, 212, 212, 18, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 232, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 221, 221, 221, 0, 221, 221, 221, 60, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 188, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 222, 222, 222, 0, 222, 222, 222, 103, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 147, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 223, 223, 223, 0, 223, 223, 223, 145, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 104, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 255, 224, 224, 224, 0, 223, 223, 223, 0, 223, 223, 223, 187, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 62, 222, 222, 222, 0, 224, 224, 224, 0, 224, 224, 224, 255, 223, 223, 223, 0, 222, 222, 222, 0, 223, 223, 223, 230, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 214, 214, 214, 19, 214, 214, 214, 0, 223, 223, 223, 0, 223, 223, 223, 200, 222, 222, 222, 70, 221, 221, 221, 75, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 193, 218, 218, 218, 0, 0, 0, 0, 0, 221, 221, 221, 0, 221, 221, 221, 60, 223, 223, 223, 202, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 198, 220, 220, 220, 51, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 221, 221, 0, 223, 223, 223, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 224, 224, 224, 0, 222, 222, 222, 0, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=4] +flags = 0 +flags = 0 +image = SubResource( 8 ) +size = Vector2( 16, 16 ) + +[sub_resource type="Image" id=9] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 221, 221, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 223, 223, 223, 57, 223, 223, 223, 177, 223, 223, 223, 228, 223, 223, 223, 234, 223, 223, 223, 185, 221, 221, 221, 61, 221, 221, 221, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 222, 222, 222, 118, 223, 223, 223, 253, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 222, 222, 222, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 223, 223, 223, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 56, 223, 223, 223, 251, 222, 222, 222, 247, 222, 222, 222, 116, 223, 223, 223, 24, 220, 220, 220, 22, 223, 223, 223, 115, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 222, 222, 222, 0, 222, 222, 222, 174, 223, 223, 223, 254, 222, 222, 222, 116, 222, 222, 222, 0, 223, 223, 223, 0, 220, 220, 220, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 224, 223, 223, 223, 254, 223, 223, 223, 24, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 223, 223, 223, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 229, 223, 223, 223, 254, 214, 214, 214, 19, 214, 214, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 24, 223, 223, 223, 254, 223, 223, 223, 0, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 179, 223, 223, 223, 254, 223, 223, 223, 115, 222, 222, 222, 0, 223, 223, 223, 0, 223, 223, 223, 0, 222, 222, 222, 0, 222, 222, 222, 116, 223, 223, 223, 254, 222, 222, 222, 0, 223, 223, 223, 0, 223, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 223, 223, 0, 223, 223, 223, 57, 223, 223, 223, 252, 223, 223, 223, 246, 222, 222, 222, 116, 223, 223, 223, 24, 223, 223, 223, 24, 222, 222, 222, 116, 223, 223, 223, 246, 223, 223, 223, 254, 222, 222, 222, 86, 218, 218, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 222, 0, 222, 222, 222, 118, 223, 223, 223, 253, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 254, 223, 223, 223, 209, 214, 214, 214, 19, 214, 214, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 0, 219, 219, 219, 58, 223, 223, 223, 177, 223, 223, 223, 228, 223, 223, 223, 237, 222, 222, 222, 183, 223, 223, 223, 80, 223, 223, 223, 209, 223, 223, 223, 254, 223, 223, 223, 208, 214, 214, 214, 19, 214, 214, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 219, 219, 0, 223, 223, 223, 0, 223, 223, 223, 0, 223, 223, 223, 0, 222, 222, 222, 0, 220, 220, 220, 0, 218, 218, 218, 21, 223, 223, 223, 209, 223, 223, 223, 254, 222, 222, 222, 207, 214, 214, 214, 19, 214, 214, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 218, 218, 0, 218, 218, 218, 21, 223, 223, 223, 210, 223, 223, 223, 254, 222, 222, 222, 206, 214, 214, 214, 19, 214, 214, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 218, 218, 0, 218, 218, 218, 21, 223, 223, 223, 211, 223, 223, 223, 228, 219, 219, 219, 36, 219, 219, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 218, 218, 0, 218, 218, 218, 21, 218, 218, 218, 35, 218, 218, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 218, 218, 0, 218, 218, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=6] +flags = 0 +flags = 0 +image = SubResource( 9 ) +size = Vector2( 16, 16 ) + +[node name="SpritesheetInspector" type="VBoxContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +script = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Header" type="HBoxContainer" parent="."] +margin_right = 1024.0 +margin_bottom = 24.0 + +[node name="Filename" type="Label" parent="Header"] +margin_top = 5.0 +margin_bottom = 19.0 + +[node name="Buttons" type="HBoxContainer" parent="Header"] +margin_left = 942.0 +margin_right = 1024.0 +margin_bottom = 24.0 +size_flags_horizontal = 10 + +[node name="SettingsButton" type="ToolButton" parent="Header/Buttons"] +margin_right = 82.0 +margin_bottom = 24.0 +hint_tooltip = "Spritesheet Inspector's settings" +toggle_mode = true +text = "Settings" +icon = SubResource( 2 ) + +[node name="Body" type="HBoxContainer" parent="."] +margin_top = 28.0 +margin_right = 1024.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="MainView" type="MarginContainer" parent="Body"] +margin_right = 1024.0 +margin_bottom = 572.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="WarningView" type="VBoxContainer" parent="Body/MainView"] +margin_left = 415.0 +margin_top = 230.0 +margin_right = 608.0 +margin_bottom = 341.0 +size_flags_horizontal = 6 +size_flags_vertical = 6 +custom_constants/separation = 16 + +[node name="GodotButton" type="TextureButton" parent="Body/MainView/WarningView"] +margin_left = 64.0 +margin_right = 128.0 +margin_bottom = 64.0 +rect_min_size = Vector2( 64, 64 ) +hint_tooltip = "Hello!" +focus_mode = 0 +mouse_default_cursor_shape = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +shortcut_in_tooltip = false +enabled_focus_mode = 0 +texture_normal = ExtResource( 6 ) +texture_pressed = ExtResource( 7 ) +texture_hover = ExtResource( 5 ) +expand = true + +[node name="WarningMessage" type="Label" parent="Body/MainView/WarningView"] +margin_top = 80.0 +margin_right = 193.0 +margin_bottom = 111.0 +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "Import a Aseprite JSON file to +preview the spritesheet" +align = 1 +valign = 1 + +[node name="SearchFileButton" type="Button" parent="Body/MainView/WarningView"] +visible = false +margin_left = 47.0 +margin_top = 127.0 +margin_right = 146.0 +margin_bottom = 149.0 +hint_tooltip = "Search for the spritesheet file" +size_flags_horizontal = 4 +size_flags_vertical = 0 +text = "Search File" +icon = SubResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SpritesheetView" parent="Body/MainView" instance=ExtResource( 2 )] +visible = false +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 1024.0 +margin_bottom = 572.0 + +[node name="SettingsMenu" type="ScrollContainer" parent="Body"] +visible = false +margin_left = 882.0 +margin_right = 1024.0 +margin_bottom = 572.0 +size_flags_horizontal = 8 +size_flags_vertical = 3 +follow_focus = true +scroll_horizontal_enabled = false +script = ExtResource( 3 ) + +[node name="Options" type="VBoxContainer" parent="Body/SettingsMenu"] +margin_right = 142.0 +margin_bottom = 196.0 + +[node name="FrameBorder" parent="Body/SettingsMenu/Options" instance=ExtResource( 1 )] +margin_right = 142.0 +label_text = "Frame Border" +visibility = true +show_visibility_button = true +color_value = Color( 0.501961, 0.501961, 0.501961, 1 ) +color_edit_alpha = false +color_picker_tooltip = "Change the border color of unselected frames" + +[node name="SelectionBorder" parent="Body/SettingsMenu/Options" instance=ExtResource( 1 )] +margin_top = 50.0 +margin_right = 142.0 +margin_bottom = 96.0 +label_text = "Selection Border" +visibility = true +show_visibility_button = true +color_value = Color( 1, 1, 0, 1 ) +color_edit_alpha = false +color_picker_tooltip = "Change the border color of selected frames" + +[node name="TextureBackground" parent="Body/SettingsMenu/Options" instance=ExtResource( 1 )] +margin_top = 100.0 +margin_right = 142.0 +margin_bottom = 146.0 +label_text = "Texture Background" +visibility = true +show_visibility_button = true +color_value = Color( 0.25098, 0.25098, 0.25098, 1 ) +color_edit_alpha = false +color_picker_tooltip = "Change the background color of the spritesheet's transparent area " + +[node name="InspectorBackground" parent="Body/SettingsMenu/Options" instance=ExtResource( 1 )] +margin_top = 150.0 +margin_right = 142.0 +margin_bottom = 196.0 +label_text = "Inspector Background" +visibility = false +show_visibility_button = false +color_value = Color( 0, 0, 0, 1 ) +color_edit_alpha = false +color_picker_tooltip = "Change the background color of the inspector" + +[node name="Footer" type="HBoxContainer" parent="."] +visible = false +margin_top = 218.0 +margin_right = 400.0 +margin_bottom = 240.0 + +[node name="FrameCount" type="Label" parent="Footer"] +margin_top = 4.0 +margin_bottom = 18.0 + +[node name="ZoomButton" type="ToolButton" parent="Footer"] +margin_left = 273.0 +margin_right = 300.0 +margin_bottom = 22.0 +size_flags_horizontal = 10 +text = "1 X" +icon = SubResource( 6 ) + +[node name="ZoomSlider" type="HSlider" parent="Footer"] +margin_left = 304.0 +margin_top = 3.0 +margin_right = 400.0 +margin_bottom = 19.0 +rect_min_size = Vector2( 96, 0 ) +size_flags_horizontal = 8 +size_flags_vertical = 6 +min_value = 1.0 +max_value = 8.0 +value = 1.0 + +[node name="FileDialog" type="FileDialog" parent="."] +margin_left = 186.0 +margin_right = 402.0 +margin_bottom = 240.0 +window_title = "Select the Spritesheet" +resizable = true +mode_overrides_title = false +mode = 0 +filters = PoolStringArray( "*.png ; PNG Files" ) +show_hidden_files = true diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.gd b/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.gd new file mode 100644 index 0000000..107c4bb --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.gd @@ -0,0 +1,315 @@ +tool +extends Container + + +onready var h_scroll_bar : HScrollBar = $HScrollBar +onready var v_scroll_bar : VScrollBar = $VScrollBar + + +export(Texture) var texture : Texture setget set_texture +export(int, 1, 8) var zoom := 1 setget set_zoom +export(Vector2) var offset := Vector2.ZERO setget set_offset +export(bool)var zoom_to_fit := true + + +var frames = [] +var selected_frames := [] setget set_selected_frames + +var frame_border_color := Color.red +var frame_border_visibility := true + +var selection_border_color := Color.yellow +var selection_border_visibility := true + +var border_width := 2 + +var texture_background_color := Color.green +var texture_background_visibility := true + +var background_color := Color.blue + +var _full_rect := Rect2(Vector2.ZERO, rect_size) +var _render_rect : Rect2 +var _texture_size : Vector2 +var _min_offset : Vector2 +var _max_offset : Vector2 +var _zoom_pivot : Vector2 + +var _updating_scroll_bars := false +var _panning := false + + +signal zoom_changed(new_zoom) + + +func _ready() -> void: + h_scroll_bar.value = .5 + v_scroll_bar.value = .5 + + connect("resized", self, "_on_resized") + h_scroll_bar.connect("value_changed", self, "_on_HScrollBar_value_changed") + v_scroll_bar.connect("value_changed", self, "_on_VScrollBar_value_changed") + + update() + + +func _draw() -> void: + draw_rect(_full_rect, background_color) + + if not texture: + return + + if texture_background_visibility: + draw_rect(_render_rect, texture_background_color) + + draw_texture_rect(texture, _render_rect, false) + + if frame_border_visibility: + for frame_idx in range(frames.size()): + if (not selection_border_visibility) or (not frame_idx in selected_frames): + _draw_frame_border(frame_idx) + + if selection_border_visibility: + for frame_idx in selected_frames: + _draw_frame_border(frame_idx, true) + + +func _draw_frame_border(frame_idx : int, selected := false) -> void: + var sprite_region = frames[frame_idx].frame + + var frame_rect := _render_rect + frame_rect.position += Vector2(sprite_region.x, sprite_region.y) * zoom + frame_rect.size = Vector2(sprite_region.w, sprite_region.h) * zoom + + var border_color + + if frame_idx in selected_frames: + border_color = selection_border_color + else: + border_color = frame_border_color + + draw_rect(frame_rect, border_color, false, border_width) + + +func _gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + match event.button_index: + BUTTON_MIDDLE: + _panning = event.pressed + + if _panning: + mouse_default_cursor_shape = CURSOR_DRAG + else: + mouse_default_cursor_shape = CURSOR_ARROW + BUTTON_WHEEL_UP, BUTTON_WHEEL_DOWN: + if event.pressed: + _zoom_pivot = get_local_mouse_position() + + if event.button_index == BUTTON_WHEEL_UP: + self.zoom += 1 + else: + self.zoom -= 1 + + _zoom_pivot = _full_rect.size / 2 + elif event is InputEventMouseMotion: + if _panning: + self.offset += event.relative + + +func load_settings(settings : Dictionary) -> void: + frame_border_color = settings.frame_border.color + frame_border_visibility = settings.frame_border.visibility + + selection_border_color = settings.selection_border.color + selection_border_visibility = settings.selection_border.visibility + + texture_background_color = settings.texture_background.color + texture_background_visibility = settings.texture_background.visibility + + background_color = settings.inspector_background.color + + update() + + +func _update_offset_limits() -> void: + var full_rect_width := _full_rect.size.x + var render_rect_width := _render_rect.size.x + + if render_rect_width <= full_rect_width: + _min_offset.x = 0 + _max_offset.x = full_rect_width - render_rect_width + else: + _min_offset.x = -(render_rect_width - full_rect_width) + _max_offset.x = 0 + + var full_rect_height := _full_rect.size.y + var render_rect_height := _render_rect.size.y + + if render_rect_height <= full_rect_height: + _min_offset.y = 0 + _max_offset.y = full_rect_height - render_rect_height + else: + _min_offset.y = -(render_rect_height - full_rect_height) + _max_offset.y = 0 + + +func _update_scrollbars() ->void: + _updating_scroll_bars = true + + if h_scroll_bar: + var full_width:= _full_rect.size.x + var render_width:= _render_rect.size.x + + if render_width > full_width: + var h_page := full_width / render_width + + h_scroll_bar.page = h_page + h_scroll_bar.max_value = 1 + h_page + + var value := inverse_lerp(_max_offset.x, _min_offset.x, offset.x) + h_scroll_bar.value = value + + h_scroll_bar.show() + else: + h_scroll_bar.hide() + + if v_scroll_bar: + var full_height:= _full_rect.size.y + var render_height:= _render_rect.size.y + + if render_height > full_height: + var v_page := full_height / render_height + + v_scroll_bar.page = v_page + v_scroll_bar.max_value = 1 + v_page + + var value := inverse_lerp(_max_offset.y, _min_offset.y, offset.y) + v_scroll_bar.value = value + + v_scroll_bar.show() + else: + v_scroll_bar.hide() + + _updating_scroll_bars = false + + +# Setters and Getters +func set_offset(new_offset : Vector2) -> void: + new_offset.x = clamp(new_offset.x, _min_offset.x, _max_offset.x) + new_offset.y = clamp(new_offset.y, _min_offset.y, _max_offset.y) + + if new_offset == offset: + return + + offset = new_offset + + _render_rect.position = offset + + if not _updating_scroll_bars: + _update_scrollbars() + + update() + + +func set_selected_frames(selection : Array) -> void: + selected_frames = selection + + update() + + +func set_texture(new_texture) -> void: + texture = new_texture + + if texture == null: + return + + _texture_size = texture.get_size() + var full_rect_size := _full_rect.size + + if zoom_to_fit: + var ratio : Vector2 + + ratio.x = floor(full_rect_size.x / _texture_size.x) + ratio.y = floor(full_rect_size.y / _texture_size.y) + + self.zoom = min(ratio.x, ratio.y) + else: + self.zoom = 1 + + _update_offset_limits() + + self.offset = (_max_offset - _min_offset) / 2 + + +func set_zoom(new_zoom : int) -> void: + zoom = clamp(new_zoom, 1, 8) + + var new_render_rect_size := _texture_size * zoom + var relative_pivot := _zoom_pivot - offset + + var pivot_weight : Vector2 + + if _render_rect.size.x and _render_rect.size.y: + pivot_weight.x = relative_pivot.x / _render_rect.size.x + pivot_weight.y = relative_pivot.y / _render_rect.size.y + + var render_rect_size_diff := new_render_rect_size - _render_rect.size + var offset_diff := render_rect_size_diff * pivot_weight + + _render_rect.size = new_render_rect_size + + _update_offset_limits() + + _update_scrollbars() + + self.offset = offset - offset_diff + + emit_signal("zoom_changed", zoom) + + +# Signal Callbacks +func _on_resized() -> void: + _full_rect.size = rect_size + + _zoom_pivot = _full_rect.size / 2 + + _update_offset_limits() + + _update_scrollbars() + + self.offset = offset + + var rect := Rect2() + + rect.position.x = 0 + rect.position.y = (rect_size.y - h_scroll_bar.rect_size.y) + rect.size.x = (rect_size.x - v_scroll_bar.rect_size.x) + rect.size.y = h_scroll_bar.rect_size.y + + fit_child_in_rect(h_scroll_bar, rect) + + rect.position.x = (rect_size.x - v_scroll_bar.rect_size.x) + rect.position.y = 0 + rect.size.x = v_scroll_bar.rect_size.x + rect.size.y = (rect_size.y - h_scroll_bar.rect_size.y) + + fit_child_in_rect(v_scroll_bar, rect) + + + +func _on_HScrollBar_value_changed(value : float) -> void: + if _updating_scroll_bars: + return + + _updating_scroll_bars = true + self.offset.x = lerp(_max_offset.x, _min_offset.x, value) + _updating_scroll_bars = false + + +func _on_VScrollBar_value_changed(value : float) -> void: + if _updating_scroll_bars: + return + + _updating_scroll_bars = true + self.offset.y = lerp(_max_offset.y, _min_offset.y, value) + _updating_scroll_bars = false diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.tscn b/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.tscn new file mode 100644 index 0000000..104e45f --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.tscn @@ -0,0 +1,48 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/aseprite_importer/interface/spritesheet_inspector/SpritesheetView.gd" type="Script" id=2] + +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 4.0 +content_margin_right = 4.0 +content_margin_top = 4.0 +content_margin_bottom = 4.0 +bg_color = Color( 0.135, 0.165, 0.1875, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.09, 0.11, 0.125, 1 ) + +[sub_resource type="Theme" id=2] +PanelContainer/styles/panel = SubResource( 1 ) + +[node name="SpritesheetView" type="Container"] +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_clip_content = true +theme = SubResource( 2 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VScrollBar" type="VScrollBar" parent="."] +visible = false +margin_left = 1012.0 +margin_right = 1024.0 +margin_bottom = 588.0 +grow_horizontal = 0 +size_flags_horizontal = 8 +max_value = 1.0 +value = 0.5 + +[node name="HScrollBar" type="HScrollBar" parent="."] +visible = false +margin_top = 588.0 +margin_right = 1012.0 +margin_bottom = 600.0 +grow_vertical = 0 +size_flags_vertical = 8 +max_value = 1.0 +value = 0.5 diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png b/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..5a617906fbee11a0d6d75d22cc6b4b8f40919b78 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~l>na*S9ON} zBK%VJb`Gw+2aIBS{{R2~Vd`0TcXw@V?FSDYtX{o3bIyxzSL0%V>Um0n{DK*PDqw)~ zNPrqpJi^n(F+^f&Zhtu60Rs+a!`J`Z^&~=;KCZQRV9?^hn2_2qvr*}H?&*+Q%zq^E z1TPlapPLtu>uhTAEj#7emvDz>;jm??%Yv?1Z1;M<_oE?S1#g_?`Dm@33>FiaGGmuA RtOwe`;OXk;vd$@?2>`2aSJVIi literal 0 HcmV?d00001 diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png.import b/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png.import new file mode 100644 index 0000000..bd3e99b --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/godot_hover.png-8e29b7be0f1894279e875fca20fa84b6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_hover.png" +dest_files=[ "res://.import/godot_hover.png-8e29b7be0f1894279e875fca20fa84b6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_normal.png b/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e6c3890ef1f30d15f157bb032363c2a88c86ce GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~l>na*S9ON} zBK%VJb`Gw+2aIBS{{R2~Vd`0TcXw@V?FSDYtX{o3bIyxzSL0%V>Um0n{DK*PDqw)~ zNPrqpJjm0na*S9ON} zBK%VJb`Gw+2aIBS{{R2~Vd`0TcXw@V?FSDYtX{o3bIyxzSL0%V>Um0n{DK*PDqw)~ zNPrqp+|AR)F+^f&X}>2Qg8~ne>f8VKbHsCEwAgioogPW3F>Dd>(q5&dJG-uZQAp<- yR`riJ*$S@B-=~-)-pl(@;+y2&1AZ6&lrdS=F%^HhB%K5_k-^i|&t;ucLK6V4-A!l! literal 0 HcmV?d00001 diff --git a/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_pressed.png.import b/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_pressed.png.import new file mode 100644 index 0000000..cfdd560 --- /dev/null +++ b/addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_pressed.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/godot_pressed.png-f3e404333788353a928368f9f57f22c1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/aseprite_importer/interface/spritesheet_inspector/godot_button/godot_pressed.png" +dest_files=[ "res://.import/godot_pressed.png-f3e404333788353a928368f9f57f22c1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/addons/aseprite_importer/plugin.cfg b/addons/aseprite_importer/plugin.cfg new file mode 100644 index 0000000..51f771d --- /dev/null +++ b/addons/aseprite_importer/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Aseprite Importer" +description="Use the JSON data generated by Aseprite to import animations" +author="hectorid" +version="1.0.1" +script="plugin.gd" diff --git a/addons/aseprite_importer/plugin.gd b/addons/aseprite_importer/plugin.gd new file mode 100644 index 0000000..c3e60a4 --- /dev/null +++ b/addons/aseprite_importer/plugin.gd @@ -0,0 +1,101 @@ +tool +extends EditorPlugin + + +const INTERFACE_SCN = preload("interface/Main.tscn") + +const DARK_ICON = preload("interface/icons/dark_icon.png") +const LIGHT_ICON = preload("interface/icons/light_icon.png") + +var interface : Control + +var editor_interface := get_editor_interface() +var editor_base_control := editor_interface.get_base_control() +var editor_settings := editor_interface.get_editor_settings() +var editor_viewport := editor_interface.get_editor_viewport() + + +var _state_set := false + + +func _enter_tree() -> void: + interface = INTERFACE_SCN.instance() + + interface.connect("ready", self, "_on_interface_ready", [], CONNECT_ONESHOT) + + editor_viewport.add_child(interface) + make_visible(false) + + connect("scene_changed", self, "_on_scene_changed") + editor_settings.connect("settings_changed", self, "_on_settings_changed") + interface.connect("animations_generated", self, "_on_animations_generated") + + +func _exit_tree() -> void: + if interface: + interface.queue_free() + + +func has_main_screen(): + return true + + +func make_visible(visible: bool) -> void: + if interface: + if visible: + interface.show() + else: + interface.hide() + + +func get_plugin_name(): + return "Aseprite Importer" + + +func get_plugin_icon(): + var editor_theme := editor_base_control.theme + + if editor_theme.get_constant("dark_theme", "Editor"): + return LIGHT_ICON; + + return DARK_ICON; + + +func get_state() -> Dictionary: + return interface.get_state() + + +func set_state(state: Dictionary) -> void: + interface.set_state(state) + + _state_set = true + + +func _update_theme() -> void: + var editor_theme := EditorTheme.new(editor_base_control.theme) + interface.propagate_call("_update_theme", [editor_theme]) + + +# Signal Callbacks +func _on_animations_generated(animation_player : AnimationPlayer) -> void: + var editor_selection := get_editor_interface().get_selection() + + editor_selection.clear() + # Reselect the AnimationPlayer node to show the new animations + editor_selection.add_node(animation_player) + + +func _on_interface_ready() -> void: + _update_theme() + + +func _on_scene_changed(scene_root : Node) -> void: + if _state_set == false: + interface.set_state({}) + _state_set = false + + +func _on_settings_changed() -> void: + yield(editor_base_control, "draw") + + _update_theme() diff --git a/default_env.tres b/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/default_env.tres @@ -0,0 +1,7 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/dialogues/intro_1.json b/dialogues/intro_1.json new file mode 100644 index 0000000..713be84 --- /dev/null +++ b/dialogues/intro_1.json @@ -0,0 +1,8 @@ +[ + {"name": "Ely", "text": "Heyo!", "expression": "neutral"}, + {"name": "Ely", "text": "My name Ely", "expression": "neutral"}, + {"name": "Ely", "text": "I do fun stuff", "expression": "neutral"}, + {"name": "Ely", "text": "It is very fun", "expression": "neutral"}, + {"name": "Crab", "text": "Also that's a very good dialogue with a very very long text", "expression": "neutral"}, + {"name": "Crab", "text": "lorem ipsum dolor sit amet truc machin bidule lorem ipsum dolor sit amet truc machin bidule lorem ipsum dolor sit amet truc machin bidule", "expression": "neutral"} +] diff --git a/fonts/EnterCommand-Bold.ttf b/fonts/EnterCommand-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8d8d0f875ffa867a79e468abdbc12802a7beb745 GIT binary patch literal 39616 zcmcJ2378#Mb>_MCUN2I&WVPkiVyRm#wWPMJt)4OHJ;+=9*hyefXoV{YR0Hd>pmQuf2Nj zHFBQxdC;^+SP?zf3_JSI}R>%e`}1F|Z5NTds2 zOa0K;$rESJ2rzu)t+?+zbnGqn{?UpJ4~oqDCy}?m=kWO0!Jfa{^Z|VLJ$!Z?Mn&60 z_1^>h)wo}M`1thcpZe2R?!kQ`()NvGlLyB3JU{SJz^{u$KR7;i`h@wS{4~D54$luv zj2$2U5&oXLxP#QCR-@;JGMn-L4G23MzzA z0+;QI&nX`bOMgmhMO)<;F!VV-!*($~C`S!fp9I&~mHidpHQ~p1Ue@|u!`&zOXZ0D> z5ueJ3SF!L@d7&B_Z9D!wnN_w9Mj*;MRckao87_bj*ixaU%N&bD0ulWo)XL47G+Je#YJ3-`V~ z>J@II`g_8O_`L+5BzvCU)%N_1F5l`d9St>3?1SSpS;_E*Q9QpnqWP!0^Dxz-0qZtX#G7 z1FQO1-Mwmj&68`MTJ!le$=bHHjkQ;`-{0Tp z-`{_C|IvYk14{;$E3B;pmny7B6xP8KSmPGfnQxu>!!!Ts%(`z~^{vrwt^ZcnH~;aQ zfA`Jryx4eg^u^sTZhvvZi|b!p`;FiEM&s*${`Kp>-ud;m=YQ|{r=I`J^PhVD=<~zR zZ+`y#=NCMG-t*mmdcWlzl>KWQ?a^FEQ8kikWsCGgjb^H9+cIxM%K!ZTqNt{Vp%U6 zWFs<$%`z-oWUGwGHrXyaWT#vrm&#?bOLohsTrO8Y=X>Nzxk|2g9QE7!^Ou!L91 zK6$m=C^sP!d9Bo9vg@$?fubxkKI{cgj!5UGhe`TgJfN&&oUHA$eFHm0y%! zk&nr*%CE_PkdMnJLfcl{M znE8VF3-kR*q6N{W=&tC2=<(>e=#|=r+MTty_H^y9>rs86es%p|{h|7kZBg5%w!7ON zZhNxrFWP?8zPf#1`_cA?+n;X#YWpi4Ydc=kabL&BJHFc4*}1y&hRze6AL)Fy^QAfc zb9T?UbIt>EK0N1%IbWFb&AD^uZkT)P+z01AHuuYOf6z6*Yirl-T@zg&?s~fGFT2~j zH+5greXRR^-JkCMv+f_wTRrc_dDHWLdERH|y)f@b^L{jc(fq6DPtX78{IAUa{&`!^ z+jrgv&r8nx;ezf3`xhKt@SX)vE%@q!AN16FHuUW8xwq%Ro=1DW(DM)H51&7A{uAdv zw{XG2>lVI!;WHO>UU1C?@3`P|7ks~WRqyS+AME`??_V!Ef6Xe{%T?eT(|8>wBQ@Q+?m-U)#U0|3v>s`=9N9dByOGdsjTV;wuB41D6ck zH}J&3w^uG%dE?5ruKeuEZ?0Oj>dIB8SAAmD3xf*=8-o*rj}3lp^@7#=RzJA<$<^Op zvwY3XYaUvYta*9uC2LQwePZoj4P7{N>(E0(pBwt#MT;)lchTvK9=j;H=%saw)-~20 zUiZklkFWd6#qAewyZEk)KYZ~s7k_vC`Rli>zjOVA>p!{vOY2|SuwcWE4f{7dyy2-0 z-`%)q1viX-a zE<1YJ2QPc(vX^&l*mc*gU*7fQT|eACuzTC?8+PBddusPPcYkvCmv(<|biwFdqf?`g zj(&Rd%a_l+eADHxxqRaCM=t-=<=?)d`-)4hIC#a|ulVQ{pS$9@D_&`AYfLph*7#cE zjUNA({i~vTeawu}cXc50$;jZS*=737(BNnd*IFYu z5?`hxBGzKC)IhsAY`1VUVza^CmA=5I&j?P2r}S`brJ-&65KU$0_QBr4?StD#Mh#Be zM|$t=@B|MQQ_Vy48EAiq)j4bkMxwB^z6Ij!c zG}X8Y{UXI}5{G-Uh{YW#R)~)*M_`x|B@rswHTa^>ECi9IcvW>3n5j|XMSqI_vD$$2 zc*UcUSGj!#`k=XBOmB5DT6ao-;QQ*-gmO}W4Al--4h}$!)~#Zx%)UCcSPeqIad6Nh z(QaY2YIzh8tYd^afkcuNNLB&`U{q~3)^?)?I^9L(_Q74C=Dt!P+IE!-m?Hib_eJ>1Gvp3aPz@6g z710Lh@EzjFaoqwmd4?iVnZo*4A_%OH7zp@}(N$e?h%P7rs5mIIm;h8DhxJZ3j?QR( z4W8EqgXyJ{_eBM01z=6LATgtJ1+rSF`I-_LLBi0vLT0#v4K(TAf{dFWYlVtHPqeKS zYPXSA1A8bI^F#eI=CJ;H0N;jZ@hItA}y>eG=r@L0RP8yAv zT;%B3soj%O!Z=I<@LyfKbvzIC(}9>3$WI+Cj1Dxh%3cO!`NPK0IBLLFufoXeCd^@L zEN1RtyREu*H_$rFcSPgs$Y>3+j9h1i2N84)*{T$TM>qRxtdGWxqD>;EL~uxaM%$c0 zws~XBp-(DsdE>}@YZ-DfjWM;+_FdqXQExUbWl1bWqsYS;w#NIe>tCR6m||bu8)7aV zmV(quIE4C;>$fy^d8&~RAX?Q4H3u!O2Ip&7PzjP1HkXLG6ehNaHn;Yo8@VsKC+4 zzI|!fx7VykB$Yg7ZP_;46B9(;LQ09CCmz_&{*O~^6TJwXr&uswe}C`3n{7foC#C=iq7K~`tbdkPnf_97I4 zcMUpy#$WaC zI0v%T(1i~MF~erMq1Cv6XU(NFk`hG1Q`6yNX{IZmqu7p(=^waonS+aY3@aL5b5W`Z zc2h;sJ~47{V{eXF1rtr0p7#~Gc4-_|Z-eX4#_K#JNHVm`LH58p$VOb!*rZpwUNto( zu$s`Tl!<|q0mH=!3~pM2&3zf-K$Z_Z zARTCi+gD3+&5AcUS^BY#C6hrTOqL;()*+}Ib~b)yf>j&sME(kCw9kev*A{VbG5QPp z9|Gg>68~F309%Y*8ScgK0f-wB5czXoXN#uff^9KsWPC@qi=gMTIu4+k1A68|9xw7# ztbEgyldd z+PZMc=PU3Sz_DGGAG@WnBxo83Xx z1yB(nrhHJ&v~u_YuqqRjkWHnSNM()|5E2#v%F0A}f$y?^Qfk`c@Htnu&qe~>*f?Dq zRPnh>eOEgSrd&@XY=IMTexf$K<{4-###1Z$|gvwS(N#6 zX7BVRjTrPK&avBeZX#iZ{GC9(onTHj=Jg`f)V;#sTI-XapZ(GQ^|xqiwI znQg{8Q?yrsL)R`24&|d@D6#UfSDYg-y$S6Bbm~|MmY|6Xf@~W^z<;xv5m8vk7aA~e z@*LQMIv*oGy$>$f$|xLdPKL+QpJk@&5oc~e zL!571cIRv&!TJny2U$Ze0Sj~#fU-fgpti&Va(=FJgl@jinsd!1nEt`o7c3;(E6kfcx%Bg(+$6=uTz1-?y9>ZGGi9@96o zF#!8YAmO`wHxWxr#PX3(U>Vm}>B3(if?@!7z4GotQTT8&=*WA<-jAJhE9_m7a#K@pXk6 z=&op|_6sV-zM5Nfl@f??vy8~1wV?!d$@x+BD60$>oo8v7%iZ9S62?lfx+;qYy&=%` zAYMT7cJLQv_L8+GU7`H9%p`x%+KWH{kI$`)~c${9;eR)`RcxfpvP6ky%1 zF!qYX*&A0gU^_kZnVpO#E{51iXGE27QMNeuLR>%s95G_uJjM&#`|PR>IWM=CYyG)Q zgiZV?IGhq)uSCqI-DqEC!#{nl5E&8=q@=Az8kz`vmo1CkMzJmID}g-hSk#423*H5H z@ay{Tg&bdLF6mbjvF^Yq%(SI$8(HwNz47PZR_zV_EpfuGkx8}>_HlyJPGf+8w!V(D zvfu`UKwm+h3tl=PKNmfSJ>kjXY^Xya%Gf@Z65^OXl#f2`o(DYA2zvrN_5?^yV?xWO z9uuzL|v z+*>`8og!vNZDPetY=+mv%3oiR{C#kj__ErID8Ix^fu=aoyMYq))+%QDP})_8{72$} zo#mCXcK*b@4>~W9i|0PY_DNTh&BVaSk2{>3I-7~382#dq)uJ8cL5oeRb=kaAE=DCD zXzA5bV$ZH0K+K&jJ{Md5mGF&FZ!P#!Yf=YqLKv4aXDjn8N*kR+d90})?qs&qvmHLx z5;u)UEf((6i?|aYOi+&feI$)WxxI#T;AxUk=P8x|W?DEne0 zED_u+U^>ktY~qgC7lLafyeY!O7`>U!ObZFyv^*l=*DfZI_crZyurrq%*J=c%)4{0> zYzmREReB^SMS@dP5VW;k4$Q;cx@?VE2NO=NoMsEhOi7xS(PBcbJ}8qcrq(c0-;OsZ ze00a`0tPMUI_=VauT65>F{xV}+hdO`l4h3tcf3ZzGY-;_#nq**--h(k;1V!d4?1np z=Jpf^<%**BlC#3)eP05gaZs)(mg8c7UCCEwdAYul$oOe_cyzhGx(_*X+E*{E#+z4W z5+I6E=0}f6TIw?m2Z23Nm$r|t#9oX;K$0FYN(nxd9W=hfYGI-moM1;fyy0w0eijQu z2G?DL{Sz`6-?aMbY!mAwiO%ck{(?F^8>WF-R%e^Kj-Bq)ErN@S71@2lqKkFRBiBG; z&Pob91hN>~WFQ&1=29fAgKQ#vZ0^(&$GKR1DGrXIRPRMTDlDC3wmu@^_hcjUVeU$0 z9#)3QZ_iBAKW$GK_GoQbS%eDp)5jUu>KzAAQc0)e5f-nJum=1%-N43d|H-u~Oo(E@ z*N0g=%-B_}RugWXmNH1qrBvpe)7RBpopa;_ zceo-S#ODx3f}1$3$ja6UGo8)|-&<$~BAAZ|D{Z+PzTIz$KBh>2V4WeX1UGS55tcoQ zH2#tsYH~B)O|-o!=VzO7QC;0;J6^BFh$L;$3`>QT=AF=i=CwA9 z4)>(M3D0uek;V?^>odVV8!Ih^&E0D-M7QLh?LN{87&k>IWfEwrOTl|xDeb{~Zw1K| zLts(fgc@<0)q!5+rtziI(*JKrptAMNZ~7A3n2?UVm+6hyjMqQ zzP?gd-BX<8$Pdkk%y-kC+yc}lREd3n`U8&UIhKky?pk_uHAj&UU4YBQ?l7;_ch#^V zAwa=KGai=X0CtS|sB|8uijRscU`A|>NcarUrE()Li05Uz1X*i^VhAie95cO7Bv|0S#Ur?BH?*9da&t$qF|F* z9F7w|rsW#Z5JzInS?reVY!SoF?>BJ}&jL>)od&mjM5w?xLv`+>bYxR3j4RmpaaSm| zrMaL}Vpd5jw5iS$;Q6;%o3XY__=Op_h~p(J0AWh+T*wFMsjeHg=cK*1HLtVsH3m+u zlnAGlY^+83{u%W1y_6Z|G5l|ERHBNTF`|l=9`X}|pX!y*o>u)=GyJj|zv2L--liG1 z24|dIm@R5B)qJ2bv9*Ej$g7)0Dbd~8gqsYZ_o6&+7zc(CjfqHp4$68|rS3BLT8bSv z;Kk3QC6r%V)+l8pvW=nux;##+y{GeakXeAq_x~wV7LnWFTLhoK2P64|5=ecE z`f+nkrTXENhsL@*j9J`yEfsBWra85&gO~*p|48h$W#bXosklpxTK!5AF z9*&;M_1LXl@%hfwW`a2Utper-vV+6$3oL{j59y>h<(9c6MOMA7x+%+ z^Go&X6Qw*vf9D|k+w>X)-Zfp8J9M0uy+$2*4_j%UCMFc2ra8bmg%Yinx#jamhy#2?0pEI>l?Y% z4Yw|k0*-B)lCu|{%VVtF%HlMSfz5^#4JM`8Eo}ELGhd}Zw6!l|4?-zsdk%wx730cJ z$wAS1T_DCLu*GE>HJW*7oqsgLj)Zk!gYrSY55Z!UZ4f7r3DKnQk_UieHpv}v?hY_` z?_kCK-@wQEQlM)4F-!Jl@qB!3wxJ!9~ z9oqeU3ZZoWZfadQF(m=CvSK8x&G2x}VnxkVBo7pUN!GP7g z6FDYD%?^=hb?M3K+|2`U4^bYE&t@GbvBI!t3ohYBPb_4Ih3n#qoineb+U91+2J`z* zlMGr#DH47GRNii3zB*qXmQVULR(%eLt4ZE!-Vg&1o72kx01wp+bwLd1xR6&#($R z+k0g7i5UP(LzzZX%;!vlXI^nfRJOh&w%NZU*6HlF@OIcrj7s1j^(bJYqFDWQ7#mm} z>z+*ZJD8(mKS-?Pwau=_AuqE&<$Um;nsvYFadj8Tlvu|RwbCwyl%{RKpu z%=)EcY`XGF4gs>96f1&zYZ3PB<8A|D_PJj6t35p_f}nZ6m_}MD6ANYX=S=Wy4#n26gP^Zwch<3MtptZJQZ)z^>H6%A`YvfOrZXDxOMd@@%Z5RUBP}q+72id| zFX*ZcKb*$z*WOjrnL-*XC!2fq9oloo=vei5V)Vb5Rn~aKK^R}_ZpkOURIe$WQ702K z9g*+}vgv6cuWoL+iq~_->NU%Jz>cTDZMZjkHcT^alugo*k?=^uo3L#25#n#?$XiGA z@M>PmwR_Ge1G%2HZt1d|lx$9nLT2LdCRdJxw`Zf*bH(V@s(GH(EAl+ASNqGB`YWvM z<(f-KXz_41sqrvIJRA(i0vva1rs5(be1#M0aS;ga6V}-v#S)KHCd@-XDaVymzWt@x zEdNjR=~kym_^pFy$MY*;Uixbzh(jF(GC3!1f3zlMJ9l{E5?{fq8*efvw_|aAsT3Wk zBU4`|jdD%G=2~_zpb^4gzYm$=U-}-ricQ_g)6fLNRfM@)?mbk_eL;M7-oeiny6M>n zpmlybDFYix^Avjc9KY8i!_AB}*e`BzhdVL39~L5lB*`W^B)Xpxt*gRj%_5gkY0&tFsd=ADyKIxlyY^!vpiaFNN0 zV_mK}sXY|=usS(=d|n^GgPbhoYb4DE$}P|JiNxAEdKMI8Z`0vIin9UU*4qq#R#4>5 z`V^dr;cdphUJ~N;{LvtAggkCeGl3=^UC_hdmP$({8k}iV)QH5B65^&FgE4h8uPWSg z#ho!soLL^gHD(u|^kv{8&x7UtVC*@lx@I`^cT_VRw2guynK_mWYbtSg+vl2t-7!Z) zAf?$%I%ey&Gsvy&<{{?q${2}+wUC$f?F1LMzMJ7I{+edEmK?Krdc=f3NXMiq{pN@Xn^S1FlD*KOJ2LFH(42A#Bejl($ z#j6cg0Z!V6+YQ#{5n_Ww`irB%*eHb4vTVH~&lfy)X1=VclsHvubP2yM@Z|O#SMYRp zh|2hJGb1zT$*1Hk=`a7%X$rQl{h0G%m0^XR&HRtA15r^*Sg$7*XjC2# z*WLz0KAFa%S8$_%SRW5g3Cnt7!5$gi%&`mbe#|k7pQq${Hs8k7c}l+{8^J?=9spbG z^bJh^N4&)V@{S6Xi zjh?e`?!F3sDQsWq1ER+f@&Ofd*3<4XPk+VVzx9+0Q;COHa`kKkabEvU9D0@f4`D@K zA0PgV{jeOTBY!su7!HBdG{H}koMkUYRTY_U? zqA~r;I!gD>9w^@j!F& zh!6@#YDPLglAzD2{!L!OvVCb1@$nwqAe-wzH(>)!06Tpa&#~X_!ZHLb-SxXJx_IIU zEPO88uwfyF&td0cA~XHHR5+dcyD<7&+a|!wT-H0OLbUC^!?Mj%DXTm2iv#Nz&LtIx)ZSJi>?(v+7A4(&rD>Vhj@yYScM{jQ|# zI!J?5bR1}!t=aZJGC~(?Uo@KRopNxgzYrO={x~6IxD**t%C)*;?KBLA$0O1PW4S~ z3qg@t3eWZ~ARXANS@zJ`SFxV~EFGmFL(|0(PX4C`O54kUQJF-Wk1r(zQaaDz`^OTgzmVAk9R z_Du9UAv-!G-BJI+OYkpe(8SQ{$iq+HA}qkiEnS=LuJSx96hu!JQa-qzWwm4#6?C^& zVM!~B^RT!pl(3Y(KnNg{|5`yxX`&5re<*)}kAKEkEs=ko$V#)YgbT>|I6CYbPvIIN& zZ8<{y4p*+pD%tDGb(DY7mD^-MKI6*msQ)WDD&sN@{Bm@B8t1(-f!lGJ!XL|+l;ij} zhMI%;Vq$uH>Z-}($HyjccO||&#_B64kKycrTvpwl;4jMqslv4}10OcnXmRaV>P~{> zNl-Q*!}zyFHtBU3_p*O{>g18hiGktaEt`gihf#BGh}7RW{^N{G^I=Y-jtNE$x@?nn z#Dh-E{LDqR-wh9)54|jaHqXbb+XcwD7U7M7CCDHy#AtpwGLn8++5pC^s}QwTV`XtI zeEK5T$Hkc8*?>H06JiS)+Y0R4khAWu&5ByIih-1?_>Tu9B<4;Wcut zTqoDd4fxyK`{dPfBmP47Yvi?Zv)m%L%5Ab=UMIK9>*Wr4gWM@UA$Q3ek^Gvx zLw;8NKt3dYE$@`~$-CuOWNkIUc759J@^ zWAdBwU*%6=?f1w5c?97A5QFv9!fe)+DPmIvf5u-~7Ox60G;t~1x08_cWBKJ#k% zw0y?gXl^pEF|Rc@n_JAS<~Fn6yiWdEUWWhuZ*#kOy}84@!Q5$n!rW!vXzn&+<{opv z95mzRUUSGCHb=}+^Col59GBlW6K2w!FmIM`%XiF_IccWNDRZB>-<&pYF%OuZG;cLO zWgawdLx1?w=I!QZ%sb>s`E7YhepmiTJ}bW?e=NTt|Hb^Qd8d3qzG!|<-eVpz?=laY zcgv&le)*vMf_aa5uX&$&zj?&`ym{1ozy=yGb;Mn_ zyX&PLdybDCn3|mE7_-;*J@-tF-#6Yqrk9RAlZPfJ#^2O2X0KgW9XK*|;MDPZkBy)1 zI*^s;UUhJCdhEb~@rmiV2hw8u)d$7^y8WQNTn#*9(;a&q!f}UiuSGbnm$`e>)^o?x zV#i)b#<;z<@3j!e_0n~1Mo8D8tUUMH6u{g=X|em-0}PCo*zQBYP1ki<+pfb|xqjU} zV^j6RIJI9tedO4|@%AHn>A2o;a>Q|Rz2)SH72WlY<|FnRU4KJ#NP21E;3P+mGp`dtdn6vEZhCpB2zCz0~)C`}#4Q+HbV& zCv5v0gC^Y*!A<*(w*7<^@Wj}O$&=GllP3<3*Y-{vs*O(^>bS`yF{=?e`*r92>9m)OPa3*unAofn%rc zX*)bVHZ|RG@W|M4AnrPT>g16FW5*^Yr^g9k1WATX56qb}niJT&`RMcQ%o8&S6MVz6 X{K+ey{yMMEoL;|&*XM>#eeM4PrQ?Ml literal 0 HcmV?d00001 diff --git a/fonts/EnterCommand-Italic.ttf b/fonts/EnterCommand-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b17eeb849963c6164d1740b316b22c1183bc5fa7 GIT binary patch literal 45808 zcmc(I3%FiYdFHqFe=Z~^A%v4dxFjJbAqfyJNls1zxxgkQkU+S|O+|_vl0z=!*5m}x zT3lLGY7wncYOVF5w$rhcQlyr))^^q~PU~1_hFZsQq>l>N%UJ7ld~Cy6UQ1uG{^wJ+Fv7`z7?wyL$7M zt7Mie!1tnER;pX!y*H? zEIqr%jvP96On~9pr*MAKu6=L0=Y~gnZWNjMeUXoRV)yvi&Qn+1c`vSg8=p11(b4<4 zp5F)jb8vpn?)?)FyyyCp7U4XI^nPRC!5w3N`j@}*1HkVQDZaaZ?14k>^YSiS--`Pe z9vIs{zHR&0R*8J#3G{vS(7_`U@BF?0JzwO>w*mcyq=cXM_5P2IZ=SW`9~2C_zOw9n z&!f`%SU6U;qWmidjM(S3gA5^atCM&rO1cu zy1P#nvE^>X2i?jd>tG)x1a0AY89yGims0z13EJ0ddT)t#s6Xj>_N8`uF29fPiqh`k zece8|uez4E+wYIC%Y-vsN5Ay}j?#gexCu+oLkHS$5o5=W!pO(RiFTaNj6$% z=PhZw7SEMGU(?!nK0Q;~v%I&{b?{cQzmi9o+%7uwMcGkb^{2yq6>Q$u;X3=$J^z|o z{FUNK}U%X`i=$V%g5_hQ)Xss0d-Ir@_FmWwQjO# z&?Wlpqo(J57*XoQ8T+8_B+$JqSdC{7*b))Hc{mP%=>k;Pnf}7TmjV&cZVnE?Bs9;fjSL3)d}t zYIxD`hZZeZbl0NsCC@H-Zpmksgr&Vp%cYx^-nDec(tDQfT_G5;MHb2v@^o?ff?~n+ z1q&9G3vOF**MhwZ2N#~caGt_iweV7f^#O&ovjePggLUkcW6vM^_s7nA<;qt!zOww4 zftUZ!%m3@;zkaEFY2!;9UK)Mrf|r)RwDcRl^NsTBfByAtUq9*Vy)XX$i_g9I$rqn~ zaqo*OUcC6lQ(rvg#aS=T__O$GODv7;bDy2i{%_yB1>hN zoGa(a`LbLtkPDG9Tr4YOrL2+>SuLZoM%KzDa;dD7^|C=W%4Kpnbbf_wk}GAiY>}(v zYS}8=UT^=VA|)W zeS7-()9;-A;ps0-|G~fo12+vE7pnStjAzBEH-teSEAj7MjDX2#1i&z!k^=HZzi zoB6`b@1A__$+w*R?vp=#^0#N5G;8&&+h;vI>#12UpEBc=O{eTTXesf!`x=i zn|l5O{YJ4`sdG>e#YiA?mOcX zXME$#Q_sBq%#WV=t+OsU>yfj*Id9dxJLWwz?+5cY&wp(G*A~oKuyw)13!Y!_>e=hg ze(>z)&i=u|H4FDG{I!K&8=g0O%dj7Qa`>x@dKRr(G_mN}MSs6|_2RcJ{`BH6pL5zd zH=gs}b3VVMXUWzje#!GodzP+S`q0wnm(5sq)v|||edgTa+;!*PckZvA`>pfNIq&d! z&z<+(^Upv3?(;u<{#Tcux%|fE4=oSNU%g<%1#i9J3m2Yt;ob{Bb>XWQZMf*Y7rk)t znHS%2@rN&dVa1FU<%$C<9$)c=6|b(mXysiiA6fb2%5Sb(v1;$CCsuuHWa-F_BYx!R zk-u1d(&}}q_pW|y^=DRpb9Bb&jiV2betwOtxn|9~*Zk3%SJz&!_P({xT+(yN)=Qqa zpr{gyX!Ame`x)u*MEP*rVS5n_}s?6jhAfPz42okU)cEl z%NAUA__F6Nd-d|wmp^p*XUo&d+smiR?_ROtiU+Rv?4}u;wr={sra!*2=gLd2Japv~ zSH8S?-sW|iAKd(@%`a~`b<6Er9^3Net4_J7+djSRE7zQU&AMyuxaMuweC(QVZO^q! zuYJR{@4fcdt_|0I_1b^jzF_-p+aKQ^wtwfkQ?6Ta-7VMM0_!h0Z*Z$Hn`j|=UGzyO z7jJmBzeoOV)hGLU|6;?ltpZK?WQ*Os?0&Yt&%L_gS;zj7*~7D!jm%!W$er??FMOeR z@}F;8RNP~u6n!)R<^T**R*sGgZETIqFE$n<^Igf}^;ia0bV3YroG9rt{fM1|B7=Bp zF+OWIIy|-9p&Igd!t-G#d@>b_)1~uxeh^Vq){ZX5vv?ZM>t|^3&_*}8FC+*Z>+C9N z#OTWzLm|Mh9C2CZ62rz~F(@-kL!@}|d~%7-#q&Y&;-O`@2|VD;w_(9~dslXc@=58; zBywl+G})Yi(PJ1R2B}z!(cp5CVQ|XNl1y6t+FlF%{q|W;vPOpbv*QvzhpSM_Yk^_~ zMS*%jt>pfyTk7Gtfpc;uBn{ zwr!RTYl2t+jbfVbLb|^e2-^VpUfsaS|CYun71ENrQGy??T`RWk0F37P^)ED|; zS7#wxx{wyNR;f^t4AZ#rpR!pF@eC(n&8G{}z}CXT))#@mfugqRXbI@BYkEWbK`&Xn zfq^Fu{Rf zy(6n&C_0U?lR?dq#kNO{Po^u{9<{|7d|?|#YKMUs7};E3P<1BXkpM`^=5m~&1E=xU z5=)+yEPD~VsI{}f#uq*S7HlDN>qb zMD31tp|WlC2E|fI6vK)2m@R_etfxUxJRx1RKQKnjjpJODu^Xiv;c26!q7?%N2_Zp7 z8es)|JU&{0G)50Qx1+C4V(x&kfpH)BlRWhf+(%nROk}*{b&ST0ii7yr_=@{*m!%|u z4e~*qA@U;jGLF(VF_tj+EK|oK{c4GcrDP4B09b+^>jU5w_yD3SRWdq?_8^c^Cae<( zJmah9f}Z5`P_E|p>M4l;lk7^P4k9K5JY3P?bEx#a68>Exj!-5B5i9I;G1@ynb4^!j zr^YqF#p1I@NNtdfd9xhzg#a$04yjF^hb-rE%yF;Ay!K|W0=P&KDoTNh)~G|YnyF?t z!yHr!W{u4HEVxkqOK{SQ+N`CPnNdMwLGWbk#3f&9K_>(1aje(wZ9hU~9QWdwbq4s+ zh=HKAyug42;n3XHgC8B9231-Xvf3$3w1jpXJg*sn5K+vJ0^~RV>l@TabzT}NEiggJ z8apT{PynGK5~nV=zQvA&%Padtq!yt*WoON!uTC2@a2{Yja5l#RVg}dh1Ze7r9g`w- zN4_nN0A6YYgFSg{^Sl6jb#9Qb4PymGtvutHxrPbYQf08Oyw+n6;8EoouLyc_@pTvQ z+E_JX7`Rmes-qo*oQ6L$#`sfz{CRR^SQ1XYhMflPUJMlG+mF{OPLgtrb|| z^%nugxr9k+zD9k>siRhgF~#AyY_cLxoz=D=|XCNNErN&01fw71lfl=F3 z5*0HF(_3tkgJamV(Jq-*G7(Z$srb~W$WQ^AeoE+P8X_O!ux4v8Jj5xD5}L39Bc_*a zC3XaMXLK_*&C=0na<;*+L#R_G7zPlk$o0W-f)Qe|X0(|E9!al!<`31u1t8DDvU zLD%F0u!QXOgBJd`mAWU{73DHBj!%HtLx}6uZX+L=uzeGn0<*Ct*XJ_kM7cgO_h4#n zF^<#a#TYs%Cu7WLPp}ne!qYg3o$SkED%T341r?ft7fACBJB9?x58;io@@T`#PBNN| zH-ql2vSVPC>!=>-m?_2B!lAs1VuskfB_46jd`7{=aArK)(fWz2Tgk_eUey(%Xv_c^ z1rV!Sapn)C7P@O#hNV9D){GTSV28F69$*W3tfpKq#tMVl;<6aAIe@A`8m}0KIfsYA zxATh_5EK=T^@y4xt6kFTT@QIoXC5_EqXkx8hAD7E3UWXK26cYJ%dB7LNtD?#%MOVU0^($!af@NV=KqEhZ~%+ol8d656`$I`WAh^N*o(MH42`&> zpf%`l830^Xk=an?Zh>|ugb`b)ks5D?llI7UEyjWr@5mB3Wn~M@#OQGi-q|qD6z!fld9$Tm~^s&(i9NdMX?>bO4PmuibI1 zh7@!rJV*BP}h2O?*)9V0RUQJ{p0;;Tc-O%hyNyM-jEzvwPVJJt4VP$2189EMOr z6)QT}I5AiO?T9;|RX{r_hZK-&k($lu8_(v;f-oy463%OI0{o7+iKHU zjDjhfp~%%V3|Z$@enS&-ELl7GQBc~s9y*_S9*1*SF{4uqeZZxyD#5JG4>VU<3)&rZ z3tn0}CXg3;E8^{3tOju)A}Y>a@V*HOZn$Y6IFyhNFS$-|Ar;CCIH2=VdEp40W(%|( z6B@=BpPsN*fVI@N!t91p7>?tCjy7re5?-SsK?uiFT6|RnYvo7KQz|_{?E-UfKJG?W zDyL?|Drojrt4=wD)COBMjdgBYS%N|_Td?_vSwzt1EeY>rZh9H8dz4NOxpA(?e2bAe z&*Rkl6pPn~LQ=DxYG0Yz>ok=j-`7IZTuxz1TIiyiPUabL6dXg5y#)n<(UJhuQ#tsb zm+Z8X2X)QdggWCI2VDZ6$(iUVUPGi*g+K!jsdzL1k}|Hw6nX;JB-+Ll5?%21HX4mN z1Yy)92esJBFB;eM1XQDFe4@p{-m+X298fM8u{vd;UIA2xc$(-BntyT*#Z@1`)lro; zM;$W7!fONL!UozQ?LZR&)w4HkSC3Qn$2{LIL*rZ> zi}7v{Pied>fXJH!I1DmDVA1D@(_>T`(ild|rZDL&@L@BH^lFb(SijfjRj8>MdssEP zDC^|w0T>yP)Qj|OPc#g2*B(DcV%`)KB9BuPN;%;vqYv3wZmSHSoH-1aS&(dCMAr$O z#gLHT`qYRu&g-!-K--*s!-Ga3B_!3VT{MQsgbJq67fSUsu?-$hRdpfjugr^bDk_^~ zynz;JjgxG$dIZ$zx|aGlWy`nNwx?tS`$;rAs#iB?KbTZ-g@Yq2>)|vU7V4S>ARBEy zQW#T7`n`s;*v*PmSdyllUXM6d0`?`vx-g>BNNu-8XxTNgkN zRfZ3kNMSz^cpy8Wa%pyD1w23(-~*fhCwGtl21ssYn*p->!Fj!gnAXSn=KnaF0d-gl zhH|ii2WL1j-2_GK&6JL>m?%)NBVY!WQ-U?j#}Opk=i`N_3S&&A4pYvoJ6%An#yE3S z>T|uCrKc=G4=55IV=);DWXL$ltVdO&Ak_8eMhbj-qN?*A&`p~P>KB%mNm_TXxsbhI z&7UDb8Q=BujPr;P79ts!F%ZIDpn&QDHfla-2Z)P4`Q&W11FkgDEl@xj<%L)ha9^*E zZOhU~vIGIMS~alTM|EszS%yY49#43BV1p&-5eLHo3{fY8I?Gj2(x)(dnybTv%*PP1 z(7?Eg|J09f0*-Kfg5RiVCy+PD6G#r=he!zeaCWT36^jGAwAR51i-TbNc1zoJ!z-Fu;s^aHGqa!bg;VWamouPp1^R>nr#%oP4AaVP@cRp z#tqUuj1T=0AZS4#}cJ93D?MO91AHke#!k0Pe%)M3{Iv4y=`>VYHrY=CzA<@dUi=3_P${h z-^btz$MOPk21xOL$d&~WbtrqV-+>yayIm>)c)Lr6^mGtSw0~*n$o2zwp{cWUKo7lf z$QG&^a-tHt(?zNZX;Q{M7O1YWp)%%|j0g0LF4T3GSc4{W$!=5?LhQBM(1nq zfStz>R^<;mkkAP_?BxLoF|eRUG3^9xmpUP^X7lKIYI0KDF%LZ(7KAszR0rc)wqF5` zNBJO|)O|LC?MhN;gqW2=;C0!#MSN%rGT^u@{{pwaF30R4 zti5R5CC6atM7Y+Bpu*~_R%`_G*>0RCzAa}k{3`F`W7kBhM(69MwF+T9ne!;?5^;=s z?`_|o={Q;$25w6fFa_7y!faD-Ai%m50`T}$QV(qB`fS6Y<6~DG5O-+PUm;yEP<2sv zUiskLm@}ZgWoE4^y>6J)SQ*wl$jwV3JnP0%l$$S1SB9_FRX1#KxHe4P(2%Ek|DwGk zLtodqm7`-|3@T zOucjyjJ~$~YtgAOvSqOdhT%JrQwV5nTnQzL9#B{NWmM1U&1s5{*e{c!Q?(MosA!3= zkrj`yuPjYU2)u?z(8j>6$As7%x8Xk^CodT6;ynCEMjL5Yiy@xwv=suG@s=*dQ*M|A zRWX(87+hhuohjUB6jz>7oH=3X!SqJr9FNGm)2M;>cw~}9rL&NZGTeyo+*Wz@4?|;? zVg=HPG6ku;T*%bK@*b8-=N1Rr-#8r~AZpe?B8rq4Ulm+Ze;q!wtjXXwJ5NgZUXp)KSDJRv1<|WyCF2Q1GR? zA}aV{TS4cPCD7jET4l5&dppmW6!XtUlmJyAPqU}|y;a_>#t5RFY&gEVx!{r&aPcFi z3DN>kL(qw)LOPp=JyDuqoAH!!ff}_L7T0wr+3$%;%U9#vWZHts>-gj`9wa>`|H|q6 zmrysQZxsT$baX1u3oN9mpUTAdQ9ZJN`Yq#Dtm5V5!|=Gu-_FBa1)wYwpl{Ww0Jqx3WSmcH@c0Pf zP^Civ)`p#EJF%YfSzj=QB-^UTfvGu%Y>>?3``c65S&~Q>&Pf;87APGDkMUUF^>MAC zpBWTh@{N*;KF*@k-Zm^Y4D2MiiN=tZ7)%RVZv` zk2_!(t~9=YaSw?6#NtthtR0(Ld2pHg6yF;2d%~()t{JodPcr~WHSuYC_}W%00jVyT zL#u#8b;*M=h_oY4TJ`LyapH~&mal-KQDf|Yux#_;*;v)8Rz{%BA->@`E~gdZT(~)A zD2yaEVmG*L`i|kQeP>F{x$h`!!e>eBcEAXHkg&eDOZx%wHce+)nljmthPOS??0h$Q zX+Y)Yi9`>mfeb3^43|3Vw9}9)+@XR17y#DXZAccNmzq|a<1jm|q|*_y`E>wcRf%Ho z?9c;hr8>$Y#x2`TG9`3874UE@o#0wbfNutj2Fq-I&v`<@_c&X5#YE_z67;0N=Lr%u>*h6J#0s5F% z6ddo;e4X!#(&!G0?KCd}QQ7=lq8{>GGDIBF8tT*7@5`xhtEC+mH>gN(JEA7znS)lC zVTP8srg1*a3l}#>`?S*ocx(n@Dyer-a&*Ytwkr{x$)NgE{@gDAYUF2(oKgdzAu|SW z%+iq(Ug#_mUSX;1A@d>o=3TT0#?RwQWon6#f==?F1WGA&PXKeTxU&NGKc5p*Mr?hO zPqRcTh793H{QVi{0U^zKHRAL8=$049U`Q{`=DRk_)m2l@1FC4^%Z9%I8G1SubQ}KY z$Mm5zmqoP5SG&5*%;I7^0HNesLr*tdG1%3yqYY>7Io)uA*FbzIO_Wn$tZk#9rt-OH zW*f;`yJ2pG^CoU(x07M0sv+jYb7h-pu35$S<6y7DeU7=CJ*sNewqRMxGk;gb=H7VE zlFOL`K-#6;Vc#cj4bgVcCh3+E>XxScY9oV$m(|DyOOo7MaK6_jVLfR?-~mfQ^glh8tYN=HP-4D?IO?cp-}K0 zDe+JJhSW?>k2W+x>WG~A^pjx0eo*k84xlR*Pg;OJ?c3)*6@I@6wm!^w-1Qqq79DG> zZL^>Rzga^{KxRH2ux^p~cq^DegFcTp`FVO6uE=$fqi$#SUgSN2I%Jts}yDbmP# zd>M40qD>SY@H-Fz>riSnKZx&IEkEKfm|bXdGh5cM8PZCaBUfBD7WHdk-Q1MYCfx+3 zN}J4bn>~=GM#)72b5K7ltGOC?fMW%wSEX)rs5@}XN;|-jGhmho8k=80Q!GJUAtCgs z(eQ&hN8tEYzZ=MM6)sy%8kKdNgFB=|4fnv|LWFG*u&f0_p$E7}MFSf?9(0acjdAwY ziMx5K5sss?tsN`II9_v5tp%vi0wHQ?jx}D9wXb*bn+CSa-u6o>K62ZLKq)(G;}~fX zUw)7+9*MxR;GkzXM4r2F9sM!oh#c3?0?(M4b6h6{jrpstpQl+lm)-!q!sLOiIssyy z*O8d?`IHZbqMW4XitpoT8GwC6)W&Uh{l+-!HP$EH9!IlXv^q(r)%%xDwi{RaPsDm@ zRT|N{@<$nV=Mfj1IaA`Z(kCU`-HO|yDZvGNtawvsHL#jG8PS`*n`RkH5W}i>dWx6q z)yu?jmVr*Z`Op`~d}YimB9Z}wT2KQibWx$Ec*;WBExM$ARfS?AaT?o;QuWT+XZH35 zA*xp;IBiT&@k47g`J^^ zT2CWcw4*v#F@E_Q9f&bg^V}t4@;R!U^)@P$ecVg@(T)qoZ`+SmMbYlNv2xhClN$a) z+FUuXzrvMbcJ<4MjS*>*e)VAj@I0iFC};+6+ygW*-wE&$u1)h75wJ_Kk?+`6JUT@O z3r?^Tu8yB@Rf908+BII12smqI!zRq4uXnESnKeLl`Mr`9cFF^7kcaQW0=otRdVCMlY? zLe~TMAQ~#~_AO85Ug@`P;vST)*%vkqAPG#{i!=??K}262knaF2ES8ukMI5*AKbAOr zw+TltdLF4EtXE+&zXFd(9jt0; z5iP}4)1)Wtu!36~aT&)j%AH zqsUP7(2!mIdk8TT;Y>=YJD$uM#2H{awhNBEwaya}=(G|=T&;iRId9r8rgH0;9d@%d zNGsv&EUu0jA}R7b!2IF=v@gwx2I6juxax7Db_Lb~p+&j33r4+9uUB`(Gvdb{wK(VH zTrbUkk`L;yE~_=cJZK>&WKrt=DMjoomr!SoXf})IDM$l7weQuk!FWK5PE zr6H6=U+1)xi;kK(b_;;^6(bPA^lykRJs&Ga6j4M@AvcPj;*7LG3n=P0#LKxd=E)7r zaXJ$hWAv3I-)JNAHHH)04NP_d1bKs~;HOd6Xa>JxK52yLxBh6O1*(6C@FU@N<>J0 zOMfwTFLmRKFSMaZuTM@o#O}Zg)GKX-Jd}uW7GdzlSbwPwf?>3+-WGQQ>j?_Qpyj$S zS}74|zbm~=WK2b@yuzvvDS#)L1YRO4lq7#laU<>a?d*>9Ga_|C(~hHt&vkZ;rI3y7 z#o({=$DJ6qz6S?Y+rr;X(4Wdm+wQ#*m>uelV7*!i3db13QGbU7`UR~TMfr_1Zrs9j z5TQbCHK_z*h`pr=#S3 zq(iH8lHy}f+1mO`{QV4DO-MP21qz73cClIdrkx3FJ%%AZ2KIU$Qt_z)IZTr>{%$hI zQ)1;iocJz*5+AOlZZAyi_ZhHisu=ZEuSN|l#l+fHJcz{1NT~@p)%1%hf#`VXT0obM zUxi?-NNc+Mo$+cl3f$KtD%Uspd+q#grb=TrPC-TF9c0w25QPwH1ASl*^eg@Ldr$D4 zBny5EKd#~?jF5?Pu85M|DME<|J>j7=IrZ$)15vf*G4_l4me=WgYA*QW>adLvdZy7+ zhiF#Y?{xG{aiWKV zA{KD%_YiEbfJov`R7GhkE+PmOmImf{y@V(bNl<{7zR3Mu_FIJso9looP@{m?tyD18 ze)#Pces@{lNiw)*v(#uY9G^lB&9hlZ7eg_cam2nN+NXI9cIprccIj|aYZ6CgA&S5Q ztd&9l93PgzgXaOJ0kCz9r5=W$1<+0#pp>cj$@KH#s`w=GP<6$g1X~be2%C8b=%#iF zyHcrrw>i;XLotBfI`l-_P@n10D_oOz^qc;6dgC{jflq&e&0z89Aqc3IG6+16C8P#$ zQ09h%GS}b8V2o;$xnY2NXf^|Q2Ex}e)<^`ndcmW?lE#FL2mR&!NgSwxNoG~Ng2J&X zfi1|TM`}(|!t#}v^@Si2{;CZNj7b2)l$Mr+ak&!4O79cdNcdg07<>XszOIQ@h~6ZR zwkk1`I=fH`!EGLmssy(5ap<6*iqN@7u5<24$hfE0)2|Iw`vuV#=>QdgnaRKtgOyIY zFM$%e&+u|(TYvQ|$C|#5lQ448&)(4+&o$=>nbp2N4ca6sjt_`}h$-arEPdx6zvaLj z5duZ(9WAclcPg~qv@-(cr*L1^;&bnndA`HOuOOEB~sDRe2HVorxc0Ll~PVFAQ1(&X!|o6XA_;2 z4c8j5D%g$26Q(OD8a;HT$m=!GfxrI(ALO{hyrzDWY`;UVzih!cl(P5}wjzkrLPH%4 zy9*A~6hev`^9y!l#iO0}aZqkKy|!m1zV|1s%vL+mT1l{?Pm;!R@)5l%cI?O+m*(Cfi3s49$4tkVS83~ktc6P`QJz^CRM6|Z`BTwZAcI=cIa(yEM8 zV8(wIU$yi!9zYX+v$?G1k}>1%2PGVq92++HM^^1YKtl-;rjHo~JF4-BaiytC{+>X^ zA!7^QmmOc5nrA>!-qIG}txAJapSlad-RUH&sn#;)9!G(pFrnHm4`i5GfrK=>`H{B)w2LFM?S(!Xg z5IM$q_?1^*rynpcv%TK&{T8H5%c2UfQpJ5bF_v|<2?n(Qgx-*{(ZMPxvvz}s4?rHU z38jhA&DM>Wd1DvP+>928-U4e!;~+2}A=XXwgxHB@TWPlq?hLE_B1+?j@QfG`LPXP1 z4oYNq2Z4Ta+sOT+`R&Ed9>RF9R7fQYZ`7a)*1{1d9b5&tIUh0GpdPsTv#hBDjlJ=8 z01z=@aQc1;AoG%)#%ADUs2Vs*jq7Qw8HA>*H8G>V^KXI^Kvsgb?O1gKexCqMd^brR z(r+EAQ(GL>d5!LHQ~KFSsZlTuc;4U^0^5!4P@-7CHeQ&kMqip`>wADS#FeJ>dwaIz zLiG5pY+KQS0Vp5>W0L>_n|1MQ0tF%js`$Q<+@!w~f!8tgQA94R_%(D<1F@F3DzM_Z z6XBJhxfk?mW*;e~gE7d?*9ZW}%TuPrCp(nJp4WPg$CV=84MM@DyjS5){p%K79tH(K zjGKqNAv7<7fDmNt7%vpkIikeNwLl@m+^1?fb!I~v?X_a$eKL(ry2@B`!XnOgr%Jbm z*obt5qC~{Abx-@Y3FZlw#&o42Ejv&<@hzx9&B-wNBy16BUHR0cxy5|L!wza%;O)nu zqbu$TctVnDMFt(zze!Z%<8BX*!pJj^gSVZ38=&a5K@m+BgGaw__bRPCMwv`Sj|YZsl+*;|>jb%N*#1)NNjnY|xrCS>@QWf03yc#16p#iE%)nT= zQqW!;Iu)Nftw9;3HG&dRsrDm&hZZ}E8TZoOm@eKPBW?N-0|T6s6+k3QH%~HgWos%n z=T6^`<4SF{-#leeoOO4hCzn~IE&nn@PML{K=_`aJcFJZvFR&<`wY)6PV}4=ZtE=Qi z8jlkpE4m~Zb552LL}`Jbz+H;z>_8N}ZL14?|egY>WY zcO7zhg&b46VflD5)z!UK2ck}%^VKx{F!Y29E*dor2}!D}yJ|lVm<#c5#xeKhcx7{X zGZP#&&l%w&iN1)TX{)N(-+4=w;fMn}R1qqqRih9#8<_+)?R zNKXA%LlQ}tt48x?4C+^v>GVK|D;RuM@GQ?mJ7s1(6kaMp={bpHRe2QW3AUer`(0E{ zG)(m|EDm@2g&|xcz7WBp4n)sV2#@WONO7Q$mY`!E9d1Y}Oz zwC{J*KC4*4*gECk=W9VB>hOf#p%l_&HQmBzn3of`%}KdhuRAoTV|~wVxhBqZq@(ot z7XgVeBrsb0?5qyru~!l4`XqSd7{Zya@mP%>Q*zjyyFxnimi7mE#6IF9U+uWsxoXD} zsV~i3EX>9}h|F@!$vTT`zsJ=YfA)exMd+vz0asSMnM|hHqLeDA^T<@8r&r?WMA>(ngp+5v7E~{1w#~A(1N(T2GGKQ@HLnx9AEQiXxJd;3; zHH}B<{plp!kVYkfLZ)O}ZHP2PzWG;|l9%h-59TYKew$AD&Z1h(l$0|b)Wv;u8XJLi zil5}0@+hU{;z&FI0NTxdfW%4S}7~)`+ z9f>w)4S-)Nxi@TyDqq61+!(w^V<95tzK8X&$M$6#U{9;{Clh6yPS@bx!0(=lYVbs=d}nyx2V7T z3)irKkm=I{L5OhCjwl0L&637l4<6GT&^$7F#0jq3LTf&Xw&UPItp*U)#9kWD@I|k_ zSg+I8F{s<9(F}it>+4~o9&8OE@bn0s;14R`XMV?jLr={>qzl151|Ry5ur zt3i|nK7Pk-5W7Luj?Gik5YzaD18&Ky0YoP2?2ZFZdnEfTwKNhxw50`WVG8vRolo z%e8Vtd_xKdgl2;pe}e>}*`}QRDkA<#wf_2pbsn-B@6dMo>v07#7NM_WiP@9 zG;qutAi6Eam07`^oyv*YL)0}r7<$4BeBBj31fwu5DeQ)hAu{{UfjG)I+6V_K>;=;W zY(AMi-6W49&!4wFF8WKl`WyySXq(&0n$PjfmjbIqi8%mq>o=cL=A*M>D2ar`zcgs$ zXJMnL{n`P<92B^PJZ)Bo#4DYmP3*X&&Ip;&X3oF~B^C!PjMj+f98LMR0PB(frXG+_ z8!ZthJX*{q^)Jh*^e9Hn8@tL+ZG$4HVDNc-(Tl3%KZuX+f)U*(lkgFwEL-vzY#sb>wxuu@Krh?YT*IU0-? zP!OI&2lO>O#4(IjurK&9?G{<)TuVlD%RZNqm3<_E3V2w@0NYFA+aS|CLt7tAx9$P` z%rgyN%K6SpZyq=<*~_WMYCmy7b8tdjhfhL-#+X;Y763zy#AKITrS3-y_zQeQ`JJY7 z6&jYpT{eoHbrhaj3XpIBS)9SGAo;3=2EpYp7dO637-2%G75NZn7q|rLc}Rt@X~#w{ zVl~B}|CMBt4N&^ur)MVB4H$^CDoUkB^=Vi#rykQuORcRE zdLS8kV8aRk$;tAxafEgc-X|(|IL^QrXzc{?Os_Ze;C_+=>L1!E8{XDdqnn* zPvE#k4&ZcL4&x7e9hCj}H-?^_xNu-%{P2|r_wOG&fU|A5X-xLvxg9u}7~8i8bpo}n zI}{>W*96rKiox>H^GDFG36=&*cUAGx;sq1q=LH`LcXT{+sNUzm>m}pN1Ljk$Yiy`=HV%px7UmLoml9auhaq zpWH9sk_Y6i@)r3C`AK=3{GR->yj>m?4;%lsd`CX*`rS!xnw#zh+zk0=dCkpqC%akh z6gh@$aJDrTj++}BDdI`&H{p)D``rER0rwX7R`(O`ZSE)CgYNCfh2P=c>3+&RB+trk%X9L(@>%(m{Eqxb z`3?DF_b&Ht`6Kyv?mhB|d)WQ7d$0Q$`JlXC9+RJQkGS`_N8S6~2i(uP54sPz$K21k z$KB7n5BDEEuxG`JD^^&&X;rL8Vm%t`OZ%_bKeprW!2|tcR`*?T_u=vT#{0&!>c8UP zu7d~0@9iJ6df>_(dk*h7y8oVi;|~n%sN2)8+<9Lq8 zfoE)@e@jF-9uaOagyULG-%>q2eY|S+Z;51#Tiv(CAdYJ_aCJ?{z^=MI{pt$9^j%eR z#??C*EREP1yRwskt@X15yX$t(*1N|J_w2@@Z`;J4eLKhd_Gs0=EpoCaa1(*r9_*CJrAww0pd@ z<-o4i_<>#hH$>(SM&@rY<_~H$^M>6=59}H{e02Z5v7-|+59VimHyI6wjfR^tv@;H8 zCw(^=4Tr6|*`7M0)xgcQ=mw6|?HRXZ0A@^NCw;dVm=4bu4M%5p+df@dng#-6z?Kfuax76*v+l|+^ zYBl}#%66x}wQBb6J9uE%kr_8vh!e`pPYK z-^#13Uaj$C<(Abe?R<1itk+t-CSG3?udj*l)@Z9uYwUdI0Xx4^F|Jy( zVzlobM38;sJv{UtIW)F&yl2P0qj&f29v?eA(Z6%g*nS`$*njlMo*iTR4jh~qCx8(o t8VO##>wP(K0`g0E~zk>Bwmc8%!{|CJg-DUs) literal 0 HcmV?d00001 diff --git a/fonts/EnterCommand.ttf b/fonts/EnterCommand.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06a714964a715fe4273c1fe1f592fa389e519e31 GIT binary patch literal 40056 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 literal 0 HcmV?d00001 diff --git a/fonts/dialog_default_font.tres b/fonts/dialog_default_font.tres new file mode 100644 index 0000000..835c837 --- /dev/null +++ b/fonts/dialog_default_font.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://fonts/EnterCommand.ttf" type="DynamicFontData" id=1] + +[resource] +outline_color = Color( 0, 0, 0, 1 ) +font_data = ExtResource( 1 ) diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c98fbb601c83c81ec8c22b1dba7d1d57c62b323c GIT binary patch literal 3305 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 literal 0 HcmV?d00001 diff --git a/icon.png.import b/icon.png.import new file mode 100644 index 0000000..96cbf46 --- /dev/null +++ b/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/images/Ely_Sitting.png b/images/Ely_Sitting.png new file mode 100644 index 0000000000000000000000000000000000000000..51f3556393fe93384d974aa91e085edb0b2f348b GIT binary patch literal 42796 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�~e%~E?q}|_^ddRU57ys#RJEkdx z+xg}?6S!Q8=Xk}H4JJ0wNuMW8cOsi$GKE$Lc5fJ5(MK8f(1)a{3Ymv+O1 zC@DFLp&GoUBK$3Lua=~qHAgvjX?Rg;20L`(?hb&ghLy+q=u6osGY6|!bN4oYnbV>5 zwHJ;=jmr|c9EOol~nnJDPaVobaz?XUWP~*%ZB~iK~aDzPC1t1QW zv*_5ade)xArb&m^o}}@xWq4kGcj3p&3$qAJgJ|ZrLJIY=_3y>!zhMqup~7=d(|}r- zssH~=HIks~{}!dtJ?#sP6T9_=N@&4J%GVih*w#vVJa z_HfdcE70X(nS>&%bU15}m2~^LfI_W5f{e{ag5=sEm@ADmSXTUE>zS)=1HO<_pcR>~ zF|Or&T}7A}`rv;rHD1L3EY)BisNS%6D9YoF;TL2PV+TIy39=}>Oz7Bd%j(BbSGlLV zBabvTPM@ zix*QA6-Uw=Ag*?9F&V&dMW1W`thAPq_8`W$at<^^vd!1{IuPYd#kfO}Hg}0$5hl{g zMnw^map41^p{-doAVU*<$F?tDg=w@T$1^I15QI%uUAi(keK3ELs+MRSBguam7)FjY zBvnRio;87Mv*M|)7m!nuVaelw>{r^nr)6WUx=OAq$n9I;)cm_TyVO!PPJC{im#H{V zBS%R}iv}>SDApb+G}^4=+5>eNV~TG)@c!#1MKOIw^38hi0=7&ftYpkci(zK>8$H#d zzI}hn6DH(DJV9HXtW(EQBEC-P%4!WvQFmKMjfF;aTG?@%2u|? zIyyqCV=Tuy7?OP%%P^b1et|8;;Ysuhx04jj)i}I zwWRf|cGv*_cgLDI#pTX#>-e9tD&^w3UVtvv9w98;1gsxCuZ&r254=Ov_S@rKi^cqk{!61LGC0TkSV>61NBgxAQ?J7IYO?rMxrHH#zMCr* zbmXxqdtqX$tn56O2o^U=({MjN+uJQ}d^?^LwH|Qi>geJE!X-3sm>Zei2}TO`tUVFOjk2l$Id%~o$6 zw-nw{Br?(d-F#}ot)zErlU}M~nSE{p)BUJ|Lsjd9%aBsDTxnfUPfC4`l9>pI|&UOefo+!jSaZxkiR1Zj8m$DCpi|?vmeq3I=1=FZU3)wUi&~$Cc z$V2JXSz?qzg0q$LTqYP{+iGJkY<(G5?#m3yg&kIG|u

c5rgOhVEthh6M1_$m#io` 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 B1#kcW literal 0 HcmV?d00001 diff --git a/images/herbert_SecondStep.png.import b/images/herbert_SecondStep.png.import new file mode 100644 index 0000000..e6d92a8 --- /dev/null +++ b/images/herbert_SecondStep.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/herbert_SecondStep.png-1332d5d8cb46f9541e74db53006229b2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/herbert_SecondStep.png" +dest_files=[ "res://.import/herbert_SecondStep.png-1332d5d8cb46f9541e74db53006229b2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/images/menu.png b/images/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..497d2ce873070fb6e16f278b93d1408fb2aa1502 GIT binary patch literal 1232 zcmchX|2q?S0LMQY%UFAiJnYt%bk~!*`4V|_G&D?fX$_f^$mPgdsU5nJmT^%2J+z;>9>v{bH?<}&v57G!@1OPz#9`T}V zTDH0K@GYA>1eF$S3c{fH5J62hb_xLfY+tX#fmce@qg_Si_FKJAJbk3oMKQ@aX2;e$ z3PjaU_7DUeR=BYCoo5kNSV&y#wKc$UHUUi}@E!wU(ey#h{}|fB)u)#pTqDE}i+kQR z(hJ@9$)2ZRJA>;cvUN4ux`~^=?0xQ0;kUSx@= z$3vOyH#7oW&#kx`LR_&Ga>B|>wR5#Wnx>(jsox8$&|qrU03|?l{GCCxRB?x3JfE+ zI90X$Fmu5x2pr&VZH}v-eTjnBXK!H)jq21`eEicq?DVj#h#gf5{k$tO^{(x#&xAJbrj-d&-`O z22{sbo*en|bzEZ16mffXT=4c2a1vJqC$9$G4H6!_FPz_jFWw-&6p-L91g-07ge;a| z3p>OQhDL-e7BG^slL_OA8Hhh-og2G(1M6v&o0_Izblv<+g9cQoT4FK|Hsbsw4!Svf zs;jTMOOf)t`k99$eWH~BE&0XLFjka-?m;E~t|hNqt&et(cCB%*zcsTK@08m42Zva^ z5h>x5PJg$yJ)|$~eJvF*yf0ibXbx#LVMmQGA?a1H_o{`tq>Vc8U`L@#+;IvHepZkR z8q&FvzTPC@2lujk0!DJ&ogK(4Jp=lYOTS%36gqiKwUiCrAMylv=EXeCYDGeIk6s4} zHWL}GWcAmFXQ}Qev(xP^=%GAO>mPpNA#!>n#IVWpYO(kjxIh^eOX;7L*eHlgsKk`+ z2xGD;`&=r%fmpl5kP)&>nCo!zNk%CD^ZzWhp$fV2{9H+W2nKtEL{*J+2hD1s_T+l;2Db>*vIC)4Hi!V15c9RiPa;Ce8WQ*!rtE%{4HmPO1u_R ziJgA`nj}BtO`bTMRcQpm)f>+r1>tRYMbS$N3+O}8cB-s)E|r6$Yxjyy%{svsK}3`* zc7kxh$*CiK#2c^UMG>XozeqN`f{GYsqWo~IwNjLV-G4unw@L}2wcACs7S+SL7;dMa zcC9WVqAfU!4+jhO;2;;R=I9Co8lve5NO-s?QleSVgp}R_6V(twnBZPTtiW&IBvjY0 z{1W3bC_dmjmxdf71rROEFR81p648uhh-!;hWF`}_wzwez<}Rd+iF5{_^pXigxjY-u zWQGi(IWt8ssO9VrI67h57hTq<4o4>UCFWl!gLT78MDg7hY4_U5Kj+9H8s9!XOrp1> zsT~$-`yE0U<*QmW9iieqWPE`O9}EbLJim_2jB&q%-R z6H-Q1FiEqPB$$uj9&N;U5m;%n^bo%YqQt#M=JLmtg6()ya5 z3NLeT8+pLiU^#YDKL4n`thiddFGuloSIo|+5-Lqmc&GD${lUu>!&(JVNqe%3_@L*0 zlxKE+4YqfFVCsJMKu3%gjF)3yDM~3ZQrmDf=23&ux{eQ%5cCjeRJ4Y@WmYZZbAYlO(l$ro@Z!7@4OY zXo=}g5q{fCw(ZI8y}Ox3MDzAUmqBZlUdPlKhOICMdsC!`nY9Xvl)QBjK?&(s6llm~ z;^@2U7r$5>6Y*9qgwQF=NZ(JpoZf$?F&;x;aXm_B`3UNYmWL1CZEtZScYl%o6qN}*$;kK6#Sw=<%_vebe`y@+cmR$d1EOx zqxU93@5#_iN_-4D)ajQrd>mzO8?D)Jn^e_wDrd-rz-;-mVBjhDb< z7dMXYsGMZ~d#cvcM7A7%+St+d(%DS+?qO2Z(>U)5Q%$7ez9(w`Vs8A^GzL9t32Q4! z@-5qX#ZE(E?((wIvn@?Z58OK!aiX}UbQ8{#Gpc9iu(}qNan%BrbA9@i&Jo~@lfkK% zBM(;EJk8~|BVPO?TO6hNr4xjhy*}0O<(RdY?uc5lQK?+XwtR@qQXDW$Ih8I-xk@hX zP@v6?3r&s?h7F--ys9yvmn`9rDC?dRzr+Pd>~e{xrfE0V+SMx1NMI>GCz(Ia3g{{I zQoisAd6bPl>=dK87h7Ozy?Kk-FC-Czjt#jZBh`G&DBl07y_=)zMd@s@A_C2#d@gN7 z^ee;p``Fq0w5SobWAiD#YlqpA?aBKGt;OSa@_pkosd=|5=j*(Bf6l0w(~;g)^hW+u z(miz8@0p4DME89!7PIm7DWR4;j+}f;T?i`>P4_=+N4(L0r2m`0mqvt*!CUTNb179- zhZ|kSw$>S`)Z)MILF+Cds{*2Xd{EK}2ha1~x~s2U_^Tz{ z%`gpJjy*Q?&hh#ABThKGW$)k5gpJ?bSX%q1;=?81cZB(LRm#qC2w}rje3SDYv2`%$ zXTd$OXG;#I{obj1Mk4`7kpH3#>{xjHVGxeH?k`hik=fOLg6zc^0GG%~Vy=N#vNj*) zi^Gki28RETQtQFs2WHdY7)nbv`=bC7v3|ir0h0wdjvzE9L__Vd9r!eP;7YJ`(a$mMMUx#R_T>U&~<)gbtSv>F409(&7?tly+0s@t~cdIO@{w zBJvMOQ4)E0BtAfwC%_}0=EzUh2=XD7g&}6DLx{F|M1p>Zr9ca@o*T!*mRym~{kA3(YUNO1=L1wlJ_|3+B;ZZnJ3|wRBT!2! zw+kGBknJM4pWuDb0*0GEWQ&TOo7BUvX{ts0p!^@sNH*rRW{HaeETNzb6Gq9qh}SWT zJ2*;z93xLd zI=0PCf}X}oa$7Dn*;CPgYh25>!1>iyoKn4wB>uw9EwG(;C97V@i&}%F(9fuVZ?Ic| zX)*Eh^utM?;oigwkWF&LEj#klI2QiszQCtrl+&sR`i(LuF1Sw^P%-F7x8erE zvwsxEIKG7Wj(Hla!1U;5Zs7No1PY>-Q~qqBk9p&ZO>R7+2+uD8+UqpK-Ph;C)6n?h{q#EBGwDJ|?AT{K;c~-S!-bJ=?6?l`x_QGLkzl6ex_= z|I})Zry}jZ@wpU+fM&_tie_Uze0N2c{m{f{^Mj%$b0^YDHq+$5aQVUYnWYAy4{K^A z?{&PiJ`rr<(|_Q^{BwTEE_;=tN(|uz)sDPF*9 zKJN$}tnBvRi#GPN`NKNr(GvWU)Q>Akl^B%hu|2MDA-aEmX`i_1bWZ$0BYo|~M0Tlx zq+%I2Kj=-BVuupnDn3gYUk*l+sBV~Cf5%_DZ)~;)I1yVo=ZIDx-b>!|7-y{=2tjE5 z^5%y@Vkpw>sd{~mW6)^4K|C$u#wQkK8amH4;6^X~=hd6FzGz8#f@_X<1^*=1tr`E8#l4K7VL1~doIFPAjnwX zX+Ccv%}$9PDqZSd_f#e&aVdD!XrTsXp7vu#5#igi185;Sh|3A z*|jMLQOb244Nq0yoFshm_=E=e;A^ZF?orYrnOzr4ebl)Iqr}A^k3J4~t!BHMGG@=E zRTV!-4nA4U?$rILwTPvD>6BJ@8EZIoJJCJKO%r|TJI?oh8!FzVOj|S}25(kTuYhQ# z8m8t`t;tP`rc1r2@)uLX-%;Vav0L+;@Nm}Af|D24{tYJ3Bq^Z|-TEH*vG-WdX`Nf9 ztkHc)_48Zq(}4^0_18Jdut@-ts#`@<=Dq9HEYRTQy`R(*ls)wuCK;@`L--?ftXd|= zf73hSYg)^#-w^Fd2mop6pE;}9qkPX5wJO#fcAbXUDPVJW(d~;i)>e8mdcPeC@HJs> znMT=Z9KL2ON3)+DbTILFU}uO%?pz$4r&_|i{6_~LULqeT4VdlR$kJUe5JUM5r!VCt zPio#NJa|^lUw4om0@eY*Zt!rjZ_o_+tB7 zamtrw!-XwRK$I{66sRSGgB+9-)dNspLnI7N=|gqnaB?gOkfdFyKT)31!BHAk>L>Nrk#=9G;Bdwng@9YMe}I*%htluDSM4)~{= z#ed9>Dd4voFjpOdcZ^WX)tPUdG4Rah#*t@JiRh{{4Ic+VFW9VQw&PgEF~od^>DBQg zWy_z)GJ2Fi)A^261Xsg|5Xy%2lPD7gN(l~*;Jp>~0W$znNsp+^W?=A`Tf>#FU4BWG zfih^^NfIG7n+X757&sK!c%@ee;~olEbz=I;5YYCri8Ngj!pzQ4@DXD_;(GClqznST zoQMc-5>8&O;|u)W>B|=>(9n^M$|kFKBgz{dJ;kyXoJ5CXhi0gLhgpFy3EIbfAhqn7 z`@WMksV9GI_?`*l?O#xemtSE|MgM z%hRl*GV>6vdK2OyLpsEUjn*cnLLmtA}L79M(RXq_d=I93~%#=sqOBacob%x{C95@&5I(!C zhVIF2{EXr?gcb_ewBU{yN8w#k-`Wdg#nTpCkL8B*oLfXGvTD6XFcDg%zCA92aJU5M z+a5AwEzY}}FWEMPuU+(=SQFbDesA-4pmsg!1pdI?1e#vC5@}Bm?rb@c`G5Qkjy#{) zrG~9szn*iB9EH2~IGF|4-YzbGDO*q0Om$SvzN>i~C7gx({5T}*RlQcA<%ml32T-Ee zg>IZu7Y&AKCpZDG?8FEcfm#}efwdR*4T>`BZ;gHdAJzAtk7~`ELmvQ_x+TK|MoE(y zO=c7w(sa%YYQ02H?Q3sdNqKpV)%?La-07K|JCfXp`%15F)uAH7p`MYuBU)~~&g4x8 z43G#e53Se5adBm7P6c=81JjvdlB|xi_}~_Ci%|I69xB76-{V%jSc+?oJ>cQKpq?{2 z44sXR8#g}R81=`K82XnxL*nK~JL$f3DWgea>v$zX?Puk(^GtgYhI3~Ncg75Rb9)?+4^iDkwGzX!2@Taq5 zM_W(ar&&Z|MyijEqOCaQ58IpgFulq^*6j5eKd(Llx*5%*RYDZ0xX~AE@glSYP;>@} zVlVrZfH+>peeIPco`xqxuSL;qJ+KLbi?Ou|{j@~e7yf0$~_V{Ig46^;5-bL2}@r)aN9+`1)0d$K~yT^kCOW7UCHgQ~d zN5fwSNL5ljBQctn=}kRBbNM6wg`5h2oW^YTv-SoHdV-xPUR(Z!YP&>JTyNVeZ~}sN zipzGXJmIm*zkn;NWq1t+GQz6jk)OHGbqD{|eE4e>sjBW&sJ)v~@)L@1*81O2yXm?9 zfexe3gH5Nl`Env`Ud;P#YTom{yK#kk?|uHV{$F5u_!AhV|FURpyneA}99||$nQ_(` z96{LjCc)y!>zWoH%Ca&bj?Phqo3HN6;!F}@XKVWazi`PCFUD1U0Dw+rGI?P5!<8D(`LCSeQFnHM2?PLEWiS+guC#aoXB1VyoD#9^|*#fWvWvQh%`7x-BNaC$C zatiG92g->3rKk=#`_!5ec`7R{-Y_ldINrqR*xaj#rm{?e*&$! zWeJY20~$dD#Q>gC3aV_(L2973BEs}~U}Ok;;ejsT00>6@S}OqVHZYskhi2%(g(Fsl z$=vHW>2?Sa&|)@wAcB|26xl1|QApT<;?cphrSW$0 ztUmx~M>HEC;HR(;1G@}0RQ%?EsU-~Z6lk|7Ka>YU1zP9M2hPH1^vg)4k8by+c z%7;|ksc7BS2LdLH6z9UI$nA%)*76~JI4tyLsh9M3H0MI4E}mwc>z35TTET@k33~7j z@EI7T{@B*;ATr}#bXhfYR(!o*{q(&;o{LeGfgj_2Mr2y%h%?z^N_wa9b?phlK6G=$ zD2{#vz$B1^bV+8}az}|UgwsQrMO%k}7nZob1i)Ir(`rHkKv&&2mkN*DeUrO&1@)pw zyo11t0dU|$zd}C<+Y}^CL_5zlBbm?#DLUt<{q;G$zsvhw*lg`EaUVl>U>PpBOpopIsTI1X!z z2k%CHk?Oxgca1e3zDG2xB~u!1p~0P$GfK=BKsH5bZ1>1LqI=xe(gPJMeneZnNj@?t zE@9FZx~Z-pAuAL=Z-TL< zo&?NA22Dw(vau|MMUR=1rDB3F!9M+sZY8*)kAqpmYA&wR0)ko1G*BSu3WhxlL=a)1 z3BM;Z`uOH;NenP`1U3Nx>HQSID@OoJ4K)Ld8?;tqky+}WqUfVolv(Gh9kWF#>fjeH z@jd=@N-<^50K5LDui;mYMCNL~JsLo;hF|kx)s465c|_Ux@nn}ZtQBI#ZG4-ew!lHy zmkOmSq!OPu^LB$}5kXXs%D3k;71a(8kqK1rTA3@47@Ge%e>b+N*D?PmkMI?17O34G z^b}#-u&hIRN5)}gR5f2(Uv%xt(4()yeVs#<*< zxAC~yOfc-yLj$k9DANG9gZqaPdcZ|%^4^!i+*&X)Owv2bn4-|59|AeH1a8!Yp z6Hiss`F?_x{1a9*4_q$z!gh^{7gN72^FX-mqg`$eB+0Fx$9?#&PcXJ$y(Ewj4mvl; zl(ePgN_P7=bB>*oxcQ60OoLl(O}A)D=DpsNQU3xaoYGaY`+f9%jOSeXMU{Zm`L{0S zMu2{NUd$6Mxw^BNUBDjtbF`M?B>fw54fow6ZBqDRYTwXfWFsz348A>uj?<6t5)#{o zme@D;3^WT5`!iS0F1a){$>~nK1u~imdK;;gMp-#;z9mYY{=NB>`nfdl^XiGQGJ)-0 z%YJ`$e}~6n@lTgWm%e&BJg^((0>3OG%>!0{NlPVDb_>m3U14uMb!iQr4ulT$A;@E^F zu1*oJ7V2dBy&MUUv%tDTIeqO%iSA#@Cx9A$5eGGd?Q(~>6X2*7j#i|rxnwk!x}1+$ ziYV9vJYHYkj3`J6#iN19$!jic3e-}!2|{zN1poW{T466SH)$LpY|9;n zN+Any1mKmHGkt93!~hIGA!T&q&%=wu6&}k=yD!t31A}97C62*W?9I|f6rb)9-{p6Z z7drJ)lcT`(u-)30*@tV#SEbBoC8MYt$8mv;UD0tKTOuzo)uof{Q7Rst91<#oP#op# zT70~?)6PRXK%~PO-uY+2o|_5bJ*te&!oZ+vJl90Ky=uT%%D{eu&sDRli9pYn$gmv{RZ^N2g&3Lm!!}GMc{mh z6d7!VXcGRAZHS1N`y2)ZV+9BcUBK}dr_Py;m<;JvIG?P`lS5d+Q(V`?OqNo~X#F4Q zpC^+umH6i}=pUUdLC<+-kY_i#24mN()4^ki0B`bFM@bAG$ptIPb{`wlj+I@Vr1rVA z;1Ddiv2B-k?r5F(y*^hn;V7S8dK&gYj5CqoSYe{Bf)@F6$jSEGdJu zR!;>D$=yARox~p(cyP4zK2uwxPg6@=l1=&zm2J0hH68f^)^Xn3^!4l_GuCOAD0VcD zA=!o=G8!_pVIz{#IVGiF<&AOD2JKPwF(-M6H+-=;**G!iX?g!PAl;~-CeqTthG1UiPdH=*y<^qv#v|XT_B&#neEX zuedw2?V|0@k$GAl-!)2V33f)GgP5nN&6L2YrrnAQn$GnEBalkB*Rul5C_}HLf}FRr z!L6C(Zw4J)b`hQn0KWN2Aa2Jf;p|!yYg1+)=w^L0Jy^)Hw+oZGB~G~+Y__GVsd{!z z?C7c;D@0Q|Oz$189Xr&bHw}K>J2~NMTng6&4;yZ>s$EC?dh|0Z?Yptc6LRsxhLP?H zYs`HoUqZS$(fv_j*PEUX-?}3DY&gp1KKy0dDCOf{&wdL13kH=A_Pl8MTjos79U|*t z#n(9**Ox|OOFHok0yjxt1g?Gv6O4!KIY%bozS`nwZQ6|yv6QKxVKy<+t4Aq*^>K2Q zZP_1mg9*u$IKV;@!RB&pem-Ur+c@s#x#Gr->WHEn}qFzLTw z@HXA-eir?fIC!=1xWnxoyYy3IwcT^iG`G`}x-xl2vG z?=XUg{CvWc4jj5oUT3gLgg>C{FR|zmjC|R{Af*^X|Q1!cohaJ8r)a1iyn$w~xtc zpH$!-BarswKs*GT`IQ+%|9Rz9<|(b|+q@qI?_mM7ZJJPVE!t+nRUEtE$06zU611;L zlqdT!$I3>W0OVdwhw)Gg4FK+fAJpT~t_?pSCFP7VqJ)1Uqp&nVm2+j$JSrwkJU#C- z#0D#QDJu|JgBFK0PUFKSrL%~P7uB=JoHZbB*^_EY;Aa#j08BF(8prSoA?_sj8Hm7B zP^cO~U`ybles7H^#cW08Py>(Wwrn~|6mgaz#W9*kl^kw z>Zk7Dz`AYdAiUJHV))PizZof(ITKWSs-PZ)d+$Xo!ogP1_8>RdWKdl0oe^T*;2|ae z!2T-4CmX*i$(@AmOS7h7PsB2@uoa?w%ulv0`0ClT9FfUY3%JOwKMR&FVnox;ALrEr z{N*+fyL}pJJlue4_~u5oeiVF`iMP*xvln$-R?~ZR?~vA9zPCB8GND zC=`bH`b*3LIl1I-Cp)#~(!4}n2X$bg={V2BjD1FC-COgSyCi5%(}_0C!OALmZiw|> zMXB=J1#3^<;%v|7-y`C+00NCm&hCsdcw6wph+lM5ROXjYI_EvZjuQ1_VLV^SN8|zB>>-QI*Q&0w1^0vezbYuBXPq?2w8C#a80ri302f& z6Vh4;POY^c5VJUNQhE^|ZkFo~kWXsU7S-cc?M@%tK*YKw+;w6q>3|nP#OYqf*KRS& zRrNRp2@^X*gga*ftk9bu1vcDUJsSDK`%KbY+FI*0zoZxoFX}Byf#A$n0#z_v20azm zR8t8q&n>cT-{#DhKywbR!6@;EkXO=t(UkXMq1oe$MGmNQllNSbAli31Hq7|*19dM& zs_#8@$VHw1M8GC)0GV-Z^`OewtDBCbNcx5KO*6X4S}HdujEG@JpF%wSW>2H|(8j_y z1hleooJag3Zro({M6Q}-I|a!KBJuimN&i?Ca<+TAlVlDHNN zOWB?p4ClL?;MQ;NxV3uU9Qh7x)w{N>OUZ8abHX3iog*1{E8&ycRYF(rW2wJ>8oTxL z%udsma&FqkIEd^D#>f4Je%yNNf>P?%T^xL2`*K*0smH&cFQNVw{8NgX)>tS-yY71-rXnmZ~+E>~vuXBaUT{34Y+811eH(Q@^x^N(}ipGZ|) zK;qjv@1I~Zo%ZtZeQUw&um4lt%aAKt|2tHj7dwCs9Pd2D!@pPm-|+9}KcjdAkf*2d zF01(Nb94;UFPa3rE-2GMJKnLD(6eCP!SsJ$6I5}~bEx;Md(_cc+!dT9h{F&w6oBPd zJ?leK$mt5$cc7NLVAnu70a+#hvV$52;h`zcS4Ff8y+MZK=Vf8SeLU{}OK;2|m@KL% zqtu0`5vI0RX*xWHhrsaIo9yNNg}zG-@cSpH!gA9JtZZzjIE`fL*m4%+c#|7v6$K<{ zV%~<(xp8(202U;NhQtmLP>Y`@s2yW+Jog>}sk<&mlR@YSp!9@SvY2_AJF*ovWtxq3{fWfYfY>1U!lfz5siXB?N$QZ2BQ>f@q6; zB#?x0D^V-|`IDwKsKs-NPgB1s3_%Lxi{}ZIL;A@qzpNsZ)@315}+E7Jv;Q+hF0v|*O7=gkm z0KtI}gx(u|D=jPWCYXjyLE3|v@r4l5ty%*qqQxoG*!Lc-{yKKn=+!)kxQXcIk%tO8 z#m&oDYFE^~4eQ&JjeXvu5Sq|&7+;^Rp_$sK$sw+K$=f4kX`Y)735*VE7Dn{nU@2u4 ztwe&UgjaZgk5ezSK}A3kNFS(9U$Y1g=L)`NQo{3a#{sl9{mR-jj`D}!(^!y1n`!G^ zR^g51*^^(Bcggw=YK|hKcjJIKcJ6-seY;v>4je)vcP;y$@u9;Wf|Bc6!0S@;W(!jo z3KAz5uc3<0_87J7uF4hiYLg?4-#ZGIjb=FXD0XLeivPFqzOO$jgp-(z4 z^Ot@({0@@$rqe$0*xXdw=g|*W*)zNU>@TKXXixqV@>rIL@P7e0zI%dU)^DEPDxSPX znR2F~c0)9&>Q>7S0D``DZuH$|ZLpA`w8#R9n~Qw=PO6@ppoew#Y2NR7eXq?i?Sk)= z!kO9x`JkV=e+bH&#CzI-ZtzC8u`tHR*zAO$6YYJ4(i#j_8HO5l^SIg1B@+SViW@2G z+uMbCS&DIGw+pPI9~7MYSVA@VSW;j_o0~j2ukP^p?JWAwqlNXe%4zSoN7^8NrOqX* z&>Gh%qv(#$iN)zT#~joHdSU{lVuCIcZcykt7nz(!`Y_1bCSC4WMX=CP5h0 z=nr)W%O;)z*Q;om#KXEYf=jiq4AV)3u|dHE-Vvlm+C`HXjZ_L3GCe0!SmIT-4^*8B zSR%_KfG@c!TdIJ$sfw~lxhg44u>B{z`B&u;+Sk!|9PSqGG+9jZtLgNVHOgkn{{$Rh zH~Y|gUrt{m_nO?>8xWrx;X+~x2(7&MIc$|*Ih=zZ{vR+pQwfK^^i>|=}<~5$BfS6v=EAiGRs=fwKL`b4M+yj9m4!mgbms_-WKS(y+NTB2#{C^AOy*zo?lmuK6TgP(9XFc?ya^BEp^sA;Bx7qfDq-@SfpGgJ zw(EfF=j)ZYn$(eu_k!o7KmmGZ44IXe`U-KmFw9)ZP*(UCV{{*b3NoZuIDtIYgpZa} z#QVDkgbKX7NsPb$?g60$OWiO%pU%>arCo#;eRwA2GRT%ESc;g(pdlruZ)PQBDo7`F zGdN6jn3vc|Q}m`zV;o|-es#%~L4wXTymXW}UWyew9@iaDLSh%5jdCXUe+Pnq)0Jw1jA;41 z(gw%90ewv(o;TB``yqP2Cbvj{COeagvuJ4eanF8OI459cpl?o*!P8rRiJBkF3$zIX z+@;=RhB;1RX^~TZ0FqfurL8>c__BDS;Ag-43M+Y(vf$Dnx1h{W?T&ZRsNZ->RJ+U%ER z%Lk|TnRAOsIi2IyaU4SAp`w{IM#ouL1l05bQlH$q*1_R`v0I?OQFm0g*ToU`Wr42lvOc=Dr7ISl2D?yuNw^(wJjZho)h zmnJOp`ckUw8^mKN`JdUzq(63P>%M;*94s$gs)R)i7fn40Q6*_Q#sVW zE7v4W(5B7K`ensz`*HPMpSd5-kE@p$k=L&rAu-C84weZd>r4{w4fO28D8hWO%5j{9 zwbbp7>XZn=t%ufi%Y#k?OFiEV3og%vCtmDMwy8KG9BV}5)pNC?F&^e2kKykG)vw7< z{kjUS(uSZ;cE^E?A?IODe$(nTuH$YObrX@@F+q9SNtU>)qvx7sV#qnKH_T@J0krCe zaowIbj@-1qVNZF+K;QWHZy62skLgclK2GAs5-+Iw!-LcI`;?wNM5`Dd|Nc{R@32*Z zCR4U^_b|MjO%DtwTi`E#yaMuB^A0A-Pp0iliXc2a0@En5%cP$poL}2e{PxDA}!pH~+lpW)q8k_E~;06~e#Ij(Mjzha$9-A}D@wDZosQXxW<@bZ7{3%A1` zNmb)<)PPFveYv+g40^cL&DB)jw7)A1|AdUqo^MwQE+;E}gWQ#dQ}}-3?N;bmH{dg= zYV{X4(}ube&Qm())bn`HsGOB|fat!e=W!(WSxOGE==cSPsa=Neb!fd9f0wnxqsJMa z+YSX(3WnUqzn!UjI+Nb(JsXk#Ftf{a)G&V#gM7{3Mn2m6sNDMT639EQTfr^5(IPdy z)p;E_l)S0t7W(u>=Gt8QYc8(iU6x`2yu3&F_W!fOE~blJ)(V%8+_DyLV7|`EBx|ix G$o~S#@P1$b literal 0 HcmV?d00001 diff --git a/images/titleCampfire_loop.png.import b/images/titleCampfire_loop.png.import new file mode 100644 index 0000000..e129e95 --- /dev/null +++ b/images/titleCampfire_loop.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/titleCampfire_loop.png-db7ae5be507e74482c3516e1cbd076b2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/titleCampfire_loop.png" +dest_files=[ "res://.import/titleCampfire_loop.png-db7ae5be507e74482c3516e1cbd076b2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/images/titleCampfire_start.png b/images/titleCampfire_start.png new file mode 100644 index 0000000000000000000000000000000000000000..6761b3292360be5c6d4751d93580ef4fe1bc17e6 GIT binary patch literal 13072 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 literal 0 HcmV?d00001 diff --git a/images/ui/dialogue_bg.png.import b/images/ui/dialogue_bg.png.import new file mode 100644 index 0000000..5a68a9f --- /dev/null +++ b/images/ui/dialogue_bg.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/dialogue_bg.png-bd04df9d8aa873c1b514d96025e7d2ea.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images/ui/dialogue_bg.png" +dest_files=[ "res://.import/dialogue_bg.png-bd04df9d8aa873c1b514d96025e7d2ea.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..954ad49 --- /dev/null +++ b/project.godot @@ -0,0 +1,87 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +_global_script_classes=[ { +"base": "Node", +"class": "AsepriteImportData", +"language": "GDScript", +"path": "res://addons/aseprite_importer/classes/AsepriteImportData.gd" +}, { +"base": "Node", +"class": "AsepriteImporter", +"language": "GDScript", +"path": "res://addons/aseprite_importer/classes/AsepriteImporter.gd" +}, { +"base": "Node", +"class": "DialogueAction", +"language": "GDScript", +"path": "res://scripts/DialogueAction.gd" +}, { +"base": "Control", +"class": "DialogueBox", +"language": "GDScript", +"path": "res://scripts/DialogueBox.gd" +}, { +"base": "Node", +"class": "EditorTheme", +"language": "GDScript", +"path": "res://addons/aseprite_importer/classes/EditorTheme.gd" +}, { +"base": "Node", +"class": "IntroScript", +"language": "GDScript", +"path": "res://scripts/scenes/IntroScript.gd" +} ] +_global_script_class_icons={ +"AsepriteImportData": "", +"AsepriteImporter": "", +"DialogueAction": "", +"DialogueBox": "", +"EditorTheme": "", +"IntroScript": "" +} + +[application] + +config/name="Crabs Game" +run/main_scene="res://scenes/startup.tscn" +config/icon="res://icon.png" + +[display] + +window/size/width=192 +window/size/height=108 +window/size/fullscreen=true +window/vsync/vsync_via_compositor=true +window/stretch/mode="2d" +window/stretch/aspect="keep" + +[editor_plugins] + +enabled=PoolStringArray( "aseprite_importer" ) + +[input] + +ui_accept={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777222,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) + ] +} + +[rendering] + +quality/intended_usage/framebuffer_allocation=0 +quality/intended_usage/framebuffer_allocation.mobile=0 +quality/2d/use_pixel_snap=true +environment/default_environment="res://default_env.tres" +quality/dynamic_fonts/use_oversampling=false diff --git a/scenes/campfire.tscn b/scenes/campfire.tscn new file mode 100644 index 0000000..4817b5e --- /dev/null +++ b/scenes/campfire.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://images/campfire.tres" type="SpriteFrames" id=1] +[ext_resource path="res://images/ely.tres" type="SpriteFrames" id=2] +[ext_resource path="res://scenes/dialogue.tscn" type="PackedScene" id=3] +[ext_resource path="res://scripts/scenes/IntroScript.gd" type="Script" id=4] + +[node name="root" type="Node2D"] + +[node name="Campfire (background)" type="AnimatedSprite" parent="."] +frames = ExtResource( 1 ) +frame = 18 +playing = true +centered = false + +[node name="Ely" type="AnimatedSprite" parent="."] +frames = ExtResource( 2 ) +frame = 49 +playing = true +centered = false + +[node name="UI" type="Control" parent="."] +margin_right = 192.0 +margin_bottom = 108.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Dialog" parent="UI" instance=ExtResource( 3 )] +visible = false + +[node name="IntroScript" type="Node" parent="."] +script = ExtResource( 4 ) +dialogue_box_path = NodePath("../UI/Dialog") +start_dialogue = "res://dialogues/intro_1.json" diff --git a/scenes/dialogue.tscn b/scenes/dialogue.tscn new file mode 100644 index 0000000..9f435a0 --- /dev/null +++ b/scenes/dialogue.tscn @@ -0,0 +1,196 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://images/ui/dialogue_bg.png" type="Texture" id=1] +[ext_resource path="res://fonts/dialog_default_font.tres" type="DynamicFont" id=2] +[ext_resource path="res://scripts/DialogueBox.gd" type="Script" id=3] + +[sub_resource type="VisualShaderNodeColorConstant" id=1] +constant = Color( 0, 0, 0, 0.803922 ) + +[sub_resource type="VisualShaderNodeInput" id=2] +input_name = "texture" + +[sub_resource type="VisualShaderNodeTexture" id=3] +source = 2 + +[sub_resource type="VisualShader" id=4] +code = "shader_type canvas_item; + + + +void vertex() { +// Output:0 + +} + +void fragment() { +// Input:4 + +// Texture:6 + vec3 n_out6p0; + float n_out6p1; + { + vec4 _tex_read = texture(TEXTURE , UV.xy); + n_out6p0 = _tex_read.rgb; + n_out6p1 = _tex_read.a; + } + +// Color:3 + vec3 n_out3p0 = vec3(0.000000, 0.000000, 0.000000); + float n_out3p1 = 0.803922; + +// Output:0 + COLOR.rgb = n_out6p0; + COLOR.a = n_out3p1; + +} + +void light() { +// Output:0 + +} +" +custom_defines = "" +graph_offset = Vector2( 261, 117 ) +mode = 1 +flags/light_only = false +nodes/vertex/0/position = Vector2( 400, 160 ) +nodes/fragment/0/position = Vector2( 1040, 260 ) +nodes/fragment/3/node = SubResource( 1 ) +nodes/fragment/3/position = Vector2( 600, 420 ) +nodes/fragment/4/node = SubResource( 2 ) +nodes/fragment/4/position = Vector2( 460, 300 ) +nodes/fragment/6/node = SubResource( 3 ) +nodes/fragment/6/position = Vector2( 740, 200 ) +nodes/fragment/connections = PoolIntArray( 3, 1, 0, 1, 4, 0, 6, 2, 6, 0, 0, 0 ) + +[sub_resource type="ShaderMaterial" id=5] +render_priority = -1 +shader = SubResource( 4 ) + +[node name="Dialog" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +title_path = NodePath("MarginContainer/VBoxContainer/MarginContainer/MarginContainer/CharacterName") +text_path = NodePath("MarginContainer/VBoxContainer/MarginContainer2/MarginContainer/DialogText") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_constants/margin_right = 4 +custom_constants/margin_left = 4 +custom_constants/margin_bottom = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +margin_left = 4.0 +margin_right = 188.0 +margin_bottom = 108.0 +custom_constants/separation = 0 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"] +margin_top = 61.0 +margin_right = 184.0 +margin_bottom = 74.0 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.2 +custom_constants/margin_right = 4 +custom_constants/margin_left = 4 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DialogBackground" type="NinePatchRect" parent="MarginContainer/VBoxContainer/MarginContainer"] +show_behind_parent = true +material = SubResource( 5 ) +margin_left = 4.0 +margin_right = 180.0 +margin_bottom = 13.0 +texture = ExtResource( 1 ) +patch_margin_left = 1 +patch_margin_top = 1 +patch_margin_right = 1 +patch_margin_bottom = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/MarginContainer"] +margin_left = 4.0 +margin_right = 180.0 +margin_bottom = 13.0 +custom_constants/margin_left = 4 +custom_constants/margin_bottom = -2 + +[node name="CharacterName" type="RichTextLabel" parent="MarginContainer/VBoxContainer/MarginContainer/MarginContainer"] +margin_left = 4.0 +margin_right = 176.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 0.25 +custom_fonts/normal_font = ExtResource( 2 ) +text = "Elie" +fit_content_height = true +scroll_active = false +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer2" type="MarginContainer" parent="MarginContainer/VBoxContainer"] +margin_top = 74.0 +margin_right = 184.0 +margin_bottom = 108.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DialogBackground2" type="NinePatchRect" parent="MarginContainer/VBoxContainer/MarginContainer2"] +show_behind_parent = true +material = SubResource( 5 ) +margin_right = 184.0 +margin_bottom = 34.0 +texture = ExtResource( 1 ) +patch_margin_left = 10 +patch_margin_top = 10 +patch_margin_right = 10 +patch_margin_bottom = 10 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/MarginContainer2"] +margin_right = 184.0 +margin_bottom = 34.0 +custom_constants/margin_right = 6 +custom_constants/margin_top = 2 +custom_constants/margin_left = 6 +custom_constants/margin_bottom = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DialogText" type="RichTextLabel" parent="MarginContainer/VBoxContainer/MarginContainer2/MarginContainer"] +margin_left = 6.0 +margin_top = 2.0 +margin_right = 178.0 +margin_bottom = 32.0 +rect_clip_content = false +size_flags_horizontal = 3 +custom_fonts/normal_font = ExtResource( 2 ) +bbcode_enabled = true +bbcode_text = "[center]Wtf is going on, where am I and where did you hide the cheese?![/center]" +text = "Wtf is going on, where am I and where did you hide the cheese?!" +fit_content_height = true +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/scenes/main_menu.tscn b/scenes/main_menu.tscn new file mode 100644 index 0000000..8cd6871 --- /dev/null +++ b/scenes/main_menu.tscn @@ -0,0 +1,90 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://scripts/menu/title_background.gd" type="Script" id=1] +[ext_resource path="res://fonts/dialog_default_font.tres" type="DynamicFont" id=2] +[ext_resource path="res://scripts/menu/MenuButton.gd" type="Script" id=3] +[ext_resource path="res://images/title_background.tres" type="SpriteFrames" id=4] +[ext_resource path="res://scripts/menu/MainMenu.gd" type="Script" id=5] +[ext_resource path="res://images/title_background_campfire.tres" type="SpriteFrames" id=6] + +[sub_resource type="StyleBoxEmpty" id=1] + +[sub_resource type="StyleBoxEmpty" id=2] + +[node name="Node2D" type="Node2D"] + +[node name="background" type="AnimatedSprite" parent="."] +frames = ExtResource( 4 ) +animation = "start" +frame = 47 +playing = true +centered = false +script = ExtResource( 1 ) + +[node name="Fire" type="AnimatedSprite" parent="."] +frames = ExtResource( 6 ) +animation = "start" +frame = 38 +playing = true +centered = false +script = ExtResource( 1 ) + +[node name="UI" type="Control" parent="."] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Buttons" type="Control" parent="UI"] +margin_right = 40.0 +margin_bottom = 40.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PlayButton" type="Button" parent="UI/Buttons"] +anchor_left = 3.875 +anchor_top = 1.35 +anchor_right = 3.875 +anchor_bottom = 1.35 +margin_left = -13.3871 +margin_top = -17.551 +margin_right = 30.6129 +margin_bottom = 2.449 +custom_styles/focus = SubResource( 1 ) +custom_fonts/font = ExtResource( 2 ) +custom_colors/font_color = Color( 0.282353, 0.282353, 0.282353, 1 ) +custom_colors/font_color_hover = Color( 1, 1, 1, 1 ) +text = "Play" +flat = true +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +scene_to_load = "res://scenes/campfire.tscn" + +[node name="QuitButton" type="Button" parent="UI/Buttons"] +anchor_left = 3.875 +anchor_top = 1.35 +anchor_right = 3.875 +anchor_bottom = 1.35 +margin_left = -13.3871 +margin_top = 2.449 +margin_right = 30.6129 +margin_bottom = 22.449 +custom_styles/focus = SubResource( 2 ) +custom_fonts/font = ExtResource( 2 ) +custom_colors/font_color = Color( 0.282353, 0.282353, 0.282353, 1 ) +custom_colors/font_color_hover = Color( 1, 1, 1, 1 ) +text = "Quit" +flat = true +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +[connection signal="animation_finished" from="background" to="background" method="_on_background_animation_finished"] +[connection signal="animation_finished" from="Fire" to="Fire" method="_on_background_animation_finished"] +[connection signal="pressed" from="UI/Buttons/PlayButton" to="UI/Buttons/PlayButton" method="_on_Button_pressed"] +[connection signal="pressed" from="UI/Buttons/QuitButton" to="UI/Buttons/QuitButton" method="_on_Button_pressed"] diff --git a/scenes/startup.tscn b/scenes/startup.tscn new file mode 100644 index 0000000..1257e29 --- /dev/null +++ b/scenes/startup.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scripts/scenes/startup.gd" type="Script" id=1] + +[node name="Node2D" type="Node2D"] +script = ExtResource( 1 ) diff --git a/scripts/DialogueAction.gd b/scripts/DialogueAction.gd new file mode 100644 index 0000000..5a73a1f --- /dev/null +++ b/scripts/DialogueAction.gd @@ -0,0 +1,22 @@ +extends Node +class_name DialogueAction + +export (NodePath) var dialogue_box_path +onready var dialogue_box = get_node(dialogue_box_path) + +export (String, FILE, '*.json') var dialogue_file_path : String + +func start() -> void: + var dialogue : Array = load_dialogue(dialogue_file_path) + dialogue_box.start(dialogue) + yield(dialogue_box, "end") + emit_signal("end") + +func load_dialogue(file_path) -> Array: + var file = File.new() + assert (file.file_exists(file_path)) + + file.open(file_path, file.READ) + var dialogue = parse_json(file.get_as_text()) + assert (dialogue.size() > 0) + return dialogue diff --git a/scripts/DialogueBox.gd b/scripts/DialogueBox.gd new file mode 100644 index 0000000..9eaf28c --- /dev/null +++ b/scripts/DialogueBox.gd @@ -0,0 +1,45 @@ +extends Control +class_name DialogueBox + +signal end + +export (NodePath) var title_path +onready var title = get_node(title_path) as RichTextLabel + +export (NodePath) var text_path +onready var text = get_node(text_path) as RichTextLabel + +export (NodePath) var expression_path +onready var expression = get_node(expression_path) as RichTextLabel + +var _dialogue : Array +var _index : int + +func _ready(): + assert(title != null) + assert(text != null) + +func start(dialogue : Array): + _dialogue = dialogue + _index = 0 + _update() + show() + +func _input(event): + if event.is_action_pressed("ui_accept"): + next() + +func next() -> void: + _index += 1 + if _index >= _dialogue.size(): + hide() + emit_signal('end') + return + _update() + +func _update() -> void: + text.text = _dialogue[_index].text + title.text = _dialogue[_index].name + #expression = _dialogue[_index].expression + if _index == _dialogue.size() - 1: + emit_signal('end') diff --git a/scripts/DialogueDatabase.gd b/scripts/DialogueDatabase.gd new file mode 100644 index 0000000..6d60889 --- /dev/null +++ b/scripts/DialogueDatabase.gd @@ -0,0 +1,26 @@ +extends Node + +const SOURCE_DIRECTORY = "res://dialogues/characters/" +var characters : Dictionary + +func _ready() -> void: + var dir : Directory = Directory.new() + assert (dir.dir_exists(SOURCE_DIRECTORY)) + if not dir.open(SOURCE_DIRECTORY) == OK: + print("Could not read directory %s" % SOURCE_DIRECTORY) + return + dir.list_dir_begin() + + var file_name : String = " " + while true: + file_name = dir.get_next() + if file_name == "": + break + if not file_name.ends_with(".tres"): + continue + characters[file_name.get_basename()] = load(SOURCE_DIRECTORY.plus_file(file_name)) + +func get_texture(character_name : String, expression : String = "neutral") -> Texture: + assert (character_name in characters) + assert (expression in characters[character_name].expressions) + return characters[character_name].expressions[expression] diff --git a/scripts/menu/MainMenu.gd b/scripts/menu/MainMenu.gd new file mode 100644 index 0000000..44decae --- /dev/null +++ b/scripts/menu/MainMenu.gd @@ -0,0 +1,12 @@ +extends Node + +func _ready(): + $Buttons/PlayButton.grab_focus() + for button in $Buttons.get_children(): + button.connect('pressed', self, '_on_Button_pressed', [button.scene_to_load]) + +func _on_Button_pressed(scene_to_load : String): + if scene_to_load != "": + get_tree().change_scene(scene_to_load) + else: + get_tree().quit() diff --git a/scripts/menu/MenuButton.gd b/scripts/menu/MenuButton.gd new file mode 100644 index 0000000..50d204a --- /dev/null +++ b/scripts/menu/MenuButton.gd @@ -0,0 +1,3 @@ +extends Button + +export (String, FILE, "*.tscn") var scene_to_load diff --git a/scripts/menu/title_background.gd b/scripts/menu/title_background.gd new file mode 100644 index 0000000..cb85f51 --- /dev/null +++ b/scripts/menu/title_background.gd @@ -0,0 +1,10 @@ +extends AnimatedSprite + + +func _ready(): + play('start') + frame = 0 + +func _on_background_animation_finished(): + play('idle') + frame = 0 diff --git a/scripts/pause_menu.gd b/scripts/pause_menu.gd new file mode 100644 index 0000000..e3e00ae --- /dev/null +++ b/scripts/pause_menu.gd @@ -0,0 +1,6 @@ +extends Node + + +func _input(event): + if event.is_action_pressed("ui_home"): + print('pause') diff --git a/scripts/scenes/IntroScript.gd b/scripts/scenes/IntroScript.gd new file mode 100644 index 0000000..f38bc76 --- /dev/null +++ b/scripts/scenes/IntroScript.gd @@ -0,0 +1,15 @@ +extends Node +class_name IntroScript + +export (NodePath) var dialogue_box_path +onready var dialogue_box = get_node(dialogue_box_path) + +export (String, FILE, '*.json') var start_dialogue : String + +func _ready(): + assert(dialogue_box != null) + + var dialogue = DialogueAction.new() + dialogue.dialogue_file_path = start_dialogue + dialogue.dialogue_box = dialogue_box + dialogue.start() diff --git a/scripts/scenes/startup.gd b/scripts/scenes/startup.gd new file mode 100644 index 0000000..253b59a --- /dev/null +++ b/scripts/scenes/startup.gd @@ -0,0 +1,4 @@ +extends Node2D + +func _ready(): + get_tree().change_scene("res://scenes/main_menu.tscn")