void CmdClose::execute() { Target target = SingleNeighbourSelector("Select object to close...") .select(); auto openableIter = std::find_if(target.actors.begin(), target.actors.end(), [](ActorPtr a) { return a->getFeature<Openable>(); }); ActorPtr toClose = openableIter != target.actors.end() ? *openableIter : nullptr; if ( toClose != nullptr) { if ( target.actors.size() == 1 ) { Actor::Player->performAction( std::make_shared<CloseAction>(toClose) ); } else { gui::msgBox("Cannot close " + tolowers(toClose->getName())+":\n" "It is blocked!", gui::MsgType::Warning); } } else { gui::msgBox("Nothing to close there.", gui::MsgType::Warning); } }
int CmdPutInto::execute() { int turns = 0; ActorPtr target = SingleNeighbourSelector("Select a container to put into...") .select() .firstActor(); if ( target != nullptr && target->hasFeature<Inventory>()) { OpenablePtr openable = target->getFeature<Openable>(); if ( openable && openable->isClosed() ) { gui::msgBox("Cannot put into " + target->getName() + " - it is closed.", gui::MsgType::Warning); } else { auto afterPutIntoAction = [&](const std::string& item, int amount) { target->notify(Event(EventId::Actor_Put,{{"putter","Player"}, {"container",target->getName()}, {"count", std::to_string(amount)}, {"item", tolowers(item)}})); }; auto containerFullAction = [&target](const std::string& item) { gui::msgBox("Cannot put "+item+" into "+tolowers(target->getName())+":#Not enough space!", gui::MsgType::Error); }; Engine::instance().getWindowManager() .getWindow<gui::PickUpWindow>() .setPicker(target) .setSource( [](){ return Engine::instance().getPlayer()->getFeature<Inventory>()->items(); }) .setRemoveAction([&](ActorPtr a){Engine::instance().getPlayer()->getFeature<Inventory>()->remove(a);}) .setAfterPickupAction( afterPutIntoAction ) .setInventoryFullAction( containerFullAction ) .setWindowTitle("Select item to put") .show(); } ++turns; } else if ( target ) { gui::msgBox("You cannot put anything into "+tolowers(target->getName())+".", gui::MsgType::Error); } return turns; }
void CmdPutInto::execute() { ActorPtr target = SingleNeighbourSelector("Select a container to put into...") .select() .firstActor(); if ( target != nullptr && target->hasFeature<Container>()) { auto afterPutIntoAction = [&](const std::string& item, int amount) { Messenger::message()->actorPutInto(Actor::Player->getName(), target->getName(), item, amount); }; auto containerFullAction = [&target](const std::string& item) { gui::msgBox("Cannot put "+item+" into "+tolowers(target->getName())+":\nNot enough space!", gui::MsgType::Error); }; Engine::instance().windowManager() .getWindow<gui::PickUpWindow>() .setPicker(target) .setContainer(Actor::Player->getFeature<Container>()) .setAfterPickupAction( afterPutIntoAction ) .setInventoryFullAction( containerFullAction ) .setWindowTitle("Select item to put") .show(); } else if ( target ) { gui::msgBox("You cannot put anything into "+tolowers(target->getName())+".", gui::MsgType::Error); } }