1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-15 20:03:15 +02:00

Revert some changes, update WIDE_BREATH

This commit is contained in:
Dydzio
2017-09-05 22:29:31 +02:00
parent d2e9848443
commit 5c17e172b6
2 changed files with 69 additions and 189 deletions

View File

@@ -1120,7 +1120,7 @@ ReachabilityInfo CBattleInfoCallback::getFlyingReachability(const ReachabilityIn
return ret;
}
AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos, bool rangedAttack) const
AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos) const
{
//does not return hex attacked directly
//TODO: apply rotation to two-hex attackers
@@ -1129,7 +1129,7 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack
AttackableTiles at;
RETURN_IF_NOT_BATTLE(at);
if(rangedAttack)
/*if(rangedAttack)
{
if(attacker->hasBonusOfType(Bonus::SHOOTS_ALL_ADJACENT) && !vstd::contains(attackerPos.neighbouringTiles(), destinationTile))
{
@@ -1137,10 +1137,8 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack
targetHexes.push_back(destinationTile);
boost::copy(targetHexes, vstd::set_inserter(at.hostileCreaturePositions));
}
}
}*/
else
{
const int WN = GameConstants::BFIELD_WIDTH;
BattleHex hex = (attackerPos != BattleHex::INVALID) ? attackerPos.hex : attacker->position.hex; //real or hypothetical (cursor) position
@@ -1169,139 +1167,22 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack
}
}
}
if(attacker->hasBonusOfType(Bonus::WIDE_BREATH))
{
std::vector<BattleHex> hexes;
// attack stand
if(hex == destinationTile.cloneInDirection(BattleHex::EDir::LEFT, false)) {
if(destinationTile.getY() % 2 == 0)
std::vector<BattleHex> hexes = destinationTile.neighbouringTiles();
for(int i = 0; i<hexes.size(); i++)
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile + 1, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
BattleHex::checkAndPush(destinationTile + (2 * WN) - 1, hexes);
BattleHex::checkAndPush(destinationTile + (2 * WN), hexes);
}
else {
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile + 1, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
BattleHex::checkAndPush(destinationTile + (2 * WN) - 1, hexes);
BattleHex::checkAndPush(destinationTile + (2 * WN), hexes);
}
}
if(hex == destinationTile.cloneInDirection(BattleHex::EDir::RIGHT, false)) {
if(destinationTile.getY() % 2 == 0)
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile - 1, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
BattleHex::checkAndPush(destinationTile + (2 * WN), hexes);
BattleHex::checkAndPush(destinationTile + (2 * WN) + 1, hexes);
}
else
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile - 1, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
BattleHex::checkAndPush(destinationTile + (2 * WN), hexes);
BattleHex::checkAndPush(destinationTile + (2 * WN) + 1, hexes);
if(hexes.at(i) == hex) {
hexes.erase(hexes.begin() + i);
i = 0;
}
}
// attack down
if(hex == destinationTile.cloneInDirection(BattleHex::EDir::TOP_LEFT, false)) {
if(destinationTile.getY() % 2 == 1)
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile - 1, hexes);
BattleHex::checkAndPush(destinationTile - 2, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
BattleHex::checkAndPush(destinationTile + WN - 2, hexes);
}
else {
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile - 1, hexes);
BattleHex::checkAndPush(destinationTile - 2, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
}
}
if(hex == destinationTile.cloneInDirection(BattleHex::EDir::TOP_RIGHT, false)) {
if(destinationTile.getY() % 2 == 1)
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile + 1, hexes);
BattleHex::checkAndPush(destinationTile + 2, hexes);
BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
}
else
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile + 1, hexes);
BattleHex::checkAndPush(destinationTile + 2, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
BattleHex::checkAndPush(destinationTile + WN + 2, hexes);
}
}
// attack up
if(hex == destinationTile.cloneInDirection(BattleHex::EDir::BOTTOM_LEFT, false)) {
if(destinationTile.getY() % 2 == 1)
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile + 1, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
BattleHex::checkAndPush(destinationTile - WN, hexes);
BattleHex::checkAndPush(destinationTile - WN - 1, hexes);
}
else {
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile + 1, hexes);
BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
BattleHex::checkAndPush(destinationTile + WN + 2, hexes);
BattleHex::checkAndPush(destinationTile - WN, hexes);
BattleHex::checkAndPush(destinationTile - WN + 1, hexes);
}
}
if(hex == destinationTile.cloneInDirection(BattleHex::EDir::BOTTOM_RIGHT, false)) {
if(destinationTile.getY() % 2 == 1)
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile - 1, hexes);
BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
BattleHex::checkAndPush(destinationTile + WN - 2, hexes);
BattleHex::checkAndPush(destinationTile - WN, hexes);
BattleHex::checkAndPush(destinationTile - WN - 1, hexes);
}
else
{
BattleHex::checkAndPush(destinationTile, hexes);
BattleHex::checkAndPush(destinationTile - 1, hexes);
BattleHex::checkAndPush(destinationTile + WN, hexes);
BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
BattleHex::checkAndPush(destinationTile - WN, hexes);
BattleHex::checkAndPush(destinationTile - WN + 1, hexes);
}
}
for(BattleHex tile : hexes)
{
//friendly stacks can also be damaged by Dragon Breath
if(battleGetStackByPos(tile, true))
if(battleGetStackByPos(tile, true) != attacker)
at.friendlyCreaturePositions.insert(tile);
}
}
@@ -1334,7 +1215,6 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack
at.friendlyCreaturePositions.insert(tile);
}
}
}
return at;
}
@@ -1343,7 +1223,7 @@ std::set<const CStack*> CBattleInfoCallback::getAttackedCreatures(const CStack*
std::set<const CStack*> attackedCres;
RETURN_IF_NOT_BATTLE(attackedCres);
AttackableTiles at = getPotentiallyAttackableHexes(attacker, destinationTile, attackerPos, rangedAttack);
AttackableTiles at = getPotentiallyAttackableHexes(attacker, destinationTile, attackerPos);
for (BattleHex tile : at.hostileCreaturePositions) //all around & three-headed attack
{
const CStack * st = battleGetStackByPos(tile, true);

View File

@@ -92,7 +92,7 @@ public:
bool isInTacticRange(BattleHex dest) const;
si8 battleGetTacticDist() const; //returns tactic distance for calling player or 0 if this player is not in tactic phase (for ALL_KNOWING actual distance for tactic side)
AttackableTiles getPotentiallyAttackableHexes(const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos, bool rangedAttack) const; //TODO: apply rotation to two-hex attacker
AttackableTiles getPotentiallyAttackableHexes(const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos) const; //TODO: apply rotation to two-hex attacker
std::set<const CStack*> getAttackedCreatures(const CStack* attacker, BattleHex destinationTile, bool rangedAttack, BattleHex attackerPos = BattleHex::INVALID) const; //calculates range of multi-hex attacks
bool isToReverse(BattleHex hexFrom, BattleHex hexTo, bool curDir /*if true, creature is in attacker's direction*/, bool toDoubleWide, bool toDir) const; //determines if creature should be reversed (it stands on hexFrom and should 'see' hexTo)
bool isToReverseHlp(BattleHex hexFrom, BattleHex hexTo, bool curDir) const; //helper for isToReverse