slumber-quest/actors/player.cpp

90 lines
2.0 KiB
C++

#include <algorithm>
#include <iostream>
#include <cctype>
#include "player.h"
#include "location.h"
#include "controller.h"
#include "item.h"
Player::Player()
{}
Player::~Player()
{}
void Player::commitAction()
{
std::cout << ">> ";
std::string input;
std::cin >> input;
std::cout << "\n";
std::transform(input.begin(), input.end(), input.begin(),
[](unsigned char c){ return std::tolower(c); });
if (input == "inventory")
{
std::cout << showInventory() << "\n\n";
return;
}
for (auto& controller : _current_location->controllers())
{
if (controller->validateInput(input))
{
std::shared_ptr<Actor> 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> &location)
{
_current_location = location;
_visited_locations.insert(location);
}
bool Player::isLocationVisited(const std::shared_ptr<Location> &location) const
{
return std::find(_visited_locations.begin(), _visited_locations.end(), location) != _visited_locations.end();
}
void Player::giveItem(const std::shared_ptr<Item>& item)
{
_inventory.push_back(item);
}
void Player::useItem(const std::shared_ptr<Item>& item)
{
_inventory.remove(item);
}
bool Player::hasItem(const std::shared_ptr<Item>& item) const
{
return std::find(_inventory.begin(), _inventory.end(), item) != _inventory.end();
}
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;
}