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; } }