@Leoreth: Thanks for laying that out. Anything on the DoC forum that isn't too specific to the Rhye's & Fall rules I try to read. (One thing I've bookmarked for at least partial adoption is your set of changes around the acquireCity function.)
(source) Perhaps my confusion about this is an indication that adding further complexity to the collateral damage rules is a bit problematic.
One could also lower the regular damage limit of siege units in addition. On that note, I've taken a brief look at the K-Mod Unit AI code; CvUnit::collateralDamageLimit isn't called, so it seems like there's an implicit assumption that the the two damage limits are the same. Well, one would hope that the AI getting hurt less badly by collateral damage makes up for any minor inconsistencies in the AI calculations.
I agree that the role of stack killers should not have fallen onto siege units, at least not the pre-modern ones, but, so long as splitting stacks up isn't usually a viable tactic, an anti-stack attacker is essentially just a powerful attacker. So, I'd argue that the problem isn't that siege units are much better at attacking cities than other tiles, but that they're generally too good at attacking.
I've plans to make the target and damage limits of siege units much stricter overall, but I'm not ready to make such major balance changes. So, smaller temporary measures are a consideration for me, but I'm not sure if it makes sense to do (a little?) something for besieged cities and nothing against siege units in pitched battles.
Will this really make a big difference for cities without a Castle? 40% damage (30%?) should be enough to tip the scales heavily in favor of the attacker. Maybe my intuition is failing me here. Not so important – one could e.g. subtract city defense from the attacking unit's collateral damage limit if taking the minimum of those two values doesn't have enough impact. Actually, the first quoted sentence sounds like you might already be doing that, but I guess not:[...] the current city defense modifier is also subtracted from the maximum collateral damage that can be inflicted on units in the city. In other words, if a city has 100%+ defense all units in it will not take damage from collateral damage, and for 70% city defense they can only be damaged to 70% health etc., regardless of other limitations the siege unit has for collateral damage.
Code:
int iMaxDamage = std::min(collateralDamageLimit(), (collateralDamageLimit() * (iCollateralStrength + iStrengthFactor)) / (iTheirStrength + iStrengthFactor));
// Leoreth: city defense limits collateral damage
if (pPlot->isCity())
{
int iCityDefenseLimit = std::max(0, 100 - pPlot->getPlotCity()->getDefenseModifier(false));
iMaxDamage = std::min(iMaxDamage, iCityDefenseLimit);
}
One could also lower the regular damage limit of siege units in addition. On that note, I've taken a brief look at the K-Mod Unit AI code; CvUnit::collateralDamageLimit isn't called, so it seems like there's an implicit assumption that the the two damage limits are the same. Well, one would hope that the AI getting hurt less badly by collateral damage makes up for any minor inconsistencies in the AI calculations.
I agree that the role of stack killers should not have fallen onto siege units, at least not the pre-modern ones, but, so long as splitting stacks up isn't usually a viable tactic, an anti-stack attacker is essentially just a powerful attacker. So, I'd argue that the problem isn't that siege units are much better at attacking cities than other tiles, but that they're generally too good at attacking.
I've plans to make the target and damage limits of siege units much stricter overall, but I'm not ready to make such major balance changes. So, smaller temporary measures are a consideration for me, but I'm not sure if it makes sense to do (a little?) something for besieged cities and nothing against siege units in pitched battles.