diff --git a/game/.gitignore b/game/.gitignore new file mode 100644 index 0000000..e9f4f1f --- /dev/null +++ b/game/.gitignore @@ -0,0 +1,16 @@ +\exports/ +\.import/ + +addons/scene_notes/ + +addons/todo/ + +scene-notes\.ini + +todo\.cache\.ini + +todo\.config\.ini + +export_presets\.cfg + +export.cfg \ No newline at end of file diff --git a/game/autoload/CursorManager.gd b/game/autoload/CursorManager.gd new file mode 100644 index 0000000..585e0ca --- /dev/null +++ b/game/autoload/CursorManager.gd @@ -0,0 +1,28 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(Texture) var default_cursor : Texture +export(Texture) var loot_cursor : Texture +export(Texture) var attack_cursor : Texture +export(Texture) var speak_cursor : Texture +export(Texture) var drag_drop_cursor : Texture +export(Texture) var forbidden_cursor : Texture +export(Texture) var text_cursor : Texture +export(Vector2) var text_cursor_hotspot : Vector2 + +func _ready(): + # Changes only the arrow shape of the cursor. + # This is similar to changing it in the project settings. + Input.set_custom_mouse_cursor(default_cursor, Input.CURSOR_ARROW) + Input.set_custom_mouse_cursor(attack_cursor, Input.CURSOR_MOVE) + Input.set_custom_mouse_cursor(loot_cursor, Input.CURSOR_CROSS) + Input.set_custom_mouse_cursor(speak_cursor, Input.CURSOR_HELP) + Input.set_custom_mouse_cursor(drag_drop_cursor, Input.CURSOR_CAN_DROP) + Input.set_custom_mouse_cursor(forbidden_cursor, Input.CURSOR_FORBIDDEN) + Input.set_custom_mouse_cursor(text_cursor, Input.CURSOR_IBEAM, text_cursor_hotspot) + + # Changes a specific shape of the cursor (here, the I-beam shape). +# Input.set_custom_mouse_cursor(beam, Input.CURSOR_IBEAM) diff --git a/game/autoload/CursorManager.tscn b/game/autoload/CursorManager.tscn new file mode 100644 index 0000000..ae87593 --- /dev/null +++ b/game/autoload/CursorManager.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://autoload/CursorManager.gd" type="Script" id=1] +[ext_resource path="res://data/cursors/arrow16.png" type="Texture" id=2] +[ext_resource path="res://data/cursors/loot16.png" type="Texture" id=3] +[ext_resource path="res://data/cursors/attack16.png" type="Texture" id=4] +[ext_resource path="res://data/cursors/speak.png" type="Texture" id=5] +[ext_resource path="res://data/cursors/drag_drop.png" type="Texture" id=6] +[ext_resource path="res://data/cursors/forbidden.png" type="Texture" id=7] +[ext_resource path="res://data/cursors/ibeam.png" type="Texture" id=8] + + +[node name="CursorManager" type="Node"] +script = ExtResource( 1 ) +default_cursor = ExtResource( 2 ) +loot_cursor = ExtResource( 3 ) +attack_cursor = ExtResource( 4 ) +speak_cursor = ExtResource( 5 ) +drag_drop_cursor = ExtResource( 6 ) +forbidden_cursor = ExtResource( 7 ) +text_cursor = ExtResource( 8 ) +text_cursor_hotspot = Vector2( 2, 11 ) diff --git a/game/autoload/EntityDataManager.gd b/game/autoload/EntityDataManager.gd new file mode 100644 index 0000000..1004472 --- /dev/null +++ b/game/autoload/EntityDataManager.gd @@ -0,0 +1,375 @@ +extends Node + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +export(PackedScene) var player_scene : PackedScene +export(PackedScene) var networked_player_scene : PackedScene +export(PackedScene) var mob_scene : PackedScene +export(PackedScene) var player_display_scene : PackedScene +export(String) var spawn_parent_path : String = "/root/Main" +export(int) var default_level_override : int = 0 + +var _spawn_parent : Node = null + +var _next_entity_guid : int = 0 + +var _players : Array +var _mobs : Array + +func _ready(): + _spawn_parent = get_node(spawn_parent_path) + +# get_tree().connect("network_peer_connected", self, "_player_connected") +# get_tree().connect("network_peer_disconnected", self, "_player_disconnected") +# get_tree().connect("connected_to_server", self, "_connected_ok") +# get_tree().connect("connection_failed", self, "_connected_fail") +# get_tree().connect("server_disconnected", self, "_server_disconnected") + pass + +func spawn_for(player : Entity, target: Entity) -> void: +# print("spawnfor " + target.name) + rpc_id(player.get_network_master(), "creceive_spawn_for", to_json(target.to_dict()), target.name, target.translation) + +func despawn_for(player : Entity, target: Entity) -> void: +# print("despawnfor " + target.name) + rpc_id(player.get_network_master(), "creceive_despawn_for", target.get_path()) + +remote func creceive_spawn_for(data: String, global_name : String, position: Vector3) -> void: +# print("recspawnfor " + global_name) + var entity : Entity = networked_player_scene.instance() + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity) + entity.owner = spawn_parent + entity.name = str(global_name) + entity.from_dict(parse_json(data)) + + entity.translation = position + + Logger.info("Player spawned ") + + _players.append(entity) + +remote func creceive_despawn_for(path : NodePath) -> void: +# print("recdespawnfor " + path) + var ent = get_node_or_null(path) + + if ent: + ent.queue_free() + +func spawn_networked_player_from_data(data : String, position : Vector3, network_owner : int) -> Entity: + var entity : Entity = networked_player_scene.instance() + + _next_entity_guid += 1 + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity) + entity.owner = spawn_parent + entity.name = str(network_owner) + entity.from_dict(parse_json(data)) + + entity.set_network_master(network_owner) + entity.translation = position + + Logger.info("Player spawned ") + + _players.append(entity) + + rpc_id(network_owner, "spawn_owned_player", data, position) + + return entity + +puppet func spawn_owned_player(data : String, position : Vector3) -> void: + var entity : Entity = player_scene.instance() + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity) + entity.owner = spawn_parent + + entity.from_dict(parse_json(data)) + entity.name = str(multiplayer.get_network_unique_id()) + entity.translation = position + entity.set_network_master(multiplayer.get_network_unique_id()) + + Logger.info("Player spawned ") + + +func load_player(file_name : String, position : Vector3, network_owner : int) -> Entity: +# var createinfo : EntityCreateInfo = EntityCreateInfo.new() +# +# var cls : EntityData = Entities.get_player_character_data(class_id) +# +# var class_profile : ClassProfile = Profiles.get_class_profile(class_id) +# +# createinfo.entity_data = cls +# createinfo.player_name = name +# createinfo.level = class_profile.level +# createinfo.xp = class_profile.xp +# createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + + var entity : Entity = player_scene.instance() + + _next_entity_guid += 1 + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity) + entity.owner = spawn_parent + + entity.from_dict(load_file(file_name)) + + entity.translation = position +# entity.initialize(createinfo) + entity.set_network_master(network_owner) + + Logger.info("Player spawned ") + + _players.append(entity) + + return entity + +func spawn_display_player(name : String) -> Entity: + var entity : Entity = player_display_scene.instance() as Entity + + entity.name = name + + Logger.info("Player Display spawned") + + return entity + +func spawn_player_for_menu(class_id : int, name : String, parent : Node) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + var cls : EntityData = Entities.get_player_character_data(class_id) + var class_profile : ClassProfile = Profiles.get_class_profile(class_id) + + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.level = 1 + createinfo.xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + + var entity : Entity = player_display_scene.instance() as Entity + entity.initialize(createinfo) + + var level : int = class_profile.level + + if default_level_override > 0: + level = default_level_override + + entity.slevelup(level - 1) + + parent.add_child(entity) + entity.owner = parent + + return entity + +func spawn_networked_player(class_id : int, position : Vector3, name : String, node_name : String, sid : int) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + var cls : EntityData = Entities.get_entity_data(class_id) + + var class_profile : ClassProfile = Profiles.get_class_profile(class_id) + + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.level = 1 + createinfo.xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + + var entity : Entity = spawn(createinfo, true, position, node_name) + + var level : int = class_profile.level + + if default_level_override > 0: + level = default_level_override + + entity.slevelup(level - 1) + + if get_tree().is_network_server(): + entity.set_network_master(sid) + + Logger.info("Player spawned " + str(createinfo)) + + _players.append(entity) + + return entity + +func spawn_player(class_id : int, position : Vector3, name : String, node_name : String, network_owner : int) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + var cls : EntityData = Entities.get_player_character_data(class_id) + + var class_profile : ClassProfile = Profiles.get_class_profile(class_id) + + createinfo.entity_data = cls + createinfo.player_name = name + createinfo.level = 1 + createinfo.xp = class_profile.xp + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER + + var entity : Entity = spawn(createinfo, false, position, node_name) + + var level : int = class_profile.level + + if default_level_override > 0: + level = default_level_override + + entity.slevelup(level - 1) + + entity.set_network_master(network_owner) + + Logger.info("Player spawned " + str(createinfo)) + + _players.append(entity) + + return entity + +func spawn_mob(class_id : int, level : int, position : Vector3) -> Entity: + var createinfo : EntityCreateInfo = EntityCreateInfo.new() + + var cls : EntityData = Entities.get_entity_data(class_id) + + if cls == null: + print("clsnull") + + createinfo.entity_data = cls + createinfo.player_name = "Mob" + createinfo.level = 1 + + createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_AI + + var entity : Entity = spawn(createinfo, false, position) + + if default_level_override > 0: + level = default_level_override + + entity.slevelup(level - 1) + + Logger.info("Mob spawned " + str(createinfo)) + + _mobs.append(entity) + + return entity + +func spawn(createinfo : EntityCreateInfo, networked : bool, position : Vector3, node_name : String = "") -> Entity: + var entity_node : Entity = null + + if not networked: + if createinfo.entity_controller == EntityEnums.ENITIY_CONTROLLER_PLAYER: + entity_node = player_scene.instance() + else: + entity_node = mob_scene.instance() + else: + entity_node = networked_player_scene.instance() + + if entity_node == null: + print("EntityManager: entity node is null") + return null + + if node_name == "": + entity_node.name += "_" + str(_next_entity_guid) + else: + entity_node.name = node_name + + _next_entity_guid += 1 + + var spawn_parent = _spawn_parent.current_scene + + spawn_parent.add_child(entity_node) + entity_node.owner = spawn_parent + + entity_node.translation = position + + entity_node.initialize(createinfo) + + return entity_node + + +func _player_connected(id): + pass # Will go unused; not useful here. + +func _player_disconnected(id): + #player_info.erase(id) # Erase player from info. + pass + +func _connected_ok(): + # Only called on clients, not server. Send my ID and info to all the other peers. + #rpc("register_player", get_tree().get_network_unique_id(), my_info) + pass + +func _server_disconnected(): + pass # Server kicked us; show error and abort. + +func _connected_fail(): + pass # Could not even connect to server; abort. + +remote func register_player(id, info): + # Store the info +# player_info[id] = info + # If I'm the server, let the new guy know about existing players. +# if get_tree().is_network_server(): +# # Send my info to new player +# rpc_id(id, "register_player", 1, my_info) +# # Send the info of existing players +# for peer_id in player_info: +# rpc_id(id, "register_player", peer_id, player_info[peer_id]) + + # Call function to update lobby UI here + pass + +func load_file(file_name : String) -> Dictionary: + + var f : File = File.new() + + if f.open("user://characters/" + file_name, File.READ) == OK: + var st : String = f.get_as_text() + f.close() + + var json_err : String = validate_json(st) + + if json_err != "": + Logger.error("Save corrupted! " + file_name) + Logger.error(json_err) + return Dictionary() + + var p = parse_json(st) + + if typeof(p) != TYPE_DICTIONARY: + Logger.error("Save corrupted! Not Dict! " + file_name) + return Dictionary() + + if p is Dictionary: + return p as Dictionary + + return Dictionary() + +func save_player(player: Entity, file_name : String) -> void: + var f : File = File.new() + + if f.open("user://characters/" + file_name, File.WRITE) == OK: + f.store_string(to_json(player.to_dict())) + f.close() diff --git a/game/autoload/EntityDataManager.tscn b/game/autoload/EntityDataManager.tscn new file mode 100644 index 0000000..2404c92 --- /dev/null +++ b/game/autoload/EntityDataManager.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://autoload/EntityDataManager.gd" type="Script" id=1] +[ext_resource path="res://player/NetworkedPlayer.tscn" type="PackedScene" id=2] +[ext_resource path="res://player/Player.tscn" type="PackedScene" id=3] +[ext_resource path="res://player/Mob.tscn" type="PackedScene" id=4] +[ext_resource path="res://player/DisplayPlayer.tscn" type="PackedScene" id=5] + +[node name="EntityDataManager" type="EntityDataManager"] +xp_data_path = "res://data/xp/xp_data.tres" +entity_resources_folder = "res://data/entity_resources" +entity_skills_folder = "res://data/entity_skills" +entity_datas_folder = "res://data/entities" +spells_folder = "res://data/spells" +auras_folder = "res://data/auras" +world_spell_datas_folder = "res://data/world_spells" +craft_data_folder = "res://data/crafting" +item_template_folder = "res://data/item_templates" +mob_data_folder = "res://data/mob_data" +player_character_data_folder = "res://data/player_character_data" +script = ExtResource( 1 ) +player_scene = ExtResource( 3 ) +networked_player_scene = ExtResource( 2 ) +mob_scene = ExtResource( 4 ) +player_display_scene = ExtResource( 5 ) +default_level_override = 50 diff --git a/game/autoload/Logger.gd b/game/autoload/Logger.gd new file mode 100644 index 0000000..47a8cd2 --- /dev/null +++ b/game/autoload/Logger.gd @@ -0,0 +1,637 @@ +# Copyright (c) 2016 KOBUGE Games +# Distributed under the terms of the MIT license. +# https://github.com/KOBUGE-Games/godot-logger/blob/master/LICENSE.md +# +# Upstream repo: https://github.com/KOBUGE-Games/godot-logger + +extends Node # Needed to work as a singleton + +##================## +## Inner classes ## +##================## + +class Logfile: + # TODO: Godot doesn't support docstrings for inner classes, GoDoIt (GH-1320) + # """Class for log files that can be shared between various modules.""" + var file = null + var path = "" + var queue_mode = QUEUE_NONE + var buffer = PoolStringArray() + var buffer_idx = 0 + + func _init(_path, _queue_mode = QUEUE_NONE): + file = File.new() + if validate_path(_path): + path = _path + queue_mode = _queue_mode + buffer.resize(FILE_BUFFER_SIZE) + + func get_path(): + return path + + func set_queue_mode(new_mode): + queue_mode = new_mode + + func get_queue_mode(): + return queue_mode + + func get_write_mode(): + if not file.file_exists(path): + return File.WRITE # create + else: + return File.READ_WRITE # append + + func validate_path(ppath): + """Validate the path given as argument, making it possible to write to + the designated file or folder. Returns whether the path is valid.""" + if !(ppath.is_abs_path() or ppath.is_rel_path()): + print("[ERROR] [logger] The given path '%s' is not valid." % ppath) + return false + var dir = Directory.new() + var base_dir = ppath.get_base_dir() + if not dir.dir_exists(base_dir): + # TODO: Move directory creation to the function that will actually *write* + var err = dir.make_dir_recursive(base_dir) + if err: + print("[ERROR] [logger] Could not create the '%s' directory; exited with error %d." \ + % [base_dir, err]) + return false + else: + print("[INFO] [logger] Successfully created the '%s' directory." % base_dir) + return true + + func flush_buffer(): + """Flush the buffer, i.e. write its contents to the target file.""" + if buffer_idx == 0: + return # Nothing to write + var err = file.open(path, get_write_mode()) + if err: + print("[ERROR] [logger] Could not open the '%s' log file; exited with error %d." \ + % [path, err]) + return + file.seek_end() + for i in range(buffer_idx): + file.store_line(buffer[i]) + file.close() + buffer_idx = 0 # We don't clear the memory, we'll just overwrite it + + func write(output, level): + """Write the string at the end of the file (append mode), following + the queue mode.""" + var queue_action = queue_mode + if queue_action == QUEUE_SMART: + if level >= WARN: # Don't queue warnings and errors + queue_action = QUEUE_NONE + flush_buffer() + else: # Queue the log, not important enough for "smart" + queue_action = QUEUE_ALL + + if queue_action == QUEUE_NONE: + var err = file.open(path, get_write_mode()) + if err: + print("[ERROR] [logger] Could not open the '%s' log file; exited with error %d." \ + % [path, err]) + return + file.seek_end() + file.store_line(output) + file.close() + + if queue_action == QUEUE_ALL: + buffer[buffer_idx] = output + buffer_idx += 1 + if buffer_idx >= FILE_BUFFER_SIZE: + flush_buffer() + + func get_config(): + return { + "path": get_path(), + "queue_mode": get_queue_mode() + } + + +class Module: + # """Class for customizable logging modules.""" + var name = "" + var output_level = 0 + var output_strategies = [] + var logfile = null + + func _init(_name, _output_level, _output_strategies, _logfile): + name = _name + set_output_level(_output_level) + + if typeof(_output_strategies) == TYPE_INT: # Only one strategy, use it for all + #warning-ignore:unused_variable + for i in range(0, LEVELS.size()): + output_strategies.append(_output_strategies) + else: + for strategy in _output_strategies: # Need to force deep copy + output_strategies.append(strategy) + + set_logfile(_logfile) + + func get_name(): + return name + + func set_output_level(level): + """Set the custom minimal level for the output of the module. + All levels greater or equal to the given once will be output based + on their respective strategies, while levels lower than the given one + will be discarded.""" + if not level in range(0, LEVELS.size()): + print("[ERROR] [%s] The level must be comprised between 0 and %d." \ + % [PLUGIN_NAME, LEVELS.size() - 1]) + return + output_level = level + + func get_output_level(): + return output_level + + func set_common_output_strategy(output_strategy_mask): + """Set the common output strategy mask for all levels of the module.""" + if not output_strategy_mask in range(0, MAX_STRATEGY + 1): + print("[ERROR] [%s] The output strategy mask must be comprised between 0 and %d." \ + % [PLUGIN_NAME, MAX_STRATEGY]) + return + for i in range(0, LEVELS.size()): + output_strategies[i] = output_strategy_mask + + func set_output_strategy(output_strategy_mask, level = -1): + """Set the output strategy for the given level or (by default) all + levels of the module.""" + if not output_strategy_mask in range(0, MAX_STRATEGY + 1): + print("[ERROR] [%s] The output strategy mask must be comprised between 0 and %d." \ + % [PLUGIN_NAME, MAX_STRATEGY]) + return + if level == -1: # Set for all levels + for i in range(0, LEVELS.size()): + output_strategies[i] = output_strategy_mask + else: + if not level in range(0, LEVELS.size()): + print("[ERROR] [%s] The level must be comprised between 0 and %d." \ + % [PLUGIN_NAME, LEVELS.size() - 1]) + return + output_strategies[level] = output_strategy_mask + + func get_output_strategy(level = -1): + if level == -1: + return output_strategies + else: + return output_strategies[level] + + func set_logfile(new_logfile): + """Set the Logfile instance for the module.""" + logfile = new_logfile + + func get_logfile(): + return logfile + + func get_config(): + return { + "name": get_name(), + "output_level": get_output_level(), + "output_strategies": get_output_strategy(), + "logfile_path": get_logfile().get_path() + } + + +##=============## +## Constants ## +##=============## + +const PLUGIN_NAME = "logger" + +# Logging levels - the array and the integers should be matching +const LEVELS = ["VERBOSE", "DEBUG", "INFO", "WARN", "ERROR"] +const VERBOSE = 0 +const DEBUG = 1 +const INFO = 2 +const WARN = 3 +const ERROR = 4 + +# Output strategies +const STRATEGY_MUTE = 0 +const STRATEGY_PRINT = 1 +const STRATEGY_FILE = 2 +const STRATEGY_MEMORY = 4 +const MAX_STRATEGY = STRATEGY_MEMORY*2 - 1 + +# Output format identifiers +const FORMAT_IDS = { + "level": "{LVL}", + "module": "{MOD}", + "message": "{MSG}" +} + +# Queue modes +const QUEUE_NONE = 0 +const QUEUE_ALL = 1 +const QUEUE_SMART = 2 + +const FILE_BUFFER_SIZE = 30 + + +##=============## +## Variables ## +##=============## + +# Configuration +var default_output_level = WARN +# TODO: Find (or implement in Godot) a more clever way to achieve that +var default_output_strategies = [STRATEGY_PRINT, STRATEGY_PRINT, STRATEGY_PRINT, STRATEGY_PRINT, STRATEGY_PRINT] +var default_logfile_path = "user://%s.log" % ProjectSettings.get_setting("application/config/name") +var default_configfile_path = "user://%s.cfg" % PLUGIN_NAME + +# e.g. "[INFO] [main] The young alpaca started growing a goatie." +var output_format = "[{LVL}] [{MOD}] {MSG}" + +# Specific to STRATEGY_MEMORY +var max_memory_size = 30 +var memory_buffer = [] +var memory_idx = 0 +var memory_first_loop = true +var memory_cache = [] +var invalid_memory_cache = false + +# Holds default and custom modules and logfiles defined by the user +# Default modules are initialized in _init via add_module +var logfiles = {} +var modules = {} + + +##=============## +## Functions ## +##=============## + +func put(level, message, module = "main"): + """Log a message in the given module with the given logging level.""" + var module_ref = get_module(module) + var output_strategy = module_ref.get_output_strategy(level) + if output_strategy == STRATEGY_MUTE or module_ref.get_output_level() > level: + return # Out of scope + + var output = format(output_format, level, module, message) + + if output_strategy & STRATEGY_PRINT: + print(output) + + if output_strategy & STRATEGY_FILE: + module_ref.get_logfile().write(output, level) + + if output_strategy & STRATEGY_MEMORY: + memory_buffer[memory_idx] = output + memory_idx += 1 + invalid_memory_cache = true + if memory_idx >= max_memory_size: + memory_idx = 0 + memory_first_loop = false + +# Helper functions for each level +# ------------------------------- + +func verbose(message, module = "main"): + """Log a message in the given module with level VERBOSE.""" + put(VERBOSE, message, module) + +func debug(message, module = "main"): + """Log a message in the given module with level DEBUG.""" + put(DEBUG, message, module) + +func info(message, module = "main"): + """Log a message in the given module with level INFO.""" + put(INFO, message, module) + +func warn(message, module = "main"): + """Log a message in the given module with level WARN.""" + put(WARN, message, module) + +func error(message, module = "main"): + """Log a message in the given module with level ERROR.""" + put(ERROR, message, module) + +# Module management +# ----------------- + +func add_module(name, output_level = default_output_level, \ + output_strategies = default_output_strategies, logfile = null): + """Add a new module with the given parameter or (by default) the + default ones. + Returns a reference to the instanced module.""" + if modules.has(name): + info("The module '%s' already exists; discarding the call to add it anew." \ + % name, PLUGIN_NAME) + else: + if logfile == null: + logfile = get_logfile(default_logfile_path) + modules[name] = Module.new(name, output_level, output_strategies, logfile) + return modules[name] + +func get_module(module = "main"): + """Retrieve the given module if it exists; if not, it will be created.""" + if not modules.has(module): + info("The requested module '%s' does not exist. It will be created with default values." \ + % module, PLUGIN_NAME) + add_module(module) + return modules[module] + +func get_modules(): + """Retrieve the dictionary containing all modules.""" + return modules + +# Logfiles management +# ------------------- + +func set_default_logfile_path(new_logfile_path, keep_old = false): + """Sets the new default logfile path. Unless configured otherwise with + the optional keep_old argument, it will replace the logfile for all + modules which were configured for the previous logfile path.""" + if new_logfile_path == default_logfile_path: + return # Nothing to do + + var old_logfile = get_logfile(default_logfile_path) + var new_logfile = null + if logfiles.has(new_logfile_path): # Already exists + new_logfile = logfiles[new_logfile_path] + else: # Create a new logfile + new_logfile = add_logfile(new_logfile_path) + logfiles[new_logfile_path] = new_logfile + + if not keep_old: # Replace the old defaut logfile in all modules that used it + for module in modules.values(): + if module.get_logfile() == old_logfile: + module.set_logfile(new_logfile) + logfiles.erase(default_logfile_path) + default_logfile_path = new_logfile_path + +func get_default_logfile_path(): + """Return the default logfile path.""" + return default_logfile_path + +func add_logfile(logfile_path = default_logfile_path): + """Add a new logfile that can then be attached to one or more modules. + Returns a reference to the instanced logfile.""" + if logfiles.has(logfile_path): + info("A logfile pointing to '%s' already exists; discarding the call to add it anew." \ + % logfile_path, PLUGIN_NAME) + else: + logfiles[logfile_path] = Logfile.new(logfile_path) + return logfiles[logfile_path] + +func get_logfile(logfile_path): + """Retrieve the given logfile if it exists, otherwise returns null.""" + if not logfiles.has(logfile_path): + warn("The requested logfile pointing to '%s' does not exist." % logfile_path, PLUGIN_NAME) + return null + else: + return logfiles[logfile_path] + +func get_logfiles(): + """Retrieve the dictionary containing all logfiles.""" + return logfiles + +# Default output configuration +# ---------------------------- + +func set_default_output_strategy(output_strategy_mask, level = -1): + """Set the default output strategy mask of the given level or (by + default) all levels for all modules without a custom strategy.""" + if not output_strategy_mask in range(0, MAX_STRATEGY + 1): + error("The output strategy mask must be comprised between 0 and %d." \ + % MAX_STRATEGY, PLUGIN_NAME) + return + if level == -1: # Set for all levels + for i in range(0, LEVELS.size()): + default_output_strategies[i] = output_strategy_mask + info("The default output strategy mask was set to '%d' for all levels." \ + % [output_strategy_mask], PLUGIN_NAME) + else: + if not level in range(0, LEVELS.size()): + error("The level must be comprised between 0 and %d." % (int(LEVELS.size()) - 1), PLUGIN_NAME) + return + default_output_strategies[level] = output_strategy_mask + info("The default output strategy mask was set to '%d' for the '%s' level." \ + % [output_strategy_mask, LEVELS[level]], PLUGIN_NAME) + +func get_default_output_strategy(level): + """Get the default output strategy mask of the given level or (by + default) all levels for all modules without a custom strategy.""" + return default_output_strategies[level] + +func set_default_output_level(level): + """Set the default minimal level for the output of all modules without + a custom output level. + All levels greater or equal to the given once will be output based on + their respective strategies, while levels lower than the given one will + be discarded. + """ + if not level in range(0, LEVELS.size()): + error("The level must be comprised between 0 and %d." % (int(LEVELS.size()) - 1), PLUGIN_NAME) + return + default_output_level = level + info("The default output level was set to '%s'." % LEVELS[level], PLUGIN_NAME) + +func get_default_output_level(): + """Get the default minimal level for the output of all modules without + a custom output level.""" + return default_output_level + +# Output formatting +# ----------------- + +static func format(template, level, module, message): + var output = template + output = output.replace(FORMAT_IDS.level, LEVELS[level]) + output = output.replace(FORMAT_IDS.module, module) + output = output.replace(FORMAT_IDS.message, message) + return output + +func set_output_format(new_format): + """Set the output string format using the following identifiers: + {LVL} for the level, {MOD} for the module, {MSG} for the message. + The three identifiers should be contained in the output format string. + """ + for key in FORMAT_IDS: + if new_format.find(FORMAT_IDS[key]) == -1: + error("Invalid output string format. It lacks the '%s' identifier." \ + % FORMAT_IDS[key], PLUGIN_NAME) + return + output_format = new_format + info("Successfully changed the output format to '%s'." % output_format, PLUGIN_NAME) + +func get_output_format(): + """Get the output string format.""" + return output_format + +# Strategy "memory" +# ----------------- + +func set_max_memory_size(new_size): + """Set the maximum amount of messages to be remembered when + using the STRATEGY_MEMORY output strategy.""" + if new_size <= 0: + error("The maximum amount of remembered messages must be a positive non-null integer. Received %d." \ + % new_size, PLUGIN_NAME) + return + + var new_buffer = [] + var new_idx = 0 + new_buffer.resize(new_size) + + # Better algorithm welcome :D + if memory_first_loop: + var offset = 0 + if memory_idx > new_size: + offset = memory_idx - new_size + memory_first_loop = false + else: + new_idx = memory_idx + for i in range(0, min(memory_idx, new_size)): + new_buffer[i] = memory_buffer[i + offset] + else: + var delta = 0 + if max_memory_size > new_size: + delta = max_memory_size - new_size + else: + new_idx = max_memory_size + memory_first_loop = true + for i in range(0, min(max_memory_size, new_size)): + new_buffer[i] = memory_buffer[(memory_idx + delta + i) % max_memory_size] + + memory_buffer = new_buffer + memory_idx = new_idx + invalid_memory_cache = true + max_memory_size = new_size + info("Successfully set the maximum amount of remembered messages to %d." % max_memory_size, PLUGIN_NAME) + +func get_max_memory_size(): + """Get the maximum amount of messages to be remembered when + using the STRATEGY_MEMORY output strategy.""" + return max_memory_size + +func get_memory(): + """Get an array of the messages remembered following STRATEGY_MEMORY. + The messages are sorted from the oldest to the newest.""" + if invalid_memory_cache: # Need to recreate the cached ordered array + memory_cache = [] + if not memory_first_loop: # else those would be uninitialized + for i in range(memory_idx, max_memory_size): + memory_cache.append(memory_buffer[i]) + for i in range(0, memory_idx): + memory_cache.append(memory_buffer[i]) + invalid_memory_cache = false + return memory_cache + +func clear_memory(): + """Clear the buffer or remembered messages.""" + memory_buffer.clear() + memory_idx = 0 + memory_first_loop = true + invalid_memory_cache = true + + +# Configuration loading/saving +# ---------------------------- + +func save_config(configfile = default_configfile_path): + """Save the default configuration as well as the set of modules and + their respective configurations. + The ConfigFile API is used to generate the config file passed as argument. + A unique section is used, so that it can be merged in a project's engine.cfg. + Returns an error code (OK or some ERR_*).""" + var config = ConfigFile.new() + + # Store default config + config.set_value(PLUGIN_NAME, "default_output_level", default_output_level) + config.set_value(PLUGIN_NAME, "default_output_strategies", default_output_strategies) + config.set_value(PLUGIN_NAME, "default_logfile_path", default_logfile_path) + config.set_value(PLUGIN_NAME, "max_memory_size", max_memory_size) + + # Logfiles config + var logfiles_arr = [] + var sorted_keys = logfiles.keys() + sorted_keys.sort() # Sadly doesn't return the array, so we need to split it + for logfile in sorted_keys: + logfiles_arr.append(logfiles[logfile].get_config()) + config.set_value(PLUGIN_NAME, "logfiles", logfiles_arr) + + # Modules config + var modules_arr = [] + sorted_keys = modules.keys() + sorted_keys.sort() + for module in sorted_keys: + modules_arr.append(modules[module].get_config()) + config.set_value(PLUGIN_NAME, "modules", modules_arr) + + # Save and return the corresponding error code + var err = config.save(configfile) + if err: + error("Could not save the config in '%s'; exited with error %d." \ + % [configfile, err], PLUGIN_NAME) + return err + info("Successfully saved the config to '%s'." % configfile, PLUGIN_NAME) + return OK + +func load_config(configfile = default_configfile_path): + """Load the configuration as well as the set of defined modules and + their respective configurations. The expect file contents must be those + produced by the ConfigFile API. + Returns an error code (OK or some ERR_*).""" + # Look for the file + var dir = Directory.new() + if not dir.file_exists(configfile): + warn("Could not load the config in '%s', the file does not exist." % configfile, PLUGIN_NAME) + return ERR_FILE_NOT_FOUND + + # Load its contents + var config = ConfigFile.new() + var err = config.load(configfile) + if err: + warn("Could not load the config in '%s'; exited with error %d." \ + % [configfile, err], PLUGIN_NAME) + return err + + # Load default config + default_output_level = config.get_value(PLUGIN_NAME, "default_output_level", default_output_level) + default_output_strategies = config.get_value(PLUGIN_NAME, "default_output_strategies", default_output_strategies) + default_logfile_path = config.get_value(PLUGIN_NAME, "default_logfile_path", default_logfile_path) + max_memory_size = config.get_value(PLUGIN_NAME, "max_memory_size", max_memory_size) + + # Load logfiles config and initialize them + logfiles = {} + for logfile_cfg in config.get_value(PLUGIN_NAME, "logfiles"): + var logfile = Logfile.new(logfile_cfg["path"], logfile_cfg["queue_mode"]) + logfiles[logfile_cfg["path"]] = logfile + + # Load modules config and initialize them + modules = {} + for module_cfg in config.get_value(PLUGIN_NAME, "modules"): + var module = Module.new(module_cfg["name"], module_cfg["output_level"], \ + module_cfg["output_strategies"], get_logfile(module_cfg["logfile_path"])) + modules[module_cfg["name"]] = module + + info("Successfully loaded the config from '%s'." % configfile, PLUGIN_NAME) + return OK + + +##=============## +## Callbacks ## +##=============## + +func _init(): + # Default logfile + add_logfile(default_logfile_path) + # Default modules + add_module(PLUGIN_NAME) # needs to be instanced first + add_module("main") + memory_buffer.resize(max_memory_size) + +func _exit_tree(): + # Flush non-empty buffers + var processed_logfiles = [] + var logfile = null + for module in modules: + logfile = modules[module].get_logfile() + if logfile in processed_logfiles: + continue + logfile.flush_buffer() + processed_logfiles.append(logfile) diff --git a/game/autoload/Logger.tscn b/game/autoload/Logger.tscn new file mode 100644 index 0000000..f504f33 --- /dev/null +++ b/game/autoload/Logger.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://autoload/Logger.gd" type="Script" id=1] + +[node name="Logger" type="Node"] +script = ExtResource( 1 ) diff --git a/game/autoload/ProfileManager.gd b/game/autoload/ProfileManager.gd new file mode 100644 index 0000000..c499b04 --- /dev/null +++ b/game/autoload/ProfileManager.gd @@ -0,0 +1,85 @@ +extends ProfileManager + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +#export (float) var save_interval : float = 20 +#var last_save_time : float = 0 + +func _ready(): + var save_game : File = File.new() + + if save_game.file_exists("user://profile.save"): + load_full() + else: + load_defaults() + + var actions : Array = InputMap.get_actions() + + for action in actions: + var acts : Array = InputMap.get_action_list(action) + + for i in range(len(acts)): + var a = acts[i] + if a is InputEventKey: + var nie : BSInputEventKey = BSInputEventKey.new() + nie.from_input_event_key(a as InputEventKey) + acts[i] = nie + + InputMap.action_erase_event(action, a) + InputMap.action_add_event(action, nie) + + +func _save() -> void: + save_full() + +func _load() -> void: + load_full() + +func save_full() -> void: + var save_game = File.new() + + save_game.open("user://profile.save", File.WRITE) + + save_game.store_line(to_json(to_dict())) + + save_game.close() + +func load_full() -> void: + clear_class_profiles() + + var save_game : File = File.new() + + if save_game.file_exists("user://profile.save"): + if save_game.open("user://profile.save", File.READ) == OK: + + var text : String = save_game.get_as_text() + + if text == "": + load_defaults() + return + + var save_json : Dictionary = parse_json(text) + + from_dict(save_json) + diff --git a/game/autoload/ProfileManager.tscn b/game/autoload/ProfileManager.tscn new file mode 100644 index 0000000..1d2cc57 --- /dev/null +++ b/game/autoload/ProfileManager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://autoload/ProfileManager.gd" type="Script" id=1] + +[node name="ProfileManager" type="ProfileManager"] +script = ExtResource( 1 ) diff --git a/game/autoload/Server.gd b/game/autoload/Server.gd new file mode 100644 index 0000000..bb7122f --- /dev/null +++ b/game/autoload/Server.gd @@ -0,0 +1,203 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (int) var port : int = 23223 + +signal cplayer_master_created(player_master) +signal cplayer_master_destroyed(player_master) + +signal splayer_master_created(player_master) +signal splayer_master_destroyed(player_master) + +var splayers_dict : Dictionary = {} +var splayers_array : Array = [] + +var cplayers_dict : Dictionary = {} +var cplayers_array : Array = [] + +var _sseed : int +var _cseed : int + +var local_player_master : PlayerMaster = PlayerMaster.new() + +func _ready() -> void: + #Temporary! REMOVE! + get_multiplayer().allow_object_decoding = true + + get_tree().connect("network_peer_connected", self, "_network_peer_connected") + get_tree().connect("network_peer_disconnected", self, "_network_peer_disconnected") + get_tree().connect("connected_to_server", self, "_connected_to_server") + get_tree().connect("connection_failed", self, "_connection_failed") + get_tree().connect("server_disconnected", self, "_server_disconnected") + + +func start_hosting(p_port : int = 0) -> int: + if p_port == 0: + p_port = port + + var peer : NetworkedMultiplayerENet = NetworkedMultiplayerENet.new() + var err : int = peer.create_server(p_port, 32) + get_tree().set_network_peer(peer) + + _connected_to_server() + + return err + +func start_hosting_websocket(p_port : int = 0) -> int: + if p_port == 0: + p_port = port + + var peer : WebSocketServer = WebSocketServer.new() + var err : int = peer.listen(p_port, [], true) + get_tree().set_network_peer(peer) + + _connected_to_server() + + return err + +func connect_to_server(address : String = "127.0.0.1", p_port : int = 0) -> int: + if p_port == 0: + p_port = port + + var peer = NetworkedMultiplayerENet.new() + var err : int = peer.create_client(address, p_port) + get_tree().set_network_peer(peer) + + return err + +func connect_to_server_websocket(address : String = "127.0.0.1", p_port : int = 0) -> int: + if p_port == 0: + p_port = port + + var peer = WebSocketClient.new() + var err : int = peer.connect_to_url(address + ":" + str(p_port), [], true) + get_tree().set_network_peer(peer) + + return err + +func _network_peer_connected(id : int) -> void: + Logger.verbose("NetworkManager peer connected " + str(id)) + +# for p in splayers_array: +# rpc_id(id, "cspawn_player", p.my_info, p.sid, p.player.translation) + + var pm : PlayerMaster = PlayerMaster.new() + pm.sid = id + + splayers_array.append(pm) + splayers_dict[id] = pm + + emit_signal("splayer_master_created", pm) + + rpc_id(id, "cset_seed", _sseed) + +func _network_peer_disconnected(id : int) -> void: + Logger.verbose("NetworkManager peer disconnected " + str(id)) + + var player : PlayerMaster = splayers_dict[id] + splayers_dict.erase(id) + + for pi in range(len(splayers_array)): + if (splayers_array[pi] as PlayerMaster) == player: + splayers_array.remove(pi) + break + + if player: + emit_signal("splayer_master_destroyed", player) + +func _connected_to_server() -> void: + Logger.verbose("NetworkManager _connected_to_server") + + var pm : PlayerMaster = PlayerMaster.new() + pm.sid = get_tree().get_network_unique_id() + + local_player_master = pm + + emit_signal("cplayer_master_created", pm) + +func _server_disconnected() -> void: + Logger.verbose("_server_disconnected") + + # Server kicked us; show error and abort. + + for player in get_children(): + emit_signal("NetworkManager cplayer_master_destroyed", player) + player.queue_free() + +func _connection_failed() -> void: + Logger.verbose("NetworkManager _connection_failed") + + pass # Could not even connect to server; abort. + +func sset_seed(pseed): + _sseed = pseed + + if multiplayer.has_network_peer() and multiplayer.is_network_server(): + rpc("cset_seed", _sseed) + +remote func cset_seed(pseed): + + _cseed = pseed + + print("clientseed set") + + +func set_class(): + Logger.verbose("set_class") + + if not get_tree().is_network_server(): + rpc_id(1, "crequest_select_class", local_player_master.my_info) + else: + crequest_select_class(local_player_master.my_info) + +remote func crequest_select_class(info : Dictionary) -> void: + Logger.verbose("NetworkManager crequest_select_class") + + if get_tree().is_network_server(): + var sid : int = get_tree().multiplayer.get_rpc_sender_id() + + if sid == 0: + sid = 1 + + rpc("cspawn_player", info, sid, Vector3(10, 10, 10)) + + +remotesync func cspawn_player(info : Dictionary, sid : int, pos : Vector3): + Logger.verbose("NetworkManager cspawn_player") + + if sid == get_tree().get_network_unique_id(): + local_player_master.player = Entities.spawn_player(info["selected_class"] as int, pos, info["name"] as String, str(sid), sid) + call_deferred("set_terrarin_player") + + if get_tree().is_network_server() and not splayers_dict.has(sid): + splayers_dict[sid] = local_player_master + splayers_array.append(local_player_master) + else: + var pm : PlayerMaster = PlayerMaster.new() + pm.sid = sid + + pm.player = Entities.spawn_networked_player(info["selected_class"] as int, pos, info["name"] as String, str(sid), sid) + + if get_tree().is_network_server() and not splayers_dict.has(sid): + splayers_dict[sid] = pm + splayers_array.append(pm) + + cplayers_dict[sid] = pm + cplayers_array.append(pm) + + +func upload_character(data : String) -> void: + rpc_id(1, "sreceive_upload_character", data) + +master func sreceive_upload_character(data: String) -> void: + Entities.spawn_networked_player_from_data(data, Vector3(0, 10, 0), multiplayer.get_rpc_sender_id()) + +func set_terrarin_player(): + Logger.verbose("NetworkManager cspawn_player") + + var terrarin : Spatial = get_node("/root/GameScene/VoxelWorld") + + terrarin.set_player(local_player_master.player as Node2D) diff --git a/game/autoload/Server.tscn b/game/autoload/Server.tscn new file mode 100644 index 0000000..2ba6975 --- /dev/null +++ b/game/autoload/Server.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://autoload/Server.gd" type="Script" id=1] + +[node name="Server" type="Node"] +script = ExtResource( 1 ) diff --git a/game/autoload/SettingsManager.gd b/game/autoload/SettingsManager.gd new file mode 100644 index 0000000..10f99d4 --- /dev/null +++ b/game/autoload/SettingsManager.gd @@ -0,0 +1,63 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +signal setting_changed(section, key, value) + +const SAVE_PATH : String = "user://settings.cfg" + +var _config_file : ConfigFile = ConfigFile.new() +var _settings : Dictionary = { + "rendering" : { + "thread_model" : ProjectSettings.get("rendering/threads/thread_model") + }, + "debug" : { + "debug_info" : false + } +} + +func _ready(): + load_settings() + +func set_value(section, key, value) -> void: + _settings[section][key] = value + + if has_method("set_" + section + "_" + key): + call("set_" + section + "_" + key, value) + + save_settings() + + emit_signal("setting_changed", section, key, value) + +func get_value(section, key): + return _settings[section][key] + +func _set_value(section, key, value) -> void: + _settings[section][key] = value + + if has_method("set_" + section + "_" + key): + call("set_" + section + "_" + key, value) + +func save_settings() -> void: + for section in _settings.keys(): + for key in _settings[section]: + _config_file.set_value(section, key, _settings[section][key]) + + _config_file.save(SAVE_PATH) + +func load_settings() -> void: + var error : int = _config_file.load(SAVE_PATH) + + if error != OK: +# print("Failed to load the settings file! Error code %s" % error) + return + + for section in _settings.keys(): + for key in _settings[section]: + _set_value(section, key, _config_file.get_value(section, key, _settings[section][key])) + + +func set_rendering_thread_model(value : int) -> void: + ProjectSettings.set("rendering/threads/thread_model", value) diff --git a/game/autoload/SettingsManager.tscn b/game/autoload/SettingsManager.tscn new file mode 100644 index 0000000..8e95a7d --- /dev/null +++ b/game/autoload/SettingsManager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://autoload/SettingsManager.gd" type="Script" id=1] + +[node name="SettingsManager" type="Node"] +script = ExtResource( 1 ) diff --git a/game/autoload/ThemeAtlas.gd b/game/autoload/ThemeAtlas.gd new file mode 100644 index 0000000..9ff5cf0 --- /dev/null +++ b/game/autoload/ThemeAtlas.gd @@ -0,0 +1,14 @@ +extends TextureMerger + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +#func _texture_added(texture): +# print("added") +# +#func _texture_removed(): +# print("removed") + +func _texture_merged(): + $Sprite.texture = get_generated_texture(0) diff --git a/game/autoload/ThemeAtlas.tscn b/game/autoload/ThemeAtlas.tscn new file mode 100644 index 0000000..1f171c9 --- /dev/null +++ b/game/autoload/ThemeAtlas.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=18 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=2] +[ext_resource path="res://ui/theme/h_scroll_bar_texture.tres" type="Texture" id=3] +[ext_resource path="res://ui/theme/panel_bg_atlas.tres" type="Texture" id=4] +[ext_resource path="res://ui/theme/scrollbar_bg_atlas.tres" type="Texture" id=5] +[ext_resource path="res://ui/theme/separator_texture.tres" type="Texture" id=6] +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=7] +[ext_resource path="res://ui/theme/bag_icon.tres" type="Texture" id=8] +[ext_resource path="res://ui/theme/locked_icon.tres" type="Texture" id=9] +[ext_resource path="res://ui/theme/unlocked_icon.tres" type="Texture" id=10] +[ext_resource path="res://ui/theme/spellbook_icon.tres" type="Texture" id=11] +[ext_resource path="res://ui/theme/radio_texture.tres" type="Texture" id=12] +[ext_resource path="res://ui/theme/radio_checked_texture.tres" type="Texture" id=13] +[ext_resource path="res://ui/theme/checkbox_texture.tres" type="Texture" id=14] +[ext_resource path="res://ui/theme/dropdown_icon.tres" type="Texture" id=15] +[ext_resource path="res://ui/theme/checkbox_checked_texture.tres" type="Texture" id=16] +[ext_resource path="res://ui/theme/window_bg_atlas.tres" type="Texture" id=17] +[ext_resource path="res://ui/theme/window_bg_bg.tres" type="Texture" id=18] + +[node name="ThemeAtlas" type="TextureMerger"] +texture_flags = 0 +keep_original_atlases = true +automatic_merge = true +textures = [ ExtResource( 8 ), ExtResource( 7 ), ExtResource( 16 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 3 ), ExtResource( 9 ), ExtResource( 4 ), ExtResource( 13 ), ExtResource( 12 ), ExtResource( 5 ), ExtResource( 2 ), ExtResource( 6 ), ExtResource( 11 ), ExtResource( 10 ), ExtResource( 17 ), ExtResource( 18 ) ] diff --git a/game/autoload/WorldNumbers.gd b/game/autoload/WorldNumbers.gd new file mode 100644 index 0000000..71e199a --- /dev/null +++ b/game/autoload/WorldNumbers.gd @@ -0,0 +1,36 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var number_scene + +func damage(entity_position : Vector2, entity_height : float, value : int, crit : bool) -> void: + var scene : Node = number_scene.instance() + + add_child(scene) + scene.owner = self + + entity_position.y += entity_height + (0.2 * randf()) + entity_position.x += entity_height * 0.4 - entity_height * 0.8 * randf() + + scene.damage(entity_position, value, crit) + +func heal(entity_position : Vector2, entity_height : float, value : int, crit : bool) -> void: + var scene : Node = number_scene.instance() + + add_child(scene) + scene.owner = self + + randomize() + + entity_position.y += entity_height + (0.3 * randf()) + entity_position.x += entity_height * 0.4 - entity_height * 0.8 * randf() + + + scene.heal(entity_position, value, crit) + +func clear() -> void: + for child in get_children(): + child.queue_free() diff --git a/game/autoload/WorldNumbers.tscn b/game/autoload/WorldNumbers.tscn new file mode 100644 index 0000000..7037d13 --- /dev/null +++ b/game/autoload/WorldNumbers.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://autoload/WorldNumbers.gd" type="Script" id=1] +[ext_resource path="res://ui/numbers/Number.tscn" type="PackedScene" id=2] + +[node name="WorldNumbers" type="Node"] +script = ExtResource( 1 ) +number_scene = ExtResource( 2 ) diff --git a/game/data/aura_groups/1_aspect_of_scorpions.tres b/game/data/aura_groups/1_aspect_of_scorpions.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/data/aura_groups/1_aspect_of_scorpions.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/data/aura_groups/2_aspect_of_wasps.tres b/game/data/aura_groups/2_aspect_of_wasps.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/data/aura_groups/2_aspect_of_wasps.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/data/aura_groups/3_aspect_of_wolves.tres b/game/data/aura_groups/3_aspect_of_wolves.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/data/aura_groups/3_aspect_of_wolves.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/data/aura_groups/4_aspect_of_bees.tres b/game/data/aura_groups/4_aspect_of_bees.tres new file mode 100644 index 0000000..46c7350 --- /dev/null +++ b/game/data/aura_groups/4_aspect_of_bees.tres @@ -0,0 +1,3 @@ +[gd_resource type="AuraGroup" format=2] + +[resource] diff --git a/game/data/auras/10_aspect_of_scorpions_rank_1.tres b/game/data/auras/10_aspect_of_scorpions_rank_1.tres new file mode 100644 index 0000000..581d101 --- /dev/null +++ b/game/data/auras/10_aspect_of_scorpions_rank_1.tres @@ -0,0 +1,28 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_scorpions.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/1_aspect_of_scorpions.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Scorpions" +id = 10 +icon = ExtResource( 2 ) +time = 30.0 +tick = 3.0 +debuff = true +rank = 10 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Scorpions" +text_description = "Deals 340 to 380 damage every 3 sec, and increases damage taken by 10% for 30 sec." +damage_enabled = true +damage_type = 8 +damage_min = 340 +damage_max = 355 +attribute_count = 1 +StatModAttribute_0/stat = 24 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = 10.0 +script = ExtResource( 1 ) diff --git a/game/data/auras/11_aspect_of_wasps_rank1.tres b/game/data/auras/11_aspect_of_wasps_rank1.tres new file mode 100644 index 0000000..7e37377 --- /dev/null +++ b/game/data/auras/11_aspect_of_wasps_rank1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_wasps.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/2_aspect_of_wasps.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 11 +icon = ExtResource( 2 ) +time = 21.0 +tick = 1.0 +debuff = true +rank = 10 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Wasps" +text_description = "Deals 230 to 270 damage every 3 sec, this damage increases over the duration, for 21 sec." +damage_enabled = true +damage_type = 16 +damage_min = 280 +damage_max = 300 +script = ExtResource( 1 ) diff --git a/game/data/auras/12_aspect_of_wolves_rank_1.tres b/game/data/auras/12_aspect_of_wolves_rank_1.tres new file mode 100644 index 0000000..20c8de4 --- /dev/null +++ b/game/data/auras/12_aspect_of_wolves_rank_1.tres @@ -0,0 +1,32 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_wolves.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/3_aspect_of_wolves.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 12 +icon = ExtResource( 2 ) +time = 22.0 +tick = 2.0 +debuff = true +rank = 10 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Wolves" +text_description = "Deals 280 to 330 damage every 2 sec, and reduces melee and spell damage by 10% for 22 sec." +damage_enabled = true +damage_type = 16 +damage_min = 280 +damage_max = 330 +attribute_count = 2 +StatModAttribute_0/stat = 26 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = -10.0 +StatModAttribute_1/stat = 27 +StatModAttribute_1/base_mod = 0.0 +StatModAttribute_1/bonus_mod = 0.0 +StatModAttribute_1/percent_mod = -10.0 +script = ExtResource( 1 ) diff --git a/game/data/auras/13_aspect_of_bees_rank_1.tres b/game/data/auras/13_aspect_of_bees_rank_1.tres new file mode 100644 index 0000000..ae28d31 --- /dev/null +++ b/game/data/auras/13_aspect_of_bees_rank_1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_bees.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/4_aspect_of_bees.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 13 +icon = ExtResource( 2 ) +time = 21.0 +tick = 3.0 +debuff = true +rank = 10 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Bees" +text_description = "Deals 460 to 540 damage every 3 sec, healing you for 80% of the damage." +damage_enabled = true +damage_type = 16 +damage_min = 420 +damage_max = 440 +script = ExtResource( 1 ) diff --git a/game/data/auras/14_rejuvenation_rank_1.tres b/game/data/auras/14_rejuvenation_rank_1.tres new file mode 100644 index 0000000..4dbb84b --- /dev/null +++ b/game/data/auras/14_rejuvenation_rank_1.tres @@ -0,0 +1,19 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/rejuvenation.tres" type="Texture" id=2] + +[resource] +resource_name = "Rejuvenation" +id = 14 +icon = ExtResource( 2 ) +time = 30.0 +tick = 3.0 +rank = 10 +aura_type = 1 +text_name = "Rejuvenation" +text_description = "Heals you for 400 to 450 every 3 sec for 30 sec." +heal_enabled = true +heal_min = 400 +heal_max = 450 +script = ExtResource( 1 ) diff --git a/game/data/auras/15_close_wounds_rank_1.tres b/game/data/auras/15_close_wounds_rank_1.tres new file mode 100644 index 0000000..f4c0159 --- /dev/null +++ b/game/data/auras/15_close_wounds_rank_1.tres @@ -0,0 +1,18 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/close_wounds.tres" type="Texture" id=2] + +[resource] +resource_name = "Close Wounds" +id = 15 +icon = ExtResource( 2 ) +time = 21.0 +tick = 3.0 +aura_type = 1 +text_name = "Close Wounds" +text_description = "Heals you for 720 to 780 every 3 sec for 21 sec." +heal_enabled = true +heal_min = 720 +heal_max = 780 +script = ExtResource( 1 ) diff --git a/game/data/auras/16_ironbark_rank_1.tres b/game/data/auras/16_ironbark_rank_1.tres new file mode 100644 index 0000000..a5f2775 --- /dev/null +++ b/game/data/auras/16_ironbark_rank_1.tres @@ -0,0 +1,19 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/ironbark.tres" type="Texture" id=2] + +[resource] +resource_name = "Ironbark" +id = 16 +icon = ExtResource( 2 ) +time = 6.0 +aura_type = 1 +text_name = "Ironbark" +text_description = "Reduces damage taken by 70%. This spell is not on the global cooldown." +attribute_count = 1 +StatModAttribute_0/stat = 24 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = -70.0 +script = ExtResource( 1 ) diff --git a/game/data/auras/17_natures_swiftness_rank_1.tres b/game/data/auras/17_natures_swiftness_rank_1.tres new file mode 100644 index 0000000..416d1bc --- /dev/null +++ b/game/data/auras/17_natures_swiftness_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://data/icons/naturalist/natures_swiftness.tres" type="Texture" id=1] +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=2] +[ext_resource path="res://data/effect_data/natures_swiftness.tres" type="SpellEffectVisual" id=3] + +[resource] +resource_name = "Nature's Swiftness" +id = 17 +icon = ExtResource( 1 ) +time = 10.0 +aura_type = 1 +text_name = "Nature's Swiftness" +text_description = "Increases your movement speed by 60% for 6 sec. This spell is not on the global cooldown." +visual_spell_effects = ExtResource( 3 ) +attribute_count = 1 +StatModAttribute_0/stat = 1 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = 60.0 +script = ExtResource( 2 ) diff --git a/game/data/auras/1_test1.tres b/game/data/auras/1_test1.tres new file mode 100644 index 0000000..25d72d0 --- /dev/null +++ b/game/data/auras/1_test1.tres @@ -0,0 +1,11 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/amplify_pain.tres" type="Texture" id=2] + +[resource] +id = 1 +icon = ExtResource( 2 ) +aura_type = 1 +text_description = "Test" +script = ExtResource( 1 ) diff --git a/game/data/auras/20_root_rank_1.tres b/game/data/auras/20_root_rank_1.tres new file mode 100644 index 0000000..c884450 --- /dev/null +++ b/game/data/auras/20_root_rank_1.tres @@ -0,0 +1,13 @@ +[gd_resource type="Aura" load_steps=3 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/root.tres" type="Texture" id=2] + +[resource] +id = 20 +icon = ExtResource( 2 ) +time = 10.0 +debuff = true +aura_type = 1 +states_add = 4 +script = ExtResource( 1 ) diff --git a/game/data/auras/21_aspect_of_scorpions.tres b/game/data/auras/21_aspect_of_scorpions.tres new file mode 100644 index 0000000..fe955e4 --- /dev/null +++ b/game/data/auras/21_aspect_of_scorpions.tres @@ -0,0 +1,28 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_scorpions.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/1_aspect_of_scorpions.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Scorpions" +id = 21 +icon = ExtResource( 2 ) +time = 30.0 +tick = 3.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Scorpions" +text_description = "Deals 340 to 380 damage every 3 sec, and increases damage taken by 10% for 30 sec." +damage_enabled = true +damage_type = 8 +damage_min = 10 +damage_max = 20 +attribute_count = 1 +StatModAttribute_0/stat = 24 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = 10.0 +script = ExtResource( 1 ) diff --git a/game/data/auras/22_aspect_of_wasps.tres b/game/data/auras/22_aspect_of_wasps.tres new file mode 100644 index 0000000..5a2085e --- /dev/null +++ b/game/data/auras/22_aspect_of_wasps.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_wasps.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/2_aspect_of_wasps.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 22 +icon = ExtResource( 2 ) +time = 21.0 +tick = 1.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Wasps" +text_description = "Deals 230 to 270 damage every 3 sec, this damage increases over the duration, for 21 sec." +damage_enabled = true +damage_type = 16 +damage_min = 6 +damage_max = 7 +script = ExtResource( 1 ) diff --git a/game/data/auras/23_aspect_of_wolves.tres b/game/data/auras/23_aspect_of_wolves.tres new file mode 100644 index 0000000..862b504 --- /dev/null +++ b/game/data/auras/23_aspect_of_wolves.tres @@ -0,0 +1,32 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_wolves.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/3_aspect_of_wolves.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 23 +icon = ExtResource( 2 ) +time = 22.0 +tick = 2.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Wolves" +text_description = "Deals 280 to 330 damage every 2 sec, and reduces melee and spell damage by 10% for 22 sec." +damage_enabled = true +damage_type = 16 +damage_min = 10 +damage_max = 12 +attribute_count = 2 +StatModAttribute_0/stat = 26 +StatModAttribute_0/base_mod = 0.0 +StatModAttribute_0/bonus_mod = 0.0 +StatModAttribute_0/percent_mod = -10.0 +StatModAttribute_1/stat = 27 +StatModAttribute_1/base_mod = 0.0 +StatModAttribute_1/bonus_mod = 0.0 +StatModAttribute_1/percent_mod = -10.0 +script = ExtResource( 1 ) diff --git a/game/data/auras/24_aspect_of_bees.tres b/game/data/auras/24_aspect_of_bees.tres new file mode 100644 index 0000000..5e8160d --- /dev/null +++ b/game/data/auras/24_aspect_of_bees.tres @@ -0,0 +1,23 @@ +[gd_resource type="Aura" load_steps=4 format=2] + +[ext_resource path="res://scripts/auras/aura_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_bees.tres" type="Texture" id=2] +[ext_resource path="res://data/aura_groups/4_aspect_of_bees.tres" type="AuraGroup" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 24 +icon = ExtResource( 2 ) +time = 21.0 +tick = 3.0 +debuff = true +rank = 1 +aura_type = 1 +aura_group = ExtResource( 3 ) +text_name = "Aspect of Bees" +text_description = "Deals 460 to 540 damage every 3 sec, healing you for 80% of the damage." +damage_enabled = true +damage_type = 16 +damage_min = 60 +damage_max = 80 +script = ExtResource( 1 ) diff --git a/game/data/biomes/1_test.tres b/game/data/biomes/1_test.tres new file mode 100644 index 0000000..dfbcdca --- /dev/null +++ b/game/data/biomes/1_test.tres @@ -0,0 +1,7 @@ +[gd_resource type="BiomeData" load_steps=2 format=2] + +[ext_resource path="res://scripts/biomes/simple_biome.gd" type="Script" id=1] + +[resource] +target_script = ExtResource( 1 ) +voxel_surfaces = [ null, null, null, null ] diff --git a/game/data/biomes/2_tdungb.tres b/game/data/biomes/2_tdungb.tres new file mode 100644 index 0000000..d1f6642 --- /dev/null +++ b/game/data/biomes/2_tdungb.tres @@ -0,0 +1,9 @@ +[gd_resource type="BiomeData" load_steps=3 format=2] + +[ext_resource path="res://scripts/biomes/simple_biome.gd" type="Script" id=1] +[ext_resource path="res://data/dungeons/1_test.tres" type="DungeonData" id=2] + +[resource] +target_script = ExtResource( 1 ) +dungeon_datas = [ ExtResource( 2 ) ] +voxel_surfaces = [ null, null, null, null ] diff --git a/game/data/character_specs/1_test.tres b/game/data/character_specs/1_test.tres new file mode 100644 index 0000000..569f57a --- /dev/null +++ b/game/data/character_specs/1_test.tres @@ -0,0 +1,3 @@ +[gd_resource type="CharacterSpec" format=2] + +[resource] diff --git a/game/data/character_specs/2_elementalist_fire.tres b/game/data/character_specs/2_elementalist_fire.tres new file mode 100644 index 0000000..759368f --- /dev/null +++ b/game/data/character_specs/2_elementalist_fire.tres @@ -0,0 +1,6 @@ +[gd_resource type="CharacterSpec" format=2] + +[resource] +resource_name = "Elementalist Fire" +id = 2 +text_name = "Elementalist Fire" diff --git a/game/data/character_specs/3_elementalist_water.tres b/game/data/character_specs/3_elementalist_water.tres new file mode 100644 index 0000000..44ccb22 --- /dev/null +++ b/game/data/character_specs/3_elementalist_water.tres @@ -0,0 +1,6 @@ +[gd_resource type="CharacterSpec" format=2] + +[resource] +resource_name = "Elementalist Water" +id = 3 +text_name = "Elementalist Water" diff --git a/game/data/character_specs/4_elementalist_ice.tres b/game/data/character_specs/4_elementalist_ice.tres new file mode 100644 index 0000000..8a517e5 --- /dev/null +++ b/game/data/character_specs/4_elementalist_ice.tres @@ -0,0 +1,6 @@ +[gd_resource type="CharacterSpec" format=2] + +[resource] +resource_name = "Elementalist Ice" +id = 4 +text_name = "Elementalist Ice" diff --git a/game/data/crafting/1_test_craft.tres b/game/data/crafting/1_test_craft.tres new file mode 100644 index 0000000..94f0602 --- /dev/null +++ b/game/data/crafting/1_test_craft.tres @@ -0,0 +1,36 @@ +[gd_resource type="CraftRecipe" load_steps=8 format=2] + +[ext_resource path="res://data/item_templates/2_test.tres" type="ItemTemplate" id=1] +[ext_resource path="res://data/item_templates/1_gold.tres" type="ItemTemplate" id=2] + +[sub_resource type="CraftRecipeHelper" id=1] +item = ExtResource( 2 ) +count = 1 + +[sub_resource type="CraftRecipeHelper" id=2] +item = ExtResource( 2 ) +count = 1 + +[sub_resource type="ItemTemplate" id=3] +resource_name = "sdfsdf" +text_name = "sdfsdf" + +[sub_resource type="CraftRecipeHelper" id=4] +item = SubResource( 3 ) + +[sub_resource type="CraftRecipeHelper" id=5] +item = ExtResource( 1 ) +count = 1 + +[resource] +resource_name = "Test" +id = 1 +text_name = "Test" +category = 1 +sub_category = 1 +required_materials_count = 2 +RequiredMaterials_0 = SubResource( 1 ) +RequiredMaterials_1 = SubResource( 2 ) +required_tools_count = 1 +RequiredTools_0 = SubResource( 4 ) +item = SubResource( 5 ) diff --git a/game/data/crafting/2_chest_of_the_infinite_wisdom.tres b/game/data/crafting/2_chest_of_the_infinite_wisdom.tres new file mode 100644 index 0000000..0a2e4a4 --- /dev/null +++ b/game/data/crafting/2_chest_of_the_infinite_wisdom.tres @@ -0,0 +1,21 @@ +[gd_resource type="CraftRecipe" load_steps=5 format=2] + +[ext_resource path="res://data/item_templates/3_chest_of_the_infinite_wisdom.tres" type="ItemTemplate" id=1] +[ext_resource path="res://data/item_templates/2_test.tres" type="ItemTemplate" id=2] + +[sub_resource type="CraftRecipeHelper" id=1] +item = ExtResource( 2 ) +count = 1 + +[sub_resource type="CraftRecipeHelper" id=2] +item = ExtResource( 1 ) +count = 1 + +[resource] +resource_name = "Chest of the Infinite Wisdom" +id = 2 +text_name = "Chest of the Infinite Wisdom" +category = 3 +required_materials_count = 1 +RequiredMaterials_0 = SubResource( 1 ) +item = SubResource( 2 ) diff --git a/game/data/cursors/arrow.png b/game/data/cursors/arrow.png new file mode 100644 index 0000000..cec826c Binary files /dev/null and b/game/data/cursors/arrow.png differ diff --git a/game/data/cursors/arrow.png.import b/game/data/cursors/arrow.png.import new file mode 100644 index 0000000..866c361 --- /dev/null +++ b/game/data/cursors/arrow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow.png-0e024be6846b021990cf06ddcfe3dbaa.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/arrow.png" +dest_files=[ "res://.import/arrow.png-0e024be6846b021990cf06ddcfe3dbaa.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/game/data/cursors/arrow16.png b/game/data/cursors/arrow16.png new file mode 100644 index 0000000..32b9bc0 Binary files /dev/null and b/game/data/cursors/arrow16.png differ diff --git a/game/data/cursors/arrow16.png.import b/game/data/cursors/arrow16.png.import new file mode 100644 index 0000000..bb81a94 --- /dev/null +++ b/game/data/cursors/arrow16.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow16.png-3cc04c454cd16744608672b930ebc21e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/arrow16.png" +dest_files=[ "res://.import/arrow16.png-3cc04c454cd16744608672b930ebc21e.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/game/data/cursors/arrow32.png b/game/data/cursors/arrow32.png new file mode 100644 index 0000000..6ff0ba5 Binary files /dev/null and b/game/data/cursors/arrow32.png differ diff --git a/game/data/cursors/arrow32.png.import b/game/data/cursors/arrow32.png.import new file mode 100644 index 0000000..f5a1d2c --- /dev/null +++ b/game/data/cursors/arrow32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow32.png-be6fa5cda55ea381f4bb81ac68755fdf.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/arrow32.png" +dest_files=[ "res://.import/arrow32.png-be6fa5cda55ea381f4bb81ac68755fdf.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/game/data/cursors/arrow8.png b/game/data/cursors/arrow8.png new file mode 100644 index 0000000..cec826c Binary files /dev/null and b/game/data/cursors/arrow8.png differ diff --git a/game/data/cursors/arrow8.png.import b/game/data/cursors/arrow8.png.import new file mode 100644 index 0000000..1dea28d --- /dev/null +++ b/game/data/cursors/arrow8.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow8.png-3b29b23d30f562ac61be19a8ca18c059.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/arrow8.png" +dest_files=[ "res://.import/arrow8.png-3b29b23d30f562ac61be19a8ca18c059.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/game/data/cursors/attack16.png b/game/data/cursors/attack16.png new file mode 100644 index 0000000..129ed67 Binary files /dev/null and b/game/data/cursors/attack16.png differ diff --git a/game/data/cursors/attack16.png.import b/game/data/cursors/attack16.png.import new file mode 100644 index 0000000..15c3e51 --- /dev/null +++ b/game/data/cursors/attack16.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/attack16.png-7ed84a4c029e562bb79e6820694ed73a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/attack16.png" +dest_files=[ "res://.import/attack16.png-7ed84a4c029e562bb79e6820694ed73a.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/game/data/cursors/drag_drop.png b/game/data/cursors/drag_drop.png new file mode 100644 index 0000000..4571488 Binary files /dev/null and b/game/data/cursors/drag_drop.png differ diff --git a/game/data/cursors/drag_drop.png.import b/game/data/cursors/drag_drop.png.import new file mode 100644 index 0000000..4becc9b --- /dev/null +++ b/game/data/cursors/drag_drop.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/drag_drop.png-7773305bcf75691af78b7c551d7687db.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/drag_drop.png" +dest_files=[ "res://.import/drag_drop.png-7773305bcf75691af78b7c551d7687db.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/game/data/cursors/forbidden.png b/game/data/cursors/forbidden.png new file mode 100644 index 0000000..0af4aef Binary files /dev/null and b/game/data/cursors/forbidden.png differ diff --git a/game/data/cursors/forbidden.png.import b/game/data/cursors/forbidden.png.import new file mode 100644 index 0000000..babab48 --- /dev/null +++ b/game/data/cursors/forbidden.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/forbidden.png-573414ca70e742cad716effeb28e0873.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/forbidden.png" +dest_files=[ "res://.import/forbidden.png-573414ca70e742cad716effeb28e0873.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/game/data/cursors/ibeam.png b/game/data/cursors/ibeam.png new file mode 100644 index 0000000..3eff87d Binary files /dev/null and b/game/data/cursors/ibeam.png differ diff --git a/game/data/cursors/ibeam.png.import b/game/data/cursors/ibeam.png.import new file mode 100644 index 0000000..562a700 --- /dev/null +++ b/game/data/cursors/ibeam.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ibeam.png-2c9af42df231350813f1688b4c7338a8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/ibeam.png" +dest_files=[ "res://.import/ibeam.png-2c9af42df231350813f1688b4c7338a8.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/game/data/cursors/loot16.png b/game/data/cursors/loot16.png new file mode 100644 index 0000000..8a93ddd Binary files /dev/null and b/game/data/cursors/loot16.png differ diff --git a/game/data/cursors/loot16.png.import b/game/data/cursors/loot16.png.import new file mode 100644 index 0000000..d0330b1 --- /dev/null +++ b/game/data/cursors/loot16.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/loot16.png-726ee829901668bed967b88a77b79dca.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/loot16.png" +dest_files=[ "res://.import/loot16.png-726ee829901668bed967b88a77b79dca.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/game/data/cursors/speak.png b/game/data/cursors/speak.png new file mode 100644 index 0000000..909748c Binary files /dev/null and b/game/data/cursors/speak.png differ diff --git a/game/data/cursors/speak.png.import b/game/data/cursors/speak.png.import new file mode 100644 index 0000000..da790b3 --- /dev/null +++ b/game/data/cursors/speak.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/speak.png-4f28d4f817d13bbd186e0ad861f71a83.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/cursors/speak.png" +dest_files=[ "res://.import/speak.png-4f28d4f817d13bbd186e0ad861f71a83.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/game/data/dungeon_rooms/1_test.tres b/game/data/dungeon_rooms/1_test.tres new file mode 100644 index 0000000..816db79 --- /dev/null +++ b/game/data/dungeon_rooms/1_test.tres @@ -0,0 +1,3 @@ +[gd_resource type="DungeonRoomData" format=2] + +[resource] diff --git a/game/data/dungeon_rooms/2_test_start_room.tres b/game/data/dungeon_rooms/2_test_start_room.tres new file mode 100644 index 0000000..bb0fe8f --- /dev/null +++ b/game/data/dungeon_rooms/2_test_start_room.tres @@ -0,0 +1,6 @@ +[gd_resource type="DungeonRoomData" load_steps=2 format=2] + +[ext_resource path="res://scripts/dungeon_start_rooms/start_room.gd" type="Script" id=1] + +[resource] +target_script = ExtResource( 1 ) diff --git a/game/data/dungeons/1_test.tres b/game/data/dungeons/1_test.tres new file mode 100644 index 0000000..b3dfbff --- /dev/null +++ b/game/data/dungeons/1_test.tres @@ -0,0 +1,8 @@ +[gd_resource type="DungeonData" load_steps=3 format=2] + +[ext_resource path="res://scripts/dungeons/dungeon.gd" type="Script" id=1] +[ext_resource path="res://data/dungeon_rooms/2_test_start_room.tres" type="DungeonRoomData" id=2] + +[resource] +target_script = ExtResource( 1 ) +dungeon_start_room_datas = [ ExtResource( 2 ) ] diff --git a/game/data/effect_data/aspect_of_scorpions.tres b/game/data/effect_data/aspect_of_scorpions.tres new file mode 100644 index 0000000..2374e69 --- /dev/null +++ b/game/data/effect_data/aspect_of_scorpions.tres @@ -0,0 +1,10 @@ +[gd_resource type="SpellEffectVisual" load_steps=2 format=2] + +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=1] + +[resource] +script = ExtResource( 1 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect_time = 4.0 +root_spell_cast_finish_effect_time = 1.0 diff --git a/game/data/effect_data/natures_swiftness.tres b/game/data/effect_data/natures_swiftness.tres new file mode 100644 index 0000000..6d0c851 --- /dev/null +++ b/game/data/effect_data/natures_swiftness.tres @@ -0,0 +1,10 @@ +[gd_resource type="SpellEffectVisual" load_steps=2 format=2] + +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=1] + +[resource] +script = ExtResource( 1 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect_time = 1.0 +root_spell_cast_finish_effect_time = 1.0 diff --git a/game/data/entities/1_naturalist.tres b/game/data/entities/1_naturalist.tres new file mode 100644 index 0000000..dec8206 --- /dev/null +++ b/game/data/entities/1_naturalist.tres @@ -0,0 +1,18 @@ +[gd_resource type="EntityData" load_steps=5 format=2] + +[ext_resource path="res://data/entity_classes/1_naturalist.tres" type="EntityClassData" id=1] +[ext_resource path="res://scripts/entities/EntityDataGD.gd" type="Script" id=2] +[ext_resource path="res://data/item_templates/2_test.tres" type="ItemTemplate" id=3] + +[sub_resource type="LootDataItem" id=1] +item = ExtResource( 3 ) + +[resource] +resource_name = "Naturalist" +id = 1 +entity_type = 4 +entity_controller = 1 +text_name = "Naturalist" +entity_class_data = ExtResource( 1 ) +loot_db = SubResource( 1 ) +script = ExtResource( 2 ) diff --git a/game/data/entity_classes/1_naturalist.tres b/game/data/entity_classes/1_naturalist.tres new file mode 100644 index 0000000..998f958 --- /dev/null +++ b/game/data/entity_classes/1_naturalist.tres @@ -0,0 +1,259 @@ +[gd_resource type="EntityClassData" load_steps=77 format=2] + +[ext_resource path="res://data/spells/26_rest.tres" type="Spell" id=1] +[ext_resource path="res://data/spells/21_strength_of_nature_rank_1.tres" type="Spell" id=2] +[ext_resource path="res://data/spells/14_amplify_pain_rank_1.tres" type="Spell" id=3] +[ext_resource path="res://data/spells/10_aspect_of_scorpions_rank_1.tres" type="Spell" id=4] +[ext_resource path="res://data/spells/13_aspect_of_bees_rank_1.tres" type="Spell" id=5] +[ext_resource path="res://data/spells/11_aspect_of_wasps_rank_1.tres" type="Spell" id=6] +[ext_resource path="res://data/spells/19_uproot_rank_1.tres" type="Spell" id=7] +[ext_resource path="res://data/spells/16_close_wounds_rank_1.tres" type="Spell" id=8] +[ext_resource path="res://data/spells/18_natures_swiftness_rank_1.tres" type="Spell" id=9] +[ext_resource path="res://data/spells/15_rejuvenation_rank_1.tres" type="Spell" id=10] +[ext_resource path="res://data/spells/17_ironbark_rank_1.tres" type="Spell" id=11] +[ext_resource path="res://data/spells/22_shield_of_barbs_rank_1.tres" type="Spell" id=12] +[ext_resource path="res://data/spells/20_root_rank_1.tres" type="Spell" id=13] +[ext_resource path="res://data/spells/23_calm_rank_1.tres" type="Spell" id=14] +[ext_resource path="res://data/spells/24_attunement_rank_1.tres" type="Spell" id=15] +[ext_resource path="res://data/spells/12_aspect_of_wolves_rank_1.tres" type="Spell" id=16] +[ext_resource path="res://data/spells/25_inner_will.tres" type="Spell" id=17] +[ext_resource path="res://data/auras/1_test1.tres" type="Aura" id=18] +[ext_resource path="res://scripts/entities/EntityClassDataGD.gd" type="Script" id=19] +[ext_resource path="res://scripts/ai/EntityAIGD.gd" type="Script" id=20] +[ext_resource path="res://data/auras/13_aspect_of_bees_rank_1.tres" type="Aura" id=21] +[ext_resource path="res://data/auras/15_close_wounds_rank_1.tres" type="Aura" id=22] +[ext_resource path="res://data/spells/29_aspect_of_wolves.tres" type="Spell" id=23] +[ext_resource path="res://data/spells/27_aspect_of_scorpions.tres" type="Spell" id=24] +[ext_resource path="res://data/spells/28_aspectofwasps.tres" type="Spell" id=25] +[ext_resource path="res://data/spells/30_aspect_of_bees.tres" type="Spell" id=26] +[ext_resource path="res://data/entity_resources/1_mana_resource.tres" type="EntityResourceData" id=27] + +[sub_resource type="EntityAI" id=1] +script = ExtResource( 20 ) + +[sub_resource type="TalentRowData" id=2] +Talent_0_0 = ExtResource( 21 ) + +[sub_resource type="TalentRowData" id=3] +Talent_2_0 = ExtResource( 22 ) + +[sub_resource type="CharacterSpec" id=4] +id = 1 +talent_rows = [ SubResource( 2 ), SubResource( 3 ) ] + +[sub_resource type="StatDataEntry" id=5] +stat_id = 5 +base = 12.0 + +[sub_resource type="StatDataEntry" id=6] +stat_id = 12 + +[sub_resource type="StatDataEntry" id=7] +stat_id = 13 + +[sub_resource type="StatDataEntry" id=8] +stat_id = 19 + +[sub_resource type="StatDataEntry" id=9] +stat_id = 34 + +[sub_resource type="StatDataEntry" id=10] +stat_id = 21 + +[sub_resource type="StatDataEntry" id=11] +stat_id = 24 + +[sub_resource type="StatDataEntry" id=12] +stat_id = 38 + +[sub_resource type="StatDataEntry" id=13] +stat_id = 36 + +[sub_resource type="StatDataEntry" id=14] +stat_id = 31 + +[sub_resource type="StatDataEntry" id=15] +stat_id = 32 + +[sub_resource type="StatDataEntry" id=16] +stat_id = 3 +base = 1.5 + +[sub_resource type="StatDataEntry" id=17] +stat_id = 4 + +[sub_resource type="StatDataEntry" id=18] +stat_id = 10 + +[sub_resource type="StatDataEntry" id=19] +stat_id = 25 + +[sub_resource type="StatDataEntry" id=20] +stat_id = 0 + +[sub_resource type="StatDataEntry" id=21] +stat_id = 28 + +[sub_resource type="Curve" id=22] +max_value = 10.0 +_data = [ Vector2( 0, 10 ), 0.0, 0.0, 0, 1, Vector2( 1, 10 ), 0.0, 0.0, 1, 0 ] + +[sub_resource type="StatDataEntry" id=23] +stat_id = 8 +base = 20.0 +mod_stat_count = 1 +ModStat_0/stat_id = 2 +ModStat_0/curve = SubResource( 22 ) +ModStat_0/max_value = 1000.0 + +[sub_resource type="StatDataEntry" id=24] +stat_id = 33 + +[sub_resource type="StatDataEntry" id=25] +stat_id = 2 + +[sub_resource type="StatDataEntry" id=26] +stat_id = 15 +base = 5.0 + +[sub_resource type="StatDataEntry" id=27] +stat_id = 16 +base = 50.0 + +[sub_resource type="StatDataEntry" id=28] +stat_id = 26 + +[sub_resource type="StatDataEntry" id=29] +stat_id = 22 +base = 15.0 + +[sub_resource type="StatDataEntry" id=30] +stat_id = 30 + +[sub_resource type="StatDataEntry" id=31] +stat_id = 20 + +[sub_resource type="StatDataEntry" id=32] +stat_id = 39 + +[sub_resource type="StatDataEntry" id=33] +stat_id = 11 + +[sub_resource type="StatDataEntry" id=34] +stat_id = 29 + +[sub_resource type="StatDataEntry" id=35] +stat_id = 35 + +[sub_resource type="StatDataEntry" id=36] +stat_id = 1 +base = 4.2 +modifier_apply_type = 1 + +[sub_resource type="StatDataEntry" id=37] +stat_id = 17 +base = 5.0 + +[sub_resource type="StatDataEntry" id=38] +stat_id = 18 +base = 50.0 + +[sub_resource type="StatDataEntry" id=39] +stat_id = 27 + +[sub_resource type="StatDataEntry" id=40] +stat_id = 23 + +[sub_resource type="StatDataEntry" id=41] +stat_id = 14 + +[sub_resource type="StatDataEntry" id=42] +stat_id = 9 + +[sub_resource type="Curve" id=43] +max_value = 10.0 +_data = [ Vector2( 0, 10 ), 0.0, 0.0, 0, 1, Vector2( 1, 10 ), 0.0, 0.0, 1, 0 ] + +[sub_resource type="StatDataEntry" id=44] +stat_id = 7 +base = 10.0 +mod_stat_count = 1 +ModStat_0/stat_id = 0 +ModStat_0/curve = SubResource( 43 ) +ModStat_0/max_value = 1000.0 + +[sub_resource type="StatDataEntry" id=45] +stat_id = 6 +base = 8.0 + +[sub_resource type="StatDataEntry" id=46] +stat_id = 37 + +[sub_resource type="StatDataEntry" id=47] +stat_id = 40 +base = 1.0 + +[sub_resource type="SimpleLevelStatData" id=48] +agility_per_level = 4 +strength_per_level = 2 +stamina_per_level = 4 +intellect_per_level = 4 +spirit_per_level = 6 + +[sub_resource type="StatData" id=49] +base_stat_health = SubResource( 20 ) +base_stat_speed = SubResource( 36 ) +base_stat_mana = SubResource( 25 ) +base_stat_gcd = SubResource( 16 ) +base_stat_haste = SubResource( 17 ) +base_stat_agility = SubResource( 5 ) +base_stat_strength = SubResource( 45 ) +base_stat_stamina = SubResource( 44 ) +base_stat_intellect = SubResource( 23 ) +base_stat_spirit = SubResource( 42 ) +base_stat_haste_rating = SubResource( 18 ) +base_stat_resilience = SubResource( 33 ) +base_stat_armor = SubResource( 6 ) +base_stat_attack_power = SubResource( 7 ) +base_stat_spell_power = SubResource( 41 ) +base_stat_melee_crit = SubResource( 26 ) +base_stat_melee_crit_bonus = SubResource( 27 ) +base_stat_spell_crit = SubResource( 37 ) +base_stat_spell_crit_bonus = SubResource( 38 ) +base_stat_block = SubResource( 8 ) +base_stat_parry = SubResource( 31 ) +base_stat_damage_reduction = SubResource( 10 ) +base_stat_melee_damage_reduction = SubResource( 29 ) +base_stat_spell_damage_reduction = SubResource( 40 ) +base_stat_damage_taken = SubResource( 11 ) +base_stat_heal_taken = SubResource( 19 ) +base_stat_melee_damage = SubResource( 28 ) +base_stat_spell_damage = SubResource( 39 ) +base_stat_holy_resist = SubResource( 21 ) +base_stat_shadow_resist = SubResource( 34 ) +base_stat_nature_resist = SubResource( 30 ) +base_stat_fire_resist = SubResource( 14 ) +base_stat_frost_resist = SubResource( 15 ) +base_stat_lightning_resist = SubResource( 24 ) +base_stat_chaos_resist = SubResource( 9 ) +base_stat_silence_resist = SubResource( 35 ) +base_stat_fear_resist = SubResource( 13 ) +base_stat_stun_resist = SubResource( 46 ) +base_stat_energy = SubResource( 12 ) +base_stat_rage = SubResource( 32 ) +base_stat_xp_rate = SubResource( 47 ) +level_stat_data = SubResource( 48 ) + +[resource] +resource_name = "Naturalist" +id = 1 +text_name = "Naturalist" +stat_data = SubResource( 49 ) +player_resource_type = 2 +entity_resources = [ ExtResource( 27 ) ] +specs = [ SubResource( 4 ) ] +spells = [ ExtResource( 4 ), ExtResource( 6 ), ExtResource( 16 ), ExtResource( 5 ), ExtResource( 3 ), ExtResource( 10 ), ExtResource( 8 ), ExtResource( 11 ), ExtResource( 9 ), ExtResource( 7 ), ExtResource( 13 ), ExtResource( 2 ), ExtResource( 12 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 17 ), ExtResource( 1 ), ExtResource( 24 ), ExtResource( 25 ), ExtResource( 23 ), ExtResource( 26 ) ] +start_spells = [ ExtResource( 24 ) ] +auras = [ ExtResource( 18 ) ] +ais = [ SubResource( 1 ) ] +script = ExtResource( 19 ) diff --git a/game/data/entity_classes/2_elementalist.tres b/game/data/entity_classes/2_elementalist.tres new file mode 100644 index 0000000..e5a5eda --- /dev/null +++ b/game/data/entity_classes/2_elementalist.tres @@ -0,0 +1,207 @@ +[gd_resource type="EntityClassData" load_steps=51 format=2] + +[ext_resource path="res://scripts/entities/EntityClassDataGD.gd" type="Script" id=1] +[ext_resource path="res://data/character_specs/2_elementalist_fire.tres" type="CharacterSpec" id=2] +[ext_resource path="res://data/character_specs/3_elementalist_water.tres" type="CharacterSpec" id=3] +[ext_resource path="res://data/character_specs/4_elementalist_ice.tres" type="CharacterSpec" id=4] +[ext_resource path="res://data/spells/34_cold.tres" type="Spell" id=5] +[ext_resource path="res://data/spells/32_heat.tres" type="Spell" id=6] +[ext_resource path="res://data/spells/33_normal.tres" type="Spell" id=7] + +[sub_resource type="StatDataEntry" id=1] +stat_id = 5 + +[sub_resource type="StatDataEntry" id=2] +stat_id = 12 + +[sub_resource type="StatDataEntry" id=3] +stat_id = 13 + +[sub_resource type="StatDataEntry" id=4] +stat_id = 19 +base = 10.0 + +[sub_resource type="StatDataEntry" id=5] +stat_id = 34 + +[sub_resource type="StatDataEntry" id=6] +stat_id = 21 + +[sub_resource type="StatDataEntry" id=7] +stat_id = 24 + +[sub_resource type="StatDataEntry" id=8] +stat_id = 38 + +[sub_resource type="StatDataEntry" id=9] +stat_id = 36 + +[sub_resource type="StatDataEntry" id=10] +stat_id = 31 + +[sub_resource type="StatDataEntry" id=11] +stat_id = 32 + +[sub_resource type="StatDataEntry" id=12] +stat_id = 3 +base = 1.5 + +[sub_resource type="StatDataEntry" id=13] +stat_id = 4 + +[sub_resource type="StatDataEntry" id=14] +stat_id = 10 + +[sub_resource type="StatDataEntry" id=15] +stat_id = 25 + +[sub_resource type="StatDataEntry" id=16] +stat_id = 0 +base = 100.0 + +[sub_resource type="StatDataEntry" id=17] +stat_id = 28 + +[sub_resource type="StatDataEntry" id=18] +stat_id = 8 + +[sub_resource type="StatDataEntry" id=19] +stat_id = 33 + +[sub_resource type="StatDataEntry" id=20] +stat_id = 2 +base = 100.0 + +[sub_resource type="StatDataEntry" id=21] +stat_id = 15 +base = 5.0 + +[sub_resource type="StatDataEntry" id=22] +stat_id = 16 +base = 50.0 + +[sub_resource type="StatDataEntry" id=23] +stat_id = 26 + +[sub_resource type="StatDataEntry" id=24] +stat_id = 22 +base = 15.0 + +[sub_resource type="StatDataEntry" id=25] +stat_id = 30 + +[sub_resource type="StatDataEntry" id=26] +stat_id = 20 +base = 15.0 + +[sub_resource type="StatDataEntry" id=27] +stat_id = 39 + +[sub_resource type="StatDataEntry" id=28] +stat_id = 11 + +[sub_resource type="StatDataEntry" id=29] +stat_id = 29 + +[sub_resource type="StatDataEntry" id=30] +stat_id = 35 + +[sub_resource type="StatDataEntry" id=31] +stat_id = 1 +base = 4.2 + +[sub_resource type="StatDataEntry" id=32] +stat_id = 17 +base = 5.0 + +[sub_resource type="StatDataEntry" id=33] +stat_id = 18 +base = 50.0 + +[sub_resource type="StatDataEntry" id=34] +stat_id = 27 + +[sub_resource type="StatDataEntry" id=35] +stat_id = 23 + +[sub_resource type="StatDataEntry" id=36] +stat_id = 14 + +[sub_resource type="StatDataEntry" id=37] +stat_id = 9 + +[sub_resource type="StatDataEntry" id=38] +stat_id = 7 + +[sub_resource type="StatDataEntry" id=39] +stat_id = 6 + +[sub_resource type="StatDataEntry" id=40] +stat_id = 37 + +[sub_resource type="StatDataEntry" id=41] +stat_id = 40 +base = 1.0 + +[sub_resource type="SimpleLevelStatData" id=42] +agility_per_level = 4 +strength_per_level = 4 +stamina_per_level = 5 +intellect_per_level = 5 +spirit_per_level = 1 + +[sub_resource type="StatData" id=43] +base_stat_health = SubResource( 16 ) +base_stat_speed = SubResource( 31 ) +base_stat_mana = SubResource( 20 ) +base_stat_gcd = SubResource( 12 ) +base_stat_haste = SubResource( 13 ) +base_stat_agility = SubResource( 1 ) +base_stat_strength = SubResource( 39 ) +base_stat_stamina = SubResource( 38 ) +base_stat_intellect = SubResource( 18 ) +base_stat_spirit = SubResource( 37 ) +base_stat_haste_rating = SubResource( 14 ) +base_stat_resilience = SubResource( 28 ) +base_stat_armor = SubResource( 2 ) +base_stat_attack_power = SubResource( 3 ) +base_stat_spell_power = SubResource( 36 ) +base_stat_melee_crit = SubResource( 21 ) +base_stat_melee_crit_bonus = SubResource( 22 ) +base_stat_spell_crit = SubResource( 32 ) +base_stat_spell_crit_bonus = SubResource( 33 ) +base_stat_block = SubResource( 4 ) +base_stat_parry = SubResource( 26 ) +base_stat_damage_reduction = SubResource( 6 ) +base_stat_melee_damage_reduction = SubResource( 24 ) +base_stat_spell_damage_reduction = SubResource( 35 ) +base_stat_damage_taken = SubResource( 7 ) +base_stat_heal_taken = SubResource( 15 ) +base_stat_melee_damage = SubResource( 23 ) +base_stat_spell_damage = SubResource( 34 ) +base_stat_holy_resist = SubResource( 17 ) +base_stat_shadow_resist = SubResource( 29 ) +base_stat_nature_resist = SubResource( 25 ) +base_stat_fire_resist = SubResource( 10 ) +base_stat_frost_resist = SubResource( 11 ) +base_stat_lightning_resist = SubResource( 19 ) +base_stat_chaos_resist = SubResource( 5 ) +base_stat_silence_resist = SubResource( 30 ) +base_stat_fear_resist = SubResource( 9 ) +base_stat_stun_resist = SubResource( 40 ) +base_stat_energy = SubResource( 8 ) +base_stat_rage = SubResource( 27 ) +base_stat_xp_rate = SubResource( 41 ) +level_stat_data = SubResource( 42 ) + +[resource] +resource_name = "Elementalist" +id = 2 +text_name = "Elementalist" +stat_data = SubResource( 43 ) +player_resource_type = 2 +playstyle_type = 2 +specs = [ ExtResource( 2 ), ExtResource( 3 ), ExtResource( 4 ) ] +spells = [ ExtResource( 6 ), ExtResource( 7 ), ExtResource( 5 ) ] +start_spells = [ ExtResource( 7 ) ] +script = ExtResource( 1 ) diff --git a/game/data/entity_resources/1_mana_resource.tres b/game/data/entity_resources/1_mana_resource.tres new file mode 100644 index 0000000..b3cff4e --- /dev/null +++ b/game/data/entity_resources/1_mana_resource.tres @@ -0,0 +1,7 @@ +[gd_resource type="EntityResourceData" load_steps=2 format=2] + +[ext_resource path="res://scripts/resources/ManaResourceData.gd" type="Script" id=1] + +[resource] +id = 1 +script = ExtResource( 1 ) diff --git a/game/data/entity_skills/1_test.tres b/game/data/entity_skills/1_test.tres new file mode 100644 index 0000000..f921777 --- /dev/null +++ b/game/data/entity_skills/1_test.tres @@ -0,0 +1,4 @@ +[gd_resource type="EntitySkillData" format=2] + +[resource] +id = 1 diff --git a/game/data/environments/default_env.tres b/game/data/environments/default_env.tres new file mode 100644 index 0000000..d37b59d --- /dev/null +++ b/game/data/environments/default_env.tres @@ -0,0 +1,13 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] +sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) +sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) +sky_curve = 0.25 +ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) +ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) +ground_curve = 0.01 + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/game/data/fonts/OFL.txt b/game/data/fonts/OFL.txt new file mode 100644 index 0000000..3e89993 --- /dev/null +++ b/game/data/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2011, Peter Hull (peter.hull@oikoi.com), with Reserved Font Name "VT323". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/game/data/fonts/VT323-Regular.ttf b/game/data/fonts/VT323-Regular.ttf new file mode 100644 index 0000000..8eeeae6 Binary files /dev/null and b/game/data/fonts/VT323-Regular.ttf differ diff --git a/game/data/icons/3_iron_bar.tres b/game/data/icons/3_iron_bar.tres new file mode 100644 index 0000000..947753e --- /dev/null +++ b/game/data/icons/3_iron_bar.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-1/11.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/4_chest_of_the_infinite_wisdom.tres b/game/data/icons/4_chest_of_the_infinite_wisdom.tres new file mode 100644 index 0000000..14365a3 --- /dev/null +++ b/game/data/icons/4_chest_of_the_infinite_wisdom.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-1/43.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 1, 0, 16, 16 ) diff --git a/game/data/icons/icons-1/11.png b/game/data/icons/icons-1/11.png new file mode 100644 index 0000000..eeb2975 Binary files /dev/null and b/game/data/icons/icons-1/11.png differ diff --git a/game/data/icons/icons-1/11.png.import b/game/data/icons/icons-1/11.png.import new file mode 100644 index 0000000..f1728ce --- /dev/null +++ b/game/data/icons/icons-1/11.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/11.png-07e650908b891ede325cc982e1ae45cf.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-1/11.png" +dest_files=[ "res://.import/11.png-07e650908b891ede325cc982e1ae45cf.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=false +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/game/data/icons/icons-1/43.png b/game/data/icons/icons-1/43.png new file mode 100644 index 0000000..3c8609c Binary files /dev/null and b/game/data/icons/icons-1/43.png differ diff --git a/game/data/icons/icons-1/43.png.import b/game/data/icons/icons-1/43.png.import new file mode 100644 index 0000000..9ccf977 --- /dev/null +++ b/game/data/icons/icons-1/43.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/43.png-6dc7b9a4af8cb0fa1fb232dbb733ea3e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-1/43.png" +dest_files=[ "res://.import/43.png-6dc7b9a4af8cb0fa1fb232dbb733ea3e.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=false +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/game/data/icons/icons-1/5.png b/game/data/icons/icons-1/5.png new file mode 100644 index 0000000..2bbb459 Binary files /dev/null and b/game/data/icons/icons-1/5.png differ diff --git a/game/data/icons/icons-1/5.png.import b/game/data/icons/icons-1/5.png.import new file mode 100644 index 0000000..8aeedf7 --- /dev/null +++ b/game/data/icons/icons-1/5.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/5.png-c332f38dae48aad24a86e83f8f203afd.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-1/5.png" +dest_files=[ "res://.import/5.png-c332f38dae48aad24a86e83f8f203afd.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=false +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/game/data/icons/icons-1/61.png b/game/data/icons/icons-1/61.png new file mode 100644 index 0000000..c24ff5f Binary files /dev/null and b/game/data/icons/icons-1/61.png differ diff --git a/game/data/icons/icons-1/61.png.import b/game/data/icons/icons-1/61.png.import new file mode 100644 index 0000000..eed9340 --- /dev/null +++ b/game/data/icons/icons-1/61.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/61.png-1bfbc8ba1d7bb6d2525edf7c22dd4c30.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-1/61.png" +dest_files=[ "res://.import/61.png-1bfbc8ba1d7bb6d2525edf7c22dd4c30.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=false +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/game/data/icons/icons-1/Readme.txt b/game/data/icons/icons-1/Readme.txt new file mode 100644 index 0000000..9506d30 --- /dev/null +++ b/game/data/icons/icons-1/Readme.txt @@ -0,0 +1,16 @@ +All graphics in this folder is under CCO license, that means you can do whatever you want with them. + +The sources is not included because i lost them. + +I would be greatful if you email me at DustyChest@gmail.com and infoem where are you using these graphics. :) + +Good luck with your projects! :) + + +My website(blog): http://dustychest.blogspot.com/ + +Contact: DustyChest@gmail.com + +from https://opengameart.org/content/skill-item-and-spell-icons + +Thanks! diff --git a/game/data/icons/icons-2/README.txt b/game/data/icons/icons-2/README.txt new file mode 100644 index 0000000..153e533 --- /dev/null +++ b/game/data/icons/icons-2/README.txt @@ -0,0 +1,12 @@ +From https://opengameart.org/content/painterly-spell-icons-part-1 + +License(s): +CC-BY 3.0 +CC-BY-SA 3.0 +GPL 3.0 +GPL 2.0 + +Copyright/Attribution Notice: +J. W. Bjerk (eleazzaar) -- www.jwbjerk.com/art -- find this and other open art at: http://opengameart.org + +Thanks! diff --git a/game/data/icons/icons-2/enchant-acid-2.png b/game/data/icons/icons-2/enchant-acid-2.png new file mode 100644 index 0000000..541e072 Binary files /dev/null and b/game/data/icons/icons-2/enchant-acid-2.png differ diff --git a/game/data/icons/icons-2/enchant-acid-2.png.import b/game/data/icons/icons-2/enchant-acid-2.png.import new file mode 100644 index 0000000..13e189e --- /dev/null +++ b/game/data/icons/icons-2/enchant-acid-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/enchant-acid-2.png-318cc891e8cebdc94ca80ad314294e9a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/enchant-acid-2.png" +dest_files=[ "res://.import/enchant-acid-2.png-318cc891e8cebdc94ca80ad314294e9a.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=false +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/game/data/icons/icons-2/enchant-blue-2.png b/game/data/icons/icons-2/enchant-blue-2.png new file mode 100644 index 0000000..c824393 Binary files /dev/null and b/game/data/icons/icons-2/enchant-blue-2.png differ diff --git a/game/data/icons/icons-2/enchant-blue-2.png.import b/game/data/icons/icons-2/enchant-blue-2.png.import new file mode 100644 index 0000000..245fa46 --- /dev/null +++ b/game/data/icons/icons-2/enchant-blue-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/enchant-blue-2.png-c9908f0a2a0fcfcfe240897d34b2f283.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/enchant-blue-2.png" +dest_files=[ "res://.import/enchant-blue-2.png-c9908f0a2a0fcfcfe240897d34b2f283.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=false +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/game/data/icons/icons-2/heal-jade-2.png b/game/data/icons/icons-2/heal-jade-2.png new file mode 100644 index 0000000..84df53d Binary files /dev/null and b/game/data/icons/icons-2/heal-jade-2.png differ diff --git a/game/data/icons/icons-2/heal-jade-2.png.import b/game/data/icons/icons-2/heal-jade-2.png.import new file mode 100644 index 0000000..ce8b63e --- /dev/null +++ b/game/data/icons/icons-2/heal-jade-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/heal-jade-2.png-d697c16d862d1cdfbba68e3189ce5187.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/heal-jade-2.png" +dest_files=[ "res://.import/heal-jade-2.png-d697c16d862d1cdfbba68e3189ce5187.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=false +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/game/data/icons/icons-2/protect-acid-3.png b/game/data/icons/icons-2/protect-acid-3.png new file mode 100644 index 0000000..f4ce0d6 Binary files /dev/null and b/game/data/icons/icons-2/protect-acid-3.png differ diff --git a/game/data/icons/icons-2/protect-acid-3.png.import b/game/data/icons/icons-2/protect-acid-3.png.import new file mode 100644 index 0000000..e500115 --- /dev/null +++ b/game/data/icons/icons-2/protect-acid-3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/protect-acid-3.png-fba7e733232cd6a25d50c1349f82ccba.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/protect-acid-3.png" +dest_files=[ "res://.import/protect-acid-3.png-fba7e733232cd6a25d50c1349f82ccba.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=false +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/game/data/icons/icons-2/protect-eerie-2.png b/game/data/icons/icons-2/protect-eerie-2.png new file mode 100644 index 0000000..85cc9a4 Binary files /dev/null and b/game/data/icons/icons-2/protect-eerie-2.png differ diff --git a/game/data/icons/icons-2/protect-eerie-2.png.import b/game/data/icons/icons-2/protect-eerie-2.png.import new file mode 100644 index 0000000..17ea08c --- /dev/null +++ b/game/data/icons/icons-2/protect-eerie-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/protect-eerie-2.png-73044f4d125be4eba38b20cec63a5566.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-2/protect-eerie-2.png" +dest_files=[ "res://.import/protect-eerie-2.png-73044f4d125be4eba38b20cec63a5566.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=false +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/game/data/icons/icons-3/README.txt b/game/data/icons/icons-3/README.txt new file mode 100644 index 0000000..d6ec7e1 --- /dev/null +++ b/game/data/icons/icons-3/README.txt @@ -0,0 +1,11 @@ +From https://opengameart.org/content/painterly-spell-icons-part-2 + +License(s): +CC-BY 3.0 +CC-BY-SA 3.0 +GPL 2.0 + +Copyright/Attribution Notice: +J. W. Bjerk (eleazzaar) -- www.jwbjerk.com/art -- find this and other open art at: http://opengameart.org + +Thanks! diff --git a/game/data/icons/icons-3/beam-jade-2.png b/game/data/icons/icons-3/beam-jade-2.png new file mode 100644 index 0000000..49fb7b0 Binary files /dev/null and b/game/data/icons/icons-3/beam-jade-2.png differ diff --git a/game/data/icons/icons-3/beam-jade-2.png.import b/game/data/icons/icons-3/beam-jade-2.png.import new file mode 100644 index 0000000..abd6d4a --- /dev/null +++ b/game/data/icons/icons-3/beam-jade-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/beam-jade-2.png-e47410d8e8bcecd1cbbfe252e4d417f9.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-3/beam-jade-2.png" +dest_files=[ "res://.import/beam-jade-2.png-e47410d8e8bcecd1cbbfe252e4d417f9.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=2 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +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/game/data/icons/icons-3/haste-royal-2.png b/game/data/icons/icons-3/haste-royal-2.png new file mode 100644 index 0000000..5cfce1e Binary files /dev/null and b/game/data/icons/icons-3/haste-royal-2.png differ diff --git a/game/data/icons/icons-3/haste-royal-2.png.import b/game/data/icons/icons-3/haste-royal-2.png.import new file mode 100644 index 0000000..7578b2f --- /dev/null +++ b/game/data/icons/icons-3/haste-royal-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/haste-royal-2.png-f543b59bf135e994010f5ae2003abb4c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-3/haste-royal-2.png" +dest_files=[ "res://.import/haste-royal-2.png-f543b59bf135e994010f5ae2003abb4c.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=false +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/game/data/icons/icons-3/lighting-acid-2.png b/game/data/icons/icons-3/lighting-acid-2.png new file mode 100644 index 0000000..6b47089 Binary files /dev/null and b/game/data/icons/icons-3/lighting-acid-2.png differ diff --git a/game/data/icons/icons-3/lighting-acid-2.png.import b/game/data/icons/icons-3/lighting-acid-2.png.import new file mode 100644 index 0000000..9cfdf13 --- /dev/null +++ b/game/data/icons/icons-3/lighting-acid-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/lighting-acid-2.png-b6b8e7a03a035adc48385da62f556ddb.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-3/lighting-acid-2.png" +dest_files=[ "res://.import/lighting-acid-2.png-b6b8e7a03a035adc48385da62f556ddb.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=false +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/game/data/icons/icons-3/vines-plain-1.png b/game/data/icons/icons-3/vines-plain-1.png new file mode 100644 index 0000000..18561fd Binary files /dev/null and b/game/data/icons/icons-3/vines-plain-1.png differ diff --git a/game/data/icons/icons-3/vines-plain-1.png.import b/game/data/icons/icons-3/vines-plain-1.png.import new file mode 100644 index 0000000..d07d1bf --- /dev/null +++ b/game/data/icons/icons-3/vines-plain-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/vines-plain-1.png-8fbc3f86e74686bf426ab68206ecd66f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-3/vines-plain-1.png" +dest_files=[ "res://.import/vines-plain-1.png-8fbc3f86e74686bf426ab68206ecd66f.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=false +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/game/data/icons/icons-3/vines-plain-2.png b/game/data/icons/icons-3/vines-plain-2.png new file mode 100644 index 0000000..85decfd Binary files /dev/null and b/game/data/icons/icons-3/vines-plain-2.png differ diff --git a/game/data/icons/icons-3/vines-plain-2.png.import b/game/data/icons/icons-3/vines-plain-2.png.import new file mode 100644 index 0000000..23c2e43 --- /dev/null +++ b/game/data/icons/icons-3/vines-plain-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/vines-plain-2.png-2d669ab81b66d5d1f5a0bd423cc51a66.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-3/vines-plain-2.png" +dest_files=[ "res://.import/vines-plain-2.png-2d669ab81b66d5d1f5a0bd423cc51a66.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=false +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/game/data/icons/icons-4/README.txt b/game/data/icons/icons-4/README.txt new file mode 100644 index 0000000..fb7d29c --- /dev/null +++ b/game/data/icons/icons-4/README.txt @@ -0,0 +1,24 @@ +Painterly Spell Icon set part 3 + +These icons are released by the artist under the following licenses: +GNU GPL 2.0 +GNU GPL 3.0 +CC-BY 3.0 +CC-BY-SA 3.0 + +Attribution: + +J. W. Bjerk (eleazzaar) -- www.jwbjerk.com/art -- find this and other open art at: http://opengameart.org + + +If you find these icons useful, I'd appreciate it if you send me a line, with a link to your project -- just to satisfy my curiosity. +Also I can probably be commissioned to extend or expand this set at a reasonable rate. + +Enjoy... + +J.W.Bjerk +me AT jwbjerk D0T com + +From https://opengameart.org/content/painterly-spell-icons-part-3 +Thanks! + diff --git a/game/data/icons/icons-4/explosion-royal-2.png b/game/data/icons/icons-4/explosion-royal-2.png new file mode 100644 index 0000000..27f5a9a Binary files /dev/null and b/game/data/icons/icons-4/explosion-royal-2.png differ diff --git a/game/data/icons/icons-4/explosion-royal-2.png.import b/game/data/icons/icons-4/explosion-royal-2.png.import new file mode 100644 index 0000000..15a7d64 --- /dev/null +++ b/game/data/icons/icons-4/explosion-royal-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/explosion-royal-2.png-80d5d46ded15ebbbb3cc9785d3e51084.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/explosion-royal-2.png" +dest_files=[ "res://.import/explosion-royal-2.png-80d5d46ded15ebbbb3cc9785d3e51084.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=false +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/game/data/icons/icons-4/horror-acid-3.png b/game/data/icons/icons-4/horror-acid-3.png new file mode 100644 index 0000000..b83b74b Binary files /dev/null and b/game/data/icons/icons-4/horror-acid-3.png differ diff --git a/game/data/icons/icons-4/horror-acid-3.png.import b/game/data/icons/icons-4/horror-acid-3.png.import new file mode 100644 index 0000000..c291ece --- /dev/null +++ b/game/data/icons/icons-4/horror-acid-3.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/horror-acid-3.png-e8ee360b50045aa779876bed15fb2374.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/horror-acid-3.png" +dest_files=[ "res://.import/horror-acid-3.png-e8ee360b50045aa779876bed15fb2374.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=false +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/game/data/icons/icons-4/leaf-acid-1.png b/game/data/icons/icons-4/leaf-acid-1.png new file mode 100644 index 0000000..1547714 Binary files /dev/null and b/game/data/icons/icons-4/leaf-acid-1.png differ diff --git a/game/data/icons/icons-4/leaf-acid-1.png.import b/game/data/icons/icons-4/leaf-acid-1.png.import new file mode 100644 index 0000000..303429f --- /dev/null +++ b/game/data/icons/icons-4/leaf-acid-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/leaf-acid-1.png-3968c13e6cb85d241bc42935cddec547.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/leaf-acid-1.png" +dest_files=[ "res://.import/leaf-acid-1.png-3968c13e6cb85d241bc42935cddec547.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=false +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/game/data/icons/icons-4/wild-orange-2.png b/game/data/icons/icons-4/wild-orange-2.png new file mode 100644 index 0000000..c7a49cc Binary files /dev/null and b/game/data/icons/icons-4/wild-orange-2.png differ diff --git a/game/data/icons/icons-4/wild-orange-2.png.import b/game/data/icons/icons-4/wild-orange-2.png.import new file mode 100644 index 0000000..892c7d7 --- /dev/null +++ b/game/data/icons/icons-4/wild-orange-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wild-orange-2.png-9ac324900de05bf8d56240e0e27c829f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/wild-orange-2.png" +dest_files=[ "res://.import/wild-orange-2.png-9ac324900de05bf8d56240e0e27c829f.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=false +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/game/data/icons/icons-4/wind-blue-1.png b/game/data/icons/icons-4/wind-blue-1.png new file mode 100644 index 0000000..1824137 Binary files /dev/null and b/game/data/icons/icons-4/wind-blue-1.png differ diff --git a/game/data/icons/icons-4/wind-blue-1.png.import b/game/data/icons/icons-4/wind-blue-1.png.import new file mode 100644 index 0000000..5ee02a7 --- /dev/null +++ b/game/data/icons/icons-4/wind-blue-1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wind-blue-1.png-29c9c4f83b5aef00d6a1aa6cc9858798.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-4/wind-blue-1.png" +dest_files=[ "res://.import/wind-blue-1.png-29c9c4f83b5aef00d6a1aa6cc9858798.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/game/data/icons/icons-5/README.txt b/game/data/icons/icons-5/README.txt new file mode 100644 index 0000000..dc2d436 --- /dev/null +++ b/game/data/icons/icons-5/README.txt @@ -0,0 +1,23 @@ +Painterly Spell Icon set part 4 + +These icons are released by the artist under the following licenses: +GNU GPL 2.0 +GNU GPL 3.0 +CC-BY 3.0 +CC-BY-SA 3.0 + +Attribution: + +J. W. Bjerk (eleazzaar) -- www.jwbjerk.com/art -- find this and other open art at: http://opengameart.org + + +If you find these icons useful, I'd appreciate it if you send me a line, with a link to your project -- just to satisfy my curiosity. +Also I can probably be commissioned to extend or expand this set at a reasonable rate. + +Enjoy... + +J.W.Bjerk +me AT jwbjerk D0T com + +From https://opengameart.org/content/painterly-spell-icons-part-4 +Thanks! diff --git a/game/data/icons/icons-5/wind-grasp-acid-2.png b/game/data/icons/icons-5/wind-grasp-acid-2.png new file mode 100644 index 0000000..b7da529 Binary files /dev/null and b/game/data/icons/icons-5/wind-grasp-acid-2.png differ diff --git a/game/data/icons/icons-5/wind-grasp-acid-2.png.import b/game/data/icons/icons-5/wind-grasp-acid-2.png.import new file mode 100644 index 0000000..7994d5d --- /dev/null +++ b/game/data/icons/icons-5/wind-grasp-acid-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wind-grasp-acid-2.png-f571392bb578efed44940fb0f93e83b4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-5/wind-grasp-acid-2.png" +dest_files=[ "res://.import/wind-grasp-acid-2.png-f571392bb578efed44940fb0f93e83b4.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=false +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/game/data/icons/icons-5/wind-grasp-eerie-2.png b/game/data/icons/icons-5/wind-grasp-eerie-2.png new file mode 100644 index 0000000..2574485 Binary files /dev/null and b/game/data/icons/icons-5/wind-grasp-eerie-2.png differ diff --git a/game/data/icons/icons-5/wind-grasp-eerie-2.png.import b/game/data/icons/icons-5/wind-grasp-eerie-2.png.import new file mode 100644 index 0000000..8df7ff5 --- /dev/null +++ b/game/data/icons/icons-5/wind-grasp-eerie-2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wind-grasp-eerie-2.png-5e215ef1cadb2fad8d60fa5d444bc35a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons-5/wind-grasp-eerie-2.png" +dest_files=[ "res://.import/wind-grasp-eerie-2.png-5e215ef1cadb2fad8d60fa5d444bc35a.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=false +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/game/data/icons/icons.png b/game/data/icons/icons.png new file mode 100644 index 0000000..115185b Binary files /dev/null and b/game/data/icons/icons.png differ diff --git a/game/data/icons/icons.png.import b/game/data/icons/icons.png.import new file mode 100644 index 0000000..aa59dc0 --- /dev/null +++ b/game/data/icons/icons.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icons.png-b27181a78f3417a7c6a94542cf47974c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/icons/icons.png" +dest_files=[ "res://.import/icons.png-b27181a78f3417a7c6a94542cf47974c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=2 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +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/game/data/icons/items/gold.tres b/game/data/icons/items/gold.tres new file mode 100644 index 0000000..4cee830 --- /dev/null +++ b/game/data/icons/items/gold.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-1/5.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/amplify_pain.tres b/game/data/icons/naturalist/amplify_pain.tres new file mode 100644 index 0000000..5ccc4f9 --- /dev/null +++ b/game/data/icons/naturalist/amplify_pain.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/beam-jade-2.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/aspect_of_bees.tres b/game/data/icons/naturalist/aspect_of_bees.tres new file mode 100644 index 0000000..28ced35 --- /dev/null +++ b/game/data/icons/naturalist/aspect_of_bees.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-4/explosion-royal-2.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/aspect_of_scorpions.tres b/game/data/icons/naturalist/aspect_of_scorpions.tres new file mode 100644 index 0000000..b5704bf --- /dev/null +++ b/game/data/icons/naturalist/aspect_of_scorpions.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-2/enchant-acid-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/aspect_of_wasps.tres b/game/data/icons/naturalist/aspect_of_wasps.tres new file mode 100644 index 0000000..7b631d9 --- /dev/null +++ b/game/data/icons/naturalist/aspect_of_wasps.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-2/enchant-blue-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/aspect_of_wolves.tres b/game/data/icons/naturalist/aspect_of_wolves.tres new file mode 100644 index 0000000..f1aebbf --- /dev/null +++ b/game/data/icons/naturalist/aspect_of_wolves.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-4/wild-orange-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/attunement.tres b/game/data/icons/naturalist/attunement.tres new file mode 100644 index 0000000..128e1ca --- /dev/null +++ b/game/data/icons/naturalist/attunement.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-4/horror-acid-3.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/calm.tres b/game/data/icons/naturalist/calm.tres new file mode 100644 index 0000000..1cb49a3 --- /dev/null +++ b/game/data/icons/naturalist/calm.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-5/wind-grasp-acid-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/close_wounds.tres b/game/data/icons/naturalist/close_wounds.tres new file mode 100644 index 0000000..84061b8 --- /dev/null +++ b/game/data/icons/naturalist/close_wounds.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-2/heal-jade-2.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/first_aid.tres b/game/data/icons/naturalist/first_aid.tres new file mode 100644 index 0000000..4ab5085 --- /dev/null +++ b/game/data/icons/naturalist/first_aid.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-1/61.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/inner_will.tres b/game/data/icons/naturalist/inner_will.tres new file mode 100644 index 0000000..0d2c2a6 --- /dev/null +++ b/game/data/icons/naturalist/inner_will.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-5/wind-grasp-eerie-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/ironbark.tres b/game/data/icons/naturalist/ironbark.tres new file mode 100644 index 0000000..2b48746 --- /dev/null +++ b/game/data/icons/naturalist/ironbark.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-2/protect-acid-3.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/natures_swiftness.tres b/game/data/icons/naturalist/natures_swiftness.tres new file mode 100644 index 0000000..0019ef9 --- /dev/null +++ b/game/data/icons/naturalist/natures_swiftness.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/haste-royal-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/regenerate.tres b/game/data/icons/naturalist/regenerate.tres new file mode 100644 index 0000000..9168a83 --- /dev/null +++ b/game/data/icons/naturalist/regenerate.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-4/wind-blue-1.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/rejuvenation.tres b/game/data/icons/naturalist/rejuvenation.tres new file mode 100644 index 0000000..ed54d58 --- /dev/null +++ b/game/data/icons/naturalist/rejuvenation.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-4/leaf-acid-1.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/root.tres b/game/data/icons/naturalist/root.tres new file mode 100644 index 0000000..fbd59e6 --- /dev/null +++ b/game/data/icons/naturalist/root.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/vines-plain-1.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/shield_of_barbs.tres b/game/data/icons/naturalist/shield_of_barbs.tres new file mode 100644 index 0000000..64b7405 --- /dev/null +++ b/game/data/icons/naturalist/shield_of_barbs.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-2/protect-eerie-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/strength_of_nature.tres b/game/data/icons/naturalist/strength_of_nature.tres new file mode 100644 index 0000000..cc10385 --- /dev/null +++ b/game/data/icons/naturalist/strength_of_nature.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/lighting-acid-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/icons/naturalist/test.tres b/game/data/icons/naturalist/test.tres new file mode 100644 index 0000000..7069296 --- /dev/null +++ b/game/data/icons/naturalist/test.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons.png" type="Texture" id=1] + + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 80, 928, 16, 16 ) diff --git a/game/data/icons/naturalist/uproot.tres b/game/data/icons/naturalist/uproot.tres new file mode 100644 index 0000000..3af0653 --- /dev/null +++ b/game/data/icons/naturalist/uproot.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://data/icons/icons-3/vines-plain-2.png" type="Texture" id=1] + +[resource] +flags = 4 +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 16 ) diff --git a/game/data/item_templates/1_gold.tres b/game/data/item_templates/1_gold.tres new file mode 100644 index 0000000..0495c01 --- /dev/null +++ b/game/data/item_templates/1_gold.tres @@ -0,0 +1,9 @@ +[gd_resource type="ItemTemplate" load_steps=2 format=2] + +[ext_resource path="res://data/icons/items/gold.tres" type="Texture" id=1] + +[resource] +id = 1 +text_name = "Gold" +item_type = 13 +icon = ExtResource( 1 ) diff --git a/game/data/item_templates/2_test.tres b/game/data/item_templates/2_test.tres new file mode 100644 index 0000000..63d8850 --- /dev/null +++ b/game/data/item_templates/2_test.tres @@ -0,0 +1,12 @@ +[gd_resource type="ItemTemplate" load_steps=3 format=2] + +[ext_resource path="res://scripts/items/ItemTemplateGD.gd" type="Script" id=1] +[ext_resource path="res://data/icons/3_iron_bar.tres" type="Texture" id=2] + +[resource] +resource_name = "Iron Bar" +id = 2 +text_name = "Iron Bar" +stack_size = 10 +icon = ExtResource( 2 ) +script = ExtResource( 1 ) diff --git a/game/data/item_templates/3_chest_of_the_infinite_wisdom.tres b/game/data/item_templates/3_chest_of_the_infinite_wisdom.tres new file mode 100644 index 0000000..4f17dc3 --- /dev/null +++ b/game/data/item_templates/3_chest_of_the_infinite_wisdom.tres @@ -0,0 +1,34 @@ +[gd_resource type="ItemTemplate" load_steps=4 format=2] + +[ext_resource path="res://scripts/items/ItemTemplateGD.gd" type="Script" id=1] +[ext_resource path="res://data/item_visuals/1_chest_of_the_infinite_wisdom.tres" type="ItemVisual" id=2] +[ext_resource path="res://data/icons/4_chest_of_the_infinite_wisdom.tres" type="Texture" id=3] + +[resource] +resource_name = "Chest of the Infinite Wisdom" +id = 3 +text_name = "Chest of the Infinite Wisdom" +item_type = 1 +rarity = 6 +armor_type = 1 +equip_slot = 3 +item_visual = ExtResource( 2 ) +icon = ExtResource( 3 ) +item_stat_modifier_count = 2 +Modifiers_0/stat_id = 8 +Modifiers_0/min_base_mod = 1000.0 +Modifiers_0/max_base_mod = 0.0 +Modifiers_0/min_bonus_mod = 1000.0 +Modifiers_0/max_bonus_mod = 0.0 +Modifiers_0/min_percent_mod = 0.0 +Modifiers_0/max_percent_mod = 0.0 +Modifiers_0/scaling_factor = 1.0 +Modifiers_1/stat_id = 7 +Modifiers_1/min_base_mod = 1000.0 +Modifiers_1/max_base_mod = 0.0 +Modifiers_1/min_bonus_mod = 1000.0 +Modifiers_1/max_bonus_mod = 0.0 +Modifiers_1/min_percent_mod = 0.0 +Modifiers_1/max_percent_mod = 0.0 +Modifiers_1/scaling_factor = 1.0 +script = ExtResource( 1 ) diff --git a/game/data/planets/1_test.tres b/game/data/planets/1_test.tres new file mode 100644 index 0000000..0d2253c --- /dev/null +++ b/game/data/planets/1_test.tres @@ -0,0 +1,9 @@ +[gd_resource type="PlanetData" load_steps=3 format=2] + +[ext_resource path="res://data/biomes/1_test.tres" type="BiomeData" id=1] +[ext_resource path="res://scripts/planets/simple_planet.gd" type="Script" id=2] + +[resource] +id = 1 +target_script = ExtResource( 2 ) +biome_datas = [ ExtResource( 1 ) ] diff --git a/game/data/planets/2_tdungeon.tres b/game/data/planets/2_tdungeon.tres new file mode 100644 index 0000000..9093fb4 --- /dev/null +++ b/game/data/planets/2_tdungeon.tres @@ -0,0 +1,9 @@ +[gd_resource type="PlanetData" load_steps=3 format=2] + +[ext_resource path="res://data/biomes/2_tdungb.tres" type="BiomeData" id=1] +[ext_resource path="res://scripts/planets/dung_simple_planet.gd" type="Script" id=2] + +[resource] +id = 2 +target_script = ExtResource( 2 ) +biome_datas = [ ExtResource( 1 ) ] diff --git a/game/data/player_character_data/1_naturalist.tres b/game/data/player_character_data/1_naturalist.tres new file mode 100644 index 0000000..226faf4 --- /dev/null +++ b/game/data/player_character_data/1_naturalist.tres @@ -0,0 +1,17 @@ +[gd_resource type="EntityData" load_steps=5 format=2] + +[ext_resource path="res://data/entity_classes/1_naturalist.tres" type="EntityClassData" id=1] +[ext_resource path="res://scripts/entities/EntityDataGD.gd" type="Script" id=2] +[ext_resource path="res://data/crafting/1_test_craft.tres" type="CraftRecipe" id=3] +[ext_resource path="res://data/crafting/2_chest_of_the_infinite_wisdom.tres" type="CraftRecipe" id=4] + +[resource] +resource_name = "Naturalist" +id = 1 +entity_type = 4 +entity_controller = 1 +text_name = "Naturalist" +bag_size = 24 +entity_class_data = ExtResource( 1 ) +craft_recipes = [ ExtResource( 3 ), ExtResource( 4 ) ] +script = ExtResource( 2 ) diff --git a/game/data/spell_effects/textures/arrows.png b/game/data/spell_effects/textures/arrows.png new file mode 100644 index 0000000..f3f183a Binary files /dev/null and b/game/data/spell_effects/textures/arrows.png differ diff --git a/game/data/spell_effects/textures/arrows.png.import b/game/data/spell_effects/textures/arrows.png.import new file mode 100644 index 0000000..ba3b7ea --- /dev/null +++ b/game/data/spell_effects/textures/arrows.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrows.png-e04cf4aa970f723402f40b1f4c1c0b3b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/arrows.png" +dest_files=[ "res://.import/arrows.png-e04cf4aa970f723402f40b1f4c1c0b3b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=false +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/game/data/spell_effects/textures/big_glow.png b/game/data/spell_effects/textures/big_glow.png new file mode 100644 index 0000000..8382a6d Binary files /dev/null and b/game/data/spell_effects/textures/big_glow.png differ diff --git a/game/data/spell_effects/textures/big_glow.png.import b/game/data/spell_effects/textures/big_glow.png.import new file mode 100644 index 0000000..ad06fe9 --- /dev/null +++ b/game/data/spell_effects/textures/big_glow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/big_glow.png-d3eda1d6185d63bdc430c646a22bb62f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/big_glow.png" +dest_files=[ "res://.import/big_glow.png-d3eda1d6185d63bdc430c646a22bb62f.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=false +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/game/data/spell_effects/textures/main_texture.png b/game/data/spell_effects/textures/main_texture.png new file mode 100644 index 0000000..d2e01a1 Binary files /dev/null and b/game/data/spell_effects/textures/main_texture.png differ diff --git a/game/data/spell_effects/textures/main_texture.png.import b/game/data/spell_effects/textures/main_texture.png.import new file mode 100644 index 0000000..0a40480 --- /dev/null +++ b/game/data/spell_effects/textures/main_texture.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/main_texture.png-f00e0ab4ed97ff1475835686a7454874.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/main_texture.png" +dest_files=[ "res://.import/main_texture.png-f00e0ab4ed97ff1475835686a7454874.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/game/data/spell_effects/textures/small_star.png b/game/data/spell_effects/textures/small_star.png new file mode 100644 index 0000000..3ce8e07 Binary files /dev/null and b/game/data/spell_effects/textures/small_star.png differ diff --git a/game/data/spell_effects/textures/small_star.png.import b/game/data/spell_effects/textures/small_star.png.import new file mode 100644 index 0000000..b453d45 --- /dev/null +++ b/game/data/spell_effects/textures/small_star.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/small_star.png-df42addd723ec8255619446fbe11ce1a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/small_star.png" +dest_files=[ "res://.import/small_star.png-df42addd723ec8255619446fbe11ce1a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=2 +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/game/data/spell_effects/textures/star.png b/game/data/spell_effects/textures/star.png new file mode 100644 index 0000000..bf8a13d Binary files /dev/null and b/game/data/spell_effects/textures/star.png differ diff --git a/game/data/spell_effects/textures/star.png.import b/game/data/spell_effects/textures/star.png.import new file mode 100644 index 0000000..abac45d --- /dev/null +++ b/game/data/spell_effects/textures/star.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/star.png-d57669aa5fea5b6090428296488efa8d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/spell_effects/textures/star.png" +dest_files=[ "res://.import/star.png-d57669aa5fea5b6090428296488efa8d.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=false +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/game/data/spells/10_aspect_of_scorpions_rank_1.tres b/game/data/spells/10_aspect_of_scorpions_rank_1.tres new file mode 100644 index 0000000..0f84b99 --- /dev/null +++ b/game/data/spells/10_aspect_of_scorpions_rank_1.tres @@ -0,0 +1,26 @@ +[gd_resource type="Spell" load_steps=6 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_scorpions.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/10_aspect_of_scorpions_rank_1.tres" type="Aura" id=3] +[ext_resource path="res://data/effect_data/aspect_of_scorpions.tres" type="SpellEffectVisual" id=4] +[ext_resource path="res://data/spells/27_aspect_of_scorpions.tres" type="Spell" id=5] + +[resource] +resource_name = "Aspect of Scorpions" +id = 10 +spell_type = 8 +rank = 10 +icon = ExtResource( 2 ) +visual_spell_effects = ExtResource( 4 ) +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Aspect of Scorpions" +text_description = "Range: 26m. +Casttime: {3}. +Deals 340 to 380 damage every 3 sec, and increases damage taken by 10% for 30 sec." +range = true +range_range = 26.0 +cast = true +cast_cast_time = 1.2 +training_required_spell = ExtResource( 5 ) +script = ExtResource( 1 ) diff --git a/game/data/spells/11_aspect_of_wasps_rank_1.tres b/game/data/spells/11_aspect_of_wasps_rank_1.tres new file mode 100644 index 0000000..067426e --- /dev/null +++ b/game/data/spells/11_aspect_of_wasps_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_wasps.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/11_aspect_of_wasps_rank1.tres" type="Aura" id=3] +[ext_resource path="res://data/spells/28_aspectofwasps.tres" type="Spell" id=4] + +[resource] +resource_name = "Aspect of Wasps" +id = 11 +spell_type = 8 +rank = 10 +icon = ExtResource( 2 ) +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Aspect of Wasps" +text_description = "Range: 26m. +Instant. +Deals 230 to 270 damage every 3 sec, this damage increases over the duration, for 21 sec." +range = true +range_range = 26.0 +aoe_targetType = 541 +aoe_colliderType = 541 +training_required_spell = ExtResource( 4 ) +script = ExtResource( 1 ) diff --git a/game/data/spells/12_aspect_of_wolves_rank_1.tres b/game/data/spells/12_aspect_of_wolves_rank_1.tres new file mode 100644 index 0000000..c4d6fd5 --- /dev/null +++ b/game/data/spells/12_aspect_of_wolves_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_wolves.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/12_aspect_of_wolves_rank_1.tres" type="Aura" id=3] +[ext_resource path="res://data/spells/29_aspect_of_wolves.tres" type="Spell" id=4] + +[resource] +resource_name = "Aspect of Wolves" +id = 12 +spell_type = 8 +rank = 10 +icon = ExtResource( 2 ) +needs_target = true +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Aspect of Wolves" +text_description = "Range: 26m. +Deals 280 to 330 damage every 2 sec, and reduces melee and spell damage by 10% for 22 sec." +range = true +range_range = 26.0 +aoe_targetType = 1129071960 +aoe_colliderType = 1058050193 +training_required_spell = ExtResource( 4 ) +script = ExtResource( 1 ) diff --git a/game/data/spells/13_aspect_of_bees_rank_1.tres b/game/data/spells/13_aspect_of_bees_rank_1.tres new file mode 100644 index 0000000..8651131 --- /dev/null +++ b/game/data/spells/13_aspect_of_bees_rank_1.tres @@ -0,0 +1,27 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/aspect_of_bees.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/13_aspect_of_bees_rank_1.tres" type="Aura" id=3] +[ext_resource path="res://data/spells/30_aspect_of_bees.tres" type="Spell" id=4] + +[resource] +resource_name = "Aspect of Bees" +id = 13 +spell_type = 8 +rank = 10 +icon = ExtResource( 2 ) +needs_target = true +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Aspect of Bees" +text_description = "Range: 26m. +Instant. +Cooldown: {2} +Deals 460 to 540 damage every 3 sec, healing you for 80% of the damage." +cooldown_cooldown = 21.0 +range = true +range_range = 26.0 +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +training_required_spell = ExtResource( 4 ) +script = ExtResource( 1 ) diff --git a/game/data/spells/14_amplify_pain_rank_1.tres b/game/data/spells/14_amplify_pain_rank_1.tres new file mode 100644 index 0000000..b5c1b53 --- /dev/null +++ b/game/data/spells/14_amplify_pain_rank_1.tres @@ -0,0 +1,38 @@ +[gd_resource type="Spell" load_steps=6 format=2] + +[ext_resource path="res://scripts/spells/amplify_pain.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/amplify_pain.tres" type="Texture" id=2] +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=3] +[ext_resource path="res://data/spell_effects/nature/NatureCast.tscn" type="PackedScene" id=5] + +[sub_resource type="SpellEffectVisual" id=1] +script = ExtResource( 3 ) +spell_cast_effect_left_hand = ExtResource( 5 ) +spell_cast_effect_right_hand = ExtResource( 5 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect_time = 0.4 +root_spell_cast_finish_effect_time = 1.0 + +[resource] +resource_name = "Amplify Pain" +id = 14 +spell_type = 8 +level = 10 +icon = ExtResource( 2 ) +visual_spell_effects = SubResource( 1 ) +text_name = "Amplify Pain" +text_description = "Range: 26m. +Casttime: {3}. +Causes your damage over time effects to tick." +range = true +range_range = 26.0 +cast = true +cast_cast_time = 1.5 +damage = true +damage_type = 16 +damage_min = 130 +damage_max = 150 +aoe_targetType = -1910718371 +aoe_colliderType = 1065353216 +script = ExtResource( 1 ) diff --git a/game/data/spells/15_rejuvenation_rank_1.tres b/game/data/spells/15_rejuvenation_rank_1.tres new file mode 100644 index 0000000..a6f789c --- /dev/null +++ b/game/data/spells/15_rejuvenation_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/rejuvenation.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/14_rejuvenation_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Rejuvenation" +id = 15 +spell_type = 8 +target_type = 2 +target_relation_type = 4 +rank = 1 +icon = ExtResource( 2 ) +caster_aura_applys = [ ExtResource( 3 ) ] +text_name = "Rejuvenation" +text_description = "Instant. +Heals you for 400 to 450 every 3 sec for 30 sec." +aoe_targetType = 32758 +aoe_colliderType = -2147479552 +script = ExtResource( 1 ) diff --git a/game/data/spells/16_close_wounds_rank_1.tres b/game/data/spells/16_close_wounds_rank_1.tres new file mode 100644 index 0000000..2b00494 --- /dev/null +++ b/game/data/spells/16_close_wounds_rank_1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/close_wounds.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/15_close_wounds_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Close Wounds" +id = 16 +spell_type = 8 +target_type = 2 +target_relation_type = -870457328 +rank = 1 +icon = ExtResource( 2 ) +caster_aura_applys = [ ExtResource( 3 ) ] +text_name = "Close Wounds" +text_description = "Casttime: 2 sec. +Cooldown: {2} +Heals you for 720 to 780 every 3 sec for 21 sec." +cast = true +cast_cast_time = 1.3 +aoe_colliderType = -2147479552 +script = ExtResource( 1 ) diff --git a/game/data/spells/17_ironbark_rank_1.tres b/game/data/spells/17_ironbark_rank_1.tres new file mode 100644 index 0000000..fe4e3c7 --- /dev/null +++ b/game/data/spells/17_ironbark_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/ironbark.tres" type="Texture" id=2] +[ext_resource path="res://data/auras/16_ironbark_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Ironbark" +id = 17 +spell_type = 8 +target_type = 480 +target_relation_type = 914787760 +rank = 1 +icon = ExtResource( 2 ) +caster_aura_applys = [ ExtResource( 3 ) ] +text_name = "Ironbark" +text_description = "Instant. +Cooldown: {2} +Reduces damage taken by 70%. This spell is not on the global cooldown." +cooldown_cooldown = 60.0 +cooldown_global_cooldown = false +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +script = ExtResource( 1 ) diff --git a/game/data/spells/18_natures_swiftness_rank_1.tres b/game/data/spells/18_natures_swiftness_rank_1.tres new file mode 100644 index 0000000..da63fe3 --- /dev/null +++ b/game/data/spells/18_natures_swiftness_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://data/icons/naturalist/natures_swiftness.tres" type="Texture" id=1] +[ext_resource path="res://data/auras/17_natures_swiftness_rank_1.tres" type="Aura" id=2] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=3] + +[resource] +resource_name = "Nature's Swiftness" +id = 18 +spell_type = 8 +target_type = 520 +target_relation_type = 393653346 +rank = 1 +icon = ExtResource( 1 ) +caster_aura_applys = [ ExtResource( 2 ) ] +text_name = "Nature's Swiftness" +text_description = "Instant. +Cooldown: {2} +Increases your movement speed by 60% for 6 sec. This spell is not on the global cooldown." +cooldown_cooldown = 20.0 +cooldown_global_cooldown = false +aoe_targetType = 520 +aoe_colliderType = 186459648 +script = ExtResource( 3 ) diff --git a/game/data/spells/19_uproot_rank_1.tres b/game/data/spells/19_uproot_rank_1.tres new file mode 100644 index 0000000..19f806b --- /dev/null +++ b/game/data/spells/19_uproot_rank_1.tres @@ -0,0 +1,23 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://data/icons/naturalist/uproot.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] + +[resource] +resource_name = "Uproot" +id = 19 +spell_type = 8 +target_type = -2147460864 +rank = 1 +icon = ExtResource( 1 ) +text_name = "Uproot" +text_description = "Instant. +Cooldown: {2} +Roots every enemy around you in a 15m radius for 8 sec. This spell doesn't have diminishing return." +cooldown_cooldown = 24.0 +range = true +range_range = 15.0 +aoe = true +aoe_targetType = -572653568 +aoe_colliderType = 537722880 +script = ExtResource( 2 ) diff --git a/game/data/spells/1_test_spell.tres b/game/data/spells/1_test_spell.tres new file mode 100644 index 0000000..db80897 --- /dev/null +++ b/game/data/spells/1_test_spell.tres @@ -0,0 +1,19 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/test.tres" type="Texture" id=2] + +[resource] +resource_name = "adadadadadad" +spell_type = 16 +target_relation_type = -138672214 +rank = 1 +icon = ExtResource( 2 ) +needs_target = true +text_name = "adadadadadad" +damage = true +damage_min = 200 +damage_max = 300 +aoe_targetType = 1431112251 +aoe_colliderType = 827465778 +script = ExtResource( 1 ) diff --git a/game/data/spells/20_root_rank_1.tres b/game/data/spells/20_root_rank_1.tres new file mode 100644 index 0000000..20e46d6 --- /dev/null +++ b/game/data/spells/20_root_rank_1.tres @@ -0,0 +1,24 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://data/icons/naturalist/root.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://data/auras/20_root_rank_1.tres" type="Aura" id=3] + +[resource] +resource_name = "Root" +id = 20 +spell_type = 8 +rank = 1 +icon = ExtResource( 1 ) +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Root" +text_description = "Range: 26m. +Casttime: 1.5 sec. +Cooldown: {2} +Roots the target for 8 sec." +range = true +cast = true +cast_cast_time = 1.4 +aoe_targetType = 8 +aoe_colliderType = 537722880 +script = ExtResource( 2 ) diff --git a/game/data/spells/21_strength_of_nature_rank_1.tres b/game/data/spells/21_strength_of_nature_rank_1.tres new file mode 100644 index 0000000..d140825 --- /dev/null +++ b/game/data/spells/21_strength_of_nature_rank_1.tres @@ -0,0 +1,25 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/strength_of_nature.tres" type="Texture" id=2] + +[resource] +resource_name = "Strength of Nature" +id = 21 +spell_type = 8 +target_type = -2147477248 +target_relation_type = 24 +level = 11 +rank = 1 +icon = ExtResource( 2 ) +text_name = "Strength of Nature" +text_description = "Instant. +Cooldown: {2} +Heals you for 6700 to 7000." +cooldown_cooldown = 150.0 +heal = true +heal_min = 6700 +heal_max = 7000 +aoe_targetType = 5 +aoe_colliderType = 7602273 +script = ExtResource( 1 ) diff --git a/game/data/spells/22_shield_of_barbs_rank_1.tres b/game/data/spells/22_shield_of_barbs_rank_1.tres new file mode 100644 index 0000000..f713fb7 --- /dev/null +++ b/game/data/spells/22_shield_of_barbs_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/shield_of_barbs.tres" type="Texture" id=2] + +[resource] +resource_name = "Shield of Barbs" +id = 22 +spell_type = 8 +target_type = -2147456768 +target_relation_type = 24 +rank = 1 +icon = ExtResource( 2 ) +text_name = "Shield of Barbs" +text_description = "Instant. +Cooldown: {2} +Absorbs 4200 to 4400 damage, also deals 340 to 380 damage to any attacker, for 30 sec." +cooldown_cooldown = 45.0 +aoe_targetType = 5 +aoe_colliderType = 7929968 +script = ExtResource( 1 ) diff --git a/game/data/spells/23_calm_rank_1.tres b/game/data/spells/23_calm_rank_1.tres new file mode 100644 index 0000000..9bd08fd --- /dev/null +++ b/game/data/spells/23_calm_rank_1.tres @@ -0,0 +1,20 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/calm.tres" type="Texture" id=2] + +[resource] +resource_name = "Calm" +id = 23 +spell_type = 8 +rank = 1 +icon = ExtResource( 2 ) +text_name = "Calm" +text_description = "Range: 26m. +Instant. +Cooldown: {2} +Reduces the target's melee and spell damage by 50% for 10 sec." +cooldown_cooldown = 90.0 +aoe_targetType = -2147478784 +aoe_colliderType = 7602273 +script = ExtResource( 1 ) diff --git a/game/data/spells/24_attunement_rank_1.tres b/game/data/spells/24_attunement_rank_1.tres new file mode 100644 index 0000000..29e0693 --- /dev/null +++ b/game/data/spells/24_attunement_rank_1.tres @@ -0,0 +1,21 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/attunement.tres" type="Texture" id=2] + +[resource] +resource_name = "Attunement" +id = 24 +spell_type = 8 +target_type = -2147448576 +target_relation_type = 24 +rank = 1 +icon = ExtResource( 2 ) +text_name = "Attunement" +text_description = "Instant. +Cooldown: {2} +Increases your spell damage by 30% for 20 sec." +cooldown_cooldown = 180.0 +aoe_targetType = 2 +aoe_colliderType = 480 +script = ExtResource( 1 ) diff --git a/game/data/spells/25_inner_will.tres b/game/data/spells/25_inner_will.tres new file mode 100644 index 0000000..7c3cb77 --- /dev/null +++ b/game/data/spells/25_inner_will.tres @@ -0,0 +1,20 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/inner_will.tres" type="Texture" id=2] + +[resource] +resource_name = "Inner Will" +id = 25 +spell_type = 1 +target_type = 2 +target_relation_type = -11822355 +icon = ExtResource( 2 ) +text_name = "Inner Will" +text_description = "Cooldown: 1.5 min. +Removes any movement impairing effects, stuns, and effects which makes you lose control of your character. This spell is not on the global cooldown." +cooldown_cooldown = 90.0 +cooldown_global_cooldown = false +aoe_targetType = 7 +aoe_colliderType = 480 +script = ExtResource( 1 ) diff --git a/game/data/spells/26_rest.tres b/game/data/spells/26_rest.tres new file mode 100644 index 0000000..00cc4d9 --- /dev/null +++ b/game/data/spells/26_rest.tres @@ -0,0 +1,17 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/icons/naturalist/regenerate.tres" type="Texture" id=2] + +[resource] +resource_name = "Rest" +id = 26 +spell_type = 1 +target_type = 2 +target_relation_type = 24 +icon = ExtResource( 2 ) +text_name = "Rest" +text_description = "Rest for 30 seconds, greatly increasing your regeneration." +aoe_targetType = 5 +aoe_colliderType = 1065353216 +script = ExtResource( 1 ) diff --git a/game/data/spells/27_aspect_of_scorpions.tres b/game/data/spells/27_aspect_of_scorpions.tres new file mode 100644 index 0000000..39a504b --- /dev/null +++ b/game/data/spells/27_aspect_of_scorpions.tres @@ -0,0 +1,25 @@ +[gd_resource type="Spell" load_steps=5 format=2] + +[ext_resource path="res://data/icons/naturalist/aspect_of_scorpions.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] +[ext_resource path="res://data/auras/21_aspect_of_scorpions.tres" type="Aura" id=3] +[ext_resource path="res://data/effect_data/aspect_of_scorpions.tres" type="SpellEffectVisual" id=4] + +[resource] +resource_name = "Aspect of Scorpions" +id = 27 +spell_type = 8 +rank = 1 +icon = ExtResource( 1 ) +visual_spell_effects = ExtResource( 4 ) +target_aura_applys = [ ExtResource( 3 ) ] +text_name = "Aspect of Scorpions" +text_description = "Range: 26m. +Casttime: {3}. +Deals 340 to 380 damage every 3 sec, and increases damage taken by 10% for 30 sec." +range = true +range_range = 26.0 +cast = true +cast_cast_time = 1.2 +spell_cooldown_mainpulation_data_count = -1 +script = ExtResource( 2 ) diff --git a/game/data/spells/28_aspectofwasps.tres b/game/data/spells/28_aspectofwasps.tres new file mode 100644 index 0000000..5dbed01 --- /dev/null +++ b/game/data/spells/28_aspectofwasps.tres @@ -0,0 +1,22 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/auras/22_aspect_of_wasps.tres" type="Aura" id=2] +[ext_resource path="res://data/icons/naturalist/aspect_of_wasps.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wasps" +id = 28 +spell_type = 8 +rank = 1 +icon = ExtResource( 3 ) +target_aura_applys = [ ExtResource( 2 ) ] +text_name = "Aspect of Wasps" +text_description = "Range: 26m. +Instant. +Deals 230 to 270 damage every 3 sec, this damage increases over the duration, for 21 sec." +range = true +range_range = 26.0 +aoe_targetType = 541 +aoe_colliderType = 541 +script = ExtResource( 1 ) diff --git a/game/data/spells/29_aspect_of_wolves.tres b/game/data/spells/29_aspect_of_wolves.tres new file mode 100644 index 0000000..325e2b4 --- /dev/null +++ b/game/data/spells/29_aspect_of_wolves.tres @@ -0,0 +1,22 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/auras/23_aspect_of_wolves.tres" type="Aura" id=2] +[ext_resource path="res://data/icons/naturalist/aspect_of_wolves.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Wolves" +id = 29 +spell_type = 8 +rank = 1 +icon = ExtResource( 3 ) +needs_target = true +target_aura_applys = [ ExtResource( 2 ) ] +text_name = "Aspect of Wolves" +text_description = "Range: 26m. +Deals 280 to 330 damage every 2 sec, and reduces melee and spell damage by 10% for 22 sec." +range = true +range_range = 26.0 +aoe_targetType = 1129071960 +aoe_colliderType = 1058050193 +script = ExtResource( 1 ) diff --git a/game/data/spells/2_test_cast_spell.tres b/game/data/spells/2_test_cast_spell.tres new file mode 100644 index 0000000..5e4130a --- /dev/null +++ b/game/data/spells/2_test_cast_spell.tres @@ -0,0 +1,14 @@ +[gd_resource type="Spell" load_steps=3 format=2] + +[ext_resource path="res://data/icons/naturalist/natures_swiftness.tres" type="Texture" id=1] +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=2] + +[resource] +id = 2 +spell_type = 16 +target_type = -2147461888 +target_relation_type = 4 +rank = 1 +icon = ExtResource( 1 ) +aoe_targetType = -2147459840 +script = ExtResource( 2 ) diff --git a/game/data/spells/30_aspect_of_bees.tres b/game/data/spells/30_aspect_of_bees.tres new file mode 100644 index 0000000..6d75c09 --- /dev/null +++ b/game/data/spells/30_aspect_of_bees.tres @@ -0,0 +1,26 @@ +[gd_resource type="Spell" load_steps=4 format=2] + +[ext_resource path="res://scripts/spells/gd_spell_script.gd" type="Script" id=1] +[ext_resource path="res://data/auras/24_aspect_of_bees.tres" type="Aura" id=2] +[ext_resource path="res://data/icons/naturalist/aspect_of_bees.tres" type="Texture" id=3] + +[resource] +resource_name = "Aspect of Bees" +id = 30 +spell_type = 8 +level = 10 +rank = 1 +icon = ExtResource( 3 ) +needs_target = true +target_aura_applys = [ ExtResource( 2 ) ] +text_name = "Aspect of Bees" +text_description = "Range: 26m. +Instant. +Cooldown: {2} +Deals 460 to 540 damage every 3 sec, healing you for 80% of the damage." +cooldown_cooldown = 21.0 +range = true +range_range = 26.0 +aoe_targetType = -1910718371 +aoe_colliderType = -298046312 +script = ExtResource( 1 ) diff --git a/game/data/spells/31_overload.tres b/game/data/spells/31_overload.tres new file mode 100644 index 0000000..5494a89 --- /dev/null +++ b/game/data/spells/31_overload.tres @@ -0,0 +1,40 @@ +[gd_resource type="Spell" load_steps=7 format=2] + +[ext_resource path="res://data/icons/naturalist/amplify_pain.tres" type="Texture" id=1] +[ext_resource path="res://scripts/resources/spell_effect_visual_basic.gd" type="Script" id=2] +[ext_resource path="res://scripts/spells/amplify_pain.gd" type="Script" id=3] +[ext_resource path="res://data/spell_effects/nature/AmplifyPain.tscn" type="PackedScene" id=4] +[ext_resource path="res://data/spell_effects/nature/NatureCast.tscn" type="PackedScene" id=5] + +[sub_resource type="SpellEffectVisual" id=1] +script = ExtResource( 2 ) +spell_cast_effect_left_hand = ExtResource( 5 ) +spell_cast_effect_right_hand = ExtResource( 5 ) +torso_aura_effect_time = 0.0 +root_aura_effect_time = 0.0 +torso_spell_cast_finish_effect = ExtResource( 4 ) +torso_spell_cast_finish_effect_time = 0.4 +root_spell_cast_finish_effect_time = 1.0 + +[resource] +resource_name = "Overload" +id = 31 +spell_type = 8 +level = 10 +icon = ExtResource( 1 ) +visual_spell_effects = SubResource( 1 ) +text_name = "Overload" +text_description = "Range: 26m. +Channeled. Free. +Causes your dots to deal 10% more damage." +range = true +range_range = 26.0 +cast = true +cast_cast_time = 1.5 +damage = true +damage_type = 16 +damage_min = 130 +damage_max = 150 +aoe_targetType = -1910718371 +aoe_colliderType = 1065353216 +script = ExtResource( 3 ) diff --git a/game/data/spells/32_heat.tres b/game/data/spells/32_heat.tres new file mode 100644 index 0000000..35c17a3 --- /dev/null +++ b/game/data/spells/32_heat.tres @@ -0,0 +1,7 @@ +[gd_resource type="Spell" format=2] + +[resource] +resource_name = "Heat" +id = 32 +text_name = "Heat" +text_description = "Increase the temperature of your body, to allow the usange of all fire spells. Water spells are still usable at reduced efficiency." diff --git a/game/data/spells/33_normal.tres b/game/data/spells/33_normal.tres new file mode 100644 index 0000000..0ae7212 --- /dev/null +++ b/game/data/spells/33_normal.tres @@ -0,0 +1,7 @@ +[gd_resource type="Spell" format=2] + +[resource] +resource_name = "Normal temperature" +id = 33 +text_name = "Normal temperature" +text_description = "Use water spells at maximum efficiency. Some ice and fire based spells are also usable at reduced efficiency." diff --git a/game/data/spells/34_cold.tres b/game/data/spells/34_cold.tres new file mode 100644 index 0000000..11bcbbc --- /dev/null +++ b/game/data/spells/34_cold.tres @@ -0,0 +1,7 @@ +[gd_resource type="Spell" format=2] + +[resource] +resource_name = "Cold" +id = 34 +text_name = "Cold" +text_description = "Reduce the temperature of your body, to allow the usange of all ice spells. Water spells are still usable at reduced efficiency." diff --git a/game/data/world_spells/1_testwp.tres b/game/data/world_spells/1_testwp.tres new file mode 100644 index 0000000..af613f4 --- /dev/null +++ b/game/data/world_spells/1_testwp.tres @@ -0,0 +1,6 @@ +[gd_resource type="WorldSpellData" format=2] + +[resource] +resource_name = "Test" +id = 1 +text_name = "Test" diff --git a/game/data/xp/xp_data.tres b/game/data/xp/xp_data.tres new file mode 100644 index 0000000..57e1f70 --- /dev/null +++ b/game/data/xp/xp_data.tres @@ -0,0 +1,52 @@ +[gd_resource type="XPData" format=2] + +[resource] +level_2 = 600 +level_3 = 1000 +level_4 = 1000 +level_5 = 1000 +level_6 = 1000 +level_7 = 1000 +level_8 = 1000 +level_9 = 1000 +level_10 = 1000 +level_11 = 1000 +level_12 = 1000 +level_13 = 1000 +level_14 = 1000 +level_15 = 1000 +level_16 = 1000 +level_17 = 1000 +level_18 = 1000 +level_19 = 1000 +level_20 = 1000 +level_21 = 1000 +level_22 = 1000 +level_23 = 1000 +level_24 = 1000 +level_25 = 1000 +level_26 = 1000 +level_27 = 1000 +level_28 = 1000 +level_29 = 1000 +level_30 = 1000 +level_31 = 1000 +level_32 = 1000 +level_33 = 1000 +level_34 = 1000 +level_35 = 1000 +level_36 = 1000 +level_37 = 1000 +level_38 = 1000 +level_39 = 1000 +level_40 = 1000 +level_41 = 1000 +level_42 = 1000 +level_43 = 1000 +level_44 = 1000 +level_45 = 1000 +level_46 = 1000 +level_47 = 1000 +level_48 = 1000 +level_49 = 1000 +level_50 = 1000 diff --git a/game/default_bus_layout.tres b/game/default_bus_layout.tres new file mode 100644 index 0000000..eb4accc --- /dev/null +++ b/game/default_bus_layout.tres @@ -0,0 +1,3 @@ +[gd_resource type="AudioBusLayout" format=2] + +[resource] diff --git a/game/dungeon_generator/DungeonGeneratorScene.gd b/game/dungeon_generator/DungeonGeneratorScene.gd new file mode 100644 index 0000000..8dbdc40 --- /dev/null +++ b/game/dungeon_generator/DungeonGeneratorScene.gd @@ -0,0 +1,191 @@ +extends Navigation2D + +export (PackedScene) var room : PackedScene +export (NodePath) var map_path : NodePath + +var map + +var tile_size : int = 3 +var num_rooms : int = 50 +var min_size : int = 9 +var max_size : int = 20 +var hspread : float = 400 +var cull : float = 0.5 + +var path : AStar + +func _ready(): + map = get_node(map_path) + + randomize() + make_rooms() + +func make_rooms(): + for i in range(num_rooms): + var pos : Vector2 = Vector2(rand_range(-hspread, hspread), 0) + var r : Node = room.instance() + var w = min_size + randi() % (max_size - min_size) + var h = min_size + randi() % (max_size - min_size) + + r.make_room(pos, Vector2(w, h)* tile_size) + $Rooms.add_child(r) + r.owner = $Rooms + + yield(get_tree().create_timer(1.1), 'timeout') + #cull rooms + var room_positions : Array = [] + for room in $Rooms.get_children(): + if randf() < cull: + room.queue_free() + else: + room.mode = RigidBody2D.MODE_STATIC + room_positions.append(Vector3(room.position.x, room.position.y, 0)) + + yield(get_tree(), 'idle_frame') + + #generate MST + path = find_mst(room_positions) + + make_map() + + +func a_draw(): + for room in $Rooms.get_children(): + draw_rect(Rect2(room.position - room.size, room.size * 2), + Color(0, 1, 0), false) + + if path: + for p in path.get_points(): + for c in path.get_point_connections(p): + var pp = path.get_point_position(p) + var cp = path.get_point_position(c) + + draw_line(Vector2(pp.x, pp.y), Vector2(cp.x, cp.y), Color(1, 1, 0), 15, true) + +func a_process(delta): + update() + +func a_input(event): + if event.is_action_pressed('ui_select'): + for n in $Rooms.get_children(): + n.queue_free() + + path = null + + make_rooms() + + if event.is_action_pressed('ui_focus_next'): + make_map() + +func find_mst(nodes : Array) -> AStar: + #Prim's algorithm + var path = AStar.new() + path.add_point(path.get_available_point_id(), nodes.pop_front()) + + while nodes: + var min_dist = INF + var min_p = null + var p = null + + for p1 in path.get_points(): + p1 = path.get_point_position(p1) + + for p2 in nodes: + if p1.distance_to(p2) < min_dist: + min_dist = p1.distance_to(p2) + min_p = p2 + p = p1 + + var n = path.get_available_point_id() + path.add_point(n, min_p) + path.connect_points(path.get_closest_point(p), n) + nodes.erase(min_p) + + return path + +func make_map() -> void: + map.clear() + + #for x in range(0, 200): + # for y in range(0, 200): + # tile_map.set_cell(x, y, 0) + + #fill tilemap with walls + #var full_rect = Rect2() + #carve the rooms + var corridors = [] + var mob_count = 0 + var player_spawned = false + for room in $Rooms.get_children(): + var top_left = room.position.floor() + var bottom_right = (top_left + room.size).floor() + + for x in range(top_left.x, bottom_right.x): + for z in range(top_left.y, bottom_right.y): + for y in range(0, 2): + map.draw_voxel_data_point(Vector3(x, y, z), 0, randi() % 255) + + + #connection + #var p = path.get_closest_point(Vector3(room.position.x, room.position.y, 0)) + + #for conn in path.get_point_connections(p): + # if not conn in corridors: + # var start = Vector2(path.get_point_position(p).x, path.get_point_position(p).y).ceil() + # var end = Vector2(path.get_point_position(conn).x, path.get_point_position(conn).y).ceil() + + # carve_path(start, end) + + #corridors.append(p) + + var pos : Vector2 = room.position + (room.size / 2).floor() + if not player_spawned: + #Entities.spawn_player(1, Vector3(pos.x, 2, pos.y)) + player_spawned = true + else: + if mob_count < 20: + Entities.spawn_mob(1, randi() % 3, Vector3(pos.x, 2, pos.y)) + mob_count += 1 + + map.build() + +func carve_path(pos1, pos2): + var x_diff = sign(pos2.x - pos1.x) + var y_diff = sign(pos2.y - pos1.y) + + if x_diff == 0: + x_diff = pow(-1.0, randi() % 2) + if y_diff == 0: + y_diff = pow(-1.0, randi() % 2) + + var x_y = pos1 + var y_x = pos2 + + #if (randi() % 2) > 0: + # x_y = pos2 + # y_x = pos1 + + for x in range(pos1.x, pos2.x, x_diff): + for n in range(5): + var tile = 1 + + if n == 0 or n == 4: + tile = 0 + + # if tile_map.get_cell(x, x_y.y + (n * y_diff)) != 1: + # tile_map.set_cell(x, x_y.y + (n * y_diff), tile) + + for y in range(pos1.y, pos2.y, y_diff): + for n in range(5): + var tile = 1 + + if n == 0 or n == 4: + tile = 0 + + # if tile_map.get_cell(y_x.x + (n * x_diff), y) != 1: + # tile_map.set_cell(y_x.x + (n * x_diff), y, tile) + + + + + diff --git a/game/dungeon_generator/DungeonGeneratorScene.tscn b/game/dungeon_generator/DungeonGeneratorScene.tscn new file mode 100644 index 0000000..3d33b3b --- /dev/null +++ b/game/dungeon_generator/DungeonGeneratorScene.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://dungeon_generator/DungeonGeneratorScene.gd" type="Script" id=1] +[ext_resource path="res://dungeon_generator/Room.tscn" type="PackedScene" id=2] + +[node name="DungeonGenerator" type="Navigation2D"] +script = ExtResource( 1 ) +room = ExtResource( 2 ) + +[node name="Rooms" type="Node" parent="."] + +[node name="Camera2D" type="Camera2D" parent="."] +current = true +zoom = Vector2( 10, 10 ) diff --git a/game/dungeon_generator/MainDungeonGenerator.gd b/game/dungeon_generator/MainDungeonGenerator.gd new file mode 100644 index 0000000..179a311 --- /dev/null +++ b/game/dungeon_generator/MainDungeonGenerator.gd @@ -0,0 +1,25 @@ +tool +extends Resource +class_name MainDungeonGenerator + +enum GenType { + TEST = 0, NORMAL = 1, NOISE3D = 2, ANL = 3 +} + + +export(MeshDataResource) var prop_mesht : MeshDataResource + + +export(int) var gen_type : int = GenType.NORMAL +export(int) var _level_seed : int +export(bool) var _spawn_mobs : bool + +var _world : Navigation2D + +func setup(world : Navigation2D, level_seed : int, spawn_mobs : bool) -> void: + _level_seed = level_seed + _world = world + _spawn_mobs = spawn_mobs + +func _generate_chunk(chunk : Resource) -> void: + pass diff --git a/game/dungeon_generator/Room.gd b/game/dungeon_generator/Room.gd new file mode 100644 index 0000000..8454f30 --- /dev/null +++ b/game/dungeon_generator/Room.gd @@ -0,0 +1,13 @@ +extends RigidBody2D + +var size : Vector2 + +func make_room(_pos : Vector2, _size : Vector2): + position = _pos + size = _size + + var s : RectangleShape2D = RectangleShape2D.new() + s.custom_solver_bias = 0.75 + s.extents = size + + $CollisionShape2D.shape = s diff --git a/game/dungeon_generator/Room.tscn b/game/dungeon_generator/Room.tscn new file mode 100644 index 0000000..54ce402 --- /dev/null +++ b/game/dungeon_generator/Room.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://dungeon_generator/Room.gd" type="Script" id=1] + +[node name="Room" type="RigidBody2D"] +collision_layer = 524288 +collision_mask = 524288 +mode = 2 +script = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] diff --git a/game/dungeon_generator/old_voxelmanlevelgenerator.tres b/game/dungeon_generator/old_voxelmanlevelgenerator.tres new file mode 100644 index 0000000..e1e74d8 --- /dev/null +++ b/game/dungeon_generator/old_voxelmanlevelgenerator.tres @@ -0,0 +1,11 @@ +[gd_resource type="VoxelmanLevelGenerator" load_steps=3 format=2] + +[ext_resource path="res://dungeon_generator/MainDungeonGenerator.gd" type="Script" id=1] +[ext_resource path="res://prop_tool/dada.tres" type="PropData" id=2] + +[resource] +script = ExtResource( 1 ) +prop = ExtResource( 2 ) +gen_type = 1 +_level_seed = 35 +_spawn_mobs = false diff --git a/game/icon.png b/game/icon.png new file mode 100644 index 0000000..6ad9b43 Binary files /dev/null and b/game/icon.png differ diff --git a/game/icon.png.flags b/game/icon.png.flags new file mode 100644 index 0000000..5130fd1 --- /dev/null +++ b/game/icon.png.flags @@ -0,0 +1 @@ +gen_mipmaps=false diff --git a/game/icon.png.import b/game/icon.png.import new file mode 100644 index 0000000..6258420 --- /dev/null +++ b/game/icon.png.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="StreamTexture" +path.s3tc="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.stex" +path.etc2="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc2.stex" +path.etc="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc.stex" +metadata={ +"imported_formats": [ "s3tc", "etc2", "etc" ], +"vram_texture": true +} + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.s3tc.stex", "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc2.stex", "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.etc.stex" ] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=true +flags/filter=true +flags/mipmaps=true +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/game/menu/CharacterEntry.gd b/game/menu/CharacterEntry.gd new file mode 100644 index 0000000..3f2a8c6 --- /dev/null +++ b/game/menu/CharacterEntry.gd @@ -0,0 +1,32 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var name_label_path : NodePath +export(NodePath) var class_label_path : NodePath +export(NodePath) var level_label_path : NodePath + +var id : int +var file_name : String +var name_label : Label +var class_label : Label +var level_label : Label +var entity : Entity + +func _ready(): + name_label = get_node(name_label_path) as Label + class_label = get_node(class_label_path) as Label + level_label = get_node(level_label_path) as Label + + +func setup(pfile_name : String, name : String, cls_name : String, level : int, pentity : Entity) -> void: + file_name = pfile_name + name_label.text = name + class_label.text = cls_name + level_label.text = str(level) + entity = pentity + +func set_class_name(name : String) -> void: + class_label.text = name diff --git a/game/menu/CharacterEntry.tscn b/game/menu/CharacterEntry.tscn new file mode 100644 index 0000000..54ca93d --- /dev/null +++ b/game/menu/CharacterEntry.tscn @@ -0,0 +1,81 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://menu/CharacterEntry.gd" type="Script" id=2] + +[node name="CharacterEntry" type="Button"] +margin_right = 224.0 +margin_bottom = 88.0 +rect_min_size = Vector2( 80, 80 ) +size_flags_horizontal = 3 +theme = ExtResource( 1 ) +toggle_mode = true +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +name_label_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/name") +class_label_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/class") +level_label_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/level") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 219.0 +margin_bottom = 83.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="MarginContainer/HBoxContainer"] +margin_right = 68.0 +margin_bottom = 78.0 +mouse_filter = 2 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 64.0 +margin_bottom = 74.0 +rect_min_size = Vector2( 60, 60 ) +mouse_filter = 2 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +margin_left = 76.0 +margin_right = 214.0 +margin_bottom = 78.0 +mouse_filter = 2 +size_flags_horizontal = 3 + +[node name="name" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_right = 138.0 +margin_bottom = 15.0 + +[node name="class" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 138.0 +margin_bottom = 38.0 + +[node name="level" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_top = 46.0 +margin_right = 138.0 +margin_bottom = 61.0 diff --git a/game/menu/character_creation_button_group.tres b/game/menu/character_creation_button_group.tres new file mode 100644 index 0000000..0e55d74 --- /dev/null +++ b/game/menu/character_creation_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/game/menu/menu_character_button_group.tres b/game/menu/menu_character_button_group.tres new file mode 100644 index 0000000..0e55d74 --- /dev/null +++ b/game/menu/menu_character_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/game/networking/PlayerMaster.gd b/game/networking/PlayerMaster.gd new file mode 100644 index 0000000..fe8c245 --- /dev/null +++ b/game/networking/PlayerMaster.gd @@ -0,0 +1,24 @@ +extends Resource +class_name PlayerMaster + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# Player info, associate ID to data +var player_info = {} +# Info we send to other players +var my_info = { name = "Testname", selected_class = 1 } +var sid : int + +var player : Entity + +func _init(): + pass + +func _notification(what : int) -> void: + if what == NOTIFICATION_PREDELETE: + #save + #cleanup + pass + diff --git a/game/networking/SpawnPoint.gd b/game/networking/SpawnPoint.gd new file mode 100644 index 0000000..4be573a --- /dev/null +++ b/game/networking/SpawnPoint.gd @@ -0,0 +1,118 @@ +extends Spatial + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (bool) var use_gui : bool = false +export (bool) var multi_player : bool = false +export (NodePath) var gui_path : NodePath +export (NodePath) var host_button_path : NodePath + +export (NodePath) var address_line_edit_path : NodePath +export (NodePath) var port_line_edit_path : NodePath + +export (NodePath) var connect_button_path : NodePath +export (NodePath) var naturalist_button_path : NodePath + +export (NodePath) var terrarin_path : NodePath + +var gui : Node +var host_button : Button +var address_line_edit : LineEdit +var port_line_edit : LineEdit +var connect_button : Button +var naturalist_button : Button + +var player : Entity +var terrarin : Navigation2D + +var spawned : bool = false + +var player_master : PlayerMaster + +func _ready(): + gui = get_node(gui_path) + host_button = get_node(host_button_path) + host_button.connect("pressed", self, "_on_host_button_clicked") + + address_line_edit = get_node(address_line_edit_path) + port_line_edit = get_node(port_line_edit_path) + + connect_button = get_node(connect_button_path) + connect_button.connect("pressed", self, "_on_client_button_clicked") + + naturalist_button = get_node(naturalist_button_path) + naturalist_button.connect("pressed", self, "_on_client_naturalist_button_clicked") + + terrarin = get_node(terrarin_path) as Navigation2D + + Server.connect("cplayer_master_created", self, "_cplayer_master_created") + + if not multi_player: + set_process(true) + else: + set_process(false) + + if use_gui: + gui.visible = true + +func _process(delta): + set_process(false) + + spawn() + +func spawn(): + if not spawned: + spawned = true + + if get_tree().network_peer == null: + player = Entities.spawn_player(1, Vector3(10, 20, 10), "Player", "1", 1) + call_deferred("set_terrarin_player") +# +# Entities.spawn_mob(1, 50, Vector3(20, 6, 20)) +# Entities.spawn_mob(1, 50, Vector3(54, 6, 22)) +# Entities.spawn_mob(1, 50, Vector3(76, 6, 54)) + +func set_terrarin_player(): + terrarin.set_player(player as Node2D) + +func _on_host_button_clicked(): + get_tree().connect("network_peer_connected", self, "_network_peer_connected") + get_tree().connect("network_peer_disconnected", self, "_network_peer_disconnected") + + Server.start_hosting() + + spawn() + +func _on_client_button_clicked(): + + var addr : String = "127.0.0.1" if address_line_edit.text == "" else address_line_edit.text + var port : int = 0 if port_line_edit.text == "" else int(port_line_edit.text) + + Server.connect_to_server(addr, port) + + + +func _network_peer_connected(id : int): + print(id) + +func _network_peer_disconnected(id : int): + print(id) + +func _cplayer_master_created(pplayer_master): + player_master = pplayer_master as PlayerMaster + +func _on_client_naturalist_button_clicked(): + #Network.is + #set_class + + gui.visible = false + + if get_tree().network_peer != null: + Server.set_class() + else: + spawn() + + + diff --git a/game/player/CameraPivot.gd b/game/player/CameraPivot.gd new file mode 100644 index 0000000..4ca93e5 --- /dev/null +++ b/game/player/CameraPivot.gd @@ -0,0 +1,74 @@ +extends Spatial + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (float) var max_camera_distance : float = 20.0 + +var target_camera_distance : float = 6.0 +var camera_distance : float = target_camera_distance + +var camera : Camera + +var x_rot : float = 0.0 +var y_rot : float = 0.0 + +var player : Entity + +func _ready() -> void: + camera = $Camera + + camera.translation.z = target_camera_distance + + player = get_node("..") + + set_physics_process(true) + +func _physics_process(delta): + var pos : Vector3 = to_global(Vector3()) + + var space_state = get_world().direct_space_state + + var result : Dictionary = space_state.intersect_ray(pos, to_global(Vector3(0, 0, target_camera_distance)), [player], player.collision_mask) + + if result: + camera_distance = (result.position - pos).length() - 0.2 + else: + camera_distance = target_camera_distance + + camera.translation.z = camera_distance + +func camera_distance_set_delta(delta : float) -> void: + target_camera_distance += delta + + if target_camera_distance > max_camera_distance: + target_camera_distance = max_camera_distance + elif target_camera_distance < 0: + target_camera_distance = 0 + +func rotate_delta(x_delta : float, y_delta : float) -> void: + x_rot += y_delta + y_rot += x_delta + + x_rot = clamp(x_rot, -90, 90) + + if y_rot >= 360: + y_rot = y_rot - 360 + if y_rot < 0: + y_rot = y_rot + 360 + + rotation_degrees = Vector3(x_rot, y_rot, 0.0) + +func get_y_rot() -> float: + return y_rot + +func set_y_rot(yrot : float) -> void: + y_rot = yrot + + rotation_degrees = Vector3(x_rot, y_rot, 0.0) + +func a_process(delta : float) -> void: + y_rot += delta + + rotation_degrees = Vector3(x_rot, y_rot, 0.0) diff --git a/game/player/CharacterSkeletonAttachPoint.gd b/game/player/CharacterSkeletonAttachPoint.gd new file mode 100644 index 0000000..178058f --- /dev/null +++ b/game/player/CharacterSkeletonAttachPoint.gd @@ -0,0 +1,75 @@ +extends Spatial +class_name CharacterSkeketonAttachPoint + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +var effects : Dictionary +var timed_effects : Dictionary + +func add_effect(effect : PackedScene) -> void: + if effects.has(effect): + effects[effect][0] = effects[effect][0] + 1 + else: + var eff : Node = effect.instance() + + add_child(eff) + eff.owner = self + + var data : Array = [ 1, eff ] + effects[effect] = data + +func add_effect_timed(effect : PackedScene, time : float) -> void: + if timed_effects.has(effect): + timed_effects[effect][0] = timed_effects[effect][0] + 1 + else: + var eff : Node = effect.instance() + + add_child(eff) + eff.owner = self + + var data : Array = [ 1, eff, time ] + timed_effects[effect] = data + +func remove_effect(effect : PackedScene) -> void: + if effects.has(effect): + var data : Array = effects[effect] + + data[0] = data[0] - 1 + + if data[0] <= 0: + data[1].queue_free() + + effects.erase(effect) + + +func _process(delta : float) -> void: + for k in timed_effects.keys(): + var data : Array = timed_effects[k] + + data[2] -= delta + + if data[2] <= 0: + data[1].queue_free() + + timed_effects.erase(k) diff --git a/game/player/CharacterSkeletonGD.gd b/game/player/CharacterSkeletonGD.gd new file mode 100644 index 0000000..49a7a52 --- /dev/null +++ b/game/player/CharacterSkeletonGD.gd @@ -0,0 +1,26 @@ +tool +extends CharacterSkeleton3D + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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/game/player/DisplayEntity.gd b/game/player/DisplayEntity.gd new file mode 100644 index 0000000..ae4ea4a --- /dev/null +++ b/game/player/DisplayEntity.gd @@ -0,0 +1,379 @@ +extends Entity + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (float) var MOUSE_SENSITIVITY : float = 0.05 +export (String) var map_path : String + +const ray_length = 1000 +const ACCEL : float = 100.0 +const DEACCEL : float = 100.0 +const GRAVITY : float = -24.8 +const JUMP_SPEED : float = 3.8 +const MAX_SLOPE_ANGLE : float = 40.0 +const MOUSE_TARGET_MAX_OFFSET : int = 10 + +var _on : bool = true + +var y_rot : float = 0.0 + +var vel : Vector3 = Vector3() +var dir : Vector3 = Vector3() + +var input_dir : Vector2 = Vector2() +var mouse_dir : Vector2 = Vector2() +var mouse_move_dir : Vector2 = Vector2() +var mouse_left_down : bool = false +var mouse_right_down : bool = false +var touchpad_dir : Vector2 = Vector2() +var mouse_down_delta : Vector2 = Vector2() +var queued_camera_rotaions : Vector2 = Vector2() + +var key_left : bool = false +var key_right : bool = false +var key_up : bool = false +var key_down : bool = false + +var cursor_grabbed : bool = false +var last_cursor_pos : Vector2 = Vector2() +var mouse_down_pos : Vector2 = Vector2() +var total_down_mouse_delta : Vector2 = Vector2() + +var camera : Camera +var camera_pivot : Spatial + +var animation_tree : AnimationTree +var anim_node_state_machine : AnimationNodeStateMachinePlayback = null +var animation_run : bool = false + +var moving : bool = false +var casting_anim : bool = false + +var last_mouse_over : Entity = null + +func _ready() -> void: + camera = $CameraPivot/Camera as Camera + camera_pivot = $CameraPivot as Spatial + + animation_tree = get_character_skeleton().get_animation_tree() + + if animation_tree != null: + anim_node_state_machine = animation_tree["parameters/playback"] + + set_process(true) + +func _physics_process(delta : float) -> void: + if not _on: + return + + process_input(delta) + process_movement(delta) + +func process_input(delta: float) -> void: + var key_dir : Vector2 = Vector2() + + if key_up: + key_dir.y += 1 + if key_down: + key_dir.y -= 1 + if key_left: + key_dir.x += 1 + if key_right: + key_dir.x -= 1 + + input_dir = key_dir + mouse_dir + touchpad_dir + mouse_move_dir + + var state : int = getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + input_dir = Vector2() + return + + var input_length : float = input_dir.length_squared() + + if input_length > 0.1: + if anim_node_state_machine != null and not animation_run: + anim_node_state_machine.travel("run-loop") + animation_run = true + + input_dir = input_dir.normalized() + + animation_tree["parameters/run-loop/blend_position"] = input_dir + else: + if anim_node_state_machine != null and animation_run: + anim_node_state_machine.travel("idle-loop") + animation_run = false + + if queued_camera_rotaions.length_squared() > 1: + camera_pivot.rotate_delta(queued_camera_rotaions.x * 2.0, -queued_camera_rotaions.y) + queued_camera_rotaions = Vector2() + + +func process_movement(delta : float) -> void: + var state : int = getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + moving = false + return + + if input_dir.x > 0.1 or input_dir.y > 0.1 or input_dir.x < -0.1 or input_dir.y < -0.1: + var forward : Vector3 = Vector3(0, 0, 1).rotated(Vector3(0, 1, 0), deg2rad(y_rot)) + var right : Vector3 = forward.cross(Vector3(0, 1, 0)) * -input_dir.x + forward *= input_dir.y #only potentially make it zero after getting the right vector + + dir = forward + dir += right + + if dir.length_squared() > 0.1: + dir = dir.normalized() + + moving = true + moved() + else: + dir = Vector3() + moving = false + + vel.y += delta * GRAVITY + + var hvel : Vector3 = vel + hvel.y = 0 + + var target : Vector3 = dir + target *= get_speed().ccurrent + + var accel + if dir.dot(hvel) > 0: + accel = ACCEL + else: + accel = DEACCEL + + hvel = hvel.linear_interpolate(target, accel * delta) as Vector3 + vel.x = hvel.x + vel.z = hvel.z +# vel = move_and_slide(vel, Vector3(0,1,0), false, 4, deg2rad(MAX_SLOPE_ANGLE)) + + if get_tree().network_peer: + if get_tree().is_network_server(): + rset_position(position, rotation) + else: + rpc("set_position", position, rotation) + +func _input(event: InputEvent) -> void: + if not cursor_grabbed: + set_process_input(false) + return + + if event is InputEventMouseMotion and event.device != -1: + var s : float = ProjectSettings.get("display/mouse_cursor/sensitivity") + + var relx : float = event.relative.x * s + var rely : float = event.relative.y * s + + mouse_down_delta.x += relx + mouse_down_delta.y += rely + + total_down_mouse_delta.x += relx + total_down_mouse_delta.y += rely + + get_tree().set_input_as_handled() + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey: + var ievkey : InputEventKey = event as InputEventKey + + if ievkey.scancode == KEY_W: + key_up = ievkey.pressed + if ievkey.scancode == KEY_S: + key_down = ievkey.pressed + if ievkey.scancode == KEY_A: + key_left = ievkey.pressed + if ievkey.scancode == KEY_D: + key_right = ievkey.pressed + + if event is InputEventMouseMotion and not (mouse_right_down or mouse_left_down) and event.device != -1: + cmouseover(event) + + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT and event.device != -1: + mouse_left_down = event.pressed + + if mouse_left_down: + mouse_down_delta = Vector2() + mouse_down_pos = event.position + + if event.button_index == BUTTON_RIGHT and event.device != -1: + mouse_right_down = event.pressed + + + if mouse_left_down and mouse_right_down: + mouse_move_dir.y = 1 + else: + mouse_move_dir.y = 0 + + if event.is_pressed() and event.device != -1: + if event.button_index == BUTTON_WHEEL_UP: + camera_pivot.camera_distance_set_delta(-0.2) + if event.button_index == BUTTON_WHEEL_DOWN: + camera_pivot.camera_distance_set_delta(0.2) + + if not event.pressed and event.button_index == BUTTON_LEFT and event.device != -1: + if mouse_down_delta.length() < MOUSE_TARGET_MAX_OFFSET: + target(event.position) + + if event is InputEventScreenTouch and event.pressed: + target(event.position) + + update_cursor_mode() + +func update_cursor_mode(): + if mouse_left_down or mouse_right_down: + if not cursor_grabbed: + set_process_input(true) + total_down_mouse_delta = Vector2() + + cursor_grabbed = true + last_cursor_pos = get_viewport().get_mouse_position() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + else: + if cursor_grabbed: + set_process_input(false) + cursor_grabbed = false + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + get_viewport().warp_mouse(last_cursor_pos) + + if total_down_mouse_delta.length_squared() < 8: + target(last_cursor_pos) + + + +func target(position : Vector2): + var from = camera.project_ray_origin(position) + var to = from + camera.project_ray_normal(position) * ray_length + + var space_state = get_world_2d().direct_space_state + var result = space_state.intersect_ray(from, to, [], 2) + + if result: + print(result) + if result.collider and result.collider is Entity: + var ent : Entity = result.collider as Entity + + crequest_target_change(ent.get_path()) + return + + crequest_target_change(NodePath()) + else: + crequest_target_change(NodePath()) + +func cmouseover(event): + var from = camera.project_ray_origin(event.position) + var to = from + camera.project_ray_normal(event.position) * ray_length + + var space_state = get_world_2d().direct_space_state + var result = space_state.intersect_ray(from, to, [], 2) + + if result: + if result.collider and result.collider is Entity: + var mo : Entity = result.collider as Entity + + if last_mouse_over != null and last_mouse_over != mo: + if is_instance_valid(last_mouse_over): + last_mouse_over.onc_mouse_exit() + + last_mouse_over = null + + if last_mouse_over == null: + mo.onc_mouse_enter() + last_mouse_over = mo + + return + + if last_mouse_over != null: + last_mouse_over.onc_mouse_exit() + last_mouse_over = null + +func analog_force_change(vector, touchpad): + if touchpad.padname == "TouchPad": + touchpad_dir = vector + touchpad_dir.x *= -1 + elif touchpad.padname == "TargetPad": + #try to target + return + +func queue_camera_rotation(rot : Vector2) -> void: + queued_camera_rotaions += rot + +remote func rset_position(pposition : Vector2, protation : float) -> void: + if get_tree().is_network_server(): + rpc("set_position", pposition, protation) + +func _moved() -> void: + if sis_casting(): + sfail_cast() + +func _con_target_changed(entity: Entity, old_target: Entity) -> void: + if is_instance_valid(old_target): + old_target.onc_untargeted() + + if is_instance_valid(ctarget): + ctarget.onc_targeted() + + if canc_interact(): + crequest_interact() + +func _con_cast_started(info): + if anim_node_state_machine != null and not casting_anim: + anim_node_state_machine.travel("casting-loop") + casting_anim = true + animation_run = false + +func _con_cast_failed(info): + if anim_node_state_machine != null and casting_anim: + anim_node_state_machine.travel("idle-loop") + casting_anim = false + + if animation_run: + anim_node_state_machine.travel("run-loop") + +func _con_cast_finished(info): + if anim_node_state_machine != null: + anim_node_state_machine.travel("cast-end") + casting_anim = false + + if animation_run: + anim_node_state_machine.travel("run-loop") + +func _con_spell_cast_success(info): + if anim_node_state_machine != null: + anim_node_state_machine.travel("cast-end") + casting_anim = false + + if animation_run: + anim_node_state_machine.travel("run-loop") + +func _son_level_up(level: int) -> void: + if sentity_data == null: + return + + var ecd : EntityClassData = sentity_data.entity_class_data + + if ecd == null: + return + + sfree_spell_points += ecd.spell_points_per_level * level + sfree_talent_points += level + + for i in range(Stat.MAIN_STAT_ID_COUNT): + var st : int = sentity_data.entity_class_data.get_stat_data().get_level_stat_data().get_stat_diff(i, slevel - level, slevel) + + var statid : int = i + Stat.MAIN_STAT_ID_START + + var stat : Stat = get_stat_int(statid) + + var sm : StatModifier = stat.get_modifier(0) + sm.base_mod += st + + diff --git a/game/player/DisplayPlayer.gd b/game/player/DisplayPlayer.gd new file mode 100644 index 0000000..fae3b42 --- /dev/null +++ b/game/player/DisplayPlayer.gd @@ -0,0 +1,53 @@ +extends Entity +class_name DisplayPlayerGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +func _setup(): + setup_actionbars() + + +func _son_level_up(level: int) -> void: + if sentity_data == null: + return + + var ecd : EntityClassData = sentity_data.entity_class_data + + if ecd == null: + return + + sfree_spell_points += ecd.spell_points_per_level * level + sfree_talent_points += level + + for i in range(Stat.MAIN_STAT_ID_COUNT): + var st : int = sentity_data.entity_class_data.get_stat_data().get_level_stat_data().get_stat_diff(i, slevel - level, slevel) + + var statid : int = i + Stat.MAIN_STAT_ID_START + + var stat : Stat = get_stat_int(statid) + + var sm : StatModifier = stat.get_modifier(0) + sm.base_mod += st + + diff --git a/game/player/DisplayPlayer.tscn b/game/player/DisplayPlayer.tscn new file mode 100644 index 0000000..f736773 --- /dev/null +++ b/game/player/DisplayPlayer.tscn @@ -0,0 +1,25 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://player/DisplayPlayer.gd" type="Script" id=1] + +[node name="DisplayPlayer" type="Entity" groups=[ +"players", +]] +collision_layer = 3 +collision_mask = 3 +character_skeleton_path = NodePath("Rotation_Helper/Model/character") +sseed = 9240987 +cseed = 9240987 +script = ExtResource( 1 ) + +[node name="Rotation_Helper" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.960532, 0 ) +__meta__ = { +"_editor_description_": "" +} + +[node name="Model" type="Spatial" parent="Rotation_Helper"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.875205, 0 ) +__meta__ = { +"_editor_description_": "" +} diff --git a/game/player/GUI.gd b/game/player/GUI.gd new file mode 100644 index 0000000..e822432 --- /dev/null +++ b/game/player/GUI.gd @@ -0,0 +1,20 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var player_path : NodePath +export (Array, NodePath) var child_controls : Array + +func _ready() -> void: + + if player_path != null: + var player = get_node(player_path) + + + for child_path in child_controls: + var child = get_node(child_path) + + child.set_player(player) + diff --git a/game/player/Mob.gd b/game/player/Mob.gd new file mode 100644 index 0000000..f3b6da9 --- /dev/null +++ b/game/player/Mob.gd @@ -0,0 +1,344 @@ +extends Entity + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +#export (String) var map_path : String +export(float) var max_visible_distance : float = 120 setget set_max_visible_distance +var max_visible_distance_squared : float = max_visible_distance * max_visible_distance + +const ray_length = 1000 +const ACCEL : float = 100.0 +const DEACCEL : float = 100.0 +const GRAVITY : float = -24.8 +const JUMP_SPEED : float = 3.8 +const MAX_SLOPE_ANGLE : float = 40.0 + +#var process_gravity : bool = true + +var _on : bool = true + +var y_rot : float = 0.0 + +var vel : Vector3 = Vector3() +var dir : Vector3 = Vector3() +var target_movement_direction : Vector2 = Vector2() + +var animation_tree : AnimationTree +var anim_node_state_machine : AnimationNodeStateMachinePlayback = null +var animation_run : bool = false + +var moving : bool = false +var sleep : bool = false +var dead : bool = false +var death_timer : float = 0 + +func _ready() -> void: + animation_tree = get_character_skeleton().get_animation_tree() + + if animation_tree != null: + anim_node_state_machine = animation_tree["parameters/playback"] + + animation_tree["parameters/run-loop/blend_position"] = Vector2(0, -1) + + ai_state = EntityEnums.AI_STATE_PATROL + + set_process(true) + set_physics_process(true) + + +func _process(delta : float) -> void: + if dead: + death_timer += delta + + if death_timer > 60: + queue_free() + + return + + var camera : Camera = get_tree().get_root().get_camera() as Camera + + if camera == null: + return + + var cam_pos : Vector2 = camera.global_transform.xform(Vector3()) + var dstv : Vector2 = cam_pos - position + dstv.y = 0 + var dst : float = dstv.length_squared() + + if dst > max_visible_distance_squared: + if visible: + hide() + return + else: + if not visible: + show() + + #TODO check later if this gives a performance boost +# var cam_facing : Vector3 = -camera.global_transform.basis.z +# var d : float = cam_facing.dot(dstv) +# +# if d > 0: +# if visible: +# hide() +# return +# else: +# if not visible: +# show() + + +func _physics_process(delta : float) -> void: + if not _on: + return + + if sentity_data == null: + return + + if dead: + return + + process_movement(delta) + +func process_movement(delta : float) -> void: +# if starget != null: +# look_at(starget.translation, Vector3(0, 1, 0)) +# + var state : int = getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + moving = false + return + + if target_movement_direction.length_squared() > 0.1: + if anim_node_state_machine != null and not animation_run: + anim_node_state_machine.travel("run-loop") + animation_run = true + + target_movement_direction = target_movement_direction.normalized() + moving = true + else: + if anim_node_state_machine != null and animation_run: + anim_node_state_machine.travel("idle-loop") + animation_run = false + + moving = false + + if target_movement_direction.x > 0.1 or target_movement_direction.y > 0.1 or target_movement_direction.x < -0.1 or target_movement_direction.y < -0.1: + y_rot = Vector2(0, 1).angle_to(target_movement_direction) + + var forward : Vector3 = Vector3(0, 0, 1).rotated(Vector3(0, 1, 0), deg2rad(y_rot)) + var right : Vector3 = forward.cross(Vector3(0, 1, 0)) * -target_movement_direction.x + forward *= target_movement_direction.y #only potentially make it zero after getting the right vector + + dir = forward + dir += right + + if dir.length_squared() > 0.1: + dir = dir.normalized() + + moving = true + else: + dir = Vector3() + moving = false + + if not moving and sleep: + return + + if moving and sleep: + sleep = false + + vel.y += delta * GRAVITY + + var hvel : Vector3 = vel + hvel.y = 0 + + var target : Vector3 = dir + target *= get_speed().ccurrent + + var accel + if dir.dot(hvel) > 0: + accel = ACCEL + else: + accel = DEACCEL + + hvel = hvel.linear_interpolate(target, accel * delta) as Vector3 + vel.x = hvel.x + vel.z = hvel.z + + var facing : Vector3 = vel + facing.y = 0 + +# vel = move_and_slide(vel, Vector3(0,1,0), false, 4, deg2rad(MAX_SLOPE_ANGLE)) + sset_position(position, rotation) + + if vel.length_squared() < 0.12: + sleep = true + + +func sstart_attack(entity : Entity) -> void: + ai_state = EntityEnums.AI_STATE_ATTACK + + starget = entity + +func _onc_mouse_enter() -> void: + if centity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_LOOT: + Input.set_default_cursor_shape(Input.CURSOR_CROSS) + else: + Input.set_default_cursor_shape(Input.CURSOR_MOVE) + +func _onc_mouse_exit() -> void: + Input.set_default_cursor_shape(Input.CURSOR_ARROW) + +func _son_death(): + if dead: + return + + if starget == null: + queue_free() + return + + #warning-ignore:unused_variable + for i in range(sget_aura_count()): + sremove_aura(sget_aura(0)) + + dead = true + + var ldiff : float = slevel - starget.slevel + 10.0 + + if ldiff < 0: + ldiff = 0 + + if ldiff > 15: + ldiff = 15 + + ldiff /= 10.0 + + starget.adds_xp(int(5.0 * slevel * ldiff)) + + starget = null + + sentity_interaction_type = EntityEnums.ENITIY_INTERACTION_TYPE_LOOT + ai_state = EntityEnums.AI_STATE_OFF + + anim_node_state_machine.travel("dead") + +# set_process(false) + set_physics_process(false) + +remote func rset_position(position : Vector2, rotation : float) -> void: + if get_tree().is_network_server(): + rpc("rset_position", position, rotation) + +func _son_damage_dealt(data): + if ai_state != EntityEnums.AI_STATE_ATTACK and data.dealer != self: + sstart_attack(data.dealer) + +func _con_damage_dealt(info : SpellDamageInfo) -> void: +# if info.dealer == + WorldNumbers.damage(position, 1.6, info.damage, info.crit) + +func _con_heal_dealt(info : SpellHealInfo) -> void: + WorldNumbers.heal(position, 1.6, info.heal, info.crit) + +func _moved() -> void: + if sis_casting(): + sfail_cast() + +func set_max_visible_distance(var value : float) -> void: + max_visible_distance_squared = value * value + + max_visible_distance = value + +func _setup(): + sentity_name = sentity_data.text_name + +func _son_xp_gained(value : int) -> void: + if not Entities.get_xp_data().can_level_up(gets_level()): + return + + var xpr : int = Entities.get_xp_data().get_xp(gets_level()); + + if xpr <= sxp: + slevelup(1) + sxp = 0 + +func _son_level_up(value: int) -> void: + if sentity_data == null: + return + + var ecd : EntityClassData = sentity_data.entity_class_data + + if ecd == null: + return + + sfree_spell_points += ecd.spell_points_per_level * value + sfree_talent_points += value + + for i in range(Stat.MAIN_STAT_ID_COUNT): + var st : int = sentity_data.entity_class_data.get_stat_data().get_level_stat_data().get_stat_diff(i, slevel - value, slevel) + + var statid : int = i + Stat.MAIN_STAT_ID_START + + var stat : Stat = get_stat_int(statid) + + var sm : StatModifier = stat.get_modifier(0) + sm.base_mod += st + + + var arr : Array = Array() + + for i in range(ecd.get_num_spells()): + arr.append(ecd.get_spell(i)) + + randomize() + arr.shuffle() + + for v in range(value): + for i in range(arr.size()): + var spell : Spell = arr[i] + + if not hass_spell(spell): + var spnum :int = gets_spell_count() + + crequest_spell_learn(spell.id) + + if spnum != gets_spell_count(): + break + + if sfree_spell_points == 0: + break + + + if sfree_spell_points == 0: + break + + +func sset_position(pposition : Vector2, protation : float) -> void: + if multiplayer.network_peer and multiplayer.is_network_server(): +# cset_position(position, rotation) + vrpc("cset_position", pposition, protation) + +remote func cset_position(pposition : Vector2, protation : float) -> void: + position = pposition + rotation = protation + diff --git a/game/player/Mob.tscn b/game/player/Mob.tscn new file mode 100644 index 0000000..8716358 --- /dev/null +++ b/game/player/Mob.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://player/Mob.gd" type="Script" id=2] +[ext_resource path="res://ui/nameplates/NamePlate.tscn" type="PackedScene" id=3] + +[sub_resource type="CapsuleShape" id=1] +radius = 0.266582 +height = 0.927641 + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 0.216228, 0.0681041, 0.183397 ) + +[node name="Mob" type="Entity" groups=[ +"mobs", +]] +collision_layer = 3 +collision_mask = 3 +character_skeleton_path = NodePath("Rotation_Helper/Model/character") +script = ExtResource( 2 ) + +[node name="Body_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.73, 0 ) +shape = SubResource( 1 ) + +[node name="Feet_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0 ) +shape = SubResource( 2 ) + +[node name="Rotation_Helper" type="Spatial" parent="."] +transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, 0, 0, 0 ) + +[node name="Model" type="Spatial" parent="Rotation_Helper"] + +[node name="NamePlate" parent="." instance=ExtResource( 3 )] diff --git a/game/player/MobTest.gd b/game/player/MobTest.gd new file mode 100644 index 0000000..7bf0f3a --- /dev/null +++ b/game/player/MobTest.gd @@ -0,0 +1,31 @@ +extends Entity + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + connect("con_damage_taken", self, "c_on_damage_taken") + connect("son_damage_taken", self, "s_on_damage_taken") + #c_on_damage_taken( Entity Entity, DamagePipelineData damage_pipeline_data ) + + pass # Replace with function body. + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func c_on_damage_taken(entity, dpd): + print("c " + str(dpd.damage)) + print("ch " + str(get_health().ccurrent) + "/" + str(get_health().cmax)) + pass + +func s_on_damage_taken(entity, dpd): + print("s " + str(dpd.damage)) + #print("ch " + str(get_health().scurrent) + "/" + str(get_health().smax)) + pass diff --git a/game/player/NamePlate.gd b/game/player/NamePlate.gd new file mode 100644 index 0000000..9546908 --- /dev/null +++ b/game/player/NamePlate.gd @@ -0,0 +1,152 @@ +extends VBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(float) var max_distance : float = 70 setget set_max_distance +var max_distance_squared : float = max_distance * max_distance + +export(NodePath) var name_label_path : NodePath = "Name" +export(NodePath) var health_bar_path : NodePath = "HealthBar" +export(NodePath) var health_bar_label_path : NodePath = "HealthBar" + +export(Color) var normal_color : Color = Color("#e7e7e7") +export(Vector2) var normal_scale : Vector2 = Vector2(0.75, 0.75) +export(Color) var mouseover_color : Color = Color("#ffffff") +export(Vector2) var mouseover_scale : Vector2 = Vector2(0.85, 0.85) +export(Color) var targeted_color : Color = Color("#ffffff") +export(Vector2) var targeted_scale : Vector2 = Vector2(0.85, 0.85) + +var target_scale : Vector2 +var interpolating : bool + +var targeted : bool = false + +var name_label : Label = null +var health_bar : TextureProgress = null +var health_bar_label : Label = null + +var entity : Entity = null +var health : Stat = null + +func _ready(): + name_label = get_node(name_label_path) as Label + health_bar = get_node(health_bar_path) as TextureProgress + health_bar_label = get_node(health_bar_label_path) as Label + + entity = get_node("..") as Entity + health = entity.get_health() + + health.connect("c_changed", self, "c_health_changed") + + name_label.text = entity.centity_name + + entity.connect("cname_changed", self, "cname_changed") + entity.connect("onc_mouse_entered", self, "onc_entity_mouse_entered") + entity.connect("onc_mouse_exited", self, "onc_entity_mouse_exited") + entity.connect("onc_targeted", self, "onc_targeted") + entity.connect("onc_untargeted", self, "onc_untargeted") + + c_health_changed(health) + + modulate = normal_color + set_scale(normal_scale) + + target_scale = normal_scale + interpolating = false + + set_process(true) + +func _process(delta): + if interpolating: + var d : Vector2 = ((target_scale - get_scale()).normalized() * delta) + get_scale() + + set_scale(d) + + if (get_scale() - target_scale).length() < 0.01: + interpolating = false + + + var position : Vector3 = entity.translation + + var camera : Camera = get_tree().get_root().get_camera() as Camera + + if camera == null: + return + + var cam_pos : Vector3 = camera.global_transform.xform(Vector3()) + var dstv : Vector3 = cam_pos - position + dstv.y = 0 + var dst : float = dstv.length_squared() + + if dst > max_distance_squared: + if visible: + hide() + return + + var cam_facing : Vector3 = -camera.global_transform.basis.z + var d : float = cam_facing.dot(dstv) + + if d > 0: + if visible: + hide() + return + else: + if not visible: + show() + + + position.y += 1.9 + var screen_position : Vector2 = camera.unproject_position(position) + + var new_pos : Vector2 = Vector2(screen_position.x - (rect_size.x / 2.0) * rect_scale.x, screen_position.y - (rect_size.y) * rect_scale.y) + + set_position(new_pos) + + +func set_max_distance(var value : float) -> void: + max_distance_squared = value * value + + max_distance = value + +func c_health_changed(stat : Stat) -> void: + health_bar.max_value = stat.cmax + health_bar.value = stat.ccurrent + + +# if stat.cmax != 0: +# health_bar_label.text = str(int(stat.ccurrent / stat.cmax * 100)) + +func cname_changed(ent : Entity) -> void: + name_label.text = ent.centity_name + +func onc_entity_mouse_entered() -> void: + if targeted: + return + + modulate = mouseover_color + interpolate_scale(mouseover_scale) + +func onc_entity_mouse_exited() -> void: + if targeted: + return + + modulate = normal_color + interpolate_scale(normal_scale) + +func onc_targeted() -> void: + targeted = true + + modulate = targeted_color + interpolate_scale(targeted_scale) + +func onc_untargeted() -> void: + targeted = false + + modulate = normal_color + interpolate_scale(normal_scale) + +func interpolate_scale(target : Vector2) -> void: + target_scale = target + interpolating = true diff --git a/game/player/NetworkedPlayer.gd b/game/player/NetworkedPlayer.gd new file mode 100644 index 0000000..db39f00 --- /dev/null +++ b/game/player/NetworkedPlayer.gd @@ -0,0 +1,119 @@ +extends "PlayerGDBase.gd" +class_name NetworkedPlayerGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +#export (float) var MOUSE_SENSITIVITY : float = 0.05 +#export (String) var map_path : String + +const ray_length = 1000 +const ACCEL : float = 100.0 +const DEACCEL : float = 100.0 +const GRAVITY : float = -24.8 +const JUMP_SPEED : float = 3.8 +const MAX_SLOPE_ANGLE : float = 40.0 +const MOUSE_TARGET_MAX_OFFSET : int = 10 + +#var _on : bool = true + +var y_rot : float = 0.0 + +#var vel : Vector3 = Vector3() +#var dir : Vector3 = Vector3() + +var animation_tree : AnimationTree +var anim_node_state_machine : AnimationNodeStateMachinePlayback = null +#var animation_run : bool = false + +func _ready() -> void: + animation_tree = get_character_skeleton().get_animation_tree() + + if animation_tree != null: + anim_node_state_machine = animation_tree["parameters/playback"] + + +#func _physics_process(delta : float) -> void: +# if not _on: +# return +# + #process_movement(delta) + +#func process_movement(delta : float) -> void: +# if input_dir.x > 0.1 or input_dir.y > 0.1 or input_dir.x < -0.1 or input_dir.y < -0.1: +# var forward : Vector3 = Vector3(0, 0, 1).rotated(Vector3(0, 1, 0), deg2rad(y_rot)) +# var right : Vector3 = forward.cross(Vector3(0, 1, 0)) * -input_dir.x +# forward *= input_dir.y #only potentially make it zero after getting the right vector +# +# dir = forward +# dir += right +# +# if dir.length_squared() > 0.1: +# dir = dir.normalized() +# else: +# dir = Vector3() +# +# vel.y += delta * GRAVITY +# +# var hvel : Vector3 = vel +# hvel.y = 0 +# +# var target : Vector3 = dir +# target *= get_speed().ccurrent +# +# var accel +# if dir.dot(hvel) > 0: +# accel = ACCEL +# else: +# accel = DEACCEL +# +# hvel = hvel.linear_interpolate(target, accel * delta) as Vector3 +# vel.x = hvel.x +# vel.z = hvel.z +# vel = move_and_slide(vel, Vector3(0,1,0), false, 4, deg2rad(MAX_SLOPE_ANGLE)) + + +#remote func set_position(position : Vector3, rot : Vector3) -> void: +# translation = position +# rotation = rot + +remote func sset_position(pposition : Vector2, protation : float) -> void: + +# if get_network_master() != 1: +# print(str(get_network_master()) + "npsset") + + if multiplayer.network_peer and multiplayer.is_network_server(): + cset_position(pposition, protation) + vrpc("cset_position", pposition, protation) + +remote func cset_position(pposition : Vector2, protation : float) -> void: +# if get_network_master() != 1: +# print(str(get_network_master()) + "npcset") + + position = pposition + rotation = protation + +func _moved() -> void: + if sis_casting(): + sfail_cast() + diff --git a/game/player/NetworkedPlayer.tscn b/game/player/NetworkedPlayer.tscn new file mode 100644 index 0000000..418d5f2 --- /dev/null +++ b/game/player/NetworkedPlayer.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://player/NetworkedPlayer.gd" type="Script" id=1] +[ext_resource path="res://data/models/armature_model_orig_v2.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/nameplates/NamePlate.tscn" type="PackedScene" id=3] + +[sub_resource type="CapsuleShape" id=1] +radius = 0.266582 +height = 0.927641 + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 0.216228, 0.0681041, 0.183397 ) + +[node name="NetworkedPlayer" type="Entity"] +input_ray_pickable = false +collision_layer = 3 +collision_mask = 3 +character_skeleton_path = NodePath("Rotation_Helper/Model/character") +script = ExtResource( 1 ) + +[node name="Body_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.8, 0 ) +shape = SubResource( 1 ) + +[node name="Feet_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.194237, 0 ) +shape = SubResource( 2 ) + +[node name="Rotation_Helper" type="Spatial" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.960532, 0 ) + +[node name="Model" type="Spatial" parent="Rotation_Helper"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.875205, 0 ) + +[node name="character" parent="Rotation_Helper/Model" instance=ExtResource( 2 )] + +[node name="NamePlate" parent="." instance=ExtResource( 3 )] diff --git a/game/player/Player.gd b/game/player/Player.gd new file mode 100644 index 0000000..bad2d34 --- /dev/null +++ b/game/player/Player.gd @@ -0,0 +1,489 @@ +extends "PlayerGDBase.gd" +class_name PlayerGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +export(float) var MOUSE_SENSITIVITY : float = 0.05 +export(String) var world_path : String = ".." +export(NodePath) var model_path : NodePath = "Rotation_Helper/Model" + +const ray_length = 1000 +const ACCEL : float = 100.0 +const DEACCEL : float = 100.0 +const GRAVITY : float = -24.8 +const JUMP_SPEED : float = 3.8 +const MAX_SLOPE_ANGLE : float = 40.0 +const MOUSE_TARGET_MAX_OFFSET : int = 10 + +var _on : bool = true + +var y_rot : float = 0.0 + +var vel : Vector3 = Vector3() +var dir : Vector3 = Vector3() + +var input_dir : Vector2 = Vector2() +var mouse_dir : Vector2 = Vector2() +var mouse_move_dir : Vector2 = Vector2() +var mouse_left_down : bool = false +var mouse_right_down : bool = false +var touchpad_dir : Vector2 = Vector2() +var mouse_down_delta : Vector2 = Vector2() +var queued_camera_rotaions : Vector2 = Vector2() + +var key_left : bool = false +var key_right : bool = false +var key_up : bool = false +var key_down : bool = false + +var cursor_grabbed : bool = false +var last_cursor_pos : Vector2 = Vector2() +var mouse_down_pos : Vector2 = Vector2() +var total_down_mouse_delta : Vector2 = Vector2() + +var camera : Camera +var camera_pivot : Spatial + +var animation_tree : AnimationTree +var anim_node_state_machine : AnimationNodeStateMachinePlayback = null +var animation_run : bool = false + +var moving : bool = false +var casting_anim : bool = false + +var last_mouse_over : Entity = null + +var world : Navigation2D = null + +var model_rotation_node : Spatial + +func _ready() -> void: + camera = $CameraPivot/Camera as Camera + camera_pivot = $CameraPivot as Spatial + + model_rotation_node = get_node(model_path) + + animation_tree = get_character_skeleton().get_animation_tree() + + if animation_tree != null: + anim_node_state_machine = animation_tree["parameters/playback"] + + world = get_node(world_path) as Navigation2D + +# set_process(true) + +func _physics_process(delta : float) -> void: + if not _on: + return + + if world.initial_generation: + return + + process_input(delta) + process_movement(delta) + +func process_input(delta: float) -> void: + var key_dir : Vector2 = Vector2() + + if key_up: + key_dir.y -= 1 + if key_down: + key_dir.y += 1 + if key_left: + key_dir.x -= 1 + if key_right: + key_dir.x += 1 + + input_dir = key_dir + mouse_dir + touchpad_dir + mouse_move_dir + + var state : int = getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + input_dir = Vector2() + return + + var input_length : float = input_dir.length_squared() + + if input_length > 0.1: + if anim_node_state_machine != null and not animation_run: + anim_node_state_machine.travel("run-loop") + animation_run = true + + input_dir = input_dir.normalized() + + animation_tree["parameters/run-loop/blend_position"] = input_dir + + if (input_dir.y < 0.1): + model_rotation_node.transform.basis = Basis(Vector3(0, acos(input_dir.x) - PI / 2.0, 0)) + else: + model_rotation_node.transform.basis = Basis() + else: + if anim_node_state_machine != null and animation_run: + anim_node_state_machine.travel("idle-loop") + animation_run = false + + +func process_movement(delta : float) -> void: + var state : int = getc_state() + + if state & EntityEnums.ENTITY_STATE_TYPE_FLAG_ROOT != 0 or state & EntityEnums.ENTITY_STATE_TYPE_FLAG_STUN != 0: + moving = false + return + + if input_dir.x > 0.1 or input_dir.y > 0.1 or input_dir.x < -0.1 or input_dir.y < -0.1: + var forward : Vector3 = Vector3(0, 0, 1).rotated(Vector3(0, 1, 0), deg2rad(y_rot)) + var right : Vector3 = forward.cross(Vector3(0, 1, 0)) * -input_dir.x + forward *= input_dir.y #only potentially make it zero after getting the right vector + + dir = forward + dir += right + + if dir.length_squared() > 0.1: + dir = dir.normalized() + + moving = true + moved() + else: + dir = Vector3() + moving = false + + vel.y += delta * GRAVITY + + var hvel : Vector3 = vel + hvel.y = 0 + + var target : Vector3 = dir + target *= get_speed().ccurrent + + var accel + if dir.dot(hvel) > 0: + accel = ACCEL + else: + accel = DEACCEL + + hvel = hvel.linear_interpolate(target, accel * delta) as Vector3 + vel.x = hvel.x + vel.z = hvel.z +# vel = move_and_slide(vel, Vector3(0,1,0), false, 4, deg2rad(MAX_SLOPE_ANGLE)) + + if multiplayer.has_network_peer(): + if not multiplayer.is_network_server(): + rpc_id(1, "sset_position", position, rotation) + else: + sset_position(position, rotation) + + +func _input(event: InputEvent) -> void: + if not cursor_grabbed: + set_process_input(false) + return + + if event is InputEventMouseMotion and event.device != -1: + var s : float = ProjectSettings.get("display/mouse_cursor/sensitivity") + + var relx : float = event.relative.x * s + var rely : float = event.relative.y * s + + mouse_down_delta.x += relx + mouse_down_delta.y += rely + + total_down_mouse_delta.x += relx + total_down_mouse_delta.y += rely + + get_tree().set_input_as_handled() + + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventKey: + var ievkey : InputEventKey = event as InputEventKey + + if ievkey.scancode == KEY_W: + key_up = ievkey.pressed + if ievkey.scancode == KEY_S: + key_down = ievkey.pressed + if ievkey.scancode == KEY_A: + key_left = ievkey.pressed + if ievkey.scancode == KEY_D: + key_right = ievkey.pressed + + if event is InputEventMouseMotion and not (mouse_right_down or mouse_left_down) and event.device != -1: + cmouseover(event) + + if event is InputEventMouseButton: + if event.button_index == BUTTON_LEFT and event.device != -1: + mouse_left_down = event.pressed + + if mouse_left_down: + mouse_down_delta = Vector2() + mouse_down_pos = event.position + + if event.button_index == BUTTON_RIGHT and event.device != -1: + mouse_right_down = event.pressed + + + if mouse_left_down and mouse_right_down: + mouse_move_dir.y = -1 + else: + mouse_move_dir.y = 0 + + if event.is_pressed() and event.device != -1: + if event.button_index == BUTTON_WHEEL_UP: + camera_pivot.camera_distance_set_delta(-0.2) + if event.button_index == BUTTON_WHEEL_DOWN: + camera_pivot.camera_distance_set_delta(0.2) + + if not event.pressed and event.button_index == BUTTON_LEFT and event.device != -1: + if mouse_down_delta.length() < MOUSE_TARGET_MAX_OFFSET: + target(event.position) + + if event is InputEventScreenTouch and event.pressed: + target(event.position) + + update_cursor_mode() + +func update_cursor_mode(): + if mouse_left_down or mouse_right_down: + if not cursor_grabbed: + set_process_input(true) + total_down_mouse_delta = Vector2() + + cursor_grabbed = true + last_cursor_pos = get_viewport().get_mouse_position() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + else: + if cursor_grabbed: + set_process_input(false) + cursor_grabbed = false + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + get_viewport().warp_mouse(last_cursor_pos) + + if total_down_mouse_delta.length_squared() < 8: + target(last_cursor_pos) + + + + +func target(position : Vector2): + var from = camera.project_ray_origin(position) + var to = from + camera.project_ray_normal(position) * ray_length + + var space_state = get_world_2d().direct_space_state + var result = space_state.intersect_ray(from, to, [], 2) + + if result: + print(result) + if result.collider and result.collider is Entity: + var ent : Entity = result.collider as Entity + + crequest_target_change(ent.get_path()) + return + + crequest_target_change(NodePath()) + else: + crequest_target_change(NodePath()) + +func cmouseover(event): + var from = camera.project_ray_origin(event.position) + var to = from + camera.project_ray_normal(event.position) * ray_length + + var space_state = get_world_2d().direct_space_state + var result = space_state.intersect_ray(from, to, [], 2) + + if result: + if result.collider and result.collider is Entity: + var mo : Entity = result.collider as Entity + + if last_mouse_over != null and last_mouse_over != mo: + if is_instance_valid(last_mouse_over): + last_mouse_over.onc_mouse_exit() + + last_mouse_over = null + + if last_mouse_over == null: + mo.onc_mouse_enter() + last_mouse_over = mo + + return + + if last_mouse_over != null: + last_mouse_over.onc_mouse_exit() + last_mouse_over = null + +func analog_force_change(vector, touchpad): + if touchpad.padname == "TouchPad": + touchpad_dir = vector + touchpad_dir.y *= -1 + elif touchpad.padname == "TargetPad": + #try to target + return + +func queue_camera_rotation(rot : Vector2) -> void: + queued_camera_rotaions += rot + +remote func sset_position(pposition : Vector2, protation : float) -> void: + if get_network_master() != 1: + print(str(get_network_master()) + "psset") + + if multiplayer.network_peer and multiplayer.is_network_server(): + vrpc("cset_position", pposition, protation) + cset_position(pposition, protation) + +remote func cset_position(pposition : Vector2, protation : float) -> void: + if get_network_master() != 1: + print(str(get_network_master()) + " pcset") + position = pposition + rotation = protation + +func _moved() -> void: + if sis_casting(): + sfail_cast() + +func _setup(): + setup_actionbars() + +func _con_target_changed(entity: Entity, old_target: Entity) -> void: + if is_instance_valid(old_target): + old_target.onc_untargeted() + + if is_instance_valid(ctarget): + ctarget.onc_targeted() + + if canc_interact(): + crequest_interact() + +func _con_cast_started(info): + if anim_node_state_machine != null and not casting_anim: + anim_node_state_machine.travel("casting-loop") + casting_anim = true + animation_run = false + +func _con_cast_failed(info): + if anim_node_state_machine != null and casting_anim: + anim_node_state_machine.travel("idle-loop") + casting_anim = false + + if animation_run: + anim_node_state_machine.travel("run-loop") + +func _con_cast_finished(info): + if anim_node_state_machine != null: + anim_node_state_machine.travel("cast-end") + casting_anim = false + + if animation_run: + anim_node_state_machine.travel("run-loop") + +func _con_spell_cast_success(info): + if anim_node_state_machine != null: + anim_node_state_machine.travel("cast-end") + casting_anim = false + + if animation_run: + anim_node_state_machine.travel("run-loop") + +func _son_xp_gained(value : int) -> void: + if not Entities.get_xp_data().can_level_up(gets_level()): + return + + var xpr : int = Entities.get_xp_data().get_xp(gets_level()); + + if xpr <= sxp: + slevelup(1) + sxp = 0 + + +func _son_level_up(level: int) -> void: + if sentity_data == null: + return + + var ecd : EntityClassData = sentity_data.entity_class_data + + if ecd == null: + return + + sfree_spell_points += ecd.spell_points_per_level * level + sfree_talent_points += level + + for i in range(Stat.MAIN_STAT_ID_COUNT): + var st : int = sentity_data.entity_class_data.get_stat_data().get_level_stat_data().get_stat_diff(i, slevel - level, slevel) + + var statid : int = i + Stat.MAIN_STAT_ID_START + + var stat : Stat = get_stat_int(statid) + + var sm : StatModifier = stat.get_modifier(0) + sm.base_mod += st + + +#func _con_xp_gained(value): +# print(value) + +func _scraft(id): + if not hass_craft_recipe_id(id): + return + + var recipe : CraftRecipe = gets_craft_recipe_id(id) + + if recipe == null: + return + + for i in range(recipe.required_tools_count): + var mat : CraftRecipeHelper = recipe.get_required_tool(i) + + if mat == null: + continue + + if not sbag.has_item(mat.item, mat.count): + return + + + for i in range(recipe.required_materials_count): + var mat : CraftRecipeHelper = recipe.get_required_material(i) + + if mat == null: + continue + + if not sbag.has_item(mat.item, mat.count): + return + + #ok, player has everything + + for i in range(recipe.required_materials_count): + var mat : CraftRecipeHelper = recipe.get_required_material(i) + + if mat == null: + continue + + sbag.remove_items(mat.item, mat.count) + + var item : ItemInstance = recipe.item.item.create_item_instance() + + sbag.add_item(item) + +func _from_dict(dict): + ._from_dict(dict) + + randomize() + sseed = randi() + diff --git a/game/player/Player.tscn b/game/player/Player.tscn new file mode 100644 index 0000000..98bee48 --- /dev/null +++ b/game/player/Player.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://player/Player.gd" type="Script" id=2] +[ext_resource path="res://ui/player_ui/player_ui.tscn" type="PackedScene" id=3] + +[sub_resource type="CapsuleShape" id=1] +radius = 0.266582 +height = 0.927641 + +[sub_resource type="BoxShape" id=2] +extents = Vector3( 0.216228, 0.0681041, 0.183397 ) + +[node name="Player" type="Entity" groups=[ +"players", +]] +collision_layer = 3 +collision_mask = 3 +character_skeleton_path = NodePath("Rotation_Helper/Model/character") +script = ExtResource( 2 ) + +[node name="Body_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.73, 0 ) +shape = SubResource( 1 ) + +[node name="Feet_CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0 ) +shape = SubResource( 2 ) + +[node name="Rotation_Helper" type="Spatial" parent="."] +transform = Transform( -1, 0, -3.25841e-07, 0, 1, 0, 3.25841e-07, 0, -1, 0, 0, 0 ) + +[node name="Model" type="Spatial" parent="Rotation_Helper"] + +[node name="GUILayer" parent="." instance=ExtResource( 3 )] +[connection signal="onc_open_loot_winow_request" from="." to="GUILayer" method="_on_Player_onc_open_loot_winow_request"] diff --git a/game/player/PlayerGDBase.gd b/game/player/PlayerGDBase.gd new file mode 100644 index 0000000..a55af8c --- /dev/null +++ b/game/player/PlayerGDBase.gd @@ -0,0 +1,104 @@ +extends Entity + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +var _timer : float = randf() * 2.0 + +var _query : Physics2DShapeQueryParameters +var _shape : SphereShape + +func _ready(): + _shape = SphereShape.new() + _shape.radius = 50 + + _query = Physics2DShapeQueryParameters.new() + _query.collision_mask = 2 + _query.exclude = [ self ] + _query.shape_rid = _shape.get_rid() + + set_physics_process(true) + +func _physics_process(delta): +# if (multiplayer.has_network_peer() and multiplayer.is_network_server()) or not multiplayer.has_network_peer(): + if multiplayer.has_network_peer() and multiplayer.is_network_server(): + _timer += delta + + if _timer > 3: + _timer -= 3 + + update_visibility() + +func update_visibility() -> void: + _query.transform = Transform2D(0, position) + var res : Array = get_world_2d().direct_space_state.intersect_shape(_query) + + #warning-ignore:unassigned_variable + var currenty_sees : Array = Array() + + for collision in res: + var collider = collision["collider"] + + if collider is Entity and not currenty_sees.has(collider): + currenty_sees.append(collider) + + + #warning-ignore:unassigned_variable + var used_to_see : Array = Array() + + for i in range(gets_sees_count()): + var ent : Entity = gets_sees(i) + + used_to_see.append(ent) + + + #warning-ignore:unassigned_variable + var currenty_sees_filtered : Array = Array() + + for e in currenty_sees: + currenty_sees_filtered.append(e) + + for e in currenty_sees: + if used_to_see.has(e): + used_to_see.erase(e) + currenty_sees_filtered.erase(e) + + for e in used_to_see: + var ent : Entity = e as Entity + + if self.get_network_master() != 1: + Entities.despawn_for(self, ent) + + removes_sees(ent) + + for e in currenty_sees_filtered: + var ent : Entity = e as Entity + + if self.get_network_master() != 1: + Entities.spawn_for(self, ent) + + adds_sees(ent) + + + + diff --git a/game/player/Unitframes.gd b/game/player/Unitframes.gd new file mode 100644 index 0000000..04fca72 --- /dev/null +++ b/game/player/Unitframes.gd @@ -0,0 +1,32 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var player_unit_frame_path : NodePath +export (NodePath) var target_unit_frame_path : NodePath + +var target_unit_frame : Node +var player_unit_frame : Node + +func _ready() -> void: + target_unit_frame = get_node(target_unit_frame_path) as Node + player_unit_frame = get_node(player_unit_frame_path) as Node + +func set_player(player : Entity) -> void: + player_unit_frame.set_player(player) + + _ctarget_changed(player, null) + + player.connect("ctarget_changed", self, "_ctarget_changed") + + +func _ctarget_changed(entity : Entity, old_target : Entity) -> void: + if entity.ctarget == null: + target_unit_frame.hide() + else: + target_unit_frame.show() + + target_unit_frame.set_player(entity.ctarget) + diff --git a/game/project.godot b/game/project.godot new file mode 100644 index 0000000..1950e05 --- /dev/null +++ b/game/project.godot @@ -0,0 +1,260 @@ +; 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": "Aura", +"class": "AuraGD", +"language": "GDScript", +"path": "res://scripts/auras/aura_script.gd" +}, { +"base": "Spatial", +"class": "CharacterSkeketonAttachPoint", +"language": "GDScript", +"path": "res://player/CharacterSkeletonAttachPoint.gd" +}, { +"base": "Entity", +"class": "DisplayPlayerGD", +"language": "GDScript", +"path": "res://player/DisplayPlayer.gd" +}, { +"base": "EntityAI", +"class": "EntityAIGD", +"language": "GDScript", +"path": "res://scripts/ai/EntityAIGD.gd" +}, { +"base": "EntityData", +"class": "EntityDataGD", +"language": "GDScript", +"path": "res://scripts/entities/EntityDataGD.gd" +}, { +"base": "ItemTemplate", +"class": "ItemTemplateGD", +"language": "GDScript", +"path": "res://scripts/items/ItemTemplateGD.gd" +}, { +"base": "Node", +"class": "Main", +"language": "GDScript", +"path": "res://scenes/MainScene.gd" +}, { +"base": "Resource", +"class": "MainDungeonGenerator", +"language": "GDScript", +"path": "res://dungeon_generator/MainDungeonGenerator.gd" +}, { +"base": "Resource", +"class": "MainPlanetGenerator", +"language": "GDScript", +"path": "res://scripts/world_generators/MainPlanetGenerator.gd" +}, { +"base": "EntityResource", +"class": "ManaResource", +"language": "GDScript", +"path": "res://scripts/resources/ManResource.gd" +}, { +"base": "Control", +"class": "Menu", +"language": "GDScript", +"path": "res://scenes/Menu.gd" +}, { +"base": "", +"class": "NetworkedPlayerGD", +"language": "GDScript", +"path": "res://player/NetworkedPlayer.gd" +}, { +"base": "", +"class": "PlayerGD", +"language": "GDScript", +"path": "res://player/Player.gd" +}, { +"base": "Resource", +"class": "PlayerMaster", +"language": "GDScript", +"path": "res://networking/PlayerMaster.gd" +}, { +"base": "SpellEffectVisual", +"class": "SpellEffectVisualBasic", +"language": "GDScript", +"path": "res://scripts/resources/spell_effect_visual_basic.gd" +}, { +"base": "Spell", +"class": "SpellGD", +"language": "GDScript", +"path": "res://scripts/spells/gd_spell_script.gd" +}, { +"base": "WorldSpell", +"class": "WorldSpellGD", +"language": "GDScript", +"path": "res://scripts/projectiles/WorldSpellGD.gd" +} ] +_global_script_class_icons={ +"AuraGD": "", +"CharacterSkeketonAttachPoint": "", +"DisplayPlayerGD": "", +"EntityAIGD": "", +"EntityDataGD": "", +"ItemTemplateGD": "", +"Main": "", +"MainDungeonGenerator": "", +"MainPlanetGenerator": "", +"ManaResource": "", +"Menu": "", +"NetworkedPlayerGD": "", +"PlayerGD": "", +"PlayerMaster": "", +"SpellEffectVisualBasic": "", +"SpellGD": "", +"WorldSpellGD": "" +} +Node="input/actionbar_5_11" + +[application] + +config/name="Broken Seals 2D" +run/main_scene="res://scenes/Main.tscn" +config/icon="res://icon.png" +config/version="0.2" + +[autoload] + +Logger="*res://autoload/Logger.tscn" +Settings="*res://autoload/SettingsManager.gd" +CursorManager="*res://autoload/CursorManager.tscn" +Entities="*res://autoload/EntityDataManager.tscn" +Profiles="*res://autoload/ProfileManager.tscn" +WorldNumbers="*res://autoload/WorldNumbers.tscn" +ThemeAtlas="*res://autoload/ThemeAtlas.tscn" +Server="*res://autoload/Server.tscn" + +[debug] + +gdscript/completion/autocomplete_setters_and_getters=true +gdscript/warnings/unused_argument=false +gdscript/warnings/unused_signal=false +gdscript/warnings/return_value_discarded=false +gdscript/warnings/integer_division=false + +[display] + +window/dpi/allow_hidpi=true +window/handheld/orientation="sensor_landscape" +window/stretch/mode="2d" +window/stretch/aspect="expand" +mouse_cursor/sensitivity=0.9 + +[editor_plugins] + +enabled=PoolStringArray( "ess_data" ) + +[importer_defaults] + +texture_array={ +"compress/mode": 0, +"compress/no_bptc_if_rgb": false, +"flags/filter": false, +"flags/mipmaps": false, +"flags/repeat": 0, +"flags/srgb": 0, +"slices/horizontal": 8, +"slices/vertical": 8 +} + +[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":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) + ] +} +actionbar_1_0={ +"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":82,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_1={ +"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":70,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_2={ +"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":67,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_3={ +"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":84,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_4={ +"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":71,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_5={ +"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":49,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_6={ +"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":50,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_7={ +"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":51,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_8={ +"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":52,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_9={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_10={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":70,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_11={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":84,"unicode":0,"echo":false,"script":null) + ] +} +actionbar_1_12={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":true,"control":false,"meta":false,"command":false,"pressed":false,"scancode":39,"unicode":0,"echo":false,"script":null) + ] +} + +[layer_names] + +3d_physics/layer_1="World" +3d_physics/layer_2="Entities" + +[physics] + +2d/default_gravity=0 + +[rendering] + +quality/driver/driver_name="GLES2" +quality/driver/fallback_to_gles2=true +vram_compression/import_etc=true +quality/directional_shadow/size.mobile=1024 +quality/shading/force_vertex_shading=true diff --git a/game/scenes/BrokenSeals.tscn b/game/scenes/BrokenSeals.tscn new file mode 100644 index 0000000..ceeda28 --- /dev/null +++ b/game/scenes/BrokenSeals.tscn @@ -0,0 +1,3 @@ +[gd_scene format=2] + +[node name="BrokenSeals" type="Node"] diff --git a/game/scenes/CharacterCreationMenu.gd b/game/scenes/CharacterCreationMenu.gd new file mode 100644 index 0000000..d4d669b --- /dev/null +++ b/game/scenes/CharacterCreationMenu.gd @@ -0,0 +1,64 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var character_entry : PackedScene +export(NodePath) var menu_path : NodePath +export(NodePath) var name_imput_path : NodePath +export(NodePath) var container_path : NodePath +export(ButtonGroup) var character_creation_button_group : ButtonGroup +export(String) var character_folder : String + +var container : Node +var name_line_edit : LineEdit + +func _ready(): + name_line_edit = get_node(name_imput_path) + container = get_node(container_path) + + var fb : Button = null + + for i in range(Entities.get_player_character_data_count()): + var d : EntityData = Entities.get_player_character_data_index(i) + + var ce : Button = character_entry.instance() as Button + + if fb == null: + fb = ce + + container.add_child(ce) + ce.owner = container + + ce.id = d.id + ce.set_class_name(d.entity_class_data.text_name) + ce.group = character_creation_button_group + + if fb != null: + fb.pressed = true + +func create() -> void: + if name_line_edit.text == "": + return + + var file_name : String = "user://" + character_folder + "/" + name_line_edit.text + + var f : File = File.new() + + if f.file_exists(file_name): + return + + var active : BaseButton = character_creation_button_group.get_pressed_button() + + var id : int = active.id + + var ent : Entity = Entities.spawn_player_for_menu(id, name_line_edit.text, self) + if f.open(file_name, File.WRITE) == OK: + f.store_string(to_json(ent.to_dict())) + f.close() + + ent.queue_free() + + get_node(menu_path).switch_to_menu(Menu.StartMenuTypes.CHARACTER_SELECT) + diff --git a/game/scenes/CharacterSelector.gd b/game/scenes/CharacterSelector.gd new file mode 100644 index 0000000..838ee58 --- /dev/null +++ b/game/scenes/CharacterSelector.gd @@ -0,0 +1,36 @@ +extends MarginContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var container_path : NodePath +var container : Node + +export(String) var character_folder : String + +func _ready(): + container = get_node(container_path) + + if container == null: + Logger.error("CharacterSelector not set up properly!") + + refresh() + +func refresh(): + var dir : Directory = Directory.new() + + if dir.open("user://" + character_folder) == OK: + dir.list_dir_begin() + + var file_name = dir.get_next() + + while (file_name != ""): + if dir.current_is_dir(): + file_name = dir.get_next() + + + + else: + dir.make_dir("user://" + character_folder) + diff --git a/game/scenes/CharacterSelectorMenu.gd b/game/scenes/CharacterSelectorMenu.gd new file mode 100644 index 0000000..dc362ae --- /dev/null +++ b/game/scenes/CharacterSelectorMenu.gd @@ -0,0 +1,147 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var menu_path : NodePath +export(NodePath) var container_path : NodePath +export(NodePath) var player_display_container_path : NodePath +export(ButtonGroup) var character_button_group : ButtonGroup +export(PackedScene) var character_entry : PackedScene +export(String) var character_folder : String + +var container : Node +var player_display_container_node : Node + +func _ready(): + container = get_node(container_path) + player_display_container_node = get_node(player_display_container_path) + + if container == null: + Logger.error("CharacterSelector not set up properly!") + + connect("visibility_changed", self, "visibility_changed") + + refresh() + +func refresh(): + clear() +# Entities.list_spells() + var dir : Directory = Directory.new() + + var first_entry : Button = null + + if dir.open("user://" + character_folder) == OK: + dir.list_dir_begin() + + var file_name = "." + + while (file_name != ""): + file_name = dir.get_next() + + if dir.current_is_dir(): + continue + + var f : File = File.new() + + if f.open("user://" + character_folder + "/" + file_name, File.READ) == OK: + var st : String = f.get_as_text() + f.close() + + var json_err : String = validate_json(st) + + if json_err != "": + Logger.error("Save corrupted! " + file_name) + Logger.error(json_err) + continue + + var p = parse_json(st) + + if typeof(p) != TYPE_DICTIONARY: + Logger.error("Save corrupted! Not Dict! " + file_name) + continue + + var display : Entity = Entities.spawn_display_player(file_name) + player_display_container_node.add_child(display) + display.owner = player_display_container_node + + display.from_dict(p as Dictionary) + + var centry : Button = character_entry.instance() as Button + container.add_child(centry) + centry.owner = container + centry.group = character_button_group + centry.connect("pressed", self, "character_selection_changed") + + #display.sentity_data.entity_class_data.entity_class_name + centry.setup(file_name, display.sentity_name, "", display.slevel, display) + + if first_entry == null: + first_entry = centry + + if first_entry != null: + first_entry.pressed = true + + else: + dir.make_dir("user://" + character_folder) + +func clear() -> void: + for c in container.get_children(): + c.disconnect("pressed", self, "character_selection_changed") + c.queue_free() + + for e in player_display_container_node.get_children(): + e.queue_free() + +func delete_character() -> void: + var b : BaseButton = character_button_group.get_pressed_button() + + if b == null: + return + + var file_name : String = "user://" + character_folder + "/" + b.file_name + + var f : File = File.new() + + if f.file_exists(file_name): + var d : Directory = Directory.new() + if d.remove(file_name) == OK: + refresh() + +func load_character() -> void: + var b : BaseButton = character_button_group.get_pressed_button() + + if b == null: + return + +# if multiplayer.has_network_peer(): +# var file_name : String = "user://" + character_folder + "/" + b.file_name +# +# var f : File = File.new() +# +# if f.open(file_name, File.READ) == OK: +# var data : String = f.get_as_text() +# +# f.close() +# +# Server.upload_character(data) +# +# get_node("/root/Main").load_character(b.file_name) +# else: + get_node("/root/Main").load_character(b.file_name) + +func visibility_changed() -> void: + if visible: + refresh() + +func character_selection_changed() -> void: + var b : BaseButton = character_button_group.get_pressed_button() + + if b == null: + return + + for e in player_display_container_node.get_children(): + e.hide() + + b.entity.show() diff --git a/game/scenes/ConnectButton.gd b/game/scenes/ConnectButton.gd new file mode 100644 index 0000000..a8e4395 --- /dev/null +++ b/game/scenes/ConnectButton.gd @@ -0,0 +1,19 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _ready(): + get_tree().connect("connected_to_server", self, "connected_to_server") + get_tree().connect("server_disconnected", self, "server_disconnected") + +func _exit_tree(): + get_tree().disconnect("connected_to_server", self, "connected_to_server") + get_tree().disconnect("server_disconnected", self, "server_disconnected") + +func connected_to_server(): + hide() + +func server_disconnected(): + show() diff --git a/game/scenes/ConnectServerButton.gd b/game/scenes/ConnectServerButton.gd new file mode 100644 index 0000000..e78a5d7 --- /dev/null +++ b/game/scenes/ConnectServerButton.gd @@ -0,0 +1,57 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var container_path : NodePath +export(NodePath) var status_label_path : NodePath + +export(NodePath) var use_websockets_checkbox_path : NodePath + +export(NodePath) var ip_line_edit_path : NodePath +export(NodePath) var port_line_edit_path : NodePath + +var _container : Control +var _status : Label + +var _use_websockets_checkbox : CheckBox + +var _ip_line_edit : LineEdit +var _port_line_edit : LineEdit + +func _ready(): + _container = get_node(container_path) as Control + get_tree().connect("connected_to_server", self, "connected_to_server") + + _status = get_node(status_label_path) as Label + _status.text = "" + + _use_websockets_checkbox = get_node(use_websockets_checkbox_path) as CheckBox + + _ip_line_edit = get_node(ip_line_edit_path) as LineEdit + _port_line_edit = get_node(port_line_edit_path) as LineEdit + +func _exit_tree(): + get_tree().disconnect("connected_to_server", self, "connected_to_server") + +func _pressed(): + var ip : String = _ip_line_edit.text + var port : String = _port_line_edit.text + + var portint : int = int(port) + + _status.text = "Connecting..." + var err : int = 0 + + if _use_websockets_checkbox.pressed: + err = Server.connect_to_server_websocket(ip, portint) + else: + err = Server.connect_to_server(ip, portint) + + if err != OK: + _status.text = "Error: " + str(err) + + +func connected_to_server(): + _container.hide() diff --git a/game/scenes/DisconnectButton.gd b/game/scenes/DisconnectButton.gd new file mode 100644 index 0000000..30ace2c --- /dev/null +++ b/game/scenes/DisconnectButton.gd @@ -0,0 +1,19 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _ready(): + get_tree().connect("connected_to_server", self, "connected_to_server") + get_tree().connect("server_disconnected", self, "server_disconnected") + +func _exit_tree(): + get_tree().disconnect("connected_to_server", self, "connected_to_server") + get_tree().disconnect("server_disconnected", self, "server_disconnected") + +func connected_to_server(): + show() + +func server_disconnected(): + hide() diff --git a/game/scenes/GameScene.gd b/game/scenes/GameScene.gd new file mode 100644 index 0000000..fdba6bc --- /dev/null +++ b/game/scenes/GameScene.gd @@ -0,0 +1,9 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _ready(): + VisualServer.set_default_clear_color(Color(0, 0, 0)) + diff --git a/game/scenes/HostButton.gd b/game/scenes/HostButton.gd new file mode 100644 index 0000000..1434ea8 --- /dev/null +++ b/game/scenes/HostButton.gd @@ -0,0 +1,16 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + +#func _pressed(): +# Server.start_hosting() diff --git a/game/scenes/HostGameButton.gd b/game/scenes/HostGameButton.gd new file mode 100644 index 0000000..da16972 --- /dev/null +++ b/game/scenes/HostGameButton.gd @@ -0,0 +1,55 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var container_path : NodePath +export(NodePath) var status_label_path : NodePath + +export(NodePath) var use_websockets_checkbox_path : NodePath + +export(NodePath) var port_line_edit_path : NodePath + +var _container : Control +var _status : Label + +var _use_websockets_checkbox : CheckBox + +var _port_line_edit : LineEdit + +func _ready(): + _container = get_node(container_path) as Control +# get_tree().connect("connected_to_server", self, "connected_to_server") + + _status = get_node(status_label_path) as Label + _status.text = "" + + _use_websockets_checkbox = get_node(use_websockets_checkbox_path) as CheckBox + + _port_line_edit = get_node(port_line_edit_path) as LineEdit + +#func _exit_tree(): +# get_tree().disconnect("connected_to_server", self, "connected_to_server") + +func _pressed(): + var port : String = _port_line_edit.text + + var portint : int = int(port) + + _status.text = "Connecting..." + var err : int = 0 + + if _use_websockets_checkbox.pressed: + err = Server.start_hosting_websocket(portint) + else: + err = Server.start_hosting(portint) + + if err != OK: + _status.text = "Error: " + str(err) + else: + _container.hide() + + +#func connected_to_server(): +# _container.hide() diff --git a/game/scenes/Main.tscn b/game/scenes/Main.tscn new file mode 100644 index 0000000..74a82c9 --- /dev/null +++ b/game/scenes/Main.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://scenes/MainScene.gd" type="Script" id=1] +[ext_resource path="res://scenes/World.tscn" type="PackedScene" id=2] +[ext_resource path="res://scenes/Menu.tscn" type="PackedScene" id=3] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=4] +[ext_resource path="res://ui/debug/DebugInfo.tscn" type="PackedScene" id=5] + +[node name="Main" type="Node"] +script = ExtResource( 1 ) +menu_scene = ExtResource( 3 ) +world_scene = ExtResource( 2 ) +loading_screen_path = NodePath("LoadingScreen/PanelContainer") + +[node name="LoadingScreen" type="CanvasLayer" parent="."] +layer = 100 + +[node name="PanelContainer" type="PanelContainer" parent="LoadingScreen"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RichTextLabel" type="RichTextLabel" parent="LoadingScreen/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +bbcode_enabled = true +bbcode_text = "[center] + + + + + + +Broken Seals + + + + + + + + + + + + + + + + + + + +[wave]LOADING[/wave] +[/center]" +text = " + + + + + + +Broken Seals + + + + + + + + + + + + + + + + + + + +LOADING +" + +[node name="DebugInfo" parent="." instance=ExtResource( 5 )] diff --git a/game/scenes/MainScene.gd b/game/scenes/MainScene.gd new file mode 100644 index 0000000..5a677b3 --- /dev/null +++ b/game/scenes/MainScene.gd @@ -0,0 +1,93 @@ +extends Node +class_name Main + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(int, "None", "Menu", "World") var start_scene = 1 +export(PackedScene) var menu_scene : PackedScene +export(PackedScene) var world_scene : PackedScene +export(PackedScene) var debug_camera_scene : PackedScene +export(NodePath) var loading_screen_path : NodePath + +enum StartSceneTypes { + NONE, MENU, WORLD +} + +var _loading_screen : Node + +var current_scene : Node +var current_character_file_name : String = "" + +func _ready() -> void: + _loading_screen = get_node(loading_screen_path) + + switch_scene(start_scene) + +func switch_scene(scene : int) -> void: + if current_scene != null: + for s in get_tree().get_nodes_in_group("save"): + if not s.has_method("save"): + print(str(s) + " is in group save, but doesn't have save()!") + continue + + s.save() + + current_scene.queue_free() + remove_child(current_scene) + + WorldNumbers.clear() + + if scene == StartSceneTypes.MENU: + var gs : Node = menu_scene.instance() + add_child(gs) + gs.owner = self + + current_scene = gs + + elif scene == StartSceneTypes.WORLD: + var gs : Node = world_scene.instance() + add_child(gs) + gs.owner = self + + current_scene = gs + + if multiplayer.has_network_peer():# and get_tree().network_peer.get_connection_status() == NetworkedMultiplayerPeer.CONNECTION_CONNECTED: + if multiplayer.is_network_server(): + gs.load_character(current_character_file_name) + else: +# var dc = debug_camera_scene.instance() +# +# gs.add_child(dc) +# dc.owner = gs +# + gs.setup_client_seed(Server._cseed) + + var file_name : String = "user://characters/" + current_character_file_name + + var f : File = File.new() + + if f.open(file_name, File.READ) == OK: + var data : String = f.get_as_text() + + f.close() + + Server.upload_character(data) + else: + gs.load_character(current_character_file_name) + + if current_scene.has_method("needs_loading_screen"): + if current_scene.needs_loading_screen(): + show_loading_screen() + +func load_character(file_name : String) -> void: + current_character_file_name = file_name + + switch_scene(StartSceneTypes.WORLD) + +func show_loading_screen() -> void: + _loading_screen.show() + +func hide_loading_screen() -> void: + _loading_screen.hide() diff --git a/game/scenes/Menu.gd b/game/scenes/Menu.gd new file mode 100644 index 0000000..7bae9fe --- /dev/null +++ b/game/scenes/Menu.gd @@ -0,0 +1,30 @@ +extends Control +class_name Menu + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(int, "Character Select", "Character Create") var start_menu : int = 0 +export (NodePath) var character_selector_scene : NodePath +export (NodePath) var charcer_creation_scenes : NodePath + +enum StartMenuTypes { + CHARACTER_SELECT, CHARACTER_CREATE +} + +func _ready(): + switch_to_menu(start_menu) + +func switch_to_menu(menu : int) -> void: + + if menu == StartMenuTypes.CHARACTER_SELECT: + get_node(character_selector_scene).show() + else: + get_node(character_selector_scene).hide() + + if menu == StartMenuTypes.CHARACTER_CREATE: + get_node(charcer_creation_scenes).show() + else: + get_node(charcer_creation_scenes).hide() + diff --git a/game/scenes/Menu.tscn b/game/scenes/Menu.tscn new file mode 100644 index 0000000..ab7a920 --- /dev/null +++ b/game/scenes/Menu.tscn @@ -0,0 +1,519 @@ +[gd_scene load_steps=16 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://menu/CharacterEntry.tscn" type="PackedScene" id=2] +[ext_resource path="res://scenes/Menu.gd" type="Script" id=3] +[ext_resource path="res://menu/menu_character_button_group.tres" type="ButtonGroup" id=4] +[ext_resource path="res://scenes/CharacterSelectorMenu.gd" type="Script" id=5] +[ext_resource path="res://scenes/CharacterCreationMenu.gd" type="Script" id=6] +[ext_resource path="res://menu/character_creation_button_group.tres" type="ButtonGroup" id=7] +[ext_resource path="res://ui/options/Options.tscn" type="PackedScene" id=8] +[ext_resource path="res://ui/register/Register.tscn" type="PackedScene" id=9] +[ext_resource path="res://ui/login/Login.tscn" type="PackedScene" id=10] +[ext_resource path="res://scenes/ConnectButton.gd" type="Script" id=11] +[ext_resource path="res://scenes/HostButton.gd" type="Script" id=12] +[ext_resource path="res://scenes/DisconnectButton.gd" type="Script" id=13] +[ext_resource path="res://scenes/ConnectServerButton.gd" type="Script" id=14] +[ext_resource path="res://scenes/HostGameButton.gd" type="Script" id=15] + +[node name="Menu" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +character_selector_scene = NodePath("CharacterSelectorMenu") +charcer_creation_scenes = NodePath("CharacterCreationMenu") + +[node name="GameName" type="PanelContainer" parent="."] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -61.0 +margin_right = 61.0 +margin_bottom = 26.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="GameName"] +margin_left = 4.0 +margin_top = 5.0 +margin_right = 118.0 +margin_bottom = 20.0 +text = "Borken Seals" +align = 1 +valign = 1 + +[node name="CharacterSelectorMenu" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false, +"_editor_description_": "" +} +menu_path = NodePath("..") +container_path = NodePath("CharacterSelector/CharacterSelector/VBoxContainer/ScrollContainer/Container") +player_display_container_path = NodePath("../Char/CharacterDisplay") +character_button_group = ExtResource( 4 ) +character_entry = ExtResource( 2 ) +character_folder = "characters" + +[node name="CharacterSelector" type="MarginContainer" parent="CharacterSelectorMenu"] +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_left = -289.0 +margin_top = -300.0 +margin_bottom = 300.0 +custom_constants/margin_right = 20 +custom_constants/margin_top = 20 +custom_constants/margin_bottom = 20 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CharacterSelector" type="PanelContainer" parent="CharacterSelectorMenu/CharacterSelector"] +margin_top = 20.0 +margin_right = 269.0 +margin_bottom = 580.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 265.0 +margin_bottom = 556.0 + +[node name="ScrollContainer" type="ScrollContainer" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer"] +margin_right = 261.0 +margin_bottom = 484.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Container" type="VBoxContainer" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/ScrollContainer"] +margin_right = 261.0 +size_flags_horizontal = 3 + +[node name="Load" type="Button" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer"] +margin_top = 492.0 +margin_right = 261.0 +margin_bottom = 518.269 +text = "Load" + +[node name="HBoxContainer" type="HBoxContainer" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer"] +margin_top = 526.0 +margin_right = 261.0 +margin_bottom = 552.0 + +[node name="Delete" type="Button" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/HBoxContainer"] +margin_right = 128.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Delete" + +[node name="Create" type="Button" parent="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/HBoxContainer"] +margin_left = 132.0 +margin_right = 261.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Create" + +[node name="PlayerDisplays" type="Node" parent="CharacterSelectorMenu"] + +[node name="CharacterCreationMenu" type="Control" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} +character_entry = ExtResource( 2 ) +menu_path = NodePath("..") +name_imput_path = NodePath("CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer/LineEdit") +container_path = NodePath("CharacterSelector2/CharacterSelector/VBoxContainer/ScrollContainer/Container") +character_creation_button_group = ExtResource( 7 ) +character_folder = "characters" + +[node name="CharacterSelector2" type="MarginContainer" parent="CharacterCreationMenu"] +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_left = -289.0 +margin_top = -300.0 +margin_bottom = 300.0 +custom_constants/margin_right = 20 +custom_constants/margin_top = 20 +custom_constants/margin_bottom = 20 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CharacterSelector" type="PanelContainer" parent="CharacterCreationMenu/CharacterSelector2"] +margin_top = 20.0 +margin_right = 269.0 +margin_bottom = 580.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 265.0 +margin_bottom = 556.0 + +[node name="ScrollContainer" type="ScrollContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer"] +margin_right = 261.0 +margin_bottom = 421.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Container" type="VBoxContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/ScrollContainer"] +margin_right = 261.0 +size_flags_horizontal = 3 + +[node name="PanelContainer" type="PanelContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer"] +margin_top = 429.0 +margin_right = 261.0 +margin_bottom = 552.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 257.0 +margin_bottom = 119.0 + +[node name="Label" type="Label" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer"] +margin_right = 253.0 +margin_bottom = 15.0 +text = "Character name" + +[node name="LineEdit" type="LineEdit" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 253.0 +margin_bottom = 47.3413 + +[node name="Create" type="Button" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer"] +margin_top = 55.0 +margin_right = 253.0 +margin_bottom = 81.269 +size_flags_horizontal = 3 +text = "Create" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Back" type="Button" parent="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer"] +margin_top = 89.0 +margin_right = 253.0 +margin_bottom = 115.269 +text = "Back" + +[node name="ConnectMenu" type="Control" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PanelContainer" type="PanelContainer" parent="ConnectMenu"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -126.0 +margin_top = -89.0 +margin_right = 126.0 +margin_bottom = 89.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="ConnectMenu/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 248.0 +margin_bottom = 254.0 + +[node name="Label3" type="Label" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_right = 244.0 +margin_bottom = 15.0 +text = "Connect" +align = 1 +valign = 1 + +[node name="Label" type="Label" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 244.0 +margin_bottom = 38.0 +text = "Hostname / IP" + +[node name="LineEdit" type="LineEdit" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 46.0 +margin_right = 244.0 +margin_bottom = 70.3413 +text = "127.0.0.1" + +[node name="Label2" type="Label" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 78.0 +margin_right = 244.0 +margin_bottom = 93.0 +text = "Port" + +[node name="LineEdit2" type="LineEdit" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 101.0 +margin_right = 244.0 +margin_bottom = 125.341 +text = "23223" + +[node name="CheckBox" type="CheckBox" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 133.0 +margin_right = 244.0 +margin_bottom = 159.269 +text = "Use WebSockets" + +[node name="Status" type="Label" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 167.0 +margin_right = 244.0 +margin_bottom = 182.0 +align = 1 +valign = 1 + +[node name="ConnectButton" type="Button" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 190.0 +margin_right = 244.0 +margin_bottom = 216.269 +text = "Connect" +script = ExtResource( 14 ) +container_path = NodePath("../../..") +status_label_path = NodePath("../Status") +use_websockets_checkbox_path = NodePath("../CheckBox") +ip_line_edit_path = NodePath("../LineEdit") +port_line_edit_path = NodePath("../LineEdit2") + +[node name="Button2" type="Button" parent="ConnectMenu/PanelContainer/VBoxContainer"] +margin_top = 224.0 +margin_right = 244.0 +margin_bottom = 250.269 +text = "Cancel" + +[node name="HostMenu" type="Control" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PanelContainer" type="PanelContainer" parent="HostMenu"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -126.0 +margin_top = -101.5 +margin_right = 126.0 +margin_bottom = 101.5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="HostMenu/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 248.0 +margin_bottom = 199.0 + +[node name="Label3" type="Label" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_right = 244.0 +margin_bottom = 15.0 +text = "Host" +align = 1 +valign = 1 + +[node name="Label2" type="Label" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 244.0 +margin_bottom = 38.0 +text = "Port" + +[node name="LineEdit2" type="LineEdit" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 46.0 +margin_right = 244.0 +margin_bottom = 70.3413 +text = "23223" + +[node name="CheckBox" type="CheckBox" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 78.0 +margin_right = 244.0 +margin_bottom = 104.269 +text = "Use WebSockets" + +[node name="Status" type="Label" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 112.0 +margin_right = 244.0 +margin_bottom = 127.0 +align = 1 +valign = 1 + +[node name="HostButton" type="Button" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 135.0 +margin_right = 244.0 +margin_bottom = 161.269 +text = "Host" +script = ExtResource( 15 ) +container_path = NodePath("../../..") +status_label_path = NodePath("../Status") +use_websockets_checkbox_path = NodePath("../CheckBox") +port_line_edit_path = NodePath("../LineEdit2") + +[node name="Button2" type="Button" parent="HostMenu/PanelContainer/VBoxContainer"] +margin_top = 169.0 +margin_right = 244.0 +margin_bottom = 195.269 +text = "Cancel" + +[node name="OptionsButton" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 20 +custom_constants/margin_top = 20 +custom_constants/margin_left = 20 +custom_constants/margin_bottom = 20 +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="Control" type="Control" parent="OptionsButton"] +margin_left = 20.0 +margin_top = 20.0 +margin_right = 1004.0 +margin_bottom = 580.0 +mouse_filter = 2 +__meta__ = { +"_edit_lock_": true +} + +[node name="VBoxContainer" type="VBoxContainer" parent="OptionsButton/Control"] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -175.0 +margin_right = 111.0 +mouse_filter = 2 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Disconnect" type="Button" parent="OptionsButton/Control/VBoxContainer"] +visible = false +margin_right = 120.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 120, 0 ) +text = "Disconnect" +script = ExtResource( 13 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Connect" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 13.0 +margin_right = 120.0 +margin_bottom = 39.269 +rect_min_size = Vector2( 120, 0 ) +text = "Connect" +script = ExtResource( 11 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Host" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 47.0 +margin_right = 120.0 +margin_bottom = 73.269 +rect_min_size = Vector2( 120, 0 ) +text = "Host" +script = ExtResource( 12 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button2" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 81.0 +margin_right = 120.0 +margin_bottom = 107.269 +rect_min_size = Vector2( 120, 0 ) +text = "Login" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button3" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 115.0 +margin_right = 120.0 +margin_bottom = 141.269 +rect_min_size = Vector2( 120, 0 ) +text = "Register" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button" type="Button" parent="OptionsButton/Control/VBoxContainer"] +margin_top = 149.0 +margin_right = 120.0 +margin_bottom = 175.269 +rect_min_size = Vector2( 120, 0 ) +text = "Options" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Options" parent="." instance=ExtResource( 8 )] +visible = false + +[node name="Login" parent="." instance=ExtResource( 10 )] +visible = false +margin_left = -107.5 +margin_top = -127.5 +margin_right = 107.5 +margin_bottom = 127.5 + +[node name="Register" parent="." instance=ExtResource( 9 )] +visible = false + +[node name="Char" type="Spatial" parent="."] +transform = Transform( 0.359313, 0, 0.933217, 0, 1, 0, -0.933217, 0, 0.359313, -2.44425, 6.02678, 0 ) + +[node name="CharacterDisplay" type="Spatial" parent="Char"] + +[node name="Camera" type="Camera" parent="Char"] +transform = Transform( 0.906006, -0.157589, 0.392835, 0.0104413, 0.936144, 0.351461, -0.423137, -0.314324, 0.849797, 0.300506, 1.57764, 2.14719 ) +current = true +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/Load" to="CharacterSelectorMenu" method="load_character"] +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/HBoxContainer/Delete" to="CharacterSelectorMenu" method="delete_character"] +[connection signal="pressed" from="CharacterSelectorMenu/CharacterSelector/CharacterSelector/VBoxContainer/HBoxContainer/Create" to="." method="switch_to_menu" binds= [ 1 ]] +[connection signal="pressed" from="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer/Create" to="CharacterCreationMenu" method="create"] +[connection signal="pressed" from="CharacterCreationMenu/CharacterSelector2/CharacterSelector/VBoxContainer/PanelContainer/VBoxContainer/Back" to="." method="switch_to_menu" binds= [ 0 ]] +[connection signal="pressed" from="ConnectMenu/PanelContainer/VBoxContainer/Button2" to="ConnectMenu" method="hide"] +[connection signal="pressed" from="HostMenu/PanelContainer/VBoxContainer/Button2" to="HostMenu" method="hide"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Connect" to="ConnectMenu" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Host" to="HostMenu" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Button2" to="Login" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Button3" to="Register" method="show"] +[connection signal="pressed" from="OptionsButton/Control/VBoxContainer/Button" to="Options" method="show"] diff --git a/game/scenes/Shared.tscn b/game/scenes/Shared.tscn new file mode 100644 index 0000000..942f716 --- /dev/null +++ b/game/scenes/Shared.tscn @@ -0,0 +1,11 @@ +[gd_scene format=2] + +[node name="SharedScene" type="Node"] + +[node name="Options" type="Control" parent="."] +margin_right = 806.0 +margin_bottom = 557.0 + +[node name="Keybindings" type="Control" parent="."] +margin_right = 746.0 +margin_bottom = 531.0 diff --git a/game/scenes/World.tscn b/game/scenes/World.tscn new file mode 100644 index 0000000..99e7f62 --- /dev/null +++ b/game/scenes/World.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://scripts/settings/DirectionalLightSettings.gd" type="Script" id=3] + +[sub_resource type="ProceduralSky" id=1] +sky_top_color = Color( 0.447059, 0.780392, 0.854902, 1 ) +sky_horizon_color = Color( 0.273637, 0.277344, 0.206924, 1 ) +sky_curve = 0.263535 +sky_energy = 0.3 +ground_bottom_color = Color( 0.196078, 0.152941, 0.152941, 1 ) +ground_horizon_color = Color( 0.223529, 0.192157, 0.164706, 1 ) +ground_curve = 0.101965 +ground_energy = 0.4 +sun_color = Color( 0.45098, 0.352941, 0.113725, 1 ) +sun_latitude = 39.71 +sun_longitude = -8.09 +sun_angle_min = 0.0 +sun_angle_max = 23.15 +sun_energy = 9.29 +texture_size = 0 + +[sub_resource type="Environment" id=2] +background_mode = 2 +background_sky = SubResource( 1 ) +ambient_light_color = Color( 0.870588, 0.870588, 0.870588, 1 ) +ambient_light_energy = 1.24 +ambient_light_sky_contribution = 0.09 +fog_enabled = true +fog_color = Color( 0.184314, 0.207843, 0.156863, 1 ) +fog_sun_color = Color( 0.239216, 0.337255, 0.396078, 1 ) +fog_sun_amount = 0.53 +fog_depth_begin = 155.9 +fog_depth_end = 379.9 +fog_depth_curve = 1.18921 +tonemap_mode = 2 +tonemap_exposure = 0.83 +auto_exposure_max_luma = 7.33 +ss_reflections_enabled = true +ssao_enabled = true +glow_levels/3 = false +glow_intensity = 1.6 +glow_strength = 1.1 +glow_bloom = 0.1 +glow_hdr_luminance_cap = 1.0 +adjustment_enabled = true +adjustment_brightness = 1.1 +adjustment_contrast = 1.25 + +[node name="World" type="Navigation2D" groups=[ +"save", +]] + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource( 2 ) +__meta__ = { +"_editor_description_": "" +} + +[node name="DirectionalLight" type="DirectionalLight" parent="."] +transform = Transform( -0.797163, 0.45442, 0.397535, 0.124932, -0.520028, 0.844963, 0.590697, 0.723238, 0.357776, 0, 18.834, 0 ) +layers = 3 +light_color = Color( 1, 0.878431, 0.878431, 1 ) +light_energy = 0.7 +light_specular = 0.65 +shadow_bias = 0.07 +script = ExtResource( 3 ) + +[node name="DirectionalLight2" type="DirectionalLight" parent="."] +transform = Transform( 0.826603, 0.474891, -0.302004, -0.49276, 0.351482, -0.79602, -0.271874, 0.806808, 0.524543, 0, 18.834, 0 ) +light_color = Color( 0.631373, 0.631373, 0.631373, 1 ) +light_energy = 0.48 +light_specular = 0.0 +directional_shadow_normal_bias = 0.1 diff --git a/game/scripts/ai/EntityAIGD.gd b/game/scripts/ai/EntityAIGD.gd new file mode 100644 index 0000000..a7b5e51 --- /dev/null +++ b/game/scripts/ai/EntityAIGD.gd @@ -0,0 +1,128 @@ +extends EntityAI +class_name EntityAIGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +var _data : Dictionary = { + "target_aura_spells": {}, + "spells": [] +} + +func _on_set_owner(): + if not is_instance_valid(owner): + return + + if not owner.sentity_data: + return + + var ent_data : EntityData = owner.sentity_data + + if not ent_data.entity_class_data: + return + + var class_data : EntityClassData = ent_data.entity_class_data + + for i in range(class_data.get_num_spells()): + var spell : Spell = class_data.get_spell(i) + + if spell.get_num_target_aura_applys() > 0: + var aura : Aura = spell.get_target_aura_apply(0) + + if not _data["target_aura_spells"].has(aura.aura_group): + _data["target_aura_spells"][aura.aura_group] = [] + + _data["target_aura_spells"][aura.aura_group].append({ "aura_id": aura.id, "spell_id": spell.id, "rank": spell.rank }) + + continue + + _data["spells"].append(spell.id) + + for key in _data["target_aura_spells"]: + var arr : Array = _data["target_aura_spells"][key] + + arr.sort_custom(self, "sort_spells_by_rank") + + +func _update(delta): + if owner.ai_state == EntityEnums.AI_STATE_ATTACK: + attack(delta) + +func attack(delta): + var target : Entity = owner.starget + + if target == null: + owner.ai_state = EntityEnums.AI_STATE_REGENERATE + owner.target_movement_direction = Vector2() + return + + var cast : bool = false + if not owner.gets_has_global_cooldown(): + var taspellsdict : Dictionary = _data["target_aura_spells"] + + for taskey in taspellsdict.keys(): + for tas in taspellsdict[taskey]: + var spell_id : int = tas["spell_id"] + + if not owner.hass_spell_id(spell_id): + continue + + if taskey == null: + if target.sget_aura_by(owner, tas["aura_id"]) == null and not owner.hass_cooldown(spell_id): + owner.crequest_spell_cast(spell_id) + cast = true + break + else: + if target.sget_aura_with_group_by(owner, taskey) == null and not owner.hass_cooldown(spell_id): + owner.crequest_spell_cast(spell_id) + cast = true + break + if cast: + break + + if not cast: + var sps : Array = _data["spells"] + + for spell_id in sps: + if not owner.hass_spell_id(spell_id): + continue + + if not owner.hass_cooldown(spell_id): + owner.crequest_spell_cast(spell_id) + cast = true + break + + + if owner.sis_casting(): + owner.target_movement_direction = Vector2() + return + + var dir : Vector3 = target.translation - owner.translation + + owner.target_movement_direction = Vector2(dir.x, dir.z) + +func sort_spells_by_rank(a, b): + if a == null or b == null: + return true + + return a["rank"] > b["rank"] diff --git a/game/scripts/auras/aura_script.gd b/game/scripts/auras/aura_script.gd new file mode 100644 index 0000000..944ef97 --- /dev/null +++ b/game/scripts/auras/aura_script.gd @@ -0,0 +1,96 @@ +extends Aura +class_name AuraGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _handle_aura_damage(aura_data : AuraData, damage_info : SpellDamageInfo) -> void: + randomize() + + damage_info.damage = damage_min + (randi() % (damage_max - damage_min)) + damage_info.damage_source_type = aura_data.aura.damage_type + + if (is_instance_valid(damage_info.dealer)): + damage_info.dealer.sdeal_damage_to(damage_info) + +func _handle_aura_heal(aura_data : AuraData, shi : SpellHealInfo) -> void: + randomize() + + shi.heal = heal_min + (randi() % (heal_max - heal_min)) + shi.heal_source_type = aura_data.aura.aura_type + + shi.dealer.sdeal_heal_to(shi) + +func _sapply(info : AuraApplyInfo) -> void: +# var add : bool = false + var ad : AuraData = info.target.sget_aura_by(info.caster, info.aura.id) + + if ad == null: +# add = true + ad = AuraData.new() + + setup_aura_data(ad, info); + + for i in range(get_aura_stat_attribute_count()): + var stat_attribute : AuraStatAttribute = get_aura_stat_attribute(i) + var stat : Stat = info.target.get_stat_enum(stat_attribute.stat) + stat.add_modifier(id, stat_attribute.base_mod, stat_attribute.bonus_mod, stat_attribute.percent_mod) + + if states_add != 0: + for i in range(EntityEnums.ENTITY_STATE_TYPE_INDEX_MAX): + var t : int = 1 << i + + if states_add & t != 0: + info.target.sadd_state_ref(i) + + + info.target.sadd_aura(ad); + else: + ad.remaining_time = time + + +func _sdeapply(data : AuraData) -> void: + for i in range(get_aura_stat_attribute_count()): + var stat_attribute : AuraStatAttribute = get_aura_stat_attribute(i) + + var stat : Stat = data.owner.get_stat_enum(stat_attribute.stat) + + stat.remove_modifier(id) + + if states_add != 0: + for i in range(EntityEnums.ENTITY_STATE_TYPE_INDEX_MAX): + var t : int = 1 << i + + if states_add & t != 0: + data.owner.sremove_state_ref(i) + +func _con_aura_added(data : AuraData) -> void: + if data.owner.get_character_skeleton() == null:# or data.owner.get_character_skeleton().root_attach_point == null: + return + + var bse : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if bse != null: + if bse.root_aura_effect != null: + if bse.root_aura_effect_time < 0.00001: + data.owner.get_character_skeleton().root_attach_point.add_effect(bse.root_aura_effect) + else: + data.owner.get_character_skeleton().root_attach_point.add_effect_timed(bse.root_aura_effect, bse.root_aura_effect_time) + + if bse.torso_aura_effect != null: + if bse.torso_aura_effect_time < 0.00001: + data.owner.get_character_skeleton().torso_attach_point.add_effect(bse.torso_aura_effect) + else: + data.owner.get_character_skeleton().torso_attach_point.add_effect_timed(bse.torso_aura_effect, bse.torso_aura_effect_time) + +func _con_aura_removed(data : AuraData) -> void: + var bse : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if bse != null: + if bse.root_aura_effect != null and bse.root_aura_effect_time < 0.00001: + data.owner.get_character_skeleton().root_attach_point.remove_effect(bse.root_aura_effect) + + if bse.torso_aura_effect != null and bse.torso_aura_effect_time < 0.00001: + data.owner.get_character_skeleton().torso_attach_point.remove_effect(bse.torso_aura_effect) + diff --git a/game/scripts/biomes/simple_biome.gd b/game/scripts/biomes/simple_biome.gd new file mode 100644 index 0000000..e9feb60 --- /dev/null +++ b/game/scripts/biomes/simple_biome.gd @@ -0,0 +1,9 @@ +extends Biome + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _generate_chunk(chunk: Node, spawn_mobs: bool) -> void: +# var chunk : VoxelChunk = chunk.get_chunk() + pass diff --git a/game/scripts/dungeon_start_rooms/start_room.gd b/game/scripts/dungeon_start_rooms/start_room.gd new file mode 100644 index 0000000..af1385c --- /dev/null +++ b/game/scripts/dungeon_start_rooms/start_room.gd @@ -0,0 +1,14 @@ +tool +extends DungeonRoom + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _setup(): + sizex = 4 + sizey = 4 + sizez = 4 + +func _generate_chunk(chunk : Node, spawn_mobs: bool) -> void: + pass diff --git a/game/scripts/dungeons/dungeon.gd b/game/scripts/dungeons/dungeon.gd new file mode 100644 index 0000000..e33020b --- /dev/null +++ b/game/scripts/dungeons/dungeon.gd @@ -0,0 +1,47 @@ +tool +extends Dungeon + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _setup(): + if data.get_dungeon_start_room_data_count() == 0: + return + + var drd : DungeonRoomData = data.get_dungeon_start_room_data(0) + + var dung : DungeonRoom + if drd.target_script != null: + dung = drd.target_script.new() + + if dung == null: + print("drd is null. wrong type? " + drd.resource_path) + return + elif drd.target_class_name != "": + if not ClassDB.class_exists(drd.target_class_name): + print("class doesnt exists" + drd.resource_path) + return + + dung = ClassDB.instance(drd.target_class_name) + else: + dung = DungeonRoom.new() + + dung.posx = posx + dung.posy = posy + dung.posz = posz + dung.current_seed = current_seed + dung.data = drd + dung.setup() + + add_dungeon_start_room(dung) + +func _setup_library(library): + ._setup_library(library) + + for i in range(get_dungeon_start_room_count()): + get_dungeon_start_room(i).setup_library(library) + +func _generate_chunk(chunk, spawn_mobs): + for i in range(get_dungeon_start_room_count()): + get_dungeon_start_room(i).generate_chunk(chunk, spawn_mobs) diff --git a/game/scripts/entities/EntityClassDataGD.gd b/game/scripts/entities/EntityClassDataGD.gd new file mode 100644 index 0000000..8158bbd --- /dev/null +++ b/game/scripts/entities/EntityClassDataGD.gd @@ -0,0 +1,117 @@ +extends EntityClassData + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +var _data : Dictionary = { + "target_aura_spells": {}, + "spells": [] +} + +func _init(): + for i in range(get_num_spells()): + var spell : Spell = get_spell(i) + + if spell.get_num_target_aura_applys() > 0: + var aura : Aura = spell.get_target_aura_apply(0) + + if not _data["target_aura_spells"].has(aura.aura_group): + _data["target_aura_spells"][aura.aura_group] = [] + + _data["target_aura_spells"][aura.aura_group].append({ "aura_id": aura.id, "spell_id": spell.id, "rank": spell.rank }) + + continue + + _data["spells"].append(spell.id) + + for key in _data["target_aura_spells"]: + var arr : Array = _data["target_aura_spells"][key] + + arr.sort_custom(self, "sort_spells_by_rank") + + +func _sai_attack(entity): + var mob : Entity = entity as Entity + + var target : Entity = entity.starget + + if mob != null and target == null: + mob.ai_state = EntityEnums.AI_STATE_REGENERATE + mob.target_movement_direction = Vector2() + return + + var cast : bool = false + if not entity.gets_has_global_cooldown(): + var taspellsdict : Dictionary = _data["target_aura_spells"] + + for taskey in taspellsdict.keys(): + for tas in taspellsdict[taskey]: + var spell_id : int = tas["spell_id"] + + if not entity.hass_spell_id(spell_id): + continue + + if taskey == null: + if target.sget_aura_by(entity, tas["aura_id"]) == null and not entity.hass_cooldown(spell_id): + entity.crequest_spell_cast(spell_id) + cast = true + break + else: + if target.sget_aura_with_group_by(entity, taskey) == null and not entity.hass_cooldown(spell_id): + entity.crequest_spell_cast(spell_id) + cast = true + break + if cast: + break + + if not cast: + var sps : Array = _data["spells"] + + for spell_id in sps: + if not entity.hass_spell_id(spell_id): + continue + + if not entity.hass_cooldown(spell_id): + entity.crequest_spell_cast(spell_id) + cast = true + break + + + if entity.sis_casting(): + mob.target_movement_direction = Vector2() + return + + var dir : Vector3 = target.translation - entity.translation + + mob.target_movement_direction = Vector2(dir.x, dir.z) + +#func _setup_resources(entity): +# var p : EntityResource = ManaResource.new() +# +# entity.adds_resource(p) + +func sort_spells_by_rank(a, b): + if a == null or b == null: + return true + + return a["rank"] > b["rank"] diff --git a/game/scripts/entities/EntityDataGD.gd b/game/scripts/entities/EntityDataGD.gd new file mode 100644 index 0000000..9888d60 --- /dev/null +++ b/game/scripts/entities/EntityDataGD.gd @@ -0,0 +1,61 @@ +extends EntityData +class_name EntityDataGD + +# Copyright Péter Magyar relintai@gmail.com +# MIT License, functionality from this class needs to be protable to the entity spell system + +# Copyright (c) 2019 Péter Magyar + +# 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. + +func _sinteract(entity: Entity) -> void: + var target : Entity = entity.gets_target() + + if target == null or not is_instance_valid(target): + return + + if target.sentity_interaction_type == EntityEnums.ENITIY_INTERACTION_TYPE_LOOT: + if target.gets_entity_data().loot_db != null and target.sbag == null: + var ldb : LootDataBase = target.gets_entity_data().loot_db + + var loot : Array = Array() + + ldb.get_loot(loot) + + var bag : Bag = Bag.new() + bag.set_size(loot.size()) + + for item in loot: + var it : ItemTemplate = item as ItemTemplate + + bag.add_item(it.create_item_instance()) + + target.sbag = bag + + entity.starget_bag = target.sbag + + entity.ssend_open_window(EntityEnums.ENTITY_WINDOW_LOOT) + +func _cans_interact(entity): + var target : Entity = entity.gets_target() + + if target == null or not is_instance_valid(target): + return false + + return true diff --git a/game/scripts/items/ItemTemplateGD.gd b/game/scripts/items/ItemTemplateGD.gd new file mode 100644 index 0000000..b25dd10 --- /dev/null +++ b/game/scripts/items/ItemTemplateGD.gd @@ -0,0 +1,13 @@ +extends ItemTemplate +class_name ItemTemplateGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _create_item_instance(): + var ii : ItemInstance = ItemInstance.new() + + ii.item_template = self + + return ii diff --git a/game/scripts/planets/dung_simple_planet.gd b/game/scripts/planets/dung_simple_planet.gd new file mode 100644 index 0000000..1e6d6c0 --- /dev/null +++ b/game/scripts/planets/dung_simple_planet.gd @@ -0,0 +1,94 @@ +tool +extends Planet + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _setup(): + if data == null: + return + + if data.get_biome_data_count() == 0: + return + + var bdata : BiomeData = data.get_biome_data(0) + + var b : Biome + + if bdata.target_script != null: + b = bdata.target_script.new() + + if b == null: + print("biome is null. wrong type? " + bdata.resource_path) + return + elif bdata.target_class_name != "": + if not ClassDB.class_exists(bdata.target_class_name): + print("class doesnt exists" + bdata.resource_path) + return + + b = ClassDB.instance(bdata.target_class_name) + else: + b = Biome.new() + + b.current_seed = current_seed + b.data = bdata + b.setup() + add_biome(b) + + if bdata.get_dungeon_data_count() == 0: + return + + var dd : DungeonData = bdata.get_dungeon_data(0) + + var dung : Dungeon + if dd.target_script != null: + dung = dd.target_script.new() + + if dung == null: + print("dd is null. wrong type? " + dd.resource_path) + return + elif dd.target_class_name != "": + if not ClassDB.class_exists(dd.target_class_name): + print("class doesnt exists" + dd.resource_path) + return + + dung = ClassDB.instance(dd.target_class_name) + else: + dung = Dungeon.new() + + dung.posx = 0 + dung.posy = -4 + dung.posz = 0 + dung.current_seed = current_seed + dung.data = dd + dung.setup() + + add_dungeon(dung) + +func _setup_library(library): + ._setup_library(library) + + for i in range(get_biome_count()): + var b : Biome = get_biome(i) + + if b != null: + b.setup_library(library) + + for i in range(get_dungeon_count()): + var d : Dungeon = get_dungeon(i) + + if d != null: + d.setup_library(library) + +func _generate_chunk(chunk, spawn_mobs): + if (get_biome_count() == 0): + return + + var b : Biome = get_biome(0) + + b.generate_chunk(chunk, spawn_mobs) + + for i in range(get_dungeon_count()): + get_dungeon(i).generate_chunk(chunk, spawn_mobs) + diff --git a/game/scripts/planets/simple_planet.gd b/game/scripts/planets/simple_planet.gd new file mode 100644 index 0000000..82e2f57 --- /dev/null +++ b/game/scripts/planets/simple_planet.gd @@ -0,0 +1,54 @@ +tool +extends Planet + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _setup(): + if data == null: + return + + if data.get_biome_data_count() == 0: + return + + var bdata : BiomeData = data.get_biome_data(0) + + var b : Biome + + if bdata.target_script != null: + b = bdata.target_script.new() + + if b == null: + print("biome is null. wrong type? " + bdata.resource_path) + return + elif bdata.target_class_name != "": + if not ClassDB.class_exists(bdata.target_class_name): + print("class doesnt exists" + bdata.resource_path) + return + + b = ClassDB.instance(bdata.target_class_name) + else: + b = Biome.new() + + b.current_seed = current_seed + b.data = bdata + b.setup() + add_biome(b) + +func _setup_library(library): + ._setup_library(library) + + for i in range(get_biome_count()): + var b : Biome = get_biome(i) + + if b != null: + b.setup_library(library) + +func _generate_chunk(chunk, spawn_mobs): + if (get_biome_count() == 0): + return + + var b : Biome = get_biome(0) + + b.generate_chunk(chunk, spawn_mobs) diff --git a/game/scripts/projectiles/WorldSpellGD.gd b/game/scripts/projectiles/WorldSpellGD.gd new file mode 100644 index 0000000..fdca907 --- /dev/null +++ b/game/scripts/projectiles/WorldSpellGD.gd @@ -0,0 +1,51 @@ +extends WorldSpell +class_name WorldSpellGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +var _target : Node2D +var _info : SpellCastInfo +var _speed : float + +func _ready() -> void: + if _info == null: + set_process(false) + +func launch(info : SpellCastInfo, effect : PackedScene, speed : float) -> void: + if not is_instance_valid(info.target): + return + + _info = info + _target = info.target.get_character_skeleton().torso_attach_point + _speed = speed + +# translation = info.caster.translation + position = info.caster.get_character_skeleton().right_hand_attach_point.global_transform.origin + + var eff : Node = effect.instance() + + eff.owner = self + add_child(eff) + + set_process(true) + +func _process(delta : float) -> void: + if not is_instance_valid(_target): +# set_process(false) + queue_free() + return + + var l : Vector2 = _target.global_transform.origin - position + + if l.length() < 1: + _info.spell.son_spell_hit(_info) + queue_free() + return + + var dir : Vector2 = l.normalized() + + global_transform.origin += dir * _speed * delta +# global_transform = transform.looking_at(_target.global_transform.origin, Vector3(0, 1, 0)) + diff --git a/game/scripts/resources/ManResource.gd b/game/scripts/resources/ManResource.gd new file mode 100644 index 0000000..1721000 --- /dev/null +++ b/game/scripts/resources/ManResource.gd @@ -0,0 +1,15 @@ +extends EntityResource +class_name ManaResource + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _init(): + should_process = false + +#func _ons_stat_changed(stat : Stat): +# print(stat.get_id()) + +func _process_server(delta): + pass diff --git a/game/scripts/resources/ManaResourceData.gd b/game/scripts/resources/ManaResourceData.gd new file mode 100644 index 0000000..747feb3 --- /dev/null +++ b/game/scripts/resources/ManaResourceData.gd @@ -0,0 +1,8 @@ +extends EntityResourceData + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _get_entity_resource_instance() -> EntityResource: + return ManaResource.new() diff --git a/game/scripts/resources/spell_effect_visual_basic.gd b/game/scripts/resources/spell_effect_visual_basic.gd new file mode 100644 index 0000000..b61e7cb --- /dev/null +++ b/game/scripts/resources/spell_effect_visual_basic.gd @@ -0,0 +1,21 @@ +extends SpellEffectVisual +class_name SpellEffectVisualBasic + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (PackedScene) var spell_cast_effect_left_hand : PackedScene +export (PackedScene) var spell_cast_effect_right_hand : PackedScene + +export (PackedScene) var torso_aura_effect : PackedScene +export (float) var torso_aura_effect_time : float + +export (PackedScene) var root_aura_effect : PackedScene +export (float) var root_aura_effect_time : float + +export (PackedScene) var torso_spell_cast_finish_effect : PackedScene +export (float) var torso_spell_cast_finish_effect_time : float = 1 + +export (PackedScene) var root_spell_cast_finish_effect : PackedScene +export (float) var root_spell_cast_finish_effect_time : float = 1 diff --git a/game/scripts/settings/DirectionalLightSettings.gd b/game/scripts/settings/DirectionalLightSettings.gd new file mode 100644 index 0000000..2e3edfb --- /dev/null +++ b/game/scripts/settings/DirectionalLightSettings.gd @@ -0,0 +1,17 @@ +extends DirectionalLight + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/game/scripts/spells/amplify_pain.gd b/game/scripts/spells/amplify_pain.gd new file mode 100644 index 0000000..99ab3f7 --- /dev/null +++ b/game/scripts/spells/amplify_pain.gd @@ -0,0 +1,21 @@ +extends SpellGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _sfinish_cast(info : SpellCastInfo) -> void: + var target : Entity = info.target + + if not is_instance_valid(target): + return + + for i in range(target.sget_aura_count()): + + var ad : AuraData = target.sget_aura(i) + + if ad.caster == info.caster: + var aura : Aura = ad.aura + + if aura.aura_type & SpellEnums.AURA_TYPE_MAGIC != 0: + ad.time_since_last_tick += ad.tick diff --git a/game/scripts/spells/gd_spell_script.gd b/game/scripts/spells/gd_spell_script.gd new file mode 100644 index 0000000..4b28076 --- /dev/null +++ b/game/scripts/spells/gd_spell_script.gd @@ -0,0 +1,182 @@ +extends Spell +class_name SpellGD + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _sstart_casting(info : SpellCastInfo) -> void: + if info.caster.sis_casting(): + return + + if info.spell.cooldown_global_cooldown and info.caster.gets_has_global_cooldown() or info.caster.hass_category_cooldown(spell_type) or info.caster.hass_cooldown(id): + return + + if !info.caster.hass_spell(self): + return + + if cast: + info.caster.sstart_casting(info) + return + + info.caster.sspell_cast_success(info) + + if info.target: + info.target.son_cast_finished_target(info) + + handle_cooldown(info) + + if projectile != null: + fire_projectile(info) + else: + handle_effect(info) + + handle_gcd(info) + +func _sfinish_cast(info : SpellCastInfo) -> void: + info.caster.son_cast_finished(info) + info.caster.sspell_cast_success(info) + + if is_instance_valid(info.target): + info.target.son_cast_finished_target(info) + + if projectile != null: + fire_projectile(info) + else: + handle_effect(info) + + handle_cooldown(info) + +func _son_cast_player_moved(info): + if !cast_can_move_while_casting: + info.caster.sfail_cast() + +func fire_projectile(info : SpellCastInfo): + pass +# if projectile_type == SPELL_PROJECTILE_TYPE_FOLLOW: +# var sp : WorldSpellGD = WorldSpellGD.new() +# +# info.get_caster().get_parent().add_child(sp) +# sp.owner = info.get_caster().get_parent() +# +# sp.launch(info, projectile, projectile_speed) + +func _son_spell_hit(info): + handle_effect(info) + +func handle_effect(info : SpellCastInfo) -> void: + if target_type == SPELL_TARGET_TYPE_TARGET: + if info.target == null: + return + + var ok : bool = false + +# if (target_relation_type & TARGET_SELF): +# ok = true + +# if not ok and (target_relation_type & TARGET_ENEMY and info.target is Entity): +# ok = true +# +# if not ok and (target_relation_type & TARGET_FRIENDLY and info.target is Player): +# ok = true + +# if not ok: +# return + + elif target_type == SPELL_TARGET_TYPE_SELF: + info.target = info.caster + + if damage and info.target: + var sdi : SpellDamageInfo = SpellDamageInfo.new() + + sdi.damage_source = self + sdi.dealer = info.caster + sdi.receiver = info.target + + handle_spell_damage(sdi) + + for aura in caster_aura_applys: + var ainfo : AuraApplyInfo = AuraApplyInfo.new() + + ainfo.caster = info.caster + ainfo.target = info.caster + ainfo.spell_scale = 1 + ainfo.aura = aura + + aura.sapply(ainfo) + + if info.target != null: + for aura in target_aura_applys: + var ad : AuraData = null + + if aura.aura_group != null: + ad = info.target.sget_aura_with_group_by(info.caster, aura.aura_group) + else: + ad = info.target.sget_aura_by(info.caster, aura.get_id()) + + if ad != null: + info.target.sremove_aura_exact(ad) + + var ainfo : AuraApplyInfo = AuraApplyInfo.new() + + ainfo.caster = info.caster + ainfo.target = info.target + ainfo.spell_scale = 1 + ainfo.aura = aura + + aura.sapply(ainfo) + + + +func handle_cooldown(info : SpellCastInfo) -> void: + if cooldown_cooldown > 0: + info.caster.adds_cooldown(id, cooldown_cooldown) + +func handle_gcd(info : SpellCastInfo) -> void: + if cooldown_global_cooldown and cast_cast_time < 0.01: + info.caster.sstart_global_cooldown(info.caster.get_gcd().scurrent) + +func add_spell_cast_effect(info : SpellCastInfo) -> void: + var basic_spell_effect : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if basic_spell_effect != null: + if basic_spell_effect.spell_cast_effect_left_hand != null: + info.caster.get_character_skeleton().left_hand_attach_point.add_effect(basic_spell_effect.spell_cast_effect_left_hand) + + if basic_spell_effect.spell_cast_effect_right_hand != null: + info.caster.get_character_skeleton().right_hand_attach_point.add_effect(basic_spell_effect.spell_cast_effect_right_hand) + +func remove_spell_cast_effect(info : SpellCastInfo) -> void: + var basic_spell_effect : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if basic_spell_effect != null: + if basic_spell_effect.spell_cast_effect_left_hand != null: + info.caster.get_character_skeleton().left_hand_attach_point.remove_effect(basic_spell_effect.spell_cast_effect_left_hand) + + if basic_spell_effect.spell_cast_effect_right_hand != null: + info.caster.get_character_skeleton().right_hand_attach_point.remove_effect(basic_spell_effect.spell_cast_effect_right_hand) + +func _con_spell_cast_started(info): + add_spell_cast_effect(info) + +func _con_spell_cast_failed(info): + remove_spell_cast_effect(info) + +func _con_spell_cast_interrupted(info): + remove_spell_cast_effect(info) + +func _con_spell_cast_success(info): + remove_spell_cast_effect(info) + + if not is_instance_valid(info.target): + return + + var bse : SpellEffectVisualBasic = visual_spell_effects as SpellEffectVisualBasic + + if bse != null: + if bse.torso_spell_cast_finish_effect != null: + info.target.get_character_skeleton().torso_attach_point.add_effect_timed(bse.torso_spell_cast_finish_effect, bse.torso_spell_cast_finish_effect_time) + + if bse.root_spell_cast_finish_effect != null: + info.target.get_character_skeleton().root_attach_point.add_effect_timed(bse.root_spell_cast_finish_effect, bse.root_spell_cast_finish_effect_time) + diff --git a/game/scripts/world_generators/MainPlanetGenerator.gd b/game/scripts/world_generators/MainPlanetGenerator.gd new file mode 100644 index 0000000..65f0ae6 --- /dev/null +++ b/game/scripts/world_generators/MainPlanetGenerator.gd @@ -0,0 +1,82 @@ +tool +extends Resource +class_name MainPlanetGenerator + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +const planet_folder : String = "res://data/planets/" + +export(int) var _force_planet : int = -1 +export(int) var _level_seed : int +export(bool) var _spawn_mobs : bool + +var _world : Navigation2D +var _planet : Planet +var _library : Resource + +func setup(world : Navigation2D, level_seed : int, spawn_mobs : bool, library: Resource) -> void: + _level_seed = level_seed + _world = world + _spawn_mobs = spawn_mobs + _library = library + + create_planet() + +func _generate_chunk(chunk : Node) -> void: + if _planet == null: + return + + _planet.generate_chunk(chunk, _spawn_mobs) + +func create_planet(): + var planet_files : Array + + var dir = Directory.new() + if dir.open(planet_folder) == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + while (file_name != ""): + if not dir.current_is_dir(): + planet_files.append(file_name) + + file_name = dir.get_next() + + if planet_files.size() == 0: + return + + var ind : int + if _force_planet == -1: + seed(_level_seed) + ind = randi() % planet_files.size() + else: + ind = _force_planet + + var planet_data : PlanetData = ResourceLoader.load(planet_folder + planet_files[ind], "PlanetData") + + if planet_data == null: + print("planet_data is null!") + return + + print("planet loaded: " + planet_data.resource_path) + + if planet_data.target_script != null: + _planet = planet_data.target_script.new() + + if _planet == null: + print("_planet is null. wrong type? " + planet_data.resource_path) + return + elif planet_data.target_class_name != "": + if not ClassDB.class_exists(planet_data.target_class_name): + print("class doesnt exists" + planet_data.resource_path) + return + + _planet = ClassDB.instance(planet_data.target_class_name) + else: + _planet = Planet.new() + + _planet.current_seed = _level_seed + _planet.data = planet_data + _planet.setup() + _planet.setup_library(_library) diff --git a/game/ui/actionbars/ActionBar.gd b/game/ui/actionbars/ActionBar.gd new file mode 100644 index 0000000..f71581b --- /dev/null +++ b/game/ui/actionbars/ActionBar.gd @@ -0,0 +1,30 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (PackedScene) var action_bar_entry_scene +export (NodePath) var child_container_path +var child_container + +func _ready() -> void: + child_container = get_node(child_container_path) + +func set_actionbar_entry(action_bar_entry : ActionBarEntry, player: Entity) -> void: + + for i in range(action_bar_entry.slot_num): + var b : ActionBarButtonEntry = action_bar_entry.get_button_for_slotid(i) + + #for i in range(action_bar_entry.get_action_bar_entry_count()): + #var b = action_bar_entry.get_button(i) + + var s : Node = action_bar_entry_scene.instance() + + child_container.add_child(s) + + s.set_player(player) + s.set_button_entry(b, player) + + s.owner = child_container + diff --git a/game/ui/actionbars/ActionBar.tscn b/game/ui/actionbars/ActionBar.tscn new file mode 100644 index 0000000..3a2b8da --- /dev/null +++ b/game/ui/actionbars/ActionBar.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/actionbars/ActionBarEntry.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/actionbars/ActionBar.gd" type="Script" id=2] + +[node name="ActionBar" type="VBoxContainer"] +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -40.0 +margin_top = -553.0 +mouse_filter = 2 +custom_constants/separation = 0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +action_bar_entry_scene = ExtResource( 1 ) +child_container_path = NodePath("GridContainer") + +[node name="Control" type="Control" parent="."] +margin_right = 40.0 +margin_bottom = 553.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="GridContainer" type="GridContainer" parent="."] +margin_top = 553.0 +margin_right = 40.0 +margin_bottom = 553.0 +custom_constants/vseparation = 0 +custom_constants/hseparation = 0 diff --git a/game/ui/actionbars/ActionBarEntry.gd b/game/ui/actionbars/ActionBarEntry.gd new file mode 100644 index 0000000..aeb44e5 --- /dev/null +++ b/game/ui/actionbars/ActionBarEntry.gd @@ -0,0 +1,276 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var button_path : NodePath +export (NodePath) var icon_path : NodePath +export (NodePath) var cooldown_indicator_path : NodePath +export (NodePath) var cooldown_text_path : NodePath +export (NodePath) var keybind_text_path : NodePath + +var button : Button +var icon_rect : TextureRect +var cooldown_indicator : TextureProgress +var cooldown_text : Label +var keybind_text : Label + +var button_entry : ActionBarButtonEntry +var player : Entity + +var spell_id : int = 0 +var spell_type : int = 0 + +var cd : Cooldown = null +var categ_cd : CategoryCooldown = null + +var has_gcd : bool = false +var gcd : float = 0.0 + +func _ready() -> void: + button = get_node(button_path) as Button + icon_rect = get_node(icon_path) as TextureRect + + cooldown_indicator = get_node(cooldown_indicator_path) as TextureProgress + cooldown_text = get_node(cooldown_text_path) as Label + keybind_text = get_node(keybind_text_path) as Label + + button.connect("pressed", self, "_on_button_pressed") + +func _exit_tree(): + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + +func _process(delta : float) -> void: + if cd == null and categ_cd == null and gcd < 0.001: + set_process(false) + hide_cooldown_timer() + return + + if gcd > 0.001: + gcd -= delta + + if gcd < 0: + gcd = 0 + + var value : float = gcd + + if cd != null and cd.remaining > value: + value = cd.remaining + + if categ_cd != null and categ_cd.remaining > value: + value = categ_cd.remaining + + set_cooldown_time(value) + +func set_cooldown_time(time : float) -> void: + cooldown_indicator.value = time + cooldown_text.text = str(int(time)) + +func show_cooldown_timer(max_time : float) -> void: + if cooldown_indicator.visible and cooldown_indicator.max_value < max_time: + cooldown_indicator.max_value = max_time + + if not cooldown_indicator.visible: + cooldown_indicator.max_value = max_time + + cooldown_indicator.show() + cooldown_text.show() + +func hide_cooldown_timer() -> void: + cooldown_indicator.hide() + cooldown_text.hide() + +func set_button_entry(action_bar_button_entry: ActionBarButtonEntry, p_player: Entity) -> void: + player = p_player + + button_entry = action_bar_button_entry + + var iea : InputEventAction = InputEventAction.new() + + var action_name : String = "actionbar_" + str(action_bar_button_entry.action_bar_id) + "_" + str(action_bar_button_entry.slot_id) + + if not InputMap.has_action(action_name): + InputMap.add_action(action_name) + + var action_list : Array = InputMap.get_action_list(action_name) + + for action in action_list: + if action is InputEventKey: + var s : String = "" + + if action.shift: + s += "S-" + + if action.alt: + s += "A-" + + if action.control: + s += "C-" + + if action.command: + s += "Co-" + + if action.meta: + s += "M-" + + s += char(action.scancode) + + keybind_text.text = s + + iea.action = action_name + iea.pressed = true + var sc : ShortCut = ShortCut.new() + sc.shortcut = iea + shortcut = sc + + setup_icon() + +func setup_icon() -> void: + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_NONE): + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + + icon_rect.texture = null + elif (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL): + if (button_entry.item_id == 0): + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + + icon_rect.texture = null + return + + if icon_rect.texture != null: + ThemeAtlas.unref_texture(icon_rect.texture) + icon_rect.texture = null + + var spell = Entities.get_spell(button_entry.item_id) + + if spell.icon != null: + icon_rect.texture = ThemeAtlas.add_texture(spell.icon) +# icon_rect.texture = spell.icon + + spell_id = spell.id + spell_type = spell.spell_type + has_gcd = spell.cooldown_global_cooldown + +func _on_button_pressed() -> void: + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL): + if (button_entry.item_id == 0): + return + + player.crequest_spell_cast(button_entry.item_id) + +func set_button_entry_data(type: int, item_id: int) -> void: + button_entry.type = type + button_entry.itekm_id = item_id + + setup_icon() + +func get_drag_data(pos: Vector2) -> Object: + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_NONE): + return null + + if player.actionbar_locked: + return null + + var tr = TextureRect.new() + tr.texture = icon_rect.texture + tr.expand = true + + tr.rect_size = icon_rect.rect_size + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + if (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL): + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_SPELL + elif (button_entry.type == ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_ITEM): + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_ITEM + + esd.item_id = button_entry.item_id + + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_NONE + button_entry.item_id = 0 + +# Profiles.save() + + setup_icon() + + return esd + +func can_drop_data(pos, data) -> bool: + return data.is_class("ESDragAndDrop") + + +func drop_data(pos, esd) -> void: + if (esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_SPELL): + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_SPELL + elif (esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_ITEM): + button_entry.type = ActionBarButtonEntry.ACTION_BAR_BUTTON_ENTRY_TYPE_ITEM + + button_entry.item_id = esd.item_id + + setup_icon() + +func set_player(p_player: Entity) -> void: + if not player == null: + player.disconnect("ccooldown_added", self, "_ccooldown_added") + player.disconnect("ccooldown_removed", self, "_ccooldown_removed") + player.disconnect("ccategory_cooldown_added", self, "_ccategory_cooldown_added") + player.disconnect("ccategory_cooldown_removed", self, "_ccategory_cooldown_removed") + + player.disconnect("cgcd_started", self, "_cgcd_started") + player.disconnect("cgcd_finished", self, "_cgcd_finished") + + player = null + + player = p_player + + if player == null: + return + +# for i in range(player.getc_cooldown_count()): +# var cooldown : Cooldown = player.getc_cooldown(i) + + player.connect("ccooldown_added", self, "_ccooldown_added") + player.connect("ccooldown_removed", self, "_ccooldown_removed") + player.connect("ccategory_cooldown_added", self, "_ccategory_cooldown_added") + player.connect("ccategory_cooldown_removed", self, "_ccategory_cooldown_removed") + + player.connect("cgcd_started", self, "_cgcd_started") + player.connect("cgcd_finished", self, "_cgcd_finished") + + +func _ccooldown_added(cooldown : Cooldown) -> void: + if cooldown.spell_id == spell_id: + cd = cooldown + set_process(true) + show_cooldown_timer(cooldown.remaining) + +func _ccooldown_removed(cooldown : Cooldown) -> void: + if cooldown.spell_id == spell_id: + cd = null + +func _ccategory_cooldown_added(cooldown : CategoryCooldown) -> void: + if cooldown.category_id == spell_type: + categ_cd = cooldown + set_process(true) + show_cooldown_timer(cooldown.remaining) + +func _ccategory_cooldown_removed(cooldown : CategoryCooldown) -> void: + if cooldown.category_id == spell_type: + categ_cd = null + + +func _cgcd_started(value :float) -> void: + if not has_gcd: + return + + gcd = value + show_cooldown_timer(value) + set_process(true) + +func _cgcd_finished() -> void: + gcd = 0 diff --git a/game/ui/actionbars/ActionBarEntry.tscn b/game/ui/actionbars/ActionBarEntry.tscn new file mode 100644 index 0000000..06aa5e9 --- /dev/null +++ b/game/ui/actionbars/ActionBarEntry.tscn @@ -0,0 +1,91 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/actionbars/ActionBarEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/cooldown_progress.png" type="Texture" id=2] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=3] +[ext_resource path="res://ui/theme/actionbar_dynamicfont.tres" type="DynamicFont" id=5] + +[node name="ActionBarEntry" type="TouchButton"] +margin_right = 46.0 +margin_bottom = 46.0 +rect_min_size = Vector2( 46, 46 ) +focus_mode = 0 +theme = ExtResource( 3 ) +shortcut_in_tooltip = false +action_mode = 0 +button_mask = 3 +enabled_focus_mode = 0 +keep_pressed_outside = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +button_path = NodePath(".") +icon_path = NodePath("MarginContainer/TextureRect") +cooldown_indicator_path = NodePath("CooldownIndicator") +cooldown_text_path = NodePath("CooldownText") +keybind_text_path = NodePath("KeybindText") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="MarginContainer"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 44.0 +margin_bottom = 44.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="CooldownIndicator" type="TextureProgress" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +step = 0.0 +texture_progress = ExtResource( 2 ) +fill_mode = 5 +nine_patch_stretch = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CooldownText" type="Label" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_fonts/font = ExtResource( 5 ) +align = 1 +valign = 1 +clip_text = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="KeybindText" type="Label" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 2.0 +margin_top = 2.0 +margin_right = -2.0 +margin_bottom = -2.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/actionbars/Actionbars.gd b/game/ui/actionbars/Actionbars.gd new file mode 100644 index 0000000..8f503c6 --- /dev/null +++ b/game/ui/actionbars/Actionbars.gd @@ -0,0 +1,52 @@ +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var actionbar_scene + +var _player : Entity + + +func set_player(p_player: Entity) -> void: + if not _player == null: + clear_actionbars() + _player.disconnect("centity_data_changed", self, "_centity_data_changed") + _player = null + + _player = p_player + + if _player == null: + return + + _centity_data_changed(_player.centity_data) + _player.connect("centity_data_changed", self, "_centity_data_changed") + +func _centity_data_changed(cls: EntityData) -> void: + clear_actionbars() + + if cls == null: + return + + var abp = _player.get_action_bar_profile() + + for i in range(abp.get_action_bar_count()): + var abe = abp.get_action_bar(i) + var s = actionbar_scene.instance() + + add_child(s) + + s.set_actionbar_entry(abe, _player) + + s.owner = self + + + +func clear_actionbars() -> void: + var children = get_children() + + for c in children: + c.queue_free() + + diff --git a/game/ui/actionbars/EditorKeybindSetup.gd b/game/ui/actionbars/EditorKeybindSetup.gd new file mode 100644 index 0000000..92c1e86 --- /dev/null +++ b/game/ui/actionbars/EditorKeybindSetup.gd @@ -0,0 +1,37 @@ +tool +extends Node + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(bool) var create = false setget createf +export(bool) var delete = false setget deletef + + +func createf(value : bool) -> void: + if not value: + return + + for i in range(6): + for j in range(12): + var actionstr : String = "input/actionbar_" + str(i) + "_" + str(j) + + var action : Dictionary = Dictionary() + action["events"] = Array() + action["deadzone"] = 0.5 + + ProjectSettings.set(name, actionstr) + ProjectSettings.save() + + +func deletef(value : bool) -> void: + if not value: + return + + for i in range(6): + for j in range(12): + var action : String = "input/actionbar_" + str(i) + "_" + str(j) + + ProjectSettings.clear(action) + ProjectSettings.save() diff --git a/game/ui/auraframe/AuraEntry.gd b/game/ui/auraframe/AuraEntry.gd new file mode 100644 index 0000000..66f08ac --- /dev/null +++ b/game/ui/auraframe/AuraEntry.gd @@ -0,0 +1,79 @@ +extends VBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var texture_rect_path : NodePath +export (NodePath) var tooltip_node_path : NodePath +export (NodePath) var time_label_path : NodePath + +export (NodePath) var magic_bg_path : NodePath +export (NodePath) var bleed_bg_path : NodePath +export (NodePath) var poison_bg_path : NodePath +export (NodePath) var physical_bg_path : NodePath +export (NodePath) var curse_bg_path : NodePath + +var texture_rect : TextureRect +var tooltip_node : Control +var time_label : Label + +var magic_bg : Node +var bleed_bg : Node +var poison_bg : Node +var physical_bg : Node +var curse_bg : Node + +var aura_data : AuraData + +func _ready(): + set_process(false) + + texture_rect = get_node(texture_rect_path) as TextureRect + tooltip_node = get_node(tooltip_node_path) as Control + time_label = get_node(time_label_path) as Label + + magic_bg = get_node(magic_bg_path) as Node + bleed_bg = get_node(bleed_bg_path) as Node + poison_bg = get_node(poison_bg_path) as Node + physical_bg = get_node(physical_bg_path) as Node + curse_bg = get_node(curse_bg_path) as Node + +func _process(delta): +# if not aura_data.is_timed: +# return + + time_label.text = str(int(aura_data.remaining_time)) + "s" + + if (aura_data.remaining_time <= 0): + queue_free() + +func set_aura_data(paura_data : AuraData): + aura_data = paura_data + + if aura_data.is_timed: + set_process(true) + time_label.text = str(aura_data.remaining_time) + else: + set_process(false) + time_label.text = "" + + tooltip_node.hint_tooltip = aura_data.aura.text_description + texture_rect.texture = aura_data.aura.icon + + if aura_data.aura.debuff: + var aura_type : int = aura_data.aura.aura_type + + if aura_type == SpellEnums.AURA_TYPE_MAGIC: + magic_bg.visible = true + elif aura_type == SpellEnums.AURA_TYPE_BLEED: + bleed_bg.visible = true + elif aura_type == SpellEnums.AURA_TYPE_CURSE: + curse_bg.visible = true + elif aura_type == SpellEnums.AURA_TYPE_PHYSICAL: + physical_bg.visible = true + elif aura_type == SpellEnums.AURA_TYPE_POISON: + poison_bg.visible = true + +func get_aura_data() -> AuraData: + return aura_data diff --git a/game/ui/auraframe/AuraEntry.tscn b/game/ui/auraframe/AuraEntry.tscn new file mode 100644 index 0000000..7154325 --- /dev/null +++ b/game/ui/auraframe/AuraEntry.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/auraframe/AuraEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_dynamicfont_small.tres" type="DynamicFont" id=2] + +[node name="AuraEntry" type="VBoxContainer"] +margin_right = 30.0 +margin_bottom = 51.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +texture_rect_path = NodePath("MarginContainer/MarginContainer/TextureRect") +tooltip_node_path = NodePath("MarginContainer/MarginContainer") +time_label_path = NodePath("MarginContainer2/Label") +magic_bg_path = NodePath("MarginContainer/MagicBG") +bleed_bg_path = NodePath("MarginContainer/BleedBG") +poison_bg_path = NodePath("MarginContainer/PoisonBG") +physical_bg_path = NodePath("MarginContainer/PhysicalBG") +curse_bg_path = NodePath("MarginContainer/CurseBG") + +[node name="MarginContainer" type="MarginContainer" parent="."] +margin_right = 30.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 30, 30 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="MagicBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0.215686, 0.0666667, 0.772549, 1 ) + +[node name="BleedBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0.541176, 0, 0, 1 ) + +[node name="PoisonBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0, 0.301961, 0.027451, 1 ) + +[node name="PhysicalBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0.27451, 0.0627451, 0.0627451, 1 ) + +[node name="CurseBG" type="ColorRect" parent="MarginContainer"] +visible = false +margin_right = 30.0 +margin_bottom = 30.0 +color = Color( 0.172549, 0.0588235, 0.262745, 1 ) + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer"] +margin_right = 30.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 1 +custom_constants/margin_top = 1 +custom_constants/margin_left = 1 +custom_constants/margin_bottom = 1 + +[node name="TextureRect" type="TextureRect" parent="MarginContainer/MarginContainer"] +margin_left = 1.0 +margin_top = 1.0 +margin_right = 29.0 +margin_bottom = 29.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="MarginContainer2" type="MarginContainer" parent="."] +margin_top = 38.0 +margin_right = 30.0 +margin_bottom = 51.0 +rect_min_size = Vector2( 30, 10 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="MarginContainer2"] +margin_right = 30.0 +margin_bottom = 13.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_fonts/font = ExtResource( 2 ) +align = 1 +valign = 1 +max_lines_visible = 1 diff --git a/game/ui/auraframe/AuraFrame.gd b/game/ui/auraframe/AuraFrame.gd new file mode 100644 index 0000000..835612c --- /dev/null +++ b/game/ui/auraframe/AuraFrame.gd @@ -0,0 +1,59 @@ +extends MarginContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (PackedScene) var aura_entry_scene : PackedScene + +export (NodePath) var buff_container_path : NodePath +export (NodePath) var debuff_container_path : NodePath + +var buff_container_node : Node +var debuff_container_node : Node + +var buff_nodes : Array +var debuff_nodes : Array + +var entity : Entity + +func _ready(): + buff_container_node = get_node(buff_container_path) + debuff_container_node = get_node(debuff_container_path) + +func set_target(pentity : Entity) -> void: + if entity != null: + pass + + entity = pentity + entity.connect("caura_added", self, "on_caura_added") + entity.connect("caura_removed", self, "on_caura_removed") + +func on_caura_added(aura_data : AuraData) -> void: + var created_node : Node = aura_entry_scene.instance() + + if (not aura_data.aura.debuff): + buff_container_node.add_child(created_node) + created_node.owner = buff_container_node + else: + debuff_container_node.add_child(created_node) + created_node.owner = debuff_container_node + + created_node.set_aura_data(aura_data) + +func on_caura_removed(aura_data : AuraData) -> void: + if (not aura_data.aura.debuff): + for bn in buff_container_node.get_children(): + if bn.get_aura_data() == aura_data: + buff_container_node.remove_child(bn) + bn.queue_free() + return + else: + for bn in debuff_container_node.get_children(): + if bn.get_aura_data() == aura_data: + debuff_container_node.remove_child(bn) + bn.queue_free() + return + +func set_player(player : Entity) -> void: + set_target(player) diff --git a/game/ui/auraframe/AuraFrame.tscn b/game/ui/auraframe/AuraFrame.tscn new file mode 100644 index 0000000..e7682d5 --- /dev/null +++ b/game/ui/auraframe/AuraFrame.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/auraframe/AuraFrame.gd" type="Script" id=1] +[ext_resource path="res://ui/auraframe/AuraEntry.tscn" type="PackedScene" id=2] + +[node name="AuraFrame" type="MarginContainer"] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -376.0 +margin_right = -1.0 +margin_bottom = 160.0 +mouse_filter = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +aura_entry_scene = ExtResource( 2 ) +buff_container_path = NodePath("VBoxContainer/Buffs") +debuff_container_path = NodePath("VBoxContainer/Debuffs") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_right = 375.0 +margin_bottom = 160.0 +mouse_filter = 2 + +[node name="Buffs" type="GridContainer" parent="VBoxContainer"] +margin_right = 375.0 +margin_bottom = 76.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 9 + +[node name="Debuffs" type="GridContainer" parent="VBoxContainer"] +margin_top = 84.0 +margin_right = 375.0 +margin_bottom = 160.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 9 diff --git a/game/ui/bags/Bag.tscn b/game/ui/bags/Bag.tscn new file mode 100644 index 0000000..67acfdb --- /dev/null +++ b/game/ui/bags/Bag.tscn @@ -0,0 +1,323 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/bags/InventoryGUI.gd" type="Script" id=2] +[ext_resource path="res://ui/bags/BagEntry.tscn" type="PackedScene" id=3] +[ext_resource path="res://ui/bags/EquipmentSlot.tscn" type="PackedScene" id=4] +[ext_resource path="res://ui/bags/ItemPupop.gd" type="Script" id=5] + +[node name="Inventory" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +inventory_item_scene = ExtResource( 3 ) +inventory_item_container_path = NodePath("VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/ScrollContainer/GridContainer") +item_tooltip_path = NodePath("TooltipContainer/ItemTooltip") +inventory_slots = [ NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer/Head"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Neck"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Shoulder"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Chest"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2/Hands"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Belt"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5/Legs"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5/Feet"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Ring1"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3/Ring2"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Trinket1"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4/Trinket2"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer/MainHand"), NodePath("VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer/OffHand") ] + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 26.0 + +[node name="BagName" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 5.0 +margin_right = 982.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 6 +text = "Inventory" +align = 1 + +[node name="CloseButton" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 986.0 +margin_right = 1016.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 30, 20 ) +text = "X" + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer"] +margin_top = 34.0 +margin_right = 1016.0 +margin_bottom = 592.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/HBoxContainer3"] +margin_right = 227.96 +margin_bottom = 558.0 +rect_min_size = Vector2( 227.96, 0 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 223.96 +margin_bottom = 554.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 10 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 96.0 +margin_right = 219.0 +margin_bottom = 146.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Head" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer" instance=ExtResource( 4 )] + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 156.0 +margin_right = 219.0 +margin_bottom = 206.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Shoulder" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 4 )] +margin_left = 30.0 +margin_right = 80.0 +text = "sh" +equip_slot = 2 + +[node name="Neck" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 4 )] +text = "Neck" +equip_slot = 1 + +[node name="Hands" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 4 )] +margin_left = 138.0 +margin_right = 188.0 +text = "Hands" +equip_slot = 4 + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 216.0 +margin_right = 219.0 +margin_bottom = 266.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Ring1" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3" instance=ExtResource( 4 )] +margin_left = 30.0 +margin_right = 80.0 +text = "Ring" +equip_slot = 8 +texture_path = NodePath("../Ring1/MarginContainer/TextureRect") + +[node name="Chest" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3" instance=ExtResource( 4 )] +text = "Chest" +equip_slot = 3 + +[node name="Ring2" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer3" instance=ExtResource( 4 )] +margin_left = 138.0 +margin_right = 188.0 +text = "Ring" +equip_slot = 9 + +[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 276.0 +margin_right = 219.0 +margin_bottom = 326.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Trinket1" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4" instance=ExtResource( 4 )] +margin_left = 30.0 +margin_right = 80.0 +text = "Tr" +equip_slot = 10 + +[node name="Belt" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4" instance=ExtResource( 4 )] +text = "Belt" +equip_slot = 5 + +[node name="Trinket2" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer4" instance=ExtResource( 4 )] +margin_left = 138.0 +margin_right = 188.0 +text = "Tr" +equip_slot = 11 + +[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 336.0 +margin_right = 219.0 +margin_bottom = 386.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Legs" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5" instance=ExtResource( 4 )] +margin_left = 57.0 +margin_right = 107.0 +text = "Legs" +equip_slot = 6 + +[node name="Feet" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer5" instance=ExtResource( 4 )] +margin_left = 111.0 +margin_right = 161.0 +text = "Feet" +equip_slot = 7 + +[node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer"] +margin_top = 396.0 +margin_right = 219.0 +margin_bottom = 454.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6"] +margin_left = 53.0 +margin_right = 165.0 +margin_bottom = 58.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 108.0 +margin_bottom = 54.0 + +[node name="MainHand" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer" instance=ExtResource( 4 )] +margin_left = 0.0 +margin_right = 50.0 +text = "MH" +equip_slot = 12 + +[node name="OffHand" parent="VBoxContainer/HBoxContainer3/PanelContainer/VBoxContainer/HBoxContainer6/PanelContainer/HBoxContainer" instance=ExtResource( 4 )] +margin_left = 54.0 +margin_right = 104.0 +text = "OH" +equip_slot = 13 +texture_path = NodePath("../OffHand/MarginContainer/TextureRect") + +[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer/HBoxContainer3"] +margin_left = 231.0 +margin_right = 1016.0 +margin_bottom = 558.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 781.0 +margin_bottom = 554.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer"] +margin_right = 777.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/ScrollContainer"] +size_flags_horizontal = 2 +size_flags_vertical = 2 +custom_constants/vseparation = 5 +custom_constants/hseparation = 5 +columns = 6 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer"] +margin_top = 524.0 +margin_right = 777.0 +margin_bottom = 550.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/HBoxContainer2"] +margin_top = 5.0 +margin_right = 743.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "190 " +align = 2 + +[node name="ResizeButton" type="Button" parent="VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/HBoxContainer2"] +margin_left = 747.0 +margin_right = 777.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 30, 20 ) + +[node name="TooltipContainer" type="Control" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 +mouse_filter = 2 + +[node name="ItemTooltip" type="PopupPanel" parent="TooltipContainer"] +margin_right = 295.0 +margin_bottom = 223.0 +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} +name_path = NodePath("../ItemTooltip/VBoxContainer/HBoxContainer/VBoxContainer/NameLabel") +description_path = NodePath("../ItemTooltip/VBoxContainer/DescriptionLabel") + +[node name="VBoxContainer" type="VBoxContainer" parent="TooltipContainer/ItemTooltip"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 291.0 +margin_bottom = 219.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="TooltipContainer/ItemTooltip/VBoxContainer"] +margin_right = 287.0 +margin_bottom = 26.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="TooltipContainer/ItemTooltip/VBoxContainer/HBoxContainer"] +margin_right = 249.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="NameLabel" type="RichTextLabel" parent="TooltipContainer/ItemTooltip/VBoxContainer/HBoxContainer/VBoxContainer"] +margin_top = 4.0 +margin_right = 249.0 +margin_bottom = 22.0 +rect_min_size = Vector2( 0, 18 ) +size_flags_horizontal = 3 +bbcode_enabled = true + +[node name="Button" type="Button" parent="TooltipContainer/ItemTooltip/VBoxContainer/HBoxContainer"] +margin_left = 257.0 +margin_right = 287.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 30, 20 ) +text = "X" + +[node name="HSeparator" type="HSeparator" parent="TooltipContainer/ItemTooltip/VBoxContainer"] +margin_top = 34.0 +margin_right = 287.0 +margin_bottom = 42.0 +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DescriptionLabel" type="RichTextLabel" parent="TooltipContainer/ItemTooltip/VBoxContainer"] +margin_top = 50.0 +margin_right = 287.0 +margin_bottom = 215.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +bbcode_enabled = true +[connection signal="pressed" from="VBoxContainer/HBoxContainer/CloseButton" to="." method="hide"] +[connection signal="pressed" from="TooltipContainer/ItemTooltip/VBoxContainer/HBoxContainer/Button" to="TooltipContainer/ItemTooltip" method="hide"] diff --git a/game/ui/bags/BagEntry.gd b/game/ui/bags/BagEntry.gd new file mode 100644 index 0000000..c5b4364 --- /dev/null +++ b/game/ui/bags/BagEntry.gd @@ -0,0 +1,236 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var button_path : NodePath +export (NodePath) var icon_path : NodePath + +export (NodePath) var cooldown_indicator_path : NodePath +export (NodePath) var cooldown_text_path : NodePath + +export (NodePath) var stack_counter : NodePath +var _stack_counter : Label + +var _tooltip : Popup + +var button : Button +var icon_rect : TextureRect +var cooldown_indicator : TextureProgress +var cooldown_text : Label + +var slot_id : int = 0 +var item : ItemInstance +var player : Entity + +var spell_id : int = 0 +#var spell_type : int = 0 + +var cd : Cooldown = null + +var has_gcd : bool = false +var gcd : float = 0.0 + +func _ready() -> void: + button = get_node(button_path) as Button + icon_rect = get_node(icon_path) as TextureRect + + cooldown_indicator = get_node(cooldown_indicator_path) as TextureProgress + cooldown_text = get_node(cooldown_text_path) as Label + + _stack_counter = get_node(stack_counter) as Label + + button.connect("pressed", self, "_on_button_pressed") + +#func _exit_tree(): +# if item != null: +# item.disconnect("stack_size_changed", self, "stack_size_changed") + +func _process(delta : float) -> void: + if cd == null and gcd < 0.001: + set_process(false) + hide_cooldown_timer() + return + + if gcd > 0.001: + gcd -= delta + + if gcd < 0: + gcd = 0 + + var value : float = gcd + + if cd != null and cd.remaining > value: + value = cd.remaining + + set_cooldown_time(value) + +func set_cooldown_time(time : float) -> void: + cooldown_indicator.value = time + cooldown_text.text = str(int(time)) + +func show_cooldown_timer(max_time : float) -> void: + if cooldown_indicator.visible and cooldown_indicator.max_value < max_time: + cooldown_indicator.max_value = max_time + + if not cooldown_indicator.visible: + cooldown_indicator.max_value = max_time + + cooldown_indicator.show() + cooldown_text.show() + +func hide_cooldown_timer() -> void: + cooldown_indicator.hide() + cooldown_text.hide() + +func set_item_instance(pitem : ItemInstance) -> void: + if item != null and item.item_template.stack_size > 1: + item.disconnect("stack_size_changed", self, "stack_size_changed") + _stack_counter.hide() + + item = pitem + + setup_icon() + + if item != null and item.item_template.stack_size > 1: + item.connect("stack_size_changed", self, "stack_size_changed") + _stack_counter.show() + stack_size_changed(item) + +func setup_icon() -> void: + if (item == null): + icon_rect.texture = null + else: + if (item.get_item_template() == null): + icon_rect.texture = null + return + + if item.item_template.use_spell != null: + var spell : Spell = item.item_template.use_spell + spell_id = spell.spell_id + has_gcd = spell.cooldown_global_cooldown + else: + spell_id = 0 + has_gcd = false + + icon_rect.texture = item.item_template.icon + + + +func _on_button_pressed() -> void: + #if spell_id != 0: + # player.crequest_spell_cast(button_entry.item_id) + pass + +func set_button_entry_data(ii : ItemInstance) -> void: + if item != null and item.item_template.stack_size > 1: + item.disconnect("stack_size_changed", self, "stack_size_changed") + _stack_counter.hide() + + item = ii + + setup_icon() + + if item != null and item.item_template.stack_size > 1: + item.connect("stack_size_changed", self, "stack_size_changed") + _stack_counter.show() + stack_size_changed(item) + +func stack_size_changed(ii : ItemInstance) -> void: + _stack_counter.text = str(ii.stack_size) + +func get_drag_data(pos: Vector2) -> Object: + if item == null: + return null + + var tr = TextureRect.new() + tr.texture = icon_rect.texture + tr.expand = true + + tr.rect_size = icon_rect.rect_size + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + esd.origin = self + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM + esd.item_id = slot_id + + setup_icon() + + return esd + +func can_drop_data(pos, data) -> bool: + return (data.is_class("ESDragAndDrop") and (data.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM or + data.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM)) + + +func drop_data(pos, esd) -> void: + if esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM: + player.crequest_item_swap(slot_id, esd.item_id) + setup_icon() + elif esd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM: + player.crequest_equip(esd.item_id, slot_id) + setup_icon() + +func set_slot_id(pslot_id : int) -> void: + slot_id = pslot_id + +func set_player(p_player: Entity) -> void: + if not player == null: + player.disconnect("ccooldown_added", self, "_ccooldown_added") + player.disconnect("ccooldown_removed", self, "_ccooldown_removed") + + player.disconnect("cgcd_started", self, "_cgcd_started") + player.disconnect("cgcd_finished", self, "_cgcd_finished") + + player = null + + player = p_player + + if player == null: + return + +# for i in range(player.getc_cooldown_count()): +# var cooldown : Cooldown = player.getc_cooldown(i) + + player.connect("ccooldown_added", self, "_ccooldown_added") + player.connect("ccooldown_removed", self, "_ccooldown_removed") + + player.connect("cgcd_started", self, "_cgcd_started") + player.connect("cgcd_finished", self, "_cgcd_finished") + + +func _ccooldown_added(cooldown : Cooldown) -> void: + if cooldown.spell_id == spell_id: + cd = cooldown + set_process(true) + show_cooldown_timer(cooldown.remaining) + +func _ccooldown_removed(cooldown : Cooldown) -> void: + if cooldown.spell_id == spell_id: + cd = null + +func _cgcd_started(value :float) -> void: + if not has_gcd: + return + + gcd = value + show_cooldown_timer(value) + set_process(true) + +func _cgcd_finished() -> void: + gcd = 0 + +func _pressed(): + if _tooltip != null and item != null: + var pos : Vector2 = rect_global_position + pos.x += rect_size.x + + _tooltip.set_item(item) + _tooltip.popup(Rect2(pos, _tooltip.rect_size)) +# _tooltip.pac + +func set_tooltip_node(tooltip : Popup) -> void: + _tooltip = tooltip diff --git a/game/ui/bags/BagEntry.tscn b/game/ui/bags/BagEntry.tscn new file mode 100644 index 0000000..bd0587b --- /dev/null +++ b/game/ui/bags/BagEntry.tscn @@ -0,0 +1,104 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/bags/BagEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/cooldown_progress.png" type="Texture" id=2] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=3] +[ext_resource path="res://ui/theme/actionbar_dynamicfont.tres" type="DynamicFont" id=5] + +[node name="BagEntry" type="Button"] +margin_top = 1.0 +margin_right = 45.0 +margin_bottom = 46.0 +rect_min_size = Vector2( 45, 45 ) +focus_mode = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource( 3 ) +shortcut_in_tooltip = false +action_mode = 0 +button_mask = 3 +enabled_focus_mode = 0 +keep_pressed_outside = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +button_path = NodePath(".") +icon_path = NodePath("MarginContainer/TextureRect") +cooldown_indicator_path = NodePath("CooldownIndicator") +cooldown_text_path = NodePath("CooldownText") +stack_counter = NodePath("MarginContainer2/StackCounter") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="MarginContainer"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 43.0 +margin_bottom = 43.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="CooldownIndicator" type="TextureProgress" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +step = 0.0 +texture_progress = ExtResource( 2 ) +fill_mode = 5 +nine_patch_stretch = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CooldownText" type="Label" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_fonts/font = ExtResource( 5 ) +align = 1 +valign = 1 +clip_text = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer2" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 4 +custom_constants/margin_top = 4 +custom_constants/margin_left = 4 +custom_constants/margin_bottom = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="StackCounter" type="Label" parent="MarginContainer2"] +visible = false +margin_left = 4.0 +margin_top = 4.0 +margin_right = 41.0 +margin_bottom = 42.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 2 +valign = 2 diff --git a/game/ui/bags/BagFrame.gd b/game/ui/bags/BagFrame.gd new file mode 100644 index 0000000..5f6ffb1 --- /dev/null +++ b/game/ui/bags/BagFrame.gd @@ -0,0 +1,13 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var bag_scene : PackedScene +export(NodePath) var container_path : NodePath = "BagContainerFrame" + +var container : Control + +func _ready() -> void: + container = get_node(container_path) as Control diff --git a/game/ui/bags/BagFrame.tscn b/game/ui/bags/BagFrame.tscn new file mode 100644 index 0000000..69607ab --- /dev/null +++ b/game/ui/bags/BagFrame.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/bags/Bag.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/bags/BagFrame.gd" type="Script" id=2] + +[node name="BagFrame" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 2 ) +__meta__ = { +"_edit_lock_": true, +"_edit_use_anchors_": false +} +bag_scene = ExtResource( 1 ) +container_path = NodePath("") + +[node name="BagOpenerFrame" type="HBoxContainer" parent="."] +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -39.0 +margin_top = -37.0 +grow_horizontal = 0 +grow_vertical = 0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button" type="Button" parent="BagOpenerFrame"] +margin_right = 40.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 40, 40 ) +text = "B" + +[node name="Bag" parent="." instance=ExtResource( 1 )] +visible = false +margin_left = 68.0 +margin_top = 115.0 +margin_right = 551.0 +margin_bottom = 432.0 +grow_horizontal = 0 +grow_vertical = 0 +rect_min_size = Vector2( 100, 0 ) +size_flags_horizontal = 10 +size_flags_vertical = 10 +[connection signal="pressed" from="BagOpenerFrame/Button" to="Bag" method="show"] diff --git a/game/ui/bags/EquipmentSlot.gd b/game/ui/bags/EquipmentSlot.gd new file mode 100644 index 0000000..14795d8 --- /dev/null +++ b/game/ui/bags/EquipmentSlot.gd @@ -0,0 +1,87 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(int) var equip_slot : int + +export(NodePath) var texture_path : NodePath + +var _texture : TextureRect +var _tooltip : Popup + +var _player : Entity + +var _item_instance : ItemInstance + +func _ready(): + _texture = get_node(texture_path) as TextureRect + +func set_tooltip_node(tooltip : Popup) -> void: + _tooltip = tooltip + +func set_player(player: Entity) -> void: + if _player != null: + _player.disconnect("con_equip_success", self, "con_equip_success") + + _player = player + + if _player == null: + return + + _player.connect("con_equip_success", self, "con_equip_success") + +func drop_data(position, data): + if _player == null: + return + + var dd : ESDragAndDrop = data as ESDragAndDrop + + if dd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM: + #todo + return + + if dd.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM: + _player.crequest_equip(equip_slot, dd.item_id) + +func can_drop_data(position, data): + if _player == null: + return false + + if data is ESDragAndDrop and (data.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM or + data.type == ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_INVENTORY_ITEM): + return true + + return false + +func get_drag_data(position): + if _item_instance == null: + return null + + var tr = TextureRect.new() + tr.texture = _texture.texture + tr.expand = true + + tr.rect_size = _texture.rect_size + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + esd.origin = self + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_EQUIPPED_ITEM + esd.item_id = equip_slot + + return esd + +func con_equip_success(entity: Entity, pequip_slot: int, item: ItemInstance, old_item: ItemInstance, bag_slot: int): + if equip_slot != pequip_slot: + return + + _item_instance = item + + if item == null: + _texture.texture = null + return + + _texture.texture = item.item_template.icon diff --git a/game/ui/bags/EquipmentSlot.tscn b/game/ui/bags/EquipmentSlot.tscn new file mode 100644 index 0000000..da21a9a --- /dev/null +++ b/game/ui/bags/EquipmentSlot.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/bags/EquipmentSlot.gd" type="Script" id=1] + +[node name="EquipmentSlot" type="Button"] +margin_left = 84.0 +margin_right = 134.0 +margin_bottom = 50.0 +rect_min_size = Vector2( 50, 50 ) +text = "Head" +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +texture_path = NodePath("MarginContainer/TextureRect") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="MarginContainer"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 76.0 +margin_bottom = 45.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true diff --git a/game/ui/bags/InventoryGUI.gd b/game/ui/bags/InventoryGUI.gd new file mode 100644 index 0000000..b0a24d5 --- /dev/null +++ b/game/ui/bags/InventoryGUI.gd @@ -0,0 +1,110 @@ +extends PanelContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var inventory_item_scene : PackedScene +export(NodePath) var inventory_item_container_path : NodePath +export(NodePath) var item_tooltip_path : NodePath +export(Array, NodePath) var inventory_slots : Array + +var _inventory_slots : Array +var _inventory_item_container : Node +var _tooltip : Popup + +var _player : Entity = null +var _bag : Bag = null + +func _ready() -> void: + _inventory_item_container = get_node(inventory_item_container_path) + _tooltip = get_node(item_tooltip_path) + + for np in inventory_slots: + var es : Control = get_node(np) as Control + es.set_tooltip_node(_tooltip) + _inventory_slots.append(es) + + connect("visibility_changed", self, "on_visibility_changed") + +func set_player(p_player: Entity) -> void: + if _player != null: + _player.disconnect("cbag_changed", self, "cbag_changed") + + for ie in _inventory_item_container.get_children(): + ie.queue_free() + + _player = p_player + + _player.connect("cbag_changed", self, "cbag_changed") + + cbag_changed(_player, _player.cbag) + + for np in _inventory_slots: + np.set_player(_player) + + refresh_bags() + +func refresh_bags() -> void: + if _bag == null: + return + + if not visible: + return + +# if _bag.size == _inventory_item_container.get_child_count(): +# return + + for ie in _inventory_item_container.get_children(): + ie.queue_free() + + for i in range(_bag.get_size()): + var n : Node = inventory_item_scene.instance() + + _inventory_item_container.add_child(n) + n.owner = _inventory_item_container + + n.set_slot_id(i) + n.set_tooltip_node(_tooltip) + n.set_player(_player) + n.set_item_instance(_bag.get_item(i)) + +func cbag_changed(entity: Entity, bag: Bag) -> void: + if _bag != null: + _bag.disconnect("size_changed", self, "bag_size_changed") + _bag.disconnect("item_added", self, "bag_item_added") + _bag.disconnect("item_count_changed", self, "item_count_changed") + _bag.disconnect("item_removed", self, "item_removed") + _bag.disconnect("item_swapped", self, "item_swapped") + + _bag = entity.cbag + + if _bag == null: + return + + _bag.connect("size_changed", self, "bag_size_changed") + _bag.connect("item_added", self, "bag_item_added") + _bag.connect("item_count_changed", self, "item_count_changed") + _bag.connect("item_removed", self, "item_removed") + _bag.connect("item_swapped", self, "item_swapped") + +# overburden_removed(bag: Bag) +# overburdened(bag: Bag) + +func bag_size_changed(bag: Bag) -> void: + refresh_bags() + +func bag_item_added(bag: Bag, item: ItemInstance, slot_id: int) -> void: + refresh_bags() + +func item_count_changed(bag: Bag, item: ItemInstance, slot_id: int) -> void: + refresh_bags() + +func item_removed(bag: Bag, item: ItemInstance, slot_id: int) -> void: + refresh_bags() + +func item_swapped(bag: Bag, item1_slot : int, item2_slot: int) -> void: + refresh_bags() + +func on_visibility_changed() -> void: + refresh_bags() diff --git a/game/ui/bags/ItemPupop.gd b/game/ui/bags/ItemPupop.gd new file mode 100644 index 0000000..68f22b7 --- /dev/null +++ b/game/ui/bags/ItemPupop.gd @@ -0,0 +1,19 @@ +extends PopupPanel + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var name_path : NodePath +export(NodePath) var description_path : NodePath + +var _name : RichTextLabel +var _description : RichTextLabel + +func _ready(): + _name = get_node(name_path) as RichTextLabel + _description = get_node(description_path) as RichTextLabel + +func set_item(item : ItemInstance) -> void: + _name.bbcode_text = item.item_template.text_name +# _description.text = item.item_template. diff --git a/game/ui/bags/weapon_set_button_group.tres b/game/ui/bags/weapon_set_button_group.tres new file mode 100644 index 0000000..0e55d74 --- /dev/null +++ b/game/ui/bags/weapon_set_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=2] + +[resource] diff --git a/game/ui/buttons/Buttons.gd b/game/ui/buttons/Buttons.gd new file mode 100644 index 0000000..fc0dd74 --- /dev/null +++ b/game/ui/buttons/Buttons.gd @@ -0,0 +1,47 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var spell_book_path +export (NodePath) var spell_book_button_path +var spell_book +var spell_book_button + +export (NodePath) var lock_button_path +var lock_button + +var player + +func _ready(): + spell_book = get_node(spell_book_path) + spell_book_button = get_node(spell_book_button_path) + + spell_book_button.connect("pressed", self, "_spell_book_click") + + lock_button = get_node(lock_button_path) + lock_button.connect("pressed", self, "_lock_button_click") + +func set_player(p_player): + player = p_player + +func _spell_book_click(): + if spell_book.visible: + spell_book.hide() + else: + spell_book.show() + +func _lock_button_click(): + if player == null: + return + + var cls = player.centity_data + + if cls == null: + return + + var profile = Profiles.get_class_profile(cls.id) + + profile.actionbar_locked = not profile.actionbar_locked + diff --git a/game/ui/castbar/Castbar.gd b/game/ui/castbar/Castbar.gd new file mode 100644 index 0000000..022d093 --- /dev/null +++ b/game/ui/castbar/Castbar.gd @@ -0,0 +1,74 @@ +extends MarginContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var progress_bar_path +export (NodePath) var label_path + +var progress_bar : ProgressBar +var label : Label + +var player : Entity = null +var spell_cast_info : SpellCastInfo = null + +func _ready() -> void: + progress_bar = get_node(progress_bar_path) + progress_bar.min_value = 0 + label = get_node(label_path) + hide() + set_process(false) + +func _process(delta: float) -> void: + if not spell_cast_info.is_casting: + hide() + set_process(false) + + progress_bar.value = spell_cast_info.current_cast_time + + +func set_player(p_player: Entity) -> void: + if not player == null: + player.disconnect("ccast_started", self, "_ccast_started") + player.disconnect("ccast_failed", self, "_ccast_failed") + player.disconnect("ccast_finished", self, "_ccast_finished") + player.disconnect("ccast_interrupted", self, "_ccast_interrupted") + + player = p_player + + player.connect("ccast_started", self, "_ccast_started") + player.connect("ccast_failed", self, "_ccast_failed") + player.connect("ccast_finished", self, "_ccast_finished") + player.connect("ccast_interrupted", self, "_ccast_interrupted") + + +func _ccast_started(pspell_cast_info: SpellCastInfo) -> void: + set_process(true) + + + spell_cast_info = pspell_cast_info + + label.text = spell_cast_info.spell.get_name() + + progress_bar.value = spell_cast_info.current_cast_time + progress_bar.max_value = spell_cast_info.cast_time + + show() + + +func _ccast_failed(pspell_cast_info: SpellCastInfo) -> void: + set_process(false) + hide() + +func _ccast_finished(pspell_cast_info: SpellCastInfo) -> void: + set_process(false) + hide() + +func _ccast_interrupted(pspell_cast_info: SpellCastInfo) -> void: + set_process(false) + hide() + + + + diff --git a/game/ui/castbar/Castbar.tscn b/game/ui/castbar/Castbar.tscn new file mode 100644 index 0000000..a12ee28 --- /dev/null +++ b/game/ui/castbar/Castbar.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/castbar/Castbar.gd" type="Script" id=1] + +[node name="Castbar" type="MarginContainer"] +margin_left = 339.0 +margin_top = 416.0 +margin_right = 691.0 +margin_bottom = 441.0 +script = ExtResource( 1 ) +progress_bar_path = NodePath("ProgressBar") +label_path = NodePath("Label") + +[node name="ProgressBar" type="ProgressBar" parent="."] +margin_right = 352.0 +margin_bottom = 25.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +percent_visible = false + +[node name="Label" type="Label" parent="."] +margin_right = 352.0 +margin_bottom = 25.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 +valign = 1 diff --git a/game/ui/crafting/ItemEntry.gd b/game/ui/crafting/ItemEntry.gd new file mode 100644 index 0000000..b595767 --- /dev/null +++ b/game/ui/crafting/ItemEntry.gd @@ -0,0 +1,31 @@ +extends PanelContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var icon_path : NodePath +export(NodePath) var label_path : NodePath + +var _icon : TextureRect +var _label : Label + +var _entity : Entity +var _crh : CraftRecipeHelper + +func _ready(): + _icon = get_node(icon_path) as TextureRect + _label = get_node(label_path) as Label + +func set_item(entity: Entity, crh: CraftRecipeHelper) -> void: + _entity = entity + _crh = crh + + refresh() + +func refresh() -> void: + if _crh.item == null: + return + + _icon.texture = _crh.item.icon + _label.text = _crh.item.text_name + " (" + str(_crh.count) + ")" diff --git a/game/ui/crafting/ItemEntry.tscn b/game/ui/crafting/ItemEntry.tscn new file mode 100644 index 0000000..3b9026d --- /dev/null +++ b/game/ui/crafting/ItemEntry.tscn @@ -0,0 +1,45 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/crafting/ItemEntry.gd" type="Script" id=1] + +[node name="ItemEntry" type="PanelContainer"] +margin_right = 695.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 100, 60 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +icon_path = NodePath("HBoxContainer/PanelContainer/TextureRect") +label_path = NodePath("HBoxContainer/Label") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 681.0 +margin_bottom = 64.0 + +[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] +margin_right = 50.0 +margin_bottom = 50.0 +rect_min_size = Vector2( 50, 50 ) + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/PanelContainer"] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 36.0 +margin_bottom = 36.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="Label" type="Label" parent="HBoxContainer"] +margin_left = 58.0 +margin_top = 12.0 +margin_right = 667.0 +margin_bottom = 37.0 +size_flags_horizontal = 3 +text = "Spanner" +align = 1 diff --git a/game/ui/crafting/RecipeSelector.gd b/game/ui/crafting/RecipeSelector.gd new file mode 100644 index 0000000..c920db9 --- /dev/null +++ b/game/ui/crafting/RecipeSelector.gd @@ -0,0 +1,17 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +var _recipe : CraftRecipe +var _crafting_window : Node + +func set_recipe(recipe : CraftRecipe, crafting_window : Node) -> void: + _recipe = recipe + _crafting_window = crafting_window + + text = recipe.item.item.text_name + +func _pressed(): + _crafting_window.select_recipe(_recipe) diff --git a/game/ui/crafting/RecipeSelector.tscn b/game/ui/crafting/RecipeSelector.tscn new file mode 100644 index 0000000..575485a --- /dev/null +++ b/game/ui/crafting/RecipeSelector.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/crafting/RecipeSelector.gd" type="Script" id=1] + +[node name="RecipeSelector" type="Button"] +margin_right = 303.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 0, 40 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/debug/DebugInfo.gd b/game/ui/debug/DebugInfo.gd new file mode 100644 index 0000000..52655a0 --- /dev/null +++ b/game/ui/debug/DebugInfo.gd @@ -0,0 +1,61 @@ +extends Label + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _ready(): + Settings.connect("setting_changed", self, "setting_changed") + + if visible: + set_process(true) + else: + set_process(false) + +func _exit_tree(): + if Settings != null: + Settings.disconnect("setting_changed", self, "setting_changed") + +func setting_changed(section, key, value): + if section == "debug" and key == "debug_info": + if value: + show() + set_process(true) + else: + hide() + set_process(false) + +func _process(delta): + var a : String = "Fps: " + str(Performance.get_monitor(Performance.TIME_FPS)) + "\n" +# a += "time_process: " + str(Performance.get_monitor(Performance.TIME_PROCESS)) + "\n" +# a += "time_physics_process: " + str(Performance.get_monitor(Performance.TIME_PHYSICS_PROCESS)) + "\n" + a += "mem_static: " + str(Performance.get_monitor(Performance.MEMORY_STATIC)) + "\n" + a += "mem_dynamic: " + str(Performance.get_monitor(Performance.MEMORY_DYNAMIC)) + "\n" +# a += "mem_static_max: " + str(Performance.get_monitor(Performance.MEMORY_STATIC_MAX)) + "\n" +# a += "mem_dyn_max: " + str(Performance.get_monitor(Performance.MEMORY_DYNAMIC_MAX)) + "\n" +# a += "mem_msg_buf_max: " + str(Performance.get_monitor(Performance.MEMORY_MESSAGE_BUFFER_MAX)) + "\n" + a += "obj_count: " + str(Performance.get_monitor(Performance.OBJECT_COUNT)) + "\n" + a += "obj_res_count: " + str(Performance.get_monitor(Performance.OBJECT_RESOURCE_COUNT)) + "\n" + a += "obj_mode_count: " + str(Performance.get_monitor(Performance.OBJECT_NODE_COUNT)) + "\n" + a += "obj_orphan_mode_count: " + str(Performance.get_monitor(Performance.OBJECT_ORPHAN_NODE_COUNT)) + "\n" + a += "obj_in_frame: " + str(Performance.get_monitor(Performance.RENDER_OBJECTS_IN_FRAME)) + "\n" + a += "vert_in_frame: " + str(Performance.get_monitor(Performance.RENDER_VERTICES_IN_FRAME)) + "\n" + a += "mat_changes: " + str(Performance.get_monitor(Performance.RENDER_MATERIAL_CHANGES_IN_FRAME)) + "\n" + a += "shader_changes: " + str(Performance.get_monitor(Performance.RENDER_SHADER_CHANGES_IN_FRAME)) + "\n" + a += "surface_changes: " + str(Performance.get_monitor(Performance.RENDER_SURFACE_CHANGES_IN_FRAME)) + "\n" + a += "draw_calls: " + str(Performance.get_monitor(Performance.RENDER_DRAW_CALLS_IN_FRAME)) + "\n" + a += "vid_mem_used: " + str(Performance.get_monitor(Performance.RENDER_VIDEO_MEM_USED)) + "\n" +# a += "texture_mem_used: " + str(Performance.get_monitor(Performance.RENDER_TEXTURE_MEM_USED)) + "\n" +# a += "vertex_mem_used: " + str(Performance.get_monitor(Performance.RENDER_VERTEX_MEM_USED)) + "\n" +# a += "vid_mem_total: " + str(Performance.get_monitor(Performance.RENDER_USAGE_VIDEO_MEM_TOTAL)) + "\n" + +# a += "phys_2d_active_obj: " + str(Performance.get_monitor(Performance.PHYSICS_2D_ACTIVE_OBJECTS)) + "\n" +# a += "phys_2d_coll_pairs: " + str(Performance.get_monitor(Performance.PHYSICS_2D_COLLISION_PAIRS)) + "\n" +# a += "phys_2d_island_count: " + str(Performance.get_monitor(Performance.PHYSICS_2D_ISLAND_COUNT)) + "\n" +# a += "phys_3d_active_obj: " + str(Performance.get_monitor(Performance.PHYSICS_3D_ACTIVE_OBJECTS)) + "\n" +# a += "phys_3d_coll_pairs: " + str(Performance.get_monitor(Performance.PHYSICS_3D_COLLISION_PAIRS)) + "\n" +# a += "phys_3d_island_count: " + str(Performance.get_monitor(Performance.PHYSICS_3D_ISLAND_COUNT)) + "\n" +# a += "audio_output_latency: " + str(Performance.get_monitor(Performance.AUDIO_OUTPUT_LATENCY)) + "\n" + + text = a + diff --git a/game/ui/debug/DebugInfo.tscn b/game/ui/debug/DebugInfo.tscn new file mode 100644 index 0000000..dd8d0f1 --- /dev/null +++ b/game/ui/debug/DebugInfo.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/debug/DebugInfo.gd" type="Script" id=1] +[ext_resource path="res://ui/debug/debuginfo_font.tres" type="DynamicFont" id=2] + +[node name="DebugInfo" type="CanvasLayer"] +layer = 3 + +[node name="DebugInfo" type="Label" parent="."] +visible = false +anchor_bottom = 1.0 +margin_right = 301.0 +custom_fonts/font = ExtResource( 2 ) +valign = 1 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/debug/SpawnPointSimpleUI.tscn b/game/ui/debug/SpawnPointSimpleUI.tscn new file mode 100644 index 0000000..79d066d --- /dev/null +++ b/game/ui/debug/SpawnPointSimpleUI.tscn @@ -0,0 +1,101 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://networking/SpawnPoint.gd" type="Script" id=2] + + +[node name="SpawnPoint" type="Spatial"] +script = ExtResource( 2 ) +multi_player = true +gui_path = NodePath("PanelContainer") +host_button_path = NodePath("PanelContainer/VBoxContainer/host") +address_line_edit_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/address") +port_line_edit_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/port") +connect_button_path = NodePath("PanelContainer/VBoxContainer/VBoxContainer/connect") +naturalist_button_path = NodePath("PanelContainer/VBoxContainer/select naturalist") +terrarin_path = NodePath("..") + +[node name="PanelContainer" type="PanelContainer" parent="."] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -126.0 +margin_top = -169.5 +margin_right = 126.0 +margin_bottom = 169.5 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 248.0 +margin_bottom = 335.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 35 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 244.0 +margin_bottom = 140.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 4.0 + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_right = 244.0 +margin_bottom = 15.0 +text = "Ip:" + +[node name="address" type="LineEdit" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_top = 23.0 +margin_right = 244.0 +margin_bottom = 47.3413 +placeholder_text = "127.0.0.1" + +[node name="Label2" type="Label" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_top = 55.0 +margin_right = 244.0 +margin_bottom = 70.0 +text = "Port:" + +[node name="port" type="LineEdit" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_top = 78.0 +margin_right = 244.0 +margin_bottom = 102.341 +placeholder_text = "23223" + +[node name="connect" type="Button" parent="PanelContainer/VBoxContainer/VBoxContainer"] +margin_top = 110.0 +margin_right = 244.0 +margin_bottom = 140.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Connect" + +[node name="host" type="Button" parent="PanelContainer/VBoxContainer"] +margin_top = 175.0 +margin_right = 244.0 +margin_bottom = 210.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Host" + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer"] +margin_top = 245.0 +margin_right = 244.0 +margin_bottom = 260.0 +size_flags_vertical = 1 +text = "Class: (Just select for offline play):" + +[node name="select naturalist" type="Button" parent="PanelContainer/VBoxContainer"] +margin_top = 295.0 +margin_right = 244.0 +margin_bottom = 331.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Naturalist" diff --git a/game/ui/debug/debuginfo_font.tres b/game/ui/debug/debuginfo_font.tres new file mode 100644 index 0000000..550e47a --- /dev/null +++ b/game/ui/debug/debuginfo_font.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 11 +font_data = ExtResource( 1 ) diff --git a/game/ui/errorframe/ErrorFrame.tscn b/game/ui/errorframe/ErrorFrame.tscn new file mode 100644 index 0000000..8d3da0f --- /dev/null +++ b/game/ui/errorframe/ErrorFrame.tscn @@ -0,0 +1,5 @@ +[gd_scene format=2] + +[node name="ErrorFrame" type="MarginContainer"] +margin_right = 40.0 +margin_bottom = 40.0 diff --git a/game/ui/ingame_menu/ExitButton.gd b/game/ui/ingame_menu/ExitButton.gd new file mode 100644 index 0000000..8cdbb07 --- /dev/null +++ b/game/ui/ingame_menu/ExitButton.gd @@ -0,0 +1,12 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + + +func _ready(): + connect("pressed", self, "on_click") + +func on_click() -> void: + get_node("/root/Main").switch_scene(Main.StartSceneTypes.MENU) diff --git a/game/ui/ingame_menu/IngameMenu.tscn b/game/ui/ingame_menu/IngameMenu.tscn new file mode 100644 index 0000000..bae325c --- /dev/null +++ b/game/ui/ingame_menu/IngameMenu.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/options/Options.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/ingame_menu/ExitButton.gd" type="Script" id=3] +[ext_resource path="res://ui/keybinds/Keybinds.tscn" type="PackedScene" id=4] + +[node name="IngameMenu" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Menu" type="PanelContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -77.0 +margin_top = -51.0 +margin_right = 78.0 +margin_bottom = 51.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="Menu"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 151.0 +margin_bottom = 132.0 + +[node name="Resume" type="Button" parent="Menu/VBoxContainer"] +margin_right = 147.0 +margin_bottom = 26.269 +text = "Resume" + +[node name="Keybinds" type="Button" parent="Menu/VBoxContainer"] +margin_top = 34.0 +margin_right = 147.0 +margin_bottom = 60.269 +text = "Keybinds" + +[node name="Options" type="Button" parent="Menu/VBoxContainer"] +margin_top = 68.0 +margin_right = 147.0 +margin_bottom = 94.269 +text = "Options" + +[node name="Exit" type="Button" parent="Menu/VBoxContainer"] +margin_top = 102.0 +margin_right = 147.0 +margin_bottom = 128.269 +text = "Exit" +script = ExtResource( 3 ) + +[node name="Options" parent="." instance=ExtResource( 2 )] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -307.0 +margin_top = -220.0 +margin_right = 307.0 +margin_bottom = 220.0 + +[node name="KeybindWindow" parent="." instance=ExtResource( 4 )] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -426.0 +margin_top = -270.0 +margin_right = 426.0 +margin_bottom = 270.0 +[connection signal="pressed" from="Menu/VBoxContainer/Resume" to="." method="hide"] +[connection signal="pressed" from="Menu/VBoxContainer/Keybinds" to="KeybindWindow" method="show"] +[connection signal="pressed" from="Menu/VBoxContainer/Options" to="Options" method="show"] diff --git a/game/ui/keybinds/KeybindCategory.gd b/game/ui/keybinds/KeybindCategory.gd new file mode 100644 index 0000000..9a7d848 --- /dev/null +++ b/game/ui/keybinds/KeybindCategory.gd @@ -0,0 +1,9 @@ +extends VBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var keybind_entry_scene : PackedScene + +export(NodePath) var content_container_path : NodePath diff --git a/game/ui/keybinds/KeybindCategory.tscn b/game/ui/keybinds/KeybindCategory.tscn new file mode 100644 index 0000000..f66ca13 --- /dev/null +++ b/game/ui/keybinds/KeybindCategory.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/keybinds/KeybindCategory.gd" type="Script" id=1] +[ext_resource path="res://ui/keybinds/KeybindEntry.tscn" type="PackedScene" id=2] + +[node name="KeybindCategory" type="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 23.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +keybind_entry_scene = ExtResource( 2 ) +content_container_path = NodePath("VBoxContainer/content") + +[node name="Label" type="Label" parent="."] +margin_right = 1016.0 +margin_bottom = 25.0 +text = "Category" + +[node name="VBoxContainer" type="MarginContainer" parent="."] +margin_top = 33.0 +margin_right = 1016.0 +margin_bottom = 33.0 +custom_constants/margin_left = 20 + +[node name="content" type="VBoxContainer" parent="VBoxContainer"] +margin_left = 20.0 +margin_right = 1016.0 diff --git a/game/ui/keybinds/KeybindEntry.gd b/game/ui/keybinds/KeybindEntry.gd new file mode 100644 index 0000000..6d609e9 --- /dev/null +++ b/game/ui/keybinds/KeybindEntry.gd @@ -0,0 +1,23 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func query_keybind_1() -> void: + pass + +func query_keybind_2() -> void: + pass diff --git a/game/ui/keybinds/KeybindEntry.tscn b/game/ui/keybinds/KeybindEntry.tscn new file mode 100644 index 0000000..9da6f5d --- /dev/null +++ b/game/ui/keybinds/KeybindEntry.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/keybinds/KeybindEntry.gd" type="Script" id=1] + +[node name="KeybindEntry" type="HBoxContainer"] +margin_right = 996.0 +margin_bottom = 37.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_top = 6.0 +margin_right = 580.0 +margin_bottom = 31.0 +size_flags_horizontal = 3 +text = "Keybind" + +[node name="Button" type="Button" parent="."] +margin_left = 588.0 +margin_right = 788.0 +margin_bottom = 37.0 +rect_min_size = Vector2( 200, 30 ) +text = "empty" + +[node name="Button2" type="Button" parent="."] +margin_left = 796.0 +margin_right = 996.0 +margin_bottom = 37.0 +rect_min_size = Vector2( 200, 30 ) +text = "empty" +[connection signal="pressed" from="Button" to="." method="query_keybind_1"] +[connection signal="pressed" from="Button2" to="." method="query_keybind_2"] diff --git a/game/ui/keybinds/Keybinds.gd b/game/ui/keybinds/Keybinds.gd new file mode 100644 index 0000000..94cd0cf --- /dev/null +++ b/game/ui/keybinds/Keybinds.gd @@ -0,0 +1,113 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var keybind_category_scene : PackedScene + +export(NodePath) var content_container_path : NodePath + + +# Note for the reader: +# +# This demo conveniently uses the same names for actions and for the container nodes +# that hold each remapping button. This allow to get back to the button based simply +# on the name of the corresponding action, but it might not be so simple in your project. +# +# A better approach for large-scale input remapping might be to do the connections between +# buttons and wait_for_input through the code, passing as arguments both the name of the +# action and the node, e.g.: +# button.connect("pressed", self, "wait_for_input", [ button, action ]) + +# Constants +const INPUT_ACTIONS = [ "move_up", "move_down", "move_left", "move_right", "jump" ] +const CONFIG_FILE = "user://input.cfg" + +# Member variables +var action # To register the action the UI is currently handling +var button # Button node corresponding to the above action + + +# Load/save input mapping to a config file +# Changes done while testing the demo will be persistent, saved to CONFIG_FILE + +func load_config(): + var config = ConfigFile.new() + var err = config.load(CONFIG_FILE) + if err: # Assuming that file is missing, generate default config + for action_name in INPUT_ACTIONS: + var action_list = InputMap.get_action_list(action_name) + # There could be multiple actions in the list, but we save the first one by default + var scancode = OS.get_scancode_string(action_list[0].scancode) + config.set_value("input", action_name, scancode) + config.save(CONFIG_FILE) + else: # ConfigFile was properly loaded, initialize InputMap + for action_name in config.get_section_keys("input"): + # Get the key scancode corresponding to the saved human-readable string + var scancode = OS.find_scancode_from_string(config.get_value("input", action_name)) + # Create a new event object based on the saved scancode + var event = InputEventKey.new() + event.scancode = scancode + # Replace old action (key) events by the new one + for old_event in InputMap.get_action_list(action_name): + if old_event is InputEventKey: + InputMap.action_erase_event(action_name, old_event) + InputMap.action_add_event(action_name, event) + + +func save_to_config(section, key, value): + """Helper function to redefine a parameter in the settings file""" + var config = ConfigFile.new() + var err = config.load(CONFIG_FILE) + if err: + print("Error code when loading config file: ", err) + else: + config.set_value(section, key, value) + config.save(CONFIG_FILE) + + +# Input management + +func wait_for_input(action_bind): + action = action_bind + # See note at the beginning of the script + button = get_node("bindings").get_node(action).get_node("Button") + get_node("contextual_help").text = "Press a key to assign to the '" + action + "' action." + set_process_input(true) + + +func a_input(event): + # Handle the first pressed key + if event is InputEventKey: + # Register the event as handled and stop polling + get_tree().set_input_as_handled() + set_process_input(false) + # Reinitialise the contextual help label + get_node("contextual_help").text = "Click a key binding to reassign it, or press the Cancel action." + if not event.is_action("ui_cancel"): + # Display the string corresponding to the pressed key + var scancode = OS.get_scancode_string(event.scancode) + button.text = scancode + # Start by removing previously key binding(s) + for old_event in InputMap.get_action_list(action): + InputMap.action_erase_event(action, old_event) + # Add the new key binding + InputMap.action_add_event(action, event) + save_to_config("input", action, scancode) + + +func a_ready(): + # Load config if existing, if not it will be generated with default values + load_config() + # Initialise each button with the default key binding from InputMap + for action in INPUT_ACTIONS: + # We assume that the key binding that we want is the first one (0), if there are several + var input_event = InputMap.get_action_list(action)[0] + # See note at the beginning of the script + var button = get_node("bindings").get_node(action).get_node("Button") + button.text = OS.get_scancode_string(input_event.scancode) + button.connect("pressed", self, "wait_for_input", [action]) + + # Do not start processing input until a button is pressed + set_process_input(false) diff --git a/game/ui/keybinds/Keybinds.tscn b/game/ui/keybinds/Keybinds.tscn new file mode 100644 index 0000000..e6ba833 --- /dev/null +++ b/game/ui/keybinds/Keybinds.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/keybinds/Keybinds.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] +[ext_resource path="res://ui/keybinds/KeybindCategory.tscn" type="PackedScene" id=3] + +[node name="KeybindWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +keybind_category_scene = ExtResource( 3 ) +content_container_path = NodePath("VBoxContainer/ScrollContainer/Content") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 968.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Keybinds" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 976.0 +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 38.0 +margin_right = 1016.0 +margin_bottom = 554.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="Content" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"] +margin_right = 1016.0 +size_flags_horizontal = 3 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] +margin_top = 562.0 +margin_right = 1016.0 +margin_bottom = 592.0 +alignment = 2 + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 848.0 +margin_right = 928.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "Cancel" + +[node name="Button2" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 936.0 +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "OK" +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/login/Login.tscn b/game/ui/login/Login.tscn new file mode 100644 index 0000000..5e0270f --- /dev/null +++ b/game/ui/login/Login.tscn @@ -0,0 +1,88 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="Login" type="PanelContainer"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -145.0 +margin_top = -157.0 +margin_right = 110.0 +margin_bottom = 86.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 251.0 +margin_bottom = 242.0 +custom_constants/separation = 10 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 247.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 + +[node name="Label3" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 199.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Login" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 207.0 +margin_right = 247.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer"] +margin_top = 40.0 +margin_right = 247.0 +margin_bottom = 48.0 + +[node name="Label" type="Label" parent="VBoxContainer"] +margin_top = 58.0 +margin_right = 247.0 +margin_bottom = 73.0 +text = "Username" + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +margin_top = 83.0 +margin_right = 247.0 +margin_bottom = 107.341 + +[node name="Label2" type="Label" parent="VBoxContainer"] +margin_top = 117.0 +margin_right = 247.0 +margin_bottom = 132.0 +text = "Password" + +[node name="LineEdit2" type="LineEdit" parent="VBoxContainer"] +margin_top = 142.0 +margin_right = 247.0 +margin_bottom = 166.341 +secret = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer"] +margin_top = 176.0 +margin_right = 247.0 +margin_bottom = 202.269 +text = "Remember me" + +[node name="Button" type="Button" parent="VBoxContainer"] +margin_top = 212.0 +margin_right = 247.0 +margin_bottom = 238.269 +text = "Login" +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/loot_window/LootEntry.gd b/game/ui/loot_window/LootEntry.gd new file mode 100644 index 0000000..208f168 --- /dev/null +++ b/game/ui/loot_window/LootEntry.gd @@ -0,0 +1,33 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var icon_path : NodePath +export(NodePath) var label_path : NodePath + +var icon : TextureRect +var label : RichTextLabel + +var index : int +var player : Entity +var item : ItemInstance + +func _ready(): + icon = get_node(icon_path) as TextureRect + label = get_node(label_path) as RichTextLabel + + if icon == null or label == null: + Logger.error("LootEntry is not setup correctly!") + +func on_click(): + player.crequest_loot(index) + +func set_item(pindex : int, item_instance : ItemInstance, pplayer : Entity) -> void: + index = index + player = pplayer + item = item_instance + + icon.texture = item.item_template.icon + label.bbcode_text = item.item_template.text_name diff --git a/game/ui/loot_window/LootEntry.tscn b/game/ui/loot_window/LootEntry.tscn new file mode 100644 index 0000000..cd3a857 --- /dev/null +++ b/game/ui/loot_window/LootEntry.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/loot_window/LootEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] + +[node name="lootEntry" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -3.0 +margin_bottom = -3.0 +rect_min_size = Vector2( 0, 40 ) +size_flags_horizontal = 3 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +icon_path = NodePath("HBoxContainer/Button/TextureRect") +label_path = NodePath("HBoxContainer/Label") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1017.0 +margin_bottom = 593.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button" type="Button" parent="HBoxContainer"] +margin_right = 46.0 +margin_bottom = 589.0 +rect_min_size = Vector2( 46, 46 ) + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/Button"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -20.0 +margin_top = -20.0 +margin_right = 20.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 40, 40 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="RichTextLabel" parent="HBoxContainer"] +margin_left = 50.0 +margin_right = 1013.0 +margin_bottom = 589.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +bbcode_enabled = true +text = "sdfsdfsdf" +scroll_active = false +[connection signal="pressed" from="HBoxContainer/Button" to="." method="on_click"] diff --git a/game/ui/loot_window/LootWindow.gd b/game/ui/loot_window/LootWindow.gd new file mode 100644 index 0000000..a5361ab --- /dev/null +++ b/game/ui/loot_window/LootWindow.gd @@ -0,0 +1,66 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var entry_scene : PackedScene +export(NodePath) var container_path : NodePath + +var container : Node + +var player : Entity +var target_bag : Bag + +func _ready(): + container = get_node(container_path) + + connect("visibility_changed", self, "on_visibility_changed") + + if entry_scene == null: + Logger.error("LootWindow: entry_scene is null") + +func refresh(): + for child in container.get_children(): + child.queue_free() + + if target_bag == null: + return + + for i in range(target_bag.get_size()): + var ii : ItemInstance = target_bag.get_item(i) + + if ii: + var e : Node = entry_scene.instance() + + container.add_child(e) + e.owner = container + + e.set_item(i, ii, player) + +func set_player(p_player : Entity) -> void: + player = p_player + player.connect("ctarget_bag_changed", self, "ctarget_bag_changed") + +func on_visibility_changed(): + if visible: + refresh() + else: + target_bag.disconnect("item_removed", self, "on_item_removed") + target_bag = null + +func on_item_removed(bag: Bag, item: ItemInstance, slot_id: int) -> void: + refresh() + +func ctarget_bag_changed(entity: Entity, bag: Bag) -> void: + if target_bag != null: + target_bag.disconnect("item_removed", self, "on_item_removed") + target_bag = null + + target_bag = bag + + if target_bag == null: + return + + target_bag.connect("item_removed", self, "on_item_removed") + diff --git a/game/ui/loot_window/LootWindow.tscn b/game/ui/loot_window/LootWindow.tscn new file mode 100644 index 0000000..5aa5eb5 --- /dev/null +++ b/game/ui/loot_window/LootWindow.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/loot_window/LootWindow.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] +[ext_resource path="res://ui/loot_window/LootEntry.tscn" type="PackedScene" id=3] + +[node name="LootWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +entry_scene = ExtResource( 3 ) +container_path = NodePath("VBoxContainer/ScrollContainer/container") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 15.0 +text = "Loot" +align = 1 +valign = 1 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 23.0 +margin_right = 1016.0 +margin_bottom = 558.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="container" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"] +margin_right = 1016.0 +size_flags_horizontal = 3 + +[node name="Button" type="Button" parent="VBoxContainer"] +margin_top = 566.0 +margin_right = 1016.0 +margin_bottom = 592.269 +text = "close" +[connection signal="pressed" from="VBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/map/Map.tscn b/game/ui/map/Map.tscn new file mode 100644 index 0000000..4067832 --- /dev/null +++ b/game/ui/map/Map.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="Map" type="PanelContainer"] +margin_left = 55.5336 +margin_top = 55.5336 +margin_right = 821.534 +margin_bottom = 545.534 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 762.0 +margin_bottom = 486.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 758.0 +margin_bottom = 40.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 12.0 +margin_right = 710.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 +text = "Map" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 718.0 +margin_right = 758.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 40, 40 ) +text = "X" + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 48.0 +margin_right = 758.0 +margin_bottom = 482.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="TextureRect" type="TextureRect" parent="VBoxContainer/ScrollContainer"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/minimap/MiniMap.tscn b/game/ui/minimap/MiniMap.tscn new file mode 100644 index 0000000..b9cf302 --- /dev/null +++ b/game/ui/minimap/MiniMap.tscn @@ -0,0 +1,11 @@ +[gd_scene format=2] + +[node name="MiniMap" type="MarginContainer"] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -196.0 +margin_bottom = 189.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/nameplates/NamePlate.tscn b/game/ui/nameplates/NamePlate.tscn new file mode 100644 index 0000000..e62c202 --- /dev/null +++ b/game/ui/nameplates/NamePlate.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/nameplates/name_plate_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/nameplates/texture_progress_fg.tres" type="Texture" id=2] +[ext_resource path="res://player/NamePlate.gd" type="Script" id=3] + +[node name="NamePlate" type="VBoxContainer"] +margin_right = 62.0 +margin_bottom = 17.0 +rect_scale = Vector2( 0.75, 0.75 ) +mouse_filter = 2 +theme = ExtResource( 1 ) +custom_constants/separation = 0 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +health_bar_path = NodePath("MarginContainer/TextureProgress") +health_bar_label_path = NodePath("MarginContainer/CenterContainer/Label") +normal_color = Color( 0.74902, 0.74902, 0.74902, 1 ) +mouseover_scale = Vector2( 0.75, 0.75 ) + +[node name="Name" type="Label" parent="."] +margin_right = 62.0 +margin_bottom = 15.0 +custom_constants/line_spacing = 0 +text = "Asda" +align = 1 +valign = 1 + +[node name="MarginContainer" type="MarginContainer" parent="."] +margin_top = 15.0 +margin_right = 62.0 +margin_bottom = 17.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 2.3 + +[node name="TextureProgress" type="TextureProgress" parent="MarginContainer"] +margin_right = 62.0 +margin_bottom = 2.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +value = 50.0 +texture_under = ExtResource( 2 ) +texture_progress = ExtResource( 2 ) +tint_under = Color( 0.219608, 0.215686, 0.215686, 0.756863 ) +tint_progress = Color( 0.917647, 0.0117647, 0.0117647, 1 ) +nine_patch_stretch = true +stretch_margin_left = 1 +stretch_margin_top = 1 +stretch_margin_right = 1 +stretch_margin_bottom = 1 + +[node name="CenterContainer" type="CenterContainer" parent="MarginContainer"] +visible = false +margin_right = 62.0 +margin_bottom = 2.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="MarginContainer/CenterContainer"] +visible = false +margin_left = 22.0 +margin_top = -7.0 +margin_right = 40.0 +margin_bottom = 8.0 +text = "50%" diff --git a/game/ui/nameplates/name_plate_dynamicfont.tres b/game/ui/nameplates/name_plate_dynamicfont.tres new file mode 100644 index 0000000..d3f2869 --- /dev/null +++ b/game/ui/nameplates/name_plate_dynamicfont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 14 +font_data = ExtResource( 1 ) diff --git a/game/ui/nameplates/name_plate_theme.tres b/game/ui/nameplates/name_plate_theme.tres new file mode 100644 index 0000000..83e5895 --- /dev/null +++ b/game/ui/nameplates/name_plate_theme.tres @@ -0,0 +1,36 @@ +[gd_resource type="Theme" load_steps=4 format=2] + +[ext_resource path="res://ui/nameplates/name_plate_dynamicfont.tres" type="DynamicFont" id=1] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.0627451, 0.0627451, 0.0627451, 0.823529 ) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 +anti_aliasing = false + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 0.647059, 0, 0, 1 ) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 +anti_aliasing = false + +[resource] +default_font = ExtResource( 1 ) +Label/colors/font_color = Color( 1, 1, 1, 1 ) +Label/colors/font_color_shadow = Color( 0, 0, 0, 0 ) +Label/colors/font_outline_modulate = Color( 1, 1, 1, 1 ) +Label/constants/line_spacing = 6 +Label/constants/shadow_as_outline = 0 +Label/constants/shadow_offset_x = 0 +Label/constants/shadow_offset_y = 0 +Label/fonts/font = null +Label/styles/normal = null +ProgressBar/colors/font_color = Color( 0.94, 0.94, 0.94, 1 ) +ProgressBar/colors/font_color_shadow = Color( 0, 0, 0, 1 ) +ProgressBar/fonts/font = null +ProgressBar/styles/bg = SubResource( 1 ) +ProgressBar/styles/fg = SubResource( 2 ) diff --git a/game/ui/nameplates/texture_progress_bg.tres b/game/ui/nameplates/texture_progress_bg.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/nameplates/texture_progress_bg.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/nameplates/texture_progress_fg.tres b/game/ui/nameplates/texture_progress_fg.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/nameplates/texture_progress_fg.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/numbers/Number.gd b/game/ui/numbers/Number.gd new file mode 100644 index 0000000..66a3688 --- /dev/null +++ b/game/ui/numbers/Number.gd @@ -0,0 +1,71 @@ +extends Label + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var animation_player_path : NodePath = "AnimationPlayer" + +export(Color) var damage_color : Color = Color.yellow +export(Color) var heal_color : Color = Color.green + +var world_position : Vector3 = Vector3() +var animation_player : AnimationPlayer = null +var camera : Camera = null + +func _ready() -> void: + animation_player = get_node(animation_player_path) as AnimationPlayer + + animation_player.connect("animation_finished", self, "animation_finished") + + set_process(false) + +func _process(delta): + if camera == null: + return + + var cam_pos : Vector3 = camera.global_transform.xform(Vector3()) + var dstv : Vector3 = cam_pos - world_position + dstv.y = 0 +# var dst : float = dstv.length_squared() + + var cam_facing : Vector3 = -camera.global_transform.basis.z + var d : float = cam_facing.dot(dstv) + + if d > 0: + if visible: + hide() + return + else: + if not visible: + show() + + var screen_position : Vector2 = camera.unproject_position(world_position) + var new_pos : Vector2 = Vector2(screen_position.x + rect_position.x, screen_position.y + rect_position.y - 60) + + set_position(new_pos) + + +func damage(pos : Vector3, value : int, crit : bool) -> void: + setup(pos, damage_color, value, crit) + +func heal(pos : Vector3, value : int, crit : bool) -> void: + setup(pos, heal_color, value, crit) + +func setup(pos : Vector3, color : Color, value : int, crit : bool) -> void: + world_position = pos + + camera = get_tree().get_root().get_camera() as Camera + + text = str(value) + add_color_override("font_color", color) + + if crit: + animation_player.play("crit") + else: + animation_player.play("normal") + + set_process(true) + +func animation_finished(anim_name : String) -> void: + queue_free() diff --git a/game/ui/numbers/Number.tscn b/game/ui/numbers/Number.tscn new file mode 100644 index 0000000..c9dc9dd --- /dev/null +++ b/game/ui/numbers/Number.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/numbers/Number.gd" type="Script" id=1] +[ext_resource path="res://ui/numbers/number_font.tres" type="DynamicFont" id=2] + +[sub_resource type="Animation" id=1] +resource_name = "crit" +length = 1.5 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.05, 0.3, 1.5 ), +"transitions": PoolRealArray( 1, 0.307786, 1, 1.36604 ), +"update": 0, +"values": [ Vector2( 0.1, 0.1 ), Vector2( 1.5, 1.5 ), Vector2( 1.3, 1.3 ), Vector2( 1.3, 1.3 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:rect_position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.6, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1 ), +"update": 0, +"values": [ Vector2( -50, 20 ), Vector2( -50, 20 ), Vector2( -50, 10 ) ] +} +tracks/2/type = "value" +tracks/2/path = NodePath(".:modulate") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0, 1.2, 1.5 ), +"transitions": PoolRealArray( 1, 1, 4 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[sub_resource type="Animation" id=2] +resource_name = "normal" +length = 2.0 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -50, 20 ), Vector2( -50, 0 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath(".:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 1.5, 2 ), +"transitions": PoolRealArray( 1, 1, 4 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[node name="Number" type="Label"] +modulate = Color( 1, 1, 1, 0 ) +margin_left = -50.0 +margin_right = 50.0 +margin_bottom = 40.0006 +rect_scale = Vector2( 1.3, 1.3 ) +rect_pivot_offset = Vector2( 50, 20 ) +custom_fonts/font = ExtResource( 2 ) +custom_colors/font_color = Color( 0.870588, 0.898039, 0.0117647, 1 ) +align = 1 +valign = 1 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/crit = SubResource( 1 ) +anims/normal = SubResource( 2 ) diff --git a/game/ui/numbers/number_font.tres b/game/ui/numbers/number_font.tres new file mode 100644 index 0000000..80d3023 --- /dev/null +++ b/game/ui/numbers/number_font.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 12 +font_data = ExtResource( 1 ) diff --git a/game/ui/options/OptionCheckBox.gd b/game/ui/options/OptionCheckBox.gd new file mode 100644 index 0000000..74e795f --- /dev/null +++ b/game/ui/options/OptionCheckBox.gd @@ -0,0 +1,17 @@ +extends CheckBox + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(String) var property_category : String +export(String) var property_name : String + +func _ready() -> void: + var p : bool = Settings.get_value(property_category, property_name) as bool + + if p != pressed: + pressed = p + +func _toggled(button_pressed : bool) -> void: + Settings.set_value(property_category, property_name, button_pressed) diff --git a/game/ui/options/OptionRow.gd b/game/ui/options/OptionRow.gd new file mode 100644 index 0000000..da60344 --- /dev/null +++ b/game/ui/options/OptionRow.gd @@ -0,0 +1,9 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(String) var property_category : String +export(String) var property_name : String + diff --git a/game/ui/options/Options.tscn b/game/ui/options/Options.tscn new file mode 100644 index 0000000..e3f910f --- /dev/null +++ b/game/ui/options/Options.tscn @@ -0,0 +1,128 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/player_ui/RemoveProfile.gd" type="Script" id=2] +[ext_resource path="res://ui/options/OptionRow.gd" type="Script" id=3] +[ext_resource path="res://ui/options/Threads.gd" type="Script" id=4] +[ext_resource path="res://ui/options/OptionCheckBox.gd" type="Script" id=5] + +[node name="Options" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PanelContainer" type="PanelContainer" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -271.5 +margin_top = -236.5 +margin_right = 271.5 +margin_bottom = 236.5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 539.0 +margin_bottom = 469.0 + +[node name="TabContainer" type="TabContainer" parent="PanelContainer/VBoxContainer"] +margin_right = 535.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tab_align = 0 + +[node name="Video" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 30.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 + +[node name="Threads2" type="HBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer/Video"] +visible = false +margin_right = 519.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +script = ExtResource( 3 ) +property_category = "rendering/threads" +property_name = "thread_model" + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/TabContainer/Video/Threads2"] +margin_top = 5.0 +margin_right = 255.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "asd" + +[node name="Button" type="Button" parent="PanelContainer/VBoxContainer/TabContainer/Video/Threads2"] +margin_left = 263.0 +margin_right = 519.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +text = "tb" + +[node name="Threads" type="HBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer/Video"] +margin_right = 527.0 +margin_bottom = 26.0 +size_flags_horizontal = 3 +script = ExtResource( 4 ) + +[node name="Label" type="Label" parent="PanelContainer/VBoxContainer/TabContainer/Video/Threads"] +margin_top = 5.0 +margin_right = 259.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "Thread Model" + +[node name="OptionButton" type="OptionButton" parent="PanelContainer/VBoxContainer/TabContainer/Video/Threads"] +margin_left = 267.0 +margin_right = 527.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +align = 1 +expand_icon = true + +[node name="Debug" type="VBoxContainer" parent="PanelContainer/VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 30.0 +margin_right = -4.0 +margin_bottom = -4.0 +size_flags_horizontal = 3 + +[node name="DebugInfo" type="CheckBox" parent="PanelContainer/VBoxContainer/TabContainer/Debug"] +margin_right = 527.0 +margin_bottom = 26.269 +text = "Show Debug info" +script = ExtResource( 5 ) +property_category = "debug" +property_name = "debug_info" + +[node name="RemoveProfile" type="Button" parent="PanelContainer/VBoxContainer/TabContainer/Debug"] +margin_top = 34.0 +margin_right = 527.0 +margin_bottom = 60.269 +size_flags_horizontal = 3 +text = "Remove Profile" +script = ExtResource( 2 ) + +[node name="Close" type="Button" parent="PanelContainer/VBoxContainer"] +margin_top = 439.0 +margin_right = 535.0 +margin_bottom = 465.269 +text = "Close" +[connection signal="pressed" from="PanelContainer/VBoxContainer/Close" to="." method="hide"] diff --git a/game/ui/options/Threads.gd b/game/ui/options/Threads.gd new file mode 100644 index 0000000..1a09917 --- /dev/null +++ b/game/ui/options/Threads.gd @@ -0,0 +1,19 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func _ready(): + var ob : OptionButton = $OptionButton as OptionButton + + ob.add_item("Single-Unsafe", 0) + ob.add_item("Single-Safe", 1) + ob.add_item("Multi Threaded", 2) + + ob.selected = Settings.get_value("rendering", "thread_model") + + ob.connect("item_selected", self, "item_selected") + +func item_selected(id : int) -> void: + Settings.set_value("rendering", "thread_model", id) diff --git a/game/ui/player_ui/RemoveProfile.gd b/game/ui/player_ui/RemoveProfile.gd new file mode 100644 index 0000000..fbfe351 --- /dev/null +++ b/game/ui/player_ui/RemoveProfile.gd @@ -0,0 +1,21 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + connect("pressed", self, "_on_pressed") + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func _on_pressed(): + var d : Directory = Directory.new() + d.remove("user://profile.save") diff --git a/game/ui/player_ui/player_ui.gd b/game/ui/player_ui/player_ui.gd new file mode 100644 index 0000000..0c7e232 --- /dev/null +++ b/game/ui/player_ui/player_ui.gd @@ -0,0 +1,15 @@ +extends CanvasLayer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var loot_window_path : NodePath +var loot_window : Control + +func _ready(): + loot_window = get_node(loot_window_path) as Control + +func _on_Player_onc_open_loot_winow_request() -> void: + if loot_window != null: + loot_window.show() diff --git a/game/ui/player_ui/player_ui.tscn b/game/ui/player_ui/player_ui.tscn new file mode 100644 index 0000000..60391ff --- /dev/null +++ b/game/ui/player_ui/player_ui.tscn @@ -0,0 +1,432 @@ +[gd_scene load_steps=28 format=2] + +[ext_resource path="res://player/GUI.gd" type="Script" id=1] +[ext_resource path="res://ui/ingame_menu/IngameMenu.tscn" type="PackedScene" id=2] +[ext_resource path="res://player/Unitframes.gd" type="Script" id=3] +[ext_resource path="res://ui/errorframe/ErrorFrame.tscn" type="PackedScene" id=4] +[ext_resource path="res://ui/auraframe/AuraFrame.tscn" type="PackedScene" id=5] +[ext_resource path="res://ui/map/Map.tscn" type="PackedScene" id=6] +[ext_resource path="res://ui/touch_pad/TurnPanel.gd" type="Script" id=7] +[ext_resource path="res://ui/actionbars/Actionbars.gd" type="Script" id=8] +[ext_resource path="res://ui/buttons/Buttons.gd" type="Script" id=9] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=10] +[ext_resource path="res://ui/windows/TalentWindow.tscn" type="PackedScene" id=11] +[ext_resource path="res://ui/unitframes/TargetUnitframe.tscn" type="PackedScene" id=12] +[ext_resource path="res://ui/touch_pad/analog.tscn" type="PackedScene" id=13] +[ext_resource path="res://ui/actionbars/ActionBar.tscn" type="PackedScene" id=14] +[ext_resource path="res://ui/bags/Bag.tscn" type="PackedScene" id=15] +[ext_resource path="res://ui/castbar/Castbar.tscn" type="PackedScene" id=16] +[ext_resource path="res://ui/windows/SpellBookWindow.tscn" type="PackedScene" id=17] +[ext_resource path="res://ui/minimap/MiniMap.tscn" type="PackedScene" id=18] +[ext_resource path="res://ui/loot_window/LootWindow.tscn" type="PackedScene" id=19] +[ext_resource path="res://ui/windows/CraftingWindow.tscn" type="PackedScene" id=20] +[ext_resource path="res://ui/unitframes/UnitframeBase.tscn" type="PackedScene" id=21] +[ext_resource path="res://ui/starmap/StarMap.tscn" type="PackedScene" id=22] +[ext_resource path="res://ui/theme/spellbook_icon.tres" type="Texture" id=23] +[ext_resource path="res://ui/theme/bag_icon.tres" type="Texture" id=24] +[ext_resource path="res://ui/theme/locked_icon.tres" type="Texture" id=25] +[ext_resource path="res://ui/theme/unlocked_icon.tres" type="Texture" id=26] +[ext_resource path="res://ui/player_ui/player_ui.gd" type="Script" id=28] + +[node name="GUILayer" type="CanvasLayer"] +script = ExtResource( 28 ) +loot_window_path = NodePath("GUI/Windows/LootWindow") + +[node name="GUI" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +theme = ExtResource( 10 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} +player_path = NodePath("../..") +child_controls = [ NodePath("Unitframes"), NodePath("Actionbars"), NodePath("Windows/SpellBookWindow"), NodePath("Buttons"), NodePath("Castbar"), NodePath("AuraFrame"), NodePath("Windows/Inventory"), NodePath("Windows/LootWindow"), NodePath("Windows/TalentWindow"), NodePath("Windows/CraftingWindow") ] + +[node name="TouchTargetControls" type="MarginContainer" parent="GUI"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 272 +custom_constants/margin_top = 481 +custom_constants/margin_left = 60 +custom_constants/margin_bottom = 41 +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} + +[node name="HBoxContainer" type="HBoxContainer" parent="GUI/TouchTargetControls"] +margin_left = 60.0 +margin_top = 481.0 +margin_right = 752.0 +margin_bottom = 559.0 +mouse_filter = 2 +size_flags_horizontal = 7 +size_flags_vertical = 7 + +[node name="Control" type="Control" parent="GUI/TouchTargetControls/HBoxContainer"] +margin_right = 603.0 +margin_bottom = 78.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 12.0 + +[node name="TargetPad" type="Control" parent="GUI/TouchTargetControls/HBoxContainer"] +margin_left = 611.0 +margin_right = 692.0 +margin_bottom = 78.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 1.6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Analog" parent="GUI/TouchTargetControls/HBoxContainer/TargetPad" instance=ExtResource( 13 )] +position = Vector2( 40, 30 ) +listenerNodePath = NodePath("../../../../../..") +padname = "TargetPad" + +[node name="TouchMovementControls" type="MarginContainer" parent="GUI"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 100 +custom_constants/margin_top = 200 +custom_constants/margin_left = 60 +custom_constants/margin_bottom = 50 +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} + +[node name="HBoxContainer" type="HBoxContainer" parent="GUI/TouchMovementControls"] +margin_left = 60.0 +margin_top = 200.0 +margin_right = 924.0 +margin_bottom = 550.0 +mouse_filter = 2 +size_flags_horizontal = 7 +size_flags_vertical = 7 + +[node name="TouchPad" type="Control" parent="GUI/TouchMovementControls/HBoxContainer"] +margin_right = 203.0 +margin_bottom = 350.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 + +[node name="Analog" parent="GUI/TouchMovementControls/HBoxContainer/TouchPad" instance=ExtResource( 13 )] +position = Vector2( 100, 290 ) +listenerNodePath = NodePath("../../../../../..") +padname = "TouchPad" + +[node name="Control" type="Control" parent="GUI/TouchMovementControls/HBoxContainer"] +margin_left = 207.0 +margin_right = 533.0 +margin_bottom = 350.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 1.6 + +[node name="TurnPanel" type="Control" parent="GUI/TouchMovementControls/HBoxContainer"] +margin_left = 537.0 +margin_right = 864.0 +margin_bottom = 350.0 +mouse_filter = 2 +size_flags_horizontal = 15 +size_flags_vertical = 15 +size_flags_stretch_ratio = 1.6 + +[node name="Node2D" type="Node2D" parent="GUI/TouchMovementControls/HBoxContainer/TurnPanel"] +position = Vector2( -600, -200 ) +script = ExtResource( 7 ) + +[node name="Buttons" type="Control" parent="GUI"] +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = -202.0 +margin_top = -45.0 +margin_right = 140.0 +mouse_filter = 2 +script = ExtResource( 9 ) +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": false +} +spell_book_path = NodePath("../Windows/SpellBookWindow") +spell_book_button_path = NodePath("HBoxContainer/SpellBookButton") +lock_button_path = NodePath("HBoxContainer/LockButton") + +[node name="HBoxContainer" type="HBoxContainer" parent="GUI/Buttons"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/separation = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SpellBookButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_right = 45.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "SpellBook" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true + +[node name="TextureRect" type="TextureRect" parent="GUI/Buttons/HBoxContainer/SpellBookButton"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -15.0 +margin_top = -15.0 +margin_right = 15.0 +margin_bottom = 15.0 +texture = ExtResource( 23 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="BagButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 45.0 +margin_right = 90.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true + +[node name="TextureRect2" type="TextureRect" parent="GUI/Buttons/HBoxContainer/BagButton"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -15.0 +margin_top = -15.0 +margin_right = 15.0 +margin_bottom = 15.0 +texture = ExtResource( 24 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TalentButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 90.0 +margin_right = 135.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true +text = "T" + +[node name="CraftingButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 135.0 +margin_right = 180.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true +text = "Cr" + +[node name="MapButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +visible = false +margin_left = 180.0 +margin_right = 225.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +hint_tooltip = "Inventory" +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true +text = "Map" + +[node name="LockButton" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 180.0 +margin_right = 225.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +focus_mode = 0 +toggle_mode = true +enabled_focus_mode = 0 +keep_pressed_outside = true + +[node name="locked" type="TextureRect" parent="GUI/Buttons/HBoxContainer/LockButton"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -15.0 +margin_top = -15.0 +margin_right = 15.0 +margin_bottom = 15.0 +texture = ExtResource( 25 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="unlocked" type="TextureRect" parent="GUI/Buttons/HBoxContainer/LockButton"] +visible = false +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -15.0 +margin_top = -15.0 +margin_right = 15.0 +margin_bottom = 15.0 +texture = ExtResource( 26 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Menu" type="Button" parent="GUI/Buttons/HBoxContainer"] +margin_left = 225.0 +margin_right = 270.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) +focus_mode = 0 +enabled_focus_mode = 0 +keep_pressed_outside = true +text = "M" + +[node name="Actionbars" type="HBoxContainer" parent="GUI"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 0 +alignment = 2 +script = ExtResource( 8 ) +__meta__ = { +"_edit_use_anchors_": false +} +actionbar_scene = ExtResource( 14 ) + +[node name="Windows" type="CanvasLayer" parent="GUI"] +layer = 2 + +[node name="SpellBookWindow" parent="GUI/Windows" instance=ExtResource( 17 )] +visible = false +margin_left = 60.0 +margin_top = 50.0 +margin_right = 561.0 + +[node name="TalentWindow" parent="GUI/Windows" instance=ExtResource( 11 )] +visible = false +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 61.685 +margin_top = 54.195 +margin_right = 430.685 +margin_bottom = 513.195 + +[node name="CraftingWindow" parent="GUI/Windows" instance=ExtResource( 20 )] +visible = false +margin_left = 31.0 +margin_top = 23.0 +margin_right = -345.0 +margin_bottom = -67.0 + +[node name="Inventory" parent="GUI/Windows" instance=ExtResource( 15 )] +visible = false +margin_left = 56.0 +margin_top = 69.0 +margin_right = -422.0 +margin_bottom = -109.0 +inventory_item_container_path = NodePath("../Inventory/VBoxContainer/HBoxContainer3/PanelContainer2/VBoxContainer/ScrollContainer/GridContainer") + +[node name="LootWindow" parent="GUI/Windows" instance=ExtResource( 19 )] +visible = false +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 39.0 +margin_top = 85.0 +margin_right = 242.0 +margin_bottom = 315.0 + +[node name="StarMap" parent="GUI/Windows" instance=ExtResource( 22 )] +visible = false + +[node name="Map" parent="GUI/Windows" instance=ExtResource( 6 )] +visible = false + +[node name="Unitframes" type="Control" parent="GUI"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 1.0 +margin_right = 1.0 +mouse_filter = 2 +script = ExtResource( 3 ) +__meta__ = { +"_edit_lock_": true +} +player_unit_frame_path = NodePath("PlayerUnitFrame") +target_unit_frame_path = NodePath("TargetUnitframe") + +[node name="PlayerUnitFrame" parent="GUI/Unitframes" instance=ExtResource( 21 )] +margin_right = 151.0 + +[node name="TargetUnitframe" parent="GUI/Unitframes" instance=ExtResource( 12 )] +visible = false + +[node name="MiniMap" parent="GUI" instance=ExtResource( 18 )] + +[node name="AuraFrame" parent="GUI" instance=ExtResource( 5 )] +margin_left = -331.0 +margin_bottom = 123.0 + +[node name="Castbar" parent="GUI" instance=ExtResource( 16 )] +visible = false +margin_left = 382.0 +margin_top = 461.0 +margin_right = 607.0 +margin_bottom = 480.0 +mouse_filter = 2 + +[node name="ErrorFrame" parent="GUI" instance=ExtResource( 4 )] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -191.728 +margin_top = 140.333 +margin_right = 180.272 +margin_bottom = 288.333 +mouse_filter = 2 + +[node name="IngameMenu" parent="GUI" instance=ExtResource( 2 )] +visible = false +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/BagButton" to="GUI/Windows/Inventory" method="show"] +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/TalentButton" to="GUI/Windows/TalentWindow" method="show"] +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/CraftingButton" to="GUI/Windows/CraftingWindow" method="show"] +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/MapButton" to="GUI/Windows/Map" method="show"] +[connection signal="pressed" from="GUI/Buttons/HBoxContainer/Menu" to="GUI/IngameMenu" method="show"] diff --git a/game/ui/register/Register.tscn b/game/ui/register/Register.tscn new file mode 100644 index 0000000..2f36a84 --- /dev/null +++ b/game/ui/register/Register.tscn @@ -0,0 +1,114 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="Register" type="PanelContainer"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -107.5 +margin_top = -182.0 +margin_right = 107.5 +margin_bottom = 182.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 211.0 +margin_bottom = 360.0 +custom_constants/separation = 10 +alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 207.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 + +[node name="Label3" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 159.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Register" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 167.0 +margin_right = 207.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer"] +margin_top = 40.0 +margin_right = 207.0 +margin_bottom = 48.0 + +[node name="Label" type="Label" parent="VBoxContainer"] +margin_top = 58.0 +margin_right = 207.0 +margin_bottom = 73.0 +text = "Username" + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer"] +margin_top = 83.0 +margin_right = 207.0 +margin_bottom = 107.341 + +[node name="Label4" type="Label" parent="VBoxContainer"] +margin_top = 117.0 +margin_right = 207.0 +margin_bottom = 132.0 +text = "Email" + +[node name="LineEdit4" type="LineEdit" parent="VBoxContainer"] +margin_top = 142.0 +margin_right = 207.0 +margin_bottom = 166.341 + +[node name="Label2" type="Label" parent="VBoxContainer"] +margin_top = 176.0 +margin_right = 207.0 +margin_bottom = 191.0 +text = "Password" + +[node name="LineEdit2" type="LineEdit" parent="VBoxContainer"] +margin_top = 201.0 +margin_right = 207.0 +margin_bottom = 225.341 +secret = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label3" type="Label" parent="VBoxContainer"] +margin_top = 235.0 +margin_right = 207.0 +margin_bottom = 250.0 +text = "Password Again" + +[node name="LineEdit3" type="LineEdit" parent="VBoxContainer"] +margin_top = 260.0 +margin_right = 207.0 +margin_bottom = 284.341 +secret = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer"] +margin_top = 294.0 +margin_right = 207.0 +margin_bottom = 320.269 +text = "I Accept the EULA" + +[node name="Button" type="Button" parent="VBoxContainer"] +margin_top = 330.0 +margin_right = 207.0 +margin_bottom = 356.269 +text = "Register" +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/spellbook/SpellEntryPopup.gd b/game/ui/spellbook/SpellEntryPopup.gd new file mode 100644 index 0000000..c98fa4b --- /dev/null +++ b/game/ui/spellbook/SpellEntryPopup.gd @@ -0,0 +1,27 @@ +extends PopupPanel + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var label_path : NodePath +export(NodePath) var desc_label_path : NodePath + +var _label : Label +var _desc_label : RichTextLabel + +var _spell : Spell + +func _ready(): + _label = get_node(label_path) as Label + _desc_label = get_node(desc_label_path) as RichTextLabel + +func set_spell(spell : Spell) -> void: + _spell = spell + + if _spell == null: + return + + _label.text = _spell.text_name + _desc_label.text = _spell.text_description + diff --git a/game/ui/starmap/StarMap.tscn b/game/ui/starmap/StarMap.tscn new file mode 100644 index 0000000..b2a6bfb --- /dev/null +++ b/game/ui/starmap/StarMap.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="StarMap" type="PanelContainer"] +margin_right = 531.0 +margin_bottom = 442.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 527.0 +margin_bottom = 438.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 523.0 +margin_bottom = 40.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 12.0 +margin_right = 475.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 +text = "Starmap" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 483.0 +margin_right = 523.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 40, 40 ) +text = "X" + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +margin_top = 48.0 +margin_right = 523.0 +margin_bottom = 396.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="TextureRect" type="TextureRect" parent="VBoxContainer/ScrollContainer"] + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"] +margin_top = 404.0 +margin_right = 523.0 +margin_bottom = 434.0 +alignment = 1 + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 133.0 +margin_right = 213.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "Search" + +[node name="Button2" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 221.0 +margin_right = 301.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "Custom" + +[node name="Button3" type="Button" parent="VBoxContainer/HBoxContainer2"] +margin_left = 309.0 +margin_right = 389.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 80, 30 ) +text = "Go" +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Button" to="." method="hide"] diff --git a/game/ui/talents/Spec.gd b/game/ui/talents/Spec.gd new file mode 100644 index 0000000..3493d71 --- /dev/null +++ b/game/ui/talents/Spec.gd @@ -0,0 +1,35 @@ +extends ScrollContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var talent_row_scene : PackedScene +export(NodePath) var container_path : NodePath + +var _container : Node + +var _player : Entity +var _spec : CharacterSpec +var _spec_index : int + +func _ready() -> void: + _container = get_node(container_path) + +func set_spec(player : Entity, spec : CharacterSpec, spec_index: int) -> void: + for ch in _container.get_children(): + ch.queue_free() + + _player = player + _spec = spec + _spec_index = spec_index + + if _player == null or _spec == null: + return + + for i in range(spec.get_num_talent_rows()): + var r : Node = talent_row_scene.instance() + _container.add_child(r) + r.owner = self + r.set_player(player, spec, spec_index, i) + diff --git a/game/ui/talents/Spec.tscn b/game/ui/talents/Spec.tscn new file mode 100644 index 0000000..18b157a --- /dev/null +++ b/game/ui/talents/Spec.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/talents/Spec.gd" type="Script" id=1] +[ext_resource path="res://ui/talents/TalentRow.tscn" type="PackedScene" id=2] + +[node name="Spec" type="ScrollContainer"] +margin_right = 882.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +talent_row_scene = ExtResource( 2 ) +container_path = NodePath("Container") + +[node name="Container" type="VBoxContainer" parent="."] +margin_right = 858.0 +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/talents/TalentEntry.gd b/game/ui/talents/TalentEntry.gd new file mode 100644 index 0000000..0cd341a --- /dev/null +++ b/game/ui/talents/TalentEntry.gd @@ -0,0 +1,109 @@ +extends CenterContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var main_container_path : NodePath +export(NodePath) var popup_path : NodePath + +export(NodePath) var aura_name_label_path : NodePath +export(NodePath) var aura_description_label_path : NodePath +export(NodePath) var icon_rect_path : NodePath +export(NodePath) var rank_label_path : NodePath +export(NodePath) var upgrade_button_path : NodePath + +export(int) var culomn : int + +var _main_container : Control +var _popup : PopupPanel + +var _aura_name_label : Label +var _aura_description_label : Label +var _icon_rect : TextureRect +var _rank_label : Label +var _upgrade_button : Button + +var _row : int +var _spec_index : int + +var _player : Entity +var _spec : CharacterSpec + +func _ready() -> void: + _main_container = get_node(main_container_path) as Control + _popup = get_node(popup_path) as PopupPanel + + _aura_name_label = get_node(aura_name_label_path) as Label + _aura_description_label = get_node(aura_description_label_path) as Label + _icon_rect = get_node(icon_rect_path) as TextureRect + _rank_label = get_node(rank_label_path) as Label + _upgrade_button = get_node(upgrade_button_path) as Button + +func set_player(player : Entity, spec : CharacterSpec, spec_index : int, row : int) -> void: + if _player != null: + _player.disconnect("ctalent_learned", self, "ctalent_learned") + _player.disconnect("ctalent_reset", self, "ctalent_reset") + + _row = row + _spec = spec + _player = player + _spec_index = spec_index + + _player.connect("ctalent_learned", self, "ctalent_learned") + _player.connect("ctalent_reset", self, "ctalent_reset") + + refresh() + + +func refresh() -> void: + var tr : TalentRowData = _spec.get_talent_row(_row) + + if tr.get_talent(culomn, 0) == null: + _main_container.hide() + return + + var rank_count : int = 0 + var known_rank_count : int = 0 + + for i in range(TalentRowData.MAX_TALENTS_PER_ENTRY): + var a : Aura = tr.get_talent(culomn, i) + + if a == null: + break + + if _player.hasc_talent(a.id): + known_rank_count += 1 + + rank_count += 1 + + var ridx : int = known_rank_count - 1 + + if rank_count == known_rank_count: + _upgrade_button.hide() + else: + ridx += 1 + + _upgrade_button.show() + + var aura : Aura = tr.get_talent(culomn, ridx) + + _aura_name_label.text = aura.text_name + _aura_description_label.text = aura.text_description + _icon_rect.texture = aura.icon + _rank_label.text = str(known_rank_count) + "/" + str(rank_count) + +func open_popup() -> void: + var p : Vector2 = rect_global_position + p.x += rect_size.x + + _popup.popup(Rect2(p, _popup.rect_size)) + +func upgrade(): + _player.crequest_talent_learn(_spec_index, _row, culomn) + +func ctalent_learned(entity: Entity, talent_id: int) -> void: + refresh() + +func ctalent_reset(entity: Entity) -> void: + refresh() diff --git a/game/ui/talents/TalentEntry.tscn b/game/ui/talents/TalentEntry.tscn new file mode 100644 index 0000000..7878372 --- /dev/null +++ b/game/ui/talents/TalentEntry.tscn @@ -0,0 +1,110 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/talents/TalentEntry.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] + +[node name="TalentEntry" type="CenterContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 45, 45 ) +size_flags_horizontal = 3 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +main_container_path = NodePath("Button") +popup_path = NodePath("Button/PopupPanel") +aura_name_label_path = NodePath("Button/PopupPanel/VBoxContainer/HBoxContainer/Label") +aura_description_label_path = NodePath("Button/PopupPanel/VBoxContainer/Label") +icon_rect_path = NodePath("Button/MarginContainer/TextureRect") +rank_label_path = NodePath("Button/MarginContainer/TextureRect/Label") +upgrade_button_path = NodePath("Button/PopupPanel/VBoxContainer/HBoxContainer/Button") + +[node name="Button" type="Button" parent="."] +margin_right = 45.0 +margin_bottom = 45.0 +rect_min_size = Vector2( 45, 45 ) + +[node name="MarginContainer" type="MarginContainer" parent="Button"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_constants/margin_right = 3 +custom_constants/margin_top = 3 +custom_constants/margin_left = 3 +custom_constants/margin_bottom = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="Button/MarginContainer"] +margin_left = 3.0 +margin_top = 3.0 +margin_right = 42.0 +margin_bottom = 42.0 +expand = true + +[node name="Label" type="Label" parent="Button/MarginContainer/TextureRect"] +anchor_right = 1.0 +anchor_bottom = 1.0 +text = "2/2" +align = 2 +valign = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PopupPanel" type="PopupPanel" parent="Button"] +margin_left = 41.592 +margin_top = 1.58763 +margin_right = 211.592 +margin_bottom = 127.588 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="Button/PopupPanel"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 166.0 +margin_bottom = 122.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="Button/PopupPanel/VBoxContainer"] +margin_right = 162.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="Button/PopupPanel/VBoxContainer/HBoxContainer"] +margin_top = 7.0 +margin_right = 124.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "asdasdasdasdasda" +valign = 1 + +[node name="Button" type="Button" parent="Button/PopupPanel/VBoxContainer/HBoxContainer"] +margin_left = 132.0 +margin_right = 162.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 30, 30 ) +text = "X" + +[node name="Button" type="Button" parent="Button/PopupPanel/VBoxContainer"] +margin_top = 38.0 +margin_right = 162.0 +margin_bottom = 64.269 +text = "Upgrade" + +[node name="Label" type="Label" parent="Button/PopupPanel/VBoxContainer"] +margin_top = 72.0 +margin_right = 162.0 +margin_bottom = 118.0 +size_flags_horizontal = 3 +size_flags_vertical = 7 +text = "increases your Dodge by 5%. +Also Adds 10% lols." +[connection signal="pressed" from="Button" to="." method="open_popup"] +[connection signal="pressed" from="Button/PopupPanel/VBoxContainer/HBoxContainer/Button" to="Button/PopupPanel" method="hide"] +[connection signal="pressed" from="Button/PopupPanel/VBoxContainer/Button" to="." method="upgrade"] diff --git a/game/ui/talents/TalentRow.gd b/game/ui/talents/TalentRow.gd new file mode 100644 index 0000000..987554f --- /dev/null +++ b/game/ui/talents/TalentRow.gd @@ -0,0 +1,9 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +func set_player(player : Entity, spec : CharacterSpec, spec_index: int, row : int) -> void: + for ch in get_children(): + ch.set_player(player, spec, spec_index, row) diff --git a/game/ui/talents/TalentRow.tscn b/game/ui/talents/TalentRow.tscn new file mode 100644 index 0000000..b556fa0 --- /dev/null +++ b/game/ui/talents/TalentRow.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/talents/TalentEntry.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] +[ext_resource path="res://ui/talents/TalentRow.gd" type="Script" id=3] + +[node name="TalentRow" type="HBoxContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +theme = ExtResource( 2 ) +alignment = 1 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TalentEntry" parent="." instance=ExtResource( 1 )] +margin_right = 198.0 +margin_bottom = 600.0 + +[node name="TalentEntry2" parent="." instance=ExtResource( 1 )] +margin_left = 206.0 +margin_right = 404.0 +margin_bottom = 600.0 +culomn = 1 + +[node name="TalentEntry3" parent="." instance=ExtResource( 1 )] +margin_left = 412.0 +margin_right = 610.0 +margin_bottom = 600.0 +culomn = 2 + +[node name="TalentEntry4" parent="." instance=ExtResource( 1 )] +margin_left = 618.0 +margin_right = 816.0 +margin_bottom = 600.0 +culomn = 3 + +[node name="TalentEntry5" parent="." instance=ExtResource( 1 )] +margin_left = 824.0 +margin_right = 1024.0 +margin_bottom = 600.0 +culomn = 4 diff --git a/game/ui/talents/talent_switcher_button.gd b/game/ui/talents/talent_switcher_button.gd new file mode 100644 index 0000000..2ef1616 --- /dev/null +++ b/game/ui/talents/talent_switcher_button.gd @@ -0,0 +1,16 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +var _index : int +var _spec_window : Node + +func set_spec_index(spec_window : Node, index : int) -> void: + _index = index + _spec_window = spec_window + +func _toggled(button_pressed): + if button_pressed: + _spec_window.select_spec(_index) diff --git a/game/ui/talents/talent_switcher_button.tscn b/game/ui/talents/talent_switcher_button.tscn new file mode 100644 index 0000000..637bbe7 --- /dev/null +++ b/game/ui/talents/talent_switcher_button.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/talents/talent_switcher_button.gd" type="Script" id=1] + +[node name="TalentSwitcher" type="Button"] +margin_left = 301.0 +margin_right = 401.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 70, 30 ) +text = "Melee" +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/theme/GameUI.png b/game/ui/theme/GameUI.png new file mode 100644 index 0000000..21f456f Binary files /dev/null and b/game/ui/theme/GameUI.png differ diff --git a/game/ui/theme/GameUI.png.import b/game/ui/theme/GameUI.png.import new file mode 100644 index 0000000..e782fe4 --- /dev/null +++ b/game/ui/theme/GameUI.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/GameUI.png-73e86ec1148027f9a719b18a5dba0e84.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/theme/GameUI.png" +dest_files=[ "res://.import/GameUI.png-73e86ec1148027f9a719b18a5dba0e84.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/game/ui/theme/actionbar_dynamicfont.tres b/game/ui/theme/actionbar_dynamicfont.tres new file mode 100644 index 0000000..cfe6cb4 --- /dev/null +++ b/game/ui/theme/actionbar_dynamicfont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 21 +font_data = ExtResource( 1 ) diff --git a/game/ui/theme/bag_icon.tres b/game/ui/theme/bag_icon.tres new file mode 100644 index 0000000..5d21af3 --- /dev/null +++ b/game/ui/theme/bag_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 2, 101, 12, 14 ) diff --git a/game/ui/theme/button_bg_atlas.tres b/game/ui/theme/button_bg_atlas.tres new file mode 100644 index 0000000..431a19c --- /dev/null +++ b/game/ui/theme/button_bg_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 1, 55, 13, 14 ) diff --git a/game/ui/theme/button_bg_stylebox.tres b/game/ui/theme/button_bg_stylebox.tres new file mode 100644 index 0000000..94886cc --- /dev/null +++ b/game/ui/theme/button_bg_stylebox.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 5.0562 +margin_right = 5.57024 +margin_top = 5.69876 +margin_bottom = 5.57024 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.772549, 0.772549, 0.772549, 1 ) diff --git a/game/ui/theme/button_bg_stylebox_disabled.tres b/game/ui/theme/button_bg_stylebox_disabled.tres new file mode 100644 index 0000000..82fdb5c --- /dev/null +++ b/game/ui/theme/button_bg_stylebox_disabled.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 5.57024 +margin_right = 4.92768 +margin_top = 5.18471 +margin_bottom = 5.18471 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.984314, 0.984314, 0.984314, 1 ) diff --git a/game/ui/theme/button_bg_stylebox_focus.tres b/game/ui/theme/button_bg_stylebox_focus.tres new file mode 100644 index 0000000..91ef13d --- /dev/null +++ b/game/ui/theme/button_bg_stylebox_focus.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 5.0562 +margin_right = 4.92768 +margin_top = 5.82727 +margin_bottom = 5.0562 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.807843, 0.807843, 0.807843, 1 ) diff --git a/game/ui/theme/button_bg_stylebox_hover.tres b/game/ui/theme/button_bg_stylebox_hover.tres new file mode 100644 index 0000000..298037a --- /dev/null +++ b/game/ui/theme/button_bg_stylebox_hover.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 4.15661 +margin_right = 4.79917 +margin_top = 4.67066 +margin_bottom = 4.88346 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/button_bg_stylebox_pressed.tres b/game/ui/theme/button_bg_stylebox_pressed.tres new file mode 100644 index 0000000..540dc11 --- /dev/null +++ b/game/ui/theme/button_bg_stylebox_pressed.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 3.0 +margin_right = 3.0 +margin_top = 3.0 +margin_bottom = 3.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.431373, 0.431373, 0.431373, 1 ) diff --git a/game/ui/theme/checkbox_checked_texture.tres b/game/ui/theme/checkbox_checked_texture.tres new file mode 100644 index 0000000..0072fe5 --- /dev/null +++ b/game/ui/theme/checkbox_checked_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 9, 46, 7, 7 ) diff --git a/game/ui/theme/checkbox_texture.tres b/game/ui/theme/checkbox_texture.tres new file mode 100644 index 0000000..f020975 --- /dev/null +++ b/game/ui/theme/checkbox_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 1, 46, 7, 7 ) diff --git a/game/ui/theme/cooldown_progress.png b/game/ui/theme/cooldown_progress.png new file mode 100644 index 0000000..f8e30ef Binary files /dev/null and b/game/ui/theme/cooldown_progress.png differ diff --git a/game/ui/theme/cooldown_progress.png.import b/game/ui/theme/cooldown_progress.png.import new file mode 100644 index 0000000..aad26d8 --- /dev/null +++ b/game/ui/theme/cooldown_progress.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/cooldown_progress.png-021a0cda14b9a15b9ac04b9c9084d412.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/theme/cooldown_progress.png" +dest_files=[ "res://.import/cooldown_progress.png-021a0cda14b9a15b9ac04b9c9084d412.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/game/ui/theme/dropdown_icon.tres b/game/ui/theme/dropdown_icon.tres new file mode 100644 index 0000000..04e6b89 --- /dev/null +++ b/game/ui/theme/dropdown_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 1, 1, 10, 10 ) diff --git a/game/ui/theme/h_scroll_bar_texture.tres b/game/ui/theme/h_scroll_bar_texture.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/h_scroll_bar_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/indicator.png b/game/ui/theme/indicator.png new file mode 100644 index 0000000..54d16eb Binary files /dev/null and b/game/ui/theme/indicator.png differ diff --git a/game/ui/theme/indicator.png.import b/game/ui/theme/indicator.png.import new file mode 100644 index 0000000..de0ce35 --- /dev/null +++ b/game/ui/theme/indicator.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/indicator.png-c41d04cbba622d9e2a8ddce8ec7447b5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/theme/indicator.png" +dest_files=[ "res://.import/indicator.png-c41d04cbba622d9e2a8ddce8ec7447b5.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/game/ui/theme/lineedit_normal_style.tres b/game/ui/theme/lineedit_normal_style.tres new file mode 100644 index 0000000..836cca1 --- /dev/null +++ b/game/ui/theme/lineedit_normal_style.tres @@ -0,0 +1,15 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/button_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 13, 14 ) +margin_left = 4.54215 +margin_right = 4.92768 +margin_top = 4.54215 +margin_bottom = 4.79917 +expand_margin_top = 4.0 +expand_margin_bottom = 4.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/locked_icon.tres b/game/ui/theme/locked_icon.tres new file mode 100644 index 0000000..8b8a490 --- /dev/null +++ b/game/ui/theme/locked_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 101, 12, 14 ) diff --git a/game/ui/theme/panel_bg.tres b/game/ui/theme/panel_bg.tres new file mode 100644 index 0000000..1350fef --- /dev/null +++ b/game/ui/theme/panel_bg.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/panel_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 4.0 +margin_right = 4.0 +margin_top = 4.0 +margin_bottom = 4.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/panel_bg_atlas.tres b/game/ui/theme/panel_bg_atlas.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/panel_bg_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/radio_checked_texture.tres b/game/ui/theme/radio_checked_texture.tres new file mode 100644 index 0000000..25bfe52 --- /dev/null +++ b/game/ui/theme/radio_checked_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 1, 37, 7, 7 ) diff --git a/game/ui/theme/radio_texture.tres b/game/ui/theme/radio_texture.tres new file mode 100644 index 0000000..f3bda6d --- /dev/null +++ b/game/ui/theme/radio_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 9, 37, 7, 7 ) diff --git a/game/ui/theme/scrollbar_bg.tres b/game/ui/theme/scrollbar_bg.tres new file mode 100644 index 0000000..fa085e5 --- /dev/null +++ b/game/ui/theme/scrollbar_bg.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.0 +margin_right = 2.0 +margin_top = 2.0 +margin_bottom = 2.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.976471, 0.976471, 0.976471, 1 ) diff --git a/game/ui/theme/scrollbar_bg_atlas.tres b/game/ui/theme/scrollbar_bg_atlas.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/scrollbar_bg_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/scrollbar_bg_focus.tres b/game/ui/theme/scrollbar_bg_focus.tres new file mode 100644 index 0000000..8a932b2 --- /dev/null +++ b/game/ui/theme/scrollbar_bg_focus.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/panel_bg_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.0 +margin_right = 2.0 +margin_top = 2.0 +margin_bottom = 2.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/scrollbar_grabber.tres b/game/ui/theme/scrollbar_grabber.tres new file mode 100644 index 0000000..ad31839 --- /dev/null +++ b/game/ui/theme/scrollbar_grabber.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/scrollbar_grabber_atlas.tres b/game/ui/theme/scrollbar_grabber_atlas.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/scrollbar_grabber_highlight.tres b/game/ui/theme/scrollbar_grabber_highlight.tres new file mode 100644 index 0000000..ad31839 --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_highlight.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 diff --git a/game/ui/theme/scrollbar_grabber_pressed.tres b/game/ui/theme/scrollbar_grabber_pressed.tres new file mode 100644 index 0000000..ffc1382 --- /dev/null +++ b/game/ui/theme/scrollbar_grabber_pressed.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/scrollbar_grabber_atlas.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 10, 11 ) +margin_left = 2.35121 +margin_right = 2.35121 +margin_top = 2.95077 +margin_bottom = 2.65099 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.976471, 0.976471, 0.976471, 1 ) diff --git a/game/ui/theme/separator_stylebox.tres b/game/ui/theme/separator_stylebox.tres new file mode 100644 index 0000000..7bf5dd6 --- /dev/null +++ b/game/ui/theme/separator_stylebox.tres @@ -0,0 +1,7 @@ +[gd_resource type="StyleBoxTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/separator_texture.tres" type="Texture" id=1] + +[resource] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 1, 1 ) diff --git a/game/ui/theme/separator_texture.tres b/game/ui/theme/separator_texture.tres new file mode 100644 index 0000000..654816f --- /dev/null +++ b/game/ui/theme/separator_texture.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 20, 68, 1, 1 ) diff --git a/game/ui/theme/spellbook_icon.tres b/game/ui/theme/spellbook_icon.tres new file mode 100644 index 0000000..8311c95 --- /dev/null +++ b/game/ui/theme/spellbook_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 16, 101, 12, 14 ) diff --git a/game/ui/theme/ui_dynamicfont.tres b/game/ui/theme/ui_dynamicfont.tres new file mode 100644 index 0000000..d3f2869 --- /dev/null +++ b/game/ui/theme/ui_dynamicfont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 14 +font_data = ExtResource( 1 ) diff --git a/game/ui/theme/ui_dynamicfont_small.tres b/game/ui/theme/ui_dynamicfont_small.tres new file mode 100644 index 0000000..80d3023 --- /dev/null +++ b/game/ui/theme/ui_dynamicfont_small.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://data/fonts/VT323-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 12 +font_data = ExtResource( 1 ) diff --git a/game/ui/theme/ui_theme.tres b/game/ui/theme/ui_theme.tres new file mode 100644 index 0000000..d9df2c7 --- /dev/null +++ b/game/ui/theme/ui_theme.tres @@ -0,0 +1,371 @@ +[gd_resource type="Theme" load_steps=30 format=2] + +[ext_resource path="res://ui/theme/h_scroll_bar_texture.tres" type="Texture" id=1] +[ext_resource path="res://ui/theme/button_bg_stylebox_disabled.tres" type="StyleBox" id=2] +[ext_resource path="res://ui/theme/button_bg_stylebox_focus.tres" type="StyleBox" id=3] +[ext_resource path="res://ui/theme/button_bg_stylebox.tres" type="StyleBox" id=4] +[ext_resource path="res://ui/theme/button_bg_stylebox_hover.tres" type="StyleBox" id=5] +[ext_resource path="res://ui/theme/ui_dynamicfont.tres" type="DynamicFont" id=6] +[ext_resource path="res://ui/theme/button_bg_stylebox_pressed.tres" type="StyleBox" id=7] +[ext_resource path="res://ui/theme/panel_bg.tres" type="StyleBox" id=8] +[ext_resource path="res://ui/theme/lineedit_normal_style.tres" type="StyleBox" id=9] +[ext_resource path="res://ui/theme/scrollbar_grabber_highlight.tres" type="StyleBox" id=10] +[ext_resource path="res://ui/theme/scrollbar_bg.tres" type="StyleBox" id=11] +[ext_resource path="res://ui/theme/scrollbar_grabber.tres" type="StyleBox" id=12] +[ext_resource path="res://ui/theme/scrollbar_grabber_pressed.tres" type="StyleBox" id=13] +[ext_resource path="res://ui/theme/scrollbar_bg_focus.tres" type="StyleBox" id=14] +[ext_resource path="res://ui/theme/separator_stylebox.tres" type="StyleBox" id=15] +[ext_resource path="res://ui/theme/radio_texture.tres" type="Texture" id=16] +[ext_resource path="res://ui/theme/radio_checked_texture.tres" type="Texture" id=17] +[ext_resource path="res://ui/theme/checkbox_texture.tres" type="Texture" id=18] +[ext_resource path="res://ui/theme/checkbox_checked_texture.tres" type="Texture" id=19] +[ext_resource path="res://ui/theme/dropdown_icon.tres" type="Texture" id=20] + +[sub_resource type="Image" id=1] +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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 97, 255, 255, 255, 135, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 114, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 15, 255, 255, 255, 139, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 123, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 96, 255, 255, 255, 150, 255, 255, 255, 105, 255, 255, 255, 15, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 123, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 134, 255, 255, 255, 150, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 123, 191, 191, 191, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 122, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 122, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 121, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 121, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 121, 191, 191, 191, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 120, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 120, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 120, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 119, 191, 191, 191, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 119, 191, 191, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 134, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 119, 191, 191, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 97, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 118, 191, 191, 191, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 139, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 111, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 97, 255, 255, 255, 135, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 191, 191, 191, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 150, 255, 255, 255, 150, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 134, 255, 255, 255, 150, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 150, 255, 255, 255, 134, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 255, 255, 255, 97, 255, 255, 255, 150, 255, 255, 255, 105, 255, 255, 255, 15, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 255, 255, 255, 15, 255, 255, 255, 105, 255, 255, 255, 150, 255, 255, 255, 97, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 139, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 139, 191, 191, 191, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 191, 191, 16, 255, 255, 255, 97, 255, 255, 255, 135, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 150, 255, 255, 255, 135, 255, 255, 255, 97, 191, 191, 191, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=2] +flags = 0 +flags = 0 +image = SubResource( 1 ) +size = Vector2( 64, 64 ) + +[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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 195, 191, 68, 68, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 26, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 210, 191, 68, 68, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 164, 255, 93, 93, 255, 255, 92, 92, 178, 255, 88, 88, 26, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 209, 191, 68, 68, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 90, 90, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 209, 191, 69, 69, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 208, 191, 68, 68, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 208, 191, 68, 68, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 207, 191, 67, 67, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 206, 191, 68, 68, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 206, 191, 69, 69, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 205, 191, 68, 68, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 205, 191, 68, 68, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 204, 191, 68, 68, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 204, 191, 68, 68, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 203, 191, 68, 68, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 202, 191, 67, 67, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 165, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 202, 191, 67, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 46, 46, 27, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 190, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 128, 46, 46, 0, 191, 68, 68, 7, 255, 92, 92, 151, 255, 92, 92, 151, 191, 68, 68, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 7, 255, 92, 92, 151, 255, 92, 92, 151, 191, 68, 68, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 255, 88, 88, 7, 255, 92, 92, 180, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 180, 191, 65, 65, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 65, 65, 7, 255, 92, 92, 180, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 180, 191, 65, 65, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 253, 255, 91, 91, 180, 255, 93, 93, 255, 255, 93, 93, 233, 255, 93, 93, 233, 255, 93, 93, 255, 255, 91, 91, 180, 191, 66, 66, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 7, 255, 91, 91, 180, 255, 93, 93, 255, 255, 93, 93, 233, 255, 93, 93, 233, 255, 93, 93, 255, 255, 91, 91, 180, 191, 66, 66, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 7, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 233, 255, 87, 87, 43, 255, 78, 78, 44, 255, 93, 93, 233, 255, 93, 93, 255, 255, 91, 91, 179, 191, 66, 66, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 7, 255, 91, 91, 179, 255, 93, 93, 255, 255, 93, 93, 233, 255, 78, 78, 44, 255, 78, 78, 44, 255, 93, 93, 233, 255, 93, 93, 255, 255, 91, 91, 179, 191, 66, 66, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 7, 255, 92, 92, 181, 255, 93, 93, 255, 255, 92, 92, 217, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 234, 255, 70, 70, 44, 64, 19, 19, 0, 64, 16, 16, 0, 255, 70, 70, 44, 255, 93, 93, 234, 255, 93, 93, 255, 255, 92, 92, 178, 191, 65, 65, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 65, 65, 6, 255, 92, 92, 178, 255, 93, 93, 255, 255, 93, 93, 234, 255, 70, 70, 44, 64, 16, 16, 0, 64, 16, 16, 0, 255, 70, 70, 44, 255, 93, 93, 234, 255, 93, 93, 255, 255, 92, 92, 178, 191, 65, 65, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 7, 255, 91, 91, 180, 255, 93, 93, 255, 255, 93, 93, 233, 255, 87, 87, 43, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 219, 255, 93, 93, 232, 255, 71, 71, 45, 128, 37, 37, 0, 191, 69, 69, 9, 191, 68, 68, 8, 128, 37, 37, 0, 255, 71, 71, 45, 255, 93, 93, 234, 255, 93, 93, 255, 255, 91, 91, 177, 191, 64, 64, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 6, 255, 91, 91, 178, 255, 93, 93, 255, 255, 93, 93, 234, 255, 71, 71, 45, 128, 37, 37, 0, 191, 69, 69, 8, 191, 69, 69, 8, 128, 37, 37, 0, 255, 71, 71, 45, 255, 93, 93, 234, 255, 93, 93, 255, 255, 91, 91, 177, 191, 64, 64, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 7, 255, 91, 91, 179, 255, 93, 93, 255, 255, 93, 93, 234, 255, 70, 70, 44, 64, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 11, 191, 68, 68, 11, 128, 26, 26, 0, 255, 87, 87, 43, 255, 93, 93, 230, 255, 93, 93, 230, 255, 87, 87, 42, 128, 25, 25, 0, 255, 61, 61, 45, 255, 93, 93, 234, 255, 93, 93, 255, 255, 91, 91, 176, 191, 66, 66, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 6, 255, 91, 91, 176, 255, 93, 93, 255, 255, 93, 93, 234, 255, 61, 61, 45, 128, 25, 25, 0, 255, 87, 87, 43, 255, 93, 93, 230, 255, 93, 93, 230, 255, 87, 87, 42, 128, 25, 25, 0, 255, 61, 61, 45, 255, 93, 93, 234, 255, 93, 93, 255, 255, 91, 91, 176, 191, 66, 66, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 6, 255, 91, 91, 178, 255, 93, 93, 255, 255, 93, 93, 234, 255, 71, 71, 45, 64, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 255, 23, 23, 42, 255, 93, 93, 232, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 232, 255, 23, 23, 42, 128, 13, 13, 0, 255, 61, 61, 46, 255, 93, 93, 235, 255, 93, 93, 255, 255, 92, 92, 176, 191, 69, 69, 6, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 6, 255, 92, 92, 176, 255, 93, 93, 255, 255, 93, 93, 235, 255, 61, 61, 46, 128, 13, 13, 0, 255, 23, 23, 42, 255, 93, 93, 232, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 232, 255, 23, 23, 42, 128, 13, 13, 0, 255, 61, 61, 46, 255, 93, 93, 235, 255, 93, 93, 255, 255, 92, 92, 176, 191, 69, 69, 6, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 6, 255, 91, 91, 178, 255, 93, 93, 255, 255, 93, 93, 234, 255, 66, 66, 45, 128, 37, 37, 0, 191, 68, 68, 10, 191, 69, 69, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 255, 23, 23, 41, 255, 93, 93, 232, 255, 93, 93, 255, 255, 92, 92, 182, 255, 92, 92, 182, 255, 93, 93, 255, 255, 93, 93, 232, 255, 23, 23, 41, 128, 13, 13, 0, 255, 74, 74, 47, 255, 93, 93, 235, 255, 93, 93, 255, 255, 92, 92, 175, 191, 68, 68, 6, 191, 68, 68, 6, 255, 92, 92, 175, 255, 93, 93, 255, 255, 93, 93, 235, 255, 74, 74, 47, 128, 13, 13, 0, 255, 23, 23, 41, 255, 93, 93, 232, 255, 93, 93, 255, 255, 92, 92, 182, 255, 92, 92, 182, 255, 93, 93, 255, 255, 93, 93, 232, 255, 23, 23, 41, 128, 13, 13, 0, 255, 74, 74, 47, 255, 93, 93, 235, 255, 93, 93, 255, 255, 92, 92, 175, 191, 68, 68, 6, 191, 65, 65, 6, 255, 91, 91, 177, 255, 93, 93, 255, 255, 93, 93, 235, 255, 61, 61, 46, 128, 23, 23, 0, 255, 87, 87, 43, 255, 93, 93, 231, 255, 92, 92, 219, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 255, 23, 23, 41, 255, 93, 93, 231, 255, 93, 93, 255, 255, 90, 90, 183, 191, 66, 66, 7, 191, 66, 66, 7, 255, 90, 90, 183, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 41, 128, 21, 21, 0, 255, 87, 87, 47, 255, 93, 93, 236, 255, 93, 93, 255, 255, 91, 91, 174, 255, 91, 91, 174, 255, 93, 93, 255, 255, 93, 93, 236, 255, 87, 87, 47, 128, 21, 21, 0, 255, 23, 23, 41, 255, 93, 93, 231, 255, 93, 93, 255, 255, 90, 90, 183, 191, 66, 66, 7, 191, 66, 66, 7, 255, 90, 90, 183, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 41, 128, 21, 21, 0, 255, 87, 87, 47, 255, 93, 93, 236, 255, 93, 93, 255, 255, 91, 91, 174, 255, 92, 92, 176, 255, 93, 93, 255, 255, 93, 93, 235, 255, 61, 61, 46, 128, 13, 13, 0, 255, 23, 23, 42, 255, 93, 93, 232, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 216, 255, 93, 93, 255, 255, 91, 91, 184, 191, 64, 64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 8, 255, 91, 91, 184, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 40, 128, 21, 21, 0, 255, 87, 87, 48, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 236, 255, 87, 87, 48, 128, 21, 21, 0, 255, 23, 23, 40, 255, 93, 93, 231, 255, 93, 93, 255, 255, 91, 91, 184, 191, 64, 64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 8, 255, 91, 91, 184, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 40, 128, 21, 21, 0, 255, 87, 87, 48, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 236, 255, 87, 87, 47, 128, 17, 17, 0, 255, 23, 23, 41, 255, 93, 93, 232, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 191, 65, 65, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 8, 255, 92, 92, 184, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 39, 128, 20, 20, 0, 255, 77, 77, 48, 255, 93, 93, 233, 255, 93, 93, 233, 255, 77, 77, 48, 128, 20, 20, 0, 255, 23, 23, 40, 255, 93, 93, 231, 255, 93, 93, 255, 255, 92, 92, 184, 191, 64, 64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 64, 64, 8, 255, 92, 92, 184, 255, 93, 93, 255, 255, 93, 93, 231, 255, 23, 23, 39, 128, 20, 20, 0, 255, 77, 77, 48, 255, 93, 93, 233, 255, 93, 93, 233, 255, 87, 87, 48, 128, 21, 21, 0, 255, 23, 23, 41, 255, 93, 93, 231, 255, 93, 93, 255, 255, 92, 92, 182, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 8, 255, 92, 92, 185, 255, 93, 93, 255, 255, 93, 93, 230, 191, 69, 69, 39, 64, 18, 18, 0, 191, 66, 66, 9, 191, 66, 66, 9, 64, 18, 18, 0, 191, 69, 69, 39, 255, 93, 93, 230, 255, 93, 93, 255, 255, 92, 92, 185, 191, 66, 66, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 8, 255, 92, 92, 185, 255, 93, 93, 255, 255, 93, 93, 230, 191, 69, 69, 39, 64, 18, 18, 0, 191, 66, 66, 9, 191, 66, 66, 9, 128, 21, 21, 0, 255, 23, 23, 40, 255, 93, 93, 231, 255, 93, 93, 255, 255, 90, 90, 183, 255, 89, 89, 7, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 8, 255, 92, 92, 186, 255, 93, 93, 255, 255, 93, 93, 230, 191, 68, 68, 38, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 38, 255, 93, 93, 230, 255, 93, 93, 255, 255, 92, 92, 186, 191, 69, 69, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 8, 255, 92, 92, 186, 255, 93, 93, 255, 255, 93, 93, 230, 191, 68, 68, 38, 0, 0, 0, 0, 64, 0, 0, 0, 255, 23, 23, 40, 255, 93, 93, 231, 255, 93, 93, 255, 255, 91, 91, 184, 191, 64, 64, 8, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 67, 67, 9, 255, 91, 91, 186, 255, 93, 93, 255, 255, 93, 93, 229, 191, 68, 68, 38, 191, 69, 69, 38, 255, 93, 93, 229, 255, 93, 93, 255, 255, 91, 91, 186, 191, 67, 67, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 67, 67, 9, 255, 91, 91, 186, 255, 93, 93, 255, 255, 93, 93, 229, 191, 68, 68, 38, 191, 69, 69, 39, 255, 93, 93, 230, 255, 93, 93, 255, 255, 92, 92, 184, 191, 64, 64, 8, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 9, 255, 92, 92, 187, 255, 93, 93, 255, 255, 93, 93, 229, 255, 93, 93, 229, 255, 93, 93, 255, 255, 92, 92, 187, 191, 68, 68, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 9, 255, 92, 92, 187, 255, 93, 93, 255, 255, 93, 93, 229, 255, 93, 93, 230, 255, 93, 93, 255, 255, 92, 92, 185, 191, 66, 66, 8, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 9, 255, 92, 92, 188, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 188, 191, 69, 69, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 9, 255, 92, 92, 188, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 186, 191, 69, 69, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 10, 255, 92, 92, 154, 255, 92, 92, 154, 191, 66, 66, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 66, 66, 10, 255, 92, 92, 154, 255, 92, 92, 153, 191, 68, 68, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 90, 90, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 90, 90, 26, 255, 93, 93, 255, 255, 92, 92, 228, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 165, 255, 93, 93, 255, 255, 92, 92, 178, 255, 88, 88, 26, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 255, 88, 88, 26, 255, 92, 92, 178, 255, 93, 93, 255, 255, 92, 92, 165, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 46, 46, 27, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 236, 255, 46, 46, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 229, 255, 91, 91, 165, 191, 68, 68, 27, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=4] +flags = 0 +flags = 0 +image = SubResource( 3 ) +size = Vector2( 64, 64 ) + +[sub_resource type="Image" id=5] +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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 195, 191, 68, 68, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 26, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 210, 191, 69, 69, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 164, 255, 93, 93, 255, 255, 90, 90, 179, 255, 87, 87, 26, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 209, 191, 68, 68, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 89, 89, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 209, 191, 69, 69, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 208, 191, 68, 68, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 208, 191, 68, 68, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 207, 191, 68, 68, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 206, 191, 68, 68, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 206, 191, 69, 69, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 205, 191, 68, 68, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 205, 191, 68, 68, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 204, 191, 68, 68, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 203, 191, 68, 68, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 203, 191, 68, 68, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 202, 191, 67, 67, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 165, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 202, 191, 67, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 46, 46, 27, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 189, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 184, 255, 92, 92, 200, 191, 67, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 15, 255, 92, 92, 191, 255, 91, 91, 183, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 184, 255, 92, 92, 200, 191, 67, 67, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 15, 255, 92, 92, 191, 255, 91, 91, 183, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 197, 255, 93, 93, 255, 255, 92, 92, 188, 191, 66, 66, 6, 0, 0, 0, 0, 191, 66, 66, 6, 255, 92, 92, 188, 255, 93, 93, 255, 255, 92, 92, 197, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 197, 255, 93, 93, 255, 255, 92, 92, 188, 191, 66, 66, 6, 0, 0, 0, 0, 191, 66, 66, 6, 255, 92, 92, 188, 255, 93, 93, 255, 255, 92, 92, 197, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 30, 255, 93, 93, 229, 255, 93, 93, 255, 255, 91, 91, 161, 255, 85, 85, 2, 255, 91, 91, 161, 255, 93, 93, 255, 255, 93, 93, 229, 191, 69, 69, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 69, 69, 30, 255, 93, 93, 229, 255, 93, 93, 255, 255, 91, 91, 161, 255, 85, 85, 2, 255, 91, 91, 161, 255, 93, 93, 255, 255, 93, 93, 229, 191, 69, 69, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 89, 89, 48, 255, 93, 93, 242, 255, 93, 93, 255, 255, 92, 92, 201, 255, 93, 93, 255, 255, 93, 93, 242, 255, 89, 89, 48, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 89, 89, 48, 255, 93, 93, 242, 255, 93, 93, 255, 255, 92, 92, 201, 255, 93, 93, 255, 255, 93, 93, 242, 255, 89, 89, 48, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 90, 90, 72, 255, 93, 93, 251, 255, 93, 93, 255, 255, 93, 93, 251, 255, 90, 90, 72, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 90, 90, 72, 255, 93, 93, 251, 255, 93, 93, 255, 255, 93, 93, 251, 255, 90, 90, 72, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 22, 22, 0, 255, 90, 90, 71, 255, 93, 93, 250, 255, 93, 93, 255, 255, 93, 93, 250, 255, 90, 90, 71, 64, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 22, 22, 0, 255, 90, 90, 71, 255, 93, 93, 250, 255, 93, 93, 255, 255, 93, 93, 250, 255, 90, 90, 71, 64, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 87, 87, 47, 255, 93, 93, 242, 255, 93, 93, 255, 255, 92, 92, 203, 255, 93, 93, 255, 255, 93, 93, 242, 255, 87, 87, 47, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 87, 87, 47, 255, 93, 93, 242, 255, 93, 93, 255, 255, 92, 92, 203, 255, 93, 93, 255, 255, 93, 93, 242, 255, 87, 87, 47, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 29, 255, 93, 93, 228, 255, 93, 93, 255, 255, 92, 92, 162, 255, 87, 87, 2, 255, 92, 92, 162, 255, 93, 93, 255, 255, 93, 93, 228, 191, 68, 68, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 68, 68, 29, 255, 93, 93, 228, 255, 93, 93, 255, 255, 92, 92, 162, 255, 87, 87, 2, 255, 92, 92, 162, 255, 93, 93, 255, 255, 93, 93, 228, 191, 68, 68, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 196, 255, 93, 93, 255, 255, 91, 91, 189, 191, 67, 67, 6, 0, 0, 0, 0, 191, 66, 66, 6, 255, 91, 91, 189, 255, 93, 93, 255, 255, 92, 92, 196, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 196, 255, 93, 93, 255, 255, 91, 91, 189, 191, 67, 67, 6, 0, 0, 0, 0, 191, 66, 66, 6, 255, 91, 91, 189, 255, 93, 93, 255, 255, 92, 92, 196, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 180, 255, 92, 92, 194, 191, 67, 67, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 67, 67, 16, 255, 92, 92, 194, 255, 92, 92, 180, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 180, 255, 92, 92, 194, 191, 67, 67, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 67, 67, 16, 255, 92, 92, 194, 255, 92, 92, 180, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 92, 92, 179, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 92, 92, 179, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 255, 91, 91, 179, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 91, 91, 179, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 191, 70, 70, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 191, 70, 70, 0, 255, 93, 93, 255, 255, 93, 93, 255, 191, 70, 70, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 241, 255, 93, 93, 255, 255, 90, 90, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 90, 90, 23, 255, 93, 93, 255, 255, 93, 93, 241, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 189, 255, 93, 93, 255, 255, 92, 92, 115, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 92, 92, 115, 255, 93, 93, 255, 255, 92, 92, 189, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 21, 21, 0, 255, 89, 89, 60, 255, 93, 93, 253, 255, 93, 93, 248, 255, 91, 91, 115, 255, 91, 91, 25, 255, 91, 91, 25, 255, 91, 91, 115, 255, 93, 93, 248, 255, 93, 93, 253, 255, 89, 89, 60, 64, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 92, 92, 120, 255, 93, 93, 253, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 253, 255, 92, 92, 120, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 23, 23, 0, 255, 57, 57, 60, 255, 92, 92, 190, 255, 93, 93, 242, 255, 93, 93, 242, 255, 92, 92, 190, 255, 57, 57, 60, 64, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 128, 46, 46, 0, 128, 46, 46, 0, 128, 46, 46, 0, 128, 46, 46, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 47, 47, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 93, 93, 255, 255, 93, 93, 255, 128, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 228, 255, 93, 93, 255, 255, 90, 90, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 91, 91, 27, 255, 93, 93, 255, 255, 92, 92, 228, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 46, 46, 0, 255, 92, 92, 165, 255, 93, 93, 255, 255, 92, 92, 178, 255, 88, 88, 26, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 255, 91, 91, 26, 255, 92, 92, 178, 255, 93, 93, 255, 255, 92, 92, 165, 128, 46, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 46, 46, 27, 255, 93, 93, 236, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 236, 255, 46, 46, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 191, 68, 68, 27, 255, 91, 91, 165, 255, 93, 93, 229, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 255, 255, 93, 93, 229, 255, 91, 91, 165, 191, 68, 68, 27, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 45, 45, 0, 128, 46, 46, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 47, 47, 0, 128, 46, 46, 0, 128, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=6] +flags = 0 +flags = 0 +image = SubResource( 5 ) +size = Vector2( 64, 64 ) + +[sub_resource type="Image" id=7] +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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 98, 98, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 166, 166, 28, 222, 222, 222, 166, 224, 224, 224, 229, 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, 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, 224, 224, 224, 238, 210, 210, 210, 137, 150, 150, 150, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 28, 224, 224, 224, 236, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 220, 220, 220, 145, 108, 108, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 0, 222, 222, 222, 165, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 251, 220, 220, 220, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 0, 223, 223, 223, 228, 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, 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, 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, 181, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 189, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 189, 167, 167, 167, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 229, 222, 222, 222, 166, 166, 166, 166, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 236, 111, 111, 111, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 222, 222, 222, 165, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 228, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 253, 112, 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112, 0, 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, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 223, 223, 223, 228, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 0, 223, 223, 223, 164, 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, 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, 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, 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, 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, 224, 224, 224, 255, 222, 222, 222, 165, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, 35, 224, 224, 224, 233, 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, 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, 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, 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, 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, 236, 111, 111, 111, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 0, 212, 212, 212, 35, 222, 222, 222, 167, 224, 224, 224, 234, 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, 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, 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, 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, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 229, 222, 222, 222, 166, 166, 166, 166, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 112, 112, 112, 0, 111, 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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": 64, +"mipmaps": false, +"width": 64 +} + +[sub_resource type="ImageTexture" id=8] +flags = 0 +flags = 0 +image = SubResource( 7 ) +size = Vector2( 64, 64 ) + +[sub_resource type="StyleBoxTexture" id=9] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 25, 3 ) +margin_right = 10.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color( 0.890196, 0.976471, 0.992157, 1 ) + +[resource] +default_font = ExtResource( 6 ) +Button/colors/font_color = Color( 1, 1, 1, 1 ) +Button/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +Button/colors/font_color_hover = Color( 0.941176, 0.941176, 0.941176, 1 ) +Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +Button/constants/hseparation = 0 +Button/fonts/font = null +Button/styles/disabled = ExtResource( 2 ) +Button/styles/focus = ExtResource( 3 ) +Button/styles/hover = ExtResource( 5 ) +Button/styles/normal = ExtResource( 4 ) +Button/styles/pressed = ExtResource( 7 ) +CheckBox/colors/font_color = Color( 0.878431, 0.878431, 0.878431, 1 ) +CheckBox/colors/font_color_disabled = Color( 0.901961, 0.901961, 0.901961, 0.2 ) +CheckBox/colors/font_color_hover = Color( 0.941176, 0.941176, 0.941176, 1 ) +CheckBox/colors/font_color_hover_pressed = Color( 1, 1, 1, 1 ) +CheckBox/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +CheckBox/constants/check_vadjust = 0 +CheckBox/constants/hseparation = 4 +CheckBox/fonts/font = null +CheckBox/icons/checked = ExtResource( 19 ) +CheckBox/icons/radio_checked = ExtResource( 17 ) +CheckBox/icons/radio_unchecked = ExtResource( 16 ) +CheckBox/icons/unchecked = ExtResource( 18 ) +CheckBox/styles/disabled = ExtResource( 4 ) +CheckBox/styles/focus = ExtResource( 3 ) +CheckBox/styles/hover = null +CheckBox/styles/hover_pressed = null +CheckBox/styles/normal = ExtResource( 4 ) +CheckBox/styles/pressed = ExtResource( 4 ) +CheckButton/colors/font_color = Color( 0.878431, 0.878431, 0.878431, 1 ) +CheckButton/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +CheckButton/colors/font_color_hover = Color( 0.941176, 0.941176, 0.941176, 1 ) +CheckButton/colors/font_color_hover_pressed = Color( 1, 1, 1, 1 ) +CheckButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +CheckButton/constants/check_vadjust = 0 +CheckButton/constants/hseparation = 4 +CheckButton/fonts/font = null +CheckButton/icons/off = ExtResource( 18 ) +CheckButton/icons/on = ExtResource( 19 ) +CheckButton/styles/disabled = ExtResource( 2 ) +CheckButton/styles/focus = ExtResource( 3 ) +CheckButton/styles/hover = ExtResource( 5 ) +CheckButton/styles/hover_pressed = ExtResource( 5 ) +CheckButton/styles/normal = ExtResource( 4 ) +CheckButton/styles/pressed = ExtResource( 7 ) +Dialogs/constants/button_margin = 64 +Dialogs/constants/margin = 16 +EditorIcons/icons/FileBigThumb = SubResource( 2 ) +EditorIcons/icons/FileBrokenBigThumb = SubResource( 4 ) +EditorIcons/icons/FileDeadBigThumb = SubResource( 6 ) +EditorIcons/icons/FolderBigThumb = SubResource( 8 ) +GridContainer/colors/PanelContainer = Color( 1, 1, 1, 1 ) +HScrollBar/icons/decrement = null +HScrollBar/icons/decrement_highlight = null +HScrollBar/icons/increment = null +HScrollBar/icons/increment_highlight = null +HScrollBar/styles/GridContainer = SubResource( 9 ) +HScrollBar/styles/grabber = ExtResource( 12 ) +HScrollBar/styles/grabber_highlight = ExtResource( 10 ) +HScrollBar/styles/grabber_pressed = ExtResource( 13 ) +HScrollBar/styles/scroll = ExtResource( 11 ) +HScrollBar/styles/scroll_focus = null +ItemList/colors/font_color = Color( 0.63, 0.63, 0.63, 1 ) +ItemList/colors/font_color_selected = Color( 1, 1, 1, 1 ) +ItemList/colors/guide_color = Color( 0, 0, 0, 0.1 ) +ItemList/constants/hseparation = 4 +ItemList/constants/icon_margin = 4 +ItemList/constants/line_separation = 4 +ItemList/constants/vseparation = 2 +ItemList/fonts/font = null +ItemList/styles/bg = ExtResource( 8 ) +ItemList/styles/bg_focus = ExtResource( 14 ) +ItemList/styles/cursor = null +ItemList/styles/cursor_unfocused = null +ItemList/styles/selected = null +ItemList/styles/selected_focus = null +LineEdit/colors/clear_button_color = Color( 0.878431, 0.878431, 0.878431, 1 ) +LineEdit/colors/clear_button_color_pressed = Color( 1, 1, 1, 1 ) +LineEdit/colors/cursor_color = Color( 0.941176, 0.941176, 0.941176, 1 ) +LineEdit/colors/font_color = Color( 0.878431, 0.878431, 0.878431, 1 ) +LineEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) +LineEdit/colors/selection_color = Color( 0.490196, 0.490196, 0.490196, 1 ) +LineEdit/constants/minimum_spaces = 24 +LineEdit/fonts/font = null +LineEdit/icons/clear = null +LineEdit/styles/focus = ExtResource( 3 ) +LineEdit/styles/normal = ExtResource( 9 ) +LineEdit/styles/read_only = ExtResource( 2 ) +OptionButton/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +OptionButton/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +OptionButton/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) +OptionButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +OptionButton/constants/arrow_margin = 4 +OptionButton/constants/hseparation = 4 +OptionButton/fonts/font = null +OptionButton/icons/arrow = ExtResource( 20 ) +OptionButton/styles/disabled = ExtResource( 2 ) +OptionButton/styles/focus = ExtResource( 3 ) +OptionButton/styles/hover = ExtResource( 5 ) +OptionButton/styles/normal = ExtResource( 4 ) +OptionButton/styles/pressed = ExtResource( 7 ) +Panel/styles/panel = ExtResource( 8 ) +PanelContainer/styles/panel = ExtResource( 8 ) +PopupMenu/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/colors/font_color_accel = Color( 0.7, 0.7, 0.7, 0.8 ) +PopupMenu/colors/font_color_disabled = Color( 0.4, 0.4, 0.4, 0.8 ) +PopupMenu/colors/font_color_hover = Color( 0.88, 0.88, 0.88, 1 ) +PopupMenu/constants/hseparation = 8 +PopupMenu/constants/vseparation = 8 +PopupMenu/fonts/font = null +PopupMenu/icons/checked = null +PopupMenu/icons/radio_checked = ExtResource( 17 ) +PopupMenu/icons/radio_unchecked = ExtResource( 16 ) +PopupMenu/icons/submenu = null +PopupMenu/icons/unchecked = null +PopupMenu/styles/hover = ExtResource( 5 ) +PopupMenu/styles/labeled_separator_left = null +PopupMenu/styles/labeled_separator_right = null +PopupMenu/styles/panel = ExtResource( 8 ) +PopupMenu/styles/panel_disabled = ExtResource( 2 ) +PopupMenu/styles/separator = ExtResource( 15 ) +PopupPanel/styles/panel = ExtResource( 8 ) +ProgressBar/colors/font_color = Color( 0.941176, 0.941176, 0.941176, 1 ) +ProgressBar/colors/font_color_shadow = Color( 0, 0, 0, 1 ) +ProgressBar/fonts/font = null +ProgressBar/styles/bg = ExtResource( 11 ) +ProgressBar/styles/fg = ExtResource( 12 ) +TabContainer/colors/font_color_bg = Color( 0.69, 0.69, 0.69, 1 ) +TabContainer/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +TabContainer/colors/font_color_fg = Color( 0.94, 0.94, 0.94, 1 ) +TabContainer/constants/hseparation = 8 +TabContainer/constants/label_valign_bg = 4 +TabContainer/constants/label_valign_fg = 0 +TabContainer/constants/side_margin = 16 +TabContainer/constants/top_margin = 48 +TabContainer/fonts/font = null +TabContainer/icons/decrement = null +TabContainer/icons/decrement_highlight = null +TabContainer/icons/increment = null +TabContainer/icons/increment_highlight = null +TabContainer/icons/menu = null +TabContainer/icons/menu_highlight = null +TabContainer/styles/panel = ExtResource( 8 ) +TabContainer/styles/tab_bg = ExtResource( 4 ) +TabContainer/styles/tab_disabled = ExtResource( 5 ) +TabContainer/styles/tab_fg = ExtResource( 3 ) +Tabs/colors/font_color_bg = Color( 0.69, 0.69, 0.69, 1 ) +Tabs/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) +Tabs/colors/font_color_fg = Color( 0.94, 0.94, 0.94, 1 ) +Tabs/constants/hseparation = 8 +Tabs/constants/label_valign_bg = 4 +Tabs/constants/label_valign_fg = 0 +Tabs/constants/top_margin = 48 +Tabs/fonts/font = null +Tabs/icons/close = null +Tabs/icons/decrement = null +Tabs/icons/decrement_highlight = null +Tabs/icons/increment = null +Tabs/icons/increment_highlight = null +Tabs/styles/button = ExtResource( 4 ) +Tabs/styles/button_pressed = ExtResource( 7 ) +Tabs/styles/panel = ExtResource( 8 ) +Tabs/styles/tab_bg = ExtResource( 4 ) +Tabs/styles/tab_disabled = ExtResource( 2 ) +Tabs/styles/tab_fg = ExtResource( 8 ) +TextEdit/colors/background_color = Color( 0, 0, 0, 1 ) +TextEdit/colors/bookmark_color = Color( 0.08, 0.49, 0.98, 1 ) +TextEdit/colors/brace_mismatch_color = Color( 1, 0.2, 0.2, 1 ) +TextEdit/colors/breakpoint_color = Color( 0.8, 0.8, 0.4, 0.2 ) +TextEdit/colors/caret_background_color = Color( 0, 0, 0, 1 ) +TextEdit/colors/caret_color = Color( 0.88, 0.88, 0.88, 1 ) +TextEdit/colors/code_folding_color = Color( 0.8, 0.8, 0.8, 0.8 ) +TextEdit/colors/completion_background_color = Color( 0.17, 0.16, 0.2, 1 ) +TextEdit/colors/completion_existing_color = Color( 0.87, 0.87, 0.87, 0.13 ) +TextEdit/colors/completion_font_color = Color( 0.67, 0.67, 0.67, 1 ) +TextEdit/colors/completion_scroll_color = Color( 1, 1, 1, 1 ) +TextEdit/colors/completion_selected_color = Color( 0.26, 0.26, 0.27, 1 ) +TextEdit/colors/current_line_color = Color( 0.25, 0.25, 0.26, 0.8 ) +TextEdit/colors/executing_line_color = Color( 0.2, 0.8, 0.2, 0.4 ) +TextEdit/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +TextEdit/colors/font_color_readonly = Color( 0.88, 0.88, 0.88, 0.5 ) +TextEdit/colors/font_color_selected = Color( 0, 0, 0, 1 ) +TextEdit/colors/function_color = Color( 0.4, 0.64, 0.81, 1 ) +TextEdit/colors/line_number_color = Color( 0.67, 0.67, 0.67, 0.4 ) +TextEdit/colors/mark_color = Color( 1, 0.4, 0.4, 0.4 ) +TextEdit/colors/member_variable_color = Color( 0.9, 0.31, 0.35, 1 ) +TextEdit/colors/number_color = Color( 0.92, 0.58, 0.2, 1 ) +TextEdit/colors/safe_line_number_color = Color( 0.67, 0.78, 0.67, 0.6 ) +TextEdit/colors/selection_color = Color( 0.49, 0.49, 0.49, 1 ) +TextEdit/colors/symbol_color = Color( 0.94, 0.94, 0.94, 1 ) +TextEdit/colors/word_highlighted_color = Color( 0.8, 0.9, 0.9, 0.15 ) +TextEdit/constants/completion_lines = 7 +TextEdit/constants/completion_max_width = 50 +TextEdit/constants/completion_scroll_width = 3 +TextEdit/constants/line_spacing = 8 +TextEdit/fonts/font = null +TextEdit/icons/fold = null +TextEdit/icons/folded = null +TextEdit/icons/space = null +TextEdit/icons/tab = null +TextEdit/styles/completion = ExtResource( 3 ) +TextEdit/styles/focus = ExtResource( 3 ) +TextEdit/styles/normal = ExtResource( 8 ) +TextEdit/styles/read_only = ExtResource( 2 ) +ToolButton/colors/font_color = Color( 0.88, 0.88, 0.88, 1 ) +ToolButton/colors/font_color_disabled = Color( 0.9, 0.95, 1, 0.3 ) +ToolButton/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) +ToolButton/colors/font_color_pressed = Color( 1, 1, 1, 1 ) +ToolButton/constants/hseparation = 3 +ToolButton/fonts/font = null +ToolButton/styles/disabled = ExtResource( 2 ) +ToolButton/styles/focus = ExtResource( 3 ) +ToolButton/styles/hover = ExtResource( 5 ) +ToolButton/styles/normal = ExtResource( 4 ) +ToolButton/styles/pressed = ExtResource( 7 ) +TooltipLabel/colors/font_color = Color( 1, 1, 1, 1 ) +TooltipLabel/colors/font_color_shadow = Color( 0, 0, 0, 0.1 ) +TooltipLabel/constants/shadow_offset_x = 1 +TooltipLabel/constants/shadow_offset_y = 1 +TooltipLabel/fonts/font = null +TooltipPanel/styles/panel = ExtResource( 8 ) +Tree/colors/cursor_color = Color( 0, 0, 0, 1 ) +Tree/colors/custom_button_font_highlight = Color( 0.94, 0.94, 0.94, 1 ) +Tree/colors/drop_position_color = Color( 1, 0.3, 0.2, 1 ) +Tree/colors/font_color = Color( 0.69, 0.69, 0.69, 1 ) +Tree/colors/font_color_selected = Color( 1, 1, 1, 1 ) +Tree/colors/guide_color = Color( 0, 0, 0, 0.1 ) +Tree/colors/relationship_line_color = Color( 0.27, 0.27, 0.27, 1 ) +Tree/colors/selection_color = Color( 0.1, 0.1, 1, 0.8 ) +Tree/colors/title_button_color = Color( 0.88, 0.88, 0.88, 1 ) +Tree/constants/button_margin = 8 +Tree/constants/draw_guides = 1 +Tree/constants/draw_relationship_lines = 0 +Tree/constants/hseparation = 8 +Tree/constants/item_margin = 24 +Tree/constants/scroll_border = 4 +Tree/constants/scroll_speed = 12 +Tree/constants/vseparation = 8 +Tree/fonts/font = null +Tree/fonts/title_button_font = null +Tree/icons/arrow = null +Tree/icons/arrow_collapsed = null +Tree/icons/checked = null +Tree/icons/select_arrow = null +Tree/icons/unchecked = null +Tree/icons/updown = null +Tree/styles/bg = ExtResource( 8 ) +Tree/styles/bg_focus = null +Tree/styles/button_pressed = null +Tree/styles/cursor = null +Tree/styles/cursor_unfocused = null +Tree/styles/custom_button = null +Tree/styles/custom_button_hover = null +Tree/styles/custom_button_pressed = null +Tree/styles/selected = null +Tree/styles/selected_focus = null +Tree/styles/title_button_hover = null +Tree/styles/title_button_normal = null +Tree/styles/title_button_pressed = null +VBoxContainer/constants/separation = 8 +VScrollBar/icons/decrement = null +VScrollBar/icons/decrement_highlight = null +VScrollBar/icons/increment = null +VScrollBar/icons/increment_highlight = null +VScrollBar/styles/grabber = ExtResource( 12 ) +VScrollBar/styles/grabber_highlight = ExtResource( 10 ) +VScrollBar/styles/grabber_pressed = ExtResource( 13 ) +VScrollBar/styles/scroll = ExtResource( 11 ) +VScrollBar/styles/scroll_focus = ExtResource( 14 ) +WindowDialog/colors/title_color = Color( 0, 0, 0, 1 ) +WindowDialog/constants/close_h_ofs = 36 +WindowDialog/constants/close_v_ofs = 36 +WindowDialog/constants/scaleborder_size = 8 +WindowDialog/constants/title_height = 40 +WindowDialog/fonts/title_font = null +WindowDialog/icons/close = null +WindowDialog/icons/close_highlight = null +WindowDialog/styles/panel = ExtResource( 8 ) diff --git a/game/ui/theme/unlocked_icon.tres b/game/ui/theme/unlocked_icon.tres new file mode 100644 index 0000000..439f356 --- /dev/null +++ b/game/ui/theme/unlocked_icon.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 45, 101, 12, 14 ) diff --git a/game/ui/theme/window_bg_atlas.tres b/game/ui/theme/window_bg_atlas.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/window_bg_atlas.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/theme/window_bg_bg.tres b/game/ui/theme/window_bg_bg.tres new file mode 100644 index 0000000..9b0e3ef --- /dev/null +++ b/game/ui/theme/window_bg_bg.tres @@ -0,0 +1,7 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=2] + +[ext_resource path="res://ui/theme/GameUI.png" type="Texture" id=1] + +[resource] +atlas = ExtResource( 1 ) +region = Rect2( 31, 49, 10, 11 ) diff --git a/game/ui/touch_pad/TurnPanel.gd b/game/ui/touch_pad/TurnPanel.gd new file mode 100644 index 0000000..1859357 --- /dev/null +++ b/game/ui/touch_pad/TurnPanel.gd @@ -0,0 +1,111 @@ +extends Node2D + +const INACTIVE_IDX = -1; + +export (NodePath) var listenerNodePath : NodePath = "../../../../../.." +export (String) var padname : String = "" + +var parent : Control + +var centerPoint = Vector2(0,0) +var currentForce = Vector2(0,0) +var last_pointer_position : Vector2 = Vector2() + +var currentPointerIDX = INACTIVE_IDX; + +var listener : Entity = null + +func _ready(): + parent = get_node("..") + listener = get_node(listenerNodePath) as Entity + + set_process_input(true) + +func get_force(): + return currentForce + +func _input(event): + var incomingPointer = extractPointerIdx(event) + + if incomingPointer == INACTIVE_IDX: + return + + if need2ChangeActivePointer(event): + if (currentPointerIDX != incomingPointer) and event.is_pressed(): + currentPointerIDX = incomingPointer; + last_pointer_position = Vector2(event.position.x - parent.get_global_rect().position.x, event.position.y - parent.get_global_rect().position.y); + + get_tree().set_input_as_handled() + + var theSamePointer = currentPointerIDX == incomingPointer + if isActive() and theSamePointer: + process_input(event) + +func need2ChangeActivePointer(event): #touch down inside analog + if event is InputEventMouseButton or event is InputEventScreenTouch: + return parent.get_global_rect().has_point(Vector2(event.position.x, event.position.y)) + else: + return false + +func isActive(): + return currentPointerIDX != INACTIVE_IDX + +func extractPointerIdx(event): + var touch = event is InputEventScreenTouch + var drag = event is InputEventScreenDrag + var mouseButton = event is InputEventMouseButton + var mouseMove = event is InputEventMouseMotion + + #print(event) + if touch: + return event.index + + elif drag: + + + return event.index + elif mouseButton or mouseMove: + #plog("SOMETHING IS VERYWRONG??, I HAVE MOUSE ON TOUCH DEVICE") + return INACTIVE_IDX + else: + return INACTIVE_IDX + +func process_input(event): + calculateForce(event.position.x - parent.get_global_rect().position.x, event.position.y - parent.get_global_rect().position.y) + + var isReleased = isReleased(event) + if isReleased: + reset() + + get_tree().set_input_as_handled() + + +func reset(): + currentPointerIDX = INACTIVE_IDX + ##calculateForce(0, 0) + last_pointer_position = Vector2() + +func calculateForce(var x, var y): + var v : Vector2 = Vector2(x, y) + currentForce = last_pointer_position - v + last_pointer_position = v + + sendSignal2Listener() + +func sendSignal2Listener(): + if (listener != null): +# listener.analog_force_change(currentForce, self) + listener.queue_camera_rotation(currentForce) + +func isPressed(event): + if event is InputEventMouseMotion: + return (InputEventMouse.button_mask == 1) + elif event is InputEventScreenTouch: + return event.is_pressed() + +func isReleased(event): + if event is InputEventScreenTouch: + return !event.is_pressed() + elif event is InputEventMouseButton: + return !event.is_pressed() + diff --git a/game/ui/touch_pad/analog.gd b/game/ui/touch_pad/analog.gd new file mode 100644 index 0000000..d48122c --- /dev/null +++ b/game/ui/touch_pad/analog.gd @@ -0,0 +1,156 @@ +extends Node2D + +# This is by someone else TODO check! + +const INACTIVE_IDX = -1; +export var isDynamicallyShowing = false +export (NodePath) var listenerNodePath : NodePath = "/root/game/player" +export var padname = "" + +var ball +var bg +var animation_player +var parent +var listenerNode + +var centerPoint = Vector2(0,0) +var currentForce = Vector2(0,0) +var halfSize = Vector2() +var ballPos = Vector2() +var squaredHalfSizeLength = 0 +var currentPointerIDX = INACTIVE_IDX; + +func _ready(): + set_process_input(true) + bg = get_node("bg") + ball = get_node("ball") + animation_player = get_node("AnimationPlayer") + parent = get_parent() + halfSize = bg.texture.get_size()/2 + squaredHalfSizeLength = halfSize.x * halfSize.y + + if (listenerNodePath != "" && listenerNodePath!=null): + listenerNode = get_node(listenerNodePath) + elif listenerNodePath=="": + listenerNode = null + +# isDynamicallyShowing = isDynamicallyShowing and parent extends Control + if isDynamicallyShowing: + modulate.a = 0 +# hide() + +func get_force(): + return currentForce + +func _unhandled_input(event): + + var incomingPointer = extractPointerIdx(event) + #print(incomingPointer) + + if incomingPointer == INACTIVE_IDX: + return + + if need2ChangeActivePointer(event): + if (currentPointerIDX != incomingPointer) and event.is_pressed(): + currentPointerIDX = incomingPointer; + showAtPos(Vector2(event.position.x, event.position.y)); + get_tree().set_input_as_handled() + + var theSamePointer = currentPointerIDX == incomingPointer + if isActive() and theSamePointer: + process_input(event) + +func need2ChangeActivePointer(event): #touch down inside analog + if event is InputEventMouseButton or event is InputEventScreenTouch: + if isDynamicallyShowing: + #print(get_parent().get_global_rect()) + return get_parent().get_global_rect().has_point(Vector2(event.position.x, event.position.y)) + else: + var length = (global_position - Vector2(event.position.x, event.position.y)).length_squared(); + return length < squaredHalfSizeLength + else: + return false + +func isActive(): + return currentPointerIDX != INACTIVE_IDX + +func extractPointerIdx(event): + var touch = event is InputEventScreenTouch + var drag = event is InputEventScreenDrag + var mouseButton = event is InputEventMouseButton + var mouseMove = event is InputEventMouseMotion + + #print(event) + if touch: + return event.index + + elif drag: + + + return event.index + elif mouseButton or mouseMove: + #plog("SOMETHING IS VERYWRONG??, I HAVE MOUSE ON TOUCH DEVICE") + return INACTIVE_IDX + else: + return INACTIVE_IDX + +func process_input(event): + calculateForce(event.position.x - global_position.x, event.position.y - global_position.y) + updateBallPos() + + var isReleased = isReleased(event) + if isReleased: + reset() + + get_tree().set_input_as_handled() + + +func reset(): + currentPointerIDX = INACTIVE_IDX + calculateForce(0, 0) + + if isDynamicallyShowing: + hide() + else: + updateBallPos() + +func showAtPos(pos): + if isDynamicallyShowing: + animation_player.play("alpha_in", 0.2) + global_position = pos + +func hide(): + animation_player.play("alpha_out", 0.2) + +func updateBallPos(): + ballPos.x = halfSize.x * currentForce.x #+ halfSize.x + ballPos.y = halfSize.y * -currentForce.y #+ halfSize.y + ball.position = Vector2(ballPos.x, ballPos.y) + +func calculateForce(var x, var y): + #get direction + currentForce.x = (x - centerPoint.x)/halfSize.x + currentForce.y = -(y - centerPoint.y)/halfSize.y + #print(currentForce.x, currentForce.y) + #limit + #print(currentForce.length_squared()) + if currentForce.length_squared()>1: + currentForce=currentForce/currentForce.length() + + sendSignal2Listener() + +func sendSignal2Listener(): + if (listenerNode != null): + listenerNode.analog_force_change(currentForce, self) + +func isPressed(event): + if event is InputEventMouseMotion: + return (InputEventMouse.button_mask == 1) + elif event is InputEventScreenTouch: + return event.is_pressed() + +func isReleased(event): + if event is InputEventScreenTouch: + return !event.is_pressed() + elif event is InputEventMouseButton: + return !event.is_pressed() diff --git a/game/ui/touch_pad/analog.tscn b/game/ui/touch_pad/analog.tscn new file mode 100644 index 0000000..a5187c5 --- /dev/null +++ b/game/ui/touch_pad/analog.tscn @@ -0,0 +1,94 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://ui/touch_pad/analog.gd" type="Script" id=1] +[ext_resource path="res://ui/touch_pad/big_circle.png" type="Texture" id=2] +[ext_resource path="res://ui/touch_pad/small_circle.png" type="Texture" id=3] + +[sub_resource type="Animation" id=1] +length = 5.0 +tracks/0/type = "value" +tracks/0/path = NodePath(".:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ) ] +} + +[sub_resource type="Animation" id=2] +step = 1.0 +tracks/0/type = "value" +tracks/0/path = NodePath(".:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 0 ), +"update": 0, +"values": [ Color( 0, 0, 0, 0 ) ] +} + +[sub_resource type="Animation" id=3] +tracks/0/type = "value" +tracks/0/path = NodePath("ball:rotation_degrees") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("ball:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ) ] +} + +[sub_resource type="Animation" id=4] +tracks/0/type = "value" +tracks/0/path = NodePath(".:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ) ] +} + +[node name="Analog" type="Node2D"] +script = ExtResource( 1 ) +__meta__ = { +"__editor_plugin_screen__": "2D" +} +isDynamicallyShowing = true + +[node name="bg" type="Sprite" parent="."] +texture = ExtResource( 2 ) + +[node name="ball" type="Sprite" parent="."] +texture = ExtResource( 3 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/alpha_in = SubResource( 1 ) +anims/alpha_out = SubResource( 2 ) +anims/ball_center = SubResource( 3 ) +anims/default = SubResource( 4 ) diff --git a/game/ui/touch_pad/analog.xml b/game/ui/touch_pad/analog.xml new file mode 100644 index 0000000..2152ca6 --- /dev/null +++ b/game/ui/touch_pad/analog.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + 1 + False + 0.1 + "value" + ".:visibility/opacity" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 1 + + + + + + 5 + False + 0.1 + "value" + ".:visibility/opacity" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 1 + + + + + + 1 + False + 0.1 + "value" + "ball:transform/pos" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 0, 0 + + + "value" + "ball:transform/rot" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 0 + + + + + + 1 + False + 1 + "value" + ".:visibility/opacity" + 1 + + "cont" + True + "times" + 0 + "transitions" + 1 + "values" + + 0 + + + + + + + "conn_count" + 0 + "conns" + + "editable_instances" + + + "names" + + "Analog" + "transform/pos" + "script/script" + "__meta__" + "isDynamicallyShowing" + "listenerNodePath" + "name" + "Node2D" + "bg" + "texture" + "Sprite" + "ball" + "AnimationPlayer" + "playback/process_mode" + "playback/default_blend_time" + "root/root" + "anims/default" + "anims/alpha_in" + "anims/ball_center" + "anims/alpha_out" + "playback/active" + "playback/speed" + "blend_times" + "autoplay" + + "node_count" + 4 + "node_paths" + + + "nodes" + -1, -1, 7, 0, -1, 6, 1, 0, 2, 1, 3, 2, 4, 3, 5, 4, 6, 4, 0, 0, 0, 10, 8, -1, 1, 9, 5, 0, 0, 0, 10, 11, -1, 1, 9, 6, 0, 0, 0, 12, 12, -1, 11, 13, 7, 14, 8, 15, 9, 16, 10, 17, 11, 18, 12, 19, 13, 20, 14, 21, 15, 22, 16, 23, 4, 0 + "variants" + + 192.941, 221.425 + + + "__editor_plugin_screen__" + "2D" + "__editor_plugin_states__" + + "2D" + + "ofs" + -534.358, 78.6721 + "snap_grid" + True + "snap_offset" + 0, 0 + "snap_pixel" + False + "snap_relative" + False + "snap_rotation" + False + "snap_rotation_offset" + 0 + "snap_rotation_step" + 0.261799 + "snap_show_grid" + False + "snap_step" + 10, 10 + "zoom" + 0.814506 + + "3D" + + "ambient_light_color" + 0.15, 0.15, 0.15, 1 + "default_light" + True + "default_srgb" + False + "deflight_rot_x" + 0.942478 + "deflight_rot_y" + 0.628319 + "fov" + 45 + "show_grid" + True + "show_origin" + True + "viewport_mode" + 1 + "viewports" + + + "distance" + 4 + "listener" + True + "pos" + -0.972839, 5.12177, 4.10017 + "use_environment" + False + "use_orthogonal" + False + "x_rot" + 0 + "y_rot" + 0 + + + "distance" + 4 + "listener" + False + "pos" + 0, 0, 0 + "use_environment" + False + "use_orthogonal" + False + "x_rot" + 0 + "y_rot" + 0 + + + "distance" + 4 + "listener" + False + "pos" + 0, 0, 0 + "use_environment" + False + "use_orthogonal" + False + "x_rot" + 0 + "y_rot" + 0 + + + "distance" + 4 + "listener" + False + "pos" + 0, 0, 0 + "use_environment" + False + "use_orthogonal" + False + "x_rot" + 0 + "y_rot" + 0 + + + "zfar" + 500 + "znear" + 0.1 + + "Anim" + + "visible" + False + + + "__editor_run_settings__" + + "custom_args" + "-l $scene" + "run_mode" + 0 + + + False + "" + + + 1 + 0 + ".." + + + + + True + 1 + + + + "version" + 2 + + + + \ No newline at end of file diff --git a/game/ui/touch_pad/big_circle.png b/game/ui/touch_pad/big_circle.png new file mode 100644 index 0000000..f5e305b Binary files /dev/null and b/game/ui/touch_pad/big_circle.png differ diff --git a/game/ui/touch_pad/big_circle.png.import b/game/ui/touch_pad/big_circle.png.import new file mode 100644 index 0000000..4fba719 --- /dev/null +++ b/game/ui/touch_pad/big_circle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/big_circle.png-3e7d1c39c6dde9ffecb18aecfb2a2a19.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/touch_pad/big_circle.png" +dest_files=[ "res://.import/big_circle.png-3e7d1c39c6dde9ffecb18aecfb2a2a19.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/game/ui/touch_pad/small_circle.png b/game/ui/touch_pad/small_circle.png new file mode 100644 index 0000000..5bc2c84 Binary files /dev/null and b/game/ui/touch_pad/small_circle.png differ diff --git a/game/ui/touch_pad/small_circle.png.import b/game/ui/touch_pad/small_circle.png.import new file mode 100644 index 0000000..4b1aff8 --- /dev/null +++ b/game/ui/touch_pad/small_circle.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/small_circle.png-035ef8e6fee54222401287369836bd6a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://ui/touch_pad/small_circle.png" +dest_files=[ "res://.import/small_circle.png-035ef8e6fee54222401287369836bd6a.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/game/ui/unitframes/TargetUnitframe.gd b/game/ui/unitframes/TargetUnitframe.gd new file mode 100644 index 0000000..1143967 --- /dev/null +++ b/game/ui/unitframes/TargetUnitframe.gd @@ -0,0 +1,99 @@ +extends UnitFrame + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (PackedScene) var aura_entry_scene : PackedScene + +export (NodePath) var name_text_path : NodePath +export (NodePath) var health_range_path : NodePath +export (NodePath) var health_text_path : NodePath +export (NodePath) var aura_grid_path : NodePath + +var _name_text : Label +var _health_range : Range +var _health_text : Label +var _aura_grid : GridContainer + +var _player : Entity + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + _name_text = get_node(name_text_path) as Label + _health_range = get_node(health_range_path) as Range + _health_text = get_node(health_text_path) as Label + _aura_grid = get_node(aura_grid_path) as GridContainer + +func set_player(p_player : Entity) -> void: + if not _player == null and is_instance_valid(_player): + _player.get_health().disconnect("c_changed", self, "_on_player_health_changed") + _player.disconnect("caura_added", self, "on_caura_added") + _player.disconnect("caura_removed", self, "on_caura_removed") + _player.disconnect("cdied", self, "cdied") + + for a in _aura_grid.get_children(): + _aura_grid.remove_child(a) + a.queue_free(); + + _player = null + set_process(false) + + if p_player == null: + hide() + return + + _player = p_player + + for index in range(_player.cget_aura_count()): + var aura : AuraData = _player.cget_aura(index) + + on_caura_added(aura) + + + _player.connect("caura_added", self, "on_caura_added") + _player.connect("caura_removed", self, "on_caura_removed") + _player.connect("cdied", self, "cdied") + + var health = _player.get_health() + _on_player_health_changed(health) + health.connect("c_changed", self, "_on_player_health_changed") + + _name_text.text = _player.centity_name + + set_process(true) + show() + +func on_caura_added(aura_data : AuraData) -> void: + var created_node : Node = aura_entry_scene.instance() + + _aura_grid.add_child(created_node) + created_node.owner = _aura_grid + + created_node.set_aura_data(aura_data) + +func on_caura_removed(aura_data : AuraData) -> void: + for bn in _aura_grid.get_children(): + if bn.get_aura_data() == aura_data: + _aura_grid.remove_child(bn) + bn.queue_free() + return + +func _on_player_health_changed(health : Stat) -> void: + if health.cmax == 0: + _health_range.min_value = 0 + _health_range.max_value = 1 + _health_range.value = 0 + + _health_text.text = "" + + return + + _health_range.min_value = 0 + _health_range.max_value = health.cmax + _health_range.value = health.ccurrent + + _health_text.text = str(health.ccurrent) + "/" + str(health.cmax) + +func cdied(entity : Entity) -> void: + set_player(null) diff --git a/game/ui/unitframes/TargetUnitframe.tscn b/game/ui/unitframes/TargetUnitframe.tscn new file mode 100644 index 0000000..5671b41 --- /dev/null +++ b/game/ui/unitframes/TargetUnitframe.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/unitframes/TargetUnitframe.gd" type="Script" id=1] +[ext_resource path="res://ui/auraframe/AuraEntry.tscn" type="PackedScene" id=2] + +[node name="TargetUnitframe" type="UnitFrame"] +margin_left = 151.0 +margin_right = 300.0 +margin_bottom = 57.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +aura_entry_scene = ExtResource( 2 ) +name_text_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/Label") +health_range_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/MarginContainer/ProgressBar") +health_text_path = NodePath("MarginContainer/HBoxContainer/VBoxContainer/MarginContainer/Label") +aura_grid_path = NodePath("auras") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_bottom = -1.0 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 147.0 +margin_bottom = 54.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HBoxContainer"] +margin_right = 145.0 +margin_bottom = 52.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_right = 145.0 +margin_bottom = 14.0 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/HBoxContainer/VBoxContainer"] +margin_top = 18.0 +margin_right = 145.0 +margin_bottom = 32.0 + +[node name="ProgressBar" type="ProgressBar" parent="MarginContainer/HBoxContainer/VBoxContainer/MarginContainer"] +margin_right = 145.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +percent_visible = false + +[node name="Label" type="Label" parent="MarginContainer/HBoxContainer/VBoxContainer/MarginContainer"] +margin_right = 145.0 +margin_bottom = 14.0 +align = 1 +valign = 1 + +[node name="auras" type="GridContainer" parent="."] +margin_left = 1.0 +margin_top = 61.0 +margin_right = 149.0 +margin_bottom = 193.0 +columns = 9 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/unitframes/UnitframeBase.gd b/game/ui/unitframes/UnitframeBase.gd new file mode 100644 index 0000000..4948f1c --- /dev/null +++ b/game/ui/unitframes/UnitframeBase.gd @@ -0,0 +1,90 @@ +extends Container + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export (NodePath) var name_text_path : NodePath +export (NodePath) var level_text_path : NodePath +export (NodePath) var health_range_path : NodePath +export (NodePath) var health_text_path : NodePath +export (NodePath) var xp_range_path : NodePath + +var _name_text : Label +var _level_text : Label +var _health_range : Range +var _health_text : Label +var _xp_range : Range + +var _player : Entity + +func _ready() -> void: + _name_text = get_node(name_text_path) + _level_text = get_node(level_text_path) + _health_range = get_node(health_range_path) + _health_text = get_node(health_text_path) + _xp_range = get_node(xp_range_path) + +func set_player(p_player: Entity) -> void: + if not _player == null: + _player.get_health().disconnect("c_changed", self, "_on_player_health_changed") + _player.disconnect("cname_changed", self, "cname_changed") + _player.disconnect("con_level_up", self, "clevel_changed") + _player.disconnect("con_level_changed", self, "clevel_changed") + _player.disconnect("con_xp_gained", self, "con_xp_gained") + _player.disconnect("centity_data_changed", self, "centity_data_changed") + + _player = null + + if p_player == null: + return + + _player = p_player + + _player.connect("cname_changed", self, "cname_changed") + _player.connect("con_level_up", self, "clevel_changed") + _player.connect("con_level_changed", self, "clevel_changed") + _player.connect("con_xp_gained", self, "con_xp_gained") + _player.connect("centity_data_changed", self, "centity_data_changed") + + var health = _player.get_health() + _on_player_health_changed(health) + health.connect("c_changed", self, "_on_player_health_changed") + + _name_text.text = _player.centity_name + _level_text.text = str(_player.clevel) + + clevel_changed(_player, 0) + con_xp_gained(_player, 0) + +func _on_player_health_changed(health: Stat) -> void: + if health.cmax == 0: + _health_range.min_value = 0 + _health_range.max_value = 1 + _health_range.value = 0 + + _health_text.text = "" + + return + + _health_range.min_value = 0 + _health_range.max_value = health.cmax + _health_range.value = health.ccurrent + + _health_text.text = str(health.ccurrent) + "/" + str(health.cmax) + +func cname_changed(entity: Entity) -> void: + _name_text.text = _player.centity_name + +func clevel_changed(entity: Entity, value : int) -> void: + _level_text.text = str(_player.clevel) + + _xp_range.min_value = 0 + _xp_range.max_value = Entities.get_xp_data().get_xp(_player.clevel) + +func con_xp_gained(entity: Entity, val: int) -> void: + _xp_range.value = _player.cxp + +func centity_data_changed(data: EntityData) -> void: + var health = _player.get_health() + _on_player_health_changed(health) diff --git a/game/ui/unitframes/UnitframeBase.tscn b/game/ui/unitframes/UnitframeBase.tscn new file mode 100644 index 0000000..60cab94 --- /dev/null +++ b/game/ui/unitframes/UnitframeBase.tscn @@ -0,0 +1,87 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/unitframes/UnitframeBase.gd" type="Script" id=1] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=2] + +[node name="UnitFrame" type="PanelContainer"] +margin_right = 150.0 +margin_bottom = 61.0 +theme = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +name_text_path = NodePath("VBoxContainer/HBoxContainer/Label") +level_text_path = NodePath("VBoxContainer/HBoxContainer/Label2") +health_range_path = NodePath("VBoxContainer/MarginContainer/ProgressBar") +health_text_path = NodePath("VBoxContainer/MarginContainer/Label") +xp_range_path = NodePath("VBoxContainer/XPBar") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 146.0 +margin_bottom = 57.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 142.0 +margin_bottom = 15.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_right = 138.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 + +[node name="Label2" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_left = 142.0 +margin_right = 142.0 +margin_bottom = 15.0 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] +margin_top = 16.0 +margin_right = 142.0 +margin_bottom = 31.0 + +[node name="ProgressBar" type="ProgressBar" parent="VBoxContainer/MarginContainer"] +margin_right = 142.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +percent_visible = false + +[node name="Label" type="Label" parent="VBoxContainer/MarginContainer"] +margin_right = 142.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +align = 1 +valign = 1 + +[node name="MarginContainer2" type="MarginContainer" parent="VBoxContainer"] +margin_top = 32.0 +margin_right = 142.0 +margin_bottom = 47.0 + +[node name="ResourceBar" type="ProgressBar" parent="VBoxContainer/MarginContainer2"] +margin_right = 142.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +percent_visible = false + +[node name="Label" type="Label" parent="VBoxContainer/MarginContainer2"] +margin_right = 142.0 +margin_bottom = 15.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="XPBar" type="ProgressBar" parent="VBoxContainer"] +margin_top = 48.0 +margin_right = 142.0 +margin_bottom = 53.6018 +rect_min_size = Vector2( 20, 5 ) +size_flags_horizontal = 3 +percent_visible = false diff --git a/game/ui/windows/CharacterWindow.tscn b/game/ui/windows/CharacterWindow.tscn new file mode 100644 index 0000000..fcfed61 --- /dev/null +++ b/game/ui/windows/CharacterWindow.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="CharacterWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 40.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer"] +margin_top = 12.0 +margin_right = 968.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 +text = "Equipment" + +[node name="Button" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 976.0 +margin_right = 1016.0 +margin_bottom = 40.0 +rect_min_size = Vector2( 40, 40 ) +text = "X" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/game/ui/windows/CraftItemDescription.gd b/game/ui/windows/CraftItemDescription.gd new file mode 100644 index 0000000..13c7ee0 --- /dev/null +++ b/game/ui/windows/CraftItemDescription.gd @@ -0,0 +1,26 @@ +extends HBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var icon_path : NodePath +export(NodePath) var name_label_path : NodePath +export(NodePath) var description_label_path : NodePath + +var _icon : TextureRect +var _name_label : Label +var _description_label : RichTextLabel + +func _ready(): + _icon = get_node(icon_path) as TextureRect + _name_label = get_node(name_label_path) as Label + _description_label = get_node(description_label_path) as RichTextLabel + +func set_item(item: CraftRecipeHelper) -> void: + if item == null: + return + + _icon.texture = item.item.icon + _name_label.text = item.item.text_name + _description_label.text = item.item.text_name diff --git a/game/ui/windows/CraftingWindow.gd b/game/ui/windows/CraftingWindow.gd new file mode 100644 index 0000000..8be85a2 --- /dev/null +++ b/game/ui/windows/CraftingWindow.gd @@ -0,0 +1,124 @@ +extends PanelContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var item_entry_scene : PackedScene +export(PackedScene) var recipe_selector_scene : PackedScene + +export(NodePath) var item_container_path : NodePath +export(NodePath) var tools_container_path : NodePath +export(NodePath) var materials_container_path : NodePath +export(NodePath) var recipe_selector_container_path : NodePath + +export(NodePath) var recipe_selector_main_on : NodePath +export(NodePath) var recipe_selector_main_off : NodePath +export(NodePath) var materials_container_main_on : NodePath +export(NodePath) var materials_container_main_off : NodePath + +var _item_container : Node +var _tools_container : Node +var _materials_container : Node +var _recipe_selector_container : Node + +var _selected_craft_recipe : CraftRecipe + +var _player : Entity + +var _recipe_selector_main_on : Node +var _recipe_selector_main_off : Node +var _materials_container_main_on : Node +var _materials_container_main_off : Node + +func _ready(): + _item_container = get_node(item_container_path) + _tools_container = get_node(tools_container_path) + _materials_container = get_node(materials_container_path) + _recipe_selector_container = get_node(recipe_selector_container_path) + + _recipe_selector_main_on = get_node(recipe_selector_main_on) + _recipe_selector_main_off = get_node(recipe_selector_main_off) + _materials_container_main_on = get_node(materials_container_main_on) + _materials_container_main_off = get_node(materials_container_main_off) + +func set_player(entity: Entity) -> void: + _player = entity + + set_category(CraftRecipe.CRAFT_CATEGORY_ALCHEMY) + +func set_category(category: int) -> void: + for ch in _recipe_selector_container.get_children(): + ch.queue_free() + + var count : int = 0 + for i in range(_player.gets_craft_recipe_count()): + var cr : CraftRecipe = _player.gets_craft_recipe(i) + + if cr.category == category: + var rss : Node = recipe_selector_scene.instance() + _recipe_selector_container.add_child(rss) + rss.owner = _recipe_selector_container + + rss.set_recipe(cr, self) + + count += 1 + + if count == 0: + _recipe_selector_main_on.visible = false + _recipe_selector_main_off.visible = true + else: + _recipe_selector_main_on.visible = true + _recipe_selector_main_off.visible = false + + +func request_craft() -> void: + _player.crequest_craft(_selected_craft_recipe.id) + + for ch in _tools_container.get_children(): + ch.refresh() + + for ch in _materials_container.get_children(): + ch.refresh() + +func select_recipe(recipe : CraftRecipe) -> void: + _selected_craft_recipe = recipe + + if _selected_craft_recipe == null: + _materials_container_main_on.visible = false + _materials_container_main_off.visible = true + + return + else: + _materials_container_main_on.visible = true + _materials_container_main_off.visible = false + + _item_container.set_item(recipe.item) + + for ch in _tools_container.get_children(): + ch.queue_free() + + for ch in _materials_container.get_children(): + ch.queue_free() + + for i in range(recipe.get_required_tools_count()): + var ih : CraftRecipeHelper = recipe.get_required_tool(i) + + if ih == null: + continue + + var ie : Node = item_entry_scene.instance() + _tools_container.add_child(ie) + ie.owner = _tools_container + ie.set_item(_player, ih) + + for i in range(recipe.get_required_materials_count()): + var ih : CraftRecipeHelper = recipe.get_required_material(i) + + if ih == null: + continue + + var ie : Node = item_entry_scene.instance() + _materials_container.add_child(ie) + ie.owner = _materials_container + ie.set_item(_player, ih) diff --git a/game/ui/windows/CraftingWindow.tscn b/game/ui/windows/CraftingWindow.tscn new file mode 100644 index 0000000..dc883e3 --- /dev/null +++ b/game/ui/windows/CraftingWindow.tscn @@ -0,0 +1,311 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/windows/CraftingWindow.gd" type="Script" id=2] +[ext_resource path="res://ui/crafting/RecipeSelector.tscn" type="PackedScene" id=3] +[ext_resource path="res://ui/crafting/ItemEntry.tscn" type="PackedScene" id=4] +[ext_resource path="res://ui/windows/CraftItemDescription.gd" type="Script" id=5] + +[sub_resource type="ButtonGroup" id=1] + +[node name="CraftingWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +item_entry_scene = ExtResource( 4 ) +recipe_selector_scene = ExtResource( 3 ) +item_container_path = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription") +tools_container_path = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/ToolsContainer") +materials_container_path = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/MaterialContainer") +recipe_selector_container_path = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes/VBoxContainer") +recipe_selector_main_on = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes") +recipe_selector_main_off = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/CenterContainer2") +materials_container_main_on = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry") +materials_container_main_off = NodePath("VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CenterContainer") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 + +[node name="Header" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="VBoxContainer/Header"] +margin_top = 7.0 +margin_right = 972.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Crafting" + +[node name="Button" type="Button" parent="VBoxContainer/Header"] +margin_left = 976.0 +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="Categories" type="HBoxContainer" parent="VBoxContainer"] +margin_top = 38.0 +margin_right = 1016.0 +margin_bottom = 64.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/Categories"] +margin_right = 1016.0 +margin_bottom = 26.0 +rect_min_size = Vector2( 0, 20 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="Alchemy" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 198.0 +margin_right = 298.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +pressed = true +group = SubResource( 1 ) +text = "Alchemy" + +[node name="Smithing" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 302.0 +margin_right = 402.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Smithing" + +[node name="Enchanting" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 406.0 +margin_right = 506.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Enchantig" + +[node name="Engineering" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 510.0 +margin_right = 610.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Engineering" + +[node name="Tailoring" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 614.0 +margin_right = 714.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Tailoring" + +[node name="Other" type="Button" parent="VBoxContainer/Categories/HBoxContainer2"] +margin_left = 718.0 +margin_right = 818.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 100, 0 ) +toggle_mode = true +group = SubResource( 1 ) +text = "Other" + +[node name="VBoxContainer" type="MarginContainer" parent="VBoxContainer"] +margin_top = 72.0 +margin_right = 1016.0 +margin_bottom = 592.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 520.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer"] +margin_right = 674.0 +margin_bottom = 520.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="CraftEntry" type="VBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer"] +visible = false +margin_left = 4.0 +margin_top = 4.0 +margin_right = 718.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.6 +custom_constants/separation = 10 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry"] +margin_right = 714.0 +margin_bottom = 472.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +scroll_horizontal_enabled = false + +[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer"] +margin_right = 714.0 +margin_bottom = 122.0 +size_flags_horizontal = 3 + +[node name="CraftItemDescription" type="HBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_right = 714.0 +margin_bottom = 60.0 +alignment = 1 +script = ExtResource( 5 ) +icon_path = NodePath("VBoxContainer/PanelContainer/TextureRect") +name_label_path = NodePath("PanelContainer2/VBoxContainer/Label") +description_label_path = NodePath("PanelContainer2/VBoxContainer/RichTextLabel") + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription"] +margin_left = 175.0 +margin_right = 235.0 +margin_bottom = 60.0 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/VBoxContainer"] +margin_right = 60.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 60, 60 ) + +[node name="TextureRect" type="TextureRect" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/VBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 56.0 +margin_bottom = 56.0 +expand = true + +[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription"] +margin_left = 239.0 +margin_right = 539.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 300, 0 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 296.0 +margin_bottom = 56.0 + +[node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/PanelContainer2/VBoxContainer"] +margin_right = 292.0 +margin_bottom = 15.0 + +[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2/CraftItemDescription/PanelContainer2/VBoxContainer"] +margin_top = 23.0 +margin_right = 292.0 +margin_bottom = 52.0 +size_flags_vertical = 3 +text = " +" +scroll_active = false + +[node name="Label2" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_top = 68.0 +margin_right = 714.0 +margin_bottom = 83.0 +text = "Tools" + +[node name="ToolsContainer" type="VBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_top = 91.0 +margin_right = 714.0 +margin_bottom = 91.0 + +[node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_top = 99.0 +margin_right = 714.0 +margin_bottom = 114.0 +text = "Materials" + +[node name="MaterialContainer" type="VBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/ScrollContainer/VBoxContainer2"] +margin_top = 122.0 +margin_right = 714.0 +margin_bottom = 122.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry"] +margin_top = 482.0 +margin_right = 714.0 +margin_bottom = 512.0 +alignment = 1 + +[node name="CraftButton" type="Button" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/HBoxContainer"] +margin_left = 307.0 +margin_right = 407.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 100, 30 ) +text = "Craft" + +[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 670.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CenterContainer"] +margin_left = 288.0 +margin_top = 248.0 +margin_right = 378.0 +margin_bottom = 263.0 +text = "Select a recipe" +align = 1 +valign = 1 + +[node name="PanelContainer2" type="PanelContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer"] +margin_left = 678.0 +margin_right = 1016.0 +margin_bottom = 520.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.5 + +[node name="Recipes" type="ScrollContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2"] +visible = false +margin_left = 4.0 +margin_top = 4.0 +margin_right = 286.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/Recipes"] +margin_right = 282.0 +size_flags_horizontal = 3 + +[node name="CenterContainer2" type="CenterContainer" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 334.0 +margin_bottom = 516.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer2/CenterContainer2"] +margin_left = 135.0 +margin_top = 248.0 +margin_right = 195.0 +margin_bottom = 263.0 +text = "No recipes" +align = 1 +valign = 1 +[connection signal="pressed" from="VBoxContainer/Header/Button" to="." method="hide"] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Alchemy" to="." method="set_category" binds= [ 1 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Smithing" to="." method="set_category" binds= [ 2 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Enchanting" to="." method="set_category" binds= [ 4 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Engineering" to="." method="set_category" binds= [ 5 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Tailoring" to="." method="set_category" binds= [ 3 ]] +[connection signal="pressed" from="VBoxContainer/Categories/HBoxContainer2/Other" to="." method="set_category" binds= [ 0 ]] +[connection signal="pressed" from="VBoxContainer/VBoxContainer/HBoxContainer/PanelContainer/CraftEntry/HBoxContainer/CraftButton" to="." method="request_craft"] diff --git a/game/ui/windows/InventoryWindow.tscn b/game/ui/windows/InventoryWindow.tscn new file mode 100644 index 0000000..69e3f87 --- /dev/null +++ b/game/ui/windows/InventoryWindow.tscn @@ -0,0 +1,125 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://ui/windows/inventory/ItemEntry.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/windows/base/BaseWindow.tscn" type="PackedScene" id=2] + +[node name="InventoryWindow" type="Control"] +margin_right = 888.0 +margin_bottom = 463.0 + +[node name="BaseWindow" parent="." instance=ExtResource( 2 )] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = 0.0 +margin_bottom = 0.0 + +[node name="VSplitContainer" parent="BaseWindow/MarginContainer" index="0"] +margin_right = 888.0 +margin_bottom = 463.0 + +[node name="Header" parent="BaseWindow/MarginContainer/VSplitContainer" index="0"] +margin_right = 888.0 + +[node name="VSplitContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Header" index="0"] +margin_right = 888.0 + +[node name="MarginContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer" index="0"] +margin_right = 888.0 + +[node name="HSplitContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer" index="0"] +margin_right = 886.0 + +[node name="Label" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer/HSplitContainer" index="0"] +margin_right = 826.0 + +[node name="Button" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer/HSplitContainer" index="1"] +margin_left = 826.0 +margin_right = 884.0 + +[node name="HSeparator" parent="BaseWindow/MarginContainer/VSplitContainer/Header/VSplitContainer" index="1"] +margin_right = 888.0 + +[node name="Content" parent="BaseWindow/MarginContainer/VSplitContainer" index="1"] +margin_right = 888.0 +margin_bottom = 463.0 + +[node name="PanelContainer" type="MarginContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content" index="0"] +margin_right = 888.0 +margin_bottom = 431.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer"] +margin_right = 888.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer"] +margin_right = 432.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 428.0 +margin_bottom = 427.0 + +[node name="ItemContainer" type="VBoxContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer/ScrollContainer"] +margin_right = 424.0 +margin_bottom = 47.0 +size_flags_horizontal = 3 + +[node name="ItemEntry" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer/ScrollContainer/ItemContainer" instance=ExtResource( 1 )] +margin_right = 424.0 +margin_bottom = 47.0 + +[node name="Filter" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer"] +margin_left = 440.0 +margin_right = 448.0 +margin_bottom = 431.0 +size_flags_vertical = 3 + +[node name="PanelContainer2" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer"] +margin_left = 456.0 +margin_right = 888.0 +margin_bottom = 431.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 428.0 +margin_bottom = 427.0 + +[node name="HeadSlot" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer"] +margin_right = 424.0 +margin_bottom = 8.0 + +[node name="MarginContainer" type="MarginContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer"] +margin_top = 16.0 +margin_right = 424.0 +margin_bottom = 24.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer/MarginContainer"] +margin_right = 424.0 +margin_bottom = 8.0 + +[node name="PanelContainer" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer/MarginContainer/HBoxContainer"] +margin_right = 8.0 +margin_bottom = 8.0 + +[node name="Control" type="Control" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer/MarginContainer/HBoxContainer"] +margin_left = 16.0 +margin_right = 408.0 +margin_bottom = 8.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer2" type="PanelContainer" parent="BaseWindow/MarginContainer/VSplitContainer/Content/PanelContainer/HBoxContainer/PanelContainer2/VBoxContainer/MarginContainer/HBoxContainer"] +margin_left = 416.0 +margin_right = 424.0 +margin_bottom = 8.0 + +[editable path="BaseWindow"] diff --git a/game/ui/windows/SpellBookWindow.gd b/game/ui/windows/SpellBookWindow.gd new file mode 100644 index 0000000..670223a --- /dev/null +++ b/game/ui/windows/SpellBookWindow.gd @@ -0,0 +1,173 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var spell_entry_container_path : NodePath +export(NodePath) var prev_button_path : NodePath +export(NodePath) var next_button_path : NodePath +export(NodePath) var spell_points_label_path : NodePath + +export(bool) var show_not_learnable : bool = false + +var _spell_entry_container : Node +var _spell_entries : Array + +var _prev_button : Button +var _next_button : Button +var _spell_points_label : Label + +var _player : Entity + +var _page : int = 0 +var _max_pages : int = 0 +var _entity_data : EntityData +var _character_class : EntityClassData + +var _spells : Array + +func _ready() -> void: + _spell_entries.clear() + + _spell_entry_container = get_node(spell_entry_container_path) + + for i in range(_spell_entry_container.get_child_count()): + _spell_entries.append(_spell_entry_container.get_child(i)) + + _prev_button = get_node(prev_button_path) + _next_button = get_node(next_button_path) + _spell_points_label = get_node(spell_points_label_path) + + _prev_button.connect("pressed", self, "dec_page") + _next_button.connect("pressed", self, "inc_page") + + connect("visibility_changed", self, "_visibility_changed") + +func inc_page() -> void: + if _character_class == null: + return + + _page += 1 + + if _page > _max_pages: + _page = _max_pages + + refresh_entries() + +func dec_page() -> void: + if _character_class == null: + return + + _page -= 1 + + if _page < 0: + _page = 0 + + refresh_entries() + +func refresh_entries() -> void: + if _character_class == null or _player == null: + return + + var i : int = 0 + var n : int = 0 +# for n in range(len(_spell_entries)): + while n < len(_spell_entries): + var spindex : int = i + (_page * len(_spell_entries)) + + if spindex >= _spells.size(): + _spell_entries[i].set_spell(_player, null) + i += 1 + n += 1 + continue + + var spell : Spell = _spells[spindex] + + if not show_not_learnable: + if not _player.hasc_spell(spell) and spell.training_required_spell \ + and not _player.hasc_spell(spell.training_required_spell): + i += 1 + continue + + + _spell_entries[n].set_spell(_player, spell) + i += 1 + n += 1 + + +func refresh_all() -> void: + if _player == null: + return + + + + if _character_class == null: + return + + _max_pages = int(_character_class.get_num_spells() / len(_spell_entries)) + + if _page > _max_pages: + _page = _max_pages + + _spell_points_label.text = "Free spell points: " + str(_player.getc_free_spell_points()) + + refresh_entries() + + +func _visibility_changed() -> void: + if visible: + refresh_all() + +func set_player(p_player: Entity) -> void: + if _player != null: + _player.disconnect("cfree_spell_points_changed", self, "cfree_spell_points_changed") + _player.disconnect("centity_data_changed", self, "centity_data_changed") + + _player = p_player + + _player.connect("cfree_spell_points_changed", self, "cfree_spell_points_changed") + _player.connect("centity_data_changed", self, "centity_data_changed") + + if _player != null: + centity_data_changed(_player.centity_data) + else: + centity_data_changed(null) + +func cfree_spell_points_changed(entity: Entity, value: int) -> void: + _spell_points_label.text = "Free spell points: " + str(_player.getc_free_spell_points()) + +func centity_data_changed(data: EntityData): + _spells.clear() + + _entity_data = null + _character_class = null + + if data == null: + return + + _entity_data = _player.centity_data + _character_class = _entity_data.entity_class_data + + if _character_class == null: + return + + for i in range(_character_class.get_num_spells()): + _spells.append(_character_class.get_spell(i)) + + _spells.sort_custom(CustomSpellSorter, "sort") + + +class CustomSpellSorter: + static func sort(a, b): + var res = a.text_name.casecmp_to(b.text_name) + + if res == 0: + if a.rank < b.rank: + return true + return false + elif res == 1: + return false + + return true + diff --git a/game/ui/windows/SpellBookWindow.tscn b/game/ui/windows/SpellBookWindow.tscn new file mode 100644 index 0000000..cb6a4a3 --- /dev/null +++ b/game/ui/windows/SpellBookWindow.tscn @@ -0,0 +1,179 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://ui/windows/SpellContainer.tscn" type="PackedScene" id=1] +[ext_resource path="res://ui/windows/SpellBookWindow.gd" type="Script" id=4] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=5] + +[node name="SpellBookWindow" type="PanelContainer"] +margin_right = 884.0 +margin_bottom = 510.0 +theme = ExtResource( 5 ) +script = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} +spell_entry_container_path = NodePath("PagedContent/GridContainer") +prev_button_path = NodePath("PagedContent/Controls/HBoxContainer/Button2") +next_button_path = NodePath("PagedContent/Controls/HBoxContainer/Button") +spell_points_label_path = NodePath("PagedContent/Controls/HBoxContainer/SpellPoints") +show_not_learnable = true + +[node name="PagedContent" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 880.0 +margin_bottom = 506.0 + +[node name="Header" type="HBoxContainer" parent="PagedContent"] +margin_right = 876.0 +margin_bottom = 30.0 + +[node name="Label" type="Label" parent="PagedContent/Header"] +margin_top = 7.0 +margin_right = 54.0 +margin_bottom = 22.0 +text = "Spellbook" + +[node name="HBoxContainer" type="HBoxContainer" parent="PagedContent/Header"] +margin_left = 58.0 +margin_right = 832.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 + +[node name="Button" type="Button" parent="PagedContent/Header/HBoxContainer"] +margin_left = 337.0 +margin_right = 437.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 100, 0 ) +text = "Nature" + +[node name="Button" type="Button" parent="PagedContent/Header"] +margin_left = 836.0 +margin_right = 876.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="GridContainer" type="GridContainer" parent="PagedContent"] +margin_top = 38.0 +margin_right = 876.0 +margin_bottom = 464.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +columns = 2 + +[node name="SpellContainer" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 0.0 +margin_right = 436.0 +margin_bottom = 67.0 + +[node name="SpellContainer2" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 0.0 +margin_right = 876.0 +margin_bottom = 67.0 + +[node name="SpellContainer3" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 71.0 +margin_right = 436.0 +margin_bottom = 138.0 + +[node name="SpellContainer4" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 71.0 +margin_right = 876.0 +margin_bottom = 138.0 + +[node name="SpellContainer5" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 142.0 +margin_right = 436.0 +margin_bottom = 209.0 + +[node name="SpellContainer6" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 142.0 +margin_right = 876.0 +margin_bottom = 209.0 + +[node name="SpellContainer7" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 213.0 +margin_right = 436.0 +margin_bottom = 280.0 + +[node name="SpellContainer8" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 213.0 +margin_right = 876.0 +margin_bottom = 280.0 + +[node name="SpellContainer9" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 284.0 +margin_right = 436.0 +margin_bottom = 351.0 + +[node name="SpellContainer10" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 284.0 +margin_right = 876.0 +margin_bottom = 351.0 + +[node name="SpellContainer11" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 0.0 +margin_top = 355.0 +margin_right = 436.0 +margin_bottom = 422.0 + +[node name="SpellContainer12" parent="PagedContent/GridContainer" instance=ExtResource( 1 )] +margin_left = 440.0 +margin_top = 355.0 +margin_right = 876.0 +margin_bottom = 422.0 + +[node name="Controls" type="MarginContainer" parent="PagedContent"] +margin_top = 472.0 +margin_right = 876.0 +margin_bottom = 502.0 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="PagedContent/Controls"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 874.0 +margin_bottom = 28.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button2" type="Button" parent="PagedContent/Controls/HBoxContainer"] +margin_right = 288.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "< Previous page" + +[node name="SpellPoints" type="Label" parent="PagedContent/Controls/HBoxContainer"] +margin_left = 292.0 +margin_top = 5.0 +margin_right = 580.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +align = 1 +valign = 1 + +[node name="Button" type="Button" parent="PagedContent/Controls/HBoxContainer"] +margin_left = 584.0 +margin_right = 872.0 +margin_bottom = 26.269 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Next page >" +[connection signal="pressed" from="PagedContent/Header/Button" to="." method="hide"] diff --git a/game/ui/windows/SpellContainer.gd b/game/ui/windows/SpellContainer.gd new file mode 100644 index 0000000..109016b --- /dev/null +++ b/game/ui/windows/SpellContainer.gd @@ -0,0 +1,117 @@ +extends Control + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(NodePath) var icon_path : NodePath +export(NodePath) var name_label_path : NodePath +#export(NodePath) var description_label_path : NodePath +export(NodePath) var known_label_path : NodePath +export(NodePath) var learn_button_path : NodePath +export(NodePath) var spell_button_path : NodePath +export(NodePath) var popup_path : NodePath + +export(Color) var known_color : Color = Color.white +export(Color) var not_known_color : Color = Color.gray +export(Color) var unlearnable_color : Color = Color.gray + +var _icon : TextureRect +var _name_label : Label +#var _description_label : RichTextLabel +var _spell_button : Button +var _popup : Popup + +var _spell : Spell +var _player : Entity + +var _spell_known : bool + +func _ready() -> void: + _icon = get_node(icon_path) as TextureRect + _name_label = get_node(name_label_path) as Label +# _description_label = get_node(description_label_path) as RichTextLabel + _spell_button = get_node(spell_button_path) as Button + _popup = get_node(popup_path) as Popup + +func set_spell(p_player : Entity, p_spell: Spell) -> void: + + if _player != null: + _player.disconnect("cspell_added", self, "cspell_added") + _player.disconnect("cspell_removed", self, "cspell_removed") + + _spell = p_spell + _player = p_player + + _player.connect("cspell_added", self, "cspell_added") + _player.connect("cspell_removed", self, "cspell_removed") + +# _icon.set_spell(_spell) + _spell_button.set_spell(_spell) + _popup.set_spell(_spell) + + if not _spell == null: + _spell_known = _player.hasc_spell(p_spell) + + _icon.texture = _spell.icon + _name_label.text = _spell.text_name + " (Rank " + str(_spell.rank) + ")" + else: + _icon.texture = null + + _name_label.text = "....." + + update_spell_indicators() + +func learn_spell() -> void: + if _player == null or _spell == null: + return + + if _player.cfree_spell_points <= 0: + return + + _player.crequest_spell_learn(_spell.id) + +func cspell_added(entity: Entity, spell: Spell) -> void: + if spell == _spell: + _spell_known = true + + update_spell_indicators() + +func cspell_removed(entity: Entity, spell: Spell) -> void: + if spell == _spell: + _spell_known = false + + update_spell_indicators() + +func spell_button_pressed() -> void: + var pos : Vector2 = _spell_button.rect_global_position + pos.x += _spell_button.rect_size.x + + _popup.popup(Rect2(pos, _popup.rect_size)) + +func update_spell_indicators(): + if _spell_known: + get_node(known_label_path).show() + get_node(learn_button_path).hide() + + modulate = known_color + else: + if _spell != null: + if _spell.training_required_spell: + if not _player.hasc_spell(_spell.training_required_spell): + + get_node(known_label_path).hide() + get_node(learn_button_path).show() + + modulate = unlearnable_color + + return + + get_node(known_label_path).hide() + get_node(learn_button_path).show() + + modulate = not_known_color + + modulate = not_known_color + + diff --git a/game/ui/windows/SpellContainer.tscn b/game/ui/windows/SpellContainer.tscn new file mode 100644 index 0000000..ed333ac --- /dev/null +++ b/game/ui/windows/SpellContainer.tscn @@ -0,0 +1,150 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/windows/SpellDragAndDropSpellBook.gd" type="Script" id=1] +[ext_resource path="res://ui/windows/SpellContainer.gd" type="Script" id=2] +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=3] +[ext_resource path="res://ui/spellbook/SpellEntryPopup.gd" type="Script" id=5] + +[node name="SpellContainer" type="Control"] +margin_left = 290.0 +margin_top = 306.0 +margin_right = 576.0 +margin_bottom = 370.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource( 3 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} +icon_path = NodePath("PanelContainer/HBoxContainer/Button/CenterContainer/SpellIcon") +name_label_path = NodePath("PanelContainer/HBoxContainer/SpellName") +known_label_path = NodePath("SpellEntryPopup/VBoxContainer/PanelContainer") +learn_button_path = NodePath("SpellEntryPopup/VBoxContainer/LearnButton") +spell_button_path = NodePath("PanelContainer/HBoxContainer/Button") +popup_path = NodePath("SpellEntryPopup") +not_known_color = Color( 0.596078, 0.596078, 0.596078, 1 ) +unlearnable_color = Color( 0.772549, 0.192157, 0.192157, 1 ) + +[node name="PanelContainer" type="PanelContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 282.0 +margin_bottom = 60.0 + +[node name="Button" type="Button" parent="PanelContainer/HBoxContainer"] +margin_right = 55.0 +margin_bottom = 56.0 +rect_min_size = Vector2( 55, 55 ) +script = ExtResource( 1 ) + +[node name="CenterContainer" type="MarginContainer" parent="PanelContainer/HBoxContainer/Button"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 51.0 +margin_bottom = 51.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SpellIcon" type="TextureRect" parent="PanelContainer/HBoxContainer/Button/CenterContainer"] +margin_right = 47.0 +margin_bottom = 47.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true + +[node name="SpellName" type="Label" parent="PanelContainer/HBoxContainer"] +margin_left = 59.0 +margin_top = 20.0 +margin_right = 278.0 +margin_bottom = 35.0 +size_flags_horizontal = 3 +text = "......" + +[node name="SpellEntryPopup" type="PopupPanel" parent="."] +margin_left = 64.0 +margin_top = 4.0 +margin_right = 360.0 +margin_bottom = 207.0 +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} +label_path = NodePath("VBoxContainer/HBoxContainer/Label") +desc_label_path = NodePath("VBoxContainer/RichTextLabel") + +[node name="VBoxContainer" type="VBoxContainer" parent="SpellEntryPopup"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 4.0 +margin_right = -4.0 +margin_bottom = -4.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="SpellEntryPopup/VBoxContainer"] +margin_right = 288.0 +margin_bottom = 26.0 + +[node name="Label" type="Label" parent="SpellEntryPopup/VBoxContainer/HBoxContainer"] +margin_top = 5.0 +margin_right = 250.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 + +[node name="Button" type="Button" parent="SpellEntryPopup/VBoxContainer/HBoxContainer"] +margin_left = 258.0 +margin_right = 288.0 +margin_bottom = 26.269 +rect_min_size = Vector2( 30, 0 ) +text = "X" + +[node name="HSeparator2" type="HSeparator" parent="SpellEntryPopup/VBoxContainer"] +margin_top = 34.0 +margin_right = 288.0 +margin_bottom = 42.0 + +[node name="PanelContainer" type="PanelContainer" parent="SpellEntryPopup/VBoxContainer"] +visible = false +margin_top = 50.0 +margin_right = 296.0 +margin_bottom = 80.0 +rect_min_size = Vector2( 0, 20 ) + +[node name="KnownLabel" type="Label" parent="SpellEntryPopup/VBoxContainer/PanelContainer"] +margin_left = 4.0 +margin_top = 7.0 +margin_right = 292.0 +margin_bottom = 22.0 +text = "Known" +align = 1 +valign = 1 + +[node name="LearnButton" type="Button" parent="SpellEntryPopup/VBoxContainer"] +margin_top = 50.0 +margin_right = 288.0 +margin_bottom = 76.269 +text = "Learn" + +[node name="RichTextLabel" type="RichTextLabel" parent="SpellEntryPopup/VBoxContainer"] +margin_top = 84.0 +margin_right = 288.0 +margin_bottom = 195.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +[connection signal="pressed" from="PanelContainer/HBoxContainer/Button" to="." method="spell_button_pressed"] +[connection signal="pressed" from="SpellEntryPopup/VBoxContainer/HBoxContainer/Button" to="SpellEntryPopup" method="hide"] +[connection signal="pressed" from="SpellEntryPopup/VBoxContainer/LearnButton" to="." method="learn_spell"] diff --git a/game/ui/windows/SpellDragAndDropSpellBook.gd b/game/ui/windows/SpellDragAndDropSpellBook.gd new file mode 100644 index 0000000..c4585d0 --- /dev/null +++ b/game/ui/windows/SpellDragAndDropSpellBook.gd @@ -0,0 +1,29 @@ +extends Button + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +var spell + +func set_spell(p_spell): + spell = p_spell + +func get_drag_data(pos): + if spell == null: + return null + + var tr = TextureRect.new() + tr.texture = spell.icon + tr.expand = true + +# tr.rect_size = rect_size + tr.rect_size = Vector2(45, 45) + set_drag_preview(tr) + + var esd = ESDragAndDrop.new() + + esd.type = ESDragAndDrop.ES_DRAG_AND_DROP_TYPE_SPELL + esd.item_id = spell.id + + return esd diff --git a/game/ui/windows/TalentWindow.gd b/game/ui/windows/TalentWindow.gd new file mode 100644 index 0000000..7707b6d --- /dev/null +++ b/game/ui/windows/TalentWindow.gd @@ -0,0 +1,80 @@ +extends PanelContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +export(PackedScene) var spec_scene : PackedScene +export(PackedScene) var spec_switcher_scene : PackedScene +export(NodePath) var spec_container_path : NodePath +export(NodePath) var spec_switcher_path : NodePath + +var _spec_container : Node +var _spec_switcher_container : Node + +var _data : EntityData +var _player : Entity + +func _ready(): + _spec_container = get_node(spec_container_path) + _spec_switcher_container = get_node(spec_switcher_path) + +func set_player(player : Entity) -> void: + if _player != null: + _player.disconnect("centity_data_changed", self, "centity_data_changed") + + _player = player + + if _player == null: + return + + _player.connect("centity_data_changed", self, "centity_data_changed") + + centity_data_changed(_player.centity_data) + + +func select_spec(index : int) -> void: + for ch in _spec_container.get_children(): + ch.hide() + + if _spec_container.get_child_count() <= index: + return + + _spec_container.get_child(index).show() + +func centity_data_changed(data: EntityData) -> void: + if _data == data: + return + + _data = data + + for ch in _spec_container.get_children(): + ch.queue_free() + _spec_container.remove_child(ch) + + for ch in _spec_switcher_container.get_children(): + ch.queue_free() + + if data == null or data.entity_class_data == null: + return + + var cd : EntityClassData = data.entity_class_data + + for i in range(cd.get_num_specs()): + var spec : CharacterSpec = cd.get_spec(i) + + if spec == null: + continue + +# var b : Node = spec_switcher_scene.instance() +# _spec_switcher_container.add_child(b) +# b.owner = _spec_switcher_container +# b.set_spec_index(self, i) + + var s : Node = spec_scene.instance() + _spec_container.add_child(s) + s.owner = _spec_container + s.name = spec.text_name + + s.set_spec(_player, spec, i) + diff --git a/game/ui/windows/TalentWindow.tscn b/game/ui/windows/TalentWindow.tscn new file mode 100644 index 0000000..c65d20e --- /dev/null +++ b/game/ui/windows/TalentWindow.tscn @@ -0,0 +1,76 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] +[ext_resource path="res://ui/talents/Spec.tscn" type="PackedScene" id=2] +[ext_resource path="res://ui/windows/TalentWindow.gd" type="Script" id=3] +[ext_resource path="res://ui/talents/talent_switcher_button.tscn" type="PackedScene" id=4] + +[node name="TalentWindow" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +spec_scene = ExtResource( 2 ) +spec_switcher_scene = ExtResource( 4 ) +spec_container_path = NodePath("VBoxContainer/TabContainer") +spec_switcher_path = NodePath("VBoxContainer/Header/SpecSwitcher") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 1020.0 +margin_bottom = 596.0 + +[node name="Header" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 0, 30 ) +alignment = 1 + +[node name="Label" type="Label" parent="VBoxContainer/Header"] +margin_top = 7.0 +margin_right = 42.0 +margin_bottom = 22.0 +text = "Talents" + +[node name="SpecSwitcher" type="HBoxContainer" parent="VBoxContainer/Header"] +margin_left = 50.0 +margin_right = 968.0 +margin_bottom = 30.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="Button" type="Button" parent="VBoxContainer/Header"] +margin_left = 976.0 +margin_right = 1016.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 40, 30 ) +text = "X" + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] +visible = false +margin_top = 48.0 +margin_right = 1016.0 +margin_bottom = 576.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/MarginContainer"] +margin_right = 1016.0 +margin_bottom = 528.0 +scroll_horizontal_enabled = false + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/MarginContainer/ScrollContainer"] +margin_right = 1016.0 +size_flags_horizontal = 3 + +[node name="TabContainer" type="TabContainer" parent="VBoxContainer"] +margin_top = 38.0 +margin_right = 1016.0 +margin_bottom = 592.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +[connection signal="pressed" from="VBoxContainer/Header/Button" to="." method="hide"] diff --git a/game/ui/windows/VBoxContainer.gd b/game/ui/windows/VBoxContainer.gd new file mode 100644 index 0000000..db9e53c --- /dev/null +++ b/game/ui/windows/VBoxContainer.gd @@ -0,0 +1,17 @@ +extends VBoxContainer + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/game/ui/windows/base/BaseWindow.tscn b/game/ui/windows/base/BaseWindow.tscn new file mode 100644 index 0000000..a5a7286 --- /dev/null +++ b/game/ui/windows/base/BaseWindow.tscn @@ -0,0 +1,79 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://ui/theme/ui_theme.tres" type="Theme" id=1] + +[node name="BaseWindow" type="Panel"] +margin_right = 523.0 +margin_bottom = 427.0 +theme = ExtResource( 1 ) +__meta__ = { +"_edit_lock_": true +} + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_lock_": true +} + +[node name="VSplitContainer" type="VSplitContainer" parent="MarginContainer"] +margin_right = 523.0 +margin_bottom = 427.0 +dragger_visibility = 2 + +[node name="Header" type="MarginContainer" parent="MarginContainer/VSplitContainer"] +margin_right = 523.0 +margin_bottom = 32.0 + +[node name="VSplitContainer" type="VSplitContainer" parent="MarginContainer/VSplitContainer/Header"] +margin_right = 523.0 +margin_bottom = 32.0 +size_flags_horizontal = 3 +collapsed = true +dragger_visibility = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VSplitContainer/Header/VSplitContainer"] +margin_right = 523.0 +margin_bottom = 24.0 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 1 + +[node name="HSplitContainer" type="HSplitContainer" parent="MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 521.0 +margin_bottom = 23.0 +dragger_visibility = 2 + +[node name="Label" type="Label" parent="MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer/HSplitContainer"] +margin_right = 485.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 5 +text = "Header" +valign = 1 + +[node name="Button" type="Button" parent="MarginContainer/VSplitContainer/Header/VSplitContainer/MarginContainer/HSplitContainer"] +margin_left = 485.0 +margin_right = 519.0 +margin_bottom = 21.0 +hint_tooltip = "Close" +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.07 +text = "X" + +[node name="HSeparator" type="HSeparator" parent="MarginContainer/VSplitContainer/Header/VSplitContainer"] +margin_top = 24.0 +margin_right = 523.0 +margin_bottom = 32.0 +size_flags_horizontal = 3 +size_flags_vertical = 0 + +[node name="Content" type="MarginContainer" parent="MarginContainer/VSplitContainer"] +margin_top = 32.0 +margin_right = 523.0 +margin_bottom = 427.0 diff --git a/game/ui/windows/base/PagedContentContainer.tscn b/game/ui/windows/base/PagedContentContainer.tscn new file mode 100644 index 0000000..b7ce2a6 --- /dev/null +++ b/game/ui/windows/base/PagedContentContainer.tscn @@ -0,0 +1,56 @@ +[gd_scene format=2] + +[node name="PagedContent" type="VSplitContainer"] +margin_right = 523.0 +margin_bottom = 400.0 +dragger_visibility = 2 + +[node name="Content" type="MarginContainer" parent="."] +margin_right = 523.0 +margin_bottom = 376.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 + +[node name="Controls" type="MarginContainer" parent="."] +margin_top = 376.0 +margin_right = 523.0 +margin_bottom = 400.0 +custom_constants/margin_right = 2 +custom_constants/margin_top = 2 +custom_constants/margin_left = 2 +custom_constants/margin_bottom = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="Controls"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 521.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Button2" type="Button" parent="Controls/HBoxContainer"] +margin_right = 154.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "< Previous page" + +[node name="MarginContainer" type="MarginContainer" parent="Controls/HBoxContainer"] +margin_left = 158.0 +margin_right = 359.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 1.3 + +[node name="Button" type="Button" parent="Controls/HBoxContainer"] +margin_left = 363.0 +margin_right = 519.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Next page >" diff --git a/game/ui/windows/base/ScrollContainer.tscn b/game/ui/windows/base/ScrollContainer.tscn new file mode 100644 index 0000000..f5ef79a --- /dev/null +++ b/game/ui/windows/base/ScrollContainer.tscn @@ -0,0 +1,22 @@ +[gd_scene format=2] + +[node name="ScrollContainer" type="HSplitContainer"] +editor/display_folded = true +margin_right = 523.0 +margin_bottom = 403.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +collapsed = true +dragger_visibility = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +margin_right = 511.0 +margin_bottom = 403.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VScrollBar" type="VScrollBar" parent="."] +margin_left = 511.0 +margin_right = 523.0 +margin_bottom = 403.0 + diff --git a/game/ui/windows/inventory/ItemEntry.tscn b/game/ui/windows/inventory/ItemEntry.tscn new file mode 100644 index 0000000..ba1094a --- /dev/null +++ b/game/ui/windows/inventory/ItemEntry.tscn @@ -0,0 +1,54 @@ +[gd_scene format=2] + +[node name="ItemEntry" type="PanelContainer"] +margin_right = 398.0 +margin_bottom = 97.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 384.0 +margin_bottom = 83.0 + +[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] +margin_right = 28.0 +margin_bottom = 69.0 + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/PanelContainer"] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 14.0 +margin_bottom = 55.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +margin_left = 36.0 +margin_right = 370.0 +margin_bottom = 69.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="HBoxContainer/VBoxContainer"] +margin_right = 334.0 +margin_bottom = 53.0 + +[node name="Name" type="Label" parent="HBoxContainer/VBoxContainer/PanelContainer"] +margin_left = 14.0 +margin_top = 14.0 +margin_right = 320.0 +margin_bottom = 39.0 +text = "Sword of Big Damage" + +[node name="StatsGrid" type="GridContainer" parent="HBoxContainer/VBoxContainer"] +margin_top = 61.0 +margin_right = 334.0 +margin_bottom = 61.0 + +[node name="SpellsContainer" type="VBoxContainer" parent="HBoxContainer/VBoxContainer"] +margin_top = 69.0 +margin_right = 334.0 +margin_bottom = 69.0