载入中...
搜索中...
未找到
EffectContainer.cpp
浏览该文件的文档.
35eve::Result<double> mergeDuration(const EffectInstance& current, const EffectDefinition& definition) {
38 case DurationPolicy::Replace: return eve::Result<double>::success(normalisedRemaining(definition.duration));
51eve::Result<double> mergeMagnitude(const EffectInstance& current, const EffectDefinition& definition) {
66 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "unknown effect magnitude policy"));
80eve::Result<std::uint32_t> mergeStackCount(const EffectInstance& current, const EffectDefinition& definition) {
97 eve::Diagnostic::error(eve::DiagnosticCode::Conflict, "effect stack count exceeds its maximum"));
143 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::InvariantViolation,
150 eve::Diagnostic::error(eve::DiagnosticCode::InvariantViolation, "effect container generation overflow"));
162void EffectContainer::emit(EffectEventKind kind, const EffectInstance& effect, const std::string& reason) {
177 return std::find_if(effects_.begin(), effects_.end(), [&id](const auto& effect) { return effect->id == id; });
180EffectContainer::Store::const_iterator EffectContainer::findIterator(const std::string& id) const {
181 return std::find_if(effects_.begin(), effects_.end(), [&id](const auto& effect) { return effect->id == id; });
194eve::Result<std::string> EffectContainer::apply(const EffectDefinition& definition, const std::string& subject,
222 if (stackWouldOverflow(current, definition) && definition.policy.overflow == OverflowPolicy::ReplaceOldest) {
237 return eve::Result<std::string>::success(current.id, eve::Status::success(eve::StatusCode::Applied));
247 if (stackWouldOverflow(current, definition) && definition.policy.overflow == OverflowPolicy::ReplaceOldest) {
266 return eve::Result<std::string>::success(current.id, eve::Status::success(eve::StatusCode::Applied));
286 eve::Diagnostic::error(eve::DiagnosticCode::Failed, "canonical effect identity generation failed"));
290 eve::Diagnostic::error(eve::DiagnosticCode::Conflict, "canonical effect identity already exists"));
316 return eve::Result<std::string>::success(result, eve::Status::success(eve::StatusCode::Applied));
323 eve::DiagnosticCode::Unsupported, "canonical effect identity requires an injected UUID entropy source"));
330 return eve::Result<eve::EffectId>::success(*id, eve::Status::success(eve::StatusCode::Applied));
336 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "effect handle id must not be empty", "id"));
347 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "effect handle is invalid", "handle"));
350 eve::DiagnosticCode::StaleHandle, "effect handle belongs to an older container generation", "handle"));
355 return eve::Result<const EffectInstance*>::success(instance, eve::Status::success(eve::StatusCode::Applied));
358eve::Result<std::string> EffectContainer::apply(const std::string& subject, const std::string& type,
396 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "dispel subject must not be empty",
400 eve::Diagnostic::error(eve::DiagnosticCode::InvalidArgument, "dispel category tag must not be empty",
419 if (instance->subject == subject && instance->priority <= strength && instance->hasTag(categoryTag) &&
447eve::Result<EffectUpdateSummary> EffectContainer::advanceInstances(double dtSeconds, eve::SimulationTick tick) {
452 return eve::Result<EffectUpdateSummary>::success(summary, eve::Status::success(eve::StatusCode::NoOp));
456 const double activeDelta = effect.remaining < 0.0 ? dtSeconds : std::min(dtSeconds, effect.remaining);
491 return eve::Result<EffectUpdateSummary>::success(summary, eve::Status::success(eve::StatusCode::Applied));
498 auto nextTick = hasLastTick_ ? lastTick_.incremented() : std::optional<eve::SimulationTick>(eve::SimulationTick(1));
501 eve::Diagnostic::error(eve::DiagnosticCode::InvariantViolation, "effect simulation tick overflow"));
512 eve::Diagnostic::error(eve::DiagnosticCode::Conflict, "effect simulation tick must advance monotonically"));
597EffectInstance* EffectContainer::taggedAt(const std::string& subject, const std::string& tag, int index) {
604const EffectInstance* EffectContainer::taggedAt(const std::string& subject, const std::string& tag, int index) const {
625eve::Result<EffectUpdateSummary> EffectExecutor::advance(EffectContainer& container, double dtSeconds) const {
Owning effect storage and lifecycle-only executor.
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< Duration > fromSeconds(double seconds)
Convert finite seconds to the nearest nanosecond.
Definition Time.cpp:16
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
static std::optional< Id128 > parse(std::string_view text) noexcept
Parses canonical UUID text.
Definition Identity.h:151
static constexpr Id128 fromUuid(const Id128< OtherTag > &value) noexcept
Re-tags an existing UUID at an explicit domain boundary.
Definition Identity.h:136
static constexpr StrongUint64 zero() noexcept
Returns the zero value for this strong type.
Definition StrongUint64.h:24
Owns active effect instances and their deterministic lifecycle events.
Definition EffectContainer.h:35
eve::Result< std::vector< std::string > > dispel(const std::string &subject, const std::string &categoryTag, int strength, std::size_t maxCount, const std::string &reason="dispelled")
Atomically remove matching dispellable effects in deterministic priority order.
Definition EffectContainer.cpp:391
EffectContainer snapshot() const
Capture an independent lifecycle snapshot for staging/restore.
Definition EffectContainer.cpp:138
eve::Result< const EffectInstance * > resolve(EffectHandle handle) const
Resolve a generation-qualified handle for this call.
Definition EffectContainer.cpp:344
eve::Result< eve::EffectId > applyCanonical(const EffectDefinition &definition, const std::string &subject, const std::string &source={})
Applies a definition and returns its UUID-backed effect identity.
Definition EffectContainer.cpp:319
eve::Result< void > remove(const std::string &id, const std::string &reason="removed")
Removes one active instance and emits a Removed event.
Definition EffectContainer.cpp:375
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
EffectContainer clone() const
Create an independent deep copy suitable for ECS staging.
Definition EffectContainer.cpp:136
EffectContainer & operator=(const EffectContainer &other)
Deep-copy assign a container, including instances, events and counters.
Definition EffectContainer.cpp:120
eve::Result< EffectUpdateSummary > update(double dtSeconds)
Advances finite instances through the lifecycle executor.
Definition EffectContainer.cpp:494
eve::Result< EffectHandle > handleFor(const std::string &id) const
Return a generation-qualified handle for a live instance.
Definition EffectContainer.cpp:333
eve::Result< EffectUpdateSummary > advance(const eve::SimulationStep &step)
Advances lifecycle state using one scheduler-owned simulation step.
Definition EffectContainer.cpp:506
eve::Result< std::string > apply(const EffectDefinition &definition, const std::string &subject, const std::string &source={})
Applies a definition and returns the stable instance identifier.
Definition EffectContainer.cpp:194
eve::Result< void > restore(const EffectContainer &snapshot)
Restore a previously captured snapshot as one observable commit.
Definition EffectContainer.cpp:140
EffectContainer()=default
Construct an empty effect container.
Definition EffectContainer.cpp:10
@ Replace
@ Refresh
@ Replace
@ Accumulate
@ NewInstance
@ ReplaceOldest
@ Increment
@ Refreshed
@ InvalidArgument
@ NotFound
@ Unsupported
@ InvariantViolation
@ Failed
@ StaleHandle
@ Conflict
@ NoOp
@ Applied
@ Conflict
std::function< std::chrono::system_clock::time_point()> UuidClock
Clock callback used by the injectable UUIDv7 generator.
Definition Identity.h:469
std::function< bool(std::span< std::uint8_t > bytes)> UuidEntropySource
Entropy callback used by UUIDv7 generation.
Definition Identity.h:466
Immutable-by-convention template used to create effect instances.
Definition EffectTypes.h:100
Deterministically sequenced effect lifecycle event.
Definition EffectTypes.h:185
Generation-qualified local reference to a canonical effect instance.
Definition EffectTypes.h:173
Summary returned by the lifecycle executor after one simulation step.
Definition EffectTypes.h:212