Skip to content

Commit c24eb4a

Browse files
Add game progress modifier (yairm210#13095)
* Add game progress modifier * Update * Update Unique.kt * Update Unique.kt * Update Unique.kt * Update Unique.kt
1 parent 5d7ea12 commit c24eb4a

File tree

5 files changed

+28
-4
lines changed

5 files changed

+28
-4
lines changed

Diff for: core/src/com/unciv/logic/map/tile/TileImprovementFunctions.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,12 @@ class TileImprovementFunctions(val tile: Tile) {
316316
if (distance > 5) return
317317
var stats = Stats()
318318
for (unique in tile.getTerrainMatchingUniques(UniqueType.ProductionBonusWhenRemoved)) {
319+
var statsToAdd = unique.stats
319320
if (unique.isModifiedByGameSpeed())
320-
stats.add(unique.stats * civ.gameInfo.speed.modifier)
321-
else stats.add(unique.stats)
321+
statsToAdd *= civ.gameInfo.speed.modifier
322+
if (unique.isModifiedByGameProgress())
323+
statsToAdd *= unique.getGameProgressModifier(civ)
324+
stats.add(statsToAdd)
322325
}
323326
if (stats.isEmpty()) return
324327
if (distance != 1) stats *= (6 - distance) / 4f

Diff for: core/src/com/unciv/models/ruleset/unique/Unique.kt

+16
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.unciv.models.translations.getPlaceholderParameters
1313
import com.unciv.models.translations.getPlaceholderText
1414
import com.unciv.models.translations.removeConditionals
1515
import java.util.EnumMap
16+
import kotlin.math.max
1617

1718

1819
class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val sourceObjectName: String? = null) {
@@ -50,6 +51,21 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s
5051
fun getModifiers(type: UniqueType) = modifiersMap[type] ?: emptyList()
5152
fun hasModifier(type: UniqueType) = modifiersMap.containsKey(type)
5253
fun isModifiedByGameSpeed() = hasModifier(UniqueType.ModifiedByGameSpeed)
54+
fun isModifiedByGameProgress() = hasModifier(UniqueType.ModifiedByGameProgress)
55+
fun getGameProgressModifier(civ: Civilization): Float {
56+
//According to: https://www.reddit.com/r/civ/comments/gvx44v/comment/fsrifc2/
57+
var modifier = 1f
58+
val ruleset = civ.gameInfo.ruleset
59+
val techComplete = if (ruleset.technologies.isNotEmpty())
60+
civ.tech.researchedTechnologies.size.toFloat() / ruleset.technologies.size else 0f
61+
val policyComplete = if (ruleset.policies.isNotEmpty())
62+
civ.policies.adoptedPolicies.size.toFloat() / ruleset.policies.size else 0f
63+
val gameProgess = max(techComplete, policyComplete)
64+
for (unique in getModifiers(UniqueType.ModifiedByGameProgress))
65+
modifier *= 1 + (unique.params[0].toFloat()/100 - 1) * gameProgess
66+
//Mod creators likely expect this to stack multiplicatively, otherwise they'd use a single modifier
67+
return modifier
68+
}
5369
fun hasTriggerConditional(): Boolean {
5470
if (modifiers.none()) return false
5571
return modifiers.any { conditional ->

Diff for: core/src/com/unciv/models/ruleset/unique/UniqueFlag.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import java.util.EnumSet
55
enum class UniqueFlag {
66
HiddenToUsers,
77
NoConditionals,
8-
AcceptsSpeedModifier
8+
AcceptsSpeedModifier,
9+
AcceptsGameProgressModifier
910
;
1011
companion object {
1112
val setOfHiddenToUsers: EnumSet<UniqueFlag> = EnumSet.of(HiddenToUsers)

Diff for: core/src/com/unciv/models/ruleset/unique/UniqueType.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ enum class UniqueType(
562562
DamagesContainingUnits("Units ending their turn on this terrain take [amount] damage", UniqueTarget.Terrain),
563563
TerrainGrantsPromotion("Grants [promotion] ([comment]) to adjacent [mapUnitFilter] units for the rest of the game", UniqueTarget.Terrain),
564564
GrantsCityStrength("[amount] Strength for cities built on this terrain", UniqueTarget.Terrain),
565-
ProductionBonusWhenRemoved("Provides a one-time bonus of [stats] to the closest city when cut down", UniqueTarget.Terrain, flags = setOf(UniqueFlag.AcceptsSpeedModifier)),
565+
ProductionBonusWhenRemoved("Provides a one-time bonus of [stats] to the closest city when cut down", UniqueTarget.Terrain, flags = setOf(UniqueFlag.AcceptsSpeedModifier, UniqueFlag.AcceptsGameProgressModifier)),
566566
Vegetation("Vegetation", UniqueTarget.Terrain, UniqueTarget.Improvement, flags = UniqueFlag.setOfHiddenToUsers), // Improvement included because use as tileFilter works
567567

568568

@@ -949,6 +949,8 @@ enum class UniqueType(
949949

950950
ModifiedByGameSpeed("(modified by game speed)", UniqueTarget.MetaModifier,
951951
docDescription = "Can only be applied to certain uniques, see details of each unique for specifics"),
952+
ModifiedByGameProgress("(modified by game progress up to [relativeAmount]%)", UniqueTarget.MetaModifier,
953+
docDescription = "Can only be applied to certain uniques, see details of each unique for specifics"),
952954
Comment("Comment [comment]", *UniqueTarget.Displayable,
953955
docDescription = "Allows displaying arbitrary text in a Unique listing. Only the text within the '[]' brackets will be displayed, the rest serves to allow Ruleset validation to recognize the intent."),
954956

Diff for: desktop/src/com/unciv/app/desktop/UniqueDocsWriter.kt

+2
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ class UniqueDocsWriter {
8787
}
8888
if (uniqueType.flags.contains(UniqueFlag.AcceptsSpeedModifier))
8989
lines += "\tThis unique's effect can be modified with &lt;${UniqueType.ModifiedByGameSpeed.text}&gt;"
90+
if (uniqueType.flags.contains(UniqueFlag.AcceptsGameProgressModifier))
91+
lines += "\tThis unique's effect can be modified with &lt;${UniqueType.ModifiedByGameProgress.text}&gt;"
9092
if (uniqueType in MapUnitCache.UnitMovementUniques) {
9193
lines += "\tDue to performance considerations, this unique is cached, thus conditionals that may change within a turn may not work."
9294
}

0 commit comments

Comments
 (0)