1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Siege tower handling improvements (#392)

* Fix bug #2581 - siege tower damage
* Improved siege tower damage calculation a bit
This commit is contained in:
Dydzio 2017-11-18 10:41:07 +01:00 committed by Alexander Shishkin
parent ffe4dc582b
commit 6df536bb31
2 changed files with 33 additions and 8 deletions

View File

@ -115,7 +115,10 @@
"abilities": "abilities":
{ {
"shooter" : { "type" : "SHOOTER" }, "shooter" : { "type" : "SHOOTER" },
"ignoreDefence" : { "type" : "ENEMY_DEFENCE_REDUCTION", "val" : 100 } "ignoreDefence" : { "type" : "ENEMY_DEFENCE_REDUCTION", "val" : 100 },
"noWallPenalty" : { "type" : "NO_WALL_PENALTY" },
"noDistancePenalty" : { "type" : "NO_DISTANCE_PENALTY" },
"noLuck" : { "type" : "NO_LUCK" }
}, },
"graphics" : "graphics" :
{ {

View File

@ -17,19 +17,39 @@
namespace SiegeStuffThatShouldBeMovedToHandlers // <=== TODO namespace SiegeStuffThatShouldBeMovedToHandlers // <=== TODO
{ {
static void retreiveTurretDamageRange(const CGTownInstance * town, const CStack * turret, double & outMinDmg, double & outMaxDmg) /*
*Here are 2 explanations how below algorithm should work in H3, looks like they are not 100% accurate as it results in one damage number, not min/max range:
*
*1. http://heroes.thelazy.net/wiki/Arrow_tower
*
*2. All towns' turrets do the same damage. If Fort, Citadel or Castle is built damage of the Middle turret is 15, and 7,5 for others.
*Buildings increase turrets' damage, but only those buildings that are new in town view, not upgrades to the existing. So, every building save:
*- dwellings' upgrades
*- Mage Guild upgrades
*- Horde buildings
*- income upgrades
*- some special ones
*increases middle Turret damage by 3, and 1,5 for the other two.
*Damage is almost always the maximum one (right click on the Turret), sometimes +1/2 points, and it does not depend on the target. Nothing can influence it, except the mentioned above (but it will be roughly double if the defender has Armorer or Air Shield).
*Maximum damage for Castle, Conflux is 120, Necropolis, Inferno, Fortress 125, Stronghold, Turret, and Dungeon 130 (for all three Turrets).
*Artillery allows the player to control the Turrets.
*/
static void retreiveTurretDamageRange(const CGTownInstance * town, const CStack * turret, double & outMinDmg, double & outMaxDmg) //does not match OH3 yet, but damage is somewhat close
{ {
assert(turret->getCreature()->idNumber == CreatureID::ARROW_TOWERS); assert(turret->getCreature()->idNumber == CreatureID::ARROW_TOWERS);
assert(town); assert(town);
assert(turret->position >= -4 && turret->position <= -2); assert(turret->position >= -4 && turret->position <= -2);
float multiplier = (turret->position == -2) ? 1 : 0.5; const float multiplier = (turret->position == -2) ? 1 : 0.5;
int baseMin = 6; //Revised - Where do below values come from?
int baseMax = 10; /*int baseMin = 6;
int baseMax = 10;*/
outMinDmg = multiplier * (baseMin + town->getTownLevel() * 2); const int baseDamage = 15;
outMaxDmg = multiplier * (baseMax + town->getTownLevel() * 3);
outMinDmg = multiplier * (baseDamage + town->getTownLevel() * 3);
outMaxDmg = multiplier * (baseDamage + town->getTownLevel() * 3);
} }
static BattleHex lineToWallHex(int line) //returns hex with wall in given line (y coordinate) static BattleHex lineToWallHex(int line) //returns hex with wall in given line (y coordinate)
@ -557,9 +577,11 @@ TDmgRange CBattleInfoCallback::calculateDmgRange(const BattleAttackInfo & info)
const CCreature *attackerType = info.attacker->getCreature(), const CCreature *attackerType = info.attacker->getCreature(),
*defenderType = info.defender->getCreature(); *defenderType = info.defender->getCreature();
if(attackerType->idNumber == CreatureID::ARROW_TOWERS) if(attackerType->idNumber == CreatureID::ARROW_TOWERS) //separately handled case
{ {
SiegeStuffThatShouldBeMovedToHandlers::retreiveTurretDamageRange(battleGetDefendedTown(), info.attacker, minDmg, maxDmg); SiegeStuffThatShouldBeMovedToHandlers::retreiveTurretDamageRange(battleGetDefendedTown(), info.attacker, minDmg, maxDmg);
TDmgRange unmodifiableTowerDamage = std::make_pair(int(minDmg), int(maxDmg));
return unmodifiableTowerDamage;
} }
if(info.attackerBonuses->hasBonusOfType(Bonus::SIEGE_WEAPON) && attackerType->idNumber != CreatureID::ARROW_TOWERS) //any siege weapon, but only ballista can attack (second condition - not arrow turret) if(info.attackerBonuses->hasBonusOfType(Bonus::SIEGE_WEAPON) && attackerType->idNumber != CreatureID::ARROW_TOWERS) //any siege weapon, but only ballista can attack (second condition - not arrow turret)