1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

* fixed 592

This commit is contained in:
mateuszb
2010-08-02 10:59:47 +00:00
parent ac54784e55
commit 4fb50260c3

View File

@@ -521,37 +521,52 @@ void CGameHandler::startBattle(const CArmedInstance *army1, const CArmedInstance
continue; continue;
} }
askInterfaceForMove: int numberOfAsks = 1;
//ask interface and wait for answer bool breakOuter = false;
if(!battleResult.get()) do
{ {//ask interface and wait for answer
BattleSetActiveStack sas; if(!battleResult.get())
sas.stack = next->ID; {
sendAndApply(&sas); BattleSetActiveStack sas;
boost::unique_lock<boost::mutex> lock(battleMadeAction.mx); sas.stack = next->ID;
while(next->alive() && (!battleMadeAction.data && !battleResult.get())) //active stack hasn't made its action and battle is still going sendAndApply(&sas);
battleMadeAction.cond.wait(lock); boost::unique_lock<boost::mutex> lock(battleMadeAction.mx);
battleMadeAction.data = false; while(next->alive() && (!battleMadeAction.data && !battleResult.get())) //active stack hasn't made its action and battle is still going
} battleMadeAction.cond.wait(lock);
else battleMadeAction.data = false;
}
if(battleResult.get()) //don't touch it, battle could be finished while waiting got action
{
breakOuter = true;
break;
}
//we're after action, all results applied
checkForBattleEnd(stacks); //check if this action ended the battle
//check for good morale
nextStackMorale = next->MoraleVal();
if(!vstd::contains(next->state,HAD_MORALE) //only one extra move per turn possible
&& !vstd::contains(next->state,DEFENDING)
&& !vstd::contains(next->state,WAITING)
&& next->alive()
&& nextStackMorale > 0
&& !(NBonus::hasOfType(hero1, Bonus::BLOCK_MORALE) || NBonus::hasOfType(hero2, Bonus::BLOCK_MORALE)) //checking if heroes have (or don't have) morale blocking bonuses
)
{
if(rand()%24 < nextStackMorale) //this stack hasn't got morale this turn
++numberOfAsks; //move this stack once more
}
--numberOfAsks;
} while (numberOfAsks > 0);
if (breakOuter)
{ {
break; break;
} }
//we're after action, all results applied
checkForBattleEnd(stacks); //check if this action ended the battle
//check for good morale
nextStackMorale = next->MoraleVal();
if(!vstd::contains(next->state,HAD_MORALE) //only one extra move per turn possible
&& !vstd::contains(next->state,DEFENDING)
&& !vstd::contains(next->state,WAITING)
&& next->alive()
&& nextStackMorale > 0
&& !(NBonus::hasOfType(hero1, Bonus::BLOCK_MORALE) || NBonus::hasOfType(hero2, Bonus::BLOCK_MORALE)) //checking if heroes have (or don't have) morale blocking bonuses
)
if(rand()%24 < nextStackMorale) //this stack hasn't got morale this turn
goto askInterfaceForMove; //move this stack once more
} }
} }
@@ -4245,7 +4260,9 @@ bool CGameHandler::makeCustomAction( BattleAction &ba )
checkForBattleEnd(gs->curB->stacks); checkForBattleEnd(gs->curB->stacks);
if(battleResult.get()) if(battleResult.get())
{ {
endBattle(gs->curB->tile, gs->curB->heroes[0], gs->curB->heroes[1]); battleMadeAction.setn(true);
//battle will be ended by startBattle function
//endBattle(gs->curB->tile, gs->curB->heroes[0], gs->curB->heroes[1]);
} }
return true; return true;