mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-24 08:32:34 +02:00
vcmi: modernize lib/battle
This commit is contained in:
parent
5d98471d12
commit
93c2bbf9ab
@ -9,11 +9,21 @@
|
||||
*/
|
||||
#include "StdInc.h"
|
||||
#include "AccessibilityInfo.h"
|
||||
#include "BattleHex.h"
|
||||
#include "Unit.h"
|
||||
#include "../GameConstants.h"
|
||||
|
||||
VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
bool AccessibilityInfo::tileAccessibleWithGate(BattleHex tile, ui8 side) const
|
||||
{
|
||||
//at(otherHex) != EAccessibility::ACCESSIBLE && (at(otherHex) != EAccessibility::GATE || side != BattleSide::DEFENDER)
|
||||
if(at(tile) != EAccessibility::ACCESSIBLE)
|
||||
if(at(tile) != EAccessibility::GATE || side != BattleSide::DEFENDER)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AccessibilityInfo::accessible(BattleHex tile, const battle::Unit * stack) const
|
||||
{
|
||||
return accessible(tile, stack->doubleWide(), stack->unitSide());
|
||||
@ -25,7 +35,7 @@ bool AccessibilityInfo::accessible(BattleHex tile, bool doubleWide, ui8 side) co
|
||||
//do not use getHexes for speed reasons
|
||||
if(!tile.isValid())
|
||||
return false;
|
||||
if(at(tile) != EAccessibility::ACCESSIBLE && !(at(tile) == EAccessibility::GATE && side == BattleSide::DEFENDER))
|
||||
if(!tileAccessibleWithGate(tile, side))
|
||||
return false;
|
||||
|
||||
if(doubleWide)
|
||||
@ -33,7 +43,7 @@ bool AccessibilityInfo::accessible(BattleHex tile, bool doubleWide, ui8 side) co
|
||||
auto otherHex = battle::Unit::occupiedHex(tile, doubleWide, side);
|
||||
if(!otherHex.isValid())
|
||||
return false;
|
||||
if(at(otherHex) != EAccessibility::ACCESSIBLE && !(at(otherHex) == EAccessibility::GATE && side == BattleSide::DEFENDER))
|
||||
if(!tileAccessibleWithGate(tile, side))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -31,12 +31,15 @@ enum class EAccessibility
|
||||
};
|
||||
|
||||
|
||||
typedef std::array<EAccessibility, GameConstants::BFIELD_SIZE> TAccessibilityArray;
|
||||
using TAccessibilityArray = std::array<EAccessibility, GameConstants::BFIELD_SIZE>;
|
||||
|
||||
struct DLL_LINKAGE AccessibilityInfo : TAccessibilityArray
|
||||
{
|
||||
bool accessible(BattleHex tile, const battle::Unit * stack) const; //checks for both tiles if stack is double wide
|
||||
bool accessible(BattleHex tile, bool doubleWide, ui8 side) const; //checks for both tiles if stack is double wide
|
||||
public:
|
||||
bool accessible(BattleHex tile, const battle::Unit * stack) const; //checks for both tiles if stack is double wide
|
||||
bool accessible(BattleHex tile, bool doubleWide, ui8 side) const; //checks for both tiles if stack is double wide
|
||||
private:
|
||||
bool tileAccessibleWithGate(BattleHex tile, ui8 side) const;
|
||||
};
|
||||
|
||||
VCMI_LIB_NAMESPACE_END
|
||||
|
@ -76,7 +76,7 @@ BattleAction BattleAction::makeShotAttack(const battle::Unit * shooter, const ba
|
||||
return ba;
|
||||
}
|
||||
|
||||
BattleAction BattleAction::makeCreatureSpellcast(const battle::Unit * stack, const battle::Target & target, SpellID spellID)
|
||||
BattleAction BattleAction::makeCreatureSpellcast(const battle::Unit * stack, const battle::Target & target, const SpellID & spellID)
|
||||
{
|
||||
BattleAction ba;
|
||||
ba.actionType = EActionType::MONSTER_SPELL;
|
||||
@ -170,7 +170,7 @@ battle::Target BattleAction::getTarget(const CBattleInfoCallback * cb) const
|
||||
{
|
||||
battle::Target ret;
|
||||
|
||||
for(auto & destination : target)
|
||||
for(const auto & destination : target)
|
||||
{
|
||||
if(destination.unitValue == INVALID_UNIT_ID)
|
||||
ret.emplace_back(destination.hexValue);
|
||||
@ -184,7 +184,7 @@ battle::Target BattleAction::getTarget(const CBattleInfoCallback * cb) const
|
||||
void BattleAction::setTarget(const battle::Target & target_)
|
||||
{
|
||||
target.clear();
|
||||
for(auto & destination : target_)
|
||||
for(const auto & destination : target_)
|
||||
{
|
||||
if(destination.unitValue == nullptr)
|
||||
aimToHex(destination.hexValue);
|
||||
|
@ -37,7 +37,7 @@ public:
|
||||
static BattleAction makeWait(const battle::Unit * stack);
|
||||
static BattleAction makeMeleeAttack(const battle::Unit * stack, BattleHex destination, BattleHex attackFrom, bool returnAfterAttack = true);
|
||||
static BattleAction makeShotAttack(const battle::Unit * shooter, const battle::Unit * target);
|
||||
static BattleAction makeCreatureSpellcast(const battle::Unit * stack, const battle::Target & target, SpellID spellID);
|
||||
static BattleAction makeCreatureSpellcast(const battle::Unit * stack, const battle::Target & target, const SpellID & spellID);
|
||||
static BattleAction makeMove(const battle::Unit * stack, BattleHex dest);
|
||||
static BattleAction makeEndOFTacticPhase(ui8 side);
|
||||
static BattleAction makeRetreat(ui8 side);
|
||||
|
@ -55,7 +55,7 @@ void BattleHex::setXY(si16 x, si16 y, bool hasToBeValid)
|
||||
{
|
||||
if(hasToBeValid)
|
||||
{
|
||||
if(!(x >= 0 && x < GameConstants::BFIELD_WIDTH && y >= 0 && y < GameConstants::BFIELD_HEIGHT))
|
||||
if(x < 0 || x >= GameConstants::BFIELD_WIDTH || y < 0 || y >= GameConstants::BFIELD_HEIGHT)
|
||||
throw std::runtime_error("Valid hex required");
|
||||
}
|
||||
|
||||
@ -84,7 +84,8 @@ std::pair<si16, si16> BattleHex::getXY() const
|
||||
|
||||
BattleHex& BattleHex::moveInDirection(EDir dir, bool hasToBeValid)
|
||||
{
|
||||
si16 x(getX()), y(getY());
|
||||
si16 x = getX();
|
||||
si16 y = getY();
|
||||
switch(dir)
|
||||
{
|
||||
case TOP_LEFT:
|
||||
@ -135,7 +136,7 @@ std::vector<BattleHex> BattleHex::neighbouringTiles() const
|
||||
{
|
||||
std::vector<BattleHex> ret;
|
||||
ret.reserve(6);
|
||||
for(EDir dir = EDir(0); dir <= EDir(5); dir = EDir(dir+1))
|
||||
for(auto dir : hexagonalDirections())
|
||||
checkAndPush(cloneInDirection(dir, false), ret);
|
||||
return ret;
|
||||
}
|
||||
@ -145,7 +146,7 @@ std::vector<BattleHex> BattleHex::allNeighbouringTiles() const
|
||||
std::vector<BattleHex> ret;
|
||||
ret.resize(6);
|
||||
|
||||
for(EDir dir = EDir(0); dir <= EDir(5); dir = EDir(dir+1))
|
||||
for(auto dir : hexagonalDirections())
|
||||
ret[dir] = cloneInDirection(dir, false);
|
||||
|
||||
return ret;
|
||||
@ -153,20 +154,23 @@ std::vector<BattleHex> BattleHex::allNeighbouringTiles() const
|
||||
|
||||
BattleHex::EDir BattleHex::mutualPosition(BattleHex hex1, BattleHex hex2)
|
||||
{
|
||||
for(EDir dir = EDir(0); dir <= EDir(5); dir = EDir(dir+1))
|
||||
if(hex2 == hex1.cloneInDirection(dir,false))
|
||||
for(auto dir : hexagonalDirections())
|
||||
if(hex2 == hex1.cloneInDirection(dir, false))
|
||||
return dir;
|
||||
return NONE;
|
||||
}
|
||||
|
||||
uint8_t BattleHex::getDistance(BattleHex hex1, BattleHex hex2)
|
||||
{
|
||||
int y1 = hex1.getY(), y2 = hex2.getY();
|
||||
int y1 = hex1.getY();
|
||||
int y2 = hex2.getY();
|
||||
|
||||
// FIXME: Omit floating point arithmetics
|
||||
int x1 = (int)(hex1.getX() + y1 * 0.5), x2 = (int)(hex2.getX() + y2 * 0.5);
|
||||
// FIXME: why there was * 0.5 instead of / 2?
|
||||
int x1 = static_cast<int>(hex1.getX() + y1 / 2);
|
||||
int x2 = static_cast<int>(hex2.getX() + y2 / 2);
|
||||
|
||||
int xDst = x2 - x1, yDst = y2 - y1;
|
||||
int xDst = x2 - x1;
|
||||
int yDst = y2 - y1;
|
||||
|
||||
if ((xDst >= 0 && yDst >= 0) || (xDst < 0 && yDst < 0))
|
||||
return std::max(std::abs(xDst), std::abs(yDst));
|
||||
|
@ -29,26 +29,26 @@ namespace GameConstants
|
||||
const int BFIELD_SIZE = BFIELD_WIDTH * BFIELD_HEIGHT;
|
||||
}
|
||||
|
||||
typedef boost::optional<ui8> BattleSideOpt;
|
||||
using BattleSideOpt = boost::optional<ui8>;
|
||||
|
||||
// for battle stacks' positions
|
||||
struct DLL_LINKAGE BattleHex //TODO: decide if this should be changed to class for better code design
|
||||
{
|
||||
// helpers for siege
|
||||
static const si16 CASTLE_CENTRAL_TOWER = -2;
|
||||
static const si16 CASTLE_BOTTOM_TOWER = -3;
|
||||
static const si16 CASTLE_UPPER_TOWER = -4;
|
||||
static constexpr si16 CASTLE_CENTRAL_TOWER = -2;
|
||||
static constexpr si16 CASTLE_BOTTOM_TOWER = -3;
|
||||
static constexpr si16 CASTLE_UPPER_TOWER = -4;
|
||||
|
||||
// hexes for interaction with heroes
|
||||
static const si16 HERO_ATTACKER = 0;
|
||||
static const si16 HERO_DEFENDER = GameConstants::BFIELD_WIDTH - 1;
|
||||
static constexpr si16 HERO_ATTACKER = 0;
|
||||
static constexpr si16 HERO_DEFENDER = GameConstants::BFIELD_WIDTH - 1;
|
||||
|
||||
// helpers for rendering
|
||||
static const si16 HEX_BEFORE_ALL = std::numeric_limits<si16>::min();
|
||||
static const si16 HEX_AFTER_ALL = std::numeric_limits<si16>::max();
|
||||
static constexpr si16 HEX_BEFORE_ALL = std::numeric_limits<si16>::min();
|
||||
static constexpr si16 HEX_AFTER_ALL = std::numeric_limits<si16>::max();
|
||||
|
||||
si16 hex;
|
||||
static const si16 INVALID = -1;
|
||||
static constexpr si16 INVALID = -1;
|
||||
enum EDir
|
||||
{
|
||||
NONE = -1,
|
||||
@ -106,6 +106,11 @@ struct DLL_LINKAGE BattleHex //TODO: decide if this should be changed to class f
|
||||
using NeighbouringTilesCache = std::vector<NeighbouringTiles>;
|
||||
|
||||
static const NeighbouringTilesCache neighbouringTilesCache;
|
||||
private:
|
||||
//Constexpr defined array with all directions used in battle
|
||||
static constexpr auto hexagonalDirections() {
|
||||
return std::array<EDir,6>{BattleHex::TOP_LEFT, BattleHex::TOP_RIGHT, BattleHex::RIGHT, BattleHex::BOTTOM_RIGHT, BattleHex::BOTTOM_LEFT, BattleHex::LEFT};
|
||||
}
|
||||
};
|
||||
|
||||
DLL_EXPORT std::ostream & operator<<(std::ostream & os, const BattleHex & hex);
|
||||
|
@ -47,7 +47,7 @@ std::pair< std::vector<BattleHex>, int > BattleInfo::getPath(BattleHex start, Ba
|
||||
|
||||
void BattleInfo::calculateCasualties(std::map<ui32,si32> * casualties) const
|
||||
{
|
||||
for(auto & elem : stacks)//setting casualties
|
||||
for(const auto & elem : stacks) //setting casualties
|
||||
{
|
||||
const CStack * const st = elem;
|
||||
si32 killed = st->getKilled();
|
||||
@ -56,22 +56,22 @@ void BattleInfo::calculateCasualties(std::map<ui32,si32> * casualties) const
|
||||
}
|
||||
}
|
||||
|
||||
CStack * BattleInfo::generateNewStack(uint32_t id, const CStackInstance & base, ui8 side, SlotID slot, BattleHex position)
|
||||
CStack * BattleInfo::generateNewStack(uint32_t id, const CStackInstance & base, ui8 side, const SlotID & slot, BattleHex position)
|
||||
{
|
||||
PlayerColor owner = sides[side].color;
|
||||
assert((owner >= PlayerColor::PLAYER_LIMIT) ||
|
||||
(base.armyObj && base.armyObj->tempOwner == owner));
|
||||
|
||||
auto ret = new CStack(&base, owner, id, side, slot);
|
||||
auto * ret = new CStack(&base, owner, id, side, slot);
|
||||
ret->initialPosition = getAvaliableHex(base.getCreatureID(), side, position); //TODO: what if no free tile on battlefield was found?
|
||||
stacks.push_back(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
CStack * BattleInfo::generateNewStack(uint32_t id, const CStackBasicDescriptor & base, ui8 side, SlotID slot, BattleHex position)
|
||||
CStack * BattleInfo::generateNewStack(uint32_t id, const CStackBasicDescriptor & base, ui8 side, const SlotID & slot, BattleHex position)
|
||||
{
|
||||
PlayerColor owner = sides[side].color;
|
||||
auto ret = new CStack(&base, owner, id, side, slot);
|
||||
auto * ret = new CStack(&base, owner, id, side, slot);
|
||||
ret->initialPosition = position;
|
||||
stacks.push_back(ret);
|
||||
return ret;
|
||||
@ -81,7 +81,7 @@ void BattleInfo::localInit()
|
||||
{
|
||||
for(int i = 0; i < 2; i++)
|
||||
{
|
||||
auto armyObj = battleGetArmyObject(i);
|
||||
auto * armyObj = battleGetArmyObject(i);
|
||||
armyObj->battle = this;
|
||||
armyObj->attachTo(*this);
|
||||
}
|
||||
@ -101,7 +101,7 @@ namespace CGH
|
||||
std::vector<int> pom;
|
||||
for(const JsonNode &value : level.Vector())
|
||||
{
|
||||
pom.push_back((int)value.Float());
|
||||
pom.push_back(static_cast<int>(value.Float()));
|
||||
}
|
||||
|
||||
dest.push_back(pom);
|
||||
@ -118,9 +118,9 @@ struct RandGen
|
||||
{
|
||||
seed = s;
|
||||
}
|
||||
void srand(int3 pos)
|
||||
void srand(const int3 & pos)
|
||||
{
|
||||
srand(110291 * ui32(pos.x) + 167801 * ui32(pos.y) + 81569);
|
||||
srand(110291 * static_cast<ui32>(pos.x) + 167801 * static_cast<ui32>(pos.y) + 81569);
|
||||
}
|
||||
int rand()
|
||||
{
|
||||
@ -147,11 +147,11 @@ struct RangeGenerator
|
||||
min(_min),
|
||||
remainingCount(_max - _min + 1),
|
||||
remaining(remainingCount, true),
|
||||
myRand(_myRand)
|
||||
myRand(std::move(_myRand))
|
||||
{
|
||||
}
|
||||
|
||||
int generateNumber()
|
||||
int generateNumber() const
|
||||
{
|
||||
if(!remainingCount)
|
||||
throw ExhaustedPossibilities();
|
||||
@ -161,7 +161,7 @@ struct RangeGenerator
|
||||
}
|
||||
|
||||
//get number fulfilling predicate. Never gives the same number twice.
|
||||
int getSuchNumber(std::function<bool(int)> goodNumberPred = nullptr)
|
||||
int getSuchNumber(const std::function<bool(int)> & goodNumberPred = nullptr)
|
||||
{
|
||||
int ret = -1;
|
||||
do
|
||||
@ -193,7 +193,7 @@ struct RangeGenerator
|
||||
BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const BattleField & battlefieldType, const CArmedInstance * armies[2], const CGHeroInstance * heroes[2], bool creatureBank, const CGTownInstance * town)
|
||||
{
|
||||
CMP_stack cmpst;
|
||||
auto curB = new BattleInfo();
|
||||
auto * curB = new BattleInfo();
|
||||
|
||||
for(auto i = 0u; i < curB->sides.size(); i++)
|
||||
curB->sides[i].init(heroes[i], armies[i]);
|
||||
@ -224,7 +224,7 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const
|
||||
|
||||
curB->si.wallState[EWallPart::GATE] = EWallState::INTACT;
|
||||
|
||||
for (auto const wall : {EWallPart::BOTTOM_WALL, EWallPart::BELOW_GATE, EWallPart::OVER_GATE, EWallPart::UPPER_WALL} )
|
||||
for(const auto wall : {EWallPart::BOTTOM_WALL, EWallPart::BELOW_GATE, EWallPart::OVER_GATE, EWallPart::UPPER_WALL})
|
||||
{
|
||||
if (town->hasBuilt(BuildingID::CASTLE))
|
||||
curB->si.wallState[wall] = EWallState::REINFORCED;
|
||||
@ -245,7 +245,7 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const
|
||||
//randomize obstacles
|
||||
if (town == nullptr && !creatureBank) //do it only when it's not siege and not creature bank
|
||||
{
|
||||
RandGen r;
|
||||
RandGen r{};
|
||||
auto ourRand = [&](){ return r.rand(); };
|
||||
r.srand(tile);
|
||||
r.rand(1,8); //battle sound ID to play... can't do anything with it here
|
||||
@ -255,15 +255,15 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const
|
||||
|
||||
auto appropriateAbsoluteObstacle = [&](int id)
|
||||
{
|
||||
auto * info = Obstacle(id).getInfo();
|
||||
const auto * info = Obstacle(id).getInfo();
|
||||
return info && info->isAbsoluteObstacle && info->isAppropriate(curB->terrainType, battlefieldType);
|
||||
};
|
||||
auto appropriateUsualObstacle = [&](int id)
|
||||
{
|
||||
auto * info = Obstacle(id).getInfo();
|
||||
const auto * info = Obstacle(id).getInfo();
|
||||
return info && !info->isAbsoluteObstacle && info->isAppropriate(curB->terrainType, battlefieldType);
|
||||
};
|
||||
|
||||
|
||||
if(r.rand(1,100) <= 40) //put cliff-like obstacle
|
||||
{
|
||||
try
|
||||
@ -341,8 +341,11 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const
|
||||
|
||||
//reading battleStartpos - add creatures AFTER random obstacles are generated
|
||||
//TODO: parse once to some structure
|
||||
std::vector< std::vector<int> > looseFormations[2], tightFormations[2], creBankFormations[2];
|
||||
std::vector <int> commanderField, commanderBank;
|
||||
std::vector<std::vector<int>> looseFormations[2];
|
||||
std::vector<std::vector<int>> tightFormations[2];
|
||||
std::vector<std::vector<int>> creBankFormations[2];
|
||||
std::vector<int> commanderField;
|
||||
std::vector<int> commanderBank;
|
||||
const JsonNode config(ResourceID("config/battleStartpos.json"));
|
||||
const JsonVector &positions = config["battle_positions"].Vector();
|
||||
|
||||
@ -355,11 +358,11 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const
|
||||
|
||||
for (auto position : config["commanderPositions"]["field"].Vector())
|
||||
{
|
||||
commanderField.push_back ((int)position.Float());
|
||||
commanderField.push_back(static_cast<int>(position.Float()));
|
||||
}
|
||||
for (auto position : config["commanderPositions"]["creBank"].Vector())
|
||||
{
|
||||
commanderBank.push_back ((int)position.Float());
|
||||
commanderBank.push_back(static_cast<int>(position.Float()));
|
||||
}
|
||||
|
||||
|
||||
@ -367,7 +370,7 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const
|
||||
if(!creatureBank)
|
||||
{
|
||||
//Checks if hero has artifact and create appropriate stack
|
||||
auto handleWarMachine= [&](int side, ArtifactPosition artslot, BattleHex hex)
|
||||
auto handleWarMachine = [&](int side, const ArtifactPosition & artslot, BattleHex hex)
|
||||
{
|
||||
const CArtifactInstance * warMachineArt = heroes[side]->getArt(artslot);
|
||||
|
||||
@ -462,7 +465,7 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const
|
||||
auto good = std::make_shared<CreatureAlignmentLimiter>(EAlignment::GOOD);
|
||||
auto evil = std::make_shared<CreatureAlignmentLimiter>(EAlignment::EVIL);
|
||||
|
||||
auto bgInfo = VLC->battlefields()->getById(battlefieldType);
|
||||
const auto * bgInfo = VLC->battlefields()->getById(battlefieldType);
|
||||
|
||||
for(const std::shared_ptr<Bonus> & bonus : bgInfo->bonuses)
|
||||
{
|
||||
@ -500,18 +503,17 @@ BattleInfo * BattleInfo::setupBattle(const int3 & tile, TerrainId terrain, const
|
||||
return curB;
|
||||
}
|
||||
|
||||
|
||||
const CGHeroInstance * BattleInfo::getHero(PlayerColor player) const
|
||||
const CGHeroInstance * BattleInfo::getHero(const PlayerColor & player) const
|
||||
{
|
||||
for(int i = 0; i < sides.size(); i++)
|
||||
if(sides[i].color == player)
|
||||
return sides[i].hero;
|
||||
for(const auto & side : sides)
|
||||
if(side.color == player)
|
||||
return side.hero;
|
||||
|
||||
logGlobal->error("Player %s is not in battle!", player.getStr());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ui8 BattleInfo::whatSide(PlayerColor player) const
|
||||
ui8 BattleInfo::whatSide(const PlayerColor & player) const
|
||||
{
|
||||
for(int i = 0; i < sides.size(); i++)
|
||||
if(sides[i].color == player)
|
||||
@ -532,7 +534,6 @@ BattleInfo::BattleInfo():
|
||||
town(nullptr),
|
||||
tile(-1,-1,-1),
|
||||
battlefieldType(BattleField::NONE),
|
||||
terrainType(),
|
||||
tacticsSide(0),
|
||||
tacticDistance(0)
|
||||
{
|
||||
@ -576,8 +577,8 @@ IBattleInfo::ObstacleCList BattleInfo::getAllObstacles() const
|
||||
{
|
||||
ObstacleCList ret;
|
||||
|
||||
for(auto iter = obstacles.cbegin(); iter != obstacles.cend(); iter++)
|
||||
ret.push_back(*iter);
|
||||
for(const auto & obstacle : obstacles)
|
||||
ret.push_back(obstacle);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -698,7 +699,7 @@ void BattleInfo::addUnit(uint32_t id, const JsonNode & data)
|
||||
|
||||
PlayerColor owner = getSidePlayer(info.side);
|
||||
|
||||
auto ret = new CStack(&base, owner, info.id, info.side, SlotID::SUMMONED_SLOT_PLACEHOLDER);
|
||||
auto * ret = new CStack(&base, owner, info.id, info.side, SlotID::SUMMONED_SLOT_PLACEHOLDER);
|
||||
ret->initialPosition = info.position;
|
||||
stacks.push_back(ret);
|
||||
ret->localInit(this);
|
||||
@ -707,7 +708,7 @@ void BattleInfo::addUnit(uint32_t id, const JsonNode & data)
|
||||
|
||||
void BattleInfo::moveUnit(uint32_t id, BattleHex destination)
|
||||
{
|
||||
auto sta = getStack(id);
|
||||
auto * sta = getStack(id);
|
||||
if(!sta)
|
||||
{
|
||||
logGlobal->error("Cannot find stack %d", id);
|
||||
@ -791,7 +792,7 @@ void BattleInfo::removeUnit(uint32_t id)
|
||||
while(!ids.empty())
|
||||
{
|
||||
auto toRemoveId = *ids.begin();
|
||||
auto toRemove = getStack(toRemoveId, false);
|
||||
auto * toRemove = getStack(toRemoveId, false);
|
||||
|
||||
if(!toRemove)
|
||||
{
|
||||
@ -813,7 +814,7 @@ void BattleInfo::removeUnit(uint32_t id)
|
||||
}
|
||||
|
||||
//cleanup remaining clone links if any
|
||||
for(auto s : stacks)
|
||||
for(auto * s : stacks)
|
||||
{
|
||||
if(s->cloneID == toRemoveId)
|
||||
s->cloneID = -1;
|
||||
@ -904,7 +905,7 @@ void BattleInfo::addOrUpdateUnitBonus(CStack * sta, const Bonus & value, bool fo
|
||||
{
|
||||
logBonus->trace("%s updated bonus: %s", sta->nodeName(), value.Description());
|
||||
|
||||
for(auto stackBonus : sta->getExportedBonusList()) //TODO: optimize
|
||||
for(const auto & stackBonus : sta->getExportedBonusList()) //TODO: optimize
|
||||
{
|
||||
if(stackBonus->source == value.source && stackBonus->sid == value.sid && stackBonus->type == value.type && stackBonus->subtype == value.subtype)
|
||||
{
|
||||
@ -932,11 +933,11 @@ void BattleInfo::updateObstacle(const ObstacleChanges& changes)
|
||||
std::shared_ptr<SpellCreatedObstacle> changedObstacle = std::make_shared<SpellCreatedObstacle>();
|
||||
changedObstacle->fromInfo(changes);
|
||||
|
||||
for(int i = 0; i < obstacles.size(); ++i)
|
||||
for(auto & obstacle : obstacles)
|
||||
{
|
||||
if(obstacles[i]->uniqueID == changes.id) // update this obstacle
|
||||
if(obstacle->uniqueID == changes.id) // update this obstacle
|
||||
{
|
||||
SpellCreatedObstacle * spellObstacle = dynamic_cast<SpellCreatedObstacle *>(obstacles[i].get());
|
||||
auto * spellObstacle = dynamic_cast<SpellCreatedObstacle *>(obstacle.get());
|
||||
assert(spellObstacle);
|
||||
|
||||
// Currently we only support to update the "revealed" property
|
||||
@ -978,7 +979,7 @@ scripting::Pool * BattleInfo::getContextPool() const
|
||||
}
|
||||
#endif
|
||||
|
||||
bool CMP_stack::operator()(const battle::Unit * a, const battle::Unit * b)
|
||||
bool CMP_stack::operator()(const battle::Unit * a, const battle::Unit * b) const
|
||||
{
|
||||
switch(phase)
|
||||
{
|
||||
@ -988,7 +989,8 @@ bool CMP_stack::operator()(const battle::Unit * a, const battle::Unit * b)
|
||||
case 2:
|
||||
case 3:
|
||||
{
|
||||
int as = a->getInitiative(turn), bs = b->getInitiative(turn);
|
||||
int as = a->getInitiative(turn);
|
||||
int bs = b->getInitiative(turn);
|
||||
|
||||
if(as != bs)
|
||||
return as > bs;
|
||||
@ -1009,11 +1011,11 @@ bool CMP_stack::operator()(const battle::Unit * a, const battle::Unit * b)
|
||||
return false;
|
||||
}
|
||||
|
||||
CMP_stack::CMP_stack(int Phase, int Turn, uint8_t Side)
|
||||
CMP_stack::CMP_stack(int Phase, int Turn, uint8_t Side):
|
||||
phase(Phase),
|
||||
turn(Turn),
|
||||
side(Side)
|
||||
{
|
||||
phase = Phase;
|
||||
turn = Turn;
|
||||
side = Side;
|
||||
}
|
||||
|
||||
VCMI_LIB_NAMESPACE_END
|
||||
|
@ -121,7 +121,7 @@ public:
|
||||
void updateObstacle(const ObstacleChanges& changes) override;
|
||||
void removeObstacle(uint32_t id) override;
|
||||
|
||||
void addOrUpdateUnitBonus(CStack * sta, const Bonus & value, bool forceAdd);
|
||||
static void addOrUpdateUnitBonus(CStack * sta, const Bonus & value, bool forceAdd);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CStack * getStack(int stackID, bool onlyAlive = true);
|
||||
@ -134,15 +134,15 @@ public:
|
||||
|
||||
void calculateCasualties(std::map<ui32,si32> * casualties) const; //casualties are array of maps size 2 (attacker, defeneder), maps are (crid => amount)
|
||||
|
||||
CStack * generateNewStack(uint32_t id, const CStackInstance &base, ui8 side, SlotID slot, BattleHex position);
|
||||
CStack * generateNewStack(uint32_t id, const CStackBasicDescriptor &base, ui8 side, SlotID slot, BattleHex position);
|
||||
CStack * generateNewStack(uint32_t id, const CStackInstance & base, ui8 side, const SlotID & slot, BattleHex position);
|
||||
CStack * generateNewStack(uint32_t id, const CStackBasicDescriptor & base, ui8 side, const SlotID & slot, BattleHex position);
|
||||
|
||||
const CGHeroInstance * getHero(PlayerColor player) const; //returns fighting hero that belongs to given player
|
||||
const CGHeroInstance * getHero(const PlayerColor & player) const; //returns fighting hero that belongs to given player
|
||||
|
||||
void localInit();
|
||||
static BattleInfo * setupBattle(const int3 & tile, TerrainId, const BattleField & battlefieldType, const CArmedInstance * armies[2], const CGHeroInstance * heroes[2], bool creatureBank, const CGTownInstance * town);
|
||||
|
||||
ui8 whatSide(PlayerColor player) const;
|
||||
ui8 whatSide(const PlayerColor & player) const;
|
||||
|
||||
protected:
|
||||
#if SCRIPTING_ENABLED
|
||||
@ -157,8 +157,7 @@ class DLL_LINKAGE CMP_stack
|
||||
int turn;
|
||||
uint8_t side;
|
||||
public:
|
||||
|
||||
bool operator ()(const battle::Unit * a, const battle::Unit * b);
|
||||
bool operator()(const battle::Unit * a, const battle::Unit * b) const;
|
||||
CMP_stack(int Phase = 1, int Turn = 0, uint8_t Side = BattleSide::ATTACKER);
|
||||
};
|
||||
|
||||
|
@ -15,8 +15,8 @@ VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
///BattleProxy
|
||||
|
||||
BattleProxy::BattleProxy(Subject subject_)
|
||||
: subject(subject_)
|
||||
BattleProxy::BattleProxy(Subject subject_):
|
||||
subject(std::move(subject_))
|
||||
{
|
||||
setBattle(this);
|
||||
player = subject->getPlayerID();
|
||||
@ -26,7 +26,7 @@ BattleProxy::~BattleProxy() = default;
|
||||
|
||||
int32_t BattleProxy::getActiveStackID() const
|
||||
{
|
||||
auto ret = subject->battleActiveUnit();
|
||||
const auto * ret = subject->battleActiveUnit();
|
||||
if(ret)
|
||||
return ret->unitId();
|
||||
else
|
||||
|
@ -17,12 +17,17 @@
|
||||
|
||||
VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
BattleStateInfoForRetreat::BattleStateInfoForRetreat()
|
||||
: canFlee(false), canSurrender(false), isLastTurnBeforeDie(false), ourStacks(), enemyStacks(), ourHero(nullptr), enemyHero(nullptr), ourSide(-1)
|
||||
BattleStateInfoForRetreat::BattleStateInfoForRetreat():
|
||||
canFlee(false),
|
||||
canSurrender(false),
|
||||
isLastTurnBeforeDie(false),
|
||||
ourHero(nullptr),
|
||||
enemyHero(nullptr),
|
||||
ourSide(-1)
|
||||
{
|
||||
}
|
||||
|
||||
uint64_t getFightingStrength(std::vector<const battle::Unit *> stacks, const CGHeroInstance * hero = nullptr)
|
||||
uint64_t getFightingStrength(const std::vector<const battle::Unit *> & stacks, const CGHeroInstance * hero = nullptr)
|
||||
{
|
||||
uint64_t result = 0;
|
||||
|
||||
@ -33,7 +38,7 @@ uint64_t getFightingStrength(std::vector<const battle::Unit *> stacks, const CGH
|
||||
|
||||
if(hero)
|
||||
{
|
||||
result = (uint64_t)(result * hero->getFightingStrength());
|
||||
result = static_cast<uint64_t>(result * hero->getFightingStrength());
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -66,7 +66,7 @@ static const std::pair<int, EWallPart> wallParts[] =
|
||||
|
||||
static EWallPart hexToWallPart(BattleHex hex)
|
||||
{
|
||||
for(auto & elem : wallParts)
|
||||
for(const auto & elem : wallParts)
|
||||
{
|
||||
if(elem.first == hex)
|
||||
return elem.second;
|
||||
@ -77,7 +77,7 @@ static EWallPart hexToWallPart(BattleHex hex)
|
||||
|
||||
static BattleHex WallPartToHex(EWallPart part)
|
||||
{
|
||||
for(auto & elem : wallParts)
|
||||
for(const auto & elem : wallParts)
|
||||
{
|
||||
if(elem.second == part)
|
||||
return elem.first;
|
||||
@ -117,7 +117,7 @@ ESpellCastProblem::ESpellCastProblem CBattleInfoCallback::battleCanCastSpell(con
|
||||
if(battleCastSpells(side.get()) > 0)
|
||||
return ESpellCastProblem::CASTS_PER_TURN_LIMIT;
|
||||
|
||||
auto hero = dynamic_cast<const CGHeroInstance *>(caster);
|
||||
const auto * hero = dynamic_cast<const CGHeroInstance *>(caster);
|
||||
|
||||
if(!hero)
|
||||
return ESpellCastProblem::NO_HERO_TO_CAST_SPELL;
|
||||
@ -242,7 +242,7 @@ std::vector<PossiblePlayerBattleAction> CBattleInfoCallback::getClientActionsFor
|
||||
if(stack->canMove() && stack->Speed(0, true)) //probably no reason to try move war machines or bound stacks
|
||||
allowedActionList.push_back(PossiblePlayerBattleAction::MOVE_STACK);
|
||||
|
||||
auto siegedTown = battleGetDefendedTown();
|
||||
const auto * siegedTown = battleGetDefendedTown();
|
||||
if(siegedTown && siegedTown->hasFort() && stack->hasBonusOfType(Bonus::CATAPULT)) //TODO: check shots
|
||||
allowedActionList.push_back(PossiblePlayerBattleAction::CATAPULT);
|
||||
if(stack->hasBonusOfType(Bonus::HEALER))
|
||||
@ -315,7 +315,7 @@ SpellID CBattleInfoCallback::battleGetRandomStackSpell(CRandomGenerator & rand,
|
||||
const CStack* CBattleInfoCallback::battleGetStackByPos(BattleHex pos, bool onlyAlive) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(nullptr);
|
||||
for(auto s : battleGetAllStacks(true))
|
||||
for(const auto * s : battleGetAllStacks(true))
|
||||
if(vstd::contains(s->getHexes(), pos) && (!onlyAlive || s->alive()))
|
||||
return s;
|
||||
|
||||
@ -484,7 +484,7 @@ void CBattleInfoCallback::battleGetTurnOrder(std::vector<battle::Units> & out, c
|
||||
return;
|
||||
}
|
||||
|
||||
for(auto one : all)
|
||||
for(const auto * one : all)
|
||||
{
|
||||
if((actualTurn == 0 && !one->willMove()) //we are considering current round and unit won't move
|
||||
|| (actualTurn > 0 && !one->canMove(turn)) //unit won't be able to move in later rounds
|
||||
@ -574,11 +574,11 @@ std::vector<BattleHex> CBattleInfoCallback::battleGetAvailableHexes(const Reacha
|
||||
else
|
||||
{
|
||||
//Not tactics phase -> destination must be reachable and within unit range.
|
||||
if(cache.distances[i] > (int)unitSpeed)
|
||||
if(cache.distances[i] > static_cast<int>(unitSpeed))
|
||||
continue;
|
||||
}
|
||||
|
||||
ret.push_back(i);
|
||||
ret.emplace_back(i);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -596,6 +596,7 @@ std::vector<BattleHex> CBattleInfoCallback::battleGetAvailableHexes(const battle
|
||||
{
|
||||
std::vector<BattleHex> occupiable;
|
||||
|
||||
occupiable.reserve(ret.size());
|
||||
for(auto hex : ret)
|
||||
occupiable.push_back(unit->occupiedHex(hex));
|
||||
|
||||
@ -615,7 +616,7 @@ std::vector<BattleHex> CBattleInfoCallback::battleGetAvailableHexes(const battle
|
||||
});
|
||||
return availableNeighbor != ret.end();
|
||||
};
|
||||
for(auto otherSt : battleAliveUnits(otherSide(unit->unitSide())))
|
||||
for(const auto * otherSt : battleAliveUnits(otherSide(unit->unitSide())))
|
||||
{
|
||||
if(!otherSt->isValidTarget(false))
|
||||
continue;
|
||||
@ -852,7 +853,7 @@ AccessibilityInfo CBattleInfoCallback::getAccesibility() const
|
||||
}
|
||||
|
||||
//tiles occupied by standing stacks
|
||||
for(auto unit : battleAliveUnits())
|
||||
for(const auto * unit : battleAliveUnits())
|
||||
{
|
||||
for(auto hex : unit->getHexes())
|
||||
if(hex.isAvailable()) //towers can have <0 pos; we don't also want to overwrite side columns
|
||||
@ -883,7 +884,7 @@ AccessibilityInfo CBattleInfoCallback::getAccesibility() const
|
||||
std::make_pair(EWallPart::UPPER_WALL, BattleHex(ESiegeHex::DESTRUCTIBLE_WALL_1))
|
||||
};
|
||||
|
||||
for(auto & elem : lockedIfNotDestroyed)
|
||||
for(const auto & elem : lockedIfNotDestroyed)
|
||||
{
|
||||
if(battleGetWallState(elem.first) != EWallState::DESTROYED)
|
||||
ret[elem.second] = EAccessibility::DESTRUCTIBLE_WALL;
|
||||
@ -928,7 +929,7 @@ ReachabilityInfo CBattleInfoCallback::makeBFS(const AccessibilityInfo &accessibi
|
||||
hexq.push(params.startPosition);
|
||||
ret.distances[params.startPosition] = 0;
|
||||
|
||||
std::array<bool, GameConstants::BFIELD_SIZE> accessibleCache;
|
||||
std::array<bool, GameConstants::BFIELD_SIZE> accessibleCache{};
|
||||
for(int hex = 0; hex < GameConstants::BFIELD_SIZE; hex++)
|
||||
accessibleCache[hex] = accessibility.accessible(hex, params.doubleWide, params.side);
|
||||
|
||||
@ -1032,7 +1033,7 @@ std::pair<const battle::Unit *, BattleHex> CBattleInfoCallback::getNearestStack(
|
||||
}
|
||||
}
|
||||
|
||||
if (stackPairs.size())
|
||||
if(!stackPairs.empty())
|
||||
{
|
||||
auto comparator = [](DistStack lhs, DistStack rhs) { return lhs.distanceToPred < rhs.distanceToPred; };
|
||||
auto minimal = boost::min_element(stackPairs, comparator);
|
||||
@ -1042,7 +1043,7 @@ std::pair<const battle::Unit *, BattleHex> CBattleInfoCallback::getNearestStack(
|
||||
return std::make_pair<const battle::Unit * , BattleHex>(nullptr, BattleHex::INVALID);
|
||||
}
|
||||
|
||||
BattleHex CBattleInfoCallback::getAvaliableHex(CreatureID creID, ui8 side, int initialPos) const
|
||||
BattleHex CBattleInfoCallback::getAvaliableHex(const CreatureID & creID, ui8 side, int initialPos) const
|
||||
{
|
||||
bool twoHex = VLC->creh->objects[creID]->isDoubleWide();
|
||||
|
||||
@ -1141,7 +1142,7 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const battl
|
||||
|
||||
BattleHex attackOriginHex = (attackerPos != BattleHex::INVALID) ? attackerPos : attacker->getPosition(); //real or hypothetical (cursor) position
|
||||
|
||||
auto defender = battleGetUnitByPos(destinationTile, true);
|
||||
const auto * defender = battleGetUnitByPos(destinationTile, true);
|
||||
if (!defender)
|
||||
return at; // can't attack thin air
|
||||
|
||||
@ -1161,7 +1162,7 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const battl
|
||||
{
|
||||
if((BattleHex::mutualPosition(tile, destinationTile) > -1 && BattleHex::mutualPosition(tile, attackOriginHex) > -1)) //adjacent both to attacker's head and attacked tile
|
||||
{
|
||||
auto st = battleGetUnitByPos(tile, true);
|
||||
const auto * st = battleGetUnitByPos(tile, true);
|
||||
if(st && battleMatchOwner(st, attacker)) //only hostile stacks - does it work well with Berserk?
|
||||
at.hostileCreaturePositions.insert(tile);
|
||||
}
|
||||
@ -1181,7 +1182,7 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const battl
|
||||
for(BattleHex tile : hexes)
|
||||
{
|
||||
//friendly stacks can also be damaged by Dragon Breath
|
||||
auto st = battleGetUnitByPos(tile, true);
|
||||
const auto * st = battleGetUnitByPos(tile, true);
|
||||
if(st && st != attacker)
|
||||
at.friendlyCreaturePositions.insert(tile);
|
||||
}
|
||||
@ -1208,7 +1209,7 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const battl
|
||||
if (nextHex.isValid())
|
||||
{
|
||||
//friendly stacks can also be damaged by Dragon Breath
|
||||
auto st = battleGetUnitByPos(nextHex, true);
|
||||
const auto * st = battleGetUnitByPos(nextHex, true);
|
||||
if(st != nullptr)
|
||||
at.friendlyCreaturePositions.insert(nextHex);
|
||||
}
|
||||
@ -1308,7 +1309,7 @@ static bool isHexInFront(BattleHex hex, BattleHex testHex, BattleSide::Type side
|
||||
}
|
||||
|
||||
//TODO: this should apply also to mechanics and cursor interface
|
||||
bool CBattleInfoCallback::isToReverse (const battle::Unit * attacker, const battle::Unit * defender) const
|
||||
bool CBattleInfoCallback::isToReverse(const battle::Unit * attacker, const battle::Unit * defender) const
|
||||
{
|
||||
BattleHex attackerHex = attacker->getPosition();
|
||||
BattleHex defenderHex = defender->getPosition();
|
||||
@ -1316,18 +1317,18 @@ bool CBattleInfoCallback::isToReverse (const battle::Unit * attacker, const batt
|
||||
if (attackerHex < 0 ) //turret
|
||||
return false;
|
||||
|
||||
if (isHexInFront(attackerHex, defenderHex, BattleSide::Type(attacker->unitSide())))
|
||||
if(isHexInFront(attackerHex, defenderHex, static_cast<BattleSide::Type>(attacker->unitSide())))
|
||||
return false;
|
||||
|
||||
if (defender->doubleWide())
|
||||
{
|
||||
if (isHexInFront(attackerHex,defender->occupiedHex(), BattleSide::Type(attacker->unitSide())))
|
||||
if(isHexInFront(attackerHex, defender->occupiedHex(), static_cast<BattleSide::Type>(attacker->unitSide())))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (attacker->doubleWide())
|
||||
{
|
||||
if (isHexInFront(attacker->occupiedHex(), defenderHex, BattleSide::Type(attacker->unitSide())))
|
||||
if(isHexInFront(attacker->occupiedHex(), defenderHex, static_cast<BattleSide::Type>(attacker->unitSide())))
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1335,7 +1336,7 @@ bool CBattleInfoCallback::isToReverse (const battle::Unit * attacker, const batt
|
||||
// but this is how H3 handles it which is important, e.g. for direction of dragon breath attacks
|
||||
if (attacker->doubleWide() && defender->doubleWide())
|
||||
{
|
||||
if (isHexInFront(attacker->occupiedHex(), defender->occupiedHex(), BattleSide::Type(attacker->unitSide())))
|
||||
if(isHexInFront(attacker->occupiedHex(), defender->occupiedHex(), static_cast<BattleSide::Type>(attacker->unitSide())))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -1364,7 +1365,7 @@ bool CBattleInfoCallback::battleHasDistancePenalty(const IBonusBearer * shooter,
|
||||
if(shooter->hasBonus(selectorNoDistancePenalty, cachingStrNoDistancePenalty))
|
||||
return false;
|
||||
|
||||
if(auto target = battleGetUnitByPos(destHex, true))
|
||||
if(const auto * target = battleGetUnitByPos(destHex, true))
|
||||
{
|
||||
//If any hex of target creature is within range, there is no penalty
|
||||
int range = GameConstants::BATTLE_PENALTY_DISTANCE;
|
||||
@ -1418,14 +1419,14 @@ std::vector<BattleHex> CBattleInfoCallback::getAttackableBattleHexes() const
|
||||
std::vector<BattleHex> attackableBattleHexes;
|
||||
RETURN_IF_NOT_BATTLE(attackableBattleHexes);
|
||||
|
||||
for(auto & wallPartPair : wallParts)
|
||||
for(const auto & wallPartPair : wallParts)
|
||||
{
|
||||
if(isWallPartPotentiallyAttackable(wallPartPair.second))
|
||||
{
|
||||
auto wallState = battleGetWallState(wallPartPair.second);
|
||||
if(wallState == EWallState::REINFORCED || wallState == EWallState::INTACT || wallState == EWallState::DAMAGED)
|
||||
{
|
||||
attackableBattleHexes.push_back(BattleHex(wallPartPair.first));
|
||||
attackableBattleHexes.emplace_back(wallPartPair.first);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1445,7 +1446,7 @@ int32_t CBattleInfoCallback::battleGetSpellCost(const spells::Spell * sp, const
|
||||
int32_t manaReduction = 0;
|
||||
int32_t manaIncrease = 0;
|
||||
|
||||
for(auto unit : battleAliveUnits())
|
||||
for(const auto * unit : battleAliveUnits())
|
||||
{
|
||||
if(unit->unitOwner() == caster->tempOwner && unit->hasBonusOfType(Bonus::CHANGES_SPELL_COST_FOR_ALLY))
|
||||
{
|
||||
@ -1472,7 +1473,7 @@ bool CBattleInfoCallback::battleIsUnitBlocked(const battle::Unit * unit) const
|
||||
if(unit->hasBonusOfType(Bonus::SIEGE_WEAPON)) //siege weapons cannot be blocked
|
||||
return false;
|
||||
|
||||
for(auto adjacent : battleAdjacentUnits(unit))
|
||||
for(const auto * adjacent : battleAdjacentUnits(unit))
|
||||
{
|
||||
if(adjacent->unitOwner() != unit->unitOwner()) //blocked by enemy stack
|
||||
return true;
|
||||
@ -1487,7 +1488,7 @@ std::set<const battle::Unit *> CBattleInfoCallback::battleAdjacentUnits(const ba
|
||||
|
||||
for(auto hex : unit->getSurroundingHexes())
|
||||
{
|
||||
if(auto neighbour = battleGetUnitByPos(hex, true))
|
||||
if(const auto * neighbour = battleGetUnitByPos(hex, true))
|
||||
ret.insert(neighbour);
|
||||
}
|
||||
|
||||
@ -1552,22 +1553,22 @@ SpellID CBattleInfoCallback::getRandomBeneficialSpell(CRandomGenerator & rand, c
|
||||
case SpellID::SHIELD:
|
||||
case SpellID::FIRE_SHIELD: // not if all enemy units are shooters
|
||||
{
|
||||
auto walker = getAliveEnemy([&](const CStack * stack) //look for enemy, non-shooting stack
|
||||
const auto * walker = getAliveEnemy([&](const CStack * stack) //look for enemy, non-shooting stack
|
||||
{
|
||||
return !stack->canShoot();
|
||||
});
|
||||
|
||||
if (!walker)
|
||||
if(!walker)
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case SpellID::AIR_SHIELD: //only against active shooters
|
||||
{
|
||||
auto shooter = getAliveEnemy([&](const CStack * stack) //look for enemy, non-shooting stack
|
||||
const auto * shooter = getAliveEnemy([&](const CStack * stack) //look for enemy, non-shooting stack
|
||||
{
|
||||
return stack->canShoot();
|
||||
});
|
||||
if (!shooter)
|
||||
if(!shooter)
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
@ -1605,7 +1606,7 @@ SpellID CBattleInfoCallback::getRandomBeneficialSpell(CRandomGenerator & rand, c
|
||||
break;
|
||||
case SpellID::SLAYER://only if monsters are present
|
||||
{
|
||||
auto kingMonster = getAliveEnemy([&](const CStack * stack) -> bool //look for enemy, non-shooting stack
|
||||
const auto * kingMonster = getAliveEnemy([&](const CStack * stack) -> bool //look for enemy, non-shooting stack
|
||||
{
|
||||
const auto isKing = Selector::type()(Bonus::KING1)
|
||||
.Or(Selector::type()(Bonus::KING2))
|
||||
@ -1640,12 +1641,12 @@ SpellID CBattleInfoCallback::getRandomCastedSpell(CRandomGenerator & rand,const
|
||||
if (!bl->size())
|
||||
return SpellID::NONE;
|
||||
int totalWeight = 0;
|
||||
for(auto b : *bl)
|
||||
for(const auto & b : *bl)
|
||||
{
|
||||
totalWeight += std::max(b->additionalInfo[0], 1); //minimal chance to cast is 1
|
||||
}
|
||||
int randomPos = rand.nextInt(totalWeight - 1);
|
||||
for(auto b : *bl)
|
||||
for(const auto & b : *bl)
|
||||
{
|
||||
randomPos -= std::max(b->additionalInfo[0], 1);
|
||||
if(randomPos < 0)
|
||||
@ -1657,7 +1658,7 @@ SpellID CBattleInfoCallback::getRandomCastedSpell(CRandomGenerator & rand,const
|
||||
return SpellID::NONE;
|
||||
}
|
||||
|
||||
int CBattleInfoCallback::battleGetSurrenderCost(PlayerColor Player) const
|
||||
int CBattleInfoCallback::battleGetSurrenderCost(const PlayerColor & Player) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(-3);
|
||||
if(!battleCanSurrender(Player))
|
||||
@ -1671,7 +1672,7 @@ int CBattleInfoCallback::battleGetSurrenderCost(PlayerColor Player) const
|
||||
int ret = 0;
|
||||
double discount = 0;
|
||||
|
||||
for(auto unit : battleAliveUnits(side))
|
||||
for(const auto * unit : battleAliveUnits(side))
|
||||
ret += unit->getRawSurrenderCost();
|
||||
|
||||
if(const CGHeroInstance * h = battleGetFightingHero(side))
|
||||
|
@ -106,7 +106,7 @@ public:
|
||||
|
||||
std::vector<BattleHex> battleGetAvailableHexes(const ReachabilityInfo & cache, const battle::Unit * unit) const;
|
||||
|
||||
int battleGetSurrenderCost(PlayerColor Player) const; //returns cost of surrendering battle, -1 if surrendering is not possible
|
||||
int battleGetSurrenderCost(const PlayerColor & Player) const; //returns cost of surrendering battle, -1 if surrendering is not possible
|
||||
ReachabilityInfo::TDistances battleGetDistances(const battle::Unit * unit, BattleHex assumedPosition) const;
|
||||
std::set<BattleHex> battleGetAttackedHexes(const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos = BattleHex::INVALID) const;
|
||||
bool isEnemyUnitWithinSpecifiedRange(BattleHex attackerPosition, const battle::Unit * defenderUnit, unsigned int range) const;
|
||||
@ -156,7 +156,7 @@ public:
|
||||
AttackableTiles getPotentiallyShootableHexes(const battle::Unit* attacker, BattleHex destinationTile, BattleHex attackerPos) const;
|
||||
std::vector<const battle::Unit *> getAttackedBattleUnits(const battle::Unit* attacker, BattleHex destinationTile, bool rangedAttack, BattleHex attackerPos = BattleHex::INVALID) const; //calculates range of multi-hex attacks
|
||||
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(const battle::Unit *attacker, const battle::Unit *defender) const; //determines if attacker standing at attackerHex should reverse in order to attack defender
|
||||
bool isToReverse(const battle::Unit * attacker, const battle::Unit * defender) const; //determines if attacker standing at attackerHex should reverse in order to attack defender
|
||||
|
||||
ReachabilityInfo getReachability(const battle::Unit * unit) const;
|
||||
ReachabilityInfo getReachability(const ReachabilityInfo::Parameters & params) const;
|
||||
@ -165,7 +165,7 @@ public:
|
||||
AccessibilityInfo getAccesibility(const std::vector<BattleHex> & accessibleHexes) const; //given hexes will be marked as accessible
|
||||
std::pair<const battle::Unit *, BattleHex> getNearestStack(const battle::Unit * closest) const;
|
||||
|
||||
BattleHex getAvaliableHex(CreatureID creID, ui8 side, int initialPos = -1) const; //find place for adding new stack
|
||||
BattleHex getAvaliableHex(const CreatureID & creID, ui8 side, int initialPos = -1) const; //find place for adding new stack
|
||||
protected:
|
||||
ReachabilityInfo getFlyingReachability(const ReachabilityInfo::Parameters & params) const;
|
||||
ReachabilityInfo makeBFS(const AccessibilityInfo & accessibility, const ReachabilityInfo::Parameters & params) const;
|
||||
|
@ -53,9 +53,9 @@ std::vector<std::shared_ptr<const CObstacleInstance>> CBattleInfoEssentials::bat
|
||||
}
|
||||
}
|
||||
|
||||
for(auto obstacle : getBattle()->getAllObstacles())
|
||||
for(const auto & obstacle : getBattle()->getAllObstacles())
|
||||
{
|
||||
if(battleIsObstacleVisibleForSide(*(obstacle.get()), *perspective))
|
||||
if(battleIsObstacleVisibleForSide(*(obstacle), *perspective))
|
||||
ret.push_back(obstacle);
|
||||
}
|
||||
|
||||
@ -108,7 +108,7 @@ TStacks CBattleInfoEssentials::battleGetAllStacks(bool includeTurrets) const
|
||||
TStacks CBattleInfoEssentials::battleGetStacksIf(TStackFilter predicate) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(TStacks());
|
||||
return getBattle()->getStacksIf(predicate);
|
||||
return getBattle()->getStacksIf(std::move(predicate));
|
||||
}
|
||||
|
||||
battle::Units CBattleInfoEssentials::battleGetUnitsIf(battle::UnitFilter predicate) const
|
||||
@ -240,7 +240,7 @@ const CArmedInstance * CBattleInfoEssentials::battleGetArmyObject(ui8 side) cons
|
||||
|
||||
InfoAboutHero CBattleInfoEssentials::battleGetHeroInfo(ui8 side) const
|
||||
{
|
||||
auto hero = getBattle()->getSideHero(side);
|
||||
const auto * hero = getBattle()->getSideHero(side);
|
||||
if(!hero)
|
||||
{
|
||||
return InfoAboutHero();
|
||||
@ -260,7 +260,7 @@ const IBonusBearer * CBattleInfoEssentials::getBattleNode() const
|
||||
return getBattle()->asBearer();
|
||||
}
|
||||
|
||||
bool CBattleInfoEssentials::battleCanFlee(PlayerColor player) const
|
||||
bool CBattleInfoEssentials::battleCanFlee(const PlayerColor & player) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(false);
|
||||
const auto side = playerToSide(player);
|
||||
@ -280,7 +280,7 @@ bool CBattleInfoEssentials::battleCanFlee(PlayerColor player) const
|
||||
//we are besieged defender
|
||||
if(side.get() == BattleSide::DEFENDER && battleGetSiegeLevel())
|
||||
{
|
||||
auto town = battleGetDefendedTown();
|
||||
const auto * town = battleGetDefendedTown();
|
||||
if(!town->hasBuilt(BuildingSubID::ESCAPE_TUNNEL))
|
||||
return false;
|
||||
}
|
||||
@ -288,7 +288,7 @@ bool CBattleInfoEssentials::battleCanFlee(PlayerColor player) const
|
||||
return true;
|
||||
}
|
||||
|
||||
BattleSideOpt CBattleInfoEssentials::playerToSide(PlayerColor player) const
|
||||
BattleSideOpt CBattleInfoEssentials::playerToSide(const PlayerColor & player) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(boost::none);
|
||||
|
||||
@ -317,7 +317,7 @@ ui8 CBattleInfoEssentials::otherSide(ui8 side) const
|
||||
return BattleSide::ATTACKER;
|
||||
}
|
||||
|
||||
PlayerColor CBattleInfoEssentials::otherPlayer(PlayerColor player) const
|
||||
PlayerColor CBattleInfoEssentials::otherPlayer(const PlayerColor & player) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(PlayerColor::CANNOT_DETERMINE);
|
||||
|
||||
@ -328,7 +328,7 @@ PlayerColor CBattleInfoEssentials::otherPlayer(PlayerColor player) const
|
||||
return getBattle()->getSidePlayer(otherSide(side.get()));
|
||||
}
|
||||
|
||||
bool CBattleInfoEssentials::playerHasAccessToHeroInfo(PlayerColor player, const CGHeroInstance * h) const
|
||||
bool CBattleInfoEssentials::playerHasAccessToHeroInfo(const PlayerColor & player, const CGHeroInstance * h) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(false);
|
||||
const auto side = playerToSide(player);
|
||||
@ -347,7 +347,7 @@ ui8 CBattleInfoEssentials::battleGetSiegeLevel() const
|
||||
return getBattle()->getDefendedTown() ? getBattle()->getDefendedTown()->fortLevel() : CGTownInstance::NONE;
|
||||
}
|
||||
|
||||
bool CBattleInfoEssentials::battleCanSurrender(PlayerColor player) const
|
||||
bool CBattleInfoEssentials::battleCanSurrender(const PlayerColor & player) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(false);
|
||||
const auto side = playerToSide(player);
|
||||
|
@ -20,8 +20,8 @@ class IBonusBearer;
|
||||
struct InfoAboutHero;
|
||||
class CArmedInstance;
|
||||
|
||||
typedef std::vector<const CStack *> TStacks;
|
||||
typedef std::function<bool(const CStack *)> TStackFilter;
|
||||
using TStacks = std::vector<const CStack *>;
|
||||
using TStackFilter = std::function<bool (const CStack *)>;
|
||||
|
||||
namespace BattlePerspective
|
||||
{
|
||||
@ -76,15 +76,15 @@ public:
|
||||
si8 battleTacticDist() const override; //returns tactic distance in current tactics phase; 0 if not in tactics phase
|
||||
si8 battleGetTacticsSide() const override; //returns which side is in tactics phase, undefined if none (?)
|
||||
|
||||
bool battleCanFlee(PlayerColor player) const;
|
||||
bool battleCanSurrender(PlayerColor player) const;
|
||||
bool battleCanFlee(const PlayerColor & player) const;
|
||||
bool battleCanSurrender(const PlayerColor & player) const;
|
||||
|
||||
ui8 otherSide(ui8 side) const;
|
||||
PlayerColor otherPlayer(PlayerColor player) const;
|
||||
PlayerColor otherPlayer(const PlayerColor & player) const;
|
||||
|
||||
BattleSideOpt playerToSide(PlayerColor player) const;
|
||||
BattleSideOpt playerToSide(const PlayerColor & player) const;
|
||||
PlayerColor sideToPlayer(ui8 side) const;
|
||||
bool playerHasAccessToHeroInfo(PlayerColor player, const CGHeroInstance * h) const;
|
||||
bool playerHasAccessToHeroInfo(const PlayerColor & player, const CGHeroInstance * h) const;
|
||||
ui8 battleGetSiegeLevel() const; //returns 0 when there is no siege, 1 if fort, 2 is citadel, 3 is castle
|
||||
bool battleHasHero(ui8 side) const;
|
||||
uint32_t battleCastSpells(ui8 side) const; //how many spells has given side cast
|
||||
|
@ -23,13 +23,10 @@ const IBattleInfo * CCallbackBase::getBattle() const
|
||||
return battle;
|
||||
}
|
||||
|
||||
CCallbackBase::CCallbackBase(boost::optional<PlayerColor> Player)
|
||||
: battle(nullptr), player(Player)
|
||||
{}
|
||||
|
||||
CCallbackBase::CCallbackBase()
|
||||
: battle(nullptr)
|
||||
{}
|
||||
CCallbackBase::CCallbackBase(boost::optional<PlayerColor> Player):
|
||||
player(std::move(Player))
|
||||
{
|
||||
}
|
||||
|
||||
void CCallbackBase::setBattle(const IBattleInfo * B)
|
||||
{
|
||||
|
@ -23,7 +23,7 @@ class CBattleInfoEssentials;
|
||||
//Basic class for various callbacks (interfaces called by players to get info about game and so forth)
|
||||
class DLL_LINKAGE CCallbackBase
|
||||
{
|
||||
const IBattleInfo * battle; //battle to which the player is engaged, nullptr if none or not applicable
|
||||
const IBattleInfo * battle = nullptr; //battle to which the player is engaged, nullptr if none or not applicable
|
||||
|
||||
const IBattleInfo * getBattle() const;
|
||||
|
||||
@ -31,7 +31,7 @@ protected:
|
||||
boost::optional<PlayerColor> player; // not set gives access to all information, otherwise callback provides only information "visible" for player
|
||||
|
||||
CCallbackBase(boost::optional<PlayerColor> Player);
|
||||
CCallbackBase();
|
||||
CCallbackBase() = default;
|
||||
|
||||
void setBattle(const IBattleInfo * B);
|
||||
bool duringBattle() const;
|
||||
|
@ -20,18 +20,6 @@
|
||||
|
||||
VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
CObstacleInstance::CObstacleInstance()
|
||||
{
|
||||
obstacleType = USUAL;
|
||||
uniqueID = -1;
|
||||
ID = -1;
|
||||
}
|
||||
|
||||
CObstacleInstance::~CObstacleInstance()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
const ObstacleInfo & CObstacleInstance::getInfo() const
|
||||
{
|
||||
assert( obstacleType == USUAL || obstacleType == ABSOLUTE_OBSTACLE);
|
||||
|
@ -25,12 +25,11 @@ struct DLL_LINKAGE CObstacleInstance
|
||||
};
|
||||
|
||||
BattleHex pos; //position on battlefield, typically left bottom corner
|
||||
EObstacleType obstacleType;
|
||||
si32 uniqueID;
|
||||
si32 ID; //ID of obstacle (defines type of it)
|
||||
EObstacleType obstacleType = USUAL;
|
||||
si32 uniqueID = -1;
|
||||
si32 ID = -1; //ID of obstacle (defines type of it)
|
||||
|
||||
CObstacleInstance();
|
||||
virtual ~CObstacleInstance();
|
||||
virtual ~CObstacleInstance() = default;
|
||||
|
||||
const ObstacleInfo &getInfo() const; //allowed only when not generated by spell (usual or absolute)
|
||||
|
||||
|
@ -24,22 +24,14 @@ VCMI_LIB_NAMESPACE_BEGIN
|
||||
namespace battle
|
||||
{
|
||||
///CAmmo
|
||||
CAmmo::CAmmo(const battle::Unit * Owner, CSelector totalSelector)
|
||||
: used(0),
|
||||
CAmmo::CAmmo(const battle::Unit * Owner, CSelector totalSelector):
|
||||
used(0),
|
||||
owner(Owner),
|
||||
totalProxy(Owner, totalSelector)
|
||||
totalProxy(Owner, std::move(totalSelector))
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
||||
CAmmo::CAmmo(const CAmmo & other)
|
||||
: used(other.used),
|
||||
owner(other.owner),
|
||||
totalProxy(other.totalProxy)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CAmmo & CAmmo::operator= (const CAmmo & other)
|
||||
{
|
||||
used = other.used;
|
||||
@ -98,13 +90,6 @@ CShots::CShots(const battle::Unit * Owner)
|
||||
{
|
||||
}
|
||||
|
||||
CShots::CShots(const CShots & other)
|
||||
: CAmmo(other),
|
||||
env(other.env),
|
||||
shooter(other.shooter)
|
||||
{
|
||||
}
|
||||
|
||||
CShots & CShots::operator=(const CShots & other)
|
||||
{
|
||||
CAmmo::operator=(other);
|
||||
@ -136,17 +121,6 @@ CCasts::CCasts(const battle::Unit * Owner):
|
||||
{
|
||||
}
|
||||
|
||||
CCasts::CCasts(const CCasts & other)
|
||||
: CAmmo(other)
|
||||
{
|
||||
}
|
||||
|
||||
CCasts & CCasts::operator=(const CCasts & other)
|
||||
{
|
||||
CAmmo::operator=(other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
///CRetaliations
|
||||
CRetaliations::CRetaliations(const battle::Unit * Owner)
|
||||
: CAmmo(Owner, Selector::type()(Bonus::ADDITIONAL_RETALIATION)),
|
||||
@ -156,23 +130,6 @@ CRetaliations::CRetaliations(const battle::Unit * Owner)
|
||||
{
|
||||
}
|
||||
|
||||
CRetaliations::CRetaliations(const CRetaliations & other)
|
||||
: CAmmo(other),
|
||||
totalCache(other.totalCache),
|
||||
noRetaliation(other.noRetaliation),
|
||||
unlimited(other.unlimited)
|
||||
{
|
||||
}
|
||||
|
||||
CRetaliations & CRetaliations::operator=(const CRetaliations & other)
|
||||
{
|
||||
CAmmo::operator=(other);
|
||||
totalCache = other.totalCache;
|
||||
noRetaliation = other.noRetaliation;
|
||||
unlimited = other.unlimited;
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool CRetaliations::isLimited() const
|
||||
{
|
||||
return !unlimited.getHasBonus() || noRetaliation.getHasBonus();
|
||||
@ -209,15 +166,6 @@ CHealth::CHealth(const battle::Unit * Owner):
|
||||
reset();
|
||||
}
|
||||
|
||||
CHealth::CHealth(const CHealth & other):
|
||||
owner(other.owner),
|
||||
firstHPleft(other.firstHPleft),
|
||||
fullUnits(other.fullUnits),
|
||||
resurrected(other.resurrected)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CHealth & CHealth::operator=(const CHealth & other)
|
||||
{
|
||||
//do not change owner
|
||||
@ -373,8 +321,8 @@ void CHealth::serializeJson(JsonSerializeFormat & handler)
|
||||
}
|
||||
|
||||
///CUnitState
|
||||
CUnitState::CUnitState()
|
||||
: env(nullptr),
|
||||
CUnitState::CUnitState():
|
||||
env(nullptr),
|
||||
cloned(false),
|
||||
defending(false),
|
||||
defendingAnim(false),
|
||||
@ -398,8 +346,7 @@ CUnitState::CUnitState()
|
||||
defence(this, Selector::typeSubtype(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE), 0),
|
||||
inFrenzy(this, Selector::type()(Bonus::IN_FRENZY)),
|
||||
cloneLifetimeMarker(this, Selector::type()(Bonus::NONE).And(Selector::source(Bonus::SPELL_EFFECT, SpellID::CLONE))),
|
||||
cloneID(-1),
|
||||
position()
|
||||
cloneID(-1)
|
||||
{
|
||||
|
||||
}
|
||||
@ -702,8 +649,8 @@ int CUnitState::getAttack(bool ranged) const
|
||||
|
||||
if(!inFrenzy->empty())
|
||||
{
|
||||
double frenzyPower = (double)inFrenzy->totalValue() / 100;
|
||||
frenzyPower *= (double) (ranged ? defence.getRangedValue() : defence.getMeleeValue());
|
||||
double frenzyPower = static_cast<double>(inFrenzy->totalValue()) / 100;
|
||||
frenzyPower *= static_cast<double>(ranged ? defence.getRangedValue() : defence.getMeleeValue());
|
||||
ret += static_cast<int>(frenzyPower);
|
||||
}
|
||||
|
||||
@ -893,12 +840,10 @@ void CUnitState::onRemoved()
|
||||
ghost = true;
|
||||
}
|
||||
|
||||
CUnitStateDetached::CUnitStateDetached(const IUnitInfo * unit_, const IBonusBearer * bonus_)
|
||||
: CUnitState(),
|
||||
CUnitStateDetached::CUnitStateDetached(const IUnitInfo * unit_, const IBonusBearer * bonus_):
|
||||
unit(unit_),
|
||||
bonus(bonus_)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
TConstBonusListPtr CUnitStateDetached::getAllBonuses(const CSelector & selector, const CSelector & limit, const CBonusSystemNode * root, const std::string & cachingStr) const
|
||||
|
@ -32,7 +32,7 @@ public:
|
||||
explicit CAmmo(const battle::Unit * Owner, CSelector totalSelector);
|
||||
|
||||
//only copy construction is allowed for acquire(), serializeJson should be used for any other "assignment"
|
||||
CAmmo(const CAmmo & other);
|
||||
CAmmo(const CAmmo & other) = default;
|
||||
CAmmo(CAmmo && other) = delete;
|
||||
|
||||
CAmmo & operator=(const CAmmo & other);
|
||||
@ -56,7 +56,7 @@ class DLL_LINKAGE CShots : public CAmmo
|
||||
{
|
||||
public:
|
||||
explicit CShots(const battle::Unit * Owner);
|
||||
CShots(const CShots & other);
|
||||
CShots(const CShots & other) = default;
|
||||
CShots & operator=(const CShots & other);
|
||||
bool isLimited() const override;
|
||||
int32_t total() const override;
|
||||
@ -72,16 +72,16 @@ class DLL_LINKAGE CCasts : public CAmmo
|
||||
{
|
||||
public:
|
||||
explicit CCasts(const battle::Unit * Owner);
|
||||
CCasts(const CCasts & other);
|
||||
CCasts & operator=(const CCasts & other);
|
||||
CCasts(const CCasts & other) = default;
|
||||
CCasts & operator=(const CCasts & other) = default;
|
||||
};
|
||||
|
||||
class DLL_LINKAGE CRetaliations : public CAmmo
|
||||
{
|
||||
public:
|
||||
explicit CRetaliations(const battle::Unit * Owner);
|
||||
CRetaliations(const CRetaliations & other);
|
||||
CRetaliations & operator=(const CRetaliations & other);
|
||||
CRetaliations(const CRetaliations & other) = default;
|
||||
CRetaliations & operator=(const CRetaliations & other) = default;
|
||||
bool isLimited() const override;
|
||||
int32_t total() const override;
|
||||
void reset() override;
|
||||
@ -98,7 +98,7 @@ class DLL_LINKAGE CHealth
|
||||
{
|
||||
public:
|
||||
explicit CHealth(const battle::Unit * Owner);
|
||||
CHealth(const CHealth & other);
|
||||
CHealth(const CHealth & other) = default;
|
||||
|
||||
CHealth & operator=(const CHealth & other);
|
||||
|
||||
|
@ -30,7 +30,7 @@ TDmgRange DamageCalculator::getBaseDamageSingle() const
|
||||
|
||||
if(info.attacker->creatureIndex() == CreatureID::ARROW_TOWERS)
|
||||
{
|
||||
auto town = callback.battleGetDefendedTown();
|
||||
const auto * town = callback.battleGetDefendedTown();
|
||||
assert(town);
|
||||
|
||||
switch(info.attacker->getPosition())
|
||||
@ -78,8 +78,8 @@ TDmgRange DamageCalculator::getBaseDamageBlessCurse() const
|
||||
|
||||
TDmgRange baseDamage = getBaseDamageSingle();
|
||||
TDmgRange modifiedDamage = {
|
||||
std::max( int64_t(1), baseDamage.first + curseBlessAdditiveModifier),
|
||||
std::max( int64_t(1), baseDamage.second + curseBlessAdditiveModifier)
|
||||
std::max(static_cast<int64_t>(1), baseDamage.first + curseBlessAdditiveModifier),
|
||||
std::max(static_cast<int64_t>(1), baseDamage.second + curseBlessAdditiveModifier)
|
||||
};
|
||||
|
||||
if(curseEffects->size() && blessEffects->size() )
|
||||
|
@ -25,8 +25,6 @@ Destination::Destination()
|
||||
|
||||
}
|
||||
|
||||
Destination::~Destination() = default;
|
||||
|
||||
Destination::Destination(const battle::Unit * destination)
|
||||
: unitValue(destination),
|
||||
hexValue(destination->getPosition())
|
||||
@ -47,22 +45,6 @@ Destination::Destination(const Unit * destination, const BattleHex & exactHex)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Destination::Destination(const Destination & other)
|
||||
: unitValue(other.unitValue),
|
||||
hexValue(other.hexValue)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Destination & Destination::operator=(const Destination & other)
|
||||
{
|
||||
unitValue = other.unitValue;
|
||||
hexValue = other.hexValue;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
VCMI_LIB_NAMESPACE_END
|
||||
|
@ -23,14 +23,14 @@ class DLL_LINKAGE Destination
|
||||
{
|
||||
public:
|
||||
Destination();
|
||||
~Destination();
|
||||
~Destination() = default;
|
||||
explicit Destination(const Unit * destination);
|
||||
explicit Destination(const BattleHex & destination);
|
||||
explicit Destination(const Unit * destination, const BattleHex & exactHex);
|
||||
|
||||
Destination(const Destination & other);
|
||||
Destination(const Destination & other) = default;
|
||||
|
||||
Destination & operator=(const Destination & other);
|
||||
Destination & operator=(const Destination & other) = default;
|
||||
|
||||
const Unit * unitValue;
|
||||
BattleHex hexValue;
|
||||
|
@ -14,21 +14,13 @@
|
||||
|
||||
VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
|
||||
ReachabilityInfo::Parameters::Parameters()
|
||||
ReachabilityInfo::Parameters::Parameters(const battle::Unit * Stack, BattleHex StartPosition):
|
||||
perspective(static_cast<BattlePerspective::BattlePerspective>(Stack->unitSide())),
|
||||
startPosition(StartPosition),
|
||||
doubleWide(Stack->doubleWide()),
|
||||
side(Stack->unitSide()),
|
||||
flying(Stack->hasBonusOfType(Bonus::FLYING))
|
||||
{
|
||||
perspective = BattlePerspective::ALL_KNOWING;
|
||||
side = 0;
|
||||
doubleWide = flying = false;
|
||||
}
|
||||
|
||||
ReachabilityInfo::Parameters::Parameters(const battle::Unit * Stack, BattleHex StartPosition)
|
||||
{
|
||||
perspective = (BattlePerspective::BattlePerspective)(Stack->unitSide());
|
||||
startPosition = StartPosition;
|
||||
doubleWide = Stack->doubleWide();
|
||||
side = Stack->unitSide();
|
||||
flying = Stack->hasBonusOfType(Bonus::FLYING);
|
||||
knownAccessible = battle::Unit::getHexes(startPosition, doubleWide, side);
|
||||
}
|
||||
|
||||
|
@ -18,22 +18,22 @@ VCMI_LIB_NAMESPACE_BEGIN
|
||||
// startPosition and perpective.
|
||||
struct DLL_LINKAGE ReachabilityInfo
|
||||
{
|
||||
typedef std::array<uint32_t, GameConstants::BFIELD_SIZE> TDistances;
|
||||
typedef std::array<BattleHex, GameConstants::BFIELD_SIZE> TPredecessors;
|
||||
using TDistances = std::array<uint32_t, GameConstants::BFIELD_SIZE>;
|
||||
using TPredecessors = std::array<BattleHex, GameConstants::BFIELD_SIZE>;
|
||||
|
||||
enum { INFINITE_DIST = 1000000 };
|
||||
|
||||
struct DLL_LINKAGE Parameters
|
||||
{
|
||||
ui8 side;
|
||||
bool doubleWide;
|
||||
bool flying;
|
||||
ui8 side = 0;
|
||||
bool doubleWide = false;
|
||||
bool flying = false;
|
||||
std::vector<BattleHex> knownAccessible; //hexes that will be treated as accessible, even if they're occupied by stack (by default - tiles occupied by stack we do reachability for, so it doesn't block itself)
|
||||
|
||||
BattleHex startPosition; //assumed position of stack
|
||||
BattlePerspective::BattlePerspective perspective; //some obstacles (eg. quicksands) may be invisible for some side
|
||||
BattlePerspective::BattlePerspective perspective = BattlePerspective::ALL_KNOWING; //some obstacles (eg. quicksands) may be invisible for some side
|
||||
|
||||
Parameters();
|
||||
Parameters() = default;
|
||||
Parameters(const battle::Unit * Stack, BattleHex StartPosition);
|
||||
};
|
||||
|
||||
|
@ -13,15 +13,6 @@
|
||||
|
||||
VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
SideInBattle::SideInBattle()
|
||||
{
|
||||
color = PlayerColor::CANNOT_DETERMINE;
|
||||
hero = nullptr;
|
||||
armyObject = nullptr;
|
||||
castSpellsCount = 0;
|
||||
enchanterCounter = 0;
|
||||
}
|
||||
|
||||
void SideInBattle::init(const CGHeroInstance * Hero, const CArmedInstance * Army)
|
||||
{
|
||||
hero = Hero;
|
||||
|
@ -17,15 +17,14 @@ class CArmedInstance;
|
||||
|
||||
struct DLL_LINKAGE SideInBattle
|
||||
{
|
||||
PlayerColor color;
|
||||
const CGHeroInstance * hero; //may be NULL if army is not commanded by hero
|
||||
const CArmedInstance * armyObject; //adv. map object with army that participates in battle; may be same as hero
|
||||
PlayerColor color = PlayerColor::CANNOT_DETERMINE;
|
||||
const CGHeroInstance * hero = nullptr; //may be NULL if army is not commanded by hero
|
||||
const CArmedInstance * armyObject = nullptr; //adv. map object with army that participates in battle; may be same as hero
|
||||
|
||||
uint32_t castSpellsCount; //how many spells each side has been cast this turn
|
||||
uint32_t castSpellsCount = 0; //how many spells each side has been cast this turn
|
||||
std::vector<SpellID> usedSpellsHistory; //every time hero casts spell, it's inserted here -> eagle eye skill
|
||||
int32_t enchanterCounter; //tends to pass through 0, so sign is needed
|
||||
int32_t enchanterCounter = 0; //tends to pass through 0, so sign is needed
|
||||
|
||||
SideInBattle();
|
||||
void init(const CGHeroInstance * Hero, const CArmedInstance * Army);
|
||||
|
||||
|
||||
|
@ -15,9 +15,9 @@ VCMI_LIB_NAMESPACE_BEGIN
|
||||
|
||||
SiegeInfo::SiegeInfo()
|
||||
{
|
||||
for(int i = 0; i < int(EWallPart::PARTS_COUNT); ++i)
|
||||
for(int i = 0; i < static_cast<int>(EWallPart::PARTS_COUNT); ++i)
|
||||
{
|
||||
wallState[EWallPart(i)] = EWallState::NONE;
|
||||
wallState[static_cast<EWallPart>(i)] = EWallState::NONE;
|
||||
}
|
||||
gateState = EGateState::NONE;
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ std::vector<BattleHex> Unit::getSurroundingHexes(BattleHex position, bool twoHex
|
||||
|
||||
if(side == BattleSide::ATTACKER)
|
||||
{
|
||||
for(BattleHex::EDir dir = BattleHex::EDir(0); dir <= BattleHex::EDir(4); dir = BattleHex::EDir(dir+1))
|
||||
for(auto dir = static_cast<BattleHex::EDir>(0); dir <= static_cast<BattleHex::EDir>(4); dir = static_cast<BattleHex::EDir>(dir + 1))
|
||||
BattleHex::checkAndPush(position.cloneInDirection(dir, false), hexes);
|
||||
|
||||
BattleHex::checkAndPush(otherHex.cloneInDirection(BattleHex::EDir::BOTTOM_LEFT, false), hexes);
|
||||
@ -70,7 +70,7 @@ std::vector<BattleHex> Unit::getSurroundingHexes(BattleHex position, bool twoHex
|
||||
{
|
||||
BattleHex::checkAndPush(position.cloneInDirection(BattleHex::EDir::TOP_LEFT, false), hexes);
|
||||
|
||||
for(BattleHex::EDir dir = BattleHex::EDir(0); dir <= BattleHex::EDir(4); dir = BattleHex::EDir(dir+1))
|
||||
for(auto dir = static_cast<BattleHex::EDir>(0); dir <= static_cast<BattleHex::EDir>(4); dir = static_cast<BattleHex::EDir>(dir + 1))
|
||||
BattleHex::checkAndPush(otherHex.cloneInDirection(dir, false), hexes);
|
||||
|
||||
BattleHex::checkAndPush(position.cloneInDirection(BattleHex::EDir::BOTTOM_LEFT, false), hexes);
|
||||
@ -206,16 +206,6 @@ int Unit::getRawSurrenderCost() const
|
||||
}
|
||||
|
||||
///UnitInfo
|
||||
UnitInfo::UnitInfo()
|
||||
: id(0),
|
||||
count(0),
|
||||
type(),
|
||||
side(0),
|
||||
position(),
|
||||
summoned(false)
|
||||
{
|
||||
}
|
||||
|
||||
void UnitInfo::serializeJson(JsonSerializeFormat & handler)
|
||||
{
|
||||
handler.serializeInt("count", count);
|
||||
|
@ -116,14 +116,12 @@ public:
|
||||
class DLL_LINKAGE UnitInfo
|
||||
{
|
||||
public:
|
||||
uint32_t id;
|
||||
TQuantity count;
|
||||
uint32_t id = 0;
|
||||
TQuantity count = 0;
|
||||
CreatureID type;
|
||||
ui8 side;
|
||||
ui8 side = 0;
|
||||
BattleHex position;
|
||||
bool summoned;
|
||||
|
||||
UnitInfo();
|
||||
bool summoned = false;
|
||||
|
||||
void serializeJson(JsonSerializeFormat & handler);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user