bool CCreatureSet::canBeMergedWith(const CCreatureSet &cs, bool allowMergingStacks) const { if(!allowMergingStacks) { int freeSlots = stacksCount() - GameConstants::ARMY_SIZE; std::set<const CCreature*> cresToAdd; for(TSlots::const_iterator i = cs.stacks.begin(); i != cs.stacks.end(); i++) { SlotID dest = getSlotFor(i->second->type); if(!dest.validSlot() || hasStackAtSlot(dest)) cresToAdd.insert(i->second->type); } return cresToAdd.size() <= freeSlots; } else { CCreatureSet cres; //get types of creatures that need their own slot for(TSlots::const_iterator i = cs.stacks.begin(); i != cs.stacks.end(); i++) cres.addToSlot(i->first, i->second->type->idNumber, 1, true); SlotID j; for(TSlots::const_iterator i = stacks.begin(); i != stacks.end(); i++) { if ((j = cres.getSlotFor(i->second->type)).validSlot()) cres.addToSlot(j, i->second->type->idNumber, 1, true); //merge if possible else return false; //no place found } return true; //all stacks found their slots } }
bool CCreatureSet::mergableStacks(std::pair<SlotID, SlotID> &out, SlotID preferable /*= -1*/) const /*looks for two same stacks, returns slot positions */ { //try to match creature to our preferred stack if(preferable.validSlot() && vstd::contains(stacks, preferable)) { const CCreature *cr = stacks.find(preferable)->second->type; for(TSlots::const_iterator j=stacks.begin(); j!=stacks.end(); ++j) { if(cr == j->second->type && j->first != preferable) { out.first = preferable; out.second = j->first; return true; } } } for(TSlots::const_iterator i=stacks.begin(); i!=stacks.end(); ++i) { for(TSlots::const_iterator j=stacks.begin(); j!=stacks.end(); ++j) { if(i->second->type == j->second->type && i->first != j->first) { out.first = i->first; out.second = j->first; return true; } } } return false; }
void QuickRecruitmentWindow::purhaseUnits() { for(auto selected : cards) { if(selected->slider->getValue()) { auto onRecruit = [=](CreatureID id, int count){ LOCPLINT->cb->recruitCreatures(town, town->getUpperArmy(), id, count, selected->creatureOnTheCard->level-1); }; CreatureID crid = selected->creatureOnTheCard->idNumber; SlotID dstslot = town -> getSlotFor(crid); if(!dstslot.validSlot()) continue; onRecruit(crid, selected->slider->getValue()); } } close(); }
bool CCreatureSet::setCreature(SlotID slot, CreatureID type, TQuantity quantity) /*slots 0 to 6 */ { if(!slot.validSlot()) { tlog1 << "Cannot set slot " << slot << std::endl; return false; } if(!quantity) { tlog2 << "Using set creature to delete stack?\n"; eraseStack(slot); return true; } if(hasStackAtSlot(slot)) //remove old creature eraseStack(slot); putStack(slot, new CStackInstance(type, quantity)); return true; }