载入中...
搜索中...
未找到
SettlementRuleIdentity.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <utility>
5
6namespace eve::settlement {
7namespace {
8
9const char* ruleOperationName(RuleOperation operation) noexcept {
10 switch (operation) {
11 case RuleOperation::Add: return "add";
12 case RuleOperation::Multiply: return "multiply";
13 case RuleOperation::ResistFlat: return "resist_flat";
14 case RuleOperation::ResistPercent: return "resist_percent";
15 case RuleOperation::AbsorbFlat: return "absorb_flat";
16 case RuleOperation::ClampMaximum: return "clamp_maximum";
17 case RuleOperation::Critical: return "critical";
18 case RuleOperation::Immune: return "immune";
19 case RuleOperation::Lifesteal: return "lifesteal";
20 case RuleOperation::Reflect: return "reflect";
21 }
22 return "unknown";
23}
24
25eve::Value::Array canonicalStrings(std::vector<std::string> values) {
26 std::sort(values.begin(), values.end());
27 values.erase(std::unique(values.begin(), values.end()), values.end());
28 eve::Value::Array encoded;
29 encoded.reserve(values.size());
30 for (auto& value : values) encoded.emplace_back(std::move(value));
31 return encoded;
32}
33
34eve::Value encodeRule(const SettlementRule& rule) {
35 return eve::Value::Object{
36 {"filter",
37 eve::Value::Object{{"excludedTags", canonicalStrings(rule.filter.excludedTags)},
38 {"kinds", canonicalStrings(rule.filter.kinds)},
39 {"requiredTags", canonicalStrings(rule.filter.requiredTags)}}},
40 {"id", rule.id},
41 {"operation", ruleOperationName(rule.operation)},
42 {"priority", static_cast<std::int64_t>(rule.priority)},
43 {"source", rule.source},
44 {"stacks", static_cast<std::int64_t>(rule.stacks)},
45 {"stage", stageKindName(rule.stage)},
46 {"value", rule.value},
47 {"valuePerExtraStack", rule.valuePerExtraStack},
48 {"when", rule.when},
49 };
50}
51
52} // namespace
53
55 std::vector<const SettlementRule*> ordered;
56 ordered.reserve(rules_.size());
57 for (const auto& rule : rules_) ordered.push_back(&rule);
58 std::sort(ordered.begin(), ordered.end(), [](const auto* left, const auto* right) {
59 const auto leftStage = static_cast<std::uint8_t>(left->stage);
60 const auto rightStage = static_cast<std::uint8_t>(right->stage);
61 if (leftStage != rightStage) return leftStage < rightStage;
62 if (left->priority != right->priority) return left->priority < right->priority;
63 return left->id < right->id;
64 });
65
67 rules.reserve(ordered.size());
68 for (const auto* rule : ordered) rules.push_back(encodeRule(*rule));
70 {"conditionLanguageVersion", 1},
71 {"rules", std::move(rules)},
72 {"schema", "settlement.rules"},
73 {"version", static_cast<std::int64_t>(schemaVersion())},
74 })
75 .toJson();
76}
77
79 if (!hashProvider)
81 eve::DiagnosticCode::PreconditionViolation, "settlement rule digest requires a hash provider",
82 "hashProvider"));
83 auto canonical = canonicalJson();
84 if (!canonical) return eve::Result<eve::ContentId>::failure(canonical.status());
85 return hashProvider(canonical.value());
86}
87
88} // namespace eve::settlement
ActionParameterOperation operation
double value
std::map< std::string, Var > values
HexVec3 left
HexVec3 right
Declarative, domain-neutral rules for buffs and gameplay effects.
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
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
std::map< std::string, Value > Object
Definition Value.h:34
std::vector< Value > Array
Definition Value.h:33
eve::Result< eve::ContentId > digest(const eve::SnapshotHashProvider &hashProvider) const
Hash the canonical validated rule-set representation.
static constexpr std::uint32_t schemaVersion() noexcept
Stable schema version used by canonical rule-set identity.
eve::Result< std::string > canonicalJson() const
Serialize validated rules in their semantic execution order.
RuleOperation
Supported deterministic mutations of a settlement calculation.
const char * stageKindName(StageKind kind) noexcept
Return the stable lowercase spelling of a stage kind.
std::function< Result< ContentId >(std::string_view canonicalInput)> SnapshotHashProvider
Injected content-digest implementation used by snapshots.
Definition Snapshot.h:36