Compute player contacts only once on turn start

This commit is contained in:
Ivan Savenko
2023-09-26 13:42:20 +03:00
parent 623fb2a63e
commit a9dbd08dec
2 changed files with 52 additions and 4 deletions
+28 -3
View File
@@ -38,6 +38,26 @@ int TurnOrderProcessor::simturnsTurnsMinLimit() const
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
{
// 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
{
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 * waitingInfo = gameHandler->getPlayerState(waiting, false);
@@ -155,7 +176,7 @@ bool TurnOrderProcessor::canStartTurn(PlayerColor which) const
for (auto player : actingPlayers)
{
if (!canActSimultaneously(player, which))
if (player != which && isContactAllowed(player, which))
return false;
}
@@ -180,6 +201,7 @@ void TurnOrderProcessor::doStartNewDay()
std::swap(actedPlayers, awaitingPlayers);
gameHandler->onNewTurn();
updateContactStatus();
tryStartTurnsForPlayers();
}
@@ -277,6 +299,9 @@ bool TurnOrderProcessor::onPlayerEndsTurn(PlayerColor which)
void TurnOrderProcessor::onGameStarted()
{
if (actingPlayers.empty())
updateContactStatus();
// this may be game load - send notification to players that they can act
auto actingPlayersCopy = actingPlayers;
for (auto player : actingPlayersCopy)