|
@@ -40,6 +40,7 @@
|
|
|
#include "../lib/CCreatureHandler.h"
|
|
#include "../lib/CCreatureHandler.h"
|
|
|
#include "../lib/gameState/CGameState.h"
|
|
#include "../lib/gameState/CGameState.h"
|
|
|
#include "../lib/CStack.h"
|
|
#include "../lib/CStack.h"
|
|
|
|
|
+#include "../lib/UnlockGuard.h"
|
|
|
#include "../lib/GameSettings.h"
|
|
#include "../lib/GameSettings.h"
|
|
|
#include "../lib/battle/BattleInfo.h"
|
|
#include "../lib/battle/BattleInfo.h"
|
|
|
#include "../lib/CondSh.h"
|
|
#include "../lib/CondSh.h"
|
|
@@ -76,6 +77,7 @@
|
|
|
#define COMPLAIN_RETF(txt, FORMAT) {complain(boost::str(boost::format(txt) % FORMAT)); return false;}
|
|
#define COMPLAIN_RETF(txt, FORMAT) {complain(boost::str(boost::format(txt) % FORMAT)); return false;}
|
|
|
|
|
|
|
|
CondSh<bool> battleMadeAction(false);
|
|
CondSh<bool> battleMadeAction(false);
|
|
|
|
|
+boost::recursive_mutex battleActionMutex;
|
|
|
CondSh<BattleResult *> battleResult(nullptr);
|
|
CondSh<BattleResult *> battleResult(nullptr);
|
|
|
template <typename T> class CApplyOnGH;
|
|
template <typename T> class CApplyOnGH;
|
|
|
|
|
|
|
@@ -4394,6 +4396,8 @@ void CGameHandler::updateGateState()
|
|
|
|
|
|
|
|
bool CGameHandler::makeBattleAction(BattleAction &ba)
|
|
bool CGameHandler::makeBattleAction(BattleAction &ba)
|
|
|
{
|
|
{
|
|
|
|
|
+ boost::unique_lock lock(battleActionMutex);
|
|
|
|
|
+
|
|
|
bool ok = true;
|
|
bool ok = true;
|
|
|
|
|
|
|
|
battle::Target target = ba.getTarget(gs->curB);
|
|
battle::Target target = ba.getTarget(gs->curB);
|
|
@@ -4817,6 +4821,8 @@ bool CGameHandler::makeBattleAction(BattleAction &ba)
|
|
|
|
|
|
|
|
bool CGameHandler::makeCustomAction(BattleAction & ba)
|
|
bool CGameHandler::makeCustomAction(BattleAction & ba)
|
|
|
{
|
|
{
|
|
|
|
|
+ boost::unique_lock lock(battleActionMutex);
|
|
|
|
|
+
|
|
|
switch(ba.actionType)
|
|
switch(ba.actionType)
|
|
|
{
|
|
{
|
|
|
case EActionType::HERO_SPELL:
|
|
case EActionType::HERO_SPELL:
|
|
@@ -6048,6 +6054,8 @@ bool CGameHandler::swapStacks(const StackLocation & sl1, const StackLocation & s
|
|
|
|
|
|
|
|
void CGameHandler::runBattle()
|
|
void CGameHandler::runBattle()
|
|
|
{
|
|
{
|
|
|
|
|
+ boost::unique_lock lock(battleActionMutex);
|
|
|
|
|
+
|
|
|
setBattle(gs->curB);
|
|
setBattle(gs->curB);
|
|
|
assert(gs->curB);
|
|
assert(gs->curB);
|
|
|
//TODO: pre-tactic stuff, call scripts etc.
|
|
//TODO: pre-tactic stuff, call scripts etc.
|
|
@@ -6066,7 +6074,10 @@ void CGameHandler::runBattle()
|
|
|
//tactic round
|
|
//tactic round
|
|
|
{
|
|
{
|
|
|
while ((lobby->state != EServerState::SHUTDOWN) && gs->curB->tacticDistance && !battleResult.get())
|
|
while ((lobby->state != EServerState::SHUTDOWN) && gs->curB->tacticDistance && !battleResult.get())
|
|
|
|
|
+ {
|
|
|
|
|
+ auto unlockGuard = vstd::makeUnlockGuard(battleActionMutex);
|
|
|
boost::this_thread::sleep(boost::posix_time::milliseconds(50));
|
|
boost::this_thread::sleep(boost::posix_time::milliseconds(50));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//initial stacks appearance triggers, e.g. built-in bonus spells
|
|
//initial stacks appearance triggers, e.g. built-in bonus spells
|
|
@@ -6389,7 +6400,10 @@ void CGameHandler::runBattle()
|
|
|
battleMadeAction.data = false;
|
|
battleMadeAction.data = false;
|
|
|
while ((lobby->state != EServerState::SHUTDOWN) && !actionWasMade())
|
|
while ((lobby->state != EServerState::SHUTDOWN) && !actionWasMade())
|
|
|
{
|
|
{
|
|
|
- battleMadeAction.cond.wait(lock);
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ auto unlockGuard = vstd::makeUnlockGuard(battleActionMutex);
|
|
|
|
|
+ battleMadeAction.cond.wait(lock);
|
|
|
|
|
+ }
|
|
|
if (battleGetStackByID(nextId, false) != next)
|
|
if (battleGetStackByID(nextId, false) != next)
|
|
|
next = nullptr; //it may be removed, while we wait
|
|
next = nullptr; //it may be removed, while we wait
|
|
|
}
|
|
}
|