Skip to main content

rpfm_lib/files/group_formations/versions/
v1.rs

1//---------------------------------------------------------------------------//
2// Copyright (c) 2017-2026 Ismael Gutiérrez González. All rights reserved.
3//
4// This file is part of the Rusted PackFile Manager (RPFM) project,
5// which can be found here: https://github.com/Frodo45127/rpfm.
6//
7// This file is licensed under the MIT license, which can be found here:
8// https://github.com/Frodo45127/rpfm/blob/master/LICENSE.
9//---------------------------------------------------------------------------//
10
11//! Shared data types for v1 (Shogun 2) group formations.
12
13use std::fmt::Display;
14
15use bitflags::bitflags;
16use serde_derive::{Serialize, Deserialize};
17
18use crate::error::{Result, RLibError};
19
20bitflags! {
21
22    // Note: the UK ones may not even exist, but we left them there just in case a game uses them.
23    #[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/// Entity types for Shogun 2 formations.
61///
62/// These are specific unit class identifiers used in Shogun 2.
63#[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}