载入中...
搜索中...
未找到
StatusSystem.h
浏览该文件的文档.
1#pragma once
2
3// 状态(buff/debuff)系统:把 EffectDefinition 施加/移除为具体 actor 身上的
4// StatusInstance,并驱动持续时间 / 周期 tick。
5//
6// 可插拔扩展点(与 inventory 模块同风格):
7// - registerApplyCondition — 免疫 / 抗性 / 互斥等"能否施加"判断
8// - registerStackPolicy — 内置 none/refresh/extend/stack 之外的自定义叠加策略
9// - registerLifecycleHook — 施加/刷新/叠层/移除/到期时的副作用(UI、成就、VFX)
10// - EffectDefinition::extra / StatusInstance::props — 任意自定义字段无需扩结构体
11
12#include "rpg/StatusTypes.h"
13
14#include <functional>
15#include <string>
16#include <unordered_map>
17#include <vector>
18
19namespace eve::rpg {
20
21class RPGActor;
22struct EffectDefinition;
23
25public:
30 using ApplyCondition = std::function<bool(RPGActor *actor, const EffectDefinition &def,
31 const std::string &source, std::string &outReason)>;
32
39 using StackPolicyFn = std::function<int(RPGActor *actor, StatusInstance &existing,
40 const EffectDefinition &def, const std::string &source)>;
41
43 using LifecycleHook = std::function<void(const StatusChangeEvent &ev)>;
44
45 static void registerApplyCondition(const std::string &name, ApplyCondition fn);
46 static void unregisterApplyCondition(const std::string &name);
47 static bool hasApplyCondition(const std::string &name);
48 static void clearApplyConditions();
49
50 static void registerStackPolicy(const std::string &name, StackPolicyFn fn);
51 static void unregisterStackPolicy(const std::string &name);
52 static bool hasStackPolicy(const std::string &name);
53 static void clearStackPolicies();
54
55 static void registerLifecycleHook(const std::string &name, LifecycleHook fn);
56 static void unregisterLifecycleHook(const std::string &name);
57 static bool hasLifecycleHook(const std::string &name);
58 static void clearLifecycleHooks();
59
66 static int apply(RPGActor *actor, const std::string &effectId, const std::string &source = "");
67
69 static bool remove(RPGActor *actor, int instanceId);
70
72 static int removeByEffect(RPGActor *actor, const std::string &effectId);
73
75 static int removeBySource(RPGActor *actor, const std::string &source);
76
78 static int removeByTag(RPGActor *actor, const std::string &tag);
79
80 static bool hasEffect(RPGActor *actor, const std::string &effectId);
82 static bool hasTag(RPGActor *actor, const std::string &tag);
83 static int getActiveCount(RPGActor *actor);
84 static std::string getActiveEffectId(RPGActor *actor, int index);
85 static int getActiveStacks(RPGActor *actor, int index);
86 static float getActiveRemaining(RPGActor *actor, int index);
87 static int getActiveInstanceId(RPGActor *actor, int index);
88 static std::string getActiveSource(RPGActor *actor, int index);
89
91 static std::string getProp(RPGActor *actor, int instanceId, const std::string &key,
92 const std::string &fallback = {});
93 static bool setProp(RPGActor *actor, int instanceId, const std::string &key,
94 const std::string &value);
95
97 static void update(float dt);
98
100 static void pollTicks(std::vector<StatusTickEvent> &out);
101
103 static void pollChanges(std::vector<StatusChangeEvent> &out);
104
105private:
106 static void emitChange(StatusChangeEvent ev);
107 static StatusInstance *findByInstanceId(RPGActor *actor, int instanceId);
108
109 static std::unordered_map<std::string, ApplyCondition> &applyConditions();
110 static std::unordered_map<std::string, StackPolicyFn> &stackPolicies();
111 static std::unordered_map<std::string, LifecycleHook> &lifecycleHooks();
112};
113
114} // namespace eve::rpg
std::string value
const char * name
Definition RockMesh.cpp:21
SettlementPipeline::Stage fn
属性 / 状态 / 技能三表合一的 ECS 实体。
Definition RPGActor.h:28
static bool setProp(RPGActor *actor, int instanceId, const std::string &key, const std::string &value)
static void clearStackPolicies()
static std::string getActiveSource(RPGActor *actor, int index)
static void unregisterLifecycleHook(const std::string &name)
static int apply(RPGActor *actor, const std::string &effectId, const std::string &source="")
施加一个效果。返回值: -1 — 失败(actor 为空 / 效果不存在 / 条件拒绝 / stackPolicy 拒绝重复) 0 — durationPolicy=="instant":已立即生效,无...
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
自定义叠加策略:当已存在同 effectId 实例且 stackPolicy 名命中本注册表时调用。 返回值约定与 apply() 相同(-1 拒绝 / >0 实例 id)。策略内部可改写 stacks...
static void update(float dt)
遍历 RPGActor::liveActors():倒计时长、到期移除、周期效果产生 tick 事件。
static int getActiveStacks(RPGActor *actor, int index)
static bool hasApplyCondition(const std::string &name)
static bool hasStackPolicy(const std::string &name)
static void pollChanges(std::vector< StatusChangeEvent > &out)
取出并清空自上次调用以来累积的生命周期变更事件。
static bool hasLifecycleHook(const std::string &name)
static int getActiveInstanceId(RPGActor *actor, int index)
static bool hasEffect(RPGActor *actor, const std::string &effectId)
static void unregisterApplyCondition(const std::string &name)
static void clearLifecycleHooks()
static void pollTicks(std::vector< StatusTickEvent > &out)
取出并清空自上次调用以来累积的周期 tick 事件(push/poll 风格,见 event 模块)。
static bool hasTag(RPGActor *actor, const std::string &tag)
是否存在任一效果定义带有该 tag 的活动实例。
static int removeBySource(RPGActor *actor, const std::string &source)
移除该 actor 身上所有 source 匹配的实例;返回移除数量。
static bool remove(RPGActor *actor, int instanceId)
按实例 id 精确移除(撤销其属性修改器);返回是否命中。
static void registerApplyCondition(const std::string &name, ApplyCondition fn)
static void registerStackPolicy(const std::string &name, StackPolicyFn fn)
static int getActiveCount(RPGActor *actor)
static std::string getProp(RPGActor *actor, int instanceId, const std::string &key, const std::string &fallback={})
按实例 id 读写 props;找不到实例时 get 返回 fallback,set 返回 false。
static void registerLifecycleHook(const std::string &name, LifecycleHook fn)
static int removeByEffect(RPGActor *actor, const std::string &effectId)
移除该 actor 身上所有 effectId 匹配的实例;返回移除数量。
static void unregisterStackPolicy(const std::string &name)
static void clearApplyConditions()
std::function< void(const StatusChangeEvent &ev)> LifecycleHook
生命周期钩子:每次产生 StatusChangeEvent 时同步回调(在事件入队之后)。
static int removeByTag(RPGActor *actor, const std::string &tag)
移除该 actor 身上所有 tag 匹配(效果定义带该 tag)的实例;返回移除数量。
static std::string getActiveEffectId(RPGActor *actor, int index)
static float getActiveRemaining(RPGActor *actor, int index)
RPG 模块入口:属性 / 效果 / 状态 / 技能 / 结算五套系统的脚本绑定与帧调度点。
状态生命周期变更事件(施加 / 刷新 / 叠层 / 延长 / 移除 / 到期 / 拒绝)。 与 StatusTickEvent 分开:tick 是周期性数值触发,change 是实例结构变化。
Definition StatusTypes.h:59
状态实例:某个 Effect 施加到某个 actor 后的运行时记录。
Definition StatusTypes.h:20