#ifndef TERRAINMOVEMENTMANAGER_H #define TERRAINMOVEMENTMANAGER_H #include #include #include #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 movementCosts; QMap domainRules; TerrainMovementConfig(); }; struct UnitConfig; // Forward declaration class TerrainMovementManager { public: static TerrainMovementManager& instance(); bool loadConfig(const QString &filePath); QString getTerrainType(int tx, int ty, Matrix2D *mapPoints, int numPoints05) const; float getHexElevationKm(int tx, int ty, Matrix2D *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 *mapPoints, int numPoints05, const UnitConfig *unitConfig = nullptr ) const; float getTerrainMovementCost(const QString &terrainType) const; float getHexMovementCost(int tx, int ty, Matrix2D *mapPoints, int numPoints05) const; float calculateStepCost( int fromX, int fromY, int toX, int toY, MovementDomain domain, Matrix2D *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