forked from miki151/keeperrl
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcollective_builder.cpp
More file actions
99 lines (89 loc) · 2.71 KB
/
collective_builder.cpp
File metadata and controls
99 lines (89 loc) · 2.71 KB
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
#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"
CollectiveBuilder::CollectiveBuilder(const CollectiveConfig& cfg, TribeId t)
: config(cfg), tribe(t) {
}
CollectiveBuilder& CollectiveBuilder::setLevel(WLevel l) {
level = l;
return *this;
}
CollectiveBuilder& CollectiveBuilder::setLocationName(const string& n) {
locationName = n;
return *this;
}
CollectiveBuilder& CollectiveBuilder::setRaceName(const string& n) {
raceName = n;
return *this;
}
CollectiveBuilder&CollectiveBuilder::setAnonymous() {
anonymous = true;
return *this;
}
CollectiveBuilder& CollectiveBuilder::addCreature(WCreature c) {
if (!c->getAttributes().isInnocent() && (!creatures.empty() || config->isLeaderFighter()))
creatures.push_back({c, {MinionTrait::FIGHTER}});
else
creatures.push_back({c, {}});
return *this;
}
CollectiveBuilder& CollectiveBuilder::addArea(Rectangle v) {
append(squares, v.getAllSquares());
if (!centralPoint) // If it's already set, just leave it as the center of the first added area.
centralPoint = v.middle();
return *this;
}
optional<CollectiveName> CollectiveBuilder::generateName() {
if (!creatures.empty() && !anonymous) {
CollectiveName ret;
auto leader = creatures[0].creature;
if (locationName && raceName)
ret.full = capitalFirst(*raceName) + " of " + *locationName;
else if (auto first = 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;
else
ret.shortened = leader->getName().first().value_or(leader->getName().bare());
if (raceName)
ret.race = *raceName;
else
ret.race = leader->getName().stack();
return ret;
} else
return none;
}
PCollective CollectiveBuilder::build() {
CHECK(level);
auto c = Collective::create(level, *tribe, generateName());
Immigration im(c.get());
c->init(std::move(*config), std::move(im));
c->setControl(CollectiveControl::idle(c.get()));
for (auto& elem : creatures)
c->addCreature(elem.creature, elem.traits);
for (Vec2 v : squares) {
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();
}