forked from miki151/keeperrl
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathavatar_info.cpp
More file actions
135 lines (130 loc) · 5.53 KB
/
avatar_info.cpp
File metadata and controls
135 lines (130 loc) · 5.53 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
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
128
129
130
131
132
133
134
#include "stdafx.h"
#include "avatar_info.h"
#include "tribe.h"
#include "view.h"
#include "game_config.h"
#include "tribe_alignment.h"
#include "creature_factory.h"
#include "player_role.h"
#include "creature.h"
#include "view_object.h"
#include "creature_attributes.h"
#include "gender.h"
#include "creature_name.h"
#include "name_generator.h"
#include "name_generator_id.h"
#include "special_trait.h"
#include "content_factory.h"
#include "options.h"
static TribeId getPlayerTribeId(TribeAlignment variant) {
switch (variant) {
case TribeAlignment::EVIL:
return TribeId::getDarkKeeper();
case TribeAlignment::LAWFUL:
return TribeId::getAdventurer();
}
}
static vector<ViewId> getUpgradedViewId(const Creature* c) {
vector<ViewId> ret {c->getViewObject().id() };
for (auto& u : c->getAttributes().viewIdUpgrades)
ret.push_back(u);
return ret;
}
variant<AvatarInfo, AvatarMenuOption> getAvatarInfo(View* view, const vector<KeeperCreatureInfo>& keeperCreatureInfos,
const vector<AdventurerCreatureInfo>& adventurerCreatureInfos, ContentFactory* contentFactory) {
auto& creatureFactory = contentFactory->getCreatures();
auto keeperCreatures = keeperCreatureInfos.transform([&](auto& elem) {
return elem.creatureId.transform([&](auto& id) {
auto ret = creatureFactory.fromId(id, getPlayerTribeId(elem.tribeAlignment));
for (auto& trait : elem.specialTraits)
applySpecialTrait(0_global, trait, ret.get(), contentFactory);
return ret;
});
});
auto adventurerCreatures = adventurerCreatureInfos.transform([&](auto& elem) {
return elem.creatureId.transform([&](auto& id) {
return creatureFactory.fromId(id, getPlayerTribeId(elem.tribeAlignment));
});
});
vector<View::AvatarData> keeperAvatarData;
auto getAllNames = [&] (const PCreature& c) {
if (auto id = c->getName().getNameGenerator())
return creatureFactory.getNameGenerator()->getAll(*id);
else
return makeVec(c->getName().firstOrBare());
};
auto getKeeperFirstNames = [&] (int index) {
if (auto& nameId = keeperCreatureInfos[index].baseNameGen) {
vector<vector<string>> ret;
for (auto id : keeperCreatureInfos[index].creatureId)
ret.push_back(creatureFactory.getNameGenerator()->getAll(*nameId));
return ret;
} else
return keeperCreatures[index].transform(getAllNames);
};
auto getKeeperName = [&](int index) -> string {
if (keeperCreatureInfos[index].noLeader)
return keeperCreatures[index][0]->getName().plural();
return keeperCreatures[index][0]->getName().identify();
};
for (int i : All(keeperCreatures))
keeperAvatarData.push_back(View::AvatarData {
keeperCreatures[i].transform([](const auto& c) { return string(getName(c->getAttributes().getGender())); }),
keeperCreatures[i].transform([](const auto& c) { return getUpgradedViewId(c.get()); }),
getKeeperFirstNames(i),
keeperCreatureInfos[i].tribeAlignment,
getKeeperName(i),
PlayerRole::KEEPER,
keeperCreatureInfos[i].description,
!!keeperCreatureInfos[i].baseNameGen,
!!keeperCreatureInfos[i].baseNameGen ? OptionId::SETTLEMENT_NAME : OptionId::PLAYER_NAME
});
vector<View::AvatarData> adventurerAvatarData;
for (int i : All(adventurerCreatures))
adventurerAvatarData.push_back(View::AvatarData {
adventurerCreatures[i].transform([](const auto& c) { return string(getName(c->getAttributes().getGender())); }),
adventurerCreatures[i].transform([](const auto& c) { return getUpgradedViewId(c.get()); }),
adventurerCreatures[i].transform(getAllNames),
adventurerCreatureInfos[i].tribeAlignment,
adventurerCreatures[i][0]->getName().identify(),
PlayerRole::ADVENTURER,
adventurerCreatureInfos[i].description,
false,
OptionId::PLAYER_NAME
});
auto result1 = view->chooseAvatar(concat(keeperAvatarData, adventurerAvatarData));
if (auto option = result1.getValueMaybe<AvatarMenuOption>())
return *option;
auto result = result1.getReferenceMaybe<View::AvatarChoice>();
variant<KeeperCreatureInfo, AdventurerCreatureInfo> creatureInfo;
PCreature ret;
optional<string> chosenBaseName;
if (result->creatureIndex < keeperCreatures.size()) {
creatureInfo = keeperCreatureInfos[result->creatureIndex];
ret = std::move(keeperCreatures[result->creatureIndex][result->genderIndex]);
if (!keeperCreatureInfos[result->creatureIndex].noLeader) {
ret->getName().setBare("Keeper");
ret->getName().setFirst(result->name);
ret->getName().useFullTitle();
} else
chosenBaseName = result->name;
} else {
creatureInfo = adventurerCreatureInfos[result->creatureIndex - keeperCreatures.size()];
ret = std::move(adventurerCreatures[result->creatureIndex - keeperCreatures.size()][result->genderIndex]);
ret->getName().setBare("Adventurer");
ret->getName().setFirst(result->name);
}
auto villains = creatureInfo.visit([](const auto& elem) { return elem.tribeAlignment;});
return AvatarInfo{std::move(ret), std::move(creatureInfo), villains, chosenBaseName };
}
AvatarInfo getQuickGameAvatar(View* view, const vector<KeeperCreatureInfo>& keeperCreatures, CreatureFactory* creatureFactory) {
AvatarInfo ret;
auto& myKeeper = keeperCreatures[0];
ret.playerCreature = creatureFactory->fromId(myKeeper.creatureId[0], TribeId::getDarkKeeper());
if (!myKeeper.noLeader)
ret.playerCreature->getName().setBare("Keeper");
ret.playerCreature->getName().setFirst("Michal"_s);
ret.creatureInfo = std::move(myKeeper);
ret.tribeAlignment = TribeAlignment::EVIL;
return ret;
}