void LookAction::execute(Player *player, Command *command, Game *game) { string object = command->getDirectObject(); if (object.length() == 0) { object = command->getIndirectObject(); } if (object.length() == 0) { player->getLocation()->observe(player, true, true); } else { Place *location = player->getLocation(); // Note: I can't use list.merge(), because ObjectList and ThingList are // of different types :'( ThingList items; // consider matching inventory items, if there are any ObjectListCItPair invItems = player->getInventoryObjectsByName(object); for (ObjectListCIt i = invItems.begin; i != invItems.end; i++) { items.push_front(*i); } // also consider matching items in the room, if there are any ThingListCItPair roomItems = location->getThingsByName(object); for (ThingListCIt i = roomItems.begin; i != roomItems.end; i++) { items.push_front(*i); } if (0 == items.size()) { player->out("display") << "There is no " << object << " here!" << endl; return; } ThingListCItPair itemsIt; itemsIt.begin = items.begin(); itemsIt.end = items.end(); try { Thing *thing = Entity::clarifyEntity<ThingListCItPair, ThingListCIt, Thing *>(itemsIt, player); thing->observe(player, true, true); } catch (string name) { player->out("display") << "There is no " << name << " here!" << endl; } } }
void TakeAction::execute(Player *player, Command *command, Game *game) { Place *location = player->getLocation(); ThingListCItPair roomItems = location->getThingsByName(command->getDirectObject()); if (roomItems.begin == roomItems.end) { player->out("display") << "There is no " << command->getDirectObject() << " here!" << endl; return; } try { Thing *thing = Entity::clarifyEntity<ThingListCItPair, ThingListCIt, Thing *>(roomItems, player); if (ENTITY_OBJECT != thing->getType()) { player->out("display") << "You can't take that!" << endl; } else { try { player->take(static_cast<Object *>(thing)); string message = thing->getMessage("take"); if (message.length() > 0) { player->out("display") << message << endl; } else { player->out("display") << "You take the " << thing->getName() << "." << endl; } } catch (enum Being::takeError error) { // TODO: consider custom messages switch (error) { case Being::TAKE_TOO_HEAVY: player->out("display") << command->getDirectObject() << " is too heavy. Try dropping something first." << endl; break; case Being::TAKE_UNTAKEABLE: player->out("display") << "You can't take that!" << endl; break; default: player->err() << "Unknown error taking object. " << "This is a bug." << endl; break; } } } } catch (string name) { player->out("display") << "There is no " << name << " here!" << endl; } }