virtual MoveInfo getMove(Creature* c) override { CHECK(!pickedUp); if (!itemsExist(c->getLevel()->getSquare(position))) { callback->onCantPickItem(items); setDone(); return NoMove; } if (c->getPosition() == position) { vector<Item*> hereItems; for (Item* it : c->getPickUpOptions()) if (items.contains(it)) { hereItems.push_back(it); items.erase(it); } callback->onCantPickItem(items); if (hereItems.empty()) { setDone(); return NoMove; } items = hereItems; if (auto action = c->pickUp(hereItems)) return {1.0, action.append([=] { pickedUp = true; onPickedUp(); callback->onPickedUp(position, hereItems); })}; else { callback->onCantPickItem(items); setDone(); return NoMove; } } if (auto action = c->moveTowards(position, true)) return action; else if (--tries == 0) { callback->onCantPickItem(items); setDone(); } return NoMove; }
virtual MoveInfo getMove(Creature* c) override { CHECK(!pickedUp); if (c->getPosition() == getPosition()) { vector<Item*> hereItems; for (Item* it : c->getPickUpOptions()) if (items.contains(it)) { hereItems.push_back(it); items.erase(it); } getCollective()->onCantPickItem(items); if (hereItems.empty()) { setDone(); return NoMove; } items = hereItems; if (c->canPickUp(hereItems)) return {1.0, [=] { for (auto elem : Item::stackItems(hereItems)) c->globalMessage(c->getTheName() + " picks up " + elem.first, ""); c->pickUp(hereItems); pickedUp = true; onPickedUp(); getCollective()->onPickedUp(getPosition(), hereItems); }}; else { getCollective()->onCantPickItem(items); setDone(); return NoMove; } } if (MoveInfo move = getMoveToPosition(c, true)) return move; else if (--tries == 0) { getCollective()->onCantPickItem(items); setDone(); } return NoMove; }