载入中...
搜索中...
未找到
Economy.cpp
浏览该文件的文档.
1#include "economy/Economy.h"
2
3#include "common/Capability.h"
4#include "common/SubjectRef.h"
5#include "economy/Collector.h"
10
11#include <simplesquirrel/simplesquirrel.hpp>
12
13namespace eve::economy {
14
16
17Economy::Economy() { eve::cap::provide<eve::economy::IEconomy>(this); }
18
20
21int Economy::credit(int player, const std::string& type, int amount) {
22 return EconomySystem::credit(player, type, amount);
23}
24
25bool Economy::debit(int player, const std::string& type, int amount) {
26 return EconomySystem::debit(player, type, amount);
27}
28
29int Economy::get(int player, const std::string& type) const { return EconomySystem::get(player, type); }
30
31int Economy::getCap(int player, const std::string& type) const {
32 return EconomySystem::getCap(player, type);
33}
34
35int Economy::getWasted(int player, const std::string& type) const {
36 return EconomySystem::getWasted(player, type);
37}
38
39int Economy::getIncome(int player, const std::string& type) const {
40 return EconomySystem::getIncome(player, type);
41}
42
43int Economy::getExpense(int player, const std::string& type) const {
44 return EconomySystem::getExpense(player, type);
45}
46
47bool Economy::registerResourceType(const std::string& id, const std::string& category, int stockMax,
48 const std::string& depletion) {
50 def.id = id;
51 def.category = category;
52 def.stockMax = stockMax;
53 def.displayName = id;
54 if (depletion == "renewable")
56 else if (depletion == "infinite")
58 else if (depletion == "growing")
60 else
63}
64
66
68
69bool Economy::hasType(const std::string& id) { return ResourceTypeRegistry::find(id) != nullptr; }
70
71int Economy::getStockMax(const std::string& id) {
72 const auto* def = ResourceTypeRegistry::find(id);
73 return def ? def->stockMax : 0;
74}
75
76std::string Economy::getTypeId(int index) {
77 const auto* def = ResourceTypeRegistry::typeAt(index);
78 return def ? def->id : std::string{};
79}
80
82
84
85std::string Economy::eventAction(int index) {
86 if (index < 0 || index >= EconomySystem::eventCount()) return {};
88}
89
91 if (index < 0 || index >= EconomySystem::eventCount()) return 0;
93}
94
95std::string Economy::eventType(int index) {
96 if (index < 0 || index >= EconomySystem::eventCount()) return {};
98}
99
101 if (index < 0 || index >= EconomySystem::eventCount()) return 0;
103}
104
105void Economy::expose(ssq::Table& table) {
106 auto cls = table.addClass(name, Economy::create, false);
107 expose(cls);
108
109 auto node = table.addClass<GatherNode>(
110 "GatherNode",
111 std::function<GatherNode*(std::string, int, int, int)>(
112 [](std::string type, int capacity, int slots, int regen) {
113 return new GatherNode(std::move(type), capacity, slots, regen);
114 }),
115 true);
116 node.addFunc("destroy", &GatherNode::destroy);
117 node.addFunc("resourceType", &GatherNode::resourceType);
118 node.addFunc("amount", &GatherNode::amount);
119 node.addFunc("capacity", &GatherNode::capacity);
120 node.addFunc("depleted", &GatherNode::depleted);
121 node.addFunc("freeSlots", &GatherNode::freeSlots);
122 node.addFunc("regenTick", &GatherNode::regenTick);
123
124 auto collector = table.addClass<Collector>(
125 "Collector",
126 std::function<Collector*(int, int, int)>(
127 [](int capacity, int rate, int travel) { return new Collector(capacity, rate, travel); }),
128 true);
129 collector.addFunc("destroy", &Collector::destroy);
130 collector.addFunc("assign", &Collector::assign);
131 collector.addFunc("clearAssignment", &Collector::clearAssignment);
132 collector.addFunc("tick", &Collector::tick);
133 collector.addFunc("isIdle", &Collector::isIdle);
134 collector.addFunc("stateName", &Collector::stateName);
135 collector.addFunc("cargo", &Collector::cargo);
136 collector.addFunc("carryCapacity", &Collector::carryCapacity);
137 collector.addFunc("resourceType", &Collector::resourceType);
138 collector.addFunc("totalGathered", &Collector::totalGathered);
139 collector.addFunc("trips", &Collector::trips);
140}
141
142void Economy::expose(ssq::Class& cls) {
143 cls.addFunc("getName", &Economy::getName);
144 cls.addFunc("registerResourceType",
145 [](Economy*, std::string id, std::string category, int stockMax,
146 std::string depletion) {
147 return Economy::registerResourceType(id, category, stockMax, depletion);
148 });
149 cls.addFunc("clearTypes", [](Economy*) { Economy::clearTypes(); });
150 cls.addFunc("typeCount", [](Economy*) { return Economy::typeCount(); });
151 cls.addFunc("hasType", [](Economy*, std::string id) { return Economy::hasType(id); });
152 cls.addFunc("getStockMax", [](Economy*, std::string id) { return Economy::getStockMax(id); });
153 cls.addFunc("credit", &Economy::credit);
154 cls.addFunc("debit", &Economy::debit);
155 cls.addFunc("get", &Economy::get);
156 cls.addFunc("getCap", &Economy::getCap);
157 cls.addFunc("getWasted", &Economy::getWasted);
158 cls.addFunc("getIncome", &Economy::getIncome);
159 cls.addFunc("getExpense", &Economy::getExpense);
160 cls.addFunc("clearEvents", [](Economy*) { Economy::clearEvents(); });
161 cls.addFunc("getEventCount", [](Economy*) { return Economy::eventCount(); });
162 cls.addFunc("getEventAction", [](Economy*, int index) { return Economy::eventAction(index); });
163 cls.addFunc("getEventPlayer", [](Economy*, int index) { return Economy::eventPlayer(index); });
164 cls.addFunc("getEventType", [](Economy*, int index) { return Economy::eventType(index); });
165 cls.addFunc("getEventAmount", [](Economy*, int index) { return Economy::eventAmount(index); });
166 cls.addFunc("getTypeId", &Economy::getTypeId);
167
168 // 把玩家账本发布到共享玩法协议(`eve_gameplay` / MCP)。返回 {ok, message}:
169 // 失败原因(非规范持久 id、重复实例)不被丢弃。
170 cls.addFunc("publishGameplay", [vm = cls.getHandle()](Economy* self, const std::string& instanceId,
171 const std::string& ownerId, int player) {
172 ssq::Table result(vm);
173 if (self == nullptr) {
174 result.set("ok", false);
175 result.set("message", std::string("economy module unavailable"));
176 return result;
177 }
178 const auto published = self->publishGameplay(instanceId, ownerId, player);
179 result.set("ok", published.ok());
180 result.set("message", published.ok() ? std::string("published") : published.status().describe());
181 return result;
182 });
183 cls.addFunc("unpublishGameplay", [vm = cls.getHandle()](Economy* self, const std::string& instanceId) {
184 ssq::Table result(vm);
185 const auto unpublished = self == nullptr
187 eve::DiagnosticCode::Failed, "economy module unavailable", "self"))
188 : self->unpublishGameplay(instanceId);
189 result.set("ok", unpublished.ok());
190 result.set("message", unpublished.ok() ? std::string("unpublished") : unpublished.status().describe());
191 return result;
192 });
193 cls.addFunc("clearGameplayControls", &Economy::clearGameplayControls);
194 cls.addFunc("getGameplayControlCount", &Economy::gameplayControlCount);
195}
196
197eve::Result<void> Economy::publishGameplay(const std::string& instanceId, const std::string& ownerId, int player) {
198 if (instanceId.empty() || ownerId.empty())
200 "publishGameplay needs an instance id and an owner id",
201 "instanceId"));
202 const auto instance = eve::PersistentId::parse(instanceId);
203 const auto owner = eve::PersistentId::parse(ownerId);
204 if (!instance.has_value() || !owner.has_value())
207 "instance and owner ids must be canonical persistent ids", "instanceId"));
208 if (!gameplay_) gameplay_ = std::make_unique<EconomyControl>();
209 return gameplay_->publish(eve::SubjectRef::fromPersistentId(*instance), eve::SubjectRef::fromPersistentId(*owner),
210 player);
211}
212
213eve::Result<void> Economy::unpublishGameplay(const std::string& instanceId) {
214 if (!gameplay_)
216 eve::Diagnostic::error(eve::DiagnosticCode::NotFound, "no economy instance is published", "instanceId"));
217 const auto instance = eve::PersistentId::parse(instanceId);
218 if (!instance.has_value())
220 eve::DiagnosticCode::InvalidArgument, "the instance id must be a canonical persistent id", "instanceId"));
221 return gameplay_->unpublish(eve::SubjectRef::fromPersistentId(*instance));
222}
223
225 if (gameplay_) gameplay_->clear();
226}
227
228int Economy::gameplayControlCount() const { return gameplay_ ? gameplay_->count() : 0; }
229
230std::vector<std::string> Economy::gameplayInstances() const {
231 std::vector<std::string> result;
232 if (!gameplay_) return result;
233 for (const auto& instance : gameplay_->instances()) result.push_back(instance.format());
234 return result;
235}
236
237} // namespace eve::economy
HSQUIRRELVM vm
Definition ECS.cpp:20
HSQOBJECT cls
Definition ECS.cpp:21
std::uint32_t capacity
wgpu::PopErrorScopeStatus status
std::string name
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:26
std::string id
Definition PlayHost.cpp:108
RenderSystem3D::GpuOpaqueCollector collector
const RoadNode * node
LocalPageCacheEntry slots[ShadowConfig::kLocalSlots]
Stable reference to a runtime gameplay subject.
const char * category
uint32_t index
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
virtual std::string getName() const =0
Returns the name.
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static SubjectRef fromPersistentId(PersistentId id) noexcept
Wrap a persistent identity without changing its bytes.
Definition SubjectRef.h:32
static std::optional< Id128 > parse(std::string_view text) noexcept
Parses canonical UUID text.
Definition Identity.h:151
void tick(int player)
推进一个 tick;卸货时入账到指定玩家的账本。
Definition Collector.cpp:42
void destroy()
脚本生命周期入口。
int carryCapacity() const
单次最大携带量。
Definition Collector.cpp:92
bool assign(GatherNode *node)
指派目标节点并占用其采集槽位;无空位时保持待命并返回 false。
Definition Collector.cpp:19
int cargo() const
当前携带量。
Definition Collector.cpp:90
std::string resourceType() const
正在采集的资源类型 id。
Definition Collector.cpp:94
int totalGathered() const
累计入账量(不含浪费)。
Definition Collector.cpp:96
int trips() const
完成的往返次数。
Definition Collector.cpp:98
void clearAssignment()
取消指派并释放槽位。
Definition Collector.cpp:36
std::string stateName() const
当前相位的字符串名(脚本友好)。
Definition Collector.cpp:74
bool isIdle() const
是否处于待命状态。
Definition Collector.cpp:70
static int credit(int player, const std::string &type, int amount)
入账并广播事件。
static const EconomyEvent & eventAt(int index)
Event at.
static int getWasted(int player, const std::string &type)
因满仓浪费的累计量。
static int getExpense(int player, const std::string &type)
累计出账量。
static bool debit(int player, const std::string &type, int amount)
出账并广播事件;余额不足返回 false。
static int getIncome(int player, const std::string &type)
累计入账量。
static void clearEvents()
事件队列(按发生顺序)。
static int eventCount()
Event count.
static int getCap(int player, const std::string &type)
玩家该类型持有上限(0=不限)。
static int get(int player, const std::string &type)
玩家当前持有量。
经济模块(eve.Economy):资源类型注册 + 玩家账本 + 事件 + 采集流水线。
Definition Economy.h:20
std::string getTypeId(int index)
按 id 字典序返回第 index 个资源类型 id;越界返回空串。
Definition Economy.cpp:76
void clearGameplayControls()
取消发布本模块持有的全部玩法实例。
Definition Economy.cpp:224
int getIncome(int player, const std::string &type) const override
Get income.
Definition Economy.cpp:39
int getWasted(int player, const std::string &type) const override
Get wasted.
Definition Economy.cpp:35
static int eventAmount(int index)
第 index 个事件的数值(越界返回 0)。
Definition Economy.cpp:100
int get(int player, const std::string &type) const override
Get.
Definition Economy.cpp:29
eve::Result< void > unpublishGameplay(const std::string &instanceId)
取消发布一个实例;该实例未发布(或 id 非法)时返回诊断。
Definition Economy.cpp:213
static bool registerResourceType(const std::string &id, const std::string &category, int stockMax, const std::string &depletion)
注册资源类型;depletion 取值 finite/renewable/infinite/growing。
Definition Economy.cpp:47
static std::string eventType(int index)
第 index 个事件的资源类型(越界返回空串)。
Definition Economy.cpp:95
bool debit(int player, const std::string &type, int amount) override
Debit.
Definition Economy.cpp:25
int gameplayControlCount() const
已发布的玩法实例数量。
Definition Economy.cpp:228
static int eventPlayer(int index)
第 index 个事件的玩家(越界返回 0)。
Definition Economy.cpp:90
static int getStockMax(const std::string &id)
类型持有上限(未注册返回 0)。
Definition Economy.cpp:71
int getCap(int player, const std::string &type) const override
Get cap.
Definition Economy.cpp:31
static bool hasType(const std::string &id)
类型是否已注册。
Definition Economy.cpp:69
int getExpense(int player, const std::string &type) const override
Get expense.
Definition Economy.cpp:43
std::vector< std::string > gameplayInstances() const
已发布的玩法实例标识(发布顺序)。
Definition Economy.cpp:230
~Economy() override
Economy.
Definition Economy.cpp:19
static void clearEvents()
清空事件队列。
Definition Economy.cpp:81
int credit(int player, const std::string &type, int amount) override
Credit.
Definition Economy.cpp:21
eve::Result< void > publishGameplay(const std::string &instanceId, const std::string &ownerId, int player)
把一个玩家账本发布到共享玩法协议(eve_gameplay / MCP)。
Definition Economy.cpp:197
static std::string eventAction(int index)
第 index 个事件的动作(credit/debit/waste;越界返回空串)。
Definition Economy.cpp:85
static int typeCount()
已注册类型数量。
Definition Economy.cpp:67
static int eventCount()
事件队列长度。
Definition Economy.cpp:83
static void clearTypes()
清空资源类型(测试用)。
Definition Economy.cpp:65
地图上的资源节点:储量、再生、采集槽位。
Definition GatherNode.h:12
int capacity() const
总储量。
int amount() const
当前储量。
void destroy()
脚本生命周期入口。
int freeSlots() const
剩余空槽数。
void regenTick()
每 tick 再生(Growing/Renewable 模型)。
std::string resourceType() const
资源类型 id。
bool depleted() const
是否已采空。
static void clear()
清空注册表(测试用)。
static const ResourceTypeDef * find(const std::string &id)
按 id 查询;未注册时返回 nullptr。
static int count()
已注册类型数量。
static bool registerType(const ResourceTypeDef &def)
注册或替换一个资源类型定义。
static const ResourceTypeDef * typeAt(int index)
按 id 字典序返回第 index 个类型定义。
资源类型的静态定义(数据驱动配置的最小单元)。