More work on stats.

This commit is contained in:
Relintai 2019-10-15 20:23:13 +02:00
parent 5c4f0a1fe3
commit dcd8c65782
6 changed files with 62 additions and 93 deletions

View File

@ -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 "";
}

View File

@ -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]; }

View File

@ -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;

View File

@ -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);

View File

@ -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() {

View File

@ -49,7 +49,6 @@ void StatModifier::set_percent_mod(float value) {
}
}
Dictionary StatModifier::to_dict() {
return call("_to_dict");
}