Added everything from Broken Seals 2D as a base.

This commit is contained in:
Relintai 2019-12-21 02:07:43 +01:00
parent 463902bb09
commit ed8c13c542
430 changed files with 23163 additions and 0 deletions

1
HEADS Normal file
View File

@ -0,0 +1 @@
{"engine": "48edf6333029fc961528892af190201197b44c40", "world_generator": "58e38c07bd798a44232ecdfe02db038e3c434239", "entity_spell_system": "e9a7a92fb289ba1927a1b74c27eeb4d776e7a4a1", "ui_extensions": "271dcf89e9afe5cb6350de2f2433c8ebf8aba785", "texture_packer": "604c330188e220c15d10ea5bd545a6fc5aab0132", "fastnoise": "41b7ea05a1f7aa2b8ecddaa1fd739e64d6970f7e", "ess_data": "7506c76b7d400335895a0a2c3a28913886eed2f9"}

16
game/.gitignore vendored Normal file
View File

@ -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

View File

@ -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)

View File

@ -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 )

View File

@ -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: Vector2) -> 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 : Vector2, 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 : Vector2) -> 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 : Vector2, 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.position = 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 : Vector2, 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 : Vector2, 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 : Vector2) -> 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 : Vector2, 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.position = 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()

View File

@ -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

637
game/autoload/Logger.gd Normal file
View File

@ -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)

View File

@ -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 )

View File

@ -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)

View File

@ -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 )

203
game/autoload/Server.gd Normal file
View File

@ -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, Vector2(10, 10))
remotesync func cspawn_player(info : Dictionary, sid : int, pos : Vector2):
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, Vector2(0, 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)

View File

@ -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 )

View File

@ -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)

View File

@ -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 )

View File

@ -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)

View File

@ -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 ) ]

View File

@ -0,0 +1,37 @@
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
randomize()
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()

View File

@ -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 )

View File

@ -0,0 +1,61 @@
[gd_scene load_steps=10 format=2]
[ext_resource path="res://player/CharacterSkeleton2D.gd" type="Script" id=1]
[ext_resource path="res://characters/CharacterSideModel.tscn" type="PackedScene" id=2]
[ext_resource path="res://characters/CharacterFrontModel.tscn" type="PackedScene" id=3]
[ext_resource path="res://scripts/item_visuals/CharacterAtlas2D.gd" type="Script" id=4]
[ext_resource path="res://scripts/item_visuals/CharacterAtlasEntry2D.gd" type="Script" id=5]
[ext_resource path="res://characters/char_t1_outline_split.png" type="Texture" id=6]
[sub_resource type="CharacterAtlasEntry" id=3]
script = ExtResource( 5 )
front_rect = Rect2( 101, 15, 9, 12 )
back_rect = Rect2( 74, 18, 9, 12 )
right_rect = Rect2( 8, 13, 9, 12 )
left_rect = Rect2( 8, 13, 9, 12 )
[sub_resource type="CharacterAtlasEntry" id=2]
script = ExtResource( 5 )
front_rect = Rect2( 102, 2, 7, 8 )
back_rect = Rect2( 75, 5, 7, 8 )
right_rect = Rect2( 9, 0, 7, 8 )
left_rect = Rect2( 9, 0, 7, 8 )
[sub_resource type="CharacterAtlas" id=1]
script = ExtResource( 4 )
comments = "HUMANOID_BONE_HIP = 0,
HUMANOID_BONE_TORSO = 1,
HUMANOID_BONE_LEG_R = 2,
HUMANOID_BONE_FOOT_R = 3,
HUMANOID_BONE_TOE_R = 4,
HUMANOID_BONE_LEG_L = 5,
HUMANOID_BONE_FOOT_L = 6,
HUMANOID_BONE_TOE_L = 7,
HUMANOID_BONE_ARM_R = 8,
#HUMANOID_BONE_SHOULDER_GUARD_R = 0,
HUMANOID_BONE_HAND_R = 9,
HUMANOID_BONE_FINGERS_R = 10,
HUMANOID_BONE_ARM_L = 11,
#HUMANOID_BONE_SHOULDER_GUARD_L = 0,
HUMANOID_BONE_HAND_L = 12,
HUMANOID_BONE_FINGERS_L = 13,
HUMANOID_BONE_HEAD = 14,
HUMANOID_BONE_HEAD_TOP = 15,
HUMANOID_BONES_MAX = 16,"
texture = ExtResource( 6 )
slots = [ null, SubResource( 3 ), null, null, null, null, null, null, null, null, null, null, null, null, SubResource( 2 ), null ]
[node name="Character" type="CharacterSkeleton"]
script = ExtResource( 1 )
front_node_path = NodePath("CharacterFrontModel")
front_animation_player_path = NodePath("../Character/CharacterFrontModel/AnimationPlayer")
front_animation_tree_path = NodePath("../Character/CharacterFrontModel/AnimationTree")
side_node_path = NodePath("CharacterSideModel")
side_animation_player_path = NodePath("../Character/CharacterSideModel/AnimationPlayer")
side_animation_tree_path = NodePath("../Character/CharacterSideModel/AnimationTree")
character_atlas = SubResource( 1 )
[node name="CharacterFrontModel" parent="." instance=ExtResource( 3 )]
visible = false
[node name="CharacterSideModel" parent="." instance=ExtResource( 2 )]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,109 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://characters/char_t1_outline_split.png" type="Texture" id=1]
[node name="CharacterTest1" type="Node2D"]
[node name="model" type="Sprite" parent="."]
visible = false
texture = ExtResource( 1 )
offset = Vector2( 0, -15.5 )
region_enabled = true
region_rect = Rect2( 49, 21, 13, 37 )
[node name="Shadow" type="Sprite" parent="."]
position = Vector2( -0.5, 0 )
texture = ExtResource( 1 )
region_enabled = true
region_rect = Rect2( 27, 57, 14, 6 )
[node name="RightUpperHand" type="Sprite" parent="."]
position = Vector2( -3.5, -25.5 )
texture = ExtResource( 1 )
offset = Vector2( 0, 3 )
region_enabled = true
region_rect = Rect2( 1, 11, 4, 9 )
[node name="RightLowerHand" type="Sprite" parent="."]
position = Vector2( -3.47278, -19.9516 )
texture = ExtResource( 1 )
offset = Vector2( 0, 3 )
region_enabled = true
region_rect = Rect2( 1, 23, 4, 8 )
[node name="Torso" type="Sprite" parent="."]
position = Vector2( 0, -16 )
texture = ExtResource( 1 )
offset = Vector2( 0, -5 )
region_enabled = true
region_rect = Rect2( 8, 13, 9, 12 )
[node name="LeftShoulderGuard" type="Sprite" parent="."]
position = Vector2( -2.5, -25 )
texture = ExtResource( 1 )
offset = Vector2( -1, -1 )
region_enabled = true
region_rect = Rect2( 0.39, 5.79, 6.91, 4.67 )
[node name="Head" type="Sprite" parent="."]
position = Vector2( 0, -26 )
texture = ExtResource( 1 )
offset = Vector2( 0, -4 )
region_enabled = true
region_rect = Rect2( 9, 0, 7, 8 )
[node name="LeftUpperArm" type="Sprite" parent="."]
position = Vector2( 4, -24 )
texture = ExtResource( 1 )
offset = Vector2( 0, 2.5 )
region_enabled = true
region_rect = Rect2( 20, 11, 3, 9 )
[node name="RightShoulderGuard" type="Sprite" parent="."]
position = Vector2( 4, -25.5 )
texture = ExtResource( 1 )
offset = Vector2( 0, -0.5 )
region_enabled = true
region_rect = Rect2( 17.23, 5.56, 6.41, 4.89 )
[node name="RightUpperLeg" type="Sprite" parent="."]
position = Vector2( -2, -13 )
texture = ExtResource( 1 )
offset = Vector2( 0, 3 )
region_enabled = true
region_rect = Rect2( 5, 36, 5, 8 )
[node name="RightLowerLeg" type="Sprite" parent="."]
position = Vector2( -3, -8 )
texture = ExtResource( 1 )
offset = Vector2( 0, 4 )
region_enabled = true
region_rect = Rect2( 3, 48, 7, 10 )
[node name="LeftUpperLeg" type="Sprite" parent="."]
position = Vector2( 2, -12.5 )
texture = ExtResource( 1 )
offset = Vector2( 0, 3 )
region_enabled = true
region_rect = Rect2( 14, 36, 5, 9 )
[node name="LeftLowerLeg" type="Sprite" parent="."]
position = Vector2( 2, -8 )
texture = ExtResource( 1 )
offset = Vector2( 0, 4 )
region_enabled = true
region_rect = Rect2( 14, 48, 5, 10 )
[node name="Hip" type="Sprite" parent="."]
position = Vector2( 0, -14 )
texture = ExtResource( 1 )
region_enabled = true
region_rect = Rect2( 8, 32, 7, 2 )
[node name="LeftLowerArm" type="Sprite" parent="."]
position = Vector2( 4, -18 )
texture = ExtResource( 1 )
offset = Vector2( 0, 2 )
region_enabled = true
region_rect = Rect2( 20, 24, 3, 6 )

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/char_t1_outline_split - Copy.png-88d6d74e7874948f07096fd2e5e6ae3a.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/char_t1_outline_split - Copy.png"
dest_files=[ "res://.import/char_t1_outline_split - Copy.png-88d6d74e7874948f07096fd2e5e6ae3a.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/char_t1_outline_split.png-9c3f609f043903cf305339bc84929b57.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/char_t1_outline_split.png"
dest_files=[ "res://.import/char_t1_outline_split.png-9c3f609f043903cf305339bc84929b57.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

View File

@ -0,0 +1,3 @@
[gd_resource type="AuraGroup" format=2]
[resource]

View File

@ -0,0 +1,3 @@
[gd_resource type="AuraGroup" format=2]
[resource]

View File

@ -0,0 +1,3 @@
[gd_resource type="AuraGroup" format=2]
[resource]

View File

@ -0,0 +1,3 @@
[gd_resource type="AuraGroup" format=2]
[resource]

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )

View File

@ -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 ]

View File

@ -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 ]

View File

@ -0,0 +1,3 @@
[gd_resource type="CharacterSpec" format=2]
[resource]

View File

@ -0,0 +1,6 @@
[gd_resource type="CharacterSpec" format=2]
[resource]
resource_name = "Elementalist Fire"
id = 2
text_name = "Elementalist Fire"

View File

@ -0,0 +1,6 @@
[gd_resource type="CharacterSpec" format=2]
[resource]
resource_name = "Elementalist Water"
id = 3
text_name = "Elementalist Water"

View File

@ -0,0 +1,6 @@
[gd_resource type="CharacterSpec" format=2]
[resource]
resource_name = "Elementalist Ice"
id = 4
text_name = "Elementalist Ice"

View File

@ -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 )

View File

@ -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 )

BIN
game/data/cursors/arrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 B

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 B

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 B

View File

@ -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

BIN
game/data/cursors/ibeam.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

View File

@ -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

BIN
game/data/cursors/speak.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

View File

@ -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

View File

@ -0,0 +1,3 @@
[gd_resource type="DungeonRoomData" format=2]
[resource]

View File

@ -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 )

View File

@ -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 ) ]

View File

@ -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

View File

@ -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

View File

@ -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 )

View File

@ -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 = 60.0
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 )

View File

@ -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 = 60.0
[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 )

View File

@ -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 )

View File

@ -0,0 +1,4 @@
[gd_resource type="EntitySkillData" format=2]
[resource]
id = 1

View File

@ -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 )

93
game/data/fonts/OFL.txt Normal file
View File

@ -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.

Binary file not shown.

View File

@ -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 )

View File

@ -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 )

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -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

View File

@ -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!

View File

@ -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!

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Some files were not shown because too many files have changed in this diff Show More