diff --git a/entities/entity.cpp b/entities/entity.cpp index 869bfdb..08b8a2b 100644 --- a/entities/entity.cpp +++ b/entities/entity.cpp @@ -269,10 +269,42 @@ void Entity::_setup() { _stats[i]->set_stat_data_entry(sde); } + for (int i = 0; i < _s_auras.size(); ++i) { + Ref 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 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 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 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 info) { sets_entity_data(info->get_entity_data()); } -void Entity::sinitialize_stats() { - //gets_entity_data()->get_stat_data()->get_stats_for_stat(_health); - //Ref e = gets_entity_data()->get_stat_data()->get_stat_data_enum(Stat::STAT_ID_HEALTH); - - ERR_FAIL_COND(!gets_entity_data().is_valid()); - - Ref 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 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 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 ""; } diff --git a/entities/entity.h b/entities/entity.h index 665e701..ef89267 100644 --- a/entities/entity.h +++ b/entities/entity.h @@ -197,8 +197,6 @@ public: Ref gets_entity_data(); void sets_entity_data(Ref value); - void sinitialize_stats(); - //// Stats //// _FORCE_INLINE_ Ref get_health() { return _stats[Stat::STAT_ID_HEALTH]; } diff --git a/entities/stats/stat.cpp b/entities/stats/stat.cpp index 5af83dd..7318b35 100644 --- a/entities/stats/stat.cpp +++ b/entities/stats/stat.cpp @@ -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 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 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 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 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; diff --git a/entities/stats/stat_data.cpp b/entities/stats/stat_data.cpp index 3a2efc8..065c5b2 100644 --- a/entities/stats/stat_data.cpp +++ b/entities/stats/stat_data.cpp @@ -48,7 +48,7 @@ StatData::StatData() { _entries[i] = Ref(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); diff --git a/entities/stats/stat_data_entry.cpp b/entities/stats/stat_data_entry.cpp index 7787e8c..436207f 100644 --- a/entities/stats/stat_data_entry.cpp +++ b/entities/stats/stat_data_entry.cpp @@ -82,8 +82,6 @@ void StatDataEntry::get_stats_for_stat(Ref stat) { stat->set_public(_public); stat->add_modifier(0, get_base(), get_bonus(), get_percent()); stat->set_stat_data_entry(Ref(this)); - - stat->set_to_max(); } StatDataEntry::StatDataEntry() { diff --git a/entities/stats/stat_modifier.cpp b/entities/stats/stat_modifier.cpp index af47ff4..53366b7 100644 --- a/entities/stats/stat_modifier.cpp +++ b/entities/stats/stat_modifier.cpp @@ -49,7 +49,6 @@ void StatModifier::set_percent_mod(float value) { } } - Dictionary StatModifier::to_dict() { return call("_to_dict"); }