From 64deaf3592740ed974016945aadcdcb035494e66 Mon Sep 17 00:00:00 2001 From: kgd192 <15697480+kgd192@users.noreply.github.com> Date: Wed, 17 Jan 2024 18:39:40 +0100 Subject: [PATCH] Only Repair allied Tiles if no own destroyed Tiles, Introduce Cost Factor --- framework/options.cpp | 10 ++++++++-- framework/options.h | 3 ++- game/state/city/city.cpp | 39 ++++++++++++++++++++++++++------------- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/framework/options.cpp b/framework/options.cpp index a9abd997c..2a3a260b9 100644 --- a/framework/options.cpp +++ b/framework/options.cpp @@ -117,7 +117,6 @@ void dumpOptionsToLog() dumpOption(optionEnableAgentTemplates); dumpOption(optionStoreDroppedEquipment); dumpOption(optionFallingGroundVehicles); - dumpOption(optionMaxTileRepair); dumpOption(optionEnforceCargoLimits); dumpOption(optionAllowNearbyVehicleLootPickup); @@ -137,6 +136,8 @@ void dumpOptionsToLog() dumpOption(optionBattlescapeVertScroll); dumpOption(optionSingleSquadSelect); dumpOption(optionATVUFOMission); + dumpOption(optionMaxTileRepair); + dumpOption(optionSceneryRepairCostFactor); dumpOption(optionStunHostileAction); dumpOption(optionRaidHostileAction); @@ -429,8 +430,13 @@ ConfigOptionBool "Allow ATV vehicles to initiate UFO missions (and recover vehicles)", false); ConfigOptionInt - optionMaxTileRepair("OpenApoc.NewFeature", "MaxTileRepair", + optionMaxTileRepair("OpenApoc.Mod", "MaxTileRepair", "Construction Vehicles will repair a maximum of X Tiles per night", 5); +ConfigOptionFloat + optionSceneryRepairCostFactor("OpenApoc.Mod", "SceneryRepairCostFactor", + "Determines the percentage of the original Price ORGs have to " + "pay for a Scenery Tile to be repaired", + 1.0f); ConfigOptionBool optionStunHostileAction("OpenApoc.Mod", "StunHostileAction", "Stunning hurts relationships", false); diff --git a/framework/options.h b/framework/options.h index ef241b735..62edf19d2 100644 --- a/framework/options.h +++ b/framework/options.h @@ -95,7 +95,6 @@ extern ConfigOptionBool optionAlternateVehicleShieldSound; extern ConfigOptionBool optionEnableAgentTemplates; extern ConfigOptionBool optionStoreDroppedEquipment; extern ConfigOptionBool optionFallingGroundVehicles; -extern ConfigOptionInt optionMaxTileRepair; extern ConfigOptionBool optionEnforceCargoLimits; extern ConfigOptionBool optionAllowNearbyVehicleLootPickup; @@ -115,6 +114,8 @@ extern ConfigOptionBool optionLeftClickIcon; extern ConfigOptionBool optionBattlescapeVertScroll; extern ConfigOptionBool optionSingleSquadSelect; extern ConfigOptionBool optionATVUFOMission; +extern ConfigOptionInt optionMaxTileRepair; +extern ConfigOptionFloat optionSceneryRepairCostFactor; extern ConfigOptionBool optionStunHostileAction; extern ConfigOptionBool optionRaidHostileAction; diff --git a/game/state/city/city.cpp b/game/state/city/city.cpp index ed41721a0..25ca12811 100644 --- a/game/state/city/city.cpp +++ b/game/state/city/city.cpp @@ -426,6 +426,7 @@ void City::repairScenery(GameState &state, bool debugRepair) } std::set> constructionVehicles = findConstructionVehicles(state); + bool ownBuildingsOnly = true; while (!constructionVehicles.empty() || debugRepair) { @@ -494,17 +495,19 @@ void City::repairScenery(GameState &state, bool debugRepair) // search for available construction vehicles sp currentVehicle = NULL; - for (auto &v : constructionVehicles) + if (ownBuildingsOnly) { - if (v->owner == buildingOwner) + for (auto &v : constructionVehicles) { - currentVehicle = v; - break; + if (v->owner == buildingOwner) + { + currentVehicle = v; + break; + } } } - - // if no own vehicles found look for allied vehicles - if (currentVehicle == NULL) + else + { for (auto &v : constructionVehicles) { // if relation is friendly or allied, help them bros out @@ -514,7 +517,7 @@ void City::repairScenery(GameState &state, bool debugRepair) break; } } - + } // check if sufficient funds are available, the tile is still dead and a construction // vehicle is available if (buildingOwner->balance < initialType->value || s->isAlive() || @@ -526,23 +529,33 @@ void City::repairScenery(GameState &state, bool debugRepair) else { // pay - buildingOwner->balance -= initialType->value; + buildingOwner->balance -= + initialType->value * config().getFloat("OpenApoc.Mod.SceneryRepairCostFactor"); // repair s->repair(state); // delete out of list to prevent repairing again repairQueue.pop(); tilesRepaired++; - if (currentVehicle && currentVehicle->tilesRepaired++ > - config().getInt("OpenApoc.NewFeature.MaxTileRepair")) + if (currentVehicle && + currentVehicle->tilesRepaired++ > config().getInt("OpenApoc.Mod.MaxTileRepair")) { constructionVehicles.erase(currentVehicle); } } } - // No Tiles repaired in last iteration due to no funds or vehicle match + // No Tiles repaired in last iteration due to no funds or vehicle match, look to help + // allies, otherwise break if (tilesRepaired <= 0 || debugRepair) { - break; + if (ownBuildingsOnly) + { + ownBuildingsOnly = false; + continue; + } + else + { + break; + } } }