void Player::itemsMessage() { vector<View::ListElem> names; vector<vector<Item*> > groups; getItemNames(creature->getPickUpOptions(), names, groups); if (names.size() > 1) privateMessage(creature->isBlind() ? "You feel here some items" : "You see here some items."); else if (names.size() == 1) privateMessage((creature->isBlind() ? string("You feel here ") : ("You see here ")) + (groups[0].size() == 1 ? "a " + groups[0][0]->getNameAndModifiers(false, creature->isBlind()) : names[0].getText())); }
vector<Item*> Player::chooseItem(const string& text, ItemPredicate predicate, Optional<ActionId> exitAction) { map<ItemType, vector<Item*> > typeGroups = groupBy<Item*, ItemType>( creature->getEquipment().getItems(), [](Item* const& item) { return item->getType();}); vector<View::ListElem> names; vector<vector<Item*> > groups; for (auto elem : typeDisplayOrder) if (typeGroups[elem].size() > 0) { names.push_back(View::ListElem(getText(elem), View::TITLE)); getItemNames(typeGroups[elem], names, groups, predicate); } Optional<int> index = model->getView()->chooseFromList(text, names, 0, exitAction); if (index) return groups[*index]; return vector<Item*>(); }
void Player::onItemsAppeared(vector<Item*> items, const Creature* from) { if (!creature->canPickUp(items)) return; vector<View::ListElem> names; vector<vector<Item*> > groups; getItemNames(items, names, groups); CHECK(!names.empty()); Optional<int> index = model->getView()->chooseFromList("Do you want to take it?", names); if (!index) { return; } int num = groups[*index].size(); //groups[index].size() == 1 ? 1 : howMany(model->getView(), groups[index].size()); if (num < 1) return; creature->privateMessage("You take " + getPluralName(groups[*index][0], num)); creature->pickUp(getPrefix(groups[*index], 0, num), false); }
void Player::pickUpAction(bool extended) { auto items = creature->getPickUpOptions(); const Square* square = creature->getConstSquare(); if (square->getApplyType(creature)) { string question = getSquareQuestion(*square->getApplyType(creature), square->getName()); if (!question.empty() && (items.empty() || model->getView()->yesOrNoPrompt(question))) { creature->applySquare(); return; } } vector<View::ListElem> names; vector<vector<Item*> > groups; getItemNames(creature->getPickUpOptions(), names, groups); if (names.empty()) return; int index = 0; if (names.size() > 1) { Optional<int> res = model->getView()->chooseFromList("Choose an item to pick up:", names); if (!res) return; else index = *res; } int num = groups[index].size(); if (num < 1) return; if (extended && num > 1) { Optional<int> res = model->getView()->getNumber("Pick up how many " + groups[index][0]->getName(true) + "?", 1, num); if (!res) return; num = *res; } vector<Item*> pickUpItems = getPrefix(groups[index], 0, num); if (creature->canPickUp(pickUpItems)) { creature->privateMessage("You pick up " + getPluralName(groups[index][0], num)); creature->pickUp(pickUpItems); } }