载入中...
搜索中...
未找到
Settlement.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
16#include "common/Result.h"
17#include "common/Identity.h"
18#include "common/Snapshot.h"
19#include "common/SubjectRef.h"
20#include "common/Time.h"
21#include "common/Value.h"
23
24#include <cstddef>
25#include <cstdint>
26#include <functional>
27#include <optional>
28#include <span>
29#include <string>
30#include <string_view>
31#include <vector>
32
33namespace eve::settlement {
34
36enum class StageKind : std::uint8_t {
42 Clamp,
43 Apply,
44 Trigger,
45 Event,
46};
47
49enum class SettlementDisposition : std::uint8_t {
50 Applied,
51 NoOp,
52 Immune,
55 Blocked,
57};
58
60enum class SettlementTraceLevel : std::uint8_t { Off, Summary, Full };
61
70[[nodiscard]] EVENGINE_API_FOUNDATION const char* settlementDispositionName(SettlementDisposition disposition) noexcept;
71
75 std::uint64_t sequence = 0;
76 double sample = 0.0;
77 double threshold = 0.0;
78 bool accepted = false;
79};
80
83 std::uint32_t depth = 0;
84 std::uint32_t emittedCount = 0;
85 std::vector<std::string> triggerPath;
86};
87
96[[nodiscard]] EVENGINE_API_FOUNDATION const char* stageKindName(StageKind kind) noexcept;
97
110 std::string kind;
111
113 std::string resource;
114
115 double magnitude = 0.0;
116 std::vector<std::string> tags;
117 std::vector<SettlementRandomDecision> decisions;
119 std::string trigger;
121 SettlementTraceLevel trace = SettlementTraceLevel::Full;
123 SimulationTick tick = SimulationTick::zero();
126};
127
137
146 StageKind kind = StageKind::Validate;
147 std::string name;
149 double before = 0.0;
150 double after = 0.0;
152};
153
164 double requested = 0.0;
165 double applied = 0.0;
166 double absorbed = 0.0;
167 double resisted = 0.0;
168 double clamped = 0.0;
169 bool critical = false;
170 SettlementDisposition disposition = SettlementDisposition::NoOp;
171 SimulationTick tick = SimulationTick::zero();
172 std::vector<SettlementStageResult> stages;
173 std::optional<game_event::GameEvent> event;
175 std::vector<SettlementRequest> derived;
176
178 [[nodiscard]] bool hasStage(std::string_view name) const noexcept;
179
185 [[nodiscard]] std::size_t ruleEvaluationCount() const noexcept;
186
192 [[nodiscard]] std::size_t ruleMatchCount() const noexcept;
193
202 [[nodiscard]] const SettlementStageResult* stage(std::string_view name) const noexcept;
203};
204
211[[nodiscard]] EVENGINE_API_FOUNDATION eve::Result<std::string> settlementResultCanonicalJson(
212 const SettlementResult& result);
213
221[[nodiscard]] EVENGINE_API_FOUNDATION eve::Result<eve::ContentId> settlementResultDigest(
222 const SettlementResult& result, const eve::SnapshotHashProvider& hashProvider);
223
229[[nodiscard]] EVENGINE_API_FOUNDATION eve::Result<std::vector<std::string>> verifySettlementResult(
230 const SettlementResult& expected, const SettlementResult& actual);
231
241[[nodiscard]] EVENGINE_API_FOUNDATION eve::Result<std::string> createSettlementReplayRecord(
242 const SettlementRequest& request, eve::ContentId ruleDigest, const SettlementResult& result,
243 const eve::SnapshotHashProvider& hashProvider);
244
251[[nodiscard]] EVENGINE_API_FOUNDATION eve::Result<SettlementRequest> settlementReplayRequest(
252 std::string_view recordJson);
253
260[[nodiscard]] EVENGINE_API_FOUNDATION eve::Result<std::vector<std::string>> verifySettlementReplayRecord(
261 std::string_view recordJson, eve::ContentId ruleDigest, const SettlementResult& actual,
262 const eve::SnapshotHashProvider& hashProvider);
263
271
282public:
283 using CommitFunction = std::function<eve::Result<void>()>;
284 using RollbackFunction = std::function<void()>;
285
287 PreparedApply() = default;
288
291
292 PreparedApply(const PreparedApply&) = delete;
295 PreparedApply(PreparedApply&& other) noexcept;
297 PreparedApply& operator=(PreparedApply&& other) noexcept;
300
302 [[nodiscard]] bool isValid() const noexcept;
303
305 [[nodiscard]] eve::Result<void> commit();
306
313 void rollback() noexcept;
314
316 [[nodiscard]] bool isCommitted() const noexcept { return committed_; }
317
318private:
319 CommitFunction commit_;
320 RollbackFunction rollback_;
321 bool committed_ = false;
322 bool rolledBack_ = false;
323};
324
325class ISettlementPolicy;
326
339public:
341 [[nodiscard]] const SettlementRequest& request() const noexcept { return request_; }
342
344 [[nodiscard]] ISettlementPolicy& policy() const noexcept { return policy_; }
345
347 [[nodiscard]] double magnitude() const noexcept { return magnitude_; }
348
350 [[nodiscard]] double absorbed() const noexcept { return absorbed_; }
351
353 [[nodiscard]] double resisted() const noexcept { return resisted_; }
354
356 [[nodiscard]] double clamped() const noexcept { return clamped_; }
357
359 [[nodiscard]] eve::Result<void> setMagnitude(double value);
360
362 [[nodiscard]] eve::Result<void> addAbsorbed(double value);
363
365 [[nodiscard]] eve::Result<void> addResisted(double value);
366
368 [[nodiscard]] eve::Result<void> addClamped(double value);
369
371 void setCritical(bool value) noexcept {
372 if (applyPrepared_) {
374 recordMutationViolation("settlement critical flag cannot change after apply preparation", "critical");
375 return;
376 }
377 critical_ = value;
378 }
379
381 [[nodiscard]] bool critical() const noexcept { return critical_; }
382
388 [[nodiscard]] eve::Result<void> setDisposition(SettlementDisposition disposition);
389
391 [[nodiscard]] SettlementDisposition disposition() const noexcept { return disposition_; }
392
394 [[nodiscard]] eve::Result<void> setClampMax(std::optional<double> value);
395
401 void setStageDetail(std::string key, Value value);
402
411 [[nodiscard]] const eve::Diagnostic* mutationViolation() const noexcept {
412 return mutationViolation_ ? &*mutationViolation_ : nullptr;
413 }
414
416 [[nodiscard]] const Value::Object& stageDetails() const noexcept { return stageDetails_; }
417
419 [[nodiscard]] const SettlementResult& projectedResult() const noexcept { return result_; }
420
422 [[nodiscard]] eve::Result<void> applyClamp();
423
425 [[nodiscard]] eve::Result<void> prepareApply();
426
428 [[nodiscard]] eve::Result<void> prepareEvent();
429
438 [[nodiscard]] PreparedApply* pendingApply() noexcept { return pendingApply_ ? &*pendingApply_ : nullptr; }
439
448 [[nodiscard]] const game_event::GameEvent* pendingEvent() const noexcept {
449 return pendingEvent_ ? &*pendingEvent_ : nullptr;
450 }
451
453 void synchronizeResult() noexcept;
454
456 [[nodiscard]] eve::Result<void> emitDerived(SettlementRequest request);
457
458private:
459 friend class SettlementPipeline;
460
462 void beginStage() noexcept {
463 stageDetails_.clear();
464 mutationViolation_.reset();
465 }
466 void clearPendingApply() noexcept { pendingApply_.reset(); }
467 void clearPendingEvent() noexcept { pendingEvent_.reset(); }
468 void recordMutationViolation(std::string message, std::string path) noexcept;
469
470 const SettlementRequest& request_;
471 SettlementResult& result_;
472 ISettlementPolicy& policy_;
473 double magnitude_ = 0.0;
474 double absorbed_ = 0.0;
475 double resisted_ = 0.0;
476 double clamped_ = 0.0;
477 bool critical_ = false;
478 SettlementDisposition disposition_ = SettlementDisposition::NoOp;
479 bool dispositionExplicit_ = false;
480 std::optional<double> clampMax_;
481 Value::Object stageDetails_;
482 std::optional<PreparedApply> pendingApply_;
483 std::optional<game_event::GameEvent> pendingEvent_;
484 std::optional<eve::Diagnostic> mutationViolation_;
485 bool applyPrepared_ = false;
486 bool eventPrepared_ = false;
487};
488
498public:
500 virtual ~ISettlementPolicy() = default;
501
504
506 [[nodiscard]] virtual eve::Result<void> decide(SettlementContext& context);
507
510
513
516
519
522
527 [[nodiscard]] virtual eve::Result<std::vector<SettlementRequest>> prepareTrigger(
528 const SettlementContext& context, const SettlementResult& result);
529};
530
543public:
544 using StageFunction = std::function<eve::Result<void>(SettlementContext&)>;
546 using RequestExecutor = std::function<eve::Result<SettlementResult>(const SettlementRequest&)>;
547
550
552 [[nodiscard]] eve::Result<void> addStage(StageKind kind, std::string name, int priority, StageFunction function);
553
564 game_event::GameEventLog* events = nullptr) const;
565
585 [[nodiscard]] eve::Result<std::vector<SettlementResult>> settleAtomic(
586 std::span<const SettlementRequest> requests, std::span<ISettlementPolicy*> policies,
587 game_event::GameEventLog* events = nullptr) const;
588
603 [[nodiscard]] eve::Result<std::vector<SettlementBatchItemResult>> settleIndependent(
604 std::span<const SettlementRequest> requests, std::span<ISettlementPolicy*> policies,
605 game_event::GameEventLog* events = nullptr) const;
606
621 const SettlementRequest& root, const RequestExecutor& execute, std::uint32_t maxDepth,
622 std::uint32_t maxSettlements) const;
623
624private:
625 struct StageEntry {
626 StageKind kind = StageKind::Validate;
627 std::string name;
628 int priority = 0;
629 std::uint64_t registration = 0;
630 bool canonical = false;
631 bool terminal = false;
633 };
634
635 std::vector<StageEntry> stages_;
636 std::uint64_t nextRegistration_ = 1;
637
638 [[nodiscard]] eve::Result<void> prepare(SettlementContext& context, SettlementResult& result) const;
639};
640
641} // namespace eve::settlement
double value
Trace trace
Definition Agent.cpp:49
int root
Definition AnimSmr.cpp:119
int priority
#define EVENGINE_API_FOUNDATION
每个链接组(link group)各自的导出宏。
Definition Export.h:106
std::string message
const GltfImportRequest & request
std::uint32_t key
wgpu::PopErrorScopeStatus status
Strong identity values shared by persistence, content and logical-name APIs.
TokenKind kind
std::string name
std::unique_ptr< gpgpu::Sequence > sequence
Definition OnnxGpgpu.cpp:43
std::string path
Definition PlayHost.cpp:110
Move-only, checked operation results for the common layer.
MigrationFunction function
Versioned, integrity-checked persistence envelopes.
Stable reference to a runtime gameplay subject.
Battle::Events events
SimulationTick tick
Common time values and an injectable deterministic simulation clock.
uint32_t index
std::uint32_t depth
Owning, renderer-independent dynamic values.
const VegetationPresetContext & context
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Structured status and zero or more diagnostics for an operation.
Definition Status.h:68
Strong, domain-neutral reference to a runtime subject.
Definition SubjectRef.h:26
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
std::map< std::string, Value > Object
Definition Value.h:34
Id128 public API.
Definition Identity.h:112
Tagged direct causation reference to an event or command.
Definition GameEvent.h:96
Strong business-workflow correlation identity.
Definition GameEvent.h:49
Deterministic in-memory stream of topic-neutral event envelopes.
Definition GameEvent.h:261
Domain-owned policy hooks used by the common settlement pipeline.
Definition Settlement.h:497
virtual eve::Result< void > targetMitigation(SettlementContext &context)=0
Apply target mitigation such as resistance or penetration rules.
virtual eve::Result< void > validate(SettlementContext &context)=0
Validate request and target-owned state without mutating it.
virtual eve::Result< void > armorShield(SettlementContext &context)=0
Apply armor and shield policy, recording absorbed amount.
virtual eve::Result< PreparedApply > prepareApply(const SettlementContext &context)=0
Build an atomic candidate mutation without publishing it.
virtual eve::Result< void > sourceModifiers(SettlementContext &context)=0
Apply source-side modifiers such as critical or elemental power.
virtual eve::Result< void > clamp(SettlementContext &context)=0
Configure policy-specific amount bounds for the generic clamp.
virtual ~ISettlementPolicy()=default
I settlement policy.
Prepared domain mutation used to make settlement application atomic.
Definition Settlement.h:281
PreparedApply(const PreparedApply &)=delete
std::function< eve::Result< void >()> CommitFunction
Definition Settlement.h:283
PreparedApply & operator=(const PreparedApply &)=delete
PreparedApply()=default
Construct an empty invalid mutation.
std::function< void()> RollbackFunction
Definition Settlement.h:284
Mutable calculation frame visible to policy and custom stage code.
Definition Settlement.h:338
SettlementDisposition disposition() const noexcept
Return the current semantic outcome.
Definition Settlement.h:391
const Value::Object & stageDetails() const noexcept
Return the current stage's owned explanation fields.
Definition Settlement.h:416
const SettlementRequest & request() const noexcept
Return the immutable request currently being settled.
Definition Settlement.h:341
void setCritical(bool value) noexcept
Mark the result as critical; late writes are rejected.
Definition Settlement.h:371
double magnitude() const noexcept
Return the current amount after all preceding stages.
Definition Settlement.h:347
const SettlementResult & projectedResult() const noexcept
Return the projected result visible to trigger preparation.
Definition Settlement.h:419
const game_event::GameEvent * pendingEvent() const noexcept
Return the prepared event, if the event stage created one.
Definition Settlement.h:448
PreparedApply * pendingApply() noexcept
Return the staged mutation, if the apply stage prepared one.
Definition Settlement.h:438
bool critical() const noexcept
Return whether a source policy marked this settlement critical.
Definition Settlement.h:381
const eve::Diagnostic * mutationViolation() const noexcept
Return a contract violation recorded by a late frame mutation.
Definition Settlement.h:411
double resisted() const noexcept
Return the accumulated amount removed by policy mitigation.
Definition Settlement.h:353
ISettlementPolicy & policy() const noexcept
Return the policy participating in this synchronous call.
Definition Settlement.h:344
double absorbed() const noexcept
Return the accumulated amount absorbed by policy barriers.
Definition Settlement.h:350
double clamped() const noexcept
Return the accumulated amount removed by the generic clamp.
Definition Settlement.h:356
Deterministically ordered, composable settlement pipeline.
Definition Settlement.h:542
std::function< eve::Result< void >(SettlementContext &)> StageFunction
Definition Settlement.h:544
std::function< eve::Result< SettlementResult >(const SettlementRequest &)> RequestExecutor
Executes one owning chain request using its request-specific policy and rule snapshot.
Definition Settlement.h:546
const char * settlementDispositionName(SettlementDisposition disposition) noexcept
Return the stable lowercase spelling of a settlement disposition.
StageKind
Kind of ordered calculation stage in a settlement pipeline.
Definition Settlement.h:36
const char * stageKindName(StageKind kind) noexcept
Return the stable lowercase spelling of a stage kind.
SettlementTraceLevel
Amount of stage explanation retained by one settlement request.
Definition Settlement.h:60
eve::Result< void > validateSettlementRequest(const SettlementRequest &request)
Validate the canonical semantic invariants of a settlement request.
SettlementDisposition
Semantic outcome of a completed settlement, distinct from its numeric amount.
Definition Settlement.h:49
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
StatusCode
Stable outcome category for an operation.
Definition Status.h:27
std::function< Result< ContentId >(std::string_view canonicalInput)> SnapshotHashProvider
Injected content-digest implementation used by snapshots.
Definition Snapshot.h:36
Envelope metadata shared by event domains.
Definition GameEvent.h:183
Indexed owning outcome for one independently committed settlement item.
Definition Settlement.h:265
std::optional< SettlementResult > result
Definition Settlement.h:269
Bounded trigger-chain metadata carried by an owning settlement request.
Definition Settlement.h:82
std::vector< std::string > triggerPath
Definition Settlement.h:85
Caller-owned deterministic random decision recorded for replay and verification.
Definition Settlement.h:73
Domain-neutral input to one settlement operation.
Definition Settlement.h:107
std::string resource
Optional domain resource/channel key, for example hp, mana, armor, or fire.
Definition Settlement.h:113
std::string trigger
Stable re-entry key for a derived request; empty only for a root request.
Definition Settlement.h:119
game_event::CorrelationId correlation
Definition Settlement.h:125
std::vector< std::string > tags
Definition Settlement.h:116
std::vector< SettlementRandomDecision > decisions
Definition Settlement.h:117
game_event::CausationRef causation
Definition Settlement.h:124
SettlementChainContext chain
Definition Settlement.h:120
Complete observable outcome of one successful settlement.
Definition Settlement.h:163
std::vector< SettlementRequest > derived
Owning derived requests emitted by the policy in deterministic order.
Definition Settlement.h:175
std::vector< SettlementStageResult > stages
Definition Settlement.h:172
std::optional< game_event::GameEvent > event
Definition Settlement.h:173
Explanation emitted for one executed stage.
Definition Settlement.h:145