Linting and deprecation corrections

This commit is contained in:
Yair Morgenstern 2021-06-01 23:32:23 +03:00
parent c73891cbe7
commit efe369ad19
13 changed files with 71 additions and 65 deletions

View File

@ -3,8 +3,8 @@ package com.unciv.build
object BuildConfig {
const val kotlinVersion = "1.4.30"
const val appName = "Unciv"
const val appCodeNumber = 571
const val appVersion = "3.14.12"
const val appCodeNumber = 572
const val appVersion = "3.14.13"
const val gdxVersion = "1.10.0"
const val roboVMVersion = "2.3.1"

View File

@ -14,7 +14,7 @@ import kotlin.math.sqrt
object Automation {
fun rankTileForCityWork(tile:TileInfo, city: CityInfo, foodWeight: Float = 1f): Float {
fun rankTileForCityWork(tile: TileInfo, city: CityInfo, foodWeight: Float = 1f): Float {
val stats = tile.getTileStats(city, city.civInfo)
return rankStatsForCityWork(stats, city, foodWeight)
}
@ -29,7 +29,7 @@ object Automation {
rank += stats.culture / 2
rank += stats.gold / 5 // it's barely worth anything at this point
} else {
if (stats.food <= 2 || city.civInfo.getHappiness() > 5) rank += stats.food * 1.2f * foodWeight //food get more value to keep city growing
if (stats.food <= 2 || city.civInfo.getHappiness() > 5) rank += stats.food * 1.2f * foodWeight // food get more value to keep city growing
else rank += (2.4f + (stats.food - 2) / 2) * foodWeight // 1.2 point for each food up to 2, from there on half a point
if (city.civInfo.gold < 0 && city.civInfo.statsForNextTurn.gold <= 0)
@ -57,9 +57,11 @@ object Automation {
city.cityConstructions.currentConstructionFromQueue = chosenUnitName
}
fun chooseMilitaryUnit(city: CityInfo) : String? {
var militaryUnits = city.cityConstructions.getConstructableUnits().filter { !it.unitType.isCivilian() }
if (militaryUnits.map { it.name }.contains(city.cityConstructions.currentConstructionFromQueue))
fun chooseMilitaryUnit(city: CityInfo): String? {
var militaryUnits =
city.cityConstructions.getConstructableUnits().filter { !it.unitType.isCivilian() }
if (militaryUnits.map { it.name }
.contains(city.cityConstructions.currentConstructionFromQueue))
return city.cityConstructions.currentConstructionFromQueue
// This is so that the AI doesn't use all its aluminum on units and have none left for spaceship parts
@ -67,41 +69,49 @@ object Automation {
if (aluminum != null && aluminum < 2) // mods may have no aluminum
militaryUnits.filter { !it.getResourceRequirements().containsKey("Aluminum") }
val findWaterConnectedCitiesAndEnemies = BFS(city.getCenterTile()) { it.isWater || it.isCityCenter() }
val findWaterConnectedCitiesAndEnemies =
BFS(city.getCenterTile()) { it.isWater || it.isCityCenter() }
findWaterConnectedCitiesAndEnemies.stepToEnd()
if (findWaterConnectedCitiesAndEnemies.tilesReached.keys.none {
(it.isCityCenter() && it.getOwner() != city.civInfo)
|| (it.militaryUnit != null && it.militaryUnit!!.civInfo != city.civInfo)
}) // there is absolutely no reason for you to make water units on this body of water.
militaryUnits = militaryUnits.filter { it.unitType.isLandUnit() || it.unitType.isAirUnit() }
(it.isCityCenter() && it.getOwner() != city.civInfo)
|| (it.militaryUnit != null && it.militaryUnit!!.civInfo != city.civInfo)
}) // there is absolutely no reason for you to make water units on this body of water.
militaryUnits =
militaryUnits.filter { it.unitType.isLandUnit() || it.unitType.isAirUnit() }
val chosenUnit: BaseUnit
if (!city.civInfo.isAtWar() && city.civInfo.cities.any { it.getCenterTile().militaryUnit == null }
&& militaryUnits.any { it.unitType == UnitType.Ranged }) // this is for city defence so get an archery unit if we can
chosenUnit = militaryUnits.filter { it.unitType == UnitType.Ranged }.maxBy { it.cost }!!
&& militaryUnits.any { it.unitType == UnitType.Ranged }) // this is for city defence so get an archery unit if we can
chosenUnit = militaryUnits.filter { it.unitType == UnitType.Ranged }
.maxByOrNull { it.cost }!!
else { // randomize type of unit and take the most expensive of its kind
val availableTypes = militaryUnits.map { it.unitType }.distinct().filterNot { it == UnitType.Scout }.toList()
val availableTypes =
militaryUnits.map { it.unitType }.distinct().filterNot { it == UnitType.Scout }
.toList()
if (availableTypes.isEmpty()) return null
val randomType = availableTypes.random()
chosenUnit = militaryUnits.filter { it.unitType == randomType }.maxBy { it.cost }!!
chosenUnit = militaryUnits.filter { it.unitType == randomType }
.maxByOrNull { it.cost }!!
}
return chosenUnit.name
}
fun evaluteCombatStrength(civInfo: CivilizationInfo): Int {
fun evaluateCombatStrength(civInfo: CivilizationInfo): Int {
// Since units become exponentially stronger per combat strength increase, we square em all
fun square(x:Int) = x*x
val unitStrength = civInfo.getCivUnits().map { square(max(it.baseUnit().strength, it.baseUnit().rangedStrength)) }.sum()
fun square(x: Int) = x * x
val unitStrength = civInfo.getCivUnits()
.map { square(max(it.baseUnit().strength, it.baseUnit().rangedStrength)) }.sum()
return sqrt(unitStrength.toDouble()).toInt() + 1 //avoid 0, because we divide by the result
}
fun threatAssessment(assessor:CivilizationInfo, assessed: CivilizationInfo): ThreatLevel {
val powerLevelComparison = evaluteCombatStrength(assessed)/evaluteCombatStrength(assessor).toFloat()
fun threatAssessment(assessor: CivilizationInfo, assessed: CivilizationInfo): ThreatLevel {
val powerLevelComparison =
evaluateCombatStrength(assessed) / evaluateCombatStrength(assessor).toFloat()
return when {
powerLevelComparison>2 -> ThreatLevel.VeryHigh
powerLevelComparison>1.5f -> ThreatLevel.High
powerLevelComparison<(1/1.5f) -> ThreatLevel.Low
powerLevelComparison<0.5f -> ThreatLevel.VeryLow
powerLevelComparison > 2 -> ThreatLevel.VeryHigh
powerLevelComparison > 1.5f -> ThreatLevel.High
powerLevelComparison < (1 / 1.5f) -> ThreatLevel.Low
powerLevelComparison < 0.5f -> ThreatLevel.VeryLow
else -> ThreatLevel.Medium
}
}
@ -142,5 +152,4 @@ enum class ThreatLevel{
Medium,
High,
VeryHigh
}
}

View File

@ -21,7 +21,7 @@ class ConstructionAutomation(val cityConstructions: CityConstructions){
val buildableNotWonders = cityConstructions.getBuildableBuildings()
.filterNot { it.isWonder || it.isNationalWonder }
val buildableWonders = cityConstructions.getBuildableBuildings()
private val buildableWonders = cityConstructions.getBuildableBuildings()
.filter { it.isWonder || it.isNationalWonder }
val civUnits = civInfo.getCivUnits()
@ -33,7 +33,7 @@ class ConstructionAutomation(val cityConstructions: CityConstructions){
val isAtWar = civInfo.isAtWar()
val preferredVictoryType = civInfo.victoryType()
val averageProduction = civInfo.cities.map { it.cityStats.currentCityStats.production }.average()
private val averageProduction = civInfo.cities.map { it.cityStats.currentCityStats.production }.average()
val cityIsOverAverageProduction = cityInfo.cityStats.currentCityStats.production >= averageProduction
val relativeCostEffectiveness = ArrayList<ConstructionChoice>()
@ -205,7 +205,7 @@ class ConstructionAutomation(val cityConstructions: CityConstructions){
if (!buildableWonders.any()) return
val highestPriorityWonder = buildableWonders
.maxBy { getWonderPriority(it) }!!
.maxByOrNull { getWonderPriority(it) }!!
val citiesBuildingWonders = civInfo.cities
.count { it.cityConstructions.isBuildingWonder() }

View File

@ -360,12 +360,12 @@ object NextTurnAutomation {
}
private fun motivationToAttack(civInfo: CivilizationInfo, otherCiv: CivilizationInfo): Int {
val ourCombatStrength = Automation.evaluteCombatStrength(civInfo).toFloat()
var theirCombatStrength = Automation.evaluteCombatStrength(otherCiv)
val ourCombatStrength = Automation.evaluateCombatStrength(civInfo).toFloat()
var theirCombatStrength = Automation.evaluateCombatStrength(otherCiv)
//for city-states, also consider there protectors
if(otherCiv.isCityState() and otherCiv.getProtectorCivs().isNotEmpty()) {
theirCombatStrength += otherCiv.getProtectorCivs().sumOf{Automation.evaluteCombatStrength(it)}
theirCombatStrength += otherCiv.getProtectorCivs().sumOf{Automation.evaluateCombatStrength(it)}
}
if (theirCombatStrength > ourCombatStrength) return 0

View File

@ -118,7 +118,6 @@ object BattleDamage {
fun getAttackModifiers(
attacker: ICombatant,
tileToAttackFrom: TileInfo?,
defender: ICombatant
): Counter<String> {
val modifiers = getGeneralModifiers(attacker, defender)
@ -280,7 +279,7 @@ object BattleDamage {
defender: ICombatant
): Float {
val attackModifier =
modifiersToMultiplicationBonus(getAttackModifiers(attacker, tileToAttackFrom, defender))
modifiersToMultiplicationBonus(getAttackModifiers(attacker, defender))
return attacker.getAttackingStrength() * attackModifier
}

View File

@ -10,7 +10,7 @@ interface IConstruction : INamed {
fun getGoldCost(civInfo: CivilizationInfo): Int
fun isBuildable(cityConstructions: CityConstructions): Boolean
fun shouldBeDisplayed(cityConstructions: CityConstructions): Boolean
fun postBuildEvent(construction: CityConstructions, wasBought: Boolean = false): Boolean // Yes I'm hilarious.
fun postBuildEvent(cityConstructions: CityConstructions, wasBought: Boolean = false): Boolean // Yes I'm hilarious.
fun getResourceRequirements(): HashMap<String,Int>
fun canBePurchased(): Boolean
}
@ -59,7 +59,7 @@ open class PerpetualConstruction(override var name: String, val description: Str
override fun isBuildable(cityConstructions: CityConstructions): Boolean =
throw Exception("Impossible!")
override fun postBuildEvent(construction: CityConstructions, wasBought: Boolean) =
override fun postBuildEvent(cityConstructions: CityConstructions, wasBought: Boolean) =
throw Exception("Impossible!")
override fun getResourceRequirements(): HashMap<String, Int> = hashMapOf()

View File

@ -51,7 +51,7 @@ class QuestManager {
/** Number of turns left before this city state can start a new individual quest */
private var individualQuestCountdown: HashMap<String, Int> = HashMap()
/** Returns [true] if [civInfo] have active quests for [challenger] */
/** Returns true if [civInfo] have active quests for [challenger] */
fun haveQuestsFor(challenger: CivilizationInfo): Boolean = assignedQuests.any { it.assignee == challenger.civName }
fun clone(): QuestManager {
@ -195,7 +195,7 @@ class QuestManager {
if (quests.isEmpty())
return
val topScore = quests.map { getScoreForQuest(it) }.max()!!
val topScore = quests.map { getScoreForQuest(it) }.maxOrNull()!!
for (quest in quests) {
if (getScoreForQuest(quest) >= topScore)
@ -218,7 +218,7 @@ class QuestManager {
}
/** If quest is complete, it gives the influence reward to the player.
* Returns [true] if the quest can be removed (is either complete, obsolete or expired) */
* Returns true if the quest can be removed (is either complete, obsolete or expired) */
private fun handleIndividualQuest(assignedQuest: AssignedQuest): Boolean {
val assignee = civInfo.gameInfo.getCivilization(assignedQuest.assignee)
@ -251,7 +251,7 @@ class QuestManager {
when (quest.name) {
QuestName.ClearBarbarianCamp.value -> {
val camp = getBarbarianEncampmentForQuest(assignee)!!
val camp = getBarbarianEncampmentForQuest()!!
data1 = camp.position.x.toInt().toString()
data2 = camp.position.y.toInt().toString()
}
@ -281,13 +281,13 @@ class QuestManager {
}
}
/** Returns [true] if [civInfo] can assign a quest to [challenger] */
/** Returns true if [civInfo] can assign a quest to [challenger] */
private fun canAssignAQuestTo(challenger: CivilizationInfo): Boolean {
return !challenger.isDefeated() && challenger.isMajorCiv() &&
civInfo.knows(challenger) && !civInfo.isAtWarWith(challenger)
}
/** Returns [true] if the [quest] can be assigned to [challenger] */
/** Returns true if the [quest] can be assigned to [challenger] */
private fun isQuestValid(quest: Quest, challenger: CivilizationInfo): Boolean {
if (!canAssignAQuestTo(challenger))
return false
@ -295,7 +295,7 @@ class QuestManager {
return false
return when (quest.name) {
QuestName.ClearBarbarianCamp.value -> getBarbarianEncampmentForQuest(challenger) != null
QuestName.ClearBarbarianCamp.value -> getBarbarianEncampmentForQuest() != null
QuestName.Route.value -> {
if (challenger.cities.none() || !civInfo.hasEverBeenFriendWith(challenger)
|| civInfo.isCapitalConnectedToCity(challenger.getCapital())) return false
@ -313,7 +313,7 @@ class QuestManager {
}
}
/** Returns [true] if the [assignedQuest] is successfully completed */
/** Returns true if the [assignedQuest] is successfully completed */
private fun isComplete(assignedQuest: AssignedQuest): Boolean {
val assignee = civInfo.gameInfo.getCivilization(assignedQuest.assignee)
return when (assignedQuest.questName) {
@ -327,7 +327,7 @@ class QuestManager {
}
}
/** Returns [true] if the [assignedQuest] request cannot be fulfilled anymore */
/** Returns true if the [assignedQuest] request cannot be fulfilled anymore */
private fun isObsolete(assignedQuest: AssignedQuest): Boolean {
val assignee = civInfo.gameInfo.getCivilization(assignedQuest.assignee)
return when (assignedQuest.questName) {
@ -441,7 +441,7 @@ class QuestManager {
* Returns a random [TileInfo] containing a Barbarian encampment within 8 tiles of [civInfo]
* to be destroyed
*/
private fun getBarbarianEncampmentForQuest(challenger: CivilizationInfo): TileInfo? {
private fun getBarbarianEncampmentForQuest(): TileInfo? {
val encampments = civInfo.getCapital().getCenterTile().getTilesInDistance(8)
.filter { it.improvement == Constants.barbarianEncampment }.toList()
@ -492,7 +492,7 @@ class QuestManager {
}
/**
* Returns a random [NaturalWonder] not yet discovered by [challenger].
* Returns a random Natural Wonder not yet discovered by [challenger].
*/
private fun getNaturalWonderToFindForQuest(challenger: CivilizationInfo): String? {
val naturalWondersToFind = civInfo.gameInfo.tileMap.naturalWonders.subtract(challenger.naturalWonders)

View File

@ -132,8 +132,6 @@ class MapLandmassGenerator(val randomness: MapGenerationRandomness) {
// region Cellular automata
private fun generateLandCellularAutomata(tileMap: TileMap) {
val mapRadius = tileMap.mapParameters.mapSize.radius
val mapType = tileMap.mapParameters.type
val numSmooth = 4
// init

View File

@ -55,11 +55,11 @@ class RiverGenerator(val randomness: MapGenerationRandomness) {
.filter { map.contains(it.position) }
if (possibleCoordinates.none()) return // end of the line
val newCoordinate = possibleCoordinates
.groupBy {
getAdjacentTiles(it, map).map { it.aerialDistanceTo(endPosition) }
.minOrNull()!!
}
.minBy { it.key }!!
.groupBy {
getAdjacentTiles(it, map).map { it.aerialDistanceTo(endPosition) }
.minOrNull()!!
}
.minByOrNull { it.key }!!
.component2().random(randomness.RNG)
// set new rivers in place

View File

@ -237,8 +237,8 @@ class TradeEvaluation {
}
fun evaluatePeaceCostForThem(ourCivilization: CivilizationInfo, otherCivilization: CivilizationInfo): Int {
val ourCombatStrength = Automation.evaluteCombatStrength(ourCivilization)
val theirCombatStrength = Automation.evaluteCombatStrength(otherCivilization)
val ourCombatStrength = Automation.evaluateCombatStrength(ourCivilization)
val theirCombatStrength = Automation.evaluateCombatStrength(otherCivilization)
if (ourCombatStrength*1.5f >= theirCombatStrength && theirCombatStrength * 1.5f >= ourCombatStrength)
return 0 // we're roughly equal, there's no huge power imbalance
if (ourCombatStrength == 0) return -1000

View File

@ -75,7 +75,7 @@ class Building : NamedStats(), IConstruction {
val str = getStats(null).toString()
if (str.isNotEmpty()) infoList += str
for (stat in getStatPercentageBonuses(null).toHashMap())
if (stat.value != 0f) infoList += "+${stat.value.toInt()}% ${stat.key.toString().tr()}"
if (stat.value != 0f) infoList += "+${stat.value.toInt()}% ${stat.key.name.tr()}"
val improvedResources = ruleset.tileResources.values.asSequence().filter { it.building == name }.map { it.name.tr() }
if (improvedResources.any()) {

View File

@ -184,9 +184,9 @@ class BaseUnit : INamed, IConstruction {
return getRejectionReason(cityConstructions) == ""
}
override fun postBuildEvent(construction: CityConstructions, wasBought: Boolean): Boolean {
val civInfo = construction.cityInfo.civInfo
val unit = civInfo.placeUnitNearTile(construction.cityInfo.location, name)
override fun postBuildEvent(cityConstructions: CityConstructions, wasBought: Boolean): Boolean {
val civInfo = cityConstructions.cityInfo.civInfo
val unit = civInfo.placeUnitNearTile(cityConstructions.cityInfo.location, name)
if (unit == null) return false // couldn't place the unit, so there's actually no unit =(
//movement penalty
@ -195,10 +195,10 @@ class BaseUnit : INamed, IConstruction {
if (this.unitType.isCivilian()) return true // tiny optimization makes save files a few bytes smaller
var XP = construction.getBuiltBuildings().sumBy { it.xpForNewUnits }
var XP = cityConstructions.getBuiltBuildings().sumBy { it.xpForNewUnits }
for (unique in construction.cityInfo.cityConstructions.builtBuildingUniqueMap
for (unique in cityConstructions.cityInfo.cityConstructions.builtBuildingUniqueMap
.getUniques("New [] units start with [] Experience in this city")
+ civInfo.getMatchingUniques("New [] units start with [] Experience")) {
if (unit.matchesFilter(unique.params[0]))
@ -206,7 +206,7 @@ class BaseUnit : INamed, IConstruction {
}
unit.promotions.XP = XP
for (unique in construction.cityInfo.cityConstructions.builtBuildingUniqueMap
for (unique in cityConstructions.cityInfo.cityConstructions.builtBuildingUniqueMap
.getUniques("All newly-trained [] units in this city receive the [] promotion")) {
val filter = unique.params[0]
val promotion = unique.params[1]

View File

@ -119,7 +119,7 @@ class BattleTable(val worldScreen: WorldScreen): Table() {
add(defender.getDefendingStrength().toString()+Fonts.strength).row()
val attackerModifiers =
BattleDamage.getAttackModifiers(attacker,null,defender).map {
BattleDamage.getAttackModifiers(attacker, defender).map {
val description = if(it.key.startsWith("vs ")) ("vs ["+it.key.replace("vs ","")+"]").tr() else it.key.tr()
val percentage = (if(it.value>0)"+" else "")+ it.value +"%"
"$description: $percentage"