Resolves #13540 - Fix ancient ruins not spawning as much as they should

This commit is contained in:
yairm210 2025-07-03 11:01:53 +03:00
parent ede5ebdf75
commit 4f44c7236c
3 changed files with 12 additions and 4 deletions

View File

@ -281,7 +281,8 @@
{
"name": "Ancient ruins",
"terrainsCanBeBuiltOn": ["Land"],
"uniques": ["Unpillagable", "Provides a random bonus when entered", "Unbuildable"]
"uniques": ["Unpillagable", "Provides a random bonus when entered", "Unbuildable",
"Does not need removal of [Forest]", "Does not need removal of [Jungle]"]
},
{
"name": "City ruins",

View File

@ -270,7 +270,8 @@
{
"name": "Ancient ruins",
"terrainsCanBeBuiltOn": ["Land"],
"uniques": ["Unpillagable", "Provides a random bonus when entered", "Unbuildable"]
"uniques": ["Unpillagable", "Provides a random bonus when entered", "Unbuildable",
"Does not need removal of [Forest]", "Does not need removal of [Jungle]"]
},
{
"name": "City ruins",

View File

@ -17,6 +17,7 @@ import com.unciv.models.ruleset.unique.Unique
import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.ui.screens.mapeditorscreen.MapGeneratorSteps
import com.unciv.logic.map.tile.TileNormalizer
import com.unciv.models.ruleset.tile.TileImprovement
import com.unciv.models.ruleset.unique.StateForConditionals
import com.unciv.utils.debug
import kotlinx.coroutines.CoroutineScope
@ -353,13 +354,18 @@ class MapGenerator(val ruleset: Ruleset, private val coroutineScope: CoroutineSc
val ruinsEquivalents = ruleset.tileImprovements.filter { it.value.isAncientRuinsEquivalent() }
if (map.mapParameters.noRuins || ruinsEquivalents.isEmpty() )
return
val suitableTiles = map.values.filter { it.isLand && !it.isImpassible() }
fun isPlaceable(improvement: TileImprovement, tile: Tile) =
tile.improvementFunctions.canImprovementBeBuiltHere(improvement, stateForConditionals = StateForConditionals.IgnoreConditionals)
val suitableTiles = map.values.filter { it.isLand && !it.isImpassible()
&& ruinsEquivalents.values.any { improvement -> isPlaceable(improvement, it) } }
val locations = randomness.chooseSpreadOutLocations(
(suitableTiles.size * ruleset.modOptions.constants.ancientRuinCountMultiplier).roundToInt(),
suitableTiles,
map.mapParameters.mapSize.radius)
for (tile in locations)
tile.improvement = ruinsEquivalents.keys.random()
tile.improvement = ruinsEquivalents.values.filter { isPlaceable(it, tile) }.random().name
}
private fun spreadResources(tileMap: TileMap) {