Updated canBeSettled to be able to settle water mountain tiles (#13717)

* Update for PR

* Added doc to ConditionalInTiles

* update

* cut down on the code update
This commit is contained in:
General_E 2025-08-01 12:12:21 +02:00 committed by GitHub
parent 95eb97d517
commit cfc640d0ee
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 30 additions and 9 deletions

View File

@ -19,6 +19,7 @@ import com.unciv.logic.map.mapgenerator.MapResourceSetting
import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.logic.map.mapunit.UnitTurnManager
import com.unciv.logic.map.mapunit.movement.UnitMovement
import com.unciv.models.UnitAction
import com.unciv.models.ruleset.Ruleset
import com.unciv.models.ruleset.tile.ResourceType
import com.unciv.models.ruleset.tile.Terrain
@ -630,13 +631,28 @@ class Tile : IsPartOfGameInfoSerialization, Json.Serializable {
return min(distance, wrappedDistance).toInt()
}
@Readonly
fun canBeSettled(): Boolean {
fun canBeSettled(unitCanFoundUnique: Unique?=null): Boolean {
val modConstants = tileMap.gameInfo.ruleset.modOptions.constants
var addedDistanceBeweenContinents: Int
var canSettleInTileWithUnique = false
if (unitCanFoundUnique != null) {
canSettleInTileWithUnique = (isWater || isImpassible()) &&
unitCanFoundUnique.getModifiers(UniqueType.ConditionalInTiles).none{
matchesFilter(it.params[0])
}
}
/*
Putting the ! to make sure the player/Ai doesn't place cities too near each other.
Because when .none return False when one element has a match.
*/
addedDistanceBeweenContinents = if (!canSettleInTileWithUnique) 1 else 0
return when {
isWater || isImpassible() -> false
getTilesInDistance(modConstants.minimalCityDistanceOnDifferentContinents)
canSettleInTileWithUnique -> false
getTilesInDistance(modConstants.minimalCityDistanceOnDifferentContinents+
addedDistanceBeweenContinents)
.any { it.isCityCenter() && it.getContinent() != getContinent() } -> false
getTilesInDistance(modConstants.minimalCityDistance)
.any { it.isCityCenter() && it.getContinent() == getContinent() } -> false

View File

@ -291,11 +291,12 @@ class Ruleset {
personalities.clear()
events.clear()
}
@Readonly fun allRulesetObjects(): Sequence<IRulesetObject> = RulesetFile.entries.asSequence().flatMap { it.getRulesetObjects(this) }
@Readonly fun allUniques(): Sequence<Unique> = RulesetFile.entries.asSequence().flatMap { it.getUniques(this) }
@Readonly fun allICivilopediaText(): Sequence<ICivilopediaText> = allRulesetObjects() + events.values.flatMap { it.choices }
fun load(folderHandle: FileHandle) {
// Note: Most files are loaded using createHashmap, which sets originRuleset automatically.
// For other files containing IRulesetObject's we'll have to remember to do so manually - e.g. Tech.

View File

@ -187,6 +187,7 @@ class Terrain : RulesetStatsObject() {
type.name -> true
"Natural Wonder" -> type == TerrainType.NaturalWonder
"Terrain Feature" -> type == TerrainType.TerrainFeature
"Impassable" -> impassable
else -> false
}

View File

@ -805,7 +805,8 @@ enum class UniqueType(
/////// tile conditionals
ConditionalNeighborTiles("with [nonNegativeAmount] to [nonNegativeAmount] neighboring [tileFilter] tiles", UniqueTarget.Conditional),
ConditionalInTiles("in [tileFilter] tiles", UniqueTarget.Conditional),
ConditionalInTiles("in [tileFilter] tiles", UniqueTarget.Conditional,
docDescription = "Can be used with FoundCity and FoundPuppetCity to only found cities in Water/Impassible tiles."),
ConditionalInTilesNot("in tiles without [tileFilter]", UniqueTarget.Conditional),
ConditionalNearTiles("within [positiveAmount] tiles of a [tileFilter]", UniqueTarget.Conditional),

View File

@ -45,11 +45,11 @@ object UnitActionsFromUniques {
UnitActionModifiers.getUsableUnitActionUniques(unit,
UniqueType.FoundPuppetCity).firstOrNull() ?: return null
if (tile.isWater || tile.isImpassible()) return null
// Spain should still be able to build Conquistadors in a one city challenge - but can't settle them
if (unit.civ.isOneCityChallenger() && unit.civ.hasEverOwnedOriginalCapital) return null
if (!unit.hasMovement() || !tile.canBeSettled())
if (!unit.hasMovement() || !tile.canBeSettled(unique))
return UnitAction(UnitActionType.FoundCity, 80f, action = null)
val hasActionModifiers = unique.modifiers.any { it.type?.targetTypes?.contains(

View File

@ -3535,6 +3535,8 @@ Simple unique parameters are explained by mouseover. Complex parameters are expl
Applicable to: Conditional
??? example "&lt;in [tileFilter] tiles&gt;"
Can be used with FoundCity and FoundPuppetCity to only found cities in Water/Impassible tiles.
Example: "&lt;in [Farm] tiles&gt;"
Applicable to: Conditional