Skip to main content

rpfm_lib/files/group_formations/versions/
v2.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 v2 (Rome 2 and later) group formations.
12//!
13//! Used by: Rome 2, Attila, Warhammer, Warhammer 2, Thrones of Britannia,
14//! Three Kingdoms, Troy, Pharaoh, Warhammer 3.
15
16use bitflags::bitflags;
17use serde_derive::{Serialize, Deserialize};
18
19use crate::error::{Result, RLibError};
20
21bitflags! {
22
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 RIVER_DEFEND                  = 0b0000_0000_0000_0000_0000_0000_0000_1000;
29        const UK_4                          = 0b0000_0000_0000_0000_0000_0000_0001_0000;
30        const AMBUSH_DEFENCE_BLOCK          = 0b0000_0000_0000_0000_0000_0000_0010_0000;
31        const SETTLEMENT_ASSAULT            = 0b0000_0000_0000_0000_0000_0000_0100_0000;
32        const SETTLEMENT_AREA_DEFEND_NARROW = 0b0000_0000_0000_0000_0000_0000_1000_0000;
33        const SETTLEMENT_AREA_ATTACK_NARROW = 0b0000_0000_0000_0000_0000_0001_0000_0000;
34        const UK_9                          = 0b0000_0000_0000_0000_0000_0010_0000_0000;
35        const NAVAL_ATTACK                  = 0b0000_0000_0000_0000_0000_0100_0000_0000;
36        const NAVAL_DEFEND                  = 0b0000_0000_0000_0000_0000_1000_0000_0000;
37        const DEFAULT_DEPLOYMENT            = 0b0000_0000_0000_0000_0001_0000_0000_0000;
38        const NAVAL_DEFAULT_DEPLOYMENT      = 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 Rome 2 and later formations.
61///
62/// These are abstract unit class identifiers shared across Rome 2, Attila,
63/// Warhammer series, Three Kingdoms, Troy, and Pharaoh.
64#[derive(Default, Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
65#[repr(u32)]
66pub enum EntityType {
67    InfMel = 0,
68    InfSpr = 1,
69    InfPik = 2,
70    InfMis = 3,
71    Com = 4,
72    CavShk = 5,
73    CavMel = 6,
74    CavMis = 7,
75    Chariot = 8,
76    Elph = 9,
77    Spcl = 10,
78    ArtFld = 11,
79    ArtFix = 12,
80    Uk13 = 13,
81    ShpMel = 14,
82    ShpMis = 15,
83    ShpArt = 16,
84    ShpTrn = 17,
85    #[default] Any = 18,
86    Uk19 = 19,
87    Uk20 = 20,
88    Uk21 = 21,
89    Uk22 = 22,
90    Uk23 = 23,
91    Uk24 = 24,
92}
93
94impl TryFrom<u32> for EntityType {
95    type Error = RLibError;
96    fn try_from(value: u32) -> Result<Self> {
97        match value {
98            _ if value == Self::InfMel as u32 => Ok(Self::InfMel),
99            _ if value == Self::InfSpr as u32 => Ok(Self::InfSpr),
100            _ if value == Self::InfPik as u32 => Ok(Self::InfPik),
101            _ if value == Self::InfMis as u32 => Ok(Self::InfMis),
102            _ if value == Self::Com as u32 => Ok(Self::Com),
103            _ if value == Self::CavShk as u32 => Ok(Self::CavShk),
104            _ if value == Self::CavMel as u32 => Ok(Self::CavMel),
105            _ if value == Self::CavMis as u32 => Ok(Self::CavMis),
106            _ if value == Self::Chariot as u32 => Ok(Self::Chariot),
107            _ if value == Self::Elph as u32 => Ok(Self::Elph),
108            _ if value == Self::Spcl as u32 => Ok(Self::Spcl),
109            _ if value == Self::ArtFld as u32 => Ok(Self::ArtFld),
110            _ if value == Self::ArtFix as u32 => Ok(Self::ArtFix),
111            _ if value == Self::Uk13 as u32 => Ok(Self::Uk13),
112            _ if value == Self::ShpMel as u32 => Ok(Self::ShpMel),
113            _ if value == Self::ShpMis as u32 => Ok(Self::ShpMis),
114            _ if value == Self::ShpArt as u32 => Ok(Self::ShpArt),
115            _ if value == Self::ShpTrn as u32 => Ok(Self::ShpTrn),
116            _ if value == Self::Any as u32 => Ok(Self::Any),
117            _ if value == Self::Uk19 as u32 => Ok(Self::Uk19),
118            _ if value == Self::Uk20 as u32 => Ok(Self::Uk20),
119            _ if value == Self::Uk21 as u32 => Ok(Self::Uk21),
120            _ if value == Self::Uk22 as u32 => Ok(Self::Uk22),
121            _ if value == Self::Uk23 as u32 => Ok(Self::Uk23),
122            _ if value == Self::Uk24 as u32 => Ok(Self::Uk24),
123            _ => Err(RLibError::DecodingGroupFormationsUnknownEnumValue("EntityType(v2)".to_string(), value)),
124        }
125    }
126}
127
128impl From<EntityType> for u32 {
129    fn from(value: EntityType) -> u32 {
130        value as u32
131    }
132}