mirror of
https://github.com/vcmi/vcmi.git
synced 2026-06-19 22:57:37 +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;
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user