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