mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-29 06:51:30 -04:00
Removed UnitContextMenu, since it wasn't actually being used and was causing problems
This commit is contained in:
parent
0c1e318334
commit
b076f482aa
@ -136,13 +136,13 @@ object GameStarter {
|
|||||||
gameInfo.tileMap)
|
gameInfo.tileMap)
|
||||||
|
|
||||||
// For later starting eras, or for civs like Polynesia with a different Warrior, we need different starting units
|
// For later starting eras, or for civs like Polynesia with a different Warrior, we need different starting units
|
||||||
fun getWarriorEquivalent(civ: CivilizationInfo): String {
|
fun getWarriorEquivalent(civ: CivilizationInfo): String? {
|
||||||
val availableMilitaryUnits = gameInfo.ruleSet.units.values.filter {
|
val availableMilitaryUnits = gameInfo.ruleSet.units.values.filter {
|
||||||
it.isBuildable(civ)
|
it.isBuildable(civ)
|
||||||
&& it.unitType.isLandUnit()
|
&& it.unitType.isLandUnit()
|
||||||
&& !it.unitType.isCivilian()
|
&& !it.unitType.isCivilian()
|
||||||
}
|
}
|
||||||
return availableMilitaryUnits.maxBy { max(it.strength, it.rangedStrength) }!!.name
|
return availableMilitaryUnits.maxBy { max(it.strength, it.rangedStrength) }?.name
|
||||||
}
|
}
|
||||||
// no starting units for Barbarians and Spectators
|
// no starting units for Barbarians and Spectators
|
||||||
for (civ in gameInfo.civilizations.filter { !it.isBarbarian() && !it.isSpectator() }) {
|
for (civ in gameInfo.civilizations.filter { !it.isBarbarian() && !it.isSpectator() }) {
|
||||||
@ -155,12 +155,13 @@ object GameStarter {
|
|||||||
civ.placeUnitNearTile(startingLocation.position, unitName)
|
civ.placeUnitNearTile(startingLocation.position, unitName)
|
||||||
}
|
}
|
||||||
placeNearStartingPosition(Constants.settler)
|
placeNearStartingPosition(Constants.settler)
|
||||||
placeNearStartingPosition(getWarriorEquivalent(civ))
|
val warriorEquivalent = getWarriorEquivalent(civ)
|
||||||
|
if(warriorEquivalent!=null) placeNearStartingPosition(warriorEquivalent)
|
||||||
|
|
||||||
if (!civ.isPlayerCivilization() && civ.isMajorCiv()) {
|
if (!civ.isPlayerCivilization() && civ.isMajorCiv()) {
|
||||||
for (unit in gameInfo.getDifficulty().aiFreeUnits) {
|
for (unit in gameInfo.getDifficulty().aiFreeUnits) {
|
||||||
val unitToAdd = if (unit == "Warrior") getWarriorEquivalent(civ) else unit
|
val unitToAdd = if (unit == "Warrior") warriorEquivalent else unit
|
||||||
placeNearStartingPosition(unitToAdd)
|
if (unitToAdd != null) placeNearStartingPosition(unitToAdd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,6 @@ 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.utils.*
|
import com.unciv.ui.utils.*
|
||||||
import com.unciv.ui.worldscreen.unit.UnitContextMenu
|
|
||||||
import kotlin.concurrent.thread
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
|
|
||||||
@ -44,7 +43,7 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap
|
|||||||
|
|
||||||
val allTiles = TileGroupMap(daTileGroups,worldScreen.stage.width)
|
val allTiles = TileGroupMap(daTileGroups,worldScreen.stage.width)
|
||||||
|
|
||||||
for(tileGroup in tileGroups.values){
|
for(tileGroup in tileGroups.values) {
|
||||||
tileGroup.cityButtonLayerGroup.onClick(UncivSound.Silent) {
|
tileGroup.cityButtonLayerGroup.onClick(UncivSound.Silent) {
|
||||||
onTileClicked(tileGroup.tileInfo)
|
onTileClicked(tileGroup.tileInfo)
|
||||||
}
|
}
|
||||||
@ -55,14 +54,13 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap
|
|||||||
init {
|
init {
|
||||||
button = Input.Buttons.RIGHT
|
button = Input.Buttons.RIGHT
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun clicked(event: InputEvent?, x: Float, y: Float) {
|
override fun clicked(event: InputEvent?, x: Float, y: Float) {
|
||||||
val unit = worldScreen.bottomUnitTable.selectedUnit
|
val unit = worldScreen.bottomUnitTable.selectedUnit
|
||||||
if (unit == null) return
|
if (unit == null) return
|
||||||
thread {
|
thread {
|
||||||
val canUnitReachTile = unit.movement.canReach(tileGroup.tileInfo)
|
val canUnitReachTile = unit.movement.canReach(tileGroup.tileInfo)
|
||||||
if (canUnitReachTile) {
|
if (canUnitReachTile) moveUnitToTargetTile(unit, tileGroup.tileInfo)
|
||||||
UnitContextMenu(this@WorldMapHolder, unit, tileGroup.tileInfo).onMoveButtonClick()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -111,6 +109,42 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap
|
|||||||
worldScreen.shouldUpdate = true
|
worldScreen.shouldUpdate = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun moveUnitToTargetTile(selectedUnit: MapUnit, targetTile:TileInfo) {
|
||||||
|
// this can take a long time, because of the unit-to-tile calculation needed, so we put it in a different thread
|
||||||
|
thread(name = "TileToMoveTo") {
|
||||||
|
// these are the heavy parts, finding where we want to go
|
||||||
|
// Since this runs in a different thread, even if we check movement.canReach()
|
||||||
|
// then it might change until we get to the getTileToMoveTo, so we just try/catch it
|
||||||
|
val tileToMoveTo: TileInfo
|
||||||
|
try {
|
||||||
|
tileToMoveTo = selectedUnit.movement.getTileToMoveToThisTurn(targetTile)
|
||||||
|
} catch (ex: Exception) {
|
||||||
|
return@thread
|
||||||
|
} // can't move here
|
||||||
|
|
||||||
|
Gdx.app.postRunnable {
|
||||||
|
try {
|
||||||
|
// Because this is darned concurrent (as it MUST be to avoid ANRs),
|
||||||
|
// there are edge cases where the canReach is true,
|
||||||
|
// but until it reaches the headTowards the board has changed and so the headTowards fails.
|
||||||
|
// I can't think of any way to avoid this,
|
||||||
|
// but it's so rare and edge-case-y that ignoring its failure is actually acceptable, hence the empty catch
|
||||||
|
selectedUnit.movement.moveToTile(tileToMoveTo)
|
||||||
|
if (selectedUnit.action == Constants.unitActionExplore) selectedUnit.action = null // remove explore on manual move
|
||||||
|
Sounds.play(UncivSound.Whoosh)
|
||||||
|
if (selectedUnit.currentTile != targetTile)
|
||||||
|
selectedUnit.action = "moveTo " + targetTile.position.x.toInt() + "," + targetTile.position.y.toInt()
|
||||||
|
if (selectedUnit.currentMovement > 0) worldScreen.bottomUnitTable.selectedUnit = selectedUnit
|
||||||
|
|
||||||
|
worldScreen.shouldUpdate = true
|
||||||
|
unitActionOverlay?.remove()
|
||||||
|
} catch (e: Exception) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun addTileOverlaysWithUnitMovement(selectedUnit: MapUnit, tileInfo: TileInfo) {
|
private fun addTileOverlaysWithUnitMovement(selectedUnit: MapUnit, tileInfo: TileInfo) {
|
||||||
// some code is copied from canReach not to call getShortestPath on the main thread before calling it on this thread
|
// some code is copied from canReach not to call getShortestPath on the main thread before calling it on this thread
|
||||||
if (selectedUnit.type.isAirUnit() && selectedUnit.currentTile.aerialDistanceTo(tileInfo) > selectedUnit.getRange()*2) {
|
if (selectedUnit.type.isAirUnit() && selectedUnit.currentTile.aerialDistanceTo(tileInfo) > selectedUnit.getRange()*2) {
|
||||||
@ -195,7 +229,7 @@ class WorldMapHolder(internal val worldScreen: WorldScreen, internal val tileMap
|
|||||||
UncivGame.Current.settings.addCompletedTutorialTask("Move unit")
|
UncivGame.Current.settings.addCompletedTutorialTask("Move unit")
|
||||||
if(dto.unit.type.isAirUnit())
|
if(dto.unit.type.isAirUnit())
|
||||||
UncivGame.Current.settings.addCompletedTutorialTask("Move an air unit")
|
UncivGame.Current.settings.addCompletedTutorialTask("Move an air unit")
|
||||||
UnitContextMenu(this, dto.unit, dto.tileInfo).onMoveButtonClick()
|
moveUnitToTargetTile(dto.unit, dto.tileInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
else moveHereButton.color.a = 0.5f
|
else moveHereButton.color.a = 0.5f
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
package com.unciv.ui.worldscreen.unit
|
|
||||||
|
|
||||||
import com.badlogic.gdx.Gdx
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.Actor
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.Button
|
|
||||||
import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup
|
|
||||||
import com.unciv.Constants
|
|
||||||
import com.unciv.logic.map.MapUnit
|
|
||||||
import com.unciv.logic.map.TileInfo
|
|
||||||
import com.unciv.logic.map.action.BuildLongRoadAction
|
|
||||||
import com.unciv.logic.map.action.MapUnitAction
|
|
||||||
import com.unciv.models.UncivSound
|
|
||||||
import com.unciv.ui.utils.CameraStageBaseScreen
|
|
||||||
import com.unciv.ui.utils.ImageGetter
|
|
||||||
import com.unciv.ui.utils.Sounds
|
|
||||||
import com.unciv.ui.utils.onClick
|
|
||||||
import com.unciv.ui.worldscreen.WorldMapHolder
|
|
||||||
import kotlin.concurrent.thread
|
|
||||||
|
|
||||||
class UnitContextMenu(val tileMapHolder: WorldMapHolder, val selectedUnit: MapUnit, val targetTile: TileInfo) : VerticalGroup() {
|
|
||||||
|
|
||||||
init {
|
|
||||||
|
|
||||||
space(10f)
|
|
||||||
|
|
||||||
addButton(ImageGetter.getStatIcon("Movement"), "Move unit") {
|
|
||||||
onMoveButtonClick()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Basic scenarios sommetimes don't have roads
|
|
||||||
if (selectedUnit.civInfo.gameInfo.ruleSet.tileImprovements.containsKey("Road"))
|
|
||||||
addButton(
|
|
||||||
ImageGetter.getImprovementIcon("Road"),
|
|
||||||
"Construct road",
|
|
||||||
BuildLongRoadAction(selectedUnit, targetTile)
|
|
||||||
)
|
|
||||||
|
|
||||||
pack()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun addButton(icon: Actor, label: String, action: MapUnitAction) {
|
|
||||||
if (action.isAvailable()) {
|
|
||||||
addButton(icon, label) {
|
|
||||||
selectedUnit.mapUnitAction = action
|
|
||||||
selectedUnit.mapUnitAction?.doPreTurnAction()
|
|
||||||
tileMapHolder.unitActionOverlay?.remove()
|
|
||||||
tileMapHolder.worldScreen.shouldUpdate = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun addButton(icon: Actor, label: String, action: () -> Unit) {
|
|
||||||
val skin = CameraStageBaseScreen.skin
|
|
||||||
val button = Button(skin)
|
|
||||||
button.add(icon).size(20f).padRight(10f)
|
|
||||||
button.add(label)
|
|
||||||
addActor(button)
|
|
||||||
button.onClick { action() }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onMoveButtonClick() {
|
|
||||||
// this can take a long time, because of the unit-to-tile calculation needed, so we put it in a different thread
|
|
||||||
thread(name = "TileToMoveTo") {
|
|
||||||
// these are the heavy parts, finding where we want to go
|
|
||||||
// Since this runs in a different thread, even if we check movement.canReach()
|
|
||||||
// then it might change until we get to the getTileToMoveTo, so we just try/catch it
|
|
||||||
val tileToMoveTo: TileInfo
|
|
||||||
try {
|
|
||||||
tileToMoveTo = selectedUnit.movement.getTileToMoveToThisTurn(targetTile)
|
|
||||||
} catch (ex: Exception) {
|
|
||||||
return@thread
|
|
||||||
} // can't move here
|
|
||||||
|
|
||||||
Gdx.app.postRunnable {
|
|
||||||
try {
|
|
||||||
// Because this is darned concurrent (as it MUST be to avoid ANRs),
|
|
||||||
// there are edge cases where the canReach is true,
|
|
||||||
// but until it reaches the headTowards the board has changed and so the headTowards fails.
|
|
||||||
// I can't think of any way to avoid this,
|
|
||||||
// but it's so rare and edge-case-y that ignoring its failure is actually acceptable, hence the empty catch
|
|
||||||
selectedUnit.movement.moveToTile(tileToMoveTo)
|
|
||||||
if (selectedUnit.action == Constants.unitActionExplore) selectedUnit.action = null // remove explore on manual move
|
|
||||||
Sounds.play(UncivSound.Whoosh)
|
|
||||||
if (selectedUnit.currentTile != targetTile)
|
|
||||||
selectedUnit.action = "moveTo " + targetTile.position.x.toInt() + "," + targetTile.position.y.toInt()
|
|
||||||
if (selectedUnit.currentMovement > 0) {
|
|
||||||
tileMapHolder.worldScreen.bottomUnitTable.selectedUnit = selectedUnit
|
|
||||||
}
|
|
||||||
|
|
||||||
tileMapHolder.worldScreen.shouldUpdate = true
|
|
||||||
tileMapHolder.unitActionOverlay?.remove()
|
|
||||||
} catch (e: Exception) {}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user