Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
 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;
 }