mirror of
https://github.com/vcmi/vcmi.git
synced 2025-03-29 21:56:54 +02:00
Revert some changes, update WIDE_BREATH
This commit is contained in:
parent
d2e9848443
commit
5c17e172b6
@ -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,202 +1137,82 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack
|
||||
targetHexes.push_back(destinationTile);
|
||||
boost::copy(targetHexes, vstd::set_inserter(at.hostileCreaturePositions));
|
||||
}
|
||||
}*/
|
||||
|
||||
const int WN = GameConstants::BFIELD_WIDTH;
|
||||
BattleHex hex = (attackerPos != BattleHex::INVALID) ? attackerPos.hex : attacker->position.hex; //real or hypothetical (cursor) position
|
||||
|
||||
//FIXME: dragons or cerbers can rotate before attack, making their base hex different (#1124)
|
||||
bool reverse = isToReverse(hex, destinationTile, isAttacker, attacker->doubleWide(), isAttacker);
|
||||
if(reverse && attacker->doubleWide())
|
||||
{
|
||||
hex = attacker->occupiedHex(hex); //the other hex stack stands on
|
||||
}
|
||||
if(attacker->hasBonusOfType(Bonus::ATTACKS_ALL_ADJACENT))
|
||||
{
|
||||
boost::copy(attacker->getSurroundingHexes(attackerPos), vstd::set_inserter(at.hostileCreaturePositions));
|
||||
}
|
||||
if(attacker->hasBonusOfType(Bonus::THREE_HEADED_ATTACK))
|
||||
{
|
||||
std::vector<BattleHex> hexes = attacker->getSurroundingHexes(attackerPos);
|
||||
for(BattleHex tile : hexes)
|
||||
{
|
||||
if((BattleHex::mutualPosition(tile, destinationTile) > -1 && BattleHex::mutualPosition(tile, hex) > -1)) //adjacent both to attacker's head and attacked tile
|
||||
{
|
||||
const CStack * st = battleGetStackByPos(tile, true);
|
||||
if(st && st->owner != attacker->owner) //only hostile stacks - does it work well with Berserk?
|
||||
{
|
||||
at.hostileCreaturePositions.insert(tile);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
if(attacker->hasBonusOfType(Bonus::WIDE_BREATH))
|
||||
{
|
||||
const int WN = GameConstants::BFIELD_WIDTH;
|
||||
BattleHex hex = (attackerPos != BattleHex::INVALID) ? attackerPos.hex : attacker->position.hex; //real or hypothetical (cursor) position
|
||||
|
||||
//FIXME: dragons or cerbers can rotate before attack, making their base hex different (#1124)
|
||||
bool reverse = isToReverse(hex, destinationTile, isAttacker, attacker->doubleWide(), isAttacker);
|
||||
if(reverse && attacker->doubleWide())
|
||||
std::vector<BattleHex> hexes = destinationTile.neighbouringTiles();
|
||||
for(int i = 0; i<hexes.size(); i++)
|
||||
{
|
||||
hex = attacker->occupiedHex(hex); //the other hex stack stands on
|
||||
}
|
||||
if(attacker->hasBonusOfType(Bonus::ATTACKS_ALL_ADJACENT))
|
||||
{
|
||||
boost::copy(attacker->getSurroundingHexes(attackerPos), vstd::set_inserter(at.hostileCreaturePositions));
|
||||
}
|
||||
if(attacker->hasBonusOfType(Bonus::THREE_HEADED_ATTACK))
|
||||
{
|
||||
std::vector<BattleHex> hexes = attacker->getSurroundingHexes(attackerPos);
|
||||
for(BattleHex tile : hexes)
|
||||
{
|
||||
if((BattleHex::mutualPosition(tile, destinationTile) > -1 && BattleHex::mutualPosition(tile, hex) > -1)) //adjacent both to attacker's head and attacked tile
|
||||
{
|
||||
const CStack * st = battleGetStackByPos(tile, true);
|
||||
if(st && st->owner != attacker->owner) //only hostile stacks - does it work well with Berserk?
|
||||
{
|
||||
at.hostileCreaturePositions.insert(tile);
|
||||
}
|
||||
}
|
||||
if(hexes.at(i) == hex) {
|
||||
hexes.erase(hexes.begin() + i);
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
if(attacker->hasBonusOfType(Bonus::WIDE_BREATH))
|
||||
for(BattleHex tile : hexes)
|
||||
{
|
||||
std::vector<BattleHex> hexes;
|
||||
// attack stand
|
||||
if(hex == destinationTile.cloneInDirection(BattleHex::EDir::LEFT, 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) - 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);
|
||||
}
|
||||
}
|
||||
// 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))
|
||||
//friendly stacks can also be damaged by Dragon Breath
|
||||
if(battleGetStackByPos(tile, true))
|
||||
if(battleGetStackByPos(tile, true) != attacker)
|
||||
at.friendlyCreaturePositions.insert(tile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if(attacker->hasBonusOfType(Bonus::TWO_HEX_ATTACK_BREATH) && BattleHex::mutualPosition(destinationTile.hex, hex) > -1) //only adjacent hexes are subject of dragon breath calculation
|
||||
else if(attacker->hasBonusOfType(Bonus::TWO_HEX_ATTACK_BREATH) && BattleHex::mutualPosition(destinationTile.hex, hex) > -1) //only adjacent hexes are subject of dragon breath calculation
|
||||
{
|
||||
std::vector<BattleHex> hexes; //only one, in fact
|
||||
int pseudoVector = destinationTile.hex - hex;
|
||||
switch(pseudoVector)
|
||||
{
|
||||
std::vector<BattleHex> hexes; //only one, in fact
|
||||
int pseudoVector = destinationTile.hex - hex;
|
||||
switch(pseudoVector)
|
||||
{
|
||||
case 1:
|
||||
case -1:
|
||||
BattleHex::checkAndPush(destinationTile.hex + pseudoVector, hexes);
|
||||
break;
|
||||
case WN: //17 //left-down or right-down
|
||||
case -WN: //-17 //left-up or right-up
|
||||
case WN + 1: //18 //right-down
|
||||
case -WN + 1: //-16 //right-up
|
||||
BattleHex::checkAndPush(destinationTile.hex + pseudoVector + (((hex / WN) % 2) ? 1 : -1), hexes);
|
||||
break;
|
||||
case WN - 1: //16 //left-down
|
||||
case -WN - 1: //-18 //left-up
|
||||
BattleHex::checkAndPush(destinationTile.hex + pseudoVector + (((hex / WN) % 2) ? 1 : 0), hexes);
|
||||
break;
|
||||
}
|
||||
for(BattleHex tile : hexes)
|
||||
{
|
||||
//friendly stacks can also be damaged by Dragon Breath
|
||||
if(battleGetStackByPos(tile, true))
|
||||
at.friendlyCreaturePositions.insert(tile);
|
||||
}
|
||||
case 1:
|
||||
case -1:
|
||||
BattleHex::checkAndPush(destinationTile.hex + pseudoVector, hexes);
|
||||
break;
|
||||
case WN: //17 //left-down or right-down
|
||||
case -WN: //-17 //left-up or right-up
|
||||
case WN + 1: //18 //right-down
|
||||
case -WN + 1: //-16 //right-up
|
||||
BattleHex::checkAndPush(destinationTile.hex + pseudoVector + (((hex / WN) % 2) ? 1 : -1), hexes);
|
||||
break;
|
||||
case WN - 1: //16 //left-down
|
||||
case -WN - 1: //-18 //left-up
|
||||
BattleHex::checkAndPush(destinationTile.hex + pseudoVector + (((hex / WN) % 2) ? 1 : 0), hexes);
|
||||
break;
|
||||
}
|
||||
for(BattleHex tile : hexes)
|
||||
{
|
||||
//friendly stacks can also be damaged by Dragon Breath
|
||||
if(battleGetStackByPos(tile, true))
|
||||
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);
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user