From 895331e3f2eb10354653a5a815c8a079c3851dfe Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sun, 23 Sep 2018 12:10:54 +0300 Subject: [PATCH] Added Ancient Ruins, aka goodie huts! --- .../unciv/logic/automation/UnitAutomation.kt | 29 ++++++++++-- .../logic/civilization/CivilizationInfo.kt | 4 +- core/src/com/unciv/logic/map/MapUnit.kt | 45 +++++++++++++++++++ .../com/unciv/logic/map/RandomMapGenerator.kt | 6 +++ 4 files changed, 79 insertions(+), 5 deletions(-) diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index 6afdc743b8..8ebc1fea0b 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -32,11 +32,16 @@ class UnitAutomation{ if(unit.name.startsWith("Great")) return // I don't know what to do with you yet. val unitActions = UnitActions().getUnitActions(unit,UnCivGame.Current.worldScreen) + var unitDistanceToTiles = unit.getDistanceToTiles() + + if(tryGoToRuin(unit,unitDistanceToTiles)){ + if(unit.currentMovement==0f) return + unitDistanceToTiles = unit.getDistanceToTiles() + } if (tryUpgradeUnit(unit, unitActions)) return // Accompany settlers - val unitDistanceToTiles = unit.getDistanceToTiles() if (tryAccompanySettler(unit,unitDistanceToTiles)) return if (unit.health < 50) { @@ -259,7 +264,25 @@ class UnitAutomation{ return false } + fun tryGoToRuin(unit:MapUnit, unitDistanceToTiles: HashMap): Boolean { + val tileWithRuin = unitDistanceToTiles.keys.firstOrNull{unit.canMoveTo(it) && it.improvement == "Ancient ruins"} + if(tileWithRuin==null) return false + unit.moveToTile(tileWithRuin) + return true + } + private fun explore(unit: MapUnit, unitDistanceToTiles: HashMap) { + val distanceToTiles:HashMap + if(tryGoToRuin(unit,unitDistanceToTiles)) + { + if(unit.currentMovement==0f) return + distanceToTiles = unit.getDistanceToTiles() + } + else distanceToTiles = unitDistanceToTiles + + val reachableTiles= distanceToTiles + .filter { unit.canMoveTo(it.key) } + for(tile in unit.currentTile.getTilesInDistance(5)) if(unit.canMoveTo(tile) && tile.position !in unit.civInfo.exploredTiles && unit.movementAlgs().canReach(tile)){ @@ -267,8 +290,6 @@ class UnitAutomation{ return } - val reachableTiles= unitDistanceToTiles - .filter { unit.canMoveTo(it.key) } val reachableTilesMaxWalkingDistance = reachableTiles.filter { it.value == unit.currentMovement } if (reachableTilesMaxWalkingDistance.any()) unit.moveToTile(reachableTilesMaxWalkingDistance.toList().getRandom().first) else if (reachableTiles.any()) unit.moveToTile(reachableTiles.toList().getRandom().first) @@ -317,6 +338,8 @@ class UnitAutomation{ } fun automatedExplore(unit:MapUnit){ + if(tryGoToRuin(unit,unit.getDistanceToTiles()) && unit.currentMovement==0f) return + for(i in 1..10){ val unexploredTilesAtDistance = unit.getTile().getTilesAtDistance(i) .filter { unit.canMoveTo(it) && it.position !in unit.civInfo.exploredTiles diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 776902bbd5..0e395659b7 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -179,7 +179,7 @@ class CivilizationInfo { fun getBuildingUniques(): List = cities.flatMap { it.getBuildingUniques()}.distinct() fun getCivUnits(): List { - return units + return units.toList() // to avoid comodification problems (ie concurrency again...) } fun getViewableTiles(): List { @@ -295,7 +295,7 @@ class CivilizationInfo { for (city in cities) city.cityStats.update() happiness = getHappinessForNextTurn().values.sum().roundToInt() - getCivUnits().forEach { it.startTurn() } + getCivUnits().toList().forEach { it.startTurn() } } fun canEnterTiles(otherCiv: CivilizationInfo): Boolean { diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index 727d711cce..1bc43e203d 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -1,5 +1,6 @@ package com.unciv.logic.map +import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.math.Vector2 import com.unciv.logic.automation.UnitAutomation import com.unciv.logic.automation.WorkerAutomation @@ -8,7 +9,10 @@ import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.tile.TerrainType import com.unciv.models.gamebasics.unit.BaseUnit import com.unciv.models.gamebasics.unit.UnitType +import com.unciv.ui.utils.getRandom import java.text.DecimalFormat +import java.util.* +import kotlin.collections.ArrayList class MapUnit { @Transient lateinit var civInfo: CivilizationInfo @@ -258,6 +262,47 @@ class MapUnit { tile.civilianUnit=this else tile.militaryUnit=this currentTile = tile + if(tile.improvement=="Ancient ruins" && !civInfo.isBarbarianCivilization()) + getAncientRuinBonus() + } + + private fun getAncientRuinBonus() { + currentTile.improvement=null + val actions: ArrayList<() -> Unit> = ArrayList() + if(civInfo.cities.isNotEmpty()) actions.add { + val city = civInfo.cities.getRandom() + city.population.population++ + city.population.autoAssignPopulation() + civInfo.addNotification("We have found survivors the ruins - population added to ["+city.name+"]",city.location, Color.GREEN) + } + val researchableAncientEraTechs = GameBasics.Technologies.values.filter { civInfo.tech.canBeResearched(it.name)} + if(researchableAncientEraTechs.isNotEmpty()) + actions.add { + val tech = researchableAncientEraTechs.getRandom().name + civInfo.tech.techsResearched.add(tech) + if(civInfo.tech.techsToResearch.contains(tech)) civInfo.tech.techsToResearch.remove(tech) + civInfo.addNotification("We have discovered the lost technology of [$tech] in the ruins!",null, Color.BLUE) + } + + actions.add { + val chosenUnit = listOf("Settler","Worker","Warrior").getRandom() + civInfo.placeUnitNearTile(currentTile.position,chosenUnit) + civInfo.addNotification("A [$chosenUnit] has joined us!",null, Color.BLUE) + } + + if(baseUnit.unitType!=UnitType.Civilian) + actions.add { + promotions.XP+=10 + civInfo.addNotification("An ancient tribe trains our [$name] in their ways of combat!",null, Color.RED) + } + + actions.add { + val amount = listOf(25,60,100).getRandom() + civInfo.gold+=amount + civInfo.addNotification("We have found a stash of [$amount] gold in the ruins!!",null, Color.RED) + } + + (actions.getRandom())() } fun assignOwner(civInfo:CivilizationInfo){ diff --git a/core/src/com/unciv/logic/map/RandomMapGenerator.kt b/core/src/com/unciv/logic/map/RandomMapGenerator.kt index 2638beee6a..ade20a4812 100644 --- a/core/src/com/unciv/logic/map/RandomMapGenerator.kt +++ b/core/src/com/unciv/logic/map/RandomMapGenerator.kt @@ -7,6 +7,7 @@ import com.unciv.models.gamebasics.tile.ResourceType import com.unciv.models.gamebasics.tile.TerrainType import com.unciv.models.gamebasics.tile.TileResource import com.unciv.ui.utils.getRandom +import java.util.* class AlexanderRandomMapGenerator:RandomMapGenerator(){ fun generateMap(distance: Int, landExpansionChange:Float){ @@ -57,6 +58,7 @@ class Area(var terrain: String) { tile.baseTerrain = terrain RandomMapGenerator().addRandomTerrainFeature(tile) RandomMapGenerator().addRandomResourceToTile(tile) + RandomMapGenerator().maybeAddAncientRuins(tile) return tile } } @@ -215,4 +217,8 @@ open class RandomMapGenerator { map[vector.toString()] = addRandomTile(vector) return map } + + fun maybeAddAncientRuins(tile: TileInfo) { + if(Random().nextDouble() < 1f/100) tile.improvement = "Ancient ruins" + } }