-
-
Notifications
You must be signed in to change notification settings - Fork 113
/
Copy pathmovement_set.cpp
86 lines (71 loc) · 2.25 KB
/
movement_set.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
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
#include "stdafx.h"
#include "movement_set.h"
#include "movement_type.h"
#include "tribe.h"
template <class Archive>
void MovementSet::serialize(Archive& ar, const unsigned int version) {
ar(OPTION(traits), OPTION(forcibleTraits), OPTION(blockingPrisoners), OPTION(blockingFarmAnimals), OPTION(blockingEnemies), SKIP(tribe));
}
SERIALIZABLE(MovementSet);
SERIALIZATION_CONSTRUCTOR_IMPL(MovementSet)
MovementSet::MovementSet(TribeId id) : tribe(id) {
}
bool MovementSet::canEnter(const MovementType& movementType, bool covered, bool onFire,
const optional<TribeId>& forbidden) const {
if (blockingEnemies && !movementType.isCompatible(tribe))
return false;
if (!movementType.isForced()) {
if ((blockingPrisoners && movementType.isPrisoner()) ||
(blockingFarmAnimals && movementType.isFarmAnimal()) ||
(!covered && movementType.isSunlightVulnerable()) ||
(onFire && !movementType.isFireResistant()) ||
(forbidden && movementType.isCompatible(*forbidden)))
return false;
}
EnumSet<MovementTrait> rightTraits(traits);
if (movementType.isForced())
rightTraits = rightTraits.sum(forcibleTraits);
for (auto trait : rightTraits)
if (movementType.hasTrait(trait))
return true;
return false;
}
bool MovementSet::canEnter(const MovementType& t) const {
return canEnter(t, true, false, none);
}
bool MovementSet::hasTrait(MovementTrait trait) const {
return traits.contains(trait);
}
bool MovementSet::blocksPrisoners() const {
return blockingPrisoners;
}
MovementSet& MovementSet::addTrait(MovementTrait trait) {
traits.insert(trait);
return *this;
}
MovementSet& MovementSet::removeTrait(MovementTrait trait) {
traits.erase(trait);
return *this;
}
MovementSet& MovementSet::addForcibleTrait(MovementTrait trait) {
forcibleTraits.insert(trait);
return *this;
}
MovementSet& MovementSet::setBlockingEnemies() {
blockingEnemies = true;
return *this;
}
TribeId MovementSet::getTribe() const {
return tribe;
}
void MovementSet::setTribe(TribeId id) {
tribe = id;
}
MovementSet& MovementSet::clearTraits() {
traits.clear();
forcibleTraits.clear();
blockingEnemies = false;
return *this;
}
#include "pretty_archive.h"
template void MovementSet::serialize(PrettyInputArchive&, unsigned);