载入中...
搜索中...
未找到
Targeting.cpp
浏览该文件的文档.
32 return std::visit([space](const auto& value) { return value.isValid() && value.space() == space; }, location);
59 if (const auto* point = std::get_if<WorldPoint>(&location)) return spec.worldArea->contains(*point);
63 if (const auto* point = std::get_if<GridPoint>(&location)) return spec.gridArea->contains(*point);
69bool containsAllTags(const std::vector<std::string>& candidate, const std::vector<std::string>& required,
81 return std::find(candidate.zones.begin(), candidate.zones.end(), *zone) != candidate.zones.end();
85 if (!candidate.subject.isValid() || !sameSpace(candidate.location, query.spec.space)) return false;
86 if (query.spec.domain != TargetDomain::Any && candidate.domain != query.spec.domain) return false;
87 if (!containsAllTags(candidate.tags, query.spec.requiredTags, query.spec.excludedTags)) return false;
88 if (!inZone(candidate, query.spec.zone) || !contains(query.spec, candidate.location)) return false;
91 return distance >= static_cast<double>(query.spec.minRange) && distance <= static_cast<double>(query.spec.maxRange);
96 if (!minimum.isValid() || !maximum.isValid() || minimum.space() != expected || maximum.space() != expected)
108Result<void> validateGridPair(GridPoint minimum, GridPoint maximum, CoordinateSpace expected, const char* operation) {
109 if (!minimum.isValid() || !maximum.isValid() || minimum.space() != expected || maximum.space() != expected)
151 if (!center.isValid() || center.space() != CoordinateSpace::World2D || !std::isfinite(radius) || radius < 0.f)
165 if (!center.isValid() || center.space() != CoordinateSpace::World3D || !std::isfinite(radius) || radius < 0.f)
178Result<WorldArea> WorldArea::cone2D(WorldPoint apex, float dirX, float dirY, float halfAngleRadians, float range) {
179 if (!apex.isValid() || apex.space() != CoordinateSpace::World2D || !std::isfinite(dirX) || !std::isfinite(dirY) ||
246 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetingSpec world area must be valid", {}));
249 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetingSpec grid area must be valid", {}));
255 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetingSpec grid area does not match its space", {}));
258 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetingSpec minCount exceeds maxCount", {}));
260 (!(std::isfinite(maxRange) || maxRange == std::numeric_limits<float>::infinity())) || minRange < 0.f ||
263 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetingSpec range must be finite and ordered", {}));
270 Diagnostic::error(DiagnosticCode::InvalidArgument, "requiredTags cannot contain empty keys", {}));
274 Diagnostic::error(DiagnosticCode::InvalidArgument, "excludedTags cannot contain empty keys", {}));
283 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetingQuery origin must be non-nil", {}));
286 DiagnosticCode::InvalidArgument, "TargetingQuery origin and spec use different coordinate spaces", {}));
317 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetSet points cannot mix coordinate spaces", {}));
318 if (worldArea_ && (!std::get_if<WorldPoint>(&point) || std::get<WorldPoint>(point).space() != worldArea_->space()))
334 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetSet cannot mix world and grid areas", {}));
335 if (point_ && (!std::get_if<WorldPoint>(&*point_) || std::get<WorldPoint>(*point_).space() != area.space()))
348 Diagnostic::error(DiagnosticCode::InvalidArgument, "TargetSet cannot mix world and grid areas", {}));
349 if (point_ && (!std::get_if<GridPoint>(&*point_) || std::get<GridPoint>(*point_).space() != area.space()))
366 Diagnostic::error(DiagnosticCode::InvalidArgument, "candidate tags cannot contain empty keys", {}));
385Result<std::vector<TargetCandidate>> SensingCandidateProvider::query(const TargetingQuery& query) const {
397Result<std::vector<TargetCandidate>> SensingWorldCandidateProvider::query(const TargetingQuery& query) const {
405 Diagnostic::error(DiagnosticCode::Unsupported, "SensingWorldCandidateProvider supports World2D only", {}));
412 "TargetDomain filters require an injected FactionRelationFn on SensingWorldCandidateProvider", {}));
415 if (originPoint == nullptr || !originPoint->isValid() || originPoint->space() != CoordinateSpace::World2D)
417 DiagnosticCode::InvalidArgument, "SensingWorldCandidateProvider origin must be a World2D point", {}));
429 auto queried = world_->query(QueryOrigin{originPoint->x(), originPoint->y(), query.origin.format()}, spec);
433 if (const auto found = world_->subjects().find(query.origin.format()); found != world_->subjects().end())
452 subjectIt == world_->subjects().end() ? std::string_view{} : std::string_view{subjectIt->second.faction};
493 Diagnostic::error(DiagnosticCode::Unsupported, "Targeting requires an ISensingCandidateProvider", {}));
Coordinate-safe targeting protocol shared by sensing and gameplay adapters.
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
static std::optional< LogicalId > parse(std::string_view text)
Parses a scoped logical name.
Definition Identity.cpp:36
void expect(std::string_view message) const
Require success for a void operation.
Definition Result.h:548
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
static SubjectRef fromPersistentId(PersistentId id) noexcept
Wrap a persistent identity without changing its bytes.
Definition SubjectRef.h:32
bool isValid() const noexcept
Return whether this reference is valid and non-nil.
Definition SubjectRef.h:38
static std::optional< Id128 > parse(std::string_view text) noexcept
Parses canonical UUID text.
Definition Identity.h:151
An integer grid area constraint, kept separate from WorldArea.
Definition Targeting.h:273
GridPoint minimum() const noexcept
Return the inclusive minimum grid corner.
Definition Targeting.h:292
bool contains(GridPoint point) const noexcept
Tests a grid point without converting coordinate spaces.
Definition Targeting.cpp:233
static Result< GridArea > box2D(GridPoint minimum, GridPoint maximum)
Creates an inclusive 2D grid rectangle.
Definition Targeting.cpp:221
GridPoint maximum() const noexcept
Return the inclusive maximum grid corner.
Definition Targeting.h:294
static Result< GridArea > box3D(GridPoint minimum, GridPoint maximum)
Creates an inclusive 3D grid box.
Definition Targeting.cpp:227
static GridPoint grid3D(std::int32_t x, std::int32_t y, std::int32_t z) noexcept
Creates a 3D integer grid point.
Definition Targeting.cpp:146
static GridPoint grid2D(std::int32_t x, std::int32_t y) noexcept
Creates a 2D integer grid point.
Definition Targeting.cpp:142
virtual Result< LineOfSightResult > query(const TargetLocation &from, const TargetLocation &to) const =0
Tests the segment between two same-space locations.
Result< std::vector< TargetCandidate > > query(const TargetingQuery &query) const override
Returns broad-phase candidates satisfying the coordinate and spatial constraints.
Definition Targeting.cpp:385
Result< void > remove(SubjectRef subject)
Removes one candidate; NotFound is returned when absent.
Definition Targeting.cpp:375
Result< void > upsert(TargetCandidate candidate)
Adds or replaces one candidate using its SubjectRef as the key.
Definition Targeting.cpp:356
Result< std::vector< TargetCandidate > > query(const TargetingQuery &query) const override
Returns broad-phase candidates satisfying the coordinate and spatial constraints.
Definition Targeting.cpp:397
eve::Result< CandidateQueryResult > query(const QueryOrigin &origin, const QuerySpec &spec)
Runs a configurable candidate query.
Definition Sensing.cpp:406
const std::map< std::string, Subject > & subjects() const noexcept
Returns a borrowed view of stored subjects for adapters; valid until mutation.
Definition Sensing.h:228
Owning target result containing primary-independent subjects and optional geometry.
Definition Targeting.h:384
Result< void > setPoint(TargetLocation point)
Stores a point projection after preserving its coordinate tag.
Definition Targeting.cpp:311
Result< void > addSubject(SubjectRef subject)
Adds a valid subject once; duplicate subjects are a NoOp success.
Definition Targeting.cpp:290
Result< void > setArea(WorldArea area)
Stores an area projection after preserving its coordinate tag.
Definition Targeting.cpp:328
Result< void > setPrimary(SubjectRef subject)
Assigns an existing subject as primary without choosing one implicitly.
Definition Targeting.cpp:300
const std::optional< TargetLocation > & point() const noexcept
Returns the optional point projection.
Definition Targeting.h:402
Result< TargetSet > resolve(const TargetingQuery &query) const
Resolves a constrained candidate set through registered capabilities.
Definition Targeting.cpp:486
static Result< WorldArea > circle2D(WorldPoint center, float radius)
Creates a finite non-negative 2D world circle.
Definition Targeting.cpp:150
static Result< WorldArea > box3D(WorldPoint minimum, WorldPoint maximum)
Creates an axis-aligned 3D world box from inclusive corners.
Definition Targeting.cpp:172
static Result< WorldArea > sphere3D(WorldPoint center, float radius)
Creates a finite non-negative 3D world sphere.
Definition Targeting.cpp:164
static Result< WorldArea > box2D(WorldPoint minimum, WorldPoint maximum)
Creates an axis-aligned 2D world box from inclusive corners.
Definition Targeting.cpp:158
bool contains(WorldPoint point) const noexcept
Tests a world point without converting coordinate spaces.
Definition Targeting.cpp:192
@ Sphere3D
@ Circle2D
static Result< WorldArea > cone2D(WorldPoint apex, float dirX, float dirY, float halfAngleRadians, float range)
Creates a 2D world cone/sector.
Definition Targeting.cpp:178
Finite world-space point tagged as either World2D or World3D.
Definition Targeting.h:116
float x() const noexcept
Returns the X coordinate in the tagged world space.
Definition Targeting.h:136
bool isValid() const noexcept
Returns whether the point was constructed with finite coordinates.
Definition Targeting.h:142
float y() const noexcept
Returns the Y coordinate in the tagged world space.
Definition Targeting.h:138
static Result< WorldPoint > world3D(float x, float y, float z)
Creates a finite 3D world point.
Definition Targeting.cpp:135
static Result< WorldPoint > world2D(float x, float y)
Creates a finite 2D world point.
Definition Targeting.cpp:128
WorldPoint()=default
Constructs an invalid default point; use world2D/world3D for values.
static std::optional< ZoneRef > fromLogicalId(LogicalId id)
Creates a zone reference from a valid logical ID.
Definition Targeting.cpp:123
bool isValid() const noexcept
Returns whether the reference contains a valid logical ID.
Definition Targeting.h:97
float distanceSquared(float ax, float ay, float bx, float by)
Definition RTSSystemMovementInternal.h:23
Definition RTSSystems.h:257
@ DistanceAscending
std::variant< WorldPoint, GridPoint > TargetLocation
Either a world point or a grid point, with the tag retained.
Definition Targeting.h:198
CoordinateSpace
Coordinate spaces are not interchangeable, even when dimensions match.
Definition Targeting.h:37
std::string_view coordinateSpaceName(CoordinateSpace space) noexcept
Returns the stable protocol name for a coordinate space.
Definition Targeting.cpp:556
@ Neutral
@ TruncateToMax
Keep the best maxCount candidates after sorting (legacy circle/box limit).
@ Required
@ InvalidArgument
@ NotFound
@ PreconditionViolation
@ Unsupported
@ InvariantViolation
@ NoOp
@ Applied
World2D origin used for range tests and distance sorting.
Definition Sensing.h:117
std::vector< std::string > excludedTags
Definition Sensing.h:103
std::vector< std::string > requiredTags
Definition Sensing.h:102
std::vector< std::string > tags
Stable gameplay tags used by required/excluded tag queries.
Definition Targeting.h:376
TargetLocation location
Candidate location in one of the explicitly tagged spaces.
Definition Targeting.h:372
TargetDomain domain
Relationship class supplied by the sensing/domain adapter.
Definition Targeting.h:374
A query passed from a domain targeting algorithm to sensing.
Definition Targeting.h:350
Result< void > validate() const
Validates origin identity, location/spec space and spec constraints.
Definition Targeting.cpp:278
SubjectRef origin
Subject issuing the query; it is not implicitly selected as a result.
Definition Targeting.h:352
Result< void > validate() const
Validates count, range, tags, zone and coordinate-space invariants.
Definition Targeting.cpp:240
std::vector< std::string > excludedTags
Tags that exclude a candidate when present.
Definition Targeting.h:332
float maxRange
Maximum distance, in world units or grid cells; positive infinity means unbounded.
Definition Targeting.h:328
float minRange
Minimum distance, in world units or grid cells according to space.
Definition Targeting.h:326
std::optional< ZoneRef > zone
Optional logical zone membership required from candidates.
Definition Targeting.h:334
std::vector< std::string > requiredTags
All tags that each candidate must contain.
Definition Targeting.h:330
CoordinateSpace space
Required coordinate space for origin, candidates and area.
Definition Targeting.h:312
std::optional< WorldArea > worldArea
Optional World2D/World3D area constraint.
Definition Targeting.h:336
std::uint32_t minCount
Minimum number of candidates required in the resolved set.
Definition Targeting.h:316