-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathProperty.cc
129 lines (102 loc) · 3.39 KB
/
Property.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "Property.h"
Property::Property(std::string name, int position, std::shared_ptr<Player> owner,
unsigned int p, std::string monopoly) : Building(name, position), owner{owner}, purchaseCost{p}, monopoly{monopoly}, mortgage{false} {}
bool Property::Mortgage() {
return mortgage;
}
void Property::setMortgage(bool m) {
mortgage = m;
}
Property::~Property() {}
std::shared_ptr<Player> Property::getOwner() {
return owner;
}
void Property::setOwner(std::shared_ptr<Player> p) {
owner = p;
}
unsigned int Property::getPurchaseCost() {
return purchaseCost;
}
std::string Property::getMonopoly() {
return monopoly;
}
Gym::Gym(std::string name, int position, std::shared_ptr<Player> owner) : Property(name, position, owner, 150, "Gym") {}
unsigned int Gym::getFee(Player & p) {
unsigned int diceSum = p.roll() + p.roll();
if (this->getOwner()->getProperties("Gym") == 1) {
return diceSum * 4;
} else {
return diceSum * 10;
}
}
void Gym::accept(Player & p) {
if (this->getOwner() == nullptr) {
throw NoOwner("This property has no owner yet!");
}
if (this->getOwner()->getName() != p.getName() && !Mortgage()) {
unsigned int fee = getFee(p);
p.giveMoney(this->getOwner(), fee);
}
}
Residence::Residence(std::string name, int position, std::shared_ptr<Player> owner) : Property(name, position, owner, 200, "Residence") {}
unsigned int Residence::getRent() {
unsigned int residence = this->getOwner()->getProperties("Residence");
if (residence == 1) {
return 25;
} else if (residence == 2) {
return 50;
} else if (residence == 3) {
return 100;
} else if (residence == 4) {
return 200;
} else {
return 0;
}
}
void Residence::accept(Player & p) {
if (this->getOwner() == nullptr) {
throw NoOwner("This property has no owner yet!");
}
if (this->getOwner()->getName() != p.getName() && !Mortgage()) {
unsigned int rent = getRent();
p.giveMoney(this->getOwner(), rent);
}
}
Academic::Academic(std::string name, int position, std::shared_ptr<Player> owner,
std::string monopoly, unsigned int p, unsigned int improvementCost,
std::vector<unsigned int> tuition) : Property(name, position, owner, p, monopoly), improvement{0}, improvementCost{improvementCost}, tuition{tuition} {}
unsigned int Academic::getImprovement() {
return improvement;
}
unsigned int Academic::getImprovementCost() {
return improvementCost;
}
unsigned int Academic::getTuition() {
int fee = tuition[improvement];
if ((improvement == 0) && (this->getOwner()->hasFullMonopoly(this->getMonopoly()))) {
return 2 * fee;
} else {
return fee;
}
}
void Academic::improve(std::string s) {
if ((s == "buy") && (improvement < 5)) {
improvement++;
} else if ((s == "sell") && (improvement > 0)) {
improvement--;
} else {
throw ImprovementException("invalid improvement command!");
}
}
void Academic::setImprovement(int improve) {
improvement = improve;
}
void Academic::accept(Player & p) {
if (this->getOwner() == nullptr) {
throw NoOwner("This property has no owner yet!");
}
if (this->getOwner()->getName() != p.getName() && !Mortgage()) {
unsigned int tuition = getTuition();
p.giveMoney(this->getOwner(), tuition);
}
}