Add ready items
This commit is contained in:
parent
5030b71e3f
commit
f7517e0abd
|
@ -1,6 +1,8 @@
|
||||||
#include "actor.h"
|
#include "actor.h"
|
||||||
|
|
||||||
Actor::Actor()
|
Actor::Actor() :
|
||||||
|
_current_location(nullptr),
|
||||||
|
_ready_item(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Actor::~Actor()
|
Actor::~Actor()
|
||||||
|
|
|
@ -20,10 +20,13 @@ public:
|
||||||
virtual void giveItem(const std::shared_ptr<Item>& item) = 0;
|
virtual void giveItem(const std::shared_ptr<Item>& item) = 0;
|
||||||
virtual void useItem(const std::shared_ptr<Item>& item) = 0;
|
virtual void useItem(const std::shared_ptr<Item>& item) = 0;
|
||||||
virtual bool hasItem(const std::shared_ptr<Item>& item) const = 0;
|
virtual bool hasItem(const std::shared_ptr<Item>& item) const = 0;
|
||||||
|
virtual void readyItem(const std::shared_ptr<Item>& item) = 0;
|
||||||
|
virtual bool isItemReady(const std::shared_ptr<Item>& item) const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::shared_ptr<Location> _current_location;
|
std::shared_ptr<Location> _current_location;
|
||||||
std::list<std::shared_ptr<Item>> _inventory;
|
std::list<std::shared_ptr<Item>> _inventory;
|
||||||
|
std::shared_ptr<Item> _ready_item;
|
||||||
std::set<std::shared_ptr<Location>> _visited_locations;
|
std::set<std::shared_ptr<Location>> _visited_locations;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,16 +15,26 @@ Player::~Player()
|
||||||
|
|
||||||
void Player::commitAction()
|
void Player::commitAction()
|
||||||
{
|
{
|
||||||
std::cout << ">> ";
|
std::cout << ((_ready_item)
|
||||||
|
? (">> [" + _ready_item->label() + "] > ")
|
||||||
|
: (">> "));
|
||||||
|
|
||||||
std::string input;
|
std::string input;
|
||||||
std::cin >> input;
|
std::getline(std::cin, input, '\n');
|
||||||
std::cout << "\n";
|
std::cout << "\n";
|
||||||
|
|
||||||
std::transform(input.begin(), input.end(), input.begin(),
|
std::transform(input.begin(), input.end(), input.begin(),
|
||||||
[](unsigned char c){ return std::tolower(c); });
|
[](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")
|
if (input == "inventory")
|
||||||
{
|
{
|
||||||
|
readyItem(nullptr);
|
||||||
std::cout << showInventory() << "\n\n";
|
std::cout << showInventory() << "\n\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -68,6 +78,16 @@ bool Player::hasItem(const std::shared_ptr<Item>& item) const
|
||||||
return std::find(_inventory.begin(), _inventory.end(), item) != _inventory.end();
|
return std::find(_inventory.begin(), _inventory.end(), item) != _inventory.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Player::readyItem(const std::shared_ptr<Item>& item)
|
||||||
|
{
|
||||||
|
_ready_item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Player::isItemReady(const std::shared_ptr<Item>& item) const
|
||||||
|
{
|
||||||
|
return item == _ready_item;
|
||||||
|
}
|
||||||
|
|
||||||
std::string Player::showInventory() const
|
std::string Player::showInventory() const
|
||||||
{
|
{
|
||||||
if (_inventory.empty())
|
if (_inventory.empty())
|
||||||
|
@ -87,3 +107,15 @@ std::string Player::showInventory() const
|
||||||
|
|
||||||
return 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -15,9 +15,12 @@ public:
|
||||||
virtual void giveItem(const std::shared_ptr<Item>& item) override;
|
virtual void giveItem(const std::shared_ptr<Item>& item) override;
|
||||||
virtual void useItem(const std::shared_ptr<Item>& item) override;
|
virtual void useItem(const std::shared_ptr<Item>& item) override;
|
||||||
virtual bool hasItem(const std::shared_ptr<Item>& item) const override;
|
virtual bool hasItem(const std::shared_ptr<Item>& item) const override;
|
||||||
|
virtual void readyItem(const std::shared_ptr<Item>& item) override;
|
||||||
|
virtual bool isItemReady(const std::shared_ptr<Item>& item) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string showInventory() const;
|
std::string showInventory() const;
|
||||||
|
void findItemToReady(const std::string &label);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PLAYER_H
|
#endif // PLAYER_H
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
#include "changeinteractionmessagemodificator.h"
|
||||||
|
#include "location.h"
|
||||||
|
|
||||||
|
ChangeInteractionMessageModificator::ChangeInteractionMessageModificator()
|
||||||
|
{}
|
||||||
|
|
||||||
|
ChangeInteractionMessageModificator::~ChangeInteractionMessageModificator()
|
||||||
|
{}
|
||||||
|
|
||||||
|
void ChangeInteractionMessageModificator::run() const
|
||||||
|
{
|
||||||
|
_location->setInteractionMessage(_new_message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChangeInteractionMessageModificator::setDependentObjects(const std::shared_ptr<Location> &location,
|
||||||
|
const std::string &new_message)
|
||||||
|
{
|
||||||
|
_location = location;
|
||||||
|
_new_message = new_message;
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
#ifndef CHANGEINTERACTIONMESSAGEMODIFICATOR_H
|
||||||
|
#define CHANGEINTERACTIONMESSAGEMODIFICATOR_H
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "modificator.h"
|
||||||
|
|
||||||
|
class Location;
|
||||||
|
|
||||||
|
class ChangeInteractionMessageModificator : public Modificator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit ChangeInteractionMessageModificator();
|
||||||
|
virtual ~ChangeInteractionMessageModificator() override;
|
||||||
|
|
||||||
|
virtual void run() const override;
|
||||||
|
|
||||||
|
void setDependentObjects(const std::shared_ptr<Location>& location,
|
||||||
|
const std::string& new_message);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<Location> _location;
|
||||||
|
std::string _new_message;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CHANGEINTERACTIONMESSAGEMODIFICATOR_H
|
|
@ -10,14 +10,11 @@ RemoveControllersModificator::~RemoveControllersModificator()
|
||||||
void RemoveControllersModificator::run() const
|
void RemoveControllersModificator::run() const
|
||||||
{
|
{
|
||||||
_location->removeControllers(_controllers_to_remove);
|
_location->removeControllers(_controllers_to_remove);
|
||||||
_location->setInteractionMessage(_new_location_message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoveControllersModificator::setDependentObjects(const std::shared_ptr<Location>& location,
|
void RemoveControllersModificator::setDependentObjects(const std::shared_ptr<Location>& location,
|
||||||
const std::list<std::shared_ptr<Controller>>& controllers,
|
const std::list<std::shared_ptr<Controller>>& controllers)
|
||||||
const std::string& new_message)
|
|
||||||
{
|
{
|
||||||
_location = location;
|
_location = location;
|
||||||
_controllers_to_remove = controllers;
|
_controllers_to_remove = controllers;
|
||||||
_new_location_message = new_message;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,13 +19,11 @@ public:
|
||||||
virtual void run() const override;
|
virtual void run() const override;
|
||||||
|
|
||||||
void setDependentObjects(const std::shared_ptr<Location>& location,
|
void setDependentObjects(const std::shared_ptr<Location>& location,
|
||||||
const std::list<std::shared_ptr<Controller>>& controllers,
|
const std::list<std::shared_ptr<Controller>>& controllers);
|
||||||
const std::string& new_message);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Location> _location;
|
std::shared_ptr<Location> _location;
|
||||||
std::list<std::shared_ptr<Controller>> _controllers_to_remove;
|
std::list<std::shared_ptr<Controller>> _controllers_to_remove;
|
||||||
std::string _new_location_message;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // REMOVECONTROLLERSMODIFICATOR_H
|
#endif // REMOVECONTROLLERSMODIFICATOR_H
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#ifndef ITEMREQUIREDPOLICY_H
|
#ifndef ITEMREQUIREDPOLICY_H
|
||||||
#define ITEMREQUIREDPOLICY_H
|
#define ITEMREQUIREDPOLICY_H
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include "policy.h"
|
#include "policy.h"
|
||||||
|
|
||||||
class Item;
|
class Item;
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#ifndef LOCATIONREQUIREDPOLICY_H
|
#ifndef LOCATIONREQUIREDPOLICY_H
|
||||||
#define LOCATIONREQUIREDPOLICY_H
|
#define LOCATIONREQUIREDPOLICY_H
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include "policy.h"
|
#include "policy.h"
|
||||||
|
|
||||||
class Location;
|
class Location;
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
#include "readyitemrequiredpolicy.h"
|
||||||
|
#include "actor.h"
|
||||||
|
|
||||||
|
ReadyItemRequiredPolicy::ReadyItemRequiredPolicy(const std::string& satisfaction, const std::string& dissatisfaction) :
|
||||||
|
Policy(satisfaction, dissatisfaction)
|
||||||
|
{}
|
||||||
|
|
||||||
|
ReadyItemRequiredPolicy::~ReadyItemRequiredPolicy()
|
||||||
|
{}
|
||||||
|
|
||||||
|
Policy::CheckResult ReadyItemRequiredPolicy::check(const std::shared_ptr<Actor>& actor) const
|
||||||
|
{
|
||||||
|
bool success = actor->isItemReady(_item);
|
||||||
|
return composeMessageFromResult(success);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReadyItemRequiredPolicy::setRequiredReadyItem(const std::shared_ptr<Item> &item)
|
||||||
|
{
|
||||||
|
_item = item;
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
#ifndef READYITEMREQUIREDPOLICY_H
|
||||||
|
#define READYITEMREQUIREDPOLICY_H
|
||||||
|
|
||||||
|
#include "policy.h"
|
||||||
|
|
||||||
|
class Item;
|
||||||
|
|
||||||
|
class ReadyItemRequiredPolicy : public Policy
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit ReadyItemRequiredPolicy(const std::string& satisfaction, const std::string& dissatisfaction);
|
||||||
|
virtual ~ReadyItemRequiredPolicy() override;
|
||||||
|
|
||||||
|
virtual Policy::CheckResult check(const std::shared_ptr<Actor>& actor) const override;
|
||||||
|
|
||||||
|
void setRequiredReadyItem(const std::shared_ptr<Item>& item);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<Item> _item;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // READYITEMREQUIREDPOLICY_H
|
|
@ -4,8 +4,11 @@
|
||||||
#include "locationcontroller.h"
|
#include "locationcontroller.h"
|
||||||
#include "itemcontroller.h"
|
#include "itemcontroller.h"
|
||||||
#include "itemrequiredpolicy.h"
|
#include "itemrequiredpolicy.h"
|
||||||
|
#include "readyitemrequiredpolicy.h"
|
||||||
#include "allpoliciesvalidator.h"
|
#include "allpoliciesvalidator.h"
|
||||||
#include "removecontrollersmodificator.h"
|
#include "removecontrollersmodificator.h"
|
||||||
|
#include "changeinteractionmessagemodificator.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
SandboxLevelBuilder::SandboxLevelBuilder()
|
SandboxLevelBuilder::SandboxLevelBuilder()
|
||||||
|
@ -43,7 +46,7 @@ void SandboxLevelBuilder::init()
|
||||||
// PLEROMAN CONTROLLER
|
// PLEROMAN CONTROLLER
|
||||||
Controller::Initializer pleroman_init = {{"pleroman"}, "You talk to a pleroma user! What a happy and carefree creature. He even brew you some cofe!"};
|
Controller::Initializer pleroman_init = {{"pleroman"}, "You talk to a pleroma user! What a happy and carefree creature. He even brew you some cofe!"};
|
||||||
std::shared_ptr<LocationController> pleroman_cont = std::make_shared<LocationController>(std::move(pleroman_init));
|
std::shared_ptr<LocationController> pleroman_cont = std::make_shared<LocationController>(std::move(pleroman_init));
|
||||||
std::shared_ptr<ItemRequiredPolicy> need_tenshi_policy = std::make_shared<ItemRequiredPolicy>("You give him the postcard of Tenshi.", "He doesn't want to talk to you. Make him trust you!!");
|
std::shared_ptr<ReadyItemRequiredPolicy> need_tenshi_policy = std::make_shared<ReadyItemRequiredPolicy>("You give him the postcard of Tenshi.", "He doesn't want to talk to you. Make him trust you!!");
|
||||||
std::shared_ptr<AllPoliciesValidator> pleroman_validator = std::make_shared<AllPoliciesValidator>(std::list<std::shared_ptr<Policy>>{need_tenshi_policy});
|
std::shared_ptr<AllPoliciesValidator> pleroman_validator = std::make_shared<AllPoliciesValidator>(std::list<std::shared_ptr<Policy>>{need_tenshi_policy});
|
||||||
pleroman_cont->setValidator(pleroman_validator);
|
pleroman_cont->setValidator(pleroman_validator);
|
||||||
|
|
||||||
|
@ -69,15 +72,23 @@ void SandboxLevelBuilder::init()
|
||||||
|
|
||||||
// PLEROMAN LOCATION
|
// PLEROMAN LOCATION
|
||||||
auto&& pleroman_msg = ". . . \n\n From the conversation you find out the quest is still in a very raw test state, the engine isn't even finished... Alright, just terminate the game process.";
|
auto&& pleroman_msg = ". . . \n\n From the conversation you find out the quest is still in a very raw test state, the engine isn't even finished... Alright, just terminate the game process.";
|
||||||
Location::Initializer pleromanloc_init = {pleroman_msg, {}};
|
Location::Initializer pleromanloc_init = {pleroman_msg, {table_cont, couch_cont}};
|
||||||
std::shared_ptr<Location> pleroman = std::make_shared<Location>(std::move(pleromanloc_init));
|
std::shared_ptr<Location> pleroman = std::make_shared<Location>(std::move(pleromanloc_init));
|
||||||
|
|
||||||
std::shared_ptr<Item> tenshi = std::make_shared<Item>("Postcard of Tenshi eating corndog");
|
// TENSHI POSTCARD ITEM
|
||||||
need_tenshi_policy->setRequiredItem(tenshi);
|
std::shared_ptr<Item> tenshi = std::make_shared<Item>("postcard of tenshi eating corndog");
|
||||||
|
need_tenshi_policy->setRequiredReadyItem(tenshi);
|
||||||
|
|
||||||
|
// WHAT HAPPENS WHEN YOU PICK TENSHI
|
||||||
std::shared_ptr<RemoveControllersModificator> remove_tenshi_modif = std::make_shared<RemoveControllersModificator>();
|
std::shared_ptr<RemoveControllersModificator> remove_tenshi_modif = std::make_shared<RemoveControllersModificator>();
|
||||||
remove_tenshi_modif->setDependentObjects(table, {tenshi_cont}, "Boring table.");
|
remove_tenshi_modif->setDependentObjects(table, {tenshi_cont});
|
||||||
tenshi_cont->setModificators({remove_tenshi_modif});
|
std::shared_ptr<ChangeInteractionMessageModificator> change_table_desc_modif = std::make_shared<ChangeInteractionMessageModificator>();
|
||||||
|
change_table_desc_modif->setDependentObjects(table, "Boring table.");
|
||||||
|
tenshi_cont->setModificators({remove_tenshi_modif, change_table_desc_modif});
|
||||||
|
|
||||||
|
std::shared_ptr<ChangeInteractionMessageModificator> change_pleroman_desc_modif = std::make_shared<ChangeInteractionMessageModificator>();
|
||||||
|
change_pleroman_desc_modif->setDependentObjects(pleroman, "He is happy.");
|
||||||
|
pleroman_cont->setModificators({change_pleroman_desc_modif});
|
||||||
|
|
||||||
the_first_and_only_trigger->setDependentLocation(start);
|
the_first_and_only_trigger->setDependentLocation(start);
|
||||||
door_cont->setDependentLocation(room);
|
door_cont->setDependentLocation(room);
|
||||||
|
|
Loading…
Reference in New Issue