Enable ModOptions uniques and ModConstants from non-base mods (#6345)

* Enable ModOptions uniques and ModConstants from non-base mods

* Update ModConstants.merge for new ModConstants values
This commit is contained in:
SomeTroglodyte 2022-03-25 15:30:51 +01:00 committed by GitHub
parent 7f3b075ac4
commit dd529db297
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 19 deletions

View File

@ -2,6 +2,7 @@ package com.unciv.models
class ModConstants { class ModConstants {
// Max amount of experience that can be gained from combat with barbarians // Max amount of experience that can be gained from combat with barbarians
@Suppress("SpellCheckingInspection") // Pfrom is not a word ;)
var maxXPfromBarbarians = 30 var maxXPfromBarbarians = 30
// Formula for city Strength: // Formula for city Strength:
@ -11,12 +12,12 @@ class ModConstants {
// defensiveBuildingStrength // defensiveBuildingStrength
// where %techs is the percentage of techs in the tech tree that are complete // where %techs is the percentage of techs in the tech tree that are complete
// If no techs exist in this ruleset, %techs = 0.5 (=50%) // If no techs exist in this ruleset, %techs = 0.5 (=50%)
val cityStrengthBase = 8.0 var cityStrengthBase = 8.0
val cityStrengthPerPop = 0.4 var cityStrengthPerPop = 0.4
val cityStrengthFromTechsMultiplier = 5.5 var cityStrengthFromTechsMultiplier = 5.5
val cityStrengthFromTechsExponent = 2.8 var cityStrengthFromTechsExponent = 2.8
val cityStrengthFromTechsFullMultiplier = 1.0 var cityStrengthFromTechsFullMultiplier = 1.0
val cityStrengthFromGarrison = 0.2 var cityStrengthFromGarrison = 0.2
// Formula for Unit Supply: // Formula for Unit Supply:
// Supply = unitSupplyBase (difficulties.json) // Supply = unitSupplyBase (difficulties.json)
@ -24,30 +25,54 @@ class ModConstants {
// unitSupplyPerPopulation * amountOfPopulationInAllCities // unitSupplyPerPopulation * amountOfPopulationInAllCities
// unitSupplyBase and unitSupplyPerCity can be found in difficulties.json // unitSupplyBase and unitSupplyPerCity can be found in difficulties.json
// unitSupplyBase, unitSupplyPerCity and unitSupplyPerPopulation can also be increased through uniques // unitSupplyBase, unitSupplyPerCity and unitSupplyPerPopulation can also be increased through uniques
val unitSupplyPerPopulation = 0.5 var unitSupplyPerPopulation = 0.5
// The minimal distance that must be between any two cities, not counting the tiles cities are on // The minimal distance that must be between any two cities, not counting the tiles cities are on
// The number is the amount of tiles between two cities, not counting the tiles the cities are on. // The number is the amount of tiles between two cities, not counting the tiles the cities are on.
// e.g. "C__C", where "C" is a tile with a city and "_" is a tile without a city, has a distance of 2. // e.g. "C__C", where "C" is a tile with a city and "_" is a tile without a city, has a distance of 2.
// First constant is for cities on the same landmass, the second is for cities on different continents. // First constant is for cities on the same landmass, the second is for cities on different continents.
val minimalCityDistance = 3 var minimalCityDistance = 3
val minimalCityDistanceOnDifferentContinents = 2 var minimalCityDistanceOnDifferentContinents = 2
// NaturalWonderGenerator uses these to determine the number of Natural Wonders to spawn for a given map size. // NaturalWonderGenerator uses these to determine the number of Natural Wonders to spawn for a given map size.
// With these values, radius * mul + add gives a 1-2-3-4-5 progression for Unciv predefined map sizes and a 2-3-4-5-6-7 progression for the original Civ5 map sizes. // With these values, radius * mul + add gives a 1-2-3-4-5 progression for Unciv predefined map sizes and a 2-3-4-5-6-7 progression for the original Civ5 map sizes.
// 0.124 = (Civ5.Huge.getHexagonalRadiusForArea(w*h) - Civ5.Duel.getHexagonalRadiusForArea(w*h)) / 5 (if you do not round in the radius function) // 0.124 = (Civ5.Huge.getHexagonalRadiusForArea(w*h) - Civ5.Duel.getHexagonalRadiusForArea(w*h)) / 5 (if you do not round in the radius function)
// The other constant is empiric to avoid an ugly jump in the progression. // The other constant is empiric to avoid an ugly jump in the progression.
val naturalWonderCountMultiplier = 0.124f var naturalWonderCountMultiplier = 0.124f
val naturalWonderCountAddedConstant = 0.1f var naturalWonderCountAddedConstant = 0.1f
// MapGenerator.spreadAncientRuins: number of ruins = suitable tile count * this // MapGenerator.spreadAncientRuins: number of ruins = suitable tile count * this
val ancientRuinCountMultiplier = 0.02f var ancientRuinCountMultiplier = 0.02f
// MapGenerator.spawnIce: spawn Ice where T < this, with T calculated from temperatureExtremeness, latitude and perlin noise. // MapGenerator.spawnIce: spawn Ice where T < this, with T calculated from temperatureExtremeness, latitude and perlin noise.
val spawnIceBelowTemperature = -0.8f val spawnIceBelowTemperature = -0.8f
// MapGenerator.spawnLakesAndCoasts: Water bodies up to this tile count become Lakes // MapGenerator.spawnLakesAndCoasts: Water bodies up to this tile count become Lakes
val maxLakeSize = 10 var maxLakeSize = 10
// RiverGenerator: river frequency and length bounds // RiverGenerator: river frequency and length bounds
val riverCountMultiplier = 0.01f var riverCountMultiplier = 0.01f
val minRiverLength = 5 var minRiverLength = 5
val maxRiverLength = 666 // Do not set < max map radius var maxRiverLength = 666 // Do not set < max map radius
fun merge(other: ModConstants) {
if (other.maxXPfromBarbarians != defaults.maxXPfromBarbarians) maxXPfromBarbarians = other.maxXPfromBarbarians
if (other.cityStrengthBase != defaults.cityStrengthBase) cityStrengthBase = other.cityStrengthBase
if (other.cityStrengthPerPop != defaults.cityStrengthPerPop) cityStrengthPerPop = other.cityStrengthPerPop
if (other.cityStrengthFromTechsMultiplier != defaults.cityStrengthFromTechsMultiplier) cityStrengthFromTechsMultiplier = other.cityStrengthFromTechsMultiplier
if (other.cityStrengthFromTechsExponent != defaults.cityStrengthFromTechsExponent) cityStrengthFromTechsExponent = other.cityStrengthFromTechsExponent
if (other.cityStrengthFromTechsFullMultiplier != defaults.cityStrengthFromTechsFullMultiplier) cityStrengthFromTechsFullMultiplier = other.cityStrengthFromTechsFullMultiplier
if (other.cityStrengthFromGarrison != defaults.cityStrengthFromGarrison) cityStrengthFromGarrison = other.cityStrengthFromGarrison
if (other.unitSupplyPerPopulation != defaults.unitSupplyPerPopulation) unitSupplyPerPopulation = other.unitSupplyPerPopulation
if (other.minimalCityDistance != defaults.minimalCityDistance) minimalCityDistance = other.minimalCityDistance
if (other.minimalCityDistanceOnDifferentContinents != defaults.minimalCityDistanceOnDifferentContinents) minimalCityDistanceOnDifferentContinents = other.minimalCityDistanceOnDifferentContinents
if (other.naturalWonderCountMultiplier != defaults.naturalWonderCountMultiplier) naturalWonderCountMultiplier = other.naturalWonderCountMultiplier
if (other.naturalWonderCountAddedConstant != defaults.naturalWonderCountAddedConstant) naturalWonderCountAddedConstant = other.naturalWonderCountAddedConstant
if (other.ancientRuinCountMultiplier != defaults.ancientRuinCountMultiplier) ancientRuinCountMultiplier = other.ancientRuinCountMultiplier
if (other.maxLakeSize != defaults.maxLakeSize) maxLakeSize = other.maxLakeSize
if (other.riverCountMultiplier != defaults.riverCountMultiplier) riverCountMultiplier = other.riverCountMultiplier
if (other.minRiverLength != defaults.minRiverLength) minRiverLength = other.minRiverLength
if (other.maxRiverLength != defaults.maxRiverLength) maxRiverLength = other.maxRiverLength
}
companion object {
val defaults = ModConstants()
}
} }

View File

@ -133,6 +133,8 @@ class Ruleset {
units.putAll(ruleset.units) units.putAll(ruleset.units)
unitTypes.putAll(ruleset.unitTypes) unitTypes.putAll(ruleset.unitTypes)
for (unitToRemove in ruleset.modOptions.unitsToRemove) units.remove(unitToRemove) for (unitToRemove in ruleset.modOptions.unitsToRemove) units.remove(unitToRemove)
modOptions.uniques.addAll(ruleset.modOptions.uniques)
modOptions.constants.merge(ruleset.modOptions.constants)
mods += ruleset.mods mods += ruleset.mods
} }
@ -864,11 +866,11 @@ object RulesetCache : HashMap<String,Ruleset>() {
baseRuleset baseRuleset
for (mod in loadedMods.sortedByDescending { it.modOptions.isBaseRuleset }) { for (mod in loadedMods.sortedByDescending { it.modOptions.isBaseRuleset }) {
newRuleset.add(mod)
newRuleset.mods += mod.name
if (mod.modOptions.isBaseRuleset) { if (mod.modOptions.isBaseRuleset) {
newRuleset.modOptions = mod.modOptions newRuleset.modOptions = mod.modOptions
} }
newRuleset.add(mod)
newRuleset.mods += mod.name
} }
newRuleset.updateBuildingCosts() // only after we've added all the mods can we calculate the building costs newRuleset.updateBuildingCosts() // only after we've added all the mods can we calculate the building costs

View File

@ -22,7 +22,7 @@ import com.unciv.ui.utils.*
class MapEditorScreen(): BaseScreen() { class MapEditorScreen(): BaseScreen() {
var mapName = "" var mapName = ""
var tileMap = TileMap() var tileMap = TileMap()
var ruleset = Ruleset().apply { add(RulesetCache.getVanillaRuleset()) } var ruleset = RulesetCache.getVanillaRuleset() // This will return a clone
var gameSetupInfo = GameSetupInfo() var gameSetupInfo = GameSetupInfo()
lateinit var mapHolder: EditorMapHolder lateinit var mapHolder: EditorMapHolder