Skip to content

Commit c15fbb4

Browse files
committed
1. Terrain Improvements of the same type can replace each other, but no downgrades are allowed.
2. Ask for confirmation when we are about to replace an improvement
1 parent 370b55d commit c15fbb4

File tree

3 files changed

+31
-8
lines changed

3 files changed

+31
-8
lines changed

C7/Game.cs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -797,11 +797,24 @@ private void ProcessAction(string currentAction) {
797797

798798
Terraform terraform = C7Action.ToTerraform(currentAction);
799799

800-
if (terraform != null
801-
&& CurrentlySelectedUnit != MapUnit.NONE
802-
&& CurrentlySelectedUnit.canPerformTerraformAction(terraform)) {
803-
new MsgStartWorkerJob(CurrentlySelectedUnit?.id, terraform).send();
800+
if (CurrentlySelectedUnit == MapUnit.NONE || CurrentlySelectedUnit == null
801+
|| terraform == null || !CurrentlySelectedUnit.canPerformTerraformAction(terraform))
802+
return;
803+
804+
TerrainImprovement currentImprovement = CurrentlySelectedUnit.location.overlays.ImprovementAtLayer(terraform);
805+
if (currentImprovement != null && terraform.Improvement.upgradesFrom != currentImprovement) {
806+
popupOverlay.ShowPopup(
807+
new ConfirmationPopup(
808+
$"A previous terrain enhancement ({currentImprovement.key.Capitalize()}) will be replaced \nby this operation. Do you wish to continue?",
809+
"Continue.",
810+
"Cancel action.",
811+
() => {
812+
new MsgStartWorkerJob(CurrentlySelectedUnit.id, terraform).send();
813+
}),
814+
PopupOverlay.PopupCategory.Advisor);
815+
return;
804816
}
817+
new MsgStartWorkerJob(CurrentlySelectedUnit.id, terraform).send();
805818
}
806819

807820
private void setGotoMode(bool isOn) {

C7Engine/C7GameData/TerrainImprovement.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,12 @@ public int GetYieldBonus(TerrainType terrain, Tile.YieldType yieldType) {
8484

8585
return 0;
8686
}
87+
88+
public bool CanBeReplacedBy(TerrainImprovement replacement) {
89+
if (this.key == replacement.key) return false; // mine-mine
90+
if (this.upgradesFrom == replacement) return false; // railroad upgrades from road so road cannot replace railroad
91+
if (replacement.upgradesFrom == this) return true; // railroad upgrades from road so railroad can replace road
92+
return this.layer == replacement.layer; // irrigation can replace mine and vice versa, an outpost a radar tower, etc
93+
}
8794
}
8895
}

C7Engine/C7GameData/Tile.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,12 @@ public TerrainImprovement ImprovementAtLayer(TerrainImprovement.Layer layer) {
772772
return ti;
773773
}
774774

775+
public TerrainImprovement ImprovementAtLayer(Terraform terraform) {
776+
TerrainImprovement.Layer currentLayer = terraform.Improvement.layer;
777+
terrainImprovementByLayer.TryGetValue(currentLayer, out TerrainImprovement ti);
778+
return ti;
779+
}
780+
775781
public bool HasImprovement(TerrainImprovement improvement) {
776782
return terrainImprovementByLayer.TryGetValue(improvement.layer, out TerrainImprovement val) && val == improvement;
777783
}
@@ -787,10 +793,7 @@ public bool CanAdd(TerrainImprovement improvement) {
787793
if (!terrainImprovementByLayer.TryGetValue(improvement.layer, out var current))
788794
return improvement.upgradesFrom == null;
789795

790-
if (current == improvement || current.upgradesFrom == improvement)
791-
return false;
792-
793-
return improvement.upgradesFrom == current;
796+
return current.CanBeReplacedBy(improvement);
794797
}
795798

796799
public bool HasRoad() {

0 commit comments

Comments
 (0)