diff --git a/android/assets/jsons/Civ V - Vanilla/Policies.json b/android/assets/jsons/Civ V - Vanilla/Policies.json index 89b1610718..4b9b87a11f 100644 --- a/android/assets/jsons/Civ V - Vanilla/Policies.json +++ b/android/assets/jsons/Civ V - Vanilla/Policies.json @@ -482,7 +482,7 @@ { "name": "Total War", "effect": "+15% production when building military units and new military units start with 15 Experience", - "uniques": ["+[15]% Production when constructing [military units]", "New military units start with [15] Experience"], + "uniques": ["+[15]% Production when constructing [military units]", "New [military] units start with [15] Experience"], "requires": ["Police State","Fascism"], "row": 3, "column": 4 diff --git a/android/assets/jsons/Civ V - Vanilla/UnitPromotions.json b/android/assets/jsons/Civ V - Vanilla/UnitPromotions.json index 5b785d1a63..7d3ac43ede 100644 --- a/android/assets/jsons/Civ V - Vanilla/UnitPromotions.json +++ b/android/assets/jsons/Civ V - Vanilla/UnitPromotions.json @@ -208,38 +208,38 @@ // Submarine { "name": "Wolfpack I", - "effect": "Bonus as Attacker [25]%", + "effect": "+[25]% Strength when attacking", "unitTypes": ["WaterSubmarine"] }, { "name": "Wolfpack II", "prerequisites": ["Wolfpack I"], - "effect": "Bonus as Attacker [25]%", + "effect": "+[25]% Strength when attacking", "unitTypes": ["WaterSubmarine"] }, { "name": "Wolfpack III", "prerequisites": ["Wolfpack II"], - "effect": "Bonus as Attacker [25]%", + "effect": "+[25]% Strength when attacking", "unitTypes": ["WaterSubmarine"] }, // Aircraft Carrier { "name": "Armor Plating I", - "effect": "+25% Combat Bonus when defending", + "effect": "+[25]% Strength when defending", "unitTypes": ["WaterAircraftCarrier"] }, { "name": "Armor Plating II", "prerequisites": ["Armor Plating I"], - "effect": "+25% Combat Bonus when defending", + "effect": "+[25]% Strength when defending", "unitTypes": ["WaterAircraftCarrier"] }, { "name": "Armor Plating III", "prerequisites": ["Armor Plating II"], - "effect": "+25% Combat Bonus when defending", + "effect": "+[25]% Strength when defending", "unitTypes": ["WaterAircraftCarrier"] }, { diff --git a/android/assets/jsons/Civ V - Vanilla/Units.json b/android/assets/jsons/Civ V - Vanilla/Units.json index bc78ba3c5a..05297902b2 100644 --- a/android/assets/jsons/Civ V - Vanilla/Units.json +++ b/android/assets/jsons/Civ V - Vanilla/Units.json @@ -743,7 +743,7 @@ "requiredTech": "Gunpowder", "upgradesTo": "Rifleman", "obsoleteTech": "Rifling", - "uniques": ["Heals [50] damage if it kills a unit", "Bonus as Attacker [25]%"], + "uniques": ["Heals [50] damage if it kills a unit", "+[25]% Strength when attacking"], "attackSound": "shot" }, { @@ -1124,7 +1124,7 @@ "cost": 325, "requiredTech": "Refrigeration", // "upgradesTo": "Nuclear Submarine", - "uniques": ["Bonus as Attacker [75]%", "Invisible to others", "Can only attack water", "Can attack submarines", "Can enter ice tiles"] + "uniques": ["+[75]% Strength when attacking", "Invisible to others", "Can only attack water", "Can attack submarines", "Can enter ice tiles"] }, { "name": "Great War Infantry", diff --git a/android/assets/jsons/translations/template.properties b/android/assets/jsons/translations/template.properties index 5cba131d36..5124b50523 100644 --- a/android/assets/jsons/translations/template.properties +++ b/android/assets/jsons/translations/template.properties @@ -600,6 +600,7 @@ Captured! = defence vs ranged = [percentage] to unit defence = Attacker Bonus = +Defender Bonus = Landing = Flanking = vs [unitType] = @@ -627,6 +628,7 @@ Occupied City = Buildings = # For the "when constructing [military units]" translation +military = military units = melee units = mounted units = diff --git a/core/src/com/unciv/logic/battle/BattleDamage.kt b/core/src/com/unciv/logic/battle/BattleDamage.kt index b002cf581f..ffa710dbb8 100644 --- a/core/src/com/unciv/logic/battle/BattleDamage.kt +++ b/core/src/com/unciv/logic/battle/BattleDamage.kt @@ -118,11 +118,16 @@ object BattleDamage { if (attacker is MapUnitCombatant) { modifiers.add(getTileSpecificModifiers(attacker, defender.getTile())) + // As of 3.11.3 This is to be deprecated and converted to "+[]% Strength when attacking" - keeping it here to that mods with this can still work for now for (ability in attacker.unit.getUniques()) { if (ability.placeholderText == "Bonus as Attacker []%") modifiers.add("Attacker Bonus", ability.params[0].toInt()) } + for(unique in attacker.unit.getMatchingUniques("+[]% Strength when attacking")) { + modifiers.add("Attacker Bonus", unique.params[0].toInt()) + } + if (attacker.unit.isEmbarked() && !attacker.unit.hasUnique("Amphibious")) modifiers["Landing"] = -50 @@ -175,7 +180,8 @@ object BattleDamage { modifiers.putAll(getTileSpecificModifiers(defender, tile)) val tileDefenceBonus = tile.getDefensiveBonus() - if (!defender.unit.hasUnique("No defensive terrain bonus") || tileDefenceBonus < 0) + if ( (!defender.unit.hasUnique("No defensive terrain bonus") && tileDefenceBonus > 0) + || (!defender.unit.hasUnique("No defensive terrain penalty") && tileDefenceBonus < 0) ) modifiers["Tile"] = (tileDefenceBonus*100).toInt() if (attacker.isRanged()) { @@ -183,8 +189,13 @@ object BattleDamage { if (defenceVsRanged > 0) modifiers["defence vs ranged"] = defenceVsRanged } + // As of 3.11.2 This is to be deprecated and converted to "+[25]% Strength when defending" - keeping it here to that mods with this can still work for now val carrierDefenceBonus = 25 * defender.unit.getUniques().count { it.text == "+25% Combat Bonus when defending" } - if (carrierDefenceBonus > 0) modifiers["Armor Plating"] = carrierDefenceBonus + if (carrierDefenceBonus > 0) modifiers["Defender Bonus"] = carrierDefenceBonus + + for(unique in defender.unit.getMatchingUniques("+[]% Strength when defending")) { + modifiers.add("Defender Bonus", unique.params[0].toInt()) + } for(unique in defender.unit.getMatchingUniques("+[]% defence in [] tiles")) { if (tile.matchesUniqueFilter(unique.params[1])) diff --git a/core/src/com/unciv/logic/map/MapUnit.kt b/core/src/com/unciv/logic/map/MapUnit.kt index b13a0f90d3..f71017faa6 100644 --- a/core/src/com/unciv/logic/map/MapUnit.kt +++ b/core/src/com/unciv/logic/map/MapUnit.kt @@ -683,6 +683,9 @@ class MapUnit { if ((category == "Land" || category == "land units") && type.isLandUnit()) return true if ((category == "Water" || category == "water units") && type.isWaterUnit()) return true if ((category == "Air" || category == "air units") && type.isAirUnit()) return true + if (category == "non-air" && !type.isAirUnit()) return true + if ((category == "military" || category == "military units") && type.isMilitary()) return true + if (hasUnique(category)) return true return false } diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 5726350448..22ef016bb1 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -168,18 +168,23 @@ class BaseUnit : INamed, IConstruction { if (this.unitType.isCivilian()) return true // tiny optimization makes save files a few bytes smaller var XP = construction.getBuiltBuildings().sumBy { it.xpForNewUnits } + + // As of 3.11.2 This is to be deprecated and converted to "New [] units start with [] Experience" - keeping it here to that mods with this can still work for now for (unique in civInfo.getMatchingUniques("New military units start with [] Experience")) XP += unique.params[0].toInt() + + for (unique in construction.cityInfo.cityConstructions.builtBuildingUniqueMap.getUniques("New [] units start with [] Experience in this city") + + civInfo.getMatchingUniques("New [] units start with [] Experience")) { + if (unit.matchesCategory(unique.params[0])) + XP += unique.params[1].toInt() + } unit.promotions.XP = XP for (unique in construction.cityInfo.cityConstructions.builtBuildingUniqueMap.getUniques("All newly-trained [] units in this city receive the [] promotion")) { val filter = unique.params[0] val promotion = unique.params[1] - if (unit.name == filter - || (filter == "relevant" && civInfo.gameInfo.ruleSet.unitPromotions.values.any { unit.type.toString() in it.unitTypes && it.name == promotion }) - || unit.type.name == filter - || (filter == "non-air" && !unit.type.isAirUnit()) - || uniques.contains(filter)) + + if (unit.matchesCategory(filter) || (filter == "relevant" && civInfo.gameInfo.ruleSet.unitPromotions.values.any { unit.type.toString() in it.unitTypes && it.name == promotion })) unit.promotions.addPromotion(promotion, isFree = true) }