| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #pragma once
- #include "troop_type.h"
- #include <QString>
- #include <cstdint>
- #include <functional>
- #include <optional>
- #include <string>
- namespace Game::Units {
- enum class SpawnType : std::uint8_t {
- Archer,
- Knight,
- Spearman,
- MountedKnight,
- Barracks
- };
- inline auto spawn_typeToQString(SpawnType type) -> QString {
- switch (type) {
- case SpawnType::Archer:
- return QStringLiteral("archer");
- case SpawnType::Knight:
- return QStringLiteral("swordsman");
- case SpawnType::Spearman:
- return QStringLiteral("spearman");
- case SpawnType::MountedKnight:
- return QStringLiteral("mounted_knight");
- case SpawnType::Barracks:
- return QStringLiteral("barracks");
- }
- return QStringLiteral("archer");
- }
- inline auto spawn_typeToString(SpawnType type) -> std::string {
- return spawn_typeToQString(type).toStdString();
- }
- inline auto tryParseSpawnType(const QString &value, SpawnType &out) -> bool {
- const QString lowered = value.trimmed().toLower();
- if (lowered == QStringLiteral("archer")) {
- out = SpawnType::Archer;
- return true;
- }
- if (lowered == QStringLiteral("swordsman") ||
- lowered == QStringLiteral("knight")) {
- out = SpawnType::Knight;
- return true;
- }
- if (lowered == QStringLiteral("spearman")) {
- out = SpawnType::Spearman;
- return true;
- }
- if (lowered == QStringLiteral("mounted_knight")) {
- out = SpawnType::MountedKnight;
- return true;
- }
- if (lowered == QStringLiteral("barracks")) {
- out = SpawnType::Barracks;
- return true;
- }
- return false;
- }
- inline auto
- spawn_typeFromString(const std::string &str) -> std::optional<SpawnType> {
- if (str == "archer") {
- return SpawnType::Archer;
- }
- if (str == "swordsman" || str == "knight") {
- return SpawnType::Knight;
- }
- if (str == "spearman") {
- return SpawnType::Spearman;
- }
- if (str == "mounted_knight") {
- return SpawnType::MountedKnight;
- }
- if (str == "barracks") {
- return SpawnType::Barracks;
- }
- return std::nullopt;
- }
- inline auto isTroopSpawn(SpawnType type) -> bool {
- return type != SpawnType::Barracks;
- }
- inline auto isBuildingSpawn(SpawnType type) -> bool {
- return type == SpawnType::Barracks;
- }
- inline auto spawn_typeToTroopType(SpawnType type) -> std::optional<TroopType> {
- switch (type) {
- case SpawnType::Archer:
- return TroopType::Archer;
- case SpawnType::Knight:
- return TroopType::Swordsman;
- case SpawnType::Spearman:
- return TroopType::Spearman;
- case SpawnType::MountedKnight:
- return TroopType::MountedKnight;
- case SpawnType::Barracks:
- return std::nullopt;
- }
- return std::nullopt;
- }
- inline auto spawn_typeFromTroopType(TroopType type) -> SpawnType {
- switch (type) {
- case TroopType::Archer:
- return SpawnType::Archer;
- case TroopType::Swordsman:
- return SpawnType::Knight;
- case TroopType::Spearman:
- return SpawnType::Spearman;
- case TroopType::MountedKnight:
- return SpawnType::MountedKnight;
- }
- return SpawnType::Archer;
- }
- } // namespace Game::Units
- namespace std {
- template <> struct hash<Game::Units::SpawnType> {
- auto operator()(Game::Units::SpawnType type) const noexcept -> size_t {
- return hash<std::uint8_t>()(static_cast<std::uint8_t>(type));
- }
- };
- } // namespace std
|