1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-25 21:38:59 +02:00

quick combat vs ai

This commit is contained in:
Laserlicht 2024-01-25 23:44:41 +01:00 committed by GitHub
parent 891d25a634
commit 7f58333ef9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 34 additions and 26 deletions

View File

@ -1131,15 +1131,6 @@ void AIGateway::battleEnd(const BattleID & battleID, const BattleResult * br, Qu
logAi->debug("Player %d (%s): I %s the %s!", playerID, playerID.toString(), (won ? "won" : "lost"), battlename);
battlename.clear();
if (queryID != QueryID::NONE)
{
status.addQuery(queryID, "Combat result dialog");
const int confirmAction = 0;
requestActionASAP([=]()
{
answerQuery(queryID, confirmAction);
});
}
CAdventureAI::battleEnd(battleID, br, queryID);
}

View File

@ -1608,15 +1608,6 @@ void VCAI::battleEnd(const BattleID & battleID, const BattleResult * br, QueryID
logAi->debug("Player %d (%s): I %s the %s!", playerID, playerID.toString(), (won ? "won" : "lost"), battlename);
battlename.clear();
if (queryID != QueryID::NONE)
{
status.addQuery(queryID, "Combat result dialog");
const int confirmAction = 0;
requestActionASAP([=]()
{
answerQuery(queryID, confirmAction);
});
}
CAdventureAI::battleEnd(battleID, br, queryID);
}

View File

@ -585,14 +585,22 @@ void CClient::battleStarted(const BattleInfo * info)
def = std::dynamic_pointer_cast<CPlayerInterface>(playerint[rightSide.color]);
//Remove player interfaces for auto battle (quickCombat option)
if(att && att->isAutoFightOn)
if((att && att->isAutoFightOn) || (def && def->isAutoFightOn))
{
if (att->cb->getBattle(info->battleID)->battleGetTacticDist())
auto endTacticPhaseIfEligible = [info](const CPlayerInterface * interface)
{
auto side = att->cb->getBattle(info->battleID)->playerToSide(att->playerID);
auto action = BattleAction::makeEndOFTacticPhase(*side);
att->cb->battleMakeTacticAction(info->battleID, action);
}
if (interface->cb->getBattle(info->battleID)->battleGetTacticDist())
{
auto side = interface->cb->getBattle(info->battleID)->playerToSide(interface->playerID);
auto action = BattleAction::makeEndOFTacticPhase(*side);
interface->cb->battleMakeTacticAction(info->battleID, action);
}
};
if(att && att->isAutoFightOn)
endTacticPhaseIfEligible(att.get());
else // def && def->isAutoFightOn
endTacticPhaseIfEligible(def.get());
att.reset();
def.reset();

View File

@ -18,6 +18,7 @@
#include "../queries/QueriesProcessor.h"
#include "../queries/BattleQueries.h"
#include "../../lib/CPlayerState.h"
#include "../../lib/TerrainHandler.h"
#include "../../lib/battle/CBattleInfoCallback.h"
#include "../../lib/battle/CObstacleInstance.h"
@ -183,7 +184,11 @@ BattleID BattleProcessor::setupBattle(int3 tile, const CArmedInstance *armies[2]
engageIntoBattle(bs.info->sides[1].color);
auto lastBattleQuery = std::dynamic_pointer_cast<CBattleQuery>(gameHandler->queries->topQuery(bs.info->sides[0].color));
bs.info->replayAllowed = lastBattleQuery == nullptr && !bs.info->sides[1].color.isValidPlayer();
bool isDefenderHuman = bs.info->sides[1].color.isValidPlayer() && gameHandler->getPlayerState(bs.info->sides[1].color)->isHuman();
bool isAttackerHuman = gameHandler->getPlayerState(bs.info->sides[0].color)->isHuman();
bool onlyOnePlayerHuman = isDefenderHuman != isAttackerHuman;
bs.info->replayAllowed = lastBattleQuery == nullptr && onlyOnePlayerHuman;
gameHandler->sendAndApply(&bs);

View File

@ -17,6 +17,7 @@
#include "../../lib/ArtifactUtils.h"
#include "../../lib/CStack.h"
#include "../../lib/CPlayerState.h"
#include "../../lib/GameSettings.h"
#include "../../lib/battle/CBattleInfoCallback.h"
#include "../../lib/battle/IBattleState.h"
@ -272,7 +273,13 @@ void BattleResultProcessor::endBattle(const CBattleInfoCallback & battle)
finishingBattles[battle.getBattle()->getBattleID()] = std::make_unique<FinishingBattleHelper>(battle, *battleResult, queriedPlayers);
// in battles against neutrals, 1st player can ask to replay battle manually
if (!battle.sideToPlayer(1).isValidPlayer())
const auto * attackerPlayer = gameHandler->getPlayerState(battle.getBattle()->getSidePlayer(BattleSide::ATTACKER));
const auto * defenderPlayer = gameHandler->getPlayerState(battle.getBattle()->getSidePlayer(BattleSide::DEFENDER));
bool isAttackerHuman = attackerPlayer && attackerPlayer->isHuman();
bool isDefenderHuman = defenderPlayer && defenderPlayer->isHuman();
bool onlyOnePlayerHuman = isAttackerHuman != isDefenderHuman;
// in battles against neutrals attacker can ask to replay battle manually, additionally in battles against AI player human side can also ask for replay
if(onlyOnePlayerHuman)
{
auto battleDialogQuery = std::make_shared<CBattleDialogQuery>(gameHandler, battle.getBattle());
battleResult->queryID = battleDialogQuery->queryID;

View File

@ -16,6 +16,8 @@
#include "../battles/BattleProcessor.h"
#include "../../lib/battle/IBattleState.h"
#include "../../lib/battle/SideInBattle.h"
#include "../../lib/CPlayerState.h"
#include "../../lib/mapObjects/CGObjectInstance.h"
#include "../../lib/networkPacks/PacksForServer.h"
#include "../../lib/serializer/Cast.h"
@ -83,6 +85,9 @@ CBattleDialogQuery::CBattleDialogQuery(CGameHandler * owner, const IBattleInfo *
void CBattleDialogQuery::onRemoval(PlayerColor color)
{
if (!gh->getPlayerState(color)->isHuman())
return;
assert(answer);
if(*answer == 1)
{

View File

@ -14,6 +14,7 @@
VCMI_LIB_NAMESPACE_BEGIN
class IBattleInfo;
struct SideInBattle;
VCMI_LIB_NAMESPACE_END
class CBattleQuery : public CQuery