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}