Added "Diplomatic Incidents" for diplomatic messages between civs (as of now, only declaration of war)

This commit is contained in:
Yair Morgenstern 2019-02-10 16:34:46 +02:00
parent 2834752826
commit 07663bfc54
16 changed files with 104 additions and 28 deletions

View File

@ -1,6 +1,7 @@
[ [
{ {
name:"Babylon", name:"Babylon",
leaderName:"Nebuchadnezzar II",
mainColor:[27,53,63], mainColor:[27,53,63],
secondaryColor:[213,249,255], secondaryColor:[213,249,255],
unique:"Receive free Great Scientist when you discover Writing, Earn Great Scientists 50% faster", unique:"Receive free Great Scientist when you discover Writing, Earn Great Scientists 50% faster",
@ -10,6 +11,7 @@
}, },
{ {
name:"Greece", name:"Greece",
leaderName:"Alexander",
mainColor:[181, 232, 232], mainColor:[181, 232, 232],
secondaryColor:[68,142,249], secondaryColor:[68,142,249],
cities:["Athens","Sparta","Corinth","Argos","Knossos","Mycenae","Pharsalos","Ephesus","Halicarnassus","Rhodes", cities:["Athens","Sparta","Corinth","Argos","Knossos","Mycenae","Pharsalos","Ephesus","Halicarnassus","Rhodes",
@ -18,6 +20,7 @@
}, },
{ {
name:"China", name:"China",
leaderName:"Wu Zetian",
mainColor:[9, 112, 84], mainColor:[9, 112, 84],
secondaryColor:[255,255,255], secondaryColor:[255,255,255],
unique:"Great general provides double combat bonus, and spawns 50% faster" unique:"Great general provides double combat bonus, and spawns 50% faster"
@ -27,6 +30,7 @@
}, },
{ {
name:"Egypt", name:"Egypt",
leaderName:"Ramesses II",
mainColor:[ 231, 213, 0], mainColor:[ 231, 213, 0],
secondaryColor:[98,10,210], secondaryColor:[98,10,210],
unique:"+20% production towards Wonder construction" unique:"+20% production towards Wonder construction"
@ -36,6 +40,7 @@
}, },
{ {
name:"England", name:"England",
leaderName:"Elizabeth",
mainColor:[ 114, 0, 0], mainColor:[ 114, 0, 0],
secondaryColor:[255,255,255], secondaryColor:[255,255,255],
unique:"+2 movement for all naval units" unique:"+2 movement for all naval units"
@ -45,6 +50,7 @@
}, },
{ {
name:"France", name:"France",
leaderName:"Napoleon",
mainColor:[ 38, 98, 255], mainColor:[ 38, 98, 255],
secondaryColor:[239,236,148], secondaryColor:[239,236,148],
unique:"+2 Culture per turn from cities before discovering Steam Power", unique:"+2 Culture per turn from cities before discovering Steam Power",
@ -54,6 +60,7 @@
}, },
{ {
name:"Russia", name:"Russia",
leaderName:"Catherine",
mainColor:[ 236, 178, 0], mainColor:[ 236, 178, 0],
secondaryColor:[0,0,0], secondaryColor:[0,0,0],
unique:"Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity", unique:"Strategic Resources provide +1 Production, and Horses, Iron and Uranium Resources provide double quantity",
@ -63,6 +70,7 @@
}, },
{ {
name:"Rome", name:"Rome",
leaderName:"Augustus Caesar",
mainColor:[ 53,0,87], mainColor:[ 53,0,87],
secondaryColor:[238,201,9], secondaryColor:[238,201,9],
unique:"+25% Production towards any buildings that already exist in the Capital", unique:"+25% Production towards any buildings that already exist in the Capital",
@ -72,6 +80,7 @@
}, },
{ {
name:"Arabia", name:"Arabia",
leaderName:"Harun al-Rashid",
mainColor:[ 41,83,42], mainColor:[ 41,83,42],
secondaryColor:[146,221,9], secondaryColor:[146,221,9],
cities:["Mecca","Medina","Damascus","Baghdad","Najran","Kufah","Basra","Khurasan","Anjar","Fustat", cities:["Mecca","Medina","Damascus","Baghdad","Najran","Kufah","Basra","Khurasan","Anjar","Fustat",
@ -80,6 +89,7 @@
}, },
{ {
name:"America", name:"America",
leaderName:"Washington",
mainColor:[ 28,51,119], mainColor:[ 28,51,119],
secondaryColor:[255,255,255], secondaryColor:[255,255,255],
unique:"All land military units have +1 sight, 50% discount when purchasing tiles", unique:"All land military units have +1 sight, 50% discount when purchasing tiles",

View File

@ -31,8 +31,9 @@ class GameInfo {
return toReturn return toReturn
} }
fun getCurrentPlayerCivilization(): CivilizationInfo = civilizations.first { it.civName==currentPlayer } fun getCivilization(civName:String) = civilizations.first { it.civName==civName }
fun getBarbarianCivilization(): CivilizationInfo = civilizations.first { it.civName=="Barbarians" } fun getCurrentPlayerCivilization() = getCivilization(currentPlayer)
fun getBarbarianCivilization() = getCivilization("Barbarians")
fun getDifficulty() = GameBasics.Difficulties[difficulty]!! fun getDifficulty() = GameBasics.Difficulties[difficulty]!!
//endregion //endregion

View File

@ -4,7 +4,7 @@ import com.unciv.UnCivGame
import com.unciv.logic.battle.* import com.unciv.logic.battle.*
import com.unciv.logic.city.CityInfo import com.unciv.logic.city.CityInfo
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.DiplomaticStatus import com.unciv.logic.civilization.diplomacy.DiplomaticStatus
import com.unciv.logic.civilization.GreatPersonManager import com.unciv.logic.civilization.GreatPersonManager
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo

View File

@ -4,6 +4,9 @@ import com.badlogic.gdx.graphics.Color
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.city.CityInfo import com.unciv.logic.city.CityInfo
import com.unciv.logic.civilization.diplomacy.DiplomacyManager
import com.unciv.logic.civilization.diplomacy.DiplomaticIncident
import com.unciv.logic.civilization.diplomacy.DiplomaticStatus
import com.unciv.logic.map.BFS import com.unciv.logic.map.BFS
import com.unciv.logic.map.MapUnit import com.unciv.logic.map.MapUnit
import com.unciv.logic.map.RoadStatus import com.unciv.logic.map.RoadStatus
@ -51,8 +54,9 @@ class CivilizationInfo {
var greatPeople = GreatPersonManager() var greatPeople = GreatPersonManager()
@Deprecated("As of 2.11.3") var scienceVictory = ScienceVictoryManager() @Deprecated("As of 2.11.3") var scienceVictory = ScienceVictoryManager()
var victoryManager=VictoryManager() var victoryManager=VictoryManager()
var diplomacy = HashMap<String,DiplomacyManager>() var diplomacy = HashMap<String, DiplomacyManager>()
var notifications = ArrayList<Notification>() var notifications = ArrayList<Notification>()
val diplomaticIncidents = ArrayList<DiplomaticIncident>()
// 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.
@ -294,7 +298,7 @@ class CivilizationInfo {
return diplomacy[otherCiv.civName]!!.diplomaticStatus == DiplomaticStatus.War return diplomacy[otherCiv.civName]!!.diplomaticStatus == DiplomaticStatus.War
} }
fun isAtWar() = diplomacy.values.any { it.diplomaticStatus==DiplomaticStatus.War && !it.otherCiv().isDefeated() } fun isAtWar() = diplomacy.values.any { it.diplomaticStatus== DiplomaticStatus.War && !it.otherCiv().isDefeated() }
//endregion //endregion
//region state-changing functions //region state-changing functions

View File

@ -1,6 +1,7 @@
package com.unciv.logic.civilization package com.unciv.logic.civilization.diplomacy
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.trade.Trade import com.unciv.logic.trade.Trade
import com.unciv.logic.trade.TradeType import com.unciv.logic.trade.TradeType
import com.unciv.models.Counter import com.unciv.models.Counter
@ -8,11 +9,6 @@ import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.tile.TileResource import com.unciv.models.gamebasics.tile.TileResource
import com.unciv.models.gamebasics.tr import com.unciv.models.gamebasics.tr
enum class DiplomaticStatus{
Peace,
War
}
class DiplomacyManager() { class DiplomacyManager() {
@Transient lateinit var civInfo: CivilizationInfo @Transient lateinit var civInfo: CivilizationInfo
lateinit var otherCivName:String lateinit var otherCivName:String
@ -42,7 +38,7 @@ class DiplomacyManager() {
fun canDeclareWar() = turnsToPeaceTreaty()==0 fun canDeclareWar() = turnsToPeaceTreaty()==0
fun otherCiv() = civInfo.gameInfo.civilizations.first{it.civName==otherCivName} fun otherCiv() = civInfo.gameInfo.getCivilization(otherCivName)
fun goldPerTurn():Int{ fun goldPerTurn():Int{
var goldPerTurnForUs = 0 var goldPerTurnForUs = 0
@ -103,6 +99,7 @@ class DiplomacyManager() {
diplomaticStatus = DiplomaticStatus.War diplomaticStatus = DiplomaticStatus.War
otherCiv().diplomacy[civInfo.civName]!!.diplomaticStatus = DiplomaticStatus.War otherCiv().diplomacy[civInfo.civName]!!.diplomaticStatus = DiplomaticStatus.War
otherCiv().addNotification("[${civInfo.civName}] has declared war on us!",null, Color.RED) otherCiv().addNotification("[${civInfo.civName}] has declared war on us!",null, Color.RED)
otherCiv().diplomaticIncidents.add(DiplomaticIncident(civInfo.civName,DiplomaticIncidentType.WarDeclaration))
} }
//endregion //endregion
} }

View File

@ -0,0 +1,5 @@
package com.unciv.logic.civilization.diplomacy
import com.unciv.logic.trade.Trade
class DiplomaticIncident(val civName:String, val type: DiplomaticIncidentType, val trade: Trade?=null)

View File

@ -0,0 +1,6 @@
package com.unciv.logic.civilization.diplomacy
enum class DiplomaticIncidentType{
WarDeclaration,
TradeOffer
}

View File

@ -0,0 +1,6 @@
package com.unciv.logic.civilization.diplomacy
enum class DiplomaticStatus{
Peace,
War
}

View File

@ -281,7 +281,7 @@ open class TileInfo {
if(civilianUnit!=null) civilianUnit!!.currentTile = this if(civilianUnit!=null) civilianUnit!!.currentTile = this
for (unit in getUnits()) { for (unit in getUnits()) {
unit.assignOwner(tileMap.gameInfo.civilizations.first { it.civName == unit.owner }) unit.assignOwner(tileMap.gameInfo.getCivilization(unit.owner))
unit.setTransients() unit.setTransients()
} }
} }

View File

@ -1,6 +1,10 @@
package com.unciv.logic.trade package com.unciv.logic.trade
class Trade{ class Trade{
val theirOffers = TradeOffersList()
val ourOffers = TradeOffersList()
fun reverse(): Trade { fun reverse(): Trade {
val newTrade = Trade() val newTrade = Trade()
newTrade.theirOffers+=ourOffers.map { it.copy() } newTrade.theirOffers+=ourOffers.map { it.copy() }
@ -8,10 +12,6 @@ class Trade{
return newTrade return newTrade
} }
val theirOffers = TradeOffersList()
val ourOffers = TradeOffersList()
fun equals(trade: Trade):Boolean{ fun equals(trade: Trade):Boolean{
if(trade.ourOffers.size!=ourOffers.size if(trade.ourOffers.size!=ourOffers.size
|| trade.theirOffers.size!=theirOffers.size) return false || trade.theirOffers.size!=theirOffers.size) return false

View File

@ -3,7 +3,7 @@ package com.unciv.logic.trade
import com.unciv.logic.automation.Automation import com.unciv.logic.automation.Automation
import com.unciv.logic.automation.ThreatLevel import com.unciv.logic.automation.ThreatLevel
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.DiplomaticStatus import com.unciv.logic.civilization.diplomacy.DiplomaticStatus
import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.GameBasics
import com.unciv.models.gamebasics.tile.ResourceType import com.unciv.models.gamebasics.tile.ResourceType
import com.unciv.models.gamebasics.tr import com.unciv.models.gamebasics.tr
@ -46,7 +46,7 @@ class TradeLogic(val ourCivilization:CivilizationInfo, val otherCivilization: Ci
val civsWeBothKnow = otherCivsWeKnow val civsWeBothKnow = otherCivsWeKnow
.filter { otherCivilization.diplomacy.containsKey(it.civName) } .filter { otherCivilization.diplomacy.containsKey(it.civName) }
val civsWeArentAtWarWith = civsWeBothKnow val civsWeArentAtWarWith = civsWeBothKnow
.filter { civInfo.diplomacy[it.civName]!!.diplomaticStatus==DiplomaticStatus.Peace } .filter { civInfo.diplomacy[it.civName]!!.diplomaticStatus== DiplomaticStatus.Peace }
for(thirdCiv in civsWeArentAtWarWith){ for(thirdCiv in civsWeArentAtWarWith){
offers.add(TradeOffer("Declare war on "+thirdCiv.civName,TradeType.WarDeclaration,0)) offers.add(TradeOffer("Declare war on "+thirdCiv.civName,TradeType.WarDeclaration,0))
} }
@ -120,7 +120,7 @@ class TradeLogic(val ourCivilization:CivilizationInfo, val otherCivilization: Ci
TradeType.Introduction -> return 250 TradeType.Introduction -> return 250
TradeType.WarDeclaration -> { TradeType.WarDeclaration -> {
val nameOfCivToDeclareWarOn = offer.name.split(' ').last() val nameOfCivToDeclareWarOn = offer.name.split(' ').last()
val civToDeclareWarOn = ourCivilization.gameInfo.civilizations.first { it.civName==nameOfCivToDeclareWarOn } val civToDeclareWarOn = ourCivilization.gameInfo.getCivilization(nameOfCivToDeclareWarOn)
val threatToThem = Automation().threatAssessment(otherCivilization,civToDeclareWarOn) val threatToThem = Automation().threatAssessment(otherCivilization,civToDeclareWarOn)
if(!otherCivIsRecieving) { // we're getting this from them, that is, they're declaring war if(!otherCivIsRecieving) { // we're getting this from them, that is, they're declaring war
@ -133,7 +133,7 @@ class TradeLogic(val ourCivilization:CivilizationInfo, val otherCivilization: Ci
} }
} }
else{ else{
if(otherCivilization.diplomacy[nameOfCivToDeclareWarOn]!!.diplomaticStatus==DiplomaticStatus.War){ if(otherCivilization.diplomacy[nameOfCivToDeclareWarOn]!!.diplomaticStatus== DiplomaticStatus.War){
when (threatToThem) { when (threatToThem) {
ThreatLevel.VeryLow -> return 0 ThreatLevel.VeryLow -> return 0
ThreatLevel.Low -> return 0 ThreatLevel.Low -> return 0
@ -199,8 +199,8 @@ class TradeLogic(val ourCivilization:CivilizationInfo, val otherCivilization: Ci
} }
} }
if(offer.type==TradeType.Introduction) if(offer.type==TradeType.Introduction)
to.meetCivilization(to.gameInfo.civilizations to.meetCivilization(to.gameInfo.getCivilization(offer.name.split(" ")[2]))
.first { it.civName==offer.name.split(" ")[2] })
if(offer.type==TradeType.WarDeclaration){ if(offer.type==TradeType.WarDeclaration){
val nameOfCivToDeclareWarOn = offer.name.split(' ').last() val nameOfCivToDeclareWarOn = offer.name.split(' ').last()
from.diplomacy[nameOfCivToDeclareWarOn]!!.declareWar() from.diplomacy[nameOfCivToDeclareWarOn]!!.declareWar()

View File

@ -6,6 +6,7 @@ import com.unciv.ui.utils.colorFromRGB
class Nation : INamed { class Nation : INamed {
override lateinit var name: String override lateinit var name: String
lateinit var leaderName: String
lateinit var mainColor: List<Int> lateinit var mainColor: List<Int>
var unique:String?=null var unique:String?=null
var secondaryColor: List<Int>?=null var secondaryColor: List<Int>?=null

View File

@ -11,7 +11,7 @@ import com.badlogic.gdx.utils.Align
import com.unciv.UnCivGame import com.unciv.UnCivGame
import com.unciv.logic.HexMath import com.unciv.logic.HexMath
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.DiplomaticStatus import com.unciv.logic.civilization.diplomacy.DiplomaticStatus
import com.unciv.logic.trade.Trade import com.unciv.logic.trade.Trade
import com.unciv.logic.trade.TradeOffersList import com.unciv.logic.trade.TradeOffersList
import com.unciv.models.gamebasics.tr import com.unciv.models.gamebasics.tr
@ -328,7 +328,7 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){
val statusLine = ImageGetter.getLine(civGroup.x+civGroup.width/2,civGroup.y+civGroup.height/2, val statusLine = ImageGetter.getLine(civGroup.x+civGroup.width/2,civGroup.y+civGroup.height/2,
otherCivGroup.x+otherCivGroup.width/2,otherCivGroup.y+otherCivGroup.height/2,3f) otherCivGroup.x+otherCivGroup.width/2,otherCivGroup.y+otherCivGroup.height/2,3f)
statusLine.color = if(diplomacy.diplomaticStatus==DiplomaticStatus.War) Color.RED statusLine.color = if(diplomacy.diplomaticStatus== DiplomaticStatus.War) Color.RED
else Color.GREEN else Color.GREEN
group.addActor(statusLine) group.addActor(statusLine)

View File

@ -19,7 +19,7 @@ class NationTable(val nation: Nation, val newGameParameters: GameParameters, ski
background= ImageGetter.getBackground(nation.getSecondaryColor()) background= ImageGetter.getBackground(nation.getSecondaryColor())
innerTable.pad(10f) innerTable.pad(10f)
innerTable.background= ImageGetter.getBackground(nation.getColor()) innerTable.background= ImageGetter.getBackground(nation.getColor())
innerTable.add(Label(nation.name.tr(), skin).apply { setFontColor(nation.getSecondaryColor())}).row() innerTable.add(Label(nation.leaderName.tr()+" - "+nation.name.tr(), skin).apply { setFontColor(nation.getSecondaryColor())}).row()
innerTable.add(Label(getUniqueLabel(nation), skin) innerTable.add(Label(getUniqueLabel(nation), skin)
.apply { setWrap(true);setFontColor(nation.getSecondaryColor())}) .apply { setWrap(true);setFontColor(nation.getSecondaryColor())})
.width(width) .width(width)

View File

@ -22,7 +22,7 @@ class Tutorials{
private val tutorialTexts = mutableListOf<Tutorial>() private val tutorialTexts = mutableListOf<Tutorial>()
private var isTutorialShowing = false var isTutorialShowing = false
fun displayTutorials(name: String, stage: Stage) { fun displayTutorials(name: String, stage: Stage) {

View File

@ -10,7 +10,9 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.unciv.UnCivGame import com.unciv.UnCivGame
import com.unciv.logic.GameSaver import com.unciv.logic.GameSaver
import com.unciv.logic.civilization.CivilizationInfo import com.unciv.logic.civilization.CivilizationInfo
import com.unciv.logic.civilization.DiplomaticStatus import com.unciv.logic.civilization.diplomacy.DiplomaticIncident
import com.unciv.logic.civilization.diplomacy.DiplomaticIncidentType
import com.unciv.logic.civilization.diplomacy.DiplomaticStatus
import com.unciv.models.gamebasics.tile.ResourceType import com.unciv.models.gamebasics.tile.ResourceType
import com.unciv.models.gamebasics.tr import com.unciv.models.gamebasics.tr
import com.unciv.models.gamebasics.unit.UnitType import com.unciv.models.gamebasics.unit.UnitType
@ -22,6 +24,7 @@ import com.unciv.ui.pickerscreens.TechPickerScreen
import com.unciv.ui.trade.DiplomacyScreen import com.unciv.ui.trade.DiplomacyScreen
import com.unciv.ui.utils.* import com.unciv.ui.utils.*
import com.unciv.ui.worldscreen.bottombar.WorldScreenBottomBar import com.unciv.ui.worldscreen.bottombar.WorldScreenBottomBar
import com.unciv.ui.worldscreen.optionstable.PopupTable
import com.unciv.ui.worldscreen.unit.UnitActionsTable import com.unciv.ui.worldscreen.unit.UnitActionsTable
class WorldScreen : CameraStageBaseScreen() { class WorldScreen : CameraStageBaseScreen() {
@ -157,6 +160,11 @@ class WorldScreen : CameraStageBaseScreen() {
if(!gameInfo.oneMoreTurnMode && currentPlayerCiv.victoryManager.hasWon()) game.screen = VictoryScreen() if(!gameInfo.oneMoreTurnMode && currentPlayerCiv.victoryManager.hasWon()) game.screen = VictoryScreen()
else if(currentPlayerCiv.policies.freePolicies>0) game.screen = PolicyPickerScreen(currentPlayerCiv) else if(currentPlayerCiv.policies.freePolicies>0) game.screen = PolicyPickerScreen(currentPlayerCiv)
else if(currentPlayerCiv.greatPeople.freeGreatPeople>0) game.screen = GreatPersonPickerScreen() else if(currentPlayerCiv.greatPeople.freeGreatPeople>0) game.screen = GreatPersonPickerScreen()
if(game.screen==this && !tutorials.isTutorialShowing
&& currentPlayerCiv.diplomaticIncidents.any() && !DiplomaticIncidentPopup.isOpen){
DiplomaticIncidentPopup(this,currentPlayerCiv.diplomaticIncidents.first())
}
} }
private fun updateDiplomacyButton(civInfo: CivilizationInfo) { private fun updateDiplomacyButton(civInfo: CivilizationInfo) {
@ -301,3 +309,41 @@ class WorldScreen : CameraStageBaseScreen() {
} }
} }
class DiplomaticIncidentPopup(val worldScreen: WorldScreen, val diplomaticIncident: DiplomaticIncident):PopupTable(worldScreen){
init{
val otherCiv = worldScreen.gameInfo.getCivilization(diplomaticIncident.civName)
val otherCivLeaderName = otherCiv.getNation().leaderName+" of "+otherCiv.civName
add(Label(otherCivLeaderName,skin))
addSeparator()
when(diplomaticIncident.type){
DiplomaticIncidentType.WarDeclaration -> {
add(Label("We've decided to declare war on you, k?",skin)).row()
val responseTable = Table()
val angryResponse = TextButton("You'll pay for this",skin)
angryResponse.onClick { close() }
val acceptingResponse= TextButton("This is fine",skin)
acceptingResponse.onClick { close() }
responseTable.add(angryResponse)
responseTable.add(acceptingResponse)
add(responseTable)
}
DiplomaticIncidentType.TradeOffer -> TODO()
}
open()
isOpen = true
}
fun close(){
worldScreen.currentPlayerCiv.diplomaticIncidents.remove(diplomaticIncident)
isOpen = false
remove()
}
companion object {
var isOpen = false
}
}