mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-20 20:23:03 +02:00
Properly pass battleID in all battle netpack's
This commit is contained in:
parent
747e28947a
commit
9fa7a93fb0
@ -320,6 +320,11 @@ battle::Units HypotheticBattle::getUnitsIf(battle::UnitFilter predicate) const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BattleID HypotheticBattle::getBattleID() const
|
||||||
|
{
|
||||||
|
return subject->getBattle()->getBattleID();
|
||||||
|
}
|
||||||
|
|
||||||
int32_t HypotheticBattle::getActiveStackID() const
|
int32_t HypotheticBattle::getActiveStackID() const
|
||||||
{
|
{
|
||||||
return activeUnitId;
|
return activeUnitId;
|
||||||
|
@ -207,6 +207,7 @@ void CBattleCallback::battleMakeSpellAction(const BattleID & battleID, const Bat
|
|||||||
{
|
{
|
||||||
assert(action.actionType == EActionType::HERO_SPELL);
|
assert(action.actionType == EActionType::HERO_SPELL);
|
||||||
MakeAction mca(action);
|
MakeAction mca(action);
|
||||||
|
mca.battleID = battleID;
|
||||||
sendRequest(&mca);
|
sendRequest(&mca);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,6 +377,7 @@ void CBattleCallback::battleMakeUnitAction(const BattleID & battleID, const Batt
|
|||||||
assert(!cl->gs->getBattle(battleID)->tacticDistance);
|
assert(!cl->gs->getBattle(battleID)->tacticDistance);
|
||||||
MakeAction ma;
|
MakeAction ma;
|
||||||
ma.ba = action;
|
ma.ba = action;
|
||||||
|
ma.battleID = battleID;
|
||||||
sendRequest(&ma);
|
sendRequest(&ma);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,6 +386,7 @@ void CBattleCallback::battleMakeTacticAction(const BattleID & battleID, const Ba
|
|||||||
assert(cl->gs->getBattle(battleID)->tacticDistance);
|
assert(cl->gs->getBattle(battleID)->tacticDistance);
|
||||||
MakeAction ma;
|
MakeAction ma;
|
||||||
ma.ba = action;
|
ma.ba = action;
|
||||||
|
ma.battleID = battleID;
|
||||||
sendRequest(&ma);
|
sendRequest(&ma);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -615,7 +615,7 @@ void CClient::battleStarted(const BattleInfo * info)
|
|||||||
if(att || def)
|
if(att || def)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*CPlayerInterface::pim);
|
boost::unique_lock<boost::recursive_mutex> un(*CPlayerInterface::pim);
|
||||||
CPlayerInterface::battleInt = std::make_shared<BattleInterface>(leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def);
|
CPlayerInterface::battleInt = std::make_shared<BattleInterface>(info->getBattleID(), leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def);
|
||||||
}
|
}
|
||||||
else if(settings["session"]["spectate"].Bool() && !settings["session"]["spectate-skip-battle"].Bool())
|
else if(settings["session"]["spectate"].Bool() && !settings["session"]["spectate-skip-battle"].Bool())
|
||||||
{
|
{
|
||||||
@ -623,7 +623,7 @@ void CClient::battleStarted(const BattleInfo * info)
|
|||||||
auto spectratorInt = std::dynamic_pointer_cast<CPlayerInterface>(playerint[PlayerColor::SPECTATOR]);
|
auto spectratorInt = std::dynamic_pointer_cast<CPlayerInterface>(playerint[PlayerColor::SPECTATOR]);
|
||||||
spectratorInt->cb->onBattleStarted(info);
|
spectratorInt->cb->onBattleStarted(info);
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*CPlayerInterface::pim);
|
boost::unique_lock<boost::recursive_mutex> un(*CPlayerInterface::pim);
|
||||||
CPlayerInterface::battleInt = std::make_shared<BattleInterface>(leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def, spectratorInt);
|
CPlayerInterface::battleInt = std::make_shared<BattleInterface>(info->getBattleID(), leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def, spectratorInt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
#include "../../lib/TerrainHandler.h"
|
#include "../../lib/TerrainHandler.h"
|
||||||
#include "../../lib/CThreadHelper.h"
|
#include "../../lib/CThreadHelper.h"
|
||||||
|
|
||||||
BattleInterface::BattleInterface(const CCreatureSet *army1, const CCreatureSet *army2,
|
BattleInterface::BattleInterface(const BattleID & battleID, const CCreatureSet *army1, const CCreatureSet *army2,
|
||||||
const CGHeroInstance *hero1, const CGHeroInstance *hero2,
|
const CGHeroInstance *hero1, const CGHeroInstance *hero2,
|
||||||
std::shared_ptr<CPlayerInterface> att,
|
std::shared_ptr<CPlayerInterface> att,
|
||||||
std::shared_ptr<CPlayerInterface> defen,
|
std::shared_ptr<CPlayerInterface> defen,
|
||||||
@ -55,6 +55,7 @@ BattleInterface::BattleInterface(const CCreatureSet *army1, const CCreatureSet *
|
|||||||
, attackerInt(att)
|
, attackerInt(att)
|
||||||
, defenderInt(defen)
|
, defenderInt(defen)
|
||||||
, curInt(att)
|
, curInt(att)
|
||||||
|
, battleID(battleID)
|
||||||
, battleOpeningDelayActive(true)
|
, battleOpeningDelayActive(true)
|
||||||
{
|
{
|
||||||
if(spectatorInt)
|
if(spectatorInt)
|
||||||
|
@ -156,7 +156,7 @@ public:
|
|||||||
BattleID getBattleID() const;
|
BattleID getBattleID() const;
|
||||||
std::shared_ptr<CPlayerBattleCallback> getBattle() const;
|
std::shared_ptr<CPlayerBattleCallback> getBattle() const;
|
||||||
|
|
||||||
BattleInterface(const CCreatureSet *army1, const CCreatureSet *army2, const CGHeroInstance *hero1, const CGHeroInstance *hero2, std::shared_ptr<CPlayerInterface> att, std::shared_ptr<CPlayerInterface> defen, std::shared_ptr<CPlayerInterface> spectatorInt = nullptr);
|
BattleInterface(const BattleID & battleID, const CCreatureSet *army1, const CCreatureSet *army2, const CGHeroInstance *hero1, const CGHeroInstance *hero2, std::shared_ptr<CPlayerInterface> att, std::shared_ptr<CPlayerInterface> defen, std::shared_ptr<CPlayerInterface> spectatorInt = nullptr);
|
||||||
~BattleInterface();
|
~BattleInterface();
|
||||||
|
|
||||||
void trySetActivePlayer( PlayerColor player ); // if in hotseat, will activate interface of chosen player
|
void trySetActivePlayer( PlayerColor player ); // if in hotseat, will activate interface of chosen player
|
||||||
|
@ -1492,6 +1492,7 @@ struct DLL_LINKAGE BattleStart : public CPackForClient
|
|||||||
{
|
{
|
||||||
h & battleID;
|
h & battleID;
|
||||||
h & info;
|
h & info;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1506,6 +1507,7 @@ struct DLL_LINKAGE BattleNextRound : public CPackForClient
|
|||||||
template <typename Handler> void serialize(Handler & h, const int version)
|
template <typename Handler> void serialize(Handler & h, const int version)
|
||||||
{
|
{
|
||||||
h & battleID;
|
h & battleID;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1524,6 +1526,7 @@ struct DLL_LINKAGE BattleSetActiveStack : public CPackForClient
|
|||||||
h & battleID;
|
h & battleID;
|
||||||
h & stack;
|
h & stack;
|
||||||
h & askPlayerInterface;
|
h & askPlayerInterface;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1557,6 +1560,7 @@ struct DLL_LINKAGE BattleResultAccepted : public CPackForClient
|
|||||||
h & battleID;
|
h & battleID;
|
||||||
h & heroResult;
|
h & heroResult;
|
||||||
h & winnerSide;
|
h & winnerSide;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1583,6 +1587,7 @@ struct DLL_LINKAGE BattleResult : public Query
|
|||||||
h & casualties[1];
|
h & casualties[1];
|
||||||
h & exp;
|
h & exp;
|
||||||
h & artifacts;
|
h & artifacts;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1600,6 +1605,7 @@ struct DLL_LINKAGE BattleLogMessage : public CPackForClient
|
|||||||
{
|
{
|
||||||
h & battleID;
|
h & battleID;
|
||||||
h & lines;
|
h & lines;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1623,6 +1629,7 @@ struct DLL_LINKAGE BattleStackMoved : public CPackForClient
|
|||||||
h & tilesToMove;
|
h & tilesToMove;
|
||||||
h & distance;
|
h & distance;
|
||||||
h & teleporting;
|
h & teleporting;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1640,6 +1647,7 @@ struct DLL_LINKAGE BattleUnitsChanged : public CPackForClient
|
|||||||
{
|
{
|
||||||
h & battleID;
|
h & battleID;
|
||||||
h & changedStacks;
|
h & changedStacks;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1693,6 +1701,7 @@ struct BattleStackAttacked
|
|||||||
h & killedAmount;
|
h & killedAmount;
|
||||||
h & damageAmount;
|
h & damageAmount;
|
||||||
h & spellID;
|
h & spellID;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
bool operator<(const BattleStackAttacked & b) const
|
bool operator<(const BattleStackAttacked & b) const
|
||||||
{
|
{
|
||||||
@ -1758,6 +1767,7 @@ struct DLL_LINKAGE BattleAttack : public CPackForClient
|
|||||||
h & tile;
|
h & tile;
|
||||||
h & spellID;
|
h & spellID;
|
||||||
h & attackerChanges;
|
h & attackerChanges;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1780,6 +1790,7 @@ struct DLL_LINKAGE StartAction : public CPackForClient
|
|||||||
{
|
{
|
||||||
h & battleID;
|
h & battleID;
|
||||||
h & ba;
|
h & ba;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1826,6 +1837,7 @@ struct DLL_LINKAGE BattleSpellCast : public CPackForClient
|
|||||||
h & casterStack;
|
h & casterStack;
|
||||||
h & castByHero;
|
h & castByHero;
|
||||||
h & activeCast;
|
h & activeCast;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1847,6 +1859,7 @@ struct DLL_LINKAGE SetStackEffect : public CPackForClient
|
|||||||
h & toAdd;
|
h & toAdd;
|
||||||
h & toUpdate;
|
h & toUpdate;
|
||||||
h & toRemove;
|
h & toRemove;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1864,6 +1877,7 @@ struct DLL_LINKAGE StacksInjured : public CPackForClient
|
|||||||
{
|
{
|
||||||
h & battleID;
|
h & battleID;
|
||||||
h & stacks;
|
h & stacks;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1878,6 +1892,7 @@ struct DLL_LINKAGE BattleResultsApplied : public CPackForClient
|
|||||||
h & battleID;
|
h & battleID;
|
||||||
h & player1;
|
h & player1;
|
||||||
h & player2;
|
h & player2;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1895,6 +1910,7 @@ struct DLL_LINKAGE BattleObstaclesChanged : public CPackForClient
|
|||||||
{
|
{
|
||||||
h & battleID;
|
h & battleID;
|
||||||
h & changes;
|
h & changes;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1931,6 +1947,7 @@ struct DLL_LINKAGE CatapultAttack : public CPackForClient
|
|||||||
h & battleID;
|
h & battleID;
|
||||||
h & attackedParts;
|
h & attackedParts;
|
||||||
h & attacker;
|
h & attacker;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1953,6 +1970,7 @@ struct DLL_LINKAGE BattleSetStackProperty : public CPackForClient
|
|||||||
h & which;
|
h & which;
|
||||||
h & val;
|
h & val;
|
||||||
h & absolute;
|
h & absolute;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -1977,6 +1995,7 @@ struct DLL_LINKAGE BattleTriggerEffect : public CPackForClient
|
|||||||
h & effect;
|
h & effect;
|
||||||
h & val;
|
h & val;
|
||||||
h & additionalInfo;
|
h & additionalInfo;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -1993,6 +2012,7 @@ struct DLL_LINKAGE BattleUpdateGateState : public CPackForClient
|
|||||||
{
|
{
|
||||||
h & battleID;
|
h & battleID;
|
||||||
h & state;
|
h & state;
|
||||||
|
assert(battleID != BattleID::NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -180,10 +180,10 @@ public:
|
|||||||
DLL_LINKAGE static const QueryID NONE;
|
DLL_LINKAGE static const QueryID NONE;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BattleID : public Identifier<QueryID>
|
class BattleID : public Identifier<BattleID>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using Identifier<QueryID>::Identifier;
|
using Identifier<BattleID>::Identifier;
|
||||||
DLL_LINKAGE static const BattleID NONE;
|
DLL_LINKAGE static const BattleID NONE;
|
||||||
};
|
};
|
||||||
class ObjectInstanceID : public Identifier<ObjectInstanceID>
|
class ObjectInstanceID : public Identifier<ObjectInstanceID>
|
||||||
|
@ -252,6 +252,7 @@ void BattleSpellMechanics::cast(ServerCallback * server, const Target & target)
|
|||||||
|
|
||||||
sc.side = casterSide;
|
sc.side = casterSide;
|
||||||
sc.spellID = getSpellId();
|
sc.spellID = getSpellId();
|
||||||
|
sc.battleID = battle()->getBattle()->getBattleID();
|
||||||
sc.tile = target.at(0).hexValue;
|
sc.tile = target.at(0).hexValue;
|
||||||
|
|
||||||
sc.castByHero = mode == Mode::HERO;
|
sc.castByHero = mode == Mode::HERO;
|
||||||
@ -299,6 +300,7 @@ void BattleSpellMechanics::cast(ServerCallback * server, const Target & target)
|
|||||||
beforeCast(sc, *server->getRNG(), target);
|
beforeCast(sc, *server->getRNG(), target);
|
||||||
|
|
||||||
BattleLogMessage castDescription;
|
BattleLogMessage castDescription;
|
||||||
|
castDescription.battleID = battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
@ -344,8 +346,9 @@ void BattleSpellMechanics::cast(ServerCallback * server, const Target & target)
|
|||||||
|
|
||||||
// send empty event to client
|
// send empty event to client
|
||||||
// temporary(?) workaround to force animations to trigger
|
// temporary(?) workaround to force animations to trigger
|
||||||
StacksInjured fake_event;
|
StacksInjured fakeEvent;
|
||||||
server->apply(&fake_event);
|
fakeEvent.battleID = battle()->getBattle()->getBattleID();
|
||||||
|
server->apply(&fakeEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleSpellMechanics::beforeCast(BattleSpellCast & sc, vstd::RNG & rng, const Target & target)
|
void BattleSpellMechanics::beforeCast(BattleSpellCast & sc, vstd::RNG & rng, const Target & target)
|
||||||
@ -448,6 +451,7 @@ std::set<const battle::Unit *> BattleSpellMechanics::collectTargets() const
|
|||||||
void BattleSpellMechanics::doRemoveEffects(ServerCallback * server, const std::vector<const battle::Unit *> & targets, const CSelector & selector)
|
void BattleSpellMechanics::doRemoveEffects(ServerCallback * server, const std::vector<const battle::Unit *> & targets, const CSelector & selector)
|
||||||
{
|
{
|
||||||
SetStackEffect sse;
|
SetStackEffect sse;
|
||||||
|
sse.battleID = battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
for(const auto * unit : targets)
|
for(const auto * unit : targets)
|
||||||
{
|
{
|
||||||
|
@ -73,7 +73,7 @@ private:
|
|||||||
|
|
||||||
std::set<const battle::Unit *> collectTargets() const;
|
std::set<const battle::Unit *> collectTargets() const;
|
||||||
|
|
||||||
static void doRemoveEffects(ServerCallback * server, const std::vector<const battle::Unit *> & targets, const CSelector & selector);
|
void doRemoveEffects(ServerCallback * server, const std::vector<const battle::Unit *> & targets, const CSelector & selector);
|
||||||
|
|
||||||
std::set<BattleHex> spellRangeInHexes(BattleHex centralHex) const;
|
std::set<BattleHex> spellRangeInHexes(BattleHex centralHex) const;
|
||||||
|
|
||||||
|
@ -188,6 +188,7 @@ int Catapult::getRandomDamage (ServerCallback * server) const
|
|||||||
void Catapult::removeTowerShooters(ServerCallback * server, const Mechanics * m) const
|
void Catapult::removeTowerShooters(ServerCallback * server, const Mechanics * m) const
|
||||||
{
|
{
|
||||||
BattleUnitsChanged removeUnits;
|
BattleUnitsChanged removeUnits;
|
||||||
|
removeUnits.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
for (auto const wallPart : { EWallPart::KEEP, EWallPart::BOTTOM_TOWER, EWallPart::UPPER_TOWER })
|
for (auto const wallPart : { EWallPart::KEEP, EWallPart::BOTTOM_TOWER, EWallPart::UPPER_TOWER })
|
||||||
{
|
{
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "../ISpellMechanics.h"
|
#include "../ISpellMechanics.h"
|
||||||
#include "../../NetPacks.h"
|
#include "../../NetPacks.h"
|
||||||
#include "../../battle/CBattleInfoCallback.h"
|
#include "../../battle/CBattleInfoCallback.h"
|
||||||
|
#include "../../battle/IBattleState.h"
|
||||||
#include "../../battle/CUnitState.h"
|
#include "../../battle/CUnitState.h"
|
||||||
#include "../../serializer/JsonSerializeFormat.h"
|
#include "../../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
@ -60,6 +61,7 @@ void Clone::apply(ServerCallback * server, const Mechanics * m, const EffectTarg
|
|||||||
info.summoned = true;
|
info.summoned = true;
|
||||||
|
|
||||||
BattleUnitsChanged pack;
|
BattleUnitsChanged pack;
|
||||||
|
pack.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
pack.changedStacks.emplace_back(info.id, UnitChanges::EOperation::ADD);
|
pack.changedStacks.emplace_back(info.id, UnitChanges::EOperation::ADD);
|
||||||
info.save(pack.changedStacks.back().data);
|
info.save(pack.changedStacks.back().data);
|
||||||
server->apply(&pack);
|
server->apply(&pack);
|
||||||
@ -67,6 +69,7 @@ void Clone::apply(ServerCallback * server, const Mechanics * m, const EffectTarg
|
|||||||
//TODO: use BattleUnitsChanged with UPDATE operation
|
//TODO: use BattleUnitsChanged with UPDATE operation
|
||||||
|
|
||||||
BattleUnitsChanged cloneFlags;
|
BattleUnitsChanged cloneFlags;
|
||||||
|
cloneFlags.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
const auto *cloneUnit = m->battle()->battleGetUnitByID(unitId);
|
const auto *cloneUnit = m->battle()->battleGetUnitByID(unitId);
|
||||||
|
|
||||||
@ -89,6 +92,8 @@ void Clone::apply(ServerCallback * server, const Mechanics * m, const EffectTarg
|
|||||||
server->apply(&cloneFlags);
|
server->apply(&cloneFlags);
|
||||||
|
|
||||||
SetStackEffect sse;
|
SetStackEffect sse;
|
||||||
|
sse.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
Bonus lifeTimeMarker(BonusDuration::N_TURNS, BonusType::NONE, BonusSource::SPELL_EFFECT, 0, SpellID::CLONE); //TODO: use special bonus type
|
Bonus lifeTimeMarker(BonusDuration::N_TURNS, BonusType::NONE, BonusSource::SPELL_EFFECT, 0, SpellID::CLONE); //TODO: use special bonus type
|
||||||
lifeTimeMarker.turnsRemain = m->getEffectDuration();
|
lifeTimeMarker.turnsRemain = m->getEffectDuration();
|
||||||
std::vector<Bonus> buffer;
|
std::vector<Bonus> buffer;
|
||||||
|
@ -34,6 +34,9 @@ void Damage::apply(ServerCallback * server, const Mechanics * m, const EffectTar
|
|||||||
{
|
{
|
||||||
StacksInjured stacksInjured;
|
StacksInjured stacksInjured;
|
||||||
BattleLogMessage blm;
|
BattleLogMessage blm;
|
||||||
|
stacksInjured.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
blm.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
size_t targetIndex = 0;
|
size_t targetIndex = 0;
|
||||||
const battle::Unit * firstTarget = nullptr;
|
const battle::Unit * firstTarget = nullptr;
|
||||||
const bool describe = server->describeChanges();
|
const bool describe = server->describeChanges();
|
||||||
@ -48,6 +51,7 @@ void Damage::apply(ServerCallback * server, const Mechanics * m, const EffectTar
|
|||||||
if(unit && unit->alive())
|
if(unit && unit->alive())
|
||||||
{
|
{
|
||||||
BattleStackAttacked bsa;
|
BattleStackAttacked bsa;
|
||||||
|
bsa.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
bsa.damageAmount = damageForTarget(targetIndex, m, unit);
|
bsa.damageAmount = damageForTarget(targetIndex, m, unit);
|
||||||
bsa.stackAttacked = unit->unitId();
|
bsa.stackAttacked = unit->unitId();
|
||||||
bsa.attackerID = -1;
|
bsa.attackerID = -1;
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "../ISpellMechanics.h"
|
#include "../ISpellMechanics.h"
|
||||||
#include "../../NetPacks.h"
|
#include "../../NetPacks.h"
|
||||||
#include "../../battle/CBattleInfoCallback.h"
|
#include "../../battle/CBattleInfoCallback.h"
|
||||||
|
#include "../../battle/BattleInfo.h"
|
||||||
#include "../../battle/CUnitState.h"
|
#include "../../battle/CUnitState.h"
|
||||||
#include "../../serializer/JsonSerializeFormat.h"
|
#include "../../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
@ -27,6 +28,7 @@ namespace effects
|
|||||||
void DemonSummon::apply(ServerCallback * server, const Mechanics * m, const EffectTarget & target) const
|
void DemonSummon::apply(ServerCallback * server, const Mechanics * m, const EffectTarget & target) const
|
||||||
{
|
{
|
||||||
BattleUnitsChanged pack;
|
BattleUnitsChanged pack;
|
||||||
|
pack.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
for(const Destination & dest : target)
|
for(const Destination & dest : target)
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "../../NetPacks.h"
|
#include "../../NetPacks.h"
|
||||||
#include "../../battle/IBattleState.h"
|
#include "../../battle/IBattleState.h"
|
||||||
|
#include "../../battle/CBattleInfoCallback.h"
|
||||||
#include "../../battle/Unit.h"
|
#include "../../battle/Unit.h"
|
||||||
#include "../../serializer/JsonSerializeFormat.h"
|
#include "../../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
@ -33,6 +34,8 @@ void Dispel::apply(ServerCallback * server, const Mechanics * m, const EffectTar
|
|||||||
const bool describe = server->describeChanges();
|
const bool describe = server->describeChanges();
|
||||||
SetStackEffect sse;
|
SetStackEffect sse;
|
||||||
BattleLogMessage blm;
|
BattleLogMessage blm;
|
||||||
|
blm.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
sse.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
for(const auto & t : target)
|
for(const auto & t : target)
|
||||||
{
|
{
|
||||||
|
@ -35,7 +35,11 @@ void Heal::apply(ServerCallback * server, const Mechanics * m, const EffectTarge
|
|||||||
void Heal::apply(int64_t value, ServerCallback * server, const Mechanics * m, const EffectTarget & target) const
|
void Heal::apply(int64_t value, ServerCallback * server, const Mechanics * m, const EffectTarget & target) const
|
||||||
{
|
{
|
||||||
BattleLogMessage logMessage;
|
BattleLogMessage logMessage;
|
||||||
|
logMessage.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
BattleUnitsChanged pack;
|
BattleUnitsChanged pack;
|
||||||
|
pack.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
prepareHealEffect(value, pack, logMessage, *server->getRNG(), m, target);
|
prepareHealEffect(value, pack, logMessage, *server->getRNG(), m, target);
|
||||||
if(!pack.changedStacks.empty())
|
if(!pack.changedStacks.empty())
|
||||||
server->apply(&pack);
|
server->apply(&pack);
|
||||||
|
@ -123,6 +123,7 @@ void Sacrifice::apply(ServerCallback * server, const Mechanics * m, const Effect
|
|||||||
Heal::apply(calculateHealEffectValue(m, victim), server, m, healTarget);
|
Heal::apply(calculateHealEffectValue(m, victim), server, m, healTarget);
|
||||||
|
|
||||||
BattleUnitsChanged removeUnits;
|
BattleUnitsChanged removeUnits;
|
||||||
|
removeUnits.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
removeUnits.changedStacks.emplace_back(victim->unitId(), UnitChanges::EOperation::REMOVE);
|
removeUnits.changedStacks.emplace_back(victim->unitId(), UnitChanges::EOperation::REMOVE);
|
||||||
server->apply(&removeUnits);
|
server->apply(&removeUnits);
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "../ISpellMechanics.h"
|
#include "../ISpellMechanics.h"
|
||||||
#include "../../battle/CBattleInfoCallback.h"
|
#include "../../battle/CBattleInfoCallback.h"
|
||||||
|
#include "../../battle/BattleInfo.h"
|
||||||
#include "../../battle/Unit.h"
|
#include "../../battle/Unit.h"
|
||||||
#include "../../NetPacks.h"
|
#include "../../NetPacks.h"
|
||||||
#include "../../serializer/JsonSerializeFormat.h"
|
#include "../../serializer/JsonSerializeFormat.h"
|
||||||
@ -87,6 +88,7 @@ void Summon::apply(ServerCallback * server, const Mechanics * m, const EffectTar
|
|||||||
auto valueWithBonus = m->applySpecificSpellBonus(m->calculateRawEffectValue(0, m->getEffectPower()));//TODO: consider use base power too
|
auto valueWithBonus = m->applySpecificSpellBonus(m->calculateRawEffectValue(0, m->getEffectPower()));//TODO: consider use base power too
|
||||||
|
|
||||||
BattleUnitsChanged pack;
|
BattleUnitsChanged pack;
|
||||||
|
pack.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
for(const auto & dest : target)
|
for(const auto & dest : target)
|
||||||
{
|
{
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include "../../NetPacks.h"
|
#include "../../NetPacks.h"
|
||||||
#include "../../battle/IBattleState.h"
|
#include "../../battle/IBattleState.h"
|
||||||
|
#include "../../battle/CBattleInfoCallback.h"
|
||||||
#include "../../battle/Unit.h"
|
#include "../../battle/Unit.h"
|
||||||
#include "../../serializer/JsonSerializeFormat.h"
|
#include "../../serializer/JsonSerializeFormat.h"
|
||||||
|
|
||||||
@ -116,6 +117,8 @@ void Timed::apply(ServerCallback * server, const Mechanics * m, const EffectTarg
|
|||||||
|
|
||||||
SetStackEffect sse;
|
SetStackEffect sse;
|
||||||
BattleLogMessage blm;
|
BattleLogMessage blm;
|
||||||
|
blm.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
sse.battleID = m->battle()->getBattle()->getBattleID();
|
||||||
|
|
||||||
for(const auto & t : target)
|
for(const auto & t : target)
|
||||||
{
|
{
|
||||||
|
@ -160,6 +160,8 @@ bool BattleActionProcessor::doDefendAction(const CBattleInfoCallback & battle, c
|
|||||||
|
|
||||||
//defensive stance, TODO: filter out spell boosts from bonus (stone skin etc.)
|
//defensive stance, TODO: filter out spell boosts from bonus (stone skin etc.)
|
||||||
SetStackEffect sse;
|
SetStackEffect sse;
|
||||||
|
sse.battleID = battle.getBattle()->getBattleID();
|
||||||
|
|
||||||
Bonus defenseBonusToAdd(BonusDuration::STACK_GETS_TURN, BonusType::PRIMARY_SKILL, BonusSource::OTHER, 20, -1, static_cast<int32_t>(PrimarySkill::DEFENSE), BonusValueType::PERCENT_TO_ALL);
|
Bonus defenseBonusToAdd(BonusDuration::STACK_GETS_TURN, BonusType::PRIMARY_SKILL, BonusSource::OTHER, 20, -1, static_cast<int32_t>(PrimarySkill::DEFENSE), BonusValueType::PERCENT_TO_ALL);
|
||||||
Bonus bonus2(BonusDuration::STACK_GETS_TURN, BonusType::PRIMARY_SKILL, BonusSource::OTHER, stack->valOfBonuses(BonusType::DEFENSIVE_STANCE), -1, static_cast<int32_t>(PrimarySkill::DEFENSE), BonusValueType::ADDITIVE_VALUE);
|
Bonus bonus2(BonusDuration::STACK_GETS_TURN, BonusType::PRIMARY_SKILL, BonusSource::OTHER, stack->valOfBonuses(BonusType::DEFENSIVE_STANCE), -1, static_cast<int32_t>(PrimarySkill::DEFENSE), BonusValueType::ADDITIVE_VALUE);
|
||||||
Bonus alternativeWeakCreatureBonus(BonusDuration::STACK_GETS_TURN, BonusType::PRIMARY_SKILL, BonusSource::OTHER, 1, -1, static_cast<int32_t>(PrimarySkill::DEFENSE), BonusValueType::ADDITIVE_VALUE);
|
Bonus alternativeWeakCreatureBonus(BonusDuration::STACK_GETS_TURN, BonusType::PRIMARY_SKILL, BonusSource::OTHER, 1, -1, static_cast<int32_t>(PrimarySkill::DEFENSE), BonusValueType::ADDITIVE_VALUE);
|
||||||
@ -188,6 +190,7 @@ bool BattleActionProcessor::doDefendAction(const CBattleInfoCallback & battle, c
|
|||||||
gameHandler->sendAndApply(&sse);
|
gameHandler->sendAndApply(&sse);
|
||||||
|
|
||||||
BattleLogMessage message;
|
BattleLogMessage message;
|
||||||
|
message.battleID = battle.getBattle()->getBattleID();
|
||||||
|
|
||||||
MetaString text;
|
MetaString text;
|
||||||
stack->addText(text, EMetaText::GENERAL_TXT, 120);
|
stack->addText(text, EMetaText::GENERAL_TXT, 120);
|
||||||
@ -541,6 +544,7 @@ bool BattleActionProcessor::makeBattleActionImpl(const CBattleInfoCallback & bat
|
|||||||
if (!ba.isBattleEndAction())
|
if (!ba.isBattleEndAction())
|
||||||
{
|
{
|
||||||
StartAction startAction(ba);
|
StartAction startAction(ba);
|
||||||
|
startAction.battleID = battle.getBattle()->getBattleID();
|
||||||
gameHandler->sendAndApply(&startAction);
|
gameHandler->sendAndApply(&startAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -549,6 +553,7 @@ bool BattleActionProcessor::makeBattleActionImpl(const CBattleInfoCallback & bat
|
|||||||
if (!ba.isBattleEndAction())
|
if (!ba.isBattleEndAction())
|
||||||
{
|
{
|
||||||
EndAction endAction;
|
EndAction endAction;
|
||||||
|
endAction.battleID = battle.getBattle()->getBattleID();
|
||||||
gameHandler->sendAndApply(&endAction);
|
gameHandler->sendAndApply(&endAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -658,12 +663,14 @@ int BattleActionProcessor::moveStack(const CBattleInfoCallback & battle, int sta
|
|||||||
occupyGateDrawbridgeHex(dest))
|
occupyGateDrawbridgeHex(dest))
|
||||||
{
|
{
|
||||||
BattleUpdateGateState db;
|
BattleUpdateGateState db;
|
||||||
|
db.battleID = battle.getBattle()->getBattleID();
|
||||||
db.state = EGateState::OPENED;
|
db.state = EGateState::OPENED;
|
||||||
gameHandler->sendAndApply(&db);
|
gameHandler->sendAndApply(&db);
|
||||||
}
|
}
|
||||||
|
|
||||||
//inform clients about move
|
//inform clients about move
|
||||||
BattleStackMoved sm;
|
BattleStackMoved sm;
|
||||||
|
sm.battleID = battle.getBattle()->getBattleID();
|
||||||
sm.stack = curStack->unitId();
|
sm.stack = curStack->unitId();
|
||||||
std::vector<BattleHex> tiles;
|
std::vector<BattleHex> tiles;
|
||||||
tiles.push_back(path.first[0]);
|
tiles.push_back(path.first[0]);
|
||||||
@ -793,6 +800,7 @@ int BattleActionProcessor::moveStack(const CBattleInfoCallback & battle, int sta
|
|||||||
{
|
{
|
||||||
//commit movement
|
//commit movement
|
||||||
BattleStackMoved sm;
|
BattleStackMoved sm;
|
||||||
|
sm.battleID = battle.getBattle()->getBattleID();
|
||||||
sm.stack = curStack->unitId();
|
sm.stack = curStack->unitId();
|
||||||
sm.distance = path.second;
|
sm.distance = path.second;
|
||||||
sm.teleporting = false;
|
sm.teleporting = false;
|
||||||
@ -820,6 +828,7 @@ int BattleActionProcessor::moveStack(const CBattleInfoCallback & battle, int sta
|
|||||||
if (curStack->alive())
|
if (curStack->alive())
|
||||||
{
|
{
|
||||||
BattleUpdateGateState db;
|
BattleUpdateGateState db;
|
||||||
|
db.battleID = battle.getBattle()->getBattleID();
|
||||||
db.state = EGateState::OPENED;
|
db.state = EGateState::OPENED;
|
||||||
gameHandler->sendAndApply(&db);
|
gameHandler->sendAndApply(&db);
|
||||||
}
|
}
|
||||||
@ -857,6 +866,9 @@ void BattleActionProcessor::makeAttack(const CBattleInfoCallback & battle, const
|
|||||||
FireShieldInfo fireShield;
|
FireShieldInfo fireShield;
|
||||||
BattleAttack bat;
|
BattleAttack bat;
|
||||||
BattleLogMessage blm;
|
BattleLogMessage blm;
|
||||||
|
blm.battleID = battle.getBattle()->getBattleID();
|
||||||
|
bat.battleID = battle.getBattle()->getBattleID();
|
||||||
|
bat.attackerChanges.battleID = battle.getBattle()->getBattleID();
|
||||||
bat.stackAttacking = attacker->unitId();
|
bat.stackAttacking = attacker->unitId();
|
||||||
bat.tile = targetHex;
|
bat.tile = targetHex;
|
||||||
|
|
||||||
@ -966,6 +978,9 @@ void BattleActionProcessor::makeAttack(const CBattleInfoCallback & battle, const
|
|||||||
if (drainedLife > 0)
|
if (drainedLife > 0)
|
||||||
bat.flags |= BattleAttack::LIFE_DRAIN;
|
bat.flags |= BattleAttack::LIFE_DRAIN;
|
||||||
|
|
||||||
|
for (BattleStackAttacked & bsa : bat.bsa)
|
||||||
|
bsa.battleID = battle.getBattle()->getBattleID();
|
||||||
|
|
||||||
gameHandler->sendAndApply(&bat);
|
gameHandler->sendAndApply(&bat);
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -1032,6 +1047,7 @@ void BattleActionProcessor::makeAttack(const CBattleInfoCallback & battle, const
|
|||||||
{
|
{
|
||||||
BattleStackAttacked bsa;
|
BattleStackAttacked bsa;
|
||||||
|
|
||||||
|
bsa.battleID = battle.getBattle()->getBattleID();
|
||||||
bsa.flags |= BattleStackAttacked::FIRE_SHIELD;
|
bsa.flags |= BattleStackAttacked::FIRE_SHIELD;
|
||||||
bsa.stackAttacked = attacker->unitId(); //invert
|
bsa.stackAttacked = attacker->unitId(); //invert
|
||||||
bsa.attackerID = defender->unitId();
|
bsa.attackerID = defender->unitId();
|
||||||
@ -1039,6 +1055,7 @@ void BattleActionProcessor::makeAttack(const CBattleInfoCallback & battle, const
|
|||||||
attacker->prepareAttacked(bsa, gameHandler->getRandomGenerator());
|
attacker->prepareAttacked(bsa, gameHandler->getRandomGenerator());
|
||||||
|
|
||||||
StacksInjured pack;
|
StacksInjured pack;
|
||||||
|
pack.battleID = battle.getBattle()->getBattleID();
|
||||||
pack.stacks.push_back(bsa);
|
pack.stacks.push_back(bsa);
|
||||||
gameHandler->sendAndApply(&pack);
|
gameHandler->sendAndApply(&pack);
|
||||||
|
|
||||||
@ -1240,10 +1257,12 @@ void BattleActionProcessor::handleAfterAttackCasting(const CBattleInfoCallback &
|
|||||||
return; //wrong subtype
|
return; //wrong subtype
|
||||||
|
|
||||||
BattleUnitsChanged addUnits;
|
BattleUnitsChanged addUnits;
|
||||||
|
addUnits.battleID = battle.getBattle()->getBattleID();
|
||||||
addUnits.changedStacks.emplace_back(resurrectInfo.id, UnitChanges::EOperation::ADD);
|
addUnits.changedStacks.emplace_back(resurrectInfo.id, UnitChanges::EOperation::ADD);
|
||||||
resurrectInfo.save(addUnits.changedStacks.back().data);
|
resurrectInfo.save(addUnits.changedStacks.back().data);
|
||||||
|
|
||||||
BattleUnitsChanged removeUnits;
|
BattleUnitsChanged removeUnits;
|
||||||
|
removeUnits.battleID = battle.getBattle()->getBattleID();
|
||||||
removeUnits.changedStacks.emplace_back(defender->unitId(), UnitChanges::EOperation::REMOVE);
|
removeUnits.changedStacks.emplace_back(defender->unitId(), UnitChanges::EOperation::REMOVE);
|
||||||
gameHandler->sendAndApply(&removeUnits);
|
gameHandler->sendAndApply(&removeUnits);
|
||||||
gameHandler->sendAndApply(&addUnits);
|
gameHandler->sendAndApply(&addUnits);
|
||||||
@ -1280,10 +1299,11 @@ void BattleActionProcessor::handleAfterAttackCasting(const CBattleInfoCallback &
|
|||||||
defender->prepareAttacked(bsa, gameHandler->getRandomGenerator());
|
defender->prepareAttacked(bsa, gameHandler->getRandomGenerator());
|
||||||
|
|
||||||
StacksInjured si;
|
StacksInjured si;
|
||||||
|
si.battleID = battle.getBattle()->getBattleID();
|
||||||
si.stacks.push_back(bsa);
|
si.stacks.push_back(bsa);
|
||||||
|
|
||||||
gameHandler->sendAndApply(&si);
|
gameHandler->sendAndApply(&si);
|
||||||
sendGenericKilledLog(defender, bsa.killedAmount, false);
|
sendGenericKilledLog(battle, defender, bsa.killedAmount, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1354,11 +1374,12 @@ int64_t BattleActionProcessor::applyBattleEffects(const CBattleInfoCallback & ba
|
|||||||
return drainedLife;
|
return drainedLife;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleActionProcessor::sendGenericKilledLog(const CStack * defender, int32_t killed, bool multiple)
|
void BattleActionProcessor::sendGenericKilledLog(const CBattleInfoCallback & battle, const CStack * defender, int32_t killed, bool multiple)
|
||||||
{
|
{
|
||||||
if(killed > 0)
|
if(killed > 0)
|
||||||
{
|
{
|
||||||
BattleLogMessage blm;
|
BattleLogMessage blm;
|
||||||
|
blm.battleID = battle.getBattle()->getBattleID();
|
||||||
addGenericKilledLog(blm, defender, killed, multiple);
|
addGenericKilledLog(blm, defender, killed, multiple);
|
||||||
gameHandler->sendAndApply(&blm);
|
gameHandler->sendAndApply(&blm);
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ class BattleActionProcessor : boost::noncopyable
|
|||||||
// damage, drain life & fire shield; returns amount of drained life
|
// damage, drain life & fire shield; returns amount of drained life
|
||||||
int64_t applyBattleEffects(const CBattleInfoCallback & battle, BattleAttack & bat, std::shared_ptr<battle::CUnitState> attackerState, FireShieldInfo & fireShield, const CStack * def, int distance, bool secondary);
|
int64_t applyBattleEffects(const CBattleInfoCallback & battle, BattleAttack & bat, std::shared_ptr<battle::CUnitState> attackerState, FireShieldInfo & fireShield, const CStack * def, int distance, bool secondary);
|
||||||
|
|
||||||
void sendGenericKilledLog(const CStack * defender, int32_t killed, bool multiple);
|
void sendGenericKilledLog(const CBattleInfoCallback & battle, const CStack * defender, int32_t killed, bool multiple);
|
||||||
void addGenericKilledLog(BattleLogMessage & blm, const CStack * defender, int32_t killed, bool multiple);
|
void addGenericKilledLog(BattleLogMessage & blm, const CStack * defender, int32_t killed, bool multiple);
|
||||||
|
|
||||||
bool canStackAct(const CBattleInfoCallback & battle, const CStack * stack);
|
bool canStackAct(const CBattleInfoCallback & battle, const CStack * stack);
|
||||||
|
@ -171,6 +171,7 @@ void BattleFlowProcessor::trySummonGuardians(const CBattleInfoCallback & battle,
|
|||||||
info.summoned = true;
|
info.summoned = true;
|
||||||
|
|
||||||
BattleUnitsChanged pack;
|
BattleUnitsChanged pack;
|
||||||
|
pack.battleID = battle.getBattle()->getBattleID();
|
||||||
pack.changedStacks.emplace_back(info.id, UnitChanges::EOperation::ADD);
|
pack.changedStacks.emplace_back(info.id, UnitChanges::EOperation::ADD);
|
||||||
info.save(pack.changedStacks.back().data);
|
info.save(pack.changedStacks.back().data);
|
||||||
gameHandler->sendAndApply(&pack);
|
gameHandler->sendAndApply(&pack);
|
||||||
@ -227,6 +228,7 @@ void BattleFlowProcessor::onTacticsEnded(const CBattleInfoCallback & battle)
|
|||||||
void BattleFlowProcessor::startNextRound(const CBattleInfoCallback & battle, bool isFirstRound)
|
void BattleFlowProcessor::startNextRound(const CBattleInfoCallback & battle, bool isFirstRound)
|
||||||
{
|
{
|
||||||
BattleNextRound bnr;
|
BattleNextRound bnr;
|
||||||
|
bnr.battleID = battle.getBattle()->getBattleID();
|
||||||
logGlobal->debug("Next round starts");
|
logGlobal->debug("Next round starts");
|
||||||
gameHandler->sendAndApply(&bnr);
|
gameHandler->sendAndApply(&bnr);
|
||||||
|
|
||||||
@ -265,6 +267,7 @@ const CStack * BattleFlowProcessor::getNextStack(const CBattleInfoCallback & bat
|
|||||||
if(stack && stack->alive() && !stack->waiting)
|
if(stack && stack->alive() && !stack->waiting)
|
||||||
{
|
{
|
||||||
BattleTriggerEffect bte;
|
BattleTriggerEffect bte;
|
||||||
|
bte.battleID = battle.getBattle()->getBattleID();
|
||||||
bte.stackID = stack->unitId();
|
bte.stackID = stack->unitId();
|
||||||
bte.effect = vstd::to_underlying(BonusType::HP_REGENERATION);
|
bte.effect = vstd::to_underlying(BonusType::HP_REGENERATION);
|
||||||
|
|
||||||
@ -303,6 +306,7 @@ void BattleFlowProcessor::activateNextStack(const CBattleInfoCallback & battle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
BattleUnitsChanged removeGhosts;
|
BattleUnitsChanged removeGhosts;
|
||||||
|
removeGhosts.battleID = battle.getBattle()->getBattleID();
|
||||||
|
|
||||||
auto pendingGhosts = battle.battleGetStacksIf([](const CStack * stack){
|
auto pendingGhosts = battle.battleGetStacksIf([](const CStack * stack){
|
||||||
return stack->ghostPending;
|
return stack->ghostPending;
|
||||||
@ -487,6 +491,7 @@ bool BattleFlowProcessor::rollGoodMorale(const CBattleInfoCallback & battle, con
|
|||||||
if(diceSize.size() > 0 && gameHandler->getRandomGenerator().nextInt(1, diceSize[diceIndex]) == 1)
|
if(diceSize.size() > 0 && gameHandler->getRandomGenerator().nextInt(1, diceSize[diceIndex]) == 1)
|
||||||
{
|
{
|
||||||
BattleTriggerEffect bte;
|
BattleTriggerEffect bte;
|
||||||
|
bte.battleID = battle.getBattle()->getBattleID();
|
||||||
bte.stackID = next->unitId();
|
bte.stackID = next->unitId();
|
||||||
bte.effect = vstd::to_underlying(BonusType::MORALE);
|
bte.effect = vstd::to_underlying(BonusType::MORALE);
|
||||||
bte.val = 1;
|
bte.val = 1;
|
||||||
@ -558,6 +563,7 @@ void BattleFlowProcessor::makeStackDoNothing(const CBattleInfoCallback & battle,
|
|||||||
bool BattleFlowProcessor::makeAutomaticAction(const CBattleInfoCallback & battle, const CStack *stack, BattleAction &ba)
|
bool BattleFlowProcessor::makeAutomaticAction(const CBattleInfoCallback & battle, const CStack *stack, BattleAction &ba)
|
||||||
{
|
{
|
||||||
BattleSetActiveStack bsa;
|
BattleSetActiveStack bsa;
|
||||||
|
bsa.battleID = battle.getBattle()->getBattleID();
|
||||||
bsa.stack = stack->unitId();
|
bsa.stack = stack->unitId();
|
||||||
bsa.askPlayerInterface = false;
|
bsa.askPlayerInterface = false;
|
||||||
gameHandler->sendAndApply(&bsa);
|
gameHandler->sendAndApply(&bsa);
|
||||||
@ -601,6 +607,7 @@ void BattleFlowProcessor::stackEnchantedTrigger(const CBattleInfoCallback & batt
|
|||||||
void BattleFlowProcessor::removeObstacle(const CBattleInfoCallback & battle, const CObstacleInstance & obstacle)
|
void BattleFlowProcessor::removeObstacle(const CBattleInfoCallback & battle, const CObstacleInstance & obstacle)
|
||||||
{
|
{
|
||||||
BattleObstaclesChanged obsRem;
|
BattleObstaclesChanged obsRem;
|
||||||
|
obsRem.battleID = battle.getBattle()->getBattleID();
|
||||||
obsRem.changes.emplace_back(obstacle.uniqueID, ObstacleChanges::EOperation::REMOVE);
|
obsRem.changes.emplace_back(obstacle.uniqueID, ObstacleChanges::EOperation::REMOVE);
|
||||||
gameHandler->sendAndApply(&obsRem);
|
gameHandler->sendAndApply(&obsRem);
|
||||||
}
|
}
|
||||||
@ -608,6 +615,7 @@ void BattleFlowProcessor::removeObstacle(const CBattleInfoCallback & battle, con
|
|||||||
void BattleFlowProcessor::stackTurnTrigger(const CBattleInfoCallback & battle, const CStack *st)
|
void BattleFlowProcessor::stackTurnTrigger(const CBattleInfoCallback & battle, const CStack *st)
|
||||||
{
|
{
|
||||||
BattleTriggerEffect bte;
|
BattleTriggerEffect bte;
|
||||||
|
bte.battleID = battle.getBattle()->getBattleID();
|
||||||
bte.stackID = st->unitId();
|
bte.stackID = st->unitId();
|
||||||
bte.effect = -1;
|
bte.effect = -1;
|
||||||
bte.val = 0;
|
bte.val = 0;
|
||||||
@ -640,6 +648,7 @@ void BattleFlowProcessor::stackTurnTrigger(const CBattleInfoCallback & battle, c
|
|||||||
if (unbind)
|
if (unbind)
|
||||||
{
|
{
|
||||||
BattleSetStackProperty ssp;
|
BattleSetStackProperty ssp;
|
||||||
|
ssp.battleID = battle.getBattle()->getBattleID();
|
||||||
ssp.which = BattleSetStackProperty::UNBIND;
|
ssp.which = BattleSetStackProperty::UNBIND;
|
||||||
ssp.stackID = st->unitId();
|
ssp.stackID = st->unitId();
|
||||||
gameHandler->sendAndApply(&ssp);
|
gameHandler->sendAndApply(&ssp);
|
||||||
@ -721,6 +730,7 @@ void BattleFlowProcessor::stackTurnTrigger(const CBattleInfoCallback & battle, c
|
|||||||
|
|
||||||
int cooldown = bonus->additionalInfo[0];
|
int cooldown = bonus->additionalInfo[0];
|
||||||
BattleSetStackProperty ssp;
|
BattleSetStackProperty ssp;
|
||||||
|
ssp.battleID = battle.getBattle()->getBattleID();
|
||||||
ssp.which = BattleSetStackProperty::ENCHANTER_COUNTER;
|
ssp.which = BattleSetStackProperty::ENCHANTER_COUNTER;
|
||||||
ssp.absolute = false;
|
ssp.absolute = false;
|
||||||
ssp.val = cooldown;
|
ssp.val = cooldown;
|
||||||
@ -737,6 +747,7 @@ void BattleFlowProcessor::setActiveStack(const CBattleInfoCallback & battle, con
|
|||||||
assert(stack);
|
assert(stack);
|
||||||
|
|
||||||
BattleSetActiveStack sas;
|
BattleSetActiveStack sas;
|
||||||
|
sas.battleID = battle.getBattle()->getBattleID();
|
||||||
sas.stack = stack->unitId();
|
sas.stack = stack->unitId();
|
||||||
gameHandler->sendAndApply(&sas);
|
gameHandler->sendAndApply(&sas);
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,7 @@ void BattleProcessor::startBattlePrimary(const CArmedInstance *army1, const CArm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lastBattleQuery->bi = battle;
|
lastBattleQuery->battleID = battle->getBattleID();
|
||||||
lastBattleQuery->result = std::nullopt;
|
lastBattleQuery->result = std::nullopt;
|
||||||
lastBattleQuery->belligerents[0] = battle->sides[0].armyObject;
|
lastBattleQuery->belligerents[0] = battle->sides[0].armyObject;
|
||||||
lastBattleQuery->belligerents[1] = battle->sides[1].armyObject;
|
lastBattleQuery->belligerents[1] = battle->sides[1].armyObject;
|
||||||
@ -261,13 +261,7 @@ void BattleProcessor::endBattleConfirm(const BattleID & battleID)
|
|||||||
|
|
||||||
void BattleProcessor::battleAfterLevelUp(const BattleID & battleID, const BattleResult &result)
|
void BattleProcessor::battleAfterLevelUp(const BattleID & battleID, const BattleResult &result)
|
||||||
{
|
{
|
||||||
auto battle = gameHandler->gameState()->getBattle(battleID);
|
resultProcessor->battleAfterLevelUp(battleID, result);
|
||||||
assert(battle);
|
|
||||||
|
|
||||||
if (!battle)
|
|
||||||
return;
|
|
||||||
|
|
||||||
resultProcessor->battleAfterLevelUp(*battle, result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleProcessor::setGameHandler(CGameHandler * newGameHandler)
|
void BattleProcessor::setGameHandler(CGameHandler * newGameHandler)
|
||||||
|
@ -180,26 +180,21 @@ void CasualtiesAfterBattle::updateArmy(CGameHandler *gh)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FinishingBattleHelper::FinishingBattleHelper(std::shared_ptr<const CBattleQuery> Query, int remainingBattleQueriesCount)
|
FinishingBattleHelper::FinishingBattleHelper(const CBattleInfoCallback & info, const BattleResult & result, int remainingBattleQueriesCount)
|
||||||
{
|
{
|
||||||
assert(Query->result);
|
|
||||||
assert(Query->bi);
|
|
||||||
auto &result = *Query->result;
|
|
||||||
auto &info = *Query->bi;
|
|
||||||
|
|
||||||
if (result.winner == BattleSide::ATTACKER)
|
if (result.winner == BattleSide::ATTACKER)
|
||||||
{
|
{
|
||||||
winnerHero = info.getSideHero(BattleSide::ATTACKER);
|
winnerHero = info.getBattle()->getSideHero(BattleSide::ATTACKER);
|
||||||
loserHero = info.getSideHero(BattleSide::DEFENDER);
|
loserHero = info.getBattle()->getSideHero(BattleSide::DEFENDER);
|
||||||
victor = info.getSidePlayer(BattleSide::ATTACKER);
|
victor = info.getBattle()->getSidePlayer(BattleSide::ATTACKER);
|
||||||
loser = info.getSidePlayer(BattleSide::DEFENDER);
|
loser = info.getBattle()->getSidePlayer(BattleSide::DEFENDER);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
winnerHero = info.getSideHero(BattleSide::DEFENDER);
|
winnerHero = info.getBattle()->getSideHero(BattleSide::DEFENDER);
|
||||||
loserHero = info.getSideHero(BattleSide::ATTACKER);
|
loserHero = info.getBattle()->getSideHero(BattleSide::ATTACKER);
|
||||||
victor = info.getSidePlayer(BattleSide::DEFENDER);
|
victor = info.getBattle()->getSidePlayer(BattleSide::DEFENDER);
|
||||||
loser = info.getSidePlayer(BattleSide::ATTACKER);
|
loser = info.getBattle()->getSidePlayer(BattleSide::ATTACKER);
|
||||||
}
|
}
|
||||||
|
|
||||||
winnerSide = result.winner;
|
winnerSide = result.winner;
|
||||||
@ -207,12 +202,12 @@ FinishingBattleHelper::FinishingBattleHelper(std::shared_ptr<const CBattleQuery>
|
|||||||
this->remainingBattleQueriesCount = remainingBattleQueriesCount;
|
this->remainingBattleQueriesCount = remainingBattleQueriesCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
FinishingBattleHelper::FinishingBattleHelper()
|
//FinishingBattleHelper::FinishingBattleHelper()
|
||||||
{
|
//{
|
||||||
winnerHero = loserHero = nullptr;
|
// winnerHero = loserHero = nullptr;
|
||||||
winnerSide = 0;
|
// winnerSide = 0;
|
||||||
remainingBattleQueriesCount = 0;
|
// remainingBattleQueriesCount = 0;
|
||||||
}
|
//}
|
||||||
|
|
||||||
void BattleResultProcessor::endBattle(const CBattleInfoCallback & battle)
|
void BattleResultProcessor::endBattle(const CBattleInfoCallback & battle)
|
||||||
{
|
{
|
||||||
@ -267,7 +262,7 @@ void BattleResultProcessor::endBattle(const CBattleInfoCallback & battle)
|
|||||||
const int queriedPlayers = battleQuery ? (int)boost::count(gameHandler->queries->allQueries(), battleQuery) : 0;
|
const int queriedPlayers = battleQuery ? (int)boost::count(gameHandler->queries->allQueries(), battleQuery) : 0;
|
||||||
|
|
||||||
assert(finishingBattles.count(battle.getBattle()->getBattleID()) == 0);
|
assert(finishingBattles.count(battle.getBattle()->getBattleID()) == 0);
|
||||||
finishingBattles[battle.getBattle()->getBattleID()] = std::make_unique<FinishingBattleHelper>(battleQuery, queriedPlayers);
|
finishingBattles[battle.getBattle()->getBattleID()] = std::make_unique<FinishingBattleHelper>(battle, *battleResult, queriedPlayers);
|
||||||
|
|
||||||
// in battles against neutrals, 1st player can ask to replay battle manually
|
// in battles against neutrals, 1st player can ask to replay battle manually
|
||||||
if (!battle.sideToPlayer(1).isValidPlayer())
|
if (!battle.sideToPlayer(1).isValidPlayer())
|
||||||
@ -490,6 +485,7 @@ void BattleResultProcessor::endBattleConfirm(const CBattleInfoCallback & battle)
|
|||||||
gameHandler->changePrimSkill(finishingBattle->winnerHero, PrimarySkill::EXPERIENCE, battleResult->exp[finishingBattle->winnerSide]);
|
gameHandler->changePrimSkill(finishingBattle->winnerHero, PrimarySkill::EXPERIENCE, battleResult->exp[finishingBattle->winnerSide]);
|
||||||
|
|
||||||
BattleResultAccepted raccepted;
|
BattleResultAccepted raccepted;
|
||||||
|
raccepted.battleID = battle.getBattle()->getBattleID();
|
||||||
raccepted.heroResult[0].army = const_cast<CArmedInstance*>(battle.battleGetArmyObject(0));
|
raccepted.heroResult[0].army = const_cast<CArmedInstance*>(battle.battleGetArmyObject(0));
|
||||||
raccepted.heroResult[1].army = const_cast<CArmedInstance*>(battle.battleGetArmyObject(1));
|
raccepted.heroResult[1].army = const_cast<CArmedInstance*>(battle.battleGetArmyObject(1));
|
||||||
raccepted.heroResult[0].hero = const_cast<CGHeroInstance*>(battle.battleGetFightingHero(0));
|
raccepted.heroResult[0].hero = const_cast<CGHeroInstance*>(battle.battleGetFightingHero(0));
|
||||||
@ -503,15 +499,15 @@ void BattleResultProcessor::endBattleConfirm(const CBattleInfoCallback & battle)
|
|||||||
//--> continuation (battleAfterLevelUp) occurs after level-up gameHandler->queries are handled or on removing query
|
//--> continuation (battleAfterLevelUp) occurs after level-up gameHandler->queries are handled or on removing query
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleResultProcessor::battleAfterLevelUp(const CBattleInfoCallback & battle, const BattleResult & result)
|
void BattleResultProcessor::battleAfterLevelUp(const BattleID & battleID, const BattleResult & result)
|
||||||
{
|
{
|
||||||
LOG_TRACE(logGlobal);
|
LOG_TRACE(logGlobal);
|
||||||
|
|
||||||
assert(finishingBattles.count(battle.getBattle()->getBattleID()) != 0);
|
assert(finishingBattles.count(battleID) != 0);
|
||||||
if(finishingBattles.count(battle.getBattle()->getBattleID()) == 0)
|
if(finishingBattles.count(battleID) == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto & finishingBattle = finishingBattles[battle.getBattle()->getBattleID()];
|
auto & finishingBattle = finishingBattles[battleID];
|
||||||
|
|
||||||
finishingBattle->remainingBattleQueriesCount--;
|
finishingBattle->remainingBattleQueriesCount--;
|
||||||
logGlobal->trace("Decremented gameHandler->queries count to %d", finishingBattle->remainingBattleQueriesCount);
|
logGlobal->trace("Decremented gameHandler->queries count to %d", finishingBattle->remainingBattleQueriesCount);
|
||||||
@ -537,6 +533,7 @@ void BattleResultProcessor::battleAfterLevelUp(const CBattleInfoCallback & battl
|
|||||||
}
|
}
|
||||||
|
|
||||||
BattleResultsApplied resultsApplied;
|
BattleResultsApplied resultsApplied;
|
||||||
|
resultsApplied.battleID = battleID;
|
||||||
resultsApplied.player1 = finishingBattle->victor;
|
resultsApplied.player1 = finishingBattle->victor;
|
||||||
resultsApplied.player2 = finishingBattle->loser;
|
resultsApplied.player2 = finishingBattle->loser;
|
||||||
gameHandler->sendAndApply(&resultsApplied);
|
gameHandler->sendAndApply(&resultsApplied);
|
||||||
@ -561,8 +558,8 @@ void BattleResultProcessor::battleAfterLevelUp(const CBattleInfoCallback & battl
|
|||||||
gameHandler->heroPool->onHeroEscaped(finishingBattle->victor, finishingBattle->winnerHero);
|
gameHandler->heroPool->onHeroEscaped(finishingBattle->victor, finishingBattle->winnerHero);
|
||||||
}
|
}
|
||||||
|
|
||||||
finishingBattles.erase(battle.getBattle()->getBattleID());
|
finishingBattles.erase(battleID);
|
||||||
battleResults.erase(battle.getBattle()->getBattleID());
|
battleResults.erase(battleID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BattleResultProcessor::setBattleResult(const CBattleInfoCallback & battle, EBattleResult resultType, int victoriusSide)
|
void BattleResultProcessor::setBattleResult(const CBattleInfoCallback & battle, EBattleResult resultType, int victoriusSide)
|
||||||
@ -572,6 +569,7 @@ void BattleResultProcessor::setBattleResult(const CBattleInfoCallback & battle,
|
|||||||
battleResults[battle.getBattle()->getBattleID()] = std::make_unique<BattleResult>();
|
battleResults[battle.getBattle()->getBattleID()] = std::make_unique<BattleResult>();
|
||||||
|
|
||||||
auto & battleResult = battleResults[battle.getBattle()->getBattleID()];
|
auto & battleResult = battleResults[battle.getBattle()->getBattleID()];
|
||||||
|
battleResult->battleID = battle.getBattle()->getBattleID();
|
||||||
battleResult->result = resultType;
|
battleResult->result = resultType;
|
||||||
battleResult->winner = victoriusSide; //surrendering side loses
|
battleResult->winner = victoriusSide; //surrendering side loses
|
||||||
|
|
||||||
|
@ -37,8 +37,8 @@ struct CasualtiesAfterBattle
|
|||||||
|
|
||||||
struct FinishingBattleHelper
|
struct FinishingBattleHelper
|
||||||
{
|
{
|
||||||
FinishingBattleHelper();
|
// FinishingBattleHelper();
|
||||||
FinishingBattleHelper(std::shared_ptr<const CBattleQuery> Query, int RemainingBattleQueriesCount);
|
FinishingBattleHelper(const CBattleInfoCallback & battle, const BattleResult & result, int RemainingBattleQueriesCount);
|
||||||
|
|
||||||
inline bool isDraw() const {return winnerSide == 2;}
|
inline bool isDraw() const {return winnerSide == 2;}
|
||||||
|
|
||||||
@ -76,5 +76,5 @@ public:
|
|||||||
void setBattleResult(const CBattleInfoCallback & battle, EBattleResult resultType, int victoriusSide);
|
void setBattleResult(const CBattleInfoCallback & battle, EBattleResult resultType, int victoriusSide);
|
||||||
void endBattle(const CBattleInfoCallback & battle); //ends battle
|
void endBattle(const CBattleInfoCallback & battle); //ends battle
|
||||||
void endBattleConfirm(const CBattleInfoCallback & battle);
|
void endBattleConfirm(const CBattleInfoCallback & battle);
|
||||||
void battleAfterLevelUp(const CBattleInfoCallback & battle, const BattleResult & result);
|
void battleAfterLevelUp(const BattleID & battleID, const BattleResult & result);
|
||||||
};
|
};
|
||||||
|
@ -24,7 +24,7 @@ void CBattleQuery::notifyObjectAboutRemoval(const CObjectVisitQuery & objectVisi
|
|||||||
|
|
||||||
CBattleQuery::CBattleQuery(CGameHandler * owner, const IBattleInfo * bi):
|
CBattleQuery::CBattleQuery(CGameHandler * owner, const IBattleInfo * bi):
|
||||||
CGhQuery(owner),
|
CGhQuery(owner),
|
||||||
bi(bi)
|
battleID(bi->getBattleID())
|
||||||
{
|
{
|
||||||
belligerents[0] = bi->getSideArmy(0);
|
belligerents[0] = bi->getSideArmy(0);
|
||||||
belligerents[1] = bi->getSideArmy(1);
|
belligerents[1] = bi->getSideArmy(1);
|
||||||
@ -34,7 +34,7 @@ CBattleQuery::CBattleQuery(CGameHandler * owner, const IBattleInfo * bi):
|
|||||||
}
|
}
|
||||||
|
|
||||||
CBattleQuery::CBattleQuery(CGameHandler * owner):
|
CBattleQuery::CBattleQuery(CGameHandler * owner):
|
||||||
CGhQuery(owner), bi(nullptr)
|
CGhQuery(owner)
|
||||||
{
|
{
|
||||||
belligerents[0] = belligerents[1] = nullptr;
|
belligerents[0] = belligerents[1] = nullptr;
|
||||||
}
|
}
|
||||||
@ -48,7 +48,7 @@ bool CBattleQuery::blocksPack(const CPack * pack) const
|
|||||||
void CBattleQuery::onRemoval(PlayerColor color)
|
void CBattleQuery::onRemoval(PlayerColor color)
|
||||||
{
|
{
|
||||||
if(result)
|
if(result)
|
||||||
gh->battles->battleAfterLevelUp(bi->getBattleID(), *result);
|
gh->battles->battleAfterLevelUp(battleID, *result);
|
||||||
}
|
}
|
||||||
|
|
||||||
CBattleDialogQuery::CBattleDialogQuery(CGameHandler * owner, const IBattleInfo * bi):
|
CBattleDialogQuery::CBattleDialogQuery(CGameHandler * owner, const IBattleInfo * bi):
|
||||||
|
@ -23,7 +23,7 @@ public:
|
|||||||
std::array<const CArmedInstance *,2> belligerents;
|
std::array<const CArmedInstance *,2> belligerents;
|
||||||
std::array<int, 2> initialHeroMana;
|
std::array<int, 2> initialHeroMana;
|
||||||
|
|
||||||
const IBattleInfo *bi;
|
BattleID battleID;
|
||||||
std::optional<BattleResult> result;
|
std::optional<BattleResult> result;
|
||||||
|
|
||||||
CBattleQuery(CGameHandler * owner);
|
CBattleQuery(CGameHandler * owner);
|
||||||
|
Loading…
Reference in New Issue
Block a user