diff --git a/android/Images.Construction/UnitActionIcons/HurryPolicy.png b/android/Images.Construction/UnitActionIcons/HurryPolicy.png new file mode 100644 index 0000000000..b2f3cc8234 Binary files /dev/null and b/android/Images.Construction/UnitActionIcons/HurryPolicy.png differ diff --git a/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt b/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt index 47b71a3fc7..37a798fd61 100644 --- a/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/PolicyManager.kt @@ -31,6 +31,8 @@ class PolicyManager : IsPartOfGameInfoSerialization { internal val adoptedPolicies = HashSet() var numberOfAdoptedPolicies = 0 + var cultureOfLast8Turns = IntArray(8) { 0 } + /** Indicates whether we should *check* if policy is adoptible, and if so open */ var shouldOpenPolicyPicker = false @@ -90,6 +92,7 @@ class PolicyManager : IsPartOfGameInfoSerialization { toReturn.freePolicies = freePolicies toReturn.shouldOpenPolicyPicker = shouldOpenPolicyPicker toReturn.storedCulture = storedCulture + toReturn.cultureOfLast8Turns = cultureOfLast8Turns.clone() return toReturn } @@ -121,6 +124,7 @@ class PolicyManager : IsPartOfGameInfoSerialization { fun endTurn(culture: Int) { addCulture(culture) + addCurrentCultureToCultureOfLast8Turns(culture) } // from https://forums.civfanatics.com/threads/the-number-crunching-thread.389702/ @@ -251,6 +255,15 @@ class PolicyManager : IsPartOfGameInfoSerialization { } } + + fun getCultureFromGreatWriter(): Int { + return (cultureOfLast8Turns.sum() * civInfo.gameInfo.speed.cultureCostModifier).toInt() + } + + private fun addCurrentCultureToCultureOfLast8Turns(culture: Int) { + cultureOfLast8Turns[civInfo.gameInfo.turns % 8] = culture + } + fun allPoliciesAdopted(checkEra: Boolean) = getRulesetPolicies().values.none { isAdoptable(it, checkEra) } } diff --git a/core/src/com/unciv/models/UnitAction.kt b/core/src/com/unciv/models/UnitAction.kt index 5459b49963..76d9bad18d 100644 --- a/core/src/com/unciv/models/UnitAction.kt +++ b/core/src/com/unciv/models/UnitAction.kt @@ -143,6 +143,8 @@ enum class UnitActionType( null, false, UncivSound.Chimes), HurryResearch("{Hurry Research} (${Fonts.death})", { ImageGetter.getUnitActionPortrait("HurryResearch") }, UncivSound.Chimes), + HurryPolicy("{Hurry Policy} (${Fonts.death})", + { ImageGetter.getUnitActionPortrait("HurryPolicy") }, UncivSound.Chimes), StartGoldenAge("Start Golden Age", { ImageGetter.getUnitActionPortrait("StartGoldenAge") }, UncivSound.Chimes), HurryWonder("{Hurry Wonder} (${Fonts.death})", diff --git a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt index 265efed67f..a29e8b3822 100644 --- a/core/src/com/unciv/models/ruleset/unique/UniqueType.kt +++ b/core/src/com/unciv/models/ruleset/unique/UniqueType.kt @@ -342,6 +342,7 @@ enum class UniqueType( CanSpeedupConstruction("Can speed up construction of a building", UniqueTarget.Unit), CanSpeedupWonderConstruction("Can speed up the construction of a wonder", UniqueTarget.Unit), CanHurryResearch("Can hurry technology research", UniqueTarget.Unit), + CanHurryPolicy("Can generate a large amount of culture", 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), diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt index 68515e2d70..b24819a3d4 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActions.kt @@ -43,6 +43,7 @@ object UnitActions { UnitActionType.ConnectRoad to UnitActionsFromUniques::getConnectRoadActions, UnitActionType.Repair to UnitActionsFromUniques::getRepairActions, UnitActionType.HurryResearch to UnitActionsGreatPerson::getHurryResearchActions, + UnitActionType.HurryPolicy to UnitActionsGreatPerson::getHurryPolicyActions, UnitActionType.HurryWonder to UnitActionsGreatPerson::getHurryWonderActions, UnitActionType.HurryBuilding to UnitActionsGreatPerson::getHurryBuildingActions, UnitActionType.ConductTradeMission to UnitActionsGreatPerson::getConductTradeMissionActions, diff --git a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsGreatPerson.kt b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsGreatPerson.kt index ad2aed18b9..fd18075dbd 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsGreatPerson.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/unit/actions/UnitActionsGreatPerson.kt @@ -29,6 +29,18 @@ object UnitActionsGreatPerson { } }.asIterable() + fun getHurryPolicyActions(unit:MapUnit, tile: Tile) = sequence { + for (unique in unit.getMatchingUniques(UniqueType.CanHurryPolicy)){ + yield(UnitAction( + UnitActionType.HurryPolicy, + action = { + unit.civ.policies.addCulture(unit.civ.policies.getCultureFromGreatWriter()) + unit.consume() + }.takeIf {unit.currentMovement > 0} + )) + } + }.asIterable() + fun getHurryWonderActions(unit: MapUnit, tile: Tile) = sequence { for (unique in unit.getMatchingUniques(UniqueType.CanSpeedupWonderConstruction)) { val canHurryWonder =