wowlab_engine_domain/targeting/support/
algebra.rs1use crate::targeting::TargetSelector;
2
3const TARGET_OPERATION_SLOTS: usize = 2;
4
5#[derive(Clone, Copy, Debug, Eq, PartialEq)]
7#[non_exhaustive]
8pub enum TargetPlanAxis {
9 Object,
10 Reference,
11 Algorithm,
12 Check,
13 Direction,
14 EffectFallback,
15}
16
17#[derive(Clone, Copy, Debug, Eq, PartialEq, thiserror::Error)]
19#[error("target selector {selector:?} has unsupported {axis:?} value {value}")]
20pub struct TargetPlanGap {
21 pub selector: Option<i32>,
22 pub axis: TargetPlanAxis,
23 pub value: &'static str,
24}
25
26#[derive(Clone, Copy, Debug, Eq, PartialEq)]
28pub enum ExecutableTargetReference {
30 Caster,
31 ExplicitTarget,
32 Source,
33 Destination,
34}
35
36#[derive(Clone, Copy, Debug, Eq, PartialEq)]
38pub enum ExecutableCandidateDomain {
40 EnemyUnits,
41}
42
43#[derive(Clone, Copy, Debug, Eq, PartialEq)]
45pub enum ExecutableTargetAlgorithm {
47 Single,
48 ChannelTarget,
49 Radius,
50 Cone,
51 Line,
52}
53
54#[derive(Clone, Copy, Debug, Eq, PartialEq)]
56pub enum ExecutableLocationAlgorithm {
58 Reference,
59 ChannelTarget,
60}
61
62#[derive(Clone, Copy, Debug, Eq, PartialEq)]
64pub enum ExecutableTargetDirection {
66 None,
67 Front,
68 Back,
69 Right,
70 Left,
71 FrontRight,
72 BackRight,
73 BackLeft,
74 FrontLeft,
75 Random,
76}
77
78#[derive(Clone, Copy, Debug, Eq, PartialEq)]
80pub struct ExecutableLocation {
81 pub reference: ExecutableTargetReference,
82 pub algorithm: ExecutableLocationAlgorithm,
83 pub direction: ExecutableTargetDirection,
84}
85
86#[derive(Clone, Copy, Debug, Eq, PartialEq)]
88pub struct ExecutableSelection {
89 pub candidates: ExecutableCandidateDomain,
90 pub reference: ExecutableTargetReference,
91 pub algorithm: ExecutableTargetAlgorithm,
92 pub direction: ExecutableTargetDirection,
93 pub selector: TargetSelector,
94}
95
96#[derive(Clone, Copy, Debug, Eq, PartialEq)]
98pub enum ExecutableTargetOperation {
100 AssignSource(ExecutableLocation),
101 AssignDestination(ExecutableLocation),
102 Select(ExecutableSelection),
103 SelectAndAssignDestination(ExecutableSelection),
104}
105
106#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
108pub struct ExecutableTargetOperations {
109 first: Option<ExecutableTargetOperation>,
110 second: Option<ExecutableTargetOperation>,
111}
112
113impl ExecutableTargetOperations {
114 #[must_use]
116 pub const fn new() -> Self {
117 Self {
118 first: None,
119 second: None,
120 }
121 }
122
123 #[must_use]
125 pub const fn into_array(self) -> [Option<ExecutableTargetOperation>; TARGET_OPERATION_SLOTS] {
126 [self.first, self.second]
127 }
128
129 pub(super) fn push(&mut self, operation: ExecutableTargetOperation) {
130 if self.first.is_none() {
131 self.first = Some(operation);
132 } else {
133 self.second = Some(operation);
134 }
135 }
136}
137
138#[derive(Clone, Copy, Debug, Eq, PartialEq)]
140pub enum ExecutableTargetFallback {
142 ExplicitUnit,
143 NoSelection,
144 ExplicitDestination,
145}
146
147#[derive(Clone, Copy, Debug, Eq, PartialEq)]
149pub struct ExecutableTargetPlan {
150 pub operations: ExecutableTargetOperations,
151 pub fallback: ExecutableTargetFallback,
152}