mirror of
https://github.com/vcmi/vcmi.git
synced 2025-07-13 01:20:34 +02:00
- Hopefully fixed possibleActions for every case
- better algorithm for looting artifacts, yet buggy
This commit is contained in:
@ -1387,6 +1387,8 @@ void CBattleInterface::newRound(int number)
|
||||
|
||||
void CBattleInterface::giveCommand(ui8 action, BattleHex tile, ui32 stackID, si32 additional, si32 selected)
|
||||
{
|
||||
possibleActions.clear(); //no checks allowed before action is resolved
|
||||
|
||||
const CStack *stack = curInt->cb->battleGetStackByID(stackID);
|
||||
if(!stack && action != BattleAction::HERO_SPELL && action != BattleAction::RETREAT && action != BattleAction::SURRENDER)
|
||||
{
|
||||
|
@ -455,44 +455,42 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
|
||||
}
|
||||
//TODO: check if hero surrended / fled
|
||||
//TODO: display loot in window
|
||||
//if (result < BattleResult::SURRENDER && winnerHero)
|
||||
//{
|
||||
// if (loserHero)
|
||||
// {
|
||||
// BOOST_FOREACH (auto art, loserHero->artifactsWorn)
|
||||
// {
|
||||
// if (art.second.artifact)
|
||||
// {
|
||||
// MoveArtifact ma; //TODO: put into a function?
|
||||
// ma.src = ArtifactLocation (loserHero, art.first);
|
||||
// ma.dst = ArtifactLocation (winnerHero, art.second.artifact->firstAvailableSlot(winnerHero));
|
||||
// sendAndApply(&ma);
|
||||
// }
|
||||
// }
|
||||
// BOOST_FOREACH (auto art, loserHero->artifactsInBackpack)
|
||||
// {
|
||||
// if (art.artifact)
|
||||
// {
|
||||
// MoveArtifact ma;
|
||||
// ma.src = ArtifactLocation (loserHero, loserHero->getArtPos (art.artifact->artType->id, false)); //I smell trouble?
|
||||
// ma.dst = ArtifactLocation (winnerHero, art.artifact->firstAvailableSlot(winnerHero));
|
||||
// sendAndApply(&ma);
|
||||
// }
|
||||
// }
|
||||
if (result < BattleResult::SURRENDER && winnerHero)
|
||||
{
|
||||
if (loserHero)
|
||||
{
|
||||
auto artifactsWorn = loserHero->artifactsWorn;
|
||||
BOOST_FOREACH (auto artSlot, artifactsWorn)
|
||||
{
|
||||
MoveArtifact ma; //TODO: put into a function?
|
||||
ma.src = ArtifactLocation (loserHero, artSlot.first);
|
||||
const CArtifactInstance * art = ma.src.getArt();
|
||||
if (art && !art->artType->isBig()) // don't move war machines or locked arts (spellbook)
|
||||
{
|
||||
ma.dst = ArtifactLocation (winnerHero, art->firstAvailableSlot(winnerHero));
|
||||
sendAndApply(&ma);
|
||||
}
|
||||
}
|
||||
while (!loserHero->artifactsInBackpack.empty())
|
||||
{
|
||||
//we assume that no big artifatcs cna be found
|
||||
MoveArtifact ma;
|
||||
ma.src = ArtifactLocation (loserHero, GameConstants::BACKPACK_START); //backpack automatically shifts arts to beginning
|
||||
const CArtifactInstance * art = ma.src.getArt();
|
||||
ma.dst = ArtifactLocation (winnerHero, art->firstAvailableSlot(winnerHero));
|
||||
sendAndApply(&ma);
|
||||
}
|
||||
//if (loserHero->commander) //TODO: what if commanders belong to no hero?
|
||||
//{
|
||||
// BOOST_FOREACH (auto art, loserHero->commander->artifactsWorn)
|
||||
// {
|
||||
// if (art.second.artifact)
|
||||
// {
|
||||
// MoveArtifact ma; //FIXME: boost::variant vs pointer casting is bad solution
|
||||
// ma.src = ArtifactLocation (ConstTransitivePtr <CStackInstance> (loserHero->commander), art.first);
|
||||
// ma.src = ArtifactLocation (loserHero->commander.get(), art.first);
|
||||
// ma.dst = ArtifactLocation (winnerHero, art.second.artifact->firstAvailableSlot(winnerHero));
|
||||
// sendAndApply(&ma);
|
||||
// }
|
||||
//}
|
||||
// }
|
||||
// }
|
||||
}
|
||||
//BOOST_FOREACH (auto armySlot, gs->curB->belligerents[loser]->stacks)
|
||||
//{
|
||||
// MoveArtifact ma;
|
||||
@ -503,7 +501,7 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
|
||||
// sendAndApply(&ma);
|
||||
// }
|
||||
//}
|
||||
//}
|
||||
}
|
||||
|
||||
if (necroSlot != -1)
|
||||
{
|
||||
|
Reference in New Issue
Block a user