Skip to content

Commit a5db57f

Browse files
committed
Implemented player serialization (not cards)
1 parent cee3f43 commit a5db57f

File tree

4 files changed

+105
-13
lines changed

4 files changed

+105
-13
lines changed

include/Player.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include <vector>
1414
#include <string>
1515

16+
#include "GameVisitor.h"
17+
1618
//#include "DevelopmentCard.h"
1719

1820

@@ -48,11 +50,11 @@ class Player {
4850
void buyCard(DevelopmentCard* card);
4951
void playCard(DevelopmentCard* card);
5052

51-
int getWood();
52-
int getBrick();
53-
int getOre();
54-
int getWheat();
55-
int getWool();
53+
int getWood() const;
54+
int getBrick() const;
55+
int getOre() const;
56+
int getWheat() const;
57+
int getWool() const;
5658

5759
void setWood(int resource);
5860
void setBrick(int resource);
@@ -62,6 +64,7 @@ class Player {
6264

6365
std::string getName() const;
6466

67+
void accept(GameVisitor& visitor);
6568
bool operator==(const Player& player) const;
6669
};
6770

src/GameBoard.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ GameBoard::GameBoard(istream& in) {
3636

3737
auto hexTiles = doc.RootElement()->FirstChildElement("tiles");
3838

39-
for(tinyxml2::XMLElement* tileElement = hexTiles->FirstChildElement(); tileElement; tileElement = tileElement->NextSiblingElement()) {
39+
for(auto tileElement = hexTiles->FirstChildElement(); tileElement; tileElement = tileElement->NextSiblingElement()) {
4040
static const map<std::string, resourceType> textToType = {
4141
std::make_pair("wheat", WHEAT),
4242
std::make_pair("sheep", SHEEP),
@@ -58,6 +58,18 @@ GameBoard::GameBoard(istream& in) {
5858

5959
resources[coord] = unique_ptr<ResourceTile>(new ResourceTile(*this, coord, type, diceValue));
6060
}
61+
62+
auto playerElements = doc.RootElement()->FirstChildElement("players");
63+
64+
for(auto playerElement = playerElements->FirstChildElement(); playerElement; playerElement = playerElement->NextSiblingElement()) {
65+
unique_ptr<Player> player(new Player(playerElement->FirstChildElement("name")->FirstChild()->Value()));
66+
player->setWood(fromString<int>(playerElement->FirstChildElement("wood")->FirstChild()->Value()));
67+
player->setBrick(fromString<int>(playerElement->FirstChildElement("brick")->FirstChild()->Value()));
68+
player->setOre(fromString<int>(playerElement->FirstChildElement("ore")->FirstChild()->Value()));
69+
player->setWheat(fromString<int>(playerElement->FirstChildElement("wheat")->FirstChild()->Value()));
70+
player->setWool(fromString<int>(playerElement->FirstChildElement("wool")->FirstChild()->Value()));
71+
players.emplace_back(std::move(player));
72+
}
6173
}
6274

6375
GameBoard::~GameBoard() {
@@ -142,6 +154,9 @@ void GameBoard::accept(GameVisitor& visitor) {
142154
for(auto& it : roads) {
143155
it->accept(visitor);
144156
}
157+
for(auto& it : players) {
158+
it->accept(visitor);
159+
}
145160
visitor.visit(*this);
146161
}
147162

@@ -178,6 +193,14 @@ bool GameBoard::operator==(const GameBoard& other) const {
178193
return false;
179194
}
180195
}
196+
if(players.size() != other.players.size()) {
197+
return false;
198+
}
199+
for(unsigned int i = 0; i < players.size(); i++) {
200+
if(!(*(players[i]) == *(other.players[i]))) {
201+
return false;
202+
}
203+
}
181204
return true;
182205
}
183206

src/Player.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@
1414
#include "DevelopmentCard.h"
1515

1616

17-
Player::Player(std::string playerName)
17+
Player::Player(std::string playerName) : name(playerName)
1818
{
1919
armySize = 0;
2020
longestRoad = 0;
2121
victoryPoints = 0;
22+
for(auto& r : resources) {
23+
r = 0;
24+
}
2225
}
2326

2427
Player::~Player() {
@@ -64,27 +67,27 @@ void Player::playCard(DevelopmentCard *card)
6467

6568

6669

67-
int Player::getWood()
70+
int Player::getWood() const
6871
{
6972
return resources[0];
7073
}
7174

72-
int Player::getBrick()
75+
int Player::getBrick() const
7376
{
7477
return resources[1];
7578
}
7679

77-
int Player::getOre()
80+
int Player::getOre() const
7881
{
7982
return resources[2];
8083
}
8184

82-
int Player::getWheat()
85+
int Player::getWheat() const
8386
{
8487
return resources[3];
8588
}
8689

87-
int Player::getWool()
90+
int Player::getWool() const
8891
{
8992
return resources[4];
9093
}
@@ -121,6 +124,15 @@ std::string Player::getName() const
121124
return name;
122125
}
123126

127+
void Player::accept(GameVisitor& visitor) {
128+
visitor.visit(*this);
129+
}
130+
124131
bool Player::operator==(const Player& player) const {
125-
return getName() == player.getName();
132+
return getName() == player.getName() &&
133+
getWood() == player.getWood() &&
134+
getBrick() == player.getBrick() &&
135+
getOre() == player.getOre() &&
136+
getWheat() == player.getWheat() &&
137+
getWool() == player.getWool();
126138
}

src/Serialization.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,69 @@ void XMLVisitor::visit(Road& road) {
5353
}
5454

5555
void XMLVisitor::visit(Settlement& settlement) {
56+
if(!xmldoc.RootElement()->FirstChildElement("settlements")) {
57+
xmldoc.RootElement()->InsertEndChild(xmldoc.NewElement("settlements"));
58+
}
59+
XMLElement* settlementsElement = xmldoc.RootElement()->FirstChildElement("settlements");
60+
XMLElement* newSettlementElement = xmldoc.NewElement("settlement");
61+
62+
XMLElement* ownerElement = xmldoc.NewElement("owner");
63+
ownerElement->InsertEndChild(xmldoc.NewText(settlement.getOwner().getName().c_str()));
64+
newSettlementElement->InsertEndChild(ownerElement);
65+
66+
newSettlementElement->InsertEndChild(coordinateElement(settlement.getLocation()));
5667

68+
settlementsElement->InsertEndChild(newSettlementElement);
5769
}
5870

5971
void XMLVisitor::visit(City& city) {
72+
if(!xmldoc.RootElement()->FirstChildElement("cities")) {
73+
xmldoc.RootElement()->InsertEndChild(xmldoc.NewElement("cities"));
74+
}
75+
XMLElement* citiesElement = xmldoc.RootElement()->FirstChildElement("cities");
76+
XMLElement* newCityElement = xmldoc.NewElement("city");
77+
78+
XMLElement* ownerElement = xmldoc.NewElement("owner");
79+
ownerElement->InsertEndChild(xmldoc.NewText(city.getOwner().getName().c_str()));
80+
newCityElement->InsertEndChild(ownerElement);
81+
82+
newCityElement->InsertEndChild(coordinateElement(city.getLocation()));
6083

84+
citiesElement->InsertEndChild(newCityElement);
6185
}
6286

6387
void XMLVisitor::visit(Player& player) {
88+
if(!xmldoc.RootElement()->FirstChildElement("players")) {
89+
xmldoc.RootElement()->InsertEndChild(xmldoc.NewElement("players"));
90+
}
91+
XMLElement* playersElement = xmldoc.RootElement()->FirstChildElement("players");
92+
XMLElement* newPlayerElement = xmldoc.NewElement("player");
93+
94+
XMLElement* nameElement = xmldoc.NewElement("name");
95+
nameElement->InsertEndChild(xmldoc.NewText(player.getName().c_str()));
96+
newPlayerElement->InsertEndChild(nameElement);
97+
98+
XMLElement* woodElement = xmldoc.NewElement("wood");
99+
woodElement->InsertEndChild(xmldoc.NewText(toString(player.getWood()).c_str()));
100+
newPlayerElement->InsertEndChild(woodElement);
101+
102+
XMLElement* brickElement = xmldoc.NewElement("brick");
103+
brickElement->InsertEndChild(xmldoc.NewText(toString(player.getBrick()).c_str()));
104+
newPlayerElement->InsertEndChild(brickElement);
105+
106+
XMLElement* oreElement = xmldoc.NewElement("ore");
107+
oreElement->InsertEndChild(xmldoc.NewText(toString(player.getOre()).c_str()));
108+
newPlayerElement->InsertEndChild(oreElement);
109+
110+
XMLElement* wheatElement = xmldoc.NewElement("wheat");
111+
wheatElement->InsertEndChild(xmldoc.NewText(toString(player.getWheat()).c_str()));
112+
newPlayerElement->InsertEndChild(wheatElement);
113+
114+
XMLElement* woolElement = xmldoc.NewElement("wool");
115+
woolElement->InsertEndChild(xmldoc.NewText(toString(player.getWool()).c_str()));
116+
newPlayerElement->InsertEndChild(woolElement);
64117

118+
playersElement->InsertEndChild(newPlayerElement);
65119
}
66120

67121
void XMLVisitor::visit(ResourceTile& tile) {

0 commit comments

Comments
 (0)