Took everything from the main repo that I need. Also fixed compile. Nothing works yet.
16
game/.gitignore
vendored
Normal 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
|
28
game/autoload/CursorManager.gd
Normal 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)
|
22
game/autoload/CursorManager.tscn
Normal 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 )
|
375
game/autoload/EntityDataManager.gd
Normal 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: Vector3) -> void:
|
||||||
|
# print("recspawnfor " + global_name)
|
||||||
|
var entity : Entity = networked_player_scene.instance()
|
||||||
|
|
||||||
|
var spawn_parent = _spawn_parent.current_scene
|
||||||
|
|
||||||
|
spawn_parent.add_child(entity)
|
||||||
|
entity.owner = spawn_parent
|
||||||
|
entity.name = str(global_name)
|
||||||
|
entity.from_dict(parse_json(data))
|
||||||
|
|
||||||
|
entity.translation = position
|
||||||
|
|
||||||
|
Logger.info("Player spawned ")
|
||||||
|
|
||||||
|
_players.append(entity)
|
||||||
|
|
||||||
|
remote func creceive_despawn_for(path : NodePath) -> void:
|
||||||
|
# print("recdespawnfor " + path)
|
||||||
|
var ent = get_node_or_null(path)
|
||||||
|
|
||||||
|
if ent:
|
||||||
|
ent.queue_free()
|
||||||
|
|
||||||
|
func spawn_networked_player_from_data(data : String, position : Vector3, network_owner : int) -> Entity:
|
||||||
|
var entity : Entity = networked_player_scene.instance()
|
||||||
|
|
||||||
|
_next_entity_guid += 1
|
||||||
|
|
||||||
|
var spawn_parent = _spawn_parent.current_scene
|
||||||
|
|
||||||
|
spawn_parent.add_child(entity)
|
||||||
|
entity.owner = spawn_parent
|
||||||
|
entity.name = str(network_owner)
|
||||||
|
entity.from_dict(parse_json(data))
|
||||||
|
|
||||||
|
entity.set_network_master(network_owner)
|
||||||
|
entity.translation = position
|
||||||
|
|
||||||
|
Logger.info("Player spawned ")
|
||||||
|
|
||||||
|
_players.append(entity)
|
||||||
|
|
||||||
|
rpc_id(network_owner, "spawn_owned_player", data, position)
|
||||||
|
|
||||||
|
return entity
|
||||||
|
|
||||||
|
puppet func spawn_owned_player(data : String, position : Vector3) -> void:
|
||||||
|
var entity : Entity = player_scene.instance()
|
||||||
|
|
||||||
|
var spawn_parent = _spawn_parent.current_scene
|
||||||
|
|
||||||
|
spawn_parent.add_child(entity)
|
||||||
|
entity.owner = spawn_parent
|
||||||
|
|
||||||
|
entity.from_dict(parse_json(data))
|
||||||
|
entity.name = str(multiplayer.get_network_unique_id())
|
||||||
|
entity.translation = position
|
||||||
|
entity.set_network_master(multiplayer.get_network_unique_id())
|
||||||
|
|
||||||
|
Logger.info("Player spawned ")
|
||||||
|
|
||||||
|
|
||||||
|
func load_player(file_name : String, position : Vector3, network_owner : int) -> Entity:
|
||||||
|
# var createinfo : EntityCreateInfo = EntityCreateInfo.new()
|
||||||
|
#
|
||||||
|
# var cls : EntityData = Entities.get_player_character_data(class_id)
|
||||||
|
#
|
||||||
|
# var class_profile : ClassProfile = Profiles.get_class_profile(class_id)
|
||||||
|
#
|
||||||
|
# createinfo.entity_data = cls
|
||||||
|
# createinfo.player_name = name
|
||||||
|
# createinfo.level = class_profile.level
|
||||||
|
# createinfo.xp = class_profile.xp
|
||||||
|
# createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER
|
||||||
|
|
||||||
|
var entity : Entity = player_scene.instance()
|
||||||
|
|
||||||
|
_next_entity_guid += 1
|
||||||
|
|
||||||
|
var spawn_parent = _spawn_parent.current_scene
|
||||||
|
|
||||||
|
spawn_parent.add_child(entity)
|
||||||
|
entity.owner = spawn_parent
|
||||||
|
|
||||||
|
entity.from_dict(load_file(file_name))
|
||||||
|
|
||||||
|
entity.translation = position
|
||||||
|
# entity.initialize(createinfo)
|
||||||
|
entity.set_network_master(network_owner)
|
||||||
|
|
||||||
|
Logger.info("Player spawned ")
|
||||||
|
|
||||||
|
_players.append(entity)
|
||||||
|
|
||||||
|
return entity
|
||||||
|
|
||||||
|
func spawn_display_player(name : String) -> Entity:
|
||||||
|
var entity : Entity = player_display_scene.instance() as Entity
|
||||||
|
|
||||||
|
entity.name = name
|
||||||
|
|
||||||
|
Logger.info("Player Display spawned")
|
||||||
|
|
||||||
|
return entity
|
||||||
|
|
||||||
|
func spawn_player_for_menu(class_id : int, name : String, parent : Node) -> Entity:
|
||||||
|
var createinfo : EntityCreateInfo = EntityCreateInfo.new()
|
||||||
|
var cls : EntityData = Entities.get_player_character_data(class_id)
|
||||||
|
var class_profile : ClassProfile = Profiles.get_class_profile(class_id)
|
||||||
|
|
||||||
|
createinfo.entity_data = cls
|
||||||
|
createinfo.player_name = name
|
||||||
|
createinfo.level = 1
|
||||||
|
createinfo.xp = class_profile.xp
|
||||||
|
createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER
|
||||||
|
|
||||||
|
var entity : Entity = player_display_scene.instance() as Entity
|
||||||
|
entity.initialize(createinfo)
|
||||||
|
|
||||||
|
var level : int = class_profile.level
|
||||||
|
|
||||||
|
if default_level_override > 0:
|
||||||
|
level = default_level_override
|
||||||
|
|
||||||
|
entity.slevelup(level - 1)
|
||||||
|
|
||||||
|
parent.add_child(entity)
|
||||||
|
entity.owner = parent
|
||||||
|
|
||||||
|
return entity
|
||||||
|
|
||||||
|
func spawn_networked_player(class_id : int, position : Vector3, name : String, node_name : String, sid : int) -> Entity:
|
||||||
|
var createinfo : EntityCreateInfo = EntityCreateInfo.new()
|
||||||
|
|
||||||
|
var cls : EntityData = Entities.get_entity_data(class_id)
|
||||||
|
|
||||||
|
var class_profile : ClassProfile = Profiles.get_class_profile(class_id)
|
||||||
|
|
||||||
|
createinfo.entity_data = cls
|
||||||
|
createinfo.player_name = name
|
||||||
|
createinfo.level = 1
|
||||||
|
createinfo.xp = class_profile.xp
|
||||||
|
createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER
|
||||||
|
|
||||||
|
var entity : Entity = spawn(createinfo, true, position, node_name)
|
||||||
|
|
||||||
|
var level : int = class_profile.level
|
||||||
|
|
||||||
|
if default_level_override > 0:
|
||||||
|
level = default_level_override
|
||||||
|
|
||||||
|
entity.slevelup(level - 1)
|
||||||
|
|
||||||
|
if get_tree().is_network_server():
|
||||||
|
entity.set_network_master(sid)
|
||||||
|
|
||||||
|
Logger.info("Player spawned " + str(createinfo))
|
||||||
|
|
||||||
|
_players.append(entity)
|
||||||
|
|
||||||
|
return entity
|
||||||
|
|
||||||
|
func spawn_player(class_id : int, position : Vector3, name : String, node_name : String, network_owner : int) -> Entity:
|
||||||
|
var createinfo : EntityCreateInfo = EntityCreateInfo.new()
|
||||||
|
|
||||||
|
var cls : EntityData = Entities.get_player_character_data(class_id)
|
||||||
|
|
||||||
|
var class_profile : ClassProfile = Profiles.get_class_profile(class_id)
|
||||||
|
|
||||||
|
createinfo.entity_data = cls
|
||||||
|
createinfo.player_name = name
|
||||||
|
createinfo.level = 1
|
||||||
|
createinfo.xp = class_profile.xp
|
||||||
|
createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_PLAYER
|
||||||
|
|
||||||
|
var entity : Entity = spawn(createinfo, false, position, node_name)
|
||||||
|
|
||||||
|
var level : int = class_profile.level
|
||||||
|
|
||||||
|
if default_level_override > 0:
|
||||||
|
level = default_level_override
|
||||||
|
|
||||||
|
entity.slevelup(level - 1)
|
||||||
|
|
||||||
|
entity.set_network_master(network_owner)
|
||||||
|
|
||||||
|
Logger.info("Player spawned " + str(createinfo))
|
||||||
|
|
||||||
|
_players.append(entity)
|
||||||
|
|
||||||
|
return entity
|
||||||
|
|
||||||
|
func spawn_mob(class_id : int, level : int, position : Vector3) -> Entity:
|
||||||
|
var createinfo : EntityCreateInfo = EntityCreateInfo.new()
|
||||||
|
|
||||||
|
var cls : EntityData = Entities.get_entity_data(class_id)
|
||||||
|
|
||||||
|
if cls == null:
|
||||||
|
print("clsnull")
|
||||||
|
|
||||||
|
createinfo.entity_data = cls
|
||||||
|
createinfo.player_name = "Mob"
|
||||||
|
createinfo.level = 1
|
||||||
|
|
||||||
|
createinfo.entity_controller = EntityEnums.ENITIY_CONTROLLER_AI
|
||||||
|
|
||||||
|
var entity : Entity = spawn(createinfo, false, position)
|
||||||
|
|
||||||
|
if default_level_override > 0:
|
||||||
|
level = default_level_override
|
||||||
|
|
||||||
|
entity.slevelup(level - 1)
|
||||||
|
|
||||||
|
Logger.info("Mob spawned " + str(createinfo))
|
||||||
|
|
||||||
|
_mobs.append(entity)
|
||||||
|
|
||||||
|
return entity
|
||||||
|
|
||||||
|
func spawn(createinfo : EntityCreateInfo, networked : bool, position : Vector3, node_name : String = "") -> Entity:
|
||||||
|
var entity_node : Entity = null
|
||||||
|
|
||||||
|
if not networked:
|
||||||
|
if createinfo.entity_controller == EntityEnums.ENITIY_CONTROLLER_PLAYER:
|
||||||
|
entity_node = player_scene.instance()
|
||||||
|
else:
|
||||||
|
entity_node = mob_scene.instance()
|
||||||
|
else:
|
||||||
|
entity_node = networked_player_scene.instance()
|
||||||
|
|
||||||
|
if entity_node == null:
|
||||||
|
print("EntityManager: entity node is null")
|
||||||
|
return null
|
||||||
|
|
||||||
|
if node_name == "":
|
||||||
|
entity_node.name += "_" + str(_next_entity_guid)
|
||||||
|
else:
|
||||||
|
entity_node.name = node_name
|
||||||
|
|
||||||
|
_next_entity_guid += 1
|
||||||
|
|
||||||
|
var spawn_parent = _spawn_parent.current_scene
|
||||||
|
|
||||||
|
spawn_parent.add_child(entity_node)
|
||||||
|
entity_node.owner = spawn_parent
|
||||||
|
|
||||||
|
entity_node.translation = position
|
||||||
|
|
||||||
|
entity_node.initialize(createinfo)
|
||||||
|
|
||||||
|
return entity_node
|
||||||
|
|
||||||
|
|
||||||
|
func _player_connected(id):
|
||||||
|
pass # Will go unused; not useful here.
|
||||||
|
|
||||||
|
func _player_disconnected(id):
|
||||||
|
#player_info.erase(id) # Erase player from info.
|
||||||
|
pass
|
||||||
|
|
||||||
|
func _connected_ok():
|
||||||
|
# Only called on clients, not server. Send my ID and info to all the other peers.
|
||||||
|
#rpc("register_player", get_tree().get_network_unique_id(), my_info)
|
||||||
|
pass
|
||||||
|
|
||||||
|
func _server_disconnected():
|
||||||
|
pass # Server kicked us; show error and abort.
|
||||||
|
|
||||||
|
func _connected_fail():
|
||||||
|
pass # Could not even connect to server; abort.
|
||||||
|
|
||||||
|
remote func register_player(id, info):
|
||||||
|
# Store the info
|
||||||
|
# player_info[id] = info
|
||||||
|
# If I'm the server, let the new guy know about existing players.
|
||||||
|
# if get_tree().is_network_server():
|
||||||
|
# # Send my info to new player
|
||||||
|
# rpc_id(id, "register_player", 1, my_info)
|
||||||
|
# # Send the info of existing players
|
||||||
|
# for peer_id in player_info:
|
||||||
|
# rpc_id(id, "register_player", peer_id, player_info[peer_id])
|
||||||
|
|
||||||
|
# Call function to update lobby UI here
|
||||||
|
pass
|
||||||
|
|
||||||
|
func load_file(file_name : String) -> Dictionary:
|
||||||
|
|
||||||
|
var f : File = File.new()
|
||||||
|
|
||||||
|
if f.open("user://characters/" + file_name, File.READ) == OK:
|
||||||
|
var st : String = f.get_as_text()
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
var json_err : String = validate_json(st)
|
||||||
|
|
||||||
|
if json_err != "":
|
||||||
|
Logger.error("Save corrupted! " + file_name)
|
||||||
|
Logger.error(json_err)
|
||||||
|
return Dictionary()
|
||||||
|
|
||||||
|
var p = parse_json(st)
|
||||||
|
|
||||||
|
if typeof(p) != TYPE_DICTIONARY:
|
||||||
|
Logger.error("Save corrupted! Not Dict! " + file_name)
|
||||||
|
return Dictionary()
|
||||||
|
|
||||||
|
if p is Dictionary:
|
||||||
|
return p as Dictionary
|
||||||
|
|
||||||
|
return Dictionary()
|
||||||
|
|
||||||
|
func save_player(player: Entity, file_name : String) -> void:
|
||||||
|
var f : File = File.new()
|
||||||
|
|
||||||
|
if f.open("user://characters/" + file_name, File.WRITE) == OK:
|
||||||
|
f.store_string(to_json(player.to_dict()))
|
||||||
|
f.close()
|
26
game/autoload/EntityDataManager.tscn
Normal 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
@ -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)
|
6
game/autoload/Logger.tscn
Normal 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 )
|
85
game/autoload/ProfileManager.gd
Normal 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)
|
||||||
|
|
6
game/autoload/ProfileManager.tscn
Normal 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
@ -0,0 +1,203 @@
|
|||||||
|
extends Node
|
||||||
|
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
export (int) var port : int = 23223
|
||||||
|
|
||||||
|
signal cplayer_master_created(player_master)
|
||||||
|
signal cplayer_master_destroyed(player_master)
|
||||||
|
|
||||||
|
signal splayer_master_created(player_master)
|
||||||
|
signal splayer_master_destroyed(player_master)
|
||||||
|
|
||||||
|
var splayers_dict : Dictionary = {}
|
||||||
|
var splayers_array : Array = []
|
||||||
|
|
||||||
|
var cplayers_dict : Dictionary = {}
|
||||||
|
var cplayers_array : Array = []
|
||||||
|
|
||||||
|
var _sseed : int
|
||||||
|
var _cseed : int
|
||||||
|
|
||||||
|
var local_player_master : PlayerMaster = PlayerMaster.new()
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
#Temporary! REMOVE!
|
||||||
|
get_multiplayer().allow_object_decoding = true
|
||||||
|
|
||||||
|
get_tree().connect("network_peer_connected", self, "_network_peer_connected")
|
||||||
|
get_tree().connect("network_peer_disconnected", self, "_network_peer_disconnected")
|
||||||
|
get_tree().connect("connected_to_server", self, "_connected_to_server")
|
||||||
|
get_tree().connect("connection_failed", self, "_connection_failed")
|
||||||
|
get_tree().connect("server_disconnected", self, "_server_disconnected")
|
||||||
|
|
||||||
|
|
||||||
|
func start_hosting(p_port : int = 0) -> int:
|
||||||
|
if p_port == 0:
|
||||||
|
p_port = port
|
||||||
|
|
||||||
|
var peer : NetworkedMultiplayerENet = NetworkedMultiplayerENet.new()
|
||||||
|
var err : int = peer.create_server(p_port, 32)
|
||||||
|
get_tree().set_network_peer(peer)
|
||||||
|
|
||||||
|
_connected_to_server()
|
||||||
|
|
||||||
|
return err
|
||||||
|
|
||||||
|
func start_hosting_websocket(p_port : int = 0) -> int:
|
||||||
|
if p_port == 0:
|
||||||
|
p_port = port
|
||||||
|
|
||||||
|
var peer : WebSocketServer = WebSocketServer.new()
|
||||||
|
var err : int = peer.listen(p_port, [], true)
|
||||||
|
get_tree().set_network_peer(peer)
|
||||||
|
|
||||||
|
_connected_to_server()
|
||||||
|
|
||||||
|
return err
|
||||||
|
|
||||||
|
func connect_to_server(address : String = "127.0.0.1", p_port : int = 0) -> int:
|
||||||
|
if p_port == 0:
|
||||||
|
p_port = port
|
||||||
|
|
||||||
|
var peer = NetworkedMultiplayerENet.new()
|
||||||
|
var err : int = peer.create_client(address, p_port)
|
||||||
|
get_tree().set_network_peer(peer)
|
||||||
|
|
||||||
|
return err
|
||||||
|
|
||||||
|
func connect_to_server_websocket(address : String = "127.0.0.1", p_port : int = 0) -> int:
|
||||||
|
if p_port == 0:
|
||||||
|
p_port = port
|
||||||
|
|
||||||
|
var peer = WebSocketClient.new()
|
||||||
|
var err : int = peer.connect_to_url(address + ":" + str(p_port), [], true)
|
||||||
|
get_tree().set_network_peer(peer)
|
||||||
|
|
||||||
|
return err
|
||||||
|
|
||||||
|
func _network_peer_connected(id : int) -> void:
|
||||||
|
Logger.verbose("NetworkManager peer connected " + str(id))
|
||||||
|
|
||||||
|
# for p in splayers_array:
|
||||||
|
# rpc_id(id, "cspawn_player", p.my_info, p.sid, p.player.translation)
|
||||||
|
|
||||||
|
var pm : PlayerMaster = PlayerMaster.new()
|
||||||
|
pm.sid = id
|
||||||
|
|
||||||
|
splayers_array.append(pm)
|
||||||
|
splayers_dict[id] = pm
|
||||||
|
|
||||||
|
emit_signal("splayer_master_created", pm)
|
||||||
|
|
||||||
|
rpc_id(id, "cset_seed", _sseed)
|
||||||
|
|
||||||
|
func _network_peer_disconnected(id : int) -> void:
|
||||||
|
Logger.verbose("NetworkManager peer disconnected " + str(id))
|
||||||
|
|
||||||
|
var player : PlayerMaster = splayers_dict[id]
|
||||||
|
splayers_dict.erase(id)
|
||||||
|
|
||||||
|
for pi in range(len(splayers_array)):
|
||||||
|
if (splayers_array[pi] as PlayerMaster) == player:
|
||||||
|
splayers_array.remove(pi)
|
||||||
|
break
|
||||||
|
|
||||||
|
if player:
|
||||||
|
emit_signal("splayer_master_destroyed", player)
|
||||||
|
|
||||||
|
func _connected_to_server() -> void:
|
||||||
|
Logger.verbose("NetworkManager _connected_to_server")
|
||||||
|
|
||||||
|
var pm : PlayerMaster = PlayerMaster.new()
|
||||||
|
pm.sid = get_tree().get_network_unique_id()
|
||||||
|
|
||||||
|
local_player_master = pm
|
||||||
|
|
||||||
|
emit_signal("cplayer_master_created", pm)
|
||||||
|
|
||||||
|
func _server_disconnected() -> void:
|
||||||
|
Logger.verbose("_server_disconnected")
|
||||||
|
|
||||||
|
# Server kicked us; show error and abort.
|
||||||
|
|
||||||
|
for player in get_children():
|
||||||
|
emit_signal("NetworkManager cplayer_master_destroyed", player)
|
||||||
|
player.queue_free()
|
||||||
|
|
||||||
|
func _connection_failed() -> void:
|
||||||
|
Logger.verbose("NetworkManager _connection_failed")
|
||||||
|
|
||||||
|
pass # Could not even connect to server; abort.
|
||||||
|
|
||||||
|
func sset_seed(pseed):
|
||||||
|
_sseed = pseed
|
||||||
|
|
||||||
|
if multiplayer.has_network_peer() and multiplayer.is_network_server():
|
||||||
|
rpc("cset_seed", _sseed)
|
||||||
|
|
||||||
|
remote func cset_seed(pseed):
|
||||||
|
|
||||||
|
_cseed = pseed
|
||||||
|
|
||||||
|
print("clientseed set")
|
||||||
|
|
||||||
|
|
||||||
|
func set_class():
|
||||||
|
Logger.verbose("set_class")
|
||||||
|
|
||||||
|
if not get_tree().is_network_server():
|
||||||
|
rpc_id(1, "crequest_select_class", local_player_master.my_info)
|
||||||
|
else:
|
||||||
|
crequest_select_class(local_player_master.my_info)
|
||||||
|
|
||||||
|
remote func crequest_select_class(info : Dictionary) -> void:
|
||||||
|
Logger.verbose("NetworkManager crequest_select_class")
|
||||||
|
|
||||||
|
if get_tree().is_network_server():
|
||||||
|
var sid : int = get_tree().multiplayer.get_rpc_sender_id()
|
||||||
|
|
||||||
|
if sid == 0:
|
||||||
|
sid = 1
|
||||||
|
|
||||||
|
rpc("cspawn_player", info, sid, Vector3(10, 10, 10))
|
||||||
|
|
||||||
|
|
||||||
|
remotesync func cspawn_player(info : Dictionary, sid : int, pos : Vector3):
|
||||||
|
Logger.verbose("NetworkManager cspawn_player")
|
||||||
|
|
||||||
|
if sid == get_tree().get_network_unique_id():
|
||||||
|
local_player_master.player = Entities.spawn_player(info["selected_class"] as int, pos, info["name"] as String, str(sid), sid)
|
||||||
|
call_deferred("set_terrarin_player")
|
||||||
|
|
||||||
|
if get_tree().is_network_server() and not splayers_dict.has(sid):
|
||||||
|
splayers_dict[sid] = local_player_master
|
||||||
|
splayers_array.append(local_player_master)
|
||||||
|
else:
|
||||||
|
var pm : PlayerMaster = PlayerMaster.new()
|
||||||
|
pm.sid = sid
|
||||||
|
|
||||||
|
pm.player = Entities.spawn_networked_player(info["selected_class"] as int, pos, info["name"] as String, str(sid), sid)
|
||||||
|
|
||||||
|
if get_tree().is_network_server() and not splayers_dict.has(sid):
|
||||||
|
splayers_dict[sid] = pm
|
||||||
|
splayers_array.append(pm)
|
||||||
|
|
||||||
|
cplayers_dict[sid] = pm
|
||||||
|
cplayers_array.append(pm)
|
||||||
|
|
||||||
|
|
||||||
|
func upload_character(data : String) -> void:
|
||||||
|
rpc_id(1, "sreceive_upload_character", data)
|
||||||
|
|
||||||
|
master func sreceive_upload_character(data: String) -> void:
|
||||||
|
Entities.spawn_networked_player_from_data(data, Vector3(0, 10, 0), multiplayer.get_rpc_sender_id())
|
||||||
|
|
||||||
|
func set_terrarin_player():
|
||||||
|
Logger.verbose("NetworkManager cspawn_player")
|
||||||
|
|
||||||
|
var terrarin : Spatial = get_node("/root/GameScene/VoxelWorld")
|
||||||
|
|
||||||
|
terrarin.set_player(local_player_master.player as Node2D)
|
6
game/autoload/Server.tscn
Normal 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 )
|
63
game/autoload/SettingsManager.gd
Normal 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)
|
6
game/autoload/SettingsManager.tscn
Normal 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 )
|
14
game/autoload/ThemeAtlas.gd
Normal 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)
|
25
game/autoload/ThemeAtlas.tscn
Normal 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 ) ]
|
36
game/autoload/WorldNumbers.gd
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
extends Node
|
||||||
|
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
export(PackedScene) var number_scene
|
||||||
|
|
||||||
|
func damage(entity_position : Vector2, entity_height : float, value : int, crit : bool) -> void:
|
||||||
|
var scene : Node = number_scene.instance()
|
||||||
|
|
||||||
|
add_child(scene)
|
||||||
|
scene.owner = self
|
||||||
|
|
||||||
|
entity_position.y += entity_height + (0.2 * randf())
|
||||||
|
entity_position.x += entity_height * 0.4 - entity_height * 0.8 * randf()
|
||||||
|
|
||||||
|
scene.damage(entity_position, value, crit)
|
||||||
|
|
||||||
|
func heal(entity_position : Vector2, entity_height : float, value : int, crit : bool) -> void:
|
||||||
|
var scene : Node = number_scene.instance()
|
||||||
|
|
||||||
|
add_child(scene)
|
||||||
|
scene.owner = self
|
||||||
|
|
||||||
|
randomize()
|
||||||
|
|
||||||
|
entity_position.y += entity_height + (0.3 * randf())
|
||||||
|
entity_position.x += entity_height * 0.4 - entity_height * 0.8 * randf()
|
||||||
|
|
||||||
|
|
||||||
|
scene.heal(entity_position, value, crit)
|
||||||
|
|
||||||
|
func clear() -> void:
|
||||||
|
for child in get_children():
|
||||||
|
child.queue_free()
|
8
game/autoload/WorldNumbers.tscn
Normal 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 )
|
3
game/data/aura_groups/1_aspect_of_scorpions.tres
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[gd_resource type="AuraGroup" format=2]
|
||||||
|
|
||||||
|
[resource]
|
3
game/data/aura_groups/2_aspect_of_wasps.tres
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[gd_resource type="AuraGroup" format=2]
|
||||||
|
|
||||||
|
[resource]
|
3
game/data/aura_groups/3_aspect_of_wolves.tres
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[gd_resource type="AuraGroup" format=2]
|
||||||
|
|
||||||
|
[resource]
|
3
game/data/aura_groups/4_aspect_of_bees.tres
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[gd_resource type="AuraGroup" format=2]
|
||||||
|
|
||||||
|
[resource]
|
28
game/data/auras/10_aspect_of_scorpions_rank_1.tres
Normal 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 )
|
23
game/data/auras/11_aspect_of_wasps_rank1.tres
Normal 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 )
|
32
game/data/auras/12_aspect_of_wolves_rank_1.tres
Normal 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 )
|
23
game/data/auras/13_aspect_of_bees_rank_1.tres
Normal 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 )
|
19
game/data/auras/14_rejuvenation_rank_1.tres
Normal 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 )
|
18
game/data/auras/15_close_wounds_rank_1.tres
Normal 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 )
|
19
game/data/auras/16_ironbark_rank_1.tres
Normal 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 )
|
21
game/data/auras/17_natures_swiftness_rank_1.tres
Normal 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 )
|
11
game/data/auras/1_test1.tres
Normal 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 )
|
13
game/data/auras/20_root_rank_1.tres
Normal 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 )
|
28
game/data/auras/21_aspect_of_scorpions.tres
Normal 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 )
|
23
game/data/auras/22_aspect_of_wasps.tres
Normal 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 )
|
32
game/data/auras/23_aspect_of_wolves.tres
Normal 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 )
|
23
game/data/auras/24_aspect_of_bees.tres
Normal 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 )
|
7
game/data/biomes/1_test.tres
Normal 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 ]
|
9
game/data/biomes/2_tdungb.tres
Normal 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 ]
|
3
game/data/character_specs/1_test.tres
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[gd_resource type="CharacterSpec" format=2]
|
||||||
|
|
||||||
|
[resource]
|
6
game/data/character_specs/2_elementalist_fire.tres
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[gd_resource type="CharacterSpec" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "Elementalist Fire"
|
||||||
|
id = 2
|
||||||
|
text_name = "Elementalist Fire"
|
6
game/data/character_specs/3_elementalist_water.tres
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[gd_resource type="CharacterSpec" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "Elementalist Water"
|
||||||
|
id = 3
|
||||||
|
text_name = "Elementalist Water"
|
6
game/data/character_specs/4_elementalist_ice.tres
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[gd_resource type="CharacterSpec" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "Elementalist Ice"
|
||||||
|
id = 4
|
||||||
|
text_name = "Elementalist Ice"
|
36
game/data/crafting/1_test_craft.tres
Normal 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 )
|
21
game/data/crafting/2_chest_of_the_infinite_wisdom.tres
Normal 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
After Width: | Height: | Size: 173 B |
34
game/data/cursors/arrow.png.import
Normal 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
|
BIN
game/data/cursors/arrow16.png
Normal file
After Width: | Height: | Size: 379 B |
34
game/data/cursors/arrow16.png.import
Normal 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
|
BIN
game/data/cursors/arrow32.png
Normal file
After Width: | Height: | Size: 418 B |
34
game/data/cursors/arrow32.png.import
Normal 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
|
BIN
game/data/cursors/arrow8.png
Normal file
After Width: | Height: | Size: 173 B |
34
game/data/cursors/arrow8.png.import
Normal 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
|
BIN
game/data/cursors/attack16.png
Normal file
After Width: | Height: | Size: 414 B |
34
game/data/cursors/attack16.png.import
Normal 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
|
BIN
game/data/cursors/drag_drop.png
Normal file
After Width: | Height: | Size: 371 B |
34
game/data/cursors/drag_drop.png.import
Normal 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
|
BIN
game/data/cursors/forbidden.png
Normal file
After Width: | Height: | Size: 436 B |
34
game/data/cursors/forbidden.png.import
Normal 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
After Width: | Height: | Size: 256 B |
34
game/data/cursors/ibeam.png.import
Normal 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
|
BIN
game/data/cursors/loot16.png
Normal file
After Width: | Height: | Size: 377 B |
34
game/data/cursors/loot16.png.import
Normal 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
After Width: | Height: | Size: 426 B |
34
game/data/cursors/speak.png.import
Normal 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
|
3
game/data/dungeon_rooms/1_test.tres
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[gd_resource type="DungeonRoomData" format=2]
|
||||||
|
|
||||||
|
[resource]
|
6
game/data/dungeon_rooms/2_test_start_room.tres
Normal 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 )
|
8
game/data/dungeons/1_test.tres
Normal 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 ) ]
|
10
game/data/effect_data/aspect_of_scorpions.tres
Normal 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
|
10
game/data/effect_data/natures_swiftness.tres
Normal 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
|
18
game/data/entities/1_naturalist.tres
Normal 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 )
|
259
game/data/entity_classes/1_naturalist.tres
Normal 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 = 4.2
|
||||||
|
modifier_apply_type = 1
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=37]
|
||||||
|
stat_id = 17
|
||||||
|
base = 5.0
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=38]
|
||||||
|
stat_id = 18
|
||||||
|
base = 50.0
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=39]
|
||||||
|
stat_id = 27
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=40]
|
||||||
|
stat_id = 23
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=41]
|
||||||
|
stat_id = 14
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=42]
|
||||||
|
stat_id = 9
|
||||||
|
|
||||||
|
[sub_resource type="Curve" id=43]
|
||||||
|
max_value = 10.0
|
||||||
|
_data = [ Vector2( 0, 10 ), 0.0, 0.0, 0, 1, Vector2( 1, 10 ), 0.0, 0.0, 1, 0 ]
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=44]
|
||||||
|
stat_id = 7
|
||||||
|
base = 10.0
|
||||||
|
mod_stat_count = 1
|
||||||
|
ModStat_0/stat_id = 0
|
||||||
|
ModStat_0/curve = SubResource( 43 )
|
||||||
|
ModStat_0/max_value = 1000.0
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=45]
|
||||||
|
stat_id = 6
|
||||||
|
base = 8.0
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=46]
|
||||||
|
stat_id = 37
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=47]
|
||||||
|
stat_id = 40
|
||||||
|
base = 1.0
|
||||||
|
|
||||||
|
[sub_resource type="SimpleLevelStatData" id=48]
|
||||||
|
agility_per_level = 4
|
||||||
|
strength_per_level = 2
|
||||||
|
stamina_per_level = 4
|
||||||
|
intellect_per_level = 4
|
||||||
|
spirit_per_level = 6
|
||||||
|
|
||||||
|
[sub_resource type="StatData" id=49]
|
||||||
|
base_stat_health = SubResource( 20 )
|
||||||
|
base_stat_speed = SubResource( 36 )
|
||||||
|
base_stat_mana = SubResource( 25 )
|
||||||
|
base_stat_gcd = SubResource( 16 )
|
||||||
|
base_stat_haste = SubResource( 17 )
|
||||||
|
base_stat_agility = SubResource( 5 )
|
||||||
|
base_stat_strength = SubResource( 45 )
|
||||||
|
base_stat_stamina = SubResource( 44 )
|
||||||
|
base_stat_intellect = SubResource( 23 )
|
||||||
|
base_stat_spirit = SubResource( 42 )
|
||||||
|
base_stat_haste_rating = SubResource( 18 )
|
||||||
|
base_stat_resilience = SubResource( 33 )
|
||||||
|
base_stat_armor = SubResource( 6 )
|
||||||
|
base_stat_attack_power = SubResource( 7 )
|
||||||
|
base_stat_spell_power = SubResource( 41 )
|
||||||
|
base_stat_melee_crit = SubResource( 26 )
|
||||||
|
base_stat_melee_crit_bonus = SubResource( 27 )
|
||||||
|
base_stat_spell_crit = SubResource( 37 )
|
||||||
|
base_stat_spell_crit_bonus = SubResource( 38 )
|
||||||
|
base_stat_block = SubResource( 8 )
|
||||||
|
base_stat_parry = SubResource( 31 )
|
||||||
|
base_stat_damage_reduction = SubResource( 10 )
|
||||||
|
base_stat_melee_damage_reduction = SubResource( 29 )
|
||||||
|
base_stat_spell_damage_reduction = SubResource( 40 )
|
||||||
|
base_stat_damage_taken = SubResource( 11 )
|
||||||
|
base_stat_heal_taken = SubResource( 19 )
|
||||||
|
base_stat_melee_damage = SubResource( 28 )
|
||||||
|
base_stat_spell_damage = SubResource( 39 )
|
||||||
|
base_stat_holy_resist = SubResource( 21 )
|
||||||
|
base_stat_shadow_resist = SubResource( 34 )
|
||||||
|
base_stat_nature_resist = SubResource( 30 )
|
||||||
|
base_stat_fire_resist = SubResource( 14 )
|
||||||
|
base_stat_frost_resist = SubResource( 15 )
|
||||||
|
base_stat_lightning_resist = SubResource( 24 )
|
||||||
|
base_stat_chaos_resist = SubResource( 9 )
|
||||||
|
base_stat_silence_resist = SubResource( 35 )
|
||||||
|
base_stat_fear_resist = SubResource( 13 )
|
||||||
|
base_stat_stun_resist = SubResource( 46 )
|
||||||
|
base_stat_energy = SubResource( 12 )
|
||||||
|
base_stat_rage = SubResource( 32 )
|
||||||
|
base_stat_xp_rate = SubResource( 47 )
|
||||||
|
level_stat_data = SubResource( 48 )
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "Naturalist"
|
||||||
|
id = 1
|
||||||
|
text_name = "Naturalist"
|
||||||
|
stat_data = SubResource( 49 )
|
||||||
|
player_resource_type = 2
|
||||||
|
entity_resources = [ ExtResource( 27 ) ]
|
||||||
|
specs = [ SubResource( 4 ) ]
|
||||||
|
spells = [ ExtResource( 4 ), ExtResource( 6 ), ExtResource( 16 ), ExtResource( 5 ), ExtResource( 3 ), ExtResource( 10 ), ExtResource( 8 ), ExtResource( 11 ), ExtResource( 9 ), ExtResource( 7 ), ExtResource( 13 ), ExtResource( 2 ), ExtResource( 12 ), ExtResource( 14 ), ExtResource( 15 ), ExtResource( 17 ), ExtResource( 1 ), ExtResource( 24 ), ExtResource( 25 ), ExtResource( 23 ), ExtResource( 26 ) ]
|
||||||
|
start_spells = [ ExtResource( 24 ) ]
|
||||||
|
auras = [ ExtResource( 18 ) ]
|
||||||
|
ais = [ SubResource( 1 ) ]
|
||||||
|
script = ExtResource( 19 )
|
207
game/data/entity_classes/2_elementalist.tres
Normal 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 = 4.2
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=32]
|
||||||
|
stat_id = 17
|
||||||
|
base = 5.0
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=33]
|
||||||
|
stat_id = 18
|
||||||
|
base = 50.0
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=34]
|
||||||
|
stat_id = 27
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=35]
|
||||||
|
stat_id = 23
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=36]
|
||||||
|
stat_id = 14
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=37]
|
||||||
|
stat_id = 9
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=38]
|
||||||
|
stat_id = 7
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=39]
|
||||||
|
stat_id = 6
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=40]
|
||||||
|
stat_id = 37
|
||||||
|
|
||||||
|
[sub_resource type="StatDataEntry" id=41]
|
||||||
|
stat_id = 40
|
||||||
|
base = 1.0
|
||||||
|
|
||||||
|
[sub_resource type="SimpleLevelStatData" id=42]
|
||||||
|
agility_per_level = 4
|
||||||
|
strength_per_level = 4
|
||||||
|
stamina_per_level = 5
|
||||||
|
intellect_per_level = 5
|
||||||
|
spirit_per_level = 1
|
||||||
|
|
||||||
|
[sub_resource type="StatData" id=43]
|
||||||
|
base_stat_health = SubResource( 16 )
|
||||||
|
base_stat_speed = SubResource( 31 )
|
||||||
|
base_stat_mana = SubResource( 20 )
|
||||||
|
base_stat_gcd = SubResource( 12 )
|
||||||
|
base_stat_haste = SubResource( 13 )
|
||||||
|
base_stat_agility = SubResource( 1 )
|
||||||
|
base_stat_strength = SubResource( 39 )
|
||||||
|
base_stat_stamina = SubResource( 38 )
|
||||||
|
base_stat_intellect = SubResource( 18 )
|
||||||
|
base_stat_spirit = SubResource( 37 )
|
||||||
|
base_stat_haste_rating = SubResource( 14 )
|
||||||
|
base_stat_resilience = SubResource( 28 )
|
||||||
|
base_stat_armor = SubResource( 2 )
|
||||||
|
base_stat_attack_power = SubResource( 3 )
|
||||||
|
base_stat_spell_power = SubResource( 36 )
|
||||||
|
base_stat_melee_crit = SubResource( 21 )
|
||||||
|
base_stat_melee_crit_bonus = SubResource( 22 )
|
||||||
|
base_stat_spell_crit = SubResource( 32 )
|
||||||
|
base_stat_spell_crit_bonus = SubResource( 33 )
|
||||||
|
base_stat_block = SubResource( 4 )
|
||||||
|
base_stat_parry = SubResource( 26 )
|
||||||
|
base_stat_damage_reduction = SubResource( 6 )
|
||||||
|
base_stat_melee_damage_reduction = SubResource( 24 )
|
||||||
|
base_stat_spell_damage_reduction = SubResource( 35 )
|
||||||
|
base_stat_damage_taken = SubResource( 7 )
|
||||||
|
base_stat_heal_taken = SubResource( 15 )
|
||||||
|
base_stat_melee_damage = SubResource( 23 )
|
||||||
|
base_stat_spell_damage = SubResource( 34 )
|
||||||
|
base_stat_holy_resist = SubResource( 17 )
|
||||||
|
base_stat_shadow_resist = SubResource( 29 )
|
||||||
|
base_stat_nature_resist = SubResource( 25 )
|
||||||
|
base_stat_fire_resist = SubResource( 10 )
|
||||||
|
base_stat_frost_resist = SubResource( 11 )
|
||||||
|
base_stat_lightning_resist = SubResource( 19 )
|
||||||
|
base_stat_chaos_resist = SubResource( 5 )
|
||||||
|
base_stat_silence_resist = SubResource( 30 )
|
||||||
|
base_stat_fear_resist = SubResource( 9 )
|
||||||
|
base_stat_stun_resist = SubResource( 40 )
|
||||||
|
base_stat_energy = SubResource( 8 )
|
||||||
|
base_stat_rage = SubResource( 27 )
|
||||||
|
base_stat_xp_rate = SubResource( 41 )
|
||||||
|
level_stat_data = SubResource( 42 )
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
resource_name = "Elementalist"
|
||||||
|
id = 2
|
||||||
|
text_name = "Elementalist"
|
||||||
|
stat_data = SubResource( 43 )
|
||||||
|
player_resource_type = 2
|
||||||
|
playstyle_type = 2
|
||||||
|
specs = [ ExtResource( 2 ), ExtResource( 3 ), ExtResource( 4 ) ]
|
||||||
|
spells = [ ExtResource( 6 ), ExtResource( 7 ), ExtResource( 5 ) ]
|
||||||
|
start_spells = [ ExtResource( 7 ) ]
|
||||||
|
script = ExtResource( 1 )
|
7
game/data/entity_resources/1_mana_resource.tres
Normal 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 )
|
4
game/data/entity_skills/1_test.tres
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[gd_resource type="EntitySkillData" format=2]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
id = 1
|
13
game/data/environments/default_env.tres
Normal 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
@ -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.
|
BIN
game/data/fonts/VT323-Regular.ttf
Normal file
8
game/data/icons/3_iron_bar.tres
Normal 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 )
|
8
game/data/icons/4_chest_of_the_infinite_wisdom.tres
Normal 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 )
|
BIN
game/data/icons/icons-1/11.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
34
game/data/icons/icons-1/11.png.import
Normal 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
|
BIN
game/data/icons/icons-1/43.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
34
game/data/icons/icons-1/43.png.import
Normal 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
|
BIN
game/data/icons/icons-1/5.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
34
game/data/icons/icons-1/5.png.import
Normal 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
|
BIN
game/data/icons/icons-1/61.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
34
game/data/icons/icons-1/61.png.import
Normal 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
|
16
game/data/icons/icons-1/Readme.txt
Normal 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!
|
12
game/data/icons/icons-2/README.txt
Normal 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!
|
BIN
game/data/icons/icons-2/enchant-acid-2.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
34
game/data/icons/icons-2/enchant-acid-2.png.import
Normal 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
|
BIN
game/data/icons/icons-2/enchant-blue-2.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
34
game/data/icons/icons-2/enchant-blue-2.png.import
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/enchant-blue-2.png-c9908f0a2a0fcfcfe240897d34b2f283.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://data/icons/icons-2/enchant-blue-2.png"
|
||||||
|
dest_files=[ "res://.import/enchant-blue-2.png-c9908f0a2a0fcfcfe240897d34b2f283.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=false
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=false
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
process/invert_color=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=false
|
||||||
|
svg/scale=1.0
|
BIN
game/data/icons/icons-2/heal-jade-2.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
34
game/data/icons/icons-2/heal-jade-2.png.import
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/heal-jade-2.png-d697c16d862d1cdfbba68e3189ce5187.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://data/icons/icons-2/heal-jade-2.png"
|
||||||
|
dest_files=[ "res://.import/heal-jade-2.png-d697c16d862d1cdfbba68e3189ce5187.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=false
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=false
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
process/invert_color=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=false
|
||||||
|
svg/scale=1.0
|
BIN
game/data/icons/icons-2/protect-acid-3.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
34
game/data/icons/icons-2/protect-acid-3.png.import
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/protect-acid-3.png-fba7e733232cd6a25d50c1349f82ccba.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://data/icons/icons-2/protect-acid-3.png"
|
||||||
|
dest_files=[ "res://.import/protect-acid-3.png-fba7e733232cd6a25d50c1349f82ccba.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=false
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=false
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
process/invert_color=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=false
|
||||||
|
svg/scale=1.0
|
BIN
game/data/icons/icons-2/protect-eerie-2.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
34
game/data/icons/icons-2/protect-eerie-2.png.import
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/protect-eerie-2.png-73044f4d125be4eba38b20cec63a5566.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://data/icons/icons-2/protect-eerie-2.png"
|
||||||
|
dest_files=[ "res://.import/protect-eerie-2.png-73044f4d125be4eba38b20cec63a5566.stex" ]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_mode=0
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
flags/repeat=0
|
||||||
|
flags/filter=false
|
||||||
|
flags/mipmaps=false
|
||||||
|
flags/anisotropic=false
|
||||||
|
flags/srgb=2
|
||||||
|
process/fix_alpha_border=false
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/HDR_as_SRGB=false
|
||||||
|
process/invert_color=false
|
||||||
|
stream=false
|
||||||
|
size_limit=0
|
||||||
|
detect_3d=false
|
||||||
|
svg/scale=1.0
|
11
game/data/icons/icons-3/README.txt
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
From https://opengameart.org/content/painterly-spell-icons-part-2
|
||||||
|
|
||||||
|
License(s):
|
||||||
|
CC-BY 3.0
|
||||||
|
CC-BY-SA 3.0
|
||||||
|
GPL 2.0
|
||||||
|
|
||||||
|
Copyright/Attribution Notice:
|
||||||
|
J. W. Bjerk (eleazzaar) -- www.jwbjerk.com/art -- find this and other open art at: http://opengameart.org
|
||||||
|
|
||||||
|
Thanks!
|
BIN
game/data/icons/icons-3/beam-jade-2.png
Normal file
After Width: | Height: | Size: 3.1 KiB |