spawn_type.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #pragma once
  2. #include "troop_type.h"
  3. #include <QString>
  4. #include <cstdint>
  5. #include <functional>
  6. #include <optional>
  7. #include <string>
  8. namespace Game::Units {
  9. enum class SpawnType : std::uint8_t {
  10. Archer,
  11. Knight,
  12. Spearman,
  13. MountedKnight,
  14. HorseArcher,
  15. HorseSpearman,
  16. Healer,
  17. Catapult,
  18. Ballista,
  19. Elephant,
  20. Builder,
  21. Barracks,
  22. DefenseTower,
  23. Home
  24. };
  25. inline auto spawn_typeToQString(SpawnType type) -> QString {
  26. switch (type) {
  27. case SpawnType::Archer:
  28. return QStringLiteral("archer");
  29. case SpawnType::Knight:
  30. return QStringLiteral("swordsman");
  31. case SpawnType::Spearman:
  32. return QStringLiteral("spearman");
  33. case SpawnType::MountedKnight:
  34. return QStringLiteral("horse_swordsman");
  35. case SpawnType::HorseArcher:
  36. return QStringLiteral("horse_archer");
  37. case SpawnType::HorseSpearman:
  38. return QStringLiteral("horse_spearman");
  39. case SpawnType::Healer:
  40. return QStringLiteral("healer");
  41. case SpawnType::Catapult:
  42. return QStringLiteral("catapult");
  43. case SpawnType::Ballista:
  44. return QStringLiteral("ballista");
  45. case SpawnType::Elephant:
  46. return QStringLiteral("elephant");
  47. case SpawnType::Builder:
  48. return QStringLiteral("builder");
  49. case SpawnType::Barracks:
  50. return QStringLiteral("barracks");
  51. case SpawnType::DefenseTower:
  52. return QStringLiteral("defense_tower");
  53. case SpawnType::Home:
  54. return QStringLiteral("home");
  55. }
  56. return QStringLiteral("archer");
  57. }
  58. inline auto spawn_typeToString(SpawnType type) -> std::string {
  59. return spawn_typeToQString(type).toStdString();
  60. }
  61. inline auto tryParseSpawnType(const QString &value, SpawnType &out) -> bool {
  62. const QString lowered = value.trimmed().toLower();
  63. if (lowered == QStringLiteral("archer")) {
  64. out = SpawnType::Archer;
  65. return true;
  66. }
  67. if (lowered == QStringLiteral("swordsman") ||
  68. lowered == QStringLiteral("swordsman")) {
  69. out = SpawnType::Knight;
  70. return true;
  71. }
  72. if (lowered == QStringLiteral("spearman")) {
  73. out = SpawnType::Spearman;
  74. return true;
  75. }
  76. if (lowered == QStringLiteral("horse_swordsman")) {
  77. out = SpawnType::MountedKnight;
  78. return true;
  79. }
  80. if (lowered == QStringLiteral("horse_archer")) {
  81. out = SpawnType::HorseArcher;
  82. return true;
  83. }
  84. if (lowered == QStringLiteral("horse_spearman")) {
  85. out = SpawnType::HorseSpearman;
  86. return true;
  87. }
  88. if (lowered == QStringLiteral("healer")) {
  89. out = SpawnType::Healer;
  90. return true;
  91. }
  92. if (lowered == QStringLiteral("catapult")) {
  93. out = SpawnType::Catapult;
  94. return true;
  95. }
  96. if (lowered == QStringLiteral("ballista")) {
  97. out = SpawnType::Ballista;
  98. return true;
  99. }
  100. if (lowered == QStringLiteral("elephant")) {
  101. out = SpawnType::Elephant;
  102. return true;
  103. }
  104. if (lowered == QStringLiteral("builder")) {
  105. out = SpawnType::Builder;
  106. return true;
  107. }
  108. if (lowered == QStringLiteral("barracks")) {
  109. out = SpawnType::Barracks;
  110. return true;
  111. }
  112. if (lowered == QStringLiteral("village")) {
  113. out = SpawnType::Barracks;
  114. return true;
  115. }
  116. if (lowered == QStringLiteral("defense_tower")) {
  117. out = SpawnType::DefenseTower;
  118. return true;
  119. }
  120. if (lowered == QStringLiteral("home")) {
  121. out = SpawnType::Home;
  122. return true;
  123. }
  124. return false;
  125. }
  126. inline auto
  127. spawn_typeFromString(const std::string &str) -> std::optional<SpawnType> {
  128. if (str == "archer") {
  129. return SpawnType::Archer;
  130. }
  131. if (str == "swordsman" || str == "swordsman") {
  132. return SpawnType::Knight;
  133. }
  134. if (str == "spearman") {
  135. return SpawnType::Spearman;
  136. }
  137. if (str == "horse_swordsman") {
  138. return SpawnType::MountedKnight;
  139. }
  140. if (str == "horse_archer") {
  141. return SpawnType::HorseArcher;
  142. }
  143. if (str == "horse_spearman") {
  144. return SpawnType::HorseSpearman;
  145. }
  146. if (str == "healer") {
  147. return SpawnType::Healer;
  148. }
  149. if (str == "catapult") {
  150. return SpawnType::Catapult;
  151. }
  152. if (str == "ballista") {
  153. return SpawnType::Ballista;
  154. }
  155. if (str == "elephant") {
  156. return SpawnType::Elephant;
  157. }
  158. if (str == "builder") {
  159. return SpawnType::Builder;
  160. }
  161. if (str == "barracks") {
  162. return SpawnType::Barracks;
  163. }
  164. if (str == "village") {
  165. return SpawnType::Barracks;
  166. }
  167. if (str == "defense_tower") {
  168. return SpawnType::DefenseTower;
  169. }
  170. if (str == "home") {
  171. return SpawnType::Home;
  172. }
  173. return std::nullopt;
  174. }
  175. inline auto isTroopSpawn(SpawnType type) -> bool {
  176. return type != SpawnType::Barracks && type != SpawnType::DefenseTower &&
  177. type != SpawnType::Home;
  178. }
  179. inline auto is_building_spawn(SpawnType type) -> bool {
  180. return type == SpawnType::Barracks || type == SpawnType::DefenseTower ||
  181. type == SpawnType::Home;
  182. }
  183. inline auto can_use_attack_mode(SpawnType type) -> bool {
  184. return type != SpawnType::Healer && type != SpawnType::Builder &&
  185. type != SpawnType::Barracks && type != SpawnType::DefenseTower &&
  186. type != SpawnType::Home;
  187. }
  188. inline auto can_use_guard_mode(SpawnType type) -> bool {
  189. return type != SpawnType::Barracks && type != SpawnType::DefenseTower &&
  190. type != SpawnType::Home;
  191. }
  192. inline auto can_use_hold_mode(SpawnType type) -> bool {
  193. return type == SpawnType::Archer || type == SpawnType::Spearman;
  194. }
  195. inline auto can_use_patrol_mode(SpawnType type) -> bool {
  196. return type != SpawnType::Barracks && type != SpawnType::DefenseTower &&
  197. type != SpawnType::Home;
  198. }
  199. [[nodiscard]] inline auto can_use_run_mode(SpawnType type) noexcept -> bool {
  200. switch (type) {
  201. case SpawnType::Archer:
  202. case SpawnType::Knight:
  203. case SpawnType::Spearman:
  204. case SpawnType::Healer:
  205. case SpawnType::Builder:
  206. case SpawnType::MountedKnight:
  207. case SpawnType::HorseArcher:
  208. case SpawnType::HorseSpearman:
  209. return true;
  210. case SpawnType::Catapult:
  211. case SpawnType::Ballista:
  212. case SpawnType::Barracks:
  213. case SpawnType::DefenseTower:
  214. case SpawnType::Home:
  215. return false;
  216. }
  217. return false;
  218. }
  219. inline auto spawn_typeToTroopType(SpawnType type) -> std::optional<TroopType> {
  220. switch (type) {
  221. case SpawnType::Archer:
  222. return TroopType::Archer;
  223. case SpawnType::Knight:
  224. return TroopType::Swordsman;
  225. case SpawnType::Spearman:
  226. return TroopType::Spearman;
  227. case SpawnType::MountedKnight:
  228. return TroopType::MountedKnight;
  229. case SpawnType::HorseArcher:
  230. return TroopType::HorseArcher;
  231. case SpawnType::HorseSpearman:
  232. return TroopType::HorseSpearman;
  233. case SpawnType::Healer:
  234. return TroopType::Healer;
  235. case SpawnType::Catapult:
  236. return TroopType::Catapult;
  237. case SpawnType::Ballista:
  238. return TroopType::Ballista;
  239. case SpawnType::Elephant:
  240. return TroopType::Elephant;
  241. case SpawnType::Builder:
  242. return TroopType::Builder;
  243. case SpawnType::Barracks:
  244. return std::nullopt;
  245. case SpawnType::DefenseTower:
  246. return std::nullopt;
  247. case SpawnType::Home:
  248. return std::nullopt;
  249. }
  250. return std::nullopt;
  251. }
  252. inline auto spawn_typeFromTroopType(TroopType type) -> SpawnType {
  253. switch (type) {
  254. case TroopType::Archer:
  255. return SpawnType::Archer;
  256. case TroopType::Swordsman:
  257. return SpawnType::Knight;
  258. case TroopType::Spearman:
  259. return SpawnType::Spearman;
  260. case TroopType::MountedKnight:
  261. return SpawnType::MountedKnight;
  262. case TroopType::HorseArcher:
  263. return SpawnType::HorseArcher;
  264. case TroopType::HorseSpearman:
  265. return SpawnType::HorseSpearman;
  266. case TroopType::Healer:
  267. return SpawnType::Healer;
  268. case TroopType::Catapult:
  269. return SpawnType::Catapult;
  270. case TroopType::Ballista:
  271. return SpawnType::Ballista;
  272. case TroopType::Elephant:
  273. return SpawnType::Elephant;
  274. case TroopType::Builder:
  275. return SpawnType::Builder;
  276. }
  277. return SpawnType::Archer;
  278. }
  279. } // namespace Game::Units
  280. namespace std {
  281. template <> struct hash<Game::Units::SpawnType> {
  282. auto operator()(Game::Units::SpawnType type) const noexcept -> size_t {
  283. return hash<std::uint8_t>()(static_cast<std::uint8_t>(type));
  284. }
  285. };
  286. } // namespace std