mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-16 10:49:17 +07:00
Added 'additional times' to limited actions
This commit is contained in:
@ -511,6 +511,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags:
|
||||
UnitActionMovementCost("for [amount] movement", UniqueTarget.UnitActionModifier),
|
||||
UnitActionOnce("once", UniqueTarget.UnitActionModifier),
|
||||
UnitActionLimitedTimes("[amount] times", UniqueTarget.UnitActionModifier),
|
||||
UnitActionExtraLimitedTimes("[amount] additional time(s)", UniqueTarget.UnitActionModifier),
|
||||
UnitActionAfterWhichConsumed("after which this unit is consumed", UniqueTarget.UnitActionModifier),
|
||||
|
||||
// endregion
|
||||
|
@ -180,7 +180,9 @@ object UnitActions {
|
||||
* (no movement left, too close to another city).
|
||||
*/
|
||||
fun getFoundCityAction(unit: MapUnit, tile: Tile): UnitAction? {
|
||||
val unique = unit.getMatchingUniques(UniqueType.FoundCity).firstOrNull()
|
||||
val unique = unit.getMatchingUniques(UniqueType.FoundCity)
|
||||
.filter { it.conditionals.none { it.type == UniqueType.UnitActionExtraLimitedTimes } }
|
||||
.firstOrNull()
|
||||
if (unique == null || tile.isWater || tile.isImpassible()) return null
|
||||
// Spain should still be able to build Conquistadors in a one city challenge - but can't settle them
|
||||
if (unit.civ.isOneCityChallenger() && unit.civ.hasEverOwnedOriginalCapital == true) return null
|
||||
@ -471,6 +473,8 @@ object UnitActions {
|
||||
val civResources = unit.civ.getCivResourcesByName()
|
||||
|
||||
for (unique in uniquesToCheck) {
|
||||
if (unique.conditionals.any { it.type == UniqueType.UnitActionExtraLimitedTimes }) continue
|
||||
|
||||
val improvementName = unique.params[0]
|
||||
val improvement = tile.ruleset.tileImprovements[improvementName]
|
||||
?: continue
|
||||
@ -659,6 +663,7 @@ object UnitActions {
|
||||
val triggerableTypes = setOf(UniqueTarget.Triggerable, UniqueTarget.UnitTriggerable)
|
||||
for (unique in unit.getUniques()) {
|
||||
if (unique.conditionals.none { it.type?.targetTypes?.contains(UniqueTarget.UnitActionModifier) == true }) continue
|
||||
if (unique.conditionals.any { it.type == UniqueType.UnitActionExtraLimitedTimes }) continue
|
||||
if (unique.type?.targetTypes?.any { it in triggerableTypes }!=true
|
||||
&& unique.conditionals.none { it.type == UniqueType.ConditionalTimedUnique }) continue
|
||||
if (usagesLeft(unit, unique)==0) continue
|
||||
@ -709,7 +714,7 @@ object UnitActions {
|
||||
for (conditional in actionUnique.conditionals){
|
||||
when (conditional.type){
|
||||
UniqueType.UnitActionConsumeUnit -> unit.consume()
|
||||
UniqueType.UnitActionLimitedTimes -> {
|
||||
UniqueType.UnitActionLimitedTimes, UniqueType.UnitActionOnce -> {
|
||||
if (usagesLeft(unit, actionUnique) == 1
|
||||
&& actionUnique.conditionals.any { it.type==UniqueType.UnitActionAfterWhichConsumed }) {
|
||||
unit.consume()
|
||||
@ -725,17 +730,24 @@ object UnitActions {
|
||||
|
||||
/** Returns 'null' if usages are not limited */
|
||||
fun usagesLeft(unit:MapUnit, actionUnique: Unique): Int?{
|
||||
val usagesTotal = getMaxUsages(actionUnique) ?: return null
|
||||
val usagesTotal = getMaxUsages(unit, actionUnique) ?: return null
|
||||
val usagesSoFar = unit.abilityToTimesUsed[actionUnique.placeholderText] ?: 0
|
||||
return usagesTotal - usagesSoFar
|
||||
}
|
||||
|
||||
fun getMaxUsages(actionUnique: Unique): Int? {
|
||||
fun getMaxUsages(unit: MapUnit, actionUnique: Unique): Int? {
|
||||
val extraTimes = unit.getMatchingUniques(actionUnique.type!!)
|
||||
.filter { it.text.removeConditionals() == actionUnique.text.removeConditionals() }
|
||||
.flatMap { it.conditionals.filter { it.type == UniqueType.UnitActionExtraLimitedTimes } }
|
||||
.map { it.params[0].toInt() }
|
||||
.sum()
|
||||
|
||||
val times = actionUnique.conditionals
|
||||
.filter { it.type == UniqueType.UnitActionLimitedTimes }
|
||||
.maxOfOrNull { it.params[0].toInt() }
|
||||
if (times != null) return times
|
||||
if (actionUnique.conditionals.any { it.type == UniqueType.UnitActionOnce }) return 1
|
||||
if (times != null) return times + extraTimes
|
||||
if (actionUnique.conditionals.any { it.type == UniqueType.UnitActionOnce }) return 1 + extraTimes
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
@ -748,7 +760,7 @@ object UnitActions {
|
||||
fun getSideEffectString(unit:MapUnit, actionUnique: Unique): String {
|
||||
val effects = ArrayList<String>()
|
||||
|
||||
val maxUsages = getMaxUsages(actionUnique)
|
||||
val maxUsages = getMaxUsages(unit, actionUnique)
|
||||
if (maxUsages!=null) effects += "${usagesLeft(unit, actionUnique)}/$maxUsages"
|
||||
|
||||
if (actionUnique.conditionals.any { it.type == UniqueType.UnitActionConsumeUnit }
|
||||
|
Reference in New Issue
Block a user