* 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. */
| 1280 | * @return Whether or not some promotions happened - to show the promotions screen. |
| 1281 | */ |
| 1282 | bool 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 |
no test coverage detected