forked from miki151/keeperrl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcollective_builder.cpp
119 lines (105 loc) · 3.27 KB
/
collective_builder.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
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
#include "stdafx.h"
#include "collective_builder.h"
#include "collective.h"
#include "creature.h"
#include "creature_name.h"
#include "collective_name.h"
#include "creature_attributes.h"
#include "collective_config.h"
#include "tribe.h"
#include "collective_control.h"
#include "immigration.h"
#include "territory.h"
#include "view_object.h"
#include "level.h"
CollectiveBuilder::CollectiveBuilder(const CollectiveConfig& cfg, TribeId t, string enemyId)
: enemyId(enemyId), config(cfg), tribe(t) {
}
CollectiveBuilder& CollectiveBuilder::setLevel(Level* l) {
level = l;
return *this;
}
CollectiveBuilder& CollectiveBuilder::setModel(Model* m) {
model = m;
return *this;
}
CollectiveBuilder& CollectiveBuilder::setLocationName(const string& n) {
locationName = n;
return *this;
}
CollectiveBuilder& CollectiveBuilder::setRaceName(const string& n) {
raceName = n;
return *this;
}
CollectiveBuilder& CollectiveBuilder::setDiscoverable() {
discoverable = true;
return *this;
}
TribeId CollectiveBuilder::getTribe() {
return *tribe;
}
CollectiveBuilder& CollectiveBuilder::addCreature(Creature* c, EnumSet<MinionTrait> traits) {
creatures.push_back({c, traits});
return *this;
}
bool CollectiveBuilder::hasCentralPoint() {
return !!centralPoint;
}
void CollectiveBuilder::setCentralPoint(Vec2 pos) {
centralPoint = pos;
}
CollectiveBuilder& CollectiveBuilder::addArea(const vector<Vec2>& v) {
append(squares, v);
return *this;
}
optional<CollectiveName> CollectiveBuilder::generateName() const {
if (!creatures.empty()) {
CollectiveName ret;
auto leader = creatures[0].creature;
ret.viewId = leader->getViewIdWithWeapon();
if (locationName && raceName)
ret.full = capitalFirst(*raceName) + " of " + *locationName;
else if (!!leader->getName().first())
ret.full = leader->getName().title();
else if (raceName)
ret.full = capitalFirst(*raceName);
else
ret.full = leader->getName().title();
if (locationName) {
ret.shortened = *locationName;
ret.location = *locationName;
} else if (auto leaderName = leader->getName().first())
ret.shortened = *leaderName;
else
ret.shortened = leader->getName().bare();
if (raceName)
ret.race = *raceName;
else
ret.race = leader->getName().stack();
return ret;
} else
return none;
}
PCollective CollectiveBuilder::build(const ContentFactory* contentFactory) const {
auto name = generateName();
CHECK(model || level) << EnumInfo<TribeId::KeyType>::getString(tribe->getKey()) << " " << (name ? name->full : "no name");
auto c = Collective::create(!!model ? model : level->getModel(), *tribe, std::move(name), discoverable, contentFactory);
c->init(std::move(*config));
c->setControl(CollectiveControl::idle(c.get()));
for (auto& elem : creatures)
c->addCreature(elem.creature, elem.traits);
//CHECK(wasLeader || creatures.empty()) << "No leader added to collective " << c->getName()->full;
for (Vec2 v : squares) {
CHECK(level);
Position pos(v, level);
c->addKnownTile(pos);
//if (c->canClaimSquare(pos))
c->claimSquare(pos);
}
if (centralPoint)
c->getTerritory().setCentralPoint(Position(*centralPoint, level));
return c;
}
bool CollectiveBuilder::hasCreatures() const {
return !creatures.empty();
}