载入中...
搜索中...
未找到
Tags.cpp
浏览该文件的文档.
1#include "tags/Tags.h"
2
3#include "common/Capability.h"
6
7#include <simplesquirrel/simplesquirrel.hpp>
8
9namespace eve::tags {
10
12 worldAdapter_ = std::make_unique<TagStoreStateAdapter>(store_);
13 eve::cap::addListener<eve::IStateQuery>(static_cast<eve::IStateQuery*>(worldAdapter_.get()));
14 eve::cap::addListener<eve::IStateMutation>(static_cast<eve::IStateMutation*>(worldAdapter_.get()));
15}
16
18 if (worldAdapter_) {
19 eve::cap::removeListener<eve::IStateQuery>(static_cast<eve::IStateQuery*>(worldAdapter_.get()));
20 eve::cap::removeListener<eve::IStateMutation>(static_cast<eve::IStateMutation*>(worldAdapter_.get()));
21 worldAdapter_.reset();
22 }
23}
24
25namespace {
26
27std::string valueAt(const std::vector<std::string>& values, int index) {
28 return index < 0 || static_cast<std::size_t>(index) >= values.size() ? std::string{} : values[index];
29}
30
31const TagChangeEvent* eventAt(const TagStore& store, int index) {
32 const auto& events = store.events();
33 return index < 0 || static_cast<std::size_t>(index) >= events.size() ? nullptr : &events[index];
34}
35
36std::vector<std::string> strings(ssq::Array array) {
37 std::vector<std::string> result;
38 result.reserve(array.size());
39 for (std::size_t i = 0; i < array.size(); ++i) result.push_back(array.get<std::string>(i));
40 return result;
41}
42
43bool requireAllTags(Tags* self, const std::string& subject, ssq::Array requested) {
44 return self->store().requireAllTags(subject, strings(requested));
45}
46bool requireAnyTag(Tags* self, const std::string& subject, ssq::Array requested) {
47 return self->store().requireAnyTag(subject, strings(requested));
48}
49bool requireAllCapabilities(Tags* self, const std::string& subject, ssq::Array requested) {
50 return self->store().requireAllCapabilities(subject, strings(requested));
51}
52bool requireAnyCapability(Tags* self, const std::string& subject, ssq::Array requested) {
53 return self->store().requireAnyCapability(subject, strings(requested));
54}
55
56} // namespace
57
59
60bool Tags::add(const std::string& subject, const std::string& tag) { return store_.addTag(subject, tag); }
61bool Tags::remove(const std::string& subject, const std::string& tag) { return store_.removeTag(subject, tag); }
62bool Tags::has(const std::string& subject, const std::string& tag) const { return store_.hasTag(subject, tag); }
63int Tags::count(const std::string& subject) const { return static_cast<int>(store_.tagsOf(subject).size()); }
64std::string Tags::at(const std::string& subject, int index) const { return valueAt(store_.tagsOf(subject), index); }
65int Tags::subjectCount(const std::string& tag) const { return static_cast<int>(store_.subjectsWithTag(tag).size()); }
66std::string Tags::subjectAt(const std::string& tag, int index) const {
67 return valueAt(store_.subjectsWithTag(tag), index);
68}
69
70bool Tags::addCapability(const std::string& subject, const std::string& capability) {
71 return store_.addCapability(subject, capability);
72}
73bool Tags::removeCapability(const std::string& subject, const std::string& capability) {
74 return store_.removeCapability(subject, capability);
75}
76bool Tags::hasCapability(const std::string& subject, const std::string& capability) const {
77 return store_.hasCapability(subject, capability);
78}
79int Tags::capabilityCount(const std::string& subject) const {
80 return static_cast<int>(store_.capabilitiesOf(subject).size());
81}
82std::string Tags::capabilityAt(const std::string& subject, int index) const {
83 return valueAt(store_.capabilitiesOf(subject), index);
84}
85
86bool Tags::removeSubject(const std::string& subject) { return store_.removeSubject(subject); }
87void Tags::clear() { store_.clear(); }
88int Tags::eventCount() const { return static_cast<int>(store_.events().size()); }
89int Tags::eventSequence(int index) const {
90 const auto* event = eventAt(store_, index);
91 return event ? static_cast<int>(event->sequence) : 0;
92}
93std::string Tags::eventAction(int index) const {
94 const auto* event = eventAt(store_, index);
95 return event ? event->action : std::string{};
96}
97std::string Tags::eventSubject(int index) const {
98 const auto* event = eventAt(store_, index);
99 return event ? event->subject : std::string{};
100}
101std::string Tags::eventValue(int index) const {
102 const auto* event = eventAt(store_, index);
103 return event ? event->value : std::string{};
104}
105void Tags::clearEvents() { store_.clearEvents(); }
106
107void Tags::expose(ssq::Table& table) {
108 auto cls = table.addClass(name, Tags::create, false);
109 expose(cls);
110}
111
112void Tags::expose(ssq::Class& cls) {
113 cls.addFunc("getName", &Tags::getName);
114 cls.addFunc("add", &Tags::add);
115 cls.addFunc("remove", &Tags::remove);
116 cls.addFunc("has", &Tags::has);
117 cls.addFunc("count", &Tags::count);
118 cls.addFunc("at", &Tags::at);
119 cls.addFunc("subjectCount", &Tags::subjectCount);
120 cls.addFunc("subjectAt", &Tags::subjectAt);
121 cls.addFunc("requireAll", requireAllTags);
122 cls.addFunc("requireAny", requireAnyTag);
123 cls.addFunc("addCapability", &Tags::addCapability);
124 cls.addFunc("removeCapability", &Tags::removeCapability);
125 cls.addFunc("hasCapability", &Tags::hasCapability);
126 cls.addFunc("capabilityCount", &Tags::capabilityCount);
127 cls.addFunc("capabilityAt", &Tags::capabilityAt);
128 cls.addFunc("requireAllCapabilities", requireAllCapabilities);
129 cls.addFunc("requireAnyCapability", requireAnyCapability);
130 cls.addFunc("removeSubject", &Tags::removeSubject);
131 cls.addFunc("clear", &Tags::clear);
132 cls.addFunc("eventCount", &Tags::eventCount);
133 cls.addFunc("eventSequence", &Tags::eventSequence);
134 cls.addFunc("eventAction", &Tags::eventAction);
135 cls.addFunc("eventSubject", &Tags::eventSubject);
136 cls.addFunc("eventValue", &Tags::eventValue);
137 cls.addFunc("clearEvents", &Tags::clearEvents);
138}
139
140} // namespace eve::tags
int subject
Definition AnimSmr.cpp:163
HSQOBJECT cls
Definition ECS.cpp:21
std::map< std::string, Var > values
std::string name
const std::string * tag
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:26
Consumer-owned query and mutation contracts for authoritative world state.
Battle::Events events
uint32_t index
virtual std::string getName() const =0
Returns the name.
All-or-nothing mutation boundary owned by the consumer.
Read-only world-state boundary owned by consumers such as Dialogue.
Definition StateAccess.h:79
bool removeSubject(const SubjectId &subject)
Removes all tags and capabilities belonging to one subject.
Definition TagStore.cpp:124
std::vector< std::string > tagsOf(const SubjectId &subject) const
Returns a subject's tags in lexical order.
Definition TagStore.cpp:66
bool removeTag(const SubjectId &subject, const std::string &tag)
Removes a tag from a subject.
Definition TagStore.cpp:53
bool removeCapability(const SubjectId &subject, const std::string &capability)
Removes a capability from a subject.
Definition TagStore.cpp:104
void clear()
Clears all state and resets event sequencing.
Definition TagStore.cpp:134
bool addCapability(const SubjectId &subject, const std::string &capability)
Adds a capability to a subject.
Definition TagStore.cpp:101
void clearEvents()
Clears queued changes without changing tag state.
Definition TagStore.h:74
std::vector< std::string > capabilitiesOf(const SubjectId &subject) const
Returns a subject's capabilities in lexical order.
Definition TagStore.cpp:111
bool hasTag(const SubjectId &subject, const std::string &tag) const
Tests whether a subject has an exact tag.
Definition TagStore.cpp:56
const std::vector< TagChangeEvent > & events() const
Returns queued changes in deterministic sequence order.
Definition TagStore.h:72
bool addTag(const SubjectId &subject, const std::string &tag)
Adds a tag to a subject.
Definition TagStore.cpp:50
std::vector< SubjectId > subjectsWithTag(const std::string &tag) const
Returns subjects carrying a tag in lexical order.
Definition TagStore.cpp:70
bool hasCapability(const SubjectId &subject, const std::string &capability) const
Tests whether a subject has an exact capability.
Definition TagStore.cpp:107
Script-facing module for generic tags and capabilities.
Definition Tags.h:16
bool removeCapability(const std::string &subject, const std::string &capability)
Removes a capability from a subject.
Definition Tags.cpp:73
void clearEvents()
Clears queued events without changing state.
Definition Tags.cpp:105
int subjectCount(const std::string &tag) const
Gets the number of subjects carrying a tag.
Definition Tags.cpp:65
int count(const std::string &subject) const
Gets a subject's tag count.
Definition Tags.cpp:63
bool remove(const std::string &subject, const std::string &tag)
Removes a tag from a subject.
Definition Tags.cpp:61
~Tags() override
Withdraws world-state listeners and releases Tags resources.
Definition Tags.cpp:17
int capabilityCount(const std::string &subject) const
Gets a subject's capability count.
Definition Tags.cpp:79
std::string at(const std::string &subject, int index) const
Gets a subject's tag by deterministic index, or an empty string.
Definition Tags.cpp:64
std::string subjectAt(const std::string &tag, int index) const
Gets a subject carrying a tag by deterministic index, or an empty string.
Definition Tags.cpp:66
bool hasCapability(const std::string &subject, const std::string &capability) const
Tests whether a subject has a capability.
Definition Tags.cpp:76
bool removeSubject(const std::string &subject)
Removes every tag and capability belonging to a subject.
Definition Tags.cpp:86
void clear()
Clears all state and resets event sequencing.
Definition Tags.cpp:87
std::string eventAction(int index) const
Gets event action by index, or an empty string.
Definition Tags.cpp:93
int eventSequence(int index) const
Gets event sequence by index, or zero.
Definition Tags.cpp:89
bool add(const std::string &subject, const std::string &tag)
Adds a tag to a subject.
Definition Tags.cpp:60
int eventCount() const
Gets queued change event count.
Definition Tags.cpp:88
bool addCapability(const std::string &subject, const std::string &capability)
Adds a capability to a subject.
Definition Tags.cpp:70
std::string eventValue(int index) const
Gets event tag or capability by index, or an empty string.
Definition Tags.cpp:101
Tags()
Constructs a Tags and publishes its store as world-state listeners.
Definition Tags.cpp:11
bool has(const std::string &subject, const std::string &tag) const
Tests whether a subject has a tag.
Definition Tags.cpp:62
std::string eventSubject(int index) const
Gets event subject by index, or an empty string.
Definition Tags.cpp:97
std::string capabilityAt(const std::string &subject, int index) const
Gets a capability by deterministic index, or an empty string.
Definition Tags.cpp:82
TagStore implementation of the common world-state contracts.