载入中...
搜索中...
未找到
EffectContainer.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Time.h"
6
12#include "effects/EffectTypes.h"
13
14#include <cstddef>
15#include <cstdint>
16#include <deque>
17#include <memory>
18#include <optional>
19#include <string>
20#include <vector>
21
22namespace eve::effects {
23
24class EffectExecutor;
25
36public:
40 EffectContainer() = default;
41
49 explicit EffectContainer(eve::UuidEntropySource entropy, eve::UuidClock clock = {});
50
55 EffectContainer(const EffectContainer& other);
56
62 EffectContainer& operator=(const EffectContainer& other);
63
65 EffectContainer(EffectContainer&& other) noexcept = default;
67 EffectContainer& operator=(EffectContainer&& other) noexcept = default;
68
73 [[nodiscard]] EffectContainer clone() const;
74
79 [[nodiscard]] EffectContainer snapshot() const;
80
87 [[nodiscard]] eve::Result<void> restore(const EffectContainer& snapshot);
88
97 [[nodiscard]] eve::Result<std::string> apply(const EffectDefinition& definition, const std::string& subject,
98 const std::string& source = {});
99
110 [[nodiscard]] eve::Result<eve::EffectId> applyCanonical(const EffectDefinition& definition,
111 const std::string& subject, const std::string& source = {});
112
118 [[nodiscard]] eve::Result<EffectHandle> handleFor(const std::string& id) const;
119
125 [[nodiscard]] eve::Result<const EffectInstance*> resolve(EffectHandle handle) const;
126
128 [[nodiscard]] std::uint64_t generation() const noexcept { return generation_; }
129
134 [[nodiscard]] eve::Result<std::string> apply(const std::string& subject, const std::string& type,
135 const std::string& source, int priority, double duration,
136 const std::string& stackKey, StackPolicy policy);
137
142 [[nodiscard]] eve::Result<void> remove(const std::string& id, const std::string& reason = "removed");
143
145 [[nodiscard]] eve::Result<void> remove(eve::EffectId id, const std::string& reason = "removed");
146
162 [[nodiscard]] eve::Result<std::vector<std::string>> dispel(const std::string& subject,
163 const std::string& categoryTag, int strength,
164 std::size_t maxCount,
165 const std::string& reason = "dispelled");
166
172 [[nodiscard]] eve::Result<EffectUpdateSummary> update(double dtSeconds);
173
183 [[nodiscard]] eve::Result<EffectUpdateSummary> advance(const eve::SimulationStep& step);
184
186 void clear();
187
196 [[nodiscard]] EffectInstance* find(const std::string& id);
199 [[nodiscard]] const EffectInstance* find(const std::string& id) const;
208 [[nodiscard]] EffectInstance* find(eve::EffectId id);
211 [[nodiscard]] const EffectInstance* find(eve::EffectId id) const;
213 int effectCount() const;
222 EffectInstance* effectAt(int index);
225 const EffectInstance* effectAt(int index) const;
227 int subjectCount(const std::string& subject) const;
236 EffectInstance* subjectAt(const std::string& subject, int index);
239 const EffectInstance* subjectAt(const std::string& subject, int index) const;
241 int taggedCount(const std::string& subject, const std::string& tag) const;
250 EffectInstance* taggedAt(const std::string& subject, const std::string& tag, int index);
253 const EffectInstance* taggedAt(const std::string& subject, const std::string& tag, int index) const;
254
256 int eventCount() const;
265 EffectEvent* eventAt(int index);
268 const EffectEvent* eventAt(int index) const;
270 void clearEvents();
271
273 [[nodiscard]] eve::SimulationTick currentTick() const noexcept { return lastTick_; }
276 lastTick_ = tick;
277 hasLastTick_ = tick.value() != 0;
278 }
279
280private:
281 using Store = std::deque<std::unique_ptr<EffectInstance>>;
282
283 friend class EffectExecutor;
284
285 Store::iterator findIterator(const std::string& id);
286 Store::const_iterator findIterator(const std::string& id) const;
287 Store::iterator findIterator(eve::EffectId id);
288 Store::const_iterator findIterator(eve::EffectId id) const;
289 void emit(EffectEventKind kind, const EffectInstance& effect, const std::string& reason = {});
290 std::string effectiveKey(const EffectDefinition& definition) const;
291 eve::Result<EffectUpdateSummary> advanceInstances(double dtSeconds, eve::SimulationTick tick);
292
293 std::uint64_t nextId_ = 1;
294 std::uint64_t nextSequence_ = 1;
295 std::optional<eve::UuidV7Generator> effectIdGenerator_;
296 std::uint64_t generation_ = 1;
298 bool hasLastTick_ = false;
299 Store effects_;
300 std::deque<EffectEvent> events_;
301};
302
310public:
319 [[nodiscard]] eve::Result<EffectUpdateSummary> advance(EffectContainer& container, double dtSeconds) const;
320
322 [[nodiscard]] eve::Result<EffectUpdateSummary> advance(EffectContainer& container,
323 const eve::SimulationStep& step) const;
324};
325
326} // namespace eve::effects
float duration
int subject
Definition AnimSmr.cpp:163
int priority
Definition, policy, instance and lifecycle value types for effects.
#define EVENGINE_API_FOUNDATION
每个链接组(link group)各自的导出宏。
Definition Export.h:106
TokenKind kind
const std::string * tag
std::unique_ptr< ParticleEffect > effect
PrimitiveHandle handle
LogicalId definition
SimulationTick tick
Common time values and an injectable deterministic simulation clock.
float step
Definition TreeMesh.cpp:314
uint32_t index
const UnitySourceAsset & source
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Id128 public API.
Definition Identity.h:112
static constexpr StrongUint64 zero() noexcept
Returns the zero value for this strong type.
Owns active effect instances and their deterministic lifecycle events.
EffectContainer(EffectContainer &&other) noexcept=default
Move an owning container without sharing instance storage.
eve::SimulationTick currentTick() const noexcept
Last scheduler tick consumed by the checked time API.
void restoreSchedulerTick(eve::SimulationTick tick) noexcept
Restore the scheduler cursor after an owning world checkpoint rollback.
std::uint64_t generation() const noexcept
Return the current container generation used by effect handles.
EffectContainer & operator=(EffectContainer &&other) noexcept=default
Move-assign an owning container without sharing instance storage.
EffectContainer()=default
Construct an empty effect container.
Executes lifecycle time progression for an EffectContainer.
StackPolicy
Compatibility policy used by the original effects facade.
Definition EffectTypes.h:28
EffectEventKind
Lifecycle event kind emitted by an effect container.
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
One deterministic fixed-step emitted by SimulationClock.
Definition Time.h:158
Immutable-by-convention template used to create effect instances.
Deterministically sequenced effect lifecycle event.
One owned runtime effect fact.