/* * Copyright 2010-2016 OpenXcom Developers. * * This file is part of OpenXcom. * * OpenXcom is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenXcom is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenXcom. If not, see . */ #include "RuleSoldier.h" #include "Mod.h" #include "SoldierNamePool.h" #include "../Engine/FileMap.h" namespace OpenXcom { /** * Creates a blank ruleunit for a certain * type of soldier. * @param type String defining the type. */ RuleSoldier::RuleSoldier(const std::string &type) : _type(type), _costBuy(0), _costSalary(0), _standHeight(0), _kneelHeight(0), _floatHeight(0), _femaleFrequency(50), _value(20), _transferTime(0) { } /** * */ RuleSoldier::~RuleSoldier() { for (std::vector::iterator i = _names.begin(); i != _names.end(); ++i) { delete *i; } } /** * Loads the soldier from a YAML file. * @param node YAML node. * @param mod Mod for the unit. */ void RuleSoldier::load(const YAML::Node &node, Mod *mod) { _type = node["type"].as(_type); // Just in case if (_type == "XCOM") _type = "STR_SOLDIER"; _requires = node["requires"].as< std::vector >(_requires); _minStats.merge(node["minStats"].as(_minStats)); _maxStats.merge(node["maxStats"].as(_maxStats)); _statCaps.merge(node["statCaps"].as(_statCaps)); _armor = node["armor"].as(_armor); _costBuy = node["costBuy"].as(_costBuy); _costSalary = node["costSalary"].as(_costSalary); _standHeight = node["standHeight"].as(_standHeight); _kneelHeight = node["kneelHeight"].as(_kneelHeight); _floatHeight = node["floatHeight"].as(_floatHeight); _femaleFrequency = node["femaleFrequency"].as(_femaleFrequency); _value = node["value"].as(_value); _transferTime = node["transferTime"].as(_transferTime); mod->loadSoundOffset(_type, _deathSoundMale, node["deathMale"], "BATTLE.CAT"); mod->loadSoundOffset(_type, _deathSoundFemale, node["deathFemale"], "BATTLE.CAT"); for (YAML::const_iterator i = node["soldierNames"].begin(); i != node["soldierNames"].end(); ++i) { std::string fileName = (*i).as(); if (fileName == "delete") { for (std::vector::iterator j = _names.begin(); j != _names.end(); ++j) { delete *j; } _names.clear(); } else { if (fileName[fileName.length() - 1] == '/') { // load all *.nam files in given directory std::set names = FileMap::filterFiles(FileMap::getVFolderContents(fileName), "nam"); for (std::set::iterator j = names.begin(); j != names.end(); ++j) { addSoldierNamePool(fileName + *j); } } else { // load given file addSoldierNamePool(fileName); } } } } void RuleSoldier::addSoldierNamePool(const std::string &namFile) { SoldierNamePool *pool = new SoldierNamePool(); pool->load(FileMap::getFilePath(namFile)); _names.push_back(pool); } /** * Returns the language string that names * this soldier. Each soldier type has a unique name. * @return Soldier name. */ std::string RuleSoldier::getType() const { return _type; } /** * Gets the list of research required to * acquire this soldier. * @return The list of research IDs. */ const std::vector &RuleSoldier::getRequirements() const { return _requires; } /** * Gets the minimum stats for the random stats generator. * @return The minimum stats. */ UnitStats RuleSoldier::getMinStats() const { return _minStats; } /** * Gets the maximum stats for the random stats generator. * @return The maximum stats. */ UnitStats RuleSoldier::getMaxStats() const { return _maxStats; } /** * Gets the stat caps. * @return The stat caps. */ UnitStats RuleSoldier::getStatCaps() const { return _statCaps; } /** * Gets the cost of hiring this soldier. * @return The cost. */ int RuleSoldier::getBuyCost() const { return _costBuy; } /** * Gets the cost of salary for a month. * @return The cost. */ int RuleSoldier::getSalaryCost() const { return _costSalary; } /** * Gets the height of the soldier when it's standing. * @return The standing height. */ int RuleSoldier::getStandHeight() const { return _standHeight; } /** * Gets the height of the soldier when it's kneeling. * @return The kneeling height. */ int RuleSoldier::getKneelHeight() const { return _kneelHeight; } /** * Gets the elevation of the soldier when it's flying. * @return The floating height. */ int RuleSoldier::getFloatHeight() const { return _floatHeight; } /** * Gets the default armor name. * @return The armor name. */ std::string RuleSoldier::getArmor() const { return _armor; } /** * Gets the female appearance ratio. * @return The percentage ratio. */ int RuleSoldier::getFemaleFrequency() const { return _femaleFrequency; } /** * Gets the death sounds for male soldiers. * @return List of sound IDs. */ const std::vector &RuleSoldier::getMaleDeathSounds() const { return _deathSoundMale; } /** * Gets the death sounds for female soldiers. * @return List of sound IDs. */ const std::vector &RuleSoldier::getFemaleDeathSounds() const { return _deathSoundFemale; } /** * Returns the list of soldier name pools. * @return Pointer to soldier name pool list. */ const std::vector &RuleSoldier::getNames() const { return _names; } /** * Gets the soldier's base value, without experience modifiers. * @return The soldier's value. */ int RuleSoldier::getValue() const { return _value; } /** * Gets the amount of time this item * takes to arrive at a base. * @return The time in hours. */ int RuleSoldier::getTransferTime() const { return _transferTime; } }