载入中...
搜索中...
未找到
RPG.cpp
浏览该文件的文档.
1#include "rpg/RPG.h"
2#include "rpg/Effect.h"
3#include "rpg/Skill.h"
4#include "rpg/StatusSystem.h"
5#include "rpg/SkillSystem.h"
6#include "rpg/Settlement.h"
7
8#include <simplesquirrel/simplesquirrel.hpp>
9
10namespace eve::rpg {
11
13
15
16int RPG::registerEffectsFromJson(const std::string &json) {
17 return EffectRegistry::loadFromJson(json, nullptr);
18}
19
21
23
24int RPG::registerSkillsFromJson(const std::string &json) {
25 return SkillRegistry::loadFromJson(json, nullptr);
26}
27
29
31
32void RPG::update(float dt) {
35
36 ticks_.clear();
38 changes_.clear();
40 casts_.clear();
42}
43
44int RPG::getTickEventCount() const { return int(ticks_.size()); }
45
47 if (index < 0 || size_t(index) >= ticks_.size()) return nullptr;
48 return ticks_[size_t(index)].actor;
49}
50
51int RPG::getTickEventInstanceId(int index) const {
52 if (index < 0 || size_t(index) >= ticks_.size()) return 0;
53 return ticks_[size_t(index)].instanceId;
54}
55
56std::string RPG::getTickEventEffectId(int index) const {
57 if (index < 0 || size_t(index) >= ticks_.size()) return {};
58 return ticks_[size_t(index)].effectId;
59}
60
61std::string RPG::getTickEventSource(int index) const {
62 if (index < 0 || size_t(index) >= ticks_.size()) return {};
63 return ticks_[size_t(index)].source;
64}
65
66int RPG::getTickEventStacks(int index) const {
67 if (index < 0 || size_t(index) >= ticks_.size()) return 0;
68 return ticks_[size_t(index)].stacks;
69}
70
71int RPG::getStatusChangeEventCount() const { return int(changes_.size()); }
72
74 if (index < 0 || size_t(index) >= changes_.size()) return nullptr;
75 return changes_[size_t(index)].actor;
76}
77
79 if (index < 0 || size_t(index) >= changes_.size()) return 0;
80 return changes_[size_t(index)].instanceId;
81}
82
83std::string RPG::getStatusChangeEventEffectId(int index) const {
84 if (index < 0 || size_t(index) >= changes_.size()) return {};
85 return changes_[size_t(index)].effectId;
86}
87
88std::string RPG::getStatusChangeEventSource(int index) const {
89 if (index < 0 || size_t(index) >= changes_.size()) return {};
90 return changes_[size_t(index)].source;
91}
92
93std::string RPG::getStatusChangeEventAction(int index) const {
94 if (index < 0 || size_t(index) >= changes_.size()) return {};
95 return changes_[size_t(index)].action;
96}
97
98int RPG::getStatusChangeEventStacks(int index) const {
99 if (index < 0 || size_t(index) >= changes_.size()) return 0;
100 return changes_[size_t(index)].stacks;
101}
102
103std::string RPG::getStatusChangeEventReason(int index) const {
104 if (index < 0 || size_t(index) >= changes_.size()) return {};
105 return changes_[size_t(index)].reason;
106}
107
108int RPG::getCastEventCount() const { return int(casts_.size()); }
109
111 if (index < 0 || size_t(index) >= casts_.size()) return nullptr;
112 return casts_[size_t(index)].caster;
113}
114
116 if (index < 0 || size_t(index) >= casts_.size()) return nullptr;
117 return casts_[size_t(index)].target;
118}
119
120std::string RPG::getCastEventSkillId(int index) const {
121 if (index < 0 || size_t(index) >= casts_.size()) return {};
122 return casts_[size_t(index)].skillId;
123}
124
126
127void RPG::runSettlement(const std::string &pipeline, SettlementContext *ctx) {
128 if (!ctx) return;
129 SettlementPipeline::run(pipeline, *ctx);
130}
131
132int RPG::getSettlementStageCount(const std::string &pipeline) {
133 return SettlementPipeline::stageCount(pipeline);
134}
135
136bool RPG::hasSettlementStage(const std::string &pipeline, const std::string &stage) {
137 return SettlementPipeline::hasStage(pipeline, stage);
138}
139
140bool RPG::setSettlementStageEnabled(const std::string &pipeline, const std::string &stage,
141 bool enabled) {
142 return SettlementPipeline::setStageEnabled(pipeline, stage, enabled);
143}
144
145bool RPG::setSettlementStagePriority(const std::string &pipeline, const std::string &stage,
146 int priority) {
147 return SettlementPipeline::setStagePriority(pipeline, stage, priority);
148}
149
150bool RPG::removeSettlementStage(const std::string &pipeline, const std::string &stage) {
151 return SettlementPipeline::unregisterStage(pipeline, stage);
152}
153
154void RPG::clearSettlementPipeline(const std::string &pipeline) {
156}
157
158void RPG::expose(ssq::Table &table) {
159 auto cls = table.addClass(name, RPG::create, false);
160 expose(cls);
161
162 auto actor = table.addClass<RPGActor>(
163 "RPGActor", std::function<RPGActor *()>([]() -> RPGActor * { return nullptr; }), true);
164 // 绑定为 float:SimpleSquirrel 只有在 squirrel 以 SQUSEDOUBLE 编译时才认识
165 // C++ double(本项目未开启),否则 double 参数/返回值会被当成 INSTANCE
166 // 处理,脚本调用直接抛 "bad cast expected INSTANCE got FLOAT"。
167 // 同样的坑见 mouse/Mouse.cpp、timer/Timer.h 的注释。
168 actor.addFunc("setBaseAttribute", [](RPGActor *a, const std::string &attribute, float value) {
169 if (a) a->setBaseAttribute(attribute, double(value));
170 });
171 actor.addFunc("getBaseAttribute", [](RPGActor *a, const std::string &attribute) -> float {
172 return a ? float(a->getBaseAttribute(attribute)) : 0.f;
173 });
174 actor.addFunc("modifyBaseAttribute", [](RPGActor *a, const std::string &attribute, float delta) {
175 if (a) a->modifyBaseAttribute(attribute, double(delta));
176 });
177 actor.addFunc("hasAttribute", &RPGActor::hasAttribute);
178 actor.addFunc("addAttributeModifier",
179 [](RPGActor *a, const std::string &attribute, const std::string &source,
180 const std::string &op, float value, int priority) -> std::string {
181 return a ? a->addAttributeModifier(attribute, source, op, double(value), priority)
182 : std::string{};
183 });
184 actor.addFunc("removeAttributeModifier", &RPGActor::removeAttributeModifier);
185 actor.addFunc("removeAttributeModifiersBySource", &RPGActor::removeAttributeModifiersBySource);
186 actor.addFunc("removeAllAttributeModifiersBySource",
188 actor.addFunc("getFinalAttribute", [](RPGActor *a, const std::string &attribute) -> float {
189 return a ? float(a->getFinalAttribute(attribute)) : 0.f;
190 });
191
192 actor.addFunc("applyEffect", &RPGActor::applyEffect);
193 actor.addFunc("removeStatus", &RPGActor::removeStatus);
194 actor.addFunc("removeStatusByEffect", &RPGActor::removeStatusByEffect);
195 actor.addFunc("removeStatusBySource", &RPGActor::removeStatusBySource);
196 actor.addFunc("removeStatusByTag", &RPGActor::removeStatusByTag);
197 actor.addFunc("hasEffect", &RPGActor::hasEffect);
198 actor.addFunc("hasStatusTag", &RPGActor::hasStatusTag);
199 actor.addFunc("getStatusCount", &RPGActor::getStatusCount);
200 actor.addFunc("getStatusEffectId", &RPGActor::getStatusEffectId);
201 actor.addFunc("getStatusStacks", &RPGActor::getStatusStacks);
202 actor.addFunc("getStatusRemaining", &RPGActor::getStatusRemaining);
203 actor.addFunc("getStatusInstanceId", &RPGActor::getStatusInstanceId);
204 actor.addFunc("getStatusSource", &RPGActor::getStatusSource);
205 actor.addFunc("getStatusProp", &RPGActor::getStatusProp);
206 actor.addFunc("setStatusProp", &RPGActor::setStatusProp);
207
208 actor.addFunc("applyBuff", &RPGActor::applyBuff);
209 actor.addFunc("removeBuff", &RPGActor::removeBuff);
210 actor.addFunc("removeBuffByEffect", &RPGActor::removeBuffByEffect);
211 actor.addFunc("removeBuffBySource", &RPGActor::removeBuffBySource);
212 actor.addFunc("removeBuffByTag", &RPGActor::removeBuffByTag);
213 actor.addFunc("hasBuff", &RPGActor::hasBuff);
214 actor.addFunc("hasBuffTag", &RPGActor::hasBuffTag);
215 actor.addFunc("getBuffCount", &RPGActor::getBuffCount);
216 actor.addFunc("getBuffEffectId", &RPGActor::getBuffEffectId);
217 actor.addFunc("getBuffStacks", &RPGActor::getBuffStacks);
218 actor.addFunc("getBuffRemaining", &RPGActor::getBuffRemaining);
219 actor.addFunc("getBuffInstanceId", &RPGActor::getBuffInstanceId);
220 actor.addFunc("getBuffSource", &RPGActor::getBuffSource);
221 actor.addFunc("getBuffProp", &RPGActor::getBuffProp);
222 actor.addFunc("setBuffProp", &RPGActor::setBuffProp);
223
224 actor.addFunc("learnSkill", &RPGActor::learnSkill);
225 actor.addFunc("knowsSkill", &RPGActor::knowsSkill);
226 actor.addFunc("forgetSkill", &RPGActor::forgetSkill);
227 actor.addFunc("getSkillCooldown", &RPGActor::getSkillCooldown);
228 actor.addFunc("setSkillCooldown", &RPGActor::setSkillCooldown);
229 actor.addFunc("canCastSkill", &RPGActor::canCastSkill);
230 actor.addFunc("canCastSkillReason", &RPGActor::canCastSkillReason);
231 actor.addFunc("beginCastSkill", &RPGActor::beginCastSkill);
232 actor.addFunc("cancelCastSkill", &RPGActor::cancelCastSkill);
233 actor.addFunc("isCastingSkill", &RPGActor::isCastingSkill);
234 actor.addFunc("getCastingSkillId", &RPGActor::getCastingSkillId);
235 actor.addFunc("getCastProgress", &RPGActor::getCastProgress);
236
237 auto ctx = table.addClass<SettlementContext>(
238 "SettlementContext", std::function<SettlementContext *()>([]() { return new SettlementContext(); }),
239 true);
240 // 同上:SettlementContext::get/set 用 double,脚本侧包一层转 float。
241 ctx.addFunc("get", [](SettlementContext *c, const std::string &key, float fallback) -> float {
242 return c ? float(c->get(key, double(fallback))) : fallback;
243 });
244 ctx.addFunc("set", [](SettlementContext *c, const std::string &key, float value) {
245 if (c) c->set(key, double(value));
246 });
247 ctx.addFunc("has", &SettlementContext::has);
248 ctx.addFunc("addTag", &SettlementContext::addTag);
249 ctx.addFunc("hasTag", &SettlementContext::hasTag);
250}
251
252void RPG::expose(ssq::Class &cls) {
253 cls.addFunc("getName", &RPG::getName);
254 cls.addFunc("newActor", &RPG::newActor);
255 cls.addFunc("registerEffectsFromJson", &RPG::registerEffectsFromJson);
256 cls.addFunc("clearEffectDefinitions", &RPG::clearEffectDefinitions);
257 cls.addFunc("getEffectDefinitionCount", &RPG::getEffectDefinitionCount);
258 cls.addFunc("registerSkillsFromJson", &RPG::registerSkillsFromJson);
259 cls.addFunc("clearSkillDefinitions", &RPG::clearSkillDefinitions);
260 cls.addFunc("getSkillDefinitionCount", &RPG::getSkillDefinitionCount);
261 cls.addFunc("update", &RPG::update);
262 cls.addFunc("getTickEventCount", &RPG::getTickEventCount);
263 cls.addFunc("getTickEventActor", &RPG::getTickEventActor);
264 cls.addFunc("getTickEventInstanceId", &RPG::getTickEventInstanceId);
265 cls.addFunc("getTickEventEffectId", &RPG::getTickEventEffectId);
266 cls.addFunc("getTickEventSource", &RPG::getTickEventSource);
267 cls.addFunc("getTickEventStacks", &RPG::getTickEventStacks);
268 cls.addFunc("getStatusChangeEventCount", &RPG::getStatusChangeEventCount);
269 cls.addFunc("getStatusChangeEventActor", &RPG::getStatusChangeEventActor);
270 cls.addFunc("getStatusChangeEventInstanceId", &RPG::getStatusChangeEventInstanceId);
271 cls.addFunc("getStatusChangeEventEffectId", &RPG::getStatusChangeEventEffectId);
272 cls.addFunc("getStatusChangeEventSource", &RPG::getStatusChangeEventSource);
273 cls.addFunc("getStatusChangeEventAction", &RPG::getStatusChangeEventAction);
274 cls.addFunc("getStatusChangeEventStacks", &RPG::getStatusChangeEventStacks);
275 cls.addFunc("getStatusChangeEventReason", &RPG::getStatusChangeEventReason);
276 cls.addFunc("getCastEventCount", &RPG::getCastEventCount);
277 cls.addFunc("getCastEventCaster", &RPG::getCastEventCaster);
278 cls.addFunc("getCastEventTarget", &RPG::getCastEventTarget);
279 cls.addFunc("getCastEventSkillId", &RPG::getCastEventSkillId);
280 cls.addFunc("newSettlementContext", &RPG::newSettlementContext);
281 cls.addFunc("runSettlement", &RPG::runSettlement);
282 cls.addFunc("getSettlementStageCount", &RPG::getSettlementStageCount);
283 cls.addFunc("hasSettlementStage", &RPG::hasSettlementStage);
284 cls.addFunc("setSettlementStageEnabled", &RPG::setSettlementStageEnabled);
285 cls.addFunc("setSettlementStagePriority", &RPG::setSettlementStagePriority);
286 cls.addFunc("removeSettlementStage", &RPG::removeSettlementStage);
287 cls.addFunc("clearSettlementPipeline", &RPG::clearSettlementPipeline);
288}
289
290} // namespace eve::rpg
int priority
std::string value
HSQOBJECT cls
Definition ECS.cpp:21
uint32_t a
uint32_t c
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
const char * name
Definition RockMesh.cpp:21
bool enabled
virtual std::string getName() const =0
static void clear()
Definition Effect.cpp:38
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组批量注册效果定义,返回成功注册的数量。 每个元素形如: { "id": "poison", "durationPolicy": "duration",...
Definition Effect.cpp:71
属性 / 状态 / 技能三表合一的 ECS 实体。
Definition RPGActor.h:28
bool beginCastSkill(const std::string &skillId, RPGActor *target=nullptr)
开始读条释放;false 表示不满足条件。
Definition RPGActor.cpp:202
std::string getCastingSkillId()
Definition RPGActor.cpp:210
bool isCastingSkill()
读条状态查询。
Definition RPGActor.cpp:208
bool removeBuff(int instanceId)
Definition RPGActor.cpp:139
bool removeStatus(int instanceId)
Definition RPGActor.cpp:94
int getBuffStacks(int index)
Definition RPGActor.cpp:159
std::string canCastSkillReason(const std::string &skillId)
不能释放的原因("" = 可以)。
Definition RPGActor.cpp:196
std::string getStatusEffectId(int index)
Definition RPGActor.cpp:114
int removeAttributeModifiersBySource(const std::string &attribute, const std::string &source)
Definition RPGActor.cpp:75
void cancelCastSkill()
取消读条。
Definition RPGActor.cpp:206
int removeAllAttributeModifiersBySource(const std::string &source)
Definition RPGActor.cpp:80
static RPGActor * createActor()
创建一个空白 actor(三张表均为空,按需惰性写入),并纳入 liveActors() 跟踪。
Definition RPGActor.cpp:23
int removeStatusByTag(const std::string &tag)
Definition RPGActor.cpp:104
void setSkillCooldown(const std::string &skillId, float seconds)
Definition RPGActor.cpp:188
int removeStatusBySource(const std::string &source)
Definition RPGActor.cpp:100
std::string getBuffEffectId(int index)
Definition RPGActor.cpp:157
bool hasAttribute(const std::string &attribute)
Definition RPGActor.cpp:62
bool forgetSkill(const std::string &skillId)
Definition RPGActor.cpp:182
float getCastProgress()
Definition RPGActor.cpp:212
void learnSkill(const std::string &skillId)
技能:学习 / 查询 / 冷却。
Definition RPGActor.cpp:178
int getBuffInstanceId(int index)
Definition RPGActor.cpp:163
std::string getBuffProp(int instanceId, const std::string &key, const std::string &fallback={})
Definition RPGActor.cpp:167
int applyBuff(const std::string &effectId, const std::string &source="")
Buff 别名(与 Status API 等价,便于游戏侧按习惯命名)。
Definition RPGActor.cpp:135
bool canCastSkill(const std::string &skillId)
Definition RPGActor.cpp:192
float getBuffRemaining(int index)
Definition RPGActor.cpp:161
int getStatusStacks(int index)
Definition RPGActor.cpp:118
bool knowsSkill(const std::string &skillId)
Definition RPGActor.cpp:180
int removeBuffByEffect(const std::string &effectId)
Definition RPGActor.cpp:141
bool hasStatusTag(const std::string &tag)
Definition RPGActor.cpp:110
int removeStatusByEffect(const std::string &effectId)
Definition RPGActor.cpp:96
int removeBuffBySource(const std::string &source)
Definition RPGActor.cpp:145
bool setBuffProp(int instanceId, const std::string &key, const std::string &value)
Definition RPGActor.cpp:172
bool hasBuff(const std::string &effectId)
Definition RPGActor.cpp:151
int getStatusInstanceId(int index)
Definition RPGActor.cpp:122
bool setStatusProp(int instanceId, const std::string &key, const std::string &value)
Definition RPGActor.cpp:131
std::string getStatusSource(int index)
Definition RPGActor.cpp:124
bool hasBuffTag(const std::string &tag)
Definition RPGActor.cpp:153
std::string getStatusProp(int instanceId, const std::string &key, const std::string &fallback={})
Definition RPGActor.cpp:126
float getStatusRemaining(int index)
Definition RPGActor.cpp:120
int applyEffect(const std::string &effectId, const std::string &source="")
状态(buff/debuff)—— Statuses ECS 组件的薄封装。
Definition RPGActor.cpp:90
bool hasEffect(const std::string &effectId)
Definition RPGActor.cpp:108
int removeBuffByTag(const std::string &tag)
Definition RPGActor.cpp:149
std::string getBuffSource(int index)
Definition RPGActor.cpp:165
float getSkillCooldown(const std::string &skillId)
Definition RPGActor.cpp:184
bool removeAttributeModifier(const std::string &attribute, const std::string &modifierId)
Definition RPGActor.cpp:71
RPG 模块(eve.RPG):Actor 工厂 + 定义注册 + 帧调度 + 事件缓存。
Definition RPG.h:28
int getEffectDefinitionCount()
Definition RPG.cpp:22
bool hasSettlementStage(const std::string &pipeline, const std::string &stage)
Definition RPG.cpp:136
void clearSkillDefinitions()
Definition RPG.cpp:28
std::string getStatusChangeEventEffectId(int index) const
Definition RPG.cpp:83
bool setSettlementStageEnabled(const std::string &pipeline, const std::string &stage, bool enabled)
Definition RPG.cpp:140
RPGActor * getTickEventActor(int index) const
Definition RPG.cpp:46
void runSettlement(const std::string &pipeline, SettlementContext *ctx)
Definition RPG.cpp:127
int getSkillDefinitionCount()
Definition RPG.cpp:30
RPGActor * getStatusChangeEventActor(int index) const
Definition RPG.cpp:73
int registerSkillsFromJson(const std::string &json)
技能定义注册。
Definition RPG.cpp:24
int getTickEventInstanceId(int index) const
Definition RPG.cpp:51
bool setSettlementStagePriority(const std::string &pipeline, const std::string &stage, int priority)
Definition RPG.cpp:145
RPGActor * getCastEventTarget(int index) const
Definition RPG.cpp:115
int getStatusChangeEventInstanceId(int index) const
Definition RPG.cpp:78
int getSettlementStageCount(const std::string &pipeline)
Definition RPG.cpp:132
int registerEffectsFromJson(const std::string &json)
效果定义注册(数据驱动,进程级注册表)。
Definition RPG.cpp:16
std::string getStatusChangeEventAction(int index) const
Definition RPG.cpp:93
int getCastEventCount() const
技能释放结算事件。
Definition RPG.cpp:108
SettlementContext * newSettlementContext()
结算:新建上下文 / 运行流水线 / 配置阶段。
Definition RPG.cpp:125
void clearSettlementPipeline(const std::string &pipeline)
Definition RPG.cpp:154
std::string getStatusChangeEventReason(int index) const
Definition RPG.cpp:103
std::string getStatusChangeEventSource(int index) const
Definition RPG.cpp:88
RPGActor * newActor()
创建一个空白 RPGActor。
Definition RPG.cpp:14
int getTickEventCount() const
周期状态 tick 事件(上一次 update() 产生的,供脚本轮询)。
Definition RPG.cpp:44
int getStatusChangeEventCount() const
状态生命周期变更事件(apply/refresh/extend/stack/remove/expire/reject)。
Definition RPG.cpp:71
int getTickEventStacks(int index) const
Definition RPG.cpp:66
std::string getTickEventSource(int index) const
Definition RPG.cpp:61
void clearEffectDefinitions()
Definition RPG.cpp:20
bool removeSettlementStage(const std::string &pipeline, const std::string &stage)
Definition RPG.cpp:150
RPGActor * getCastEventCaster(int index) const
Definition RPG.cpp:110
std::string getTickEventEffectId(int index) const
Definition RPG.cpp:56
int getStatusChangeEventStacks(int index) const
Definition RPG.cpp:98
std::string getCastEventSkillId(int index) const
Definition RPG.cpp:120
void update(float dt)
推进 StatusSystem / SkillSystem,并刷新本帧的 tick / change / cast 事件缓存。
Definition RPG.cpp:32
static bool unregisterStage(const std::string &pipeline, const std::string &stage)
static void run(const std::string &pipeline, SettlementContext &ctx)
按 priority 升序依次执行 pipeline 内已启用的阶段;ctx.cancelled 时提前终止。
static int stageCount(const std::string &pipeline)
static bool hasStage(const std::string &pipeline, const std::string &stage)
static bool setStagePriority(const std::string &pipeline, const std::string &stage, int priority)
static bool setStageEnabled(const std::string &pipeline, const std::string &stage, bool enabled)
static void clearPipeline(const std::string &pipeline)
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组批量注册技能定义,返回成功注册数量。元素形如: { "id": "fireball", "cooldown": 4, "castTime": 1....
Definition Skill.cpp:67
static void clear()
Definition Skill.cpp:36
static int count()
Definition Skill.cpp:38
static void update(float dt)
遍历 RPGActor::liveActors():冷却倒计时 + 读条推进/结算。
static void pollCastEvents(std::vector< SkillCastEvent > &out)
static void update(float dt)
遍历 RPGActor::liveActors():倒计时长、到期移除、周期效果产生 tick 事件。
static void pollChanges(std::vector< StatusChangeEvent > &out)
取出并清空自上次调用以来累积的生命周期变更事件。
static void pollTicks(std::vector< StatusTickEvent > &out)
取出并清空自上次调用以来累积的周期 tick 事件(push/poll 风格,见 event 模块)。
RPG 模块入口:属性 / 效果 / 状态 / 技能 / 结算五套系统的脚本绑定与帧调度点。
结算上下文:通用的读写数据袋,字段完全由调用方与各阶段自行约定。
Definition Settlement.h:33
void addTag(const std::string &tag)
bool has(const std::string &key) const
bool hasTag(const std::string &tag) const