mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-10 15:59:33 +07:00
RFC: Direction for converting unit actions to map (#10632)
* Direction for converting unit actions, so that invokeUnitAction() doesn't try to generate *all* possible unit actions just to choose one * Mapped many unit actions
This commit is contained in:
@ -23,29 +23,37 @@ object UnitActions {
|
|||||||
|
|
||||||
/** Returns whether the action was invoked */
|
/** Returns whether the action was invoked */
|
||||||
fun invokeUnitAction(unit: MapUnit, unitActionType: UnitActionType): Boolean {
|
fun invokeUnitAction(unit: MapUnit, unitActionType: UnitActionType): Boolean {
|
||||||
val unitAction = getNormalActions(unit).firstOrNull { it.type == unitActionType }
|
val unitAction = actionTypeToFunctions[unitActionType]?.invoke(unit, unit.getTile())?.firstOrNull()
|
||||||
|
?: getNormalActions(unit).firstOrNull { it.type == unitActionType }
|
||||||
?: getAdditionalActions(unit).firstOrNull { it.type == unitActionType }
|
?: getAdditionalActions(unit).firstOrNull { it.type == unitActionType }
|
||||||
val internalAction = unitAction?.action ?: return false
|
val internalAction = unitAction?.action ?: return false
|
||||||
internalAction.invoke()
|
internalAction.invoke()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val actionTypeToFunctions = linkedMapOf<UnitActionType, (unit:MapUnit, tile:Tile) -> Iterable<UnitAction>>(
|
||||||
|
// Determined by unit uniques
|
||||||
|
UnitActionType.Transform to UnitActionsFromUniques::getTransformActions,
|
||||||
|
UnitActionType.Paradrop to UnitActionsFromUniques::getParadropActions,
|
||||||
|
UnitActionType.AirSweep to UnitActionsFromUniques::getAirSweepActions,
|
||||||
|
UnitActionType.SetUp to UnitActionsFromUniques::getSetupActions,
|
||||||
|
UnitActionType.FoundCity to UnitActionsFromUniques::getFoundCityActions,
|
||||||
|
UnitActionType.ConstructImprovement to UnitActionsFromUniques::getBuildingImprovementsActions,
|
||||||
|
UnitActionType.Repair to UnitActionsFromUniques::getRepairActions
|
||||||
|
)
|
||||||
|
|
||||||
private fun getNormalActions(unit: MapUnit): List<UnitAction> {
|
private fun getNormalActions(unit: MapUnit): List<UnitAction> {
|
||||||
val tile = unit.getTile()
|
val tile = unit.getTile()
|
||||||
val actionList = ArrayList<UnitAction>()
|
val actionList = ArrayList<UnitAction>()
|
||||||
|
|
||||||
|
for (getActionsFunction in actionTypeToFunctions.values)
|
||||||
|
actionList.addAll(getActionsFunction(unit, tile))
|
||||||
|
|
||||||
// Determined by unit uniques
|
// Determined by unit uniques
|
||||||
UnitActionsFromUniques.addTransformActions(unit, actionList)
|
|
||||||
UnitActionsFromUniques.addParadropAction(unit, actionList)
|
|
||||||
UnitActionsFromUniques.addAirSweepAction(unit, actionList)
|
|
||||||
UnitActionsFromUniques.addSetupAction(unit, actionList)
|
|
||||||
UnitActionsFromUniques.addFoundCityAction(unit, actionList, tile)
|
|
||||||
UnitActionsFromUniques.addBuildingImprovementsAction(unit, actionList, tile)
|
|
||||||
UnitActionsFromUniques.addRepairAction(unit, actionList)
|
|
||||||
UnitActionsFromUniques.addCreateWaterImprovements(unit, actionList)
|
|
||||||
UnitActionsGreatPerson.addGreatPersonActions(unit, actionList, tile)
|
UnitActionsGreatPerson.addGreatPersonActions(unit, actionList, tile)
|
||||||
UnitActionsReligion.addFoundReligionAction(unit, actionList)
|
UnitActionsReligion.addFoundReligionAction(unit, actionList)
|
||||||
UnitActionsReligion.addEnhanceReligionAction(unit, actionList)
|
UnitActionsReligion.addEnhanceReligionAction(unit, actionList)
|
||||||
|
UnitActionsFromUniques.addCreateWaterImprovements(unit, actionList)
|
||||||
actionList += UnitActionsFromUniques.getImprovementConstructionActions(unit, tile)
|
actionList += UnitActionsFromUniques.getImprovementConstructionActions(unit, tile)
|
||||||
UnitActionsReligion.addSpreadReligionActions(unit, actionList)
|
UnitActionsReligion.addSpreadReligionActions(unit, actionList)
|
||||||
UnitActionsReligion.addRemoveHeresyActions(unit, actionList)
|
UnitActionsReligion.addRemoveHeresyActions(unit, actionList)
|
||||||
|
@ -46,9 +46,10 @@ object UnitActionsFromUniques {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun addFoundCityAction(unit: MapUnit, actionList: ArrayList<UnitAction>, tile: Tile) {
|
|
||||||
val getFoundCityAction = getFoundCityAction(unit, tile)
|
fun getFoundCityActions(unit: MapUnit, tile: Tile): List<UnitAction> {
|
||||||
if (getFoundCityAction != null) actionList += getFoundCityAction
|
val getFoundCityAction = getFoundCityAction(unit, tile) ?: return emptyList()
|
||||||
|
return listOf(getFoundCityAction)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Produce a [UnitAction] for founding a city.
|
/** Produce a [UnitAction] for founding a city.
|
||||||
@ -135,39 +136,41 @@ object UnitActionsFromUniques {
|
|||||||
return if(brokenPromises.isEmpty()) null else brokenPromises.joinToString(", ")
|
return if(brokenPromises.isEmpty()) null else brokenPromises.joinToString(", ")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addSetupAction(unit: MapUnit, actionList: ArrayList<UnitAction>) {
|
fun getSetupActions(unit: MapUnit, tile: Tile): List<UnitAction> {
|
||||||
if (!unit.hasUnique(UniqueType.MustSetUp) || unit.isEmbarked()) return
|
if (!unit.hasUnique(UniqueType.MustSetUp) || unit.isEmbarked()) return emptyList()
|
||||||
val isSetUp = unit.isSetUpForSiege()
|
val isSetUp = unit.isSetUpForSiege()
|
||||||
actionList += UnitAction(UnitActionType.SetUp,
|
return listOf(UnitAction(UnitActionType.SetUp,
|
||||||
isCurrentAction = isSetUp,
|
isCurrentAction = isSetUp,
|
||||||
action = {
|
action = {
|
||||||
unit.action = UnitActionType.SetUp.value
|
unit.action = UnitActionType.SetUp.value
|
||||||
unit.useMovementPoints(1f)
|
unit.useMovementPoints(1f)
|
||||||
}.takeIf { unit.currentMovement > 0 && !isSetUp })
|
}.takeIf { unit.currentMovement > 0 && !isSetUp })
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addParadropAction(unit: MapUnit, actionList: ArrayList<UnitAction>) {
|
fun getParadropActions(unit: MapUnit, tile: Tile): List<UnitAction> {
|
||||||
val paradropUniques =
|
val paradropUniques =
|
||||||
unit.getMatchingUniques(UniqueType.MayParadrop)
|
unit.getMatchingUniques(UniqueType.MayParadrop)
|
||||||
if (!paradropUniques.any() || unit.isEmbarked()) return
|
if (!paradropUniques.any() || unit.isEmbarked()) return emptyList()
|
||||||
unit.cache.paradropRange = paradropUniques.maxOfOrNull { it.params[0] }!!.toInt()
|
unit.cache.paradropRange = paradropUniques.maxOfOrNull { it.params[0] }!!.toInt()
|
||||||
actionList += UnitAction(UnitActionType.Paradrop,
|
return listOf(UnitAction(UnitActionType.Paradrop,
|
||||||
isCurrentAction = unit.isPreparingParadrop(),
|
isCurrentAction = unit.isPreparingParadrop(),
|
||||||
action = {
|
action = {
|
||||||
if (unit.isPreparingParadrop()) unit.action = null
|
if (unit.isPreparingParadrop()) unit.action = null
|
||||||
else unit.action = UnitActionType.Paradrop.value
|
else unit.action = UnitActionType.Paradrop.value
|
||||||
}.takeIf {
|
}.takeIf {
|
||||||
!unit.hasUnitMovedThisTurn() &&
|
!unit.hasUnitMovedThisTurn() &&
|
||||||
unit.currentTile.isFriendlyTerritory(unit.civ) &&
|
tile.isFriendlyTerritory(unit.civ) &&
|
||||||
!unit.isEmbarked()
|
!tile.isWater
|
||||||
})
|
})
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addAirSweepAction(unit: MapUnit, actionList: ArrayList<UnitAction>) {
|
fun getAirSweepActions(unit: MapUnit, tile: Tile): List<UnitAction> {
|
||||||
val airsweepUniques =
|
val airsweepUniques =
|
||||||
unit.getMatchingUniques(UniqueType.CanAirsweep)
|
unit.getMatchingUniques(UniqueType.CanAirsweep)
|
||||||
if (!airsweepUniques.any()) return
|
if (!airsweepUniques.any()) return emptyList()
|
||||||
actionList += UnitAction(UnitActionType.AirSweep,
|
return listOf(UnitAction(UnitActionType.AirSweep,
|
||||||
isCurrentAction = unit.isPreparingAirSweep(),
|
isCurrentAction = unit.isPreparingAirSweep(),
|
||||||
action = {
|
action = {
|
||||||
if (unit.isPreparingAirSweep()) unit.action = null
|
if (unit.isPreparingAirSweep()) unit.action = null
|
||||||
@ -175,7 +178,7 @@ object UnitActionsFromUniques {
|
|||||||
}.takeIf {
|
}.takeIf {
|
||||||
unit.canAttack()
|
unit.canAttack()
|
||||||
}
|
}
|
||||||
)
|
))
|
||||||
}
|
}
|
||||||
fun addTriggerUniqueActions(unit: MapUnit, actionList: ArrayList<UnitAction>) {
|
fun addTriggerUniqueActions(unit: MapUnit, actionList: ArrayList<UnitAction>) {
|
||||||
for (unique in unit.getUniques()) {
|
for (unique in unit.getUniques()) {
|
||||||
@ -271,16 +274,9 @@ object UnitActionsFromUniques {
|
|||||||
return finalActions
|
return finalActions
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addTransformActions(
|
|
||||||
unit: MapUnit,
|
|
||||||
actionList: ArrayList<UnitAction>
|
|
||||||
) {
|
|
||||||
val upgradeAction = getTransformActions(unit)
|
|
||||||
actionList += upgradeAction
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getTransformActions(
|
fun getTransformActions(
|
||||||
unit: MapUnit
|
unit: MapUnit, tile: Tile
|
||||||
): ArrayList<UnitAction> {
|
): ArrayList<UnitAction> {
|
||||||
val unitTile = unit.getTile()
|
val unitTile = unit.getTile()
|
||||||
val civInfo = unit.civ
|
val civInfo = unit.civ
|
||||||
@ -342,12 +338,11 @@ object UnitActionsFromUniques {
|
|||||||
return transformList
|
return transformList
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addBuildingImprovementsAction(
|
fun getBuildingImprovementsActions(
|
||||||
unit: MapUnit,
|
unit: MapUnit,
|
||||||
actionList: ArrayList<UnitAction>,
|
|
||||||
tile: Tile
|
tile: Tile
|
||||||
) {
|
): List<UnitAction> {
|
||||||
if (!unit.cache.hasUniqueToBuildImprovements) return
|
if (!unit.cache.hasUniqueToBuildImprovements) return emptyList()
|
||||||
|
|
||||||
val couldConstruct = unit.currentMovement > 0
|
val couldConstruct = unit.currentMovement > 0
|
||||||
&& !tile.isCityCenter()
|
&& !tile.isCityCenter()
|
||||||
@ -361,7 +356,7 @@ object UnitActionsFromUniques {
|
|||||||
&& unit.canBuildImprovement(it)
|
&& unit.canBuildImprovement(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
actionList += UnitAction(UnitActionType.ConstructImprovement,
|
return listOf(UnitAction(UnitActionType.ConstructImprovement,
|
||||||
isCurrentAction = unit.currentTile.hasImprovementInProgress(),
|
isCurrentAction = unit.currentTile.hasImprovementInProgress(),
|
||||||
action = {
|
action = {
|
||||||
GUI.pushScreen(ImprovementPickerScreen(tile, unit) {
|
GUI.pushScreen(ImprovementPickerScreen(tile, unit) {
|
||||||
@ -369,7 +364,7 @@ object UnitActionsFromUniques {
|
|||||||
GUI.getWorldScreen().switchToNextUnit()
|
GUI.getWorldScreen().switchToNextUnit()
|
||||||
})
|
})
|
||||||
}.takeIf { couldConstruct }
|
}.takeIf { couldConstruct }
|
||||||
)
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getRepairTurns(unit: MapUnit): Int {
|
private fun getRepairTurns(unit: MapUnit): Int {
|
||||||
@ -385,9 +380,9 @@ object UnitActionsFromUniques {
|
|||||||
return repairTurns
|
return repairTurns
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addRepairAction(unit: MapUnit, actionList: ArrayList<UnitAction>) {
|
fun getRepairActions(unit: MapUnit, tile: Tile): List<UnitAction> {
|
||||||
val repairAction = getRepairAction(unit)
|
val repairAction = getRepairAction(unit) ?: return emptyList()
|
||||||
if (repairAction != null) actionList.add(repairAction)
|
return listOf(repairAction)
|
||||||
}
|
}
|
||||||
fun getRepairAction(unit: MapUnit) : UnitAction? {
|
fun getRepairAction(unit: MapUnit) : UnitAction? {
|
||||||
if (!unit.currentTile.ruleset.tileImprovements.containsKey(Constants.repair)) return null
|
if (!unit.currentTile.ruleset.tileImprovements.containsKey(Constants.repair)) return null
|
||||||
|
Reference in New Issue
Block a user