void Character::ClassStats() { UTIL_PTR_VECTOR_FOREACH(this->world->ecf->data, ECF_Data, c) { if( this->clas == c->id && !this->classupdated) { this->str += c->str; this->intl += c->intl; this->wis += c->wis; this->agi += c->agi; this->con += c->con; this->cha += c->cha; } else if(this->clas == c->id && this->classupdated) { this->str -= c->str; this->intl -= c->intl; this->wis -= c->wis; this->agi -= c->agi; this->con -= c->con; this->cha -= c->cha; } } } // TODO: calculate equipment bonuses, check formulas void Character::CalculateStats() { short calcstr = this->str; short calcintl = this->intl; short calcwis = this->wis; short calcagi = this->agi; short calccon = this->con; short calccha = this->cha; this->maxweight = 70 + this->str; if (this->maxweight < 70 || this->maxweight > 250) { this->maxweight = 250; } this->weight = 0; this->maxhp = 0; this->maxtp = 0; this->mindam = 0; this->maxdam = 0; this->accuracy = 0; this->evade = 0; this->armor = 0; this->maxsp = 0; UTIL_PTR_LIST_FOREACH(this->inventory, Character_Item, item) { this->weight += this->world->eif->Get(item->id)->weight * item->amount; if (this->weight >= 250) { break; } } UTIL_ARRAY_FOREACH_ALL(this->paperdoll, int, 15, i) { if (i) { EIF_Data *item = this->world->eif->Get(i); this->weight += item->weight; this->maxhp += item->hp; this->maxtp += item->tp; this->mindam += item->mindam; this->maxdam += item->maxdam; this->accuracy += item->accuracy; this->evade += item->evade; this->armor += item->armor; calcstr += item->str; calcintl += item->intl; calcwis += item->wis; calcagi += item->agi; calccon += item->con; calccha += item->cha; } } if (this->weight < 0 || this->weight > 250) { this->weight = 250; } UTIL_PTR_VECTOR_FOREACH(this->world->ecf->data, ECF_Data, c) { if (this->clas == c->id) { std::tr1::unordered_map<std::string, double> formula_vars; this->FormulaVars(formula_vars); std::string formstruct = ("class." + util::to_string(c->type) + "."); int fdam = rpn_eval(rpn_parse(this->world->formulas_config[formstruct + "damage"]),formula_vars); int facc = rpn_eval(rpn_parse(this->world->formulas_config[formstruct + "accuracy"]),formula_vars); int fevade = rpn_eval(rpn_parse(this->world->formulas_config[formstruct + "evade"]), formula_vars); int fdef = rpn_eval(rpn_parse(this->world->formulas_config[formstruct + "defense"]), formula_vars); int mhp = rpn_eval(rpn_parse(this->world->formulas_config["hp"]), formula_vars); int mtp = rpn_eval(rpn_parse(this->world->formulas_config["tp"]), formula_vars); int msp = rpn_eval(rpn_parse(this->world->formulas_config["sp"]), formula_vars); formula_vars["weight"] = this->maxweight; formula_vars["str"] = calcstr; formula_vars["int"] = calcintl; formula_vars["wis"] = calcwis; formula_vars["agi"] = calcagi; formula_vars["con"] = calccon; formula_vars["cha"] = calccha; formula_vars["level"] = this->level; this->maxhp += mhp; this->maxtp += mtp; this->mindam += fdam; this->maxdam += fdam; this->accuracy += facc; this->evade += fevade; this->armor += fdef; this->maxsp += std::min(msp,100); } } if (this->party) { this->party->UpdateHP(this); } }