mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-20 12:48:56 +07:00
Merge up to latest master (#12927)
This commit is contained in:
BIN
android/Images.ConstructionIcons/UnitActionIcons/Skip.png
Normal file
BIN
android/Images.ConstructionIcons/UnitActionIcons/Skip.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.7 KiB |
Binary file not shown.
Before Width: | Height: | Size: 896 B |
BIN
android/Images.Icons/OtherIcons/Skip.png
Normal file
BIN
android/Images.Icons/OtherIcons/Skip.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 896 B |
@ -27,7 +27,7 @@
|
||||
{"text": "Cities will house Citizens, which can work tiles up to 3 tiles away from the city. This means you don’t have to settle cities right on or next to good tiles. Let’s say, for example, that you want access to some Iron – but the resource is in a desert area. You don’t have to settle your city in the desert. You can settle a few tiles away in more prosperous lands. Your city will grow and eventually gain access to the resource. You only need to settle right on top of resources if you need them immediately."},
|
||||
{},
|
||||
{"text": "The first thing coming out of your city depends on the strategy you want to follow, but the 'classic' build order is to build first two Scouts, then a Shrine, and three Settlers, and adopt Tradition, to explore the map quickly (Scouts ignore terrain cost), and to get an early Pantheon (if you're playing with religion enabled)."},
|
||||
{"text": "But feel free to experiment with your own build orders!", "color": "#fa0"},
|
||||
{"text": "But feel free to experiment with your own build orders!", "color": "#fa0"}
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -129,7 +129,7 @@
|
||||
{"text":"This greatly improves the speed you can get Units around the map."},
|
||||
{"text":"Until you research the technology that removes it, Roads do not cross Rivers"},
|
||||
{"text":"Connecting your cities to the capital by Roads and/or Railroads will generate Gold via the Trade Route.","link":"Tutorials/Trade Route"},
|
||||
{"text":"However, since each Road and Railroad have a Maintenance Cost, it may be more economical to wait until the cities grow and only place where needed."},
|
||||
{"text":"However, since each Road and Railroad have a Maintenance Cost, it may be more economical to wait until the cities grow and only place where needed."}
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -233,7 +233,11 @@
|
||||
{
|
||||
"name": "Idle Units",
|
||||
"steps": [
|
||||
"If you don't want to move a unit this turn, you can skip it by clicking 'Next unit' again, or command the unit to 'Wait'.\nIf you won't be moving it for a while, you can have the unit enter Fortify or Sleep mode - \n units in Fortify or Sleep are not considered idle units.\nIf you want to disable the 'Next unit' feature entirely, you can toggle it in Menu -> Check for idle units."
|
||||
"Clicking 'Next unit' moves to the next idle unit in the queue (as listed in Overview -> Units). After issuing an order to an unit, if 'Auto Unit Cycle' in Options -> Gameplay is enabled, you will automatically select the next idle unit.",
|
||||
"If you don't want to move a unit this turn, you can skip it by clicking 'Next unit' again, or command the unit to 'Skip turn'.",
|
||||
"If you want to disable the 'Next unit' feature entirely, you can toggle it in Options -> Gameplay -> Check for idle units.",
|
||||
"If you'd rather 'Next unit' cycle the units and not mark them as Done, you can change it in the Options -> Gameplay menu.",
|
||||
"You can also cycle through the idle units using the left and right triangles on the Unit Table in the lower left of the screen. Or by default using the Cycle button next to the 'Next Unit' button."
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -348,7 +352,7 @@
|
||||
"⑥: Unit Action Buttons - while a unit is selected its possible actions appear here.",
|
||||
"⑦: The unit/city info pane - shows information about a selected unit or city.",
|
||||
"⑧: The name (and unit icon) of the selected unit or city, with current health if wounded. Clicking a unit name or icon will open its civilopedia entry.",
|
||||
"⑨: The arrow buttons allow jumping to the next/previous unit.",
|
||||
"⑨: The arrow buttons allow jumping to the next/previous idle unit.",
|
||||
"⑩: For a selected unit, its promotions appear here, and clicking leads to the promotions screen for that unit.",
|
||||
"⑪: Remaining/per turn movement points, strength and experience / XP needed for promotion. For cities, you get its combat strength.",
|
||||
"⑫: This button closes the selected unit/city info pane.",
|
||||
@ -494,7 +498,7 @@
|
||||
{"text":"The Intercepting Unit rolls to see if it hits. Whether it hits or not costs an Attack, and most units (without Promotions) can only Attack Once per Nation's Turn. It does NOT cost Movement Points, but Air Units that have used their Movement cannot Intercept between turns."},
|
||||
{"text":"If the Intercepting Unit Hits, it deals damage according to the Combat Strength calculation to the Attacking Air Unit, potentially with any Strength Bonuses that apply to Interception. It does not receive damage from the Attacking Air Unit."},
|
||||
{"text":"After Interception resolves, the Attacking Air Unit and the Defending Unit in the targeted tile do Combat as normal, with damage dealt to both sides."},
|
||||
{"text":"To help deal with Interceptions, see Air Sweeps.","link": "Tutorials/Air Sweeps"},
|
||||
{"text":"To help deal with Interceptions, see Air Sweeps.","link": "Tutorials/Air Sweeps"}
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -545,7 +549,7 @@
|
||||
{"text":"Spies at a higher rank have a higher chance of success. The max rank a spy can reach is rank 3. After a spy is killed it will revive after a certain amount of turns back at rank 1."},
|
||||
{"text":"Building buildings like the constabulary and police station will reduce the technology steal rate of spies in that city."},
|
||||
{},
|
||||
{"text":"Espionage is available using the Gods and Kings ruleset. To enable it in a new game click advanced settings, then click on the Enable Espionage option."},
|
||||
{"text":"Espionage is available using the Gods and Kings ruleset. To enable it in a new game click advanced settings, then click on the Enable Espionage option."}
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -671,7 +675,7 @@
|
||||
{},
|
||||
{"text":"Tile improvements\nIn Civilzation V, workers start working on an improvement-under-construction at the beginning of movement. Unciv changes this, to allow players to assign workers to tiles, and then reconsider and change improvement or move them elsewhere."},
|
||||
{},
|
||||
{"text":"Forest and Jungle Visibility\nIn Unciv, forests and jungles are visible 1 tile outside visibility range. In Civilization V, this is the behaviour of hills and mountains, but not of forests and jungles, yet jungle and forest can block hills, and hill + forest can block mountain, indicating they're on the same elevation. This is considered to be a bug in the otherwise well-structured visibility logic in Civilization V."},
|
||||
{"text":"Forest and Jungle Visibility\nIn Unciv, forests and jungles are visible 1 tile outside visibility range. In Civilization V, this is the behaviour of hills and mountains, but not of forests and jungles, yet jungle and forest can block hills, and hill + forest can block mountain, indicating they're on the same elevation. This is considered to be a bug in the otherwise well-structured visibility logic in Civilization V."}
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -679,7 +683,7 @@
|
||||
"civilopediaText": [
|
||||
{"text": "Founding Cities\nThe Settler is a unit that can found a new city. You can build a Settler unit in a city with at least 2 population, and then move them to a good location to found a new city. This will usually be your main way of acquiring more cities."},
|
||||
{},
|
||||
{"text": "Food conversion to Production\nDuring the construction of a Settler, the city will not grow. Instead, the 1st, 2nd, 4th, and from there on every 4th, excess Food (Growth) is converted into Production, with the rest of the excess Food being lost."},
|
||||
{"text": "Food conversion to Production\nDuring the construction of a Settler, the city will not grow. Instead, the 1st, 2nd, 4th, and from there on every 4th, excess Food (Growth) is converted into Production, with the rest of the excess Food being lost."}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
@ -1177,7 +1177,8 @@ turn =
|
||||
Next unit =
|
||||
[amount] units idle =
|
||||
[idleCount] idle =
|
||||
[waitingCount] waiting =
|
||||
[skipCount] skipping =
|
||||
Cycle =
|
||||
Fog of War =
|
||||
Pick a policy =
|
||||
Move Spies =
|
||||
@ -1227,7 +1228,8 @@ Pillage =
|
||||
Pillage [improvement] =
|
||||
[improvement] (Pillaged!) =
|
||||
Repair [improvement] - [turns] =
|
||||
Wait =
|
||||
Skip =
|
||||
Skip turn =
|
||||
Are you sure you want to pillage this [improvement]? =
|
||||
We have looted [amount] from a [improvement] =
|
||||
We have looted [amount] from a [improvement] which has been sent to [cityName] =
|
||||
|
@ -165,8 +165,8 @@ class Simulation(
|
||||
|
||||
val numSteps = max(steps.size, 1)
|
||||
val expWinRate = 1f / majorCivs
|
||||
val winRate = numWins[civ]!!.value * 100 / numSteps
|
||||
if (winRate == 0) continue
|
||||
if (numWins[civ]!!.value == 0) continue
|
||||
val winRate = String.format("%.1f", numWins[civ]!!.value * 100f / numSteps)
|
||||
|
||||
outString += "\n$civ:\n"
|
||||
outString += "$winRate% total win rate \n"
|
||||
|
@ -180,8 +180,8 @@ enum class UnitActionType(
|
||||
{ ImageGetter.getUnitActionPortrait("DisbandUnit") }, false, defaultPage = 1),
|
||||
GiftUnit("Gift unit",
|
||||
{ ImageGetter.getUnitActionPortrait("Present") }, UncivSound.Silent, defaultPage = 1),
|
||||
Wait("Wait",
|
||||
{ ImageGetter.getUnitActionPortrait("Wait") }, UncivSound.Silent),
|
||||
Skip("Skip turn",
|
||||
{ ImageGetter.getUnitActionPortrait("Skip") }, UncivSound.Silent, defaultPage = 0),
|
||||
ShowAdditionalActions("Show more",
|
||||
{ ImageGetter.getUnitActionPortrait("ShowMore") }, false),
|
||||
HideAdditionalActions("Back",
|
||||
|
@ -39,6 +39,7 @@ class GameSettings {
|
||||
var checkForDueUnits: Boolean = true
|
||||
var checkForDueUnitsCycles: Boolean = false
|
||||
var autoUnitCycle: Boolean = true
|
||||
var smallUnitButton: Boolean = true
|
||||
var singleTapMove: Boolean = false
|
||||
var longTapMove: Boolean = true
|
||||
var language: String = Constants.english
|
||||
|
@ -50,6 +50,7 @@ enum class KeyboardBinding(
|
||||
DeveloperConsole(Category.WorldScreen, '`'),
|
||||
PrevIdleButton(Category.WorldScreen, "Idle Prev",','),
|
||||
NextIdleButton(Category.WorldScreen, "Idle Next", '.'),
|
||||
Cycle(Category.WorldScreen, ';'),
|
||||
|
||||
/*
|
||||
* These try to be faithful to default Civ5 key bindings as found in several places online
|
||||
@ -136,7 +137,7 @@ enum class KeyboardBinding(
|
||||
EnhanceReligion(Category.UnitActions,"Enhance a Religion", 'g'),
|
||||
DisbandUnit(Category.UnitActions,"Disband unit", KeyCharAndCode.DEL),
|
||||
GiftUnit(Category.UnitActions,"Gift unit", KeyCharAndCode.UNKNOWN),
|
||||
Wait(Category.UnitActions, 'z'),
|
||||
Skip(Category.UnitActions, 'z'),
|
||||
ShowAdditionalActions(Category.UnitActions,"Show more", Input.Keys.PAGE_DOWN),
|
||||
HideAdditionalActions(Category.UnitActions,"Back", Input.Keys.PAGE_UP),
|
||||
AddInCapital(Category.UnitActions, "Add in capital", 'g'),
|
||||
|
@ -16,6 +16,7 @@ fun gameplayTab(
|
||||
|
||||
optionsPopup.addCheckbox(this, "Check for idle units", settings.checkForDueUnits, true) { settings.checkForDueUnits = it }
|
||||
optionsPopup.addCheckbox(this, "'Next unit' button cycles idle units", settings.checkForDueUnitsCycles, true) { settings.checkForDueUnitsCycles = it }
|
||||
optionsPopup.addCheckbox(this, "Show Small Skip/Cycle Unit Button", settings.smallUnitButton, true) { settings.smallUnitButton = it }
|
||||
optionsPopup.addCheckbox(this, "Auto Unit Cycle", settings.autoUnitCycle, true) { settings.autoUnitCycle = it }
|
||||
optionsPopup.addCheckbox(this, "Move units with a single tap", settings.singleTapMove) { settings.singleTapMove = it }
|
||||
optionsPopup.addCheckbox(this, "Move units with a long tap", settings.longTapMove) { settings.longTapMove = it }
|
||||
|
@ -57,6 +57,7 @@ import com.unciv.ui.screens.worldscreen.status.MultiplayerStatusButton
|
||||
import com.unciv.ui.screens.worldscreen.status.NextTurnButton
|
||||
import com.unciv.ui.screens.worldscreen.status.NextTurnProgress
|
||||
import com.unciv.ui.screens.worldscreen.status.StatusButtons
|
||||
import com.unciv.ui.screens.worldscreen.status.SmallUnitButton
|
||||
import com.unciv.ui.screens.worldscreen.topbar.WorldScreenTopBar
|
||||
import com.unciv.ui.screens.worldscreen.unit.AutoPlay
|
||||
import com.unciv.ui.screens.worldscreen.unit.UnitTable
|
||||
@ -121,6 +122,7 @@ class WorldScreen(
|
||||
internal val notificationsScroll = NotificationsScroll(this)
|
||||
internal val nextTurnButton = NextTurnButton(this)
|
||||
private val statusButtons = StatusButtons(nextTurnButton)
|
||||
internal val smallUnitButton = SmallUnitButton(this, statusButtons)
|
||||
private val tutorialTaskTable = Table().apply {
|
||||
background = skinStrings.getUiBackground("WorldScreen/TutorialTaskTable", tintColor = skinStrings.skinConfig.baseColor.darken(0.5f))
|
||||
}
|
||||
@ -669,13 +671,10 @@ class WorldScreen(
|
||||
updateAutoPlayStatusButton()
|
||||
updateMultiplayerStatusButton()
|
||||
|
||||
statusButtons.wrap(false)
|
||||
statusButtons.pack()
|
||||
statusButtons.update(false)
|
||||
val maxWidth = stage.width - techPolicyAndDiplomacy.width - 25f
|
||||
if(statusButtons.width > maxWidth) {
|
||||
statusButtons.width = maxWidth
|
||||
statusButtons.wrap()
|
||||
statusButtons.pack()
|
||||
statusButtons.update(true)
|
||||
}
|
||||
statusButtons.setPosition(stage.width - statusButtons.width - 10f, topBar.y - statusButtons.height - 10f)
|
||||
}
|
||||
|
@ -52,6 +52,8 @@ class NextTurnButton(
|
||||
|| (!worldScreen.hasOpenPopups() && worldScreen.isPlayersTurn
|
||||
&& !worldScreen.waitingForAutosave && !worldScreen.isNextTurnUpdateRunning())
|
||||
if (isEnabled) addTooltip(KeyboardBinding.NextTurn) else addTooltip("")
|
||||
|
||||
worldScreen.smallUnitButton.update()
|
||||
}
|
||||
|
||||
internal fun updateButton(nextTurnAction: NextTurnAction) {
|
||||
@ -76,4 +78,7 @@ class NextTurnButton(
|
||||
private fun getNextTurnAction(worldScreen: WorldScreen) =
|
||||
// Guaranteed to return a non-null NextTurnAction because the last isChoice always returns true
|
||||
NextTurnAction.entries.first { it.isChoice(worldScreen) }
|
||||
|
||||
fun isNextUnitAction(): Boolean = nextTurnAction == NextTurnAction.NextUnit
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,55 @@
|
||||
package com.unciv.ui.screens.worldscreen.status
|
||||
|
||||
import com.unciv.models.translations.tr
|
||||
import com.unciv.ui.components.UncivTooltip.Companion.addTooltip
|
||||
import com.unciv.ui.components.extensions.isEnabled
|
||||
import com.unciv.ui.components.extensions.setSize
|
||||
import com.unciv.ui.components.input.KeyboardBinding
|
||||
import com.unciv.ui.components.input.keyShortcuts
|
||||
import com.unciv.ui.components.input.onActivation
|
||||
import com.unciv.ui.images.IconTextButton
|
||||
import com.unciv.ui.images.ImageGetter
|
||||
import com.unciv.ui.screens.worldscreen.WorldScreen
|
||||
|
||||
const val nextLabel = "Cycle"
|
||||
const val skipLabel = "Skip"
|
||||
|
||||
class SmallUnitButton(
|
||||
private val worldScreen: WorldScreen,
|
||||
private val statusButtons: StatusButtons
|
||||
) : IconTextButton("", null, fontColor = NextTurnAction.NextUnit.color) {
|
||||
|
||||
private var isSkip = worldScreen.game.settings.checkForDueUnitsCycles
|
||||
|
||||
init {
|
||||
onActivation {
|
||||
worldScreen.switchToNextUnit(resetDue = isSkip)
|
||||
}
|
||||
}
|
||||
|
||||
fun update() {
|
||||
keyShortcuts.clear()
|
||||
isSkip = worldScreen.game.settings.checkForDueUnitsCycles // refresh value
|
||||
if(isSkip) {
|
||||
label.setText(skipLabel.tr())
|
||||
iconCell.setActor(ImageGetter.getImage("OtherIcons/Skip").apply { setSize(20f) })
|
||||
//keyShortcuts.add(KeyboardBinding.Skip) // don't double binding
|
||||
addTooltip(KeyboardBinding.Skip)
|
||||
} else {
|
||||
label.setText(nextLabel.tr())
|
||||
iconCell.setActor(ImageGetter.getImage("OtherIcons/Loading").apply { setSize(20f) })
|
||||
keyShortcuts.add(KeyboardBinding.Cycle)
|
||||
addTooltip(KeyboardBinding.Cycle)
|
||||
}
|
||||
val nextTurnButton = statusButtons.nextTurnButton
|
||||
val visible = worldScreen.game.settings.smallUnitButton
|
||||
&& nextTurnButton.isVisible
|
||||
&& nextTurnButton.isNextUnitAction()
|
||||
&& worldScreen.bottomUnitTable.selectedUnit != null
|
||||
statusButtons.smallUnitButton = if (visible) this else null
|
||||
isEnabled = visible && nextTurnButton.isEnabled
|
||||
&& worldScreen.bottomUnitTable.selectedUnit?.run { due && isIdle() } == true
|
||||
pack()
|
||||
}
|
||||
|
||||
}
|
@ -1,44 +1,44 @@
|
||||
package com.unciv.ui.screens.worldscreen.status
|
||||
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup
|
||||
import com.badlogic.gdx.scenes.scene2d.ui.Table
|
||||
import com.badlogic.gdx.utils.Disposable
|
||||
|
||||
class StatusButtons(
|
||||
nextTurnButton: NextTurnButton,
|
||||
autoPlayStatusButton: AutoPlayStatusButton? = null,
|
||||
multiplayerStatusButton: MultiplayerStatusButton? = null
|
||||
) : HorizontalGroup(), Disposable {
|
||||
var autoPlayStatusButton: AutoPlayStatusButton? = autoPlayStatusButton
|
||||
set(button) {
|
||||
autoPlayStatusButton?.remove()
|
||||
field = button
|
||||
if (button != null) {
|
||||
addActorAt(0, button)
|
||||
}
|
||||
}
|
||||
var multiplayerStatusButton: MultiplayerStatusButton? = multiplayerStatusButton
|
||||
set(button) {
|
||||
multiplayerStatusButton?.remove()
|
||||
field = button
|
||||
if (button != null) {
|
||||
addActorAt(0, button)
|
||||
}
|
||||
}
|
||||
val nextTurnButton: NextTurnButton
|
||||
) : Table(), Disposable {
|
||||
var autoPlayStatusButton: AutoPlayStatusButton? = null
|
||||
var multiplayerStatusButton: MultiplayerStatusButton? = null
|
||||
var smallUnitButton: SmallUnitButton? = null
|
||||
private val padXSpace = 10f
|
||||
private val padYSpace = 5f
|
||||
|
||||
|
||||
init {
|
||||
space(10f)
|
||||
right()
|
||||
wrapReverse()
|
||||
wrapSpace(10f)
|
||||
rowRight()
|
||||
if (autoPlayStatusButton != null) {
|
||||
addActor(autoPlayStatusButton)
|
||||
add(nextTurnButton)
|
||||
}
|
||||
|
||||
fun update(verticalWrap: Boolean) {
|
||||
clear()
|
||||
if(verticalWrap) {
|
||||
add(nextTurnButton)
|
||||
smallUnitButton?.let {
|
||||
row()
|
||||
add(it).padTop(padYSpace).right()
|
||||
}
|
||||
autoPlayStatusButton?.let {
|
||||
row()
|
||||
add(it).padTop(padYSpace).right()
|
||||
}
|
||||
multiplayerStatusButton?.let {
|
||||
row()
|
||||
add(it).padTop(padYSpace).right()
|
||||
}
|
||||
} else {
|
||||
multiplayerStatusButton?.let { add(it).padRight(padXSpace).top() }
|
||||
autoPlayStatusButton?.let { add(it).padRight(padXSpace).top() }
|
||||
smallUnitButton?.let { add(it).padRight(padXSpace).top() }
|
||||
add(nextTurnButton)
|
||||
}
|
||||
if (multiplayerStatusButton != null) {
|
||||
addActor(multiplayerStatusButton)
|
||||
}
|
||||
addActor(nextTurnButton)
|
||||
pack()
|
||||
}
|
||||
|
||||
override fun dispose() {
|
||||
|
@ -155,7 +155,7 @@ object UnitActions {
|
||||
|
||||
addExplorationActions(unit)
|
||||
|
||||
addWaitAction(unit)
|
||||
addSkipAction(unit)
|
||||
|
||||
// From here we have actions defaulting to the second page
|
||||
if (unit.isMoving()) {
|
||||
@ -377,10 +377,11 @@ object UnitActions {
|
||||
))
|
||||
}
|
||||
|
||||
private suspend fun SequenceScope<UnitAction>.addWaitAction(unit: MapUnit) {
|
||||
// Skip one turn: marks a unit as due=false and doesn't cycle back in the queue
|
||||
private suspend fun SequenceScope<UnitAction>.addSkipAction(unit: MapUnit) {
|
||||
yield(UnitAction(
|
||||
type = UnitActionType.Wait,
|
||||
useFrequency = 65f, // Preferably have this on the first page
|
||||
type = UnitActionType.Skip,
|
||||
useFrequency = 0f, // Last on first page (defaultPage=0)
|
||||
action = {
|
||||
unit.due = !unit.due
|
||||
// If it's on, skips to next unit due to worldScreen.switchToNextUnit() in activateAction
|
||||
|
@ -23,7 +23,7 @@ class SummaryPresenter(private val unitTable: UnitTable) : UnitTable.Presenter {
|
||||
|
||||
val subText = mutableListOf<String>().apply {
|
||||
if (idleCount > 0) add("[$idleCount] idle".tr())
|
||||
if (waitingCount > 0) add("[$waitingCount] waiting".tr())
|
||||
if (waitingCount > 0) add("[$waitingCount] skipping".tr())
|
||||
}.joinToString(", ")
|
||||
|
||||
if(subText!="") {
|
||||
|
@ -710,7 +710,7 @@ HexaRealm tileset images by legacymtgsalvationuser69544 [here](https://github.co
|
||||
- [City](https://thenounproject.com/icon/city-571332) By Felix Westphal
|
||||
- [Fire](https://thenounproject.com/icon/96564) By Lloyd Humphreys for "city being razed" icon
|
||||
- [Sleep](https://thenounproject.com/icon/sleep-1760085) By Saeful Muslim for unit "sleep" action and status
|
||||
- [Clockwise](https://thenounproject.com/icon/clockwise-184528/) By Universal Icons (Louis Dawson) for "Wait" icon. The original work has been slightly modified.
|
||||
- [Skip](https://www.flaticon.com/free-icon/jump_3976216) by Freq Wazza for Skip icon
|
||||
- [Banner](https://thenounproject.com/term/banner/866282/) By Emir Palavan for embarked units
|
||||
- [Arrow](https://thenounproject.com/icon/arrow-2032227/) By uzeir syarief for moving between idle units, expanders, etc.
|
||||
- [Exchange](https://thenounproject.com/icon/exchange-17858) By Mike Rowe for switching tiles between cities
|
||||
|
Reference in New Issue
Block a user