mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-06 09:09:40 +02:00
Compute player contacts only once on turn start
This commit is contained in:
@@ -38,6 +38,26 @@ int TurnOrderProcessor::simturnsTurnsMinLimit() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TurnOrderProcessor::updateContactStatus()
|
||||||
|
{
|
||||||
|
blockedContacts.clear();
|
||||||
|
|
||||||
|
assert(actedPlayers.empty());
|
||||||
|
assert(actingPlayers.empty());
|
||||||
|
|
||||||
|
for (auto left : awaitingPlayers)
|
||||||
|
{
|
||||||
|
for(auto right : awaitingPlayers)
|
||||||
|
{
|
||||||
|
if (left == right)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (computeCanActSimultaneously(left, right))
|
||||||
|
blockedContacts.push_back({left, right});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool TurnOrderProcessor::playersInContact(PlayerColor left, PlayerColor right) const
|
bool TurnOrderProcessor::playersInContact(PlayerColor left, PlayerColor right) const
|
||||||
{
|
{
|
||||||
// TODO: refactor, cleanup and optimize
|
// TODO: refactor, cleanup and optimize
|
||||||
@@ -92,10 +112,11 @@ bool TurnOrderProcessor::playersInContact(PlayerColor left, PlayerColor right) c
|
|||||||
|
|
||||||
bool TurnOrderProcessor::isContactAllowed(PlayerColor active, PlayerColor waiting) const
|
bool TurnOrderProcessor::isContactAllowed(PlayerColor active, PlayerColor waiting) const
|
||||||
{
|
{
|
||||||
return true;
|
assert(active != waiting);
|
||||||
|
return !vstd::contains(blockedContacts, PlayerPair{active, waiting});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TurnOrderProcessor::canActSimultaneously(PlayerColor active, PlayerColor waiting) const
|
bool TurnOrderProcessor::computeCanActSimultaneously(PlayerColor active, PlayerColor waiting) const
|
||||||
{
|
{
|
||||||
const auto * activeInfo = gameHandler->getPlayerState(active, false);
|
const auto * activeInfo = gameHandler->getPlayerState(active, false);
|
||||||
const auto * waitingInfo = gameHandler->getPlayerState(waiting, false);
|
const auto * waitingInfo = gameHandler->getPlayerState(waiting, false);
|
||||||
@@ -155,7 +176,7 @@ bool TurnOrderProcessor::canStartTurn(PlayerColor which) const
|
|||||||
|
|
||||||
for (auto player : actingPlayers)
|
for (auto player : actingPlayers)
|
||||||
{
|
{
|
||||||
if (!canActSimultaneously(player, which))
|
if (player != which && isContactAllowed(player, which))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,6 +201,7 @@ void TurnOrderProcessor::doStartNewDay()
|
|||||||
std::swap(actedPlayers, awaitingPlayers);
|
std::swap(actedPlayers, awaitingPlayers);
|
||||||
|
|
||||||
gameHandler->onNewTurn();
|
gameHandler->onNewTurn();
|
||||||
|
updateContactStatus();
|
||||||
tryStartTurnsForPlayers();
|
tryStartTurnsForPlayers();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,6 +299,9 @@ bool TurnOrderProcessor::onPlayerEndsTurn(PlayerColor which)
|
|||||||
|
|
||||||
void TurnOrderProcessor::onGameStarted()
|
void TurnOrderProcessor::onGameStarted()
|
||||||
{
|
{
|
||||||
|
if (actingPlayers.empty())
|
||||||
|
updateContactStatus();
|
||||||
|
|
||||||
// this may be game load - send notification to players that they can act
|
// this may be game load - send notification to players that they can act
|
||||||
auto actingPlayersCopy = actingPlayers;
|
auto actingPlayersCopy = actingPlayers;
|
||||||
for (auto player : actingPlayersCopy)
|
for (auto player : actingPlayersCopy)
|
||||||
|
|||||||
@@ -17,6 +17,26 @@ class TurnOrderProcessor : boost::noncopyable
|
|||||||
{
|
{
|
||||||
CGameHandler * gameHandler;
|
CGameHandler * gameHandler;
|
||||||
|
|
||||||
|
struct PlayerPair
|
||||||
|
{
|
||||||
|
PlayerColor a;
|
||||||
|
PlayerColor b;
|
||||||
|
|
||||||
|
bool operator == (const PlayerPair & other) const
|
||||||
|
{
|
||||||
|
return (a == other.a && b == other.b) || (a == other.b && b == other.a);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Handler>
|
||||||
|
void serialize(Handler & h, const int version)
|
||||||
|
{
|
||||||
|
h & a;
|
||||||
|
h & b;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<PlayerPair> blockedContacts;
|
||||||
|
|
||||||
std::set<PlayerColor> awaitingPlayers;
|
std::set<PlayerColor> awaitingPlayers;
|
||||||
std::set<PlayerColor> actingPlayers;
|
std::set<PlayerColor> actingPlayers;
|
||||||
std::set<PlayerColor> actedPlayers;
|
std::set<PlayerColor> actedPlayers;
|
||||||
@@ -31,7 +51,7 @@ class TurnOrderProcessor : boost::noncopyable
|
|||||||
bool playersInContact(PlayerColor left, PlayerColor right) const;
|
bool playersInContact(PlayerColor left, PlayerColor right) const;
|
||||||
|
|
||||||
/// Returns true if waiting player can act alongside with currently acting player
|
/// Returns true if waiting player can act alongside with currently acting player
|
||||||
bool canActSimultaneously(PlayerColor active, PlayerColor waiting) const;
|
bool computeCanActSimultaneously(PlayerColor active, PlayerColor waiting) const;
|
||||||
|
|
||||||
/// Returns true if left player must act before right player
|
/// Returns true if left player must act before right player
|
||||||
bool mustActBefore(PlayerColor left, PlayerColor right) const;
|
bool mustActBefore(PlayerColor left, PlayerColor right) const;
|
||||||
@@ -42,6 +62,8 @@ class TurnOrderProcessor : boost::noncopyable
|
|||||||
/// Starts turn for all players that can start turn
|
/// Starts turn for all players that can start turn
|
||||||
void tryStartTurnsForPlayers();
|
void tryStartTurnsForPlayers();
|
||||||
|
|
||||||
|
void updateContactStatus();
|
||||||
|
|
||||||
void doStartNewDay();
|
void doStartNewDay();
|
||||||
void doStartPlayerTurn(PlayerColor which);
|
void doStartPlayerTurn(PlayerColor which);
|
||||||
void doEndPlayerTurn(PlayerColor which);
|
void doEndPlayerTurn(PlayerColor which);
|
||||||
@@ -70,6 +92,7 @@ public:
|
|||||||
template<typename Handler>
|
template<typename Handler>
|
||||||
void serialize(Handler & h, const int version)
|
void serialize(Handler & h, const int version)
|
||||||
{
|
{
|
||||||
|
h & blockedContacts;
|
||||||
h & awaitingPlayers;
|
h & awaitingPlayers;
|
||||||
h & actingPlayers;
|
h & actingPlayers;
|
||||||
h & actedPlayers;
|
h & actedPlayers;
|
||||||
|
|||||||
Reference in New Issue
Block a user