/** * Calculates the list of StatStrings that apply to certain unit stats. * @param currentStats Unit stats. * @param statStrings List of statString rules. * @param psiStrengthEval Are psi stats available? * @return Resulting string of all valid StatStrings. */ const std::wstring StatString::calcStatString(UnitStats ¤tStats, const std::vector<StatString *> &statStrings, bool psiStrengthEval) { size_t conditionsMet; int minVal, maxVal; std::string conditionName, string; std::wstring wstring, statString; bool continueCalc = true; std::map<std::string, int> currentStatsMap = getCurrentStats(currentStats); for (std::vector<StatString *>::const_iterator i1 = statStrings.begin(); i1 != statStrings.end() && continueCalc; ++i1) { string = (*i1)->getString(); const std::vector<StatStringCondition* > conditions = (*i1)->getConditions(); conditionsMet = 0; for (std::vector<StatStringCondition* >::const_iterator i2 = conditions.begin(); i2 != conditions.end() && continueCalc; ++i2) { conditionName = (*i2)->getConditionName(); minVal = (*i2)->getMinVal(); maxVal = (*i2)->getMaxVal(); if (currentStatsMap.find(conditionName) != currentStatsMap.end()) { if (currentStatsMap[conditionName] >= minVal && currentStatsMap[conditionName] <= maxVal && (conditionName != "psiStrength" || (currentStats.psiSkill > 0 || psiStrengthEval))) { conditionsMet++; } if (conditionsMet == conditions.size()) { wstring.assign(string.begin(), string.end()); statString = statString + wstring; if (wstring.length() > 1) { continueCalc = false; } } } } } return statString; }
/** * Calculates the list of StatStrings that apply to certain unit stats. * @param currentStats Unit stats. * @param statStrings List of statString rules. * @param psiStrengthEval Are psi stats available? * @return Resulting string of all valid StatStrings. */ std::wstring StatString::calcStatString(UnitStats ¤tStats, const std::vector<StatString *> &statStrings, bool psiStrengthEval, bool inTraining) { std::wstring statString; std::map<std::string, int> currentStatsMap = getCurrentStats(currentStats); if (inTraining) { currentStatsMap["psiTraining"] = 1; } for (std::vector<StatString *>::const_iterator i = statStrings.begin(); i != statStrings.end(); ++i) { bool conditionsMet = true; for (std::vector<StatStringCondition*>::const_iterator j = (*i)->getConditions().begin(); j != (*i)->getConditions().end() && conditionsMet; ++j) { std::map<std::string, int>::iterator name = currentStatsMap.find((*j)->getConditionName()); if (name != currentStatsMap.end()) { conditionsMet = conditionsMet && (*j)->isMet(name->second, currentStats.psiSkill > 0 || psiStrengthEval); } else { // if name == currentStatsMap.end() we've searched for a stat that doesn't exist. // this means psi training. if there's no "psiTraining" stat in the statsMap, // this soldier isn't in training, so we won't append his name with the psiTraining tag. // presumably conditionsMet was originally initialized as false, but for whatever reason that was changed, hence this. conditionsMet = false; } } if (conditionsMet) { std::wstring wstring = Language::utf8ToWstr((*i)->getString()); statString += wstring; if (wstring.length() > 1) { break; } } } return statString; }