载入中...
搜索中...
未找到
StatusSystem.cpp
浏览该文件的文档.
47 return rejected<void>(eve::DiagnosticCode::InvalidArgument, "effect definition id must not be empty");
60 return rejected<void>(eve::DiagnosticCode::InvalidArgument, "effect definition maxStacks must be non-negative");
61 if (!isBuiltinStackPolicy(definition.stackPolicy) && !StatusSystem::hasStackPolicy(definition.stackPolicy)) {
68 return rejected<void>(eve::DiagnosticCode::InvalidArgument, "effect modifier attribute must not be empty");
70 return rejected<void>(eve::DiagnosticCode::InvalidArgument, "effect modifier value must be finite");
78 if (!AttributeSystem::customOps().has(modifier.op)) return eve::Result<void>::failure(diagnostic);
85LifecycleDefinition makeLifecycleDefinition(const EffectDefinition &definition, ::eve::effects::StackMode stackMode,
96 duration >= 0.0 ? duration : (definition.durationPolicy == "duration" ? double(definition.duration) : 0.0);
104 result.policy.maxStacks = definition.maxStacks == 0 ? 0u : static_cast<std::uint32_t>(definition.maxStacks);
137StatusInstance project(const LifecycleInstance &effect, const StatusMetadata &metadata, int legacyId) {
165eve::Result<void> validateCandidate(const StatusInstance &candidate, const StatusInstance ¤t,
183eve::Result<void> removeBindings(::eve::attributes::AttributeSet &attributes, const StatusMetadata &metadata) {
192eve::Result<std::vector<ModifierBinding>> prepareModifierBindings(::eve::attributes::AttributeSet &attributes,
278void StatusSystem::unregisterApplyCondition(const std::string &name) { applyConditions().erase(name); }
280bool StatusSystem::hasApplyCondition(const std::string &name) { return applyConditions().count(name) > 0; }
288void StatusSystem::unregisterStackPolicy(const std::string &name) { stackPolicies().erase(name); }
290bool StatusSystem::hasStackPolicy(const std::string &name) { return stackPolicies().count(name) > 0; }
298void StatusSystem::unregisterLifecycleHook(const std::string &name) { lifecycleHooks().erase(name); }
300bool StatusSystem::hasLifecycleHook(const std::string &name) { return lifecycleHooks().count(name) > 0; }
315eve::Result<int> StatusSystem::apply(RPGActor *actor, const std::string &effectId, const std::string &source) {
316 if (!actor) return rejected<int>(eve::DiagnosticCode::InvalidArgument, "status application requires an actor");
320 return rejected<int>(eve::DiagnosticCode::NotFound, "effect definition was not found: " + effectId,
324 if (!definitionValidation.ok()) return eve::Result<int>::failure(definitionValidation.status());
398 if (policyResult == 0) return eve::Result<int>::success(0, eve::Status::success(eve::StatusCode::NoOp));
431 auto bindings = prepareModifierBindings(candidateAttributes, *definition, *updated, oldMetadata);
443 std::move(candidateLegacyIdByEffect), std::move(candidateEffectByLegacyId), statuses->nextInstanceId,
467 return rejected<int>(eve::DiagnosticCode::Conflict, "effect is already active and uses stackPolicy:none",
488 makeLifecycleDefinition(*definition, ::eve::effects::StackMode::Reuse, stackCount, durationPolicy);
503 auto bindings = prepareModifierBindings(candidateAttributes, *definition, *updated, oldMetadata);
505 const int updatedStacks = updated->stackCount > static_cast<std::uint32_t>(std::numeric_limits<int>::max())
512 commit(actor, std::move(candidateContainer), std::move(candidateMetadata), std::move(candidateLegacyIdByEffect),
513 std::move(candidateEffectByLegacyId), statuses->nextInstanceId, std::move(candidateAttributes));
552 auto bindings = prepareModifierBindings(candidateAttributes, *definition, *created, emptyMetadata);
554 const int createdStacks = created->stackCount > static_cast<std::uint32_t>(std::numeric_limits<int>::max())
574 if (!actor) return rejected<void>(eve::DiagnosticCode::InvalidArgument, "status removal requires an actor");
601 commit(actor, std::move(candidateContainer), std::move(candidateMetadata), std::move(candidateLegacyIdByEffect),
649 matchingIds(*actor->statuses(), [&source](const LifecycleInstance &effect) { return effect.source == source; });
656 matchingIds(*actor->statuses(), [&tag](const LifecycleInstance &effect) { return effect.hasTag(tag); });
673int StatusSystem::getActiveCount(RPGActor *actor) { return actor ? actor->statuses()->container.effectCount() : 0; }
719bool StatusSystem::setProp(RPGActor *actor, int instanceId, const std::string &key, const std::string &value) {
798 if (!oldEffect || oldMetadata == statuses->metadata.end() || mapping == statuses->legacyIdByEffect.end())
804 if (!bindingsRemoved.ok()) return eve::Result<StatusUpdateSummary>::failure(bindingsRemoved.status());
812 expired.stacks = oldEffect->stackCount > static_cast<std::uint32_t>(std::numeric_limits<int>::max())
821 commit(actor, std::move(candidateContainer), std::move(candidateMetadata), std::move(candidateLegacyIdByEffect),
822 std::move(candidateEffectByLegacyId), statuses->nextInstanceId, std::move(candidateAttributes));
833 return eve::Result<StatusUpdateSummary>::success(std::move(total), eve::Status::success(eve::StatusCode::Applied));
RPG's thin compatibility facade over the attributes module.
std::array< std::uint64_t, kPixelChunkSize *kPixelChunkSize > updated
Definition PixelWorld.cpp:53
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
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status failure(StatusCode code, Diagnostic diagnostic)
Construct a failed status with one diagnostic.
Definition Status.h:84
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Generic owning collection of canonical attributes and modifiers.
Definition AttributeSet.h:160
eve::Result< ModifierId > addModifier(AttributeModifier modifier)
Add or replace a canonical modifier and return its stable id.
Definition AttributeSet.cpp:262
eve::Result< void > removeModifier(const ModifierId &id)
Remove one modifier with a structured result.
Definition AttributeSet.cpp:305
Owns active effect instances and their deterministic lifecycle events.
Definition EffectContainer.h:35
EffectInstance * effectAt(int index)
Returns an active instance by deterministic index, or nullptr. @ownership Borrowed from this containe...
Definition EffectContainer.cpp:560
EffectInstance * find(const std::string &id)
Returns an active instance by stable id, or nullptr when absent. @ownership Borrowed from this contai...
Definition EffectContainer.cpp:538
int effectCount() const
Returns active instance count in deterministic creation order.
Definition EffectContainer.cpp:558
static AttributeOpTable & customOps()
Process-wide custom policy registry used only for Custom modifiers.
Definition AttributeSystem.cpp:28
static const EffectDefinition * find(const std::string &id)
Find a registered effect definition by id.
Definition Effect.cpp:30
static const std::vector< RPGActor * > & liveActors()
返回所有通过 createActor() 创建、且当前仍存活的 actor。 StatusSystem::update / SkillSystem::update 用它遍历所有 actor 逐帧推进。 ...
Definition RPGActor.cpp:42
static bool setProp(RPGActor *actor, int instanceId, const std::string &key, const std::string &value)
Sets the prop.
Definition StatusSystem.cpp:719
static std::string getActiveSource(RPGActor *actor, int index)
Returns the active source.
Definition StatusSystem.cpp:702
static void unregisterLifecycleHook(const std::string &name)
Unregisters lifecycle hook.
Definition StatusSystem.cpp:298
static eve::Result< void > remove(RPGActor *actor, int instanceId)
Removal of one status by its legacy adapter id.
Definition StatusSystem.cpp:573
std::function< bool(RPGActor *actor, const EffectDefinition &def, const std::string &source, std::string &outReason)> ApplyCondition
施加前条件:返回 false 表示拒绝施加。 全部已注册条件按注册表遍历(AND);任一失败则 apply 返回 -1 并产生 action="reject" 事件。
Definition StatusSystem.h:35
std::function< int(RPGActor *actor, StatusInstance &existing, const EffectDefinition &def, const std::string &source)> StackPolicyFn
自定义叠加策略:在已有效果的临时 StatusInstance projection 上运行。
Definition StatusSystem.h:46
static int getActiveStacks(RPGActor *actor, int index)
Returns the active stacks.
Definition StatusSystem.cpp:681
static bool hasApplyCondition(const std::string &name)
True when apply condition.
Definition StatusSystem.cpp:280
static bool hasStackPolicy(const std::string &name)
True when stack policy.
Definition StatusSystem.cpp:290
static void pollChanges(std::vector< StatusChangeEvent > &out)
取出并清空自上次调用以来累积的生命周期变更事件。
Definition StatusSystem.cpp:842
static bool hasLifecycleHook(const std::string &name)
True when lifecycle hook.
Definition StatusSystem.cpp:300
static int getActiveInstanceId(RPGActor *actor, int index)
Returns the active instance id.
Definition StatusSystem.cpp:696
static bool hasEffect(RPGActor *actor, const std::string &effectId)
True when effect.
Definition StatusSystem.cpp:660
static void unregisterApplyCondition(const std::string &name)
Unregisters apply condition.
Definition StatusSystem.cpp:278
static void pollTicks(std::vector< StatusTickEvent > &out)
取出并清空自上次调用以来累积的周期 tick 事件(push/poll 风格,见 event 模块)。
Definition StatusSystem.cpp:836
static bool hasTag(RPGActor *actor, const std::string &tag)
是否存在任一效果定义带有该 tag 的活动实例。
Definition StatusSystem.cpp:664
static int removeBySource(RPGActor *actor, const std::string &source)
移除该 actor 身上所有 source 匹配的实例;返回移除数量。
Definition StatusSystem.cpp:646
static void registerApplyCondition(const std::string &name, ApplyCondition fn)
Registers apply condition.
Definition StatusSystem.cpp:274
static void registerStackPolicy(const std::string &name, StackPolicyFn fn)
Registers stack policy.
Definition StatusSystem.cpp:284
static std::string getProp(RPGActor *actor, int instanceId, const std::string &key, const std::string &fallback={})
按实例 id 读写 props;找不到实例时 get 返回 fallback,set 返回 false。
Definition StatusSystem.cpp:708
static void registerLifecycleHook(const std::string &name, LifecycleHook fn)
Registers lifecycle hook.
Definition StatusSystem.cpp:294
static int removeByEffect(RPGActor *actor, const std::string &effectId)
移除该 actor 身上所有 effectId 匹配的实例;返回移除数量。
Definition StatusSystem.cpp:639
static eve::Result< StatusUpdateSummary > update(double dt)
Advance all live RPG status executors with an injected simulation delta.
Definition StatusSystem.cpp:729
static void unregisterStackPolicy(const std::string &name)
Unregisters stack policy.
Definition StatusSystem.cpp:288
std::function< void(const StatusChangeEvent &ev)> LifecycleHook
生命周期钩子:每次产生 StatusChangeEvent 时同步回调(在事件入队之后)。
Definition StatusSystem.h:49
static int removeByTag(RPGActor *actor, const std::string &tag)
移除该 actor 身上所有 tag 匹配(效果定义带该 tag)的实例;返回移除数量。
Definition StatusSystem.cpp:653
static std::string getActiveEffectId(RPGActor *actor, int index)
Returns the active effect id.
Definition StatusSystem.cpp:675
static eve::Result< int > apply(RPGActor *actor, const std::string &effectId, const std::string &source="")
Status application backed by the generic EffectContainer.
Definition StatusSystem.cpp:315
static float getActiveRemaining(RPGActor *actor, int index)
Returns the active remaining.
Definition StatusSystem.cpp:690
eve::Result< ParsedAttributeOperation > parseAttributeOperation(std::string_view operation, double value)
Parse a built-in operation spelling used by existing data and APIs.
Definition AttributeSet.cpp:34
Result< T > rejected(RuleId rule, std::string message, eve::DiagnosticCode code=eve::DiagnosticCode::PreconditionViolation)
Construct a Rejected result for invalid editing input or preconditions.
Definition EditingResult.h:108
ssq::Table project(HSQUIRRELVM vm, const eve::Result< void > &result)
Project a completed editing result that has no payload.
Definition EditorScriptProjection.h:28
StackMode
Determines whether a matching application replaces, reuses, or creates an instance.
Definition EffectTypes.h:31
@ NewInstance
OverflowPolicy
Determines what happens when a stack-count limit would be exceeded.
Definition EffectTypes.h:43
DurationPolicy
Determines how an application changes an existing remaining duration.
Definition EffectTypes.h:37
StackCountPolicy
Determines how an application changes an existing stack count.
Definition EffectTypes.h:34
@ Increment
::eve::attributes::AttributeModifier AttributeModifier
Definition AttributeTypes.h:21
std::vector< std::string > matchingIds(const RPGActor::Statuses &statuses, const std::function< bool(const LifecycleInstance &)> &predicate)
Definition StatusSystem.cpp:615
int removeMatching(RPGActor *actor, const std::vector< std::string > &canonicalIds)
Definition StatusSystem.cpp:626
@ InvalidArgument
@ NotFound
@ PreconditionViolation
@ InvariantViolation
@ Conflict
@ NotFound
@ NoOp
@ Applied
@ Rejected
@ Failed
@ Conflict
Immutable-by-convention template used to create effect instances.
Definition EffectTypes.h:100
Status lifecycle component backed by the generic effects container.
Definition RPGActor.h:58
std::unordered_map< std::string, int > legacyIdByEffect
Definition RPGActor.h:61
::eve::effects::EffectContainer container
Definition RPGActor.h:59
std::unordered_map< std::string, StatusExecutorMetadata > metadata
Definition RPGActor.h:60
std::unordered_map< int, std::string > effectByLegacyId
Definition RPGActor.h:62
状态生命周期变更事件(施加 / 刷新 / 叠层 / 延长 / 移除 / 到期 / 拒绝)。 与 StatusTickEvent 分开:tick 是周期性数值触发,change 是实例结构变化。
Definition StatusTypes.h:84
Legacy RPG projection of one effects::EffectInstance.
Definition StatusTypes.h:26
std::unordered_map< std::string, std::string > props
运行时自定义键值(图标路径、UI 着色、脚本标记……)。 与 EffectDefinition::extra(定义侧)互补:extra 是模板数据,props 是实例数据。
Definition StatusTypes.h:41
周期性状态触发的 tick 事件。周期效果(period > 0)不会自动修改属性, 而是每个周期产生一个 tick 事件交给上层(脚本或 C++ 结算系统)处理—— 这样伤害/治疗类周期效果可以完整地...
Definition StatusTypes.h:69
Summary returned by the checked RPG status executor update.
Definition StatusTypes.h:57