Map reveal after singleplayer defeat (#1681)

* Added map reveal when the player is defeated in singleplayer

* Added victory (actually defeat) screen when the player is defeated

* Moved the victory screen navigation to an appropriate place

* Moved the map reveal logic to WorldMapHolder

* Tutorials and Diplomacy button are hidden after the defeat
This commit is contained in:
lyrjie
2020-01-15 20:56:01 +03:00
committed by Yair Morgenstern
parent 8e12e059ac
commit ad1a57dd02
4 changed files with 29 additions and 6 deletions

View File

@ -24,6 +24,7 @@ import com.unciv.models.ruleset.tile.ResourceSupplyList
import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.ruleset.unit.BaseUnit
import com.unciv.models.stats.Stats import com.unciv.models.stats.Stats
import com.unciv.models.translations.tr import com.unciv.models.translations.tr
import com.unciv.ui.VictoryScreen
import java.util.* import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
import kotlin.collections.HashMap import kotlin.collections.HashMap
@ -275,7 +276,10 @@ class CivilizationInfo {
override fun toString(): String {return civName} // for debug override fun toString(): String {return civName} // for debug
fun isDefeated()= cities.isEmpty() && (citiesCreated > 0 || !getCivUnits().any {it.name== Constants.settler}) /** Returns true if the civ was fully initialized and has no cities or settlers remaining */
fun isDefeated()= cities.isEmpty()
&& exploredTiles.isNotEmpty() // Dirty hack: exploredTiles are empty only before starting units are placed
&& (citiesCreated > 0 || !getCivUnits().any { it.name == Constants.settler })
fun getEra(): TechEra { fun getEra(): TechEra {
val maxEraOfTech = tech.researchedTechnologies val maxEraOfTech = tech.researchedTechnologies

View File

@ -67,7 +67,10 @@ class VictoryScreen : PickerScreen() {
} }
} }
if(!someoneHasWon) setDefaultCloseAction() if (playerCivInfo.isDefeated()) {
wonOrLost("")
} else if(!someoneHasWon)
setDefaultCloseAction()
} }

View File

@ -4,7 +4,9 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.math.Interpolation import com.badlogic.gdx.math.Interpolation
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.* import com.badlogic.gdx.scenes.scene2d.Actor
import com.badlogic.gdx.scenes.scene2d.Group
import com.badlogic.gdx.scenes.scene2d.Touchable
import com.badlogic.gdx.scenes.scene2d.actions.FloatAction import com.badlogic.gdx.scenes.scene2d.actions.FloatAction
import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.unciv.Constants import com.unciv.Constants
@ -18,9 +20,9 @@ import com.unciv.logic.map.TileInfo
import com.unciv.logic.map.TileMap import com.unciv.logic.map.TileMap
import com.unciv.models.UncivSound import com.unciv.models.UncivSound
import com.unciv.models.ruleset.unit.UnitType import com.unciv.models.ruleset.unit.UnitType
import com.unciv.ui.map.TileGroupMap
import com.unciv.ui.tilegroups.TileSetStrings import com.unciv.ui.tilegroups.TileSetStrings
import com.unciv.ui.tilegroups.WorldTileGroup import com.unciv.ui.tilegroups.WorldTileGroup
import com.unciv.ui.map.TileGroupMap
import com.unciv.ui.utils.* import com.unciv.ui.utils.*
import com.unciv.ui.worldscreen.unit.UnitContextMenu import com.unciv.ui.worldscreen.unit.UnitContextMenu
import kotlin.concurrent.thread import kotlin.concurrent.thread
@ -186,8 +188,21 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap
} }
/** Returns true when the civ is a human player defeated in singleplayer game */
private fun isMapRevealEnabled(viewingCiv: CivilizationInfo) = !viewingCiv.gameInfo.gameParameters.isOnlineMultiplayer
&& viewingCiv.isCurrentPlayer()
&& viewingCiv.isDefeated()
internal fun updateTiles(viewingCiv: CivilizationInfo) { internal fun updateTiles(viewingCiv: CivilizationInfo) {
if (isMapRevealEnabled(viewingCiv)) {
viewingCiv.viewableTiles = tileMap.values.toSet()
// Only needs to be done once
if (viewingCiv.exploredTiles.size != tileMap.values.size)
viewingCiv.exploredTiles = tileMap.values.map { it.position }.toHashSet()
}
val playerViewableTilePositions = viewingCiv.viewableTiles.map { it.position }.toHashSet() val playerViewableTilePositions = viewingCiv.viewableTiles.map { it.position }.toHashSet()
for (tileGroup in tileGroups.values){ for (tileGroup in tileGroups.values){

View File

@ -177,7 +177,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() {
tutorialTaskTable.clear() tutorialTaskTable.clear()
val tutorialTask = getCurrentTutorialTask() val tutorialTask = getCurrentTutorialTask()
if (tutorialTask == "" || !game.settings.showTutorials) { if (tutorialTask == "" || !game.settings.showTutorials || viewingCiv.isDefeated()) {
tutorialTaskTable.isVisible = false tutorialTaskTable.isVisible = false
} else { } else {
tutorialTaskTable.isVisible = true tutorialTaskTable.isVisible = true
@ -206,6 +206,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() {
if (!hasVisibleDialogs() && isPlayersTurn) { if (!hasVisibleDialogs() && isPlayersTurn) {
when { when {
!gameInfo.oneMoreTurnMode && viewingCiv.isDefeated() -> game.setScreen(VictoryScreen())
!gameInfo.oneMoreTurnMode && gameInfo.civilizations.any { it.victoryManager.hasWon() } -> game.setScreen(VictoryScreen()) !gameInfo.oneMoreTurnMode && gameInfo.civilizations.any { it.victoryManager.hasWon() } -> game.setScreen(VictoryScreen())
viewingCiv.policies.freePolicies > 0 && viewingCiv.policies.canAdoptPolicy() -> game.setScreen(PolicyPickerScreen(this)) viewingCiv.policies.freePolicies > 0 && viewingCiv.policies.canAdoptPolicy() -> game.setScreen(PolicyPickerScreen(this))
viewingCiv.greatPeople.freeGreatPeople > 0 -> game.setScreen(GreatPersonPickerScreen(viewingCiv)) viewingCiv.greatPeople.freeGreatPeople > 0 -> game.setScreen(GreatPersonPickerScreen(viewingCiv))
@ -289,7 +290,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() {
private fun updateDiplomacyButton(civInfo: CivilizationInfo) { private fun updateDiplomacyButton(civInfo: CivilizationInfo) {
diplomacyButtonWrapper.clear() diplomacyButtonWrapper.clear()
if(civInfo.getKnownCivs() if(!civInfo.isDefeated() && civInfo.getKnownCivs()
.filterNot { it.isDefeated() || it==viewingCiv || it.isBarbarian() } .filterNot { it.isDefeated() || it==viewingCiv || it.isBarbarian() }
.any()) { .any()) {
displayTutorial(Tutorial.OtherCivEncountered) displayTutorial(Tutorial.OtherCivEncountered)