mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
* fixed 592
This commit is contained in:
@@ -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;
|
||||||
|
Reference in New Issue
Block a user