Skip to main content

homm5_types/town/
mod.rs

1use serde::{Serialize, Deserialize};
2use crate::{common::{FileRef, Pos, Trigger, ArmySlot}, Homm5Type, player::PlayerID};
3use strum_macros::{EnumString, EnumIter, Display};
4
5#[derive(Debug, Serialize, Deserialize, Clone, Copy, EnumString, PartialEq, Eq, Hash, EnumIter, Display)]
6pub enum TownType {
7    #[serde(rename = "TOWN_NO_TYPE")]
8    TownNoType,
9    #[serde(rename = "TOWN_HEAVEN")]
10    TownHeaven,
11    #[serde(rename = "TOWN_PRESERVE")]
12    TownPreserve,
13    #[serde(rename = "TOWN_ACADEMY")]
14    TownAcademy,
15    #[serde(rename = "TOWN_DUNGEON")]
16    TownDungeon,
17    #[serde(rename = "TOWN_NECROMANCY")]
18    TownNecromancy,
19    #[serde(rename = "TOWN_INFERNO")]
20    TownInferno,
21    #[serde(rename = "TOWN_FORTRESS")]
22    TownFortress,
23    #[serde(rename = "TOWN_STRONGHOLD")]
24    TownStronghold
25}
26
27#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
28pub enum TownBuildingType {
29    #[serde(rename = "TB_TOWN_HALL")]
30    TownHall, 
31    #[serde(rename = "TB_FORT")]
32    Fort,
33    #[serde(rename = "TB_MARKETPLACE")]
34    Marketplace,
35    #[serde(rename = "TB_SHIPYARD")]
36    Shipyard,
37    #[serde(rename = "TB_TAVERN")]
38    Tavern,
39    #[serde(rename = "TB_BLACKSMITH")]
40    Blacksmith, 
41    #[serde(rename = "TB_MAGIC_GUILD")]
42    MagicGuild,
43    #[serde(rename = "TB_DWELLING_1")]
44    Dwelling1,
45    #[serde(rename = "TB_DWELLING_2")]
46    Dwelling2,
47    #[serde(rename = "TB_DWELLING_3")]
48    Dwelling3, 
49    #[serde(rename = "TB_DWELLING_4")]
50    Dwelling4,
51    #[serde(rename = "TB_DWELLING_5")]
52    Dwelling5,
53    #[serde(rename = "TB_DWELLING_6")]
54    Dwelling6,
55    #[serde(rename = "TB_DWELLING_7")]
56    Dwelling7,
57    #[serde(rename = "TB_GRAIL")]
58    Grail,
59    #[serde(rename = "TB_WONDER")]
60    Wonder,
61    #[serde(rename = "TB_SPECIAL_0")]
62    Special0,
63    #[serde(rename = "TB_SPECIAL_1")]
64    Special1,
65    #[serde(rename = "TB_SPECIAL_2")]
66    Special2,
67    #[serde(rename = "TB_SPECIAL_3")]
68    Special3,
69    #[serde(rename = "TB_SPECIAL_4")]
70    Special4,
71    #[serde(rename = "TB_SPECIAL_5")]
72    Special5,
73    #[serde(rename = "TB_SPECIAL_6")]
74    Special6,
75    #[serde(rename = "TB_SPECIAL_7")]
76    Special7,
77    #[serde(rename = "TB_SPECIAL_8")]
78    Special8,
79    #[serde(rename = "TB_SPECIAL_9")]
80    Special9,
81}
82
83#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
84pub enum TownBuildingLevel {
85    #[serde(rename = "BLD_UPG_NONE")]
86    BldUpgNone,
87    #[serde(rename = "BLD_UPG_1")]
88    BldUpg1,
89    #[serde(rename = "BLD_UPG_2")]
90    BldUpg2,
91    #[serde(rename = "BLD_UPG_3")]
92    BldUpg3,
93    #[serde(rename = "BLD_UPG_4")]
94    BldUpg4,
95    #[serde(rename = "BLD_UPG_5")]
96    BldUpg5
97}
98
99#[derive(Debug, Serialize, Deserialize)]
100pub struct ShipTile {
101    pub x: u16,
102    pub y: u16
103}
104
105#[allow(non_snake_case)]
106#[derive(Debug, Serialize, Deserialize, Clone)]
107pub struct TownBuilding {
108    #[serde(with = "quick_xml::serde_helpers::text_content")]
109    pub Type: TownBuildingType,
110    #[serde(with = "quick_xml::serde_helpers::text_content")]
111    pub InitialUpgrade: TownBuildingLevel,
112    #[serde(with = "quick_xml::serde_helpers::text_content")]
113    pub MaxUpgrade: TownBuildingLevel
114}
115
116#[allow(non_snake_case)]
117#[derive(Debug, Serialize, Deserialize)]
118pub struct Editable {
119    pub NameFileRef: crate::common::FileRef,
120    pub BiographyFileRef: crate::common::FileRef
121}
122
123#[allow(non_snake_case)]
124#[derive(Debug, Serialize, Deserialize)]
125pub struct CreaturesUpgradesFilter{
126    pub ForbiddenBasicUpgradeTiers: String,
127    pub ForbiddenAlterUpgradeTiers: String,
128    pub NotUpgradeable: String,
129    pub ForbiddenUpgrades: String
130}
131
132#[derive(Debug, Serialize, Deserialize)]
133pub struct TownBuildings {
134    #[serde(rename = "Item")]
135    pub items: Vec<TownBuilding>
136}
137
138#[derive(Debug, Serialize, Deserialize)]
139pub struct ArmySlots {
140    #[serde(rename = "Item")]
141    pub army_slots: Option<Vec<ArmySlot>>
142}
143
144
145#[allow(non_snake_case)]
146#[derive(Debug, Serialize, Deserialize)]
147pub struct AdvMapTown {
148    #[serde(rename = "Pos")]
149    pub pos: Pos,
150    #[serde(rename = "Rot")]
151    pub rot: f32,
152    #[serde(rename = "Floor")]
153    pub floor: u8,
154    #[serde(rename = "Name")]
155    pub name: String,
156    #[serde(rename = "CombatScript")]
157    pub combat_script: String,
158    #[serde(rename = "pointLights")]
159    pub point_lights: String,
160    #[serde(rename = "Shared")]
161    pub shared: FileRef,
162    #[serde(rename = "PlayerID")]
163    #[serde(with = "quick_xml::serde_helpers::text_content")]
164    pub player_id: PlayerID,
165    #[serde(rename = "CaptureTrigger")]
166    pub capture_trigger: Trigger,
167    #[serde(rename = "HeroDeployTrigger")]
168    pub hero_deploy_trigger: Trigger,
169    #[serde(rename = "ShipTile")]
170    pub ship_tile: ShipTile,
171    #[serde(rename = "Specialization")]
172    pub specialization: FileRef,
173    #[serde(rename = "buildings")]
174    pub buildings: TownBuildings,
175    #[serde(rename = "Editable")]
176    pub editable: Editable,
177    #[serde(rename = "armySlots")]
178    pub army_slots: ArmySlots,
179    #[serde(rename = "spellIDs")]
180    pub spell_ids: String,
181    #[serde(rename = "CaptionFileRef")]
182    pub caption_file_ref: FileRef,
183    #[serde(rename = "GarrisonHero")]
184    pub garrison_hero: String,
185    #[serde(rename = "Script")]
186    pub script: String,
187    #[serde(rename = "RndSource")]
188    pub rnd_source: String,
189    #[serde(rename = "LinkToPlayer")]
190    pub link_to_player: String,
191    #[serde(rename = "LinkToTown")]
192    pub link_to_town: String,
193    #[serde(rename = "CanCaptureOnlyNotVisit")]
194    pub can_capture_only_not_visit: bool,
195    #[serde(rename = "AllowQuickCombat")]
196    pub allow_quick_combat: bool,
197    #[serde(rename = "CreaturesUpgradesFilter")]
198    pub creatures_upgrades_filter: CreaturesUpgradesFilter,
199    #[serde(rename = "GarrisonBlockedForAI")]
200    pub garrison_blocked_for_ai: bool,
201    #[serde(rename = "BannedRaces")]
202    pub banned_races: String
203}
204
205impl Homm5Type for AdvMapTown {
206}