1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-28 08:48:48 +02:00

Implement player start turn query

This commit is contained in:
nordsoft 2023-08-28 04:42:05 +04:00
parent 8e9dd697ff
commit 98f7ed9dfd
15 changed files with 73 additions and 17 deletions

View File

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

View File

@ -23,7 +23,7 @@ public:
virtual void loadGame(BinaryDeserializer & h, const int version) 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 activeStack(const CStack * stack) 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();
}
void AIGateway::yourTurn()
void AIGateway::yourTurn(QueryID queryID)
{
LOG_TRACE(logAi);
LOG_TRACE_PARAMS(logAi, "queryID '%i'", queryID);
NET_EVENT_HANDLER;
status.addQuery(queryID, "YourTurn");
requestActionASAP([=](){ answerQuery(queryID, 0); });
status.startedTurn();
makingTurn = std::make_unique<boost::thread>(&AIGateway::makeTurn, this);
}

View File

@ -111,7 +111,7 @@ public:
std::string getBattleAIName() const 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 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();
}
void VCAI::yourTurn()
void VCAI::yourTurn(QueryID queryID)
{
LOG_TRACE(logAi);
LOG_TRACE_PARAMS(logAi, "queryID '%i'", queryID);
NET_EVENT_HANDLER;
status.addQuery(queryID, "YourTurn");
requestActionASAP([=](){ answerQuery(queryID, 0); });
status.startedTurn();
makingTurn = std::make_unique<boost::thread>(&VCAI::makeTurn, this);
}

View File

@ -144,7 +144,7 @@ public:
std::string getBattleAIName() const 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 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;
{
@ -273,10 +273,10 @@ void CPlayerInterface::yourTurn()
adventureInt->onPlayerTurnStarted(playerID);
}
}
acceptTurn();
acceptTurn(queryID);
}
void CPlayerInterface::acceptTurn()
void CPlayerInterface::acceptTurn(QueryID queryID)
{
if (settings["session"]["autoSkip"].Bool())
{
@ -322,6 +322,9 @@ void CPlayerInterface::acceptTurn()
else
logGlobal->warn("Player has no towns, but daysWithoutCastle is not set");
}
JsonNode reply(JsonNode::JsonType::DATA_NULL);
cb->sendQueryReply(reply, queryID);
}
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 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 yourTurn() override;
void yourTurn(QueryID queryID) 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 playerBonusChanged(const Bonus &bonus, bool gain) override;
@ -228,7 +228,7 @@ private:
void heroKilled(const CGHeroInstance* hero);
void garrisonsChanged(std::vector<const CGObjectInstance *> objs);
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();
int getLastIndex(std::string namePrefix);
void doMoveHero(const CGHeroInstance *h, CGPath path);

View File

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

View File

@ -398,7 +398,7 @@ void ApplyClientNetPackVisitor::visitPlayerReinitInterface(PlayerReinitInterface
if (cl.gameState()->isPlayerMakingTurn(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());
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)

View File

@ -88,7 +88,7 @@ class DLL_LINKAGE CGameInterface : public CBattleGameInterface, public IGameEven
public:
virtual ~CGameInterface() = default;
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
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;
@ -172,6 +172,7 @@ struct DLL_LINKAGE YourTurn : public CPackForClient
template <typename Handler> void serialize(Handler & h, const int version)
{
h & queryID;
h & player;
}
};

View File

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

View File

@ -15,6 +15,32 @@
#include "../../lib/mapObjects/MiscObjects.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):
CGhQuery(owner), visitedObject(Obj), visitingHero(Hero), tile(Tile), removeObjectAfterVisit(false)
{

View File

@ -13,6 +13,21 @@
#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.
//Removed when query above is resolved (or immediately after visit if no queries were created)
class CObjectVisitQuery : public CGhQuery