Skip to content

Commit 4fe8e44

Browse files
committed
add some UFOExtender options:
No Funkers
1 parent 0d7fd20 commit 4fe8e44

7 files changed

Lines changed: 35 additions & 8 deletions

File tree

bin/data/Language/en-GB.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,3 +1329,5 @@ en-GB:
13291329
STR_NOALIENPANICMESSAGES_DESC: "Don't show panic messages for aliens unless it is visible to the player."
13301330
STR_ALIENBLEEDING: "Alien bleeding"
13311331
STR_ALIENBLEEDING_DESC: "Allows fatal wounds to be inflicted on most aliens"
1332+
STR_FIELDPROMOTIONS: "Field promotions"
1333+
STR_FIELDPROMOTIONS_DESC: "Only soldiers that were present at the mission site are eligible for promotion."

bin/data/Language/en-US.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,3 +1329,5 @@ en-US:
13291329
STR_NOALIENPANICMESSAGES_DESC: "Don't show panic messages for aliens unless it is visible to the player."
13301330
STR_ALIENBLEEDING: "Alien bleeding"
13311331
STR_ALIENBLEEDING_DESC: "Allows fatal wounds to be inflicted on most aliens"
1332+
STR_FIELDPROMOTIONS: "Field promotions"
1333+
STR_FIELDPROMOTIONS_DESC: "Only soldiers that were present at the mission site are eligible for promotion."

src/Battlescape/DebriefingState.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,13 @@ DebriefingState::~DebriefingState()
254254
*/
255255
void DebriefingState::btnOkClick(Action *)
256256
{
257+
std::vector<Soldier*> participants;
258+
for (std::vector<BattleUnit*>::const_iterator i = _game->getSavedGame()->getSavedBattle()->getUnits()->begin();
259+
i != _game->getSavedGame()->getSavedBattle()->getUnits()->end(); ++i)
260+
{
261+
if ((*i)->getGeoscapeSoldier())
262+
participants.push_back((*i)->getGeoscapeSoldier());
263+
}
257264
_game->getSavedGame()->setBattleGame(0);
258265
_game->popState();
259266
if (_game->getSavedGame()->getMonthsPassed() == -1)
@@ -262,7 +269,7 @@ void DebriefingState::btnOkClick(Action *)
262269
}
263270
else if (!_destroyBase)
264271
{
265-
if (_game->getSavedGame()->handlePromotions())
272+
if (_game->getSavedGame()->handlePromotions(participants))
266273
{
267274
_game->pushState(new PromotionsState(_game));
268275
}

src/Engine/Options.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ void create()
147147
_info.push_back(OptionInfo("canTransferCraftsWhileAirborne", &canTransferCraftsWhileAirborne, false, "STR_CANTRANSFERCRAFTSWHILEAIRBORNE", "STR_GEOSCAPE")); // When the craft can reach the destination base with its fuel
148148
_info.push_back(OptionInfo("canManufactureMoreItemsPerHour", &canManufactureMoreItemsPerHour, false, "STR_CANMANUFACTUREMOREITEMSPERHOUR", "STR_GEOSCAPE"));
149149
_info.push_back(OptionInfo("spendResearchedItems", &spendResearchedItems, false, "STR_SPENDRESEARCHEDITEMS", "STR_GEOSCAPE"));
150+
_info.push_back(OptionInfo("fieldPromotions", &fieldPromotions, false, "STR_FIELDPROMOTIONS", "STR_GEOSCAPE"));
150151

151152
_info.push_back(OptionInfo("sneakyAI", &sneakyAI, false, "STR_SNEAKYAI", "STR_BATTLESCAPE"));
152153
_info.push_back(OptionInfo("battleUFOExtenderAccuracy", &battleUFOExtenderAccuracy, false, "STR_BATTLEUFOEXTENDERACCURACY", "STR_BATTLESCAPE"));

src/Engine/Options.inc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ OPT SDLKey keyOk, keyCancel, keyScreenshot, keyFps, keyQuickLoad, keyQuickSave;
1818
OPT int geoClockSpeed, dogfightSpeed, globeScrollSpeed, globeScrollDragButton, geoscapeScale;
1919
OPT bool includePrimeStateInSavedLayout, anytimePsiTraining, weaponSelfDestruction, spendResearchedItems, craftLaunchAlways, globeSeasons, globeDetail, globeRadarLines, globeFlightPaths, globeAllRadarsOnBaseBuild,
2020
alienContainmentLimitEnforced, canSellLiveAliens, canTransferCraftsWhileAirborne, canManufactureMoreItemsPerHour, customInitialBase, aggressiveRetaliation,
21-
allowBuildingQueue, allowAutoSellProduction, showFundsOnGeoscape, psiStrengthEval;
21+
allowBuildingQueue, allowAutoSellProduction, showFundsOnGeoscape, psiStrengthEval, fieldPromotions;
2222
OPT SDLKey keyGeoLeft, keyGeoRight, keyGeoUp, keyGeoDown, keyGeoZoomIn, keyGeoZoomOut, keyGeoSpeed1, keyGeoSpeed2, keyGeoSpeed3, keyGeoSpeed4, keyGeoSpeed5, keyGeoSpeed6,
2323
keyGeoIntercept, keyGeoBases, keyGeoGraphs, keyGeoUfopedia, keyGeoOptions, keyGeoFunding, keyGeoToggleDetail, keyGeoToggleRadar,
2424
keyBaseSelect1, keyBaseSelect2, keyBaseSelect3, keyBaseSelect4, keyBaseSelect5, keyBaseSelect6, keyBaseSelect7, keyBaseSelect8;

src/Savegame/SavedGame.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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++;

src/Savegame/SavedGame.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ class SavedGame
190190
/// Gets the soldier matching this ID.
191191
Soldier *getSoldier(int id) const;
192192
/// Handles the higher promotions.
193-
bool handlePromotions();
193+
bool handlePromotions(std::vector<Soldier*> &participants);
194194
/// Checks how many soldiers of a rank exist and which one has the highest score.
195195
void inspectSoldiers(Soldier **highestRanked, size_t *total, int rank);
196196
/// Returns the list of alien bases.

0 commit comments

Comments
 (0)