diff --git a/core/src/com/unciv/logic/HexMath.kt b/core/src/com/unciv/logic/HexMath.kt index 681d6f5b74..04be602a7b 100644 --- a/core/src/com/unciv/logic/HexMath.kt +++ b/core/src/com/unciv/logic/HexMath.kt @@ -7,7 +7,7 @@ import kotlin.math.max class HexMath { - private fun getVectorForAngle(angle: Float): Vector2 { + fun getVectorForAngle(angle: Float): Vector2 { return Vector2(Math.sin(angle.toDouble()).toFloat(), Math.cos(angle.toDouble()).toFloat()) } diff --git a/core/src/com/unciv/ui/EmpireOverviewScreen.kt b/core/src/com/unciv/ui/EmpireOverviewScreen.kt index 887210c4b4..8519c1641e 100644 --- a/core/src/com/unciv/ui/EmpireOverviewScreen.kt +++ b/core/src/com/unciv/ui/EmpireOverviewScreen.kt @@ -1,12 +1,17 @@ package com.unciv.ui +import com.badlogic.gdx.graphics.Color +import com.badlogic.gdx.scenes.scene2d.Actor +import com.badlogic.gdx.scenes.scene2d.Group import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.utils.Align import com.unciv.UnCivGame +import com.unciv.logic.HexMath import com.unciv.logic.civilization.CivilizationInfo +import com.unciv.logic.civilization.DiplomaticStatus import com.unciv.logic.trade.Trade import com.unciv.logic.trade.TradeOffersList import com.unciv.ui.utils.* @@ -66,6 +71,16 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){ } topTable.add(setUnitsButton ) + + val setDiplomacyButton = TextButton("Diplomacy".tr(),skin) + setDiplomacyButton.onClick { + centerTable.clear() + centerTable.add(createDiplomacyGroup()).height(stage.height*0.8f) + centerTable.pack() + centerTable.center(stage) + } + topTable.add(setDiplomacyButton ) + topTable.pack() topTable.width = stage.width topTable.y = stage.height-topTable.height @@ -258,4 +273,49 @@ class EmpireOverviewScreen : CameraStageBaseScreen(){ table.pack() return table } + + fun createDiplomacyGroup(): Group { + val relevantCivs = civInfo.gameInfo.civilizations.filter { !it.isBarbarianCivilization() } + val groupSize = 500f + val group = Group() + group.setSize(groupSize,groupSize) + val civGroups = HashMap() + for(i in 0 until relevantCivs.size){ + val civ = relevantCivs[i] + + + val civGroup = Table() + civGroup.background = ImageGetter.getDrawable("OtherIcons/civTableBackground.png") + .tint(civ.getNation().getColor()) + val label = Label(civ.civName, CameraStageBaseScreen.skin) + label.setFontColor(civ.getNation().getSecondaryColor()) + civGroup.add(label).pad(10f) + civGroup.pack() + + val vector = HexMath().getVectorForAngle(2 * Math.PI.toFloat() *i / relevantCivs.size) + civGroup.center(group) + civGroup.moveBy(vector.x*groupSize/3, vector.y*groupSize/3) + + civGroups[civ]=civGroup + group.addActor(civGroup) + } + + for(civ in relevantCivs) + for(diplomacy in civ.diplomacy.values.filter { !it.otherCiv().isBarbarianCivilization() }){ + val civGroup = civGroups[civ]!! + val otherCivGroup = civGroups[diplomacy.otherCiv()]!! + + 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) + + statusLine.color = if(diplomacy.diplomaticStatus==DiplomaticStatus.War) Color.RED + else Color.GREEN + + group.addActor(statusLine) + statusLine.toBack() + } + + + return group + } } \ No newline at end of file diff --git a/core/src/com/unciv/ui/utils/ImageGetter.kt b/core/src/com/unciv/ui/utils/ImageGetter.kt index 0549dbe190..89326f3c50 100644 --- a/core/src/com/unciv/ui/utils/ImageGetter.kt +++ b/core/src/com/unciv/ui/utils/ImageGetter.kt @@ -10,6 +10,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.utils.Drawable import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable +import com.badlogic.gdx.utils.Align import com.unciv.models.gamebasics.GameBasics import com.unciv.models.gamebasics.tile.ResourceType @@ -163,4 +164,30 @@ object ImageGetter { healthBar.pack() return healthBar } + + fun getLine(startX:Float,startY:Float,endX:Float,endY:Float, width:Float): Image { + /** The simplest way to draw a line between 2 points seems to be: + * A. Get a pixel dot, set its width to the required length (hypotenuse) + * B. Set its rotational center, and set its rotation + * C. Center it on the point where you want its center to be + */ + + // A + val line = getWhiteDot() + val deltaX = (startX-endX).toDouble() + val deltaY = (startY-endY).toDouble() + line.width = Math.sqrt(deltaX*deltaX+deltaY*deltaY).toFloat() + line.height = width // the width of the line, is the height of the + + // B + line.setOrigin(Align.center) + val radiansToDegrees = 180 / Math.PI + line.rotation = (Math.atan2(deltaY, deltaX) * radiansToDegrees).toFloat() + + // C + line.x = (startX+endX)/2 - line.width/2 + line.y = (startY+endY)/2 - line.height/2 + + return line + } } \ No newline at end of file