|
@@ -1176,7 +1176,7 @@ void GameStatePackVisitor::visitBattleStart(BattleStart & pack)
|
|
pack.info->battleID = gs.nextBattleID;
|
|
pack.info->battleID = gs.nextBattleID;
|
|
pack.info->localInit();
|
|
pack.info->localInit();
|
|
|
|
|
|
- if (pack.info->getDefendedTown() && pack.info->getSideHero(BattleSide::DEFENDER))
|
|
|
|
|
|
+ if (pack.info->getDefendedTown() && pack.info->getSide(BattleSide::DEFENDER).heroID.hasValue())
|
|
{
|
|
{
|
|
CGTownInstance * town = gs.getTown(pack.info->townID);
|
|
CGTownInstance * town = gs.getTown(pack.info->townID);
|
|
CGHeroInstance * hero = gs.getHero(pack.info->getSideHero(BattleSide::DEFENDER)->id);
|
|
CGHeroInstance * hero = gs.getHero(pack.info->getSideHero(BattleSide::DEFENDER)->id);
|
|
@@ -1188,6 +1188,15 @@ void GameStatePackVisitor::visitBattleStart(BattleStart & pack)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ for(auto i : {BattleSide::ATTACKER, BattleSide::DEFENDER})
|
|
|
|
+ {
|
|
|
|
+ if (pack.info->getSide(i).heroID.hasValue())
|
|
|
|
+ {
|
|
|
|
+ CGHeroInstance * hero = gs.getHero(pack.info->getSideHero(i)->id);
|
|
|
|
+ hero->mana = pack.info->getSide(i).initialMana + pack.info->getSide(i).additionalMana;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
gs.currentBattles.push_back(std::move(pack.info));
|
|
gs.currentBattles.push_back(std::move(pack.info));
|
|
gs.nextBattleID = BattleID(gs.nextBattleID.getNum() + 1);
|
|
gs.nextBattleID = BattleID(gs.nextBattleID.getNum() + 1);
|
|
}
|
|
}
|
|
@@ -1383,6 +1392,17 @@ void GameStatePackVisitor::visitBattleCancelled(BattleCancelled & pack)
|
|
return battle->battleID == pack.battleID;
|
|
return battle->battleID == pack.battleID;
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+ const auto & currentBattle = **battleIter;
|
|
|
|
+
|
|
|
|
+ for(auto i : {BattleSide::ATTACKER, BattleSide::DEFENDER})
|
|
|
|
+ {
|
|
|
|
+ if (currentBattle.getSide(i).heroID.hasValue())
|
|
|
|
+ {
|
|
|
|
+ CGHeroInstance * hero = gs.getHero(currentBattle.getSideHero(i)->id);
|
|
|
|
+ hero->mana = currentBattle.getSide(i).initialMana;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
assert(battleIter != gs.currentBattles.end());
|
|
assert(battleIter != gs.currentBattles.end());
|
|
gs.currentBattles.erase(battleIter);
|
|
gs.currentBattles.erase(battleIter);
|
|
}
|
|
}
|
|
@@ -1401,14 +1421,23 @@ void GameStatePackVisitor::visitBattleResultsApplied(BattleResultsApplied & pack
|
|
for(auto & movingPack : pack.movingArtifacts)
|
|
for(auto & movingPack : pack.movingArtifacts)
|
|
movingPack.visit(*this);
|
|
movingPack.visit(*this);
|
|
|
|
|
|
- const auto currentBattle = std::find_if(gs.currentBattles.begin(), gs.currentBattles.end(),
|
|
|
|
- [&](const auto & battle)
|
|
|
|
- {
|
|
|
|
- return battle->battleID == pack.battleID;
|
|
|
|
- });
|
|
|
|
|
|
+ auto battleIter = boost::range::find_if(gs.currentBattles, [&](const auto & battle)
|
|
|
|
+ {
|
|
|
|
+ return battle->battleID == pack.battleID;
|
|
|
|
+ });
|
|
|
|
+ const auto & currentBattle = **battleIter;
|
|
|
|
+
|
|
|
|
+ for(auto i : {BattleSide::ATTACKER, BattleSide::DEFENDER})
|
|
|
|
+ {
|
|
|
|
+ if (currentBattle.getSide(i).heroID.hasValue())
|
|
|
|
+ {
|
|
|
|
+ CGHeroInstance * hero = gs.getHero(currentBattle.getSideHero(i)->id);
|
|
|
|
+ hero->mana = std::min(hero->mana, currentBattle.getSide(i).initialMana);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- assert(currentBattle != gs.currentBattles.end());
|
|
|
|
- gs.currentBattles.erase(currentBattle);
|
|
|
|
|
|
+ assert(battleIter != gs.currentBattles.end());
|
|
|
|
+ gs.currentBattles.erase(battleIter);
|
|
}
|
|
}
|
|
|
|
|
|
void GameStatePackVisitor::visitBattleObstaclesChanged(BattleObstaclesChanged & pack)
|
|
void GameStatePackVisitor::visitBattleObstaclesChanged(BattleObstaclesChanged & pack)
|