Notifications are now per-civ instead of game-wide, in preparation for multiplayer

Added player type to civinfo, in preparation for multiplayer
This commit is contained in:
Yair Morgenstern
2018-12-18 18:57:13 +02:00
parent 2923dc80c9
commit 6bdd0da3ea
8 changed files with 385 additions and 369 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 832 KiB

After

Width:  |  Height:  |  Size: 830 KiB

View File

@ -3,6 +3,7 @@ package com.unciv
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.unciv.logic.GameInfo import com.unciv.logic.GameInfo
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.PlayerType
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.logic.map.TileMap import com.unciv.logic.map.TileMap
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
@ -21,6 +22,7 @@ class GameStarter{
val playerCiv = CivilizationInfo(newGameParameters.nation) val playerCiv = CivilizationInfo(newGameParameters.nation)
playerCiv.difficulty=newGameParameters.difficulty playerCiv.difficulty=newGameParameters.difficulty
playerCiv.playerType=PlayerType.Human
gameInfo.civilizations.add(playerCiv) // first one is player civ gameInfo.civilizations.add(playerCiv) // first one is player civ
val barbarianCivilization = CivilizationInfo() val barbarianCivilization = CivilizationInfo()

View File

@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color
import com.unciv.logic.automation.NextTurnAutomation import com.unciv.logic.automation.NextTurnAutomation
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.Notification import com.unciv.logic.civilization.Notification
import com.unciv.logic.civilization.PlayerType
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.logic.map.TileMap import com.unciv.logic.map.TileMap
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
@ -22,7 +23,6 @@ class GameInfo {
val toReturn = GameInfo() val toReturn = GameInfo()
toReturn.tileMap = tileMap.clone() toReturn.tileMap = tileMap.clone()
toReturn.civilizations.addAll(civilizations.map { it.clone() }) toReturn.civilizations.addAll(civilizations.map { it.clone() })
toReturn.notifications.addAll(notifications)
toReturn.turns = turns toReturn.turns = turns
return toReturn return toReturn
} }
@ -32,7 +32,6 @@ class GameInfo {
//endregion //endregion
fun nextTurn() { fun nextTurn() {
notifications.clear()
val player = getPlayerCivilization() val player = getPlayerCivilization()
for (civInfo in civilizations) { for (civInfo in civilizations) {
@ -95,6 +94,11 @@ class GameInfo {
// this is separated into 2 loops because when we activate updateViewableTiles in civ.setTransients, // this is separated into 2 loops because when we activate updateViewableTiles in civ.setTransients,
// we try to find new civs, and we check if civ is barbarian, which we can't know unless the gameInfo is already set. // we try to find new civs, and we check if civ is barbarian, which we can't know unless the gameInfo is already set.
for (civInfo in civilizations) civInfo.gameInfo = this for (civInfo in civilizations) civInfo.gameInfo = this
// PlayerType was only added in 2.11.1, so we need to adjust for older saved games
if(civilizations.all { it.playerType==PlayerType.AI })
getPlayerCivilization().playerType=PlayerType.Human
for (civInfo in civilizations) civInfo.setTransients() for (civInfo in civilizations) civInfo.setTransients()
for (civInfo in civilizations) { for (civInfo in civilizations) {

View File

@ -150,8 +150,8 @@ class Battle(val gameInfo:GameInfo) {
if(city.cityConstructions.isBuilt("Palace")){ if(city.cityConstructions.isBuilt("Palace")){
city.cityConstructions.removeBuilding("Palace") city.cityConstructions.removeBuilding("Palace")
if(enemyCiv.isDefeated()) { if(enemyCiv.isDefeated()) {
gameInfo.getPlayerCivilization() for(civ in gameInfo.civilizations)
.addNotification("The civilization of [${enemyCiv.civName}] has been destroyed!", null, Color.RED) civ.addNotification("The civilization of [${enemyCiv.civName}] has been destroyed!", null, Color.RED)
enemyCiv.getCivUnits().forEach { it.destroy() } enemyCiv.getCivUnits().forEach { it.destroy() }
} }
else if(enemyCiv.cities.isNotEmpty()){ else if(enemyCiv.cities.isNotEmpty()){

View File

@ -153,9 +153,10 @@ class CityConstructions {
inProgressConstructions.remove(currentConstruction) inProgressConstructions.remove(currentConstruction)
if (construction is Building && construction.isWonder && construction.requiredBuildingInAllCities == null) { if (construction is Building && construction.isWonder && construction.requiredBuildingInAllCities == null) {
val playerCiv = cityInfo.civInfo.gameInfo.getPlayerCivilization() for (civ in cityInfo.civInfo.gameInfo.civilizations) {
val builtLocation = if (playerCiv.exploredTiles.contains(cityInfo.location)) cityInfo.name else "a faraway land" val builtLocation = if (civ.exploredTiles.contains(cityInfo.location)) cityInfo.name else "a faraway land"
playerCiv.addNotification("[$currentConstruction] has been built in [$builtLocation]", cityInfo.location, Color.BROWN) civ.addNotification("[$currentConstruction] has been built in [$builtLocation]", cityInfo.location, Color.BROWN)
}
} else } else
cityInfo.civInfo.addNotification("[$currentConstruction] has been built in [" + cityInfo.name + "]", cityInfo.location, Color.BROWN) cityInfo.civInfo.addNotification("[$currentConstruction] has been built in [" + cityInfo.name + "]", cityInfo.location, Color.BROWN)

View File

@ -23,6 +23,10 @@ import kotlin.math.max
import kotlin.math.pow import kotlin.math.pow
import kotlin.math.roundToInt import kotlin.math.roundToInt
enum class PlayerType{
AI,
Human
}
class CivilizationInfo { class CivilizationInfo {
@Transient lateinit var gameInfo: GameInfo @Transient lateinit var gameInfo: GameInfo
@ -38,6 +42,7 @@ class CivilizationInfo {
var gold = 0 var gold = 0
var happiness = 15 var happiness = 15
var difficulty = "Chieftain" var difficulty = "Chieftain"
var playerType = PlayerType.AI
var civName = "" var civName = ""
var tech = TechManager() var tech = TechManager()
var policies = PolicyManager() var policies = PolicyManager()
@ -45,6 +50,7 @@ class CivilizationInfo {
var greatPeople = GreatPersonManager() var greatPeople = GreatPersonManager()
var scienceVictory = ScienceVictoryManager() var scienceVictory = ScienceVictoryManager()
var diplomacy = HashMap<String,DiplomacyManager>() var diplomacy = HashMap<String,DiplomacyManager>()
var notifications = ArrayList<Notification>()
// if we only use lists, and change the list each time the cities are changed, // if we only use lists, and change the list each time the cities are changed,
// we won't get concurrent modification exceptions. // we won't get concurrent modification exceptions.
@ -73,6 +79,7 @@ class CivilizationInfo {
toReturn.diplomacy.putAll(diplomacy.values.map { it.clone() }.associateBy { it.otherCivName }) toReturn.diplomacy.putAll(diplomacy.values.map { it.clone() }.associateBy { it.otherCivName })
toReturn.cities = cities.map { it.clone() } toReturn.cities = cities.map { it.clone() }
toReturn.exploredTiles.addAll(exploredTiles) toReturn.exploredTiles.addAll(exploredTiles)
toReturn.notifications.addAll(notifications)
return toReturn return toReturn
} }
@ -304,6 +311,8 @@ class CivilizationInfo {
} }
fun endTurn() { fun endTurn() {
notifications.clear()
val nextTurnStats = getStatsForNextTurn() val nextTurnStats = getStatsForNextTurn()
policies.endTurn(nextTurnStats.culture.toInt()) policies.endTurn(nextTurnStats.culture.toInt())
@ -363,8 +372,8 @@ class CivilizationInfo {
} }
fun addNotification(text: String, location: Vector2?,color: Color) { fun addNotification(text: String, location: Vector2?,color: Color) {
if(isPlayerCivilization()) if(playerType==PlayerType.AI) return // no point in lengthening the saved game info if no one will read it
gameInfo.notifications.add(Notification(text, location,color)) notifications.add(Notification(text, location,color))
} }
fun addGreatPerson(greatPerson: String) { fun addGreatPerson(greatPerson: String) {

View File

@ -148,7 +148,7 @@ class WorldScreen : CameraStageBaseScreen() {
tileMapHolder.updateTiles(civInfo) tileMapHolder.updateTiles(civInfo)
topBar.update(cloneCivilization) topBar.update(cloneCivilization)
notificationsScroll.update(gameClone.notifications) notificationsScroll.update(civInfo.notifications)
notificationsScroll.width = stage.width/3 notificationsScroll.width = stage.width/3
notificationsScroll.setPosition(stage.width - notificationsScroll.width - 5f, notificationsScroll.setPosition(stage.width - notificationsScroll.width - 5f,
nextTurnButton.y - notificationsScroll.height - 5f) nextTurnButton.y - notificationsScroll.height - 5f)