mirror of
https://github.com/Relintai/entity_spell_system.git
synced 2025-04-19 21:33:15 +02:00
More work on stats.
This commit is contained in:
parent
5c4f0a1fe3
commit
dcd8c65782
@ -269,10 +269,42 @@ void Entity::_setup() {
|
||||
_stats[i]->set_stat_data_entry(sde);
|
||||
}
|
||||
|
||||
for (int i = 0; i < _s_auras.size(); ++i) {
|
||||
Ref<AuraData> ad = _s_auras.get(i);
|
||||
|
||||
if (!ad->get_aura()->get_hide())
|
||||
SEND_RPC(rpc("cadd_aura", ad), cadd_aura(ad));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sinitialize_stats();
|
||||
ERR_FAIL_COND(!gets_entity_data().is_valid());
|
||||
|
||||
Ref<EntityClassData> cc = gets_entity_data()->get_entity_class_data();
|
||||
|
||||
ERR_FAIL_COND(!cc.is_valid());
|
||||
|
||||
for (int i = 0; i < Stat::STAT_ID_TOTAL_STATS; ++i) {
|
||||
cc->get_stat_data()->get_stat_for_stat(_stats[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < Stat::STAT_ID_TOTAL_STATS; ++i) {
|
||||
Ref<Stat> s = _stats[i];
|
||||
|
||||
s->apply_modifiers();
|
||||
|
||||
s->setc_values(s->gets_current(), s->gets_max());
|
||||
s->set_dirty(false);
|
||||
}
|
||||
|
||||
for (int i = 0; i < cc->get_num_auras(); ++i) {
|
||||
Ref<Aura> a = cc->get_aura(i);
|
||||
|
||||
if (a.is_valid()) {
|
||||
a->sapply_simple(this, this, 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
_s_entity_data->setup_resources(this);
|
||||
|
||||
@ -598,10 +630,6 @@ void Entity::_from_dict(const Dictionary &dict) {
|
||||
r->set_caster(this);
|
||||
|
||||
_s_auras.push_back(r);
|
||||
|
||||
if (!r->get_aura()->get_hide())
|
||||
SEND_RPC(rpc("cadd_aura", r), cadd_aura(r));
|
||||
|
||||
//_c_auras.push_back(r);
|
||||
}
|
||||
|
||||
@ -1009,29 +1037,6 @@ void Entity::initialize(Ref<EntityCreateInfo> info) {
|
||||
sets_entity_data(info->get_entity_data());
|
||||
}
|
||||
|
||||
void Entity::sinitialize_stats() {
|
||||
//gets_entity_data()->get_stat_data()->get_stats_for_stat(_health);
|
||||
//Ref<StatDataEntry> e = gets_entity_data()->get_stat_data()->get_stat_data_enum(Stat::STAT_ID_HEALTH);
|
||||
|
||||
ERR_FAIL_COND(!gets_entity_data().is_valid());
|
||||
|
||||
Ref<EntityClassData> cc = gets_entity_data()->get_entity_class_data();
|
||||
|
||||
ERR_FAIL_COND(!cc.is_valid());
|
||||
|
||||
for (int i = 0; i < Stat::STAT_ID_TOTAL_STATS; ++i) {
|
||||
cc->get_stat_data()->get_stat_for_stat(_stats[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < cc->get_num_auras(); ++i) {
|
||||
Ref<Aura> a = cc->get_aura(i);
|
||||
|
||||
if (a.is_valid()) {
|
||||
a->sapply_simple(this, this, 1.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////// Stat System //////
|
||||
|
||||
bool Entity::gets_is_dead() {
|
||||
@ -4233,12 +4238,9 @@ void Entity::update(float delta) {
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < Stat::MAIN_STAT_ID_MAX; ++i) {
|
||||
for (int i = 0; i < Stat::STAT_ID_TOTAL_STATS; ++i) {
|
||||
Ref<Stat> s = _stats[i];
|
||||
|
||||
if (!s.is_valid())
|
||||
continue;
|
||||
|
||||
if (s->get_dirty_mods())
|
||||
s->apply_modifiers();
|
||||
|
||||
@ -4251,19 +4253,6 @@ void Entity::update(float delta) {
|
||||
}
|
||||
|
||||
String Entity::random_name() {
|
||||
/*/
|
||||
String text = new String(l1->GetData(UnityEngine::Random::Range(0, l1->Length)));
|
||||
bool flag = true;
|
||||
int num = UnityEngine::Random::Range(3, 6);
|
||||
for (int i = 0; i < num; i += 1) {
|
||||
if (flag) {
|
||||
*text += *(new String(l3->GetData(UnityEngine::Random::Range(0, l3->Length))));
|
||||
} else {
|
||||
*text += *(new String(l2->GetData(UnityEngine::Random::Range(0, l2->Length))));
|
||||
}
|
||||
}
|
||||
return text;*/
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
|
@ -197,8 +197,6 @@ public:
|
||||
Ref<EntityData> gets_entity_data();
|
||||
void sets_entity_data(Ref<EntityData> value);
|
||||
|
||||
void sinitialize_stats();
|
||||
|
||||
//// Stats ////
|
||||
|
||||
_FORCE_INLINE_ Ref<Stat> get_health() { return _stats[Stat::STAT_ID_HEALTH]; }
|
||||
|
@ -311,46 +311,34 @@ void Stat::apply_modifiers() {
|
||||
reset_values();
|
||||
|
||||
if (_modifier_apply_type == MODIFIER_APPLY_TYPE_STANDARD) {
|
||||
for (int i = 0; i < _modifiers.size(); i += 1) {
|
||||
for (int i = 0; i < _modifiers.size(); ++i) {
|
||||
Ref<StatModifier> mod = _modifiers.get(i);
|
||||
print_error("apply " + String::num(mod->get_base_mod()));
|
||||
|
||||
_base += mod->get_base_mod();
|
||||
_bonus += mod->get_bonus_mod();
|
||||
_percent += mod->get_percent_mod();
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < _modifiers.size(); i += 1) {
|
||||
for (int i = 0; i < _modifiers.size(); ++i) {
|
||||
Ref<StatModifier> modifier = _modifiers.get(i);
|
||||
|
||||
if (modifier->get_percent_mod() >= (float)0) {
|
||||
_base += modifier->get_base_mod();
|
||||
_bonus += modifier->get_bonus_mod();
|
||||
_base += modifier->get_base_mod();
|
||||
_bonus += modifier->get_bonus_mod();
|
||||
|
||||
if (modifier->get_percent_mod() >= 0) {
|
||||
_percent += modifier->get_percent_mod();
|
||||
} else {
|
||||
|
||||
int num = -1;
|
||||
if (get_modifiers()->size() > 0) {
|
||||
float percent_mod = get_modifiers()->get(0)->get_percent_mod();
|
||||
for (int i = 1; i < get_modifiers()->size(); i += 1) {
|
||||
if ((_modifiers.get(i)->get_percent_mod() < (float)0) && (_modifiers.get(i)->get_percent_mod() < percent_mod)) {
|
||||
num = i;
|
||||
percent_mod = _modifiers.get(i)->get_percent_mod();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (num != -1) {
|
||||
if (modifier->get_percent_mod() < _modifiers.get(num)->get_percent_mod()) {
|
||||
_percent -= _modifiers.get(num)->get_percent_mod();
|
||||
}
|
||||
|
||||
_percent += modifier->get_percent_mod();
|
||||
} else {
|
||||
|
||||
_percent += modifier->get_percent_mod();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float p = 0;
|
||||
for (int i = 0; i < _modifiers.size(); ++i) {
|
||||
Ref<StatModifier> modifier = _modifiers.get(i);
|
||||
|
||||
if (modifier->get_percent_mod() < p)
|
||||
p = modifier->get_percent_mod();
|
||||
}
|
||||
|
||||
_percent += p;
|
||||
}
|
||||
|
||||
refresh_currmax();
|
||||
@ -373,23 +361,20 @@ void Stat::apply_modifiers() {
|
||||
}
|
||||
|
||||
void Stat::reset_values() {
|
||||
_percent = 100;
|
||||
_bonus = 0;
|
||||
_percent = 0;
|
||||
_bonus = 0;
|
||||
_base = 0;
|
||||
|
||||
_dirty = true;
|
||||
_dirty_mods = true;
|
||||
}
|
||||
|
||||
void Stat::refresh_currmax() {
|
||||
float diff = _s_current / _s_max;
|
||||
//According to people on stack overflow this should be fine, because 0.0 has a unique representation
|
||||
float diff = _s_max == 0.0 ? 1.0 : _s_current / _s_max;
|
||||
|
||||
_s_max = (_base + _bonus) * (_percent / 100.0);
|
||||
|
||||
if (_s_current > _s_max) {
|
||||
_s_current = _s_max;
|
||||
}
|
||||
|
||||
_s_current = _s_max * diff;
|
||||
|
||||
_dirty = true;
|
||||
@ -445,8 +430,8 @@ Dictionary Stat::_to_dict() {
|
||||
|
||||
Dictionary modifiers;
|
||||
|
||||
for (int i = 0; _modifiers.size(); ++i) {
|
||||
modifiers[i] = _modifiers.get(i)->to_dict();
|
||||
for (int i = 0; i < _modifiers.size(); ++i) {
|
||||
modifiers[String::num(i)] = _modifiers.get(i)->to_dict();
|
||||
}
|
||||
|
||||
dict["modifiers"] = modifiers;
|
||||
@ -482,7 +467,7 @@ void Stat::_from_dict(const Dictionary &dict) {
|
||||
Ref<StatModifier> sm;
|
||||
sm.instance();
|
||||
|
||||
sm->from_dict(modifiers.get(i, Dictionary()));
|
||||
sm->from_dict(modifiers.get(String::num(i), Dictionary()));
|
||||
sm->set_owner(this);
|
||||
|
||||
_modifiers.push_back(sm);
|
||||
@ -503,7 +488,7 @@ Stat::Stat() {
|
||||
|
||||
_base = 0;
|
||||
_bonus = 0;
|
||||
_percent = 100;
|
||||
_percent = 0;
|
||||
|
||||
_s_current = 0;
|
||||
_s_max = 0;
|
||||
@ -526,7 +511,7 @@ Stat::Stat(Stat::StatId id, Entity *owner) {
|
||||
|
||||
_base = 0;
|
||||
_bonus = 0;
|
||||
_percent = 100;
|
||||
_percent = 0;
|
||||
|
||||
_s_current = 0;
|
||||
_s_max = 0;
|
||||
@ -549,7 +534,7 @@ Stat::Stat(Stat::StatId id, StatModifierApplyType modifier_apply_type, Entity *o
|
||||
|
||||
_base = 0;
|
||||
_bonus = 0;
|
||||
_percent = 100;
|
||||
_percent = 0;
|
||||
|
||||
_s_current = 0;
|
||||
_s_max = 0;
|
||||
|
@ -48,7 +48,7 @@ StatData::StatData() {
|
||||
|
||||
_entries[i] = Ref<StatDataEntry>(entry);
|
||||
}
|
||||
|
||||
|
||||
get_stat_data_enum(Stat::STAT_ID_HEALTH)->set_base(100);
|
||||
get_stat_data_enum(Stat::STAT_ID_MANA)->set_base(100);
|
||||
get_stat_data_enum(Stat::STAT_ID_SPEED)->set_base(4.2);
|
||||
|
@ -82,8 +82,6 @@ void StatDataEntry::get_stats_for_stat(Ref<Stat> stat) {
|
||||
stat->set_public(_public);
|
||||
stat->add_modifier(0, get_base(), get_bonus(), get_percent());
|
||||
stat->set_stat_data_entry(Ref<StatDataEntry>(this));
|
||||
|
||||
stat->set_to_max();
|
||||
}
|
||||
|
||||
StatDataEntry::StatDataEntry() {
|
||||
|
@ -49,7 +49,6 @@ void StatModifier::set_percent_mod(float value) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Dictionary StatModifier::to_dict() {
|
||||
return call("_to_dict");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user