| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- #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,
- HorseArcher,
- HorseSpearman,
- Healer,
- Catapult,
- Ballista,
- Elephant,
- Builder,
- Barracks,
- DefenseTower,
- Home
- };
- 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("horse_swordsman");
- case SpawnType::HorseArcher:
- return QStringLiteral("horse_archer");
- case SpawnType::HorseSpearman:
- return QStringLiteral("horse_spearman");
- case SpawnType::Healer:
- return QStringLiteral("healer");
- case SpawnType::Catapult:
- return QStringLiteral("catapult");
- case SpawnType::Ballista:
- return QStringLiteral("ballista");
- case SpawnType::Elephant:
- return QStringLiteral("elephant");
- case SpawnType::Builder:
- return QStringLiteral("builder");
- case SpawnType::Barracks:
- return QStringLiteral("barracks");
- case SpawnType::DefenseTower:
- return QStringLiteral("defense_tower");
- case SpawnType::Home:
- return QStringLiteral("home");
- }
- 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("swordsman")) {
- out = SpawnType::Knight;
- return true;
- }
- if (lowered == QStringLiteral("spearman")) {
- out = SpawnType::Spearman;
- return true;
- }
- if (lowered == QStringLiteral("horse_swordsman")) {
- out = SpawnType::MountedKnight;
- return true;
- }
- if (lowered == QStringLiteral("horse_archer")) {
- out = SpawnType::HorseArcher;
- return true;
- }
- if (lowered == QStringLiteral("horse_spearman")) {
- out = SpawnType::HorseSpearman;
- return true;
- }
- if (lowered == QStringLiteral("healer")) {
- out = SpawnType::Healer;
- return true;
- }
- if (lowered == QStringLiteral("catapult")) {
- out = SpawnType::Catapult;
- return true;
- }
- if (lowered == QStringLiteral("ballista")) {
- out = SpawnType::Ballista;
- return true;
- }
- if (lowered == QStringLiteral("elephant")) {
- out = SpawnType::Elephant;
- return true;
- }
- if (lowered == QStringLiteral("builder")) {
- out = SpawnType::Builder;
- return true;
- }
- if (lowered == QStringLiteral("barracks")) {
- out = SpawnType::Barracks;
- return true;
- }
- if (lowered == QStringLiteral("village")) {
- out = SpawnType::Barracks;
- return true;
- }
- if (lowered == QStringLiteral("defense_tower")) {
- out = SpawnType::DefenseTower;
- return true;
- }
- if (lowered == QStringLiteral("home")) {
- out = SpawnType::Home;
- 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 == "swordsman") {
- return SpawnType::Knight;
- }
- if (str == "spearman") {
- return SpawnType::Spearman;
- }
- if (str == "horse_swordsman") {
- return SpawnType::MountedKnight;
- }
- if (str == "horse_archer") {
- return SpawnType::HorseArcher;
- }
- if (str == "horse_spearman") {
- return SpawnType::HorseSpearman;
- }
- if (str == "healer") {
- return SpawnType::Healer;
- }
- if (str == "catapult") {
- return SpawnType::Catapult;
- }
- if (str == "ballista") {
- return SpawnType::Ballista;
- }
- if (str == "elephant") {
- return SpawnType::Elephant;
- }
- if (str == "builder") {
- return SpawnType::Builder;
- }
- if (str == "barracks") {
- return SpawnType::Barracks;
- }
- if (str == "village") {
- return SpawnType::Barracks;
- }
- if (str == "defense_tower") {
- return SpawnType::DefenseTower;
- }
- if (str == "home") {
- return SpawnType::Home;
- }
- return std::nullopt;
- }
- inline auto isTroopSpawn(SpawnType type) -> bool {
- return type != SpawnType::Barracks && type != SpawnType::DefenseTower &&
- type != SpawnType::Home;
- }
- inline auto is_building_spawn(SpawnType type) -> bool {
- return type == SpawnType::Barracks || type == SpawnType::DefenseTower ||
- type == SpawnType::Home;
- }
- inline auto can_use_attack_mode(SpawnType type) -> bool {
- return type != SpawnType::Healer && type != SpawnType::Builder &&
- type != SpawnType::Barracks && type != SpawnType::DefenseTower &&
- type != SpawnType::Home;
- }
- inline auto can_use_guard_mode(SpawnType type) -> bool {
- return type != SpawnType::Barracks && type != SpawnType::DefenseTower &&
- type != SpawnType::Home;
- }
- inline auto can_use_hold_mode(SpawnType type) -> bool {
- return type == SpawnType::Archer || type == SpawnType::Spearman;
- }
- inline auto can_use_patrol_mode(SpawnType type) -> bool {
- return type != SpawnType::Barracks && type != SpawnType::DefenseTower &&
- type != SpawnType::Home;
- }
- [[nodiscard]] inline auto can_use_run_mode(SpawnType type) noexcept -> bool {
- switch (type) {
- case SpawnType::Archer:
- case SpawnType::Knight:
- case SpawnType::Spearman:
- case SpawnType::Healer:
- case SpawnType::Builder:
- case SpawnType::MountedKnight:
- case SpawnType::HorseArcher:
- case SpawnType::HorseSpearman:
- return true;
- case SpawnType::Catapult:
- case SpawnType::Ballista:
- case SpawnType::Barracks:
- case SpawnType::DefenseTower:
- case SpawnType::Home:
- return false;
- }
- return false;
- }
- 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::HorseArcher:
- return TroopType::HorseArcher;
- case SpawnType::HorseSpearman:
- return TroopType::HorseSpearman;
- case SpawnType::Healer:
- return TroopType::Healer;
- case SpawnType::Catapult:
- return TroopType::Catapult;
- case SpawnType::Ballista:
- return TroopType::Ballista;
- case SpawnType::Elephant:
- return TroopType::Elephant;
- case SpawnType::Builder:
- return TroopType::Builder;
- case SpawnType::Barracks:
- return std::nullopt;
- case SpawnType::DefenseTower:
- return std::nullopt;
- case SpawnType::Home:
- 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;
- case TroopType::HorseArcher:
- return SpawnType::HorseArcher;
- case TroopType::HorseSpearman:
- return SpawnType::HorseSpearman;
- case TroopType::Healer:
- return SpawnType::Healer;
- case TroopType::Catapult:
- return SpawnType::Catapult;
- case TroopType::Ballista:
- return SpawnType::Ballista;
- case TroopType::Elephant:
- return SpawnType::Elephant;
- case TroopType::Builder:
- return SpawnType::Builder;
- }
- 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
|