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 bitflags::bitflags;
14use serde_derive::{Serialize, Deserialize};
15
16use crate::error::{Result, RLibError};
17
18bitflags! {
19
20    // Note: the UK ones may not even exist, but we left them there just in case a game uses them.
21    #[derive(Default, PartialEq, Clone, Debug, Serialize, Deserialize)]
22    pub struct AIPurposeFlags: u32 {
23        const ATTACK                    = 0b0000_0000_0000_0000_0000_0000_0000_0001;
24        const DEFEND                    = 0b0000_0000_0000_0000_0000_0000_0000_0010;
25        const RIVER_ATTACK              = 0b0000_0000_0000_0000_0000_0000_0000_0100;
26        const UK_3                      = 0b0000_0000_0000_0000_0000_0000_0000_1000;
27        const UK_4                      = 0b0000_0000_0000_0000_0000_0000_0001_0000;
28        const NAVAL_ATTACK              = 0b0000_0000_0000_0000_0000_0000_0010_0000;
29        const NAVAL_DEFEND              = 0b0000_0000_0000_0000_0000_0000_0100_0000;
30        const DEFAULT_DEPLOYMENT        = 0b0000_0000_0000_0000_0000_0000_1000_0000;
31        const NAVAL_DEFAULT_DEPLOYMENT  = 0b0000_0000_0000_0000_0000_0001_0000_0000;
32        const LARGE_MAP_ONLY            = 0b0000_0000_0000_0000_0000_0010_0000_0000;
33        const UK_10                     = 0b0000_0000_0000_0000_0000_0100_0000_0000;
34        const UK_11                     = 0b0000_0000_0000_0000_0000_1000_0000_0000;
35        const UK_12                     = 0b0000_0000_0000_0000_0001_0000_0000_0000;
36        const UK_13                     = 0b0000_0000_0000_0000_0010_0000_0000_0000;
37        const UK_14                     = 0b0000_0000_0000_0000_0100_0000_0000_0000;
38        const UK_15                     = 0b0000_0000_0000_0000_1000_0000_0000_0000;
39        const UK_16                     = 0b0000_0000_0000_0001_0000_0000_0000_0000;
40        const UK_17                     = 0b0000_0000_0000_0010_0000_0000_0000_0000;
41        const UK_18                     = 0b0000_0000_0000_0100_0000_0000_0000_0000;
42        const UK_19                     = 0b0000_0000_0000_1000_0000_0000_0000_0000;
43        const UK_20                     = 0b0000_0000_0001_0000_0000_0000_0000_0000;
44        const UK_21                     = 0b0000_0000_0010_0000_0000_0000_0000_0000;
45        const UK_22                     = 0b0000_0000_0100_0000_0000_0000_0000_0000;
46        const UK_23                     = 0b0000_0000_1000_0000_0000_0000_0000_0000;
47        const UK_24                     = 0b0000_0001_0000_0000_0000_0000_0000_0000;
48        const UK_25                     = 0b0000_0010_0000_0000_0000_0000_0000_0000;
49        const UK_26                     = 0b0000_0100_0000_0000_0000_0000_0000_0000;
50        const UK_27                     = 0b0000_1000_0000_0000_0000_0000_0000_0000;
51        const UK_28                     = 0b0001_0000_0000_0000_0000_0000_0000_0000;
52        const UK_29                     = 0b0010_0000_0000_0000_0000_0000_0000_0000;
53        const UK_30                     = 0b0100_0000_0000_0000_0000_0000_0000_0000;
54        const UK_31                     = 0b1000_0000_0000_0000_0000_0000_0000_0000;
55    }
56}
57
58/// Entity types for Shogun 2 formations.
59///
60/// These are specific unit class identifiers used in Shogun 2.
61#[derive(Default, Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
62#[repr(u32)]
63pub enum EntityType {
64    ArtilleryFixed = 0,
65    ArtilleryFoot = 1,
66    ArtilleryHorse = 2,
67    CavalryCamels = 3,
68    CavalryHeavy = 4,
69    CavalryIrregular = 5,
70    CavalryLancers = 6,
71    CavalryLight = 7,
72    CavalryMissile = 8,
73    CavalryStandard = 9,
74    Dragoons = 10,
75    Elephants = 11,
76    General = 12,
77    InfantryBerserker = 13,
78    InfantryElite = 14,
79    InfantryGrenadiers = 15,
80    InfantryIrregulars = 16,
81    InfantryLight = 17,
82    InfantryLine = 18,
83    InfantryMelee = 19,
84    InfantryMilitia = 20,
85    InfantryMob = 21,
86    InfantrySkirmishers = 22,
87    NavalAdmiral = 23,
88    NavalBombKetch = 24,
89    NavalBrig = 25,
90    NavalDhow = 26,
91    NavalFifthRate = 27,
92    NavalFirstRate = 28,
93    NavalFourthRate = 29,
94    NavalHeavyGalley = 30,
95    NavalIndiaman = 31,
96    NavalLightGalley = 32,
97    NavalLugger = 33,
98    NavalMediumGalley = 34,
99    NavalOverFirstRate = 35,
100    NavalRazee = 36,
101    NavalRocketShip = 37,
102    NavalSecondRate = 38,
103    NavalSixthRate = 39,
104    NavalSloop = 40,
105    NavalSteamShip = 41,
106    NavalThirdRate = 42,
107    NavalXebec = 43,
108    InfantrySpearman = 45,
109    InfantryHeavy = 46,
110    InfantrySpecial = 47,
111    InfantryBow = 48,
112    InfantryMatchlock = 49,
113    InfantrySword = 50,
114    Siege = 51,
115    CavalrySword = 52,
116    NavalHeavyShip = 54,
117    NavalMediumShip = 55,
118    NavalLightShip = 56,
119    NavalCannonShip = 57,
120    NavalGalleon = 58,
121    NavalIronclad = 60,
122    NavalCorvette = 61,
123    NavalFrigate = 62,
124    NavalGunboat = 63,
125    NavalTorpedoboat = 64,
126    #[default] Any = 65,
127}
128
129impl TryFrom<u32> for EntityType {
130    type Error = RLibError;
131    fn try_from(value: u32) -> Result<Self> {
132        match value {
133            _ if value == Self::ArtilleryFixed as u32 => Ok(Self::ArtilleryFixed),
134            _ if value == Self::ArtilleryFoot as u32 => Ok(Self::ArtilleryFoot),
135            _ if value == Self::ArtilleryHorse as u32 => Ok(Self::ArtilleryHorse),
136            _ if value == Self::CavalryCamels as u32 => Ok(Self::CavalryCamels),
137            _ if value == Self::CavalryHeavy as u32 => Ok(Self::CavalryHeavy),
138            _ if value == Self::CavalryIrregular as u32 => Ok(Self::CavalryIrregular),
139            _ if value == Self::CavalryLancers as u32 => Ok(Self::CavalryLancers),
140            _ if value == Self::CavalryLight as u32 => Ok(Self::CavalryLight),
141            _ if value == Self::CavalryMissile as u32 => Ok(Self::CavalryMissile),
142            _ if value == Self::CavalryStandard as u32 => Ok(Self::CavalryStandard),
143            _ if value == Self::Dragoons as u32 => Ok(Self::Dragoons),
144            _ if value == Self::Elephants as u32 => Ok(Self::Elephants),
145            _ if value == Self::General as u32 => Ok(Self::General),
146            _ if value == Self::InfantryBerserker as u32 => Ok(Self::InfantryBerserker),
147            _ if value == Self::InfantryElite as u32 => Ok(Self::InfantryElite),
148            _ if value == Self::InfantryGrenadiers as u32 => Ok(Self::InfantryGrenadiers),
149            _ if value == Self::InfantryIrregulars as u32 => Ok(Self::InfantryIrregulars),
150            _ if value == Self::InfantryLight as u32 => Ok(Self::InfantryLight),
151            _ if value == Self::InfantryLine as u32 => Ok(Self::InfantryLine),
152            _ if value == Self::InfantryMelee as u32 => Ok(Self::InfantryMelee),
153            _ if value == Self::InfantryMilitia as u32 => Ok(Self::InfantryMilitia),
154            _ if value == Self::InfantryMob as u32 => Ok(Self::InfantryMob),
155            _ if value == Self::InfantrySkirmishers as u32 => Ok(Self::InfantrySkirmishers),
156            _ if value == Self::NavalAdmiral as u32 => Ok(Self::NavalAdmiral),
157            _ if value == Self::NavalBombKetch as u32 => Ok(Self::NavalBombKetch),
158            _ if value == Self::NavalBrig as u32 => Ok(Self::NavalBrig),
159            _ if value == Self::NavalDhow as u32 => Ok(Self::NavalDhow),
160            _ if value == Self::NavalFifthRate as u32 => Ok(Self::NavalFifthRate),
161            _ if value == Self::NavalFirstRate as u32 => Ok(Self::NavalFirstRate),
162            _ if value == Self::NavalFourthRate as u32 => Ok(Self::NavalFourthRate),
163            _ if value == Self::NavalHeavyGalley as u32 => Ok(Self::NavalHeavyGalley),
164            _ if value == Self::NavalIndiaman as u32 => Ok(Self::NavalIndiaman),
165            _ if value == Self::NavalLightGalley as u32 => Ok(Self::NavalLightGalley),
166            _ if value == Self::NavalLugger as u32 => Ok(Self::NavalLugger),
167            _ if value == Self::NavalMediumGalley as u32 => Ok(Self::NavalMediumGalley),
168            _ if value == Self::NavalOverFirstRate as u32 => Ok(Self::NavalOverFirstRate),
169            _ if value == Self::NavalRazee as u32 => Ok(Self::NavalRazee),
170            _ if value == Self::NavalRocketShip as u32 => Ok(Self::NavalRocketShip),
171            _ if value == Self::NavalSecondRate as u32 => Ok(Self::NavalSecondRate),
172            _ if value == Self::NavalSixthRate as u32 => Ok(Self::NavalSixthRate),
173            _ if value == Self::NavalSloop as u32 => Ok(Self::NavalSloop),
174            _ if value == Self::NavalSteamShip as u32 => Ok(Self::NavalSteamShip),
175            _ if value == Self::NavalThirdRate as u32 => Ok(Self::NavalThirdRate),
176            _ if value == Self::NavalXebec as u32 => Ok(Self::NavalXebec),
177            _ if value == Self::InfantrySpearman as u32 => Ok(Self::InfantrySpearman),
178            _ if value == Self::InfantryHeavy as u32 => Ok(Self::InfantryHeavy),
179            _ if value == Self::InfantrySpecial as u32 => Ok(Self::InfantrySpecial),
180            _ if value == Self::InfantryBow as u32 => Ok(Self::InfantryBow),
181            _ if value == Self::InfantryMatchlock as u32 => Ok(Self::InfantryMatchlock),
182            _ if value == Self::InfantrySword as u32 => Ok(Self::InfantrySword),
183            _ if value == Self::Siege as u32 => Ok(Self::Siege),
184            _ if value == Self::CavalrySword as u32 => Ok(Self::CavalrySword),
185            _ if value == Self::NavalHeavyShip as u32 => Ok(Self::NavalHeavyShip),
186            _ if value == Self::NavalMediumShip as u32 => Ok(Self::NavalMediumShip),
187            _ if value == Self::NavalLightShip as u32 => Ok(Self::NavalLightShip),
188            _ if value == Self::NavalCannonShip as u32 => Ok(Self::NavalCannonShip),
189            _ if value == Self::NavalGalleon as u32 => Ok(Self::NavalGalleon),
190            _ if value == Self::NavalIronclad as u32 => Ok(Self::NavalIronclad),
191            _ if value == Self::NavalCorvette as u32 => Ok(Self::NavalCorvette),
192            _ if value == Self::NavalFrigate as u32 => Ok(Self::NavalFrigate),
193            _ if value == Self::NavalGunboat as u32 => Ok(Self::NavalGunboat),
194            _ if value == Self::NavalTorpedoboat as u32 => Ok(Self::NavalTorpedoboat),
195            _ if value == Self::Any as u32 => Ok(Self::Any),
196            _ => Err(RLibError::DecodingGroupFormationsUnknownEnumValue("EntityType(v1)".to_string(), value)),
197        }
198    }
199}
200
201impl From<EntityType> for u32 {
202    fn from(value: EntityType) -> u32 {
203        value as u32
204    }
205}