Added Ancient Ruins, aka goodie huts!

This commit is contained in:
Yair Morgenstern 2018-09-23 12:10:54 +03:00
parent 7b2bf48e04
commit 895331e3f2
4 changed files with 79 additions and 5 deletions

View File

@ -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<TileInfo, Float>): 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<TileInfo, Float>) {
val distanceToTiles:HashMap<TileInfo, Float>
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

View File

@ -179,7 +179,7 @@ class CivilizationInfo {
fun getBuildingUniques(): List<String> = cities.flatMap { it.getBuildingUniques()}.distinct()
fun getCivUnits(): List<MapUnit> {
return units
return units.toList() // to avoid comodification problems (ie concurrency again...)
}
fun getViewableTiles(): List<TileInfo> {
@ -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 {

View File

@ -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){

View File

@ -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"
}
}