From ae60aab7e5588bd86b7970af694a8852909d914f Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Fri, 7 Aug 2020 17:22:48 +0300 Subject: [PATCH] Resolved #2818 - Can no longer build improvements outside your borders --- .../Civ V - Vanilla/TileImprovements.json | 6 +- .../jsons/translations/template.properties | 3 + .../com/unciv/logic/battle/BattleDamage.kt | 7 +- core/src/com/unciv/logic/map/TileInfo.kt | 17 ++-- .../ui/newgamescreen/PlayerPickerTable.kt | 3 +- .../pickerscreens/ImprovementPickerScreen.kt | 77 ++++++++----------- .../unciv/ui/worldscreen/WorldScreenTopBar.kt | 2 +- 7 files changed, 54 insertions(+), 61 deletions(-) diff --git a/android/assets/jsons/Civ V - Vanilla/TileImprovements.json b/android/assets/jsons/Civ V - Vanilla/TileImprovements.json index f6a7a8b1f8..5c8418f3df 100644 --- a/android/assets/jsons/Civ V - Vanilla/TileImprovements.json +++ b/android/assets/jsons/Civ V - Vanilla/TileImprovements.json @@ -95,12 +95,14 @@ { "name": "Road", "turnsToBuild": 4, - "techRequired": "The Wheel" + "techRequired": "The Wheel", + "uniques": ["Can be built outside your borders"] }, { "name": "Railroad", "turnsToBuild": 4, - "techRequired": "Railroad" + "techRequired": "Railroad", + "uniques": ["Can be built outside your borders"] }, // Removals diff --git a/android/assets/jsons/translations/template.properties b/android/assets/jsons/translations/template.properties index 95b6849efe..5d2c775d68 100644 --- a/android/assets/jsons/translations/template.properties +++ b/android/assets/jsons/translations/template.properties @@ -507,6 +507,8 @@ Working... = Waiting for other players... = in = Next turn = +1 turn = +[numberOfTurns] turns = Turn = turns = turn = @@ -659,6 +661,7 @@ Landing = Flanking = vs [unitType] = Terrain = +Tile = Missing resource = diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index faea456664..f2312a5de2 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -178,12 +178,7 @@ object BattleDamage { if (!defender.unit.hasUnique("No defensive terrain bonus")) { val tileDefenceBonus = tile.getDefensiveBonus() if (tileDefenceBonus > 0) - modifiers["Terrain"] = tileDefenceBonus - - val improvement = tile.getTileImprovement() - if (improvement != null && tile.isFriendlyTerritory(defender.getCivInfo())) - if (improvement.hasUnique("Gives a defensive bonus of 50%")) modifiers[improvement.name] = 0.50f - else if (improvement.hasUnique("Gives a defensive bonus of 100%")) modifiers[improvement.name] = 1.0f + modifiers["Tile"] = tileDefenceBonus } if(attacker.isRanged()) { diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index a82c12b928..15a745b400 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -272,6 +272,9 @@ open class TileInfo { improvement.techRequired?.let { civInfo.tech.isResearched(it) } == false -> false "Cannot be built on bonus resource" in improvement.uniques && resource != null && getTileResource().resourceType == ResourceType.Bonus -> false + !improvement.hasUnique("Can be built outside your borders") + && getOwner() != civInfo -> false + improvement.terrainsCanBeBuiltOn.contains(topTerrain.name) -> true improvement.name == "Road" && roadStatus == RoadStatus.None -> true improvement.name == "Railroad" && this.roadStatus != RoadStatus.Railroad -> true @@ -308,6 +311,12 @@ open class TileInfo { fun getDefensiveBonus(): Float { var bonus = getBaseTerrain().defenceBonus if (terrainFeature != null) bonus += getTerrainFeature()!!.defenceBonus + val tileImprovement = getTileImprovement() + if (tileImprovement != null) { + for (unique in tileImprovement.uniqueObjects) + if (unique.placeholderText == "Gives a defensive bonus of []%") + bonus += unique.params[0].toFloat() / 100 + } return bonus } @@ -361,7 +370,7 @@ open class TileInfo { if (roadStatus !== RoadStatus.None && !isCityCenter()) lineList += roadStatus.toString().tr() if (improvement != null) lineList += improvement!!.tr() if (improvementInProgress != null && isViewableToPlayer) - lineList += "{$improvementInProgress}\r\n{in} $turnsToImprovement {turns}".tr() // todo change to [] translation notation + lineList += "{$improvementInProgress}\r\n $turnsToImprovement {turns}".tr() // todo change to [] translation notation if (civilianUnit != null && isViewableToPlayer) lineList += civilianUnit!!.name.tr() + " - " + civilianUnit!!.civInfo.civName.tr() if (militaryUnit != null && isViewableToPlayer) { @@ -371,12 +380,6 @@ open class TileInfo { lineList += milUnitString } var defenceBonus = getDefensiveBonus() - val tileImprovement = getTileImprovement() - if (tileImprovement != null) { - for (unique in tileImprovement.uniqueObjects) - if (unique.placeholderText == "Gives a defensive bonus of []%") - defenceBonus += unique.params[0].toFloat() / 100 - } if (defenceBonus != 0.0f) { var defencePercentString = (defenceBonus * 100).toInt().toString() + "%" if (!defencePercentString.startsWith("-")) defencePercentString = "+$defencePercentString" diff --git a/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt b/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt index 410c1b2547..3f12e0e8ec 100644 --- a/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt @@ -247,7 +247,8 @@ class PlayerPickerTable(val previousScreen: IPreviousScreen, var gameParameters: }).pad(10f).width(nationsPopupWidth).row() } - nationsPopup.add(ScrollPane(nationListTable)).height(previousScreen.stage.height * 0.8f) + nationsPopup.add(ScrollPane(nationListTable).apply { setOverscroll(false,false) }) + .height(previousScreen.stage.height * 0.8f) nationsPopup.pack() val closeImage = ImageGetter.getImage("OtherIcons/Close") diff --git a/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt index c9c0c0392c..0dfad2c078 100644 --- a/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/ImprovementPickerScreen.kt @@ -5,7 +5,6 @@ import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.ui.Button import com.badlogic.gdx.scenes.scene2d.ui.Table -import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup import com.badlogic.gdx.utils.Align import com.unciv.Constants import com.unciv.logic.map.RoadStatus @@ -15,75 +14,65 @@ import com.unciv.models.translations.tr import com.unciv.ui.utils.* import kotlin.math.round -class ImprovementPickerScreen(tileInfo: TileInfo, onAccept: ()->Unit) : PickerScreen() { +class ImprovementPickerScreen(val tileInfo: TileInfo, val onAccept: ()->Unit) : PickerScreen() { private var selectedImprovement: TileImprovement? = null + val currentPlayerCiv = game.gameInfo.getCurrentPlayerCivilization() + + fun accept(improvement: TileImprovement?) { + if (improvement == null) return + if (improvement.name == Constants.cancelImprovementOrder) { + tileInfo.stopWorkingOnImprovement() + // no onAccept() - Worker can stay selected + } else { + tileInfo.startWorkingOnImprovement(improvement, currentPlayerCiv) + if (tileInfo.civilianUnit != null) tileInfo.civilianUnit!!.action = null // this is to "wake up" the worker if it's sleeping + onAccept() + } + game.setWorldScreen() + dispose() + } init { - val currentPlayerCiv = game.gameInfo.getCurrentPlayerCivilization() setDefaultCloseAction() - fun accept(improvement: TileImprovement?) { - if (improvement != null) { - if (improvement.name == Constants.cancelImprovementOrder ) { - tileInfo.stopWorkingOnImprovement() - // no onAccept() - Worker can stay selected - } else { - tileInfo.startWorkingOnImprovement(improvement, currentPlayerCiv) - if (tileInfo.civilianUnit != null) tileInfo.civilianUnit!!.action = null // this is to "wake up" the worker if it's sleeping - onAccept() - } - game.setWorldScreen() - dispose() - } - } - rightSideButton.setText("Pick improvement".tr()) rightSideButton.onClick { accept(selectedImprovement) } - if(tileInfo.improvementInProgress!=null){ - val currentImprovementText = "{${tileInfo.improvementInProgress}} {in} ${tileInfo.turnsToImprovement} {turns}" - topTable.add(currentImprovementText.toLabel()).padBottom(10f).row() - } - val regularImprovements = Table() regularImprovements.defaults().pad(5f) for (improvement in tileInfo.tileMap.gameInfo.ruleSet.tileImprovements.values) { if (!tileInfo.canBuildImprovement(improvement, currentPlayerCiv)) continue - if(improvement.name == tileInfo.improvement) continue - if(improvement.name == tileInfo.improvementInProgress) continue + if (improvement.name == tileInfo.improvement) continue - val group = Table() + val improvementButtonTable = Table() - val image = ImageGetter.getImprovementIcon(improvement.name,30f) + val image = ImageGetter.getImprovementIcon(improvement.name, 30f) - group.add(image).size(30f).pad(10f) + improvementButtonTable.add(image).size(30f).pad(10f) var labelText = improvement.name.tr() val turnsToBuild = improvement.getTurnsToBuild(currentPlayerCiv) if (turnsToBuild > 0) labelText += " - $turnsToBuild {turns}" val provideResource = tileInfo.hasViewableResource(currentPlayerCiv) && tileInfo.getTileResource().improvement == improvement.name - if (provideResource) labelText += "\n"+"Provides [${tileInfo.resource}]".tr() - val removeImprovement = (improvement.name!=RoadStatus.Road.name - && improvement.name!=RoadStatus.Railroad.name && !improvement.name.startsWith("Remove") && improvement.name != Constants.cancelImprovementOrder) - if (tileInfo.improvement!=null && removeImprovement) labelText += "\n" + "Replaces [${tileInfo.improvement}]".tr() + if (provideResource) labelText += "\n" + "Provides [${tileInfo.resource}]".tr() + val removeImprovement = (improvement.name != RoadStatus.Road.name + && improvement.name != RoadStatus.Railroad.name && !improvement.name.startsWith("Remove") && improvement.name != Constants.cancelImprovementOrder) + if (tileInfo.improvement != null && removeImprovement) labelText += "\n" + "Replaces [${tileInfo.improvement}]".tr() - group.add(labelText.toLabel()).pad(10f) + improvementButtonTable.add(labelText.toLabel()).pad(10f) - group.touchable = Touchable.enabled - group.onClick { + improvementButtonTable.touchable = Touchable.enabled + improvementButtonTable.onClick { selectedImprovement = improvement pick(improvement.name.tr()) val ruleSet = tileInfo.tileMap.gameInfo.ruleSet descriptionLabel.setText(improvement.getDescription(ruleSet)) } - val pickNow = "Pick now!".toLabel() - pickNow.onClick { - accept(improvement) - } + val pickNow = "Pick now!".toLabel().onClick { accept(improvement) } val statIcons = Table() @@ -91,8 +80,7 @@ class ImprovementPickerScreen(tileInfo: TileInfo, onAccept: ()->Unit) : PickerSc val stats = tileInfo.getImprovementStats(improvement, currentPlayerCiv, tileInfo.getCity()) // subtract the benefits of the replaced improvement, if any val existingImprovement = tileInfo.getTileImprovement() - if (existingImprovement!=null && removeImprovement) - { + if (existingImprovement != null && removeImprovement) { val existingStats = tileInfo.getImprovementStats(existingImprovement, currentPlayerCiv, tileInfo.getCity()) stats.add(existingStats.times(-1.0f)) } @@ -100,7 +88,7 @@ class ImprovementPickerScreen(tileInfo: TileInfo, onAccept: ()->Unit) : PickerSc // icons of benefits (food, gold, etc) by improvement val statsTable = Table() statsTable.defaults() - for(stat in stats.toHashMap()) { + for (stat in stats.toHashMap()) { val statValue = round(stat.value).toInt() if (statValue == 0) continue @@ -120,7 +108,7 @@ class ImprovementPickerScreen(tileInfo: TileInfo, onAccept: ()->Unit) : PickerSc if (removeImprovement && tileInfo.hasViewableResource(currentPlayerCiv) && tileInfo.getTileResource().improvement == tileInfo.improvement) { val crossedResource = Group() val cross = ImageGetter.getImage("OtherIcons/Close") - cross.setSize(30f,30f) + cross.setSize(30f, 30f) cross.color = Color.RED val resourceIcon = ImageGetter.getResourceImage(tileInfo.resource.toString(), 30f) crossedResource.addActor(resourceIcon) @@ -132,7 +120,8 @@ class ImprovementPickerScreen(tileInfo: TileInfo, onAccept: ()->Unit) : PickerSc regularImprovements.add(statIcons).align(Align.right) val improvementButton = Button(skin) - improvementButton.add(group).pad(5f).fillY() + improvementButton.add(improvementButtonTable).pad(5f).fillY() + if (improvement.name == tileInfo.improvementInProgress) improvementButton.color= Color.GREEN regularImprovements.add(improvementButton) regularImprovements.add(pickNow).padLeft(10f) regularImprovements.row() diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt b/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt index ba27a7b05d..7ce09cb456 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreenTopBar.kt @@ -63,7 +63,7 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() { for (resource in revealedStrategicResources) { val resourceImage = ImageGetter.getResourceImage(resource.name, 20f) resourceImages[resource.name] = resourceImage - resourceTable.add(resourceImage) + resourceTable.add(resourceImage).padRight(0f) val resourceLabel = "0".toLabel() resourceLabels[resource.name] = resourceLabel resourceTable.add(resourceLabel)