Added "Consumes [amount] [resource]" unique to units

This commit is contained in:
Yair Morgenstern 2021-02-06 21:27:41 +02:00
parent 3d683c767a
commit 4104f72729
9 changed files with 99 additions and 88 deletions

View File

@ -65,7 +65,7 @@ object Automation {
// This is so that the AI doesn't use all its aluminum on units and have none left for spaceship parts
val aluminum = city.civInfo.getCivResourcesByName()["Aluminum"]
if (aluminum != null && aluminum < 2) // mods may have no aluminum
militaryUnits.filter { it.requiredResource != "Aluminum" }
militaryUnits.filter { !it.getResourceRequirements().containsKey("Aluminum") }
val findWaterConnectedCitiesAndEnemies = BFS(city.getCenterTile()) { it.isWater || it.isCityCenter() }
findWaterConnectedCitiesAndEnemies.stepToEnd()

View File

@ -80,11 +80,11 @@ object BattleDamage {
.any { it.civInfo == civInfo && !it.type.isCivilian() && !it.type.isAirUnit() })
modifiers["Discipline"] = 15
val requiredResource = combatant.unit.baseUnit.requiredResource
if (requiredResource != null && civInfo.getCivResourcesByName()[requiredResource]!! < 0
&& !civInfo.isBarbarian()) {
val civResources = civInfo.getCivResourcesByName()
for (resource in combatant.unit.baseUnit.getResourceRequirements().keys)
if (civResources[resource]!! < 0 && !civInfo.isBarbarian())
modifiers["Missing resource"] = -25
}
val nearbyCivUnits = combatant.unit.getTile().getTilesInDistance(2)
.filter { it.civilianUnit?.civInfo == combatant.unit.civInfo }

View File

@ -157,9 +157,9 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo) {
}
for (dip in civInfo.diplomacy.values) newDetailedCivResources.add(dip.resourcesFromTrade())
for (resource in civInfo.getCivUnits().mapNotNull { it.baseUnit.requiredResource }
.map { civInfo.gameInfo.ruleSet.tileResources[it]!! })
newDetailedCivResources.add(resource, -1, "Units")
for (unit in civInfo.getCivUnits())
for ((resource, amount) in unit.baseUnit.getResourceRequirements())
newDetailedCivResources.add(civInfo.gameInfo.ruleSet.tileResources[resource]!!, -amount, "Units")
civInfo.detailedCivResources = newDetailedCivResources
}
}

View File

@ -118,9 +118,9 @@ class TradeEvaluation{
val amountToBuyInOffer = min(amountWillingToBuy, offer.amount)
val canUseForBuildings = civInfo.cities
.any { city -> city.cityConstructions.getBuildableBuildings().any { it.requiredResource == offer.name } }
.any { city -> city.cityConstructions.getBuildableBuildings().any { it.getResourceRequirements().containsKey(offer.name) } }
val canUseForUnits = civInfo.cities
.any { city -> city.cityConstructions.getConstructableUnits().any { it.requiredResource == offer.name } }
.any { city -> city.cityConstructions.getConstructableUnits().any { it.getResourceRequirements().containsKey(offer.name) } }
if (!canUseForBuildings && !canUseForUnits) return 0
return 50 * amountToBuyInOffer
@ -179,7 +179,7 @@ class TradeEvaluation{
if (!civInfo.isAtWar()) return 50 * offer.amount
val canUseForUnits = civInfo.gameInfo.ruleSet.units.values
.any { it.requiredResource==offer.name && it.isBuildable(civInfo) }
.any { it.getResourceRequirements().containsKey(offer.name) && it.isBuildable(civInfo) }
if (!canUseForUnits) return 50 * offer.amount
val amountLeft = civInfo.getCivResourcesByName()[offer.name]!!
@ -245,8 +245,7 @@ class TradeEvaluation{
val absoluteAdvantage = ourCombatStrength - theirCombatStrength
val percentageAdvantage = absoluteAdvantage / theirCombatStrength.toFloat()
return (absoluteAdvantage * percentageAdvantage).toInt() * 10
}
else{
} else {
val absoluteAdvantage = theirCombatStrength - ourCombatStrength
val percentageAdvantage = absoluteAdvantage / ourCombatStrength.toFloat()
return -(absoluteAdvantage * percentageAdvantage).toInt() * 10

View File

@ -65,6 +65,7 @@ class Nation : INamed {
// Same for Inca unique
@Transient
var ignoreHillMovementCost = false
@Transient
var embarkDisembarkCosts1 = false
@ -93,8 +94,7 @@ class Nation : INamed {
if (uniqueName != "") textList += uniqueName.tr() + ":"
if (uniqueText != "") {
textList += " " + uniqueText.tr()
}
else {
} else {
textList += " " + uniques.joinToString(", ") { it.tr() }
textList += ""
}
@ -155,8 +155,9 @@ class Nation : INamed {
textList += " ${Fonts.range} " + "[${unit.range}] vs [${originalUnit.range}]".tr()
if (unit.movement != originalUnit.movement)
textList += " ${Fonts.movement} " + "[${unit.movement}] vs [${originalUnit.movement}]".tr()
if (originalUnit.requiredResource != null && unit.requiredResource == null)
textList += " " + "[${originalUnit.requiredResource}] not required".tr()
for (resource in originalUnit.getResourceRequirements().keys)
if (!unit.getResourceRequirements().containsKey(resource))
textList += " " + "[$resource] not required".tr()
for (unique in unit.uniques.filterNot { it in originalUnit.uniques })
textList += " " + Translations.translateBonusOrPenalty(unique)
for (unique in originalUnit.uniques.filterNot { it in unit.uniques })
@ -165,8 +166,7 @@ class Nation : INamed {
textList += " " + promotion.tr() + " (" + Translations.translateBonusOrPenalty(ruleset.unitPromotions[promotion]!!.effect) + ")"
} else if (unit.replaces != null) {
textList += unit.name.tr() + " - " + "Replaces [${unit.replaces}], which is not found in the ruleset!".tr()
}
else {
} else {
textList += unit.name.tr()
textList += " " + unit.getDescription(true).split("\n").joinToString("\n ")
}

View File

@ -252,8 +252,9 @@ class Ruleset {
lines += "${unit.name} requires tech ${unit.requiredTech} which does not exist!"
if (unit.obsoleteTech != null && !technologies.containsKey(unit.obsoleteTech!!))
lines += "${unit.name} obsoletes at tech ${unit.obsoleteTech} which does not exist!"
if (unit.requiredResource != null && !tileResources.containsKey(unit.requiredResource!!))
lines += "${unit.name} requires resource ${unit.requiredResource} which does not exist!"
for (resource in unit.getResourceRequirements().keys)
if (!tileResources.containsKey(resource))
lines += "${unit.name} requires resource $resource which does not exist!"
if (unit.upgradesTo != null && !units.containsKey(unit.upgradesTo!!))
lines += "${unit.name} upgrades to unit ${unit.upgradesTo} which does not exist!"
if (unit.replaces != null && !units.containsKey(unit.replaces!!))

View File

@ -37,7 +37,7 @@ class TileResource : NamedStats() {
stringBuilder.appendln("{Buildings that consume this resource}: ".tr()
+ buildingsThatConsumeThis.joinToString { it.name.tr() })
val unitsThatConsumeThis = ruleset.units.values.filter { it.requiredResource == name }
val unitsThatConsumeThis = ruleset.units.values.filter { it.getResourceRequirements().containsKey(name) }
if (unitsThatConsumeThis.isNotEmpty())
stringBuilder.appendln("{Units that consume this resource}: ".tr()
+ unitsThatConsumeThis.joinToString { it.name.tr() })

View File

@ -55,7 +55,10 @@ class BaseUnit : INamed, IConstruction {
fun getDescription(forPickerScreen: Boolean): String {
val sb = StringBuilder()
if (requiredResource != null) sb.appendln("Consumes 1 [{$requiredResource}]".tr())
for ((resource, amount) in getResourceRequirements()) {
if (amount == 1) sb.appendln("Consumes 1 [$resource]".tr())
else sb.appendln("Consumes [$amount]] [$resource]".tr())
}
if (!forPickerScreen) {
if (uniqueTo != null) sb.appendln("Unique to [$uniqueTo], replaces [$replaces]".tr())
else sb.appendln("{Cost}: $cost".tr())
@ -161,7 +164,13 @@ class BaseUnit : INamed, IConstruction {
if (civInfo.cities.none { it.cityConstructions.containsBuildingOrEquivalent(filter) }) return unique.text // Wonder is not built
} else if (!civInfo.policies.adoptedPolicies.contains(filter)) return "Policy is not adopted"
}
if (requiredResource != null && !civInfo.hasResource(requiredResource!!) && !civInfo.gameInfo.gameParameters.godMode) return "Consumes 1 [$requiredResource]"
for ((resource, amount) in getResourceRequirements())
if (civInfo.getCivResourcesByName()[resource]!! < amount) {
if (amount == 1) return "Consumes 1 [$resource]" // Again, to preserve existing translations
else return "Consumes [$amount] [$resource]"
}
if (uniques.contains(Constants.settlerUnique) && civInfo.isCityState()) return "No settler for city-states"
if (uniques.contains(Constants.settlerUnique) && civInfo.isOneCityChallenger()) return "No settler for players in One City Challenge"
return ""

View File

@ -124,8 +124,10 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre
val useStoredProduction = !cityConstructions.isBeingConstructedOrEnqueued(unit.name)
val turnsToUnit = cityConstructions.turnsToConstruction(unit.name, useStoredProduction)
var buttonText = unit.name.tr() + turnOrTurns(turnsToUnit)
if (unit.requiredResource != null)
buttonText += "\n" + "Consumes 1 [${unit.requiredResource}]".tr()
for ((resource, amount) in unit.getResourceRequirements()) {
if (amount == 1) buttonText += "\n" + "Consumes 1 [$resource]".tr()
else buttonText += "\n" + "Consumes [$amount] [$resource]".tr()
}
constructionButtonDTOList.add(ConstructionButtonDTO(unit,
buttonText,