载入中...
搜索中...
未找到
RTSSystems_Faction.cpp
浏览该文件的文档.
1#include "rts/RTSSystems.h"
2
3#include <algorithm>
4#include <cmath>
5#include <vector>
6
7namespace eve::rts {
8
10 auto veterancy = unit.veterancy();
11 auto durability = unit.durability();
12 auto combatPolicy = unit.combat();
13 if (!durability->alive || !std::isfinite(experience) || experience <= 0.0f)
16 "RTS veterancy award requires a live unit and positive finite experience", "experience"));
17 if (veterancy->veteranThreshold <= 0.0f)
19 if (!std::isfinite(veterancy->experience) || veterancy->experience < 0.0f ||
20 !std::isfinite(veterancy->veteranThreshold) || !std::isfinite(veterancy->eliteThreshold) ||
21 veterancy->eliteThreshold <= veterancy->veteranThreshold ||
22 !std::isfinite(veterancy->veteranDamageFactor) ||
23 !std::isfinite(veterancy->eliteDamageFactor) ||
24 !std::isfinite(veterancy->veteranHealthFactor) ||
25 !std::isfinite(veterancy->eliteHealthFactor) ||
26 veterancy->veteranDamageFactor < 1.0f ||
27 veterancy->eliteDamageFactor < veterancy->veteranDamageFactor ||
28 veterancy->veteranHealthFactor < 1.0f ||
29 veterancy->eliteHealthFactor < veterancy->veteranHealthFactor ||
30 veterancy->level < 0 || veterancy->level > 2)
32 "RTS veterancy thresholds and factors are inconsistent",
33 "unit.veterancy"));
34 veterancy->experience += experience;
35 const int oldLevel = veterancy->level;
36 if (veterancy->eliteThreshold > 0.0f && veterancy->experience >= veterancy->eliteThreshold)
37 veterancy->level = 2;
38 else if (veterancy->experience >= veterancy->veteranThreshold)
39 veterancy->level = 1;
40 if (veterancy->level == oldLevel)
42 const auto damageAt = [&](int level) {
43 return level >= 2 ? veterancy->eliteDamageFactor
44 : level >= 1 ? veterancy->veteranDamageFactor : 1.0f;
45 };
46 const auto healthAt = [&](int level) {
47 return level >= 2 ? veterancy->eliteHealthFactor
48 : level >= 1 ? veterancy->veteranHealthFactor : 1.0f;
49 };
50 combatPolicy->upgradeDamageFactor *= damageAt(veterancy->level) / damageAt(oldLevel);
51 const double healthRatio = static_cast<double>(healthAt(veterancy->level) / healthAt(oldLevel));
52 durability->state.maxHealth *= healthRatio;
53 durability->state.health = std::min(durability->state.maxHealth,
54 durability->state.health * healthRatio);
55 return Result<int>::success(veterancy->level - oldLevel, Status::success(StatusCode::Applied));
56}
57
59 if (left == nullptr || right == nullptr) return false;
60 if (left == right) return true;
61 auto matches = ecs::View<Match, Match::Participants>();
62 for (auto it = matches.begin(); it != matches.end(); ++it) {
63 auto [participants] = *it;
64 const Match::Participants::Entry* leftEntry = nullptr;
65 const Match::Participants::Entry* rightEntry = nullptr;
66 for (const auto& entry : participants->entries) {
67 if (entry.eliminated) continue;
68 if (entry.faction.resolve() == left) leftEntry = &entry;
69 if (entry.faction.resolve() == right) rightEntry = &entry;
70 }
71 if (leftEntry != nullptr && rightEntry != nullptr)
72 return leftEntry->team == rightEntry->team;
73 }
74 return false;
75}
76
78 return isAllied(dynamic_cast<Faction*>(left.resolve()), dynamic_cast<Faction*>(right.resolve()));
79}
80
82 if (viewer == nullptr || !subject.isValid()) return false;
83 const auto intel = viewer->intel();
84 if (!intel->enabled) return true;
85 const auto found = std::find_if(intel->contacts.begin(), intel->contacts.end(),
86 [&](const auto& contact) { return contact.subject == subject; });
87 return found != intel->contacts.end() && found->subject == subject &&
88 found->visible && found->detected;
89}
90
91} // namespace eve::rts
int subject
Definition AnimSmr.cpp:163
HexVec3 left
HexVec3 right
int level
Deterministic phase-one RTS systems and their ECS contracts.
bool found
TacticalUnit * unit
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
Strong, domain-neutral reference to a runtime subject.
Definition SubjectRef.h:26
static bool isTargetable(Faction *viewer, SubjectRef subject) noexcept
Return whether a stable subject is currently visible and detected. Empty contact state preserves nati...
static bool isAllied(Faction *left, Faction *right) noexcept
Return true when both live factions are identical or share a team in a common Match.
Faction domain root; membership is a set of typed runtime handles.
Definition RTSTypes.h:1178
RTS unit domain root.
Definition RTSTypes.h:495
static Result< int > award(Unit &unit, float experience)
Award experience and apply every newly crossed rank modifier atomically.