Added an overview screen for religions (#4808)

* Added an overview screen for religions

* Missed a thing

* Implemented requested changes
This commit is contained in:
Xander Lenstra
2021-08-08 22:46:39 +02:00
committed by GitHub
parent 7cd368d024
commit 92728e9007
8 changed files with 156 additions and 23 deletions

View File

@ -827,7 +827,7 @@ Spaceship parts remaining =
Branches completed = Branches completed =
Undefeated civs = Undefeated civs =
# The \n here means: put a newline (enter) here. If this is omitted, the sidebox in the diplomacy overview will become _really_ wide. # The \n here means: put a newline (enter) here. If this is omitted, the sidebox in the diplomacy overview will become _really_ wide.
# Feel free to replace it with a space and put it somewhere else in your translation # Feel free to replace it with a space and put it between other words in your translation
Turns until the next\ndiplomacy victory vote: [amount] = Turns until the next\ndiplomacy victory vote: [amount] =
Choose a civ to vote for = Choose a civ to vote for =
Choose who should become the world leader and win a diplomatic victory! = Choose who should become the world leader and win a diplomatic victory! =
@ -990,6 +990,12 @@ Found Pantheon =
Follow [belief] = Follow [belief] =
Religions and Beliefs = Religions and Beliefs =
# Religion overview screen
Religion Name: =
Founding Civ: =
Cities following this religion: =
Click an icon to see the stats of this religion =
# Terrains # Terrains
Impassable = Impassable =

View File

@ -139,7 +139,6 @@ class ReligionManager {
return false return false
// Mod maker did not provide enough religions for the amount of civs present // Mod maker did not provide enough religions for the amount of civs present
return true return true
} }
@ -174,6 +173,12 @@ class ReligionManager {
foundingCityId = null foundingCityId = null
} }
fun numberOfCitiesFollowingThisReligion(): Int {
if (religion == null) return 0
return civInfo.gameInfo.getCities()
.count { it.religion.getMajorityReligion() == religion!!.name }
}
} }
enum class ReligionState { enum class ReligionState {

View File

@ -16,8 +16,7 @@ class Religion() : INamed {
var founderBeliefs: HashSet<String> = hashSetOf() var founderBeliefs: HashSet<String> = hashSetOf()
var followerBeliefs: HashSet<String> = hashSetOf() var followerBeliefs: HashSet<String> = hashSetOf()
@Transient @Transient
lateinit var gameInfo: GameInfo lateinit var gameInfo: GameInfo
@ -50,20 +49,25 @@ class Religion() : INamed {
fun getPantheonBeliefs(): Sequence<Belief> { fun getPantheonBeliefs(): Sequence<Belief> {
return mapToExistingBeliefs(followerBeliefs) return mapToExistingBeliefs(followerBeliefs)
.filter { it.type == BeliefType.Pantheon }
.asSequence() .asSequence()
.filter { it.type == BeliefType.Pantheon }
} }
fun getFollowerBeliefs(): Sequence<Belief> { fun getFollowerBeliefs(): Sequence<Belief> {
return mapToExistingBeliefs(followerBeliefs) return mapToExistingBeliefs(followerBeliefs)
.filter { it.type == BeliefType.Follower }
.asSequence() .asSequence()
.filter { it.type == BeliefType.Follower }
}
fun getFounderBeliefs(): Sequence<Belief> {
return mapToExistingBeliefs(founderBeliefs)
.asSequence()
.filter { it.type == BeliefType.Founder }
} }
private fun getUniquesOfBeliefs(beliefs: HashSet<String>): Sequence<Unique> { private fun getUniquesOfBeliefs(beliefs: HashSet<String>): Sequence<Unique> {
return mapToExistingBeliefs(beliefs) return mapToExistingBeliefs(beliefs)
.map { it.uniqueObjects } .flatMap { it.uniqueObjects }
.flatten()
.asSequence() .asSequence()
} }
@ -80,7 +84,6 @@ class Religion() : INamed {
} }
fun isMajorReligion(): Boolean { fun isMajorReligion(): Boolean {
if ("" in followerBeliefs) return true // Temporary as a result of follower beliefs not yet being implemented
return founderBeliefs.isNotEmpty() && followerBeliefs return founderBeliefs.isNotEmpty() && followerBeliefs
.any { gameInfo.ruleSet.beliefs[it]!!.type == BeliefType.Follower} .any { gameInfo.ruleSet.beliefs[it]!!.type == BeliefType.Follower}
} }

View File

@ -199,11 +199,10 @@ class PlayerPickerTable(
*/ */
private fun getNationTable(player: Player): Table { private fun getNationTable(player: Player): Table {
val nationTable = Table() val nationTable = Table()
val nationImage = if (player.chosenCiv == Constants.random) "?".toLabel(Color.WHITE, 25) val nationImage =
.apply { this.setAlignment(Align.center) } if (player.chosenCiv == Constants.random)
.surroundWithCircle(36f).apply { circle.color = Color.BLACK } ImageGetter.getRandomNationIndicator(40f)
.surroundWithCircle(40f, false).apply { circle.color = Color.WHITE } else ImageGetter.getNationIndicator(previousScreen.ruleset.nations[player.chosenCiv]!!, 40f)
else ImageGetter.getNationIndicator(previousScreen.ruleset.nations[player.chosenCiv]!!, 40f)
nationTable.add(nationImage).pad(5f) nationTable.add(nationImage).pad(5f)
nationTable.add(player.chosenCiv.toLabel()).pad(5f) nationTable.add(player.chosenCiv.toLabel()).pad(5f)
nationTable.touchable = Touchable.enabled nationTable.touchable = Touchable.enabled

View File

@ -32,7 +32,8 @@ class EmpireOverviewScreen(private var viewingPlayer:CivilizationInfo, defaultPa
Pair("Trades", IconAndKey("StatIcons/Acquire", 'T')), Pair("Trades", IconAndKey("StatIcons/Acquire", 'T')),
Pair("Units", IconAndKey("OtherIcons/Shield", 'U')), Pair("Units", IconAndKey("OtherIcons/Shield", 'U')),
Pair("Diplomacy", IconAndKey("OtherIcons/DiplomacyW", 'D')), Pair("Diplomacy", IconAndKey("OtherIcons/DiplomacyW", 'D')),
Pair("Resources", IconAndKey("StatIcons/Happiness", 'R')) Pair("Resources", IconAndKey("StatIcons/Happiness", 'R')),
Pair("Religion", IconAndKey("StatIcons/Faith", 'F'))
) )
} }
@ -85,6 +86,8 @@ class EmpireOverviewScreen(private var viewingPlayer:CivilizationInfo, defaultPa
addCategory("Units", UnitOverviewTable(viewingPlayer, this), viewingPlayer.getCivUnits().none()) addCategory("Units", UnitOverviewTable(viewingPlayer, this), viewingPlayer.getCivUnits().none())
addCategory("Diplomacy", DiplomacyOverviewTable(viewingPlayer, this), viewingPlayer.diplomacy.isEmpty()) addCategory("Diplomacy", DiplomacyOverviewTable(viewingPlayer, this), viewingPlayer.diplomacy.isEmpty())
addCategory("Resources", ResourcesOverviewTable(viewingPlayer, this), viewingPlayer.detailedCivResources.isEmpty()) addCategory("Resources", ResourcesOverviewTable(viewingPlayer, this), viewingPlayer.detailedCivResources.isEmpty())
if (viewingPlayer.gameInfo.hasReligionEnabled())
addCategory("Religion", ReligionOverviewTable(viewingPlayer, this), viewingPlayer.gameInfo.religions.isEmpty())
val closeButton = Constants.close.toTextButton().apply { val closeButton = Constants.close.toTextButton().apply {
setColor(0.75f, 0.1f, 0.1f, 1f) setColor(0.75f, 0.1f, 0.1f, 1f)
@ -131,12 +134,7 @@ class EmpireOverviewScreen(private var viewingPlayer:CivilizationInfo, defaultPa
backgroundColor = civ.nation.getOuterColor() backgroundColor = civ.nation.getOuterColor()
labelColor = civ.nation.getInnerColor() labelColor = civ.nation.getInnerColor()
} else { } else {
civGroup.add( civGroup.add(ImageGetter.getRandomNationIndicator(30f))
"?".toLabel(Color.WHITE)
.apply { this.setAlignment(Align.center) }
.surroundWithCircle(27f).apply { circle.color = Color.BLACK }
.surroundWithCircle(30f, false).apply { circle.color = Color.WHITE }
)
backgroundColor = Color.DARK_GRAY backgroundColor = Color.DARK_GRAY
labelText = "???" labelText = "???"
} }

View File

@ -0,0 +1,106 @@
package com.unciv.ui.overviewscreen
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.scenes.scene2d.ui.Button
import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.models.Religion
import com.unciv.models.ruleset.Belief
import com.unciv.models.translations.tr
import com.unciv.ui.utils.*
import kotlin.math.min
class ReligionOverviewTable(
private val viewingPlayer: CivilizationInfo,
private val overviewScreen: EmpireOverviewScreen
): Table() {
val gameInfo = viewingPlayer.gameInfo
private val topButtons = Table(CameraStageBaseScreen.skin)
private val topButtonLabel = "Click an icon to see the stats of this religion".toLabel()
private val statsTable = Table(CameraStageBaseScreen.skin)
private val beliefsTable = Table(CameraStageBaseScreen.skin)
private var selectedReligion: String? = null
init {
addReligionButtons()
add(topButtons).pad(5f).row()
add(topButtonLabel).pad(5f)
addSeparator()
add(statsTable).pad(5f).row()
add(beliefsTable).pad(5f)
}
private fun addReligionButtons() {
topButtons.clear()
val existingReligions: List<Religion> = gameInfo.civilizations.mapNotNull { it.religionManager.religion }
for (religion in existingReligions) {
val button: Button
if (religion.isPantheon()) {
val image = if (viewingPlayer.knows(religion.foundingCivName) || viewingPlayer.civName == religion.foundingCivName)
ImageGetter.getNationIndicator(gameInfo.getCivilization(religion.foundingCivName).nation, 60f)
else
ImageGetter.getRandomNationIndicator(60f)
button = Button(image, CameraStageBaseScreen.skin)
} else {
val image = ImageGetter.getReligionIcon(religion.iconName)
image.color = Color.BLACK
val icon = image.surroundWithCircle(60f)
button = Button(icon, CameraStageBaseScreen.skin)
}
button.onClick {
selectedReligion = religion.name
addReligionButtons()
loadReligion(religion)
}
if (selectedReligion == religion.name)
button.disable()
topButtons.add(button).pad(5f)
}
}
private fun loadReligion(religion: Religion) {
statsTable.clear()
beliefsTable.clear()
topButtonLabel.setText(religion.name.tr())
for (belief in
religion.getPantheonBeliefs()
+ religion.getFollowerBeliefs()
+ religion.getFounderBeliefs()
) {
beliefsTable.add(createBeliefDescription(belief)).pad(10f).row()
}
statsTable.add("Religion Name:".tr())
statsTable.add(religion.name.tr()).pad(5f).row()
statsTable.add("Founding Civ:".tr())
val foundingCivName =
if (viewingPlayer.knows(religion.foundingCivName) || viewingPlayer.civName == religion.foundingCivName)
religion.foundingCivName
else "???"
statsTable.add(foundingCivName.tr()).pad(5f).row()
statsTable.add("Cities following this religion:".tr())
statsTable.add(gameInfo.getCivilization(religion.foundingCivName).religionManager.numberOfCitiesFollowingThisReligion().toString()).pad(5f).row()
val minWidth = min(statsTable.minWidth, beliefsTable.minWidth) + 5f
statsTable.width = minWidth
for (cell in beliefsTable.cells) {
cell.minWidth(minWidth)
}
}
private fun createBeliefDescription(belief: Belief): Table {
val contentsTable = Table(CameraStageBaseScreen.skin)
contentsTable.add(belief.type.name.toLabel()).row()
contentsTable.add(belief.name.toLabel(fontSize = 24)).row()
contentsTable.add(belief.uniques.joinToString().toLabel())
contentsTable.background = ImageGetter.getBackground(ImageGetter.getBlue())
contentsTable.padTop(5f).padBottom(5f)
return contentsTable
}
}

View File

@ -220,6 +220,14 @@ object ImageGetter {
} else getCircle().apply { color = nation.getOuterColor() } } else getCircle().apply { color = nation.getOuterColor() }
.surroundWithCircle(size).apply { circle.color = nation.getInnerColor() } .surroundWithCircle(size).apply { circle.color = nation.getInnerColor() }
} }
fun getRandomNationIndicator(size: Float): IconCircleGroup {
return "?"
.toLabel(Color.WHITE, (size * 5f/8f).toInt())
.apply { this.setAlignment(Align.center) }
.surroundWithCircle(size * 0.9f).apply { circle.color = Color.BLACK }
.surroundWithCircle(size, false).apply { circle.color = Color.WHITE }
}
private fun nationIconExists(nation: String) = imageExists("NationIcons/$nation") private fun nationIconExists(nation: String) = imageExists("NationIcons/$nation")
fun getNationIcon(nation: String) = getImage("NationIcons/$nation") fun getNationIcon(nation: String) = getImage("NationIcons/$nation")

View File

@ -34,7 +34,7 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() {
private val scienceLabel = "0".toLabel(colorFromRGB(78, 140, 151)) private val scienceLabel = "0".toLabel(colorFromRGB(78, 140, 151))
private val happinessLabel = "0".toLabel() private val happinessLabel = "0".toLabel()
private val cultureLabel = "0".toLabel(colorFromRGB(210, 94, 210)) private val cultureLabel = "0".toLabel(colorFromRGB(210, 94, 210))
private val faithLabel = "0".toLabel(colorFromRGB(210, 94, 210)) private val faithLabel = "0".toLabel(colorFromRGB(210, 94, 210)) // TODO: This colour should be changed at some point
private val resourceLabels = HashMap<String, Label>() private val resourceLabels = HashMap<String, Label>()
private val resourceImages = HashMap<String, Actor>() private val resourceImages = HashMap<String, Actor>()
private val happinessImage = Group() private val happinessImage = Group()
@ -126,7 +126,15 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() {
if(worldScreen.gameInfo.hasReligionEnabled()) { if(worldScreen.gameInfo.hasReligionEnabled()) {
statsTable.add(faithLabel).padLeft(20f) statsTable.add(faithLabel).padLeft(20f)
statsTable.add(ImageGetter.getStatIcon("Faith")).padBottom(6f).size(20f) val faithImage = ImageGetter.getStatIcon("Faith")
statsTable.add(faithImage).padBottom(6f).size(20f)
val invokeFaithOverview = {
worldScreen.game.setScreen(EmpireOverviewScreen(worldScreen.selectedCiv, "Religion"))
}
faithLabel.onClick(invokeFaithOverview)
faithImage.onClick(invokeFaithOverview)
} }
statsTable.pack() statsTable.pack()