1use std::fmt::Display;
14
15use bitflags::bitflags;
16use serde_derive::{Serialize, Deserialize};
17
18use crate::error::{Result, RLibError};
19
20bitflags! {
21
22 #[derive(Default, PartialEq, Clone, Debug, Serialize, Deserialize)]
24 pub struct AIPurposeFlags: u32 {
25 const ATTACK = 0b0000_0000_0000_0000_0000_0000_0000_0001;
26 const DEFEND = 0b0000_0000_0000_0000_0000_0000_0000_0010;
27 const RIVER_ATTACK = 0b0000_0000_0000_0000_0000_0000_0000_0100;
28 const UK_3 = 0b0000_0000_0000_0000_0000_0000_0000_1000;
29 const UK_4 = 0b0000_0000_0000_0000_0000_0000_0001_0000;
30 const NAVAL_ATTACK = 0b0000_0000_0000_0000_0000_0000_0010_0000;
31 const NAVAL_DEFEND = 0b0000_0000_0000_0000_0000_0000_0100_0000;
32 const DEFAULT_DEPLOYMENT = 0b0000_0000_0000_0000_0000_0000_1000_0000;
33 const NAVAL_DEFAULT_DEPLOYMENT = 0b0000_0000_0000_0000_0000_0001_0000_0000;
34 const LARGE_MAP_ONLY = 0b0000_0000_0000_0000_0000_0010_0000_0000;
35 const UK_10 = 0b0000_0000_0000_0000_0000_0100_0000_0000;
36 const UK_11 = 0b0000_0000_0000_0000_0000_1000_0000_0000;
37 const UK_12 = 0b0000_0000_0000_0000_0001_0000_0000_0000;
38 const UK_13 = 0b0000_0000_0000_0000_0010_0000_0000_0000;
39 const UK_14 = 0b0000_0000_0000_0000_0100_0000_0000_0000;
40 const UK_15 = 0b0000_0000_0000_0000_1000_0000_0000_0000;
41 const UK_16 = 0b0000_0000_0000_0001_0000_0000_0000_0000;
42 const UK_17 = 0b0000_0000_0000_0010_0000_0000_0000_0000;
43 const UK_18 = 0b0000_0000_0000_0100_0000_0000_0000_0000;
44 const UK_19 = 0b0000_0000_0000_1000_0000_0000_0000_0000;
45 const UK_20 = 0b0000_0000_0001_0000_0000_0000_0000_0000;
46 const UK_21 = 0b0000_0000_0010_0000_0000_0000_0000_0000;
47 const UK_22 = 0b0000_0000_0100_0000_0000_0000_0000_0000;
48 const UK_23 = 0b0000_0000_1000_0000_0000_0000_0000_0000;
49 const UK_24 = 0b0000_0001_0000_0000_0000_0000_0000_0000;
50 const UK_25 = 0b0000_0010_0000_0000_0000_0000_0000_0000;
51 const UK_26 = 0b0000_0100_0000_0000_0000_0000_0000_0000;
52 const UK_27 = 0b0000_1000_0000_0000_0000_0000_0000_0000;
53 const UK_28 = 0b0001_0000_0000_0000_0000_0000_0000_0000;
54 const UK_29 = 0b0010_0000_0000_0000_0000_0000_0000_0000;
55 const UK_30 = 0b0100_0000_0000_0000_0000_0000_0000_0000;
56 const UK_31 = 0b1000_0000_0000_0000_0000_0000_0000_0000;
57 }
58}
59
60#[derive(Default, Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
64#[repr(u32)]
65pub enum EntityType {
66 ArtilleryFixed = 0,
67 ArtilleryFoot = 1,
68 ArtilleryHorse = 2,
69 CavalryCamels = 3,
70 CavalryHeavy = 4,
71 CavalryIrregular = 5,
72 CavalryLancers = 6,
73 CavalryLight = 7,
74 CavalryMissile = 8,
75 CavalryStandard = 9,
76 Dragoons = 10,
77 Elephants = 11,
78 General = 12,
79 InfantryBerserker = 13,
80 InfantryElite = 14,
81 InfantryGrenadiers = 15,
82 InfantryIrregulars = 16,
83 InfantryLight = 17,
84 InfantryLine = 18,
85 InfantryMelee = 19,
86 InfantryMilitia = 20,
87 InfantryMob = 21,
88 InfantrySkirmishers = 22,
89 NavalAdmiral = 23,
90 NavalBombKetch = 24,
91 NavalBrig = 25,
92 NavalDhow = 26,
93 NavalFifthRate = 27,
94 NavalFirstRate = 28,
95 NavalFourthRate = 29,
96 NavalHeavyGalley = 30,
97 NavalIndiaman = 31,
98 NavalLightGalley = 32,
99 NavalLugger = 33,
100 NavalMediumGalley = 34,
101 NavalOverFirstRate = 35,
102 NavalRazee = 36,
103 NavalRocketShip = 37,
104 NavalSecondRate = 38,
105 NavalSixthRate = 39,
106 NavalSloop = 40,
107 NavalSteamShip = 41,
108 NavalThirdRate = 42,
109 NavalXebec = 43,
110 InfantrySpearman = 45,
111 InfantryHeavy = 46,
112 InfantrySpecial = 47,
113 InfantryBow = 48,
114 InfantryMatchlock = 49,
115 InfantrySword = 50,
116 Siege = 51,
117 CavalrySword = 52,
118 NavalHeavyShip = 54,
119 NavalMediumShip = 55,
120 NavalLightShip = 56,
121 NavalCannonShip = 57,
122 NavalGalleon = 58,
123 NavalIronclad = 60,
124 NavalCorvette = 61,
125 NavalFrigate = 62,
126 NavalGunboat = 63,
127 NavalTorpedoboat = 64,
128 #[default] Any = 65,
129}
130
131impl EntityType {
132
133 pub const ALL: [Self; 63] = [
135 Self::ArtilleryFixed, Self::ArtilleryFoot, Self::ArtilleryHorse, Self::CavalryCamels, Self::CavalryHeavy, Self::CavalryIrregular,
136 Self::CavalryLancers, Self::CavalryLight, Self::CavalryMissile, Self::CavalryStandard, Self::Dragoons, Self::Elephants,
137 Self::General, Self::InfantryBerserker, Self::InfantryElite, Self::InfantryGrenadiers, Self::InfantryIrregulars, Self::InfantryLight,
138 Self::InfantryLine, Self::InfantryMelee, Self::InfantryMilitia, Self::InfantryMob, Self::InfantrySkirmishers, Self::NavalAdmiral,
139 Self::NavalBombKetch, Self::NavalBrig, Self::NavalDhow, Self::NavalFifthRate, Self::NavalFirstRate, Self::NavalFourthRate,
140 Self::NavalHeavyGalley, Self::NavalIndiaman, Self::NavalLightGalley, Self::NavalLugger, Self::NavalMediumGalley, Self::NavalOverFirstRate,
141 Self::NavalRazee, Self::NavalRocketShip, Self::NavalSecondRate, Self::NavalSixthRate, Self::NavalSloop, Self::NavalSteamShip,
142 Self::NavalThirdRate, Self::NavalXebec, Self::InfantrySpearman, Self::InfantryHeavy, Self::InfantrySpecial, Self::InfantryBow,
143 Self::InfantryMatchlock, Self::InfantrySword, Self::Siege, Self::CavalrySword, Self::NavalHeavyShip, Self::NavalMediumShip,
144 Self::NavalLightShip, Self::NavalCannonShip, Self::NavalGalleon, Self::NavalIronclad, Self::NavalCorvette, Self::NavalFrigate,
145 Self::NavalGunboat, Self::NavalTorpedoboat, Self::Any,
146 ];
147}
148
149impl TryFrom<u32> for EntityType {
150 type Error = RLibError;
151 fn try_from(value: u32) -> Result<Self> {
152 match value {
153 _ if value == Self::ArtilleryFixed as u32 => Ok(Self::ArtilleryFixed),
154 _ if value == Self::ArtilleryFoot as u32 => Ok(Self::ArtilleryFoot),
155 _ if value == Self::ArtilleryHorse as u32 => Ok(Self::ArtilleryHorse),
156 _ if value == Self::CavalryCamels as u32 => Ok(Self::CavalryCamels),
157 _ if value == Self::CavalryHeavy as u32 => Ok(Self::CavalryHeavy),
158 _ if value == Self::CavalryIrregular as u32 => Ok(Self::CavalryIrregular),
159 _ if value == Self::CavalryLancers as u32 => Ok(Self::CavalryLancers),
160 _ if value == Self::CavalryLight as u32 => Ok(Self::CavalryLight),
161 _ if value == Self::CavalryMissile as u32 => Ok(Self::CavalryMissile),
162 _ if value == Self::CavalryStandard as u32 => Ok(Self::CavalryStandard),
163 _ if value == Self::Dragoons as u32 => Ok(Self::Dragoons),
164 _ if value == Self::Elephants as u32 => Ok(Self::Elephants),
165 _ if value == Self::General as u32 => Ok(Self::General),
166 _ if value == Self::InfantryBerserker as u32 => Ok(Self::InfantryBerserker),
167 _ if value == Self::InfantryElite as u32 => Ok(Self::InfantryElite),
168 _ if value == Self::InfantryGrenadiers as u32 => Ok(Self::InfantryGrenadiers),
169 _ if value == Self::InfantryIrregulars as u32 => Ok(Self::InfantryIrregulars),
170 _ if value == Self::InfantryLight as u32 => Ok(Self::InfantryLight),
171 _ if value == Self::InfantryLine as u32 => Ok(Self::InfantryLine),
172 _ if value == Self::InfantryMelee as u32 => Ok(Self::InfantryMelee),
173 _ if value == Self::InfantryMilitia as u32 => Ok(Self::InfantryMilitia),
174 _ if value == Self::InfantryMob as u32 => Ok(Self::InfantryMob),
175 _ if value == Self::InfantrySkirmishers as u32 => Ok(Self::InfantrySkirmishers),
176 _ if value == Self::NavalAdmiral as u32 => Ok(Self::NavalAdmiral),
177 _ if value == Self::NavalBombKetch as u32 => Ok(Self::NavalBombKetch),
178 _ if value == Self::NavalBrig as u32 => Ok(Self::NavalBrig),
179 _ if value == Self::NavalDhow as u32 => Ok(Self::NavalDhow),
180 _ if value == Self::NavalFifthRate as u32 => Ok(Self::NavalFifthRate),
181 _ if value == Self::NavalFirstRate as u32 => Ok(Self::NavalFirstRate),
182 _ if value == Self::NavalFourthRate as u32 => Ok(Self::NavalFourthRate),
183 _ if value == Self::NavalHeavyGalley as u32 => Ok(Self::NavalHeavyGalley),
184 _ if value == Self::NavalIndiaman as u32 => Ok(Self::NavalIndiaman),
185 _ if value == Self::NavalLightGalley as u32 => Ok(Self::NavalLightGalley),
186 _ if value == Self::NavalLugger as u32 => Ok(Self::NavalLugger),
187 _ if value == Self::NavalMediumGalley as u32 => Ok(Self::NavalMediumGalley),
188 _ if value == Self::NavalOverFirstRate as u32 => Ok(Self::NavalOverFirstRate),
189 _ if value == Self::NavalRazee as u32 => Ok(Self::NavalRazee),
190 _ if value == Self::NavalRocketShip as u32 => Ok(Self::NavalRocketShip),
191 _ if value == Self::NavalSecondRate as u32 => Ok(Self::NavalSecondRate),
192 _ if value == Self::NavalSixthRate as u32 => Ok(Self::NavalSixthRate),
193 _ if value == Self::NavalSloop as u32 => Ok(Self::NavalSloop),
194 _ if value == Self::NavalSteamShip as u32 => Ok(Self::NavalSteamShip),
195 _ if value == Self::NavalThirdRate as u32 => Ok(Self::NavalThirdRate),
196 _ if value == Self::NavalXebec as u32 => Ok(Self::NavalXebec),
197 _ if value == Self::InfantrySpearman as u32 => Ok(Self::InfantrySpearman),
198 _ if value == Self::InfantryHeavy as u32 => Ok(Self::InfantryHeavy),
199 _ if value == Self::InfantrySpecial as u32 => Ok(Self::InfantrySpecial),
200 _ if value == Self::InfantryBow as u32 => Ok(Self::InfantryBow),
201 _ if value == Self::InfantryMatchlock as u32 => Ok(Self::InfantryMatchlock),
202 _ if value == Self::InfantrySword as u32 => Ok(Self::InfantrySword),
203 _ if value == Self::Siege as u32 => Ok(Self::Siege),
204 _ if value == Self::CavalrySword as u32 => Ok(Self::CavalrySword),
205 _ if value == Self::NavalHeavyShip as u32 => Ok(Self::NavalHeavyShip),
206 _ if value == Self::NavalMediumShip as u32 => Ok(Self::NavalMediumShip),
207 _ if value == Self::NavalLightShip as u32 => Ok(Self::NavalLightShip),
208 _ if value == Self::NavalCannonShip as u32 => Ok(Self::NavalCannonShip),
209 _ if value == Self::NavalGalleon as u32 => Ok(Self::NavalGalleon),
210 _ if value == Self::NavalIronclad as u32 => Ok(Self::NavalIronclad),
211 _ if value == Self::NavalCorvette as u32 => Ok(Self::NavalCorvette),
212 _ if value == Self::NavalFrigate as u32 => Ok(Self::NavalFrigate),
213 _ if value == Self::NavalGunboat as u32 => Ok(Self::NavalGunboat),
214 _ if value == Self::NavalTorpedoboat as u32 => Ok(Self::NavalTorpedoboat),
215 _ if value == Self::Any as u32 => Ok(Self::Any),
216 _ => Err(RLibError::DecodingGroupFormationsUnknownEnumValue("EntityType(v1)".to_string(), value)),
217 }
218 }
219}
220
221impl From<EntityType> for u32 {
222 fn from(value: EntityType) -> u32 {
223 value as u32
224 }
225}
226
227impl Display for EntityType {
228 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
229 match self {
230 Self::ArtilleryFixed => write!(f, "Fixed Artillery"),
231 Self::ArtilleryFoot => write!(f, "Foot Artillery"),
232 Self::ArtilleryHorse => write!(f, "Horse Artillery"),
233 Self::CavalryCamels => write!(f, "Camel Cavalry"),
234 Self::CavalryHeavy => write!(f, "Heavy Cavalry"),
235 Self::CavalryIrregular => write!(f, "Irregular Cavalry"),
236 Self::CavalryLancers => write!(f, "Lancer Cavalry"),
237 Self::CavalryLight => write!(f, "Light Cavalry"),
238 Self::CavalryMissile => write!(f, "Missile Cavalry"),
239 Self::CavalryStandard => write!(f, "Standard Cavalry"),
240 Self::Dragoons => write!(f, "Dragoons"),
241 Self::Elephants => write!(f, "Elephants"),
242 Self::General => write!(f, "General"),
243 Self::InfantryBerserker => write!(f, "Berserker Infantry"),
244 Self::InfantryElite => write!(f, "Elite Infantry"),
245 Self::InfantryGrenadiers => write!(f, "Grenadier Infantry"),
246 Self::InfantryIrregulars => write!(f, "Irregular Infantry"),
247 Self::InfantryLight => write!(f, "Light Infantry"),
248 Self::InfantryLine => write!(f, "Line Infantry"),
249 Self::InfantryMelee => write!(f, "Melee Infantry"),
250 Self::InfantryMilitia => write!(f, "Militia Infantry"),
251 Self::InfantryMob => write!(f, "Mob Infantry"),
252 Self::InfantrySkirmishers => write!(f, "Skirmisher Infantry"),
253 Self::NavalAdmiral => write!(f, "Admiral"),
254 Self::NavalBombKetch => write!(f, "Bomb Ketch"),
255 Self::NavalBrig => write!(f, "Brig"),
256 Self::NavalDhow => write!(f, "Dhow"),
257 Self::NavalFifthRate => write!(f, "Fifth Rate"),
258 Self::NavalFirstRate => write!(f, "First Rate"),
259 Self::NavalFourthRate => write!(f, "Fourth Rate"),
260 Self::NavalHeavyGalley => write!(f, "Heavy Galley"),
261 Self::NavalIndiaman => write!(f, "Indiaman"),
262 Self::NavalLightGalley => write!(f, "Light Galley"),
263 Self::NavalLugger => write!(f, "Lugger"),
264 Self::NavalMediumGalley => write!(f, "Medium Galley"),
265 Self::NavalOverFirstRate => write!(f, "Over First Rate"),
266 Self::NavalRazee => write!(f, "Razee"),
267 Self::NavalRocketShip => write!(f, "Rocket Ship"),
268 Self::NavalSecondRate => write!(f, "Second Rate"),
269 Self::NavalSixthRate => write!(f, "Sixth Rate"),
270 Self::NavalSloop => write!(f, "Sloop"),
271 Self::NavalSteamShip => write!(f, "Steam Ship"),
272 Self::NavalThirdRate => write!(f, "Third Rate"),
273 Self::NavalXebec => write!(f, "Xebec"),
274 Self::InfantrySpearman => write!(f, "Spearman Infantry"),
275 Self::InfantryHeavy => write!(f, "Heavy Infantry"),
276 Self::InfantrySpecial => write!(f, "Special Infantry"),
277 Self::InfantryBow => write!(f, "Bow Infantry"),
278 Self::InfantryMatchlock => write!(f, "Matchlock Infantry"),
279 Self::InfantrySword => write!(f, "Sword Infantry"),
280 Self::Siege => write!(f, "Siege"),
281 Self::CavalrySword => write!(f, "Sword Cavalry"),
282 Self::NavalHeavyShip => write!(f, "Heavy Ship"),
283 Self::NavalMediumShip => write!(f, "Medium Ship"),
284 Self::NavalLightShip => write!(f, "Light Ship"),
285 Self::NavalCannonShip => write!(f, "Cannon Ship"),
286 Self::NavalGalleon => write!(f, "Galleon"),
287 Self::NavalIronclad => write!(f, "Ironclad"),
288 Self::NavalCorvette => write!(f, "Corvette"),
289 Self::NavalFrigate => write!(f, "Frigate"),
290 Self::NavalGunboat => write!(f, "Gunboat"),
291 Self::NavalTorpedoboat => write!(f, "Torpedo Boat"),
292 Self::Any => write!(f, "Any"),
293 }
294 }
295}