update
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user