载入中...
搜索中...
未找到
TurnPolicy.cpp
浏览该文件的文档.
1
7
8#include "common/Diagnostic.h"
9
10#include <utility>
11
12namespace eve::tactics {
13namespace {
14
23class SideAlternatingPolicy final : public ITurnPolicy {
24public:
25 [[nodiscard]] std::string_view id() const noexcept override { return kSideAlternatingPolicyId; }
26
27 [[nodiscard]] TurnOrder order(const Battle&, const UnitOrder& left, const UnitOrder& right) const override {
28 if (left.sideIndex < right.sideIndex) return TurnOrder::LeftFirst;
29 if (right.sideIndex < left.sideIndex) return TurnOrder::RightFirst;
31 }
32};
33
35class InitiativePolicy final : public ITurnPolicy {
36public:
37 [[nodiscard]] std::string_view id() const noexcept override { return kInitiativePolicyId; }
38
39 [[nodiscard]] TurnOrder order(const Battle&, const UnitOrder& left, const UnitOrder& right) const override {
40 if (left.initiative > right.initiative) return TurnOrder::LeftFirst;
41 if (right.initiative > left.initiative) return TurnOrder::RightFirst;
43 }
44};
45
61class ChargeTimeBattlePolicy final : public ITurnPolicy {
62public:
63 [[nodiscard]] std::string_view id() const noexcept override { return kChargeTimeBattlePolicyId; }
64
65 [[nodiscard]] TurnOrder order(const Battle&, const UnitOrder& left, const UnitOrder& right) const override {
66 if (left.charge > right.charge) return TurnOrder::LeftFirst;
67 if (right.charge > left.charge) return TurnOrder::RightFirst;
68 if (left.initiative > right.initiative) return TurnOrder::LeftFirst;
69 if (right.initiative > left.initiative) return TurnOrder::RightFirst;
71 }
72
73 [[nodiscard]] ChargeModel chargeModel(const Battle&) const override {
75 }
76};
77
78} // namespace
79
81
82Result<void> TurnPolicyRegistry::add(std::shared_ptr<const ITurnPolicy> policy) {
83 if (policy == nullptr || policy->id().empty())
85 DiagnosticCode::InvalidArgument, "tactics turn policy requires a non-empty stable id", "turnPolicy.id"));
86 const std::string key(policy->id());
87 if (policies_.contains(key))
89 DiagnosticCode::Conflict, "tactics turn policy id is already registered", "turnPolicy.id"));
90 policies_.emplace(key, std::move(policy));
92}
93
95 const auto found = policies_.find(id);
96 if (found == policies_.end())
98 Diagnostic::error(DiagnosticCode::NotFound, "tactics turn policy is not registered", "turnPolicy"));
99 return Result<const ITurnPolicy*>::success(found->second.get());
100}
101
102std::vector<std::string> TurnPolicyRegistry::ids() const {
103 std::vector<std::string> result;
104 result.reserve(policies_.size());
105 for (const auto& [id, policy] : policies_) result.push_back(id);
106 return result;
107}
108
109bool TurnPolicyRegistry::contains(std::string_view id) const { return policies_.contains(id); }
110
112 // Function-local so registration happens once, after static initialisation
113 // order is no longer a question.
114 static TurnPolicyRegistry registry = [] {
116 // Built-ins are immutable and stateless, so a failed registration is
117 // impossible here; ignoring the result would hide a real duplicate bug.
118 if (!value.add(std::make_shared<const SideAlternatingPolicy>()).ok()) return TurnPolicyRegistry{};
119 if (!value.add(std::make_shared<const InitiativePolicy>()).ok()) return TurnPolicyRegistry{};
120 if (!value.add(std::make_shared<const ChargeTimeBattlePolicy>()).ok()) return TurnPolicyRegistry{};
121 return value;
122 }();
123 return registry;
124}
125
126} // namespace eve::tactics
double value
Stable, structured diagnostics shared by engine modules.
std::uint32_t key
HexVec3 left
HexVec3 right
std::vector< std::int32_t > order
std::string id
Definition PlayHost.cpp:108
bool found
Pluggable deterministic turn-scheduling policies.
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 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
Battle short-root and authoritative owner of board and turn state.
virtual ChargeModel chargeModel(const Battle &battle) const
Declare the charge rule this policy schedules by.
Registry of turn policies keyed by stable id.
Definition TurnPolicy.h:145
static TurnPolicyRegistry & builtins()
Return the process-wide registry carrying the built-in policies.
std::vector< std::string > ids() const
Return registered ids in lexical order.
bool contains(std::string_view id) const
Return whether an id is registered.
Result< void > add(std::shared_ptr< const ITurnPolicy > policy)
Register one policy under its own id.
Result< const ITurnPolicy * > find(std::string_view id) const
Resolve a registered policy by id, or NotFound.
constexpr std::string_view kInitiativePolicyId
Stable id of the built-in per-unit initiative turn policy.
constexpr std::string_view kSideAlternatingPolicyId
Stable id of the built-in side-alternating turn policy.
constexpr std::string_view kChargeTimeBattlePolicyId
Stable id of the built-in charge-time (CTB/ATB) turn policy.
constexpr int kChargeTimeBattleThreshold
Charge a unit must accumulate before it may activate under CTB scheduling.
TurnOrder
The total order a policy reports for one pair of units.
Definition TurnPolicy.h:83
@ RightFirst
The right unit acts first.
@ Equivalent
Both compare equal; the caller decides by canonical order.
@ LeftFirst
The left unit acts first.
The charge rule a policy declares for round scheduling.
Definition TurnPolicy.h:63