blob: 8bcf960748819b7ba1acd8a26239fa2948bc8d55 (
plain)
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
|
#include "StarEmoteProcessor.hpp"
#include "StarJsonExtra.hpp"
#include "StarAssets.hpp"
#include "StarRoot.hpp"
namespace Star {
EmoteProcessor::EmoteProcessor() {
auto assets = Root::singleton().assets();
m_emoteBindings.clear();
auto cfg = assets->json("/emotes.config");
for (auto binding : cfg.get("emoteBindings").iterateObject()) {
for (auto text : binding.second.toArray()) {
EmoteBinding emoteBinding;
emoteBinding.emote = HumanoidEmoteNames.getLeft(binding.first);
emoteBinding.text = text.toString();
m_emoteBindings.append(emoteBinding);
}
}
}
HumanoidEmote EmoteProcessor::detectEmotes(String const& chatter) const {
auto isShouty = [](String const& text) -> bool {
int caps = 0;
int noCaps = 0;
for (auto c : text) {
if (String::toUpper(c) != String::toLower(c)) {
if (String::toUpper(c) == c)
caps++;
else
noCaps++;
}
}
return caps > noCaps;
};
HumanoidEmote result = HumanoidEmote::Idle;
if (!chatter.empty()) {
if (isShouty(chatter))
result = HumanoidEmote::Shouting;
else
result = HumanoidEmote::Blabbering;
}
float bestMatch = -1;
for (auto option : m_emoteBindings) {
auto p = chatter.find(option.text);
if (p == NPos)
continue;
float r = p + (float)option.text.length() * 0.01f;
if (r > bestMatch) {
bestMatch = r;
result = option.emote;
}
}
return result;
}
}
|