89 lines
2.2 KiB
C++
89 lines
2.2 KiB
C++
#ifndef TERRAINMOVEMENTMANAGER_H
|
|
#define TERRAINMOVEMENTMANAGER_H
|
|
|
|
#include <QString>
|
|
#include <QStringList>
|
|
#include <QMap>
|
|
#include "terrain.h"
|
|
#include "matrix2d.h"
|
|
|
|
enum class MovementDomain {
|
|
Land,
|
|
Naval
|
|
};
|
|
|
|
inline QString movementDomainToString(MovementDomain domain) {
|
|
switch (domain) {
|
|
case MovementDomain::Land: return "land";
|
|
case MovementDomain::Naval: return "naval";
|
|
}
|
|
return "land";
|
|
}
|
|
|
|
inline MovementDomain stringToMovementDomain(const QString &str) {
|
|
QString s = str.trimmed().toLower();
|
|
if (s == "naval" || s == "water" || s == "zee" || s == "schip" || s == "sea") {
|
|
return MovementDomain::Naval;
|
|
}
|
|
return MovementDomain::Land;
|
|
}
|
|
|
|
struct DomainMovementRule {
|
|
QStringList impassableTerrains;
|
|
QStringList passableTerrains; // If non-empty, ONLY these terrains can be entered
|
|
};
|
|
|
|
struct TerrainMovementConfig {
|
|
int waterHeightThreshold;
|
|
float mountainRockHeightKm;
|
|
float snowHeightKm;
|
|
bool polarSnowLineEnabled;
|
|
float polarSnowLineBaseKm;
|
|
float polarSnowFactorStart;
|
|
float polarSnowFactorEnd;
|
|
|
|
QMap<QString, float> movementCosts;
|
|
QMap<QString, DomainMovementRule> domainRules;
|
|
|
|
TerrainMovementConfig();
|
|
};
|
|
|
|
struct UnitConfig; // Forward declaration
|
|
|
|
class TerrainMovementManager {
|
|
public:
|
|
static TerrainMovementManager& instance();
|
|
|
|
bool loadConfig(const QString &filePath);
|
|
|
|
QString getTerrainType(int tx, int ty, Matrix2D<TerrainPoint> *mapPoints, int numPoints05) const;
|
|
|
|
bool isTerrainPassable(
|
|
const QString &terrainType,
|
|
MovementDomain domain,
|
|
const UnitConfig *unitConfig = nullptr
|
|
) const;
|
|
|
|
bool isHexPassable(
|
|
int tx, int ty,
|
|
MovementDomain domain,
|
|
Matrix2D<TerrainPoint> *mapPoints,
|
|
int numPoints05,
|
|
const UnitConfig *unitConfig = nullptr
|
|
) const;
|
|
|
|
float getTerrainMovementCost(const QString &terrainType) const;
|
|
float getHexMovementCost(int tx, int ty, Matrix2D<TerrainPoint> *mapPoints, int numPoints05) const;
|
|
|
|
const TerrainMovementConfig& getConfig() const { return m_config; }
|
|
|
|
private:
|
|
TerrainMovementManager();
|
|
~TerrainMovementManager() = default;
|
|
|
|
TerrainMovementConfig m_config;
|
|
bool m_loaded;
|
|
};
|
|
|
|
#endif // TERRAINMOVEMENTMANAGER_H
|