1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-15 11:46:56 +02:00

Merge pull request #2692 from Nordsoft91/accept-turn

Accept turn query
This commit is contained in:
Nordsoft91 2023-08-28 19:44:46 +04:00 committed by GitHub
commit 2022d55d40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 72 additions and 17 deletions

View File

@ -30,8 +30,9 @@ void CEmptyAI::initGameInterface(std::shared_ptr<Environment> ENV, std::shared_p
playerID = *cb->getMyColor(); playerID = *cb->getMyColor();
} }
void CEmptyAI::yourTurn() void CEmptyAI::yourTurn(QueryID queryID)
{ {
cb->selectionMade(0, queryID);
cb->endTurn(); cb->endTurn();
} }

View File

@ -23,7 +23,7 @@ public:
virtual void loadGame(BinaryDeserializer & h, const int version) override; virtual void loadGame(BinaryDeserializer & h, const int version) override;
void initGameInterface(std::shared_ptr<Environment> ENV, std::shared_ptr<CCallback> CB) override; void initGameInterface(std::shared_ptr<Environment> ENV, std::shared_ptr<CCallback> CB) override;
void yourTurn() override; void yourTurn(QueryID queryID) override;
void yourTacticPhase(int distance) override; void yourTacticPhase(int distance) override;
void activeStack(const CStack * stack) override; void activeStack(const CStack * stack) override;
void heroGotLevel(const CGHeroInstance *hero, PrimarySkill pskill, std::vector<SecondarySkill> &skills, QueryID queryID) override; void heroGotLevel(const CGHeroInstance *hero, PrimarySkill pskill, std::vector<SecondarySkill> &skills, QueryID queryID) override;

View File

@ -544,10 +544,12 @@ void AIGateway::initGameInterface(std::shared_ptr<Environment> env, std::shared_
retrieveVisitableObjs(); retrieveVisitableObjs();
} }
void AIGateway::yourTurn() void AIGateway::yourTurn(QueryID queryID)
{ {
LOG_TRACE(logAi); LOG_TRACE_PARAMS(logAi, "queryID '%i'", queryID);
NET_EVENT_HANDLER; NET_EVENT_HANDLER;
status.addQuery(queryID, "YourTurn");
requestActionASAP([=](){ answerQuery(queryID, 0); });
status.startedTurn(); status.startedTurn();
makingTurn = std::make_unique<boost::thread>(&AIGateway::makeTurn, this); makingTurn = std::make_unique<boost::thread>(&AIGateway::makeTurn, this);
} }

View File

@ -111,7 +111,7 @@ public:
std::string getBattleAIName() const override; std::string getBattleAIName() const override;
void initGameInterface(std::shared_ptr<Environment> env, std::shared_ptr<CCallback> CB) override; void initGameInterface(std::shared_ptr<Environment> env, std::shared_ptr<CCallback> CB) override;
void yourTurn() override; void yourTurn(QueryID queryID) override;
void heroGotLevel(const CGHeroInstance * hero, PrimarySkill pskill, std::vector<SecondarySkill> & skills, QueryID queryID) override; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id void heroGotLevel(const CGHeroInstance * hero, PrimarySkill pskill, std::vector<SecondarySkill> & skills, QueryID queryID) override; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id
void commanderGotLevel(const CCommanderInstance * commander, std::vector<ui32> skills, QueryID queryID) override; //TODO void commanderGotLevel(const CCommanderInstance * commander, std::vector<ui32> skills, QueryID queryID) override; //TODO

View File

@ -610,10 +610,12 @@ void VCAI::initGameInterface(std::shared_ptr<Environment> ENV, std::shared_ptr<C
retrieveVisitableObjs(); retrieveVisitableObjs();
} }
void VCAI::yourTurn() void VCAI::yourTurn(QueryID queryID)
{ {
LOG_TRACE(logAi); LOG_TRACE_PARAMS(logAi, "queryID '%i'", queryID);
NET_EVENT_HANDLER; NET_EVENT_HANDLER;
status.addQuery(queryID, "YourTurn");
requestActionASAP([=](){ answerQuery(queryID, 0); });
status.startedTurn(); status.startedTurn();
makingTurn = std::make_unique<boost::thread>(&VCAI::makeTurn, this); makingTurn = std::make_unique<boost::thread>(&VCAI::makeTurn, this);
} }

View File

@ -144,7 +144,7 @@ public:
std::string getBattleAIName() const override; std::string getBattleAIName() const override;
void initGameInterface(std::shared_ptr<Environment> ENV, std::shared_ptr<CCallback> CB) override; void initGameInterface(std::shared_ptr<Environment> ENV, std::shared_ptr<CCallback> CB) override;
void yourTurn() override; void yourTurn(QueryID queryID) override;
void heroGotLevel(const CGHeroInstance * hero, PrimarySkill pskill, std::vector<SecondarySkill> & skills, QueryID queryID) override; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id void heroGotLevel(const CGHeroInstance * hero, PrimarySkill pskill, std::vector<SecondarySkill> & skills, QueryID queryID) override; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id
void commanderGotLevel(const CCommanderInstance * commander, std::vector<ui32> skills, QueryID queryID) override; //TODO void commanderGotLevel(const CCommanderInstance * commander, std::vector<ui32> skills, QueryID queryID) override; //TODO

View File

@ -243,7 +243,7 @@ void CPlayerInterface::performAutosave()
} }
} }
void CPlayerInterface::yourTurn() void CPlayerInterface::yourTurn(QueryID queryID)
{ {
EVENT_HANDLER_CALLED_BY_CLIENT; EVENT_HANDLER_CALLED_BY_CLIENT;
{ {
@ -273,10 +273,10 @@ void CPlayerInterface::yourTurn()
adventureInt->onPlayerTurnStarted(playerID); adventureInt->onPlayerTurnStarted(playerID);
} }
} }
acceptTurn(); acceptTurn(queryID);
} }
void CPlayerInterface::acceptTurn() void CPlayerInterface::acceptTurn(QueryID queryID)
{ {
if (settings["session"]["autoSkip"].Bool()) if (settings["session"]["autoSkip"].Bool())
{ {
@ -322,6 +322,8 @@ void CPlayerInterface::acceptTurn()
else else
logGlobal->warn("Player has no towns, but daysWithoutCastle is not set"); logGlobal->warn("Player has no towns, but daysWithoutCastle is not set");
} }
cb->selectionMade(0, queryID);
} }
void CPlayerInterface::heroMoved(const TryMoveHero & details, bool verbose) void CPlayerInterface::heroMoved(const TryMoveHero & details, bool verbose)

View File

@ -133,7 +133,7 @@ protected: // Call-ins from server, should not be called directly, but only via
void tileRevealed(const std::unordered_set<int3> &pos) override; //called when fog of war disappears from given tiles void tileRevealed(const std::unordered_set<int3> &pos) override; //called when fog of war disappears from given tiles
void newObject(const CGObjectInstance * obj) override; void newObject(const CGObjectInstance * obj) override;
void availableArtifactsChanged(const CGBlackMarket *bm = nullptr) override; //bm may be nullptr, then artifacts are changed in the global pool (used by merchants in towns) void availableArtifactsChanged(const CGBlackMarket *bm = nullptr) override; //bm may be nullptr, then artifacts are changed in the global pool (used by merchants in towns)
void yourTurn() override; void yourTurn(QueryID queryID) override;
void availableCreaturesChanged(const CGDwelling *town) override; void availableCreaturesChanged(const CGDwelling *town) override;
void heroBonusChanged(const CGHeroInstance *hero, const Bonus &bonus, bool gain) override;//if gain hero received bonus, else he lost it void heroBonusChanged(const CGHeroInstance *hero, const Bonus &bonus, bool gain) override;//if gain hero received bonus, else he lost it
void playerBonusChanged(const Bonus &bonus, bool gain) override; void playerBonusChanged(const Bonus &bonus, bool gain) override;
@ -228,7 +228,7 @@ private:
void heroKilled(const CGHeroInstance* hero); void heroKilled(const CGHeroInstance* hero);
void garrisonsChanged(std::vector<const CGObjectInstance *> objs); void garrisonsChanged(std::vector<const CGObjectInstance *> objs);
void requestReturningToMainMenu(bool won); void requestReturningToMainMenu(bool won);
void acceptTurn(); //used during hot seat after your turn message is close void acceptTurn(QueryID queryID); //used during hot seat after your turn message is close
void initializeHeroTownList(); void initializeHeroTownList();
int getLastIndex(std::string namePrefix); int getLastIndex(std::string namePrefix);
void doMoveHero(const CGHeroInstance *h, CGPath path); void doMoveHero(const CGHeroInstance *h, CGPath path);

View File

@ -471,6 +471,7 @@ void ClientCommandManager::giveTurn(const PlayerColor &colorIdentifier)
{ {
YourTurn yt; YourTurn yt;
yt.player = colorIdentifier; yt.player = colorIdentifier;
yt.queryID = -1;
ApplyClientNetPackVisitor visitor(*CSH->client, *CSH->client->gameState()); ApplyClientNetPackVisitor visitor(*CSH->client, *CSH->client->gameState());
yt.visit(visitor); yt.visit(visitor);

View File

@ -398,7 +398,7 @@ void ApplyClientNetPackVisitor::visitPlayerReinitInterface(PlayerReinitInterface
if (cl.gameState()->isPlayerMakingTurn(player)) if (cl.gameState()->isPlayerMakingTurn(player))
{ {
callAllInterfaces(cl, &IGameEventsReceiver::playerStartsTurn, player); callAllInterfaces(cl, &IGameEventsReceiver::playerStartsTurn, player);
callOnlyThatInterface(cl, player, &CGameInterface::yourTurn); callOnlyThatInterface(cl, player, &CGameInterface::yourTurn, -1);
} }
} }
}; };
@ -873,7 +873,7 @@ void ApplyClientNetPackVisitor::visitYourTurn(YourTurn & pack)
logNetwork->debug("Server gives turn to %s", pack.player.getStr()); logNetwork->debug("Server gives turn to %s", pack.player.getStr());
callAllInterfaces(cl, &IGameEventsReceiver::playerStartsTurn, pack.player); callAllInterfaces(cl, &IGameEventsReceiver::playerStartsTurn, pack.player);
callOnlyThatInterface(cl, pack.player, &CGameInterface::yourTurn); callOnlyThatInterface(cl, pack.player, &CGameInterface::yourTurn, pack.queryID);
} }
void ApplyClientNetPackVisitor::visitTurnTimeUpdate(TurnTimeUpdate & pack) void ApplyClientNetPackVisitor::visitTurnTimeUpdate(TurnTimeUpdate & pack)

View File

@ -88,7 +88,7 @@ class DLL_LINKAGE CGameInterface : public CBattleGameInterface, public IGameEven
public: public:
virtual ~CGameInterface() = default; virtual ~CGameInterface() = default;
virtual void initGameInterface(std::shared_ptr<Environment> ENV, std::shared_ptr<CCallback> CB){}; virtual void initGameInterface(std::shared_ptr<Environment> ENV, std::shared_ptr<CCallback> CB){};
virtual void yourTurn(){}; //called AFTER playerStartsTurn(player) virtual void yourTurn(QueryID askID){}; //called AFTER playerStartsTurn(player)
//pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id
virtual void heroGotLevel(const CGHeroInstance *hero, PrimarySkill pskill, std::vector<SecondarySkill> &skills, QueryID queryID)=0; virtual void heroGotLevel(const CGHeroInstance *hero, PrimarySkill pskill, std::vector<SecondarySkill> &skills, QueryID queryID)=0;

View File

@ -162,7 +162,7 @@ struct DLL_LINKAGE TurnTimeUpdate : public CPackForClient
} }
}; };
struct DLL_LINKAGE YourTurn : public CPackForClient struct DLL_LINKAGE YourTurn : public Query
{ {
void applyGs(CGameState * gs) const; void applyGs(CGameState * gs) const;
@ -172,6 +172,7 @@ struct DLL_LINKAGE YourTurn : public CPackForClient
template <typename Handler> void serialize(Handler & h, const int version) template <typename Handler> void serialize(Handler & h, const int version)
{ {
h & queryID;
h & player; h & player;
} }
}; };

View File

@ -11,6 +11,7 @@
#include "TurnOrderProcessor.h" #include "TurnOrderProcessor.h"
#include "../queries/QueriesProcessor.h" #include "../queries/QueriesProcessor.h"
#include "../queries/MapQueries.h"
#include "../CGameHandler.h" #include "../CGameHandler.h"
#include "../CVCMIServer.h" #include "../CVCMIServer.h"
@ -98,8 +99,12 @@ void TurnOrderProcessor::doStartPlayerTurn(PlayerColor which)
awaitingPlayers.erase(which); awaitingPlayers.erase(which);
gameHandler->onPlayerTurnStarted(which); gameHandler->onPlayerTurnStarted(which);
auto turnQuery = std::make_shared<PlayerStartsTurnQuery>(gameHandler, which);
gameHandler->queries->addQuery(turnQuery);
YourTurn yt; YourTurn yt;
yt.player = which; yt.player = which;
yt.queryID = turnQuery->queryID;
gameHandler->sendAndApply(&yt); gameHandler->sendAndApply(&yt);
assert(actingPlayers.size() == 1); // No simturns yet :( assert(actingPlayers.size() == 1); // No simturns yet :(

View File

@ -15,6 +15,32 @@
#include "../../lib/mapObjects/MiscObjects.h" #include "../../lib/mapObjects/MiscObjects.h"
#include "../../lib/serializer/Cast.h" #include "../../lib/serializer/Cast.h"
PlayerStartsTurnQuery::PlayerStartsTurnQuery(CGameHandler * owner, PlayerColor player):
CGhQuery(owner)
{
addPlayer(player);
}
bool PlayerStartsTurnQuery::blocksPack(const CPack *pack) const
{
return blockAllButReply(pack);
}
void PlayerStartsTurnQuery::onAdding(PlayerColor color)
{
//gh->turnTimerHandler.setTimerEnabled(color, false);
}
void PlayerStartsTurnQuery::onRemoval(PlayerColor color)
{
//gh->turnTimerHandler.setTimerEnabled(color, true);
}
bool PlayerStartsTurnQuery::endsByPlayerAnswer() const
{
return true;
}
CObjectVisitQuery::CObjectVisitQuery(CGameHandler * owner, const CGObjectInstance * Obj, const CGHeroInstance * Hero, int3 Tile): CObjectVisitQuery::CObjectVisitQuery(CGameHandler * owner, const CGObjectInstance * Obj, const CGHeroInstance * Hero, int3 Tile):
CGhQuery(owner), visitedObject(Obj), visitingHero(Hero), tile(Tile), removeObjectAfterVisit(false) CGhQuery(owner), visitedObject(Obj), visitingHero(Hero), tile(Tile), removeObjectAfterVisit(false)
{ {

View File

@ -13,6 +13,21 @@
#include "../../lib/NetPacks.h" #include "../../lib/NetPacks.h"
class TurnTimerHandler;
//Created when player starts turn
//Removed when player accepts a turn
class PlayerStartsTurnQuery : public CGhQuery
{
public:
PlayerStartsTurnQuery(CGameHandler * owner, PlayerColor player);
bool blocksPack(const CPack *pack) const override;
void onAdding(PlayerColor color) override;
void onRemoval(PlayerColor color) override;
bool endsByPlayerAnswer() const override;
};
//Created when hero visits object. //Created when hero visits object.
//Removed when query above is resolved (or immediately after visit if no queries were created) //Removed when query above is resolved (or immediately after visit if no queries were created)
class CObjectVisitQuery : public CGhQuery class CObjectVisitQuery : public CGhQuery