90 lines
2.0 KiB
C++
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;
|
|
}
|