-
Notifications
You must be signed in to change notification settings - Fork 0
/
Card.cpp
50 lines (40 loc) · 1.33 KB
/
Card.cpp
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
#include "Card.hpp"
#include "Player.hpp"
#include "Utility.hpp"
using namespace std;
Card::Card(const string name,
Color color,
const vector<Produce> cost,
const vector<string> chainNames,
const function<vector<Produce> (const Player& p)> getProduce)
: name_{name},
color_{color},
cost_{cost},
chainNames_{chainNames},
getProduce_{getProduce}
{
}
vector<Produce> Card::getProduce(const Player& p) const {
return getProduce_(p);
}
vector<Pay> Card::canPlay(const Player& player) const {
vector<Card> cards = player.getCards();
// Make sure player doesn't already have this card
if (any_of(cards.begin(), cards.end(),
[this](const Card& c) { return c.getName() == name_; })) {
// If player already has card of the same name, we can't play it
return vector<Pay>{};
}
// Check for chains
// if any of the cards match any of our chain names
if(std::find_first_of(cards.begin(), cards.end(), chainNames_.begin(), chainNames_.end(),
[](const Card& c, const string& n){return c.getName() == n;}
) != cards.end()) {
return vector<Pay>{Pay{}};
}
return payForResources(player, cost_);
}
std::ostream& operator<< (std::ostream& o, const Card& c) {
o << c.getName();
return o;
}