MCPcopy Create free account
hub / github.com/OpenXcom/OpenXcom / handlePromotions

Method handlePromotions

src/Savegame/SavedGame.cpp:1282–1341  ·  view source on GitHub ↗

* Handles the higher promotions (not the rookie-squaddie ones). * @param participants a list of soldiers that were actually present at the battle. * @return Whether or not some promotions happened - to show the promotions screen. */

Source from the content-addressed store, hash-verified

1280 * @return Whether or not some promotions happened - to show the promotions screen.
1281 */
1282bool SavedGame::handlePromotions(std::vector<Soldier*> &participants)
1283{
1284 size_t soldiersPromoted = 0, soldiersTotal = 0;
1285
1286 for (std::vector<Base*>::iterator i = _bases.begin(); i != _bases.end(); ++i)
1287 {
1288 soldiersTotal += (*i)->getSoldiers()->size();
1289 }
1290 Soldier *highestRanked = 0;
1291
1292 // now determine the number of positions we have of each rank,
1293 // and the soldier with the heighest promotion score of the rank below it
1294
1295 size_t filledPositions = 0, filledPositions2 = 0;
1296 std::vector<Soldier*>::const_iterator soldier, stayedHome;
1297 stayedHome = participants.end();
1298 inspectSoldiers(&highestRanked, &filledPositions, RANK_COMMANDER);
1299 inspectSoldiers(&highestRanked, &filledPositions2, RANK_COLONEL);
1300 soldier = std::find(participants.begin(), participants.end(), highestRanked);
1301
1302 if (filledPositions < 1 && filledPositions2 > 0 &&
1303 (!Options::fieldPromotions || soldier != stayedHome))
1304 {
1305 // only promote one colonel to commander
1306 highestRanked->promoteRank();
1307 soldiersPromoted++;
1308 }
1309 inspectSoldiers(&highestRanked, &filledPositions, RANK_COLONEL);
1310 inspectSoldiers(&highestRanked, &filledPositions2, RANK_CAPTAIN);
1311 soldier = std::find(participants.begin(), participants.end(), highestRanked);
1312
1313 if (filledPositions < (soldiersTotal / 23) && filledPositions2 > 0 &&
1314 (!Options::fieldPromotions || soldier != stayedHome))
1315 {
1316 highestRanked->promoteRank();
1317 soldiersPromoted++;
1318 }
1319 inspectSoldiers(&highestRanked, &filledPositions, RANK_CAPTAIN);
1320 inspectSoldiers(&highestRanked, &filledPositions2, RANK_SERGEANT);
1321 soldier = std::find(participants.begin(), participants.end(), highestRanked);
1322
1323 if (filledPositions < (soldiersTotal / 11) && filledPositions2 > 0 &&
1324 (!Options::fieldPromotions || soldier != stayedHome))
1325 {
1326 highestRanked->promoteRank();
1327 soldiersPromoted++;
1328 }
1329 inspectSoldiers(&highestRanked, &filledPositions, RANK_SERGEANT);
1330 inspectSoldiers(&highestRanked, &filledPositions2, RANK_SQUADDIE);
1331 soldier = std::find(participants.begin(), participants.end(), highestRanked);
1332
1333 if (filledPositions < (soldiersTotal / 5) && filledPositions2 > 0 &&
1334 (!Options::fieldPromotions || soldier != stayedHome))
1335 {
1336 highestRanked->promoteRank();
1337 soldiersPromoted++;
1338 }
1339

Callers 1

btnOkClickMethod · 0.80

Calls 2

promoteRankMethod · 0.80
getSoldiersMethod · 0.45

Tested by

no test coverage detected