Converted policies up to Collective Rule

This commit is contained in:
Yair Morgenstern 2020-07-25 22:36:15 +03:00
parent a5f7aee1ea
commit 627283b10b
5 changed files with 58 additions and 36 deletions

View file

@ -2,10 +2,12 @@
{
"name": "Tradition",
"era": "Ancient era",
"effect": "+3 culture in capital and increased rate of border expansion",
"uniques": ["+3 culture in capital", "Increased rate of border expansion"],
"policies": [
{
"name": "Aristocracy",
"effect": "+15% production when constructing wonders, +1 happiness for every 10 citizens in a city",
"uniques": ["+15% production when constructing wonders", "+1 happiness for every 10 citizens in a city"],
"row": 1,
"column": 1
@ -13,18 +15,21 @@
{
"name": "Legalism",
"effect": "Immediately creates a cheapest available cultural building in each of your first 4 cities for free",
"uniques":["Immediately creates a cheapest available cultural building in each of your first 4 cities for free"],
"row": 1,
"column": 3
},
{
"name": "Oligarchy",
"effect": "Units in cities cost no Maintenance, garrisoned city +50% attacking strength",
"uniques": ["Units in cities cost no Maintenance"]
"row": 1,
"column": 5
},
{
"name": "Landed Elite",
"effect": "+10% food growth and +2 food in capital",
"uniques": ["+10% food growth in capital", "[+2 Food] in capital"],
"requires": ["Legalism"],
"row": 2,
"column": 2
@ -32,13 +37,15 @@
{
"name": "Monarchy",
"effect": "+1 gold and -1 unhappiness for every 2 citizens in capital",
"uniques": ["+1 gold and -1 unhappiness for every 2 citizens in capital"],
"requires": ["Legalism"],
"row": 2,
"column": 4
},
{
"name": "Tradition Complete",
"effect": "+15% growth and +2 food in all cities"
"effect": "+15% growth and +2 food in all cities",
"uniques": ["+15% growth in all cities","[+2 Food] in all cities"]
}
]
},
@ -46,10 +53,12 @@
"name": "Liberty",
"era": "Ancient era",
"effect": "+1 culture in every city",
"uniques": ["[+1 Culture] in all cities"],
"policies": [
{
"name": "Collective Rule",
"effect": "Training of settlers increased +50% in capital, receive a new settler near the capital",
"uniques": ["Training of settlers increased +50% in capital", "Free [Settler] appears"]
"row": 1,
"column": 1
},

View file

@ -12,6 +12,8 @@ import com.unciv.models.ruleset.unit.BaseUnit
import com.unciv.models.ruleset.unit.UnitType
import com.unciv.models.stats.Stat
import com.unciv.models.stats.Stats
import com.unciv.models.translations.equalsPlaceholderText
import com.unciv.models.translations.getPlaceholderParameters
class CityStats {
@ -164,9 +166,9 @@ class CityStats {
fun getGrowthBonusFromPolicies(): Float {
var bonus = 0f
if (cityInfo.civInfo.policies.hasEffect("+10% food growth and +2 food in capital") && cityInfo.isCapital())
if (cityInfo.civInfo.hasUnique("+10% food growth in capital") && cityInfo.isCapital())
bonus += 0.1f
if (cityInfo.civInfo.policies.hasEffect("+15% growth and +2 food in all cities"))
if (cityInfo.civInfo.hasUnique("+15% growth in all cities"))
bonus += 0.15f
return bonus
}
@ -264,10 +266,12 @@ class CityStats {
val stats = Stats()
if (adoptedPolicies.hasEffect("+3 culture in capital") && cityInfo.isCapital())
stats.culture += 3f
if (adoptedPolicies.hasEffect("+10% food growth and +2 food in capital") && cityInfo.isCapital())
stats.food += 2f
if (adoptedPolicies.hasEffect("+15% growth and +2 food in all cities"))
stats.food += 2f
for(effect in adoptedPolicies.policyEffects) {
if (effect.equalsPlaceholderText("[] in capital") && cityInfo.isCapital())
stats.add(Stats.parse(effect.getPlaceholderParameters()[0]))
else if(effect.equalsPlaceholderText("[] in all cities"))
stats.add(Stats.parse(effect.getPlaceholderParameters()[0]))
}
if (adoptedPolicies.hasEffect("+1 gold and -1 unhappiness for every 2 citizens in capital") && cityInfo.isCapital())
stats.gold += (cityInfo.population.population / 2).toFloat()
if (adoptedPolicies.hasEffect("+1 culture in every city"))

View file

@ -20,11 +20,10 @@ class CivInfoStats(val civInfo: CivilizationInfo){
val baseUnitCost = 0.5f
val freeUnits = 3
var unitsToPayFor = civInfo.getCivUnits()
if(civInfo.policies.hasEffect("Units in cities cost no Maintenance, garrisoned city +50% attacking strength"))
if(civInfo.hasUnique("Units in cities cost no Maintenance"))
// Only land military units can truly "garrison"
unitsToPayFor = unitsToPayFor.filterNot {
it.getTile().isCityCenter()
&& it.canGarrison()
it.getTile().isCityCenter() && it.canGarrison()
}
var numberOfUnitsToPayFor = max(0f, unitsToPayFor.count().toFloat() - freeUnits)

View file

@ -3,6 +3,10 @@ package com.unciv.logic.civilization
import com.unciv.Constants
import com.unciv.models.ruleset.Policy
import com.unciv.models.ruleset.VictoryType
import com.unciv.models.translations.equalsPlaceholderText
import com.unciv.models.translations.getPlaceholderParameters
import com.unciv.models.translations.getPlaceholderText
import com.unciv.ui.utils.withItem
import kotlin.math.min
import kotlin.math.pow
import kotlin.math.roundToInt
@ -126,32 +130,36 @@ class PolicyManager {
}
val hasCapital = civInfo.cities.any { it.isCapital() }
when (policy.effect) {
"Training of settlers increased +50% in capital, receive a new settler near the capital" ->
if (hasCapital && !civInfo.isOneCityChallenger())
civInfo.placeUnitNearTile(civInfo.getCapital().location, Constants.settler)
"Tile improvement speed +25%, receive a free worker near the capital" ->
if (hasCapital) civInfo.placeUnitNearTile(civInfo.getCapital().location, Constants.worker)
"+1 culture for each monument, temple and monastery. Gain a free policy." -> freePolicies++
"Each city founded increases culture cost of policies 33% less than normal. Starts a golden age.",
"+33% culture in all cities with a world wonder, immediately enter a golden age" ->
civInfo.goldenAges.enterGoldenAge()
"Free Great Person of choice near capital" -> {
if (civInfo.isPlayerCivilization()) civInfo.greatPeople.freeGreatPeople++
else {
val preferredVictoryType = civInfo.victoryType()
val greatPerson = when (preferredVictoryType) {
VictoryType.Cultural -> "Great Artist"
VictoryType.Scientific -> "Great Scientist"
VictoryType.Domination, VictoryType.Neutral ->
civInfo.gameInfo.ruleSet.units.keys.filter { it.startsWith("Great") }.random()
}
civInfo.addGreatPerson(greatPerson)
for(effect in policy.uniques.withItem(policy.effect))
when (effect.getPlaceholderText()) {
"Free [] appears" -> {
val unitName = effect.getPlaceholderParameters()[0]
if (hasCapital && (unitName != Constants.settler || !civInfo.isOneCityChallenger()))
civInfo.placeUnitNearTile(civInfo.getCapital().location, unitName)
}
"Tile improvement speed +25%, receive a free worker near the capital" ->
if (hasCapital) civInfo.placeUnitNearTile(civInfo.getCapital().location, Constants.worker)
"+1 culture for each monument, temple and monastery. Gain a free policy." -> freePolicies++
"Each city founded increases culture cost of policies 33% less than normal. Starts a golden age.",
"+33% culture in all cities with a world wonder, immediately enter a golden age" ->
civInfo.goldenAges.enterGoldenAge()
"Free Great Person of choice near capital" -> {
if (civInfo.isPlayerCivilization()) civInfo.greatPeople.freeGreatPeople++
else {
val preferredVictoryType = civInfo.victoryType()
val greatPerson = when (preferredVictoryType) {
VictoryType.Cultural -> "Great Artist"
VictoryType.Scientific -> "Great Scientist"
VictoryType.Domination, VictoryType.Neutral ->
civInfo.gameInfo.ruleSet.units.keys.filter { it.startsWith("Great") }.random()
}
civInfo.addGreatPerson(greatPerson)
}
}
"Quantity of strategic resources produced by the empire increased by 100%" -> civInfo.updateDetailedCivResources()
"+20% attack bonus to all Military Units for 30 turns" -> autocracyCompletedTurns = 30
}
"Quantity of strategic resources produced by the empire increased by 100%" -> civInfo.updateDetailedCivResources()
"+20% attack bonus to all Military Units for 30 turns" -> autocracyCompletedTurns = 30
}
tryAddLegalismBuildings()
// This ALSO has the side-effect of updating the CivInfo statForNextTurn so we don't need to call it explicitly
@ -162,7 +170,7 @@ class PolicyManager {
}
fun tryAddLegalismBuildings() {
if(!civInfo.policies.hasEffect("Immediately creates a cheapest available cultural building in each of your first 4 cities for free"))
if(!civInfo.hasUnique("Immediately creates a cheapest available cultural building in each of your first 4 cities for free"))
return
if(legalismState.size >= 4) return

View file

@ -275,9 +275,11 @@ fun String.tr(): String {
return UncivGame.Current.translations.getText(this, UncivGame.Current.settings.language, activeMods)
}
fun String.getPlaceholderText() = this.replace(squareBraceRegex, "[]")
fun String.equalsPlaceholderText(str:String): Boolean {
if (first() != str.first()) return false // for quick negative return 95% of the time
return this.replace(squareBraceRegex, "[]") == str
return this.getPlaceholderText() == str
}
fun String.getPlaceholderParameters() = squareBraceRegex.findAll(this).map { it.groups[1]!!.value }.toList()