|
@@ -1307,6 +1307,14 @@ DLL_LINKAGE void BattleStackAttacked::applyGs( CGameState *gs )
|
|
|
if(killed())
|
|
|
{
|
|
|
at->state -= EBattleStackState::ALIVE;
|
|
|
+
|
|
|
+ if(at->cloneID >= 0)
|
|
|
+ {
|
|
|
+ //remove clone as well
|
|
|
+ CStack * clone = gs->curB->getStack(at->cloneID);
|
|
|
+ clone->state.insert(EBattleStackState::DEAD_CLONE);
|
|
|
+ at->cloneID = -1;
|
|
|
+ }
|
|
|
}
|
|
|
//life drain handling
|
|
|
for (auto & elem : healedStacks)
|
|
@@ -1329,6 +1337,10 @@ DLL_LINKAGE void BattleStackAttacked::applyGs( CGameState *gs )
|
|
|
s->cloneID = -1;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ //killed summoned creature should be removed like clone
|
|
|
+ if(killed() && vstd::contains(at->state, EBattleStackState::SUMMONED))
|
|
|
+ at->state.insert(EBattleStackState::DEAD_CLONE);
|
|
|
}
|
|
|
|
|
|
DLL_LINKAGE void BattleAttack::applyGs( CGameState *gs )
|
|
@@ -1612,13 +1624,22 @@ DLL_LINKAGE void BattleStacksRemoved::applyGs( CGameState *gs )
|
|
|
{
|
|
|
if(!gs->curB)
|
|
|
return;
|
|
|
- for(ui32 rem_stack : stackIDs)
|
|
|
+
|
|
|
+ while(!stackIDs.empty())
|
|
|
{
|
|
|
+ ui32 rem_stack = *stackIDs.begin();
|
|
|
+
|
|
|
for(int b=0; b<gs->curB->stacks.size(); ++b) //find it in vector of stacks
|
|
|
{
|
|
|
if(gs->curB->stacks[b]->ID == rem_stack) //if found
|
|
|
{
|
|
|
- CStack *toRemove = gs->curB->stacks[b];
|
|
|
+ CStack * toRemove = gs->curB->stacks[b];
|
|
|
+
|
|
|
+ //stack may be removed instantly (not being killed first)
|
|
|
+ //handle clone remove also here
|
|
|
+ if(toRemove->cloneID >= 0)
|
|
|
+ stackIDs.insert(toRemove->cloneID);
|
|
|
+
|
|
|
gs->curB->stacks.erase(gs->curB->stacks.begin() + b); //remove
|
|
|
|
|
|
toRemove->detachFromAll();
|
|
@@ -1626,6 +1647,8 @@ DLL_LINKAGE void BattleStacksRemoved::applyGs( CGameState *gs )
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ stackIDs.erase(rem_stack);
|
|
|
}
|
|
|
}
|
|
|
|