载入中...
搜索中...
未找到
StatusSystem.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5// 状态(buff/debuff)系统:把 RPG EffectDefinition 适配到通用
6// effects::EffectContainer,并由 RPG executor 驱动 modifier / 周期结算。
7//
8// 可插拔扩展点(与 inventory 模块同风格):
9// - registerApplyCondition — 免疫 / 抗性 / 互斥等"能否施加"判断
10// - registerStackPolicy — 内置 none/refresh/extend/stack 之外的自定义叠加策略
11// - registerLifecycleHook — 施加/刷新/叠层/移除/到期时的副作用(UI、成就、VFX)
12// - EffectDefinition::extra / StatusInstance::props — 任意自定义字段无需扩结构体
13
14#include "common/Result.h"
15#include "rpg/StatusTypes.h"
16
17#include <functional>
18#include <string>
19#include <unordered_map>
20#include <vector>
21
22namespace eve::rpg {
23
24class RPGActor;
25struct EffectDefinition;
26
29public:
34 using ApplyCondition = std::function<bool(RPGActor *actor, const EffectDefinition &def,
35 const std::string &source, std::string &outReason)>;
36
45 using StackPolicyFn = std::function<int(RPGActor *actor, StatusInstance &existing,
46 const EffectDefinition &def, const std::string &source)>;
47
49 using LifecycleHook = std::function<void(const StatusChangeEvent &ev)>;
50
52 static void registerApplyCondition(const std::string &name, ApplyCondition fn);
54 static void unregisterApplyCondition(const std::string &name);
56 static bool hasApplyCondition(const std::string &name);
58 static void clearApplyConditions();
59
61 static void registerStackPolicy(const std::string &name, StackPolicyFn fn);
63 static void unregisterStackPolicy(const std::string &name);
65 static bool hasStackPolicy(const std::string &name);
67 static void clearStackPolicies();
68
70 static void registerLifecycleHook(const std::string &name, LifecycleHook fn);
72 static void unregisterLifecycleHook(const std::string &name);
74 static bool hasLifecycleHook(const std::string &name);
76 static void clearLifecycleHooks();
77
84 [[nodiscard]] static eve::Result<int> apply(RPGActor *actor, const std::string &effectId,
85 const std::string &source = "");
86
91 [[nodiscard]] static eve::Result<void> remove(RPGActor *actor, int instanceId);
92
94 static int removeByEffect(RPGActor *actor, const std::string &effectId);
95
97 static int removeBySource(RPGActor *actor, const std::string &source);
98
100 static int removeByTag(RPGActor *actor, const std::string &tag);
101
103 static bool hasEffect(RPGActor *actor, const std::string &effectId);
105 static bool hasTag(RPGActor *actor, const std::string &tag);
107 static int getActiveCount(RPGActor *actor);
109 static std::string getActiveEffectId(RPGActor *actor, int index);
111 static int getActiveStacks(RPGActor *actor, int index);
113 static float getActiveRemaining(RPGActor *actor, int index);
115 static int getActiveInstanceId(RPGActor *actor, int index);
117 static std::string getActiveSource(RPGActor *actor, int index);
118
120 static std::string getProp(RPGActor *actor, int instanceId, const std::string &key,
121 const std::string &fallback = {});
123 static bool setProp(RPGActor *actor, int instanceId, const std::string &key,
124 const std::string &value);
125
130 [[nodiscard]] static eve::Result<StatusUpdateSummary> update(double dt);
131
133 static void pollTicks(std::vector<StatusTickEvent> &out);
134
136 static void pollChanges(std::vector<StatusChangeEvent> &out);
137
138private:
139 static void emitChange(StatusChangeEvent ev);
140
141 static std::unordered_map<std::string, ApplyCondition> &applyConditions();
142 static std::unordered_map<std::string, StackPolicyFn> &stackPolicies();
143 static std::unordered_map<std::string, LifecycleHook> &lifecycleHooks();
144};
145
146} // namespace eve::rpg
double value
#define EVENGINE_API_PLATFORM
Definition Export.h:107
std::uint32_t key
std::string name
const std::string * tag
Move-only, checked operation results for the common layer.
uint32_t index
const UnitySourceAsset & source
Move-only operation result carrying either a value or Status.
Definition Result.h:155
属性 / 状态 / 技能三表合一的 ECS 实体。
Definition RPGActor.h:34
EVENGINE_API_PLATFORM public API.
std::function< bool(RPGActor *actor, const EffectDefinition &def, const std::string &source, std::string &outReason)> ApplyCondition
施加前条件:返回 false 表示拒绝施加。 全部已注册条件按注册表遍历(AND);任一失败则 apply 返回 -1 并产生 action="reject" 事件。
std::function< int(RPGActor *actor, StatusInstance &existing, const EffectDefinition &def, const std::string &source)> StackPolicyFn
自定义叠加策略:在已有效果的临时 StatusInstance projection 上运行。
std::function< void(const StatusChangeEvent &ev)> LifecycleHook
生命周期钩子:每次产生 StatusChangeEvent 时同步回调(在事件入队之后)。
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
SettlementPipeline::Stage fn
EVENGINE_API_PLATFORM public API.
Definition Effect.h:35
状态生命周期变更事件(施加 / 刷新 / 叠层 / 延长 / 移除 / 到期 / 拒绝)。 与 StatusTickEvent 分开:tick 是周期性数值触发,change 是实例结构变化。
Definition StatusTypes.h:84
Legacy RPG projection of one effects::EffectInstance.
Definition StatusTypes.h:26