mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-27 22:06:05 -04:00
Added "Consumes [amount] [resource]" unique to units
This commit is contained in:
parent
3d683c767a
commit
4104f72729
@ -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
|
// 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"]
|
val aluminum = city.civInfo.getCivResourcesByName()["Aluminum"]
|
||||||
if (aluminum != null && aluminum < 2) // mods may have no 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() }
|
val findWaterConnectedCitiesAndEnemies = BFS(city.getCenterTile()) { it.isWater || it.isCityCenter() }
|
||||||
findWaterConnectedCitiesAndEnemies.stepToEnd()
|
findWaterConnectedCitiesAndEnemies.stepToEnd()
|
||||||
|
@ -80,11 +80,11 @@ object BattleDamage {
|
|||||||
.any { it.civInfo == civInfo && !it.type.isCivilian() && !it.type.isAirUnit() })
|
.any { it.civInfo == civInfo && !it.type.isCivilian() && !it.type.isAirUnit() })
|
||||||
modifiers["Discipline"] = 15
|
modifiers["Discipline"] = 15
|
||||||
|
|
||||||
val requiredResource = combatant.unit.baseUnit.requiredResource
|
val civResources = civInfo.getCivResourcesByName()
|
||||||
if (requiredResource != null && civInfo.getCivResourcesByName()[requiredResource]!! < 0
|
for (resource in combatant.unit.baseUnit.getResourceRequirements().keys)
|
||||||
&& !civInfo.isBarbarian()) {
|
if (civResources[resource]!! < 0 && !civInfo.isBarbarian())
|
||||||
modifiers["Missing resource"] = -25
|
modifiers["Missing resource"] = -25
|
||||||
}
|
|
||||||
|
|
||||||
val nearbyCivUnits = combatant.unit.getTile().getTilesInDistance(2)
|
val nearbyCivUnits = combatant.unit.getTile().getTilesInDistance(2)
|
||||||
.filter { it.civilianUnit?.civInfo == combatant.unit.civInfo }
|
.filter { it.civilianUnit?.civInfo == combatant.unit.civInfo }
|
||||||
|
@ -157,9 +157,9 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (dip in civInfo.diplomacy.values) newDetailedCivResources.add(dip.resourcesFromTrade())
|
for (dip in civInfo.diplomacy.values) newDetailedCivResources.add(dip.resourcesFromTrade())
|
||||||
for (resource in civInfo.getCivUnits().mapNotNull { it.baseUnit.requiredResource }
|
for (unit in civInfo.getCivUnits())
|
||||||
.map { civInfo.gameInfo.ruleSet.tileResources[it]!! })
|
for ((resource, amount) in unit.baseUnit.getResourceRequirements())
|
||||||
newDetailedCivResources.add(resource, -1, "Units")
|
newDetailedCivResources.add(civInfo.gameInfo.ruleSet.tileResources[resource]!!, -amount, "Units")
|
||||||
civInfo.detailedCivResources = newDetailedCivResources
|
civInfo.detailedCivResources = newDetailedCivResources
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -118,9 +118,9 @@ class TradeEvaluation{
|
|||||||
val amountToBuyInOffer = min(amountWillingToBuy, offer.amount)
|
val amountToBuyInOffer = min(amountWillingToBuy, offer.amount)
|
||||||
|
|
||||||
val canUseForBuildings = civInfo.cities
|
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
|
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
|
if (!canUseForBuildings && !canUseForUnits) return 0
|
||||||
|
|
||||||
return 50 * amountToBuyInOffer
|
return 50 * amountToBuyInOffer
|
||||||
@ -179,7 +179,7 @@ class TradeEvaluation{
|
|||||||
if (!civInfo.isAtWar()) return 50 * offer.amount
|
if (!civInfo.isAtWar()) return 50 * offer.amount
|
||||||
|
|
||||||
val canUseForUnits = civInfo.gameInfo.ruleSet.units.values
|
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
|
if (!canUseForUnits) return 50 * offer.amount
|
||||||
|
|
||||||
val amountLeft = civInfo.getCivResourcesByName()[offer.name]!!
|
val amountLeft = civInfo.getCivResourcesByName()[offer.name]!!
|
||||||
@ -245,8 +245,7 @@ class TradeEvaluation{
|
|||||||
val absoluteAdvantage = ourCombatStrength - theirCombatStrength
|
val absoluteAdvantage = ourCombatStrength - theirCombatStrength
|
||||||
val percentageAdvantage = absoluteAdvantage / theirCombatStrength.toFloat()
|
val percentageAdvantage = absoluteAdvantage / theirCombatStrength.toFloat()
|
||||||
return (absoluteAdvantage * percentageAdvantage).toInt() * 10
|
return (absoluteAdvantage * percentageAdvantage).toInt() * 10
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
val absoluteAdvantage = theirCombatStrength - ourCombatStrength
|
val absoluteAdvantage = theirCombatStrength - ourCombatStrength
|
||||||
val percentageAdvantage = absoluteAdvantage / ourCombatStrength.toFloat()
|
val percentageAdvantage = absoluteAdvantage / ourCombatStrength.toFloat()
|
||||||
return -(absoluteAdvantage * percentageAdvantage).toInt() * 10
|
return -(absoluteAdvantage * percentageAdvantage).toInt() * 10
|
||||||
|
@ -65,6 +65,7 @@ class Nation : INamed {
|
|||||||
// Same for Inca unique
|
// Same for Inca unique
|
||||||
@Transient
|
@Transient
|
||||||
var ignoreHillMovementCost = false
|
var ignoreHillMovementCost = false
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
var embarkDisembarkCosts1 = false
|
var embarkDisembarkCosts1 = false
|
||||||
|
|
||||||
@ -93,8 +94,7 @@ class Nation : INamed {
|
|||||||
if (uniqueName != "") textList += uniqueName.tr() + ":"
|
if (uniqueName != "") textList += uniqueName.tr() + ":"
|
||||||
if (uniqueText != "") {
|
if (uniqueText != "") {
|
||||||
textList += " " + uniqueText.tr()
|
textList += " " + uniqueText.tr()
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
textList += " " + uniques.joinToString(", ") { it.tr() }
|
textList += " " + uniques.joinToString(", ") { it.tr() }
|
||||||
textList += ""
|
textList += ""
|
||||||
}
|
}
|
||||||
@ -155,8 +155,9 @@ class Nation : INamed {
|
|||||||
textList += " ${Fonts.range} " + "[${unit.range}] vs [${originalUnit.range}]".tr()
|
textList += " ${Fonts.range} " + "[${unit.range}] vs [${originalUnit.range}]".tr()
|
||||||
if (unit.movement != originalUnit.movement)
|
if (unit.movement != originalUnit.movement)
|
||||||
textList += " ${Fonts.movement} " + "[${unit.movement}] vs [${originalUnit.movement}]".tr()
|
textList += " ${Fonts.movement} " + "[${unit.movement}] vs [${originalUnit.movement}]".tr()
|
||||||
if (originalUnit.requiredResource != null && unit.requiredResource == null)
|
for (resource in originalUnit.getResourceRequirements().keys)
|
||||||
textList += " " + "[${originalUnit.requiredResource}] not required".tr()
|
if (!unit.getResourceRequirements().containsKey(resource))
|
||||||
|
textList += " " + "[$resource] not required".tr()
|
||||||
for (unique in unit.uniques.filterNot { it in originalUnit.uniques })
|
for (unique in unit.uniques.filterNot { it in originalUnit.uniques })
|
||||||
textList += " " + Translations.translateBonusOrPenalty(unique)
|
textList += " " + Translations.translateBonusOrPenalty(unique)
|
||||||
for (unique in originalUnit.uniques.filterNot { it in unit.uniques })
|
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) + ")"
|
textList += " " + promotion.tr() + " (" + Translations.translateBonusOrPenalty(ruleset.unitPromotions[promotion]!!.effect) + ")"
|
||||||
} else if (unit.replaces != null) {
|
} else if (unit.replaces != null) {
|
||||||
textList += unit.name.tr() + " - " + "Replaces [${unit.replaces}], which is not found in the ruleset!".tr()
|
textList += unit.name.tr() + " - " + "Replaces [${unit.replaces}], which is not found in the ruleset!".tr()
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
textList += unit.name.tr()
|
textList += unit.name.tr()
|
||||||
textList += " " + unit.getDescription(true).split("\n").joinToString("\n ")
|
textList += " " + unit.getDescription(true).split("\n").joinToString("\n ")
|
||||||
}
|
}
|
||||||
|
@ -252,8 +252,9 @@ class Ruleset {
|
|||||||
lines += "${unit.name} requires tech ${unit.requiredTech} which does not exist!"
|
lines += "${unit.name} requires tech ${unit.requiredTech} which does not exist!"
|
||||||
if (unit.obsoleteTech != null && !technologies.containsKey(unit.obsoleteTech!!))
|
if (unit.obsoleteTech != null && !technologies.containsKey(unit.obsoleteTech!!))
|
||||||
lines += "${unit.name} obsoletes at tech ${unit.obsoleteTech} which does not exist!"
|
lines += "${unit.name} obsoletes at tech ${unit.obsoleteTech} which does not exist!"
|
||||||
if (unit.requiredResource != null && !tileResources.containsKey(unit.requiredResource!!))
|
for (resource in unit.getResourceRequirements().keys)
|
||||||
lines += "${unit.name} requires resource ${unit.requiredResource} which does not exist!"
|
if (!tileResources.containsKey(resource))
|
||||||
|
lines += "${unit.name} requires resource $resource which does not exist!"
|
||||||
if (unit.upgradesTo != null && !units.containsKey(unit.upgradesTo!!))
|
if (unit.upgradesTo != null && !units.containsKey(unit.upgradesTo!!))
|
||||||
lines += "${unit.name} upgrades to unit ${unit.upgradesTo} which does not exist!"
|
lines += "${unit.name} upgrades to unit ${unit.upgradesTo} which does not exist!"
|
||||||
if (unit.replaces != null && !units.containsKey(unit.replaces!!))
|
if (unit.replaces != null && !units.containsKey(unit.replaces!!))
|
||||||
|
@ -37,7 +37,7 @@ class TileResource : NamedStats() {
|
|||||||
stringBuilder.appendln("{Buildings that consume this resource}: ".tr()
|
stringBuilder.appendln("{Buildings that consume this resource}: ".tr()
|
||||||
+ buildingsThatConsumeThis.joinToString { it.name.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())
|
if (unitsThatConsumeThis.isNotEmpty())
|
||||||
stringBuilder.appendln("{Units that consume this resource}: ".tr()
|
stringBuilder.appendln("{Units that consume this resource}: ".tr()
|
||||||
+ unitsThatConsumeThis.joinToString { it.name.tr() })
|
+ unitsThatConsumeThis.joinToString { it.name.tr() })
|
||||||
|
@ -55,7 +55,10 @@ class BaseUnit : INamed, IConstruction {
|
|||||||
|
|
||||||
fun getDescription(forPickerScreen: Boolean): String {
|
fun getDescription(forPickerScreen: Boolean): String {
|
||||||
val sb = StringBuilder()
|
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 (!forPickerScreen) {
|
||||||
if (uniqueTo != null) sb.appendln("Unique to [$uniqueTo], replaces [$replaces]".tr())
|
if (uniqueTo != null) sb.appendln("Unique to [$uniqueTo], replaces [$replaces]".tr())
|
||||||
else sb.appendln("{Cost}: $cost".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
|
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"
|
} 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.isCityState()) return "No settler for city-states"
|
||||||
if (uniques.contains(Constants.settlerUnique) && civInfo.isOneCityChallenger()) return "No settler for players in One City Challenge"
|
if (uniques.contains(Constants.settlerUnique) && civInfo.isOneCityChallenger()) return "No settler for players in One City Challenge"
|
||||||
return ""
|
return ""
|
||||||
|
@ -124,8 +124,10 @@ class ConstructionsTable(val cityScreen: CityScreen) : Table(CameraStageBaseScre
|
|||||||
val useStoredProduction = !cityConstructions.isBeingConstructedOrEnqueued(unit.name)
|
val useStoredProduction = !cityConstructions.isBeingConstructedOrEnqueued(unit.name)
|
||||||
val turnsToUnit = cityConstructions.turnsToConstruction(unit.name, useStoredProduction)
|
val turnsToUnit = cityConstructions.turnsToConstruction(unit.name, useStoredProduction)
|
||||||
var buttonText = unit.name.tr() + turnOrTurns(turnsToUnit)
|
var buttonText = unit.name.tr() + turnOrTurns(turnsToUnit)
|
||||||
if (unit.requiredResource != null)
|
for ((resource, amount) in unit.getResourceRequirements()) {
|
||||||
buttonText += "\n" + "Consumes 1 [${unit.requiredResource}]".tr()
|
if (amount == 1) buttonText += "\n" + "Consumes 1 [$resource]".tr()
|
||||||
|
else buttonText += "\n" + "Consumes [$amount] [$resource]".tr()
|
||||||
|
}
|
||||||
|
|
||||||
constructionButtonDTOList.add(ConstructionButtonDTO(unit,
|
constructionButtonDTOList.add(ConstructionButtonDTO(unit,
|
||||||
buttonText,
|
buttonText,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user