@@ -1185,9 +1185,10 @@ Soldier *SavedGame::getSoldier(int id) const
11851185
11861186/* *
11871187 * Handles the higher promotions (not the rookie-squaddie ones).
1188+ * @param participants a list of soldiers that were actually present at the battle.
11881189 * @return Whether or not some promotions happened - to show the promotions screen.
11891190 */
1190- bool SavedGame::handlePromotions ()
1191+ bool SavedGame::handlePromotions (std::vector<Soldier*> &participants )
11911192{
11921193 size_t soldiersPromoted = 0 , soldiersTotal = 0 ;
11931194
@@ -1201,31 +1202,45 @@ bool SavedGame::handlePromotions()
12011202 // and the soldier with the heighest promotion score of the rank below it
12021203
12031204 size_t filledPositions = 0 , filledPositions2 = 0 ;
1205+ std::vector<Soldier*>::const_iterator soldier, stayedHome;
1206+ stayedHome = participants.end ();
12041207 inspectSoldiers (&highestRanked, &filledPositions, RANK_COMMANDER );
12051208 inspectSoldiers (&highestRanked, &filledPositions2, RANK_COLONEL );
1206- if (filledPositions < 1 && filledPositions2 > 0 )
1209+ soldier = std::find (participants.begin (), participants.end (), highestRanked);
1210+
1211+ if (filledPositions < 1 && filledPositions2 > 0 &&
1212+ (!Options::fieldPromotions || soldier != stayedHome))
12071213 {
12081214 // only promote one colonel to commander
12091215 highestRanked->promoteRank ();
12101216 soldiersPromoted++;
12111217 }
12121218 inspectSoldiers (&highestRanked, &filledPositions, RANK_COLONEL );
12131219 inspectSoldiers (&highestRanked, &filledPositions2, RANK_CAPTAIN );
1214- if (filledPositions < (soldiersTotal / 23 ) && filledPositions2 > 0 )
1220+ soldier = std::find (participants.begin (), participants.end (), highestRanked);
1221+
1222+ if (filledPositions < (soldiersTotal / 23 ) && filledPositions2 > 0 &&
1223+ (!Options::fieldPromotions || soldier != stayedHome))
12151224 {
12161225 highestRanked->promoteRank ();
12171226 soldiersPromoted++;
12181227 }
12191228 inspectSoldiers (&highestRanked, &filledPositions, RANK_CAPTAIN );
12201229 inspectSoldiers (&highestRanked, &filledPositions2, RANK_SERGEANT );
1221- if (filledPositions < (soldiersTotal / 11 ) && filledPositions2 > 0 )
1230+ soldier = std::find (participants.begin (), participants.end (), highestRanked);
1231+
1232+ if (filledPositions < (soldiersTotal / 11 ) && filledPositions2 > 0 &&
1233+ (!Options::fieldPromotions || soldier != stayedHome))
12221234 {
12231235 highestRanked->promoteRank ();
12241236 soldiersPromoted++;
12251237 }
12261238 inspectSoldiers (&highestRanked, &filledPositions, RANK_SERGEANT );
12271239 inspectSoldiers (&highestRanked, &filledPositions2, RANK_SQUADDIE );
1228- if (filledPositions < (soldiersTotal / 5 ) && filledPositions2 > 0 )
1240+ soldier = std::find (participants.begin (), participants.end (), highestRanked);
1241+
1242+ if (filledPositions < (soldiersTotal / 5 ) && filledPositions2 > 0 &&
1243+ (!Options::fieldPromotions || soldier != stayedHome))
12291244 {
12301245 highestRanked->promoteRank ();
12311246 soldiersPromoted++;
0 commit comments