89 lines
2.9 KiB
C++
89 lines
2.9 KiB
C++
#ifndef UNITCONFIG_H
|
|
#define UNITCONFIG_H
|
|
|
|
#include <QString>
|
|
#include <QStringList>
|
|
#include <QMap>
|
|
#include <vector>
|
|
|
|
#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 iconPath;
|
|
QStringList actions;
|
|
QMap<QString, float> 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), 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"); }
|
|
|
|
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<QString, UnitConfig>& getAllConfigs() const { return m_configs; }
|
|
|
|
private:
|
|
QMap<QString, UnitConfig> m_configs;
|
|
};
|
|
|
|
#endif // UNITCONFIG_H
|