mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-04 15:27:50 +07:00
Added an overview screen for religions (#4808)
* Added an overview screen for religions * Missed a thing * Implemented requested changes
This commit is contained in:
@ -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 =
|
||||||
|
@ -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 {
|
||||||
|
@ -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}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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 = "???"
|
||||||
}
|
}
|
||||||
|
106
core/src/com/unciv/ui/overviewscreen/ReligionOverviewTable.kt
Normal file
106
core/src/com/unciv/ui/overviewscreen/ReligionOverviewTable.kt
Normal 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
|
||||||
|
}
|
||||||
|
}
|
@ -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")
|
||||||
|
@ -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()
|
||||||
|
Reference in New Issue
Block a user