mirror of
https://github.com/vcmi/vcmi.git
synced 2025-01-12 02:28:11 +02:00
Army exchange implementation
This commit is contained in:
parent
2ce73fd4e1
commit
8fa0b30985
@ -288,19 +288,16 @@ void CAnimImage::showAll(SDL_Surface * to)
|
||||
if(!visible)
|
||||
return;
|
||||
|
||||
if(flags & CShowableAnim::BASE && frame != 0)
|
||||
if(auto img = anim->getImage(0, group))
|
||||
std::vector<size_t> frames = {frame};
|
||||
|
||||
if((flags & CShowableAnim::BASE) && frame != 0)
|
||||
{
|
||||
if (isScaled())
|
||||
{
|
||||
auto scaled = img->scaleFast(float(scaledSize.x) / img->width());
|
||||
scaled->draw(to, pos.x, pos.y);
|
||||
}
|
||||
else
|
||||
img->draw(to, pos.x, pos.y);
|
||||
frames.insert(frames.begin(), 0);
|
||||
}
|
||||
|
||||
if(auto img = anim->getImage(frame, group))
|
||||
for(auto targetFrame : frames)
|
||||
{
|
||||
if(auto img = anim->getImage(targetFrame, group))
|
||||
{
|
||||
if(isScaled())
|
||||
{
|
||||
@ -311,6 +308,7 @@ void CAnimImage::showAll(SDL_Surface * to)
|
||||
img->draw(to, pos.x, pos.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CAnimImage::setFrame(size_t Frame, size_t Group)
|
||||
{
|
||||
|
@ -812,25 +812,29 @@ std::function<void()> CExchangeController::onMoveArmyToRight()
|
||||
|
||||
std::function<void()> CExchangeController::onSwapArmy()
|
||||
{
|
||||
return [&]() {
|
||||
auto cb = LOCPLINT->cb;
|
||||
|
||||
for(SlotID i = SlotID(0); i.validSlot(); i.advance(1))
|
||||
return [&]()
|
||||
{
|
||||
if(left->hasStackAtSlot(i) || right->hasStackAtSlot(i))
|
||||
cb->swapCreatures(left, right, SlotID(i), SlotID(i));
|
||||
std::shared_ptr<CCallback> cb = LOCPLINT->cb;
|
||||
const TSlots & leftSlots = left->Slots();
|
||||
const TSlots & rightSlots = right->Slots();
|
||||
|
||||
for(auto i = leftSlots.begin(), j = rightSlots.begin(); i != leftSlots.end() && j != rightSlots.end(); i++, j++)
|
||||
{
|
||||
cb->swapCreatures(left, right, i->first, j->first);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
void CExchangeController::hdModQuickExchangeArmy(bool leftToRight)
|
||||
{
|
||||
auto source = leftToRight ? left : right;
|
||||
auto target = leftToRight ? right : left;
|
||||
auto cb = LOCPLINT->cb;
|
||||
const CGHeroInstance * source = leftToRight ? left : right;
|
||||
const CGHeroInstance * target = leftToRight ? right : left;
|
||||
std::shared_ptr<CCallback> cb = LOCPLINT->cb;
|
||||
|
||||
boost::thread([=]
|
||||
{
|
||||
boost::shared_lock<boost::shared_mutex> gsLock(CGameState::mutex);
|
||||
|
||||
auto slots = source->Slots();
|
||||
std::vector<std::pair<SlotID, CStackInstance *>> stacks(slots.begin(), slots.end());
|
||||
|
||||
@ -839,7 +843,11 @@ void CExchangeController::hdModQuickExchangeArmy(bool leftToRight)
|
||||
return a.second->type->level > b.second->type->level;
|
||||
});
|
||||
|
||||
auto originalWaitTillRealize = cb->waitTillRealize;
|
||||
auto originalUnlockGsWhenWating = cb->unlockGsWhenWaiting;
|
||||
|
||||
cb->waitTillRealize = true;
|
||||
cb->unlockGsWhenWaiting = true;
|
||||
|
||||
for(auto pair : stacks)
|
||||
{
|
||||
@ -866,7 +874,8 @@ void CExchangeController::hdModQuickExchangeArmy(bool leftToRight)
|
||||
}
|
||||
}
|
||||
|
||||
cb->waitTillRealize = false;
|
||||
cb->waitTillRealize = originalWaitTillRealize;
|
||||
cb->unlockGsWhenWaiting = originalUnlockGsWhenWating;
|
||||
});
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user