From 7f8e1707be175f57640f8ad543b8705764443dd6 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Wed, 7 Mar 2018 21:51:33 +0200 Subject: [PATCH] Entiirely removed Linq - now only using Kotlin extensions! --- core/src/com/unciv/logic/GameInfo.kt | 14 ++-- .../com/unciv/logic/city/CityConstructions.kt | 18 ++--- .../unciv/logic/city/CityExpansionManager.kt | 2 +- core/src/com/unciv/logic/city/CityInfo.kt | 17 ++--- core/src/com/unciv/logic/city/CityStats.kt | 52 ++++++------- .../src/com/unciv/logic/city/IConstruction.kt | 5 +- .../com/unciv/logic/city/PopulationManager.kt | 5 +- .../logic/civilization/CivilizationInfo.kt | 27 ++++--- .../unciv/logic/civilization/PolicyManager.kt | 5 +- .../civilization/ScienceVictoryManager.kt | 8 +- .../unciv/logic/civilization/TechManager.kt | 13 ++-- core/src/com/unciv/logic/map/MapUnit.kt | 25 ++---- .../com/unciv/logic/map/RandomMapGenerator.kt | 37 +++++---- core/src/com/unciv/logic/map/TileInfo.kt | 15 ++-- core/src/com/unciv/logic/map/TileMap.kt | 38 +++++----- .../com/unciv/models/gamebasics/Building.kt | 37 +++++---- .../com/unciv/models/gamebasics/GameBasics.kt | 20 ++--- .../src/com/unciv/models/gamebasics/Policy.kt | 3 +- .../unciv/models/gamebasics/PolicyBranch.kt | 4 +- .../unciv/models/gamebasics/TileResource.kt | 7 +- core/src/com/unciv/models/gamebasics/Unit.kt | 7 +- .../linq/{LinqCounter.java => Counter.java} | 10 +-- core/src/com/unciv/models/linq/Linq.java | 76 ------------------- .../com/unciv/models/linq/LinqHashMap.java | 10 --- core/src/com/unciv/ui/CivilopediaScreen.kt | 12 ++- core/src/com/unciv/ui/ScienceVictoryScreen.kt | 9 +-- core/src/com/unciv/ui/UnCivGame.kt | 15 ++-- .../com/unciv/ui/cityscreen/BuildingsTable.kt | 7 +- .../src/com/unciv/ui/cityscreen/CityScreen.kt | 3 +- .../pickerscreens/GreatPersonPickerScreen.kt | 2 +- .../ui/pickerscreens/PolicyPickerScreen.kt | 5 +- .../ui/pickerscreens/TechPickerScreen.kt | 15 ++-- core/src/com/unciv/ui/tilegroups/TileGroup.kt | 5 +- .../unciv/ui/utils/CameraStageBaseScreen.kt | 12 ++- core/src/com/unciv/ui/utils/HexMath.kt | 12 ++- .../ui/worldscreen/NotificationsScroll.kt | 3 +- .../com/unciv/ui/worldscreen/TileMapHolder.kt | 24 +++--- .../com/unciv/ui/worldscreen/WorldScreen.kt | 11 ++- .../ui/worldscreen/WorldScreenOptionsTable.kt | 6 +- .../ui/worldscreen/unit/IdleUnitButton.kt | 2 +- .../unciv/ui/worldscreen/unit/UnitActions.kt | 7 +- .../unciv/ui/worldscreen/unit/UnitTable.kt | 6 +- 42 files changed, 233 insertions(+), 378 deletions(-) rename core/src/com/unciv/models/linq/{LinqCounter.java => Counter.java} (73%) delete mode 100644 core/src/com/unciv/models/linq/Linq.java delete mode 100644 core/src/com/unciv/models/linq/LinqHashMap.java diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 2391d4af3b..95a0d95f34 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -4,14 +4,13 @@ import com.badlogic.gdx.math.Vector2 import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.Notification import com.unciv.logic.map.TileMap -import com.unciv.models.linq.Linq class GameInfo { - var notifications = Linq() + var notifications = mutableListOf() - var tutorial = Linq() - var civilizations = Linq() + var tutorial = mutableListOf() + var civilizations = mutableListOf() var tileMap: TileMap = TileMap() var turns = 1 @@ -26,15 +25,18 @@ class GameInfo { 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() // 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 - for (civInfo in civilizations) + for (civInfo in civilizations){ for (city in civInfo.cities) city.cityStats.update() + civInfo.happiness = civInfo.getHappinessForNextTurn() + } + turns++ } diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index 1054474026..c769557560 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -1,26 +1,24 @@ package com.unciv.logic.city -import com.unciv.models.linq.Linq import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.GameBasics import com.unciv.models.stats.Stats - -import java.util.HashMap +import java.util.* class CityConstructions { @Transient lateinit var cityInfo: CityInfo - var builtBuildings = Linq() + var builtBuildings = ArrayList() private val inProgressConstructions = HashMap() var currentConstruction: String = "Monument" // default starting building! - private val buildableBuildings: Linq + private val buildableBuildings: List get() { - return Linq(GameBasics.Buildings.values) - .where { it.isBuildable(this) }.select { it.name } + return GameBasics.Buildings.values + .filter { it.isBuildable(this) }.map { it.name } } // Library and public school unique (not actualy unique, though...hmm) @@ -36,7 +34,7 @@ class CityConstructions { fun getStatPercentBonuses(): Stats { val stats = Stats() - for (building in getBuiltBuildings().where { it.percentStatBonus != null }) + for (building in getBuiltBuildings().filter { it.percentStatBonus != null }) stats.add(building.percentStatBonus!!) return stats } @@ -75,7 +73,7 @@ class CityConstructions { throw Exception(constructionName+ " is not a building or a unit!") } - internal fun getBuiltBuildings(): Linq = builtBuildings.select { GameBasics.Buildings[it] } + internal fun getBuiltBuildings(): List = builtBuildings.map { GameBasics.Buildings[it]!! } fun addConstruction(constructionToAdd: Int) { if (!inProgressConstructions.containsKey(currentConstruction)) inProgressConstructions[currentConstruction] = 0 @@ -139,7 +137,7 @@ class CityConstructions { } 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 builtBuildings.add(cultureBuildingToBuild) if (currentConstruction == cultureBuildingToBuild) diff --git a/core/src/com/unciv/logic/city/CityExpansionManager.kt b/core/src/com/unciv/logic/city/CityExpansionManager.kt index dc469519d8..78e2ece741 100644 --- a/core/src/com/unciv/logic/city/CityExpansionManager.kt +++ b/core/src/com/unciv/logic/city/CityExpansionManager.kt @@ -25,7 +25,7 @@ class CityExpansionManager { cultureStored -= cultureToNextTile 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 val chosenTile = tiles.maxBy { cityInfo.rankTile(it) } chosenTile!!.owner = cityInfo.civInfo.civName diff --git a/core/src/com/unciv/logic/city/CityInfo.kt b/core/src/com/unciv/logic/city/CityInfo.kt index da6a80f557..cc634db75f 100644 --- a/core/src/com/unciv/logic/city/CityInfo.kt +++ b/core/src/com/unciv/logic/city/CityInfo.kt @@ -5,10 +5,9 @@ import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.map.RoadStatus import com.unciv.logic.map.TileInfo 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.TileResource +import com.unciv.models.linq.Counter import com.unciv.models.stats.Stats class CityInfo { @@ -27,14 +26,14 @@ class CityInfo { val tile: TileInfo get() = tileMap[cityLocation] - val tilesInRange: Linq - get() = tileMap.getTilesInDistance(cityLocation, 3).where { civInfo.civName == it.owner } + val tilesInRange: List + 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") // Remove resources required by buildings - fun getCityResources(): LinqCounter { - val cityResources = LinqCounter() + fun getCityResources(): Counter { + val cityResources = Counter() for (tileInfo in tilesInRange.filter { it.resource != null }) { val resource = tileInfo.tileResource @@ -49,8 +48,8 @@ class CityInfo { return cityResources } - val buildingUniques: Linq - get() = cityConstructions.getBuiltBuildings().where { it.unique!=null }.select { it.unique } + val buildingUniques: List + get() = cityConstructions.getBuiltBuildings().filter { it.unique!=null }.map { it.unique } val greatPersonPoints: Stats get() { @@ -95,7 +94,7 @@ class CityInfo { val tile = tile tile.workingCity = this.name tile.roadStatus = RoadStatus.Railroad - if (Linq("Forest", "Jungle", "Marsh").contains(tile.terrainFeature)) + if (listOf("Forest", "Jungle", "Marsh").contains(tile.terrainFeature)) tile.terrainFeature = null population.autoAssignWorker() diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index 58d3281cfd..ecf756c447 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -4,7 +4,6 @@ import com.unciv.logic.map.RoadStatus import com.unciv.logic.map.TileInfo import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.GameBasics -import com.unciv.models.linq.Linq import com.unciv.models.stats.Stats @@ -16,7 +15,7 @@ class CityStats { private val statsFromTiles: Stats get() { 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)) return stats } @@ -98,35 +97,34 @@ class CityStats { // 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! // -3 happiness per city - val cityHappiness: Float - get() { - val civInfo = cityInfo.civInfo - var happiness = -3f - var unhappinessFromCitizens = cityInfo.population.population.toFloat() - if (civInfo.policies.isAdopted("Democracy")) - unhappinessFromCitizens -= cityInfo.population.numberOfSpecialists * 0.5f - if (civInfo.buildingUniques.contains("CitizenUnhappinessDecreased")) - unhappinessFromCitizens *= 0.9f - if (civInfo.policies.isAdopted("Aristocracy")) - unhappinessFromCitizens *= 0.95f - happiness -= unhappinessFromCitizens + fun getCityHappiness(): Float { + val civInfo = cityInfo.civInfo + var happiness = -3f + var unhappinessFromCitizens = cityInfo.population.population.toFloat() + if (civInfo.policies.isAdopted("Democracy")) + unhappinessFromCitizens -= cityInfo.population.numberOfSpecialists * 0.5f + if (civInfo.buildingUniques.contains("CitizenUnhappinessDecreased")) + unhappinessFromCitizens *= 0.9f + if (civInfo.policies.isAdopted("Aristocracy")) + unhappinessFromCitizens *= 0.95f + happiness -= unhappinessFromCitizens - if (civInfo.policies.isAdopted("Aristocracy")) - happiness += (cityInfo.population.population / 10).toFloat() - if (civInfo.policies.isAdopted("Monarchy") && isCapital) - happiness += (cityInfo.population.population / 2).toFloat() - if (civInfo.policies.isAdopted("Meritocracy") && isConnectedToCapital(RoadStatus.Road)) - happiness += 1f + if (civInfo.policies.isAdopted("Aristocracy")) + happiness += (cityInfo.population.population / 10).toFloat() + if (civInfo.policies.isAdopted("Monarchy") && isCapital) + happiness += (cityInfo.population.population / 2).toFloat() + if (civInfo.policies.isAdopted("Meritocracy") && isConnectedToCapital(RoadStatus.Road)) + happiness += 1f - happiness += cityInfo.cityConstructions.getStats().happiness.toInt().toFloat() + happiness += cityInfo.cityConstructions.getStats().happiness.toInt().toFloat() - return happiness - } + return happiness + } private val isCapital: Boolean get() = cityInfo.civInfo.capital === cityInfo - private fun getStatsFromSpecialists(specialists: Stats, policies: Linq): Stats { + private fun getStatsFromSpecialists(specialists: Stats, policies: List): Stats { val stats = Stats() // Specialists @@ -141,7 +139,7 @@ class CityStats { return stats } - private fun getStatsFromPolicies(adoptedPolicies: Linq): Stats { + private fun getStatsFromPolicies(adoptedPolicies: List): Stats { val stats = Stats() if (adoptedPolicies.contains("Tradition") && isCapital) stats.culture += 3f @@ -169,7 +167,7 @@ class CityStats { return stats } - private fun getStatPercentBonusesFromPolicies(policies: Linq, cityConstructions: CityConstructions): Stats { + private fun getStatPercentBonusesFromPolicies(policies: List, cityConstructions: CityConstructions): Stats { val stats = Stats() if (policies.contains("Collective Rule") && isCapital @@ -239,7 +237,7 @@ class CityStats { if(cityInfo.civInfo.cities.count()<2) return false// first city! val capitalTile = cityInfo.civInfo.capital.tile val tilesReached = HashSet() - var tilesToCheck : List = Linq(cityInfo.tile) + var tilesToCheck : List = listOf(cityInfo.tile) while (tilesToCheck.any()) { val newTiles = tilesToCheck .flatMap { cityInfo.tileMap.getTilesInDistance(it.position, 1) }.distinct() diff --git a/core/src/com/unciv/logic/city/IConstruction.kt b/core/src/com/unciv/logic/city/IConstruction.kt index 5ef1beb85b..733acb0898 100644 --- a/core/src/com/unciv/logic/city/IConstruction.kt +++ b/core/src/com/unciv/logic/city/IConstruction.kt @@ -1,11 +1,10 @@ package com.unciv.logic.city -import com.unciv.models.linq.Linq import com.unciv.models.stats.INamed interface IConstruction : INamed { - fun getProductionCost(adoptedPolicies: Linq): Int - fun getGoldCost(adoptedPolicies: Linq): Int + fun getProductionCost(adoptedPolicies: List): Int + fun getGoldCost(adoptedPolicies: List): Int fun isBuildable(construction: CityConstructions): Boolean fun postBuildEvent(construction: CityConstructions) // Yes I'm hilarious. } diff --git a/core/src/com/unciv/logic/city/PopulationManager.kt b/core/src/com/unciv/logic/city/PopulationManager.kt index dcae077b85..f0db9396bf 100644 --- a/core/src/com/unciv/logic/city/PopulationManager.kt +++ b/core/src/com/unciv/logic/city/PopulationManager.kt @@ -1,7 +1,6 @@ package com.unciv.logic.city import com.unciv.logic.map.TileInfo -import com.unciv.models.linq.LinqHashMap import com.unciv.models.stats.Stats class PopulationManager { @@ -11,7 +10,7 @@ class PopulationManager { @JvmField var population = 1 @JvmField var foodStored = 0 - @JvmField var buildingsSpecialists = LinqHashMap() + @JvmField var buildingsSpecialists = HashMap() val specialists: Stats get() { @@ -64,7 +63,7 @@ class PopulationManager { } 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! toWork.workingCity = cityInfo!!.name } diff --git a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt index 4db804cf9f..ae3641306e 100644 --- a/core/src/com/unciv/logic/civilization/CivilizationInfo.kt +++ b/core/src/com/unciv/logic/civilization/CivilizationInfo.kt @@ -1,14 +1,13 @@ package com.unciv.logic.civilization import com.badlogic.gdx.math.Vector2 +import com.unciv.logic.GameInfo import com.unciv.logic.city.CityInfo 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.ResourceType import com.unciv.models.gamebasics.TileResource +import com.unciv.models.linq.Counter import com.unciv.models.stats.Stats @@ -27,7 +26,7 @@ class CivilizationInfo { private var greatPeople = GreatPersonManager() var scienceVictory = ScienceVictoryManager() - var cities = Linq() + var cities = ArrayList() val capital: CityInfo get() = cities.first { it.cityConstructions.isBuilt("Palace") } @@ -61,26 +60,26 @@ class CivilizationInfo { } // base happiness - private fun getHappinessForNextTurn(): Int { + fun getHappinessForNextTurn(): Int { var happiness = 15 var happinessPerUniqueLuxury = 5 if (policies.isAdopted("Protectionism")) happinessPerUniqueLuxury += 1 happiness += getCivResources().keys .count { it.resourceType === ResourceType.Luxury } * happinessPerUniqueLuxury - happiness += cities.sumBy { it.cityStats.cityHappiness.toInt() } + happiness += cities.sumBy { it.cityStats.getCityHappiness().toInt() } if (buildingUniques.contains("HappinessPerSocialPolicy")) happiness += policies.getAdoptedPolicies().count { !it.endsWith("Complete") } return happiness } - fun getCivResources(): LinqCounter { - val civResources = LinqCounter() + fun getCivResources(): Counter { + val civResources = Counter() for (city in cities) civResources.add(city.getCityResources()) return civResources } - val buildingUniques: Linq - get() = cities.selectMany { it.cityConstructions.getBuiltBuildings().select { it.unique }.filterNotNull() }.unique() + val buildingUniques: List + get() = cities.flatMap{ it.cityConstructions.getBuiltBuildings().map { it.unique }.filterNotNull() }.distinct() constructor() @@ -115,7 +114,6 @@ class CivilizationInfo { fun nextTurn() { val nextTurnStats = getStatsForNextTurn() - happiness = nextTurnStats.happiness.toInt() policies.nextTurn(nextTurnStats.culture.toInt()) gold += nextTurnStats.gold.toInt() @@ -135,9 +133,9 @@ class CivilizationInfo { } fun addGreatPerson(greatPerson: String) { - val randomCity = cities.random - placeUnitNearTile(cities.random.cityLocation, greatPerson) - gameInfo.addNotification("A $greatPerson has been born!", randomCity!!.cityLocation) + val randomCity = cities.getRandom() + placeUnitNearTile(cities.getRandom().cityLocation, greatPerson) + gameInfo.addNotification("A $greatPerson has been born!", randomCity.cityLocation) } fun placeUnitNearTile(location: Vector2, unitName: String) { @@ -145,3 +143,4 @@ class CivilizationInfo { } } +fun List.getRandom(): E = if (size == 0) throw Exception() else get((Math.random() * size).toInt()) \ No newline at end of file diff --git a/core/src/com/unciv/logic/civilization/PolicyManager.kt b/core/src/com/unciv/logic/civilization/PolicyManager.kt index 2b684a0950..f37b16ece7 100644 --- a/core/src/com/unciv/logic/civilization/PolicyManager.kt +++ b/core/src/com/unciv/logic/civilization/PolicyManager.kt @@ -2,7 +2,6 @@ package com.unciv.logic.civilization import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.Policy -import com.unciv.models.linq.Linq import com.unciv.ui.UnCivGame import com.unciv.ui.pickerscreens.GreatPersonPickerScreen @@ -14,7 +13,7 @@ class PolicyManager { var freePolicies = 0 var storedCulture = 0 - internal val adoptedPolicies = Linq() + internal val adoptedPolicies = ArrayList() var shouldOpenPolicyPicker = false // from https://forums.civfanatics.com/threads/the-number-crunching-thread.389702/ @@ -31,7 +30,7 @@ class PolicyManager { } - fun getAdoptedPolicies(): Linq = adoptedPolicies + fun getAdoptedPolicies(): List = adoptedPolicies fun isAdopted(policyName: String): Boolean = adoptedPolicies.contains(policyName) diff --git a/core/src/com/unciv/logic/civilization/ScienceVictoryManager.kt b/core/src/com/unciv/logic/civilization/ScienceVictoryManager.kt index 085d4e70cd..ed7c91a04a 100644 --- a/core/src/com/unciv/logic/civilization/ScienceVictoryManager.kt +++ b/core/src/com/unciv/logic/civilization/ScienceVictoryManager.kt @@ -1,13 +1,13 @@ package com.unciv.logic.civilization -import com.unciv.models.linq.LinqCounter +import com.unciv.models.linq.Counter class ScienceVictoryManager { - var requiredParts = LinqCounter() - var currentParts = LinqCounter() + var requiredParts = Counter() + var currentParts = Counter() - fun unconstructedParts(): LinqCounter { + fun unconstructedParts(): Counter { val counter = requiredParts.clone() counter.remove(currentParts) return counter diff --git a/core/src/com/unciv/logic/civilization/TechManager.kt b/core/src/com/unciv/logic/civilization/TechManager.kt index e1043c89dd..460bd2e80f 100644 --- a/core/src/com/unciv/logic/civilization/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/TechManager.kt @@ -1,12 +1,9 @@ package com.unciv.logic.civilization + import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.Technology - - -import java.util.ArrayList -import java.util.HashMap -import java.util.HashSet +import java.util.* class TechManager { @Transient @@ -54,14 +51,14 @@ class TechManager { techsResearched.add(currentTechnology) 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 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) - .first { it.isCityCenter } + .firstOrNull { it.isCityCenter } if (closestCityTile != null) { civInfo.gameInfo.addNotification( revealedResource.name + " revealed near " + closestCityTile.city!!.name, tileInfo.position) diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index f5af8069ec..46fe5d0644 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -54,30 +54,19 @@ class MapUnit { private fun getPriority(tileInfo: TileInfo): Int { var priority = 0 - if (tileInfo.workingCity != null) priority += 2 - if (tileInfo.hasViewableResource(civInfo)) priority += 1 + if (tileInfo.workingCity != null) priority += 3 if (tileInfo.owner == owner) priority += 2 + if (tileInfo.hasViewableResource(civInfo)) priority += 1 else if (tileInfo.neighbors.any { it.owner != null }) priority += 1 return priority } private fun findTileToWork(currentTile: TileInfo): TileInfo { - var selectedTile = currentTile - var selectedTilePriority = - if (currentTile.improvement == null && currentTile.canBuildImprovement(chooseImprovement(currentTile), civInfo)) - getPriority(currentTile) - else - 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 + val selectedTile = civInfo.gameInfo.tileMap.getTilesInDistance(currentTile.position, 4) + .filter { (it.unit==null || it==currentTile ) && it.improvement==null && it.canBuildImprovement(chooseImprovement(it),civInfo) } + .maxBy { getPriority(it) } + if(selectedTile!=null && getPriority(selectedTile) > 1) return selectedTile + else return currentTile } fun doAutomatedAction(tile: TileInfo) { diff --git a/core/src/com/unciv/logic/map/RandomMapGenerator.kt b/core/src/com/unciv/logic/map/RandomMapGenerator.kt index 9a5dce0df5..8dcf4210d1 100644 --- a/core/src/com/unciv/logic/map/RandomMapGenerator.kt +++ b/core/src/com/unciv/logic/map/RandomMapGenerator.kt @@ -1,12 +1,11 @@ package com.unciv.logic.map import com.badlogic.gdx.math.Vector2 +import com.unciv.logic.civilization.getRandom import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.ResourceType import com.unciv.models.gamebasics.TerrainType import com.unciv.models.gamebasics.TileResource -import com.unciv.models.linq.Linq -import com.unciv.models.linq.LinqHashMap import com.unciv.ui.utils.HexMath class RandomMapGenerator { @@ -14,15 +13,15 @@ class RandomMapGenerator { private fun addRandomTile(position: Vector2): TileInfo { val tileInfo = TileInfo() 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 - tileInfo.baseTerrain = baseTerrain!!.name + val baseTerrain = terrains.filter { it.type === TerrainType.BaseTerrain && it.name != "Lakes" }.getRandom() + tileInfo.baseTerrain = baseTerrain.name if (baseTerrain.canHaveOverlay) { if (Math.random() > 0.7f) { - val SecondaryTerrain = terrains.where { it.type === TerrainType.TerrainFeature && it.occursOn!!.contains(baseTerrain.name) }.random - if (SecondaryTerrain != null) tileInfo.terrainFeature = SecondaryTerrain.name + val secondaryTerrains = terrains.filter { it.type === TerrainType.TerrainFeature && it.occursOn!!.contains(baseTerrain.name) } + if (secondaryTerrains.any()) tileInfo.terrainFeature = secondaryTerrains.getRandom().name } } @@ -31,31 +30,29 @@ class RandomMapGenerator { 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. - TileResources = TileResources.where { it.terrainsCanBeFoundOn.contains(tileInfo.lastTerrain.name) } + tileResources = tileResources.filter { it.terrainsCanBeFoundOn.contains(tileInfo.lastTerrain.name) } var resource: TileResource? = null - if (Math.random() < 1 / 5f) { - resource = GetRandomResource(TileResources, ResourceType.Bonus) - } else if (Math.random() < 1 / 7f) { - resource = GetRandomResource(TileResources, ResourceType.Strategic) - } else if (Math.random() < 1 / 15f) { - resource = GetRandomResource(TileResources, ResourceType.Luxury) + when { + Math.random() < 1 / 5f -> resource = getRandomResource(tileResources, ResourceType.Bonus) + Math.random() < 1 / 7f -> resource = getRandomResource(tileResources, ResourceType.Strategic) + Math.random() < 1 / 15f -> resource = getRandomResource(tileResources, ResourceType.Luxury) } if (resource != null) tileInfo.resource = resource.name } - internal fun GetRandomResource(resources: Linq, resourceType: ResourceType): TileResource? { - return resources.where { it.resourceType == resourceType }.random + private fun getRandomResource(resources: List, resourceType: ResourceType): TileResource? { + return resources.filter { it.resourceType == resourceType }.getRandom() } - fun generateMap(distance: Int): LinqHashMap { - val map = LinqHashMap() + fun generateMap(distance: Int): HashMap { + val map = HashMap() for (vector in HexMath.GetVectorsInDistance(Vector2.Zero, distance)) map[vector.toString()] = addRandomTile(vector) return map diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index d4af2c2b34..6eac5d4b4d 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -7,7 +7,6 @@ import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.Terrain import com.unciv.models.gamebasics.TileImprovement import com.unciv.models.gamebasics.TileResource -import com.unciv.models.linq.Linq import com.unciv.models.stats.Stats class TileInfo { @@ -33,21 +32,21 @@ class TileInfo { get() = if (terrainFeature == null) getBaseTerrain() else getTerrainFeature()!! 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 get() = city != null && position == city!!.cityLocation val tileImprovement: TileImprovement? - get() = if (improvement == null) null else GameBasics.TileImprovements[improvement] + get() = if (improvement == null) null else GameBasics.TileImprovements[improvement!!] - val neighbors: Linq + val neighbors: List get() = tileMap!!.getTilesAtDistance(position, 1) val height: Int get() { var height = 0 - if (Linq("Forest", "Jungle").contains(terrainFeature)) height += 1 + if (listOf("Forest", "Jungle").contains(terrainFeature)) height += 1 if ("Hill" == baseTerrain) height += 2 return height } @@ -62,7 +61,7 @@ class TileInfo { } 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 stats.add(tileResource) // resource base 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.name == "Trading post" && city != null && city.civInfo.policies.isAdopted("Free Thought")) 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 } diff --git a/core/src/com/unciv/logic/map/TileMap.kt b/core/src/com/unciv/logic/map/TileMap.kt index 804ead8dfb..8aed2f517d 100644 --- a/core/src/com/unciv/logic/map/TileMap.kt +++ b/core/src/com/unciv/logic/map/TileMap.kt @@ -4,8 +4,6 @@ import com.badlogic.gdx.math.Vector2 import com.unciv.logic.GameInfo import com.unciv.logic.civilization.CivilizationInfo import com.unciv.models.gamebasics.GameBasics -import com.unciv.models.linq.Linq -import com.unciv.models.linq.LinqHashMap import com.unciv.ui.utils.HexMath class TileMap { @@ -13,12 +11,12 @@ class TileMap { @Transient @JvmField var gameInfo: GameInfo? = null - private var tiles = LinqHashMap() + private var tiles = HashMap() constructor() // for json parsing, we need to have a default constructor - val values: Linq - get() = tiles.linqValues() + val values: MutableCollection + get() = tiles.values constructor(distance: Int) { @@ -34,21 +32,21 @@ class TileMap { return tiles[vector.toString()]!! } - fun getTilesInDistance(origin: Vector2, distance: Int): Linq { - return HexMath.GetVectorsInDistance(origin, distance).where{contains(it)}.select { get(it) } + fun getTilesInDistance(origin: Vector2, distance: Int): List { + return HexMath.GetVectorsInDistance(origin, distance).filter {contains(it)}.map { get(it) } } - fun getTilesAtDistance(origin: Vector2, distance: Int): Linq { - return HexMath.GetVectorsAtDistance(origin, distance).where{contains(it)}.select { get(it) } + fun getTilesAtDistance(origin: Vector2, distance: Int): List { + return HexMath.GetVectorsAtDistance(origin, distance).filter {contains(it)}.map { get(it) } } - fun getDistanceToTilesWithinTurn(origin: Vector2, currentUnitMovement: Float, machineryIsResearched: Boolean): LinqHashMap { - val distanceToTiles = LinqHashMap() + fun getDistanceToTilesWithinTurn(origin: Vector2, currentUnitMovement: Float, machineryIsResearched: Boolean): HashMap { + val distanceToTiles = HashMap() distanceToTiles[get(origin)] = 0f - var tilesToCheck = Linq(get(origin)) + var tilesToCheck = listOf(get(origin)) while (!tilesToCheck.isEmpty()) { - val updatedTiles = Linq() + val updatedTiles = ArrayList() for (tileToCheck in tilesToCheck) for (maybeUpdatedTile in getTilesInDistance(tileToCheck.position, 1)) { 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 { - var tilesToCheck: Linq = Linq(get(origin)) - val movementTreeParents = LinqHashMap() // contains a map of "you can get from X to Y in that turn" + var tilesToCheck: List = listOf(get(origin)) + val movementTreeParents = HashMap() // contains a map of "you can get from X to Y in that turn" movementTreeParents[get(origin)] = null var distance = 1 while (true) { - val newTilesToCheck = Linq() + val newTilesToCheck = ArrayList() val distanceToDestination = HashMap() val movementThisTurn = if (distance == 1) currentMovement else maxMovement.toFloat() for (tileToCheck in tilesToCheck) { @@ -99,7 +97,7 @@ class TileMap { } if (distanceToDestination.isNotEmpty()) { - val path = Linq() // Traverse the tree upwards to get the list of tiles leading to the destination, + val path = ArrayList() // Traverse the tree upwards to get the list of tiles leading to the destination, var currentTile = distanceToDestination.minBy { it.value }!!.key while (currentTile.position != origin) { path.add(currentTile) @@ -117,12 +115,12 @@ class TileMap { val unit = GameBasics.Units[unitName]!!.mapUnit unit.owner = civInfo.civName 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 { + fun getViewableTiles(position: Vector2, sightDistance: Int): MutableList { var sightDistance = sightDistance - val viewableTiles = getTilesInDistance(position, 1) + val viewableTiles = getTilesInDistance(position, 1).toMutableList() if (get(position).baseTerrain == "Hill") sightDistance += 1 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 diff --git a/core/src/com/unciv/models/gamebasics/Building.kt b/core/src/com/unciv/models/gamebasics/Building.kt index 02be96b6b8..93a7cc6f5e 100644 --- a/core/src/com/unciv/models/gamebasics/Building.kt +++ b/core/src/com/unciv/models/gamebasics/Building.kt @@ -2,7 +2,6 @@ package com.unciv.models.gamebasics import com.unciv.logic.city.CityConstructions import com.unciv.logic.city.IConstruction -import com.unciv.models.linq.Linq import com.unciv.models.stats.NamedStats import com.unciv.models.stats.Stats import com.unciv.ui.ScienceVictoryScreen @@ -13,7 +12,7 @@ import com.unciv.ui.pickerscreens.PolicyPickerScreen class Building : NamedStats(), IConstruction, ICivilopedia { private lateinit var baseDescription: String override val description: String - get() = getDescription(false, Linq()) + get() = getDescription(false, listOf()) @JvmField var requiredTech: String? = null @@ -30,7 +29,7 @@ class Building : NamedStats(), IConstruction, ICivilopedia { /** A strategic resource that will be consumed by this building */ @JvmField var requiredResource: String? = null /** City can only be built if one of these resources is nearby - it must be improved! */ - @JvmField var requiredNearbyImprovedResources: Linq? = null + @JvmField var requiredNearbyImprovedResources: List? = null @JvmField var cannotBeBuiltWith: String? = null // Uniques @@ -46,18 +45,18 @@ class Building : NamedStats(), IConstruction, ICivilopedia { fun getRequiredTech(): Technology = GameBasics.Technologies[requiredTech]!! - fun getStats(adoptedPolicies: Linq): Stats { + fun getStats(adoptedPolicies: List): Stats { 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 - 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 - 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 - 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 if (adoptedPolicies.contains("Theocracy") && name == "Temple") @@ -80,7 +79,7 @@ class Building : NamedStats(), IConstruction, ICivilopedia { } - fun getDescription(forBuildingPickerScreen: Boolean, adoptedPolicies: Linq): String { + fun getDescription(forBuildingPickerScreen: Boolean, adoptedPolicies: List): String { val stats = getStats(adoptedPolicies) val stringBuilder = StringBuilder() 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 (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") } if (maintenance != 0) @@ -119,12 +118,12 @@ class Building : NamedStats(), IConstruction, ICivilopedia { return stringBuilder.toString() } - override fun getProductionCost(adoptedPolicies: Linq): Int { + override fun getProductionCost(adoptedPolicies: List): Int { return if (!isWonder && culture != 0f && adoptedPolicies.contains("Piety")) (cost * 0.85).toInt() else cost } - override fun getGoldCost(adoptedPolicies: Linq): Int { + override fun getGoldCost(adoptedPolicies: List): Int { var cost = Math.pow((30 * getProductionCost(adoptedPolicies)).toDouble(), 0.75) * (1 + hurryCostModifier / 100) if (adoptedPolicies.contains("Mercantilism")) cost *= 0.75 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 ("MustBeNextToDesert" == unique && !civInfo.gameInfo.tileMap.getTilesInDistance(construction.cityInfo.cityLocation, 1).any { it.baseTerrain == "Desert" }) return false - if (requiredResource != null && !civInfo.getCivResources().containsKey(GameBasics.TileResources[requiredResource])) + if (requiredResource != null && !civInfo.getCivResources().containsKey(GameBasics.TileResources[requiredResource!!])) return false if (requiredNearbyImprovedResources != null) { val containsResourceWithImprovement = construction.cityInfo.tilesInRange - .any { tile -> - (tile.resource != null - && requiredNearbyImprovedResources!!.contains(tile.resource) - && tile.tileResource.improvement == tile.improvement) + .any { + it.resource != null + && requiredNearbyImprovedResources!!.contains(it.resource!!) + && it.tileResource.improvement == it.improvement } if (!containsResourceWithImprovement) return false } @@ -178,8 +177,8 @@ class Building : NamedStats(), IConstruction, ICivilopedia { } construction.builtBuildings.add(name) - if (providesFreeBuilding != null && !construction.builtBuildings.contains(providesFreeBuilding)) - construction.builtBuildings.add(providesFreeBuilding) + if (providesFreeBuilding != null && !construction.builtBuildings.contains(providesFreeBuilding!!)) + construction.builtBuildings.add(providesFreeBuilding!!) when (unique) { "ApolloProgram" -> UnCivGame.Current.screen = ScienceVictoryScreen(civInfo) "EmpireEntersGoldenAge" -> civInfo.goldenAges.enterGoldenAge() diff --git a/core/src/com/unciv/models/gamebasics/GameBasics.kt b/core/src/com/unciv/models/gamebasics/GameBasics.kt index 817bb0adcb..962bce0a85 100644 --- a/core/src/com/unciv/models/gamebasics/GameBasics.kt +++ b/core/src/com/unciv/models/gamebasics/GameBasics.kt @@ -1,16 +1,12 @@ package com.unciv.models.gamebasics -import com.unciv.models.linq.LinqHashMap - -import java.util.LinkedHashMap - object GameBasics { - @JvmField var Buildings: LinqHashMap = LinqHashMap() - @JvmField var Terrains: LinqHashMap = LinqHashMap() - @JvmField var TileResources: LinqHashMap = LinqHashMap() - @JvmField var TileImprovements: LinqHashMap = LinqHashMap() - @JvmField var Technologies: LinqHashMap = LinqHashMap() - @JvmField var Helps: LinqHashMap = LinqHashMap() - @JvmField var Units: LinqHashMap = LinqHashMap() - @JvmField var PolicyBranches: LinqHashMap = LinqHashMap() + @JvmField var Buildings: HashMap = HashMap() + @JvmField var Terrains: HashMap = HashMap() + @JvmField var TileResources: HashMap = HashMap() + @JvmField var TileImprovements: HashMap = HashMap() + @JvmField var Technologies: HashMap = HashMap() + @JvmField var Helps: HashMap = HashMap() + @JvmField var Units: HashMap = HashMap() + @JvmField var PolicyBranches: HashMap = HashMap() } \ No newline at end of file diff --git a/core/src/com/unciv/models/gamebasics/Policy.kt b/core/src/com/unciv/models/gamebasics/Policy.kt index b10605c32f..0a058dde27 100644 --- a/core/src/com/unciv/models/gamebasics/Policy.kt +++ b/core/src/com/unciv/models/gamebasics/Policy.kt @@ -1,6 +1,5 @@ package com.unciv.models.gamebasics -import com.unciv.models.linq.Linq import com.unciv.models.stats.INamed open class Policy : INamed { @@ -9,7 +8,7 @@ open class Policy : INamed { @JvmField var branch: String? = null @JvmField var row: Int = 0 @JvmField var column: Int = 0 - @JvmField var requires: Linq? = null + @JvmField var requires: ArrayList? = null } diff --git a/core/src/com/unciv/models/gamebasics/PolicyBranch.kt b/core/src/com/unciv/models/gamebasics/PolicyBranch.kt index 9c0f46671d..d66905cc38 100644 --- a/core/src/com/unciv/models/gamebasics/PolicyBranch.kt +++ b/core/src/com/unciv/models/gamebasics/PolicyBranch.kt @@ -1,7 +1,5 @@ package com.unciv.models.gamebasics -import com.unciv.models.linq.Linq - class PolicyBranch : Policy() { - @JvmField var policies: Linq = Linq() + var policies: ArrayList = arrayListOf() } diff --git a/core/src/com/unciv/models/gamebasics/TileResource.kt b/core/src/com/unciv/models/gamebasics/TileResource.kt index 8121b4040d..f503fbbbb5 100644 --- a/core/src/com/unciv/models/gamebasics/TileResource.kt +++ b/core/src/com/unciv/models/gamebasics/TileResource.kt @@ -1,6 +1,5 @@ package com.unciv.models.gamebasics -import com.unciv.models.linq.Linq import com.unciv.models.stats.NamedStats import com.unciv.models.stats.Stats @@ -17,7 +16,7 @@ class TileResource : NamedStats(), ICivilopedia { } @JvmField var resourceType: ResourceType = ResourceType.Bonus - @JvmField var terrainsCanBeFoundOn: Linq = Linq() + @JvmField var terrainsCanBeFoundOn: List = listOf() @JvmField var improvement: String? = null @JvmField var improvementStats: Stats? = null @@ -27,8 +26,8 @@ class TileResource : NamedStats(), ICivilopedia { @JvmField var building: String? = null @JvmField var revealedBy: String? = null - fun GetBuilding(): Building? { - return if (building == null) null else GameBasics.Buildings[building] + fun getBuilding(): Building? { + return if (building == null) null else GameBasics.Buildings[building!!] } } diff --git a/core/src/com/unciv/models/gamebasics/Unit.kt b/core/src/com/unciv/models/gamebasics/Unit.kt index 870e9f323a..e0cee13dac 100644 --- a/core/src/com/unciv/models/gamebasics/Unit.kt +++ b/core/src/com/unciv/models/gamebasics/Unit.kt @@ -1,9 +1,8 @@ package com.unciv.models.gamebasics -import com.unciv.logic.city.IConstruction import com.unciv.logic.city.CityConstructions +import com.unciv.logic.city.IConstruction import com.unciv.logic.map.MapUnit -import com.unciv.models.linq.Linq import com.unciv.models.stats.INamed class Unit : INamed, IConstruction { @@ -27,11 +26,11 @@ class Unit : INamed, IConstruction { } - override fun getProductionCost(adoptedPolicies: Linq): Int { + override fun getProductionCost(adoptedPolicies: List): Int { return cost } - override fun getGoldCost(adoptedPolicies: Linq): Int { + override fun getGoldCost(adoptedPolicies: List): Int { return (Math.pow((30 * cost).toDouble(), 0.75) * (1 + hurryCostModifier / 100) / 10).toInt() * 10 } diff --git a/core/src/com/unciv/models/linq/LinqCounter.java b/core/src/com/unciv/models/linq/Counter.java similarity index 73% rename from core/src/com/unciv/models/linq/LinqCounter.java rename to core/src/com/unciv/models/linq/Counter.java index 830c4948cb..759684f204 100644 --- a/core/src/com/unciv/models/linq/LinqCounter.java +++ b/core/src/com/unciv/models/linq/Counter.java @@ -2,7 +2,7 @@ package com.unciv.models.linq; import java.util.LinkedHashMap; -public class LinqCounter extends LinkedHashMap { +public class Counter extends LinkedHashMap { public Integer get(Object key){ // don't return null if empty if(containsKey(key)) return super.get(key); @@ -15,21 +15,21 @@ public class LinqCounter extends LinkedHashMap { if(get(key)==0) remove(key); // No objects of this sort left, no need to count } - public void add(LinqCounter other){ + public void add(Counter other){ for (K key : other.keySet()) { add(key,other.get(key)); } } - public void remove(LinqCounter other){ + public void remove(Counter other){ for (K key : other.keySet()) { add(key,-other.get(key)); } } @Override - public LinqCounter clone() { - LinqCounter newCounter = new LinqCounter(); + public Counter clone() { + Counter newCounter = new Counter(); newCounter.add(this); return newCounter; } diff --git a/core/src/com/unciv/models/linq/Linq.java b/core/src/com/unciv/models/linq/Linq.java deleted file mode 100644 index 854e823de2..0000000000 --- a/core/src/com/unciv/models/linq/Linq.java +++ /dev/null @@ -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 extends ArrayList { - public Linq() { - } - - public Linq(Collection objects) { - addAll(objects); - } - - public Linq(T ... objects) { - addAll(Arrays.asList(objects)); - } - - - - - public Linq where(Predicate p) { - Linq newCollection = new Linq(); - for (T t : this) if (p.evaluate(t)) newCollection.add(t); - return newCollection; - } - - public T first(Predicate p) { - for (T t : this) if (p.evaluate(t)) return t; - return null; - } - - public boolean any(Predicate p){ return first(p) != null;} - - public Linq select(Func selector) { - Linq newCollection = new Linq(); - for (T t : this) newCollection.add(selector.GetBy(t)); - return newCollection; - } - - public Linq selectMany(Func> multiSelector){ - Linq newCollection = new Linq(); - 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 unique() { - return new Linq(new HashSet(this)); // Shove it all into a hashset and build a new one around the results. - } - - public interface Func { - T2 GetBy(T1 arg0); - } - - public Linq as(Class t2Class){ - Linq newCollection = new Linq(); - for (T t:this) newCollection.add((T2)t); - return newCollection; - } - - public Linq clone(){ - return new Linq(this); - } -} \ No newline at end of file diff --git a/core/src/com/unciv/models/linq/LinqHashMap.java b/core/src/com/unciv/models/linq/LinqHashMap.java deleted file mode 100644 index 8c41911b07..0000000000 --- a/core/src/com/unciv/models/linq/LinqHashMap.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.unciv.models.linq; - -import java.util.LinkedHashMap; - -public class LinqHashMap extends LinkedHashMap { - public Linq linqValues() { - return new Linq(super.values()); - } -} - diff --git a/core/src/com/unciv/ui/CivilopediaScreen.kt b/core/src/com/unciv/ui/CivilopediaScreen.kt index e52ddbd342..adb8d9abfa 100644 --- a/core/src/com/unciv/ui/CivilopediaScreen.kt +++ b/core/src/com/unciv/ui/CivilopediaScreen.kt @@ -1,6 +1,5 @@ package com.unciv.ui -import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.ui.* import com.badlogic.gdx.scenes.scene2d.ui.List @@ -13,7 +12,6 @@ import java.util.* class CivilopediaScreen : CameraStageBaseScreen() { init { - Gdx.input.inputProcessor = stage val buttonTable = Table() buttonTable.pad(15f) val entryTable = Table() @@ -35,11 +33,11 @@ class CivilopediaScreen : CameraStageBaseScreen() { val map = LinkedHashMap>() - map["Basics"] = GameBasics.Helps.linqValues().`as`(ICivilopedia::class.java) - map["Buildings"] = GameBasics.Buildings.linqValues().`as`(ICivilopedia::class.java) - map["Resources"] = GameBasics.TileResources.linqValues().`as`(ICivilopedia::class.java) - map["Terrains"] = GameBasics.Terrains.linqValues().`as`(ICivilopedia::class.java) - map["Tile Improvements"] = GameBasics.TileImprovements.linqValues().`as`(ICivilopedia::class.java) + map["Basics"] = GameBasics.Helps.values + map["Buildings"] = GameBasics.Buildings.values + map["Resources"] = GameBasics.TileResources.values + map["Terrains"] = GameBasics.Terrains.values + map["Tile Improvements"] = GameBasics.TileImprovements.values val nameList = List(CameraStageBaseScreen.skin) diff --git a/core/src/com/unciv/ui/ScienceVictoryScreen.kt b/core/src/com/unciv/ui/ScienceVictoryScreen.kt index afafc7257b..5ed6b3ba70 100644 --- a/core/src/com/unciv/ui/ScienceVictoryScreen.kt +++ b/core/src/com/unciv/ui/ScienceVictoryScreen.kt @@ -4,8 +4,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.unciv.logic.civilization.CivilizationInfo -import com.unciv.models.linq.Linq -import com.unciv.models.linq.LinqCounter +import com.unciv.models.linq.Counter import com.unciv.ui.pickerscreens.PickerScreen import com.unciv.ui.utils.CameraStageBaseScreen @@ -27,8 +26,8 @@ class ScienceVictoryScreen(internal val civInfo: CivilizationInfo) : PickerScree else descriptionLabel.setText("Apollo program is built - you may construct spaceship parts in your cities!") - val tutorial = Linq() - tutorial.add("This is the science victory screen, where you" + + val tutorial = ArrayList() + tutorial.add("This is the science victory screen, filter you" + "\r\n can see your progress towards constructing a " + "\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") @@ -37,7 +36,7 @@ class ScienceVictoryScreen(internal val civInfo: CivilizationInfo) : PickerScree displayTutorials("ScienceVictoryScreenEntered", tutorial) } - private fun addPartButton(partName: String, parts: LinqCounter) { + private fun addPartButton(partName: String, parts: Counter) { topTable.row() val button = TextButton(partName, CameraStageBaseScreen.skin) button.touchable = Touchable.disabled diff --git a/core/src/com/unciv/ui/UnCivGame.kt b/core/src/com/unciv/ui/UnCivGame.kt index 07d08defda..b4167cee46 100644 --- a/core/src/com/unciv/ui/UnCivGame.kt +++ b/core/src/com/unciv/ui/UnCivGame.kt @@ -9,14 +9,9 @@ import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.map.TileMap import com.unciv.models.gamebasics.* 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.ui.utils.GameSaver import com.unciv.ui.worldscreen.WorldScreen -import kotlin.Array -import kotlin.Exception -import kotlin.String class UnCivGame : Game() { var gameInfo: GameInfo = GameInfo() @@ -61,8 +56,8 @@ class UnCivGame : Game() { return Json().fromJson(tClass, jsonText) } - private fun createHashmap(items: Array): LinqHashMap { - val hashMap = LinqHashMap() + private fun createHashmap(items: Array): HashMap { + val hashMap = HashMap() for (item in items) hashMap[item.name] = item return hashMap @@ -78,7 +73,7 @@ class UnCivGame : Game() { GameBasics.PolicyBranches = createHashmap(getFromJson(Array::class.java, "Policies")) val techColumns = getFromJson(Array::class.java, "Techs") - GameBasics.Technologies = LinqHashMap() + GameBasics.Technologies = HashMap() for (techColumn in techColumns) { for (tech in techColumn.techs) { tech.cost = techColumn.techCost @@ -94,12 +89,12 @@ class UnCivGame : Game() { } for (branch in GameBasics.PolicyBranches.values) { - branch.requires = Linq() + branch.requires = ArrayList() branch.branch = branch.name for (policy in branch.policies) { policy.branch = branch.name if (policy.requires == null) { - policy.requires = Linq() + policy.requires = ArrayList() policy.requires!!.add(branch.name) } } diff --git a/core/src/com/unciv/ui/cityscreen/BuildingsTable.kt b/core/src/com/unciv/ui/cityscreen/BuildingsTable.kt index 3e8fb2818b..e52624f662 100644 --- a/core/src/com/unciv/ui/cityscreen/BuildingsTable.kt +++ b/core/src/com/unciv/ui/cityscreen/BuildingsTable.kt @@ -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.utils.ClickListener import com.unciv.models.gamebasics.Building -import com.unciv.models.linq.Linq import com.unciv.models.stats.Stat import com.unciv.models.stats.Stats import com.unciv.ui.utils.CameraStageBaseScreen @@ -21,9 +20,9 @@ class BuildingsTable(private val cityScreen: CityScreen) : Table() { clear() val skin = CameraStageBaseScreen.skin val cityInfo = cityScreen.city - val wonders = Linq() - val specialistBuildings = Linq() - val others = Linq() + val wonders = mutableListOf() + val specialistBuildings = mutableListOf() + val others = mutableListOf() for (building in cityInfo.cityConstructions.getBuiltBuildings()) { when { diff --git a/core/src/com/unciv/ui/cityscreen/CityScreen.kt b/core/src/com/unciv/ui/cityscreen/CityScreen.kt index c5856f6cdf..357ed3c012 100644 --- a/core/src/com/unciv/ui/cityscreen/CityScreen.kt +++ b/core/src/com/unciv/ui/cityscreen/CityScreen.kt @@ -10,7 +10,6 @@ import com.badlogic.gdx.utils.Align import com.unciv.logic.city.CityInfo import com.unciv.logic.map.TileInfo import com.unciv.models.gamebasics.Building -import com.unciv.models.linq.Linq import com.unciv.ui.tilegroups.TileGroup import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.HexMath @@ -59,7 +58,7 @@ class CityScreen(internal val city: CityInfo) : CameraStageBaseScreen() { stage.addActor(buildingsTableContainer) update() - val tutorial = Linq() + val tutorial = mutableListOf() tutorial.add("Welcome to your first city!" + "\r\nAs on now, you only have 1 population," + "\r\n but this will grow when you amass enough surplus food") diff --git a/core/src/com/unciv/ui/pickerscreens/GreatPersonPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/GreatPersonPickerScreen.kt index bdabd32b46..0fd58d001c 100644 --- a/core/src/com/unciv/ui/pickerscreens/GreatPersonPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/GreatPersonPickerScreen.kt @@ -13,7 +13,7 @@ class GreatPersonPickerScreen : PickerScreen() { init { 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 val button = TextButton(unit.name, CameraStageBaseScreen.skin) button.addClickListener { diff --git a/core/src/com/unciv/ui/pickerscreens/PolicyPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/PolicyPickerScreen.kt index b4b5a4cdfa..5ad8f147a9 100644 --- a/core/src/com/unciv/ui/pickerscreens/PolicyPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/PolicyPickerScreen.kt @@ -9,7 +9,6 @@ import com.unciv.logic.civilization.CivilizationInfo import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.Policy import com.unciv.models.gamebasics.StringUtils -import com.unciv.models.linq.Linq import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.ImageGetter @@ -21,7 +20,7 @@ class PolicyPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen( init { val policies = civInfo.policies - val tutorial = Linq() + val tutorial = mutableListOf() tutorial.add("Each turn, the culture you gain from all your " + "\r\n cities is added to your Civilization's culture." + "\r\nWhen you have enough culture, you may pick a " + @@ -98,7 +97,7 @@ class PolicyPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen( } pickedPolicy = policy 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) descriptionLabel.setText(policyText) } diff --git a/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt b/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt index 7abd1cf144..967446bcd5 100644 --- a/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt +++ b/core/src/com/unciv/ui/pickerscreens/TechPickerScreen.kt @@ -7,7 +7,6 @@ import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.TechManager import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.Technology -import com.unciv.models.linq.Linq import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.utils.CameraStageBaseScreen import java.util.* @@ -30,7 +29,7 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen() val techMatrix = Array>(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 } @@ -69,7 +68,7 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen() dispose() } - val tutorial = Linq() + val tutorial = mutableListOf() tutorial.add("Technology is central to your civilization," + "\r\n as technological progress brings with it" + "\r\n more construction options, improvements, and abilities") @@ -133,15 +132,15 @@ class TechPickerScreen(internal val civInfo: CivilizationInfo) : PickerScreen() techsToResearch.add(tech.name) } else { val prerequisites = Stack() - val CheckPrerequisites = ArrayDeque() - CheckPrerequisites.add(tech.name) - while (!CheckPrerequisites.isEmpty()) { - val techNameToCheck = CheckPrerequisites.pop() + val checkPrerequisites = ArrayDeque() + checkPrerequisites.add(tech.name) + while (!checkPrerequisites.isEmpty()) { + val techNameToCheck = checkPrerequisites.pop() if (civTech.isResearched(techNameToCheck) || prerequisites.contains(techNameToCheck)) continue //no need to add or check prerequisites val techToCheck = GameBasics.Technologies[techNameToCheck] for (str in techToCheck!!.prerequisites) - if (!CheckPrerequisites.contains(str)) CheckPrerequisites.add(str) + if (!checkPrerequisites.contains(str)) checkPrerequisites.add(str) prerequisites.add(techNameToCheck) } techsToResearch.clear() diff --git a/core/src/com/unciv/ui/tilegroups/TileGroup.kt b/core/src/com/unciv/ui/tilegroups/TileGroup.kt index 393e9f4868..dcf9535007 100644 --- a/core/src/com/unciv/ui/tilegroups/TileGroup.kt +++ b/core/src/com/unciv/ui/tilegroups/TileGroup.kt @@ -7,7 +7,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.unciv.logic.map.RoadStatus import com.unciv.logic.map.TileInfo -import com.unciv.models.linq.LinqHashMap import com.unciv.ui.utils.HexMath import com.unciv.ui.utils.ImageGetter @@ -19,7 +18,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { protected var improvementImage: Image? =null private var improvementType: String? = null var populationImage: Image? = null - private var roadImages = LinqHashMap() + private var roadImages = HashMap() protected var hexagon: Image? = null protected var cityButton: Container? = null @@ -121,7 +120,7 @@ open class TileGroup(var tileInfo: TileInfo) : Group() { // This is some crazy voodoo magic so I'll explain. 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. image.moveBy(-relativeWorldPosition.x * 0.8f * 25f, -relativeWorldPosition.y * 0.8f * 25f) image.setSize(10f, 2f) diff --git a/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt b/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt index 84a1fb9d49..99b34df5dd 100644 --- a/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt +++ b/core/src/com/unciv/ui/utils/CameraStageBaseScreen.kt @@ -13,21 +13,19 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.utils.Align import com.badlogic.gdx.utils.viewport.ExtendViewport -import com.unciv.models.linq.Linq import com.unciv.ui.UnCivGame import com.unciv.ui.cityscreen.addClickListener open class CameraStageBaseScreen : Screen { - var game: UnCivGame + var game: UnCivGame = UnCivGame.Current var stage: Stage - private val tutorialTexts = Linq() + private val tutorialTexts = mutableListOf() - internal var isTutorialShowing = false + private var isTutorialShowing = false init { - this.game = UnCivGame.Current stage = Stage(ExtendViewport(1000f, 600f ), batch)// FitViewport(1000,600) Gdx.input.inputProcessor = stage @@ -56,14 +54,14 @@ open class CameraStageBaseScreen : Screen { override fun dispose() {} - fun displayTutorials(name: String, texts: Linq) { + fun displayTutorials(name: String, texts: List) { if (game.gameInfo.tutorial.contains(name)) return game.gameInfo.tutorial.add(name) tutorialTexts.addAll(texts) if (!isTutorialShowing) displayTutorial() } - fun displayTutorial() { + private fun displayTutorial() { isTutorialShowing = true val tutorialTable = Table().pad(10f) tutorialTable.background(ImageGetter.getDrawable("skin/tileTableBackground.png") diff --git a/core/src/com/unciv/ui/utils/HexMath.kt b/core/src/com/unciv/ui/utils/HexMath.kt index fef08b3549..533f9bf7a7 100644 --- a/core/src/com/unciv/ui/utils/HexMath.kt +++ b/core/src/com/unciv/ui/utils/HexMath.kt @@ -1,9 +1,7 @@ package com.unciv.ui.utils import com.badlogic.gdx.math.Vector2 -import com.unciv.models.linq.Linq - -import java.util.ArrayList +import java.util.* object HexMath { @@ -41,8 +39,8 @@ object HexMath { return vectors } - fun GetVectorsAtDistance(origin: Vector2, distance: Int): Linq { - val vectors = Linq() + fun GetVectorsAtDistance(origin: Vector2, distance: Int): List { + val vectors = mutableListOf() if (distance == 0) { vectors.add(origin.cpy()) return vectors @@ -66,8 +64,8 @@ object HexMath { return vectors } - fun GetVectorsInDistance(origin: Vector2, distance: Int): Linq { - val hexesToReturn = Linq() + fun GetVectorsInDistance(origin: Vector2, distance: Int): List { + val hexesToReturn = mutableListOf() for (i in 0 until distance + 1) { hexesToReturn.addAll(GetVectorsAtDistance(origin, i)) } diff --git a/core/src/com/unciv/ui/worldscreen/NotificationsScroll.kt b/core/src/com/unciv/ui/worldscreen/NotificationsScroll.kt index bb66f67a02..b097313898 100644 --- a/core/src/com/unciv/ui/worldscreen/NotificationsScroll.kt +++ b/core/src/com/unciv/ui/worldscreen/NotificationsScroll.kt @@ -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.Table import com.unciv.logic.civilization.Notification -import com.unciv.models.linq.Linq import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.ImageGetter -class NotificationsScroll(private val notifications: Linq, internal val worldScreen: WorldScreen) : ScrollPane(null) { +class NotificationsScroll(private val notifications: List, internal val worldScreen: WorldScreen) : ScrollPane(null) { private var notificationsTable = Table() init { diff --git a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt index aecf26964b..93c48f6e9c 100644 --- a/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt +++ b/core/src/com/unciv/ui/worldscreen/TileMapHolder.kt @@ -8,8 +8,6 @@ import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.map.TileInfo 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.tilegroups.WorldTileGroup 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) { internal var selectedTile: TileInfo? = null //internal var unitTile: TileInfo? = null - val tileGroups = LinqHashMap() + val tileGroups = HashMap() internal fun addTiles() { val allTiles = Group() @@ -31,7 +29,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: val group = WorldTileGroup(tileInfo) group.addClickListener { - val tutorial = Linq() + val tutorial = mutableListOf() tutorial.add("Clicking on a tile selects that tile," + "\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") @@ -56,7 +54,7 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: bottomY = Math.min(bottomY, group.y) } - for (group in tileGroups.linqValues()) { + for (group in tileGroups.values) { group.moveBy(-bottomX + 50, -bottomY + 50) } @@ -87,16 +85,16 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: } 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() 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 - viewablePositions += tileMap.values.where { it.unit != null } - .flatMap { tileMap.getViewableTiles(it.position, 2).select { it.position } } // Tiles within 2 tiles of units + viewablePositions += tileMap.values.filter { it.unit != null } + .flatMap { tileMap.getViewableTiles(it.position, 2).map { it.position } } // Tiles within 2 tiles of units } else @@ -108,13 +106,13 @@ class TileMapHolder(internal val worldScreen: WorldScreen, internal val tileMap: } 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 if(selectedTile!!.unit!=null) worldScreen.unitTable.selectedUnitTile = selectedTile 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) - // and so the scroll position (== where the screen starts) needs to be half a screen away - scrollX = tileGroup!!.x + tileGroup.width / 2 - worldScreen.stage.width / 2 + // 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 // 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) updateVisualScroll() diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt index afcfd97c5e..974799be66 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreen.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreen.kt @@ -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.TextButton import com.unciv.logic.civilization.CivilizationInfo -import com.unciv.models.linq.Linq import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.pickerscreens.PolicyPickerScreen import com.unciv.ui.pickerscreens.TechPickerScreen @@ -49,7 +48,7 @@ class WorldScreen : CameraStageBaseScreen() { createNextTurnButton() // needs civ table to be positioned stage.addActor(optionsTable) - val beginningTutorial = Linq() + val beginningTutorial = mutableListOf() beginningTutorial.add("Hello, and welcome to Unciv!" + "\r\nCivilization games can be complex, so we'll" + "\r\n be guiding you along your first journey." + @@ -68,7 +67,7 @@ class WorldScreen : CameraStageBaseScreen() { fun update() { if (game.gameInfo.tutorial.contains("CityEntered")) { - val tutorial = Linq() + val tutorial = ArrayList() 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" + "\r\n to your civilization, your cities' construction" + @@ -91,7 +90,7 @@ class WorldScreen : CameraStageBaseScreen() { } private fun updateTechButton() { - techButton.isVisible = civInfo.cities.size != 0 + techButton.isVisible = civInfo.cities.isNotEmpty() techButton.clearListeners() techButton.addClickListener { game.screen = TechPickerScreen(civInfo) @@ -110,7 +109,7 @@ class WorldScreen : CameraStageBaseScreen() { private fun createNextTurnButton() { val nextTurnButton = TextButton("Next turn", CameraStageBaseScreen.skin) nextTurnButton.addClickListener { - if (civInfo.tech.currentTechnology() == null && civInfo.cities.size != 0) { + if (civInfo.tech.currentTechnology() == null && civInfo.cities.isNotEmpty()) { game.screen = TechPickerScreen(civInfo) return@addClickListener } @@ -120,7 +119,7 @@ class WorldScreen : CameraStageBaseScreen() { GameSaver.SaveGame(game, "Autosave") update() - val tutorial = Linq() + val tutorial = ArrayList() tutorial.add("In your first couple of turns," + "\r\n you will have very little options," + "\r\n but as your civilization grows, so do the " + diff --git a/core/src/com/unciv/ui/worldscreen/WorldScreenOptionsTable.kt b/core/src/com/unciv/ui/worldscreen/WorldScreenOptionsTable.kt index 4e0ae2b0fc..520b3287c3 100644 --- a/core/src/com/unciv/ui/worldscreen/WorldScreenOptionsTable.kt +++ b/core/src/com/unciv/ui/worldscreen/WorldScreenOptionsTable.kt @@ -20,12 +20,12 @@ class WorldScreenOptionsTable internal constructor(worldScreen: WorldScreen, pri isVisible = false - val OpenCivilopediaButton = TextButton("Civilopedia", CameraStageBaseScreen.skin) - OpenCivilopediaButton.addClickListener { + val openCivilopediaButton = TextButton("Civilopedia", CameraStageBaseScreen.skin) + openCivilopediaButton.addClickListener { worldScreen.game.screen = CivilopediaScreen() isVisible = false } - add(OpenCivilopediaButton).pad(10f) + add(openCivilopediaButton).pad(10f) row() val StartNewGameButton = TextButton("Start new game", CameraStageBaseScreen.skin) diff --git a/core/src/com/unciv/ui/worldscreen/unit/IdleUnitButton.kt b/core/src/com/unciv/ui/worldscreen/unit/IdleUnitButton.kt index e5381bf3e7..bd0928bb00 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/IdleUnitButton.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/IdleUnitButton.kt @@ -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) { init { addClickListener { - val tilesWithIdleUnits = worldScreen.civInfo.gameInfo.tileMap.values.where { it.hasIdleUnit() } + val tilesWithIdleUnits = worldScreen.civInfo.gameInfo.tileMap.values.filter { it.hasIdleUnit() } val tileToSelect: TileInfo if (!tilesWithIdleUnits.contains(worldScreen.tileMapHolder.selectedTile)) diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index 6adcc31c67..c7b804043d 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -7,7 +7,6 @@ import com.unciv.logic.map.MapUnit import com.unciv.logic.map.TileInfo import com.unciv.models.gamebasics.Building import com.unciv.models.gamebasics.GameBasics -import com.unciv.models.linq.Linq import com.unciv.ui.UnCivGame import com.unciv.ui.cityscreen.addClickListener import com.unciv.ui.pickerscreens.ImprovementPickerScreen @@ -37,7 +36,7 @@ class UnitActions { actionList += getUnitActionButton(unit, "Move unit", true, { unitTable.currentlyExecutingAction = "moveTo" // 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( unitTable.selectedUnitTile!!.position, @@ -61,7 +60,7 @@ class UnitActions { actionList += getUnitActionButton(unit, "Found City", !tileMapHolder.tileMap.getTilesInDistance(tile.position, 2).any { it.isCityCenter }, { - val tutorial = Linq() + val tutorial = mutableListOf() tutorial.add("You have founded a city!" + "\r\nCities are the lifeblood of your empire," + "\r\n providing gold and science empire-wide," + @@ -87,7 +86,7 @@ class UnitActions { if (tile.improvementInProgress == null) "Construct\r\nimprovement" else tile.improvementInProgress!! + "\r\nin progress" 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) }) if("automation" == tile.unit!!.action){ diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt index dd172eeeca..132cd136ff 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitTable.kt @@ -6,7 +6,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.scenes.scene2d.ui.Table import com.unciv.logic.map.MapUnit import com.unciv.logic.map.TileInfo -import com.unciv.models.linq.LinqHashMap import com.unciv.ui.utils.CameraStageBaseScreen import com.unciv.ui.utils.ImageGetter import com.unciv.ui.worldscreen.WorldScreen @@ -37,7 +36,6 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){ fun update() { idleUnitButton.update() - unitActionsTable.clear() 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) .size(button.width * worldScreen.buttonScale, button.height * worldScreen.buttonScale).row() } + else unitLabel.setText("") + unitActionsTable.pack() pack() @@ -65,7 +65,7 @@ class UnitTable(val worldScreen: WorldScreen) : Table(){ if(selectedTile.unit!=null) selectedUnitTile = selectedTile } - private fun getDistanceToTiles(): LinqHashMap { + private fun getDistanceToTiles(): HashMap { return worldScreen.tileMapHolder.tileMap.getDistanceToTilesWithinTurn(selectedUnitTile!!.position, getSelectedUnit().currentMovement, getSelectedUnit().civInfo.tech.isResearched("Machinery"))