From f12640dbcc6422303d874727a4a18dc94cfd2b9f Mon Sep 17 00:00:00 2001 From: Relintai Date: Mon, 7 Oct 2019 19:19:34 +0200 Subject: [PATCH] implemented serialization for ItemInstance. --- data/item_instance.cpp | 64 +++++++++++++++++++++++++++++++++++++ data/item_instance.h | 10 ++++-- data/item_stat_modifier.cpp | 28 ++++++++++++++++ data/item_stat_modifier.h | 6 ++++ 4 files changed, 106 insertions(+), 2 deletions(-) diff --git a/data/item_instance.cpp b/data/item_instance.cpp index c68e0a6..27a998f 100644 --- a/data/item_instance.cpp +++ b/data/item_instance.cpp @@ -8,6 +8,12 @@ Ref ItemInstance::get_item_template() const { } void ItemInstance::set_item_template(const Ref value) { _item_template = value; + + _item_template_id = 0; + + if (value.is_valid()) + _item_template_id = value->get_id(); + } Ref ItemInstance::get_item_stat_modifier(int index) { @@ -37,8 +43,56 @@ void ItemInstance::set_stack_size(int value) { _stack_size = value; } +Dictionary ItemInstance::to_dict() { + return call("_to_dict"); +} +void ItemInstance::from_dict(const Dictionary &dict) { + call("_from_dict", dict); +} + +Dictionary ItemInstance::_to_dict() { + Dictionary dict; + + dict["item_id"] = _item_template->get_id(); + + dict["stack_size"] = _stack_size; + + Array mods; + + for (int i = 0; i < _modifiers.size(); ++i) { + mods.append(_modifiers.get(i)->to_dict()); + } + + dict["modifiers"] = mods; + + return dict; +} +void ItemInstance::_from_dict(const Dictionary &dict) { + ERR_FAIL_COND(dict.empty()); + + _item_template_id = dict.get("item_id", 0); + + if (DataManager::get_instance() != NULL) { + _item_template = DataManager::get_instance()->get_item_template(_item_template_id); + } + + _stack_size = dict.get("stack_size", 0); + + Array mods = dict.get("modifiers", Array()); + + for (int i = 0; i < mods.size(); ++i) { + Ref mod; + mod.instance(); + + mod->from_dict(mods.get(i)); + + _modifiers.push_back(mod); + } +} + ItemInstance::ItemInstance() { _stack_size = 1; + _item_template_id = 0; } ItemInstance::~ItemInstance() { _modifiers.clear(); @@ -60,4 +114,14 @@ void ItemInstance::_bind_methods() { ClassDB::bind_method(D_METHOD("remove_item_stat_modifier", "index"), &ItemInstance::remove_item_stat_modifier); ClassDB::bind_method(D_METHOD("clear_item_stat_modifiers"), &ItemInstance::clear_item_stat_modifiers); ClassDB::bind_method(D_METHOD("get_item_stat_modifier_count"), &ItemInstance::get_item_stat_modifier_count); + + //Serialization + BIND_VMETHOD(MethodInfo("_from_dict", PropertyInfo(Variant::DICTIONARY, "dict"))); + BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::DICTIONARY, "dict"), "_to_dict")); + + ClassDB::bind_method(D_METHOD("from_dict", "dict"), &ItemInstance::from_dict); + ClassDB::bind_method(D_METHOD("to_dict"), &ItemInstance::to_dict); + + ClassDB::bind_method(D_METHOD("_from_dict", "dict"), &ItemInstance::_from_dict); + ClassDB::bind_method(D_METHOD("_to_dict"), &ItemInstance::_to_dict); } diff --git a/data/item_instance.h b/data/item_instance.h index 0282808..6f9d283 100644 --- a/data/item_instance.h +++ b/data/item_instance.h @@ -8,6 +8,8 @@ #include "../entities/stats/stat.h" #include "../item_enums.h" +#include "data_manager.h" + class ItemTemplate; class ItemInstance : public Reference { @@ -27,8 +29,11 @@ public: int get_stack_size(); void set_stack_size(int value); - //to_dict(); - //from_dict(); + Dictionary to_dict(); + void from_dict(const Dictionary &dict); + + virtual Dictionary _to_dict(); + virtual void _from_dict(const Dictionary &dict); ItemInstance(); ~ItemInstance(); @@ -38,6 +43,7 @@ protected: private: Ref _item_template; + int _item_template_id; int _stack_size; diff --git a/data/item_stat_modifier.cpp b/data/item_stat_modifier.cpp index 75271f6..6c1a030 100644 --- a/data/item_stat_modifier.cpp +++ b/data/item_stat_modifier.cpp @@ -34,6 +34,34 @@ void ItemStatModifier::set_percent_mod(float value) { _percent_mod = value; } +Dictionary ItemStatModifier::to_dict() { + return call("_to_dict"); +} +void ItemStatModifier::from_dict(const Dictionary &dict) { + call("_from_dict", dict); +} + +Dictionary ItemStatModifier::_to_dict() { + Dictionary dict; + + dict["stat_id"] = static_cast(_stat_id); + + dict["base_mod"] = _base_mod; + dict["bonus_mod"] = _bonus_mod; + dict["percent_mod"] = _percent_mod; + + return dict; +} +void ItemStatModifier::_from_dict(const Dictionary &dict) { + ERR_FAIL_COND(dict.empty()); + + + _stat_id = static_cast(static_cast(dict.get("stat_id", 0))); + _base_mod = dict.get("base_mod", 0); + _bonus_mod = dict.get("bonus_mod", 0); + _percent_mod = dict.get("percent_mod", 0); +} + ItemStatModifier::ItemStatModifier() { _stat_id = Stat::STAT_ID_HEALTH; _base_mod = 0; diff --git a/data/item_stat_modifier.h b/data/item_stat_modifier.h index de92933..26d6ab4 100644 --- a/data/item_stat_modifier.h +++ b/data/item_stat_modifier.h @@ -20,6 +20,12 @@ public: float get_percent_mod(); void set_percent_mod(float value); + Dictionary to_dict(); + void from_dict(const Dictionary &dict); + + virtual Dictionary _to_dict(); + virtual void _from_dict(const Dictionary &dict); + ItemStatModifier(); protected: