コード例 #1
0
ファイル: StatString.cpp プロジェクト: AMDmi3/OpenXcom
/**
 * 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 &currentStats, 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;
}
コード例 #2
0
ファイル: StatString.cpp プロジェクト: Darineth/OpenXcom
/**
 * 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 &currentStats, 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;
}