ItemInstance now also stores stat modifier data like ItemTemplate.

This commit is contained in:
Relintai 2020-06-07 14:55:39 +02:00
parent 2d2629ba09
commit cb0b8271e1
10 changed files with 124 additions and 241 deletions

1
SCsub
View File

@ -19,7 +19,6 @@ sources = [
"data/entities/xp_data.cpp",
"data/items/item_stat_modifier.cpp",
"data/items/item_instance.cpp",
"data/items/item_template.cpp",
"data/items/equipment_data.cpp",

View File

@ -21,7 +21,6 @@ def get_doc_classes():
"CraftRecipe",
"EquipmentData",
"ItemInstance",
"ItemStatModifier",
"ItemTemplate",
"ModelVisualEntry",
"ModelVisual",

View File

@ -39,13 +39,59 @@ void ItemInstance::set_item_template(const Ref<ItemTemplate> &value) {
_item_template_path = value->get_path();
}
Ref<ItemStatModifier> ItemInstance::get_item_stat_modifier(const int index) {
ERR_FAIL_INDEX_V(index, _modifiers.size(), Ref<ItemStatModifier>());
int ItemInstance::stat_modifier_get_stat_id(const int index) const {
ERR_FAIL_INDEX_V(index, _modifiers.size(), 0);
return _modifiers.get(index);
return _modifiers[index].stat_id;
}
void ItemInstance::add_item_stat_modifier(const Ref<ItemStatModifier> &modifier) {
_modifiers.push_back(modifier);
void ItemInstance::stat_modifier_set_stat_id(const int index, const int value) {
ERR_FAIL_INDEX(index, _modifiers.size());
_modifiers.write[index].stat_id = value;
}
float ItemInstance::stat_modifier_get_base_mod(const int index) const {
ERR_FAIL_INDEX_V(index, _modifiers.size(), 0);
return _modifiers[index].base_mod;
}
void ItemInstance::stat_modifier_set_base_mod(const int index, const float value) {
ERR_FAIL_INDEX(index, _modifiers.size());
_modifiers.write[index].base_mod = value;
}
float ItemInstance::stat_modifier_get_bonus_mod(const int index) const {
ERR_FAIL_INDEX_V(index, _modifiers.size(), 0);
return _modifiers[index].bonus_mod;
}
void ItemInstance::stat_modifier_set_bonus_mod(const int index, const float value) {
ERR_FAIL_INDEX(index, _modifiers.size());
_modifiers.write[index].bonus_mod = value;
}
float ItemInstance::stat_modifier_get_percent_mod(const int index) const {
ERR_FAIL_INDEX_V(index, _modifiers.size(), 0);
return _modifiers[index].percent_mod;
}
void ItemInstance::stat_modifier_set_percent_mod(const int index, const float value) {
ERR_FAIL_INDEX(index, _modifiers.size());
_modifiers.write[index].percent_mod = value;
}
void ItemInstance::add_item_stat_modifier(const int stat_id, const int base_mod, const int bonus_mod, const int percent_mod) {
ItemStatModifier mod;
mod.stat_id = stat_id;
mod.base_mod = base_mod;
mod.bonus_mod = bonus_mod;
mod.percent_mod = percent_mod;
_modifiers.push_back(mod);
}
void ItemInstance::remove_item_stat_modifier(const int index) {
ERR_FAIL_INDEX(index, _modifiers.size());
@ -101,7 +147,16 @@ Dictionary ItemInstance::_to_dict() {
Array mods;
for (int i = 0; i < _modifiers.size(); ++i) {
mods.append(_modifiers.get(i)->to_dict());
Dictionary mdict;
mdict["stat_id"] = _modifiers[i].stat_id;
mdict["base_mod"] = _modifiers[i].base_mod;
mdict["bonus_mod"] = _modifiers[i].bonus_mod;
mdict["percent_mod"] = _modifiers[i].percent_mod;
mods.append(mdict);
}
dict["modifiers"] = mods;
@ -122,10 +177,13 @@ void ItemInstance::_from_dict(const Dictionary &dict) {
Array mods = dict.get("modifiers", Array());
for (int i = 0; i < mods.size(); ++i) {
Ref<ItemStatModifier> mod;
mod.instance();
ItemStatModifier mod;
Dictionary mdict = mods.get(i);
mod->from_dict(mods.get(i));
mod.stat_id = dict.get("stat_id", 0);
mod.base_mod = dict.get("base_mod", 0);
mod.bonus_mod = dict.get("bonus_mod", 0);
mod.percent_mod = dict.get("percent_mod", 0);
_modifiers.push_back(mod);
}
@ -155,8 +213,19 @@ void ItemInstance::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_charges", "size"), &ItemInstance::set_charges);
ADD_PROPERTY(PropertyInfo(Variant::INT, "charges"), "set_charges", "get_charges");
ClassDB::bind_method(D_METHOD("get_item_stat_modifier", "index"), &ItemInstance::get_item_stat_modifier);
ClassDB::bind_method(D_METHOD("add_item_stat_modifier", "modifier"), &ItemInstance::add_item_stat_modifier);
ClassDB::bind_method(D_METHOD("stat_modifier_get_stat_id", "index"), &ItemInstance::stat_modifier_get_stat_id);
ClassDB::bind_method(D_METHOD("stat_modifier_set_stat_id", "index", "value"), &ItemInstance::stat_modifier_set_stat_id);
ClassDB::bind_method(D_METHOD("stat_modifier_get_base_mod", "index"), &ItemInstance::stat_modifier_get_base_mod);
ClassDB::bind_method(D_METHOD("stat_modifier_set_base_mod", "index", "value"), &ItemInstance::stat_modifier_set_base_mod);
ClassDB::bind_method(D_METHOD("stat_modifier_get_bonus_mod", "index"), &ItemInstance::stat_modifier_get_bonus_mod);
ClassDB::bind_method(D_METHOD("stat_modifier_set_bonus_mod", "index", "value"), &ItemInstance::stat_modifier_set_bonus_mod);
ClassDB::bind_method(D_METHOD("stat_modifier_get_percent_mod", "index"), &ItemInstance::stat_modifier_get_percent_mod);
ClassDB::bind_method(D_METHOD("stat_modifier_set_percent_mod", "index", "value"), &ItemInstance::stat_modifier_set_percent_mod);
ClassDB::bind_method(D_METHOD("add_item_stat_modifier", "stat_id", "base_mod", "bonus_mod", "percent_mod"), &ItemInstance::add_item_stat_modifier);
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("stat_modifier_get_count"), &ItemInstance::stat_modifier_get_count);

View File

@ -27,7 +27,6 @@ SOFTWARE.
#include "core/vector.h"
#include "../../item_enums.h"
#include "item_stat_modifier.h"
class ItemTemplate;
@ -38,8 +37,20 @@ public:
Ref<ItemTemplate> get_item_template();
void set_item_template(const Ref<ItemTemplate> &value);
Ref<ItemStatModifier> get_item_stat_modifier(const int index);
void add_item_stat_modifier(const Ref<ItemStatModifier> &modifier);
//Modifiers
int stat_modifier_get_stat_id(const int index) const;
void stat_modifier_set_stat_id(const int index, const int value);
float stat_modifier_get_base_mod(const int index) const;
void stat_modifier_set_base_mod(const int index, const float value);
float stat_modifier_get_bonus_mod(const int index) const;
void stat_modifier_set_bonus_mod(const int index, const float value);
float stat_modifier_get_percent_mod(const int index) const;
void stat_modifier_set_percent_mod(const int index, const float value);
void add_item_stat_modifier(const int stat_id, const int base_mod, const int bonus_mod, const int percent_mod);
void remove_item_stat_modifier(const int index);
void clear_item_stat_modifiers();
@ -65,6 +76,21 @@ public:
protected:
static void _bind_methods();
protected:
struct ItemStatModifier {
int stat_id;
float base_mod;
float bonus_mod;
float percent_mod;
ItemStatModifier() {
stat_id = 0;
base_mod = 0;
bonus_mod = 0;
percent_mod = 0;
}
};
private:
Ref<ItemTemplate> _item_template;
StringName _item_template_path;
@ -72,7 +98,7 @@ private:
int _stack_size;
int _charges;
Vector<Ref<ItemStatModifier> > _modifiers;
Vector<ItemStatModifier> _modifiers;
};
#endif

View File

@ -1,115 +0,0 @@
/*
Copyright (c) 2019-2020 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.
*/
#include "item_stat_modifier.h"
#include "../../singletons/ess.h"
int ItemStatModifier::get_stat_id() {
return _stat_id;
}
void ItemStatModifier::set_stat_id(int value) {
_stat_id = value;
}
float ItemStatModifier::get_base_mod() {
return _base_mod;
}
void ItemStatModifier::set_base_mod(float value) {
_base_mod = value;
}
float ItemStatModifier::get_bonus_mod() {
return _bonus_mod;
}
void ItemStatModifier::set_bonus_mod(float value) {
_bonus_mod = value;
}
float ItemStatModifier::get_percent_mod() {
return _percent_mod;
}
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<int>(_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 = 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 = 0;
_base_mod = 0;
_bonus_mod = 0;
_percent_mod = 0;
}
void ItemStatModifier::_validate_property(PropertyInfo &property) const {
if (property.name == "stat_id") {
property.hint_string = ESS::get_singleton()->stat_get_string();
}
}
void ItemStatModifier::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_stat_id"), &ItemStatModifier::get_stat_id);
ClassDB::bind_method(D_METHOD("set_stat_id", "value"), &ItemStatModifier::set_stat_id);
ADD_PROPERTY(PropertyInfo(Variant::INT, "stat_id", PROPERTY_HINT_ENUM, ""), "set_stat_id", "get_stat_id");
ClassDB::bind_method(D_METHOD("get_base_mod"), &ItemStatModifier::get_base_mod);
ClassDB::bind_method(D_METHOD("set_base_mod", "value"), &ItemStatModifier::set_base_mod);
ADD_PROPERTY(PropertyInfo(Variant::REAL, "base_mod"), "set_base_mod", "get_base_mod");
ClassDB::bind_method(D_METHOD("get_bonus_mod"), &ItemStatModifier::get_bonus_mod);
ClassDB::bind_method(D_METHOD("set_bonus_mod", "value"), &ItemStatModifier::set_bonus_mod);
ADD_PROPERTY(PropertyInfo(Variant::REAL, "bonus_mod"), "set_bonus_mod", "get_bonus_mod");
ClassDB::bind_method(D_METHOD("get_percent_mod"), &ItemStatModifier::get_percent_mod);
ClassDB::bind_method(D_METHOD("set_percent_mod", "value"), &ItemStatModifier::set_percent_mod);
ADD_PROPERTY(PropertyInfo(Variant::REAL, "percent_mod"), "set_percent_mod", "get_percent_mod");
}

View File

@ -1,65 +0,0 @@
/*
Copyright (c) 2019-2020 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.
*/
#ifndef ITEM_STAT_MODIFIER_H
#define ITEM_STAT_MODIFIER_H
#include "core/reference.h"
#include "../../defines.h"
class ItemStatModifier : public Reference {
GDCLASS(ItemStatModifier, Reference);
public:
int get_stat_id();
void set_stat_id(int value);
float get_base_mod();
void set_base_mod(float value);
float get_bonus_mod();
void set_bonus_mod(float value);
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:
void _validate_property(PropertyInfo &property) const;
static void _bind_methods();
private:
int _stat_id;
float _base_mod;
float _bonus_mod;
float _percent_mod;
};
#endif

View File

@ -148,16 +148,22 @@ public:
float stat_modifier_get_min_base_mod(const int index) const;
void stat_modifier_set_min_base_mod(const int index, const float value);
float stat_modifier_get_max_base_mod(const int index) const;
void stat_modifier_set_max_base_mod(const int index, const float value);
float stat_modifier_get_min_bonus_mod(const int index) const;
void stat_modifier_set_min_bonus_mod(const int index, const float value);
float stat_modifier_get_max_bonus_mod(const int index) const;
void stat_modifier_set_max_bonus_mod(const int index, const float value);
float stat_modifier_get_min_percent_mod(const int index) const;
void stat_modifier_set_min_percent_mod(const int index, const float value);
float stat_modifier_get_max_percent_mod(const int index) const;
void stat_modifier_set_max_percent_mod(const int index, const float value);
float stat_modifier_get_scaling_factor(const int index) const;
void stat_modifier_set_scaling_factor(const int index, const float value);

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="ItemStatModifier" inherits="Reference" version="3.2">
<brief_description>
Runtime item [Stat] modifier data.
</brief_description>
<description>
</description>
<tutorials>
</tutorials>
<methods>
</methods>
<members>
<member name="base_mod" type="float" setter="set_base_mod" getter="get_base_mod" default="0.0">
</member>
<member name="bonus_mod" type="float" setter="set_bonus_mod" getter="get_bonus_mod" default="0.0">
</member>
<member name="percent_mod" type="float" setter="set_percent_mod" getter="get_percent_mod" default="0.0">
</member>
<member name="stat_id" type="int" setter="set_stat_id" getter="get_stat_id" enum="Stat.StatId" default="0">
</member>
</members>
<constants>
</constants>
</class>

View File

@ -2190,16 +2190,11 @@ void Entity::_equip_applys_item(Ref<ItemInstance> item) {
ERR_FAIL_COND(!it.is_valid());
for (int i = 0; i < item->stat_modifier_get_count(); ++i) {
Ref<ItemStatModifier> mod = item->get_item_stat_modifier(i);
int sid = item->stat_modifier_get_stat_id(i);
if (!mod.is_valid())
continue;
int sid = mod->get_stat_id();
stat_mod_base(sid, mod->get_base_mod());
stat_mod_bonus(sid, mod->get_bonus_mod());
stat_mod_percent(sid, mod->get_percent_mod());
stat_mod_base(sid, item->stat_modifier_get_base_mod(i));
stat_mod_bonus(sid, item->stat_modifier_get_bonus_mod(i));
stat_mod_percent(sid, item->stat_modifier_get_percent_mod(i));
}
}
void Entity::_equip_deapplys_item(Ref<ItemInstance> item) {
@ -2210,16 +2205,11 @@ void Entity::_equip_deapplys_item(Ref<ItemInstance> item) {
ERR_FAIL_COND(!it.is_valid());
for (int i = 0; i < item->stat_modifier_get_count(); ++i) {
Ref<ItemStatModifier> mod = item->get_item_stat_modifier(i);
int sid = item->stat_modifier_get_stat_id(i);
if (!mod.is_valid())
continue;
int sid = mod->get_stat_id();
stat_mod_base(sid, -mod->get_base_mod());
stat_mod_bonus(sid, -mod->get_bonus_mod());
stat_mod_percent(sid, -mod->get_percent_mod());
stat_mod_base(sid, -item->stat_modifier_get_base_mod(i));
stat_mod_bonus(sid, -item->stat_modifier_get_bonus_mod(i));
stat_mod_percent(sid, -item->stat_modifier_get_percent_mod(i));
}
}

View File

@ -32,7 +32,6 @@ SOFTWARE.
#include "data/entities/xp_data.h"
#include "data/items/equipment_data.h"
#include "data/items/item_stat_modifier.h"
#include "data/spells/spell_cooldown_manipulation_data.h"
#include "entities/data/entity_class_data.h"
@ -161,7 +160,6 @@ void register_entity_spell_system_types() {
ClassDB::register_class<ItemContainerDataEntry>();
ClassDB::register_class<XPData>();
ClassDB::register_class<ItemStatModifier>();
ClassDB::register_class<ItemEnums>();
ClassDB::register_class<ItemTemplate>();
ClassDB::register_class<ItemInstance>();