Files
Ascent-of-Man/terrainmovementmanager.h
T
2026-11-10 19:54:00 +01:00

106 lines
2.8 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 coastBeachWidthKm;
float mountainRockHeightKm;
float snowHeightKm;
bool polarSnowLineEnabled;
float polarSnowLineBaseKm;
float polarSnowFactorStart;
float polarSnowFactorEnd;
float polarLandIceThreshold;
float uphillSlopeMultiplier;
float downhillSlopeBonusMultiplier;
float minStepCost;
float maxClimbableSlopeKm;
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;
float getHexElevationKm(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;
float calculateStepCost(
int fromX, int fromY,
int toX, int toY,
MovementDomain domain,
Matrix2D<TerrainPoint> *mapPoints,
int numPoints05,
const UnitConfig *unitConfig = nullptr
) const;
const TerrainMovementConfig& getConfig() const { return m_config; }
private:
TerrainMovementManager();
~TerrainMovementManager() = default;
TerrainMovementConfig m_config;
bool m_loaded;
};
#endif // TERRAINMOVEMENTMANAGER_H