Entiirely removed Linq - now only using Kotlin extensions!

This commit is contained in:
Yair Morgenstern 2018-03-07 21:51:33 +02:00
parent 1a4a9d416c
commit 7f8e1707be
42 changed files with 233 additions and 378 deletions

View File

@ -4,14 +4,13 @@ import com.badlogic.gdx.math.Vector2
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.Notification import com.unciv.logic.civilization.Notification
import com.unciv.logic.map.TileMap import com.unciv.logic.map.TileMap
import com.unciv.models.linq.Linq
class GameInfo { class GameInfo {
var notifications = Linq<Notification>() var notifications = mutableListOf<Notification>()
var tutorial = Linq<String>() var tutorial = mutableListOf<String>()
var civilizations = Linq<CivilizationInfo>() var civilizations = mutableListOf<CivilizationInfo>()
var tileMap: TileMap = TileMap() var tileMap: TileMap = TileMap()
var turns = 1 var turns = 1
@ -26,15 +25,18 @@ class GameInfo {
for (civInfo in civilizations) civInfo.nextTurn() for (civInfo in civilizations) civInfo.nextTurn()
for (tile in tileMap.values.where { it.unit != null }) for (tile in tileMap.values.filter { it.unit != null })
tile.nextTurn() tile.nextTurn()
// We need to update the stats after ALL the cities are done updating because // We need to update the stats after ALL the cities are done updating because
// maybe one of them has a wonder that affects the stats of all the rest of the cities // maybe one of them has a wonder that affects the stats of all the rest of the cities
for (civInfo in civilizations) for (civInfo in civilizations){
for (city in civInfo.cities) for (city in civInfo.cities)
city.cityStats.update() city.cityStats.update()
civInfo.happiness = civInfo.getHappinessForNextTurn()
}
turns++ turns++
} }

View File

@ -1,26 +1,24 @@
package com.unciv.logic.city package com.unciv.logic.city
import com.unciv.models.linq.Linq
import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.Building
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
import java.util.*
import java.util.HashMap
class CityConstructions { class CityConstructions {
@Transient @Transient
lateinit var cityInfo: CityInfo lateinit var cityInfo: CityInfo
var builtBuildings = Linq<String>() var builtBuildings = ArrayList<String>()
private val inProgressConstructions = HashMap<String, Int>() private val inProgressConstructions = HashMap<String, Int>()
var currentConstruction: String = "Monument" // default starting building! var currentConstruction: String = "Monument" // default starting building!
private val buildableBuildings: Linq<String> private val buildableBuildings: List<String>
get() { get() {
return Linq(GameBasics.Buildings.values) return GameBasics.Buildings.values
.where { it.isBuildable(this) }.select { it.name } .filter { it.isBuildable(this) }.map { it.name }
} }
// Library and public school unique (not actualy unique, though...hmm) // Library and public school unique (not actualy unique, though...hmm)
@ -36,7 +34,7 @@ class CityConstructions {
fun getStatPercentBonuses(): Stats { fun getStatPercentBonuses(): Stats {
val stats = Stats() val stats = Stats()
for (building in getBuiltBuildings().where { it.percentStatBonus != null }) for (building in getBuiltBuildings().filter { it.percentStatBonus != null })
stats.add(building.percentStatBonus!!) stats.add(building.percentStatBonus!!)
return stats return stats
} }
@ -75,7 +73,7 @@ class CityConstructions {
throw Exception(constructionName+ " is not a building or a unit!") throw Exception(constructionName+ " is not a building or a unit!")
} }
internal fun getBuiltBuildings(): Linq<Building> = builtBuildings.select { GameBasics.Buildings[it] } internal fun getBuiltBuildings(): List<Building> = builtBuildings.map { GameBasics.Buildings[it]!! }
fun addConstruction(constructionToAdd: Int) { fun addConstruction(constructionToAdd: Int) {
if (!inProgressConstructions.containsKey(currentConstruction)) inProgressConstructions[currentConstruction] = 0 if (!inProgressConstructions.containsKey(currentConstruction)) inProgressConstructions[currentConstruction] = 0
@ -139,7 +137,7 @@ class CityConstructions {
} }
fun addCultureBuilding() { fun addCultureBuilding() {
val cultureBuildingToBuild = Linq("Monument", "Temple", "Opera House", "Museum").first { !builtBuildings.contains(it) } val cultureBuildingToBuild = listOf("Monument", "Temple", "Opera House", "Museum").firstOrNull { !builtBuildings.contains(it) }
if (cultureBuildingToBuild == null) return if (cultureBuildingToBuild == null) return
builtBuildings.add(cultureBuildingToBuild) builtBuildings.add(cultureBuildingToBuild)
if (currentConstruction == cultureBuildingToBuild) if (currentConstruction == cultureBuildingToBuild)

View File

@ -25,7 +25,7 @@ class CityExpansionManager {
cultureStored -= cultureToNextTile cultureStored -= cultureToNextTile
for (i in 2..3) { for (i in 2..3) {
val tiles = cityInfo.civInfo.gameInfo.tileMap.getTilesInDistance(cityInfo.cityLocation, i).where { it.owner == null } val tiles = cityInfo.civInfo.gameInfo.tileMap.getTilesInDistance(cityInfo.cityLocation, i).filter { it.owner == null }
if (tiles.size == 0) continue if (tiles.size == 0) continue
val chosenTile = tiles.maxBy { cityInfo.rankTile(it) } val chosenTile = tiles.maxBy { cityInfo.rankTile(it) }
chosenTile!!.owner = cityInfo.civInfo.civName chosenTile!!.owner = cityInfo.civInfo.civName

View File

@ -5,10 +5,9 @@ import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.RoadStatus import com.unciv.logic.map.RoadStatus
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.logic.map.TileMap import com.unciv.logic.map.TileMap
import com.unciv.models.linq.Linq
import com.unciv.models.linq.LinqCounter
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.TileResource import com.unciv.models.gamebasics.TileResource
import com.unciv.models.linq.Counter
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
class CityInfo { class CityInfo {
@ -27,14 +26,14 @@ class CityInfo {
val tile: TileInfo val tile: TileInfo
get() = tileMap[cityLocation] get() = tileMap[cityLocation]
val tilesInRange: Linq<TileInfo> val tilesInRange: List<TileInfo>
get() = tileMap.getTilesInDistance(cityLocation, 3).where { civInfo.civName == it.owner } get() = tileMap.getTilesInDistance(cityLocation, 3).filter { civInfo.civName == it.owner }
private val CityNames = arrayOf("New Bark", "Cherrygrove", "Violet", "Azalea", "Goldenrod", "Ecruteak", "Olivine", "Cianwood", "Mahogany", "Blackthorn", "Pallet", "Viridian", "Pewter", "Cerulean", "Vermillion", "Lavender", "Celadon", "Fuchsia", "Saffron", "Cinnibar") private val CityNames = arrayOf("New Bark", "Cherrygrove", "Violet", "Azalea", "Goldenrod", "Ecruteak", "Olivine", "Cianwood", "Mahogany", "Blackthorn", "Pallet", "Viridian", "Pewter", "Cerulean", "Vermillion", "Lavender", "Celadon", "Fuchsia", "Saffron", "Cinnibar")
// Remove resources required by buildings // Remove resources required by buildings
fun getCityResources(): LinqCounter<TileResource> { fun getCityResources(): Counter<TileResource> {
val cityResources = LinqCounter<TileResource>() val cityResources = Counter<TileResource>()
for (tileInfo in tilesInRange.filter { it.resource != null }) { for (tileInfo in tilesInRange.filter { it.resource != null }) {
val resource = tileInfo.tileResource val resource = tileInfo.tileResource
@ -49,8 +48,8 @@ class CityInfo {
return cityResources return cityResources
} }
val buildingUniques: Linq<String> val buildingUniques: List<String?>
get() = cityConstructions.getBuiltBuildings().where { it.unique!=null }.select { it.unique } get() = cityConstructions.getBuiltBuildings().filter { it.unique!=null }.map { it.unique }
val greatPersonPoints: Stats val greatPersonPoints: Stats
get() { get() {
@ -95,7 +94,7 @@ class CityInfo {
val tile = tile val tile = tile
tile.workingCity = this.name tile.workingCity = this.name
tile.roadStatus = RoadStatus.Railroad tile.roadStatus = RoadStatus.Railroad
if (Linq("Forest", "Jungle", "Marsh").contains(tile.terrainFeature)) if (listOf("Forest", "Jungle", "Marsh").contains(tile.terrainFeature))
tile.terrainFeature = null tile.terrainFeature = null
population.autoAssignWorker() population.autoAssignWorker()

View File

@ -4,7 +4,6 @@ import com.unciv.logic.map.RoadStatus
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.Building
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.linq.Linq
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
@ -16,7 +15,7 @@ class CityStats {
private val statsFromTiles: Stats private val statsFromTiles: Stats
get() { get() {
val stats = Stats() val stats = Stats()
for (cell in cityInfo.tilesInRange.where { cityInfo.name == it.workingCity }) for (cell in cityInfo.tilesInRange.filter { cityInfo.name == it.workingCity })
stats.add(cell.getTileStats(cityInfo, cityInfo.civInfo)) stats.add(cell.getTileStats(cityInfo, cityInfo.civInfo))
return stats return stats
} }
@ -98,35 +97,34 @@ class CityStats {
// needs to be a separate function because we need to know the global happiness state // needs to be a separate function because we need to know the global happiness state
// in order to determine how much food is produced in a city! // in order to determine how much food is produced in a city!
// -3 happiness per city // -3 happiness per city
val cityHappiness: Float fun getCityHappiness(): Float {
get() { val civInfo = cityInfo.civInfo
val civInfo = cityInfo.civInfo var happiness = -3f
var happiness = -3f var unhappinessFromCitizens = cityInfo.population.population.toFloat()
var unhappinessFromCitizens = cityInfo.population.population.toFloat() if (civInfo.policies.isAdopted("Democracy"))
if (civInfo.policies.isAdopted("Democracy")) unhappinessFromCitizens -= cityInfo.population.numberOfSpecialists * 0.5f
unhappinessFromCitizens -= cityInfo.population.numberOfSpecialists * 0.5f if (civInfo.buildingUniques.contains("CitizenUnhappinessDecreased"))
if (civInfo.buildingUniques.contains("CitizenUnhappinessDecreased")) unhappinessFromCitizens *= 0.9f
unhappinessFromCitizens *= 0.9f if (civInfo.policies.isAdopted("Aristocracy"))
if (civInfo.policies.isAdopted("Aristocracy")) unhappinessFromCitizens *= 0.95f
unhappinessFromCitizens *= 0.95f happiness -= unhappinessFromCitizens
happiness -= unhappinessFromCitizens
if (civInfo.policies.isAdopted("Aristocracy")) if (civInfo.policies.isAdopted("Aristocracy"))
happiness += (cityInfo.population.population / 10).toFloat() happiness += (cityInfo.population.population / 10).toFloat()
if (civInfo.policies.isAdopted("Monarchy") && isCapital) if (civInfo.policies.isAdopted("Monarchy") && isCapital)
happiness += (cityInfo.population.population / 2).toFloat() happiness += (cityInfo.population.population / 2).toFloat()
if (civInfo.policies.isAdopted("Meritocracy") && isConnectedToCapital(RoadStatus.Road)) if (civInfo.policies.isAdopted("Meritocracy") && isConnectedToCapital(RoadStatus.Road))
happiness += 1f happiness += 1f
happiness += cityInfo.cityConstructions.getStats().happiness.toInt().toFloat() happiness += cityInfo.cityConstructions.getStats().happiness.toInt().toFloat()
return happiness return happiness
} }
private val isCapital: Boolean private val isCapital: Boolean
get() = cityInfo.civInfo.capital === cityInfo get() = cityInfo.civInfo.capital === cityInfo
private fun getStatsFromSpecialists(specialists: Stats, policies: Linq<String>): Stats { private fun getStatsFromSpecialists(specialists: Stats, policies: List<String>): Stats {
val stats = Stats() val stats = Stats()
// Specialists // Specialists
@ -141,7 +139,7 @@ class CityStats {
return stats return stats
} }
private fun getStatsFromPolicies(adoptedPolicies: Linq<String>): Stats { private fun getStatsFromPolicies(adoptedPolicies: List<String>): Stats {
val stats = Stats() val stats = Stats()
if (adoptedPolicies.contains("Tradition") && isCapital) if (adoptedPolicies.contains("Tradition") && isCapital)
stats.culture += 3f stats.culture += 3f
@ -169,7 +167,7 @@ class CityStats {
return stats return stats
} }
private fun getStatPercentBonusesFromPolicies(policies: Linq<String>, cityConstructions: CityConstructions): Stats { private fun getStatPercentBonusesFromPolicies(policies: List<String>, cityConstructions: CityConstructions): Stats {
val stats = Stats() val stats = Stats()
if (policies.contains("Collective Rule") && isCapital if (policies.contains("Collective Rule") && isCapital
@ -239,7 +237,7 @@ class CityStats {
if(cityInfo.civInfo.cities.count()<2) return false// first city! if(cityInfo.civInfo.cities.count()<2) return false// first city!
val capitalTile = cityInfo.civInfo.capital.tile val capitalTile = cityInfo.civInfo.capital.tile
val tilesReached = HashSet<TileInfo>() val tilesReached = HashSet<TileInfo>()
var tilesToCheck : List<TileInfo> = Linq<TileInfo>(cityInfo.tile) var tilesToCheck : List<TileInfo> = listOf(cityInfo.tile)
while (tilesToCheck.any()) { while (tilesToCheck.any()) {
val newTiles = tilesToCheck val newTiles = tilesToCheck
.flatMap { cityInfo.tileMap.getTilesInDistance(it.position, 1) }.distinct() .flatMap { cityInfo.tileMap.getTilesInDistance(it.position, 1) }.distinct()

View File

@ -1,11 +1,10 @@
package com.unciv.logic.city package com.unciv.logic.city
import com.unciv.models.linq.Linq
import com.unciv.models.stats.INamed import com.unciv.models.stats.INamed
interface IConstruction : INamed { interface IConstruction : INamed {
fun getProductionCost(adoptedPolicies: Linq<String>): Int fun getProductionCost(adoptedPolicies: List<String>): Int
fun getGoldCost(adoptedPolicies: Linq<String>): Int fun getGoldCost(adoptedPolicies: List<String>): Int
fun isBuildable(construction: CityConstructions): Boolean fun isBuildable(construction: CityConstructions): Boolean
fun postBuildEvent(construction: CityConstructions) // Yes I'm hilarious. fun postBuildEvent(construction: CityConstructions) // Yes I'm hilarious.
} }

View File

@ -1,7 +1,6 @@
package com.unciv.logic.city package com.unciv.logic.city
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.models.linq.LinqHashMap
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
class PopulationManager { class PopulationManager {
@ -11,7 +10,7 @@ class PopulationManager {
@JvmField var population = 1 @JvmField var population = 1
@JvmField var foodStored = 0 @JvmField var foodStored = 0
@JvmField var buildingsSpecialists = LinqHashMap<String, Stats>() @JvmField var buildingsSpecialists = HashMap<String, Stats>()
val specialists: Stats val specialists: Stats
get() { get() {
@ -64,7 +63,7 @@ class PopulationManager {
} }
internal fun autoAssignWorker() { internal fun autoAssignWorker() {
var toWork: TileInfo? = cityInfo!!.tilesInRange.where { it.workingCity==null }.maxBy { cityInfo!!.rankTile(it) } val toWork: TileInfo? = cityInfo!!.tilesInRange.filter { it.workingCity==null }.maxBy { cityInfo!!.rankTile(it) }
if (toWork != null) // This is when we've run out of tiles! if (toWork != null) // This is when we've run out of tiles!
toWork.workingCity = cityInfo!!.name toWork.workingCity = cityInfo!!.name
} }

View File

@ -1,14 +1,13 @@
package com.unciv.logic.civilization package com.unciv.logic.civilization
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.unciv.logic.GameInfo
import com.unciv.logic.city.CityInfo import com.unciv.logic.city.CityInfo
import com.unciv.logic.map.RoadStatus import com.unciv.logic.map.RoadStatus
import com.unciv.logic.GameInfo
import com.unciv.models.linq.Linq
import com.unciv.models.linq.LinqCounter
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.ResourceType import com.unciv.models.gamebasics.ResourceType
import com.unciv.models.gamebasics.TileResource import com.unciv.models.gamebasics.TileResource
import com.unciv.models.linq.Counter
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
@ -27,7 +26,7 @@ class CivilizationInfo {
private var greatPeople = GreatPersonManager() private var greatPeople = GreatPersonManager()
var scienceVictory = ScienceVictoryManager() var scienceVictory = ScienceVictoryManager()
var cities = Linq<CityInfo>() var cities = ArrayList<CityInfo>()
val capital: CityInfo val capital: CityInfo
get() = cities.first { it.cityConstructions.isBuilt("Palace") } get() = cities.first { it.cityConstructions.isBuilt("Palace") }
@ -61,26 +60,26 @@ class CivilizationInfo {
} }
// base happiness // base happiness
private fun getHappinessForNextTurn(): Int { fun getHappinessForNextTurn(): Int {
var happiness = 15 var happiness = 15
var happinessPerUniqueLuxury = 5 var happinessPerUniqueLuxury = 5
if (policies.isAdopted("Protectionism")) happinessPerUniqueLuxury += 1 if (policies.isAdopted("Protectionism")) happinessPerUniqueLuxury += 1
happiness += getCivResources().keys happiness += getCivResources().keys
.count { it.resourceType === ResourceType.Luxury } * happinessPerUniqueLuxury .count { it.resourceType === ResourceType.Luxury } * happinessPerUniqueLuxury
happiness += cities.sumBy { it.cityStats.cityHappiness.toInt() } happiness += cities.sumBy { it.cityStats.getCityHappiness().toInt() }
if (buildingUniques.contains("HappinessPerSocialPolicy")) if (buildingUniques.contains("HappinessPerSocialPolicy"))
happiness += policies.getAdoptedPolicies().count { !it.endsWith("Complete") } happiness += policies.getAdoptedPolicies().count { !it.endsWith("Complete") }
return happiness return happiness
} }
fun getCivResources(): LinqCounter<TileResource> { fun getCivResources(): Counter<TileResource> {
val civResources = LinqCounter<TileResource>() val civResources = Counter<TileResource>()
for (city in cities) civResources.add(city.getCityResources()) for (city in cities) civResources.add(city.getCityResources())
return civResources return civResources
} }
val buildingUniques: Linq<String> val buildingUniques: List<String>
get() = cities.selectMany { it.cityConstructions.getBuiltBuildings().select { it.unique }.filterNotNull() }.unique() get() = cities.flatMap{ it.cityConstructions.getBuiltBuildings().map { it.unique }.filterNotNull() }.distinct()
constructor() constructor()
@ -115,7 +114,6 @@ class CivilizationInfo {
fun nextTurn() { fun nextTurn() {
val nextTurnStats = getStatsForNextTurn() val nextTurnStats = getStatsForNextTurn()
happiness = nextTurnStats.happiness.toInt()
policies.nextTurn(nextTurnStats.culture.toInt()) policies.nextTurn(nextTurnStats.culture.toInt())
gold += nextTurnStats.gold.toInt() gold += nextTurnStats.gold.toInt()
@ -135,9 +133,9 @@ class CivilizationInfo {
} }
fun addGreatPerson(greatPerson: String) { fun addGreatPerson(greatPerson: String) {
val randomCity = cities.random val randomCity = cities.getRandom()
placeUnitNearTile(cities.random.cityLocation, greatPerson) placeUnitNearTile(cities.getRandom().cityLocation, greatPerson)
gameInfo.addNotification("A $greatPerson has been born!", randomCity!!.cityLocation) gameInfo.addNotification("A $greatPerson has been born!", randomCity.cityLocation)
} }
fun placeUnitNearTile(location: Vector2, unitName: String) { fun placeUnitNearTile(location: Vector2, unitName: String) {
@ -145,3 +143,4 @@ class CivilizationInfo {
} }
} }
fun <E> List<E>.getRandom(): E = if (size == 0) throw Exception() else get((Math.random() * size).toInt())

View File

@ -2,7 +2,6 @@ package com.unciv.logic.civilization
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.Policy import com.unciv.models.gamebasics.Policy
import com.unciv.models.linq.Linq
import com.unciv.ui.UnCivGame import com.unciv.ui.UnCivGame
import com.unciv.ui.pickerscreens.GreatPersonPickerScreen import com.unciv.ui.pickerscreens.GreatPersonPickerScreen
@ -14,7 +13,7 @@ class PolicyManager {
var freePolicies = 0 var freePolicies = 0
var storedCulture = 0 var storedCulture = 0
internal val adoptedPolicies = Linq<String>() internal val adoptedPolicies = ArrayList<String>()
var shouldOpenPolicyPicker = false var shouldOpenPolicyPicker = false
// from https://forums.civfanatics.com/threads/the-number-crunching-thread.389702/ // from https://forums.civfanatics.com/threads/the-number-crunching-thread.389702/
@ -31,7 +30,7 @@ class PolicyManager {
} }
fun getAdoptedPolicies(): Linq<String> = adoptedPolicies fun getAdoptedPolicies(): List<String> = adoptedPolicies
fun isAdopted(policyName: String): Boolean = adoptedPolicies.contains(policyName) fun isAdopted(policyName: String): Boolean = adoptedPolicies.contains(policyName)

View File

@ -1,13 +1,13 @@
package com.unciv.logic.civilization package com.unciv.logic.civilization
import com.unciv.models.linq.LinqCounter import com.unciv.models.linq.Counter
class ScienceVictoryManager { class ScienceVictoryManager {
var requiredParts = LinqCounter<String>() var requiredParts = Counter<String>()
var currentParts = LinqCounter<String>() var currentParts = Counter<String>()
fun unconstructedParts(): LinqCounter<String> { fun unconstructedParts(): Counter<String> {
val counter = requiredParts.clone() val counter = requiredParts.clone()
counter.remove(currentParts) counter.remove(currentParts)
return counter return counter

View File

@ -1,12 +1,9 @@
package com.unciv.logic.civilization package com.unciv.logic.civilization
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.Technology import com.unciv.models.gamebasics.Technology
import java.util.*
import java.util.ArrayList
import java.util.HashMap
import java.util.HashSet
class TechManager { class TechManager {
@Transient @Transient
@ -54,14 +51,14 @@ class TechManager {
techsResearched.add(currentTechnology) techsResearched.add(currentTechnology)
civInfo.gameInfo.addNotification("Research of $currentTechnology has completed!", null) civInfo.gameInfo.addNotification("Research of $currentTechnology has completed!", null)
val revealedResource = GameBasics.TileResources.linqValues().first { currentTechnology == it.revealedBy } val revealedResource = GameBasics.TileResources.values.firstOrNull { currentTechnology == it.revealedBy }
if (revealedResource == null) return if (revealedResource == null) return
for (tileInfo in civInfo.gameInfo.tileMap.values for (tileInfo in civInfo.gameInfo.tileMap.values
.where { it.resource == revealedResource.name && civInfo.civName == it.owner }) { .filter { it.resource == revealedResource.name && civInfo.civName == it.owner }) {
val closestCityTile = civInfo.gameInfo.tileMap.getTilesInDistance(tileInfo.position, 4) val closestCityTile = civInfo.gameInfo.tileMap.getTilesInDistance(tileInfo.position, 4)
.first { it.isCityCenter } .firstOrNull { it.isCityCenter }
if (closestCityTile != null) { if (closestCityTile != null) {
civInfo.gameInfo.addNotification( civInfo.gameInfo.addNotification(
revealedResource.name + " revealed near " + closestCityTile.city!!.name, tileInfo.position) revealedResource.name + " revealed near " + closestCityTile.city!!.name, tileInfo.position)

View File

@ -54,30 +54,19 @@ class MapUnit {
private fun getPriority(tileInfo: TileInfo): Int { private fun getPriority(tileInfo: TileInfo): Int {
var priority = 0 var priority = 0
if (tileInfo.workingCity != null) priority += 2 if (tileInfo.workingCity != null) priority += 3
if (tileInfo.hasViewableResource(civInfo)) priority += 1
if (tileInfo.owner == owner) priority += 2 if (tileInfo.owner == owner) priority += 2
if (tileInfo.hasViewableResource(civInfo)) priority += 1
else if (tileInfo.neighbors.any { it.owner != null }) priority += 1 else if (tileInfo.neighbors.any { it.owner != null }) priority += 1
return priority return priority
} }
private fun findTileToWork(currentTile: TileInfo): TileInfo { private fun findTileToWork(currentTile: TileInfo): TileInfo {
var selectedTile = currentTile val selectedTile = civInfo.gameInfo.tileMap.getTilesInDistance(currentTile.position, 4)
var selectedTilePriority = .filter { (it.unit==null || it==currentTile ) && it.improvement==null && it.canBuildImprovement(chooseImprovement(it),civInfo) }
if (currentTile.improvement == null && currentTile.canBuildImprovement(chooseImprovement(currentTile), civInfo)) .maxBy { getPriority(it) }
getPriority(currentTile) if(selectedTile!=null && getPriority(selectedTile) > 1) return selectedTile
else else return currentTile
1 // min rank to get selected is 2
for (i in 1..4)
for (tile in civInfo.gameInfo.tileMap.getTilesAtDistance(currentTile.position, i))
if (tile.unit == null && tile.improvement == null && getPriority(tile) > selectedTilePriority
&& tile.canBuildImprovement(chooseImprovement(tile), civInfo)) {
selectedTile = tile
selectedTilePriority = getPriority(tile)
}
return selectedTile
} }
fun doAutomatedAction(tile: TileInfo) { fun doAutomatedAction(tile: TileInfo) {

View File

@ -1,12 +1,11 @@
package com.unciv.logic.map package com.unciv.logic.map
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.unciv.logic.civilization.getRandom
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.ResourceType import com.unciv.models.gamebasics.ResourceType
import com.unciv.models.gamebasics.TerrainType import com.unciv.models.gamebasics.TerrainType
import com.unciv.models.gamebasics.TileResource import com.unciv.models.gamebasics.TileResource
import com.unciv.models.linq.Linq
import com.unciv.models.linq.LinqHashMap
import com.unciv.ui.utils.HexMath import com.unciv.ui.utils.HexMath
class RandomMapGenerator { class RandomMapGenerator {
@ -14,15 +13,15 @@ class RandomMapGenerator {
private fun addRandomTile(position: Vector2): TileInfo { private fun addRandomTile(position: Vector2): TileInfo {
val tileInfo = TileInfo() val tileInfo = TileInfo()
tileInfo.position = position tileInfo.position = position
val terrains = GameBasics.Terrains.linqValues() val terrains = GameBasics.Terrains.values
val baseTerrain = terrains.where { it.type === TerrainType.BaseTerrain && it.name != "Lakes" }.random val baseTerrain = terrains.filter { it.type === TerrainType.BaseTerrain && it.name != "Lakes" }.getRandom()
tileInfo.baseTerrain = baseTerrain!!.name tileInfo.baseTerrain = baseTerrain.name
if (baseTerrain.canHaveOverlay) { if (baseTerrain.canHaveOverlay) {
if (Math.random() > 0.7f) { if (Math.random() > 0.7f) {
val SecondaryTerrain = terrains.where { it.type === TerrainType.TerrainFeature && it.occursOn!!.contains(baseTerrain.name) }.random val secondaryTerrains = terrains.filter { it.type === TerrainType.TerrainFeature && it.occursOn!!.contains(baseTerrain.name) }
if (SecondaryTerrain != null) tileInfo.terrainFeature = SecondaryTerrain.name if (secondaryTerrains.any()) tileInfo.terrainFeature = secondaryTerrains.getRandom().name
} }
} }
@ -31,31 +30,29 @@ class RandomMapGenerator {
return tileInfo return tileInfo
} }
internal fun addRandomResourceToTile(tileInfo: TileInfo) { private fun addRandomResourceToTile(tileInfo: TileInfo) {
var TileResources = GameBasics.TileResources.linqValues() var tileResources = GameBasics.TileResources.values.toList()
// Resources are placed according to TerrainFeature, if exists, otherwise according to BaseLayer. // Resources are placed according to TerrainFeature, if exists, otherwise according to BaseLayer.
TileResources = TileResources.where { it.terrainsCanBeFoundOn.contains(tileInfo.lastTerrain.name) } tileResources = tileResources.filter { it.terrainsCanBeFoundOn.contains(tileInfo.lastTerrain.name) }
var resource: TileResource? = null var resource: TileResource? = null
if (Math.random() < 1 / 5f) { when {
resource = GetRandomResource(TileResources, ResourceType.Bonus) Math.random() < 1 / 5f -> resource = getRandomResource(tileResources, ResourceType.Bonus)
} else if (Math.random() < 1 / 7f) { Math.random() < 1 / 7f -> resource = getRandomResource(tileResources, ResourceType.Strategic)
resource = GetRandomResource(TileResources, ResourceType.Strategic) Math.random() < 1 / 15f -> resource = getRandomResource(tileResources, ResourceType.Luxury)
} else if (Math.random() < 1 / 15f) {
resource = GetRandomResource(TileResources, ResourceType.Luxury)
} }
if (resource != null) tileInfo.resource = resource.name if (resource != null) tileInfo.resource = resource.name
} }
internal fun GetRandomResource(resources: Linq<TileResource>, resourceType: ResourceType): TileResource? { private fun getRandomResource(resources: List<TileResource>, resourceType: ResourceType): TileResource? {
return resources.where { it.resourceType == resourceType }.random return resources.filter { it.resourceType == resourceType }.getRandom()
} }
fun generateMap(distance: Int): LinqHashMap<String, TileInfo> { fun generateMap(distance: Int): HashMap<String, TileInfo> {
val map = LinqHashMap<String, TileInfo>() val map = HashMap<String, TileInfo>()
for (vector in HexMath.GetVectorsInDistance(Vector2.Zero, distance)) for (vector in HexMath.GetVectorsInDistance(Vector2.Zero, distance))
map[vector.toString()] = addRandomTile(vector) map[vector.toString()] = addRandomTile(vector)
return map return map

View File

@ -7,7 +7,6 @@ import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.Terrain import com.unciv.models.gamebasics.Terrain
import com.unciv.models.gamebasics.TileImprovement import com.unciv.models.gamebasics.TileImprovement
import com.unciv.models.gamebasics.TileResource import com.unciv.models.gamebasics.TileResource
import com.unciv.models.linq.Linq
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
class TileInfo { class TileInfo {
@ -33,21 +32,21 @@ class TileInfo {
get() = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()!! get() = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()!!
val tileResource: TileResource val tileResource: TileResource
get() = if (resource == null) throw Exception("No resource exists for this tile!") else GameBasics.TileResources[resource]!! get() = if (resource == null) throw Exception("No resource exists for this tile!") else GameBasics.TileResources[resource!!]!!
val isCityCenter: Boolean val isCityCenter: Boolean
get() = city != null && position == city!!.cityLocation get() = city != null && position == city!!.cityLocation
val tileImprovement: TileImprovement? val tileImprovement: TileImprovement?
get() = if (improvement == null) null else GameBasics.TileImprovements[improvement] get() = if (improvement == null) null else GameBasics.TileImprovements[improvement!!]
val neighbors: Linq<TileInfo> val neighbors: List<TileInfo>
get() = tileMap!!.getTilesAtDistance(position, 1) get() = tileMap!!.getTilesAtDistance(position, 1)
val height: Int val height: Int
get() { get() {
var height = 0 var height = 0
if (Linq("Forest", "Jungle").contains(terrainFeature)) height += 1 if (listOf("Forest", "Jungle").contains(terrainFeature)) height += 1
if ("Hill" == baseTerrain) height += 2 if ("Hill" == baseTerrain) height += 2
return height return height
} }
@ -62,7 +61,7 @@ class TileInfo {
} }
fun getTerrainFeature(): Terrain? { fun getTerrainFeature(): Terrain? {
return if (terrainFeature == null) null else GameBasics.Terrains[terrainFeature] return if (terrainFeature == null) null else GameBasics.Terrains[terrainFeature!!]
} }
@ -85,7 +84,7 @@ class TileInfo {
val resource = tileResource val resource = tileResource
stats.add(tileResource) // resource base stats.add(tileResource) // resource base
if (resource.building != null && city != null && city.cityConstructions.isBuilt(resource.building!!)) { if (resource.building != null && city != null && city.cityConstructions.isBuilt(resource.building!!)) {
stats.add(resource.GetBuilding()!!.resourceBonusStats!!) // resource-specific building (eg forge, stable) bonus stats.add(resource.getBuilding()!!.resourceBonusStats!!) // resource-specific building (eg forge, stable) bonus
} }
} }
@ -99,7 +98,7 @@ class TileInfo {
if (improvement.improvingTech != null && observingCiv.tech.isResearched(improvement.improvingTech!!)) stats.add(improvement.improvingTechStats!!) // eg Chemistry for mines if (improvement.improvingTech != null && observingCiv.tech.isResearched(improvement.improvingTech!!)) stats.add(improvement.improvingTechStats!!) // eg Chemistry for mines
if (improvement.name == "Trading post" && city != null && city.civInfo.policies.isAdopted("Free Thought")) if (improvement.name == "Trading post" && city != null && city.civInfo.policies.isAdopted("Free Thought"))
stats.science += 1f stats.science += 1f
if (Linq("Academy", "Landmark", "Manufactory", "Customs House").contains(improvement.name) && observingCiv.policies.isAdopted("Freedom Complete")) if (listOf("Academy", "Landmark", "Manufactory", "Customs House").contains(improvement.name) && observingCiv.policies.isAdopted("Freedom Complete"))
stats.add(improvement) // again, for the double effect stats.add(improvement) // again, for the double effect
} }

View File

@ -4,8 +4,6 @@ import com.badlogic.gdx.math.Vector2
import com.unciv.logic.GameInfo import com.unciv.logic.GameInfo
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.linq.Linq
import com.unciv.models.linq.LinqHashMap
import com.unciv.ui.utils.HexMath import com.unciv.ui.utils.HexMath
class TileMap { class TileMap {
@ -13,12 +11,12 @@ class TileMap {
@Transient @Transient
@JvmField var gameInfo: GameInfo? = null @JvmField var gameInfo: GameInfo? = null
private var tiles = LinqHashMap<String, TileInfo>() private var tiles = HashMap<String, TileInfo>()
constructor() // for json parsing, we need to have a default constructor constructor() // for json parsing, we need to have a default constructor
val values: Linq<TileInfo> val values: MutableCollection<TileInfo>
get() = tiles.linqValues() get() = tiles.values
constructor(distance: Int) { constructor(distance: Int) {
@ -34,21 +32,21 @@ class TileMap {
return tiles[vector.toString()]!! return tiles[vector.toString()]!!
} }
fun getTilesInDistance(origin: Vector2, distance: Int): Linq<TileInfo> { fun getTilesInDistance(origin: Vector2, distance: Int): List<TileInfo> {
return HexMath.GetVectorsInDistance(origin, distance).where{contains(it)}.select { get(it) } return HexMath.GetVectorsInDistance(origin, distance).filter {contains(it)}.map { get(it) }
} }
fun getTilesAtDistance(origin: Vector2, distance: Int): Linq<TileInfo> { fun getTilesAtDistance(origin: Vector2, distance: Int): List<TileInfo> {
return HexMath.GetVectorsAtDistance(origin, distance).where{contains(it)}.select { get(it) } return HexMath.GetVectorsAtDistance(origin, distance).filter {contains(it)}.map { get(it) }
} }
fun getDistanceToTilesWithinTurn(origin: Vector2, currentUnitMovement: Float, machineryIsResearched: Boolean): LinqHashMap<TileInfo, Float> { fun getDistanceToTilesWithinTurn(origin: Vector2, currentUnitMovement: Float, machineryIsResearched: Boolean): HashMap<TileInfo, Float> {
val distanceToTiles = LinqHashMap<TileInfo, Float>() val distanceToTiles = HashMap<TileInfo, Float>()
distanceToTiles[get(origin)] = 0f distanceToTiles[get(origin)] = 0f
var tilesToCheck = Linq<TileInfo>(get(origin)) var tilesToCheck = listOf(get(origin))
while (!tilesToCheck.isEmpty()) { while (!tilesToCheck.isEmpty()) {
val updatedTiles = Linq<TileInfo>() val updatedTiles = ArrayList<TileInfo>()
for (tileToCheck in tilesToCheck) for (tileToCheck in tilesToCheck)
for (maybeUpdatedTile in getTilesInDistance(tileToCheck.position, 1)) { for (maybeUpdatedTile in getTilesInDistance(tileToCheck.position, 1)) {
var distanceBetweenTiles = maybeUpdatedTile.lastTerrain.movementCost.toFloat() // no road var distanceBetweenTiles = maybeUpdatedTile.lastTerrain.movementCost.toFloat() // no road
@ -75,13 +73,13 @@ class TileMap {
} }
fun getShortestPath(origin: Vector2, destination: Vector2, currentMovement: Float, maxMovement: Int, isMachineryResearched: Boolean): List<TileInfo> { fun getShortestPath(origin: Vector2, destination: Vector2, currentMovement: Float, maxMovement: Int, isMachineryResearched: Boolean): List<TileInfo> {
var tilesToCheck: Linq<TileInfo> = Linq(get(origin)) var tilesToCheck: List<TileInfo> = listOf(get(origin))
val movementTreeParents = LinqHashMap<TileInfo, TileInfo>() // contains a map of "you can get from X to Y in that turn" val movementTreeParents = HashMap<TileInfo, TileInfo?>() // contains a map of "you can get from X to Y in that turn"
movementTreeParents[get(origin)] = null movementTreeParents[get(origin)] = null
var distance = 1 var distance = 1
while (true) { while (true) {
val newTilesToCheck = Linq<TileInfo>() val newTilesToCheck = ArrayList<TileInfo>()
val distanceToDestination = HashMap<TileInfo, Float>() val distanceToDestination = HashMap<TileInfo, Float>()
val movementThisTurn = if (distance == 1) currentMovement else maxMovement.toFloat() val movementThisTurn = if (distance == 1) currentMovement else maxMovement.toFloat()
for (tileToCheck in tilesToCheck) { for (tileToCheck in tilesToCheck) {
@ -99,7 +97,7 @@ class TileMap {
} }
if (distanceToDestination.isNotEmpty()) { if (distanceToDestination.isNotEmpty()) {
val path = Linq<TileInfo>() // Traverse the tree upwards to get the list of tiles leading to the destination, val path = ArrayList<TileInfo>() // Traverse the tree upwards to get the list of tiles leading to the destination,
var currentTile = distanceToDestination.minBy { it.value }!!.key var currentTile = distanceToDestination.minBy { it.value }!!.key
while (currentTile.position != origin) { while (currentTile.position != origin) {
path.add(currentTile) path.add(currentTile)
@ -117,12 +115,12 @@ class TileMap {
val unit = GameBasics.Units[unitName]!!.mapUnit val unit = GameBasics.Units[unitName]!!.mapUnit
unit.owner = civInfo.civName unit.owner = civInfo.civName
unit.civInfo = civInfo unit.civInfo = civInfo
getTilesInDistance(position, 2).first { it.unit == null }!!.unit = unit // And if there's none, then kill me. getTilesInDistance(position, 2).first { it.unit == null }.unit = unit // And if there's none, then kill me.
} }
fun getViewableTiles(position: Vector2, sightDistance: Int): Linq<TileInfo> { fun getViewableTiles(position: Vector2, sightDistance: Int): MutableList<TileInfo> {
var sightDistance = sightDistance var sightDistance = sightDistance
val viewableTiles = getTilesInDistance(position, 1) val viewableTiles = getTilesInDistance(position, 1).toMutableList()
if (get(position).baseTerrain == "Hill") sightDistance += 1 if (get(position).baseTerrain == "Hill") sightDistance += 1
for (i in 1..sightDistance) { // in each layer, for (i in 1..sightDistance) { // in each layer,
getTilesAtDistance(position, i).filterTo(viewableTiles) // take only tiles which have a visible neighbor, which is lower than the tile getTilesAtDistance(position, i).filterTo(viewableTiles) // take only tiles which have a visible neighbor, which is lower than the tile

View File

@ -2,7 +2,6 @@ package com.unciv.models.gamebasics
import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.CityConstructions
import com.unciv.logic.city.IConstruction import com.unciv.logic.city.IConstruction
import com.unciv.models.linq.Linq
import com.unciv.models.stats.NamedStats import com.unciv.models.stats.NamedStats
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
import com.unciv.ui.ScienceVictoryScreen import com.unciv.ui.ScienceVictoryScreen
@ -13,7 +12,7 @@ import com.unciv.ui.pickerscreens.PolicyPickerScreen
class Building : NamedStats(), IConstruction, ICivilopedia { class Building : NamedStats(), IConstruction, ICivilopedia {
private lateinit var baseDescription: String private lateinit var baseDescription: String
override val description: String override val description: String
get() = getDescription(false, Linq()) get() = getDescription(false, listOf())
@JvmField var requiredTech: String? = null @JvmField var requiredTech: String? = null
@ -30,7 +29,7 @@ class Building : NamedStats(), IConstruction, ICivilopedia {
/** A strategic resource that will be consumed by this building */ /** A strategic resource that will be consumed by this building */
@JvmField var requiredResource: String? = null @JvmField var requiredResource: String? = null
/** City can only be built if one of these resources is nearby - it must be improved! */ /** City can only be built if one of these resources is nearby - it must be improved! */
@JvmField var requiredNearbyImprovedResources: Linq<String>? = null @JvmField var requiredNearbyImprovedResources: List<String>? = null
@JvmField var cannotBeBuiltWith: String? = null @JvmField var cannotBeBuiltWith: String? = null
// Uniques // Uniques
@ -46,18 +45,18 @@ class Building : NamedStats(), IConstruction, ICivilopedia {
fun getRequiredTech(): Technology = GameBasics.Technologies[requiredTech]!! fun getRequiredTech(): Technology = GameBasics.Technologies[requiredTech]!!
fun getStats(adoptedPolicies: Linq<String>): Stats { fun getStats(adoptedPolicies: List<String>): Stats {
val stats = this.clone() val stats = this.clone()
if (adoptedPolicies.contains("Organized Religion") && Linq("Monument", "Temple", "Monastery").contains(name)) if (adoptedPolicies.contains("Organized Religion") && listOf("Monument", "Temple", "Monastery").contains(name))
stats.happiness += 1 stats.happiness += 1
if (adoptedPolicies.contains("Free Religion") && Linq("Monument", "Temple", "Monastery").contains(name)) if (adoptedPolicies.contains("Free Religion") && listOf("Monument", "Temple", "Monastery").contains(name))
stats.culture += 1f stats.culture += 1f
if (adoptedPolicies.contains("Entrepreneurship") && Linq("Mint", "Market", "Bank", "Stock Market").contains(name)) if (adoptedPolicies.contains("Entrepreneurship") && listOf("Mint", "Market", "Bank", "Stock Market").contains(name))
stats.science += 1f stats.science += 1f
if (adoptedPolicies.contains("Humanism") && Linq("University", "Observatory", "Public School").contains(name)) if (adoptedPolicies.contains("Humanism") && listOf("University", "Observatory", "Public School").contains(name))
stats.science += 1f stats.science += 1f
if (adoptedPolicies.contains("Theocracy") && name == "Temple") if (adoptedPolicies.contains("Theocracy") && name == "Temple")
@ -80,7 +79,7 @@ class Building : NamedStats(), IConstruction, ICivilopedia {
} }
fun getDescription(forBuildingPickerScreen: Boolean, adoptedPolicies: Linq<String>): String { fun getDescription(forBuildingPickerScreen: Boolean, adoptedPolicies: List<String>): String {
val stats = getStats(adoptedPolicies) val stats = getStats(adoptedPolicies)
val stringBuilder = StringBuilder() val stringBuilder = StringBuilder()
if (!forBuildingPickerScreen) stringBuilder.appendln("Cost: " + cost) if (!forBuildingPickerScreen) stringBuilder.appendln("Cost: " + cost)
@ -111,7 +110,7 @@ class Building : NamedStats(), IConstruction, ICivilopedia {
if (gpp.culture != 0f) stringBuilder.appendln("+" + gpp.culture.toInt() + " Great Artist points") if (gpp.culture != 0f) stringBuilder.appendln("+" + gpp.culture.toInt() + " Great Artist points")
} }
if (resourceBonusStats != null) { if (resourceBonusStats != null) {
val resources = GameBasics.TileResources.linqValues().where { name == it.building }.select { it.name }.joinToString() val resources = GameBasics.TileResources.values.filter { name == it.building }.joinToString { it.name }
stringBuilder.appendln("$resources provide $resourceBonusStats") stringBuilder.appendln("$resources provide $resourceBonusStats")
} }
if (maintenance != 0) if (maintenance != 0)
@ -119,12 +118,12 @@ class Building : NamedStats(), IConstruction, ICivilopedia {
return stringBuilder.toString() return stringBuilder.toString()
} }
override fun getProductionCost(adoptedPolicies: Linq<String>): Int { override fun getProductionCost(adoptedPolicies: List<String>): Int {
return if (!isWonder && culture != 0f && adoptedPolicies.contains("Piety")) (cost * 0.85).toInt() return if (!isWonder && culture != 0f && adoptedPolicies.contains("Piety")) (cost * 0.85).toInt()
else cost else cost
} }
override fun getGoldCost(adoptedPolicies: Linq<String>): Int { override fun getGoldCost(adoptedPolicies: List<String>): Int {
var cost = Math.pow((30 * getProductionCost(adoptedPolicies)).toDouble(), 0.75) * (1 + hurryCostModifier / 100) var cost = Math.pow((30 * getProductionCost(adoptedPolicies)).toDouble(), 0.75) * (1 + hurryCostModifier / 100)
if (adoptedPolicies.contains("Mercantilism")) cost *= 0.75 if (adoptedPolicies.contains("Mercantilism")) cost *= 0.75
if (adoptedPolicies.contains("Patronage")) cost *= 0.5 if (adoptedPolicies.contains("Patronage")) cost *= 0.5
@ -145,16 +144,16 @@ class Building : NamedStats(), IConstruction, ICivilopedia {
if (cannotBeBuiltWith != null && construction.isBuilt(cannotBeBuiltWith!!)) return false if (cannotBeBuiltWith != null && construction.isBuilt(cannotBeBuiltWith!!)) return false
if ("MustBeNextToDesert" == unique && !civInfo.gameInfo.tileMap.getTilesInDistance(construction.cityInfo.cityLocation, 1).any { it.baseTerrain == "Desert" }) if ("MustBeNextToDesert" == unique && !civInfo.gameInfo.tileMap.getTilesInDistance(construction.cityInfo.cityLocation, 1).any { it.baseTerrain == "Desert" })
return false return false
if (requiredResource != null && !civInfo.getCivResources().containsKey(GameBasics.TileResources[requiredResource])) if (requiredResource != null && !civInfo.getCivResources().containsKey(GameBasics.TileResources[requiredResource!!]))
return false return false
if (requiredNearbyImprovedResources != null) { if (requiredNearbyImprovedResources != null) {
val containsResourceWithImprovement = construction.cityInfo.tilesInRange val containsResourceWithImprovement = construction.cityInfo.tilesInRange
.any { tile -> .any {
(tile.resource != null it.resource != null
&& requiredNearbyImprovedResources!!.contains(tile.resource) && requiredNearbyImprovedResources!!.contains(it.resource!!)
&& tile.tileResource.improvement == tile.improvement) && it.tileResource.improvement == it.improvement
} }
if (!containsResourceWithImprovement) return false if (!containsResourceWithImprovement) return false
} }
@ -178,8 +177,8 @@ class Building : NamedStats(), IConstruction, ICivilopedia {
} }
construction.builtBuildings.add(name) construction.builtBuildings.add(name)
if (providesFreeBuilding != null && !construction.builtBuildings.contains(providesFreeBuilding)) if (providesFreeBuilding != null && !construction.builtBuildings.contains(providesFreeBuilding!!))
construction.builtBuildings.add(providesFreeBuilding) construction.builtBuildings.add(providesFreeBuilding!!)
when (unique) { when (unique) {
"ApolloProgram" -> UnCivGame.Current.screen = ScienceVictoryScreen(civInfo) "ApolloProgram" -> UnCivGame.Current.screen = ScienceVictoryScreen(civInfo)
"EmpireEntersGoldenAge" -> civInfo.goldenAges.enterGoldenAge() "EmpireEntersGoldenAge" -> civInfo.goldenAges.enterGoldenAge()

View File

@ -1,16 +1,12 @@
package com.unciv.models.gamebasics package com.unciv.models.gamebasics
import com.unciv.models.linq.LinqHashMap
import java.util.LinkedHashMap
object GameBasics { object GameBasics {
@JvmField var Buildings: LinqHashMap<String, Building> = LinqHashMap() @JvmField var Buildings: HashMap<String, Building> = HashMap()
@JvmField var Terrains: LinqHashMap<String, Terrain> = LinqHashMap() @JvmField var Terrains: HashMap<String, Terrain> = HashMap()
@JvmField var TileResources: LinqHashMap<String, TileResource> = LinqHashMap() @JvmField var TileResources: HashMap<String, TileResource> = HashMap()
@JvmField var TileImprovements: LinqHashMap<String, TileImprovement> = LinqHashMap() @JvmField var TileImprovements: HashMap<String, TileImprovement> = HashMap()
@JvmField var Technologies: LinqHashMap<String, Technology> = LinqHashMap() @JvmField var Technologies: HashMap<String, Technology> = HashMap()
@JvmField var Helps: LinqHashMap<String, BasicHelp> = LinqHashMap() @JvmField var Helps: HashMap<String, BasicHelp> = HashMap()
@JvmField var Units: LinqHashMap<String, Unit> = LinqHashMap() @JvmField var Units: HashMap<String, Unit> = HashMap()
@JvmField var PolicyBranches: LinqHashMap<String, PolicyBranch> = LinqHashMap() @JvmField var PolicyBranches: HashMap<String, PolicyBranch> = HashMap()
} }

View File

@ -1,6 +1,5 @@
package com.unciv.models.gamebasics package com.unciv.models.gamebasics
import com.unciv.models.linq.Linq
import com.unciv.models.stats.INamed import com.unciv.models.stats.INamed
open class Policy : INamed { open class Policy : INamed {
@ -9,7 +8,7 @@ open class Policy : INamed {
@JvmField var branch: String? = null @JvmField var branch: String? = null
@JvmField var row: Int = 0 @JvmField var row: Int = 0
@JvmField var column: Int = 0 @JvmField var column: Int = 0
@JvmField var requires: Linq<String>? = null @JvmField var requires: ArrayList<String>? = null
} }

View File

@ -1,7 +1,5 @@
package com.unciv.models.gamebasics package com.unciv.models.gamebasics
import com.unciv.models.linq.Linq
class PolicyBranch : Policy() { class PolicyBranch : Policy() {
@JvmField var policies: Linq<Policy> = Linq() var policies: ArrayList<Policy> = arrayListOf()
} }

View File

@ -1,6 +1,5 @@
package com.unciv.models.gamebasics package com.unciv.models.gamebasics
import com.unciv.models.linq.Linq
import com.unciv.models.stats.NamedStats import com.unciv.models.stats.NamedStats
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
@ -17,7 +16,7 @@ class TileResource : NamedStats(), ICivilopedia {
} }
@JvmField var resourceType: ResourceType = ResourceType.Bonus @JvmField var resourceType: ResourceType = ResourceType.Bonus
@JvmField var terrainsCanBeFoundOn: Linq<String> = Linq() @JvmField var terrainsCanBeFoundOn: List<String> = listOf()
@JvmField var improvement: String? = null @JvmField var improvement: String? = null
@JvmField var improvementStats: Stats? = null @JvmField var improvementStats: Stats? = null
@ -27,8 +26,8 @@ class TileResource : NamedStats(), ICivilopedia {
@JvmField var building: String? = null @JvmField var building: String? = null
@JvmField var revealedBy: String? = null @JvmField var revealedBy: String? = null
fun GetBuilding(): Building? { fun getBuilding(): Building? {
return if (building == null) null else GameBasics.Buildings[building] return if (building == null) null else GameBasics.Buildings[building!!]
} }
} }

View File

@ -1,9 +1,8 @@
package com.unciv.models.gamebasics package com.unciv.models.gamebasics
import com.unciv.logic.city.IConstruction
import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.CityConstructions
import com.unciv.logic.city.IConstruction
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.models.linq.Linq
import com.unciv.models.stats.INamed import com.unciv.models.stats.INamed
class Unit : INamed, IConstruction { class Unit : INamed, IConstruction {
@ -27,11 +26,11 @@ class Unit : INamed, IConstruction {
} }
override fun getProductionCost(adoptedPolicies: Linq<String>): Int { override fun getProductionCost(adoptedPolicies: List<String>): Int {
return cost return cost
} }
override fun getGoldCost(adoptedPolicies: Linq<String>): Int { override fun getGoldCost(adoptedPolicies: List<String>): Int {
return (Math.pow((30 * cost).toDouble(), 0.75) * (1 + hurryCostModifier / 100) / 10).toInt() * 10 return (Math.pow((30 * cost).toDouble(), 0.75) * (1 + hurryCostModifier / 100) / 10).toInt() * 10
} }

View File

@ -2,7 +2,7 @@ package com.unciv.models.linq;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
public class LinqCounter<K> extends LinkedHashMap<K,Integer> { public class Counter<K> extends LinkedHashMap<K,Integer> {
public Integer get(Object key){ // don't return null if empty public Integer get(Object key){ // don't return null if empty
if(containsKey(key)) return super.get(key); if(containsKey(key)) return super.get(key);
@ -15,21 +15,21 @@ public class LinqCounter<K> extends LinkedHashMap<K,Integer> {
if(get(key)==0) remove(key); // No objects of this sort left, no need to count if(get(key)==0) remove(key); // No objects of this sort left, no need to count
} }
public void add(LinqCounter<K> other){ public void add(Counter<K> other){
for (K key : other.keySet()) { for (K key : other.keySet()) {
add(key,other.get(key)); add(key,other.get(key));
} }
} }
public void remove(LinqCounter<K> other){ public void remove(Counter<K> other){
for (K key : other.keySet()) { for (K key : other.keySet()) {
add(key,-other.get(key)); add(key,-other.get(key));
} }
} }
@Override @Override
public LinqCounter<K> clone() { public Counter<K> clone() {
LinqCounter<K> newCounter = new LinqCounter<K>(); Counter<K> newCounter = new Counter<K>();
newCounter.add(this); newCounter.add(this);
return newCounter; return newCounter;
} }

View File

@ -1,76 +0,0 @@
package com.unciv.models.linq;
import com.badlogic.gdx.utils.Predicate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
/**
* Created by LENOVO on 10/20/2017.
*/
public class Linq<T> extends ArrayList<T> {
public Linq() {
}
public Linq(Collection<? extends T> objects) {
addAll(objects);
}
public Linq(T ... objects) {
addAll(Arrays.asList(objects));
}
public Linq<T> where(Predicate<T> p) {
Linq<T> newCollection = new Linq<T>();
for (T t : this) if (p.evaluate(t)) newCollection.add(t);
return newCollection;
}
public T first(Predicate<T> p) {
for (T t : this) if (p.evaluate(t)) return t;
return null;
}
public boolean any(Predicate<T> p){ return first(p) != null;}
public <T2> Linq<T2> select(Func<T, T2> selector) {
Linq<T2> newCollection = new Linq<T2>();
for (T t : this) newCollection.add(selector.GetBy(t));
return newCollection;
}
public <T2> Linq<T2> selectMany(Func<T,Collection<? extends T2>> multiSelector){
Linq<T2> newCollection = new Linq<T2>();
for(T t:this) newCollection.addAll(multiSelector.GetBy(t));
return newCollection;
}
public T getRandom(){
if(size()==0) return null;
return get((int) (Math.random() * (size())));
}
public Linq<T> unique() {
return new Linq<T>(new HashSet<T>(this)); // Shove it all into a hashset and build a new one around the results.
}
public interface Func<T1, T2> {
T2 GetBy(T1 arg0);
}
public <T2> Linq<T2> as(Class<T2> t2Class){
Linq<T2> newCollection = new Linq<T2>();
for (T t:this) newCollection.add((T2)t);
return newCollection;
}
public Linq<T> clone(){
return new Linq<T>(this);
}
}

View File

@ -1,10 +0,0 @@
package com.unciv.models.linq;
import java.util.LinkedHashMap;
public class LinqHashMap <K,V> extends LinkedHashMap<K,V> {
public Linq<V> linqValues() {
return new Linq<V>(super.values());
}
}

View File

@ -1,6 +1,5 @@
package com.unciv.ui package com.unciv.ui
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.scenes.scene2d.ui.* import com.badlogic.gdx.scenes.scene2d.ui.*
import com.badlogic.gdx.scenes.scene2d.ui.List import com.badlogic.gdx.scenes.scene2d.ui.List
@ -13,7 +12,6 @@ import java.util.*
class CivilopediaScreen : CameraStageBaseScreen() { class CivilopediaScreen : CameraStageBaseScreen() {
init { init {
Gdx.input.inputProcessor = stage
val buttonTable = Table() val buttonTable = Table()
buttonTable.pad(15f) buttonTable.pad(15f)
val entryTable = Table() val entryTable = Table()
@ -35,11 +33,11 @@ class CivilopediaScreen : CameraStageBaseScreen() {
val map = LinkedHashMap<String, Collection<ICivilopedia>>() val map = LinkedHashMap<String, Collection<ICivilopedia>>()
map["Basics"] = GameBasics.Helps.linqValues().`as`(ICivilopedia::class.java) map["Basics"] = GameBasics.Helps.values
map["Buildings"] = GameBasics.Buildings.linqValues().`as`(ICivilopedia::class.java) map["Buildings"] = GameBasics.Buildings.values
map["Resources"] = GameBasics.TileResources.linqValues().`as`(ICivilopedia::class.java) map["Resources"] = GameBasics.TileResources.values
map["Terrains"] = GameBasics.Terrains.linqValues().`as`(ICivilopedia::class.java) map["Terrains"] = GameBasics.Terrains.values
map["Tile Improvements"] = GameBasics.TileImprovements.linqValues().`as`(ICivilopedia::class.java) map["Tile Improvements"] = GameBasics.TileImprovements.values
val nameList = List<ICivilopedia>(CameraStageBaseScreen.skin) val nameList = List<ICivilopedia>(CameraStageBaseScreen.skin)

View File

@ -4,8 +4,7 @@ import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.Touchable
import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.models.linq.Linq import com.unciv.models.linq.Counter
import com.unciv.models.linq.LinqCounter
import com.unciv.ui.pickerscreens.PickerScreen import com.unciv.ui.pickerscreens.PickerScreen
import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.CameraStageBaseScreen
@ -27,8 +26,8 @@ class ScienceVictoryScreen(internal val civInfo: CivilizationInfo) : PickerScree
else else
descriptionLabel.setText("Apollo program is built - you may construct spaceship parts in your cities!") descriptionLabel.setText("Apollo program is built - you may construct spaceship parts in your cities!")
val tutorial = Linq<String>() val tutorial = ArrayList<String>()
tutorial.add("This is the science victory screen, where you" + tutorial.add("This is the science victory screen, filter you" +
"\r\n can see your progress towards constructing a " + "\r\n can see your progress towards constructing a " +
"\r\n spaceship to propel you towards the stars.") "\r\n spaceship to propel you towards the stars.")
tutorial.add("There are 6 spaceship parts you must build, " + "\r\n and they all require advanced technologies") tutorial.add("There are 6 spaceship parts you must build, " + "\r\n and they all require advanced technologies")
@ -37,7 +36,7 @@ class ScienceVictoryScreen(internal val civInfo: CivilizationInfo) : PickerScree
displayTutorials("ScienceVictoryScreenEntered", tutorial) displayTutorials("ScienceVictoryScreenEntered", tutorial)
} }
private fun addPartButton(partName: String, parts: LinqCounter<String>) { private fun addPartButton(partName: String, parts: Counter<String>) {
topTable.row() topTable.row()
val button = TextButton(partName, CameraStageBaseScreen.skin) val button = TextButton(partName, CameraStageBaseScreen.skin)
button.touchable = Touchable.disabled button.touchable = Touchable.disabled

View File

@ -9,14 +9,9 @@ import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.TileMap import com.unciv.logic.map.TileMap
import com.unciv.models.gamebasics.* import com.unciv.models.gamebasics.*
import com.unciv.models.gamebasics.Unit import com.unciv.models.gamebasics.Unit
import com.unciv.models.linq.Linq
import com.unciv.models.linq.LinqHashMap
import com.unciv.models.stats.INamed import com.unciv.models.stats.INamed
import com.unciv.ui.utils.GameSaver import com.unciv.ui.utils.GameSaver
import com.unciv.ui.worldscreen.WorldScreen import com.unciv.ui.worldscreen.WorldScreen
import kotlin.Array
import kotlin.Exception
import kotlin.String
class UnCivGame : Game() { class UnCivGame : Game() {
var gameInfo: GameInfo = GameInfo() var gameInfo: GameInfo = GameInfo()
@ -61,8 +56,8 @@ class UnCivGame : Game() {
return Json().fromJson(tClass, jsonText) return Json().fromJson(tClass, jsonText)
} }
private fun <T : INamed> createHashmap(items: Array<T>): LinqHashMap<String, T> { private fun <T : INamed> createHashmap(items: Array<T>): HashMap<String, T> {
val hashMap = LinqHashMap<String, T>() val hashMap = HashMap<String, T>()
for (item in items) for (item in items)
hashMap[item.name] = item hashMap[item.name] = item
return hashMap return hashMap
@ -78,7 +73,7 @@ class UnCivGame : Game() {
GameBasics.PolicyBranches = createHashmap(getFromJson(Array<PolicyBranch>::class.java, "Policies")) GameBasics.PolicyBranches = createHashmap(getFromJson(Array<PolicyBranch>::class.java, "Policies"))
val techColumns = getFromJson(Array<TechColumn>::class.java, "Techs") val techColumns = getFromJson(Array<TechColumn>::class.java, "Techs")
GameBasics.Technologies = LinqHashMap() GameBasics.Technologies = HashMap()
for (techColumn in techColumns) { for (techColumn in techColumns) {
for (tech in techColumn.techs) { for (tech in techColumn.techs) {
tech.cost = techColumn.techCost tech.cost = techColumn.techCost
@ -94,12 +89,12 @@ class UnCivGame : Game() {
} }
for (branch in GameBasics.PolicyBranches.values) { for (branch in GameBasics.PolicyBranches.values) {
branch.requires = Linq() branch.requires = ArrayList()
branch.branch = branch.name branch.branch = branch.name
for (policy in branch.policies) { for (policy in branch.policies) {
policy.branch = branch.name policy.branch = branch.name
if (policy.requires == null) { if (policy.requires == null) {
policy.requires = Linq() policy.requires = ArrayList()
policy.requires!!.add(branch.name) policy.requires!!.add(branch.name)
} }
} }

View File

@ -8,7 +8,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener import com.badlogic.gdx.scenes.scene2d.utils.ClickListener
import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.Building
import com.unciv.models.linq.Linq
import com.unciv.models.stats.Stat import com.unciv.models.stats.Stat
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.CameraStageBaseScreen
@ -21,9 +20,9 @@ class BuildingsTable(private val cityScreen: CityScreen) : Table() {
clear() clear()
val skin = CameraStageBaseScreen.skin val skin = CameraStageBaseScreen.skin
val cityInfo = cityScreen.city val cityInfo = cityScreen.city
val wonders = Linq<Building>() val wonders = mutableListOf<Building>()
val specialistBuildings = Linq<Building>() val specialistBuildings = mutableListOf<Building>()
val others = Linq<Building>() val others = mutableListOf<Building>()
for (building in cityInfo.cityConstructions.getBuiltBuildings()) { for (building in cityInfo.cityConstructions.getBuiltBuildings()) {
when { when {

View File

@ -10,7 +10,6 @@ import com.badlogic.gdx.utils.Align
import com.unciv.logic.city.CityInfo import com.unciv.logic.city.CityInfo
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.Building
import com.unciv.models.linq.Linq
import com.unciv.ui.tilegroups.TileGroup import com.unciv.ui.tilegroups.TileGroup
import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.CameraStageBaseScreen
import com.unciv.ui.utils.HexMath import com.unciv.ui.utils.HexMath
@ -59,7 +58,7 @@ class CityScreen(internal val city: CityInfo) : CameraStageBaseScreen() {
stage.addActor(buildingsTableContainer) stage.addActor(buildingsTableContainer)
update() update()
val tutorial = Linq<String>() val tutorial = mutableListOf<String>()
tutorial.add("Welcome to your first city!" + tutorial.add("Welcome to your first city!" +
"\r\nAs on now, you only have 1 population," + "\r\nAs on now, you only have 1 population," +
"\r\n but this will grow when you amass enough surplus food") "\r\n but this will grow when you amass enough surplus food")

View File

@ -13,7 +13,7 @@ class GreatPersonPickerScreen : PickerScreen() {
init { init {
rightSideButton.setText("Choose a free great person") rightSideButton.setText("Choose a free great person")
for (unit in GameBasics.Units.linqValues()) { for (unit in GameBasics.Units.values) {
if (!unit.name.startsWith("Great")) continue if (!unit.name.startsWith("Great")) continue
val button = TextButton(unit.name, CameraStageBaseScreen.skin) val button = TextButton(unit.name, CameraStageBaseScreen.skin)
button.addClickListener { button.addClickListener {

View File

@ -9,7 +9,6 @@ import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.Policy import com.unciv.models.gamebasics.Policy
import com.unciv.models.gamebasics.StringUtils import com.unciv.models.gamebasics.StringUtils
import com.unciv.models.linq.Linq
import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.cityscreen.addClickListener
import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.CameraStageBaseScreen
import com.unciv.ui.utils.ImageGetter import com.unciv.ui.utils.ImageGetter
@ -21,7 +20,7 @@ class PolicyPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen(
init { init {
val policies = civInfo.policies val policies = civInfo.policies
val tutorial = Linq<String>() val tutorial = mutableListOf<String>()
tutorial.add("Each turn, the culture you gain from all your " + tutorial.add("Each turn, the culture you gain from all your " +
"\r\n cities is added to your Civilization's culture." + "\r\n cities is added to your Civilization's culture." +
"\r\nWhen you have enough culture, you may pick a " + "\r\nWhen you have enough culture, you may pick a " +
@ -98,7 +97,7 @@ class PolicyPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen(
} }
pickedPolicy = policy pickedPolicy = policy
var policyText = policy.name + "\r\n" + policy.description + "\r\n" var policyText = policy.name + "\r\n" + policy.description + "\r\n"
if (!policy.name.endsWith("Complete") && policy.requires!!.size > 0) if (!policy.name.endsWith("Complete") && policy.requires!!.isNotEmpty())
policyText += "Requires " + StringUtils.join(", ", policy.requires) policyText += "Requires " + StringUtils.join(", ", policy.requires)
descriptionLabel.setText(policyText) descriptionLabel.setText(policyText)
} }

View File

@ -7,7 +7,6 @@ import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.TechManager import com.unciv.logic.civilization.TechManager
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.Technology import com.unciv.models.gamebasics.Technology
import com.unciv.models.linq.Linq
import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.cityscreen.addClickListener
import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.CameraStageBaseScreen
import java.util.* import java.util.*
@ -30,7 +29,7 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen()
val techMatrix = Array<Array<Technology?>>(17) { arrayOfNulls(10) } // Divided into columns, then rows val techMatrix = Array<Array<Technology?>>(17) { arrayOfNulls(10) } // Divided into columns, then rows
for (technology in GameBasics.Technologies.linqValues()) { for (technology in GameBasics.Technologies.values) {
techMatrix[technology.column!!.columnNumber - 1][technology.row - 1] = technology techMatrix[technology.column!!.columnNumber - 1][technology.row - 1] = technology
} }
@ -69,7 +68,7 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen()
dispose() dispose()
} }
val tutorial = Linq<String>() val tutorial = mutableListOf<String>()
tutorial.add("Technology is central to your civilization," + tutorial.add("Technology is central to your civilization," +
"\r\n as technological progress brings with it" + "\r\n as technological progress brings with it" +
"\r\n more construction options, improvements, and abilities") "\r\n more construction options, improvements, and abilities")
@ -133,15 +132,15 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen()
techsToResearch.add(tech.name) techsToResearch.add(tech.name)
} else { } else {
val prerequisites = Stack<String>() val prerequisites = Stack<String>()
val CheckPrerequisites = ArrayDeque<String>() val checkPrerequisites = ArrayDeque<String>()
CheckPrerequisites.add(tech.name) checkPrerequisites.add(tech.name)
while (!CheckPrerequisites.isEmpty()) { while (!checkPrerequisites.isEmpty()) {
val techNameToCheck = CheckPrerequisites.pop() val techNameToCheck = checkPrerequisites.pop()
if (civTech.isResearched(techNameToCheck) || prerequisites.contains(techNameToCheck)) if (civTech.isResearched(techNameToCheck) || prerequisites.contains(techNameToCheck))
continue //no need to add or check prerequisites continue //no need to add or check prerequisites
val techToCheck = GameBasics.Technologies[techNameToCheck] val techToCheck = GameBasics.Technologies[techNameToCheck]
for (str in techToCheck!!.prerequisites) for (str in techToCheck!!.prerequisites)
if (!CheckPrerequisites.contains(str)) CheckPrerequisites.add(str) if (!checkPrerequisites.contains(str)) checkPrerequisites.add(str)
prerequisites.add(techNameToCheck) prerequisites.add(techNameToCheck)
} }
techsToResearch.clear() techsToResearch.clear()

View File

@ -7,7 +7,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.Image
import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.unciv.logic.map.RoadStatus import com.unciv.logic.map.RoadStatus
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.models.linq.LinqHashMap
import com.unciv.ui.utils.HexMath import com.unciv.ui.utils.HexMath
import com.unciv.ui.utils.ImageGetter import com.unciv.ui.utils.ImageGetter
@ -19,7 +18,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
protected var improvementImage: Image? =null protected var improvementImage: Image? =null
private var improvementType: String? = null private var improvementType: String? = null
var populationImage: Image? = null var populationImage: Image? = null
private var roadImages = LinqHashMap<String, Image>() private var roadImages = HashMap<String, Image>()
protected var hexagon: Image? = null protected var hexagon: Image? = null
protected var cityButton: Container<TextButton>? = null protected var cityButton: Container<TextButton>? = null
@ -121,7 +120,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() {
// This is some crazy voodoo magic so I'll explain. // This is some crazy voodoo magic so I'll explain.
image.moveBy(25f, 25f) // Move road to center of tile image.moveBy(25f, 25f) // Move road to center of tile
// in addTiles, we set the position of groups by relative world position *0.8*groupSize, where groupSize = 50 // in addTiles, we set the position of groups by relative world position *0.8*groupSize, filter groupSize = 50
// Here, we want to have the roads start HALFWAY THERE and extend towards the tiles, so we give them a position of 0.8*25. // Here, we want to have the roads start HALFWAY THERE and extend towards the tiles, so we give them a position of 0.8*25.
image.moveBy(-relativeWorldPosition.x * 0.8f * 25f, -relativeWorldPosition.y * 0.8f * 25f) image.moveBy(-relativeWorldPosition.x * 0.8f * 25f, -relativeWorldPosition.y * 0.8f * 25f)
image.setSize(10f, 2f) image.setSize(10f, 2f)

View File

@ -13,21 +13,19 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.badlogic.gdx.utils.Align import com.badlogic.gdx.utils.Align
import com.badlogic.gdx.utils.viewport.ExtendViewport import com.badlogic.gdx.utils.viewport.ExtendViewport
import com.unciv.models.linq.Linq
import com.unciv.ui.UnCivGame import com.unciv.ui.UnCivGame
import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.cityscreen.addClickListener
open class CameraStageBaseScreen : Screen { open class CameraStageBaseScreen : Screen {
var game: UnCivGame var game: UnCivGame = UnCivGame.Current
var stage: Stage var stage: Stage
private val tutorialTexts = Linq<String>() private val tutorialTexts = mutableListOf<String>()
internal var isTutorialShowing = false private var isTutorialShowing = false
init { init {
this.game = UnCivGame.Current
stage = Stage(ExtendViewport(1000f, 600f stage = Stage(ExtendViewport(1000f, 600f
), batch)// FitViewport(1000,600) ), batch)// FitViewport(1000,600)
Gdx.input.inputProcessor = stage Gdx.input.inputProcessor = stage
@ -56,14 +54,14 @@ open class CameraStageBaseScreen : Screen {
override fun dispose() {} override fun dispose() {}
fun displayTutorials(name: String, texts: Linq<String>) { fun displayTutorials(name: String, texts: List<String>) {
if (game.gameInfo.tutorial.contains(name)) return if (game.gameInfo.tutorial.contains(name)) return
game.gameInfo.tutorial.add(name) game.gameInfo.tutorial.add(name)
tutorialTexts.addAll(texts) tutorialTexts.addAll(texts)
if (!isTutorialShowing) displayTutorial() if (!isTutorialShowing) displayTutorial()
} }
fun displayTutorial() { private fun displayTutorial() {
isTutorialShowing = true isTutorialShowing = true
val tutorialTable = Table().pad(10f) val tutorialTable = Table().pad(10f)
tutorialTable.background(ImageGetter.getDrawable("skin/tileTableBackground.png") tutorialTable.background(ImageGetter.getDrawable("skin/tileTableBackground.png")

View File

@ -1,9 +1,7 @@
package com.unciv.ui.utils package com.unciv.ui.utils
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.unciv.models.linq.Linq import java.util.*
import java.util.ArrayList
object HexMath { object HexMath {
@ -41,8 +39,8 @@ object HexMath {
return vectors return vectors
} }
fun GetVectorsAtDistance(origin: Vector2, distance: Int): Linq<Vector2> { fun GetVectorsAtDistance(origin: Vector2, distance: Int): List<Vector2> {
val vectors = Linq<Vector2>() val vectors = mutableListOf<Vector2>()
if (distance == 0) { if (distance == 0) {
vectors.add(origin.cpy()) vectors.add(origin.cpy())
return vectors return vectors
@ -66,8 +64,8 @@ object HexMath {
return vectors return vectors
} }
fun GetVectorsInDistance(origin: Vector2, distance: Int): Linq<Vector2> { fun GetVectorsInDistance(origin: Vector2, distance: Int): List<Vector2> {
val hexesToReturn = Linq<Vector2>() val hexesToReturn = mutableListOf<Vector2>()
for (i in 0 until distance + 1) { for (i in 0 until distance + 1) {
hexesToReturn.addAll(GetVectorsAtDistance(origin, i)) hexesToReturn.addAll(GetVectorsAtDistance(origin, i))
} }

View File

@ -5,12 +5,11 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.unciv.logic.civilization.Notification import com.unciv.logic.civilization.Notification
import com.unciv.models.linq.Linq
import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.cityscreen.addClickListener
import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.CameraStageBaseScreen
import com.unciv.ui.utils.ImageGetter import com.unciv.ui.utils.ImageGetter
class NotificationsScroll(private val notifications: Linq<Notification>, internal val worldScreen: WorldScreen) : ScrollPane(null) { class NotificationsScroll(private val notifications: List<Notification>, internal val worldScreen: WorldScreen) : ScrollPane(null) {
private var notificationsTable = Table() private var notificationsTable = Table()
init { init {

View File

@ -8,8 +8,6 @@ import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.logic.map.TileMap import com.unciv.logic.map.TileMap
import com.unciv.models.linq.Linq
import com.unciv.models.linq.LinqHashMap
import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.cityscreen.addClickListener
import com.unciv.ui.tilegroups.WorldTileGroup import com.unciv.ui.tilegroups.WorldTileGroup
import com.unciv.ui.utils.HexMath import com.unciv.ui.utils.HexMath
@ -17,7 +15,7 @@ import com.unciv.ui.utils.HexMath
class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: TileMap, internal val civInfo: CivilizationInfo) : ScrollPane(null) { class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: TileMap, internal val civInfo: CivilizationInfo) : ScrollPane(null) {
internal var selectedTile: TileInfo? = null internal var selectedTile: TileInfo? = null
//internal var unitTile: TileInfo? = null //internal var unitTile: TileInfo? = null
val tileGroups = LinqHashMap<String, WorldTileGroup>() val tileGroups = HashMap<String, WorldTileGroup>()
internal fun addTiles() { internal fun addTiles() {
val allTiles = Group() val allTiles = Group()
@ -31,7 +29,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
val group = WorldTileGroup(tileInfo) val group = WorldTileGroup(tileInfo)
group.addClickListener { group.addClickListener {
val tutorial = Linq<String>() val tutorial = mutableListOf<String>()
tutorial.add("Clicking on a tile selects that tile," + tutorial.add("Clicking on a tile selects that tile," +
"\r\n and displays information on that tile on the bottom-right," + "\r\n and displays information on that tile on the bottom-right," +
"\r\n as well as unit actions, if the tile contains a unit") "\r\n as well as unit actions, if the tile contains a unit")
@ -56,7 +54,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
bottomY = Math.min(bottomY, group.y) bottomY = Math.min(bottomY, group.y)
} }
for (group in tileGroups.linqValues()) { for (group in tileGroups.values) {
group.moveBy(-bottomX + 50, -bottomY + 50) group.moveBy(-bottomX + 50, -bottomY + 50)
} }
@ -87,16 +85,16 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
} }
internal fun updateTiles() { internal fun updateTiles() {
for (WG in tileGroups.linqValues()) WG.update(worldScreen) for (WG in tileGroups.values) WG.update(worldScreen)
for (WG in tileGroups.linqValues()) WG.setIsViewable(false) for (WG in tileGroups.values) WG.setIsViewable(false)
var viewablePositions = emptyList<Vector2>() var viewablePositions = emptyList<Vector2>()
if(worldScreen.unitTable.currentlyExecutingAction == null) { if(worldScreen.unitTable.currentlyExecutingAction == null) {
viewablePositions += tileMap.values.where { it.owner == civInfo.civName } viewablePositions += tileMap.values.filter { it.owner == civInfo.civName }
.flatMap { HexMath.GetAdjacentVectors(it.position) } // tiles adjacent to city tiles .flatMap { HexMath.GetAdjacentVectors(it.position) } // tiles adjacent to city tiles
viewablePositions += tileMap.values.where { it.unit != null } viewablePositions += tileMap.values.filter { it.unit != null }
.flatMap { tileMap.getViewableTiles(it.position, 2).select { it.position } } // Tiles within 2 tiles of units .flatMap { tileMap.getViewableTiles(it.position, 2).map { it.position } } // Tiles within 2 tiles of units
} }
else else
@ -108,13 +106,13 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap:
} }
fun setCenterPosition(vector: Vector2) { fun setCenterPosition(vector: Vector2) {
val tileGroup = tileGroups.linqValues().first { it.tileInfo.position == vector } val tileGroup = tileGroups.values.first { it.tileInfo.position == vector }
selectedTile = tileGroup.tileInfo selectedTile = tileGroup.tileInfo
if(selectedTile!!.unit!=null) worldScreen.unitTable.selectedUnitTile = selectedTile if(selectedTile!!.unit!=null) worldScreen.unitTable.selectedUnitTile = selectedTile
layout() // Fit the scroll pane to the contents - otherwise, setScroll won't work! layout() // Fit the scroll pane to the contents - otherwise, setScroll won't work!
// We want to center on the middle of TG (TG.getX()+TG.getWidth()/2) // We want to center on the middle of TG (TG.getX()+TG.getWidth()/2)
// and so the scroll position (== where the screen starts) needs to be half a screen away // and so the scroll position (== filter the screen starts) needs to be half a screen away
scrollX = tileGroup!!.x + tileGroup.width / 2 - worldScreen.stage.width / 2 scrollX = tileGroup.x + tileGroup.width / 2 - worldScreen.stage.width / 2
// Here it's the same, only the Y axis is inverted - when at 0 we're at the top, not bottom - so we invert it back. // Here it's the same, only the Y axis is inverted - when at 0 we're at the top, not bottom - so we invert it back.
scrollY = maxY - (tileGroup.y + tileGroup.width / 2 - worldScreen.stage.height / 2) scrollY = maxY - (tileGroup.y + tileGroup.width / 2 - worldScreen.stage.height / 2)
updateVisualScroll() updateVisualScroll()

View File

@ -4,7 +4,6 @@ import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.models.linq.Linq
import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.cityscreen.addClickListener
import com.unciv.ui.pickerscreens.PolicyPickerScreen import com.unciv.ui.pickerscreens.PolicyPickerScreen
import com.unciv.ui.pickerscreens.TechPickerScreen import com.unciv.ui.pickerscreens.TechPickerScreen
@ -49,7 +48,7 @@ class WorldScreen : CameraStageBaseScreen() {
createNextTurnButton() // needs civ table to be positioned createNextTurnButton() // needs civ table to be positioned
stage.addActor(optionsTable) stage.addActor(optionsTable)
val beginningTutorial = Linq<String>() val beginningTutorial = mutableListOf<String>()
beginningTutorial.add("Hello, and welcome to Unciv!" + beginningTutorial.add("Hello, and welcome to Unciv!" +
"\r\nCivilization games can be complex, so we'll" + "\r\nCivilization games can be complex, so we'll" +
"\r\n be guiding you along your first journey." + "\r\n be guiding you along your first journey." +
@ -68,7 +67,7 @@ class WorldScreen : CameraStageBaseScreen() {
fun update() { fun update() {
if (game.gameInfo.tutorial.contains("CityEntered")) { if (game.gameInfo.tutorial.contains("CityEntered")) {
val tutorial = Linq<String>() val tutorial = ArrayList<String>()
tutorial.add("Once you've done everything you can, " + "\r\nclick the next turn button on the top right to continue.") tutorial.add("Once you've done everything you can, " + "\r\nclick the next turn button on the top right to continue.")
tutorial.add("Each turn, science, culture and gold are added" + tutorial.add("Each turn, science, culture and gold are added" +
"\r\n to your civilization, your cities' construction" + "\r\n to your civilization, your cities' construction" +
@ -91,7 +90,7 @@ class WorldScreen : CameraStageBaseScreen() {
} }
private fun updateTechButton() { private fun updateTechButton() {
techButton.isVisible = civInfo.cities.size != 0 techButton.isVisible = civInfo.cities.isNotEmpty()
techButton.clearListeners() techButton.clearListeners()
techButton.addClickListener { techButton.addClickListener {
game.screen = TechPickerScreen(civInfo) game.screen = TechPickerScreen(civInfo)
@ -110,7 +109,7 @@ class WorldScreen : CameraStageBaseScreen() {
private fun createNextTurnButton() { private fun createNextTurnButton() {
val nextTurnButton = TextButton("Next turn", CameraStageBaseScreen.skin) val nextTurnButton = TextButton("Next turn", CameraStageBaseScreen.skin)
nextTurnButton.addClickListener { nextTurnButton.addClickListener {
if (civInfo.tech.currentTechnology() == null && civInfo.cities.size != 0) { if (civInfo.tech.currentTechnology() == null && civInfo.cities.isNotEmpty()) {
game.screen = TechPickerScreen(civInfo) game.screen = TechPickerScreen(civInfo)
return@addClickListener return@addClickListener
} }
@ -120,7 +119,7 @@ class WorldScreen : CameraStageBaseScreen() {
GameSaver.SaveGame(game, "Autosave") GameSaver.SaveGame(game, "Autosave")
update() update()
val tutorial = Linq<String>() val tutorial = ArrayList<String>()
tutorial.add("In your first couple of turns," + tutorial.add("In your first couple of turns," +
"\r\n you will have very little options," + "\r\n you will have very little options," +
"\r\n but as your civilization grows, so do the " + "\r\n but as your civilization grows, so do the " +

View File

@ -20,12 +20,12 @@ class WorldScreenOptionsTable internal constructor(worldScreen: WorldScreen, pri
isVisible = false isVisible = false
val OpenCivilopediaButton = TextButton("Civilopedia", CameraStageBaseScreen.skin) val openCivilopediaButton = TextButton("Civilopedia", CameraStageBaseScreen.skin)
OpenCivilopediaButton.addClickListener { openCivilopediaButton.addClickListener {
worldScreen.game.screen = CivilopediaScreen() worldScreen.game.screen = CivilopediaScreen()
isVisible = false isVisible = false
} }
add(OpenCivilopediaButton).pad(10f) add(openCivilopediaButton).pad(10f)
row() row()
val StartNewGameButton = TextButton("Start new game", CameraStageBaseScreen.skin) val StartNewGameButton = TextButton("Start new game", CameraStageBaseScreen.skin)

View File

@ -11,7 +11,7 @@ import com.unciv.ui.worldscreen.WorldScreen
class IdleUnitButton internal constructor(internal val worldScreen: WorldScreen) : TextButton("Select next idle unit", CameraStageBaseScreen.skin) { class IdleUnitButton internal constructor(internal val worldScreen: WorldScreen) : TextButton("Select next idle unit", CameraStageBaseScreen.skin) {
init { init {
addClickListener { addClickListener {
val tilesWithIdleUnits = worldScreen.civInfo.gameInfo.tileMap.values.where { it.hasIdleUnit() } val tilesWithIdleUnits = worldScreen.civInfo.gameInfo.tileMap.values.filter { it.hasIdleUnit() }
val tileToSelect: TileInfo val tileToSelect: TileInfo
if (!tilesWithIdleUnits.contains(worldScreen.tileMapHolder.selectedTile)) if (!tilesWithIdleUnits.contains(worldScreen.tileMapHolder.selectedTile))

View File

@ -7,7 +7,6 @@ import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.Building
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.linq.Linq
import com.unciv.ui.UnCivGame import com.unciv.ui.UnCivGame
import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.cityscreen.addClickListener
import com.unciv.ui.pickerscreens.ImprovementPickerScreen import com.unciv.ui.pickerscreens.ImprovementPickerScreen
@ -37,7 +36,7 @@ class UnitActions {
actionList += getUnitActionButton(unit, "Move unit", true, { actionList += getUnitActionButton(unit, "Move unit", true, {
unitTable.currentlyExecutingAction = "moveTo" unitTable.currentlyExecutingAction = "moveTo"
// Set all tiles transparent except those in unit range // Set all tiles transparent except those in unit range
for (TG in tileMapHolder.tileGroups.linqValues()) TG.setColor(0f, 0f, 0f, 0.3f) for (TG in tileMapHolder.tileGroups.values) TG.setColor(0f, 0f, 0f, 0.3f)
val distanceToTiles = tileMapHolder.tileMap.getDistanceToTilesWithinTurn( val distanceToTiles = tileMapHolder.tileMap.getDistanceToTilesWithinTurn(
unitTable.selectedUnitTile!!.position, unitTable.selectedUnitTile!!.position,
@ -61,7 +60,7 @@ class UnitActions {
actionList += getUnitActionButton(unit, "Found City", actionList += getUnitActionButton(unit, "Found City",
!tileMapHolder.tileMap.getTilesInDistance(tile.position, 2).any { it.isCityCenter }, !tileMapHolder.tileMap.getTilesInDistance(tile.position, 2).any { it.isCityCenter },
{ {
val tutorial = Linq<String>() val tutorial = mutableListOf<String>()
tutorial.add("You have founded a city!" + tutorial.add("You have founded a city!" +
"\r\nCities are the lifeblood of your empire," + "\r\nCities are the lifeblood of your empire," +
"\r\n providing gold and science empire-wide," + "\r\n providing gold and science empire-wide," +
@ -87,7 +86,7 @@ class UnitActions {
if (tile.improvementInProgress == null) "Construct\r\nimprovement" if (tile.improvementInProgress == null) "Construct\r\nimprovement"
else tile.improvementInProgress!! + "\r\nin progress" else tile.improvementInProgress!! + "\r\nin progress"
actionList += getUnitActionButton(unit, improvementButtonText, actionList += getUnitActionButton(unit, improvementButtonText,
!tile.isCityCenter || GameBasics.TileImprovements.linqValues().any { tile.canBuildImprovement(it, unit.civInfo) }, !tile.isCityCenter || GameBasics.TileImprovements.values.any { tile.canBuildImprovement(it, unit.civInfo) },
{ worldScreen.game.screen = ImprovementPickerScreen(tile) }) { worldScreen.game.screen = ImprovementPickerScreen(tile) })
if("automation" == tile.unit!!.action){ if("automation" == tile.unit!!.action){

View File

@ -6,7 +6,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.models.linq.LinqHashMap
import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.CameraStageBaseScreen
import com.unciv.ui.utils.ImageGetter import com.unciv.ui.utils.ImageGetter
import com.unciv.ui.worldscreen.WorldScreen import com.unciv.ui.worldscreen.WorldScreen
@ -37,7 +36,6 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){
fun update() { fun update() {
idleUnitButton.update() idleUnitButton.update()
unitActionsTable.clear() unitActionsTable.clear()
if(selectedUnitTile!=null && selectedUnitTile!!.unit==null) selectedUnitTile=null // The unit that was there no longer exists if(selectedUnitTile!=null && selectedUnitTile!!.unit==null) selectedUnitTile=null // The unit that was there no longer exists
@ -47,6 +45,8 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){
unitActionsTable.add(button).colspan(2).pad(5f) unitActionsTable.add(button).colspan(2).pad(5f)
.size(button.width * worldScreen.buttonScale, button.height * worldScreen.buttonScale).row() .size(button.width * worldScreen.buttonScale, button.height * worldScreen.buttonScale).row()
} }
else unitLabel.setText("")
unitActionsTable.pack() unitActionsTable.pack()
pack() pack()
@ -65,7 +65,7 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){
if(selectedTile.unit!=null) selectedUnitTile = selectedTile if(selectedTile.unit!=null) selectedUnitTile = selectedTile
} }
private fun getDistanceToTiles(): LinqHashMap<TileInfo, Float> { private fun getDistanceToTiles(): HashMap<TileInfo, Float> {
return worldScreen.tileMapHolder.tileMap.getDistanceToTilesWithinTurn(selectedUnitTile!!.position, return worldScreen.tileMapHolder.tileMap.getDistanceToTilesWithinTurn(selectedUnitTile!!.position,
getSelectedUnit().currentMovement, getSelectedUnit().currentMovement,
getSelectedUnit().civInfo.tech.isResearched("Machinery")) getSelectedUnit().civInfo.tech.isResearched("Machinery"))