spawn_type.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. Barracks
  15. };
  16. inline auto spawn_typeToQString(SpawnType type) -> QString {
  17. switch (type) {
  18. case SpawnType::Archer:
  19. return QStringLiteral("archer");
  20. case SpawnType::Knight:
  21. return QStringLiteral("swordsman");
  22. case SpawnType::Spearman:
  23. return QStringLiteral("spearman");
  24. case SpawnType::MountedKnight:
  25. return QStringLiteral("mounted_knight");
  26. case SpawnType::Barracks:
  27. return QStringLiteral("barracks");
  28. }
  29. return QStringLiteral("archer");
  30. }
  31. inline auto spawn_typeToString(SpawnType type) -> std::string {
  32. return spawn_typeToQString(type).toStdString();
  33. }
  34. inline auto tryParseSpawnType(const QString &value, SpawnType &out) -> bool {
  35. const QString lowered = value.trimmed().toLower();
  36. if (lowered == QStringLiteral("archer")) {
  37. out = SpawnType::Archer;
  38. return true;
  39. }
  40. if (lowered == QStringLiteral("swordsman") ||
  41. lowered == QStringLiteral("knight")) {
  42. out = SpawnType::Knight;
  43. return true;
  44. }
  45. if (lowered == QStringLiteral("spearman")) {
  46. out = SpawnType::Spearman;
  47. return true;
  48. }
  49. if (lowered == QStringLiteral("mounted_knight")) {
  50. out = SpawnType::MountedKnight;
  51. return true;
  52. }
  53. if (lowered == QStringLiteral("barracks")) {
  54. out = SpawnType::Barracks;
  55. return true;
  56. }
  57. return false;
  58. }
  59. inline auto
  60. spawn_typeFromString(const std::string &str) -> std::optional<SpawnType> {
  61. if (str == "archer") {
  62. return SpawnType::Archer;
  63. }
  64. if (str == "swordsman" || str == "knight") {
  65. return SpawnType::Knight;
  66. }
  67. if (str == "spearman") {
  68. return SpawnType::Spearman;
  69. }
  70. if (str == "mounted_knight") {
  71. return SpawnType::MountedKnight;
  72. }
  73. if (str == "barracks") {
  74. return SpawnType::Barracks;
  75. }
  76. return std::nullopt;
  77. }
  78. inline auto isTroopSpawn(SpawnType type) -> bool {
  79. return type != SpawnType::Barracks;
  80. }
  81. inline auto isBuildingSpawn(SpawnType type) -> bool {
  82. return type == SpawnType::Barracks;
  83. }
  84. inline auto spawn_typeToTroopType(SpawnType type) -> std::optional<TroopType> {
  85. switch (type) {
  86. case SpawnType::Archer:
  87. return TroopType::Archer;
  88. case SpawnType::Knight:
  89. return TroopType::Swordsman;
  90. case SpawnType::Spearman:
  91. return TroopType::Spearman;
  92. case SpawnType::MountedKnight:
  93. return TroopType::MountedKnight;
  94. case SpawnType::Barracks:
  95. return std::nullopt;
  96. }
  97. return std::nullopt;
  98. }
  99. inline auto spawn_typeFromTroopType(TroopType type) -> SpawnType {
  100. switch (type) {
  101. case TroopType::Archer:
  102. return SpawnType::Archer;
  103. case TroopType::Swordsman:
  104. return SpawnType::Knight;
  105. case TroopType::Spearman:
  106. return SpawnType::Spearman;
  107. case TroopType::MountedKnight:
  108. return SpawnType::MountedKnight;
  109. }
  110. return SpawnType::Archer;
  111. }
  112. } // namespace Game::Units
  113. namespace std {
  114. template <> struct hash<Game::Units::SpawnType> {
  115. auto operator()(Game::Units::SpawnType type) const noexcept -> size_t {
  116. return hash<std::uint8_t>()(static_cast<std::uint8_t>(type));
  117. }
  118. };
  119. } // namespace std