Religion button respects "hidden from users" modifier on uniques

This commit is contained in:
Yair Morgenstern 2023-12-28 21:57:56 +02:00
parent af1bf6ed00
commit 278288442b
4 changed files with 27 additions and 25 deletions

View File

@ -44,7 +44,7 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
val isLocalEffect = params.contains("in this city") || conditionals.any { it.type == UniqueType.ConditionalInThisCity } val isLocalEffect = params.contains("in this city") || conditionals.any { it.type == UniqueType.ConditionalInThisCity }
fun hasFlag(flag: UniqueFlag) = type != null && type.flags.contains(flag) fun hasFlag(flag: UniqueFlag) = type != null && type.flags.contains(flag)
fun isHiddenToUsers() = hasFlag(UniqueFlag.HiddenToUsers) || conditionals.any { it.type == UniqueType.ConditionalHideUniqueFromUsers } fun isHiddenToUsers() = hasFlag(UniqueFlag.HiddenToUsers) || conditionals.any { it.type == UniqueType.ModifierHiddenFromUsers }
fun hasTriggerConditional(): Boolean { fun hasTriggerConditional(): Boolean {
if (conditionals.none()) return false if (conditionals.none()) return false
@ -218,7 +218,7 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
return when (condition.type) { return when (condition.type) {
// These are 'what to do' and not 'when to do' conditionals // These are 'what to do' and not 'when to do' conditionals
UniqueType.ConditionalTimedUnique -> true UniqueType.ConditionalTimedUnique -> true
UniqueType.ConditionalHideUniqueFromUsers -> true // allowed to be attached to any Unique to hide it, no-op otherwise UniqueType.ModifierHiddenFromUsers -> true // allowed to be attached to any Unique to hide it, no-op otherwise
UniqueType.ConditionalChance -> stateBasedRandom.nextFloat() < condition.params[0].toFloat() / 100f UniqueType.ConditionalChance -> stateBasedRandom.nextFloat() < condition.params[0].toFloat() / 100f
UniqueType.ConditionalBeforeTurns -> checkOnCiv { gameInfo.turns < condition.params[0].toInt() } UniqueType.ConditionalBeforeTurns -> checkOnCiv { gameInfo.turns < condition.params[0].toInt() }

View File

@ -791,7 +791,7 @@ enum class UniqueType(
HiddenAfterGreatProphet("Hidden after generating a Great Prophet", UniqueTarget.Ruins), HiddenAfterGreatProphet("Hidden after generating a Great Prophet", UniqueTarget.Ruins),
HiddenWithoutVictoryType("Hidden when [victoryType] Victory is disabled", UniqueTarget.Building, UniqueTarget.Unit, flags = UniqueFlag.setOfHiddenToUsers), HiddenWithoutVictoryType("Hidden when [victoryType] Victory is disabled", UniqueTarget.Building, UniqueTarget.Unit, flags = UniqueFlag.setOfHiddenToUsers),
HiddenFromCivilopedia("Will not be displayed in Civilopedia", *UniqueTarget.Displayable, flags = UniqueFlag.setOfHiddenToUsers), HiddenFromCivilopedia("Will not be displayed in Civilopedia", *UniqueTarget.Displayable, flags = UniqueFlag.setOfHiddenToUsers),
ConditionalHideUniqueFromUsers("hidden from users", UniqueTarget.Conditional), ModifierHiddenFromUsers("hidden from users", UniqueTarget.Conditional),
Comment("Comment [comment]", *UniqueTarget.Displayable, Comment("Comment [comment]", *UniqueTarget.Displayable,
docDescription = "Allows displaying arbitrary text in a Unique listing. Only the text within the '[]' brackets will be displayed, the rest serves to allow Ruleset validation to recognize the intent."), docDescription = "Allows displaying arbitrary text in a Unique listing. Only the text within the '[]' brackets will be displayed, the rest serves to allow Ruleset validation to recognize the intent."),

View File

@ -82,7 +82,7 @@ class ConsoleUnitCommands : ConsoleCommandNode {
val selectedTile = console.getSelectedTile() val selectedTile = console.getSelectedTile()
val civ = console.getCivByName(params[0]) val civ = console.getCivByName(params[0])
val baseUnit = console.gameInfo.ruleset.units.values.firstOrNull { it.name.toCliInput() == params[1] } val baseUnit = console.gameInfo.ruleset.units.values.firstOrNull { it.name.toCliInput() == params[1] }
?: return@ConsoleAction DevConsoleResponse.error("Unknown unit") ?: throw ConsoleErrorException("Unknown unit")
civ.units.placeUnitNearTile(selectedTile.position, baseUnit) civ.units.placeUnitNearTile(selectedTile.position, baseUnit)
return@ConsoleAction DevConsoleResponse.OK return@ConsoleAction DevConsoleResponse.OK
}, },
@ -98,7 +98,7 @@ class ConsoleUnitCommands : ConsoleCommandNode {
validateFormat("unit addpromotion <promotionName>", params) validateFormat("unit addpromotion <promotionName>", params)
val unit = console.getSelectedUnit() val unit = console.getSelectedUnit()
val promotion = console.gameInfo.ruleset.unitPromotions.values.firstOrNull { it.name.toCliInput() == params[0] } val promotion = console.gameInfo.ruleset.unitPromotions.values.firstOrNull { it.name.toCliInput() == params[0] }
?: return@ConsoleAction DevConsoleResponse.error("Unknown promotion") ?: throw ConsoleErrorException("Unknown promotion")
unit.promotions.addPromotion(promotion.name, true) unit.promotions.addPromotion(promotion.name, true)
return@ConsoleAction DevConsoleResponse.OK return@ConsoleAction DevConsoleResponse.OK
}, },
@ -107,7 +107,7 @@ class ConsoleUnitCommands : ConsoleCommandNode {
validateFormat("unit removepromotion <promotionName>", params) validateFormat("unit removepromotion <promotionName>", params)
val unit = console.getSelectedUnit() val unit = console.getSelectedUnit()
val promotion = unit.promotions.getPromotions().firstOrNull { it.name.toCliInput() == params[0] } val promotion = unit.promotions.getPromotions().firstOrNull { it.name.toCliInput() == params[0] }
?: return@ConsoleAction DevConsoleResponse.error("Promotion not found on unit") ?: throw ConsoleErrorException("Promotion not found on unit")
// No such action in-game so we need to manually update // No such action in-game so we need to manually update
unit.promotions.promotions.remove(promotion.name) unit.promotions.promotions.remove(promotion.name)
unit.updateUniques() unit.updateUniques()
@ -118,7 +118,7 @@ class ConsoleUnitCommands : ConsoleCommandNode {
"setmovement" to ConsoleAction { console, params -> "setmovement" to ConsoleAction { console, params ->
validateFormat("unit setmovement <amount>", params) validateFormat("unit setmovement <amount>", params)
val movement = params[0].toFloatOrNull() val movement = params[0].toFloatOrNull()
if (movement == null || movement < 0) return@ConsoleAction DevConsoleResponse.error("Invalid number") if (movement == null || movement < 0) throw ConsoleErrorException("Invalid number")
val unit = console.getSelectedUnit() val unit = console.getSelectedUnit()
unit.currentMovement = movement unit.currentMovement = movement
return@ConsoleAction DevConsoleResponse.OK return@ConsoleAction DevConsoleResponse.OK
@ -134,7 +134,7 @@ class ConsoleCityCommands : ConsoleCommandNode {
val civ = console.getCivByName(params[0]) val civ = console.getCivByName(params[0])
val selectedTile = console.getSelectedTile() val selectedTile = console.getSelectedTile()
if (selectedTile.isCityCenter()) if (selectedTile.isCityCenter())
return@ConsoleAction DevConsoleResponse.error("Tile already contains a city center") throw ConsoleErrorException("Tile already contains a city center")
civ.addCity(selectedTile.position) civ.addCity(selectedTile.position)
return@ConsoleAction DevConsoleResponse.OK return@ConsoleAction DevConsoleResponse.OK
}, },
@ -150,7 +150,7 @@ class ConsoleCityCommands : ConsoleCommandNode {
validateFormat("city setpop <amount>", params) validateFormat("city setpop <amount>", params)
val city = console.getSelectedCity() val city = console.getSelectedCity()
val newPop = console.getInt(params[0]) val newPop = console.getInt(params[0])
if (newPop < 1) return@ConsoleAction DevConsoleResponse.error("Population must be at least 1") if (newPop < 1) throw ConsoleErrorException("Population must be at least 1")
city.population.setPopulation(newPop) city.population.setPopulation(newPop)
return@ConsoleAction DevConsoleResponse.OK return@ConsoleAction DevConsoleResponse.OK
}, },
@ -160,7 +160,8 @@ class ConsoleCityCommands : ConsoleCommandNode {
val selectedTile = console.getSelectedTile() val selectedTile = console.getSelectedTile()
val city = console.getCity(params[0]) val city = console.getCity(params[0])
if (selectedTile.neighbors.none { it.getCity() == city }) if (selectedTile.neighbors.none { it.getCity() == city })
return@ConsoleAction DevConsoleResponse.error("Tile is not adjacent to any tile already owned by the city") throw ConsoleErrorException("Tile is not adjacent to any tile already owned by the city")
if (selectedTile.isCityCenter()) throw ConsoleErrorException("Cannot tranfer city center")
city.expansion.takeOwnership(selectedTile) city.expansion.takeOwnership(selectedTile)
return@ConsoleAction DevConsoleResponse.OK return@ConsoleAction DevConsoleResponse.OK
}, },
@ -177,7 +178,7 @@ class ConsoleCityCommands : ConsoleCommandNode {
validateFormat("city religion <name> <±pressure>", params) validateFormat("city religion <name> <±pressure>", params)
val city = console.getSelectedCity() val city = console.getSelectedCity()
val religion = city.civ.gameInfo.religions.keys.firstOrNull { it.toCliInput() == params[0] } val religion = city.civ.gameInfo.religions.keys.firstOrNull { it.toCliInput() == params[0] }
?: return@ConsoleAction DevConsoleResponse.error("'${params[0]}' is not a known religion") ?: throw ConsoleErrorException("'${params[0]}' is not a known religion")
val pressure = console.getInt(params[1]) val pressure = console.getInt(params[1])
city.religion.addPressure(religion, pressure.coerceAtLeast(-city.religion.getPressures()[religion])) city.religion.addPressure(religion, pressure.coerceAtLeast(-city.religion.getPressures()[religion]))
city.religion.updatePressureOnPopulationChange(0) city.religion.updatePressureOnPopulationChange(0)
@ -194,7 +195,7 @@ class ConsoleTileCommands: ConsoleCommandNode {
val selectedTile = console.getSelectedTile() val selectedTile = console.getSelectedTile()
val improvement = console.gameInfo.ruleset.tileImprovements.values.firstOrNull { val improvement = console.gameInfo.ruleset.tileImprovements.values.firstOrNull {
it.name.toCliInput() == params[0] it.name.toCliInput() == params[0]
} ?: return@ConsoleAction DevConsoleResponse.error("Unknown improvement") } ?: throw ConsoleErrorException("Unknown improvement")
var civ: Civilization? = null var civ: Civilization? = null
if (params.size == 2){ if (params.size == 2){
civ = console.getCivByName(params[1]) civ = console.getCivByName(params[1])
@ -215,7 +216,7 @@ class ConsoleTileCommands: ConsoleCommandNode {
val selectedTile = console.getSelectedTile() val selectedTile = console.getSelectedTile()
val feature = console.gameInfo.ruleset.terrains.values val feature = console.gameInfo.ruleset.terrains.values
.firstOrNull { it.type == TerrainType.TerrainFeature && it.name.toCliInput() == params[0] } .firstOrNull { it.type == TerrainType.TerrainFeature && it.name.toCliInput() == params[0] }
?: return@ConsoleAction DevConsoleResponse.error("Unknown feature") ?: throw ConsoleErrorException("Unknown feature")
selectedTile.addTerrainFeature(feature.name) selectedTile.addTerrainFeature(feature.name)
return@ConsoleAction DevConsoleResponse.OK return@ConsoleAction DevConsoleResponse.OK
}, },
@ -225,7 +226,7 @@ class ConsoleTileCommands: ConsoleCommandNode {
val selectedTile = console.getSelectedTile() val selectedTile = console.getSelectedTile()
val feature = console.gameInfo.ruleset.terrains.values val feature = console.gameInfo.ruleset.terrains.values
.firstOrNull { it.type == TerrainType.TerrainFeature && it.name.toCliInput() == params[0] } .firstOrNull { it.type == TerrainType.TerrainFeature && it.name.toCliInput() == params[0] }
?: return@ConsoleAction DevConsoleResponse.error("Unknown feature") ?: throw ConsoleErrorException("Unknown feature")
selectedTile.removeTerrainFeature(feature.name) selectedTile.removeTerrainFeature(feature.name)
return@ConsoleAction DevConsoleResponse.OK return@ConsoleAction DevConsoleResponse.OK
} }
@ -234,9 +235,9 @@ class ConsoleTileCommands: ConsoleCommandNode {
class ConsoleCivCommands : ConsoleCommandNode { class ConsoleCivCommands : ConsoleCommandNode {
override val subcommands = hashMapOf<String, ConsoleCommand>( override val subcommands = hashMapOf<String, ConsoleCommand>(
"add" to ConsoleAction { console, params -> "addstat" to ConsoleAction { console, params ->
var statPos = 0 var statPos = 0
validateFormat("civ add [civ] <stat> <amount>", params) validateFormat("civ addstat [civ] <stat> <amount>", params)
val civ = if (params.size == 2) console.screen.selectedCiv val civ = if (params.size == 2) console.screen.selectedCiv
else { else {
statPos++ statPos++
@ -244,9 +245,9 @@ class ConsoleCivCommands : ConsoleCommandNode {
} }
val amount = console.getInt(params[statPos+1]) val amount = console.getInt(params[statPos+1])
val stat = Stat.safeValueOf(params[statPos].replaceFirstChar(Char::titlecase)) val stat = Stat.safeValueOf(params[statPos].replaceFirstChar(Char::titlecase))
?: return@ConsoleAction DevConsoleResponse.error("Whut? \"${params[statPos]}\" is not a Stat!") ?: throw ConsoleErrorException("Whut? \"${params[statPos]}\" is not a Stat!")
if (stat !in Stat.statsWithCivWideField) if (stat !in Stat.statsWithCivWideField)
return@ConsoleAction DevConsoleResponse.error("$stat is not civ-wide") throw ConsoleErrorException("$stat is not civ-wide")
civ.addStat(stat, amount) civ.addStat(stat, amount)
DevConsoleResponse.OK DevConsoleResponse.OK
}, },
@ -255,7 +256,7 @@ class ConsoleCivCommands : ConsoleCommandNode {
validateFormat("civ setplayertype <civName> <ai/human>", params) validateFormat("civ setplayertype <civName> <ai/human>", params)
val civ = console.getCivByName(params[0]) val civ = console.getCivByName(params[0])
val playerType = PlayerType.values().firstOrNull { it.name.lowercase() == params[1].lowercase() } val playerType = PlayerType.values().firstOrNull { it.name.lowercase() == params[1].lowercase() }
?: return@ConsoleAction DevConsoleResponse.error("Invalid player type, valid options are 'ai' or 'human'") ?: throw ConsoleErrorException("Invalid player type, valid options are 'ai' or 'human'")
civ.playerType = playerType civ.playerType = playerType
DevConsoleResponse.OK DevConsoleResponse.OK
} }
@ -263,7 +264,7 @@ class ConsoleCivCommands : ConsoleCommandNode {
override fun autocomplete(params: List<String>): String? { override fun autocomplete(params: List<String>): String? {
when (params[0]){ when (params[0]){
"add" -> if (params.size == 2) "addstat" -> if (params.size == 2)
return Stat.names() return Stat.names()
.firstOrNull { it.lowercase().startsWith(params[1]) } .firstOrNull { it.lowercase().startsWith(params[1]) }
?.drop(params[1].length) ?.drop(params[1].length)

View File

@ -15,14 +15,14 @@ import com.unciv.models.UncivSound
import com.unciv.models.ruleset.Belief import com.unciv.models.ruleset.Belief
import com.unciv.models.ruleset.BeliefType import com.unciv.models.ruleset.BeliefType
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.screens.civilopediascreen.CivilopediaScreen
import com.unciv.ui.screens.civilopediascreen.MarkupRenderer
import com.unciv.ui.components.widgets.WrappableLabel
import com.unciv.ui.components.extensions.darken import com.unciv.ui.components.extensions.darken
import com.unciv.ui.components.extensions.disable import com.unciv.ui.components.extensions.disable
import com.unciv.ui.components.extensions.enable import com.unciv.ui.components.extensions.enable
import com.unciv.ui.components.input.onClick
import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toLabel
import com.unciv.ui.components.input.onClick
import com.unciv.ui.components.widgets.WrappableLabel
import com.unciv.ui.screens.civilopediascreen.CivilopediaScreen
import com.unciv.ui.screens.civilopediascreen.MarkupRenderer
abstract class ReligionPickerScreenCommon( abstract class ReligionPickerScreenCommon(
protected val choosingCiv: Civilization, protected val choosingCiv: Civilization,
@ -83,7 +83,8 @@ abstract class ReligionPickerScreenCommon(
add(belief.type.name.toLabel(fontColor = Color.valueOf(belief.type.color))).row() add(belief.type.name.toLabel(fontColor = Color.valueOf(belief.type.color))).row()
val nameLabel = WrappableLabel(belief.name, labelWidth, fontSize = Constants.headingFontSize) val nameLabel = WrappableLabel(belief.name, labelWidth, fontSize = Constants.headingFontSize)
add(nameLabel.apply { wrap = true }).row() add(nameLabel.apply { wrap = true }).row()
val effectLabel = WrappableLabel(belief.uniques.joinToString("\n") { it.tr() }, labelWidth) val effectLabel = WrappableLabel(belief.uniqueObjects.filter { !it.isHiddenToUsers() }.map { it.text }
.joinToString("\n") { it.tr() }, labelWidth)
add(effectLabel.apply { wrap = true }) add(effectLabel.apply { wrap = true })
} }
beliefType == BeliefType.Any -> beliefType == BeliefType.Any ->