diff --git a/SCsub b/SCsub index 9471ac9..b957e80 100644 --- a/SCsub +++ b/SCsub @@ -71,3 +71,7 @@ env.add_source_files(env.modules_sources,"skeleton/entity_equipset.cpp") env.add_source_files(env.modules_sources,"loot/loot_data_base.cpp") env.add_source_files(env.modules_sources,"loot/loot_data_container.cpp") env.add_source_files(env.modules_sources,"loot/loot_data_item.cpp") + +env.add_source_files(env.modules_sources,"data/mob_data.cpp") +env.add_source_files(env.modules_sources,"data/player_character_data.cpp") + diff --git a/data/data_manager.cpp b/data/data_manager.cpp index 683150d..9836a08 100644 --- a/data/data_manager.cpp +++ b/data/data_manager.cpp @@ -4,6 +4,8 @@ #include "character_class.h" #include "craft_data_attribute.h" #include "spell.h" +#include "mob_data.h" +#include "player_character_data.h" DataManager *DataManager::instance; @@ -173,18 +175,18 @@ Vector > *DataManager::get_item_templates() { void DataManager::add_item_template(Ref cda) { ERR_FAIL_COND(!cda.is_valid()); - _craft_datas.push_back(cda); - _craft_data_map.set(cda->get_id(), cda); + _item_templates.push_back(cda); + _item_template_map.set(cda->get_id(), cda); } Ref DataManager::get_item_template(int item_id) { - ERR_FAIL_COND_V(!_craft_data_map.has(item_id), Ref(NULL)); + ERR_FAIL_COND_V(!_item_template_map.has(item_id), Ref(NULL)); return _item_template_map.get(item_id); } Ref DataManager::get_item_template_index(int index) { - ERR_FAIL_INDEX_V(index, _craft_datas.size(), Ref(NULL)); + ERR_FAIL_INDEX_V(index, _item_templates.size(), Ref(NULL)); return _item_templates.get(index); } @@ -193,12 +195,83 @@ int DataManager::get_item_template_count() { return _item_templates.size(); } + +String DataManager::get_mob_data_folder() { + return _mob_data_folder; +} +void DataManager::set_mob_data_folder(String folder) { + _mob_data_folder = folder; +} +Vector > *DataManager::get_mob_datas() { + return &_mob_datas; +} + +void DataManager::add_mob_data(Ref cda) { + ERR_FAIL_COND(!cda.is_valid()); + + _mob_datas.push_back(cda); + _mob_data_map.set(cda->get_id(), cda); +} + +Ref DataManager::get_mob_data(int item_id) { + ERR_FAIL_COND_V(!_mob_data_map.has(item_id), Ref(NULL)); + + return _mob_data_map.get(item_id); +} + +Ref DataManager::get_mob_data_index(int index) { + ERR_FAIL_INDEX_V(index, _mob_datas.size(), Ref(NULL)); + + return _mob_datas.get(index); +} + +int DataManager::get_mob_data_count() { + return _mob_datas.size(); +} + + +String DataManager::get_player_character_data_folder() { + return _player_character_data_folder; +} +void DataManager::set_player_character_data_folder(String folder) { + _player_character_data_folder = folder; +} +Vector > *DataManager::get_player_character_datas() { + return &_player_character_datas; +} + +void DataManager::add_player_character_data(Ref cda) { + ERR_FAIL_COND(!cda.is_valid()); + + _player_character_datas.push_back(cda); + _player_character_data_map.set(cda->get_id(), cda); +} + +Ref DataManager::get_player_character_data(int item_id) { + ERR_FAIL_COND_V(!_player_character_data_map.has(item_id), Ref(NULL)); + + return _player_character_data_map.get(item_id); +} + +Ref DataManager::get_player_character_data_index(int index) { + ERR_FAIL_INDEX_V(index, _player_character_datas.size(), Ref(NULL)); + + return _player_character_datas.get(index); +} + +int DataManager::get_player_character_data_count() { + return _player_character_datas.size(); +} + + void DataManager::load_all() { load_spells(); load_auras(); load_characters(); load_craft_datas(); load_item_templates(); + load_mob_datas(); + load_player_character_datas(); } void DataManager::load_spells() { @@ -396,6 +469,84 @@ void DataManager::load_item_templates() { } } +void DataManager::load_mob_datas() { + _Directory dir; + + ERR_FAIL_COND(_mob_data_folder.ends_with("/")); + + if (dir.open(_mob_data_folder) == OK) { + + dir.list_dir_begin(); + + String filename = dir.get_next(); + + while (filename != "") { + if (!dir.current_is_dir()) { + String path = _mob_data_folder + "/" + filename; + + _ResourceLoader *rl = _ResourceLoader::get_singleton(); + + Ref resl = rl->load_interactive(path, "MobData"); + + resl->wait(); + + Ref s = resl->get_resource(); + + ERR_CONTINUE(!s.is_valid()); + + Ref mob_data = s; + + ERR_CONTINUE(!mob_data.is_valid()); + + add_mob_data(mob_data); + } + + filename = dir.get_next(); + } + } else { + print_error("An error occurred when trying to access the path."); + } +} + +void DataManager::load_player_character_datas() { + _Directory dir; + + ERR_FAIL_COND(_player_character_data_folder.ends_with("/")); + + if (dir.open(_player_character_data_folder) == OK) { + + dir.list_dir_begin(); + + String filename = dir.get_next(); + + while (filename != "") { + if (!dir.current_is_dir()) { + String path = _player_character_data_folder + "/" + filename; + + _ResourceLoader *rl = _ResourceLoader::get_singleton(); + + Ref resl = rl->load_interactive(path, "PlayerCharacterData"); + + resl->wait(); + + Ref s = resl->get_resource(); + + ERR_CONTINUE(!s.is_valid()); + + Ref pcd = s; + + ERR_CONTINUE(!pcd.is_valid()); + + add_player_character_data(pcd); + } + + filename = dir.get_next(); + } + } else { + print_error("An error occurred when trying to access the path."); + } +} + void DataManager::list_characters() { for (int i = 0; i < _character_classes.size(); ++i) { print_error(itos(i) + ": " + _character_classes.get(i)->get_character_class_name()); @@ -426,16 +577,23 @@ void DataManager::list_item_templates() { } } +void DataManager::list_mob_datas() { + for (int i = 0; i < _mob_datas.size(); ++i) { + print_error(itos(i) + ": " + _mob_datas.get(i)->get_name()); + } +} + +void DataManager::list_player_character_datas() { + for (int i = 0; i < _player_character_datas.size(); ++i) { + print_error(itos(i) + ": " + _player_character_datas.get(i)->get_name()); + } +} + void DataManager::_bind_methods() { ClassDB::bind_method(D_METHOD("get_automatic_load"), &DataManager::get_automatic_load); ClassDB::bind_method(D_METHOD("set_automatic_load", "load"), &DataManager::set_automatic_load); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "automatic_load"), "set_automatic_load", "get_automatic_load"); - ClassDB::bind_method(D_METHOD("load_all"), &DataManager::load_all); - ClassDB::bind_method(D_METHOD("load_spells"), &DataManager::load_spells); - ClassDB::bind_method(D_METHOD("load_characters"), &DataManager::load_characters); - ClassDB::bind_method(D_METHOD("load_craft_datas"), &DataManager::load_craft_datas); - //CharacterClass ClassDB::bind_method(D_METHOD("get_character_classes_folder"), &DataManager::get_character_classes_folder); ClassDB::bind_method(D_METHOD("set_character_classes_folder", "folder"), &DataManager::set_character_classes_folder); @@ -485,13 +643,45 @@ void DataManager::_bind_methods() { ClassDB::bind_method(D_METHOD("get_item_template", "item_template_id"), &DataManager::get_item_template); ClassDB::bind_method(D_METHOD("get_item_template_index", "index"), &DataManager::get_item_template_index); ClassDB::bind_method(D_METHOD("get_item_template_count"), &DataManager::get_item_template_count); + + //Mob Data + ClassDB::bind_method(D_METHOD("get_mob_data_folder"), &DataManager::get_mob_data_folder); + ClassDB::bind_method(D_METHOD("set_mob_data_folder", "folder"), &DataManager::set_mob_data_folder); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "mob_data_folder"), "set_mob_data_folder", "get_mob_data_folder"); + ClassDB::bind_method(D_METHOD("add_mob_data", "mob_data"), &DataManager::add_mob_data); + ClassDB::bind_method(D_METHOD("get_mob_data", "mob_data_id"), &DataManager::get_mob_data); + ClassDB::bind_method(D_METHOD("get_mob_data_index", "index"), &DataManager::get_mob_data_index); + ClassDB::bind_method(D_METHOD("get_mob_data_count"), &DataManager::get_mob_data_count); + + //Player Character Data + ClassDB::bind_method(D_METHOD("get_player_character_data_folder"), &DataManager::get_player_character_data_folder); + ClassDB::bind_method(D_METHOD("set_player_character_data_folder", "folder"), &DataManager::set_player_character_data_folder); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "player_character_data_folder"), "set_player_character_data_folder", "get_player_character_data_folder"); + + ClassDB::bind_method(D_METHOD("add_player_character_data", "pcd"), &DataManager::add_player_character_data); + ClassDB::bind_method(D_METHOD("get_player_character_data", "pcd_id"), &DataManager::get_player_character_data); + ClassDB::bind_method(D_METHOD("get_player_character_data_index", "index"), &DataManager::get_player_character_data_index); + ClassDB::bind_method(D_METHOD("get_player_character_data_count"), &DataManager::get_player_character_data_count); + + //load + ClassDB::bind_method(D_METHOD("load_all"), &DataManager::load_all); + ClassDB::bind_method(D_METHOD("load_spells"), &DataManager::load_spells); + ClassDB::bind_method(D_METHOD("load_auras"), &DataManager::load_auras); + ClassDB::bind_method(D_METHOD("load_characters"), &DataManager::load_characters); + ClassDB::bind_method(D_METHOD("load_craft_datas"), &DataManager::load_craft_datas); + ClassDB::bind_method(D_METHOD("load_item_templates"), &DataManager::load_item_templates); + ClassDB::bind_method(D_METHOD("load_mob_datas"), &DataManager::load_mob_datas); + ClassDB::bind_method(D_METHOD("load_player_character_datas"), &DataManager::load_player_character_datas); + //tests + ClassDB::bind_method(D_METHOD("list_characters"), &DataManager::list_characters); ClassDB::bind_method(D_METHOD("list_spells"), &DataManager::list_spells); - ClassDB::bind_method(D_METHOD("list_characters"), &DataManager::list_characters); ClassDB::bind_method(D_METHOD("list_auras"), &DataManager::list_auras); ClassDB::bind_method(D_METHOD("list_craft_data"), &DataManager::list_craft_data); ClassDB::bind_method(D_METHOD("list_item_templates"), &DataManager::list_item_templates); + ClassDB::bind_method(D_METHOD("list_mob_datas"), &DataManager::list_mob_datas); + ClassDB::bind_method(D_METHOD("list_player_character_datas"), &DataManager::list_player_character_datas); } DataManager::DataManager() { @@ -505,10 +695,22 @@ DataManager::~DataManager() { _character_classes.clear(); _character_class_map.clear(); + _spells.clear(); _spell_map.clear(); + _auras.clear(); _aura_map.clear(); + _craft_datas.clear(); _craft_data_map.clear(); + + _item_templates.clear(); + _item_template_map.clear(); + + _mob_datas.clear(); + _mob_data_map.clear(); + + _player_character_datas.clear(); + _player_character_data_map.clear(); } diff --git a/data/data_manager.h b/data/data_manager.h index 0e1675d..9bcfdc7 100644 --- a/data/data_manager.h +++ b/data/data_manager.h @@ -18,6 +18,8 @@ class Spell; class CharacterClass; class CraftDataAttribute; class ItemTemplate; +class MobData; +class PlayerCharacterData; class DataManager : public Node { GDCLASS(DataManager, Node); @@ -64,6 +66,22 @@ public: Ref get_item_template(int item_id); Ref get_item_template_index(int index); int get_item_template_count(); + + String get_mob_data_folder(); + void set_mob_data_folder(String folder); + Vector > *get_mob_datas(); + void add_mob_data(Ref aura); + Ref get_mob_data(int item_id); + Ref get_mob_data_index(int index); + int get_mob_data_count(); + + String get_player_character_data_folder(); + void set_player_character_data_folder(String folder); + Vector > *get_player_character_datas(); + void add_player_character_data(Ref aura); + Ref get_player_character_data(int item_id); + Ref get_player_character_data_index(int index); + int get_player_character_data_count(); void load_all(); void load_spells(); @@ -71,12 +89,16 @@ public: void load_characters(); void load_craft_datas(); void load_item_templates(); - + void load_mob_datas(); + void load_player_character_datas(); + void list_characters(); void list_spells(); void list_auras(); void list_craft_data(); void list_item_templates(); + void list_mob_datas(); + void list_player_character_datas(); bool get_automatic_load() { return _automatic_load; } void set_automatic_load(bool load) { _automatic_load = load; } @@ -108,6 +130,14 @@ private: String _item_template_folder; Vector > _item_templates; HashMap > _item_template_map; + + String _mob_data_folder; + Vector > _mob_datas; + HashMap > _mob_data_map; + + String _player_character_data_folder; + Vector > _player_character_datas; + HashMap > _player_character_data_map; static DataManager *instance; diff --git a/data/mob_data.cpp b/data/mob_data.cpp index e4970e6..d4a364b 100644 --- a/data/mob_data.cpp +++ b/data/mob_data.cpp @@ -1 +1,65 @@ #include "mob_data.h" + +int MobData::get_id() const { + return _id; +} +void MobData::set_id(const int id) { + _id = id; +} + +Ref MobData::get_loot_db() const { + return _lootdb; +} +void MobData::set_loot_db(const Ref lootdb) { + _lootdb = lootdb; +} + +Ref MobData::get_character_class() const { + return _character_class; +} +void MobData::set_character_class(const Ref character_class) { + _character_class = character_class; +} + +String MobData::get_player_name() { + if (has_method("_generate_name")) { + return call("_generate_name"); + } + + return _static_player_name; +} + +String MobData::get_static_player_name() const { + return _static_player_name; +} +void MobData::set_static_player_name(const String name) { + _static_player_name = name; +} + +MobData::MobData() { + _id = 0; +} +MobData::~MobData() { + _lootdb.unref(); + _character_class.unref(); +} + +void MobData::_bind_methods() { + BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::STRING, "name"), "_generate_name")); + + ClassDB::bind_method(D_METHOD("get_id"), &MobData::get_id); + ClassDB::bind_method(D_METHOD("set_id", "value"), &MobData::set_id); + ADD_PROPERTY(PropertyInfo(Variant::INT, "id"), "set_id", "get_id"); + + ClassDB::bind_method(D_METHOD("get_loot_db"), &MobData::get_loot_db); + ClassDB::bind_method(D_METHOD("set_loot_db", "value"), &MobData::set_loot_db); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "loot_db", PROPERTY_HINT_RESOURCE_TYPE, "LootDataBase"), "set_loot_db", "get_loot_db"); + + ClassDB::bind_method(D_METHOD("get_character_class"), &MobData::get_character_class); + ClassDB::bind_method(D_METHOD("set_character_class", "value"), &MobData::set_character_class); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "character_class", PROPERTY_HINT_RESOURCE_TYPE, "CharacterClass"), "set_character_class", "get_character_class"); + + ClassDB::bind_method(D_METHOD("get_static_player_name"), &MobData::get_static_player_name); + ClassDB::bind_method(D_METHOD("set_static_player_name", "value"), &MobData::set_static_player_name); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "static_player_name"), "set_static_player_name", "get_static_player_name"); +} diff --git a/data/mob_data.h b/data/mob_data.h index 44b836d..6e612e3 100644 --- a/data/mob_data.h +++ b/data/mob_data.h @@ -1,7 +1,45 @@ +#ifndef MOB_DATA_H +#define MOB_DATA_H + +#include "core/resource.h" +#include "core/ustring.h" + +#include "../data/character_class.h" +#include "../loot/loot_data_base.h" -//LootDataBase -//CharacterClass -//id -//name generator, or name -> probably an overrideable get_name -//Skeleton -> basic gear //Add it to the data manager too. + +class MobData : public Resource { + GDCLASS(MobData, Resource); + +public: + int get_id() const; + void set_id(const int id); + + Ref get_loot_db() const; + void set_loot_db(const Ref lootdb); + + Ref get_character_class() const; + void set_character_class(const Ref character_class); + + String get_player_name(); + + String get_static_player_name() const; + void set_static_player_name(const String name); + + MobData(); + ~MobData(); + +protected: + static void _bind_methods(); + +private: + int _id; + Ref _lootdb; + Ref _character_class; + String _static_player_name; + //Skeleton -> basic gear +}; + + +#endif diff --git a/data/palyer_character_data.cpp b/data/palyer_character_data.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/data/palyer_character_data.h b/data/palyer_character_data.h deleted file mode 100644 index 4e3ef6d..0000000 --- a/data/palyer_character_data.h +++ /dev/null @@ -1,8 +0,0 @@ - -//same as mob data -//CharacterClass -//id -//name generator, or name -> probably an overrideable get_name -//class specific strings? like what this class does? lik character creating info? or put that into cc? -//Skeleton -> basic gear -//Add it to the data manager too. diff --git a/data/player_character_data.cpp b/data/player_character_data.cpp new file mode 100644 index 0000000..f25a557 --- /dev/null +++ b/data/player_character_data.cpp @@ -0,0 +1,54 @@ +#include "player_character_data.h" + + +int PlayerCharacterData::get_id() const { + return _id; +} +void PlayerCharacterData::set_id(const int id) { + _id = id; +} + +Ref PlayerCharacterData::get_character_class() const { + return _character_class; +} +void PlayerCharacterData::set_character_class(const Ref character_class) { + _character_class = character_class; +} + +String PlayerCharacterData::get_player_name() { + if (has_method("_generate_name")) { + return call("_generate_name"); + } + + return _static_player_name; +} + +String PlayerCharacterData::get_static_player_name() const { + return _static_player_name; +} +void PlayerCharacterData::set_static_player_name(const String name) { + _static_player_name = name; +} + +PlayerCharacterData::PlayerCharacterData() { + _id = 0; +} +PlayerCharacterData::~PlayerCharacterData() { + _character_class.unref(); +} + +void PlayerCharacterData::_bind_methods() { + BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::STRING, "name"), "_generate_name")); + + ClassDB::bind_method(D_METHOD("get_id"), &PlayerCharacterData::get_id); + ClassDB::bind_method(D_METHOD("set_id", "value"), &PlayerCharacterData::set_id); + ADD_PROPERTY(PropertyInfo(Variant::INT, "id"), "set_id", "get_id"); + + ClassDB::bind_method(D_METHOD("get_character_class"), &PlayerCharacterData::get_character_class); + ClassDB::bind_method(D_METHOD("set_character_class", "value"), &PlayerCharacterData::set_character_class); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "character_class", PROPERTY_HINT_RESOURCE_TYPE, "CharacterClass"), "set_character_class", "get_character_class"); + + ClassDB::bind_method(D_METHOD("get_static_player_name"), &PlayerCharacterData::get_static_player_name); + ClassDB::bind_method(D_METHOD("set_static_player_name", "value"), &PlayerCharacterData::set_static_player_name); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "static_player_name"), "set_static_player_name", "get_static_player_name"); +} diff --git a/data/player_character_data.h b/data/player_character_data.h new file mode 100644 index 0000000..6dd205d --- /dev/null +++ b/data/player_character_data.h @@ -0,0 +1,45 @@ +#ifndef PLAYER_CHARACTER_DATA_H +#define PLAYER_CHARACTER_DATA_H + +#include "core/resource.h" +#include "core/ustring.h" + +#include "../data/character_class.h" +#include "../loot/loot_data_base.h" + +//same as mob data +//name generator, or name -> probably an overrideable get_name +//class specific strings? like what this class does? lik character creating info? or put that into cc? +//Skeleton -> basic gear +//Add it to the data manager too. + +class PlayerCharacterData : public Resource { + GDCLASS(PlayerCharacterData, Resource); + +public: + int get_id() const; + void set_id(const int id); + + Ref get_character_class() const; + void set_character_class(const Ref character_class); + + String get_player_name(); + + String get_static_player_name() const; + void set_static_player_name(const String name); + + PlayerCharacterData(); + ~PlayerCharacterData(); + +protected: + static void _bind_methods(); + +private: + int _id; + Ref _character_class; + String _static_player_name; + //Skeleton -> basic gear +}; + + +#endif diff --git a/register_types.cpp b/register_types.cpp index b53a287..94067c5 100644 --- a/register_types.cpp +++ b/register_types.cpp @@ -65,6 +65,9 @@ #include "loot/loot_data_item.h" #include "loot/loot_data_container.h" +#include "data/mob_data.h" +#include "data/player_character_data.h" + #ifdef TOOLS_ENABLED #include "editor/editor_plugin.h" @@ -147,6 +150,9 @@ void register_entity_spell_system_types() { ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); + + ClassDB::register_class(); + ClassDB::register_class(); //meshes ClassDB::register_class();