1010#include " Player.h"
1111
1212#include < algorithm>
13+ #include < map>
14+ #include < utility>
15+ #include < stdexcept>
16+ #include < functional>
17+ #include < iostream>
1318
1419#include " DevelopmentCard.h"
1520
21+ using tinyxml2::XMLElement;
22+ using std::map;
23+ using std::make_pair;
24+ using std::runtime_error;
1625
1726Player::Player (std::string playerName) : name(playerName)
1827{
@@ -24,6 +33,31 @@ Player::Player(std::string playerName) : name(playerName)
2433 }
2534}
2635
36+ Player::Player (XMLElement* elem)
37+ {
38+ name = elem->FirstChildElement (" name" )->FirstChild ()->Value ();
39+ setWood (fromString<int >(elem->FirstChildElement (" wood" )->FirstChild ()->Value ()));
40+ setBrick (fromString<int >(elem->FirstChildElement (" brick" )->FirstChild ()->Value ()));
41+ setOre (fromString<int >(elem->FirstChildElement (" ore" )->FirstChild ()->Value ()));
42+ setWheat (fromString<int >(elem->FirstChildElement (" wheat" )->FirstChild ()->Value ()));
43+ setWool (fromString<int >(elem->FirstChildElement (" wool" )->FirstChild ()->Value ()));
44+ XMLElement* cardsElement = elem->FirstChildElement (" cards" );
45+ for (auto cardElem = cardsElement->FirstChildElement (" card" ); cardElem; cardElem = cardElem->NextSiblingElement (" card" )) {
46+ static const map<std::string, std::function<std::unique_ptr<DevelopmentCard>(void )>> typeToCard = {
47+ std::pair<std::string, std::function<std::unique_ptr<DevelopmentCard>(void )>>(" knight" , [this ]() -> std::unique_ptr<DevelopmentCard> { return std::unique_ptr<DevelopmentCard>(new KnightCard (this )); }),
48+ std::pair<std::string, std::function<std::unique_ptr<DevelopmentCard>(void )>>(" victorypoint" , [this ]() -> std::unique_ptr<DevelopmentCard> { return std::unique_ptr<DevelopmentCard>(new VictoryPointCard (this )); }),
49+ std::pair<std::string, std::function<std::unique_ptr<DevelopmentCard>(void )>>(" yearofplenty" , [this ]() -> std::unique_ptr<DevelopmentCard> { return std::unique_ptr<DevelopmentCard>(new YearOfPlentyCard (this )); }),
50+ std::pair<std::string, std::function<std::unique_ptr<DevelopmentCard>(void )>>(" monopoly" , [this ]() -> std::unique_ptr<DevelopmentCard> { return std::unique_ptr<DevelopmentCard>(new MonopolyCard (this )); }),
51+ std::pair<std::string, std::function<std::unique_ptr<DevelopmentCard>(void )>>(" roadbuilding" , [this ]() -> std::unique_ptr<DevelopmentCard> { return std::unique_ptr<DevelopmentCard>(new RoadBuildingCard (this )); }),
52+ };
53+ auto typeIt = typeToCard.find (std::string (cardElem->FirstChildElement (" type" )->FirstChild ()->Value ()));
54+ if (typeIt == typeToCard.end ()) {
55+ throw runtime_error (" Invalid card type" );
56+ }
57+ developmentCards.emplace_back (typeIt->second ());
58+ }
59+ }
60+
2761Player::~Player () {
2862
2963}
@@ -46,27 +80,27 @@ int Player::getVictoryPoints()
4680}
4781
4882
49- void Player::buyCard (DevelopmentCard * card)
83+ void Player::buyCard (std::unique_ptr< DevelopmentCard> card)
5084{
51- developmentCards.push_back (card);
85+ developmentCards.push_back (std::move ( card) );
5286}
5387
5488void Player::playCard (DevelopmentCard *card)
5589{
56- if (std::find (developmentCards.begin (), developmentCards.end (), card) == developmentCards.end ()) {
90+ auto cardTester = [card](std::unique_ptr<DevelopmentCard>& test) -> bool { return card == test.get (); };
91+ if (!std::any_of (developmentCards.begin (), developmentCards.end (), cardTester)) {
5792 return ;
5893 }
5994 card->playCard ();
60- if (card->getType () == KNIGHT)
95+ if (card->getType () == KNIGHT) {
6196 armySize++;
97+ }
6298
63- developmentCards.erase (std::remove (developmentCards.begin (), developmentCards.end (), card), developmentCards.end ());
64-
99+ std::remove_if (developmentCards.begin (), developmentCards.end (), cardTester);
65100}
66101
67102
68103
69-
70104int Player::getWood () const
71105{
72106 return resources[0 ];
@@ -126,9 +160,21 @@ std::string Player::getName() const
126160
127161void Player::accept (GameVisitor& visitor) {
128162 visitor.visit (*this );
163+ for (auto & card : developmentCards) {
164+ card->accept (visitor);
165+ }
129166}
130167
131168bool Player::operator ==(const Player& player) const {
169+ if (developmentCards.size () != player.developmentCards .size ()) {
170+ return false ;
171+ }
172+ for (std::size_t i = 0 ; i < developmentCards.size (); i++) {
173+ if ((*developmentCards[i]) == (*player.developmentCards [i])) {}
174+ else {
175+ return false ;
176+ }
177+ }
132178 return getName () == player.getName () &&
133179 getWood () == player.getWood () &&
134180 getBrick () == player.getBrick () &&
0 commit comments