载入中...
搜索中...
未找到
ComboGraph.cpp
浏览该文件的文档.
1#include "combat/ComboGraph.h"
2
3#include <algorithm>
4#include <utility>
5
6namespace eve::combat {
7 // namespace
8
10 if (from.format().empty() || to.format().empty()) return Result<void>::failure(
11 Diagnostic::error(DiagnosticCode::InvalidArgument, "combo edge ids are empty", "id"));
12 if (requiredInput.empty()) return Result<void>::failure(
13 Diagnostic::error(DiagnosticCode::InvalidArgument, "combo edge input is empty", "requiredInput"));
14 return Result<void>::success();
15}
16
18 auto valid = edge.validate();
19 if (!valid) return valid;
20 for (const auto& existing : edges_) {
21 if (existing.from == edge.from && existing.to == edge.to && existing.requiredInput == edge.requiredInput)
23 Diagnostic::error(DiagnosticCode::Conflict, "combo edge already exists", "edge"));
24 }
25 edges_.push_back(std::move(edge));
27}
28
29Result<ComboGraphMatch> ComboGraph::match(const LogicalId& from, std::string_view input, bool allowCancel,
30 bool allowCombo) const {
31 const ComboGraphEdge* best = nullptr;
32 for (const auto& edge : edges_) {
33 if (edge.from != from) continue;
34 if (edge.requiredInput != input) continue;
35 if (edge.requiresCancelWindow && !allowCancel) continue;
36 if (edge.requiresComboWindow && !allowCombo) continue;
37 if (!best || edge.priority > best->priority ||
38 (edge.priority == best->priority && edge.to.format() < best->to.format()))
39 best = &edge;
40 }
41 if (!best)
43 Diagnostic::error(DiagnosticCode::NotFound, "no combo transition matched", "input"));
45 ComboGraphMatch{best->from, best->to, best->requiredInput, best->priority});
46}
47
48} // namespace eve::combat
std::string from
Explicit cancel/combo graph over ability logical ids.
EvpackChunkInput input
Definition Evpack.cpp:170
bool valid
const RoadEdge * edge
std::map< Cell, int > best
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
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
const std::string & format() const noexcept
Returns the canonical namespace:name representation.
Definition Identity.h:436
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Result< ComboGraphMatch > match(const LogicalId &from, std::string_view input, bool allowCancel, bool allowCombo) const
Resolve the highest-priority legal transition for a source ability and input.
Result< void > addEdge(ComboGraphEdge edge)
Add one validated edge; duplicate from/to/input triples Conflict.
Edge that may cancel from one ability into another.
Definition ComboGraph.h:17
Result< void > validate() const
Validate non-nil ids and non-empty input when required.
Definition ComboGraph.cpp:9
Owning match produced by the combo graph.
Definition ComboGraph.h:30