Step 1 of merging unique powers - civInfo.hasUnique treats building and policy uniques equally
This commit is contained in:
parent
bf874fe749
commit
937a832b2c
18 changed files with 31 additions and 32 deletions
|
@ -151,7 +151,7 @@ object BattleDamage {
|
|||
modifiers["Autocracy Complete"] = 0.2f
|
||||
|
||||
if (defender is CityCombatant &&
|
||||
attacker.getCivInfo().containsBuildingUnique("+15% Combat Strength for all units when attacking Cities"))
|
||||
attacker.getCivInfo().hasUnique("+15% Combat Strength for all units when attacking Cities"))
|
||||
modifiers["Statue of Zeus"] = 0.15f
|
||||
} else if (attacker is CityCombatant) {
|
||||
if (policies.hasEffect("Units in cities cost no Maintenance, garrisoned city +50% attacking strength")
|
||||
|
@ -207,7 +207,7 @@ object BattleDamage {
|
|||
|
||||
private fun getTileSpecificModifiers(unit: MapUnitCombatant, tile: TileInfo): HashMap<String,Float> {
|
||||
val modifiers = HashMap<String,Float>()
|
||||
if(tile.isFriendlyTerritory(unit.getCivInfo()) && unit.getCivInfo().containsBuildingUnique("+15% combat strength for units fighting in friendly territory"))
|
||||
if(tile.isFriendlyTerritory(unit.getCivInfo()) && unit.getCivInfo().hasUnique("+15% combat strength for units fighting in friendly territory"))
|
||||
modifiers["Himeji Castle"] = 0.15f
|
||||
if(!tile.isFriendlyTerritory(unit.getCivInfo()) && unit.unit.hasUnique("+20% bonus outside friendly territory"))
|
||||
modifiers["Foreign Land"] = 0.2f
|
||||
|
|
|
@ -55,7 +55,7 @@ class CityCombatant(val city: CityInfo) : ICombatant {
|
|||
strength += cityTile.militaryUnit!!.baseUnit().strength * (cityTile.militaryUnit!!.health / 100f) * 0.2f
|
||||
|
||||
var buildingsStrength = city.cityConstructions.getBuiltBuildings().sumBy{ it.cityStrength }.toFloat()
|
||||
if(getCivInfo().containsBuildingUnique("Defensive buildings in all cities are 25% more effective"))
|
||||
if(getCivInfo().hasUnique("Defensive buildings in all cities are 25% more effective"))
|
||||
buildingsStrength*=1.25f
|
||||
strength += buildingsStrength
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ class CityExpansionManager {
|
|||
// The second seems to be more based, so I'll go with that
|
||||
fun getCultureToNextTile(): Int {
|
||||
var cultureToNextTile = 6 * (max(0, tilesClaimed()) + 1.4813).pow(1.3)
|
||||
if (cityInfo.civInfo.containsBuildingUnique("Cost of acquiring new tiles reduced by 25%"))
|
||||
if (cityInfo.civInfo.hasUnique("Cost of acquiring new tiles reduced by 25%"))
|
||||
cultureToNextTile *= 0.75 //Speciality of Angkor Wat
|
||||
if (cityInfo.containsBuildingUnique("Culture and Gold costs of acquiring new tiles reduced by 25% in this city"))
|
||||
cultureToNextTile *= 0.75 // Specialty of Krepost
|
||||
|
@ -56,7 +56,7 @@ class CityExpansionManager {
|
|||
val distanceFromCenter = tileInfo.aerialDistanceTo(cityInfo.getCenterTile())
|
||||
var cost = baseCost * (distanceFromCenter - 1) + tilesClaimed() * 5.0
|
||||
|
||||
if (cityInfo.civInfo.containsBuildingUnique("Cost of acquiring new tiles reduced by 25%"))
|
||||
if (cityInfo.civInfo.hasUnique("Cost of acquiring new tiles reduced by 25%"))
|
||||
cost *= 0.75 //Speciality of Angkor Wat
|
||||
if (cityInfo.containsBuildingUnique("Culture and Gold costs of acquiring new tiles reduced by 25% in this city"))
|
||||
cost *= 0.75 // Specialty of Krepost
|
||||
|
|
|
@ -263,7 +263,7 @@ class CityInfo {
|
|||
if (civInfo.policies.hasEffect("Great Merchants are earned 25% faster, +1 Science from every Mint, Market, Bank and Stock Exchange."))
|
||||
entry.value.gold *= 1.25f
|
||||
|
||||
if (civInfo.containsBuildingUnique("+33% great person generation in all cities"))
|
||||
if (civInfo.hasUnique("+33% great person generation in all cities"))
|
||||
stats[entry.key] = stats[entry.key]!!.times(1.33f)
|
||||
if (civInfo.policies.hasEffect("+25% great people rate"))
|
||||
stats[entry.key] = stats[entry.key]!!.times(1.25f)
|
||||
|
|
|
@ -51,7 +51,7 @@ class CityStats {
|
|||
var goldFromTradeRoute = civInfo.getCapital().population.population * 0.15 + cityInfo.population.population * 1.1 - 1 // Calculated by http://civilization.wikia.com/wiki/Trade_route_(Civ5)
|
||||
if (civInfo.nation.unique == UniqueAbility.TRADE_CARAVANS) goldFromTradeRoute += 1
|
||||
if (civInfo.policies.hasEffect("Maintenance on roads & railroads reduced by 33%, +2 gold from all trade routes")) goldFromTradeRoute += 2
|
||||
if (civInfo.containsBuildingUnique("Gold from all trade routes +25%")) goldFromTradeRoute *= 1.25 // Machu Pichu speciality
|
||||
if (civInfo.hasUnique("Gold from all trade routes +25%")) goldFromTradeRoute *= 1.25 // Machu Pichu speciality
|
||||
stats.gold += goldFromTradeRoute.toFloat()
|
||||
}
|
||||
return stats
|
||||
|
@ -195,7 +195,7 @@ class CityStats {
|
|||
unhappinessFromCitizens *= 1.5f
|
||||
else if (hasExtraAnnexUnhappiness())
|
||||
unhappinessFromCitizens *= 2f
|
||||
if (civInfo.containsBuildingUnique("Unhappiness from population decreased by 10%"))
|
||||
if (civInfo.hasUnique("Unhappiness from population decreased by 10%"))
|
||||
unhappinessFromCitizens *= 0.9f
|
||||
if (civInfo.policies.hasEffect("+1 happiness for every city connected to capital, -5% unhappiness from citizens"))
|
||||
unhappinessFromCitizens *= 0.95f
|
||||
|
@ -224,7 +224,7 @@ class CityStats {
|
|||
val happinessFromBuildings = cityInfo.cityConstructions.getStats().happiness.toInt().toFloat()
|
||||
newHappinessList["Buildings"] = happinessFromBuildings
|
||||
|
||||
if (civInfo.containsBuildingUnique("+1 happiness in each city"))
|
||||
if (civInfo.hasUnique("+1 happiness in each city"))
|
||||
newHappinessList["Wonders"] = 1f
|
||||
|
||||
newHappinessList["Tile yields"] = getStatsFromTiles().happiness
|
||||
|
@ -246,7 +246,7 @@ class CityStats {
|
|||
else stats.add(stat, 2f) // science and gold specialists
|
||||
|
||||
if (policies.contains("Secularism")) stats.science += 2
|
||||
if (cityInfo.civInfo.containsBuildingUnique("+1 Production from specialists"))
|
||||
if (cityInfo.civInfo.hasUnique("+1 Production from specialists"))
|
||||
stats.production += 1
|
||||
if(cityInfo.civInfo.nation.unique == UniqueAbility.SCHOLARS_OF_THE_JADE_HALL)
|
||||
stats.science+=2
|
||||
|
@ -297,13 +297,13 @@ class CityStats {
|
|||
val stats = cityInfo.cityConstructions.getStatPercentBonuses()
|
||||
val currentConstruction = cityInfo.cityConstructions.getCurrentConstruction()
|
||||
|
||||
if (cityInfo.civInfo.containsBuildingUnique("Culture in all cities increased by 25%"))
|
||||
if (cityInfo.civInfo.hasUnique("Culture in all cities increased by 25%"))
|
||||
stats.culture += 25f
|
||||
|
||||
if (currentConstruction is Building && currentConstruction.uniques.contains("Spaceship part")) {
|
||||
if (cityInfo.containsBuildingUnique("Increases production of spaceship parts by 15%"))
|
||||
stats.production += 15
|
||||
if (cityInfo.civInfo.containsBuildingUnique("Increases production of spaceship parts by 25%"))
|
||||
if (cityInfo.civInfo.hasUnique("Increases production of spaceship parts by 25%"))
|
||||
stats.production += 25
|
||||
if (cityInfo.containsBuildingUnique("Increases production of spaceship parts by 50%"))
|
||||
stats.production += 50
|
||||
|
|
|
@ -131,7 +131,7 @@ class CivInfoStats(val civInfo: CivilizationInfo){
|
|||
}
|
||||
}
|
||||
|
||||
if (civInfo.containsBuildingUnique("Provides 1 happiness per 2 additional social policies adopted")) {
|
||||
if (civInfo.hasUnique("Provides 1 happiness per 2 additional social policies adopted")) {
|
||||
if(!statMap.containsKey("Policies")) statMap["Policies"]=0f
|
||||
statMap["Policies"] = statMap["Policies"]!! +
|
||||
civInfo.policies.getAdoptedPolicies().count { !it.endsWith("Complete") } / 2
|
||||
|
|
|
@ -118,7 +118,7 @@ class CivInfoTransientUpdater(val civInfo: CivilizationInfo) {
|
|||
|
||||
fun updateHasActiveGreatWall() {
|
||||
civInfo.hasActiveGreatWall = !civInfo.tech.isResearched("Dynamite") &&
|
||||
civInfo.containsBuildingUnique("Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)")
|
||||
civInfo.hasUnique("Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)")
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -177,7 +177,8 @@ class CivilizationInfo {
|
|||
|
||||
fun hasResource(resourceName:String): Boolean = getCivResourcesByName()[resourceName]!!>0
|
||||
|
||||
fun containsBuildingUnique(unique:String) = cities.any { it.containsBuildingUnique(unique) }
|
||||
fun hasUnique(unique:String) = policies.hasEffect(unique)
|
||||
|| cities.any { it.containsBuildingUnique(unique) }
|
||||
|
||||
|
||||
//region Units
|
||||
|
|
|
@ -27,7 +27,7 @@ class GoldenAgeManager{
|
|||
|
||||
fun enterGoldenAge() {
|
||||
var turnsToGoldenAge = 10.0
|
||||
if (civInfo.containsBuildingUnique("Golden Age length increases +50%")) turnsToGoldenAge *= 1.5
|
||||
if (civInfo.hasUnique("Golden Age length increases +50%")) turnsToGoldenAge *= 1.5
|
||||
if(civInfo.nation.unique == UniqueAbility.ACHAEMENID_LEGACY )
|
||||
turnsToGoldenAge*=1.5
|
||||
if (civInfo.policies.isAdopted("Freedom Complete")) turnsToGoldenAge *= 1.5
|
||||
|
|
|
@ -67,7 +67,7 @@ class PolicyManager {
|
|||
if (hasEffect("Each city founded increases culture cost of policies 33% less than normal. Starts a golden age."))
|
||||
cityModifier *= (2 / 3f)
|
||||
if (isAdopted("Piety Complete")) policyCultureCost *= 0.9
|
||||
if (civInfo.containsBuildingUnique("Culture cost of adopting new Policies reduced by 10%"))
|
||||
if (civInfo.hasUnique("Culture cost of adopting new Policies reduced by 10%"))
|
||||
policyCultureCost *= 0.9
|
||||
if (civInfo.isPlayerCivilization())
|
||||
policyCultureCost *= civInfo.getDifficulty().policyCostModifier
|
||||
|
|
|
@ -8,7 +8,6 @@ import com.unciv.UniqueAbility
|
|||
import com.unciv.logic.map.MapSize
|
||||
import com.unciv.logic.map.RoadStatus
|
||||
import com.unciv.models.ruleset.tech.Technology
|
||||
import com.unciv.models.ruleset.unit.BaseUnit
|
||||
import com.unciv.ui.utils.withItem
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
@ -172,7 +171,7 @@ class TechManager {
|
|||
var researchAgreementModifier = 0.5f
|
||||
if (civInfo.policies.isAdopted("Scientific Revolution"))
|
||||
researchAgreementModifier += 0.25f
|
||||
if (civInfo.containsBuildingUnique("Science gained from research agreements +50%"))
|
||||
if (civInfo.hasUnique("Science gained from research agreements +50%"))
|
||||
researchAgreementModifier += 0.25f
|
||||
return (scienceFromResearchAgreements / 3 * researchAgreementModifier).toInt()
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@ import com.unciv.logic.civilization.CivilizationInfo
|
|||
import com.unciv.logic.map.action.MapUnitAction
|
||||
import com.unciv.logic.map.action.StringAction
|
||||
import com.unciv.models.ruleset.Ruleset
|
||||
import com.unciv.models.ruleset.tile.TerrainType
|
||||
import com.unciv.models.ruleset.unit.BaseUnit
|
||||
import com.unciv.models.ruleset.unit.UnitType
|
||||
import java.text.DecimalFormat
|
||||
|
@ -104,7 +103,7 @@ class MapUnit {
|
|||
movement += getUniques().count { it == "+1 Movement" }
|
||||
|
||||
if (type.isWaterUnit() && !type.isCivilian()
|
||||
&& civInfo.containsBuildingUnique("All military naval units receive +1 movement and +1 sight"))
|
||||
&& civInfo.hasUnique("All military naval units receive +1 movement and +1 sight"))
|
||||
movement += 1
|
||||
|
||||
if (type.isWaterUnit() && civInfo.nation.unique == UniqueAbility.SUN_NEVER_SETS)
|
||||
|
@ -164,7 +163,7 @@ class MapUnit {
|
|||
if (civInfo.nation.unique == UniqueAbility.MANIFEST_DESTINY)
|
||||
visibilityRange += 1
|
||||
if (type.isWaterUnit() && !type.isCivilian()
|
||||
&& civInfo.containsBuildingUnique("All military naval units receive +1 movement and +1 sight"))
|
||||
&& civInfo.hasUnique("All military naval units receive +1 movement and +1 sight"))
|
||||
visibilityRange += 1
|
||||
if (isEmbarked() && civInfo.nation.unique == UniqueAbility.WAYFINDING)
|
||||
visibilityRange += 1
|
||||
|
@ -266,7 +265,7 @@ class MapUnit {
|
|||
var goldCostOfUpgrade = (unitToUpgradeTo.cost - baseUnit().cost) * 2 + 10
|
||||
if (civInfo.policies.isAdopted("Professional Army"))
|
||||
goldCostOfUpgrade = (goldCostOfUpgrade * 0.66f).toInt()
|
||||
if(civInfo.containsBuildingUnique("Gold cost of upgrading military units reduced by 33%"))
|
||||
if(civInfo.hasUnique("Gold cost of upgrading military units reduced by 33%"))
|
||||
goldCostOfUpgrade = (goldCostOfUpgrade * 0.66f).toInt()
|
||||
if(goldCostOfUpgrade<0) return 0 // For instance, Landsknecht costs less than Spearman, so upgrading would cost negative gold
|
||||
return goldCostOfUpgrade
|
||||
|
|
|
@ -176,7 +176,7 @@ open class TileInfo {
|
|||
if (unique.equalsPlaceholderText("[] from [] tiles")) {
|
||||
val placeholderParams = unique.getPlaceholderParameters()
|
||||
val tileType = placeholderParams[1]
|
||||
if (baseTerrain == tileType || terrainFeature == tileType || resource == tileType)
|
||||
if (baseTerrain == tileType || terrainFeature == tileType || resource == tileType || improvement == tileType)
|
||||
stats.add(Stats.parse(placeholderParams[0]))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -156,7 +156,7 @@ class Building : NamedStats(), IConstruction{
|
|||
stats.culture += 2f
|
||||
|
||||
if (baseBuildingName == "Castle"
|
||||
&& civInfo.containsBuildingUnique("+1 happiness, +2 culture and +3 gold from every Castle")){
|
||||
&& civInfo.hasUnique("+1 happiness, +2 culture and +3 gold from every Castle")){
|
||||
stats.happiness+=1
|
||||
stats.culture+=2
|
||||
stats.gold+=3
|
||||
|
@ -220,7 +220,7 @@ class Building : NamedStats(), IConstruction{
|
|||
// https://forums.civfanatics.com/threads/rush-buying-formula.393892/
|
||||
var cost = (30 * getProductionCost(civInfo)).toDouble().pow(0.75) * (1 + hurryCostModifier / 100)
|
||||
if (civInfo.policies.hasEffect("-25% to purchasing items in cities")) cost *= 0.75
|
||||
if (civInfo.containsBuildingUnique("-15% to purchasing items in cities")) cost *= 0.85
|
||||
if (civInfo.hasUnique("-15% to purchasing items in cities")) cost *= 0.85
|
||||
if (civInfo.policies.hasEffect( "Cost of purchasing culture buildings reduced by 50%")
|
||||
&& culture !=0f && !isWonder)
|
||||
cost *= 0.5
|
||||
|
@ -331,7 +331,7 @@ class Building : NamedStats(), IConstruction{
|
|||
}
|
||||
|
||||
if ("Spaceship part" in uniques) {
|
||||
if (!civInfo.containsBuildingUnique("Enables construction of Spaceship parts")) return "Apollo project not built!"
|
||||
if (!civInfo.hasUnique("Enables construction of Spaceship parts")) return "Apollo project not built!"
|
||||
if (civInfo.victoryManager.unconstructedSpaceshipParts()[name] == 0) return "Don't need to build any more of these!"
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ class TileImprovement : NamedStats() {
|
|||
|
||||
fun getTurnsToBuild(civInfo: CivilizationInfo): Int {
|
||||
var realTurnsToBuild = turnsToBuild.toFloat() * civInfo.gameInfo.gameParameters.gameSpeed.modifier
|
||||
if (civInfo.containsBuildingUnique("Worker construction increased 25%"))
|
||||
if (civInfo.hasUnique("Worker construction increased 25%"))
|
||||
realTurnsToBuild *= 0.75f
|
||||
if (civInfo.policies.isAdopted("Citizenship"))
|
||||
realTurnsToBuild *= 0.75f
|
||||
|
|
|
@ -104,7 +104,7 @@ class BaseUnit : INamed, IConstruction {
|
|||
var cost = getBaseGoldCost()
|
||||
if (civInfo.policies.adoptedPolicies.contains("Mercantilism")) cost *= 0.75
|
||||
if (civInfo.policies.adoptedPolicies.contains("Militarism")) cost *= 0.66f
|
||||
if (civInfo.containsBuildingUnique("-15% to purchasing items in cities")) cost *= 0.85
|
||||
if (civInfo.hasUnique("-15% to purchasing items in cities")) cost *= 0.85
|
||||
return (cost / 10).toInt() * 10 // rounded down o nearest ten
|
||||
}
|
||||
|
||||
|
@ -133,7 +133,7 @@ class BaseUnit : INamed, IConstruction {
|
|||
if (civInfo.gameInfo.ruleSet.units.values.any { it.uniqueTo==civInfo.civName && it.replaces==name }) return "Our unique unit replaces this"
|
||||
if (!civInfo.gameInfo.gameParameters.nuclearWeaponsEnabled
|
||||
&& uniques.contains("Requires Manhattan Project")) return "Disabled by setting"
|
||||
if (uniques.contains("Requires Manhattan Project") && !civInfo.containsBuildingUnique("Enables nuclear weapon"))
|
||||
if (uniques.contains("Requires Manhattan Project") && !civInfo.hasUnique("Enables nuclear weapon"))
|
||||
return "Requires Manhattan Project"
|
||||
if (requiredResource!=null && !civInfo.hasResource(requiredResource!!)) return "Consumes 1 [$requiredResource]"
|
||||
if (name == Constants.settler && civInfo.isCityState()) return "No settler for city-states"
|
||||
|
|
|
@ -128,7 +128,7 @@ class VictoryScreen(val worldScreen: WorldScreen) : PickerScreen() {
|
|||
val t = Table()
|
||||
t.defaults().pad(5f)
|
||||
t.add(getMilestone("Built Apollo Program",
|
||||
playerCivInfo.containsBuildingUnique("Enables construction of Spaceship parts"))).row()
|
||||
playerCivInfo.hasUnique("Enables construction of Spaceship parts"))).row()
|
||||
|
||||
val victoryManager= playerCivInfo.victoryManager
|
||||
|
||||
|
|
|
@ -642,7 +642,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() {
|
|||
viewingCiv.getKnownCivs().asSequence().filter { viewingCiv.isAtWarWith(it) }
|
||||
.flatMap { it.cities.asSequence() }.any { viewingCiv.exploredTiles.contains(it.location) }
|
||||
}
|
||||
displayTutorial(Tutorial.ApolloProgram) { viewingCiv.containsBuildingUnique("Enables construction of Spaceship parts") }
|
||||
displayTutorial(Tutorial.ApolloProgram) { viewingCiv.hasUnique("Enables construction of Spaceship parts") }
|
||||
displayTutorial(Tutorial.SiegeUnits) { viewingCiv.getCivUnits().any { it.type == UnitType.Siege } }
|
||||
displayTutorial(Tutorial.Embarking) { viewingCiv.tech.getTechUniques().contains("Enables embarkation for land units") }
|
||||
displayTutorial(Tutorial.NaturalWonders) { viewingCiv.naturalWonders.size > 0 }
|
||||
|
|
Loading…
Reference in a new issue