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 TryFrom<u32> for EntityType {
132 type Error = RLibError;
133 fn try_from(value: u32) -> Result<Self> {
134 match value {
135 _ if value == Self::ArtilleryFixed as u32 => Ok(Self::ArtilleryFixed),
136 _ if value == Self::ArtilleryFoot as u32 => Ok(Self::ArtilleryFoot),
137 _ if value == Self::ArtilleryHorse as u32 => Ok(Self::ArtilleryHorse),
138 _ if value == Self::CavalryCamels as u32 => Ok(Self::CavalryCamels),
139 _ if value == Self::CavalryHeavy as u32 => Ok(Self::CavalryHeavy),
140 _ if value == Self::CavalryIrregular as u32 => Ok(Self::CavalryIrregular),
141 _ if value == Self::CavalryLancers as u32 => Ok(Self::CavalryLancers),
142 _ if value == Self::CavalryLight as u32 => Ok(Self::CavalryLight),
143 _ if value == Self::CavalryMissile as u32 => Ok(Self::CavalryMissile),
144 _ if value == Self::CavalryStandard as u32 => Ok(Self::CavalryStandard),
145 _ if value == Self::Dragoons as u32 => Ok(Self::Dragoons),
146 _ if value == Self::Elephants as u32 => Ok(Self::Elephants),
147 _ if value == Self::General as u32 => Ok(Self::General),
148 _ if value == Self::InfantryBerserker as u32 => Ok(Self::InfantryBerserker),
149 _ if value == Self::InfantryElite as u32 => Ok(Self::InfantryElite),
150 _ if value == Self::InfantryGrenadiers as u32 => Ok(Self::InfantryGrenadiers),
151 _ if value == Self::InfantryIrregulars as u32 => Ok(Self::InfantryIrregulars),
152 _ if value == Self::InfantryLight as u32 => Ok(Self::InfantryLight),
153 _ if value == Self::InfantryLine as u32 => Ok(Self::InfantryLine),
154 _ if value == Self::InfantryMelee as u32 => Ok(Self::InfantryMelee),
155 _ if value == Self::InfantryMilitia as u32 => Ok(Self::InfantryMilitia),
156 _ if value == Self::InfantryMob as u32 => Ok(Self::InfantryMob),
157 _ if value == Self::InfantrySkirmishers as u32 => Ok(Self::InfantrySkirmishers),
158 _ if value == Self::NavalAdmiral as u32 => Ok(Self::NavalAdmiral),
159 _ if value == Self::NavalBombKetch as u32 => Ok(Self::NavalBombKetch),
160 _ if value == Self::NavalBrig as u32 => Ok(Self::NavalBrig),
161 _ if value == Self::NavalDhow as u32 => Ok(Self::NavalDhow),
162 _ if value == Self::NavalFifthRate as u32 => Ok(Self::NavalFifthRate),
163 _ if value == Self::NavalFirstRate as u32 => Ok(Self::NavalFirstRate),
164 _ if value == Self::NavalFourthRate as u32 => Ok(Self::NavalFourthRate),
165 _ if value == Self::NavalHeavyGalley as u32 => Ok(Self::NavalHeavyGalley),
166 _ if value == Self::NavalIndiaman as u32 => Ok(Self::NavalIndiaman),
167 _ if value == Self::NavalLightGalley as u32 => Ok(Self::NavalLightGalley),
168 _ if value == Self::NavalLugger as u32 => Ok(Self::NavalLugger),
169 _ if value == Self::NavalMediumGalley as u32 => Ok(Self::NavalMediumGalley),
170 _ if value == Self::NavalOverFirstRate as u32 => Ok(Self::NavalOverFirstRate),
171 _ if value == Self::NavalRazee as u32 => Ok(Self::NavalRazee),
172 _ if value == Self::NavalRocketShip as u32 => Ok(Self::NavalRocketShip),
173 _ if value == Self::NavalSecondRate as u32 => Ok(Self::NavalSecondRate),
174 _ if value == Self::NavalSixthRate as u32 => Ok(Self::NavalSixthRate),
175 _ if value == Self::NavalSloop as u32 => Ok(Self::NavalSloop),
176 _ if value == Self::NavalSteamShip as u32 => Ok(Self::NavalSteamShip),
177 _ if value == Self::NavalThirdRate as u32 => Ok(Self::NavalThirdRate),
178 _ if value == Self::NavalXebec as u32 => Ok(Self::NavalXebec),
179 _ if value == Self::InfantrySpearman as u32 => Ok(Self::InfantrySpearman),
180 _ if value == Self::InfantryHeavy as u32 => Ok(Self::InfantryHeavy),
181 _ if value == Self::InfantrySpecial as u32 => Ok(Self::InfantrySpecial),
182 _ if value == Self::InfantryBow as u32 => Ok(Self::InfantryBow),
183 _ if value == Self::InfantryMatchlock as u32 => Ok(Self::InfantryMatchlock),
184 _ if value == Self::InfantrySword as u32 => Ok(Self::InfantrySword),
185 _ if value == Self::Siege as u32 => Ok(Self::Siege),
186 _ if value == Self::CavalrySword as u32 => Ok(Self::CavalrySword),
187 _ if value == Self::NavalHeavyShip as u32 => Ok(Self::NavalHeavyShip),
188 _ if value == Self::NavalMediumShip as u32 => Ok(Self::NavalMediumShip),
189 _ if value == Self::NavalLightShip as u32 => Ok(Self::NavalLightShip),
190 _ if value == Self::NavalCannonShip as u32 => Ok(Self::NavalCannonShip),
191 _ if value == Self::NavalGalleon as u32 => Ok(Self::NavalGalleon),
192 _ if value == Self::NavalIronclad as u32 => Ok(Self::NavalIronclad),
193 _ if value == Self::NavalCorvette as u32 => Ok(Self::NavalCorvette),
194 _ if value == Self::NavalFrigate as u32 => Ok(Self::NavalFrigate),
195 _ if value == Self::NavalGunboat as u32 => Ok(Self::NavalGunboat),
196 _ if value == Self::NavalTorpedoboat as u32 => Ok(Self::NavalTorpedoboat),
197 _ if value == Self::Any as u32 => Ok(Self::Any),
198 _ => Err(RLibError::DecodingGroupFormationsUnknownEnumValue("EntityType(v1)".to_string(), value)),
199 }
200 }
201}
202
203impl From<EntityType> for u32 {
204 fn from(value: EntityType) -> u32 {
205 value as u32
206 }
207}
208
209impl Display for EntityType {
210 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
211 match self {
212 Self::ArtilleryFixed => write!(f, "Fixed Artillery"),
213 Self::ArtilleryFoot => write!(f, "Foot Artillery"),
214 Self::ArtilleryHorse => write!(f, "Horse Artillery"),
215 Self::CavalryCamels => write!(f, "Camel Cavalry"),
216 Self::CavalryHeavy => write!(f, "Heavy Cavalry"),
217 Self::CavalryIrregular => write!(f, "Irregular Cavalry"),
218 Self::CavalryLancers => write!(f, "Lancer Cavalry"),
219 Self::CavalryLight => write!(f, "Light Cavalry"),
220 Self::CavalryMissile => write!(f, "Missile Cavalry"),
221 Self::CavalryStandard => write!(f, "Standard Cavalry"),
222 Self::Dragoons => write!(f, "Dragoons"),
223 Self::Elephants => write!(f, "Elephants"),
224 Self::General => write!(f, "General"),
225 Self::InfantryBerserker => write!(f, "Berserker Infantry"),
226 Self::InfantryElite => write!(f, "Elite Infantry"),
227 Self::InfantryGrenadiers => write!(f, "Grenadier Infantry"),
228 Self::InfantryIrregulars => write!(f, "Irregular Infantry"),
229 Self::InfantryLight => write!(f, "Light Infantry"),
230 Self::InfantryLine => write!(f, "Line Infantry"),
231 Self::InfantryMelee => write!(f, "Melee Infantry"),
232 Self::InfantryMilitia => write!(f, "Militia Infantry"),
233 Self::InfantryMob => write!(f, "Mob Infantry"),
234 Self::InfantrySkirmishers => write!(f, "Skirmisher Infantry"),
235 Self::NavalAdmiral => write!(f, "Admiral"),
236 Self::NavalBombKetch => write!(f, "Bomb Ketch"),
237 Self::NavalBrig => write!(f, "Brig"),
238 Self::NavalDhow => write!(f, "Dhow"),
239 Self::NavalFifthRate => write!(f, "Fifth Rate"),
240 Self::NavalFirstRate => write!(f, "First Rate"),
241 Self::NavalFourthRate => write!(f, "Fourth Rate"),
242 Self::NavalHeavyGalley => write!(f, "Heavy Galley"),
243 Self::NavalIndiaman => write!(f, "Indiaman"),
244 Self::NavalLightGalley => write!(f, "Light Galley"),
245 Self::NavalLugger => write!(f, "Lugger"),
246 Self::NavalMediumGalley => write!(f, "Medium Galley"),
247 Self::NavalOverFirstRate => write!(f, "Over First Rate"),
248 Self::NavalRazee => write!(f, "Razee"),
249 Self::NavalRocketShip => write!(f, "Rocket Ship"),
250 Self::NavalSecondRate => write!(f, "Second Rate"),
251 Self::NavalSixthRate => write!(f, "Sixth Rate"),
252 Self::NavalSloop => write!(f, "Sloop"),
253 Self::NavalSteamShip => write!(f, "Steam Ship"),
254 Self::NavalThirdRate => write!(f, "Third Rate"),
255 Self::NavalXebec => write!(f, "Xebec"),
256 Self::InfantrySpearman => write!(f, "Spearman Infantry"),
257 Self::InfantryHeavy => write!(f, "Heavy Infantry"),
258 Self::InfantrySpecial => write!(f, "Special Infantry"),
259 Self::InfantryBow => write!(f, "Bow Infantry"),
260 Self::InfantryMatchlock => write!(f, "Matchlock Infantry"),
261 Self::InfantrySword => write!(f, "Sword Infantry"),
262 Self::Siege => write!(f, "Siege"),
263 Self::CavalrySword => write!(f, "Sword Cavalry"),
264 Self::NavalHeavyShip => write!(f, "Heavy Ship"),
265 Self::NavalMediumShip => write!(f, "Medium Ship"),
266 Self::NavalLightShip => write!(f, "Light Ship"),
267 Self::NavalCannonShip => write!(f, "Cannon Ship"),
268 Self::NavalGalleon => write!(f, "Galleon"),
269 Self::NavalIronclad => write!(f, "Ironclad"),
270 Self::NavalCorvette => write!(f, "Corvette"),
271 Self::NavalFrigate => write!(f, "Frigate"),
272 Self::NavalGunboat => write!(f, "Gunboat"),
273 Self::NavalTorpedoboat => write!(f, "Torpedo Boat"),
274 Self::Any => write!(f, "Any"),
275 }
276 }
277}