mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-26 05:14:32 -04:00
Merged Building and Policy unique activations
Added Tech link checks for loaded mods
This commit is contained in:
parent
e7c0710042
commit
acf803de28
@ -3,6 +3,7 @@ package com.unciv.logic.civilization
|
|||||||
import com.unciv.Constants
|
import com.unciv.Constants
|
||||||
import com.unciv.models.ruleset.Policy
|
import com.unciv.models.ruleset.Policy
|
||||||
import com.unciv.models.ruleset.UniqueMap
|
import com.unciv.models.ruleset.UniqueMap
|
||||||
|
import com.unciv.models.ruleset.UniqueTriggerActivation
|
||||||
import com.unciv.models.ruleset.VictoryType
|
import com.unciv.models.ruleset.VictoryType
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
import kotlin.math.pow
|
import kotlin.math.pow
|
||||||
@ -133,31 +134,8 @@ class PolicyManager {
|
|||||||
val hasCapital = civInfo.cities.any { it.isCapital() }
|
val hasCapital = civInfo.cities.any { it.isCapital() }
|
||||||
|
|
||||||
for (unique in policy.uniqueObjects)
|
for (unique in policy.uniqueObjects)
|
||||||
when (unique.placeholderText) {
|
UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo)
|
||||||
"Free [] appears" -> {
|
|
||||||
val unitName = unique.params[0]
|
|
||||||
if (hasCapital && (unitName != Constants.settler || !civInfo.isOneCityChallenger()))
|
|
||||||
civInfo.addUnit(unitName, civInfo.getCapital())
|
|
||||||
}
|
|
||||||
"Free Social Policy" -> freePolicies++
|
|
||||||
"Empire enters golden age" ->
|
|
||||||
civInfo.goldenAges.enterGoldenAge()
|
|
||||||
"Free Great Person" -> {
|
|
||||||
if (civInfo.isPlayerCivilization()) civInfo.greatPeople.freeGreatPeople++
|
|
||||||
else {
|
|
||||||
val preferredVictoryType = civInfo.victoryType()
|
|
||||||
val greatPerson = when (preferredVictoryType) {
|
|
||||||
VictoryType.Cultural -> "Great Artist"
|
|
||||||
VictoryType.Scientific -> "Great Scientist"
|
|
||||||
else ->
|
|
||||||
civInfo.gameInfo.ruleSet.units.keys.filter { it.startsWith("Great") }.random()
|
|
||||||
}
|
|
||||||
civInfo.addUnit(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
|
|
||||||
}
|
|
||||||
tryAddLegalismBuildings()
|
tryAddLegalismBuildings()
|
||||||
|
|
||||||
// This ALSO has the side-effect of updating the CivInfo statForNextTurn so we don't need to call it explicitly
|
// This ALSO has the side-effect of updating the CivInfo statForNextTurn so we don't need to call it explicitly
|
||||||
|
@ -345,18 +345,16 @@ class Building : NamedStats(), IConstruction {
|
|||||||
if (providesFreeBuilding != null && !cityConstructions.containsBuildingOrEquivalent(providesFreeBuilding!!)) {
|
if (providesFreeBuilding != null && !cityConstructions.containsBuildingOrEquivalent(providesFreeBuilding!!)) {
|
||||||
var buildingToAdd = providesFreeBuilding!!
|
var buildingToAdd = providesFreeBuilding!!
|
||||||
|
|
||||||
for(building in civInfo.gameInfo.ruleSet.buildings.values)
|
for (building in civInfo.gameInfo.ruleSet.buildings.values)
|
||||||
if(building.replaces == buildingToAdd && building.uniqueTo==civInfo.civName)
|
if (building.replaces == buildingToAdd && building.uniqueTo == civInfo.civName)
|
||||||
buildingToAdd = building.name
|
buildingToAdd = building.name
|
||||||
|
|
||||||
cityConstructions.addBuilding(buildingToAdd)
|
cityConstructions.addBuilding(buildingToAdd)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("Empire enters golden age" in uniques) civInfo.goldenAges.enterGoldenAge()
|
for (unique in uniqueObjects)
|
||||||
for(unique in uniqueObjects.filter { it.placeholderText == "Free [] appears" }) {
|
UniqueTriggerActivation.triggerCivwideUnique(unique, civInfo)
|
||||||
val unitName = unique.params[0]
|
|
||||||
civInfo.addUnit(unitName, cityConstructions.cityInfo)
|
|
||||||
}
|
|
||||||
if ("2 free Great Artists appear" in uniques) {
|
if ("2 free Great Artists appear" in uniques) {
|
||||||
civInfo.addUnit("Great Artist", cityConstructions.cityInfo)
|
civInfo.addUnit("Great Artist", cityConstructions.cityInfo)
|
||||||
civInfo.addUnit("Great Artist", cityConstructions.cityInfo)
|
civInfo.addUnit("Great Artist", cityConstructions.cityInfo)
|
||||||
@ -369,23 +367,9 @@ class Building : NamedStats(), IConstruction {
|
|||||||
civInfo.addUnit(Constants.worker, cityConstructions.cityInfo)
|
civInfo.addUnit(Constants.worker, cityConstructions.cityInfo)
|
||||||
civInfo.addUnit(Constants.worker, cityConstructions.cityInfo)
|
civInfo.addUnit(Constants.worker, cityConstructions.cityInfo)
|
||||||
}
|
}
|
||||||
if ("Free Social Policy" in uniques) civInfo.policies.freePolicies++
|
|
||||||
if ("Free Great Person" in uniques) {
|
|
||||||
if (civInfo.isPlayerCivilization()) civInfo.greatPeople.freeGreatPeople++
|
|
||||||
else civInfo.addUnit(civInfo.gameInfo.ruleSet.units.keys.filter { it.startsWith("Great") }.random())
|
|
||||||
}
|
|
||||||
if ("+1 population in each city" in uniques) {
|
|
||||||
for(city in civInfo.cities){
|
|
||||||
city.population.population += 1
|
|
||||||
city.population.autoAssignPopulation()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ("Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)" in uniques)
|
if ("Enemy land units must spend 1 extra movement point when inside your territory (obsolete upon Dynamite)" in uniques)
|
||||||
civInfo.updateHasActiveGreatWall()
|
civInfo.updateHasActiveGreatWall()
|
||||||
|
|
||||||
if("Free Technology" in uniques) civInfo.tech.freeTechs += 1
|
|
||||||
|
|
||||||
|
|
||||||
cityConstructions.cityInfo.cityStats.update() // new building, new stats
|
cityConstructions.cityInfo.cityStats.update() // new building, new stats
|
||||||
civInfo.updateDetailedCivResources() // this building/unit could be a resource-requiring one
|
civInfo.updateDetailedCivResources() // this building/unit could be a resource-requiring one
|
||||||
civInfo.transients().updateCitiesConnectedToCapital(false) // could be a connecting building, like a harbor
|
civInfo.transients().updateCitiesConnectedToCapital(false) // could be a connecting building, like a harbor
|
||||||
|
@ -247,6 +247,17 @@ object RulesetCache :HashMap<String,Ruleset>() {
|
|||||||
println("${improvement.name} requires tech ${improvement.techRequired} which does not exist!")
|
println("${improvement.name} requires tech ${improvement.techRequired} which does not exist!")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (tech in modRuleset.technologies.values) {
|
||||||
|
for (prereq in tech.prerequisites) {
|
||||||
|
if (!modRuleset.technologies.containsKey(prereq))
|
||||||
|
println("${tech.name} requires tech $prereq which does not exist!")
|
||||||
|
}
|
||||||
|
for (otherTech in tech.column!!.techs) {
|
||||||
|
if (tech != otherTech && otherTech.row == tech.row)
|
||||||
|
println("${tech.name} is in the same row as ${otherTech.name}!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getBaseRuleset() = this[BaseRuleset.Civ_V_Vanilla.fullName]!!
|
fun getBaseRuleset() = this[BaseRuleset.Civ_V_Vanilla.fullName]!!
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.unciv.models.ruleset
|
package com.unciv.models.ruleset
|
||||||
|
|
||||||
|
import com.unciv.Constants
|
||||||
|
import com.unciv.logic.civilization.CivilizationInfo
|
||||||
import com.unciv.models.translations.getPlaceholderParameters
|
import com.unciv.models.translations.getPlaceholderParameters
|
||||||
import com.unciv.models.translations.getPlaceholderText
|
import com.unciv.models.translations.getPlaceholderText
|
||||||
|
|
||||||
@ -22,3 +24,42 @@ class UniqueMap:HashMap<String, ArrayList<Unique>>() {
|
|||||||
|
|
||||||
fun getAllUniques() = this.asSequence().flatMap { it.value.asSequence() }
|
fun getAllUniques() = this.asSequence().flatMap { it.value.asSequence() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Buildings and policies both have 'triggered' effects, and so may Techs in the future.
|
||||||
|
object UniqueTriggerActivation {
|
||||||
|
fun triggerCivwideUnique(unique: Unique, civInfo: CivilizationInfo) {
|
||||||
|
when (unique.placeholderText) {
|
||||||
|
"Free [] appears" -> {
|
||||||
|
val unitName = unique.params[0]
|
||||||
|
if (civInfo.cities.any { it.isCapital() } && (unitName != Constants.settler || !civInfo.isOneCityChallenger()))
|
||||||
|
civInfo.addUnit(unitName, civInfo.getCapital())
|
||||||
|
}
|
||||||
|
"Free Social Policy" -> civInfo.policies.freePolicies++
|
||||||
|
"Empire enters golden age" ->
|
||||||
|
civInfo.goldenAges.enterGoldenAge()
|
||||||
|
"Free Great Person" -> {
|
||||||
|
if (civInfo.isPlayerCivilization()) civInfo.greatPeople.freeGreatPeople++
|
||||||
|
else {
|
||||||
|
val preferredVictoryType = civInfo.victoryType()
|
||||||
|
val greatPerson = when (preferredVictoryType) {
|
||||||
|
VictoryType.Cultural -> "Great Artist"
|
||||||
|
VictoryType.Scientific -> "Great Scientist"
|
||||||
|
else ->
|
||||||
|
civInfo.gameInfo.ruleSet.units.keys.filter { it.startsWith("Great") }.random()
|
||||||
|
}
|
||||||
|
civInfo.addUnit(greatPerson)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"+1 population in each city" ->
|
||||||
|
for (city in civInfo.cities) {
|
||||||
|
city.population.population += 1
|
||||||
|
city.population.autoAssignPopulation()
|
||||||
|
}
|
||||||
|
"Free Technology" -> civInfo.tech.freeTechs += 1
|
||||||
|
|
||||||
|
"Quantity of strategic resources produced by the empire increased by 100%" -> civInfo.updateDetailedCivResources()
|
||||||
|
"+20% attack bonus to all Military Units for 30 turns" -> civInfo.policies.autocracyCompletedTurns = 30
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
extraImages/GithubPreviewImage.png
Normal file
BIN
extraImages/GithubPreviewImage.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 602 KiB |
Loading…
x
Reference in New Issue
Block a user