Converted Great Person actions to new format

This commit is contained in:
Yair Morgenstern
2023-12-02 22:33:54 +02:00
parent 4c113a9aba
commit c48584868d
2 changed files with 98 additions and 89 deletions

View File

@ -39,7 +39,11 @@ object UnitActions {
UnitActionType.SetUp to UnitActionsFromUniques::getSetupActions, UnitActionType.SetUp to UnitActionsFromUniques::getSetupActions,
UnitActionType.FoundCity to UnitActionsFromUniques::getFoundCityActions, UnitActionType.FoundCity to UnitActionsFromUniques::getFoundCityActions,
UnitActionType.ConstructImprovement to UnitActionsFromUniques::getBuildingImprovementsActions, UnitActionType.ConstructImprovement to UnitActionsFromUniques::getBuildingImprovementsActions,
UnitActionType.Repair to UnitActionsFromUniques::getRepairActions UnitActionType.Repair to UnitActionsFromUniques::getRepairActions,
UnitActionType.HurryResearch to UnitActionsGreatPerson::getHurryResearchActions,
UnitActionType.HurryWonder to UnitActionsGreatPerson::getHurryWonderActions,
UnitActionType.HurryBuilding to UnitActionsGreatPerson::getHurryBuildingActions,
UnitActionType.ConductTradeMission to UnitActionsGreatPerson::getConductTradeMissionActions
) )
private fun getNormalActions(unit: MapUnit): List<UnitAction> { private fun getNormalActions(unit: MapUnit): List<UnitAction> {
@ -50,7 +54,6 @@ object UnitActions {
actionList.addAll(getActionsFunction(unit, tile)) actionList.addAll(getActionsFunction(unit, tile))
// Determined by unit uniques // Determined by unit uniques
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) UnitActionsFromUniques.addCreateWaterImprovements(unit, actionList)

View File

@ -13,27 +13,30 @@ import kotlin.math.min
object UnitActionsGreatPerson { object UnitActionsGreatPerson {
internal fun addGreatPersonActions(unit: MapUnit, actionList: ArrayList<UnitAction>, tile: Tile) { fun getHurryResearchActions(unit:MapUnit, tile: Tile) = sequence {
for (unique in unit.getMatchingUniques(UniqueType.CanHurryResearch)){
if (unit.currentMovement <= 0) return yield(UnitAction(
for (unique in unit.getUniques()) when (unique.type) {
UniqueType.CanHurryResearch -> {
actionList += UnitAction(
UnitActionType.HurryResearch, UnitActionType.HurryResearch,
action = { action = {
unit.civ.tech.addScience(unit.civ.tech.getScienceFromGreatScientist()) unit.civ.tech.addScience(unit.civ.tech.getScienceFromGreatScientist())
unit.consume() unit.consume()
}.takeIf { unit.civ.tech.currentTechnologyName() != null }.takeIf {
&& !unit.civ.tech.currentTechnology()!!.hasUnique(UniqueType.CannotBeHurried) } unit.currentMovement > 0
) && unit.civ.tech.currentTechnologyName() != null
&& !unit.civ.tech.currentTechnology()!!.hasUnique(UniqueType.CannotBeHurried)
} }
UniqueType.CanSpeedupWonderConstruction -> { ))
}
}.asIterable()
fun getHurryWonderActions(unit: MapUnit, tile: Tile) = sequence {
for (unique in unit.getMatchingUniques(UniqueType.CanSpeedupWonderConstruction)) {
val canHurryWonder = val canHurryWonder =
if (!tile.isCityCenter()) false if (!tile.isCityCenter()) false
else tile.getCity()!!.cityConstructions.isBuildingWonder() else tile.getCity()!!.cityConstructions.isBuildingWonder()
&& tile.getCity()!!.cityConstructions.canBeHurried() && tile.getCity()!!.cityConstructions.canBeHurried()
actionList += UnitAction( yield(UnitAction(
UnitActionType.HurryWonder, UnitActionType.HurryWonder,
action = { action = {
tile.getCity()!!.cityConstructions.apply { tile.getCity()!!.cityConstructions.apply {
@ -43,13 +46,15 @@ object UnitActionsGreatPerson {
} }
unit.consume() unit.consume()
}.takeIf { canHurryWonder } }.takeIf { unit.currentMovement > 0 && canHurryWonder }
) ))
} }
}.asIterable()
UniqueType.CanSpeedupConstruction -> { fun getHurryBuildingActions(unit:MapUnit, tile: Tile) = sequence {
for (unique in unit.getMatchingUniques(UniqueType.CanSpeedupConstruction)) {
if (!tile.isCityCenter()) { if (!tile.isCityCenter()) {
actionList += UnitAction(UnitActionType.HurryBuilding, action = null) yield(UnitAction(UnitActionType.HurryBuilding, action = null))
continue continue
} }
@ -64,7 +69,7 @@ object UnitActionsGreatPerson {
).toInt() ).toInt()
if (productionPointsToAdd <= 0) continue if (productionPointsToAdd <= 0) continue
actionList += UnitAction( yield(UnitAction(
UnitActionType.HurryBuilding, UnitActionType.HurryBuilding,
title = "Hurry Construction (+[$productionPointsToAdd]⚙)", title = "Hurry Construction (+[$productionPointsToAdd]⚙)",
action = { action = {
@ -74,15 +79,19 @@ object UnitActionsGreatPerson {
} }
unit.consume() unit.consume()
}.takeIf { canHurryConstruction } }.takeIf { unit.currentMovement > 0 && canHurryConstruction }
) ))
} }
UniqueType.CanTradeWithCityStateForGoldAndInfluence -> { }.asIterable()
fun getConductTradeMissionActions(unit:MapUnit, tile: Tile) = sequence {
for (unique in unit.getMatchingUniques(UniqueType.CanTradeWithCityStateForGoldAndInfluence)) {
val canConductTradeMission = tile.owningCity?.civ?.isCityState() == true val canConductTradeMission = tile.owningCity?.civ?.isCityState() == true
&& tile.owningCity?.civ != unit.civ && tile.owningCity?.civ != unit.civ
&& tile.owningCity?.civ?.isAtWarWith(unit.civ) == false && tile.owningCity?.civ?.isAtWarWith(unit.civ) == false
val influenceEarned = unique.params[0].toFloat() val influenceEarned = unique.params[0].toFloat()
actionList += UnitAction(
yield(UnitAction(
UnitActionType.ConductTradeMission, UnitActionType.ConductTradeMission,
action = { action = {
// http://civilization.wikia.com/wiki/Great_Merchant_(Civ5) // http://civilization.wikia.com/wiki/Great_Merchant_(Civ5)
@ -96,11 +105,8 @@ object UnitActionsGreatPerson {
unit.civ.addNotification("Your trade mission to [$tileOwningCiv] has earned you [$goldEarned] gold and [$influenceEarned] influence!", unit.civ.addNotification("Your trade mission to [$tileOwningCiv] has earned you [$goldEarned] gold and [$influenceEarned] influence!",
NotificationCategory.General, tileOwningCiv.civName, NotificationIcon.Gold, NotificationIcon.Culture) NotificationCategory.General, tileOwningCiv.civName, NotificationIcon.Gold, NotificationIcon.Culture)
unit.consume() unit.consume()
}.takeIf { canConductTradeMission } }.takeIf { unit.currentMovement > 0 && canConductTradeMission }
) ))
} }
else -> {} }.asIterable()
}
}
} }