#ifndef UNITCONFIG_H #define UNITCONFIG_H #include #include #include #include #include "terrainmovementmanager.h" enum class UnitCategory { Military, // militair Reconnaissance, // verkenning Builder // bouwen }; inline QString unitCategoryToString(UnitCategory cat) { switch (cat) { case UnitCategory::Military: return "Militair"; case UnitCategory::Reconnaissance: return "Verkenning"; case UnitCategory::Builder: return "Bouwen"; } return "Onbekend"; } inline UnitCategory stringToUnitCategory(const QString &str) { QString s = str.trimmed().toLower(); if (s == "militair" || s == "military") return UnitCategory::Military; if (s == "verkenning" || s == "recon" || s == "scout") return UnitCategory::Reconnaissance; if (s == "bouwen" || s == "builder" || s == "civilian") return UnitCategory::Builder; return UnitCategory::Builder; } struct UnitConfig { QString id; QString name; UnitCategory category; MovementDomain movementDomain; int health; float movementSpeed; int cost; int laborCost; int attackDamage; int attackRange; // 1 for melee, >1 for ranged int buildCharges; bool infiniteCharges; QString requiredTech; QString obsoleteTech; QString iconPath; QStringList actions; QMap actionSpeeds; // Duration in seconds per action (e.g. "boerderij_bouwen": 10.0f) QStringList impassableTerrains; QStringList passableTerrains; UnitConfig() : id(""), name(""), category(UnitCategory::Builder), movementDomain(MovementDomain::Land), health(100), movementSpeed(2.0f), cost(10), laborCost(1000), attackDamage(0), attackRange(1), buildCharges(-1), infiniteCharges(true), requiredTech(""), obsoleteTech(""), iconPath("") {} bool isRanged() const { return attackRange > 1; } bool isMilitary() const { return category == UnitCategory::Military; } bool isNaval() const { return movementDomain == MovementDomain::Naval; } bool isLand() const { return movementDomain == MovementDomain::Land; } bool canAttack() const { return actions.contains("aanvallen") || isMilitary(); } bool canBuildCity() const { return actions.contains("steden_bouwen") || actions.contains("build_city"); } bool canBuildFarm() const { return actions.contains("boerderij_bouwen") || actions.contains("build_farm"); } bool canBuildRoad() const { return actions.contains("build_road") || actions.contains("weg_bouwen"); } bool isBuilder() const { return canBuildFarm() || canBuildRoad(); } float getActionDuration(const QString &actionName, float fallback = 10.0f) const { if (actionSpeeds.contains(actionName)) { return actionSpeeds.value(actionName); } return fallback; } }; class UnitConfigManager { public: UnitConfigManager(); bool loadFromDirectory(const QString &dirPath); bool loadConfigFile(const QString &filePath); const UnitConfig* getConfig(const QString &id) const; const QMap& getAllConfigs() const { return m_configs; } private: QMap m_configs; }; #endif // UNITCONFIG_H