#include #include #include #include "player.h" #include "location.h" #include "controller.h" #include "item.h" Player::Player() {} Player::~Player() {} void Player::commitAction() { std::cout << ((_ready_item) ? (">> [" + _ready_item->label() + "] > ") : (">> ")); std::string input; std::getline(std::cin, input, '\n'); std::cout << "\n"; std::transform(input.begin(), input.end(), input.begin(), [](unsigned char c){ return std::tolower(c); }); if (input.find("ready ") != std::string::npos) { findItemToReady(input.substr(6, input.size() - 1)); return; } if (input == "inventory") { readyItem(nullptr); std::cout << showInventory() << "\n\n"; return; } for (auto& controller : _current_location->controllers()) { if (controller->validateInput(input)) { std::shared_ptr player_as_actor = shared_from_this(); std::cout << controller->interact(player_as_actor) << "\n\n"; return; } } std::cout << "Nothing to do with that. Please think again." << "\n\n"; } void Player::moveToLocation(const std::shared_ptr &location) { _current_location = location; _visited_locations.insert(location); } bool Player::isLocationVisited(const std::shared_ptr &location) const { return std::find(_visited_locations.begin(), _visited_locations.end(), location) != _visited_locations.end(); } void Player::giveItem(const std::shared_ptr& item) { _inventory.push_back(item); } void Player::useItem(const std::shared_ptr& item) { _inventory.remove(item); } bool Player::hasItem(const std::shared_ptr& item) const { return std::find(_inventory.begin(), _inventory.end(), item) != _inventory.end(); } void Player::readyItem(const std::shared_ptr& item) { _ready_item = item; } bool Player::isItemReady(const std::shared_ptr& item) const { return item == _ready_item; } std::string Player::showInventory() const { if (_inventory.empty()) { return "Your pockets are empty."; } std::string inventory_message = "Currently you have "; for (const auto& item : _inventory) { inventory_message += item->label(); inventory_message += ", "; } inventory_message.pop_back(); inventory_message.pop_back(); inventory_message += "."; return inventory_message; } void Player::findItemToReady(const std::string& label) { for (const auto& item : _inventory) { if (item->label().find(label) != std::string::npos) { readyItem(item); return; } } }