From 22f9936a349b5bef45ab09a4753643b45faf97ea Mon Sep 17 00:00:00 2001 From: itanasi <44038014+itanasi@users.noreply.github.com> Date: Sat, 14 Jan 2023 10:43:48 -0800 Subject: [PATCH] Add Transform Action for mods (#8120) * Initial version of code * Enable cost=0 for buttons * Add Conditional to Transform * Fix translation file * Add icon Allow other Conditionals * Updated icon * Add credit * switch hotkey * Fix icon * Remove Conditional Costs * Remove vestigal Stats costs for Transform * Minor cleanup --- .../UnitActionIcons/Transform.png | Bin 0 -> 163004 bytes .../jsons/translations/template.properties | 3 + .../logic/civilization/CivilizationInfo.kt | 2 +- core/src/com/unciv/models/UnitAction.kt | 2 + .../unciv/models/ruleset/unique/UniqueType.kt | 2 +- .../unciv/ui/worldscreen/unit/UnitActions.kt | 66 ++++++++++++++++++ docs/Credits.md | 1 + 7 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 android/Images.Construction/UnitActionIcons/Transform.png diff --git a/android/Images.Construction/UnitActionIcons/Transform.png b/android/Images.Construction/UnitActionIcons/Transform.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ddb30ed864d9f599792d460fa14c860fa42188 GIT binary patch literal 163004 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 W9Cq policies.storedCulture Stat.Science -> { if (tech.currentTechnology() == null) 0 - else tech.remainingScienceToTech(tech.currentTechnology()!!.name) + else tech.researchOfTech(tech.currentTechnology()!!.name) } Stat.Gold -> gold Stat.Faith -> religionManager.storedFaith diff --git a/core/src/com/unciv/models/UnitAction.kt b/core/src/com/unciv/models/UnitAction.kt index 279d3a2614..0757535588 100644 --- a/core/src/com/unciv/models/UnitAction.kt +++ b/core/src/com/unciv/models/UnitAction.kt @@ -83,6 +83,8 @@ enum class UnitActionType( { ImageGetter.getUnitActionPortrait("Promote") }, 'o', false, UncivSound.Promote), Upgrade("Upgrade", { ImageGetter.getUnitActionPortrait("Upgrade") }, 'u', UncivSound.Upgrade), + Transform("Transform", + { ImageGetter.getUnitActionPortrait("Transform") }, 'k', UncivSound.Upgrade), Pillage("Pillage", { ImageGetter.getUnitActionPortrait("Pillage") }, 'p', false), Paradrop("Paradrop", diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 10d1dff0ea..424a0cc983 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -480,7 +480,7 @@ enum class UniqueType(val text: String, vararg targets: UniqueTarget, val flags: CanHurryResearch("Can hurry technology research", UniqueTarget.Unit), CanTradeWithCityStateForGoldAndInfluence("Can undertake a trade mission with City-State, giving a large sum of gold and [amount] Influence", UniqueTarget.Unit), - + CanTransform("Can transform to [unit]", UniqueTarget.Unit), //endregion diff --git a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt index a025277c9f..f2c8204875 100644 --- a/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt +++ b/core/src/com/unciv/ui/worldscreen/unit/UnitActions.kt @@ -18,6 +18,7 @@ import com.unciv.models.UncivSound import com.unciv.models.UnitAction import com.unciv.models.UnitActionType import com.unciv.models.ruleset.Building +import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.UniqueTriggerActivation import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.Stat @@ -57,6 +58,7 @@ object UnitActions { addPromoteAction(unit, actionList) addUnitUpgradeAction(unit, actionList) + addTransformAction(unit, actionList) addPillageAction(unit, actionList, worldScreen) addParadropAction(unit, actionList) addAirSweepAction(unit, actionList) @@ -472,6 +474,70 @@ object UnitActions { fun getAncientRuinsUpgradeAction(unit: MapUnit) = getUpgradeAction(unit, isFree = true, isSpecial = true) + private fun addTransformAction( + unit: MapUnit, + actionList: ArrayList, + maxSteps: Int = Int.MAX_VALUE + ) { + val upgradeAction = getTransformAction(unit) + if (upgradeAction != null) actionList += upgradeAction + } + + /** */ + private fun getTransformAction( + unit: MapUnit + ): ArrayList? { + if (!unit.baseUnit().hasUnique(UniqueType.CanTransform)) return null // can't upgrade to anything + val unitTile = unit.getTile() + val civInfo = unit.civInfo + val transformList = ArrayList() + for (unique in unit.baseUnit().getMatchingUniques(UniqueType.CanTransform, + StateForConditionals(unit = unit, civInfo = civInfo, tile = unitTile))) { + val upgradedUnit = civInfo.getEquivalentUnit(unique.params[0]) + // don't show if haven't researched/is obsolete + if (!unit.canUpgrade(unitToUpgradeTo = upgradedUnit)) continue + + // Check _new_ resource requirements + // Using Counter to aggregate is a bit exaggerated, but - respect the mad modder. + val resourceRequirementsDelta = Counter() + for ((resource, amount) in unit.baseUnit().getResourceRequirements()) + resourceRequirementsDelta.add(resource, -amount) + for ((resource, amount) in upgradedUnit.getResourceRequirements()) + resourceRequirementsDelta.add(resource, amount) + val newResourceRequirementsString = resourceRequirementsDelta.entries + .filter { it.value > 0 } + .joinToString { "${it.value} {${it.key}}".tr() } + + val title = if (newResourceRequirementsString.isEmpty()) + "Transform to [${upgradedUnit.name}]" + else "Transform to [${upgradedUnit.name}]\n([$newResourceRequirementsString])" + + transformList.add(UnitAction(UnitActionType.Transform, + title = title, + action = { + unit.destroy() + val newUnit = civInfo.placeUnitNearTile(unitTile.position, upgradedUnit.name) + + /** We were UNABLE to place the new unit, which means that the unit failed to upgrade! + * The only known cause of this currently is "land units upgrading to water units" which fail to be placed. + */ + if (newUnit == null) { + val resurrectedUnit = civInfo.placeUnitNearTile(unitTile.position, unit.name)!! + unit.copyStatisticsTo(resurrectedUnit) + } else { // Managed to upgrade + unit.copyStatisticsTo(newUnit) + newUnit.currentMovement = 0f + } + }.takeIf { + unit.currentMovement > 0 + && !unit.isEmbarked() + && unit.canUpgrade(unitToUpgradeTo = upgradedUnit) + } + ) ) + } + return transformList + } + private fun addBuildingImprovementsAction(unit: MapUnit, actionList: ArrayList, tile: TileInfo, worldScreen: WorldScreen, unitTable: UnitTable) { if (!unit.hasUniqueToBuildImprovements) return if (unit.isEmbarked()) return diff --git a/docs/Credits.md b/docs/Credits.md index f4e1e599c3..a76d1e2b23 100644 --- a/docs/Credits.md +++ b/docs/Credits.md @@ -768,6 +768,7 @@ Unless otherwise specified, all the following are from [the Noun Project](https: - [Trade](https://www.flaticon.com/free-icon/trade_4257019) created by Smashicons for Conduct Trade Mission - [Nothing](https://www.flaticon.com/free-icon/nothing_5084125) created by Freepik for Nothing construction process - Icon for Unique created by [vegeta1k95](https://github.com/vegeta1k95) +- [Transform] created by letstalkaboutdune ### Main menu