1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-27 22:49:25 +02:00

Minor rework & cleanup of combat replays

This commit is contained in:
Ivan Savenko
2023-07-27 18:40:47 +03:00
parent b8110218c0
commit aed8c411fc
20 changed files with 90 additions and 67 deletions

View File

@@ -607,9 +607,15 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance * heroAttacker, con
const int queriedPlayers = battleQuery ? (int)boost::count(queries.allQueries(), battleQuery) : 0;
finishingBattle = std::make_unique<FinishingBattleHelper>(battleQuery, queriedPlayers);
auto battleDialogQuery = std::make_shared<CBattleDialogQuery>(this, gs->curB);
battleResult.data->queryID = battleDialogQuery->queryID;
queries.addQuery(battleDialogQuery);
// in battles against neutrals, 1st player can ask to replay battle manually
if (!gs->curB->sides[1].color.isValidPlayer())
{
auto battleDialogQuery = std::make_shared<CBattleDialogQuery>(this, gs->curB);
battleResult.data->queryID = battleDialogQuery->queryID;
queries.addQuery(battleDialogQuery);
}
else
battleResult.data->queryID = -1;
//set same battle result for all queries
for(auto q : queries.allQueries())
@@ -620,6 +626,9 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance * heroAttacker, con
}
sendAndApply(battleResult.data); //after this point casualties objects are destroyed
if (battleResult.data->queryID == -1)
endBattleConfirm(gs->curB);
}
void CGameHandler::endBattleConfirm(const BattleInfo * battleInfo)
@@ -2118,6 +2127,10 @@ void CGameHandler::setupBattle(int3 tile, const CArmedInstance *armies[2], const
//send info about battles
BattleStart bs;
bs.info = BattleInfo::setupBattle(tile, terrain, terType, armies, heroes, creatureBank, town);
auto lastBattleQuery = std::dynamic_pointer_cast<CBattleQuery>(queries.topQuery(bs.info->sides[0].color));
bs.info->replayAllowed = lastBattleQuery == nullptr && !bs.info->sides[1].color.isValidPlayer();
sendAndApply(&bs);
}
@@ -2587,39 +2600,39 @@ void CGameHandler::startBattlePrimary(const CArmedInstance *army1, const CArmedI
heroes[0] = hero1;
heroes[1] = hero2;
setupBattle(tile, armies, heroes, creatureBank, town); //initializes stacks, places creatures on battlefield, blocks and informs player interfaces
auto lastBattleQuery = std::dynamic_pointer_cast<CBattleQuery>(queries.topQuery(gs->curB->sides[0].color));
//existing battle query for retying auto-combat
auto battleQuery = std::dynamic_pointer_cast<CBattleQuery>(queries.topQuery(gs->curB->sides[0].color));
if(battleQuery)
if(lastBattleQuery)
{
for(int i : {0, 1})
{
if(heroes[i])
{
SetMana restoreInitialMana;
restoreInitialMana.val = battleQuery->initialHeroMana[i];
restoreInitialMana.val = lastBattleQuery->initialHeroMana[i];
restoreInitialMana.hid = heroes[i]->id;
sendAndApply(&restoreInitialMana);
}
}
battleQuery->bi = gs->curB;
battleQuery->result = std::nullopt;
battleQuery->belligerents[0] = gs->curB->sides[0].armyObject;
battleQuery->belligerents[1] = gs->curB->sides[1].armyObject;
lastBattleQuery->bi = gs->curB;
lastBattleQuery->result = std::nullopt;
lastBattleQuery->belligerents[0] = gs->curB->sides[0].armyObject;
lastBattleQuery->belligerents[1] = gs->curB->sides[1].armyObject;
}
battleQuery = std::make_shared<CBattleQuery>(this, gs->curB);
auto nextBattleQuery = std::make_shared<CBattleQuery>(this, gs->curB);
for(int i : {0, 1})
{
if(heroes[i])
{
battleQuery->initialHeroMana[i] = heroes[i]->mana;
nextBattleQuery->initialHeroMana[i] = heroes[i]->mana;
}
}
queries.addQuery(battleQuery);
queries.addQuery(nextBattleQuery);
this->battleThread = std::make_unique<boost::thread>(boost::thread(&CGameHandler::runBattle, this));
}